jcc-express-mvc 1.8.21 → 1.8.22
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/lib/Auth/Auth.d.ts +1 -1
- package/lib/Auth/Auth.js +1 -1
- package/lib/Auth/AuthMiddleware.js +1 -1
- package/lib/Cache/RedisDriver.d.ts +1 -0
- package/lib/Cache/RedisDriver.d.ts.map +1 -1
- package/lib/Cache/RedisDriver.js +5 -0
- package/lib/Event/Event.d.ts.map +1 -1
- package/lib/Event/Event.js +10 -5
- package/lib/Jcc-eloquent/lib/Builder.d.ts +2 -7
- package/lib/Jcc-eloquent/lib/Builder.d.ts.map +1 -1
- package/lib/Jcc-eloquent/lib/Builder.js +16 -61
- package/lib/Jcc-eloquent/lib/Database/index.js +1 -1
- package/lib/Mail/index.d.ts.map +1 -1
- package/lib/Mail/index.js +12 -1
- package/lib/Request/FormRequest.js +1 -1
- package/lib/Response/index.d.ts +2 -1
- package/lib/Response/index.d.ts.map +1 -1
- package/lib/Response/index.js +7 -10
- package/lib/Session/RedisSession.d.ts.map +1 -1
- package/lib/Session/RedisSession.js +3 -1
- package/lib/Templating-engine/index.d.ts.map +1 -1
- package/lib/Templating-engine/index.js +6 -2
- package/lib/Testing/Concerns/MakesHttpRequests.d.ts.map +1 -1
- package/lib/Testing/Concerns/MakesHttpRequests.js +2 -0
- package/lib/Testing/TestCase.d.ts +13 -2
- package/lib/Testing/TestCase.d.ts.map +1 -1
- package/lib/Testing/TestCase.js +29 -5
- package/lib/Testing/TestResponse.d.ts +18 -2
- package/lib/Testing/TestResponse.d.ts.map +1 -1
- package/lib/Testing/TestResponse.js +45 -9
- package/package.json +1 -1
package/lib/Auth/Auth.d.ts
CHANGED
package/lib/Auth/Auth.js
CHANGED
|
@@ -68,7 +68,7 @@ class AuthMiddleware {
|
|
|
68
68
|
const token = req.cookies.auth_token;
|
|
69
69
|
if (token) {
|
|
70
70
|
if (!req.get("Referer")) {
|
|
71
|
-
if (req.previousUrls[0]
|
|
71
|
+
if (req.previousUrls?.length >= 2 && req.previousUrls[0] === req.url) {
|
|
72
72
|
return res.redirect(303, req.previousUrls[1]);
|
|
73
73
|
}
|
|
74
74
|
else {
|
|
@@ -18,5 +18,6 @@ export declare class RedisDriver implements CacheDriver {
|
|
|
18
18
|
many(keys: string[]): Promise<Record<string, any>>;
|
|
19
19
|
putMany(values: Record<string, any>, seconds?: number): Promise<void>;
|
|
20
20
|
has(key: string): Promise<boolean>;
|
|
21
|
+
disconnect(): Promise<void>;
|
|
21
22
|
}
|
|
22
23
|
//# sourceMappingURL=RedisDriver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedisDriver.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Cache/RedisDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,qBAAa,WAAY,YAAW,WAAW;IAC7C,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAWK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxB,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAM5C,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1D,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1D,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAYlD,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBrE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"RedisDriver.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Cache/RedisDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,qBAAa,WAAY,YAAW,WAAW;IAC7C,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAWK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxB,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAM5C,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1D,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1D,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAYlD,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBrE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAKlC"}
|
package/lib/Cache/RedisDriver.js
CHANGED
package/lib/Event/Event.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Event.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Event/Event.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGzD,qBAAa,KAAK;IAKJ,OAAO,CAAC,GAAG;IAJvB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,EAAE,CAAa;gBAEH,GAAG,EAAE,WAAW;IAIpC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,GAAG;IAwBnB;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,GAAG;
|
|
1
|
+
{"version":3,"file":"Event.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Event/Event.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGzD,qBAAa,KAAK;IAKJ,OAAO,CAAC,GAAG;IAJvB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,EAAE,CAAa;gBAEH,GAAG,EAAE,WAAW;IAIpC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,GAAG;IAwBnB;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,GAAG;IAwBjE;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,GAAG;CAM1B"}
|
package/lib/Event/Event.js
CHANGED
|
@@ -49,12 +49,17 @@ class Event {
|
|
|
49
49
|
if (!this.emitter.listenerCount(eventName)) {
|
|
50
50
|
this.emitter.on(eventName, async (eventInstance) => {
|
|
51
51
|
for (const listenerClass of this.listeners[eventName]) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
try {
|
|
53
|
+
const listener = this.app.make(listenerClass);
|
|
54
|
+
if (!method) {
|
|
55
|
+
await listener.handle(eventInstance);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
await this.app.callMethod(listener, method);
|
|
59
|
+
}
|
|
55
60
|
}
|
|
56
|
-
|
|
57
|
-
|
|
61
|
+
catch (err) {
|
|
62
|
+
console.error(`Event listener error for [${eventName}]:`, err);
|
|
58
63
|
}
|
|
59
64
|
}
|
|
60
65
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Knex } from "knex";
|
|
2
|
+
import { AsyncLocalStorage } from "async_hooks";
|
|
2
3
|
import { AggregateInput, JoinCallback, SubJoinCallback, WhereInput } from "./Types";
|
|
3
4
|
import { type CursorPagination, type SimplePagination } from "./Interfaces";
|
|
4
5
|
import type { Request } from "express";
|
|
@@ -12,15 +13,9 @@ export declare class Builder {
|
|
|
12
13
|
eagerLoad: Record<string, Function | null>;
|
|
13
14
|
softDelete: boolean;
|
|
14
15
|
withoutEvents: boolean;
|
|
15
|
-
|
|
16
|
+
static txStorage: AsyncLocalStorage<Knex.Transaction<any, any[]> | null>;
|
|
16
17
|
constructor();
|
|
17
|
-
/**
|
|
18
|
-
* Get the active transaction if one exists
|
|
19
|
-
*/
|
|
20
18
|
static getActiveTransaction(): Knex.Transaction | null;
|
|
21
|
-
/**
|
|
22
|
-
* Set the active transaction context
|
|
23
|
-
*/
|
|
24
19
|
static setActiveTransaction(trx: Knex.Transaction | null): void;
|
|
25
20
|
withTrashed(): this;
|
|
26
21
|
onlyTrashed(): this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../../../jcc-express-mvc/lib/Jcc-eloquent/lib/Builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../../../jcc-express-mvc/lib/Jcc-eloquent/lib/Builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Builder = void 0;
|
|
4
|
+
const async_hooks_1 = require("async_hooks");
|
|
4
5
|
const Database_1 = require("./Database");
|
|
5
6
|
const utils_1 = require("./utils");
|
|
6
7
|
const ModelEvent_1 = require("./Event/ModelEvent");
|
|
@@ -12,20 +13,13 @@ class Builder {
|
|
|
12
13
|
this.eagerLoad = {};
|
|
13
14
|
this.softDelete = true; // Default to true (filtering out deleted), set to false to include deleted
|
|
14
15
|
this.withoutEvents = false;
|
|
15
|
-
|
|
16
|
-
this.db = Builder.activeTransaction || Database_1.Database.connect();
|
|
16
|
+
this.db = Builder.getActiveTransaction() || Database_1.Database.connect();
|
|
17
17
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Get the active transaction if one exists
|
|
20
|
-
*/
|
|
21
18
|
static getActiveTransaction() {
|
|
22
|
-
return Builder.
|
|
19
|
+
return Builder.txStorage.getStore() ?? null;
|
|
23
20
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Set the active transaction context
|
|
26
|
-
*/
|
|
27
21
|
static setActiveTransaction(trx) {
|
|
28
|
-
|
|
22
|
+
// no-op: kept for backward compatibility; use txStorage.run() internally
|
|
29
23
|
}
|
|
30
24
|
withTrashed() {
|
|
31
25
|
this.softDelete = false;
|
|
@@ -297,15 +291,15 @@ class Builder {
|
|
|
297
291
|
// JSON path handling
|
|
298
292
|
if (isJson) {
|
|
299
293
|
if (method === "orWhere") {
|
|
300
|
-
this.orWhereJson(column, operator, value
|
|
294
|
+
this.orWhereJson(column, operator, value ?? "");
|
|
301
295
|
}
|
|
302
296
|
else {
|
|
303
|
-
this.whereJson(column, operator, value
|
|
297
|
+
this.whereJson(column, operator, value ?? "");
|
|
304
298
|
}
|
|
305
299
|
return this;
|
|
306
300
|
}
|
|
307
301
|
// Three-argument form: where(column, operator, value)
|
|
308
|
-
this.getQueryBuilder()[method](column, operator, value
|
|
302
|
+
this.getQueryBuilder()[method](column, operator, value ?? "");
|
|
309
303
|
return this;
|
|
310
304
|
}
|
|
311
305
|
whereNull(column) {
|
|
@@ -386,7 +380,7 @@ class Builder {
|
|
|
386
380
|
return this;
|
|
387
381
|
}
|
|
388
382
|
havingNotIn(column, values) {
|
|
389
|
-
this.getQueryBuilder().
|
|
383
|
+
this.getQueryBuilder().havingNotIn(column, values);
|
|
390
384
|
return this;
|
|
391
385
|
}
|
|
392
386
|
havingNull(column) {
|
|
@@ -509,14 +503,13 @@ class Builder {
|
|
|
509
503
|
applyJoin(type, table, columnOrCallback, operator, column2) {
|
|
510
504
|
const qb = this.getQueryBuilder();
|
|
511
505
|
const self = this;
|
|
512
|
-
//
|
|
513
506
|
if (typeof columnOrCallback === "function") {
|
|
514
|
-
qb
|
|
507
|
+
qb[type](table, function () {
|
|
515
508
|
columnOrCallback(self.applyJoinHelper(this));
|
|
516
509
|
});
|
|
517
510
|
}
|
|
518
511
|
else if (operator && column2) {
|
|
519
|
-
qb
|
|
512
|
+
qb[type](table, columnOrCallback, operator, column2);
|
|
520
513
|
}
|
|
521
514
|
else {
|
|
522
515
|
throw new Error(`Invalid ${type} parameters`);
|
|
@@ -812,17 +805,14 @@ class Builder {
|
|
|
812
805
|
*/
|
|
813
806
|
async cursorPaginate(request, perPage = 15, column, direction = "asc") {
|
|
814
807
|
const per = Number(perPage);
|
|
815
|
-
const col = column ??
|
|
816
|
-
(this.model ? new this.model().primaryKey : "id");
|
|
808
|
+
const col = column ?? (this.model ? new this.model().primaryKey : "id");
|
|
817
809
|
const raw = request.query.cursor;
|
|
818
810
|
const cursorParam = raw === undefined || raw === null
|
|
819
811
|
? ""
|
|
820
812
|
: Array.isArray(raw)
|
|
821
813
|
? String(raw[0])
|
|
822
814
|
: String(raw);
|
|
823
|
-
const cursorVal = cursorParam === ""
|
|
824
|
-
? undefined
|
|
825
|
-
: utils_1.Utils.decodeCursorValue(cursorParam);
|
|
815
|
+
const cursorVal = cursorParam === "" ? undefined : utils_1.Utils.decodeCursorValue(cursorParam);
|
|
826
816
|
let q = this.clone().orderBy(col, direction);
|
|
827
817
|
if (cursorVal !== undefined) {
|
|
828
818
|
if (direction === "asc") {
|
|
@@ -1161,45 +1151,10 @@ class Builder {
|
|
|
1161
1151
|
* });
|
|
1162
1152
|
*/
|
|
1163
1153
|
async transaction(cb) {
|
|
1164
|
-
const
|
|
1165
|
-
|
|
1166
|
-
const originalTransaction = Builder.activeTransaction;
|
|
1167
|
-
try {
|
|
1168
|
-
return await this.db.transaction(async (trx) => {
|
|
1169
|
-
// Set the active transaction context FIRST so all new Builder instances use it
|
|
1170
|
-
Builder.setActiveTransaction(trx);
|
|
1171
|
-
// Update this instance to use the transaction
|
|
1172
|
-
this.db = trx;
|
|
1173
|
-
this.queryBuilder = trx.queryBuilder().from(this.tableName);
|
|
1174
|
-
try {
|
|
1175
|
-
// Execute callback - all queries inside will use the transaction
|
|
1176
|
-
const result = await cb();
|
|
1177
|
-
// Knex automatically commits if we reach here
|
|
1178
|
-
return result;
|
|
1179
|
-
}
|
|
1180
|
-
catch (error) {
|
|
1181
|
-
// Knex will automatically rollback on error
|
|
1182
|
-
throw error;
|
|
1183
|
-
}
|
|
1184
|
-
finally {
|
|
1185
|
-
// Clear the transaction context after callback completes
|
|
1186
|
-
Builder.setActiveTransaction(null);
|
|
1187
|
-
}
|
|
1188
|
-
});
|
|
1189
|
-
}
|
|
1190
|
-
catch (error) {
|
|
1191
|
-
// Knex automatically rolls back on error, re-throw the error
|
|
1192
|
-
throw error;
|
|
1193
|
-
}
|
|
1194
|
-
finally {
|
|
1195
|
-
// Always restore the original database connection and query builder
|
|
1196
|
-
this.db = originalDb;
|
|
1197
|
-
this.queryBuilder = originalQB;
|
|
1198
|
-
// Ensure transaction context is cleared (safety net)
|
|
1199
|
-
Builder.setActiveTransaction(originalTransaction);
|
|
1200
|
-
}
|
|
1154
|
+
const knex = Builder.getActiveTransaction() || Database_1.Database.connect();
|
|
1155
|
+
return knex.transaction((trx) => Builder.txStorage.run(trx, cb));
|
|
1201
1156
|
}
|
|
1202
1157
|
}
|
|
1203
1158
|
exports.Builder = Builder;
|
|
1204
|
-
//
|
|
1205
|
-
Builder.
|
|
1159
|
+
// Per-async-context transaction storage — safe for concurrent requests
|
|
1160
|
+
Builder.txStorage = new async_hooks_1.AsyncLocalStorage();
|
package/lib/Mail/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Mail/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBAAa,IAAI;IACf,OAAO,CAAC,MAAM,CAAC,SAAS,CAAc;IACtC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAgB;IAC1C,OAAO,CAAC,MAAM,CAAC,YAAY,CAAgB;IAE3C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,IAAI;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Mail/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBAAa,IAAI;IACf,OAAO,CAAC,MAAM,CAAC,SAAS,CAAc;IACtC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAgB;IAC1C,OAAO,CAAC,MAAM,CAAC,YAAY,CAAgB;IAE3C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,IAAI;IAQrC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,IAAI;IAK3C,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,IAAI;WAK/B,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ;CAe5C"}
|
package/lib/Mail/index.js
CHANGED
|
@@ -49,7 +49,10 @@ Object.defineProperty(exports, "Address", { enumerable: true, get: function () {
|
|
|
49
49
|
*/
|
|
50
50
|
class Mail {
|
|
51
51
|
static to(email) {
|
|
52
|
+
// Reset chain state so each call starts fresh
|
|
52
53
|
this.recipient = email;
|
|
54
|
+
this.ccRecipient = [];
|
|
55
|
+
this.bccRecipient = [];
|
|
53
56
|
return this;
|
|
54
57
|
}
|
|
55
58
|
static cc(...emails) {
|
|
@@ -65,7 +68,15 @@ class Mail {
|
|
|
65
68
|
.cc(...this.ccRecipient)
|
|
66
69
|
.bcc(...this.bccRecipient);
|
|
67
70
|
const payload = mailer instanceof Mailable_1.Mailable ? await mailer.toMailer() : mailer;
|
|
68
|
-
|
|
71
|
+
try {
|
|
72
|
+
return await manager.send(payload);
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
// Clear state after send so stale data never leaks to the next call
|
|
76
|
+
this.recipient = "";
|
|
77
|
+
this.ccRecipient = [];
|
|
78
|
+
this.bccRecipient = [];
|
|
79
|
+
}
|
|
69
80
|
}
|
|
70
81
|
}
|
|
71
82
|
exports.Mail = Mail;
|
package/lib/Response/index.d.ts
CHANGED
|
@@ -8,9 +8,10 @@ import { AppRequest, AppResponse } from "../Interface";
|
|
|
8
8
|
export declare class HttpResponse {
|
|
9
9
|
private request;
|
|
10
10
|
private response;
|
|
11
|
+
private reqUrls;
|
|
11
12
|
constructor(request: AppRequest, response: AppResponse);
|
|
12
13
|
/**
|
|
13
|
-
* Tracks visited URLs
|
|
14
|
+
* Tracks visited URLs per-request instance.
|
|
14
15
|
* Excludes "/favicon.ico" and "/js/app.js" from tracking.
|
|
15
16
|
*/
|
|
16
17
|
protected visitedUrls(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Response/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Response/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEvD;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,OAAO,CAAgB;gBAEnB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW;IAYtD;;;OAGG;IACH,SAAS,CAAC,WAAW;IAerB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,IAAI;CAQb"}
|
package/lib/Response/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.HttpResponse = void 0;
|
|
4
|
-
const reqUrls = [];
|
|
5
4
|
/**
|
|
6
5
|
* Initializes a Response object.
|
|
7
6
|
* This class manages the response behavior, including tracking visited URLs and handling redirection.
|
|
@@ -10,6 +9,7 @@ const reqUrls = [];
|
|
|
10
9
|
*/
|
|
11
10
|
class HttpResponse {
|
|
12
11
|
constructor(request, response) {
|
|
12
|
+
this.reqUrls = [];
|
|
13
13
|
this.request = request;
|
|
14
14
|
this.response = response;
|
|
15
15
|
this.visitedUrls();
|
|
@@ -20,19 +20,19 @@ class HttpResponse {
|
|
|
20
20
|
response.redirectBack = () => this.redirectBack();
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
|
-
* Tracks visited URLs
|
|
23
|
+
* Tracks visited URLs per-request instance.
|
|
24
24
|
* Excludes "/favicon.ico" and "/js/app.js" from tracking.
|
|
25
25
|
*/
|
|
26
26
|
visitedUrls() {
|
|
27
27
|
if (this.request.originalUrl !== "/favicon.ico" &&
|
|
28
28
|
this.request.originalUrl !== "/js/app.js" &&
|
|
29
29
|
!this.request.originalUrl.includes("com.chrome.devtools")) {
|
|
30
|
-
if (reqUrls.length > 1) {
|
|
31
|
-
reqUrls.pop();
|
|
30
|
+
if (this.reqUrls.length > 1) {
|
|
31
|
+
this.reqUrls.pop();
|
|
32
32
|
}
|
|
33
|
-
reqUrls.unshift(this.request.originalUrl);
|
|
33
|
+
this.reqUrls.unshift(this.request.originalUrl);
|
|
34
34
|
}
|
|
35
|
-
this.request.previousUrls = reqUrls;
|
|
35
|
+
this.request.previousUrls = this.reqUrls;
|
|
36
36
|
return;
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
@@ -40,11 +40,8 @@ class HttpResponse {
|
|
|
40
40
|
* If there are no previous URLs, redirects to the current URL.
|
|
41
41
|
*/
|
|
42
42
|
redirectBack() {
|
|
43
|
-
const backUrl = this.request.get("Referer") || reqUrls[0] || "/";
|
|
43
|
+
const backUrl = this.request.get("Referer") || this.reqUrls[0] || "/";
|
|
44
44
|
return this.response.redirect(303, backUrl);
|
|
45
|
-
// return reqUrls.length > 0 && reqUrls[1]
|
|
46
|
-
// ? this.response.redirect(303, reqUrls[1])
|
|
47
|
-
// : this.response.redirect(303, reqUrls[0]);
|
|
48
45
|
}
|
|
49
46
|
with(message, type) {
|
|
50
47
|
if (this.request.jccSession) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedisSession.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Session/RedisSession.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AA6BzD,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAmB;
|
|
1
|
+
{"version":3,"file":"RedisSession.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Session/RedisSession.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AA6BzD,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAmB;IASzD,OAAO,CAAC,MAAM;IAIR,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAgBnD,GAAG,CACP,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,WAAW,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAeV,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASzC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B"}
|
|
@@ -20,7 +20,9 @@ class RedisSessionStore {
|
|
|
20
20
|
const createClient = loadRedisCreateClient();
|
|
21
21
|
this.client = createClient({ url: redisUrl });
|
|
22
22
|
this.prefix = prefix;
|
|
23
|
-
|
|
23
|
+
this.client.connect().catch((err) => {
|
|
24
|
+
console.error("RedisSessionStore: failed to connect to Redis:", err);
|
|
25
|
+
});
|
|
24
26
|
}
|
|
25
27
|
getKey(sessionId) {
|
|
26
28
|
return `${this.prefix}${sessionId}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Templating-engine/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAY/C,cAAM,gBAAiB,SAAQ,aAAa;IAC1C,OAAO,CAAC,MAAM,CAA2B;IAEzC,0EAA0E;IAC1E,OAAO,CAAC,mBAAmB;IA6C3B,kGAAkG;IAClG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAmCnC;IAEF,yFAAyF;IACzF,OAAO,CAAC,cAAc;IA4BtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;;OAGG;IACH,OAAO,CAAC,cAAc;IAwBtB;;OAEG;IACH,OAAO,CAAC,UAAU;IAqClB;;OAEG;IACH,OAAO,CAAC,aAAa;IAiCrB;;;;;;OAMG;IACH;;OAEG;IACH,OAAO,CAAC,eAAe;IAiDvB;;;;;;OAMG;IACH,OAAO,CAAC,OAAO;IAUf;;;;OAIG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB/C;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ;IAchB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAsBxB,iEAAiE;IACjE,OAAO,CAAC,gBAAgB;IA8BxB,8FAA8F;IAC9F,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,YAAY;IAyCpB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,WAAW;IAOnB;;;;;;OAMG;IACH,OAAO,CAAC,IAAI;IAoBZ;;;;;;OAMG;IACH,OAAO,CAAC,KAAK;IASb,OAAO,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Templating-engine/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -553,8 +553,12 @@ class TemplatingEngine extends engineHelper_1.EngineHelpers {
|
|
|
553
553
|
return this.parser(beforMatch + result + afterMatch, param);
|
|
554
554
|
}
|
|
555
555
|
inertia(content, match, param = this.option) {
|
|
556
|
-
const
|
|
557
|
-
|
|
556
|
+
const json = JSON.stringify(param.inertia)
|
|
557
|
+
.replace(/&/g, "\\u0026")
|
|
558
|
+
.replace(/</g, "\\u003c")
|
|
559
|
+
.replace(/>/g, "\\u003e");
|
|
560
|
+
const interiaContent = param?.ssrBody ||
|
|
561
|
+
`<script data-page="app" type="application/json">${json}<\/script><div id="app"></div>`;
|
|
558
562
|
const { beforMatch, afterMatch } = this.content(content, match);
|
|
559
563
|
return this.parser(beforMatch + interiaContent + afterMatch, param);
|
|
560
564
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MakesHttpRequests.d.ts","sourceRoot":"","sources":["../../../../jcc-express-mvc/lib/Testing/Concerns/MakesHttpRequests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC;gBAEf,GAAG,EAAE,WAAW;IAI5B;;OAEG;IACU,GAAG,CACd,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAIxB;;OAEG;IACU,IAAI,CACf,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,GAAQ,EACd,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAIxB;;OAEG;IACU,GAAG,CACd,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,GAAQ,EACd,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAIxB;;OAEG;IACU,KAAK,CAChB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,GAAQ,EACd,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAIxB;;OAEG;IACU,MAAM,CACjB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,GAAQ,EACd,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAIxB;;OAEG;cACa,IAAI,CAClB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,GAAU,EAChB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"MakesHttpRequests.d.ts","sourceRoot":"","sources":["../../../../jcc-express-mvc/lib/Testing/Concerns/MakesHttpRequests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC;gBAEf,GAAG,EAAE,WAAW;IAI5B;;OAEG;IACU,GAAG,CACd,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAIxB;;OAEG;IACU,IAAI,CACf,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,GAAQ,EACd,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAIxB;;OAEG;IACU,GAAG,CACd,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,GAAQ,EACd,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAIxB;;OAEG;IACU,KAAK,CAChB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,GAAQ,EACd,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAIxB;;OAEG;IACU,MAAM,CACjB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,GAAQ,EACd,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAIxB;;OAEG;cACa,IAAI,CAClB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,GAAU,EAChB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;CA8CzB"}
|
|
@@ -55,6 +55,7 @@ class MakesHttpRequests {
|
|
|
55
55
|
// Here we will use a simple implementation that starts the app on a random port.
|
|
56
56
|
return new Promise((resolve, reject) => {
|
|
57
57
|
const server = http_1.default.createServer(expressApp);
|
|
58
|
+
server.on("error", (err) => reject(err));
|
|
58
59
|
server.listen(0, async () => {
|
|
59
60
|
const port = server.address().port;
|
|
60
61
|
const baseUrl = `http://localhost:${port}`;
|
|
@@ -68,6 +69,7 @@ class MakesHttpRequests {
|
|
|
68
69
|
method,
|
|
69
70
|
headers: finalHeaders,
|
|
70
71
|
body,
|
|
72
|
+
signal: AbortSignal.timeout(10000),
|
|
71
73
|
});
|
|
72
74
|
const responseData = await response.text();
|
|
73
75
|
let parsedData;
|
|
@@ -13,14 +13,25 @@ export declare abstract class TestCase {
|
|
|
13
13
|
constructor();
|
|
14
14
|
/**
|
|
15
15
|
* Set up the test environment.
|
|
16
|
-
*
|
|
16
|
+
* Call in beforeEach.
|
|
17
17
|
*/
|
|
18
18
|
setUp(): Promise<void>;
|
|
19
19
|
/**
|
|
20
20
|
* Clean up the test environment.
|
|
21
|
-
*
|
|
21
|
+
* Call in afterEach.
|
|
22
22
|
*/
|
|
23
23
|
tearDown(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Run a test body inside a database transaction that is rolled back
|
|
26
|
+
* after the callback completes — keeps the database clean between tests.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* it("creates a user", () => this.withTransaction(async () => {
|
|
30
|
+
* await User.create({ name: "Alice" });
|
|
31
|
+
* await this.assertDatabaseHas("users", { name: "Alice" });
|
|
32
|
+
* }));
|
|
33
|
+
*/
|
|
34
|
+
withTransaction<T>(cb: () => Promise<T>): Promise<T>;
|
|
24
35
|
/**
|
|
25
36
|
* Create the application instance for the test.
|
|
26
37
|
* This must be implemented by the user to return their app instance.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestCase.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Testing/TestCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"TestCase.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Testing/TestCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI9C;;;GAGG;AACH,8BAAsB,QAAQ;IAC5B,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC;IAC3B,SAAS,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAClC,SAAS,CAAC,EAAE,EAAE,qBAAqB,CAAC;;IAQpC;;;OAGG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOnC;;;OAGG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC;;;;;;;;;OASG;IACU,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAkBjE;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC;IAI/C,GAAG,CACd,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAIX,IAAI,CACf,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,GAAQ,EACd,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAIX,GAAG,CACd,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,GAAQ,EACd,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAIX,KAAK,CAChB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,GAAQ,EACd,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAIX,MAAM,CACjB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,GAAQ,EACd,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAMX,iBAAiB,CAC5B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxB,OAAO,CAAC,IAAI,CAAC;IAIH,qBAAqB,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxB,OAAO,CAAC,IAAI,CAAC;IAIH,mBAAmB,CAC9B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAIH,iBAAiB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,kBAAkB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CAG3D"}
|
package/lib/Testing/TestCase.js
CHANGED
|
@@ -4,35 +4,59 @@ exports.TestCase = void 0;
|
|
|
4
4
|
const MakesHttpRequests_1 = require("./Concerns/MakesHttpRequests");
|
|
5
5
|
const InteractsWithDatabase_1 = require("./Concerns/InteractsWithDatabase");
|
|
6
6
|
const Database_1 = require("../Jcc-eloquent/lib/Database");
|
|
7
|
+
const Builder_1 = require("../Jcc-eloquent/lib/Builder");
|
|
7
8
|
/**
|
|
8
9
|
* The base class for all tests in the application.
|
|
9
10
|
* Provides Laravel-like testing capabilities.
|
|
10
11
|
*/
|
|
11
12
|
class TestCase {
|
|
12
13
|
constructor() {
|
|
13
|
-
// These will be initialized in setUp
|
|
14
14
|
this.app = null;
|
|
15
15
|
this.http = null;
|
|
16
16
|
this.db = null;
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
19
|
* Set up the test environment.
|
|
20
|
-
*
|
|
20
|
+
* Call in beforeEach.
|
|
21
21
|
*/
|
|
22
22
|
async setUp() {
|
|
23
23
|
this.app = await this.createApplication();
|
|
24
24
|
this.http = new MakesHttpRequests_1.MakesHttpRequests(this.app);
|
|
25
25
|
this.db = new InteractsWithDatabase_1.InteractsWithDatabase();
|
|
26
|
-
// Ensure database is connected
|
|
27
26
|
Database_1.Database.connect();
|
|
28
27
|
}
|
|
29
28
|
/**
|
|
30
29
|
* Clean up the test environment.
|
|
31
|
-
*
|
|
30
|
+
* Call in afterEach.
|
|
32
31
|
*/
|
|
33
32
|
async tearDown() {
|
|
34
33
|
await Database_1.Database.disconnect();
|
|
35
|
-
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Run a test body inside a database transaction that is rolled back
|
|
37
|
+
* after the callback completes — keeps the database clean between tests.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* it("creates a user", () => this.withTransaction(async () => {
|
|
41
|
+
* await User.create({ name: "Alice" });
|
|
42
|
+
* await this.assertDatabaseHas("users", { name: "Alice" });
|
|
43
|
+
* }));
|
|
44
|
+
*/
|
|
45
|
+
async withTransaction(cb) {
|
|
46
|
+
const knex = Database_1.Database.connect();
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
knex.transaction((trx) => Builder_1.Builder.txStorage.run(trx, async () => {
|
|
49
|
+
try {
|
|
50
|
+
const result = await cb();
|
|
51
|
+
await trx.rollback(); // always roll back to keep DB clean
|
|
52
|
+
resolve(result);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
await trx.rollback();
|
|
56
|
+
reject(err);
|
|
57
|
+
}
|
|
58
|
+
})).catch(reject);
|
|
59
|
+
});
|
|
36
60
|
}
|
|
37
61
|
// --- HTTP Helpers ---
|
|
38
62
|
async get(uri, headers = {}) {
|
|
@@ -26,16 +26,32 @@ export declare class TestResponse {
|
|
|
26
26
|
* Assert that the response has a 404 Not Found status code.
|
|
27
27
|
*/
|
|
28
28
|
assertNotFound(): this;
|
|
29
|
+
/**
|
|
30
|
+
* Assert that the response has a 401 Unauthorized status code.
|
|
31
|
+
*/
|
|
32
|
+
assertUnauthorized(): this;
|
|
29
33
|
/**
|
|
30
34
|
* Assert that the response has a 422 Unprocessable Entity status code.
|
|
31
35
|
*/
|
|
32
36
|
assertUnprocessable(): this;
|
|
33
37
|
/**
|
|
34
|
-
* Assert that the response has
|
|
38
|
+
* Assert that the response has a 204 No Content status code.
|
|
39
|
+
*/
|
|
40
|
+
assertNoContent(): this;
|
|
41
|
+
/**
|
|
42
|
+
* Assert that the response redirected to the given URI.
|
|
43
|
+
*/
|
|
44
|
+
assertRedirect(uri?: string): this;
|
|
45
|
+
/**
|
|
46
|
+
* Assert that the response contains the given header with optional value.
|
|
47
|
+
*/
|
|
48
|
+
assertHeader(name: string, value?: string): this;
|
|
49
|
+
/**
|
|
50
|
+
* Assert that the response JSON exactly matches the given data.
|
|
35
51
|
*/
|
|
36
52
|
assertJson(data: any): this;
|
|
37
53
|
/**
|
|
38
|
-
* Assert that the response JSON contains the given
|
|
54
|
+
* Assert that the response JSON contains the given key/value subset.
|
|
39
55
|
*/
|
|
40
56
|
assertJsonFragment(data: any): this;
|
|
41
57
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestResponse.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Testing/TestResponse.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,YAAY;IAEd,QAAQ,EAAE,GAAG;IACb,IAAI,EAAE,GAAG;gBADT,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,GAAG;IAGlB;;OAEG;IACI,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IASzC;;OAEG;IACI,QAAQ,IAAI,IAAI;IAIvB;;OAEG;IACI,aAAa,IAAI,IAAI;IAI5B;;OAEG;IACI,eAAe,IAAI,IAAI;IAI9B;;OAEG;IACI,cAAc,IAAI,IAAI;IAI7B;;OAEG;IACI,mBAAmB,IAAI,IAAI;IAIlC;;OAEG;IACI,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"TestResponse.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Testing/TestResponse.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,YAAY;IAEd,QAAQ,EAAE,GAAG;IACb,IAAI,EAAE,GAAG;gBADT,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,GAAG;IAGlB;;OAEG;IACI,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IASzC;;OAEG;IACI,QAAQ,IAAI,IAAI;IAIvB;;OAEG;IACI,aAAa,IAAI,IAAI;IAI5B;;OAEG;IACI,eAAe,IAAI,IAAI;IAI9B;;OAEG;IACI,cAAc,IAAI,IAAI;IAI7B;;OAEG;IACI,kBAAkB,IAAI,IAAI;IAIjC;;OAEG;IACI,mBAAmB,IAAI,IAAI;IAIlC;;OAEG;IACI,eAAe,IAAI,IAAI;IAI9B;;OAEG;IACI,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAmBzC;;OAEG;IACI,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAWvD;;OAEG;IACI,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAWlC;;OAEG;IACI,kBAAkB,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAa1C;;OAEG;IACI,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAUrC;;OAEG;IACI,IAAI,IAAI,GAAG;IAIlB;;OAEG;IACI,IAAI,IAAI,MAAM;CAKtB"}
|
|
@@ -45,6 +45,12 @@ class TestResponse {
|
|
|
45
45
|
assertNotFound() {
|
|
46
46
|
return this.assertStatus(404);
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Assert that the response has a 401 Unauthorized status code.
|
|
50
|
+
*/
|
|
51
|
+
assertUnauthorized() {
|
|
52
|
+
return this.assertStatus(401);
|
|
53
|
+
}
|
|
48
54
|
/**
|
|
49
55
|
* Assert that the response has a 422 Unprocessable Entity status code.
|
|
50
56
|
*/
|
|
@@ -52,24 +58,54 @@ class TestResponse {
|
|
|
52
58
|
return this.assertStatus(422);
|
|
53
59
|
}
|
|
54
60
|
/**
|
|
55
|
-
* Assert that the response has
|
|
61
|
+
* Assert that the response has a 204 No Content status code.
|
|
62
|
+
*/
|
|
63
|
+
assertNoContent() {
|
|
64
|
+
return this.assertStatus(204);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Assert that the response redirected to the given URI.
|
|
68
|
+
*/
|
|
69
|
+
assertRedirect(uri) {
|
|
70
|
+
const status = this.response.statusCode || this.response.status;
|
|
71
|
+
(0, node_assert_1.default)(status >= 300 && status < 400, `Expected a redirect response but received status ${status}.`);
|
|
72
|
+
if (uri) {
|
|
73
|
+
const location = this.response.headers?.get
|
|
74
|
+
? this.response.headers.get("location")
|
|
75
|
+
: this.response.headers?.location;
|
|
76
|
+
node_assert_1.default.strictEqual(location, uri, `Expected redirect to [${uri}] but got [${location}].`);
|
|
77
|
+
}
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Assert that the response contains the given header with optional value.
|
|
82
|
+
*/
|
|
83
|
+
assertHeader(name, value) {
|
|
84
|
+
const header = this.response.headers?.get
|
|
85
|
+
? this.response.headers.get(name.toLowerCase())
|
|
86
|
+
: this.response.headers?.[name.toLowerCase()];
|
|
87
|
+
(0, node_assert_1.default)(header !== undefined && header !== null, `Expected header [${name}] to be present.`);
|
|
88
|
+
if (value !== undefined) {
|
|
89
|
+
node_assert_1.default.strictEqual(header, value, `Expected header [${name}] to be [${value}] but got [${header}].`);
|
|
90
|
+
}
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Assert that the response JSON exactly matches the given data.
|
|
56
95
|
*/
|
|
57
96
|
assertJson(data) {
|
|
58
97
|
const actual = typeof this.data === "string" ? JSON.parse(this.data) : this.data;
|
|
59
|
-
|
|
60
|
-
node_assert_1.default.deepStrictEqual(actual[key], data[key], `JSON key [${key}] does not match. Expected: ${JSON.stringify(data[key])}, Actual: ${JSON.stringify(actual[key])}`);
|
|
61
|
-
}
|
|
98
|
+
node_assert_1.default.deepStrictEqual(actual, data, `JSON response does not match. Expected: ${JSON.stringify(data)}, Actual: ${JSON.stringify(actual)}`);
|
|
62
99
|
return this;
|
|
63
100
|
}
|
|
64
101
|
/**
|
|
65
|
-
* Assert that the response JSON contains the given
|
|
102
|
+
* Assert that the response JSON contains the given key/value subset.
|
|
66
103
|
*/
|
|
67
104
|
assertJsonFragment(data) {
|
|
68
105
|
const actual = typeof this.data === "string" ? JSON.parse(this.data) : this.data;
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
});
|
|
106
|
+
for (const key in data) {
|
|
107
|
+
node_assert_1.default.deepStrictEqual(actual[key], data[key], `JSON key [${key}] does not match. Expected: ${JSON.stringify(data[key])}, Actual: ${JSON.stringify(actual[key])}`);
|
|
108
|
+
}
|
|
73
109
|
return this;
|
|
74
110
|
}
|
|
75
111
|
/**
|