@lossless.org/client 1.18.1 → 1.18.3
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_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/nosqldb/classes.bsonassertion.d.ts +6 -2
- package/dist_ts/nosqldb/classes.bsonassertion.js +9 -7
- package/dist_ts/nosqldb/classes.collection.js +25 -6
- package/dist_ts/nosqldb/classes.exactpersistence.d.ts +41 -5
- package/dist_ts/nosqldb/classes.exactpersistence.js +133 -90
- package/dist_ts/nosqldb/classes.ordinarypersistence.js +2 -2
- package/package.json +4 -4
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/nosqldb/classes.bsonassertion.ts +9 -6
- package/ts/nosqldb/classes.collection.ts +48 -15
- package/ts/nosqldb/classes.exactpersistence.ts +183 -144
- package/ts/nosqldb/classes.ordinarypersistence.ts +2 -1
|
@@ -76,8 +76,8 @@ export const validateOrdinaryStoredDocument = (documentArg, policyArg, persisted
|
|
|
76
76
|
if (policyArg.timestamps === 'managed' &&
|
|
77
77
|
(typeof clone._createdAt !== 'string' || typeof clone._updatedAt !== 'string'))
|
|
78
78
|
throw invalid();
|
|
79
|
-
assertBsonWithoutMutation(clone, policyArg.assertStoredDocument, invalid);
|
|
79
|
+
assertBsonWithoutMutation(clone, plugins.mongodb.BSON.serialize(clone), (documentArg) => plugins.mongodb.BSON.serialize(documentArg), policyArg.assertStoredDocument, invalid);
|
|
80
80
|
// The assertion must not retain authority to mutate the returned document.
|
|
81
81
|
return plugins.mongodb.BSON.deserialize(plugins.mongodb.BSON.serialize(clone));
|
|
82
82
|
};
|
|
83
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vcmRpbmFyeXBlcnNpc3RlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbm9zcWxkYi9jbGFzc2VzLm9yZGluYXJ5cGVyc2lzdGVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFpQnZFLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsaURBQWlELENBQUMsQ0FBQztBQUNuRixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7QUFFL0U7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsUUFBYSxFQUFXLEVBQUUsQ0FDbEUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFFbkM7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsQ0FBQyxPQUFlLEVBQUUsUUFBZ0IsRUFBVyxFQUFFLENBQzVGLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQztJQUMxRSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsS0FBSyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUUzRSxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLFFBQWEsRUFBMEMsRUFBRTtJQUNwRyxNQUFNLE1BQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQTJDLENBQUM7SUFDbEYsSUFBSSxNQUFNLElB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lossless.org/client",
|
|
3
|
-
"version": "1.18.
|
|
3
|
+
"version": "1.18.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "One typed client for NoSQLDB, MongoDB, SQLDB, MariaDB, ClickHouse and S3 object storage.",
|
|
6
6
|
"exports": {
|
|
@@ -81,15 +81,15 @@
|
|
|
81
81
|
"@aws-sdk/client-s3": "^3.1039.0",
|
|
82
82
|
"@clickhouse/client": "1.23.1",
|
|
83
83
|
"@git.zone/tsbuild": "5.1.2",
|
|
84
|
-
"@git.zone/tsbundle": "3.1.
|
|
84
|
+
"@git.zone/tsbundle": "3.1.3",
|
|
85
85
|
"@git.zone/tsrun": "3.0.2",
|
|
86
|
-
"@git.zone/tstest": "
|
|
86
|
+
"@git.zone/tstest": "7.1.0",
|
|
87
87
|
"@lossless.org/nosqldb": "8.0.2",
|
|
88
88
|
"@lossless.org/nosqldb-qualified": "npm:@lossless.org/nosqldb@10.7.2",
|
|
89
89
|
"@lossless.org/objectstorage": "10.3.1",
|
|
90
90
|
"@lossless.org/sqldb": "0.2.3",
|
|
91
91
|
"@push.rocks/qenv": "^6.1.3",
|
|
92
|
-
"@types/node": "26.6.
|
|
92
|
+
"@types/node": "26.6.3",
|
|
93
93
|
"mariadb": "3.5.4",
|
|
94
94
|
"mongodb-memory-server": "11.1.0"
|
|
95
95
|
},
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @internal Shared ordinary/exact assertion invariant. `beforeArg` is the
|
|
3
|
+
* document's BSON encoding before the assertion runs; `encodeArg` encodes it
|
|
4
|
+
* again afterwards, and any difference is a mutation.
|
|
5
|
+
*/
|
|
4
6
|
export const assertBsonWithoutMutation = (
|
|
5
7
|
documentArg: object,
|
|
8
|
+
beforeArg: Uint8Array,
|
|
9
|
+
encodeArg: (documentArg: object) => Uint8Array,
|
|
6
10
|
assertionArg: (valueArg: unknown) => void,
|
|
7
11
|
errorArg: (reasonArg: 'assertion' | 'bson' | 'mutation', causeArg?: unknown) => Error,
|
|
8
12
|
): void => {
|
|
9
|
-
const before = plugins.mongodb.BSON.serialize(documentArg);
|
|
10
13
|
try {
|
|
11
14
|
const result = assertionArg(documentArg) as unknown;
|
|
12
15
|
if (result !== undefined) {
|
|
@@ -17,9 +20,9 @@ export const assertBsonWithoutMutation = (
|
|
|
17
20
|
}
|
|
18
21
|
} catch (causeArg) { throw errorArg('assertion', causeArg); }
|
|
19
22
|
let after: Uint8Array;
|
|
20
|
-
try { after =
|
|
23
|
+
try { after = encodeArg(documentArg); }
|
|
21
24
|
catch (causeArg) { throw errorArg('bson', causeArg); }
|
|
22
|
-
if (
|
|
25
|
+
if (Buffer.compare(beforeArg, after) !== 0) {
|
|
23
26
|
throw errorArg('mutation');
|
|
24
27
|
}
|
|
25
28
|
};
|
|
@@ -1231,6 +1231,35 @@ const managerFollowsReceiverSymbol = Symbol(
|
|
|
1231
1231
|
'@lossless.org/client.nosqldb.managerFollowsReceiver',
|
|
1232
1232
|
);
|
|
1233
1233
|
|
|
1234
|
+
/**
|
|
1235
|
+
* Resolves a decorated model's schema once instead of on every `collection`
|
|
1236
|
+
* access. The schema is derived from decorator metadata, which is complete once
|
|
1237
|
+
* the class is defined, and from the model's persistence policies. A policy can
|
|
1238
|
+
* still be installed after the binding decorator ran, by a decorator listed
|
|
1239
|
+
* above it or applied later, and an installed policy is permanent, so the
|
|
1240
|
+
* schema is computed again only when a policy appeared since it was computed.
|
|
1241
|
+
* A failed computation is not kept and fails again on the next access.
|
|
1242
|
+
*/
|
|
1243
|
+
const createDecoratedSchemaResolver = (
|
|
1244
|
+
constructorArg: object,
|
|
1245
|
+
computeSchemaArg: () => INormalizedCollectionModelSchema,
|
|
1246
|
+
): (() => INormalizedCollectionModelSchema) => {
|
|
1247
|
+
let resolved:
|
|
1248
|
+
| { readonly schema: INormalizedCollectionModelSchema; readonly exact: boolean }
|
|
1249
|
+
| undefined;
|
|
1250
|
+
return () => {
|
|
1251
|
+
const exact = hasExactPersistencePolicy(constructorArg);
|
|
1252
|
+
if (
|
|
1253
|
+
resolved === undefined ||
|
|
1254
|
+
resolved.exact !== exact ||
|
|
1255
|
+
resolved.schema.ordinaryPersistence !== getOrdinaryPersistencePolicy(constructorArg)
|
|
1256
|
+
) {
|
|
1257
|
+
resolved = { schema: computeSchemaArg(), exact };
|
|
1258
|
+
}
|
|
1259
|
+
return resolved.schema;
|
|
1260
|
+
};
|
|
1261
|
+
};
|
|
1262
|
+
|
|
1234
1263
|
const installCollectionBinding = <
|
|
1235
1264
|
TModel extends SmartDataDbDoc<any, any>,
|
|
1236
1265
|
>(
|
|
@@ -1622,20 +1651,23 @@ export function Collection(
|
|
|
1622
1651
|
return installCollectionBinding(
|
|
1623
1652
|
constructor as TCollectionModelConstructor<any>,
|
|
1624
1653
|
() => (dbArg instanceof SmartdataDb ? dbArg : dbArg()),
|
|
1625
|
-
(
|
|
1626
|
-
|
|
1627
|
-
|
|
1654
|
+
createDecoratedSchemaResolver(
|
|
1655
|
+
constructor,
|
|
1656
|
+
() => {
|
|
1657
|
+
if (identityAsDocumentId !== undefined) {
|
|
1658
|
+
assertIdentityDocumentIdIsOrdinary(
|
|
1659
|
+
constructor as TCollectionModelConstructor<any>,
|
|
1660
|
+
identityAsDocumentId,
|
|
1661
|
+
);
|
|
1662
|
+
}
|
|
1663
|
+
return schemaFromDecoratorMetadata(
|
|
1628
1664
|
constructor as TCollectionModelConstructor<any>,
|
|
1665
|
+
collectionName,
|
|
1629
1666
|
identityAsDocumentId,
|
|
1667
|
+
optionsArg?.toleratedIndexNames,
|
|
1630
1668
|
);
|
|
1631
|
-
}
|
|
1632
|
-
|
|
1633
|
-
constructor as TCollectionModelConstructor<any>,
|
|
1634
|
-
collectionName,
|
|
1635
|
-
identityAsDocumentId,
|
|
1636
|
-
optionsArg?.toleratedIndexNames,
|
|
1637
|
-
);
|
|
1638
|
-
},
|
|
1669
|
+
},
|
|
1670
|
+
),
|
|
1639
1671
|
) as any;
|
|
1640
1672
|
};
|
|
1641
1673
|
}
|
|
@@ -1755,14 +1787,15 @@ export function managed<TManager extends IManager>(
|
|
|
1755
1787
|
installCollectionBinding(
|
|
1756
1788
|
constructor as TCollectionModelConstructor<any>,
|
|
1757
1789
|
(receiverArg) => getManager(receiverArg).db,
|
|
1758
|
-
(
|
|
1759
|
-
|
|
1790
|
+
createDecoratedSchemaResolver(
|
|
1791
|
+
constructor,
|
|
1792
|
+
() => schemaFromDecoratorMetadata(
|
|
1760
1793
|
constructor as TCollectionModelConstructor<any>,
|
|
1761
1794
|
collectionName,
|
|
1762
1795
|
undefined,
|
|
1763
1796
|
bindingOptions?.toleratedIndexNames,
|
|
1764
|
-
)
|
|
1765
|
-
|
|
1797
|
+
),
|
|
1798
|
+
),
|
|
1766
1799
|
!managerArg,
|
|
1767
1800
|
);
|
|
1768
1801
|
Object.defineProperty(constructor, 'manager', {
|