typeferry 0.12.0 → 0.13.1

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.
Files changed (252) hide show
  1. package/README.md +5 -0
  2. package/dist/application/config.d.ts +47 -39
  3. package/dist/application/config.js +29 -16
  4. package/dist/application/config.js.map +1 -1
  5. package/dist/application/native-simulator-settings.js +1 -1
  6. package/dist/application/native-simulator-settings.js.map +1 -1
  7. package/dist/application/proxy.d.ts +5 -1
  8. package/dist/application/proxy.js +25 -4
  9. package/dist/application/proxy.js.map +1 -1
  10. package/dist/application/run-tests.js +1 -1
  11. package/dist/application/run-tests.js.map +1 -1
  12. package/dist/auth/client/native-session.js +4 -2
  13. package/dist/auth/client/native-session.js.map +1 -1
  14. package/dist/auth/client/oauth/use-google-login.js +2 -0
  15. package/dist/auth/client/oauth/use-google-login.js.map +1 -1
  16. package/dist/auth/server/cookie-utils.js +4 -3
  17. package/dist/auth/server/cookie-utils.js.map +1 -1
  18. package/dist/auth/server/device-info.js +8 -8
  19. package/dist/auth/server/device-info.js.map +1 -1
  20. package/dist/auth/server/oauth/google.js +11 -7
  21. package/dist/auth/server/oauth/google.js.map +1 -1
  22. package/dist/auth/server/session-manager.js +2 -2
  23. package/dist/auth/server/session-manager.js.map +1 -1
  24. package/dist/client/client-channel.d.ts +3 -11
  25. package/dist/client/client-channel.js +11 -4
  26. package/dist/client/client-channel.js.map +1 -1
  27. package/dist/client/client-http.d.ts +2 -2
  28. package/dist/client/client-http.js.map +1 -1
  29. package/dist/client/client.d.ts +13 -13
  30. package/dist/client/client.js +24 -11
  31. package/dist/client/client.js.map +1 -1
  32. package/dist/client/context-manager.d.ts +1 -1
  33. package/dist/client/logger.d.ts +1 -0
  34. package/dist/client/logger.js +12 -15
  35. package/dist/client/logger.js.map +1 -1
  36. package/dist/client/visibility-manager.d.ts +22 -11
  37. package/dist/client/visibility-manager.js +258 -42
  38. package/dist/client/visibility-manager.js.map +1 -1
  39. package/dist/ejson/adjust-types-from-json-value.d.ts +1 -1
  40. package/dist/ejson/adjust-types-from-json-value.js +4 -2
  41. package/dist/ejson/adjust-types-from-json-value.js.map +1 -1
  42. package/dist/ejson/base64.d.ts +1 -1
  43. package/dist/ejson/base64.js +1 -1
  44. package/dist/ejson/base64.js.map +1 -1
  45. package/dist/ejson/built-in-converters.d.ts +59 -1
  46. package/dist/ejson/built-in-converters.js +109 -125
  47. package/dist/ejson/built-in-converters.js.map +1 -1
  48. package/dist/ejson/clone.js +1 -1
  49. package/dist/ejson/clone.js.map +1 -1
  50. package/dist/ejson/custom-models.d.ts +10 -10
  51. package/dist/ejson/custom-models.js +22 -2
  52. package/dist/ejson/custom-models.js.map +1 -1
  53. package/dist/ejson/custom-types.d.ts +2 -1
  54. package/dist/ejson/custom-types.js.map +1 -1
  55. package/dist/ejson/equals.d.ts +4 -1
  56. package/dist/ejson/equals.js +6 -3
  57. package/dist/ejson/equals.js.map +1 -1
  58. package/dist/ejson/from-json-value.d.ts +1 -1
  59. package/dist/ejson/from-json-value.js +1 -1
  60. package/dist/ejson/from-json-value.js.map +1 -1
  61. package/dist/ejson/helpers/adjust-types-to-json-value.d.ts +1 -1
  62. package/dist/ejson/helpers/adjust-types-to-json-value.js +4 -2
  63. package/dist/ejson/helpers/adjust-types-to-json-value.js.map +1 -1
  64. package/dist/ejson/helpers/from-json-value-helper.d.ts +1 -1
  65. package/dist/ejson/helpers/from-json-value-helper.js +5 -3
  66. package/dist/ejson/helpers/from-json-value-helper.js.map +1 -1
  67. package/dist/ejson/helpers/to-json-value-helper.d.ts +1 -1
  68. package/dist/ejson/helpers/to-json-value-helper.js +3 -1
  69. package/dist/ejson/helpers/to-json-value-helper.js.map +1 -1
  70. package/dist/ejson/index.d.ts +14 -12
  71. package/dist/ejson/index.js +3 -3
  72. package/dist/ejson/index.js.map +1 -1
  73. package/dist/ejson/is-binary.d.ts +1 -1
  74. package/dist/ejson/is-binary.js +1 -1
  75. package/dist/ejson/is-binary.js.map +1 -1
  76. package/dist/ejson/parse.d.ts +1 -1
  77. package/dist/ejson/parse.js +1 -1
  78. package/dist/ejson/parse.js.map +1 -1
  79. package/dist/ejson/stable-stringify.d.ts +1 -6
  80. package/dist/ejson/stable-stringify.js +3 -1
  81. package/dist/ejson/stable-stringify.js.map +1 -1
  82. package/dist/ejson/to-json-value.d.ts +1 -1
  83. package/dist/ejson/to-json-value.js +1 -1
  84. package/dist/ejson/to-json-value.js.map +1 -1
  85. package/dist/ejson/utils.d.ts +15 -13
  86. package/dist/ejson/utils.js +39 -37
  87. package/dist/ejson/utils.js.map +1 -1
  88. package/dist/minimongo/NOTICE.md +30 -0
  89. package/dist/minimongo/README.md +329 -0
  90. package/dist/minimongo/components.d.ts +31 -0
  91. package/dist/minimongo/components.js +53 -0
  92. package/dist/minimongo/components.js.map +1 -0
  93. package/dist/minimongo/contracts.type-test.d.ts +1 -0
  94. package/dist/minimongo/contracts.type-test.js +21 -0
  95. package/dist/minimongo/contracts.type-test.js.map +1 -0
  96. package/dist/minimongo/cursor.d.ts +67 -0
  97. package/dist/minimongo/cursor.js +157 -0
  98. package/dist/minimongo/cursor.js.map +1 -0
  99. package/dist/minimongo/document-store.d.ts +31 -0
  100. package/dist/minimongo/document-store.js +48 -0
  101. package/dist/minimongo/document-store.js.map +1 -0
  102. package/dist/minimongo/errors.d.ts +14 -0
  103. package/dist/minimongo/errors.js +16 -0
  104. package/dist/minimongo/errors.js.map +1 -0
  105. package/dist/minimongo/events.d.ts +20 -0
  106. package/dist/minimongo/events.js +80 -0
  107. package/dist/minimongo/events.js.map +1 -0
  108. package/dist/minimongo/identity.d.ts +8 -0
  109. package/dist/minimongo/identity.js +15 -0
  110. package/dist/minimongo/identity.js.map +1 -0
  111. package/dist/minimongo/immutable.d.ts +6 -0
  112. package/dist/minimongo/immutable.js +17 -0
  113. package/dist/minimongo/immutable.js.map +1 -0
  114. package/dist/minimongo/index.d.ts +7 -0
  115. package/dist/minimongo/index.js +6 -0
  116. package/dist/minimongo/index.js.map +1 -0
  117. package/dist/minimongo/local-collection.d.ts +48 -0
  118. package/dist/minimongo/local-collection.js +129 -0
  119. package/dist/minimongo/local-collection.js.map +1 -0
  120. package/dist/minimongo/matcher.d.ts +27 -0
  121. package/dist/minimongo/matcher.js +457 -0
  122. package/dist/minimongo/matcher.js.map +1 -0
  123. package/dist/minimongo/modifier.d.ts +12 -0
  124. package/dist/minimongo/modifier.js +323 -0
  125. package/dist/minimongo/modifier.js.map +1 -0
  126. package/dist/minimongo/path.d.ts +17 -0
  127. package/dist/minimongo/path.js +126 -0
  128. package/dist/minimongo/path.js.map +1 -0
  129. package/dist/minimongo/projection.d.ts +5 -0
  130. package/dist/minimongo/projection.js +100 -0
  131. package/dist/minimongo/projection.js.map +1 -0
  132. package/dist/minimongo/sorter.d.ts +16 -0
  133. package/dist/minimongo/sorter.js +140 -0
  134. package/dist/minimongo/sorter.js.map +1 -0
  135. package/dist/minimongo/transform.d.ts +4 -0
  136. package/dist/minimongo/transform.js +30 -0
  137. package/dist/minimongo/transform.js.map +1 -0
  138. package/dist/minimongo/types.d.ts +169 -0
  139. package/dist/minimongo/types.js +2 -0
  140. package/dist/minimongo/types.js.map +1 -0
  141. package/dist/minimongo/value-semantics.d.ts +8 -0
  142. package/dist/minimongo/value-semantics.js +156 -0
  143. package/dist/minimongo/value-semantics.js.map +1 -0
  144. package/dist/mongodb/change-streams.js +14 -8
  145. package/dist/mongodb/change-streams.js.map +1 -1
  146. package/dist/mongodb/decorators/collection.js +4 -1
  147. package/dist/mongodb/decorators/collection.js.map +1 -1
  148. package/dist/mongodb/decorators/metadata.js +1 -1
  149. package/dist/mongodb/decorators/metadata.js.map +1 -1
  150. package/dist/mongodb/find-one-or-create.d.ts +2 -2
  151. package/dist/mongodb/find-one-or-create.js +1 -1
  152. package/dist/mongodb/find-one-or-create.js.map +1 -1
  153. package/dist/mongodb/live/engine.js.map +1 -1
  154. package/dist/mongodb/live/source.js +11 -5
  155. package/dist/mongodb/live/source.js.map +1 -1
  156. package/dist/mongodb/live/types.d.ts +1 -1
  157. package/dist/react/components/client-provider.d.ts +3 -2
  158. package/dist/react/components/client-provider.js +1 -1
  159. package/dist/react/components/client-provider.js.map +1 -1
  160. package/dist/react/contracts.type-test.d.ts +1 -0
  161. package/dist/react/contracts.type-test.js +21 -0
  162. package/dist/react/contracts.type-test.js.map +1 -0
  163. package/dist/react/hooks/use-auth.d.ts +5 -1
  164. package/dist/react/hooks/use-auth.js +4 -2
  165. package/dist/react/hooks/use-auth.js.map +1 -1
  166. package/dist/react/hooks/use-caller.d.ts +10 -5
  167. package/dist/react/hooks/use-caller.js +12 -8
  168. package/dist/react/hooks/use-caller.js.map +1 -1
  169. package/dist/react/hooks/use-channel.d.ts +1 -1
  170. package/dist/react/hooks/use-channel.js +1 -1
  171. package/dist/react/hooks/use-channel.js.map +1 -1
  172. package/dist/react/hooks/use-circuit-breaker.d.ts +14 -6
  173. package/dist/react/hooks/use-circuit-breaker.js +5 -2
  174. package/dist/react/hooks/use-circuit-breaker.js.map +1 -1
  175. package/dist/react/hooks/use-client.d.ts +1 -1
  176. package/dist/react/hooks/use-client.js +2 -0
  177. package/dist/react/hooks/use-client.js.map +1 -1
  178. package/dist/react/hooks/use-connection-state.d.ts +4 -4
  179. package/dist/react/hooks/use-connection-state.js +2 -0
  180. package/dist/react/hooks/use-connection-state.js.map +1 -1
  181. package/dist/react/hooks/use-deps-change.d.ts +1 -1
  182. package/dist/react/hooks/use-deps-change.js.map +1 -1
  183. package/dist/react/hooks/use-local-event.d.ts +2 -2
  184. package/dist/react/hooks/use-local-event.js +2 -2
  185. package/dist/react/hooks/use-local-event.js.map +1 -1
  186. package/dist/react/hooks/use-method-refresh.d.ts +24 -15
  187. package/dist/react/hooks/use-method-refresh.js +18 -22
  188. package/dist/react/hooks/use-method-refresh.js.map +1 -1
  189. package/dist/react/hooks/use-method.d.ts +12 -11
  190. package/dist/react/hooks/use-method.js +9 -5
  191. package/dist/react/hooks/use-method.js.map +1 -1
  192. package/dist/react/hooks/use-mongodb-live-publication.js +2 -0
  193. package/dist/react/hooks/use-mongodb-live-publication.js.map +1 -1
  194. package/dist/react/hooks/use-object.d.ts +2 -2
  195. package/dist/react/hooks/use-object.js.map +1 -1
  196. package/dist/react/hooks/use-subscribe.d.ts +1 -2
  197. package/dist/react/hooks/use-subscribe.js +11 -9
  198. package/dist/react/hooks/use-subscribe.js.map +1 -1
  199. package/dist/react/hooks/use-throttled-events.d.ts +1 -1
  200. package/dist/react/hooks/use-throttled-events.js +2 -0
  201. package/dist/react/hooks/use-throttled-events.js.map +1 -1
  202. package/dist/react/hooks/use-token-refresh.js +1 -1
  203. package/dist/react/hooks/use-token-refresh.js.map +1 -1
  204. package/dist/server/client-node.d.ts +17 -10
  205. package/dist/server/client-node.js +16 -13
  206. package/dist/server/client-node.js.map +1 -1
  207. package/dist/server/decorators/register.js +10 -6
  208. package/dist/server/decorators/register.js.map +1 -1
  209. package/dist/server/method.d.ts +1 -1
  210. package/dist/server/method.js +9 -6
  211. package/dist/server/method.js.map +1 -1
  212. package/dist/server/methods.js +2 -1
  213. package/dist/server/methods.js.map +1 -1
  214. package/dist/server/server-channel.d.ts +4 -2
  215. package/dist/server/server-channel.js +33 -20
  216. package/dist/server/server-channel.js.map +1 -1
  217. package/dist/server/server.d.ts +25 -12
  218. package/dist/server/server.js +18 -17
  219. package/dist/server/server.js.map +1 -1
  220. package/dist/server/transports/node-hono-transport.d.ts +4 -4
  221. package/dist/server/transports/node-hono-transport.js +66 -14
  222. package/dist/server/transports/node-hono-transport.js.map +1 -1
  223. package/dist/server/transports/redis-transport.d.ts +5 -4
  224. package/dist/server/transports/redis-transport.js +9 -4
  225. package/dist/server/transports/redis-transport.js.map +1 -1
  226. package/dist/server/transports/websocket-transport.d.ts +1 -1
  227. package/dist/server/transports/websocket-transport.js +6 -1
  228. package/dist/server/transports/websocket-transport.js.map +1 -1
  229. package/dist/server/transports/ws-shared.d.ts +2 -1
  230. package/dist/server/transports/ws-shared.js +4 -1
  231. package/dist/server/transports/ws-shared.js.map +1 -1
  232. package/dist/utils/errors.d.ts +1 -1
  233. package/dist/utils/errors.js.map +1 -1
  234. package/dist/utils/event-emitter.d.ts +1 -1
  235. package/dist/utils/event-emitter.js.map +1 -1
  236. package/dist/utils/events.d.ts +4 -4
  237. package/dist/utils/events.js.map +1 -1
  238. package/dist/utils/helpers.d.ts +4 -4
  239. package/dist/utils/helpers.js +4 -3
  240. package/dist/utils/helpers.js.map +1 -1
  241. package/dist/utils/intercept.d.ts +1 -2
  242. package/dist/utils/intercept.js.map +1 -1
  243. package/dist/utils/iterator.d.ts +6 -8
  244. package/dist/utils/iterator.js +3 -3
  245. package/dist/utils/iterator.js.map +1 -1
  246. package/dist/utils/presentation.d.ts +1 -1
  247. package/dist/utils/presentation.js +2 -0
  248. package/dist/utils/presentation.js.map +1 -1
  249. package/dist/utils/promise.d.ts +5 -5
  250. package/dist/utils/promise.js +2 -2
  251. package/dist/utils/promise.js.map +1 -1
  252. package/package.json +9 -2
@@ -0,0 +1,323 @@
1
+ import { LocalCollectionError as LocalCollectionError } from './errors.js';
2
+ import { Matcher } from './matcher.js';
3
+ import { isNumericKey, isOperatorObject, isPlainObject, setPath } from './path.js';
4
+ import { Sorter } from './sorter.js';
5
+ import { localValueSemantics } from './value-semantics.js';
6
+ const INVALID_FIELD_NAME_MESSAGES = {
7
+ dollar: "start with '$'",
8
+ dot: "start or end with '.'",
9
+ doubleDot: 'contain consecutive dots',
10
+ nullByte: 'contain null bytes',
11
+ };
12
+ function invalidFieldNameReason(key) {
13
+ if (key.startsWith('$'))
14
+ return INVALID_FIELD_NAME_MESSAGES.dollar;
15
+ if (key.startsWith('.') || key.endsWith('.'))
16
+ return INVALID_FIELD_NAME_MESSAGES.dot;
17
+ if (key.includes('..'))
18
+ return INVALID_FIELD_NAME_MESSAGES.doubleDot;
19
+ if (key.includes('\0'))
20
+ return INVALID_FIELD_NAME_MESSAGES.nullByte;
21
+ return undefined;
22
+ }
23
+ export function assertValidFieldNames(value) {
24
+ if (Array.isArray(value)) {
25
+ value.forEach(assertValidFieldNames);
26
+ return;
27
+ }
28
+ if (!isPlainObject(value))
29
+ return;
30
+ for (const [key, child] of Object.entries(value)) {
31
+ const reason = invalidFieldNameReason(key);
32
+ if (reason)
33
+ throw new LocalCollectionError(`Key ${key} must not ${reason}`);
34
+ assertValidFieldNames(child);
35
+ }
36
+ }
37
+ function modificationTarget(document, path, options) {
38
+ const parts = path.split('.');
39
+ const field = parts.pop();
40
+ if (!field)
41
+ throw new LocalCollectionError('Invalid empty update path', { field: path });
42
+ const positional = [...(options.arrayIndices ?? [])].filter(value => value !== 'x');
43
+ let current = document;
44
+ for (let index = 0; index < parts.length; index += 1) {
45
+ let part = parts[index];
46
+ if (part === '$') {
47
+ const position = positional.shift();
48
+ if (position === undefined) {
49
+ throw new LocalCollectionError('The positional operator did not find the match needed from the query', { field: path });
50
+ }
51
+ part = String(position);
52
+ }
53
+ if (options.forbidArray && Array.isArray(current)) {
54
+ throw new LocalCollectionError('The source field cannot be an array element', { field: path });
55
+ }
56
+ const existing = Reflect.get(current, part);
57
+ if (isPlainObject(existing) || Array.isArray(existing)) {
58
+ current = existing;
59
+ continue;
60
+ }
61
+ if (existing !== undefined && existing !== null) {
62
+ throw new LocalCollectionError('Cannot set property on non-object field', {
63
+ field: path,
64
+ setPropertyError: true,
65
+ });
66
+ }
67
+ if (options.noCreate)
68
+ return { parent: undefined, field };
69
+ const next = parts[index + 1];
70
+ const child = next !== undefined && isNumericKey(next) ? [] : {};
71
+ Reflect.set(current, part, child);
72
+ current = child;
73
+ }
74
+ if (field === '$') {
75
+ const position = positional.shift();
76
+ if (position === undefined) {
77
+ throw new LocalCollectionError('The positional operator did not find the match needed from the query', { field: path });
78
+ }
79
+ return { parent: current, field: String(position) };
80
+ }
81
+ return { parent: current, field };
82
+ }
83
+ function readField(target) {
84
+ return target.parent ? Reflect.get(target.parent, target.field) : undefined;
85
+ }
86
+ function writeField(target, value) {
87
+ if (target.parent)
88
+ Reflect.set(target.parent, target.field, value);
89
+ }
90
+ function removeField(target) {
91
+ if (!target.parent)
92
+ return;
93
+ if (Array.isArray(target.parent) && isNumericKey(target.field)) {
94
+ target.parent[Number(target.field)] = null;
95
+ }
96
+ else {
97
+ Reflect.deleteProperty(target.parent, target.field);
98
+ }
99
+ }
100
+ function applyPush(target, argument, values) {
101
+ let current = readField(target);
102
+ if (current === undefined) {
103
+ current = [];
104
+ writeField(target, current);
105
+ }
106
+ if (!Array.isArray(current))
107
+ throw new LocalCollectionError('Cannot apply $push modifier to non-array', { field: target.field });
108
+ if (!isPlainObject(argument) || !Object.hasOwn(argument, '$each')) {
109
+ assertValidFieldNames(argument);
110
+ current.push(argument);
111
+ return;
112
+ }
113
+ const each = argument.$each;
114
+ if (!Array.isArray(each))
115
+ throw new LocalCollectionError('$each must be an array', { field: target.field });
116
+ assertValidFieldNames(each);
117
+ const position = argument.$position === undefined ? current.length : argument.$position;
118
+ if (typeof position !== 'number')
119
+ throw new LocalCollectionError('$position must be a numeric value', { field: target.field });
120
+ if (position < 0)
121
+ throw new LocalCollectionError('$position in $push must be zero or positive', { field: target.field });
122
+ current.splice(position, 0, ...each);
123
+ if (argument.$sort !== undefined) {
124
+ if (argument.$slice === undefined)
125
+ throw new LocalCollectionError('$sort requires $slice to be present', { field: target.field });
126
+ if (each.some(element => !isPlainObject(element))) {
127
+ throw new LocalCollectionError('$push like modifiers using $sort require all elements to be objects', { field: target.field });
128
+ }
129
+ current.sort(new Sorter(argument.$sort, undefined, values).getComparator());
130
+ }
131
+ if (argument.$slice !== undefined) {
132
+ if (typeof argument.$slice !== 'number')
133
+ throw new LocalCollectionError('$slice must be a numeric value', { field: target.field });
134
+ const sliced = argument.$slice === 0
135
+ ? []
136
+ : argument.$slice < 0
137
+ ? current.slice(argument.$slice)
138
+ : current.slice(0, argument.$slice);
139
+ writeField(target, sliced);
140
+ }
141
+ }
142
+ function pullMatches(value, argument, values) {
143
+ if (isPlainObject(argument)) {
144
+ return new Matcher({ value: argument }, true, undefined, values)
145
+ .documentMatches({ value }).result;
146
+ }
147
+ return values.equals(value, argument, { keyOrderSensitive: true });
148
+ }
149
+ function applyModifierOperator(document, operator, path, argument, options, values) {
150
+ if (operator === '$setOnInsert' && !options.isInsert)
151
+ return;
152
+ const actualOperator = operator === '$setOnInsert' ? '$set' : operator;
153
+ const noCreate = ['$unset', '$pop', '$pull', '$pullAll'].includes(actualOperator);
154
+ const target = modificationTarget(document, path, {
155
+ ...(options.arrayIndices ? { arrayIndices: options.arrayIndices } : {}),
156
+ noCreate,
157
+ forbidArray: actualOperator === '$rename',
158
+ });
159
+ const current = readField(target);
160
+ if (actualOperator === '$set') {
161
+ assertValidFieldNames(argument);
162
+ writeField(target, argument);
163
+ }
164
+ else if (actualOperator === '$unset') {
165
+ removeField(target);
166
+ }
167
+ else if (actualOperator === '$inc' || actualOperator === '$mul'
168
+ || actualOperator === '$min' || actualOperator === '$max') {
169
+ if (typeof argument !== 'number')
170
+ throw new LocalCollectionError(`Modifier ${actualOperator} allowed for numbers only`, { field: path });
171
+ if (current !== undefined && typeof current !== 'number') {
172
+ throw new LocalCollectionError(`Cannot apply ${actualOperator} modifier to non-number`, { field: path });
173
+ }
174
+ const numericCurrent = current;
175
+ if (actualOperator === '$inc')
176
+ writeField(target, numericCurrent === undefined ? argument : numericCurrent + argument);
177
+ if (actualOperator === '$mul')
178
+ writeField(target, numericCurrent === undefined ? 0 : numericCurrent * argument);
179
+ if (actualOperator === '$min' && (numericCurrent === undefined || numericCurrent > argument))
180
+ writeField(target, argument);
181
+ if (actualOperator === '$max' && (numericCurrent === undefined || numericCurrent < argument))
182
+ writeField(target, argument);
183
+ }
184
+ else if (actualOperator === '$currentDate') {
185
+ if (argument !== true && (!isPlainObject(argument) || argument.$type !== 'date')) {
186
+ throw new LocalCollectionError('Invalid $currentDate modifier', { field: path });
187
+ }
188
+ writeField(target, options.now?.() ?? new Date());
189
+ }
190
+ else if (actualOperator === '$rename') {
191
+ if (typeof argument !== 'string')
192
+ throw new LocalCollectionError('$rename target must be a string', { field: path });
193
+ if (path === argument)
194
+ throw new LocalCollectionError('$rename source must differ from target', { field: path });
195
+ if (argument.includes('\0'))
196
+ throw new LocalCollectionError('The \'to\' field for $rename cannot contain an embedded null byte', { field: path });
197
+ if (current !== undefined) {
198
+ removeField(target);
199
+ const destination = modificationTarget(document, argument, { forbidArray: true });
200
+ writeField(destination, current);
201
+ }
202
+ }
203
+ else if (actualOperator === '$push') {
204
+ applyPush(target, argument, values);
205
+ }
206
+ else if (actualOperator === '$pushAll') {
207
+ if (!Array.isArray(argument))
208
+ throw new LocalCollectionError('Modifier $pushAll/pullAll allowed for arrays only');
209
+ if (current === undefined)
210
+ writeField(target, argument);
211
+ else if (!Array.isArray(current))
212
+ throw new LocalCollectionError('Cannot apply $pushAll modifier to non-array', { field: path });
213
+ else
214
+ current.push(...argument);
215
+ }
216
+ else if (actualOperator === '$addToSet') {
217
+ const items = isPlainObject(argument) && Array.isArray(argument.$each) ? argument.$each : [argument];
218
+ if (current === undefined)
219
+ writeField(target, items);
220
+ else if (!Array.isArray(current))
221
+ throw new LocalCollectionError('Cannot apply $addToSet modifier to non-array', { field: path });
222
+ else
223
+ for (const item of items) {
224
+ if (!current.some(value => values.equals(value, item, { keyOrderSensitive: true })))
225
+ current.push(item);
226
+ }
227
+ }
228
+ else if (actualOperator === '$pop') {
229
+ if (current === undefined)
230
+ return;
231
+ if (!Array.isArray(current))
232
+ throw new LocalCollectionError('Cannot apply $pop modifier to non-array', { field: path });
233
+ if (typeof argument === 'number' && argument < 0)
234
+ current.splice(0, 1);
235
+ else
236
+ current.pop();
237
+ }
238
+ else if (actualOperator === '$pull' || actualOperator === '$pullAll') {
239
+ if (current === undefined)
240
+ return;
241
+ if (!Array.isArray(current))
242
+ throw new LocalCollectionError('Cannot apply $pull/pullAll modifier to non-array', { field: path });
243
+ const argumentsToPull = actualOperator === '$pullAll'
244
+ ? Array.isArray(argument) ? argument : undefined
245
+ : [argument];
246
+ if (!argumentsToPull)
247
+ throw new LocalCollectionError('Modifier $pushAll/pullAll allowed for arrays only');
248
+ writeField(target, current.filter(value => !argumentsToPull.some(item => pullMatches(value, item, values))));
249
+ }
250
+ else if (actualOperator === '$bit') {
251
+ throw new LocalCollectionError('$bit is not supported', { field: path });
252
+ }
253
+ else if (actualOperator !== '$v') {
254
+ throw new LocalCollectionError(`Invalid modifier specified ${actualOperator}`);
255
+ }
256
+ }
257
+ /** Mutates one working document using TypeFerry's supported replacement or operators. */
258
+ export function modifyDocument(document, modifier, options = {}, values = localValueSemantics) {
259
+ if (!isPlainObject(modifier))
260
+ throw new LocalCollectionError('Modifier must be an object');
261
+ const cloned = values.clone(modifier);
262
+ const keys = Object.keys(cloned);
263
+ const operatorKeys = keys.filter(key => key.startsWith('$'));
264
+ if (operatorKeys.length > 0 && operatorKeys.length !== keys.length) {
265
+ throw new Error('Update parameter cannot have both modifier and non-modifier fields.');
266
+ }
267
+ if (operatorKeys.length === 0) {
268
+ assertValidFieldNames(cloned);
269
+ const id = document['_id'];
270
+ if (Object.hasOwn(cloned, '_id') && !values.equals(cloned._id, id)) {
271
+ throw new LocalCollectionError('Cannot change the _id of a document');
272
+ }
273
+ for (const key of Object.keys(document))
274
+ delete document[key];
275
+ Object.assign(document, cloned);
276
+ if (id !== undefined)
277
+ Reflect.set(document, '_id', id);
278
+ return;
279
+ }
280
+ for (const operator of operatorKeys) {
281
+ const fields = cloned[operator];
282
+ if (!isPlainObject(fields))
283
+ throw new LocalCollectionError(`Modifier ${operator}'s argument must be an object`);
284
+ for (const [path, argument] of Object.entries(fields)) {
285
+ if (path === '_id' || path.startsWith('_id.'))
286
+ throw new LocalCollectionError('Mod on _id not allowed');
287
+ applyModifierOperator(document, operator, path, argument, options, values);
288
+ }
289
+ }
290
+ }
291
+ /** Creates the base document used by a local collection upsert. */
292
+ export function createUpsertDocument(selector, modifier, values = localValueSemantics) {
293
+ const document = {};
294
+ if (typeof selector === 'string') {
295
+ document._id = selector;
296
+ }
297
+ else if (isPlainObject(selector)) {
298
+ const populate = (value) => {
299
+ for (const [path, fieldValue] of Object.entries(value)) {
300
+ if (path === '$and' && Array.isArray(fieldValue)) {
301
+ for (const entry of fieldValue)
302
+ if (isPlainObject(entry))
303
+ populate(entry);
304
+ }
305
+ else if (path === '$or' && Array.isArray(fieldValue) && fieldValue.length === 1) {
306
+ const [entry] = fieldValue;
307
+ if (isPlainObject(entry))
308
+ populate(entry);
309
+ }
310
+ else if (!path.startsWith('$')) {
311
+ if (isPlainObject(fieldValue) && Object.hasOwn(fieldValue, '$eq'))
312
+ setPath(document, path, values.clone(fieldValue.$eq));
313
+ else if (!isOperatorObject(fieldValue))
314
+ setPath(document, path, values.clone(fieldValue));
315
+ }
316
+ }
317
+ };
318
+ populate(selector);
319
+ }
320
+ modifyDocument(document, modifier, { isInsert: true }, values);
321
+ return document;
322
+ }
323
+ //# sourceMappingURL=modifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modifier.js","sourceRoot":"","sources":["../../src/minimongo/modifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface ValueBranch {
2
+ readonly value: unknown;
3
+ readonly dontIterate?: boolean;
4
+ readonly arrayIndices?: readonly (number | 'x')[];
5
+ }
6
+ export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
7
+ export declare function isNumericKey(value: string): boolean;
8
+ export declare function isOperatorObject(value: unknown): value is Record<string, unknown>;
9
+ export declare function lookupBranches(document: unknown, path: string, options?: {
10
+ readonly forSort?: boolean;
11
+ }): ValueBranch[];
12
+ export declare function expandArrays(branches: readonly ValueBranch[], options?: {
13
+ readonly skipArrays?: boolean;
14
+ }): ValueBranch[];
15
+ export declare function getPath(document: unknown, path: string): unknown;
16
+ export declare function setPath(document: Record<string, unknown>, path: string, value: unknown): void;
17
+ export declare function deletePath(document: Record<string, unknown>, path: string): void;
@@ -0,0 +1,126 @@
1
+ export function isPlainObject(value) {
2
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
3
+ return false;
4
+ const prototype = Object.getPrototypeOf(value);
5
+ return prototype === Object.prototype || prototype === null;
6
+ }
7
+ export function isNumericKey(value) {
8
+ return /^[0-9]+$/.test(value);
9
+ }
10
+ export function isOperatorObject(value) {
11
+ if (!isPlainObject(value))
12
+ return false;
13
+ let operatorState;
14
+ for (const key of Object.keys(value)) {
15
+ const isOperator = key.startsWith('$') || key === 'diff';
16
+ if (operatorState !== undefined && operatorState !== isOperator) {
17
+ throw new Error(`Inconsistent operator: ${JSON.stringify(value)}`);
18
+ }
19
+ operatorState = isOperator;
20
+ }
21
+ return operatorState ?? false;
22
+ }
23
+ function branchAt(current, parts, arrayIndices, forSort = false) {
24
+ const [part, ...rest] = parts;
25
+ const branch = (value) => ({
26
+ value,
27
+ ...(arrayIndices ? { arrayIndices } : {}),
28
+ });
29
+ if (part === undefined)
30
+ return [branch(current)];
31
+ if (!isPlainObject(current) && !Array.isArray(current))
32
+ return [branch(undefined)];
33
+ if (Array.isArray(current)) {
34
+ if (!isNumericKey(part) || Number(part) >= current.length)
35
+ return [];
36
+ const index = Number(part);
37
+ const nextIndices = [...(arrayIndices ?? []), index, 'x'];
38
+ const value = current[index];
39
+ if (rest.length === 0) {
40
+ return [{ value, arrayIndices: nextIndices, dontIterate: Array.isArray(value) }];
41
+ }
42
+ return branchAt(value, rest, nextIndices, forSort);
43
+ }
44
+ const value = current[part];
45
+ if (rest.length === 0)
46
+ return [branch(value)];
47
+ if (!isPlainObject(value) && !Array.isArray(value))
48
+ return [branch(undefined)];
49
+ const results = branchAt(value, rest, arrayIndices, forSort);
50
+ if (Array.isArray(value) && !(forSort && isNumericKey(rest[0] ?? ''))) {
51
+ value.forEach((element, index) => {
52
+ if (isPlainObject(element)) {
53
+ results.push(...branchAt(element, rest, [...(arrayIndices ?? []), index], forSort));
54
+ }
55
+ });
56
+ }
57
+ return results;
58
+ }
59
+ export function lookupBranches(document, path, options = {}) {
60
+ return branchAt(document, path.split('.'), undefined, options.forSort);
61
+ }
62
+ export function expandArrays(branches, options = {}) {
63
+ const result = [];
64
+ for (const branch of branches) {
65
+ const isArray = Array.isArray(branch.value);
66
+ if (!(options.skipArrays && isArray && !branch.dontIterate))
67
+ result.push(branch);
68
+ if (isArray && !branch.dontIterate) {
69
+ branch.value.forEach((value, index) => {
70
+ result.push({
71
+ value,
72
+ arrayIndices: [...(branch.arrayIndices ?? []), index],
73
+ });
74
+ });
75
+ }
76
+ }
77
+ return result;
78
+ }
79
+ export function getPath(document, path) {
80
+ let current = document;
81
+ for (const part of path.split('.')) {
82
+ if (!isPlainObject(current) && !Array.isArray(current))
83
+ return undefined;
84
+ current = Reflect.get(current, part);
85
+ }
86
+ return current;
87
+ }
88
+ export function setPath(document, path, value) {
89
+ const parts = path.split('.');
90
+ const finalPart = parts.pop();
91
+ if (!finalPart)
92
+ return;
93
+ let current = document;
94
+ for (const part of parts) {
95
+ const existing = current[part];
96
+ if (isPlainObject(existing)) {
97
+ current = existing;
98
+ }
99
+ else {
100
+ const child = {};
101
+ current[part] = child;
102
+ current = child;
103
+ }
104
+ }
105
+ current[finalPart] = value;
106
+ }
107
+ export function deletePath(document, path) {
108
+ const parts = path.split('.');
109
+ const finalPart = parts.pop();
110
+ if (!finalPart)
111
+ return;
112
+ let current = document;
113
+ for (const part of parts) {
114
+ if (!isPlainObject(current) && !Array.isArray(current))
115
+ return;
116
+ current = Reflect.get(current, part);
117
+ }
118
+ if (Array.isArray(current) && isNumericKey(finalPart)) {
119
+ if (Number(finalPart) in current)
120
+ current[Number(finalPart)] = null;
121
+ }
122
+ else if (isPlainObject(current)) {
123
+ delete current[finalPart];
124
+ }
125
+ }
126
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/minimongo/path.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACrF,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAkB,CAAA;IAE/D,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAEvC,IAAI,aAAkC,CAAA;IACtC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,MAAM,CAAA;QACxD,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,UAAU,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACpE,CAAC;QACD,aAAa,GAAG,UAAU,CAAA;IAC5B,CAAC;IAED,OAAO,aAAa,IAAI,KAAK,CAAA;AAC/B,CAAC;AAED,SAAS,QAAQ,CACf,OAAgB,EAChB,KAAwB,EACxB,YAAwC,EACxC,OAAO,GAAG,KAAK;IAEf,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAA;IAC7B,MAAM,MAAM,GAAG,CAAC,KAAc,EAAe,EAAE,CAAC,CAAC;QAC/C,KAAK;QACL,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC,CAAA;IAEF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IAChD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;IAElF,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,EAAE,CAAA;QACpE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAC1B,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAY,CAAC,CAAA;QAClE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;QAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAClF,CAAC;QAED,OAAO,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;IACpD,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC7C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;IAE9E,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAA;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACtE,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YAC/B,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;YACrF,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,QAAiB,EACjB,IAAY,EACZ,UAA0C,EAAE;IAE5C,OAAO,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAgC,EAChC,UAA6C,EAAE;IAE/C,MAAM,MAAM,GAAkB,EAAE,CAAA;IAChC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3C,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAChF,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACpC,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK;oBACL,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;iBACtD,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,QAAiB,EAAE,IAAY;IACrD,IAAI,OAAO,GAAG,QAAQ,CAAA;IACtB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,SAAS,CAAA;QACxE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAY,CAAA;IACjD,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,QAAiC,EAAE,IAAY,EAAE,KAAc;IACrF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,CAAA;IAC7B,IAAI,CAAC,SAAS;QAAE,OAAM;IAEtB,IAAI,OAAO,GAA4B,QAAQ,CAAA;IAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9B,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,GAAG,QAAQ,CAAA;QACpB,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAA4B,EAAE,CAAA;YACzC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;YACrB,OAAO,GAAG,KAAK,CAAA;QACjB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,SAAS,CAAC,GAAG,KAAK,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAiC,EAAE,IAAY;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,CAAA;IAC7B,IAAI,CAAC,SAAS;QAAE,OAAM;IAEtB,IAAI,OAAO,GAAY,QAAQ,CAAA;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAM;QAC9D,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAY,CAAA;IACjD,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;QACtD,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,OAAO;YAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAA;IACrE,CAAC;SAAM,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,SAAS,CAAC,CAAA;IAC3B,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Projection } from './types.js';
2
+ import { type ValueSemantics } from './value-semantics.js';
3
+ export type ProjectionFunction<TDocument extends object> = (document: TDocument) => TDocument;
4
+ /** Compiles inclusion or exclusion field projections with local-store validation. */
5
+ export declare function compileProjection<TDocument extends object>(projection?: Projection<TDocument> | Record<string, unknown>, values?: ValueSemantics): ProjectionFunction<TDocument>;
@@ -0,0 +1,100 @@
1
+ import { LocalCollectionError as LocalCollectionError } from './errors.js';
2
+ import { isPlainObject } from './path.js';
3
+ import { localValueSemantics } from './value-semantics.js';
4
+ function projectionDetails(projection) {
5
+ let paths = Object.keys(projection).sort();
6
+ if (!(paths.length === 1 && paths[0] === '_id')
7
+ && !(paths.includes('_id') && projection['_id'])) {
8
+ paths = paths.filter(path => path !== '_id');
9
+ }
10
+ const including = paths.length > 0 ? Boolean(projection[paths[0]]) : false;
11
+ const tree = {};
12
+ for (const path of paths) {
13
+ const rule = Boolean(projection[path]);
14
+ if (rule !== including) {
15
+ throw new LocalCollectionError('You cannot currently mix including and excluding fields.');
16
+ }
17
+ const parts = path.split('.');
18
+ let node = tree;
19
+ for (let index = 0; index < parts.length; index += 1) {
20
+ const part = parts[index];
21
+ const final = index === parts.length - 1;
22
+ const existing = node[part];
23
+ if (existing !== undefined) {
24
+ if (final || typeof existing === 'boolean') {
25
+ const existingPath = parts.slice(0, index + 1).join('.');
26
+ throw new LocalCollectionError(`both ${existingPath} and ${path} found in fields option, using both of them may trigger unexpected behavior. Did you mean to use only one of them?`);
27
+ }
28
+ node = existing;
29
+ continue;
30
+ }
31
+ if (final) {
32
+ node[part] = including;
33
+ }
34
+ else {
35
+ const child = {};
36
+ node[part] = child;
37
+ node = child;
38
+ }
39
+ }
40
+ }
41
+ return { including, tree };
42
+ }
43
+ function applyRuleTree(value, tree, including, values) {
44
+ if (Array.isArray(value)) {
45
+ return value.map(element => applyRuleTree(element, tree, including, values));
46
+ }
47
+ if (value === null || value === undefined)
48
+ return value;
49
+ const result = including
50
+ ? {}
51
+ : isPlainObject(value)
52
+ ? values.clone(value)
53
+ : {};
54
+ for (const [field, rule] of Object.entries(tree)) {
55
+ if (!isPlainObject(value) || !Object.hasOwn(value, field))
56
+ continue;
57
+ if (typeof rule === 'object') {
58
+ const child = value[field];
59
+ if (typeof child === 'object' && child !== null) {
60
+ result[field] = applyRuleTree(child, rule, including, values);
61
+ }
62
+ }
63
+ else if (including) {
64
+ result[field] = values.clone(value[field]);
65
+ }
66
+ else {
67
+ Reflect.deleteProperty(result, field);
68
+ }
69
+ }
70
+ return result;
71
+ }
72
+ /** Compiles inclusion or exclusion field projections with local-store validation. */
73
+ export function compileProjection(projection = {}, values = localValueSemantics) {
74
+ if (!isPlainObject(projection))
75
+ throw new LocalCollectionError('fields option must be an object');
76
+ for (const [path, value] of Object.entries(projection)) {
77
+ if (path.split('.').includes('$')) {
78
+ throw new LocalCollectionError('Local collections do not support $ operators in projections.');
79
+ }
80
+ if (isPlainObject(value) && ['$elemMatch', '$meta', '$slice'].some(key => Object.hasOwn(value, key))) {
81
+ throw new LocalCollectionError('Local collections do not support operators in projections.');
82
+ }
83
+ if (![0, 1, false, true].includes(value)) {
84
+ throw new LocalCollectionError('Projection values should be one of 1, 0, true, or false');
85
+ }
86
+ }
87
+ const idProjection = projection['_id'] === undefined || Boolean(projection['_id']);
88
+ const details = projectionDetails(projection);
89
+ return document => {
90
+ const result = applyRuleTree(document, details.tree, details.including, values);
91
+ if (idProjection && Object.hasOwn(document, '_id')) {
92
+ result['_id'] = values.clone(Reflect.get(document, '_id'));
93
+ }
94
+ else if (!idProjection) {
95
+ Reflect.deleteProperty(result, '_id');
96
+ }
97
+ return result;
98
+ };
99
+ }
100
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../src/minimongo/projection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { CollationOptions, SortSpecifier } from './types.js';
2
+ import { type ValueSemantics } from './value-semantics.js';
3
+ /** Compiles Mongo-style sort specifications into document comparators. */
4
+ export declare class Sorter<TDocument extends object = object> {
5
+ private readonly values;
6
+ private readonly parts;
7
+ private readonly functionComparator;
8
+ private readonly collator;
9
+ constructor(specifier: SortSpecifier<TDocument> | unknown, collation?: CollationOptions, values?: ValueSemantics);
10
+ getComparator(options?: {
11
+ readonly distances?: ReadonlyMap<unknown, number>;
12
+ }): (left: TDocument, right: TDocument) => number;
13
+ _getPaths(): readonly string[];
14
+ private documentKey;
15
+ private compareKeys;
16
+ }