@angular/fire 18.0.1 → 19.0.0-canary.a58b329

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 (264) hide show
  1. package/README.md +2 -2
  2. package/analytics/firebase.d.ts +2 -2
  3. package/analytics/screen-tracking.service.d.ts +1 -1
  4. package/auth/rxfire.d.ts +2 -2
  5. package/compat/database/database.d.ts +1 -1
  6. package/compat/firestore/firestore.d.ts +1 -1
  7. package/compat/storage/pipes/storageUrl.pipe.d.ts +2 -2
  8. package/compat/storage/storage.d.ts +1 -1
  9. package/compat/storage/storage.module.d.ts +1 -1
  10. package/database/rxfire.d.ts +4 -4
  11. package/docs/install-and-setup.md +10 -5
  12. package/docs/vertexai.md +3 -3
  13. package/fesm2022/angular-fire-analytics.mjs +12 -12
  14. package/fesm2022/angular-fire-analytics.mjs.map +1 -1
  15. package/fesm2022/angular-fire-app-check.mjs +4 -4
  16. package/fesm2022/angular-fire-app-check.mjs.map +1 -1
  17. package/fesm2022/angular-fire-app.mjs +4 -4
  18. package/fesm2022/angular-fire-app.mjs.map +1 -1
  19. package/fesm2022/angular-fire-auth-guard.mjs +7 -7
  20. package/fesm2022/angular-fire-auth-guard.mjs.map +1 -1
  21. package/fesm2022/angular-fire-auth.mjs +6 -6
  22. package/fesm2022/angular-fire-auth.mjs.map +1 -1
  23. package/fesm2022/angular-fire-compat-analytics.mjs +13 -13
  24. package/fesm2022/angular-fire-compat-analytics.mjs.map +1 -1
  25. package/fesm2022/angular-fire-compat-auth-guard.mjs +7 -7
  26. package/fesm2022/angular-fire-compat-auth-guard.mjs.map +1 -1
  27. package/fesm2022/angular-fire-compat-auth.mjs +7 -7
  28. package/fesm2022/angular-fire-compat-auth.mjs.map +1 -1
  29. package/fesm2022/angular-fire-compat-database.mjs +7 -7
  30. package/fesm2022/angular-fire-compat-database.mjs.map +1 -1
  31. package/fesm2022/angular-fire-compat-firestore.mjs +9 -9
  32. package/fesm2022/angular-fire-compat-firestore.mjs.map +1 -1
  33. package/fesm2022/angular-fire-compat-functions.mjs +7 -7
  34. package/fesm2022/angular-fire-compat-functions.mjs.map +1 -1
  35. package/fesm2022/angular-fire-compat-messaging.mjs +7 -7
  36. package/fesm2022/angular-fire-compat-messaging.mjs.map +1 -1
  37. package/fesm2022/angular-fire-compat-performance.mjs +10 -10
  38. package/fesm2022/angular-fire-compat-performance.mjs.map +1 -1
  39. package/fesm2022/angular-fire-compat-remote-config.mjs +7 -7
  40. package/fesm2022/angular-fire-compat-remote-config.mjs.map +1 -1
  41. package/fesm2022/angular-fire-compat-storage.mjs +16 -15
  42. package/fesm2022/angular-fire-compat-storage.mjs.map +1 -1
  43. package/fesm2022/angular-fire-compat.mjs +4 -4
  44. package/fesm2022/angular-fire-compat.mjs.map +1 -1
  45. package/fesm2022/angular-fire-database.mjs +8 -8
  46. package/fesm2022/angular-fire-database.mjs.map +1 -1
  47. package/fesm2022/angular-fire-firestore-lite.mjs +11 -10
  48. package/fesm2022/angular-fire-firestore-lite.mjs.map +1 -1
  49. package/fesm2022/angular-fire-firestore.mjs +14 -13
  50. package/fesm2022/angular-fire-firestore.mjs.map +1 -1
  51. package/fesm2022/angular-fire-functions.mjs +4 -4
  52. package/fesm2022/angular-fire-functions.mjs.map +1 -1
  53. package/fesm2022/angular-fire-messaging.mjs +4 -4
  54. package/fesm2022/angular-fire-messaging.mjs.map +1 -1
  55. package/fesm2022/angular-fire-performance.mjs +6 -6
  56. package/fesm2022/angular-fire-performance.mjs.map +1 -1
  57. package/fesm2022/angular-fire-remote-config.mjs +9 -9
  58. package/fesm2022/angular-fire-remote-config.mjs.map +1 -1
  59. package/fesm2022/angular-fire-storage.mjs +4 -4
  60. package/fesm2022/angular-fire-storage.mjs.map +1 -1
  61. package/fesm2022/{angular-fire-vertexai-preview.mjs → angular-fire-vertexai.mjs} +8 -8
  62. package/fesm2022/angular-fire-vertexai.mjs.map +1 -0
  63. package/fesm2022/angular-fire.mjs +37 -57
  64. package/fesm2022/angular-fire.mjs.map +1 -1
  65. package/firestore/firebase.d.ts +2 -1
  66. package/firestore/lite/firebase.d.ts +2 -1
  67. package/firestore/lite/rxfire.d.ts +4 -4
  68. package/firestore/rxfire.d.ts +7 -7
  69. package/package.json +16 -75
  70. package/performance/rxfire.d.ts +2 -2
  71. package/publish.sh +1 -0
  72. package/remote-config/rxfire.d.ts +5 -5
  73. package/schematics/add/index.js +1 -13
  74. package/schematics/deploy/actions.js +138 -394
  75. package/schematics/deploy/builder.js +139 -61
  76. package/schematics/setup/index.js +94 -64
  77. package/schematics/update/index.js +1 -7
  78. package/schematics/update/v7/index.js +1 -67
  79. package/schematics/versions.json +2 -3
  80. package/vertexai/firebase.d.ts +4 -0
  81. package/{vertexai-preview → vertexai}/index.d.ts +1 -1
  82. package/vertexai/package.json +3 -0
  83. package/{vertexai-preview → vertexai}/vertexai.d.ts +1 -1
  84. package/{vertexai-preview → vertexai}/vertexai.module.d.ts +1 -1
  85. package/zones.d.ts +3 -2
  86. package/esm2022/analytics/analytics.mjs +0 -16
  87. package/esm2022/analytics/analytics.module.mjs +0 -101
  88. package/esm2022/analytics/angular-fire-analytics.mjs +0 -5
  89. package/esm2022/analytics/firebase.mjs +0 -17
  90. package/esm2022/analytics/is-analytics-supported-factory.mjs +0 -16
  91. package/esm2022/analytics/overrides.mjs +0 -3
  92. package/esm2022/analytics/public_api.mjs +0 -6
  93. package/esm2022/analytics/screen-tracking.service.mjs +0 -148
  94. package/esm2022/analytics/user-tracking.service.mjs +0 -44
  95. package/esm2022/angular-fire.mjs +0 -5
  96. package/esm2022/app/angular-fire-app.mjs +0 -5
  97. package/esm2022/app/app.mjs +0 -15
  98. package/esm2022/app/app.module.mjs +0 -91
  99. package/esm2022/app/firebase.mjs +0 -13
  100. package/esm2022/app/public_api.mjs +0 -4
  101. package/esm2022/app-check/angular-fire-app-check.mjs +0 -5
  102. package/esm2022/app-check/app-check.mjs +0 -10
  103. package/esm2022/app-check/app-check.module.mjs +0 -80
  104. package/esm2022/app-check/firebase.mjs +0 -10
  105. package/esm2022/app-check/public_api.mjs +0 -5
  106. package/esm2022/auth/angular-fire-auth.mjs +0 -5
  107. package/esm2022/auth/auth.mjs +0 -16
  108. package/esm2022/auth/auth.module.mjs +0 -73
  109. package/esm2022/auth/firebase.mjs +0 -59
  110. package/esm2022/auth/public_api.mjs +0 -5
  111. package/esm2022/auth/rxfire.mjs +0 -7
  112. package/esm2022/auth-guard/angular-fire-auth-guard.mjs +0 -5
  113. package/esm2022/auth-guard/auth-guard.mjs +0 -53
  114. package/esm2022/auth-guard/auth-guard.module.mjs +0 -20
  115. package/esm2022/auth-guard/public_api.mjs +0 -3
  116. package/esm2022/compat/analytics/analytics.mjs +0 -160
  117. package/esm2022/compat/analytics/analytics.module.mjs +0 -35
  118. package/esm2022/compat/analytics/angular-fire-compat-analytics.mjs +0 -5
  119. package/esm2022/compat/analytics/base.mjs +0 -11
  120. package/esm2022/compat/analytics/public_api.mjs +0 -5
  121. package/esm2022/compat/analytics/screen-tracking.service.mjs +0 -49
  122. package/esm2022/compat/analytics/user-tracking.service.mjs +0 -53
  123. package/esm2022/compat/angular-fire-compat.mjs +0 -5
  124. package/esm2022/compat/auth/angular-fire-compat-auth.mjs +0 -5
  125. package/esm2022/compat/auth/auth.mjs +0 -161
  126. package/esm2022/compat/auth/auth.module.mjs +0 -20
  127. package/esm2022/compat/auth/base.mjs +0 -39
  128. package/esm2022/compat/auth/public_api.mjs +0 -4
  129. package/esm2022/compat/auth-guard/angular-fire-compat-auth-guard.mjs +0 -5
  130. package/esm2022/compat/auth-guard/auth-guard.mjs +0 -53
  131. package/esm2022/compat/auth-guard/auth-guard.module.mjs +0 -20
  132. package/esm2022/compat/auth-guard/public_api.mjs +0 -3
  133. package/esm2022/compat/cache.mjs +0 -33
  134. package/esm2022/compat/database/angular-fire-compat-database.mjs +0 -5
  135. package/esm2022/compat/database/database.mjs +0 -119
  136. package/esm2022/compat/database/database.module.mjs +0 -20
  137. package/esm2022/compat/database/interfaces.mjs +0 -2
  138. package/esm2022/compat/database/list/audit-trail.mjs +0 -47
  139. package/esm2022/compat/database/list/changes.mjs +0 -85
  140. package/esm2022/compat/database/list/create-reference.mjs +0 -44
  141. package/esm2022/compat/database/list/data-operation.mjs +0 -11
  142. package/esm2022/compat/database/list/remove.mjs +0 -16
  143. package/esm2022/compat/database/list/snapshot-changes.mjs +0 -7
  144. package/esm2022/compat/database/list/state-changes.mjs +0 -9
  145. package/esm2022/compat/database/list/utils.mjs +0 -8
  146. package/esm2022/compat/database/object/create-reference.mjs +0 -19
  147. package/esm2022/compat/database/object/snapshot-changes.mjs +0 -7
  148. package/esm2022/compat/database/observable/fromRef.mjs +0 -48
  149. package/esm2022/compat/database/public_api.mjs +0 -9
  150. package/esm2022/compat/database/utils.mjs +0 -36
  151. package/esm2022/compat/firebase.app.mjs +0 -6
  152. package/esm2022/compat/firebase.app.module.mjs +0 -71
  153. package/esm2022/compat/firestore/angular-fire-compat-firestore.mjs +0 -5
  154. package/esm2022/compat/firestore/collection/changes.mjs +0 -108
  155. package/esm2022/compat/firestore/collection/collection.mjs +0 -123
  156. package/esm2022/compat/firestore/collection-group/collection-group.mjs +0 -86
  157. package/esm2022/compat/firestore/document/document.mjs +0 -87
  158. package/esm2022/compat/firestore/firestore.mjs +0 -257
  159. package/esm2022/compat/firestore/firestore.module.mjs +0 -32
  160. package/esm2022/compat/firestore/interfaces.mjs +0 -2
  161. package/esm2022/compat/firestore/observable/fromRef.mjs +0 -40
  162. package/esm2022/compat/firestore/public_api.mjs +0 -9
  163. package/esm2022/compat/functions/angular-fire-compat-functions.mjs +0 -5
  164. package/esm2022/compat/functions/base.mjs +0 -8
  165. package/esm2022/compat/functions/functions.mjs +0 -69
  166. package/esm2022/compat/functions/functions.module.mjs +0 -20
  167. package/esm2022/compat/functions/public_api.mjs +0 -4
  168. package/esm2022/compat/messaging/angular-fire-compat-messaging.mjs +0 -5
  169. package/esm2022/compat/messaging/base.mjs +0 -9
  170. package/esm2022/compat/messaging/messaging.mjs +0 -81
  171. package/esm2022/compat/messaging/messaging.module.mjs +0 -20
  172. package/esm2022/compat/messaging/public_api.mjs +0 -3
  173. package/esm2022/compat/performance/angular-fire-compat-performance.mjs +0 -5
  174. package/esm2022/compat/performance/base.mjs +0 -9
  175. package/esm2022/compat/performance/performance.mjs +0 -105
  176. package/esm2022/compat/performance/performance.module.mjs +0 -27
  177. package/esm2022/compat/performance/performance.service.mjs +0 -28
  178. package/esm2022/compat/performance/public_api.mjs +0 -4
  179. package/esm2022/compat/proxy.mjs +0 -58
  180. package/esm2022/compat/public_api.mjs +0 -5
  181. package/esm2022/compat/remote-config/angular-fire-compat-remote-config.mjs +0 -5
  182. package/esm2022/compat/remote-config/base.mjs +0 -20
  183. package/esm2022/compat/remote-config/interfaces.mjs +0 -2
  184. package/esm2022/compat/remote-config/public_api.mjs +0 -3
  185. package/esm2022/compat/remote-config/remote-config.mjs +0 -206
  186. package/esm2022/compat/remote-config/remote-config.module.mjs +0 -20
  187. package/esm2022/compat/storage/angular-fire-compat-storage.mjs +0 -5
  188. package/esm2022/compat/storage/interfaces.mjs +0 -2
  189. package/esm2022/compat/storage/observable/fromTask.mjs +0 -36
  190. package/esm2022/compat/storage/pipes/storageUrl.pipe.mjs +0 -56
  191. package/esm2022/compat/storage/public_api.mjs +0 -7
  192. package/esm2022/compat/storage/ref.mjs +0 -28
  193. package/esm2022/compat/storage/storage.mjs +0 -95
  194. package/esm2022/compat/storage/storage.module.mjs +0 -22
  195. package/esm2022/compat/storage/task.mjs +0 -21
  196. package/esm2022/core.mjs +0 -43
  197. package/esm2022/database/angular-fire-database.mjs +0 -5
  198. package/esm2022/database/database.mjs +0 -16
  199. package/esm2022/database/database.module.mjs +0 -76
  200. package/esm2022/database/firebase.mjs +0 -44
  201. package/esm2022/database/public_api.mjs +0 -5
  202. package/esm2022/database/rxfire.mjs +0 -13
  203. package/esm2022/firestore/angular-fire-firestore.mjs +0 -5
  204. package/esm2022/firestore/firebase.mjs +0 -73
  205. package/esm2022/firestore/firestore.mjs +0 -16
  206. package/esm2022/firestore/firestore.module.mjs +0 -76
  207. package/esm2022/firestore/lite/angular-fire-firestore-lite.mjs +0 -5
  208. package/esm2022/firestore/lite/firebase.mjs +0 -48
  209. package/esm2022/firestore/lite/lite.mjs +0 -16
  210. package/esm2022/firestore/lite/lite.module.mjs +0 -75
  211. package/esm2022/firestore/lite/public_api.mjs +0 -5
  212. package/esm2022/firestore/lite/rxfire.mjs +0 -12
  213. package/esm2022/firestore/public_api.mjs +0 -5
  214. package/esm2022/firestore/rxfire.mjs +0 -15
  215. package/esm2022/functions/angular-fire-functions.mjs +0 -5
  216. package/esm2022/functions/firebase.mjs +0 -9
  217. package/esm2022/functions/functions.mjs +0 -16
  218. package/esm2022/functions/functions.module.mjs +0 -76
  219. package/esm2022/functions/public_api.mjs +0 -5
  220. package/esm2022/functions/rxfire.mjs +0 -5
  221. package/esm2022/messaging/angular-fire-messaging.mjs +0 -5
  222. package/esm2022/messaging/firebase.mjs +0 -10
  223. package/esm2022/messaging/is-messaging-supported-factory.mjs +0 -16
  224. package/esm2022/messaging/messaging.mjs +0 -16
  225. package/esm2022/messaging/messaging.module.mjs +0 -93
  226. package/esm2022/messaging/overrides.mjs +0 -3
  227. package/esm2022/messaging/public_api.mjs +0 -4
  228. package/esm2022/performance/angular-fire-performance.mjs +0 -5
  229. package/esm2022/performance/firebase.mjs +0 -8
  230. package/esm2022/performance/performance.mjs +0 -16
  231. package/esm2022/performance/performance.module.mjs +0 -83
  232. package/esm2022/performance/public_api.mjs +0 -5
  233. package/esm2022/performance/rxfire.mjs +0 -8
  234. package/esm2022/public_api.mjs +0 -3
  235. package/esm2022/remote-config/angular-fire-remote-config.mjs +0 -5
  236. package/esm2022/remote-config/firebase.mjs +0 -17
  237. package/esm2022/remote-config/is-remote-config-supported-factory.mjs +0 -16
  238. package/esm2022/remote-config/overrides.mjs +0 -3
  239. package/esm2022/remote-config/public_api.mjs +0 -5
  240. package/esm2022/remote-config/remote-config.mjs +0 -16
  241. package/esm2022/remote-config/remote-config.module.mjs +0 -93
  242. package/esm2022/remote-config/rxfire.mjs +0 -9
  243. package/esm2022/storage/angular-fire-storage.mjs +0 -5
  244. package/esm2022/storage/firebase.mjs +0 -20
  245. package/esm2022/storage/public_api.mjs +0 -5
  246. package/esm2022/storage/rxfire.mjs +0 -6
  247. package/esm2022/storage/storage.mjs +0 -16
  248. package/esm2022/storage/storage.module.mjs +0 -76
  249. package/esm2022/vertexai-preview/angular-fire-vertexai-preview.mjs +0 -5
  250. package/esm2022/vertexai-preview/firebase.mjs +0 -7
  251. package/esm2022/vertexai-preview/public_api.mjs +0 -4
  252. package/esm2022/vertexai-preview/vertexai.mjs +0 -16
  253. package/esm2022/vertexai-preview/vertexai.module.mjs +0 -73
  254. package/esm2022/zones.mjs +0 -194
  255. package/fesm2022/angular-fire-vertexai-preview.mjs.map +0 -1
  256. package/schematics/common.js +0 -81
  257. package/schematics/deploy/functions-templates.js +0 -57
  258. package/schematics/firebaseTools.js +0 -78
  259. package/schematics/interfaces.js +0 -16
  260. package/schematics/setup/prompts.js +0 -195
  261. package/schematics/utils.js +0 -189
  262. package/vertexai-preview/firebase.d.ts +0 -4
  263. package/vertexai-preview/package.json +0 -3
  264. /package/{vertexai-preview → vertexai}/public_api.d.ts +0 -0
@@ -1,108 +0,0 @@
1
- import { distinctUntilChanged, map, pairwise, scan, startWith } from 'rxjs/operators';
2
- import { fromCollectionRef } from '../observable/fromRef';
3
- /**
4
- * Return a stream of document changes on a query. These results are not in sort order but in
5
- * order of occurence.
6
- */
7
- export function docChanges(query, scheduler) {
8
- return fromCollectionRef(query, scheduler)
9
- .pipe(startWith(undefined), pairwise(), map((actionTuple) => {
10
- const [priorAction, action] = actionTuple;
11
- const docChanges = action.payload.docChanges();
12
- const actions = docChanges.map(change => ({ type: change.type, payload: change }));
13
- // the metadata has changed from the prior emission
14
- if (priorAction && JSON.stringify(priorAction.payload.metadata) !== JSON.stringify(action.payload.metadata)) {
15
- // go through all the docs in payload and figure out which ones changed
16
- action.payload.docs.forEach((currentDoc, currentIndex) => {
17
- const docChange = docChanges.find(d => d.doc.ref.isEqual(currentDoc.ref));
18
- const priorDoc = priorAction?.payload.docs.find(d => d.ref.isEqual(currentDoc.ref));
19
- if (docChange && JSON.stringify(docChange.doc.metadata) === JSON.stringify(currentDoc.metadata) ||
20
- !docChange && priorDoc && JSON.stringify(priorDoc.metadata) === JSON.stringify(currentDoc.metadata)) {
21
- // document doesn't appear to have changed, don't log another action
22
- }
23
- else {
24
- // since the actions are processed in order just push onto the array
25
- actions.push({
26
- type: 'modified',
27
- payload: {
28
- oldIndex: currentIndex,
29
- newIndex: currentIndex,
30
- type: 'modified',
31
- doc: currentDoc
32
- }
33
- });
34
- }
35
- });
36
- }
37
- return actions;
38
- }));
39
- }
40
- /**
41
- * Return a stream of document changes on a query. These results are in sort order.
42
- */
43
- export function sortedChanges(query, events, scheduler) {
44
- return docChanges(query, scheduler)
45
- .pipe(scan((current, changes) => combineChanges(current, changes.map(it => it.payload), events), []), distinctUntilChanged(), // cut down on unneed change cycles
46
- map(changes => changes.map(c => ({ type: c.type, payload: c }))));
47
- }
48
- /**
49
- * Combines the total result set from the current set of changes from an incoming set
50
- * of changes.
51
- */
52
- export function combineChanges(current, changes, events) {
53
- changes.forEach(change => {
54
- // skip unwanted change types
55
- if (events.indexOf(change.type) > -1) {
56
- current = combineChange(current, change);
57
- }
58
- });
59
- return current;
60
- }
61
- /**
62
- * Splice arguments on top of a sliced array, to break top-level ===
63
- * this is useful for change-detection
64
- */
65
- function sliceAndSplice(original, start, deleteCount, ...args) {
66
- const returnArray = original.slice();
67
- returnArray.splice(start, deleteCount, ...args);
68
- return returnArray;
69
- }
70
- /**
71
- * Creates a new sorted array from a new change.
72
- * Build our own because we allow filtering of action types ('added', 'removed', 'modified') before scanning
73
- * and so we have greater control over change detection (by breaking ===)
74
- */
75
- export function combineChange(combined, change) {
76
- switch (change.type) {
77
- case 'added':
78
- if (combined[change.newIndex] && combined[change.newIndex].doc.ref.isEqual(change.doc.ref)) {
79
- // Not sure why the duplicates are getting fired
80
- }
81
- else {
82
- return sliceAndSplice(combined, change.newIndex, 0, change);
83
- }
84
- break;
85
- case 'modified':
86
- if (combined[change.oldIndex] == null || combined[change.oldIndex].doc.ref.isEqual(change.doc.ref)) {
87
- // When an item changes position we first remove it
88
- // and then add it's new position
89
- if (change.oldIndex !== change.newIndex) {
90
- const copiedArray = combined.slice();
91
- copiedArray.splice(change.oldIndex, 1);
92
- copiedArray.splice(change.newIndex, 0, change);
93
- return copiedArray;
94
- }
95
- else {
96
- return sliceAndSplice(combined, change.newIndex, 1, change);
97
- }
98
- }
99
- break;
100
- case 'removed':
101
- if (combined[change.oldIndex] && combined[change.oldIndex].doc.ref.isEqual(change.doc.ref)) {
102
- return sliceAndSplice(combined, change.oldIndex, 1);
103
- }
104
- break;
105
- }
106
- return combined;
107
- }
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wYXQvZmlyZXN0b3JlL2NvbGxlY3Rpb24vY2hhbmdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFJMUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBSSxLQUFZLEVBQUUsU0FBeUI7SUFDbkUsT0FBTyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDO1NBQ3ZDLElBQUksQ0FDSCxTQUFTLENBQW9FLFNBQVMsQ0FBQyxFQUN2RixRQUFRLEVBQUUsRUFDVixHQUFHLENBQUMsQ0FBQyxXQUF1QixFQUFFLEVBQUU7UUFDOUIsTUFBTSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDMUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkYsbURBQW1EO1FBQ25ELElBQUksV0FBVyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUM1Ryx1RUFBdUU7WUFDdkUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENB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LEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQy9DLE9BQU8sV0FBVyxDQUFDO2dCQUNyQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM5RCxDQUFDO1lBQ0gsQ0FBQztZQUNELE1BQU07UUFDUixLQUFLLFNBQVM7WUFDWixJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzNGLE9BQU8sY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFDRCxNQUFNO0lBQ1YsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZmlyZWJhc2UgZnJvbSAnZmlyZWJhc2UvY29tcGF0L2FwcCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTY2hlZHVsZXJMaWtlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBwYWlyd2lzZSwgc2Nhbiwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWN0aW9uLCBEb2N1bWVudENoYW5nZSwgRG9jdW1lbnRDaGFuZ2VBY3Rpb24sIERvY3VtZW50Q2hhbmdlVHlwZSwgUXVlcnksIFF1ZXJ5U25hcHNob3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGZyb21Db2xsZWN0aW9uUmVmIH0gZnJvbSAnLi4vb2JzZXJ2YWJsZS9mcm9tUmVmJztcblxuXG50eXBlIEFjdGlvblR1cGUgPSBbQWN0aW9uPFF1ZXJ5U25hcHNob3Q8ZmlyZWJhc2UuZmlyZXN0b3JlLkRvY3VtZW50RGF0YT4+LCBBY3Rpb248UXVlcnlTbmFwc2hvdDxmaXJlYmFzZS5maXJlc3RvcmUuRG9jdW1lbnREYXRhPj5dXG4vKipcbiAqIFJldHVybiBhIHN0cmVhbSBvZiBkb2N1bWVudCBjaGFuZ2VzIG9uIGEgcXVlcnkuIFRoZXNlIHJlc3VsdHMgYXJlIG5vdCBpbiBzb3J0IG9yZGVyIGJ1dCBpblxuICogb3JkZXIgb2Ygb2NjdXJlbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZG9jQ2hhbmdlczxUPihxdWVyeTogUXVlcnksIHNjaGVkdWxlcj86IFNjaGVkdWxlckxpa2UpOiBPYnNlcnZhYmxlPERvY3VtZW50Q2hhbmdlQWN0aW9uPFQ+W10+IHtcbiAgcmV0dXJuIGZyb21Db2xsZWN0aW9uUmVmKHF1ZXJ5LCBzY2hlZHVsZXIpXG4gICAgLnBpcGUoXG4gICAgICBzdGFydFdpdGg8QWN0aW9uPFF1ZXJ5U25hcHNob3Q8ZmlyZWJhc2UuZmlyZXN0b3JlLkRvY3VtZW50RGF0YT4+LCB1bmRlZmluZWQ+KHVuZGVmaW5lZCksXG4gICAgICBwYWlyd2lzZSgpLFxuICAgICAgbWFwKChhY3Rpb25UdXBsZTogQWN0aW9uVHVwZSkgPT4ge1xuICAgICAgICBjb25zdCBbcHJpb3JBY3Rpb24sIGFjdGlvbl0gPSBhY3Rpb25UdXBsZTtcbiAgICAgICAgY29uc3QgZG9jQ2hhbmdlcyA9IGFjdGlvbi5wYXlsb2FkLmRvY0NoYW5nZXMoKTtcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IGRvY0NoYW5nZXMubWFwKGNoYW5nZSA9PiAoeyB0eXBlOiBjaGFuZ2UudHlwZSwgcGF5bG9hZDogY2hhbmdlIH0pKTtcbiAgICAgICAgLy8gdGhlIG1ldGFkYXRhIGhhcyBjaGFuZ2VkIGZyb20gdGhlIHByaW9yIGVtaXNzaW9uXG4gICAgICAgIGlmIChwcmlvckFjdGlvbiAmJiBKU09OLnN0cmluZ2lmeShwcmlvckFjdGlvbi5wYXlsb2FkLm1ldGFkYXRhKSAhPT0gSlNPTi5zdHJpbmdpZnkoYWN0aW9uLnBheWxvYWQubWV0YWRhdGEpKSB7XG4gICAgICAgICAgLy8gZ28gdGhyb3VnaCBhbGwgdGhlIGRvY3MgaW4gcGF5bG9hZCBhbmQgZmlndXJlIG91dCB3aGljaCBvbmVzIGNoYW5nZWRcbiAgICAgICAgICBhY3Rpb24ucGF5bG9hZC5kb2NzLmZvckVhY2goKGN1cnJlbnREb2MsIGN1cnJlbnRJbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZG9jQ2hhbmdlID0gZG9jQ2hhbmdlcy5maW5kKGQgPT4gZC5kb2MucmVmLmlzRXF1YWwoY3VycmVudERvYy5yZWYpKTtcbiAgICAgICAgICAgIGNvbnN0IHByaW9yRG9jID0gcHJpb3JBY3Rpb24/LnBheWxvYWQuZG9jcy5maW5kKGQgPT4gZC5yZWYuaXNFcXVhbChjdXJyZW50RG9jLnJlZikpO1xuICAgICAgICAgICAgaWYgKGRvY0NoYW5nZSAmJiBKU09OLnN0cmluZ2lmeShkb2NDaGFuZ2UuZG9jLm1ldGFkYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkoY3VycmVudERvYy5tZXRhZGF0YSkgfHxcbiAgICAgICAgICAgICAgIWRvY0NoYW5nZSAmJiBwcmlvckRvYyAmJiBKU09OLnN0cmluZ2lmeShwcmlvckRvYy5tZXRhZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KGN1cnJlbnREb2MubWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgIC8vIGRvY3VtZW50IGRvZXNuJ3QgYXBwZWFyIHRvIGhhdmUgY2hhbmdlZCwgZG9uJ3QgbG9nIGFub3RoZXIgYWN0aW9uXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgYWN0aW9ucyBhcmUgcHJvY2Vzc2VkIGluIG9yZGVyIGp1c3QgcHVzaCBvbnRvIHRoZSBhcnJheVxuICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdtb2RpZmllZCcsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgb2xkSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICAgICAgICAgIG5ld0luZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnbW9kaWZpZWQnLFxuICAgICAgICAgICAgICAgICAgZG9jOiBjdXJyZW50RG9jXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWN0aW9ucyBhcyBEb2N1bWVudENoYW5nZUFjdGlvbjxUPltdO1xuICAgICAgfSksXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgc3RyZWFtIG9mIGRvY3VtZW50IGNoYW5nZXMgb24gYSBxdWVyeS4gVGhlc2UgcmVzdWx0cyBhcmUgaW4gc29ydCBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRlZENoYW5nZXM8VD4oXG4gIHF1ZXJ5OiBRdWVyeSxcbiAgZXZlbnRzOiBEb2N1bWVudENoYW5nZVR5cGVbXSxcbiAgc2NoZWR1bGVyPzogU2NoZWR1bGVyTGlrZSk6IE9ic2VydmFibGU8RG9jdW1lbnRDaGFuZ2VBY3Rpb248VD5bXT4ge1xuICByZXR1cm4gZG9jQ2hhbmdlczxUPihxdWVyeSwgc2NoZWR1bGVyKVxuICAgIC5waXBlKFxuICAgICAgc2NhbigoY3VycmVudCwgY2hhbmdlcykgPT4gY29tYmluZUNoYW5nZXM8VD4oY3VycmVudCwgY2hhbmdlcy5tYXAoaXQgPT4gaXQucGF5bG9hZCksIGV2ZW50cyksIFtdKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIC8vIGN1dCBkb3duIG9uIHVubmVlZCBjaGFuZ2UgY3ljbGVzXG4gICAgICBtYXAoY2hhbmdlcyA9PiBjaGFuZ2VzLm1hcChjID0+ICh7IHR5cGU6IGMudHlwZSwgcGF5bG9hZDogYyB9IGFzIERvY3VtZW50Q2hhbmdlQWN0aW9uPFQ+KSkpKTtcbn1cblxuLyoqXG4gKiBDb21iaW5lcyB0aGUgdG90YWwgcmVzdWx0IHNldCBmcm9tIHRoZSBjdXJyZW50IHNldCBvZiBjaGFuZ2VzIGZyb20gYW4gaW5jb21pbmcgc2V0XG4gKiBvZiBjaGFuZ2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZUNoYW5nZXM8VD4oY3VycmVudDogRG9jdW1lbnRDaGFuZ2U8VD5bXSwgY2hhbmdlczogRG9jdW1lbnRDaGFuZ2U8VD5bXSwgZXZlbnRzOiBEb2N1bWVudENoYW5nZVR5cGVbXSkge1xuICBjaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAvLyBza2lwIHVud2FudGVkIGNoYW5nZSB0eXBlc1xuICAgIGlmIChldmVudHMuaW5kZXhPZihjaGFuZ2UudHlwZSkgPiAtMSkge1xuICAgICAgY3VycmVudCA9IGNvbWJpbmVDaGFuZ2UoY3VycmVudCwgY2hhbmdlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBTcGxpY2UgYXJndW1lbnRzIG9uIHRvcCBvZiBhIHNsaWNlZCBhcnJheSwgdG8gYnJlYWsgdG9wLWxldmVsID09PVxuICogdGhpcyBpcyB1c2VmdWwgZm9yIGNoYW5nZS1kZXRlY3Rpb25cbiAqL1xuZnVuY3Rpb24gc2xpY2VBbmRTcGxpY2U8VD4oXG4gIG9yaWdpbmFsOiBUW10sXG4gIHN0YXJ0OiBudW1iZXIsXG4gIGRlbGV0ZUNvdW50OiBudW1iZXIsXG4gIC4uLmFyZ3M6IFRbXVxuKTogVFtdIHtcbiAgY29uc3QgcmV0dXJuQXJyYXkgPSBvcmlnaW5hbC5zbGljZSgpO1xuICByZXR1cm5BcnJheS5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50LCAuLi5hcmdzKTtcbiAgcmV0dXJuIHJldHVybkFycmF5O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgc29ydGVkIGFycmF5IGZyb20gYSBuZXcgY2hhbmdlLlxuICogQnVpbGQgb3VyIG93biBiZWNhdXNlIHdlIGFsbG93IGZpbHRlcmluZyBvZiBhY3Rpb24gdHlwZXMgKCdhZGRlZCcsICdyZW1vdmVkJywgJ21vZGlmaWVkJykgYmVmb3JlIHNjYW5uaW5nXG4gKiBhbmQgc28gd2UgaGF2ZSBncmVhdGVyIGNvbnRyb2wgb3ZlciBjaGFuZ2UgZGV0ZWN0aW9uIChieSBicmVha2luZyA9PT0pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lQ2hhbmdlPFQ+KGNvbWJpbmVkOiBEb2N1bWVudENoYW5nZTxUPltdLCBjaGFuZ2U6IERvY3VtZW50Q2hhbmdlPFQ+KTogRG9jdW1lbnRDaGFuZ2U8VD5bXSB7XG4gIHN3aXRjaCAoY2hhbmdlLnR5cGUpIHtcbiAgICBjYXNlICdhZGRlZCc6XG4gICAgICBpZiAoY29tYmluZWRbY2hhbmdlLm5ld0luZGV4XSAmJiBjb21iaW5lZFtjaGFuZ2UubmV3SW5kZXhdLmRvYy5yZWYuaXNFcXVhbChjaGFuZ2UuZG9jLnJlZikpIHtcbiAgICAgICAgLy8gTm90IHN1cmUgd2h5IHRoZSBkdXBsaWNhdGVzIGFyZSBnZXR0aW5nIGZpcmVkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc2xpY2VBbmRTcGxpY2UoY29tYmluZWQsIGNoYW5nZS5uZXdJbmRleCwgMCwgY2hhbmdlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21vZGlmaWVkJzpcbiAgICAgIGlmIChjb21iaW5lZFtjaGFuZ2Uub2xkSW5kZXhdID09IG51bGwgfHwgY29tYmluZWRbY2hhbmdlLm9sZEluZGV4XS5kb2MucmVmLmlzRXF1YWwoY2hhbmdlLmRvYy5yZWYpKSB7XG4gICAgICAgIC8vIFdoZW4gYW4gaXRlbSBjaGFuZ2VzIHBvc2l0aW9uIHdlIGZpcnN0IHJlbW92ZSBpdFxuICAgICAgICAvLyBhbmQgdGhlbiBhZGQgaXQncyBuZXcgcG9zaXRpb25cbiAgICAgICAgaWYgKGNoYW5nZS5vbGRJbmRleCAhPT0gY2hhbmdlLm5ld0luZGV4KSB7XG4gICAgICAgICAgY29uc3QgY29waWVkQXJyYXkgPSBjb21iaW5lZC5zbGljZSgpO1xuICAgICAgICAgIGNvcGllZEFycmF5LnNwbGljZShjaGFuZ2Uub2xkSW5kZXgsIDEpO1xuICAgICAgICAgIGNvcGllZEFycmF5LnNwbGljZShjaGFuZ2UubmV3SW5kZXgsIDAsIGNoYW5nZSk7XG4gICAgICAgICAgcmV0dXJuIGNvcGllZEFycmF5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzbGljZUFuZFNwbGljZShjb21iaW5lZCwgY2hhbmdlLm5ld0luZGV4LCAxLCBjaGFuZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyZW1vdmVkJzpcbiAgICAgIGlmIChjb21iaW5lZFtjaGFuZ2Uub2xkSW5kZXhdICYmIGNvbWJpbmVkW2NoYW5nZS5vbGRJbmRleF0uZG9jLnJlZi5pc0VxdWFsKGNoYW5nZS5kb2MucmVmKSkge1xuICAgICAgICByZXR1cm4gc2xpY2VBbmRTcGxpY2UoY29tYmluZWQsIGNoYW5nZS5vbGRJbmRleCwgMSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gY29tYmluZWQ7XG59XG4iXX0=
@@ -1,123 +0,0 @@
1
- import { keepUnstableUntilFirst } from '@angular/fire';
2
- import { from } from 'rxjs';
3
- import { filter, map, pairwise, scan, startWith } from 'rxjs/operators';
4
- import { AngularFirestoreDocument } from '../document/document';
5
- import { fromCollectionRef } from '../observable/fromRef';
6
- import { docChanges, sortedChanges } from './changes';
7
- export function validateEventsArray(events) {
8
- if (!events || events.length === 0) {
9
- events = ['added', 'removed', 'modified'];
10
- }
11
- return events;
12
- }
13
- /**
14
- * AngularFirestoreCollection service
15
- *
16
- * This class creates a reference to a Firestore Collection. A reference and a query are provided in
17
- * in the constructor. The query can be the unqueried reference if no query is desired.The class
18
- * is generic which gives you type safety for data update methods and data streaming.
19
- *
20
- * This class uses Symbol.observable to transform into Observable using Observable.from().
21
- *
22
- * This class is rarely used directly and should be created from the AngularFirestore service.
23
- *
24
- * Example:
25
- *
26
- * const collectionRef = firebase.firestore.collection('stocks');
27
- * const query = collectionRef.where('price', '>', '0.01');
28
- * const fakeStock = new AngularFirestoreCollection<Stock>(collectionRef, query);
29
- *
30
- * // NOTE!: the updates are performed on the reference not the query
31
- * await fakeStock.add({ name: 'FAKE', price: 0.01 });
32
- *
33
- * // Subscribe to changes as snapshots. This provides you data updates as well as delta updates.
34
- * fakeStock.valueChanges().subscribe(value => console.log(value));
35
- */
36
- export class AngularFirestoreCollection {
37
- ref;
38
- query;
39
- afs;
40
- /**
41
- * The constructor takes in a CollectionReference and Query to provide wrapper methods
42
- * for data operations and data streaming.
43
- *
44
- * Note: Data operation methods are done on the reference not the query. This means
45
- * when you update data it is not updating data to the window of your query unless
46
- * the data fits the criteria of the query. See the AssociatedRefence type for details
47
- * on this implication.
48
- */
49
- constructor(ref, query, afs) {
50
- this.ref = ref;
51
- this.query = query;
52
- this.afs = afs;
53
- }
54
- /**
55
- * Listen to the latest change in the stream. This method returns changes
56
- * as they occur and they are not sorted by query order. This allows you to construct
57
- * your own data structure.
58
- */
59
- stateChanges(events) {
60
- let source = docChanges(this.query, this.afs.schedulers.outsideAngular);
61
- if (events && events.length > 0) {
62
- source = source.pipe(map(actions => actions.filter(change => events.indexOf(change.type) > -1)));
63
- }
64
- return source.pipe(
65
- // We want to filter out empty arrays, but always emit at first, so the developer knows
66
- // that the collection has been resolve; even if it's empty
67
- startWith(undefined), pairwise(), filter(([prior, current]) => current.length > 0 || !prior), map(([, current]) => current), keepUnstableUntilFirst);
68
- }
69
- /**
70
- * Create a stream of changes as they occur it time. This method is similar to stateChanges()
71
- * but it collects each event in an array over time.
72
- */
73
- auditTrail(events) {
74
- return this.stateChanges(events).pipe(scan((current, action) => [...current, ...action], []));
75
- }
76
- /**
77
- * Create a stream of synchronized changes. This method keeps the local array in sorted
78
- * query order.
79
- */
80
- snapshotChanges(events) {
81
- const validatedEvents = validateEventsArray(events);
82
- const scheduledSortedChanges$ = sortedChanges(this.query, validatedEvents, this.afs.schedulers.outsideAngular);
83
- return scheduledSortedChanges$.pipe(keepUnstableUntilFirst);
84
- }
85
- valueChanges(options = {}) {
86
- return fromCollectionRef(this.query, this.afs.schedulers.outsideAngular)
87
- .pipe(map(actions => actions.payload.docs.map(a => {
88
- if (options.idField) {
89
- return {
90
- ...a.data(),
91
- ...{ [options.idField]: a.id }
92
- };
93
- }
94
- else {
95
- return a.data();
96
- }
97
- })), keepUnstableUntilFirst);
98
- }
99
- /**
100
- * Retrieve the results of the query once.
101
- */
102
- get(options) {
103
- return from(this.query.get(options)).pipe(keepUnstableUntilFirst);
104
- }
105
- /**
106
- * Add data to a collection reference.
107
- *
108
- * Note: Data operation methods are done on the reference not the query. This means
109
- * when you update data it is not updating data to the window of your query unless
110
- * the data fits the criteria of the query.
111
- */
112
- add(data) {
113
- return this.ref.add(data);
114
- }
115
- /**
116
- * Create a reference to a single document in a collection.
117
- */
118
- doc(path) {
119
- // TODO is there a better way to solve this type issue
120
- return new AngularFirestoreDocument(this.ref.doc(path), this.afs);
121
- }
122
- }
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wYXQvZmlyZXN0b3JlL2NvbGxlY3Rpb24vY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkQsT0FBTyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSXRELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxNQUE2QjtJQUMvRCxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxHQUFHLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxPQUFPLDBCQUEwQjtJQVduQjtJQUNDO0lBQ0E7SUFabkI7Ozs7Ozs7O09BUUc7SUFDSCxZQUNrQixHQUEyQixFQUMxQixLQUFlLEVBQ2YsR0FBcUI7UUFGdEIsUUFBRyxHQUFILEdBQUcsQ0FBd0I7UUFDMUIsVUFBSyxHQUFMLEtBQUssQ0FBVTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQWtCO0lBQUksQ0FBQztJQUU3Qzs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLE1B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QyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsR0FBRyxDQUFTLElBQWE7UUFDdkIsc0RBQXNEO1FBQ3RELE9BQU8sSUFBSSx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0UsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsga2VlcFVuc3RhYmxlVW50aWxGaXJzdCB9IGZyb20gJ0Bhbmd1bGFyL2ZpcmUnO1xuaW1wb3J0IGZpcmViYXNlIGZyb20gJ2ZpcmViYXNlL2NvbXBhdC9hcHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHBhaXJ3aXNlLCBzY2FuLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBbmd1bGFyRmlyZXN0b3JlRG9jdW1lbnQgfSBmcm9tICcuLi9kb2N1bWVudC9kb2N1bWVudCc7XG5pbXBvcnQgeyBBbmd1bGFyRmlyZXN0b3JlIH0gZnJvbSAnLi4vZmlyZXN0b3JlJztcbmltcG9ydCB7IENvbGxlY3Rpb25SZWZlcmVuY2UsIERvY3VtZW50Q2hhbmdlQWN0aW9uLCBEb2N1bWVudENoYW5nZVR5cGUsIERvY3VtZW50RGF0YSwgRG9jdW1lbnRSZWZlcmVuY2UsIFF1ZXJ5IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBmcm9tQ29sbGVjdGlvblJlZiB9IGZyb20gJy4uL29ic2VydmFibGUvZnJvbVJlZic7XG5pbXBvcnQgeyBkb2NDaGFuZ2VzLCBzb3J0ZWRDaGFuZ2VzIH0gZnJvbSAnLi9jaGFuZ2VzJztcblxudHlwZSBEb2N1bWVudENoYW5nZVR1cGxlPFQ+ID0gW0RvY3VtZW50Q2hhbmdlQWN0aW9uPFQ+W10sIERvY3VtZW50Q2hhbmdlQWN0aW9uPFQ+W11dO1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVFdmVudHNBcnJheShldmVudHM/OiBEb2N1bWVudENoYW5nZVR5cGVbXSkge1xuICBpZiAoIWV2ZW50cyB8fCBldmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgZXZlbnRzID0gWydhZGRlZCcsICdyZW1vdmVkJywgJ21vZGlmaWVkJ107XG4gIH1cbiAgcmV0dXJuIGV2ZW50cztcbn1cblxuLyoqXG4gKiBBbmd1bGFyRmlyZXN0b3JlQ29sbGVjdGlvbiBzZXJ2aWNlXG4gKlxuICogVGhpcyBjbGFzcyBjcmVhdGVzIGEgcmVmZXJlbmNlIHRvIGEgRmlyZXN0b3JlIENvbGxlY3Rpb24uIEEgcmVmZXJlbmNlIGFuZCBhIHF1ZXJ5IGFyZSBwcm92aWRlZCBpblxuICogaW4gdGhlIGNvbnN0cnVjdG9yLiBUaGUgcXVlcnkgY2FuIGJlIHRoZSB1bnF1ZXJpZWQgcmVmZXJlbmNlIGlmIG5vIHF1ZXJ5IGlzIGRlc2lyZWQuVGhlIGNsYXNzXG4gKiBpcyBnZW5lcmljIHdoaWNoIGdpdmVzIHlvdSB0eXBlIHNhZmV0eSBmb3IgZGF0YSB1cGRhdGUgbWV0aG9kcyBhbmQgZGF0YSBzdHJlYW1pbmcuXG4gKlxuICogVGhpcyBjbGFzcyB1c2VzIFN5bWJvbC5vYnNlcnZhYmxlIHRvIHRyYW5zZm9ybSBpbnRvIE9ic2VydmFibGUgdXNpbmcgT2JzZXJ2YWJsZS5mcm9tKCkuXG4gKlxuICogVGhpcyBjbGFzcyBpcyByYXJlbHkgdXNlZCBkaXJlY3RseSBhbmQgc2hvdWxkIGJlIGNyZWF0ZWQgZnJvbSB0aGUgQW5ndWxhckZpcmVzdG9yZSBzZXJ2aWNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogY29uc3QgY29sbGVjdGlvblJlZiA9IGZpcmViYXNlLmZpcmVzdG9yZS5jb2xsZWN0aW9uKCdzdG9ja3MnKTtcbiAqIGNvbnN0IHF1ZXJ5ID0gY29sbGVjdGlvblJlZi53aGVyZSgncHJpY2UnLCAnPicsICcwLjAxJyk7XG4gKiBjb25zdCBmYWtlU3RvY2sgPSBuZXcgQW5ndWxhckZpcmVzdG9yZUNvbGxlY3Rpb248U3RvY2s+KGNvbGxlY3Rpb25SZWYsIHF1ZXJ5KTtcbiAqXG4gKiAvLyBOT1RFITogdGhlIHVwZGF0ZXMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgcmVmZXJlbmNlIG5vdCB0aGUgcXVlcnlcbiAqIGF3YWl0IGZha2VTdG9jay5hZGQoeyBuYW1lOiAnRkFLRScsIHByaWNlOiAwLjAxIH0pO1xuICpcbiAqIC8vIFN1YnNjcmliZSB0byBjaGFuZ2VzIGFzIHNuYXBzaG90cy4gVGhpcyBwcm92aWRlcyB5b3UgZGF0YSB1cGRhdGVzIGFzIHdlbGwgYXMgZGVsdGEgdXBkYXRlcy5cbiAqIGZha2VTdG9jay52YWx1ZUNoYW5nZXMoKS5zdWJzY3JpYmUodmFsdWUgPT4gY29uc29sZS5sb2codmFsdWUpKTtcbiAqL1xuZXhwb3J0IGNsYXNzIEFuZ3VsYXJGaXJlc3RvcmVDb2xsZWN0aW9uPFQgPSBEb2N1bWVudERhdGE+IHtcbiAgLyoqXG4gICAqIFRoZSBjb25zdHJ1Y3RvciB0YWtlcyBpbiBhIENvbGxlY3Rpb25SZWZlcmVuY2UgYW5kIFF1ZXJ5IHRvIHByb3ZpZGUgd3JhcHBlciBtZXRob2RzXG4gICAqIGZvciBkYXRhIG9wZXJhdGlvbnMgYW5kIGRhdGEgc3RyZWFtaW5nLlxuICAgKlxuICAgKiBOb3RlOiBEYXRhIG9wZXJhdGlvbiBtZXRob2RzIGFyZSBkb25lIG9uIHRoZSByZWZlcmVuY2Ugbm90IHRoZSBxdWVyeS4gVGhpcyBtZWFuc1xuICAgKiB3aGVuIHlvdSB1cGRhdGUgZGF0YSBpdCBpcyBub3QgdXBkYXRpbmcgZGF0YSB0byB0aGUgd2luZG93IG9mIHlvdXIgcXVlcnkgdW5sZXNzXG4gICAqIHRoZSBkYXRhIGZpdHMgdGhlIGNyaXRlcmlhIG9mIHRoZSBxdWVyeS4gU2VlIHRoZSBBc3NvY2lhdGVkUmVmZW5jZSB0eXBlIGZvciBkZXRhaWxzXG4gICAqIG9uIHRoaXMgaW1wbGljYXRpb24uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVmOiBDb2xsZWN0aW9uUmVmZXJlbmNlPFQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcXVlcnk6IFF1ZXJ5PFQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWZzOiBBbmd1bGFyRmlyZXN0b3JlKSB7IH1cblxuICAvKipcbiAgICogTGlzdGVuIHRvIHRoZSBsYXRlc3QgY2hhbmdlIGluIHRoZSBzdHJlYW0uIFRoaXMgbWV0aG9kIHJldHVybnMgY2hhbmdlc1xuICAgKiBhcyB0aGV5IG9jY3VyIGFuZCB0aGV5IGFyZSBub3Qgc29ydGVkIGJ5IHF1ZXJ5IG9yZGVyLiBUaGlzIGFsbG93cyB5b3UgdG8gY29uc3RydWN0XG4gICAqIHlvdXIgb3duIGRhdGEgc3RydWN0dXJlLlxuICAgKi9cbiAgc3RhdGVDaGFuZ2VzKGV2ZW50cz86IERvY3VtZW50Q2hhbmdlVHlwZVtdKTogT2JzZXJ2YWJsZTxEb2N1bWVudENoYW5nZUFjdGlvbjxUPltdPiB7XG4gICAgbGV0IHNvdXJjZSA9IGRvY0NoYW5nZXM8VD4odGhpcy5xdWVyeSwgdGhpcy5hZnMuc2NoZWR1bGVycy5vdXRzaWRlQW5ndWxhcik7XG4gICAgaWYgKGV2ZW50cyAmJiBldmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgc291cmNlID0gc291cmNlLnBpcGUoXG4gICAgICAgIG1hcChhY3Rpb25zID0+IGFjdGlvbnMuZmlsdGVyKGNoYW5nZSA9PiBldmVudHMuaW5kZXhPZihjaGFuZ2UudHlwZSkgPiAtMSkpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlLnBpcGUoXG4gICAgICAvLyBXZSB3YW50IHRvIGZpbHRlciBvdXQgZW1wdHkgYXJyYXlzLCBidXQgYWx3YXlzIGVtaXQgYXQgZmlyc3QsIHNvIHRoZSBkZXZlbG9wZXIga25vd3NcbiAgICAgIC8vIHRoYXQgdGhlIGNvbGxlY3Rpb24gaGFzIGJlZW4gcmVzb2x2ZTsgZXZlbiBpZiBpdCdzIGVtcHR5XG4gICAgICBzdGFydFdpdGg8RG9jdW1lbnRDaGFuZ2VBY3Rpb248VD5bXSwgdW5kZWZpbmVkPih1bmRlZmluZWQpLFxuICAgICAgcGFpcndpc2UoKSxcbiAgICAgIGZpbHRlcigoW3ByaW9yLCBjdXJyZW50XTogRG9jdW1lbnRDaGFuZ2VUdXBsZTxUPikgPT4gY3VycmVudC5sZW5ndGggPiAwIHx8ICFwcmlvciksXG4gICAgICBtYXAoKFssIGN1cnJlbnRdKSA9PiBjdXJyZW50KSxcbiAgICAgIGtlZXBVbnN0YWJsZVVudGlsRmlyc3RcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0cmVhbSBvZiBjaGFuZ2VzIGFzIHRoZXkgb2NjdXIgaXQgdGltZS4gVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byBzdGF0ZUNoYW5nZXMoKVxuICAgKiBidXQgaXQgY29sbGVjdHMgZWFjaCBldmVudCBpbiBhbiBhcnJheSBvdmVyIHRpbWUuXG4gICAqL1xuICBhdWRpdFRyYWlsKGV2ZW50cz86IERvY3VtZW50Q2hhbmdlVHlwZVtdKTogT2JzZXJ2YWJsZTxEb2N1bWVudENoYW5nZUFjdGlvbjxUPltdPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVDaGFuZ2VzKGV2ZW50cykucGlwZShzY2FuKChjdXJyZW50LCBhY3Rpb24pID0+IFsuLi5jdXJyZW50LCAuLi5hY3Rpb25dLCBbXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0cmVhbSBvZiBzeW5jaHJvbml6ZWQgY2hhbmdlcy4gVGhpcyBtZXRob2Qga2VlcHMgdGhlIGxvY2FsIGFycmF5IGluIHNvcnRlZFxuICAgKiBxdWVyeSBvcmRlci5cbiAgICovXG4gIHNuYXBzaG90Q2hhbmdlcyhldmVudHM/OiBEb2N1bWVudENoYW5nZVR5cGVbXSk6IE9ic2VydmFibGU8RG9jdW1lbnRDaGFuZ2VBY3Rpb248VD5bXT4ge1xuICAgIGNvbnN0IHZhbGlkYXRlZEV2ZW50cyA9IHZhbGlkYXRlRXZlbnRzQXJyYXkoZXZlbnRzKTtcbiAgICBjb25zdCBzY2hlZHVsZWRTb3J0ZWRDaGFuZ2VzJCA9IHNvcnRlZENoYW5nZXM8VD4odGhpcy5xdWVyeSwgdmFsaWRhdGVkRXZlbnRzLCB0aGlzLmFmcy5zY2hlZHVsZXJzLm91dHNpZGVBbmd1bGFyKTtcbiAgICByZXR1cm4gc2NoZWR1bGVkU29ydGVkQ2hhbmdlcyQucGlwZShcbiAgICAgIGtlZXBVbnN0YWJsZVVudGlsRmlyc3RcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiB0byBhbGwgZG9jdW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uIGFuZCBpdHMgcG9zc2libGUgcXVlcnkgYXMgYW4gT2JzZXJ2YWJsZS5cbiAgICpcbiAgICogSWYgdGhlIGBpZEZpZWxkYCBvcHRpb24gaXMgcHJvdmlkZWQsIGRvY3VtZW50IElEcyBhcmUgaW5jbHVkZWQgYW5kIG1hcHBlZCB0byB0aGVcbiAgICogcHJvdmlkZWQgYGlkRmllbGRgIHByb3BlcnR5IG5hbWUuXG4gICAqL1xuICB2YWx1ZUNoYW5nZXMoKTogT2JzZXJ2YWJsZTxUW10+O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHktcGF0dGVyblxuICB2YWx1ZUNoYW5nZXMoe30pOiBPYnNlcnZhYmxlPFRbXT47XG4gIHZhbHVlQ2hhbmdlczxLIGV4dGVuZHMgc3RyaW5nPihvcHRpb25zOiB7aWRGaWVsZDogS30pOiBPYnNlcnZhYmxlPChUICYgeyBbVCBpbiBLXTogc3RyaW5nIH0pW10+O1xuICB2YWx1ZUNoYW5nZXM8SyBleHRlbmRzIHN0cmluZz4ob3B0aW9uczoge2lkRmllbGQ/OiBLfSA9IHt9KTogT2JzZXJ2YWJsZTxUW10+IHtcbiAgICByZXR1cm4gZnJvbUNvbGxlY3Rpb25SZWY8VD4odGhpcy5xdWVyeSwgdGhpcy5hZnMuc2NoZWR1bGVycy5vdXRzaWRlQW5ndWxhcilcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoYWN0aW9ucyA9PiBhY3Rpb25zLnBheWxvYWQuZG9jcy5tYXAoYSA9PiB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuaWRGaWVsZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uYS5kYXRhKCkgYXMgYW55LFxuICAgICAgICAgICAgICAuLi57IFtvcHRpb25zLmlkRmllbGRdOiBhLmlkIH1cbiAgICAgICAgICAgIH0gYXMgVCAmIHsgW1QgaW4gS106IHN0cmluZyB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYS5kYXRhKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSksXG4gICAgICAgIGtlZXBVbnN0YWJsZVVudGlsRmlyc3RcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5IG9uY2UuXG4gICAqL1xuICBnZXQob3B0aW9ucz86IGZpcmViYXNlLmZpcmVzdG9yZS5HZXRPcHRpb25zKSB7XG4gICAgcmV0dXJuIGZyb20odGhpcy5xdWVyeS5nZXQob3B0aW9ucykpLnBpcGUoXG4gICAgICBrZWVwVW5zdGFibGVVbnRpbEZpcnN0LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGRhdGEgdG8gYSBjb2xsZWN0aW9uIHJlZmVyZW5jZS5cbiAgICpcbiAgICogTm90ZTogRGF0YSBvcGVyYXRpb24gbWV0aG9kcyBhcmUgZG9uZSBvbiB0aGUgcmVmZXJlbmNlIG5vdCB0aGUgcXVlcnkuIFRoaXMgbWVhbnNcbiAgICogd2hlbiB5b3UgdXBkYXRlIGRhdGEgaXQgaXMgbm90IHVwZGF0aW5nIGRhdGEgdG8gdGhlIHdpbmRvdyBvZiB5b3VyIHF1ZXJ5IHVubGVzc1xuICAgKiB0aGUgZGF0YSBmaXRzIHRoZSBjcml0ZXJpYSBvZiB0aGUgcXVlcnkuXG4gICAqL1xuICBhZGQoZGF0YTogVCk6IFByb21pc2U8RG9jdW1lbnRSZWZlcmVuY2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWYuYWRkKGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJlZmVyZW5jZSB0byBhIHNpbmdsZSBkb2N1bWVudCBpbiBhIGNvbGxlY3Rpb24uXG4gICAqL1xuICBkb2M8VDIgPSBUPihwYXRoPzogc3RyaW5nKTogQW5ndWxhckZpcmVzdG9yZURvY3VtZW50PFQyPiB7XG4gICAgLy8gVE9ETyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gc29sdmUgdGhpcyB0eXBlIGlzc3VlXG4gICAgcmV0dXJuIG5ldyBBbmd1bGFyRmlyZXN0b3JlRG9jdW1lbnQodGhpcy5yZWYuZG9jKHBhdGgpIGFzIGFueSwgdGhpcy5hZnMpO1xuICB9XG59XG4iXX0=
@@ -1,86 +0,0 @@
1
- import { keepUnstableUntilFirst } from '@angular/fire';
2
- import { from } from 'rxjs';
3
- import { filter, map, scan } from 'rxjs/operators';
4
- import { docChanges, sortedChanges } from '../collection/changes';
5
- import { validateEventsArray } from '../collection/collection';
6
- import { fromCollectionRef } from '../observable/fromRef';
7
- /**
8
- * AngularFirestoreCollectionGroup service
9
- *
10
- * This class holds a reference to a Firestore Collection Group Query.
11
- *
12
- * This class uses Symbol.observable to transform into Observable using Observable.from().
13
- *
14
- * This class is rarely used directly and should be created from the AngularFirestore service.
15
- *
16
- * Example:
17
- *
18
- * const collectionGroup = firebase.firestore.collectionGroup('stocks');
19
- * const query = collectionRef.where('price', '>', '0.01');
20
- * const fakeStock = new AngularFirestoreCollectionGroup<Stock>(query, afs);
21
- *
22
- * // Subscribe to changes as snapshots. This provides you data updates as well as delta updates.
23
- * fakeStock.valueChanges().subscribe(value => console.log(value));
24
- */
25
- export class AngularFirestoreCollectionGroup {
26
- query;
27
- afs;
28
- /**
29
- * The constructor takes in a CollectionGroupQuery to provide wrapper methods
30
- * for data operations and data streaming.
31
- */
32
- constructor(query, afs) {
33
- this.query = query;
34
- this.afs = afs;
35
- }
36
- /**
37
- * Listen to the latest change in the stream. This method returns changes
38
- * as they occur and they are not sorted by query order. This allows you to construct
39
- * your own data structure.
40
- */
41
- stateChanges(events) {
42
- if (!events || events.length === 0) {
43
- return docChanges(this.query, this.afs.schedulers.outsideAngular).pipe(keepUnstableUntilFirst);
44
- }
45
- return docChanges(this.query, this.afs.schedulers.outsideAngular)
46
- .pipe(map(actions => actions.filter(change => events.indexOf(change.type) > -1)), filter(changes => changes.length > 0), keepUnstableUntilFirst);
47
- }
48
- /**
49
- * Create a stream of changes as they occur it time. This method is similar to stateChanges()
50
- * but it collects each event in an array over time.
51
- */
52
- auditTrail(events) {
53
- return this.stateChanges(events).pipe(scan((current, action) => [...current, ...action], []));
54
- }
55
- /**
56
- * Create a stream of synchronized changes. This method keeps the local array in sorted
57
- * query order.
58
- */
59
- snapshotChanges(events) {
60
- const validatedEvents = validateEventsArray(events);
61
- const scheduledSortedChanges$ = sortedChanges(this.query, validatedEvents, this.afs.schedulers.outsideAngular);
62
- return scheduledSortedChanges$.pipe(keepUnstableUntilFirst);
63
- }
64
- valueChanges(options = {}) {
65
- const fromCollectionRefScheduled$ = fromCollectionRef(this.query, this.afs.schedulers.outsideAngular);
66
- return fromCollectionRefScheduled$
67
- .pipe(map(actions => actions.payload.docs.map(a => {
68
- if (options.idField) {
69
- return {
70
- [options.idField]: a.id,
71
- ...a.data()
72
- };
73
- }
74
- else {
75
- return a.data();
76
- }
77
- })), keepUnstableUntilFirst);
78
- }
79
- /**
80
- * Retrieve the results of the query once.
81
- */
82
- get(options) {
83
- return from(this.query.get(options)).pipe(keepUnstableUntilFirst);
84
- }
85
- }
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1ncm91cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wYXQvZmlyZXN0b3JlL2NvbGxlY3Rpb24tZ3JvdXAvY29sbGVjdGlvbi1ncm91cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkQsT0FBTyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sT0FBTywrQkFBK0I7SUFNdkI7SUFDQTtJQU5uQjs7O09BR0c7SUFDSCxZQUNtQixLQUFlLEVBQ2YsR0FBcUI7UUFEckIsVUFBSyxHQUFMLEtBQUssQ0FBVTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQWtCO0lBQUksQ0FBQztJQUU3Qzs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLE1BQTZCO1FBQ3hDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPLFVBQVUsQ0FBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FDdkUsc0JBQXNCLENBQ3ZCLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUM7YUFDakUsSUFBSSxDQUNILEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQzFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQ3RDLHNCQUFzQixDQUN2QixDQUFDO0lBQ04sQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVUsQ0FBQyxNQUE2QjtRQUN0QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFRDs7O09BR0c7SUFDSCxlQUFlLENBQUMsTUFBNkI7UUFDM0MsTUFBTSxlQUFlLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsTUFBTSx1QkFBdUIsR0FBRyxhQUFhLENBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEgsT0FBTyx1QkFBdUIsQ0FBQyxJQUFJLENBQ2pDLHNCQUFzQixDQUN2QixDQUFDO0lBQ0osQ0FBQztJQVlELFlBQVksQ0FBbUIsVUFBeUIsRUFBRTtRQUN4RCxNQUFNLDJCQUEyQixHQUFHLGlCQUFpQixDQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekcsT0FBTywyQkFBMkI7YUFDL0IsSUFBSSxDQUNILEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMxQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEIsT0FBTztvQkFDTCxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtvQkFDdkIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFO2lCQUNnQixDQUFDO1lBQ2hDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUMsRUFDSCxzQkFBc0IsQ0FDdkIsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILEdBQUcsQ0FBQyxPQUF1QztRQUN6QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDdkMsc0JBQXNCLENBQ3ZCLENBQUM7SUFDSixDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBrZWVwVW5zdGFibGVVbnRpbEZpcnN0IH0gZnJvbSAnQGFuZ3VsYXIvZmlyZSc7XG5pbXBvcnQgZmlyZWJhc2UgZnJvbSAnZmlyZWJhc2UvY29tcGF0L2FwcCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc2NhbiB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGRvY0NoYW5nZXMsIHNvcnRlZENoYW5nZXMgfSBmcm9tICcuLi9jb2xsZWN0aW9uL2NoYW5nZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVFdmVudHNBcnJheSB9IGZyb20gJy4uL2NvbGxlY3Rpb24vY29sbGVjdGlvbic7XG5pbXBvcnQgeyBBbmd1bGFyRmlyZXN0b3JlIH0gZnJvbSAnLi4vZmlyZXN0b3JlJztcbmltcG9ydCB7IERvY3VtZW50Q2hhbmdlQWN0aW9uLCBEb2N1bWVudENoYW5nZVR5cGUsIERvY3VtZW50RGF0YSwgUXVlcnkgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGZyb21Db2xsZWN0aW9uUmVmIH0gZnJvbSAnLi4vb2JzZXJ2YWJsZS9mcm9tUmVmJztcblxuLyoqXG4gKiBBbmd1bGFyRmlyZXN0b3JlQ29sbGVjdGlvbkdyb3VwIHNlcnZpY2VcbiAqXG4gKiBUaGlzIGNsYXNzIGhvbGRzIGEgcmVmZXJlbmNlIHRvIGEgRmlyZXN0b3JlIENvbGxlY3Rpb24gR3JvdXAgUXVlcnkuXG4gKlxuICogVGhpcyBjbGFzcyB1c2VzIFN5bWJvbC5vYnNlcnZhYmxlIHRvIHRyYW5zZm9ybSBpbnRvIE9ic2VydmFibGUgdXNpbmcgT2JzZXJ2YWJsZS5mcm9tKCkuXG4gKlxuICogVGhpcyBjbGFzcyBpcyByYXJlbHkgdXNlZCBkaXJlY3RseSBhbmQgc2hvdWxkIGJlIGNyZWF0ZWQgZnJvbSB0aGUgQW5ndWxhckZpcmVzdG9yZSBzZXJ2aWNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogY29uc3QgY29sbGVjdGlvbkdyb3VwID0gZmlyZWJhc2UuZmlyZXN0b3JlLmNvbGxlY3Rpb25Hcm91cCgnc3RvY2tzJyk7XG4gKiBjb25zdCBxdWVyeSA9IGNvbGxlY3Rpb25SZWYud2hlcmUoJ3ByaWNlJywgJz4nLCAnMC4wMScpO1xuICogY29uc3QgZmFrZVN0b2NrID0gbmV3IEFuZ3VsYXJGaXJlc3RvcmVDb2xsZWN0aW9uR3JvdXA8U3RvY2s+KHF1ZXJ5LCBhZnMpO1xuICpcbiAqIC8vIFN1YnNjcmliZSB0byBjaGFuZ2VzIGFzIHNuYXBzaG90cy4gVGhpcyBwcm92aWRlcyB5b3UgZGF0YSB1cGRhdGVzIGFzIHdlbGwgYXMgZGVsdGEgdXBkYXRlcy5cbiAqIGZha2VTdG9jay52YWx1ZUNoYW5nZXMoKS5zdWJzY3JpYmUodmFsdWUgPT4gY29uc29sZS5sb2codmFsdWUpKTtcbiAqL1xuZXhwb3J0IGNsYXNzIEFuZ3VsYXJGaXJlc3RvcmVDb2xsZWN0aW9uR3JvdXA8VCA9IERvY3VtZW50RGF0YT4ge1xuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdG9yIHRha2VzIGluIGEgQ29sbGVjdGlvbkdyb3VwUXVlcnkgdG8gcHJvdmlkZSB3cmFwcGVyIG1ldGhvZHNcbiAgICogZm9yIGRhdGEgb3BlcmF0aW9ucyBhbmQgZGF0YSBzdHJlYW1pbmcuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHF1ZXJ5OiBRdWVyeTxUPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFmczogQW5ndWxhckZpcmVzdG9yZSkgeyB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiB0byB0aGUgbGF0ZXN0IGNoYW5nZSBpbiB0aGUgc3RyZWFtLiBUaGlzIG1ldGhvZCByZXR1cm5zIGNoYW5nZXNcbiAgICogYXMgdGhleSBvY2N1ciBhbmQgdGhleSBhcmUgbm90IHNvcnRlZCBieSBxdWVyeSBvcmRlci4gVGhpcyBhbGxvd3MgeW91IHRvIGNvbnN0cnVjdFxuICAgKiB5b3VyIG93biBkYXRhIHN0cnVjdHVyZS5cbiAgICovXG4gIHN0YXRlQ2hhbmdlcyhldmVudHM/OiBEb2N1bWVudENoYW5nZVR5cGVbXSk6IE9ic2VydmFibGU8RG9jdW1lbnRDaGFuZ2VBY3Rpb248VD5bXT4ge1xuICAgIGlmICghZXZlbnRzIHx8IGV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBkb2NDaGFuZ2VzPFQ+KHRoaXMucXVlcnksIHRoaXMuYWZzLnNjaGVkdWxlcnMub3V0c2lkZUFuZ3VsYXIpLnBpcGUoXG4gICAgICAgIGtlZXBVbnN0YWJsZVVudGlsRmlyc3RcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkb2NDaGFuZ2VzPFQ+KHRoaXMucXVlcnksIHRoaXMuYWZzLnNjaGVkdWxlcnMub3V0c2lkZUFuZ3VsYXIpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKGFjdGlvbnMgPT4gYWN0aW9ucy5maWx0ZXIoY2hhbmdlID0+IGV2ZW50cy5pbmRleE9mKGNoYW5nZS50eXBlKSA+IC0xKSksXG4gICAgICAgIGZpbHRlcihjaGFuZ2VzID0+ICBjaGFuZ2VzLmxlbmd0aCA+IDApLFxuICAgICAgICBrZWVwVW5zdGFibGVVbnRpbEZpcnN0XG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0cmVhbSBvZiBjaGFuZ2VzIGFzIHRoZXkgb2NjdXIgaXQgdGltZS4gVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byBzdGF0ZUNoYW5nZXMoKVxuICAgKiBidXQgaXQgY29sbGVjdHMgZWFjaCBldmVudCBpbiBhbiBhcnJheSBvdmVyIHRpbWUuXG4gICAqL1xuICBhdWRpdFRyYWlsKGV2ZW50cz86IERvY3VtZW50Q2hhbmdlVHlwZVtdKTogT2JzZXJ2YWJsZTxEb2N1bWVudENoYW5nZUFjdGlvbjxUPltdPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVDaGFuZ2VzKGV2ZW50cykucGlwZShzY2FuKChjdXJyZW50LCBhY3Rpb24pID0+IFsuLi5jdXJyZW50LCAuLi5hY3Rpb25dLCBbXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0cmVhbSBvZiBzeW5jaHJvbml6ZWQgY2hhbmdlcy4gVGhpcyBtZXRob2Qga2VlcHMgdGhlIGxvY2FsIGFycmF5IGluIHNvcnRlZFxuICAgKiBxdWVyeSBvcmRlci5cbiAgICovXG4gIHNuYXBzaG90Q2hhbmdlcyhldmVudHM/OiBEb2N1bWVudENoYW5nZVR5cGVbXSk6IE9ic2VydmFibGU8RG9jdW1lbnRDaGFuZ2VBY3Rpb248VD5bXT4ge1xuICAgIGNvbnN0IHZhbGlkYXRlZEV2ZW50cyA9IHZhbGlkYXRlRXZlbnRzQXJyYXkoZXZlbnRzKTtcbiAgICBjb25zdCBzY2hlZHVsZWRTb3J0ZWRDaGFuZ2VzJCA9IHNvcnRlZENoYW5nZXM8VD4odGhpcy5xdWVyeSwgdmFsaWRhdGVkRXZlbnRzLCB0aGlzLmFmcy5zY2hlZHVsZXJzLm91dHNpZGVBbmd1bGFyKTtcbiAgICByZXR1cm4gc2NoZWR1bGVkU29ydGVkQ2hhbmdlcyQucGlwZShcbiAgICAgIGtlZXBVbnN0YWJsZVVudGlsRmlyc3RcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiB0byBhbGwgZG9jdW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uIGFuZCBpdHMgcG9zc2libGUgcXVlcnkgYXMgYW4gT2JzZXJ2YWJsZS5cbiAgICpcbiAgICogSWYgdGhlIGBpZEZpZWxkYCBvcHRpb24gaXMgcHJvdmlkZWQsIGRvY3VtZW50IElEcyBhcmUgaW5jbHVkZWQgYW5kIG1hcHBlZCB0byB0aGVcbiAgICogcHJvdmlkZWQgYGlkRmllbGRgIHByb3BlcnR5IG5hbWUuXG4gICAqL1xuICB2YWx1ZUNoYW5nZXMoKTogT2JzZXJ2YWJsZTxUW10+O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHktcGF0dGVyblxuICB2YWx1ZUNoYW5nZXMoe30pOiBPYnNlcnZhYmxlPFRbXT47XG4gIHZhbHVlQ2hhbmdlczxLIGV4dGVuZHMgc3RyaW5nPihvcHRpb25zOiB7aWRGaWVsZDogS30pOiBPYnNlcnZhYmxlPChUICYgeyBbVCBpbiBLXTogc3RyaW5nIH0pW10+O1xuICB2YWx1ZUNoYW5nZXM8SyBleHRlbmRzIHN0cmluZz4ob3B0aW9uczoge2lkRmllbGQ/OiBLfSA9IHt9KTogT2JzZXJ2YWJsZTxUW10+IHtcbiAgICBjb25zdCBmcm9tQ29sbGVjdGlvblJlZlNjaGVkdWxlZCQgPSBmcm9tQ29sbGVjdGlvblJlZjxUPih0aGlzLnF1ZXJ5LCB0aGlzLmFmcy5zY2hlZHVsZXJzLm91dHNpZGVBbmd1bGFyKTtcbiAgICByZXR1cm4gZnJvbUNvbGxlY3Rpb25SZWZTY2hlZHVsZWQkXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKGFjdGlvbnMgPT4gYWN0aW9ucy5wYXlsb2FkLmRvY3MubWFwKGEgPT4ge1xuICAgICAgICAgIGlmIChvcHRpb25zLmlkRmllbGQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIFtvcHRpb25zLmlkRmllbGRdOiBhLmlkLFxuICAgICAgICAgICAgICAuLi5hLmRhdGEoKVxuICAgICAgICAgICAgfSBhcyBUICYgeyBbVCBpbiBLXTogc3RyaW5nIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhLmRhdGEoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKSxcbiAgICAgICAga2VlcFVuc3RhYmxlVW50aWxGaXJzdFxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkgb25jZS5cbiAgICovXG4gIGdldChvcHRpb25zPzogZmlyZWJhc2UuZmlyZXN0b3JlLkdldE9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnJvbSh0aGlzLnF1ZXJ5LmdldChvcHRpb25zKSkucGlwZShcbiAgICAgIGtlZXBVbnN0YWJsZVVudGlsRmlyc3RcbiAgICApO1xuICB9XG5cbn1cbiJdfQ==
@@ -1,87 +0,0 @@
1
- import { keepUnstableUntilFirst } from '@angular/fire';
2
- import { from } from 'rxjs';
3
- import { map } from 'rxjs/operators';
4
- import { AngularFirestoreCollection } from '../collection/collection';
5
- import { associateQuery } from '../firestore';
6
- import { fromDocRef } from '../observable/fromRef';
7
- /**
8
- * AngularFirestoreDocument service
9
- *
10
- * This class creates a reference to a Firestore Document. A reference is provided in
11
- * in the constructor. The class is generic which gives you type safety for data update
12
- * methods and data streaming.
13
- *
14
- * This class uses Symbol.observable to transform into Observable using Observable.from().
15
- *
16
- * This class is rarely used directly and should be created from the AngularFirestore service.
17
- *
18
- * Example:
19
- *
20
- * const fakeStock = new AngularFirestoreDocument<Stock>(doc('stocks/FAKE'));
21
- * await fakeStock.set({ name: 'FAKE', price: 0.01 });
22
- * fakeStock.valueChanges().map(snap => {
23
- * if(snap.exists) return snap.data();
24
- * return null;
25
- * }).subscribe(value => console.log(value));
26
- * // OR! Transform using Observable.from() and the data is unwrapped for you
27
- * Observable.from(fakeStock).subscribe(value => console.log(value));
28
- */
29
- export class AngularFirestoreDocument {
30
- ref;
31
- afs;
32
- /**
33
- * The constructor takes in a DocumentReference to provide wrapper methods
34
- * for data operations, data streaming, and Symbol.observable.
35
- */
36
- constructor(ref, afs) {
37
- this.ref = ref;
38
- this.afs = afs;
39
- }
40
- /**
41
- * Create or overwrite a single document.
42
- */
43
- set(data, options) {
44
- return this.ref.set(data, options);
45
- }
46
- /**
47
- * Update some fields of a document without overwriting the entire document.
48
- */
49
- update(data) {
50
- return this.ref.update(data);
51
- }
52
- /**
53
- * Delete a document.
54
- */
55
- delete() {
56
- return this.ref.delete();
57
- }
58
- /**
59
- * Create a reference to a sub-collection given a path and an optional query
60
- * function.
61
- */
62
- collection(path, queryFn) {
63
- const collectionRef = this.ref.collection(path);
64
- const { ref, query } = associateQuery(collectionRef, queryFn);
65
- return new AngularFirestoreCollection(ref, query, this.afs);
66
- }
67
- /**
68
- * Listen to snapshot updates from the document.
69
- */
70
- snapshotChanges() {
71
- const scheduledFromDocRef$ = fromDocRef(this.ref, this.afs.schedulers.outsideAngular);
72
- return scheduledFromDocRef$.pipe(keepUnstableUntilFirst);
73
- }
74
- valueChanges(options = {}) {
75
- return this.snapshotChanges().pipe(map(({ payload }) => options.idField ? {
76
- ...payload.data(),
77
- ...{ [options.idField]: payload.id }
78
- } : payload.data()));
79
- }
80
- /**
81
- * Retrieve the document once.
82
- */
83
- get(options) {
84
- return from(this.ref.get(options)).pipe(keepUnstableUntilFirst);
85
- }
86
- }
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tcGF0L2ZpcmVzdG9yZS9kb2N1bWVudC9kb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkQsT0FBTyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEUsT0FBTyxFQUFvQixjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLE9BQU8sd0JBQXdCO0lBTWhCO0lBQW1DO0lBSnREOzs7T0FHRztJQUNILFlBQW1CLEdBQXlCLEVBQVUsR0FBcUI7UUFBeEQsUUFBRyxHQUFILEdBQUcsQ0FBc0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFrQjtJQUFJLENBQUM7SUFFaEY7O09BRUc7SUFDSCxHQUFHLENBQUMsSUFBTyxFQUFFLE9BQW9CO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxJQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVUsQ0FBbUIsSUFBWSxFQUFFLE9BQWlCO1FBQzFELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBOEMsQ0FBQztRQUM3RixNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLGNBQWMsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUQsT0FBTyxJQUFJLDBCQUEwQixDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixNQUFNLG9CQUFvQixHQUFHLFVBQVUsQ0FBSSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3pGLE9BQU8sb0JBQW9CLENBQUMsSUFBSSxDQUM5QixzQkFBc0IsQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFVRCxZQUFZLENBQW1CLFVBQTJCLEVBQUU7UUFDMUQsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUNoQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FDbEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDaEIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ2pCLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFO1NBQ1QsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUMvQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxHQUFHLENBQUMsT0FBdUM7UUFDekMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3JDLHNCQUFzQixDQUN2QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsga2VlcFVuc3RhYmxlVW50aWxGaXJzdCB9IGZyb20gJ0Bhbmd1bGFyL2ZpcmUnO1xuaW1wb3J0IGZpcmViYXNlIGZyb20gJ2ZpcmViYXNlL2NvbXBhdC9hcHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQW5ndWxhckZpcmVzdG9yZUNvbGxlY3Rpb24gfSBmcm9tICcuLi9jb2xsZWN0aW9uL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHsgQW5ndWxhckZpcmVzdG9yZSwgYXNzb2NpYXRlUXVlcnkgfSBmcm9tICcuLi9maXJlc3RvcmUnO1xuaW1wb3J0IHsgQWN0aW9uLCBEb2N1bWVudERhdGEsIERvY3VtZW50UmVmZXJlbmNlLCBEb2N1bWVudFNuYXBzaG90LCBRdWVyeUZuLCBTZXRPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBmcm9tRG9jUmVmIH0gZnJvbSAnLi4vb2JzZXJ2YWJsZS9mcm9tUmVmJztcblxuLyoqXG4gKiBBbmd1bGFyRmlyZXN0b3JlRG9jdW1lbnQgc2VydmljZVxuICpcbiAqIFRoaXMgY2xhc3MgY3JlYXRlcyBhIHJlZmVyZW5jZSB0byBhIEZpcmVzdG9yZSBEb2N1bWVudC4gQSByZWZlcmVuY2UgaXMgcHJvdmlkZWQgaW5cbiAqIGluIHRoZSBjb25zdHJ1Y3Rvci4gVGhlIGNsYXNzIGlzIGdlbmVyaWMgd2hpY2ggZ2l2ZXMgeW91IHR5cGUgc2FmZXR5IGZvciBkYXRhIHVwZGF0ZVxuICogbWV0aG9kcyBhbmQgZGF0YSBzdHJlYW1pbmcuXG4gKlxuICogVGhpcyBjbGFzcyB1c2VzIFN5bWJvbC5vYnNlcnZhYmxlIHRvIHRyYW5zZm9ybSBpbnRvIE9ic2VydmFibGUgdXNpbmcgT2JzZXJ2YWJsZS5mcm9tKCkuXG4gKlxuICogVGhpcyBjbGFzcyBpcyByYXJlbHkgdXNlZCBkaXJlY3RseSBhbmQgc2hvdWxkIGJlIGNyZWF0ZWQgZnJvbSB0aGUgQW5ndWxhckZpcmVzdG9yZSBzZXJ2aWNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogY29uc3QgZmFrZVN0b2NrID0gbmV3IEFuZ3VsYXJGaXJlc3RvcmVEb2N1bWVudDxTdG9jaz4oZG9jKCdzdG9ja3MvRkFLRScpKTtcbiAqIGF3YWl0IGZha2VTdG9jay5zZXQoeyBuYW1lOiAnRkFLRScsIHByaWNlOiAwLjAxIH0pO1xuICogZmFrZVN0b2NrLnZhbHVlQ2hhbmdlcygpLm1hcChzbmFwID0+IHtcbiAqICAgaWYoc25hcC5leGlzdHMpIHJldHVybiBzbmFwLmRhdGEoKTtcbiAqICAgcmV0dXJuIG51bGw7XG4gKiB9KS5zdWJzY3JpYmUodmFsdWUgPT4gY29uc29sZS5sb2codmFsdWUpKTtcbiAqIC8vIE9SISBUcmFuc2Zvcm0gdXNpbmcgT2JzZXJ2YWJsZS5mcm9tKCkgYW5kIHRoZSBkYXRhIGlzIHVud3JhcHBlZCBmb3IgeW91XG4gKiBPYnNlcnZhYmxlLmZyb20oZmFrZVN0b2NrKS5zdWJzY3JpYmUodmFsdWUgPT4gY29uc29sZS5sb2codmFsdWUpKTtcbiAqL1xuZXhwb3J0IGNsYXNzIEFuZ3VsYXJGaXJlc3RvcmVEb2N1bWVudDxUID0gRG9jdW1lbnREYXRhPiB7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zdHJ1Y3RvciB0YWtlcyBpbiBhIERvY3VtZW50UmVmZXJlbmNlIHRvIHByb3ZpZGUgd3JhcHBlciBtZXRob2RzXG4gICAqIGZvciBkYXRhIG9wZXJhdGlvbnMsIGRhdGEgc3RyZWFtaW5nLCBhbmQgU3ltYm9sLm9ic2VydmFibGUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBEb2N1bWVudFJlZmVyZW5jZTxUPiwgcHJpdmF0ZSBhZnM6IEFuZ3VsYXJGaXJlc3RvcmUpIHsgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgb3Igb3ZlcndyaXRlIGEgc2luZ2xlIGRvY3VtZW50LlxuICAgKi9cbiAgc2V0KGRhdGE6IFQsIG9wdGlvbnM/OiBTZXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucmVmLnNldChkYXRhLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgc29tZSBmaWVsZHMgb2YgYSBkb2N1bWVudCB3aXRob3V0IG92ZXJ3cml0aW5nIHRoZSBlbnRpcmUgZG9jdW1lbnQuXG4gICAqL1xuICB1cGRhdGUoZGF0YTogUGFydGlhbDxUPik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnJlZi51cGRhdGUoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgZG9jdW1lbnQuXG4gICAqL1xuICBkZWxldGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucmVmLmRlbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJlZmVyZW5jZSB0byBhIHN1Yi1jb2xsZWN0aW9uIGdpdmVuIGEgcGF0aCBhbmQgYW4gb3B0aW9uYWwgcXVlcnlcbiAgICogZnVuY3Rpb24uXG4gICAqL1xuICBjb2xsZWN0aW9uPFIgPSBEb2N1bWVudERhdGE+KHBhdGg6IHN0cmluZywgcXVlcnlGbj86IFF1ZXJ5Rm4pOiBBbmd1bGFyRmlyZXN0b3JlQ29sbGVjdGlvbjxSPiB7XG4gICAgY29uc3QgY29sbGVjdGlvblJlZiA9IHRoaXMucmVmLmNvbGxlY3Rpb24ocGF0aCkgYXMgZmlyZWJhc2UuZmlyZXN0b3JlLkNvbGxlY3Rpb25SZWZlcmVuY2U8Uj47XG4gICAgY29uc3QgeyByZWYsIHF1ZXJ5IH0gPSBhc3NvY2lhdGVRdWVyeShjb2xsZWN0aW9uUmVmLCBxdWVyeUZuKTtcbiAgICByZXR1cm4gbmV3IEFuZ3VsYXJGaXJlc3RvcmVDb2xsZWN0aW9uKHJlZiwgcXVlcnksIHRoaXMuYWZzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gc25hcHNob3QgdXBkYXRlcyBmcm9tIHRoZSBkb2N1bWVudC5cbiAgICovXG4gIHNuYXBzaG90Q2hhbmdlcygpOiBPYnNlcnZhYmxlPEFjdGlvbjxEb2N1bWVudFNuYXBzaG90PFQ+Pj4ge1xuICAgIGNvbnN0IHNjaGVkdWxlZEZyb21Eb2NSZWYkID0gZnJvbURvY1JlZjxUPih0aGlzLnJlZiwgdGhpcy5hZnMuc2NoZWR1bGVycy5vdXRzaWRlQW5ndWxhcik7XG4gICAgcmV0dXJuIHNjaGVkdWxlZEZyb21Eb2NSZWYkLnBpcGUoXG4gICAgICBrZWVwVW5zdGFibGVVbnRpbEZpcnN0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gdW53cmFwcGVkIHNuYXBzaG90IHVwZGF0ZXMgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAqXG4gICAqIElmIHRoZSBgaWRGaWVsZGAgb3B0aW9uIGlzIHByb3ZpZGVkLCBkb2N1bWVudCBJRHMgYXJlIGluY2x1ZGVkIGFuZCBtYXBwZWQgdG8gdGhlXG4gICAqIHByb3ZpZGVkIGBpZEZpZWxkYCBwcm9wZXJ0eSBuYW1lLlxuICAgKi9cbiAgdmFsdWVDaGFuZ2VzKG9wdGlvbnM/OiB1bmtub3duKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgdmFsdWVDaGFuZ2VzPEsgZXh0ZW5kcyBzdHJpbmc+KG9wdGlvbnM6IHsgaWRGaWVsZDogSyB9KTogT2JzZXJ2YWJsZTwoVCAmIHsgW1QgaW4gS106IHN0cmluZyB9KSB8IHVuZGVmaW5lZD47XG4gIHZhbHVlQ2hhbmdlczxLIGV4dGVuZHMgc3RyaW5nPihvcHRpb25zOiB7IGlkRmllbGQ/OiBLIH0gPSB7fSk6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLnNuYXBzaG90Q2hhbmdlcygpLnBpcGUoXG4gICAgICBtYXAoKHsgcGF5bG9hZCB9KSA9PlxuICAgICAgICBvcHRpb25zLmlkRmllbGQgPyB7XG4gICAgICAgICAgLi4ucGF5bG9hZC5kYXRhKCksXG4gICAgICAgICAgLi4ueyBbb3B0aW9ucy5pZEZpZWxkXTogcGF5bG9hZC5pZCB9XG4gICAgICAgIH0gYXMgVCAmIHsgW1QgaW4gS106IHN0cmluZyB9IDogcGF5bG9hZC5kYXRhKClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBkb2N1bWVudCBvbmNlLlxuICAgKi9cbiAgZ2V0KG9wdGlvbnM/OiBmaXJlYmFzZS5maXJlc3RvcmUuR2V0T3B0aW9ucykge1xuICAgIHJldHVybiBmcm9tKHRoaXMucmVmLmdldChvcHRpb25zKSkucGlwZShcbiAgICAgIGtlZXBVbnN0YWJsZVVudGlsRmlyc3QsXG4gICAgKTtcbiAgfVxufVxuIl19