cry-db 2.4.19 → 2.4.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/README.md +299 -0
- package/dist/bic.d.mts +6 -0
- package/dist/bic.d.mts.map +1 -0
- package/dist/bic.mjs +48 -0
- package/dist/bic.mjs.map +1 -0
- package/dist/mongo.d.mts +48 -1
- package/dist/mongo.d.mts.map +1 -1
- package/dist/mongo.mjs +238 -5
- package/dist/mongo.mjs.map +1 -1
- package/dist/repo.d.mts +8 -0
- package/dist/repo.d.mts.map +1 -1
- package/dist/repo.mjs +24 -0
- package/dist/repo.mjs.map +1 -1
- package/dist/types.d.mts +10 -3
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
# cry-db
|
|
2
|
+
|
|
3
|
+
A MongoDB wrapper library providing a high-level API for database operations with built-in support for revisions, soft-delete, archiving, blocking, auditing, and real-time publish events.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Base Connection management, ObjectId utilities, timestamps
|
|
9
|
+
└─ Db Database selection, collection/index management
|
|
10
|
+
└─ Mongo Full CRUD, soft-delete, archive, block, audit, publish events
|
|
11
|
+
Repo Convenience wrapper around Mongo bound to a single collection
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
- **`Mongo`** — operates on explicit `(collection, query, ...)` arguments
|
|
15
|
+
- **`Repo<T>`** — wraps a `Mongo` instance with a fixed collection, so every call omits the collection parameter
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { Repo, Mongo } from 'cry-db';
|
|
21
|
+
|
|
22
|
+
// Repo — single-collection convenience class
|
|
23
|
+
const users = new Repo('users', 'mydb');
|
|
24
|
+
|
|
25
|
+
// Mongo — multi-collection class
|
|
26
|
+
const mongo = new Mongo('mydb');
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Connection uses `MONGO_URL` env var (default `mongodb://127.0.0.1:27017`) and `MONGO_DB` env var for the database name.
|
|
30
|
+
|
|
31
|
+
## Record Lifecycle
|
|
32
|
+
|
|
33
|
+
Documents in cry-db have three visibility states controlled by metadata flags. Each state is **opt-in** and **independent** — a record can be in any combination of states simultaneously.
|
|
34
|
+
|
|
35
|
+
| State | Flag | Opt-in | Filtered from queries | Reversible |
|
|
36
|
+
|-----------|------------|--------------------------|------------------------------|------------|
|
|
37
|
+
| Active | _(none)_ | — | No | — |
|
|
38
|
+
| Deleted | `_deleted` | `useSoftDelete(true)` | Yes, unless `returnDeleted` | No (use `hardDelete` to purge) |
|
|
39
|
+
| Archived | `_archived`| `useArchive(true)` | Yes, unless `returnArchived` | Yes (`unarchiveOne`) |
|
|
40
|
+
| Blocked | `_blocked` | — | **No** (always returned) | Yes (`unblockOne`) |
|
|
41
|
+
|
|
42
|
+
**Query filtering rules:**
|
|
43
|
+
|
|
44
|
+
- When **soft-delete** is enabled, all query methods (`find`, `findOne`, `findById`, `findByIds`, `count`, `findNewer`, `findNewerMany`, `findByIdsInManyCollections`) automatically add `{ _deleted: { $exists: false } }` to the query. Pass `{ returnDeleted: true }` in `QueryOpts` to override.
|
|
45
|
+
- When **archive** is enabled, the same query methods automatically add `{ _archived: { $exists: false } }`. Pass `{ returnArchived: true }` to override.
|
|
46
|
+
- Both filters apply independently. A record that is both deleted and archived is hidden by both filters — you need both `returnDeleted` and `returnArchived` to see it.
|
|
47
|
+
- `findAll` bypasses both filters entirely.
|
|
48
|
+
|
|
49
|
+
## CRUD Operations
|
|
50
|
+
|
|
51
|
+
### Insert
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
let user = await users.insert({ name: 'Alice', age: 30 });
|
|
55
|
+
// user._id, user._rev, user._ts are set automatically when revisions are enabled
|
|
56
|
+
|
|
57
|
+
let many = await users.insertMany([{ name: 'Bob' }, { name: 'Carol' }]);
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Query
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
await users.find({ age: { $gte: 25 } });
|
|
64
|
+
await users.find({ age: { $gte: 25 } }, { sort: { name: 1 }, limit: 10, skip: 0 });
|
|
65
|
+
await users.findOne({ name: 'Alice' });
|
|
66
|
+
await users.findById(id);
|
|
67
|
+
await users.findByIds([id1, id2]);
|
|
68
|
+
await users.findAll(query); // bypasses soft-delete/archive filters
|
|
69
|
+
await users.count({ age: { $gte: 25 } });
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Update
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
await users.updateOne({ name: 'Alice' }, { $set: { age: 31 } });
|
|
76
|
+
await users.update({ active: true }, { $inc: { loginCount: 1 } }); // updateMany
|
|
77
|
+
await users.save({ $set: { age: 31 } }, userId);
|
|
78
|
+
await users.upsert({ email: 'a@b.c' }, { $set: { name: 'Alice' } });
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Delete
|
|
82
|
+
|
|
83
|
+
```ts
|
|
84
|
+
await users.deleteOne({ name: 'Alice' }); // soft-delete when enabled, else hard delete
|
|
85
|
+
await users.delete({ inactive: true }); // bulk soft-delete / hard delete
|
|
86
|
+
await users.hardDeleteOne(id); // always physically removes
|
|
87
|
+
await users.hardDelete({}); // physically remove all matching
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Batch Sync
|
|
91
|
+
|
|
92
|
+
```ts
|
|
93
|
+
await users.upsertBatch({
|
|
94
|
+
upsert: [{ _id: id1, name: 'Alice' }, { _id: id2, name: 'Bob' }],
|
|
95
|
+
delete: [id3],
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Features
|
|
100
|
+
|
|
101
|
+
### Revisions
|
|
102
|
+
|
|
103
|
+
When enabled, every write increments `_rev` and updates the `_ts` (Timestamp) field.
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
users.useRevisions(true);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Soft Delete
|
|
110
|
+
|
|
111
|
+
When enabled, `deleteOne` / `delete` set `_deleted: Date` instead of physically removing the document. Query operations automatically exclude deleted records. Deleted records cannot be "undeleted" — use `hardDelete` to purge them permanently.
|
|
112
|
+
|
|
113
|
+
```ts
|
|
114
|
+
users.useSoftDelete(true);
|
|
115
|
+
|
|
116
|
+
await users.deleteOne({ name: 'Alice' }); // sets _deleted: Date, increments _rev
|
|
117
|
+
await users.delete({ inactive: true }); // bulk soft-delete
|
|
118
|
+
await users.find({}); // excludes deleted
|
|
119
|
+
await users.find({}, { returnDeleted: true }); // includes deleted
|
|
120
|
+
await users.hardDelete({ inactive: true }); // physically removes (bypasses soft-delete)
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Archive
|
|
124
|
+
|
|
125
|
+
When enabled, query operations automatically exclude records with `_archived` set. Unlike soft-delete, archiving is fully reversible.
|
|
126
|
+
|
|
127
|
+
```ts
|
|
128
|
+
users.useArchive(true);
|
|
129
|
+
|
|
130
|
+
// Archive by query
|
|
131
|
+
await users.archiveOne({ name: 'Alice' }); // sets _archived: Date, increments _rev
|
|
132
|
+
await users.unarchiveOne({ name: 'Alice' }); // removes _archived, increments _rev
|
|
133
|
+
|
|
134
|
+
// Archive by id
|
|
135
|
+
await users.archiveOneById(id); // archive single record by _id
|
|
136
|
+
await users.unarchiveOneById(id); // unarchive single record by _id
|
|
137
|
+
|
|
138
|
+
// Archive multiple by ids
|
|
139
|
+
await users.archiveManyByIds([id1, id2, id3]); // returns array of archived docs (skips already archived)
|
|
140
|
+
await users.unarchiveManyByIds([id1, id2, id3]); // returns array of unarchived docs (skips non-archived)
|
|
141
|
+
|
|
142
|
+
// Query behavior
|
|
143
|
+
await users.find({}); // excludes archived
|
|
144
|
+
await users.find({}, { returnArchived: true }); // includes archived
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Archive and soft-delete are independent — a record can be both archived and deleted. The `returnArchived` and `returnDeleted` options control each filter separately.
|
|
148
|
+
|
|
149
|
+
### Block
|
|
150
|
+
|
|
151
|
+
Block/unblock sets or removes the `_blocked` field. Blocked records are **not** filtered from queries (unlike deleted/archived).
|
|
152
|
+
|
|
153
|
+
```ts
|
|
154
|
+
await users.blockOne({ name: 'Alice' });
|
|
155
|
+
await users.unblockOne({ name: 'Alice' });
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Sequences
|
|
159
|
+
|
|
160
|
+
Auto-incrementing field values managed atomically via a dedicated `_sequences` collection. Use the special string directives `'SEQ_NEXT'` and `'SEQ_LAST'` as field values during insert.
|
|
161
|
+
|
|
162
|
+
| Directive | Behavior |
|
|
163
|
+
|-----------|----------|
|
|
164
|
+
| `'SEQ_NEXT'` | Increment the sequence counter and use the new value |
|
|
165
|
+
| `'SEQ_LAST'` | Use the current sequence value without incrementing |
|
|
166
|
+
|
|
167
|
+
```ts
|
|
168
|
+
// Single insert — orderNo gets the next sequence value
|
|
169
|
+
await users.insert({ name: 'Alice', orderNo: 'SEQ_NEXT' });
|
|
170
|
+
// => { name: 'Alice', orderNo: 1, _id: ... }
|
|
171
|
+
|
|
172
|
+
await users.insert({ name: 'Bob', orderNo: 'SEQ_NEXT' });
|
|
173
|
+
// => { name: 'Bob', orderNo: 2, _id: ... }
|
|
174
|
+
|
|
175
|
+
// SEQ_LAST returns the current value (no increment)
|
|
176
|
+
await users.insert({ name: 'Carol', orderNo: 'SEQ_LAST' });
|
|
177
|
+
// => { name: 'Carol', orderNo: 2, _id: ... }
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Sequences are per-collection per-field. On first use, the sequence auto-seeds from the maximum existing value in the collection. If the collection is emptied, the sequence resets to 0.
|
|
181
|
+
|
|
182
|
+
**Batch inserts** are optimized — a range of sequence numbers is reserved atomically in a single operation, then distributed across the batch:
|
|
183
|
+
|
|
184
|
+
```ts
|
|
185
|
+
await users.insertMany([
|
|
186
|
+
{ name: 'A', orderNo: 'SEQ_NEXT' }, // orderNo: 3
|
|
187
|
+
{ name: 'B', orderNo: 'SEQ_LAST' }, // orderNo: 3 (current value after A)
|
|
188
|
+
{ name: 'C', orderNo: 'SEQ_NEXT' }, // orderNo: 4
|
|
189
|
+
]);
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Multiple fields can use independent sequences in the same document:
|
|
193
|
+
|
|
194
|
+
```ts
|
|
195
|
+
await users.insert({ invoiceNo: 'SEQ_NEXT', lineNo: 'SEQ_NEXT' });
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
To reset a collection's sync sequence:
|
|
199
|
+
|
|
200
|
+
```ts
|
|
201
|
+
await users.resetCollectionSync();
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Auditing
|
|
205
|
+
|
|
206
|
+
Records changes to a separate audit log collection.
|
|
207
|
+
|
|
208
|
+
```ts
|
|
209
|
+
users.useAuditing(true);
|
|
210
|
+
users.auditToCollection('dblog');
|
|
211
|
+
users.auditCollection(); // enable auditing for this repo's collection
|
|
212
|
+
|
|
213
|
+
await users.dbLogGet(entityId); // retrieve audit log for an entity
|
|
214
|
+
await users.dbLogPurge(entityId); // purge audit log
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Publish Events
|
|
218
|
+
|
|
219
|
+
Real-time events emitted on insert/update/delete for data synchronization.
|
|
220
|
+
|
|
221
|
+
```ts
|
|
222
|
+
users.emitPublishEvents(true); // full document payloads
|
|
223
|
+
users.emitPublishRevEvents(true); // lightweight revision-only payloads
|
|
224
|
+
|
|
225
|
+
users.on('publish', (channel, data) => { /* ... */ });
|
|
226
|
+
users.on('publishRev', (channel, data) => { /* ... */ });
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Transactions
|
|
230
|
+
|
|
231
|
+
```ts
|
|
232
|
+
await users.startTransaction();
|
|
233
|
+
// ... operations ...
|
|
234
|
+
await users.commitTransaction();
|
|
235
|
+
// or
|
|
236
|
+
await users.abortTransaction();
|
|
237
|
+
|
|
238
|
+
// or callback style:
|
|
239
|
+
await users.withTransaction(async (client, session) => {
|
|
240
|
+
// ... operations ...
|
|
241
|
+
});
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## Entity Metadata
|
|
245
|
+
|
|
246
|
+
Every document can have these system fields (managed automatically when the respective feature is enabled):
|
|
247
|
+
|
|
248
|
+
| Field | Type | Description |
|
|
249
|
+
|------------|-----------|-----------------------------------------------|
|
|
250
|
+
| `_id` | ObjectId | Document identifier |
|
|
251
|
+
| `_rev` | number | Revision counter (incremented on each write) |
|
|
252
|
+
| `_ts` | Timestamp | Server timestamp (set on each write) |
|
|
253
|
+
| `_deleted` | Date | Soft-delete timestamp |
|
|
254
|
+
| `_archived`| Date | Archive timestamp |
|
|
255
|
+
| `_blocked` | Date | Block timestamp |
|
|
256
|
+
|
|
257
|
+
## QueryOpts
|
|
258
|
+
|
|
259
|
+
Options passed to query methods:
|
|
260
|
+
|
|
261
|
+
| Option | Type | Description |
|
|
262
|
+
|-------------------|----------------------|----------------------------------------------|
|
|
263
|
+
| `project` | Projection | Fields to include/exclude |
|
|
264
|
+
| `sort` | Record<string, 1\|-1> | Sort specification |
|
|
265
|
+
| `limit` | number | Max documents to return |
|
|
266
|
+
| `skip` | number | Documents to skip |
|
|
267
|
+
| `collation` | CollationOptions | MongoDB collation options |
|
|
268
|
+
| `readPreference` | ReadPreference | Read preference |
|
|
269
|
+
| `returnDeleted` | boolean | Include soft-deleted records |
|
|
270
|
+
| `returnArchived` | boolean | Include archived records |
|
|
271
|
+
|
|
272
|
+
## Additional Methods
|
|
273
|
+
|
|
274
|
+
```ts
|
|
275
|
+
users.distinct<string>('status'); // distinct field values (sorted)
|
|
276
|
+
users.findNewer(timestamp, query, opts); // find records newer than timestamp
|
|
277
|
+
mongo.findNewerMany([{ collection, timestamp }]); // batch findNewer across collections
|
|
278
|
+
mongo.findByIdsInManyCollections([{ collection, ids }]); // batch findByIds across collections
|
|
279
|
+
users.isUnique('email', 'a@b.c', excludeId); // uniqueness check
|
|
280
|
+
users.aggregate(pipeline); // aggregation pipeline
|
|
281
|
+
users.createIndex('name_1', { name: 1 }); // create index
|
|
282
|
+
users.indexes(); // list indexes
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
## Environment Variables
|
|
286
|
+
|
|
287
|
+
| Variable | Default | Description |
|
|
288
|
+
|----------|---------|-------------|
|
|
289
|
+
| `MONGO_URL` | `mongodb://127.0.0.1:27017` | MongoDB connection URL |
|
|
290
|
+
| `MONGO_DB` | — | Default database name |
|
|
291
|
+
| `AUDIT_COLLECTIONS` | — | Comma-separated list of collections to audit |
|
|
292
|
+
|
|
293
|
+
## Testing
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
npm test
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Requires a running MongoDB instance on localhost.
|
package/dist/bic.d.mts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bic.d.mts","sourceRoot":"","sources":["../src/bic.mts"],"names":[],"mappings":"AA2BA;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAe3C"}
|
package/dist/bic.mjs
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Mapping based on Banka Slovenije list of BIC codes and national identification codes (updated 13 Oct 2025).
|
|
2
|
+
// Source: https://www.bsi.si/sl/placilni-sistemi/placilni-in-transakcijski-racun
|
|
3
|
+
const BIC_BY_2DIGIT = {
|
|
4
|
+
"01": "BSLJSI2X", // Banka Slovenije
|
|
5
|
+
"02": "LJBASI2X", // NLB
|
|
6
|
+
"04": "KBMASI2X", // OTP Banka
|
|
7
|
+
"07": "GORESI2X", // Gorenjska banka
|
|
8
|
+
"10": "BAKOSI2X", // Banka Intesa Sanpaolo
|
|
9
|
+
"19": "SZKBSI2X", // Deželna banka Slovenije
|
|
10
|
+
"29": "BACXSI22", // UniCredit Banka Slovenije
|
|
11
|
+
"30": "LJBASI2X", // NLB (prevzeta oznaka)
|
|
12
|
+
"33": "HAABSI22", // Addiko Bank
|
|
13
|
+
"34": "KSPKSI22", // Banka Sparkasse
|
|
14
|
+
"35": "BFKKSI22", // BKS Banka AG, bančna podružnica
|
|
15
|
+
"38": "SIDRSI22", // SID banka
|
|
16
|
+
"60": "HLONSI22", // Hranilnica LON
|
|
17
|
+
"61": "HDELSI22", // Delavska hranilnica
|
|
18
|
+
"64": "HKVISI22", // Primorska hranilnica Vipava
|
|
19
|
+
"79": "KDDSSI22", // KDD
|
|
20
|
+
};
|
|
21
|
+
const BIC_BY_5DIGIT = {
|
|
22
|
+
"91001": "", // Petrol Pay (BIC not published on the list)
|
|
23
|
+
"91002": "PWSRSI22" // Paywiser
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Returns BIC for a Slovenian IBAN (TRR).
|
|
27
|
+
* If the BIC is unknown, returns an empty string.
|
|
28
|
+
*/
|
|
29
|
+
export function bic4trr(trr) {
|
|
30
|
+
var _a;
|
|
31
|
+
if (!trr)
|
|
32
|
+
return "";
|
|
33
|
+
const iban = trr.replace(/[^A-Za-z0-9]/g, "").toUpperCase();
|
|
34
|
+
if (!iban.startsWith("SI"))
|
|
35
|
+
return "";
|
|
36
|
+
if (iban.length < 9)
|
|
37
|
+
return "";
|
|
38
|
+
// For SI IBAN: positions 5-9 (0-based 4..8) are the national identification code (2 + 3 digits).
|
|
39
|
+
const national5 = iban.slice(4, 9);
|
|
40
|
+
if (!/^\d{5}$/.test(national5))
|
|
41
|
+
return "";
|
|
42
|
+
const bic5 = BIC_BY_5DIGIT[national5];
|
|
43
|
+
if (bic5 !== undefined)
|
|
44
|
+
return bic5;
|
|
45
|
+
const code2 = national5.slice(0, 2);
|
|
46
|
+
return (_a = BIC_BY_2DIGIT[code2]) !== null && _a !== void 0 ? _a : "";
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=bic.mjs.map
|
package/dist/bic.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bic.mjs","sourceRoot":"","sources":["../src/bic.mts"],"names":[],"mappings":"AAAA,8GAA8G;AAC9G,iFAAiF;AAEjF,MAAM,aAAa,GAA2B;IAC1C,IAAI,EAAE,UAAU,EAAE,kBAAkB;IACpC,IAAI,EAAE,UAAU,EAAE,MAAM;IACxB,IAAI,EAAE,UAAU,EAAE,YAAY;IAC9B,IAAI,EAAE,UAAU,EAAE,kBAAkB;IACpC,IAAI,EAAE,UAAU,EAAE,wBAAwB;IAC1C,IAAI,EAAE,UAAU,EAAE,0BAA0B;IAC5C,IAAI,EAAE,UAAU,EAAE,4BAA4B;IAC9C,IAAI,EAAE,UAAU,EAAE,wBAAwB;IAC1C,IAAI,EAAE,UAAU,EAAE,cAAc;IAChC,IAAI,EAAE,UAAU,EAAE,kBAAkB;IACpC,IAAI,EAAE,UAAU,EAAE,kCAAkC;IACpD,IAAI,EAAE,UAAU,EAAE,YAAY;IAC9B,IAAI,EAAE,UAAU,EAAE,iBAAiB;IACnC,IAAI,EAAE,UAAU,EAAE,sBAAsB;IACxC,IAAI,EAAE,UAAU,EAAE,8BAA8B;IAChD,IAAI,EAAE,UAAU,EAAE,MAAM;CAC3B,CAAC;AAEF,MAAM,aAAa,GAA2B;IAC1C,OAAO,EAAE,EAAE,EAAS,6CAA6C;IACjE,OAAO,EAAE,UAAU,CAAC,WAAW;CAClC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW;;IAC/B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAE/B,iGAAiG;IACjG,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1C,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,OAAO,MAAA,aAAa,CAAC,KAAK,CAAC,mCAAI,EAAE,CAAC;AACtC,CAAC"}
|
package/dist/mongo.d.mts
CHANGED
|
@@ -7,6 +7,7 @@ type DebugObject = {
|
|
|
7
7
|
export declare class Mongo extends Db {
|
|
8
8
|
private revisions;
|
|
9
9
|
private softdelete;
|
|
10
|
+
private softarchive;
|
|
10
11
|
private session;
|
|
11
12
|
private emittingPublishEvents;
|
|
12
13
|
private emittingPublishRevEvents;
|
|
@@ -29,6 +30,13 @@ export declare class Mongo extends Db {
|
|
|
29
30
|
usesRevisions(): boolean;
|
|
30
31
|
useSoftDelete(enabled: boolean): boolean;
|
|
31
32
|
usesSoftDelete(): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Enable or disable archive filtering.
|
|
35
|
+
* When enabled, query operations exclude records with `_archived` set,
|
|
36
|
+
* unless `returnArchived: true` is passed in opts.
|
|
37
|
+
*/
|
|
38
|
+
useArchive(enabled: boolean): boolean;
|
|
39
|
+
usesArchive(): boolean;
|
|
32
40
|
useAuditing(enabled: boolean): boolean;
|
|
33
41
|
usesAuditing(): boolean;
|
|
34
42
|
useSync(enabled: boolean): boolean;
|
|
@@ -50,7 +58,18 @@ export declare class Mongo extends Db {
|
|
|
50
58
|
find<T>(collection: string, query?: QuerySpec<T>, opts?: QueryOpts): Promise<T[]>;
|
|
51
59
|
findAll<T>(collection: string, query?: QuerySpec<T>, opts?: QueryOpts): Promise<T[]>;
|
|
52
60
|
findNewer<T>(collection: string, timestamp: Timestamp | number | string | Date, query?: QuerySpec<T>, opts?: QueryOpts): Promise<T[]>;
|
|
53
|
-
findNewerMany<T>(spec?: GetNewerSpec<T>[]): Promise<Record<string, any[]>>;
|
|
61
|
+
findNewerMany<T>(spec?: GetNewerSpec<T>[], defaultOpts?: QueryOpts): Promise<Record<string, any[]>>;
|
|
62
|
+
/**
|
|
63
|
+
* Streaming variant of findNewerMany.
|
|
64
|
+
* Instead of collecting all results into memory, iterates each collection's
|
|
65
|
+
* cursor and calls onChunk for each batch of documents.
|
|
66
|
+
*
|
|
67
|
+
* @param spec - Array of collection specs with timestamps and queries
|
|
68
|
+
* @param onChunk - Callback called for each batch of documents. Receives collection name and array of documents.
|
|
69
|
+
* @param chunkSize - Number of documents per chunk (default 200)
|
|
70
|
+
* @param defaultOpts - Default query options applied to all collections
|
|
71
|
+
*/
|
|
72
|
+
findNewerManyStream<T>(spec: GetNewerSpec<T>[] | undefined, onChunk: (collection: string, items: any[]) => Promise<void>, chunkSize?: number, defaultOpts?: QueryOpts): Promise<void>;
|
|
54
73
|
latestTimestamps(collections: string[]): Promise<Record<string, Timestamp>>;
|
|
55
74
|
latestTimestamp(collection: string): Promise<Timestamp | undefined>;
|
|
56
75
|
private _createQueryForNewer;
|
|
@@ -84,6 +103,34 @@ export declare class Mongo extends Db {
|
|
|
84
103
|
deleteOne<T>(collection: string, query: QuerySpec<T>): Promise<T>;
|
|
85
104
|
blockOne<T>(collection: string, query: QuerySpec<T>): Promise<T>;
|
|
86
105
|
unblockOne<T>(collection: string, query: QuerySpec<T>): Promise<T>;
|
|
106
|
+
/**
|
|
107
|
+
* Archives a single document by setting `_archived` to the current date.
|
|
108
|
+
* Increments `_rev` and updates `_ts`.
|
|
109
|
+
*/
|
|
110
|
+
archiveOne<T>(collection: string, query: QuerySpec<T>): Promise<T>;
|
|
111
|
+
/**
|
|
112
|
+
* Unarchives a single document by removing the `_archived` field.
|
|
113
|
+
* Increments `_rev` and updates `_ts`.
|
|
114
|
+
*/
|
|
115
|
+
unarchiveOne<T>(collection: string, query: QuerySpec<T>): Promise<T>;
|
|
116
|
+
/**
|
|
117
|
+
* Archives a single document found by its `_id`.
|
|
118
|
+
*/
|
|
119
|
+
archiveOneById<T>(collection: string, id: Id): Promise<T>;
|
|
120
|
+
/**
|
|
121
|
+
* Archives multiple documents found by their `_id`s.
|
|
122
|
+
* Returns the array of archived documents.
|
|
123
|
+
*/
|
|
124
|
+
archiveManyByIds<T>(collection: string, ids: Id[]): Promise<T[]>;
|
|
125
|
+
/**
|
|
126
|
+
* Unarchives a single document found by its `_id`.
|
|
127
|
+
*/
|
|
128
|
+
unarchiveOneById<T>(collection: string, id: Id): Promise<T>;
|
|
129
|
+
/**
|
|
130
|
+
* Unarchives multiple documents found by their `_id`s.
|
|
131
|
+
* Returns the array of unarchived documents.
|
|
132
|
+
*/
|
|
133
|
+
unarchiveManyByIds<T>(collection: string, ids: Id[]): Promise<T[]>;
|
|
87
134
|
hardDeleteOne<T>(collection: string, query: Id | QuerySpec<T>): Promise<T>;
|
|
88
135
|
delete<T>(collection: string, query: QuerySpec<T>): Promise<{
|
|
89
136
|
ok: boolean;
|
package/dist/mongo.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongo.d.mts","sourceRoot":"","sources":["../src/mongo.mts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAwB,gBAAgB,EAAE,aAAa,EAAiB,eAAe,EAA2B,WAAW,EAAyC,SAAS,EAA6B,MAAM,SAAS,CAAC;AAE/O,OAAO,EAAE,EAAE,EAAO,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,uBAAuB,EAAE,sBAAsB,EAAqC,MAAM,EAA8B,YAAY,EAAE,EAAE,EAAE,UAAU,EAAe,UAAU,EAAkB,kBAAkB,EAAO,UAAU,EAAuR,SAAS,EAAE,SAAS,EAAwB,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA6DrnB,KAAK,WAAW,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAO5D,qBAAa,KAAM,SAAQ,EAAE;IACzB,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,qBAAqB,CAAU;IACvC,OAAO,CAAC,wBAAwB,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,kBAAkB,CAAW;IACrC,OAAO,CAAC,uBAAuB,CAAW;IAC1C,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,sBAAsB,CAAU;gBAE5B,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"mongo.d.mts","sourceRoot":"","sources":["../src/mongo.mts"],"names":[],"mappings":"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"}
|