typeferry 0.12.0 → 0.13.0
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 +5 -0
- package/dist/application/config.d.ts +47 -39
- package/dist/application/config.js +29 -16
- package/dist/application/config.js.map +1 -1
- package/dist/application/native-simulator-settings.js +1 -1
- package/dist/application/native-simulator-settings.js.map +1 -1
- package/dist/application/proxy.d.ts +5 -1
- package/dist/application/proxy.js +25 -4
- package/dist/application/proxy.js.map +1 -1
- package/dist/application/run-tests.js +1 -1
- package/dist/application/run-tests.js.map +1 -1
- package/dist/auth/client/native-session.js +4 -2
- package/dist/auth/client/native-session.js.map +1 -1
- package/dist/auth/client/oauth/use-google-login.js +2 -0
- package/dist/auth/client/oauth/use-google-login.js.map +1 -1
- package/dist/auth/server/cookie-utils.js +4 -3
- package/dist/auth/server/cookie-utils.js.map +1 -1
- package/dist/auth/server/device-info.js +8 -8
- package/dist/auth/server/device-info.js.map +1 -1
- package/dist/auth/server/oauth/google.js +11 -7
- package/dist/auth/server/oauth/google.js.map +1 -1
- package/dist/auth/server/session-manager.js +2 -2
- package/dist/auth/server/session-manager.js.map +1 -1
- package/dist/client/client-channel.d.ts +3 -11
- package/dist/client/client-channel.js +11 -4
- package/dist/client/client-channel.js.map +1 -1
- package/dist/client/client-http.d.ts +2 -2
- package/dist/client/client-http.js.map +1 -1
- package/dist/client/client.d.ts +13 -13
- package/dist/client/client.js +24 -11
- package/dist/client/client.js.map +1 -1
- package/dist/client/context-manager.d.ts +1 -1
- package/dist/client/logger.d.ts +1 -0
- package/dist/client/logger.js +12 -15
- package/dist/client/logger.js.map +1 -1
- package/dist/ejson/adjust-types-from-json-value.d.ts +1 -1
- package/dist/ejson/adjust-types-from-json-value.js +4 -2
- package/dist/ejson/adjust-types-from-json-value.js.map +1 -1
- package/dist/ejson/base64.d.ts +1 -1
- package/dist/ejson/base64.js +1 -1
- package/dist/ejson/base64.js.map +1 -1
- package/dist/ejson/built-in-converters.d.ts +59 -1
- package/dist/ejson/built-in-converters.js +109 -125
- package/dist/ejson/built-in-converters.js.map +1 -1
- package/dist/ejson/clone.js +1 -1
- package/dist/ejson/clone.js.map +1 -1
- package/dist/ejson/custom-models.d.ts +10 -10
- package/dist/ejson/custom-models.js +22 -2
- package/dist/ejson/custom-models.js.map +1 -1
- package/dist/ejson/custom-types.d.ts +2 -1
- package/dist/ejson/custom-types.js.map +1 -1
- package/dist/ejson/equals.d.ts +4 -1
- package/dist/ejson/equals.js +6 -3
- package/dist/ejson/equals.js.map +1 -1
- package/dist/ejson/from-json-value.d.ts +1 -1
- package/dist/ejson/from-json-value.js +1 -1
- package/dist/ejson/from-json-value.js.map +1 -1
- package/dist/ejson/helpers/adjust-types-to-json-value.d.ts +1 -1
- package/dist/ejson/helpers/adjust-types-to-json-value.js +4 -2
- package/dist/ejson/helpers/adjust-types-to-json-value.js.map +1 -1
- package/dist/ejson/helpers/from-json-value-helper.d.ts +1 -1
- package/dist/ejson/helpers/from-json-value-helper.js +5 -3
- package/dist/ejson/helpers/from-json-value-helper.js.map +1 -1
- package/dist/ejson/helpers/to-json-value-helper.d.ts +1 -1
- package/dist/ejson/helpers/to-json-value-helper.js +3 -1
- package/dist/ejson/helpers/to-json-value-helper.js.map +1 -1
- package/dist/ejson/index.d.ts +14 -12
- package/dist/ejson/index.js +3 -3
- package/dist/ejson/index.js.map +1 -1
- package/dist/ejson/is-binary.d.ts +1 -1
- package/dist/ejson/is-binary.js +1 -1
- package/dist/ejson/is-binary.js.map +1 -1
- package/dist/ejson/parse.d.ts +1 -1
- package/dist/ejson/parse.js +1 -1
- package/dist/ejson/parse.js.map +1 -1
- package/dist/ejson/stable-stringify.d.ts +1 -6
- package/dist/ejson/stable-stringify.js +3 -1
- package/dist/ejson/stable-stringify.js.map +1 -1
- package/dist/ejson/to-json-value.d.ts +1 -1
- package/dist/ejson/to-json-value.js +1 -1
- package/dist/ejson/to-json-value.js.map +1 -1
- package/dist/ejson/utils.d.ts +15 -13
- package/dist/ejson/utils.js +39 -37
- package/dist/ejson/utils.js.map +1 -1
- package/dist/minimongo/NOTICE.md +30 -0
- package/dist/minimongo/README.md +329 -0
- package/dist/minimongo/components.d.ts +31 -0
- package/dist/minimongo/components.js +53 -0
- package/dist/minimongo/components.js.map +1 -0
- package/dist/minimongo/contracts.type-test.d.ts +1 -0
- package/dist/minimongo/contracts.type-test.js +21 -0
- package/dist/minimongo/contracts.type-test.js.map +1 -0
- package/dist/minimongo/cursor.d.ts +67 -0
- package/dist/minimongo/cursor.js +157 -0
- package/dist/minimongo/cursor.js.map +1 -0
- package/dist/minimongo/document-store.d.ts +31 -0
- package/dist/minimongo/document-store.js +48 -0
- package/dist/minimongo/document-store.js.map +1 -0
- package/dist/minimongo/errors.d.ts +14 -0
- package/dist/minimongo/errors.js +16 -0
- package/dist/minimongo/errors.js.map +1 -0
- package/dist/minimongo/events.d.ts +20 -0
- package/dist/minimongo/events.js +80 -0
- package/dist/minimongo/events.js.map +1 -0
- package/dist/minimongo/identity.d.ts +8 -0
- package/dist/minimongo/identity.js +15 -0
- package/dist/minimongo/identity.js.map +1 -0
- package/dist/minimongo/immutable.d.ts +6 -0
- package/dist/minimongo/immutable.js +17 -0
- package/dist/minimongo/immutable.js.map +1 -0
- package/dist/minimongo/index.d.ts +7 -0
- package/dist/minimongo/index.js +6 -0
- package/dist/minimongo/index.js.map +1 -0
- package/dist/minimongo/local-collection.d.ts +48 -0
- package/dist/minimongo/local-collection.js +129 -0
- package/dist/minimongo/local-collection.js.map +1 -0
- package/dist/minimongo/matcher.d.ts +27 -0
- package/dist/minimongo/matcher.js +457 -0
- package/dist/minimongo/matcher.js.map +1 -0
- package/dist/minimongo/modifier.d.ts +12 -0
- package/dist/minimongo/modifier.js +323 -0
- package/dist/minimongo/modifier.js.map +1 -0
- package/dist/minimongo/path.d.ts +17 -0
- package/dist/minimongo/path.js +126 -0
- package/dist/minimongo/path.js.map +1 -0
- package/dist/minimongo/projection.d.ts +5 -0
- package/dist/minimongo/projection.js +100 -0
- package/dist/minimongo/projection.js.map +1 -0
- package/dist/minimongo/sorter.d.ts +16 -0
- package/dist/minimongo/sorter.js +140 -0
- package/dist/minimongo/sorter.js.map +1 -0
- package/dist/minimongo/transform.d.ts +4 -0
- package/dist/minimongo/transform.js +30 -0
- package/dist/minimongo/transform.js.map +1 -0
- package/dist/minimongo/types.d.ts +169 -0
- package/dist/minimongo/types.js +2 -0
- package/dist/minimongo/types.js.map +1 -0
- package/dist/minimongo/value-semantics.d.ts +8 -0
- package/dist/minimongo/value-semantics.js +156 -0
- package/dist/minimongo/value-semantics.js.map +1 -0
- package/dist/mongodb/change-streams.js +14 -8
- package/dist/mongodb/change-streams.js.map +1 -1
- package/dist/mongodb/decorators/collection.js +4 -1
- package/dist/mongodb/decorators/collection.js.map +1 -1
- package/dist/mongodb/decorators/metadata.js +1 -1
- package/dist/mongodb/decorators/metadata.js.map +1 -1
- package/dist/mongodb/find-one-or-create.d.ts +2 -2
- package/dist/mongodb/find-one-or-create.js +1 -1
- package/dist/mongodb/find-one-or-create.js.map +1 -1
- package/dist/mongodb/live/engine.js.map +1 -1
- package/dist/mongodb/live/source.js +11 -5
- package/dist/mongodb/live/source.js.map +1 -1
- package/dist/mongodb/live/types.d.ts +1 -1
- package/dist/react/components/client-provider.d.ts +3 -2
- package/dist/react/components/client-provider.js +1 -1
- package/dist/react/components/client-provider.js.map +1 -1
- package/dist/react/contracts.type-test.d.ts +1 -0
- package/dist/react/contracts.type-test.js +21 -0
- package/dist/react/contracts.type-test.js.map +1 -0
- package/dist/react/hooks/use-auth.d.ts +5 -1
- package/dist/react/hooks/use-auth.js +4 -2
- package/dist/react/hooks/use-auth.js.map +1 -1
- package/dist/react/hooks/use-caller.d.ts +10 -5
- package/dist/react/hooks/use-caller.js +12 -8
- package/dist/react/hooks/use-caller.js.map +1 -1
- package/dist/react/hooks/use-channel.d.ts +1 -1
- package/dist/react/hooks/use-channel.js +1 -1
- package/dist/react/hooks/use-channel.js.map +1 -1
- package/dist/react/hooks/use-circuit-breaker.d.ts +14 -6
- package/dist/react/hooks/use-circuit-breaker.js +5 -2
- package/dist/react/hooks/use-circuit-breaker.js.map +1 -1
- package/dist/react/hooks/use-client.d.ts +1 -1
- package/dist/react/hooks/use-client.js +2 -0
- package/dist/react/hooks/use-client.js.map +1 -1
- package/dist/react/hooks/use-connection-state.d.ts +4 -4
- package/dist/react/hooks/use-connection-state.js +2 -0
- package/dist/react/hooks/use-connection-state.js.map +1 -1
- package/dist/react/hooks/use-deps-change.d.ts +1 -1
- package/dist/react/hooks/use-deps-change.js.map +1 -1
- package/dist/react/hooks/use-local-event.d.ts +2 -2
- package/dist/react/hooks/use-local-event.js +2 -2
- package/dist/react/hooks/use-local-event.js.map +1 -1
- package/dist/react/hooks/use-method-refresh.d.ts +24 -15
- package/dist/react/hooks/use-method-refresh.js +18 -22
- package/dist/react/hooks/use-method-refresh.js.map +1 -1
- package/dist/react/hooks/use-method.d.ts +12 -11
- package/dist/react/hooks/use-method.js +9 -5
- package/dist/react/hooks/use-method.js.map +1 -1
- package/dist/react/hooks/use-mongodb-live-publication.js +2 -0
- package/dist/react/hooks/use-mongodb-live-publication.js.map +1 -1
- package/dist/react/hooks/use-object.d.ts +2 -2
- package/dist/react/hooks/use-object.js.map +1 -1
- package/dist/react/hooks/use-subscribe.d.ts +1 -2
- package/dist/react/hooks/use-subscribe.js +11 -9
- package/dist/react/hooks/use-subscribe.js.map +1 -1
- package/dist/react/hooks/use-throttled-events.d.ts +1 -1
- package/dist/react/hooks/use-throttled-events.js +2 -0
- package/dist/react/hooks/use-throttled-events.js.map +1 -1
- package/dist/react/hooks/use-token-refresh.js +1 -1
- package/dist/react/hooks/use-token-refresh.js.map +1 -1
- package/dist/server/client-node.d.ts +17 -10
- package/dist/server/client-node.js +16 -13
- package/dist/server/client-node.js.map +1 -1
- package/dist/server/decorators/register.js +10 -6
- package/dist/server/decorators/register.js.map +1 -1
- package/dist/server/method.d.ts +1 -1
- package/dist/server/method.js +9 -6
- package/dist/server/method.js.map +1 -1
- package/dist/server/methods.js +2 -1
- package/dist/server/methods.js.map +1 -1
- package/dist/server/server-channel.d.ts +4 -2
- package/dist/server/server-channel.js +33 -20
- package/dist/server/server-channel.js.map +1 -1
- package/dist/server/server.d.ts +25 -12
- package/dist/server/server.js +18 -17
- package/dist/server/server.js.map +1 -1
- package/dist/server/transports/node-hono-transport.d.ts +4 -4
- package/dist/server/transports/node-hono-transport.js +66 -14
- package/dist/server/transports/node-hono-transport.js.map +1 -1
- package/dist/server/transports/redis-transport.d.ts +5 -4
- package/dist/server/transports/redis-transport.js +9 -4
- package/dist/server/transports/redis-transport.js.map +1 -1
- package/dist/server/transports/websocket-transport.d.ts +1 -1
- package/dist/server/transports/websocket-transport.js +6 -1
- package/dist/server/transports/websocket-transport.js.map +1 -1
- package/dist/server/transports/ws-shared.d.ts +2 -1
- package/dist/server/transports/ws-shared.js +4 -1
- package/dist/server/transports/ws-shared.js.map +1 -1
- package/dist/utils/errors.d.ts +1 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/event-emitter.d.ts +1 -1
- package/dist/utils/event-emitter.js.map +1 -1
- package/dist/utils/events.d.ts +4 -4
- package/dist/utils/events.js.map +1 -1
- package/dist/utils/helpers.d.ts +4 -4
- package/dist/utils/helpers.js +4 -3
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/intercept.d.ts +1 -2
- package/dist/utils/intercept.js.map +1 -1
- package/dist/utils/iterator.d.ts +6 -8
- package/dist/utils/iterator.js +3 -3
- package/dist/utils/iterator.js.map +1 -1
- package/dist/utils/presentation.d.ts +1 -1
- package/dist/utils/presentation.js +2 -0
- package/dist/utils/presentation.js.map +1 -1
- package/dist/utils/promise.d.ts +5 -5
- package/dist/utils/promise.js +2 -2
- package/dist/utils/promise.js.map +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { LocalQueryError as LocalQueryError } from './errors.js';
|
|
2
|
+
import { expandArrays, lookupBranches } from './path.js';
|
|
3
|
+
import { localValueSemantics } from './value-semantics.js';
|
|
4
|
+
function ascending(direction) {
|
|
5
|
+
if ([1, 'asc', 'ascending'].includes(direction))
|
|
6
|
+
return true;
|
|
7
|
+
if ([-1, 'desc', 'descending'].includes(direction))
|
|
8
|
+
return false;
|
|
9
|
+
throw new LocalQueryError(`Bad sort specification: ${String(direction)}`);
|
|
10
|
+
}
|
|
11
|
+
function normalizeSort(specifier) {
|
|
12
|
+
if (!specifier)
|
|
13
|
+
return [];
|
|
14
|
+
if (Array.isArray(specifier)) {
|
|
15
|
+
return specifier.map(entry => {
|
|
16
|
+
if (typeof entry === 'string')
|
|
17
|
+
return validatedPart(entry, true);
|
|
18
|
+
if (Array.isArray(entry) && typeof entry[0] === 'string') {
|
|
19
|
+
return validatedPart(entry[0], ascending(entry[1]));
|
|
20
|
+
}
|
|
21
|
+
throw new LocalQueryError(`Bad sort specification: ${JSON.stringify(specifier)}`);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
if (typeof specifier === 'object') {
|
|
25
|
+
return Object.entries(specifier)
|
|
26
|
+
.map(([path, direction]) => validatedPart(path, ascending(direction)));
|
|
27
|
+
}
|
|
28
|
+
throw new LocalQueryError(`Bad sort specification: ${String(specifier)}`);
|
|
29
|
+
}
|
|
30
|
+
function validatedPart(path, isAscending) {
|
|
31
|
+
if (!path)
|
|
32
|
+
throw new Error('sort keys must be non-empty');
|
|
33
|
+
if (path.startsWith('$'))
|
|
34
|
+
throw new Error(`unsupported sort key: ${path}`);
|
|
35
|
+
return [path, isAscending];
|
|
36
|
+
}
|
|
37
|
+
function createCollator(options) {
|
|
38
|
+
if (!options)
|
|
39
|
+
return undefined;
|
|
40
|
+
return new Intl.Collator(options.locale, {
|
|
41
|
+
sensitivity: options.strength === 1 ? 'base' : options.strength === 2 ? 'accent' : 'variant',
|
|
42
|
+
numeric: options.numericOrdering,
|
|
43
|
+
caseLevel: options.caseLevel,
|
|
44
|
+
caseFirst: options.caseFirst === 'off' ? 'false' : options.caseFirst,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/** Compiles Mongo-style sort specifications into document comparators. */
|
|
48
|
+
export class Sorter {
|
|
49
|
+
values;
|
|
50
|
+
parts;
|
|
51
|
+
functionComparator;
|
|
52
|
+
collator;
|
|
53
|
+
constructor(specifier, collation, values = localValueSemantics) {
|
|
54
|
+
this.values = values;
|
|
55
|
+
this.functionComparator = typeof specifier === 'function'
|
|
56
|
+
? specifier
|
|
57
|
+
: undefined;
|
|
58
|
+
this.parts = this.functionComparator ? [] : normalizeSort(specifier);
|
|
59
|
+
this.collator = createCollator(collation);
|
|
60
|
+
}
|
|
61
|
+
getComparator(options = {}) {
|
|
62
|
+
if (this.functionComparator)
|
|
63
|
+
return this.functionComparator;
|
|
64
|
+
return (left, right) => {
|
|
65
|
+
if (this.parts.length === 0 && options.distances) {
|
|
66
|
+
const leftDistance = options.distances.get(left._id);
|
|
67
|
+
const rightDistance = options.distances.get(right._id);
|
|
68
|
+
if (leftDistance !== rightDistance)
|
|
69
|
+
return (leftDistance ?? 0) - (rightDistance ?? 0);
|
|
70
|
+
}
|
|
71
|
+
const leftKey = this.documentKey(left);
|
|
72
|
+
const rightKey = this.documentKey(right);
|
|
73
|
+
for (let index = 0; index < this.parts.length; index += 1) {
|
|
74
|
+
const isAscending = this.parts[index][1];
|
|
75
|
+
const leftValue = leftKey[index];
|
|
76
|
+
const rightValue = rightKey[index];
|
|
77
|
+
const compared = this.values.compare(leftValue, rightValue, this.collator);
|
|
78
|
+
if (compared !== 0)
|
|
79
|
+
return isAscending ? compared : -compared;
|
|
80
|
+
}
|
|
81
|
+
return 0;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
_getPaths() {
|
|
85
|
+
return this.parts.map(([path]) => path);
|
|
86
|
+
}
|
|
87
|
+
documentKey(document) {
|
|
88
|
+
if (this.parts.length === 0)
|
|
89
|
+
return [];
|
|
90
|
+
let knownPaths;
|
|
91
|
+
const valuesByPart = this.parts.map(([path]) => {
|
|
92
|
+
const expanded = expandArrays(lookupBranches(document, path, { forSort: true }), { skipArrays: true });
|
|
93
|
+
const branches = expanded.length > 0 ? expanded : [{ value: undefined }];
|
|
94
|
+
const values = new Map();
|
|
95
|
+
let usesArrayPath = false;
|
|
96
|
+
for (const branch of branches) {
|
|
97
|
+
if (!branch.arrayIndices) {
|
|
98
|
+
if (branches.length > 1)
|
|
99
|
+
throw new Error('multiple branches but no array used?');
|
|
100
|
+
values.set('', branch.value);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
usesArrayPath = true;
|
|
104
|
+
const arrayPath = `${branch.arrayIndices.join(',')},`;
|
|
105
|
+
if (values.has(arrayPath))
|
|
106
|
+
throw new Error(`duplicate path: ${arrayPath}`);
|
|
107
|
+
values.set(arrayPath, branch.value);
|
|
108
|
+
if (knownPaths && !knownPaths.has(arrayPath))
|
|
109
|
+
throw new Error('cannot index parallel arrays');
|
|
110
|
+
}
|
|
111
|
+
if (knownPaths) {
|
|
112
|
+
if (!values.has('') && values.size !== knownPaths.size) {
|
|
113
|
+
throw new Error('cannot index parallel arrays!');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else if (usesArrayPath) {
|
|
117
|
+
knownPaths = new Set(values.keys());
|
|
118
|
+
}
|
|
119
|
+
return values;
|
|
120
|
+
});
|
|
121
|
+
const keys = knownPaths
|
|
122
|
+
? [...knownPaths].map(path => valuesByPart.map(values => values.has('') ? values.get('') : values.get(path)))
|
|
123
|
+
: [valuesByPart.map(values => values.get(''))];
|
|
124
|
+
let minimum = keys[0];
|
|
125
|
+
for (const key of keys.slice(1)) {
|
|
126
|
+
if (this.compareKeys(key, minimum) < 0)
|
|
127
|
+
minimum = key;
|
|
128
|
+
}
|
|
129
|
+
return minimum;
|
|
130
|
+
}
|
|
131
|
+
compareKeys(left, right) {
|
|
132
|
+
for (let index = 0; index < this.parts.length; index += 1) {
|
|
133
|
+
const compared = this.values.compare(left[index], right[index], this.collator);
|
|
134
|
+
if (compared !== 0)
|
|
135
|
+
return this.parts[index][1] ? compared : -compared;
|
|
136
|
+
}
|
|
137
|
+
return 0;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=sorter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sorter.js","sourceRoot":"","sources":["../../src/minimongo/sorter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,IAAI,eAAe,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAA;AAErD,OAAO,EAAE,mBAAmB,EAAuB,MAAM,mBAAmB,CAAA;AAM5E,SAAS,SAAS,CAAC,SAAwB;IACzC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAA;IAC5D,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAA;IAEhE,MAAM,IAAI,eAAe,CAAC,2BAA2B,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;AAC3E,CAAC;AAED,SAAS,aAAa,CAAC,SAAkB;IACvC,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAA;IACzB,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YAChE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACzD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAkB,CAAC,CAAC,CAAA;YACtE,CAAC;YAED,MAAM,IAAI,eAAe,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QACnF,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,OAAO,CAAC,SAA0C,CAAC;aAC9D,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAC1E,CAAC;IAED,MAAM,IAAI,eAAe,CAAC,2BAA2B,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;AAC3E,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,WAAoB;IACvD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IACzD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAA;IAE1E,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;AAC5B,CAAC;AAED,SAAS,cAAc,CAAC,OAA0B;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAA;IAE9B,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE;QACvC,WAAW,EAAE,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QAC5F,OAAO,EAAE,OAAO,CAAC,eAAe;QAChC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS;KAC7C,CAAC,CAAA;AAC5B,CAAC;AAED,0EAA0E;AAC1E,MAAM,OAAO,MAAM;IAQE;IAPF,KAAK,CAAqB;IAC1B,kBAAkB,CAA6D;IAC/E,QAAQ,CAA2B;IAEpD,YACE,SAA6C,EAC7C,SAA4B,EACX,SAAyB,mBAAmB;QAA5C,WAAM,GAAN,MAAM,CAAsC;QAE7D,IAAI,CAAC,kBAAkB,GAAG,OAAO,SAAS,KAAK,UAAU;YACvD,CAAC,CAAC,SAA0D;YAC5D,CAAC,CAAC,SAAS,CAAA;QACb,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;QACpE,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;IAC3C,CAAC;IAED,aAAa,CAAC,UAAiE,EAAE;QAI/E,IAAI,IAAI,CAAC,kBAAkB;YAAE,OAAO,IAAI,CAAC,kBAAkB,CAAA;QAE3D,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACrB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACjD,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAE,IAA0B,CAAC,GAAG,CAAC,CAAA;gBAC3E,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAE,KAA2B,CAAC,GAAG,CAAC,CAAA;gBAC7E,IAAI,YAAY,KAAK,aAAa;oBAAE,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,CAAC,CAAA;YACvF,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;YACxC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,CAAA;gBACzC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;gBAChC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;gBAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;gBAC1E,IAAI,QAAQ,KAAK,CAAC;oBAAE,OAAO,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;YAC/D,CAAC;YAED,OAAO,CAAC,CAAA;QACV,CAAC,CAAA;IACH,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;IACzC,CAAC;IAEO,WAAW,CAAC,QAAmB;QACrC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QACtC,IAAI,UAAmC,CAAA;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE;YAC7C,MAAM,QAAQ,GAAG,YAAY,CAC3B,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EACjD,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAA;YACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;YACxE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAA;YACzC,IAAI,aAAa,GAAG,KAAK,CAAA;YACzB,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;oBACzB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;wBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;oBAChF,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;oBAC5B,SAAQ;gBACV,CAAC;gBACD,aAAa,GAAG,IAAI,CAAA;gBACpB,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;gBACrD,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAA;gBAC1E,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;gBACnC,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;YAC/F,CAAC;YACD,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC;oBACvD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;gBAClD,CAAC;YACH,CAAC;iBAAM,IAAI,aAAa,EAAE,CAAC;gBACzB,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;YACrC,CAAC;YAED,OAAO,MAAM,CAAA;QACf,CAAC,CAAC,CAAA;QAEF,MAAM,IAAI,GAAc,UAAU;YAChC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7G,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAChD,IAAI,OAAO,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;QACtB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,GAAG,CAAA;QACvD,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,WAAW,CAAC,IAAa,EAAE,KAAc;QAC/C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC9E,IAAI,QAAQ,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QACzE,CAAC;QAED,OAAO,CAAC,CAAA;IACV,CAAC;CACF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TransformedDocument } from './types.js';
|
|
2
|
+
import type { ValueSemantics } from './value-semantics.js';
|
|
3
|
+
/** Enforces the local store's identity-preserving document transform contract. */
|
|
4
|
+
export declare function wrapTransform<TDocument extends object, TOutput extends object>(transform: ((document: TDocument) => TOutput) | null | undefined, values: ValueSemantics): ((document: TDocument) => TransformedDocument<TDocument, TOutput>) | undefined;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { isPlainObject } from './path.js';
|
|
2
|
+
const WRAPPED_TRANSFORM = Symbol('TypeFerryMinimongoWrappedTransform');
|
|
3
|
+
/** Enforces the local store's identity-preserving document transform contract. */
|
|
4
|
+
export function wrapTransform(transform, values) {
|
|
5
|
+
if (!transform)
|
|
6
|
+
return undefined;
|
|
7
|
+
const existing = transform;
|
|
8
|
+
if (existing[WRAPPED_TRANSFORM])
|
|
9
|
+
return existing;
|
|
10
|
+
const wrapped = document => {
|
|
11
|
+
if (!Object.hasOwn(document, '_id'))
|
|
12
|
+
throw new Error('can only transform documents with _id');
|
|
13
|
+
const id = Reflect.get(document, '_id');
|
|
14
|
+
const transformed = transform(document);
|
|
15
|
+
if (!isPlainObject(transformed))
|
|
16
|
+
throw new Error('transform must return object');
|
|
17
|
+
if (Object.hasOwn(transformed, '_id')) {
|
|
18
|
+
if (!values.equals(transformed._id, id)) {
|
|
19
|
+
throw new Error('transformed document can\'t have different _id');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
transformed._id = id;
|
|
24
|
+
}
|
|
25
|
+
return transformed;
|
|
26
|
+
};
|
|
27
|
+
Object.defineProperty(wrapped, WRAPPED_TRANSFORM, { value: true });
|
|
28
|
+
return wrapped;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/minimongo/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAItC,MAAM,iBAAiB,GAAG,MAAM,CAAC,oCAAoC,CAAC,CAAA;AAOtE,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAC3B,SAAgE,EAChE,MAAsB;IAEtB,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAA;IAChC,MAAM,QAAQ,GAAG,SAA4D,CAAA;IAC7E,IAAI,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO,QAAQ,CAAA;IAEhD,MAAM,OAAO,GAAyC,QAAQ,CAAC,EAAE;QAC/D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;QAC7F,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QACvC,MAAM,WAAW,GAAY,SAAS,CAAC,QAAQ,CAAC,CAAA;QAChD,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;QAChF,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;YACnE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,GAAG,EAAE,CAAA;QACtB,CAAC;QAED,OAAO,WAAsD,CAAA;IAC/D,CAAC,CAAA;IACD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAElE,OAAO,OAA2E,CAAA;AACpF,CAAC"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import type { DeepReadonly } from './immutable.js';
|
|
2
|
+
/** Client-safe hexadecimal identity used by TypeFerry local collections. */
|
|
3
|
+
export type MinimongoId = string;
|
|
4
|
+
/** A schema after Minimongo has assigned its required identity. */
|
|
5
|
+
export type MaterializedDocument<TSchema extends object, TId extends MinimongoId = MinimongoId> = DeepReadonly<Omit<TSchema, '_id'>> & {
|
|
6
|
+
readonly _id: TId;
|
|
7
|
+
};
|
|
8
|
+
/** Result of a transform after Minimongo restores the source identity. */
|
|
9
|
+
export type TransformedDocument<TDocument extends object, TOutput extends object> = DeepReadonly<TOutput> & {
|
|
10
|
+
readonly _id: TDocument extends {
|
|
11
|
+
readonly _id: infer TId;
|
|
12
|
+
} ? TId : unknown;
|
|
13
|
+
};
|
|
14
|
+
/** Input accepted when inserting a document. */
|
|
15
|
+
export type InsertDocument<TSchema extends object, TId extends MinimongoId = MinimongoId> = Omit<TSchema, '_id'> & {
|
|
16
|
+
_id?: TId;
|
|
17
|
+
};
|
|
18
|
+
type Primitive = string | number | boolean | bigint | symbol | null | undefined;
|
|
19
|
+
type PreviousDepth = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8];
|
|
20
|
+
/** Dot-separated paths through a document, bounded to protect the compiler. */
|
|
21
|
+
export type FieldPath<TValue, TDepth extends number = 8> = TDepth extends 0 ? never : TValue extends Primitive | Date | RegExp ? never : TValue extends readonly (infer TElement)[] ? FieldPath<TElement, PreviousDepth[TDepth]> : {
|
|
22
|
+
[TKey in Extract<keyof TValue, string>]: TKey | (FieldPath<TValue[TKey], PreviousDepth[TDepth]> extends infer TRest ? TRest extends string ? `${TKey}.${TRest}` : never : never);
|
|
23
|
+
}[Extract<keyof TValue, string>];
|
|
24
|
+
/** Resolves the value addressed by a dot-separated document path. */
|
|
25
|
+
export type ValueAtPath<TValue, TPath extends string> = TPath extends `${infer THead}.${infer TTail}` ? THead extends keyof TValue ? NonNullable<TValue[THead]> extends readonly (infer TElement)[] ? ValueAtPath<TElement, TTail> : ValueAtPath<NonNullable<TValue[THead]>, TTail> : unknown : TPath extends keyof TValue ? TValue[TPath] : unknown;
|
|
26
|
+
export interface ComparisonSelector<TValue> {
|
|
27
|
+
readonly $eq?: TValue;
|
|
28
|
+
readonly $ne?: TValue;
|
|
29
|
+
readonly $gt?: TValue;
|
|
30
|
+
readonly $gte?: TValue;
|
|
31
|
+
readonly $lt?: TValue;
|
|
32
|
+
readonly $lte?: TValue;
|
|
33
|
+
readonly $in?: readonly (TValue | RegExp)[];
|
|
34
|
+
readonly $nin?: readonly (TValue | RegExp)[];
|
|
35
|
+
readonly $exists?: boolean;
|
|
36
|
+
readonly $not?: SelectorValue<TValue>;
|
|
37
|
+
}
|
|
38
|
+
export interface ArraySelector<TElement> extends ComparisonSelector<readonly TElement[]> {
|
|
39
|
+
readonly $all?: readonly (TElement | RegExp)[];
|
|
40
|
+
readonly $elemMatch?: SelectorValue<TElement> | Selector<TElement & object>;
|
|
41
|
+
readonly $size?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface StringSelector extends ComparisonSelector<string> {
|
|
44
|
+
readonly $regex?: RegExp | string;
|
|
45
|
+
readonly $options?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface NumericSelector extends ComparisonSelector<number> {
|
|
48
|
+
readonly $mod?: readonly [divisor: number, remainder: number];
|
|
49
|
+
readonly $bitsAllClear?: number | readonly number[] | Uint8Array;
|
|
50
|
+
readonly $bitsAllSet?: number | readonly number[] | Uint8Array;
|
|
51
|
+
readonly $bitsAnyClear?: number | readonly number[] | Uint8Array;
|
|
52
|
+
readonly $bitsAnySet?: number | readonly number[] | Uint8Array;
|
|
53
|
+
}
|
|
54
|
+
export type BsonTypeAlias = 'double' | 'string' | 'object' | 'array' | 'binData' | 'undefined' | 'objectId' | 'bool' | 'date' | 'null' | 'regex' | 'dbPointer' | 'javascript' | 'symbol' | 'javascriptWithScope' | 'int' | 'timestamp' | 'long' | 'decimal' | 'minKey' | 'maxKey';
|
|
55
|
+
export type BsonTypeCode = -1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 127;
|
|
56
|
+
export interface TypeSelector {
|
|
57
|
+
readonly $type?: BsonTypeAlias | BsonTypeCode;
|
|
58
|
+
}
|
|
59
|
+
export type CoordinatePair = readonly [longitude: number, latitude: number];
|
|
60
|
+
export interface GeoJsonPoint {
|
|
61
|
+
readonly type: 'Point';
|
|
62
|
+
readonly coordinates: CoordinatePair;
|
|
63
|
+
}
|
|
64
|
+
export interface NearSelector {
|
|
65
|
+
readonly $near: CoordinatePair | GeoJsonPoint | {
|
|
66
|
+
readonly $geometry: GeoJsonPoint;
|
|
67
|
+
readonly $maxDistance?: number;
|
|
68
|
+
};
|
|
69
|
+
readonly $maxDistance?: number;
|
|
70
|
+
}
|
|
71
|
+
export type SelectorValue<TValue> = TValue | (ComparisonSelector<TValue> & TypeSelector) | (TValue extends string ? StringSelector | RegExp : never) | (TValue extends number ? NumericSelector : never) | (TValue extends readonly (infer TElement)[] ? ArraySelector<TElement> : never) | TypeSelector | NearSelector;
|
|
72
|
+
type FieldSelectorMap<TDocument extends object> = {
|
|
73
|
+
readonly [TPath in FieldPath<TDocument>]?: SelectorValue<ValueAtPath<TDocument, TPath>>;
|
|
74
|
+
};
|
|
75
|
+
export interface LogicalSelector<TDocument extends object> {
|
|
76
|
+
readonly $and?: readonly Selector<TDocument>[];
|
|
77
|
+
readonly $or?: readonly Selector<TDocument>[];
|
|
78
|
+
readonly $nor?: readonly Selector<TDocument>[];
|
|
79
|
+
readonly $comment?: string;
|
|
80
|
+
}
|
|
81
|
+
/** A typed Mongo-style selector or literal predicate. */
|
|
82
|
+
export type Selector<TDocument extends object> = MinimongoId | (FieldSelectorMap<TDocument> & LogicalSelector<TDocument>);
|
|
83
|
+
export type Projection<TDocument extends object> = Readonly<Partial<Record<FieldPath<TDocument> | '_id', 0 | 1 | false | true>>>;
|
|
84
|
+
export type SortDirection = 1 | -1 | 'asc' | 'desc' | 'ascending' | 'descending';
|
|
85
|
+
export type SortSpecifier<TDocument extends object> = Readonly<Partial<Record<FieldPath<TDocument>, SortDirection>>> | readonly (FieldPath<TDocument> | readonly [FieldPath<TDocument>, SortDirection])[] | ((left: TDocument, right: TDocument) => number);
|
|
86
|
+
export interface CollationOptions {
|
|
87
|
+
readonly locale: string;
|
|
88
|
+
readonly strength?: 1 | 2 | 3 | 4 | 5;
|
|
89
|
+
readonly caseLevel?: boolean;
|
|
90
|
+
readonly numericOrdering?: boolean;
|
|
91
|
+
readonly caseFirst?: 'upper' | 'lower' | 'off';
|
|
92
|
+
readonly alternate?: 'non-ignorable' | 'shifted';
|
|
93
|
+
readonly maxVariable?: 'punct' | 'space';
|
|
94
|
+
readonly backwards?: boolean;
|
|
95
|
+
}
|
|
96
|
+
export interface FindOptions<TDocument extends object, TOutput extends object = TDocument> {
|
|
97
|
+
readonly sort?: SortSpecifier<TDocument>;
|
|
98
|
+
readonly skip?: number;
|
|
99
|
+
readonly limit?: number;
|
|
100
|
+
readonly projection?: Projection<TDocument>;
|
|
101
|
+
readonly transform?: ((document: TDocument) => TOutput) | null;
|
|
102
|
+
readonly collation?: CollationOptions;
|
|
103
|
+
}
|
|
104
|
+
type NumericFieldMap<TDocument extends object> = {
|
|
105
|
+
[TPath in FieldPath<TDocument>]?: ValueAtPath<TDocument, TPath> extends number ? number : never;
|
|
106
|
+
};
|
|
107
|
+
type SetFieldMap<TDocument extends object> = {
|
|
108
|
+
[TPath in FieldPath<TDocument>]?: ValueAtPath<TDocument, TPath>;
|
|
109
|
+
};
|
|
110
|
+
type PushArgument<TElement> = TElement | {
|
|
111
|
+
readonly $each: readonly TElement[];
|
|
112
|
+
readonly $position?: number;
|
|
113
|
+
readonly $slice?: number;
|
|
114
|
+
readonly $sort?: TElement extends object ? SortSpecifier<TElement> : never;
|
|
115
|
+
};
|
|
116
|
+
type PushFieldMap<TDocument extends object> = {
|
|
117
|
+
[TPath in FieldPath<TDocument>]?: NonNullable<ValueAtPath<TDocument, TPath>> extends readonly (infer TElement)[] ? PushArgument<TElement> : never;
|
|
118
|
+
};
|
|
119
|
+
type PushAllFieldMap<TDocument extends object> = {
|
|
120
|
+
[TPath in FieldPath<TDocument>]?: NonNullable<ValueAtPath<TDocument, TPath>> extends readonly (infer TElement)[] ? readonly TElement[] : never;
|
|
121
|
+
};
|
|
122
|
+
type AddToSetFieldMap<TDocument extends object> = {
|
|
123
|
+
[TPath in FieldPath<TDocument>]?: NonNullable<ValueAtPath<TDocument, TPath>> extends readonly (infer TElement)[] ? TElement | {
|
|
124
|
+
readonly $each: readonly TElement[];
|
|
125
|
+
} : never;
|
|
126
|
+
};
|
|
127
|
+
type PopFieldMap<TDocument extends object> = {
|
|
128
|
+
[TPath in FieldPath<TDocument>]?: NonNullable<ValueAtPath<TDocument, TPath>> extends readonly unknown[] ? number : never;
|
|
129
|
+
};
|
|
130
|
+
type PullFieldMap<TDocument extends object> = {
|
|
131
|
+
[TPath in FieldPath<TDocument>]?: NonNullable<ValueAtPath<TDocument, TPath>> extends readonly (infer TElement)[] ? SelectorValue<TElement> : never;
|
|
132
|
+
};
|
|
133
|
+
export interface Modifier<TDocument extends object> {
|
|
134
|
+
readonly $currentDate?: Partial<Record<FieldPath<TDocument>, true | {
|
|
135
|
+
readonly $type: 'date';
|
|
136
|
+
}>>;
|
|
137
|
+
readonly $inc?: NumericFieldMap<TDocument>;
|
|
138
|
+
readonly $min?: NumericFieldMap<TDocument>;
|
|
139
|
+
readonly $max?: NumericFieldMap<TDocument>;
|
|
140
|
+
readonly $mul?: NumericFieldMap<TDocument>;
|
|
141
|
+
readonly $rename?: Partial<Record<FieldPath<TDocument>, FieldPath<TDocument>>>;
|
|
142
|
+
readonly $set?: SetFieldMap<TDocument>;
|
|
143
|
+
readonly $setOnInsert?: SetFieldMap<TDocument>;
|
|
144
|
+
readonly $unset?: Partial<Record<FieldPath<TDocument>, unknown>>;
|
|
145
|
+
readonly $push?: PushFieldMap<TDocument>;
|
|
146
|
+
readonly $pushAll?: PushAllFieldMap<TDocument>;
|
|
147
|
+
readonly $addToSet?: AddToSetFieldMap<TDocument>;
|
|
148
|
+
readonly $pop?: PopFieldMap<TDocument>;
|
|
149
|
+
readonly $pull?: PullFieldMap<TDocument>;
|
|
150
|
+
readonly $pullAll?: PushAllFieldMap<TDocument>;
|
|
151
|
+
}
|
|
152
|
+
export interface UpdateOptions<TId extends MinimongoId = MinimongoId> {
|
|
153
|
+
readonly multi?: boolean;
|
|
154
|
+
}
|
|
155
|
+
export interface UpsertOptions<TId extends MinimongoId = MinimongoId> {
|
|
156
|
+
readonly multi?: boolean;
|
|
157
|
+
readonly insertedId?: TId;
|
|
158
|
+
}
|
|
159
|
+
export interface UpsertResult<TId extends MinimongoId = MinimongoId> {
|
|
160
|
+
readonly numberAffected: number;
|
|
161
|
+
readonly insertedId?: TId;
|
|
162
|
+
}
|
|
163
|
+
/** Values used by a compiled matcher, including positional and geo metadata. */
|
|
164
|
+
export interface MatchResult {
|
|
165
|
+
readonly result: boolean;
|
|
166
|
+
readonly distance?: number;
|
|
167
|
+
readonly arrayIndices?: readonly (number | 'x')[];
|
|
168
|
+
}
|
|
169
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/minimongo/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface ValueSemantics {
|
|
2
|
+
clone<TValue>(value: TValue): TValue;
|
|
3
|
+
equals(left: unknown, right: unknown, options?: {
|
|
4
|
+
readonly keyOrderSensitive?: boolean;
|
|
5
|
+
}): boolean;
|
|
6
|
+
compare(left: unknown, right: unknown, collator?: Intl.Collator): number;
|
|
7
|
+
}
|
|
8
|
+
export declare const localValueSemantics: ValueSemantics;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
function isBinary(value) {
|
|
2
|
+
return value instanceof Uint8Array;
|
|
3
|
+
}
|
|
4
|
+
function isRecord(value) {
|
|
5
|
+
return typeof value === 'object' && value !== null;
|
|
6
|
+
}
|
|
7
|
+
function hasClone(value) {
|
|
8
|
+
return typeof value.clone === 'function';
|
|
9
|
+
}
|
|
10
|
+
function cloneValue(value) {
|
|
11
|
+
if (!isRecord(value))
|
|
12
|
+
return value;
|
|
13
|
+
if (value instanceof Date)
|
|
14
|
+
return new Date(value.valueOf());
|
|
15
|
+
if (value instanceof RegExp)
|
|
16
|
+
return new RegExp(value.source, value.flags);
|
|
17
|
+
if (isBinary(value))
|
|
18
|
+
return value.slice();
|
|
19
|
+
if (hasClone(value))
|
|
20
|
+
return value.clone();
|
|
21
|
+
if (Array.isArray(value))
|
|
22
|
+
return value.map(item => cloneValue(item));
|
|
23
|
+
const result = {};
|
|
24
|
+
for (const key of Object.keys(value))
|
|
25
|
+
result[key] = cloneValue(value[key]);
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
function equalValues(left, right, keyOrderSensitive) {
|
|
29
|
+
if (left === right)
|
|
30
|
+
return true;
|
|
31
|
+
if (Number.isNaN(left) && Number.isNaN(right))
|
|
32
|
+
return true;
|
|
33
|
+
if (typeof left !== typeof right)
|
|
34
|
+
return false;
|
|
35
|
+
if (!isRecord(left) || !isRecord(right))
|
|
36
|
+
return false;
|
|
37
|
+
if (left instanceof Date || right instanceof Date) {
|
|
38
|
+
return left instanceof Date && right instanceof Date && left.valueOf() === right.valueOf();
|
|
39
|
+
}
|
|
40
|
+
if (isBinary(left) || isBinary(right)) {
|
|
41
|
+
if (!isBinary(left) || !isBinary(right) || left.length !== right.length)
|
|
42
|
+
return false;
|
|
43
|
+
return left.every((byte, index) => byte === right[index]);
|
|
44
|
+
}
|
|
45
|
+
if (left instanceof RegExp || right instanceof RegExp) {
|
|
46
|
+
return left instanceof RegExp
|
|
47
|
+
&& right instanceof RegExp
|
|
48
|
+
&& left.source === right.source
|
|
49
|
+
&& left.flags === right.flags;
|
|
50
|
+
}
|
|
51
|
+
if (Array.isArray(left) || Array.isArray(right)) {
|
|
52
|
+
if (!Array.isArray(left) || !Array.isArray(right) || left.length !== right.length)
|
|
53
|
+
return false;
|
|
54
|
+
return left.every((value, index) => equalValues(value, right[index], keyOrderSensitive));
|
|
55
|
+
}
|
|
56
|
+
if (typeof left.equals === 'function') {
|
|
57
|
+
return Boolean(left.equals(right));
|
|
58
|
+
}
|
|
59
|
+
const leftKeys = Object.keys(left);
|
|
60
|
+
const rightKeys = Object.keys(right);
|
|
61
|
+
if (leftKeys.length !== rightKeys.length)
|
|
62
|
+
return false;
|
|
63
|
+
if (keyOrderSensitive && leftKeys.some((key, index) => key !== rightKeys[index]))
|
|
64
|
+
return false;
|
|
65
|
+
return leftKeys.every(key => Object.hasOwn(right, key)
|
|
66
|
+
&& equalValues(left[key], right[key], keyOrderSensitive));
|
|
67
|
+
}
|
|
68
|
+
const TYPE_ORDER = new Map([
|
|
69
|
+
['undefined', -1],
|
|
70
|
+
['null', 0],
|
|
71
|
+
['number', 1],
|
|
72
|
+
['string', 2],
|
|
73
|
+
['object', 3],
|
|
74
|
+
['array', 4],
|
|
75
|
+
['binary', 5],
|
|
76
|
+
['boolean', 7],
|
|
77
|
+
['date', 8],
|
|
78
|
+
['regexp', 9],
|
|
79
|
+
]);
|
|
80
|
+
function valueType(value) {
|
|
81
|
+
if (value === undefined)
|
|
82
|
+
return 'undefined';
|
|
83
|
+
if (value === null)
|
|
84
|
+
return 'null';
|
|
85
|
+
if (Array.isArray(value))
|
|
86
|
+
return 'array';
|
|
87
|
+
if (isBinary(value))
|
|
88
|
+
return 'binary';
|
|
89
|
+
if (value instanceof Date)
|
|
90
|
+
return 'date';
|
|
91
|
+
if (value instanceof RegExp)
|
|
92
|
+
return 'regexp';
|
|
93
|
+
return typeof value;
|
|
94
|
+
}
|
|
95
|
+
function compareValues(left, right, collator) {
|
|
96
|
+
if (equalValues(left, right, true))
|
|
97
|
+
return 0;
|
|
98
|
+
const leftType = valueType(left);
|
|
99
|
+
const rightType = valueType(right);
|
|
100
|
+
const typeDifference = (TYPE_ORDER.get(leftType) ?? 100) - (TYPE_ORDER.get(rightType) ?? 100);
|
|
101
|
+
if (typeDifference !== 0)
|
|
102
|
+
return typeDifference < 0 ? -1 : 1;
|
|
103
|
+
if (typeof left === 'number' && typeof right === 'number')
|
|
104
|
+
return left < right ? -1 : 1;
|
|
105
|
+
if (typeof left === 'string' && typeof right === 'string') {
|
|
106
|
+
const result = collator ? collator.compare(left, right) : left < right ? -1 : 1;
|
|
107
|
+
return Math.sign(result);
|
|
108
|
+
}
|
|
109
|
+
if (typeof left === 'boolean' && typeof right === 'boolean')
|
|
110
|
+
return left ? 1 : -1;
|
|
111
|
+
if (left instanceof Date && right instanceof Date)
|
|
112
|
+
return left < right ? -1 : 1;
|
|
113
|
+
if (left instanceof RegExp && right instanceof RegExp)
|
|
114
|
+
return left.toString() < right.toString() ? -1 : 1;
|
|
115
|
+
if (Array.isArray(left) && Array.isArray(right)) {
|
|
116
|
+
for (let index = 0; index < Math.min(left.length, right.length); index += 1) {
|
|
117
|
+
const result = compareValues(left[index], right[index], collator);
|
|
118
|
+
if (result !== 0)
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
return left.length < right.length ? -1 : 1;
|
|
122
|
+
}
|
|
123
|
+
if (isBinary(left) && isBinary(right)) {
|
|
124
|
+
for (let index = 0; index < Math.min(left.length, right.length); index += 1) {
|
|
125
|
+
const difference = (left[index] ?? 0) - (right[index] ?? 0);
|
|
126
|
+
if (difference !== 0)
|
|
127
|
+
return difference < 0 ? -1 : 1;
|
|
128
|
+
}
|
|
129
|
+
return left.length < right.length ? -1 : 1;
|
|
130
|
+
}
|
|
131
|
+
if (isRecord(left) && isRecord(right)) {
|
|
132
|
+
const leftEntries = Object.entries(left);
|
|
133
|
+
const rightEntries = Object.entries(right);
|
|
134
|
+
for (let index = 0; index < Math.min(leftEntries.length, rightEntries.length); index += 1) {
|
|
135
|
+
const leftEntry = leftEntries[index];
|
|
136
|
+
const rightEntry = rightEntries[index];
|
|
137
|
+
if (!leftEntry || !rightEntry)
|
|
138
|
+
continue;
|
|
139
|
+
if (leftEntry[0] !== rightEntry[0])
|
|
140
|
+
return leftEntry[0] < rightEntry[0] ? -1 : 1;
|
|
141
|
+
const result = compareValues(leftEntry[1], rightEntry[1], collator);
|
|
142
|
+
if (result !== 0)
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
return leftEntries.length < rightEntries.length ? -1 : 1;
|
|
146
|
+
}
|
|
147
|
+
return String(left) < String(right) ? -1 : 1;
|
|
148
|
+
}
|
|
149
|
+
export const localValueSemantics = {
|
|
150
|
+
clone: cloneValue,
|
|
151
|
+
equals(left, right, options) {
|
|
152
|
+
return equalValues(left, right, options?.keyOrderSensitive ?? false);
|
|
153
|
+
},
|
|
154
|
+
compare: compareValues,
|
|
155
|
+
};
|
|
156
|
+
//# sourceMappingURL=value-semantics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value-semantics.js","sourceRoot":"","sources":["../../src/minimongo/value-semantics.ts"],"names":[],"mappings":"AAMA,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,YAAY,UAAU,CAAA;AACpC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAA;AACpD,CAAC;AAED,SAAS,QAAQ,CAAC,KAA8B;IAG9C,OAAO,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU,CAAA;AAC1C,CAAC;AAED,SAAS,UAAU,CAAS,KAAa;IACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAClC,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAW,CAAA;IACrE,IAAI,KAAK,YAAY,MAAM;QAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAW,CAAA;IACnF,IAAI,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,EAAY,CAAA;IACnD,IAAI,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,EAAY,CAAA;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAW,CAAA;IAE9E,MAAM,MAAM,GAA4B,EAAE,CAAA;IAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IAE1E,OAAO,MAAgB,CAAA;AACzB,CAAC;AAED,SAAS,WAAW,CAClB,IAAa,EACb,KAAc,EACd,iBAA0B;IAE1B,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAA;IAC/B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAC1D,IAAI,OAAO,IAAI,KAAK,OAAO,KAAK;QAAE,OAAO,KAAK,CAAA;IAC9C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACrD,IAAI,IAAI,YAAY,IAAI,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAClD,OAAO,IAAI,YAAY,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAAA;IAC5F,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAAE,OAAO,KAAK,CAAA;QAErF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IAC3D,CAAC;IACD,IAAI,IAAI,YAAY,MAAM,IAAI,KAAK,YAAY,MAAM,EAAE,CAAC;QACtD,OAAO,IAAI,YAAY,MAAM;eACxB,KAAK,YAAY,MAAM;eACvB,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;eAC5B,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAA;IACjC,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAAE,OAAO,KAAK,CAAA;QAE/F,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAA;IAC1F,CAAC;IACD,IAAI,OAAQ,IAA6B,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAChE,OAAO,OAAO,CAAE,IAA4C,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC7E,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACtD,IAAI,iBAAiB,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAE9F,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;WACjD,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAiB;IACzC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACjB,CAAC,MAAM,EAAE,CAAC,CAAC;IACX,CAAC,QAAQ,EAAE,CAAC,CAAC;IACb,CAAC,QAAQ,EAAE,CAAC,CAAC;IACb,CAAC,QAAQ,EAAE,CAAC,CAAC;IACb,CAAC,OAAO,EAAE,CAAC,CAAC;IACZ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACb,CAAC,SAAS,EAAE,CAAC,CAAC;IACd,CAAC,MAAM,EAAE,CAAC,CAAC;IACX,CAAC,QAAQ,EAAE,CAAC,CAAC;CACd,CAAC,CAAA;AAEF,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,WAAW,CAAA;IAC3C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAA;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAA;IACxC,IAAI,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAA;IACpC,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,MAAM,CAAA;IACxC,IAAI,KAAK,YAAY,MAAM;QAAE,OAAO,QAAQ,CAAA;IAE5C,OAAO,OAAO,KAAK,CAAA;AACrB,CAAC;AAED,SAAS,aAAa,CAAC,IAAa,EAAE,KAAc,EAAE,QAAwB;IAC5E,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC;QAAE,OAAO,CAAC,CAAA;IAE5C,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;IAClC,MAAM,cAAc,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAA;IAC7F,IAAI,cAAc,KAAK,CAAC;QAAE,OAAO,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAE5D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvF,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAE/E,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC1B,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACjF,IAAI,IAAI,YAAY,IAAI,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/E,IAAI,IAAI,YAAY,MAAM,IAAI,KAAK,YAAY,MAAM;QAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACzG,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC5E,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAA;YACjE,IAAI,MAAM,KAAK,CAAC;gBAAE,OAAO,MAAM,CAAA;QACjC,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC5E,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YAC3D,IAAI,UAAU,KAAK,CAAC;gBAAE,OAAO,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACtD,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACxC,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC1F,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;YACpC,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;YACtC,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU;gBAAE,SAAQ;YACvC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC;gBAAE,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAChF,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;YACnE,IAAI,MAAM,KAAK,CAAC;gBAAE,OAAO,MAAM,CAAA;QACjC,CAAC;QAED,OAAO,WAAW,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1D,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAmB;IACjD,KAAK,EAAE,UAAU;IACjB,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO;QACzB,OAAO,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,IAAI,KAAK,CAAC,CAAA;IACtE,CAAC;IACD,OAAO,EAAE,aAAa;CACvB,CAAA"}
|
|
@@ -7,16 +7,21 @@ export function startMongoWatch(options) {
|
|
|
7
7
|
const run = async () => {
|
|
8
8
|
while (!closed) {
|
|
9
9
|
const streamOptions = {
|
|
10
|
-
fullDocument: options.watch.fullDocument ?? 'updateLookup',
|
|
11
|
-
fullDocumentBeforeChange: options.watch.fullDocumentBeforeChange,
|
|
12
10
|
...options.watch.options,
|
|
11
|
+
fullDocument: options.watch.fullDocument ?? 'updateLookup',
|
|
12
|
+
...(options.watch.fullDocumentBeforeChange === undefined
|
|
13
|
+
? {}
|
|
14
|
+
: {
|
|
15
|
+
fullDocumentBeforeChange: options.watch.fullDocumentBeforeChange,
|
|
16
|
+
}),
|
|
13
17
|
};
|
|
14
18
|
const pipeline = options.watch.pipeline
|
|
15
19
|
? [...options.watch.pipeline]
|
|
16
20
|
: undefined;
|
|
17
|
-
|
|
21
|
+
const stream = options.collection.watch(pipeline, streamOptions);
|
|
22
|
+
activeStream = stream;
|
|
18
23
|
try {
|
|
19
|
-
for await (const change of
|
|
24
|
+
for await (const change of stream) {
|
|
20
25
|
if (closed)
|
|
21
26
|
break;
|
|
22
27
|
await emitChange(options, change);
|
|
@@ -29,8 +34,9 @@ export function startMongoWatch(options) {
|
|
|
29
34
|
await delay(options.reconnectDelayMs ?? DEFAULT_RECONNECT_DELAY_MS);
|
|
30
35
|
}
|
|
31
36
|
finally {
|
|
32
|
-
await
|
|
33
|
-
activeStream
|
|
37
|
+
await stream.close().catch(() => undefined);
|
|
38
|
+
if (activeStream === stream)
|
|
39
|
+
activeStream = null;
|
|
34
40
|
}
|
|
35
41
|
}
|
|
36
42
|
};
|
|
@@ -73,7 +79,7 @@ export function shouldSkipMongoWatchChange(change, watch) {
|
|
|
73
79
|
if (fields.length === 0)
|
|
74
80
|
return false;
|
|
75
81
|
return fields.every(field => {
|
|
76
|
-
const root = field.split('.')[0];
|
|
82
|
+
const root = field.split('.')[0] ?? field;
|
|
77
83
|
return root === 'updatedAt' || Boolean(watch.excludeFields?.includes(root));
|
|
78
84
|
});
|
|
79
85
|
}
|
|
@@ -131,7 +137,7 @@ function stringifyResumeToken(token) {
|
|
|
131
137
|
function isObjectId(value) {
|
|
132
138
|
return (Boolean(value) &&
|
|
133
139
|
typeof value === 'object' &&
|
|
134
|
-
value
|
|
140
|
+
Object.getPrototypeOf(value)?.constructor?.name === 'ObjectId' &&
|
|
135
141
|
typeof value.toHexString === 'function');
|
|
136
142
|
}
|
|
137
143
|
function delay(ms) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-streams.js","sourceRoot":"","sources":["../../src/mongodb/change-streams.ts"],"names":[],"mappings":"AAoBA,MAAM,0BAA0B,GAAG,GAAG,CAAA;AAsBtC,0FAA0F;AAC1F,MAAM,UAAU,eAAe,CAC7B,OAA0C;IAE1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IAExE,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,IAAI,YAAY,
|
|
1
|
+
{"version":3,"file":"change-streams.js","sourceRoot":"","sources":["../../src/mongodb/change-streams.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,10 @@ export function MongoSchema(schema) {
|
|
|
19
19
|
export function MongoIndex(spec, options) {
|
|
20
20
|
return function (Class, _context) {
|
|
21
21
|
const meta = getOrCreateMongoCollectionMeta(Class);
|
|
22
|
-
meta.indexes.push({
|
|
22
|
+
meta.indexes.push({
|
|
23
|
+
spec,
|
|
24
|
+
...(options === undefined ? {} : { options }),
|
|
25
|
+
});
|
|
23
26
|
return Class;
|
|
24
27
|
};
|
|
25
28
|
}
|