shelving 1.17.3 → 1.18.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.
Files changed (403) hide show
  1. package/api/Resource.d.ts +10 -5
  2. package/api/Resource.js +13 -5
  3. package/api/errors.d.ts +2 -1
  4. package/api/errors.js +1 -1
  5. package/db/Change.d.ts +24 -38
  6. package/db/Change.js +38 -48
  7. package/db/Database.d.ts +167 -19
  8. package/db/Database.js +257 -15
  9. package/db/Pagination.d.ts +26 -0
  10. package/db/Pagination.js +63 -0
  11. package/db/errors.d.ts +17 -11
  12. package/db/errors.js +17 -9
  13. package/db/index.d.ts +1 -10
  14. package/db/index.js +1 -13
  15. package/error/AssertionError.d.ts +9 -0
  16. package/error/AssertionError.js +13 -0
  17. package/error/PermissionError.d.ts +4 -0
  18. package/error/PermissionError.js +7 -0
  19. package/error/RequiredError.d.ts +4 -0
  20. package/error/RequiredError.js +7 -0
  21. package/error/UnsupportedError.d.ts +4 -0
  22. package/error/UnsupportedError.js +7 -0
  23. package/error/ValidationError.d.ts +6 -0
  24. package/error/ValidationError.js +8 -0
  25. package/error/index.d.ts +5 -0
  26. package/error/index.js +5 -0
  27. package/feedback/ErrorFeedback.d.ts +4 -0
  28. package/feedback/ErrorFeedback.js +4 -0
  29. package/{util/feedback.d.ts → feedback/Feedback.d.ts} +1 -30
  30. package/{util/feedback.js → feedback/Feedback.js} +2 -30
  31. package/feedback/InvalidFeedback.d.ts +4 -0
  32. package/feedback/InvalidFeedback.js +4 -0
  33. package/feedback/SuccessFeedback.d.ts +4 -0
  34. package/feedback/SuccessFeedback.js +4 -0
  35. package/feedback/WarningFeedback.d.ts +4 -0
  36. package/feedback/WarningFeedback.js +4 -0
  37. package/feedback/hydrations.d.ts +13 -0
  38. package/feedback/hydrations.js +14 -0
  39. package/feedback/index.d.ts +7 -0
  40. package/feedback/index.js +7 -0
  41. package/feedback/util.d.ts +3 -0
  42. package/feedback/util.js +7 -0
  43. package/firestore/client/FirestoreClientProvider.d.ts +19 -0
  44. package/firestore/client/FirestoreClientProvider.js +121 -0
  45. package/{firestore-client → firestore/client}/index.d.ts +0 -0
  46. package/{firestore-client → firestore/client}/index.js +0 -0
  47. package/firestore/lite/FirestoreLiteProvider.d.ts +19 -0
  48. package/firestore/lite/FirestoreLiteProvider.js +121 -0
  49. package/{firestore-lite → firestore/lite}/index.d.ts +0 -0
  50. package/{firestore-lite → firestore/lite}/index.js +0 -0
  51. package/firestore/server/FirestoreServerProvider.d.ts +17 -0
  52. package/firestore/server/FirestoreServerProvider.js +129 -0
  53. package/{firestore-server → firestore/server}/index.d.ts +0 -0
  54. package/{firestore-server → firestore/server}/index.js +0 -0
  55. package/index.d.ts +4 -0
  56. package/index.js +4 -3
  57. package/markup/helpers.d.ts +1 -1
  58. package/markup/helpers.js +3 -3
  59. package/markup/render.js +2 -2
  60. package/markup/rules.d.ts +2 -59
  61. package/markup/rules.js +17 -27
  62. package/markup/types.d.ts +3 -3
  63. package/package.json +23 -18
  64. package/{db → provider}/BatchProvider.d.ts +7 -9
  65. package/{db → provider}/BatchProvider.js +18 -18
  66. package/provider/CacheProvider.d.ts +31 -0
  67. package/{db → provider}/CacheProvider.js +31 -48
  68. package/provider/MemoryProvider.d.ts +23 -0
  69. package/provider/MemoryProvider.js +135 -0
  70. package/provider/Provider.d.ts +93 -0
  71. package/provider/Provider.js +3 -0
  72. package/provider/ThroughProvider.d.ts +20 -0
  73. package/provider/ThroughProvider.js +40 -0
  74. package/provider/ValidationProvider.d.ts +14 -0
  75. package/provider/ValidationProvider.js +46 -0
  76. package/provider/index.d.ts +6 -0
  77. package/provider/index.js +6 -0
  78. package/query/Filter.d.ts +35 -11
  79. package/query/Filter.js +38 -40
  80. package/query/Filters.d.ts +12 -19
  81. package/query/Filters.js +17 -47
  82. package/query/Query.d.ts +20 -57
  83. package/query/Query.js +55 -101
  84. package/query/Rule.d.ts +3 -12
  85. package/query/Rule.js +0 -10
  86. package/query/Rules.d.ts +11 -17
  87. package/query/Rules.js +14 -34
  88. package/query/Sort.d.ts +18 -16
  89. package/query/Sort.js +15 -38
  90. package/query/Sorts.d.ts +6 -9
  91. package/query/Sorts.js +9 -33
  92. package/query/helpers.d.ts +3 -2
  93. package/query/index.d.ts +0 -1
  94. package/query/index.js +0 -1
  95. package/query/types.d.ts +46 -19
  96. package/react/index.d.ts +4 -3
  97. package/react/index.js +4 -3
  98. package/react/useData.d.ts +36 -0
  99. package/react/useData.js +9 -0
  100. package/react/useFetch.d.ts +2 -2
  101. package/react/useFetch.js +21 -12
  102. package/react/usePagination.d.ts +2 -2
  103. package/react/usePagination.js +11 -7
  104. package/react/{useDocuments.d.ts → useQuery.d.ts} +10 -10
  105. package/react/{useDocuments.js → useQuery.js} +15 -15
  106. package/react/useResult.d.ts +34 -0
  107. package/react/{useDocument.js → useResult.js} +14 -21
  108. package/react/useState.d.ts +3 -8
  109. package/react/useState.js +12 -30
  110. package/react/useSubscribe.d.ts +10 -0
  111. package/react/useSubscribe.js +17 -0
  112. package/schema/AllowedSchema.d.ts +17 -0
  113. package/schema/AllowedSchema.js +28 -0
  114. package/schema/ArraySchema.d.ts +12 -19
  115. package/schema/ArraySchema.js +17 -62
  116. package/schema/BooleanSchema.d.ts +9 -16
  117. package/schema/BooleanSchema.js +6 -18
  118. package/schema/ColorSchema.d.ts +7 -16
  119. package/schema/ColorSchema.js +9 -13
  120. package/schema/DataSchema.d.ts +17 -0
  121. package/schema/DataSchema.js +21 -0
  122. package/schema/DateSchema.d.ts +17 -23
  123. package/schema/DateSchema.js +18 -33
  124. package/schema/EmailSchema.d.ts +8 -11
  125. package/schema/EmailSchema.js +10 -9
  126. package/schema/KeySchema.d.ts +7 -12
  127. package/schema/KeySchema.js +7 -6
  128. package/schema/MapSchema.d.ts +15 -27
  129. package/schema/MapSchema.js +16 -61
  130. package/schema/NullableSchema.d.ts +13 -0
  131. package/schema/NullableSchema.js +16 -0
  132. package/schema/NumberSchema.d.ts +15 -34
  133. package/schema/NumberSchema.js +18 -53
  134. package/schema/ObjectSchema.d.ts +18 -26
  135. package/schema/ObjectSchema.js +21 -63
  136. package/schema/PhoneSchema.d.ts +5 -13
  137. package/schema/PhoneSchema.js +5 -9
  138. package/schema/RequiredSchema.d.ts +8 -0
  139. package/schema/RequiredSchema.js +13 -0
  140. package/schema/Schema.d.ts +11 -32
  141. package/schema/Schema.js +1 -17
  142. package/schema/StringSchema.d.ts +19 -34
  143. package/schema/StringSchema.js +21 -55
  144. package/schema/ThroughSchema.d.ts +11 -0
  145. package/schema/ThroughSchema.js +19 -0
  146. package/schema/UrlSchema.d.ts +10 -13
  147. package/schema/UrlSchema.js +16 -36
  148. package/schema/index.d.ts +5 -0
  149. package/schema/index.js +5 -0
  150. package/stream/AbstractState.d.ts +35 -0
  151. package/stream/AbstractState.js +84 -0
  152. package/stream/AbstractStream.d.ts +66 -0
  153. package/stream/AbstractStream.js +123 -0
  154. package/stream/ArrayState.d.ts +3 -3
  155. package/stream/ArrayState.js +3 -7
  156. package/stream/DataState.d.ts +9 -0
  157. package/stream/DataState.js +13 -0
  158. package/stream/DeriveStream.d.ts +9 -17
  159. package/stream/DeriveStream.js +21 -35
  160. package/stream/LastStream.d.ts +5 -0
  161. package/stream/LastStream.js +11 -0
  162. package/stream/LazyState.d.ts +2 -2
  163. package/stream/LazyState.js +4 -4
  164. package/stream/LazyStream.js +6 -7
  165. package/stream/LimitStream.d.ts +6 -0
  166. package/stream/LimitStream.js +15 -4
  167. package/stream/State.d.ts +19 -68
  168. package/stream/State.js +22 -112
  169. package/stream/Stream.d.ts +11 -78
  170. package/stream/Stream.js +11 -135
  171. package/stream/ValidateStream.d.ts +8 -0
  172. package/stream/ValidateStream.js +18 -0
  173. package/stream/errors.d.ts +2 -14
  174. package/stream/errors.js +3 -17
  175. package/stream/index.d.ts +6 -4
  176. package/stream/index.js +6 -4
  177. package/test/basics.d.ts +23 -0
  178. package/test/basics.js +27 -0
  179. package/test/index.d.ts +18 -1
  180. package/test/index.js +9 -1
  181. package/test/people.d.ts +22 -0
  182. package/test/people.js +17 -0
  183. package/test/util.d.ts +7 -0
  184. package/test/util.js +49 -0
  185. package/transform/AddEntriesTransform.d.ts +10 -0
  186. package/transform/AddEntriesTransform.js +16 -0
  187. package/transform/AddItemsTransform.d.ts +10 -0
  188. package/transform/AddItemsTransform.js +16 -0
  189. package/transform/DataTransform.d.ts +24 -0
  190. package/transform/DataTransform.js +24 -0
  191. package/transform/IncrementTransform.d.ts +12 -0
  192. package/transform/IncrementTransform.js +16 -0
  193. package/transform/RemoveEntriesTransform.d.ts +10 -0
  194. package/transform/RemoveEntriesTransform.js +16 -0
  195. package/transform/RemoveItemsTransform.d.ts +10 -0
  196. package/transform/RemoveItemsTransform.js +16 -0
  197. package/transform/Transform.d.ts +9 -0
  198. package/transform/Transform.js +6 -0
  199. package/transform/hydrations.d.ts +15 -0
  200. package/transform/hydrations.js +16 -0
  201. package/transform/index.d.ts +9 -0
  202. package/transform/index.js +9 -0
  203. package/transform/util.d.ts +7 -0
  204. package/transform/util.js +42 -0
  205. package/util/array.d.ts +20 -94
  206. package/util/array.js +45 -117
  207. package/util/assert.d.ts +19 -5
  208. package/util/assert.js +38 -7
  209. package/util/class.d.ts +15 -20
  210. package/util/class.js +20 -20
  211. package/util/clone.d.ts +6 -4
  212. package/util/clone.js +20 -11
  213. package/util/constants.d.ts +3 -3
  214. package/util/constants.js +3 -3
  215. package/util/data.d.ts +23 -19
  216. package/util/data.js +16 -10
  217. package/util/date.d.ts +22 -27
  218. package/util/date.js +56 -57
  219. package/util/derive.d.ts +91 -0
  220. package/util/derive.js +56 -0
  221. package/util/diff.d.ts +12 -11
  222. package/util/diff.js +11 -11
  223. package/util/dispatch.d.ts +18 -110
  224. package/util/dispatch.js +38 -102
  225. package/util/entry.d.ts +24 -51
  226. package/util/entry.js +10 -10
  227. package/util/equal.d.ts +9 -3
  228. package/util/equal.js +20 -6
  229. package/util/error.d.ts +8 -27
  230. package/util/error.js +3 -42
  231. package/util/filter.d.ts +59 -28
  232. package/util/filter.js +61 -21
  233. package/util/function.d.ts +4 -34
  234. package/util/function.js +0 -4
  235. package/util/{hydration.d.ts → hydrate.d.ts} +17 -5
  236. package/util/hydrate.js +67 -0
  237. package/util/index.d.ts +5 -5
  238. package/util/index.js +5 -5
  239. package/util/iterable.d.ts +77 -0
  240. package/util/iterable.js +141 -0
  241. package/util/lazy.d.ts +21 -0
  242. package/util/lazy.js +5 -0
  243. package/util/map.d.ts +21 -0
  244. package/util/map.js +10 -0
  245. package/util/merge.d.ts +4 -4
  246. package/util/null.d.ts +4 -2
  247. package/util/null.js +4 -2
  248. package/util/number.d.ts +1 -1
  249. package/util/number.js +2 -2
  250. package/util/object.d.ts +92 -224
  251. package/util/object.js +58 -184
  252. package/util/observable.d.ts +24 -17
  253. package/util/observable.js +53 -6
  254. package/util/promise.d.ts +3 -4
  255. package/util/search.d.ts +58 -8
  256. package/util/search.js +73 -57
  257. package/util/serialise.js +1 -1
  258. package/util/sort.d.ts +55 -22
  259. package/util/sort.js +135 -27
  260. package/util/string.d.ts +17 -19
  261. package/util/string.js +40 -31
  262. package/util/template.d.ts +1 -1
  263. package/util/template.js +1 -1
  264. package/util/undefined.d.ts +7 -2
  265. package/util/undefined.js +7 -2
  266. package/util/url.d.ts +8 -2
  267. package/util/url.js +22 -4
  268. package/util/validate.d.ts +53 -10
  269. package/util/validate.js +95 -1
  270. package/db/CacheProvider.d.ts +0 -37
  271. package/db/Document.d.ts +0 -100
  272. package/db/Document.js +0 -121
  273. package/db/Documents.d.ts +0 -148
  274. package/db/Documents.js +0 -215
  275. package/db/MemoryProvider.d.ts +0 -30
  276. package/db/MemoryProvider.js +0 -164
  277. package/db/MemoryProvider.test.d.ts +0 -1
  278. package/db/MemoryProvider.test.js +0 -306
  279. package/db/PaginationState.d.ts +0 -33
  280. package/db/PaginationState.js +0 -94
  281. package/db/Provider.d.ts +0 -134
  282. package/db/Provider.js +0 -1
  283. package/db/Reference.d.ts +0 -17
  284. package/db/Reference.js +0 -34
  285. package/db/ThroughProvider.d.ts +0 -24
  286. package/db/ThroughProvider.js +0 -52
  287. package/db/ValidationProvider.d.ts +0 -21
  288. package/db/ValidationProvider.js +0 -129
  289. package/firestore-client/FirestoreClientProvider.d.ts +0 -23
  290. package/firestore-client/FirestoreClientProvider.js +0 -129
  291. package/firestore-lite/FirestoreLiteProvider.d.ts +0 -23
  292. package/firestore-lite/FirestoreLiteProvider.js +0 -129
  293. package/firestore-server/FirestoreServerProvider.d.ts +0 -21
  294. package/firestore-server/FirestoreServerProvider.js +0 -156
  295. package/markup/helpers.test.d.ts +0 -1
  296. package/markup/helpers.test.js +0 -42
  297. package/markup/render.test.d.ts +0 -1
  298. package/markup/render.test.js +0 -544
  299. package/markup/types.test.d.ts +0 -1
  300. package/markup/types.test.js +0 -8
  301. package/query/Filter.test.d.ts +0 -1
  302. package/query/Filter.test.js +0 -69
  303. package/query/Filters.test.d.ts +0 -1
  304. package/query/Filters.test.js +0 -6
  305. package/query/Query.test.d.ts +0 -1
  306. package/query/Query.test.js +0 -100
  307. package/query/Slice.d.ts +0 -8
  308. package/query/Slice.js +0 -18
  309. package/query/Slice.test.d.ts +0 -1
  310. package/query/Slice.test.js +0 -15
  311. package/query/Sort.test.d.ts +0 -1
  312. package/query/Sort.test.js +0 -39
  313. package/query/Sorts.test.d.ts +0 -1
  314. package/query/Sorts.test.js +0 -28
  315. package/react/useDocument.d.ts +0 -69
  316. package/react/useObserve.d.ts +0 -8
  317. package/react/useObserve.js +0 -15
  318. package/schema/ArraySchema.test.d.ts +0 -1
  319. package/schema/ArraySchema.test.js +0 -168
  320. package/schema/BooleanSchema.test.d.ts +0 -1
  321. package/schema/BooleanSchema.test.js +0 -99
  322. package/schema/ColorSchema.test.d.ts +0 -1
  323. package/schema/ColorSchema.test.js +0 -105
  324. package/schema/DateSchema.test.d.ts +0 -1
  325. package/schema/DateSchema.test.js +0 -138
  326. package/schema/EmailSchema.test.d.ts +0 -1
  327. package/schema/EmailSchema.test.js +0 -153
  328. package/schema/KeySchema.test.d.ts +0 -1
  329. package/schema/KeySchema.test.js +0 -96
  330. package/schema/MapSchema.test.d.ts +0 -1
  331. package/schema/MapSchema.test.js +0 -141
  332. package/schema/NumberSchema.test.d.ts +0 -1
  333. package/schema/NumberSchema.test.js +0 -229
  334. package/schema/ObjectSchema.test.d.ts +0 -1
  335. package/schema/ObjectSchema.test.js +0 -194
  336. package/schema/PhoneSchema.test.d.ts +0 -1
  337. package/schema/PhoneSchema.test.js +0 -105
  338. package/schema/StringSchema.test.d.ts +0 -1
  339. package/schema/StringSchema.test.js +0 -189
  340. package/schema/UrlSchema.test.d.ts +0 -1
  341. package/schema/UrlSchema.test.js +0 -270
  342. package/stream/ArrayState.test.d.ts +0 -1
  343. package/stream/ArrayState.test.js +0 -31
  344. package/stream/MapState.d.ts +0 -13
  345. package/stream/MapState.js +0 -25
  346. package/stream/SliceStream.d.ts +0 -8
  347. package/stream/SliceStream.js +0 -15
  348. package/stream/State.test.d.ts +0 -1
  349. package/stream/State.test.js +0 -162
  350. package/stream/Stream.test.d.ts +0 -1
  351. package/stream/Stream.test.js +0 -124
  352. package/stream/util.d.ts +0 -6
  353. package/stream/util.js +0 -10
  354. package/test/db.d.ts +0 -128
  355. package/test/db.js +0 -39
  356. package/tsconfig.build.tsbuildinfo +0 -1
  357. package/util/array.test.d.ts +0 -1
  358. package/util/array.test.js +0 -139
  359. package/util/class.test.d.ts +0 -1
  360. package/util/class.test.js +0 -15
  361. package/util/compare.d.ts +0 -11
  362. package/util/compare.js +0 -76
  363. package/util/compare.test.d.ts +0 -1
  364. package/util/compare.test.js +0 -59
  365. package/util/console.d.ts +0 -5
  366. package/util/console.js +0 -4
  367. package/util/date.test.d.ts +0 -1
  368. package/util/date.test.js +0 -80
  369. package/util/diff.test.d.ts +0 -1
  370. package/util/diff.test.js +0 -160
  371. package/util/equal.test.d.ts +0 -1
  372. package/util/equal.test.js +0 -208
  373. package/util/feedback.test.d.ts +0 -1
  374. package/util/feedback.test.js +0 -33
  375. package/util/filter.test.d.ts +0 -1
  376. package/util/filter.test.js +0 -45
  377. package/util/hydration.js +0 -49
  378. package/util/hydration.test.d.ts +0 -1
  379. package/util/hydration.test.js +0 -93
  380. package/util/merge.test.d.ts +0 -1
  381. package/util/merge.test.js +0 -183
  382. package/util/number.test.d.ts +0 -1
  383. package/util/number.test.js +0 -86
  384. package/util/object.test.d.ts +0 -1
  385. package/util/object.test.js +0 -154
  386. package/util/promise.test.d.ts +0 -1
  387. package/util/promise.test.js +0 -11
  388. package/util/random.test.d.ts +0 -1
  389. package/util/random.test.js +0 -20
  390. package/util/search.test.d.ts +0 -1
  391. package/util/search.test.js +0 -87
  392. package/util/serialise.test.d.ts +0 -1
  393. package/util/serialise.test.js +0 -32
  394. package/util/sort.test.d.ts +0 -1
  395. package/util/sort.test.js +0 -101
  396. package/util/string.test.d.ts +0 -1
  397. package/util/string.test.js +0 -88
  398. package/util/template.test.d.ts +0 -1
  399. package/util/template.test.js +0 -125
  400. package/util/transform.d.ts +0 -87
  401. package/util/transform.js +0 -109
  402. package/util/units.test.d.ts +0 -1
  403. package/util/units.test.js +0 -67
package/api/Resource.d.ts CHANGED
@@ -1,27 +1,32 @@
1
- import { Validator } from "../util/index.js";
1
+ import { Validator, Validatable } from "../util/index.js";
2
2
  /**
3
3
  * An abstract API resource definition, used to specify types for e.g. serverless functions..
4
4
  *
5
5
  * @param payload The `Validator` the payload must conform to (defaults to `undefined` if not specified).
6
6
  * @param returns The `Validator` the function's returned value must conform to (defaults to `undefined` if not specified).
7
7
  */
8
- export declare class Resource<P = unknown, R = unknown> implements Validator<R> {
8
+ export declare class Resource<P = unknown, R = void> implements Validatable<R> {
9
9
  static create<X, Y>(payload: Validator<X>, result: Validator<Y>): Resource<X, Y>;
10
10
  static create<Y>(payload: undefined, result: Y): Resource<undefined, Y>;
11
- static create<X>(payload: Validator<X>, result?: undefined): Resource<X, undefined>;
12
- static create(payload?: undefined, result?: undefined): Resource<undefined, undefined>;
11
+ static create<X>(payload: Validator<X>, result?: undefined): Resource<X, void>;
12
+ static create(payload?: undefined, result?: undefined): Resource<undefined, void>;
13
13
  /** Payload validator. */
14
14
  readonly payload: Validator<P>;
15
15
  /** Result validator. */
16
16
  readonly result: Validator<R>;
17
17
  protected constructor(payload: Validator<P>, result: Validator<R>);
18
+ /**
19
+ * Validate a payload for this resource.
20
+ *
21
+ */
22
+ validatePayload(unsafePayload: unknown): P;
18
23
  /**
19
24
  * Validate a result for this resource.
20
25
  *
21
26
  * @returns The validated payload for this resource.
22
27
  * @throws ValidationError if the result could not be validated.
23
28
  */
24
- validate(result: unknown): R;
29
+ validate(unsafeResult: unknown): R;
25
30
  }
26
31
  /** Extract the payload type from a `Resource`. */
27
32
  export declare type PayloadType<X extends Resource> = X extends Resource<infer Y, unknown> ? Y : never;
package/api/Resource.js CHANGED
@@ -1,7 +1,8 @@
1
- import { Feedback } from "../util/index.js";
1
+ import { UNDEFINED, validate } from "../util/index.js";
2
+ import { Feedback, throwFeedback } from "../feedback/index.js";
2
3
  import { ResourceValidationError } from "./errors.js";
3
- /** Validator that always returns undefined. */
4
- const UNDEFINED_VALIDATOR = { validate: () => undefined };
4
+ /** Validator that always returns void/undefined. */
5
+ const UNDEFINED_VALIDATOR = UNDEFINED;
5
6
  /**
6
7
  * An abstract API resource definition, used to specify types for e.g. serverless functions..
7
8
  *
@@ -17,15 +18,22 @@ export class Resource {
17
18
  static create(payload = UNDEFINED_VALIDATOR, result = UNDEFINED_VALIDATOR) {
18
19
  return new Resource(payload, result);
19
20
  }
21
+ /**
22
+ * Validate a payload for this resource.
23
+ *
24
+ */
25
+ validatePayload(unsafePayload) {
26
+ return throwFeedback(validate(unsafePayload, this.payload));
27
+ }
20
28
  /**
21
29
  * Validate a result for this resource.
22
30
  *
23
31
  * @returns The validated payload for this resource.
24
32
  * @throws ValidationError if the result could not be validated.
25
33
  */
26
- validate(result) {
34
+ validate(unsafeResult) {
27
35
  try {
28
- return this.result.validate(result);
36
+ return validate(unsafeResult, this.result);
29
37
  }
30
38
  catch (thrown) {
31
39
  throw thrown instanceof Feedback ? new ResourceValidationError(this, thrown) : thrown;
package/api/errors.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { Feedback, ValidationError } from "../util/index.js";
1
+ import { Feedback } from "../feedback/index.js";
2
+ import { ValidationError } from "../error/index.js";
2
3
  import type { Resource } from "./Resource.js";
3
4
  /** Thrown if an API `Resource` can't validate. */
4
5
  export declare class ResourceValidationError<P, R> extends ValidationError {
package/api/errors.js CHANGED
@@ -1,4 +1,4 @@
1
- import { ValidationError } from "../util/index.js";
1
+ import { ValidationError } from "../error/index.js";
2
2
  /** Thrown if an API `Resource` can't validate. */
3
3
  export class ResourceValidationError extends ValidationError {
4
4
  constructor(resource, feedback) {
package/db/Change.d.ts CHANGED
@@ -1,53 +1,39 @@
1
- import type { Datas, ImmutableArray, Transforms } from "../util/index.js";
2
- import type { Database } from "./Database.js";
1
+ import { Transforms, Transform } from "../transform/index.js";
2
+ import { Datas, ImmutableArray, Key } from "../util/index.js";
3
+ import type { Database, DatabaseDocument } from "./Database.js";
3
4
  /** A single change that can be made to a database. */
4
5
  export declare abstract class Change<T extends Datas> {
5
6
  /** Apply this change to a database. */
6
7
  abstract apply(db: Database<T>): void | Promise<void>;
7
8
  }
8
- /** A change that sets the entire data of a document in a database. */
9
- export declare class SetChange<T extends Datas, K extends keyof T & string> extends Change<T> {
10
- readonly collection: K;
9
+ /** A change that writes a document in a database. */
10
+ export declare class Write<D extends Datas, C extends Key<D>> extends Change<D> {
11
+ static on<X extends Datas, Y extends Key<X>>({ collection, id }: DatabaseDocument<X, Y>, value: X[Y] | Transform<X[Y]> | undefined): Write<X, Y>;
12
+ readonly collection: C;
11
13
  readonly id: string;
12
- readonly data: T[K];
13
- constructor(collection: K, id: string, data: T[K]);
14
- apply(db: Database<T>): void | Promise<void>;
15
- }
16
- /** A change that updates the value of a document in a database. */
17
- export declare class UpdateChange<T extends Datas, K extends keyof T & string> extends Change<T> {
18
- readonly collection: K;
19
- readonly id: string;
20
- readonly transforms: Transforms<T[K]>;
21
- constructor(collection: K, id: string, transforms: Transforms<T[K]>);
22
- apply(db: Database<T>): void | Promise<void>;
23
- }
24
- /** A change that deletes a document from a database. */
25
- export declare class DeleteChange<T extends Datas, K extends keyof T & string> extends Change<T> {
26
- readonly collection: K;
27
- readonly id: string;
28
- constructor(collection: K, id: string);
29
- apply(db: Database<T>): void | Promise<void>;
14
+ readonly value: D[C] | Transform<D[C]> | undefined;
15
+ constructor(collection: C, id: string, value: D[C] | Transform<D[C]> | undefined);
16
+ apply(db: Database<D>): void | Promise<void>;
30
17
  }
31
18
  /**
32
- * Set of changes that can be applied to documents in a database.
19
+ * Set of writes that can be applied to documents in a database.
33
20
  * - Sets of changes are predictable and repeatable, so unpredictable operations like `create()` and query operations are not supported.
34
21
  * - Every change must be applied to a specific database document in a specific collection.
35
22
  */
36
- export declare class Changes<T extends Datas> extends Change<T> {
37
- readonly changes: ImmutableArray<Change<T>>;
38
- constructor(...changes: ImmutableArray<Change<T>>);
39
- /** Return a new `Changes` instance with an additional `SetChange` instance in its changes list. */
40
- set<K extends keyof T & string>(collection: K, id: string, data: T[K]): this;
41
- /** Return a new `Changes` instance with an additional `UpdateChange` instance in its changes list. */
42
- update<K extends keyof T & string>(collection: K, id: string, transforms: Transforms<T[K]>): this;
43
- /** Return a new `Changes` instance with an additional `DeleteChange` instance in its changes list. */
44
- delete<K extends keyof T & string>(collection: K, id: string): this;
45
- apply(db: Database<T>): Promise<void>;
23
+ export declare class Writes<D extends Datas> extends Change<D> {
24
+ static on<X extends Datas>(db: Database<X>, ...changes: ImmutableArray<Change<X>>): Writes<X>;
25
+ readonly changes: ImmutableArray<Change<D>>;
26
+ constructor(...changes: ImmutableArray<Change<D>>);
27
+ /** Return a new `Changes` instance with an additional `Write` instance in its changes list. */
28
+ set<C extends Key<D>>({ collection, id }: DatabaseDocument<D, C>, data: D[C]): this;
29
+ /** Return a new `Changes` instance with an additional `Write` instance in its changes list. */
30
+ delete<C extends Key<D>>({ collection, id }: DatabaseDocument<D, C>): this;
31
+ /** Return a new `Changes` instance with an additional `Write` instance in its changes list. */
32
+ update<C extends Key<D>>({ collection, id }: DatabaseDocument<D, C>, transforms: Transforms<D[C]> | Transform<D[C]>): this;
33
+ apply(db: Database<D>): Promise<void> | undefined;
46
34
  }
47
35
  /** Set of hydrations for all change classes. */
48
36
  export declare const CHANGE_HYDRATIONS: {
49
- changes: typeof Changes;
50
- set: typeof SetChange;
51
- update: typeof UpdateChange;
52
- delete: typeof DeleteChange;
37
+ writes: typeof Writes;
38
+ write: typeof Write;
53
39
  };
package/db/Change.js CHANGED
@@ -1,76 +1,66 @@
1
+ import { DataTransform, Transform } from "../transform/index.js";
2
+ import { VOID, isAsync } from "../util/index.js";
1
3
  /** A single change that can be made to a database. */
2
4
  export class Change {
3
5
  }
4
- /** A change that sets the entire data of a document in a database. */
5
- export class SetChange extends Change {
6
- constructor(collection, id, data) {
6
+ /** A change that writes a document in a database. */
7
+ export class Write extends Change {
8
+ constructor(collection, id, value) {
7
9
  super();
8
10
  this.collection = collection;
9
11
  this.id = id;
10
- this.data = data;
12
+ this.value = value;
11
13
  }
12
- apply(db) {
13
- // Use an update query (rather than `document.update()` so there's no error thrown if the document doesn't exist).
14
- return db.docs(this.collection).is("id", this.id).set(this.data);
15
- }
16
- }
17
- /** A change that updates the value of a document in a database. */
18
- export class UpdateChange extends Change {
19
- constructor(collection, id, transforms) {
20
- super();
21
- this.collection = collection;
22
- this.id = id;
23
- this.transforms = transforms;
14
+ static on({ collection, id }, value) {
15
+ return new Write(collection, id, value);
24
16
  }
25
17
  apply(db) {
26
- return db.doc(this.collection, this.id).update(this.transforms);
27
- }
28
- }
29
- /** A change that deletes a document from a database. */
30
- export class DeleteChange extends Change {
31
- constructor(collection, id) {
32
- super();
33
- this.collection = collection;
34
- this.id = id;
35
- }
36
- apply(db) {
37
- return db.doc(this.collection, this.id).delete();
18
+ return db.doc(this.collection, this.id).write(this.value);
38
19
  }
39
20
  }
40
21
  /**
41
- * Set of changes that can be applied to documents in a database.
22
+ * Set of writes that can be applied to documents in a database.
42
23
  * - Sets of changes are predictable and repeatable, so unpredictable operations like `create()` and query operations are not supported.
43
24
  * - Every change must be applied to a specific database document in a specific collection.
44
25
  */
45
- export class Changes extends Change {
26
+ export class Writes extends Change {
46
27
  constructor(...changes) {
47
28
  super();
48
29
  this.changes = changes;
49
30
  }
50
- /** Return a new `Changes` instance with an additional `SetChange` instance in its changes list. */
51
- set(collection, id, data) {
52
- return { __proto__: Changes.prototype, ...this, changes: [...this.changes, new SetChange(collection, id, data)] };
31
+ static on(db, ...changes) {
32
+ return new Writes(...changes);
33
+ }
34
+ /** Return a new `Changes` instance with an additional `Write` instance in its changes list. */
35
+ set({ collection, id }, data) {
36
+ return { __proto__: Object.getPrototypeOf(this), ...this, changes: [...this.changes, new Write(collection, id, data)] };
53
37
  }
54
- /** Return a new `Changes` instance with an additional `UpdateChange` instance in its changes list. */
55
- update(collection, id, transforms) {
56
- return { __proto__: Changes.prototype, ...this, changes: [...this.changes, new UpdateChange(collection, id, transforms)] };
38
+ /** Return a new `Changes` instance with an additional `Write` instance in its changes list. */
39
+ delete({ collection, id }) {
40
+ return { __proto__: Object.getPrototypeOf(this), ...this, changes: [...this.changes, new Write(collection, id, undefined)] };
57
41
  }
58
- /** Return a new `Changes` instance with an additional `DeleteChange` instance in its changes list. */
59
- delete(collection, id) {
60
- return { __proto__: Changes.prototype, ...this, changes: [...this.changes, new DeleteChange(collection, id)] };
42
+ /** Return a new `Changes` instance with an additional `Write` instance in its changes list. */
43
+ update({ collection, id }, transforms) {
44
+ return {
45
+ __proto__: Object.getPrototypeOf(this),
46
+ ...this,
47
+ changes: [...this.changes, new Write(collection, id, transforms instanceof Transform ? transforms : new DataTransform(transforms))],
48
+ };
61
49
  }
62
- async apply(db) {
63
- const changes = [];
64
- for (const change of this.changes)
65
- changes.push(change.apply(db));
66
- await Promise.all(changes);
50
+ apply(db) {
51
+ const promises = [];
52
+ for (const change of this.changes) {
53
+ const applied = change.apply(db);
54
+ if (isAsync(applied))
55
+ promises.push(applied);
56
+ }
57
+ if (promises.length)
58
+ return Promise.all(promises).then(VOID);
67
59
  }
68
60
  }
69
61
  /** Set of hydrations for all change classes. */
70
62
  export const CHANGE_HYDRATIONS = {
71
- changes: Changes,
72
- set: SetChange,
73
- update: UpdateChange,
74
- delete: DeleteChange,
63
+ writes: Writes,
64
+ write: Write,
75
65
  };
76
66
  CHANGE_HYDRATIONS;
package/db/Database.d.ts CHANGED
@@ -1,30 +1,178 @@
1
- import type { Datas, Validators } from "../util/index.js";
2
- import type { Provider } from "./Provider.js";
3
- import { Document } from "./Document.js";
4
- import { Documents } from "./Documents.js";
1
+ import { Dispatcher, Entry, Observable, Observer, Result, Unsubscriber, Datas, Results, Validatable, Validator, Validators, Key, Data, ImmutableMap } from "../util/index.js";
2
+ import { Transform, Transforms } from "../transform/index.js";
3
+ import type { Provider } from "../provider/Provider.js";
4
+ import { Filters, Sorts, Query } from "../query/index.js";
5
5
  /**
6
- * Database: combines a set of document and collection loci for the root level of the database, and links them to a Provider.
6
+ * Combines a database model and a provider.
7
7
  *
8
8
  * @param documents Set of loci describing named documents at the root level of the database.
9
9
  * @param collections Set of loci describing collections at the root level of the database.
10
10
  * @param provider Provider that allows data to be read/written.
11
11
  */
12
- export declare class Database<T extends Datas = Datas> {
13
- /** List of schemas validators for the collections in this database. */
14
- readonly schemas: Validators<T>;
15
- /** The provider that powers this database. */
16
- readonly provider: Provider;
17
- constructor(schemas: Validators<T>, provider: Provider);
12
+ export declare class Database<D extends Datas> {
13
+ readonly validators: Validators<D>;
14
+ readonly provider: Provider<D>;
15
+ constructor(validators: Validators<D>, provider: Provider<D>);
16
+ /** Create a query on a collection in this model. */
17
+ query<C extends Key<D>>(collection: C, filters?: Filters<D[C]>, sorts?: Sorts<D[C]>, limit?: number | null): DatabaseQuery<D, C>;
18
+ /** Reference a document in a collection in this model. */
19
+ doc<C extends Key<D>>(collection: C, id: string): DatabaseDocument<D, C>;
20
+ }
21
+ /** A documents reference within a specific database. */
22
+ export declare class DatabaseQuery<D extends Datas, C extends Key<D>> extends Query<D[C]> implements Observable<Results<D[C]>>, Validatable<Results<D[C]>>, Iterable<Entry<D[C]>> {
23
+ readonly db: Database<D>;
24
+ readonly validator: Validator<D[C]>;
25
+ readonly collection: C;
26
+ constructor(db: Database<D>, collection: C, filters?: Filters<D[C]>, sorts?: Sorts<D[C]>, limit?: number | null);
27
+ /** Reference a document in this query's collection. */
28
+ doc(id: string): DatabaseDocument<D, C>;
29
+ /**
30
+ * Create a new document with a random ID.
31
+ * - Created document is guaranteed to have a unique ID.
32
+ *
33
+ * @param data Complete data to set the document to.
34
+ * @return String ID for the created document (possibly promised).
35
+ */
36
+ add(data: D[C]): string | Promise<string>;
37
+ /**
38
+ * Get an iterable that yields the results of this entry.
39
+ * @return Map containing the results.
40
+ */
41
+ get results(): Results<D[C]> | Promise<Results<D[C]>>;
42
+ /**
43
+ * Read the results of this query into a map.
44
+ * @return Set of results in `id: data` format (possibly promised).
45
+ */
46
+ get map(): ImmutableMap<D[C]> | Promise<ImmutableMap<D[C]>>;
47
+ /**
48
+ * Count the number of results of this set of documents.
49
+ * @return Number of documents in the collection (possibly promised).
50
+ */
51
+ get count(): number | Promise<number>;
52
+ /**
53
+ * Subscribe to all matching documents.
54
+ * - `next()` is called once with the initial results, and again any time the results change.
55
+ *
56
+ * @param observer Observer with `next`, `error`, or `complete` methods that the document results are reported back to.
57
+ * @param next Callback that is called once initially and again whenever the results change.
58
+ * @param error Callback that is called if an error occurs.
59
+ * @param complete Callback that is called when the subscription is done.
60
+ *
61
+ * @return Function that ends the subscription.
62
+ */
63
+ subscribe(next: Observer<Results<D[C]>> | Dispatcher<Results<D[C]>>, error?: Dispatcher<Error | unknown>, complete?: Dispatcher<void>): Unsubscriber;
64
+ /**
65
+ * Get an entry for the first document matching this query.
66
+ * @return Entry in `[id, data]` format for the first document, or `undefined` if there are no matching documents (possibly promised).
67
+ */
68
+ get first(): Entry<D[C]> | undefined | Promise<Entry<D[C]> | undefined>;
69
+ /**
70
+ * Set all matching documents to the same exact value.
71
+ *
72
+ * @param data Complete data to set the document to.
73
+ * @return Nothing (possibly promised).
74
+ */
75
+ set(data: D[C]): void | Promise<void>;
76
+ /**
77
+ * Update all matching documents with the same partial value.
78
+ *
79
+ * @param transform `Transform` instance or set of transforms to apply to every matching document.
80
+ * - Not all transforms may be supported by all providers.
81
+ *
82
+ * @return Nothing (possibly promised).
83
+ */
84
+ update(transform: Transform<D[C]> | Transforms<D[C]>): void | Promise<void>;
85
+ /**
86
+ * Delete all matching documents.
87
+ * @return Nothing (possibly promised).
88
+ */
89
+ delete(): void | Promise<void>;
90
+ /**
91
+ * Combine `set()`, `update()`, `delete()` into a single method.
92
+ * @return Nothing (possibly promised).
93
+ */
94
+ write(value: Result<D[C]> | Transform<D[C]>): void | Promise<void>;
95
+ /** Iterate over the resuls (will throw `Promise` if the results are asynchronous). */
96
+ [Symbol.iterator](): Iterator<Entry<D[C]>, void>;
97
+ /** Validate a set of results for this query reference. */
98
+ validate(unsafeEntries: Results): Results<D[C]>;
99
+ toString(): string;
100
+ }
101
+ /** A document reference within a specific database. */
102
+ export declare class DatabaseDocument<D extends Datas, C extends Key<D>> implements Observable<Result<D[C]>>, Validatable<D[C]> {
103
+ readonly db: Database<D>;
104
+ readonly validator: Validator<D[C]>;
105
+ readonly collection: C;
106
+ readonly id: string;
107
+ constructor(db: Database<D>, collection: C, id: string);
108
+ /** Create a query on this document's collection. */
109
+ query(filters?: Filters<D[C]>, sorts?: Sorts<D[C]>, limit?: number | null): DatabaseQuery<D, C>;
110
+ /** Get an 'optional' reference to this document (uses a `ModelQuery` with an `id` filter). */
111
+ get optional(): DatabaseQuery<D, C>;
112
+ /**
113
+ * Does this document exist?
114
+ *
115
+ * @return Document's data, or `undefined` if the document doesn't exist (possibly promised).
116
+ */
117
+ get exists(): boolean | Promise<boolean>;
118
+ /**
119
+ * Get the result of this document.
120
+ *
121
+ * @return Document's data, or `undefined` if the document doesn't exist (possibly promised).
122
+ */
123
+ get result(): Result<D[C]> | Promise<Result<D[C]>>;
124
+ /**
125
+ * Get the data of this document.
126
+ * - Useful for destructuring, e.g. `{ name, title } = await documentThatMustExist.asyncData`
127
+ *
128
+ * @return Document's data (possibly promised).
129
+ * @throws RequiredError if the document's result was undefined.
130
+ */
131
+ get data(): D[C] | Promise<D[C]>;
132
+ /**
133
+ * Subscribe to the result of this document (indefinitely).
134
+ * - `next()` is called once with the initial result, and again any time the result changes.
135
+ *
136
+ * @param observer Observer with `next`, `error`, or `complete` methods.
137
+ * @param next Callback that is called once initially and again whenever the result changes.
138
+ * @param error Callback that is called if an error occurs.
139
+ * @param complete Callback that is called when the subscription is done.
140
+ *
141
+ * @return Function that ends the subscription.
142
+ */
143
+ subscribe(next: Observer<Result<D[C]>> | Dispatcher<Result<D[C]>>, error?: Dispatcher<Error | unknown>, complete?: Dispatcher<void>): Unsubscriber;
144
+ /**
145
+ * Set the complete data of this document.
146
+ *
147
+ * @param data Complete data to set the document to.
148
+ *
149
+ * @return Nothing (possibly promised).
150
+ */
151
+ set(data: D[C]): void | Promise<void>;
152
+ /**
153
+ * Update this document with partial data.
154
+ * - If the document exists, merge the partial data into it.
155
+ * - If the document doesn't exist, throw an error.
156
+ *
157
+ * @param transforms `Transform` instance or set of transforms to apply to the existing document.
158
+ * - Not all transforms may be supported by all providers.
159
+ *
160
+ * @return Nothing (possibly promised).
161
+ * @throws Error If the document does not exist (ideally a `RequiredError` but may be provider-specific).
162
+ */
163
+ update(transforms: Transform<D[C]> | Transforms<D[C]>): void | Promise<void>;
18
164
  /**
19
- * Get a `Documents` ref for a set of documents in a collection in this database.
20
- * @param name Collection name, e.g. `puppies`
21
- * @example `db.docs("dogs").doc("fido").get()`
165
+ * Delete this document.
166
+ * - Will not throw an error if the document doesn't exist.
167
+ *
168
+ * @return Nothing (possibly promised).
22
169
  */
23
- docs<C extends keyof T & string>(collection: C): Documents<T[C]>;
170
+ delete(): void | Promise<void>;
24
171
  /**
25
- * Get a `Document` ref for a document in a collection in this database.
26
- * @param name Document name, e.g. `fido`
27
- * @example `db.doc("dogs", "fido").get()`
172
+ * Combine `set()`, `update()`, `delete()` into a single method.
28
173
  */
29
- doc<C extends keyof T & string>(collection: C, id: string): Document<T[C]>;
174
+ write(value: Result<D[C]> | Transform<D[C]>): void | Promise<void>;
175
+ /** Validate data for this query reference. */
176
+ validate(unsafeData: Data): D[C];
177
+ toString(): string;
30
178
  }