Skip to content

Commit 96b3c20

Browse files
committed
chore(afs): upgrade to consolidated module and modified snapChanges bug fix
1 parent de93f26 commit 96b3c20

16 files changed

+57
-62
lines changed

src/core/firebase.app.module.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import { InjectionToken, } from '@angular/core';
22
import { FirebaseAppConfig } from './';
33
import * as firebase from 'firebase/app';
4-
// TODO(davideast): Replace once Firestore is merged in firebase.d.ts
5-
import { Firestore } from 'firestore';
64

75
export const FirebaseAppConfigToken = new InjectionToken<FirebaseAppConfig>('FirebaseAppConfigToken');
86

@@ -13,8 +11,8 @@ export class FirebaseApp implements firebase.app.App {
1311
database: () => firebase.database.Database;
1412
messaging: () => firebase.messaging.Messaging;
1513
storage: () => firebase.storage.Storage;
16-
delete: () => firebase.Promise<any>;
17-
firestore: () => Firestore;
14+
delete: () => Promise<any>;
15+
firestore: () => firebase.firestore.Firestore;
1816
}
1917

2018
export function _firebaseAppFactory(config: FirebaseAppConfig, appName?: string): FirebaseApp {

src/database/firebase_list_observable.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export class FirebaseListObservable<T> extends Observable<T> {
2828
return this.$ref.ref.push(val);
2929
}
3030

31-
set(item: FirebaseOperation, value: Object): firebase.Promise<void> {
31+
set(item: FirebaseOperation, value: Object): Promise<void> {
3232
return this._checkOperationCases(item, {
3333
stringCase: () => this.$ref.ref.child(<string>item).set(value),
3434
firebaseCase: () => (<firebase.database.Reference>item).set(value),
@@ -37,7 +37,7 @@ export class FirebaseListObservable<T> extends Observable<T> {
3737
});
3838
}
3939

40-
update(item: FirebaseOperation, value: Object): firebase.Promise<void> {
40+
update(item: FirebaseOperation, value: Object): Promise<void> {
4141
return this._checkOperationCases(item, {
4242
stringCase: () => this.$ref.ref.child(<string>item).update(value),
4343
firebaseCase: () => (<firebase.database.Reference>item).update(value),
@@ -46,7 +46,7 @@ export class FirebaseListObservable<T> extends Observable<T> {
4646
});
4747
}
4848

49-
remove(item?:FirebaseOperation): firebase.Promise<void> {
49+
remove(item?:FirebaseOperation): Promise<void> {
5050
// if no item parameter is provided, remove the whole list
5151
if (!item) {
5252
return this.$ref.ref.remove();
@@ -59,7 +59,7 @@ export class FirebaseListObservable<T> extends Observable<T> {
5959
});
6060
}
6161

62-
protected _checkOperationCases(item: FirebaseOperation, cases: FirebaseOperationCases) : firebase.Promise<void> {
62+
protected _checkOperationCases(item: FirebaseOperation, cases: FirebaseOperationCases) : Promise<void> {
6363
if (utils.isString(item)) {
6464
return cases.stringCase();
6565
} else if (utils.isFirebaseRef(item)) {

src/database/firebase_object_observable.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,19 @@ export class FirebaseObjectObservable<T> extends Observable<T> {
1616
observable.$ref = this.$ref;
1717
return observable;
1818
}
19-
set(value: any): firebase.Promise<void> {
19+
set(value: any): Promise<void> {
2020
if(!this.$ref) {
2121
throw new Error('No ref specified for this Observable!');
2222
}
2323
return this.$ref.set(value);
2424
}
25-
update(value: Object): firebase.Promise<void> {
25+
update(value: Object): Promise<void> {
2626
if(!this.$ref) {
2727
throw new Error('No ref specified for this Observable!');
2828
}
2929
return this.$ref.update(value);
3030
}
31-
remove(): firebase.Promise<void> {
31+
remove(): Promise<void> {
3232
if(!this.$ref) {
3333
throw new Error('No ref specified for this Observable!');
3434
}

src/database/interfaces.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import * as firebase from 'firebase/app';
22
import { Observable } from 'rxjs/Observable';
33

44
export interface FirebaseOperationCases {
5-
stringCase: () => firebase.Promise<void>;
6-
firebaseCase?: () => firebase.Promise<void>;
7-
snapshotCase?: () => firebase.Promise<void>;
8-
unwrappedSnapshotCase?: () => firebase.Promise<void>;
5+
stringCase: () => Promise<void>;
6+
firebaseCase?: () => Promise<void>;
7+
snapshotCase?: () => Promise<void>;
8+
unwrappedSnapshotCase?: () => Promise<void>;
99
}
1010

1111
export interface AFUnwrappedDataSnapshot {

src/firestore/collection/changes.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { fromCollectionRef } from '../observable/fromRef';
2-
import { Query, DocumentChangeType, DocumentChange, DocumentSnapshot, QuerySnapshot } from 'firestore';
2+
import * as firebase from 'firebase/app';
3+
import 'firebase/firestore';
34
import { Observable } from 'rxjs/Observable';
45
import 'rxjs/add/operator/map';
56
import 'rxjs/add/operator/filter';
@@ -12,7 +13,7 @@ import { DocumentChangeAction, Action } from '../interfaces';
1213
* order of occurence.
1314
* @param query
1415
*/
15-
export function docChanges(query: Query): Observable<DocumentChangeAction[]> {
16+
export function docChanges(query: firebase.firestore.Query): Observable<DocumentChangeAction[]> {
1617
return fromCollectionRef(query)
1718
.map(action =>
1819
action.payload.docChanges
@@ -23,7 +24,7 @@ export function docChanges(query: Query): Observable<DocumentChangeAction[]> {
2324
* Return a stream of document changes on a query. These results are in sort order.
2425
* @param query
2526
*/
26-
export function sortedChanges(query: Query, events: DocumentChangeType[]): Observable<DocumentChangeAction[]> {
27+
export function sortedChanges(query: firebase.firestore.Query, events: firebase.firestore.DocumentChangeType[]): Observable<DocumentChangeAction[]> {
2728
return fromCollectionRef(query)
2829
.map(changes => changes.payload.docChanges)
2930
.scan((current, changes) => combineChanges(current, changes, events), [])
@@ -38,7 +39,7 @@ export function sortedChanges(query: Query, events: DocumentChangeType[]): Obser
3839
* @param changes
3940
* @param events
4041
*/
41-
export function combineChanges(current: DocumentChange[], changes: DocumentChange[], events: DocumentChangeType[]) {
42+
export function combineChanges(current: firebase.firestore.DocumentChange[], changes: firebase.firestore.DocumentChange[], events: firebase.firestore.DocumentChangeType[]) {
4243
changes.forEach(change => {
4344
// skip unwanted change types
4445
if(events.indexOf(change.type) > -1) {
@@ -53,18 +54,21 @@ export function combineChanges(current: DocumentChange[], changes: DocumentChang
5354
* @param combined
5455
* @param change
5556
*/
56-
export function combineChange(combined: DocumentChange[], change: DocumentChange): DocumentChange[] {
57+
export function combineChange(combined: firebase.firestore.DocumentChange[], change: firebase.firestore.DocumentChange): firebase.firestore.DocumentChange[] {
5758
switch(change.type) {
5859
case 'added':
5960
combined.splice(change.newIndex, 0, change);
6061
break;
6162
case 'modified':
63+
debugger;
6264
// When an item changes position we first remove it
6365
// and then add it's new position
6466
if(change.oldIndex !== change.newIndex) {
6567
combined.splice(change.oldIndex, 1);
66-
}
67-
combined.splice(change.newIndex, 1, change);
68+
combined.splice(change.newIndex, 0, change);
69+
} else {
70+
combined.splice(change.newIndex, 1, change);
71+
}
6872
break;
6973
case 'removed':
7074
combined.splice(change.oldIndex, 1);

src/firestore/collection/collection.spec.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { AngularFirestoreCollection } from './collection';
66
import { QueryFn } from '../interfaces';
77

88
import * as firebase from 'firebase/app';
9-
import * as firestore from 'firestore';
109
import { Observable } from 'rxjs/Observable';
1110
import { of } from 'rxjs/observable/of';
1211
import { Subscription } from 'rxjs/Subscription';
@@ -26,7 +25,7 @@ async function collectionHarness(afs: AngularFirestore, items: number, queryFn?:
2625
return { randomCollectionName, ref, stocks, names };
2726
}
2827

29-
fdescribe('AngularFirestoreCollection', () => {
28+
describe('AngularFirestoreCollection', () => {
3029
let app: firebase.app.App;
3130
let afs: AngularFirestore;
3231
let sub: Subscription;
@@ -78,7 +77,7 @@ fdescribe('AngularFirestoreCollection', () => {
7877

7978
describe('snapshotChanges()', () => {
8079

81-
fit('should listen to all snapshotChanges() by default', async (done) => {
80+
it('should listen to all snapshotChanges() by default', async (done) => {
8281
const ITEMS = 10;
8382
let count = 0;
8483
const { randomCollectionName, ref, stocks, names } = await collectionHarness(afs, ITEMS);
@@ -103,14 +102,13 @@ fdescribe('AngularFirestoreCollection', () => {
103102
});
104103
});
105104

106-
it('should update order on queries', async (done) => {
105+
fit('should update order on queries', async (done) => {
107106
const ITEMS = 10;
108107
let count = 0;
109108
let firstIndex = 0;
110109
const { randomCollectionName, ref, stocks, names } =
111110
await collectionHarness(afs, ITEMS, ref => ref.orderBy('price', 'desc'));
112111
const sub = stocks.snapshotChanges().subscribe(data => {
113-
debugger;
114112
count = count + 1;
115113
// the first time should all be 'added'
116114
if(count === 1) {

src/firestore/collection/collection.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import * as firebase from 'firebase/app';
2-
import 'firestore';
3-
import { Firestore, CollectionReference, DocumentReference, Query, DocumentChangeType, SnapshotMetadata, DocumentSnapshot, QuerySnapshot, DocumentChange } from 'firestore';
2+
import 'firebase/firestore';
43
import { Observable } from 'rxjs/Observable';
54
import { Subscriber } from 'rxjs/Subscriber';
65
import { fromCollectionRef } from '../observable/fromRef';
@@ -14,7 +13,7 @@ import { QueryFn, AssociatedReference, DocumentChangeAction } from '../interface
1413
import { docChanges, sortedChanges } from './changes';
1514
import { AngularFirestoreDocument } from '../document/document';
1615

17-
export function validateEventsArray(events?: DocumentChangeType[]) {
16+
export function validateEventsArray(events?: firebase.firestore.DocumentChangeType[]) {
1817
if(!events || events!.length === 0) {
1918
events = ['added', 'removed', 'modified'];
2019
}
@@ -56,16 +55,16 @@ export class AngularFirestoreCollection<T> {
5655
* @param ref
5756
*/
5857
constructor(
59-
public readonly ref: CollectionReference,
60-
private readonly query: Query) { }
58+
public readonly ref: firebase.firestore.CollectionReference,
59+
private readonly query: firebase.firestore.Query) { }
6160

6261
/**
6362
* Listen to the latest change in the stream. This method returns changes
6463
* as they occur and they are not sorted by query order. This allows you to construct
6564
* your own data structure.
6665
* @param events
6766
*/
68-
stateChanges(events?: DocumentChangeType[]): Observable<DocumentChangeAction[]> {
67+
stateChanges(events?: firebase.firestore.DocumentChangeType[]): Observable<DocumentChangeAction[]> {
6968
if(!events || events.length === 0) {
7069
return docChanges(this.query);
7170
}
@@ -79,7 +78,7 @@ export class AngularFirestoreCollection<T> {
7978
* but it collects each event in an array over time.
8079
* @param events
8180
*/
82-
auditTrail(events?: DocumentChangeType[]): Observable<DocumentChangeAction[]> {
81+
auditTrail(events?: firebase.firestore.DocumentChangeType[]): Observable<DocumentChangeAction[]> {
8382
return this.stateChanges(events).scan((current, action) => [...current, ...action], []);
8483
}
8584

@@ -88,15 +87,15 @@ export class AngularFirestoreCollection<T> {
8887
* query order.
8988
* @param events
9089
*/
91-
snapshotChanges(events?: DocumentChangeType[]): Observable<DocumentChangeAction[]> {
90+
snapshotChanges(events?: firebase.firestore.DocumentChangeType[]): Observable<DocumentChangeAction[]> {
9291
events = validateEventsArray(events);
9392
return sortedChanges(this.query, events);
9493
}
9594

9695
/**
9796
* Listen to all documents in the collection and its possible query as an Observable.
9897
*/
99-
valueChanges(events?: DocumentChangeType[]): Observable<T[]> {
98+
valueChanges(events?: firebase.firestore.DocumentChangeType[]): Observable<T[]> {
10099
return this.snapshotChanges()
101100
.map(actions => actions.map(a => a.payload.doc.data()) as T[]);
102101
}

src/firestore/document/document.spec.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { AngularFirestoreModule } from '../firestore.module';
44
import { AngularFirestoreDocument } from '../document/document';
55

66
import * as firebase from 'firebase/app';
7-
import * as firestore from 'firestore';
87
import { Observable } from 'rxjs/Observable';
98
import { Subscription } from 'rxjs/Subscription';
109

@@ -13,7 +12,7 @@ import { COMMON_CONFIG } from '../test-config';
1312

1413
import { Stock, randomName, FAKE_STOCK_DATA } from '../utils.spec';
1514

16-
fdescribe('AngularFirestoreDocument', () => {
15+
describe('AngularFirestoreDocument', () => {
1716
let app: firebase.app.App;
1817
let afs: AngularFirestore;
1918
let sub: Subscription;

src/firestore/document/document.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import * as firebase from 'firebase/app';
2-
import 'firestore';
3-
import { Firestore, CollectionReference, DocumentReference, Query, DocumentChangeType, SnapshotMetadata, DocumentSnapshot, QuerySnapshot, DocumentChange } from 'firestore';
2+
import 'firebase/firestore';
43
import { Observable } from 'rxjs/Observable';
54
import { Subscriber } from 'rxjs/Subscriber';
65
import { QueryFn, AssociatedReference, Action } from '../interfaces';
@@ -43,7 +42,7 @@ export class AngularFirestoreDocument<T> {
4342
* for data operations, data streaming, and Symbol.observable.
4443
* @param ref
4544
*/
46-
constructor(public ref: DocumentReference) { }
45+
constructor(public ref: firebase.firestore.DocumentReference) { }
4746

4847
/**
4948
* Create or overwrite a single document.
@@ -83,7 +82,7 @@ export class AngularFirestoreDocument<T> {
8382
/**
8483
* Listen to snapshot updates from the document.
8584
*/
86-
snapshotChanges(): Observable<Action<DocumentSnapshot>> {
85+
snapshotChanges(): Observable<Action<firebase.firestore.DocumentSnapshot>> {
8786
return fromDocRef(this.ref);
8887
}
8988

src/firestore/firestore.module.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { NgModule, NgZone } from '@angular/core';
22
import { FirebaseApp, AngularFireModule } from 'angularfire2';
33
import { AngularFirestore } from './firestore';
4-
import * as firestore from 'firestore';
54

65
export function _getAngularFirestore(app: FirebaseApp) {
76
return new AngularFirestore(app);

src/firestore/firestore.spec.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { AngularFirestoreDocument } from './document/document';
55
import { AngularFirestoreCollection } from './collection/collection';
66

77
import * as firebase from 'firebase/app';
8-
import * as firestore from 'firestore';
98
import { Observable } from 'rxjs/Observable';
109
import { Subscription } from 'rxjs/Subscription';
1110

src/firestore/firestore.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import * as firebase from 'firebase/app';
2-
import 'firestore';
3-
import { Firestore, CollectionReference, DocumentReference, Query, DocumentChangeType, SnapshotMetadata, DocumentSnapshot, QuerySnapshot, DocumentChange } from 'firestore';
2+
import 'firebase/firestore';
43
import { Observable } from 'rxjs/Observable';
54
import { Subscriber } from 'rxjs/Subscriber';
65
import 'rxjs/add/operator/map';
@@ -25,7 +24,7 @@ import { AngularFirestoreCollection } from './collection/collection';
2524
* return ref.where('age', '<', 200);
2625
* });
2726
*/
28-
export function associateQuery(collectionRef: CollectionReference, queryFn = ref => ref): AssociatedReference {
27+
export function associateQuery(collectionRef: firebase.firestore.CollectionReference, queryFn = ref => ref): AssociatedReference {
2928
const query = queryFn(collectionRef);
3029
const ref = collectionRef;
3130
return { query, ref };
@@ -88,7 +87,7 @@ export function associateQuery(collectionRef: CollectionReference, queryFn = ref
8887
*/
8988
@Injectable()
9089
export class AngularFirestore {
91-
public readonly firestore: Firestore;
90+
public readonly firestore: firebase.firestore.Firestore;
9291

9392
/**
9493
* Each Feature of AngularFire has a FirebaseApp injected. This way we

src/firestore/interfaces.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Subscriber } from 'rxjs/Subscriber';
2-
import { Firestore, CollectionReference, DocumentReference, Query, DocumentChangeType, SnapshotMetadata, DocumentSnapshot, QuerySnapshot, DocumentChange } from 'firestore';
2+
import * as firebase from 'firebase/app';
33

44
export interface DocumentChangeAction {
5-
type: DocumentChangeType;
6-
payload: DocumentChange;
5+
type: firebase.firestore.DocumentChangeType;
6+
payload: firebase.firestore.DocumentChange;
77
}
88

99
export interface Action<T> {
@@ -17,7 +17,7 @@ export interface Reference<T> {
1717

1818
// A convience type for making a query.
1919
// Example: const query = (ref) => ref.where('name', == 'david');
20-
export type QueryFn = (ref: CollectionReference) => Query;
20+
export type QueryFn = (ref: firebase.firestore.CollectionReference) => firebase.firestore.Query;
2121

2222
/**
2323
* A structure that provides an association between a reference
@@ -42,6 +42,6 @@ export type QueryFn = (ref: CollectionReference) => Query;
4242
* });
4343
*/
4444
export interface AssociatedReference {
45-
ref: CollectionReference;
46-
query: Query;
45+
ref: firebase.firestore.CollectionReference;
46+
query: firebase.firestore.Query;
4747
}

0 commit comments

Comments
 (0)