@spinajs/orm 2.0.481 → 2.0.482
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/README.md +72 -3
- package/lib/cjs/bootstrap.js +10 -0
- package/lib/cjs/bootstrap.js.map +1 -1
- package/lib/cjs/builders.d.ts +115 -11
- package/lib/cjs/builders.d.ts.map +1 -1
- package/lib/cjs/builders.js +342 -283
- package/lib/cjs/builders.js.map +1 -1
- package/lib/cjs/converters.d.ts +9 -2
- package/lib/cjs/converters.d.ts.map +1 -1
- package/lib/cjs/converters.js +48 -8
- package/lib/cjs/converters.js.map +1 -1
- package/lib/cjs/decorators.d.ts +26 -3
- package/lib/cjs/decorators.d.ts.map +1 -1
- package/lib/cjs/decorators.js +95 -42
- package/lib/cjs/decorators.js.map +1 -1
- package/lib/cjs/dehydrators.js +1 -1
- package/lib/cjs/dehydrators.js.map +1 -1
- package/lib/cjs/descriptor.d.ts +1 -0
- package/lib/cjs/descriptor.d.ts.map +1 -1
- package/lib/cjs/descriptor.js +16 -40
- package/lib/cjs/descriptor.js.map +1 -1
- package/lib/cjs/driver.d.ts +136 -7
- package/lib/cjs/driver.d.ts.map +1 -1
- package/lib/cjs/driver.js +279 -0
- package/lib/cjs/driver.js.map +1 -1
- package/lib/cjs/existsRelationHandlers.d.ts +29 -0
- package/lib/cjs/existsRelationHandlers.d.ts.map +1 -0
- package/lib/cjs/existsRelationHandlers.js +104 -0
- package/lib/cjs/existsRelationHandlers.js.map +1 -0
- package/lib/cjs/fp.d.ts.map +1 -1
- package/lib/cjs/fp.js +10 -15
- package/lib/cjs/fp.js.map +1 -1
- package/lib/cjs/hydrators.d.ts.map +1 -1
- package/lib/cjs/hydrators.js +29 -2
- package/lib/cjs/hydrators.js.map +1 -1
- package/lib/cjs/identity-map.d.ts +60 -0
- package/lib/cjs/identity-map.d.ts.map +1 -0
- package/lib/cjs/identity-map.js +135 -0
- package/lib/cjs/identity-map.js.map +1 -0
- package/lib/cjs/index.d.ts +12 -0
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +12 -0
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/interfaces.d.ts +295 -9
- package/lib/cjs/interfaces.d.ts.map +1 -1
- package/lib/cjs/interfaces.js +54 -1
- package/lib/cjs/interfaces.js.map +1 -1
- package/lib/cjs/metadata.d.ts.map +1 -1
- package/lib/cjs/metadata.js +4 -1
- package/lib/cjs/metadata.js.map +1 -1
- package/lib/cjs/metrics.d.ts +53 -0
- package/lib/cjs/metrics.d.ts.map +1 -0
- package/lib/cjs/metrics.js +82 -0
- package/lib/cjs/metrics.js.map +1 -0
- package/lib/cjs/middlewares.d.ts +13 -1
- package/lib/cjs/middlewares.d.ts.map +1 -1
- package/lib/cjs/middlewares.js +55 -15
- package/lib/cjs/middlewares.js.map +1 -1
- package/lib/cjs/model.d.ts +129 -13
- package/lib/cjs/model.d.ts.map +1 -1
- package/lib/cjs/model.js +449 -93
- package/lib/cjs/model.js.map +1 -1
- package/lib/cjs/orm.d.ts.map +1 -1
- package/lib/cjs/orm.js +12 -3
- package/lib/cjs/orm.js.map +1 -1
- package/lib/cjs/orphan.d.ts +27 -0
- package/lib/cjs/orphan.d.ts.map +1 -0
- package/lib/cjs/orphan.js +55 -0
- package/lib/cjs/orphan.js.map +1 -0
- package/lib/cjs/primary-keys.d.ts +60 -0
- package/lib/cjs/primary-keys.d.ts.map +1 -0
- package/lib/cjs/primary-keys.js +243 -0
- package/lib/cjs/primary-keys.js.map +1 -0
- package/lib/cjs/relation-objects.d.ts +101 -9
- package/lib/cjs/relation-objects.d.ts.map +1 -1
- package/lib/cjs/relation-objects.js +194 -43
- package/lib/cjs/relation-objects.js.map +1 -1
- package/lib/cjs/relations.d.ts +7 -1
- package/lib/cjs/relations.d.ts.map +1 -1
- package/lib/cjs/relations.js +16 -1
- package/lib/cjs/relations.js.map +1 -1
- package/lib/cjs/resilience.d.ts +50 -0
- package/lib/cjs/resilience.d.ts.map +1 -0
- package/lib/cjs/resilience.js +70 -0
- package/lib/cjs/resilience.js.map +1 -0
- package/lib/cjs/snapshot.d.ts +58 -0
- package/lib/cjs/snapshot.d.ts.map +1 -0
- package/lib/cjs/snapshot.js +125 -0
- package/lib/cjs/snapshot.js.map +1 -0
- package/lib/cjs/statements.d.ts +11 -1
- package/lib/cjs/statements.d.ts.map +1 -1
- package/lib/cjs/statements.js +13 -2
- package/lib/cjs/statements.js.map +1 -1
- package/lib/cjs/subject-builder.d.ts +79 -0
- package/lib/cjs/subject-builder.d.ts.map +1 -0
- package/lib/cjs/subject-builder.js +296 -0
- package/lib/cjs/subject-builder.js.map +1 -0
- package/lib/cjs/subject-executor.d.ts +122 -0
- package/lib/cjs/subject-executor.d.ts.map +1 -0
- package/lib/cjs/subject-executor.js +319 -0
- package/lib/cjs/subject-executor.js.map +1 -0
- package/lib/cjs/subject-sorter.d.ts +70 -0
- package/lib/cjs/subject-sorter.d.ts.map +1 -0
- package/lib/cjs/subject-sorter.js +173 -0
- package/lib/cjs/subject-sorter.js.map +1 -0
- package/lib/cjs/subject.d.ts +100 -0
- package/lib/cjs/subject.d.ts.map +1 -0
- package/lib/cjs/subject.js +89 -0
- package/lib/cjs/subject.js.map +1 -0
- package/lib/cjs/unit-of-work.d.ts +52 -0
- package/lib/cjs/unit-of-work.d.ts.map +1 -0
- package/lib/cjs/unit-of-work.js +170 -0
- package/lib/cjs/unit-of-work.js.map +1 -0
- package/lib/mjs/bootstrap.js +10 -0
- package/lib/mjs/bootstrap.js.map +1 -1
- package/lib/mjs/builders.d.ts +115 -11
- package/lib/mjs/builders.d.ts.map +1 -1
- package/lib/mjs/builders.js +344 -285
- package/lib/mjs/builders.js.map +1 -1
- package/lib/mjs/converters.d.ts +9 -2
- package/lib/mjs/converters.d.ts.map +1 -1
- package/lib/mjs/converters.js +48 -8
- package/lib/mjs/converters.js.map +1 -1
- package/lib/mjs/decorators.d.ts +26 -3
- package/lib/mjs/decorators.d.ts.map +1 -1
- package/lib/mjs/decorators.js +96 -44
- package/lib/mjs/decorators.js.map +1 -1
- package/lib/mjs/dehydrators.js +1 -1
- package/lib/mjs/dehydrators.js.map +1 -1
- package/lib/mjs/descriptor.d.ts +1 -0
- package/lib/mjs/descriptor.d.ts.map +1 -1
- package/lib/mjs/descriptor.js +17 -39
- package/lib/mjs/descriptor.js.map +1 -1
- package/lib/mjs/driver.d.ts +136 -7
- package/lib/mjs/driver.d.ts.map +1 -1
- package/lib/mjs/driver.js +279 -0
- package/lib/mjs/driver.js.map +1 -1
- package/lib/mjs/existsRelationHandlers.d.ts +29 -0
- package/lib/mjs/existsRelationHandlers.d.ts.map +1 -0
- package/lib/mjs/existsRelationHandlers.js +100 -0
- package/lib/mjs/existsRelationHandlers.js.map +1 -0
- package/lib/mjs/fp.d.ts.map +1 -1
- package/lib/mjs/fp.js +10 -15
- package/lib/mjs/fp.js.map +1 -1
- package/lib/mjs/hydrators.d.ts.map +1 -1
- package/lib/mjs/hydrators.js +29 -2
- package/lib/mjs/hydrators.js.map +1 -1
- package/lib/mjs/identity-map.d.ts +60 -0
- package/lib/mjs/identity-map.d.ts.map +1 -0
- package/lib/mjs/identity-map.js +130 -0
- package/lib/mjs/identity-map.js.map +1 -0
- package/lib/mjs/index.d.ts +12 -0
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +12 -0
- package/lib/mjs/index.js.map +1 -1
- package/lib/mjs/interfaces.d.ts +295 -9
- package/lib/mjs/interfaces.d.ts.map +1 -1
- package/lib/mjs/interfaces.js +53 -0
- package/lib/mjs/interfaces.js.map +1 -1
- package/lib/mjs/metadata.d.ts.map +1 -1
- package/lib/mjs/metadata.js +4 -1
- package/lib/mjs/metadata.js.map +1 -1
- package/lib/mjs/metrics.d.ts +53 -0
- package/lib/mjs/metrics.d.ts.map +1 -0
- package/lib/mjs/metrics.js +76 -0
- package/lib/mjs/metrics.js.map +1 -0
- package/lib/mjs/middlewares.d.ts +13 -1
- package/lib/mjs/middlewares.d.ts.map +1 -1
- package/lib/mjs/middlewares.js +55 -15
- package/lib/mjs/middlewares.js.map +1 -1
- package/lib/mjs/model.d.ts +129 -13
- package/lib/mjs/model.d.ts.map +1 -1
- package/lib/mjs/model.js +451 -95
- package/lib/mjs/model.js.map +1 -1
- package/lib/mjs/orm.d.ts.map +1 -1
- package/lib/mjs/orm.js +12 -3
- package/lib/mjs/orm.js.map +1 -1
- package/lib/mjs/orphan.d.ts +27 -0
- package/lib/mjs/orphan.d.ts.map +1 -0
- package/lib/mjs/orphan.js +52 -0
- package/lib/mjs/orphan.js.map +1 -0
- package/lib/mjs/primary-keys.d.ts +60 -0
- package/lib/mjs/primary-keys.d.ts.map +1 -0
- package/lib/mjs/primary-keys.js +223 -0
- package/lib/mjs/primary-keys.js.map +1 -0
- package/lib/mjs/relation-objects.d.ts +101 -9
- package/lib/mjs/relation-objects.d.ts.map +1 -1
- package/lib/mjs/relation-objects.js +194 -43
- package/lib/mjs/relation-objects.js.map +1 -1
- package/lib/mjs/relations.d.ts +7 -1
- package/lib/mjs/relations.d.ts.map +1 -1
- package/lib/mjs/relations.js +16 -1
- package/lib/mjs/relations.js.map +1 -1
- package/lib/mjs/resilience.d.ts +50 -0
- package/lib/mjs/resilience.d.ts.map +1 -0
- package/lib/mjs/resilience.js +64 -0
- package/lib/mjs/resilience.js.map +1 -0
- package/lib/mjs/snapshot.d.ts +58 -0
- package/lib/mjs/snapshot.d.ts.map +1 -0
- package/lib/mjs/snapshot.js +115 -0
- package/lib/mjs/snapshot.js.map +1 -0
- package/lib/mjs/statements.d.ts +11 -1
- package/lib/mjs/statements.d.ts.map +1 -1
- package/lib/mjs/statements.js +14 -3
- package/lib/mjs/statements.js.map +1 -1
- package/lib/mjs/subject-builder.d.ts +79 -0
- package/lib/mjs/subject-builder.d.ts.map +1 -0
- package/lib/mjs/subject-builder.js +292 -0
- package/lib/mjs/subject-builder.js.map +1 -0
- package/lib/mjs/subject-executor.d.ts +122 -0
- package/lib/mjs/subject-executor.d.ts.map +1 -0
- package/lib/mjs/subject-executor.js +312 -0
- package/lib/mjs/subject-executor.js.map +1 -0
- package/lib/mjs/subject-sorter.d.ts +70 -0
- package/lib/mjs/subject-sorter.d.ts.map +1 -0
- package/lib/mjs/subject-sorter.js +168 -0
- package/lib/mjs/subject-sorter.js.map +1 -0
- package/lib/mjs/subject.d.ts +100 -0
- package/lib/mjs/subject.d.ts.map +1 -0
- package/lib/mjs/subject.js +84 -0
- package/lib/mjs/subject.js.map +1 -0
- package/lib/mjs/unit-of-work.d.ts +52 -0
- package/lib/mjs/unit-of-work.d.ts.map +1 -0
- package/lib/mjs/unit-of-work.js +166 -0
- package/lib/mjs/unit-of-work.js.map +1 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +9 -7
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle state of a driver's connection to its database.
|
|
3
|
+
*/
|
|
4
|
+
export declare enum ConnectionState {
|
|
5
|
+
Disconnected = "disconnected",
|
|
6
|
+
Connecting = "connecting",
|
|
7
|
+
Connected = "connected",
|
|
8
|
+
/** Reachable but failing health probes, or mid-reconnect. Queries are still attempted. */
|
|
9
|
+
Degraded = "degraded"
|
|
10
|
+
}
|
|
11
|
+
export interface IConnectionResilienceOptions {
|
|
12
|
+
/**
|
|
13
|
+
* Milliseconds between health probes. 0 disables the periodic probe. Default 30000.
|
|
14
|
+
*/
|
|
15
|
+
HealthCheckInterval?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Reconnect attempts per outage before giving up. Default 5.
|
|
18
|
+
*/
|
|
19
|
+
MaxRetries?: number;
|
|
20
|
+
/**
|
|
21
|
+
* First backoff delay in ms; doubles each attempt. Default 200.
|
|
22
|
+
*/
|
|
23
|
+
RetryDelay?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Upper bound on the backoff delay in ms. Default 5000.
|
|
26
|
+
*/
|
|
27
|
+
MaxRetryDelay?: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Error codes that mean the transport died rather than the statement being wrong. Retrying a
|
|
31
|
+
* statement that the server rejected only multiplies the failure, so this set is deliberately
|
|
32
|
+
* narrow: connection-level Node socket errors plus the mysql2 protocol codes for a lost or
|
|
33
|
+
* exhausted connection.
|
|
34
|
+
*/
|
|
35
|
+
export declare const RETRYABLE_ERROR_CODES: ReadonlySet<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Backoff delay for attempt `n` (0-based), doubling from `base` and clamped to `max`.
|
|
38
|
+
*/
|
|
39
|
+
export declare function backoffDelay(attempt: number, base: number, max: number): number;
|
|
40
|
+
/**
|
|
41
|
+
* Promise-returning sleep used by the retry loop.
|
|
42
|
+
*/
|
|
43
|
+
export declare function delay(ms: number): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Walks an error and its `inner` / `cause` chain looking for a retryable code. Driver errors are
|
|
46
|
+
* frequently wrapped ( OrmException carries the original in `inner` ), so a shallow check misses
|
|
47
|
+
* exactly the cases that matter.
|
|
48
|
+
*/
|
|
49
|
+
export declare function isRetryableErrorCode(err: unknown): boolean;
|
|
50
|
+
//# sourceMappingURL=resilience.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resilience.d.ts","sourceRoot":"","sources":["../../src/resilience.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,eAAe;IACzB,YAAY,iBAAiB;IAC7B,UAAU,eAAe;IACzB,SAAS,cAAc;IAEvB,0FAA0F;IAC1F,QAAQ,aAAa;CACtB;AAED,MAAM,WAAW,4BAA4B;IAC3C;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAepD,CAAC;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAe1D"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RETRYABLE_ERROR_CODES = exports.ConnectionState = void 0;
|
|
4
|
+
exports.backoffDelay = backoffDelay;
|
|
5
|
+
exports.delay = delay;
|
|
6
|
+
exports.isRetryableErrorCode = isRetryableErrorCode;
|
|
7
|
+
/**
|
|
8
|
+
* Lifecycle state of a driver's connection to its database.
|
|
9
|
+
*/
|
|
10
|
+
var ConnectionState;
|
|
11
|
+
(function (ConnectionState) {
|
|
12
|
+
ConnectionState["Disconnected"] = "disconnected";
|
|
13
|
+
ConnectionState["Connecting"] = "connecting";
|
|
14
|
+
ConnectionState["Connected"] = "connected";
|
|
15
|
+
/** Reachable but failing health probes, or mid-reconnect. Queries are still attempted. */
|
|
16
|
+
ConnectionState["Degraded"] = "degraded";
|
|
17
|
+
})(ConnectionState || (exports.ConnectionState = ConnectionState = {}));
|
|
18
|
+
/**
|
|
19
|
+
* Error codes that mean the transport died rather than the statement being wrong. Retrying a
|
|
20
|
+
* statement that the server rejected only multiplies the failure, so this set is deliberately
|
|
21
|
+
* narrow: connection-level Node socket errors plus the mysql2 protocol codes for a lost or
|
|
22
|
+
* exhausted connection.
|
|
23
|
+
*/
|
|
24
|
+
exports.RETRYABLE_ERROR_CODES = new Set([
|
|
25
|
+
'ECONNRESET',
|
|
26
|
+
'ECONNREFUSED',
|
|
27
|
+
'EPIPE',
|
|
28
|
+
'ETIMEDOUT',
|
|
29
|
+
'EHOSTUNREACH',
|
|
30
|
+
'ENETUNREACH',
|
|
31
|
+
'ENOTFOUND',
|
|
32
|
+
'PROTOCOL_CONNECTION_LOST',
|
|
33
|
+
'PROTOCOL_SEQUENCE_TIMEOUT',
|
|
34
|
+
'PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR',
|
|
35
|
+
'PROTOCOL_ENQUEUE_AFTER_QUIT',
|
|
36
|
+
'ER_CON_COUNT_ERROR',
|
|
37
|
+
'ER_LOCK_WAIT_TIMEOUT',
|
|
38
|
+
'SQLITE_BUSY',
|
|
39
|
+
]);
|
|
40
|
+
/**
|
|
41
|
+
* Backoff delay for attempt `n` (0-based), doubling from `base` and clamped to `max`.
|
|
42
|
+
*/
|
|
43
|
+
function backoffDelay(attempt, base, max) {
|
|
44
|
+
return Math.min(base * Math.pow(2, attempt), max);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Promise-returning sleep used by the retry loop.
|
|
48
|
+
*/
|
|
49
|
+
function delay(ms) {
|
|
50
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Walks an error and its `inner` / `cause` chain looking for a retryable code. Driver errors are
|
|
54
|
+
* frequently wrapped ( OrmException carries the original in `inner` ), so a shallow check misses
|
|
55
|
+
* exactly the cases that matter.
|
|
56
|
+
*/
|
|
57
|
+
function isRetryableErrorCode(err) {
|
|
58
|
+
let current = err;
|
|
59
|
+
let depth = 0;
|
|
60
|
+
while (current && depth < 5) {
|
|
61
|
+
const code = current.code ?? current.errno;
|
|
62
|
+
if (typeof code === 'string' && exports.RETRYABLE_ERROR_CODES.has(code)) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
current = current.inner ?? current.cause;
|
|
66
|
+
depth++;
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=resilience.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resilience.js","sourceRoot":"","sources":["../../src/resilience.ts"],"names":[],"mappings":";;;AA4DA,oCAEC;AAKD,sBAEC;AAOD,oDAeC;AA3FD;;GAEG;AACH,IAAY,eAOX;AAPD,WAAY,eAAe;IACzB,gDAA6B,CAAA;IAC7B,4CAAyB,CAAA;IACzB,0CAAuB,CAAA;IAEvB,0FAA0F;IAC1F,wCAAqB,CAAA;AACvB,CAAC,EAPW,eAAe,+BAAf,eAAe,QAO1B;AAwBD;;;;;GAKG;AACU,QAAA,qBAAqB,GAAwB,IAAI,GAAG,CAAC;IAChE,YAAY;IACZ,cAAc;IACd,OAAO;IACP,WAAW;IACX,cAAc;IACd,aAAa;IACb,WAAW;IACX,0BAA0B;IAC1B,2BAA2B;IAC3B,oCAAoC;IACpC,6BAA6B;IAC7B,oBAAoB;IACpB,sBAAsB;IACtB,aAAa;CACd,CAAC,CAAC;AAEH;;GAEG;AACH,SAAgB,YAAY,CAAC,OAAe,EAAE,IAAY,EAAE,GAAW;IACrE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAgB,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,GAAY;IAC/C,IAAI,OAAO,GAAQ,GAAG,CAAC;IACvB,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,OAAO,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC;QAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,6BAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;QACzC,KAAK,EAAE,CAAC;IACV,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { IModelDescriptor, IValueConverter } from './interfaces.js';
|
|
2
|
+
/**
|
|
3
|
+
* The diff baseline for one model instance.
|
|
4
|
+
*
|
|
5
|
+
* `Columns` holds a *value copy* of every column at the moment the model was hydrated from
|
|
6
|
+
* the database. `Relations` holds, per relation name, the primary keys of the members that
|
|
7
|
+
* were present when that relation was populated.
|
|
8
|
+
*
|
|
9
|
+
* Both must be copies. If a snapshot aliases live state, a later mutation changes the
|
|
10
|
+
* baseline as well, the diff is empty, and `save()` silently does nothing.
|
|
11
|
+
*/
|
|
12
|
+
export interface IModelSnapshot {
|
|
13
|
+
Columns: Map<string, unknown>;
|
|
14
|
+
Relations: Map<string, unknown[]>;
|
|
15
|
+
}
|
|
16
|
+
export declare function createSnapshot(): IModelSnapshot;
|
|
17
|
+
/**
|
|
18
|
+
* Marker held in a snapshot in place of a value the ORM cannot copy.
|
|
19
|
+
*
|
|
20
|
+
* A baseline that ALIASES a mutable object is the worst possible answer: the baseline
|
|
21
|
+
* mutates along with the model, the diff comes out empty, and `save()` silently drops the
|
|
22
|
+
* caller's edit. This marker is never equal to anything, so such a column is reported as
|
|
23
|
+
* changed on every save — a redundant write instead of a lost one. A converter opts out of
|
|
24
|
+
* the redundancy by implementing `snapshotValue` / `snapshotEquals`.
|
|
25
|
+
*/
|
|
26
|
+
export declare const UNCOPYABLE: unique symbol;
|
|
27
|
+
/**
|
|
28
|
+
* Takes a value copy suitable for a diff baseline.
|
|
29
|
+
*
|
|
30
|
+
* Immutable values (primitives, luxon `DateTime`) are returned as-is. Everything the ORM can
|
|
31
|
+
* put in a column and that can be mutated in place — `Buffer` (binary/UUID columns), `Date`,
|
|
32
|
+
* arrays and plain objects (JSON columns) — is copied.
|
|
33
|
+
*
|
|
34
|
+
* A mutable instance of a class the ORM does not own cannot be copied safely: cloning it
|
|
35
|
+
* could break its invariants. Such a value is replaced by {@link UNCOPYABLE} unless its
|
|
36
|
+
* column's converter supplies a `snapshotValue` hook.
|
|
37
|
+
*
|
|
38
|
+
* @param value - the in-memory column value
|
|
39
|
+
* @param converter - the column's converter, when it has one
|
|
40
|
+
*/
|
|
41
|
+
export declare function snapshotValue(value: unknown, converter?: IValueConverter | null): unknown;
|
|
42
|
+
/**
|
|
43
|
+
* Value equality for a diff. Deliberately stricter than `==`: `null` and `undefined` are
|
|
44
|
+
* different (one is "explicitly cleared", the other "never set"), and `0`/`''`/`false` are
|
|
45
|
+
* never equal to each other.
|
|
46
|
+
*
|
|
47
|
+
* @param a - baseline value
|
|
48
|
+
* @param b - current value
|
|
49
|
+
* @param converter - the column's converter, when it has one
|
|
50
|
+
*/
|
|
51
|
+
export declare function snapshotEquals(a: unknown, b: unknown, converter?: IValueConverter | null): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Builds a column snapshot straight from a raw database row, applying the same converters
|
|
54
|
+
* hydration applies. Used by `save({ reload: true })`, which needs the *database's* current
|
|
55
|
+
* values as the baseline without disturbing the user's in-memory edits.
|
|
56
|
+
*/
|
|
57
|
+
export declare function snapshotFromRow(descriptor: IModelDescriptor, row: Record<string, unknown>): Map<string, unknown>;
|
|
58
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/snapshot.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEpE;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;CACnC;AAED,wBAAgB,cAAc,IAAI,cAAc,CAK/C;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,eAA4C,CAAC;AAEpE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CA+BzF;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CAoClG;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAgBhH"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.UNCOPYABLE = void 0;
|
|
7
|
+
exports.createSnapshot = createSnapshot;
|
|
8
|
+
exports.snapshotValue = snapshotValue;
|
|
9
|
+
exports.snapshotEquals = snapshotEquals;
|
|
10
|
+
exports.snapshotFromRow = snapshotFromRow;
|
|
11
|
+
/* eslint-disable prettier/prettier */
|
|
12
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
13
|
+
const luxon_1 = require("luxon");
|
|
14
|
+
function createSnapshot() {
|
|
15
|
+
return {
|
|
16
|
+
Columns: new Map(),
|
|
17
|
+
Relations: new Map(),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Marker held in a snapshot in place of a value the ORM cannot copy.
|
|
22
|
+
*
|
|
23
|
+
* A baseline that ALIASES a mutable object is the worst possible answer: the baseline
|
|
24
|
+
* mutates along with the model, the diff comes out empty, and `save()` silently drops the
|
|
25
|
+
* caller's edit. This marker is never equal to anything, so such a column is reported as
|
|
26
|
+
* changed on every save — a redundant write instead of a lost one. A converter opts out of
|
|
27
|
+
* the redundancy by implementing `snapshotValue` / `snapshotEquals`.
|
|
28
|
+
*/
|
|
29
|
+
exports.UNCOPYABLE = Symbol('spinajs.orm.snapshot.uncopyable');
|
|
30
|
+
/**
|
|
31
|
+
* Takes a value copy suitable for a diff baseline.
|
|
32
|
+
*
|
|
33
|
+
* Immutable values (primitives, luxon `DateTime`) are returned as-is. Everything the ORM can
|
|
34
|
+
* put in a column and that can be mutated in place — `Buffer` (binary/UUID columns), `Date`,
|
|
35
|
+
* arrays and plain objects (JSON columns) — is copied.
|
|
36
|
+
*
|
|
37
|
+
* A mutable instance of a class the ORM does not own cannot be copied safely: cloning it
|
|
38
|
+
* could break its invariants. Such a value is replaced by {@link UNCOPYABLE} unless its
|
|
39
|
+
* column's converter supplies a `snapshotValue` hook.
|
|
40
|
+
*
|
|
41
|
+
* @param value - the in-memory column value
|
|
42
|
+
* @param converter - the column's converter, when it has one
|
|
43
|
+
*/
|
|
44
|
+
function snapshotValue(value, converter) {
|
|
45
|
+
if (converter?.snapshotValue) {
|
|
46
|
+
return converter.snapshotValue(value);
|
|
47
|
+
}
|
|
48
|
+
if (value === null || value === undefined) {
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
if (typeof value !== 'object') {
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
if (luxon_1.DateTime.isDateTime(value)) {
|
|
55
|
+
// luxon DateTime is immutable; every "mutation" returns a new instance.
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
if (Buffer.isBuffer(value)) {
|
|
59
|
+
return Buffer.from(value);
|
|
60
|
+
}
|
|
61
|
+
if (value instanceof Date) {
|
|
62
|
+
return new Date(value.getTime());
|
|
63
|
+
}
|
|
64
|
+
if (Array.isArray(value) || lodash_1.default.isPlainObject(value)) {
|
|
65
|
+
return lodash_1.default.cloneDeep(value);
|
|
66
|
+
}
|
|
67
|
+
return exports.UNCOPYABLE;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Value equality for a diff. Deliberately stricter than `==`: `null` and `undefined` are
|
|
71
|
+
* different (one is "explicitly cleared", the other "never set"), and `0`/`''`/`false` are
|
|
72
|
+
* never equal to each other.
|
|
73
|
+
*
|
|
74
|
+
* @param a - baseline value
|
|
75
|
+
* @param b - current value
|
|
76
|
+
* @param converter - the column's converter, when it has one
|
|
77
|
+
*/
|
|
78
|
+
function snapshotEquals(a, b, converter) {
|
|
79
|
+
if (converter?.snapshotEquals) {
|
|
80
|
+
return converter.snapshotEquals(a, b);
|
|
81
|
+
}
|
|
82
|
+
// Set by `snapshotValue` for a value it could not copy. Never equal to anything, so the
|
|
83
|
+
// column is always reported as changed rather than silently never written.
|
|
84
|
+
if (a === exports.UNCOPYABLE || b === exports.UNCOPYABLE) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
if (a === b) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
if (a === null || a === undefined || b === null || b === undefined) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
if (luxon_1.DateTime.isDateTime(a) && luxon_1.DateTime.isDateTime(b)) {
|
|
94
|
+
return a.toMillis() === b.toMillis();
|
|
95
|
+
}
|
|
96
|
+
if (a instanceof Date && b instanceof Date) {
|
|
97
|
+
return a.getTime() === b.getTime();
|
|
98
|
+
}
|
|
99
|
+
if (Buffer.isBuffer(a) && Buffer.isBuffer(b)) {
|
|
100
|
+
return a.equals(b);
|
|
101
|
+
}
|
|
102
|
+
if (typeof a === 'object' && typeof b === 'object') {
|
|
103
|
+
return lodash_1.default.isEqual(a, b);
|
|
104
|
+
}
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Builds a column snapshot straight from a raw database row, applying the same converters
|
|
109
|
+
* hydration applies. Used by `save({ reload: true })`, which needs the *database's* current
|
|
110
|
+
* values as the baseline without disturbing the user's in-memory edits.
|
|
111
|
+
*/
|
|
112
|
+
function snapshotFromRow(descriptor, row) {
|
|
113
|
+
const columns = new Map();
|
|
114
|
+
for (const c of descriptor.Columns ?? []) {
|
|
115
|
+
if (!(c.Name in row)) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
119
|
+
const raw = row[c.Name];
|
|
120
|
+
const converted = c.Converter ? c.Converter.fromDB(raw, row, descriptor.Converters.get(c.Name)?.Options) : raw;
|
|
121
|
+
columns.set(c.Name, snapshotValue(converted, c.Converter));
|
|
122
|
+
}
|
|
123
|
+
return columns;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/snapshot.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/statements.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IJoinStatementOptions } from './interfaces.js';
|
|
2
2
|
import type { SelectQueryBuilder, WhereBuilder, RawQuery, QueryBuilder } from './builders.js';
|
|
3
|
-
import { ColumnMethods, SqlOperator } from './enums.js';
|
|
3
|
+
import { ColumnMethods, SqlOperator, WhereBoolean } from './enums.js';
|
|
4
4
|
import { Container, Class, Constructor, IContainer } from '@spinajs/di';
|
|
5
5
|
import { IColumnDescriptor } from './interfaces.js';
|
|
6
6
|
import { ModelBase } from './model.js';
|
|
@@ -11,13 +11,23 @@ export interface IQueryStatementResult {
|
|
|
11
11
|
}
|
|
12
12
|
export interface IQueryStatement {
|
|
13
13
|
TableAlias: string;
|
|
14
|
+
/**
|
|
15
|
+
* Boolean connector that precedes this statement inside a WHERE/HAVING clause.
|
|
16
|
+
* The very first statement in a clause has no leading connector (the value is
|
|
17
|
+
* ignored). Subsequent statements are joined by their own connector, so
|
|
18
|
+
* `where(a).where(b).orWhere(c)` compiles to `a AND b OR c`.
|
|
19
|
+
*/
|
|
20
|
+
Boolean: WhereBoolean;
|
|
14
21
|
build(): IQueryStatementResult;
|
|
15
22
|
clone(parent?: QueryBuilder | SelectQueryBuilder | WhereBuilder<any>): IQueryStatement;
|
|
16
23
|
}
|
|
17
24
|
export declare abstract class QueryStatement implements IQueryStatement {
|
|
18
25
|
protected _tableAlias: string | undefined;
|
|
26
|
+
protected _boolean: WhereBoolean;
|
|
19
27
|
get TableAlias(): string;
|
|
20
28
|
set TableAlias(alias: string);
|
|
29
|
+
get Boolean(): WhereBoolean;
|
|
30
|
+
set Boolean(op: WhereBoolean);
|
|
21
31
|
constructor(tableAlias?: string | null);
|
|
22
32
|
abstract build(): IQueryStatementResult;
|
|
23
33
|
abstract clone<T extends QueryBuilder | SelectQueryBuilder | WhereBuilder<any>>(parent?: T): IQueryStatement;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statements.d.ts","sourceRoot":"","sources":["../../src/statements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"statements.d.ts","sourceRoot":"","sources":["../../src/statements.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/statements.js
CHANGED
|
@@ -26,7 +26,14 @@ class QueryStatement {
|
|
|
26
26
|
set TableAlias(alias) {
|
|
27
27
|
this._tableAlias = alias;
|
|
28
28
|
}
|
|
29
|
+
get Boolean() {
|
|
30
|
+
return this._boolean;
|
|
31
|
+
}
|
|
32
|
+
set Boolean(op) {
|
|
33
|
+
this._boolean = op;
|
|
34
|
+
}
|
|
29
35
|
constructor(tableAlias) {
|
|
36
|
+
this._boolean = enums_js_1.WhereBoolean.AND;
|
|
30
37
|
this._tableAlias = tableAlias ?? undefined;
|
|
31
38
|
}
|
|
32
39
|
}
|
|
@@ -134,7 +141,7 @@ let WhereStatement = class WhereStatement extends QueryStatement {
|
|
|
134
141
|
const columnDesc = columnName && desc ? desc.Columns.find((x) => x.Name === columnName) : null;
|
|
135
142
|
// Allow primary key columns and any model property even if not explicitly in Columns array
|
|
136
143
|
// Some properties may be defined without decorators or only with @Primary
|
|
137
|
-
if (columnName && !columnDesc &&
|
|
144
|
+
if (columnName && !columnDesc && !desc?.PrimaryKey.includes(columnName) && !(columnName in this._model.prototype)) {
|
|
138
145
|
throw new exceptions_1.InvalidArgument(`column ${columnName} not exists in model ${this._model.name}`);
|
|
139
146
|
}
|
|
140
147
|
this._isAggregate = columnDesc?.Aggregate ?? false;
|
|
@@ -194,7 +201,11 @@ let JoinStatement = class JoinStatement extends QueryStatement {
|
|
|
194
201
|
if (_options.queryCallback) {
|
|
195
202
|
_options.queryCallback.call(this._whereBuilder);
|
|
196
203
|
}
|
|
197
|
-
|
|
204
|
+
// Merge columns/sort from the join sub-builder, but NOT its WHERE
|
|
205
|
+
// statements — those are emitted in the JOIN's ON clause by build() so a
|
|
206
|
+
// LEFT JOIN stays a LEFT JOIN (otherwise the condition lands in the main
|
|
207
|
+
// WHERE and filters out rows the outer join is meant to keep).
|
|
208
|
+
this._options.builder.mergeBuilder(this._whereBuilder, false);
|
|
198
209
|
}
|
|
199
210
|
}
|
|
200
211
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statements.js","sourceRoot":"","sources":["../../src/statements.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,
|
|
1
|
+
{"version":3,"file":"statements.js","sourceRoot":"","sources":["../../src/statements.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,yCAAsE;AACtE,oCAA6F;AAC7F,oDAAuB;AAGvB,wCAAqC;AACrC,oDAAsD;AACtD,mDAAyD;AAuBzD,MAAsB,cAAc;IAKlC,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,IAAW,UAAU,CAAC,KAAa;QACjC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAW,OAAO,CAAC,EAAgB;QACjC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,YAAY,UAA0B;QAlB5B,aAAQ,GAAiB,uBAAY,CAAC,GAAG,CAAC;QAmBlD,IAAI,CAAC,WAAW,GAAG,UAAU,IAAI,SAAS,CAAC;IAC7C,CAAC;CAKF;AA5BD,wCA4BC;AAGM,IAAe,iBAAiB,GAAhC,MAAe,iBAAkB,SAAQ,cAAc;IAI5D,YAAY,KAAa,EAAE,QAAgB;QACzC,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,QAAQ,IAAI,EAAE,CAAC;IAClC,CAAC;CAGF,CAAA;AAZqB,8CAAiB;4BAAjB,iBAAiB;IADtC,IAAA,gBAAW,GAAE;;GACQ,iBAAiB,CAYtC;AAIM,IAAe,sBAAsB,GAArC,MAAe,sBAAuB,SAAQ,cAAc;IACjE,YAAsB,SAAqB,EAAY,KAAa,EAAY,MAA0B,EAAY,UAAkB,EAAY,OAAe;QACjK,KAAK,CAAC,IAAI,CAAC,CAAC;QADQ,cAAS,GAAT,SAAS,CAAY;QAAY,UAAK,GAAL,KAAK,CAAQ;QAAY,WAAM,GAAN,MAAM,CAAoB;QAAY,eAAU,GAAV,UAAU,CAAQ;QAAY,YAAO,GAAP,OAAO,CAAQ;IAEnK,CAAC;CAGF,CAAA;AANqB,wDAAsB;iCAAtB,sBAAsB;IAF3C,IAAA,gBAAW,GAAE;IACb,IAAA,WAAM,EAAC,cAAS,CAAC;;GACI,sBAAsB,CAM3C;AAEM,IAAe,gBAAgB,GAA/B,MAAe,gBAAiB,SAAQ,cAAc;IAG3D,YAAY,UAA6B,EAAE,UAAkB;QAC3D,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;IAC1B,CAAC;CAGF,CAAA;AAVqB,4CAAgB;2BAAhB,gBAAgB;IADrC,IAAA,gBAAW,GAAE;;GACQ,gBAAgB,CAUrC;AAGM,IAAe,gBAAgB,GAA/B,MAAe,gBAAiB,SAAQ,cAAc;IAK3D,YAAY,MAAc,EAAE,GAAU,EAAE,GAAY,EAAE,UAAkB;QACtE,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,EAAE,CAAC;IAC9B,CAAC;CAGF,CAAA;AAdqB,4CAAgB;2BAAhB,gBAAgB;IADrC,IAAA,gBAAW,GAAE;;GACQ,gBAAgB,CAcrC;AAEM,IAAe,mBAAmB,GAAlC,MAAe,mBAAoB,SAAQ,cAAc;IAG9D,YAAY,OAA0B;QACpC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;CAGF,CAAA;AATqB,kDAAmB;8BAAnB,mBAAmB;IADxC,IAAA,gBAAW,GAAE;;GACQ,mBAAmB,CASxC;AAGM,IAAe,kBAAkB,GAAjC,MAAe,kBAAmB,SAAQ,cAAc;IAE7D,YAAsB,QAAuB,EAAY,OAAiB;QACxE,KAAK,EAAE,CAAC;QADY,aAAQ,GAAR,QAAQ,CAAe;QAAY,YAAO,GAAP,OAAO,CAAU;IAE1E,CAAC;CAGF,CAAA;AAPqB,gDAAkB;6BAAlB,kBAAkB;IADvC,IAAA,gBAAW,GAAE;qCAGoB,WAAI;GAFhB,kBAAkB,CAOvC;AAGM,IAAe,cAAc,GAA7B,MAAe,cAAe,SAAQ,cAAc;IASzD,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAGD,YAAY,MAAqB,EAAE,QAAqB,EAAE,KAAU,EAAE,OAA8B;QAClG,KAAK,EAAE,CAAC;QArBA,iBAAY,GAAY,KAAK,CAAC;QAsBtC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAExB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,IAAA,sCAAsB,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjD,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9D,MAAM,UAAU,GAAG,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAE/F,2FAA2F;YAC3F,0EAA0E;YAC1E,IAAI,UAAU,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClH,MAAM,IAAI,4BAAe,CAAC,UAAU,UAAU,wBAAwB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5F,CAAC;YAED,IAAI,CAAC,YAAY,GAAG,UAAU,EAAE,SAAS,IAAI,KAAK,CAAC;QACrD,CAAC;IAEH,CAAC;CAGF,CAAA;AApDqB,wCAAc;yBAAd,cAAc;IADnC,IAAA,gBAAW,GAAE;;GACQ,cAAc,CAoDnC;AAGM,IAAM,IAAI,GAAV,MAAM,IAAI;IAIf,YAAY,MAAc,EAAE,OAA6B;QACvD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF,CAAA;AARY,oBAAI;eAAJ,IAAI;IADhB,IAAA,gBAAW,GAAE;;GACD,IAAI,CAQhB;AAGM,IAAe,aAAa,GAA5B,MAAe,aAAa;IAIjC,YAAY,KAAU,EAAE,UAAkB;QACxC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;CAGF,CAAA;AAVqB,sCAAa;wBAAb,aAAa;IADlC,IAAA,gBAAW,GAAE;;GACQ,aAAa,CAUlC;AAGM,IAAe,WAAW,GAA1B,MAAe,WAAY,SAAQ,aAAa;CAAI,CAAA;AAArC,kCAAW;sBAAX,WAAW;IADhC,IAAA,gBAAW,GAAE;GACQ,WAAW,CAA0B;AAGpD,IAAe,eAAe,GAA9B,MAAe,eAAgB,SAAQ,aAAa;CAAI,CAAA;AAAzC,0CAAe;0BAAf,eAAe;IADpC,IAAA,gBAAW,GAAE;GACQ,eAAe,CAA0B;AAGxD,IAAe,aAAa,GAA5B,MAAe,aAAc,SAAQ,cAAc;IAOxD,YAAsB,QAA+B;QACnD,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QADb,aAAQ,GAAR,QAAQ,CAAuB;QAInD,IAAI,CAAC,gBAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,YAAY,WAAI,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YAEjG,MAAM,mBAAmB,GAAG,IAAA,sCAAsB,EAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,mBAAoB,CAAC,MAAO,CAAC;YAC5C,MAAM,SAAS,GAAG,mBAAoB,CAAC,MAAO,CAAC,SAAS,CAAC;YAEzD,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,OAAO,CAAqB,oBAAoB,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YACrH,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAS,CAAC,CAAC;YACtD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAS,CAAC,CAAC;YAE7C,IAAG,QAAQ,CAAC,aAAa,EAAC,CAAC;gBACzB,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClD,CAAC;YAED,kEAAkE;YAClE,yEAAyE;YACzE,yEAAyE;YACzE,+DAA+D;YAC/D,IAAI,CAAC,QAAQ,CAAC,OAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;CAGF,CAAA;AAlCqB,sCAAa;wBAAb,aAAa;IADlC,IAAA,gBAAW,GAAE;;GACQ,aAAa,CAkClC;AAGM,IAAe,WAAW,GAA1B,MAAe,WAAY,SAAQ,cAAc;IAMtD,YAAY,MAAc,EAAE,GAAU,EAAE,GAAY,EAAE,OAAgC;QACpF,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;CAGF,CAAA;AAhBqB,kCAAW;sBAAX,WAAW;IADhC,IAAA,gBAAW,GAAE;;GACQ,WAAW,CAgBhC;AAGM,IAAe,oBAAoB,GAAnC,MAAe,oBAAqB,SAAQ,cAAc;IAE/D,YAAY,OAA2B,EAAE,UAAmB;QAC1D,KAAK,CAAC,UAAU,CAAC,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;CAGF,CAAA;AARqB,oDAAoB;+BAApB,oBAAoB;IADzC,IAAA,gBAAW,GAAE;;GACQ,oBAAoB,CAQzC;AAGM,IAAe,oBAAoB,GAAnC,MAAe,oBAAqB,SAAQ,oBAAoB;IAGrE,YAAY,OAA2B,EAAE,GAAY;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC;IAC3B,CAAC;CAGF,CAAA;AAVqB,oDAAoB;+BAApB,oBAAoB;IADzC,IAAA,gBAAW,GAAE;;GACQ,oBAAoB,CAUzC;AAGM,IAAe,cAAc,GAA7B,MAAe,cAAe,SAAQ,cAAc;IAKzD,YAAY,MAAc,EAAE,GAAU,EAAE,GAAY,EAAE,UAAkB;QACtE,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,EAAE,CAAC;IAC9B,CAAC;CAGF,CAAA;AAdqB,wCAAc;yBAAd,cAAc;IADnC,IAAA,gBAAW,GAAE;;GACQ,cAAc,CAcnC;AAEM,IAAe,eAAe,GAA9B,MAAe,eAAgB,SAAQ,cAAc;IAK1D,YAAY,MAAyB,EAAE,KAAa,EAAE,UAAkB,EAAE,UAAgD;QACxH,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,IAAW,UAAU,CAAC,KAAa;QACjC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAI,UAAU;QACZ,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,IAAK,IAAI,CAAC,OAAe,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC;IAC9D,CAAC;CAGF,CAAA;AA3CqB,0CAAe;0BAAf,eAAe;IADpC,IAAA,gBAAW,GAAE;;GACQ,eAAe,CA2CpC;AAED,MAAsB,kBAAmB,SAAQ,cAAc;IAC7D,YAAmB,QAAkB;QACnC,KAAK,EAAE,CAAC;QADS,aAAQ,GAAR,QAAQ,CAAU;IAErC,CAAC;CAGF;AAND,gDAMC;AAGM,IAAe,qBAAqB,GAApC,MAAe,qBAAsB,SAAQ,eAAe;IAGjE,YAAY,MAAyB,EAAE,MAAqB,EAAE,KAAa,EAAE,UAAkB;QAC7F,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;CAGF,CAAA;AATqB,sDAAqB;gCAArB,qBAAqB;IAD1C,IAAA,gBAAW,GAAE;;GACQ,qBAAqB,CAS1C"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { IIdentityMap } from './interfaces.js';
|
|
2
|
+
import type { ModelBase } from './model.js';
|
|
3
|
+
import { Subject, SubjectSet } from './subject.js';
|
|
4
|
+
/**
|
|
5
|
+
* Turns a mutated object graph into a `SubjectSet` — the complete, unordered description of
|
|
6
|
+
* what one `save()` must do.
|
|
7
|
+
*
|
|
8
|
+
* Traversal rules:
|
|
9
|
+
*
|
|
10
|
+
* - a `belongsTo` is followed whenever its `Value` is set, populated or not, because
|
|
11
|
+
* attaching a model to it is an explicit act;
|
|
12
|
+
* - a `hasMany` or `manyToMany` is followed **only when `Populated` is true**, so a relation
|
|
13
|
+
* the caller never loaded is invisible and `Items: OrderItem[] = []` on a freshly
|
|
14
|
+
* constructed model deletes nothing;
|
|
15
|
+
* - `Query` and `Virtual` relations are read-only projections and are never followed.
|
|
16
|
+
*/
|
|
17
|
+
export declare class SubjectBuilder {
|
|
18
|
+
protected identityMap: IIdentityMap;
|
|
19
|
+
private _visited;
|
|
20
|
+
constructor(identityMap: IIdentityMap);
|
|
21
|
+
build(root: ModelBase): SubjectSet;
|
|
22
|
+
/**
|
|
23
|
+
* Walks the graph breadth-first from `root`, canonicalizing every model through the
|
|
24
|
+
* identity map so a row reached by two paths yields one instance.
|
|
25
|
+
*
|
|
26
|
+
* @param root - the model `save()` was called on
|
|
27
|
+
*/
|
|
28
|
+
collect(root: ModelBase): ModelBase[];
|
|
29
|
+
/**
|
|
30
|
+
* Models directly reachable from `model` under the traversal rules.
|
|
31
|
+
*/
|
|
32
|
+
protected relatedOf(model: ModelBase): ModelBase[];
|
|
33
|
+
/**
|
|
34
|
+
* Diffs each collected model against its snapshot and records its `belongsTo` foreign keys.
|
|
35
|
+
* hasMany, manyToMany and orphan handling are layered on by later passes.
|
|
36
|
+
*
|
|
37
|
+
* @param models - output of `collect()`
|
|
38
|
+
*/
|
|
39
|
+
buildFrom(models: ModelBase[]): SubjectSet;
|
|
40
|
+
/**
|
|
41
|
+
* Records, for every `belongsTo` with a `Value`, that this subject's foreign-key column
|
|
42
|
+
* takes the target's primary key. The value is *not* read here — the target may not have
|
|
43
|
+
* been inserted yet; the executor resolves it immediately before the statement.
|
|
44
|
+
*/
|
|
45
|
+
protected buildBelongsTo(subject: Subject): void;
|
|
46
|
+
/**
|
|
47
|
+
* Diffs each populated `hasMany` on `subject` against the owner's relation snapshot and
|
|
48
|
+
* records the owner's foreign key as pending on every member that stays.
|
|
49
|
+
*
|
|
50
|
+
* A relation with `Populated === false` is skipped entirely — that is the anti-footgun
|
|
51
|
+
* guarantee, and it is why a freshly constructed model with `Items: OrderItem[] = []`
|
|
52
|
+
* deletes nothing.
|
|
53
|
+
*
|
|
54
|
+
* Both new *and* kept members get the pending foreign key. That is what makes re-parenting
|
|
55
|
+
* work: a clean child moved to another owner has its key rewritten and is promoted from a
|
|
56
|
+
* no-op to an UPDATE, instead of keeping its old owner id in the database ( B20 ).
|
|
57
|
+
*/
|
|
58
|
+
protected buildHasMany(subject: Subject, set: SubjectSet): void;
|
|
59
|
+
/**
|
|
60
|
+
* Diffs each populated `manyToMany` against the owner's relation snapshot into junction
|
|
61
|
+
* rows to create and destroy.
|
|
62
|
+
*
|
|
63
|
+
* Only the *junction* row is created or destroyed. A target that is new gets its own insert
|
|
64
|
+
* subject from `collect()` so its key exists before the junction row references it; a target
|
|
65
|
+
* that is merely unlinked is left completely alone — removing a tag from an order must
|
|
66
|
+
* never delete the tag.
|
|
67
|
+
*/
|
|
68
|
+
protected buildManyToMany(subject: Subject, set: SubjectSet): void;
|
|
69
|
+
/**
|
|
70
|
+
* Turns every `hasMany` removal recorded during the diff into an orphan action.
|
|
71
|
+
*
|
|
72
|
+
* Runs once over the whole set rather than per relation, because the decision needs global
|
|
73
|
+
* information: a child removed from one owner and pushed onto another is a re-parent, not
|
|
74
|
+
* an orphan, and only a set-wide view can tell the two apart. Every key that has a live
|
|
75
|
+
* subject of the same target model in this graph is therefore subtracted.
|
|
76
|
+
*/
|
|
77
|
+
protected buildOrphans(set: SubjectSet): void;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=subject-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject-builder.d.ts","sourceRoot":"","sources":["../../src/subject-builder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAA8B,MAAM,iBAAiB,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,OAAO,EAAgD,OAAO,EAAoB,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnH;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAc;IAGb,SAAS,CAAC,WAAW,EAAE,YAAY;IAF/C,OAAO,CAAC,QAAQ,CAAwB;gBAElB,WAAW,EAAE,YAAY;IAExC,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,UAAU;IAIzC;;;;;OAKG;IACI,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE;IA2B5C;;OAEG;IACH,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE;IAuClD;;;;;OAKG;IACI,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU;IA+BjD;;;;OAIG;IACH,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAgBhD;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI;IAkC/D;;;;;;;;OAQG;IACH,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI;IA0ClE;;;;;;;OAOG;IACH,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;CA0D9C"}
|