Skip to content
This repository was archived by the owner on Mar 17, 2025. It is now read-only.

Commit 62d5870

Browse files
committed
Merge branch 'master' into test-coverage
Conflicts: tests/unit/FirebaseObject.spec.js
2 parents 0b4f8e9 + a8c1585 commit 62d5870

File tree

14 files changed

+334
-121
lines changed

14 files changed

+334
-121
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ In order to use AngularFire in your project, you need to include the following f
1818

1919
```html
2020
<!-- AngularJS -->
21-
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
21+
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.8/angular.min.js"></script>
2222

2323
<!-- Firebase -->
24-
<script src="https://cdn.firebase.com/js/client/2.0.4/firebase.js"></script>
24+
<script src="https://cdn.firebase.com/js/client/2.1.0/firebase.js"></script>
2525

2626
<!-- AngularFire -->
27-
<script src="https://cdn.firebase.com/libs/angularfire/0.9.0/angularfire.min.js"></script>
27+
<script src="https://cdn.firebase.com/libs/angularfire/0.9.1/angularfire.min.js"></script>
2828
```
2929

3030
Use the URL above to download both the minified and non-minified versions of AngularFire from the

bower.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@
3131
],
3232
"dependencies": {
3333
"angular": "1.2.x || 1.3.x",
34-
"firebase": "2.0.x"
34+
"firebase": "2.1.x"
3535
},
3636
"devDependencies": {
3737
"lodash": "~2.4.1",
3838
"angular-mocks": "~1.2.18",
39-
"mockfirebase": "0.5.0"
39+
"mockfirebase": "~0.7.0"
4040
}
4141
}

changelog.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +0,0 @@
1-
deprecated - Passing in credentials to the user management methods of `$firebaseAuth` as individual arguments has been deprecated in favor of a single credentials argument.
2-
deprecated - Deprecated `$firebaseAuth.$sendPasswordResetEmail()` in favor of the functionally equivalent `$firebaseAuth.$resetPassword()`.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
],
3333
"dependencies": {
3434
"angular": "1.3.x",
35-
"firebase": "2.0.x"
35+
"firebase": "2.1.x"
3636
},
3737
"devDependencies": {
3838
"coveralls": "^2.11.1",
@@ -52,6 +52,7 @@
5252
"karma-chrome-launcher": "^0.1.4",
5353
"karma-coverage": "^0.2.4",
5454
"karma-failed-reporter": "0.0.2",
55+
"karma-html2js-preprocessor": "~0.1.0",
5556
"karma-jasmine": "~0.2.0",
5657
"karma-phantomjs-launcher": "~0.1.0",
5758
"karma-sauce-launcher": "~0.2.9",

src/FirebaseAuth.js

Lines changed: 93 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
// Define a service which provides user authentication and management.
66
angular.module('firebase').factory('$firebaseAuth', [
77
'$q', '$firebaseUtils', '$log', function($q, $firebaseUtils, $log) {
8-
// This factory returns an object containing the current authentication state of the client.
9-
// This service takes one argument:
10-
//
11-
// * `ref`: A Firebase reference.
12-
//
13-
// The returned object contains methods for authenticating clients, retrieving authentication
14-
// state, and managing users.
8+
/**
9+
* This factory returns an object allowing you to manage the client's authentication state.
10+
*
11+
* @param {Firebase} ref A Firebase reference to authenticate.
12+
* @return {object} An object containing methods for authenticating clients, retrieving
13+
* authentication state, and managing users.
14+
*/
1515
return function(ref) {
1616
var auth = new FirebaseAuth($q, $firebaseUtils, $log, ref);
1717
return auth.construct();
@@ -51,6 +51,7 @@
5151
// User management methods
5252
$createUser: this.createUser.bind(this),
5353
$changePassword: this.changePassword.bind(this),
54+
$changeEmail: this.changeEmail.bind(this),
5455
$removeUser: this.removeUser.bind(this),
5556
$resetPassword: this.resetPassword.bind(this),
5657
$sendPasswordResetEmail: this.sendPasswordResetEmail.bind(this)
@@ -77,7 +78,11 @@
7778
authWithCustomToken: function(authToken, options) {
7879
var deferred = this._q.defer();
7980

80-
this._ref.authWithCustomToken(authToken, this._utils.makeNodeResolver(deferred), options);
81+
try {
82+
this._ref.authWithCustomToken(authToken, this._utils.makeNodeResolver(deferred), options);
83+
} catch (error) {
84+
deferred.reject(error);
85+
}
8186

8287
return deferred.promise;
8388
},
@@ -92,7 +97,11 @@
9297
authAnonymously: function(options) {
9398
var deferred = this._q.defer();
9499

95-
this._ref.authAnonymously(this._utils.makeNodeResolver(deferred), options);
100+
try {
101+
this._ref.authAnonymously(this._utils.makeNodeResolver(deferred), options);
102+
} catch (error) {
103+
deferred.reject(error);
104+
}
96105

97106
return deferred.promise;
98107
},
@@ -109,7 +118,11 @@
109118
authWithPassword: function(credentials, options) {
110119
var deferred = this._q.defer();
111120

112-
this._ref.authWithPassword(credentials, this._utils.makeNodeResolver(deferred), options);
121+
try {
122+
this._ref.authWithPassword(credentials, this._utils.makeNodeResolver(deferred), options);
123+
} catch (error) {
124+
deferred.reject(error);
125+
}
113126

114127
return deferred.promise;
115128
},
@@ -126,7 +139,11 @@
126139
authWithOAuthPopup: function(provider, options) {
127140
var deferred = this._q.defer();
128141

129-
this._ref.authWithOAuthPopup(provider, this._utils.makeNodeResolver(deferred), options);
142+
try {
143+
this._ref.authWithOAuthPopup(provider, this._utils.makeNodeResolver(deferred), options);
144+
} catch (error) {
145+
deferred.reject(error);
146+
}
130147

131148
return deferred.promise;
132149
},
@@ -143,7 +160,11 @@
143160
authWithOAuthRedirect: function(provider, options) {
144161
var deferred = this._q.defer();
145162

146-
this._ref.authWithOAuthRedirect(provider, this._utils.makeNodeResolver(deferred), options);
163+
try {
164+
this._ref.authWithOAuthRedirect(provider, this._utils.makeNodeResolver(deferred), options);
165+
} catch (error) {
166+
deferred.reject(error);
167+
}
147168

148169
return deferred.promise;
149170
},
@@ -162,7 +183,11 @@
162183
authWithOAuthToken: function(provider, credentials, options) {
163184
var deferred = this._q.defer();
164185

165-
this._ref.authWithOAuthToken(provider, credentials, this._utils.makeNodeResolver(deferred), options);
186+
try {
187+
this._ref.authWithOAuthToken(provider, credentials, this._utils.makeNodeResolver(deferred), options);
188+
} catch (error) {
189+
deferred.reject(error);
190+
}
166191

167192
return deferred.promise;
168193
},
@@ -195,11 +220,12 @@
195220
onAuth: function(callback, context) {
196221
var self = this;
197222

198-
this._ref.onAuth(callback, context);
223+
var fn = this._utils.debounce(callback, context, 0);
224+
this._ref.onAuth(fn);
199225

200226
// Return a method to detach the `onAuth()` callback.
201227
return function() {
202-
self._ref.offAuth(callback, context);
228+
self._ref.offAuth(fn);
203229
};
204230
},
205231

@@ -293,7 +319,11 @@
293319
};
294320
}
295321

296-
this._ref.createUser(credentials, this._utils.makeNodeResolver(deferred));
322+
try {
323+
this._ref.createUser(credentials, this._utils.makeNodeResolver(deferred));
324+
} catch (error) {
325+
deferred.reject(error);
326+
}
297327

298328
return deferred.promise;
299329
},
@@ -302,7 +332,7 @@
302332
* Changes the password for an email/password user.
303333
*
304334
* @param {Object|string} emailOrCredentials The email of the user whose password is to change
305-
* or an objet containing the email, old password, and new password of the user whose password
335+
* or an object containing the email, old password, and new password of the user whose password
306336
* is to change.
307337
* @param {string} [oldPassword] The current password for the user.
308338
* @param {string} [newPassword] The new password for the user.
@@ -323,7 +353,34 @@
323353
};
324354
}
325355

326-
this._ref.changePassword(credentials, this._utils.makeNodeResolver(deferred));
356+
try {
357+
this._ref.changePassword(credentials, this._utils.makeNodeResolver(deferred));
358+
} catch (error) {
359+
deferred.reject(error);
360+
}
361+
362+
return deferred.promise;
363+
},
364+
365+
/**
366+
* Changes the email for an email/password user.
367+
*
368+
* @param {Object} credentials An object containing the old email, new email, and password of
369+
* the user whose email is to change.
370+
* @return {Promise<>} An empty promise fulfilled once the email change is complete.
371+
*/
372+
changeEmail: function(credentials) {
373+
if (typeof this._ref.changeEmail !== 'function') {
374+
throw new Error('$firebaseAuth.$changeEmail() requires Firebase version 2.1.0 or greater.');
375+
}
376+
377+
var deferred = this._q.defer();
378+
379+
try {
380+
this._ref.changeEmail(credentials, this._utils.makeNodeResolver(deferred));
381+
} catch (error) {
382+
deferred.reject(error);
383+
}
327384

328385
return deferred.promise;
329386
},
@@ -350,7 +407,11 @@
350407
};
351408
}
352409

353-
this._ref.removeUser(credentials, this._utils.makeNodeResolver(deferred));
410+
try {
411+
this._ref.removeUser(credentials, this._utils.makeNodeResolver(deferred));
412+
} catch (error) {
413+
deferred.reject(error);
414+
}
354415

355416
return deferred.promise;
356417
},
@@ -365,7 +426,14 @@
365426
*/
366427
sendPasswordResetEmail: function(emailOrCredentials) {
367428
this._log.warn("$sendPasswordResetEmail() has been deprecated in favor of the equivalent $resetPassword().");
368-
return this.resetPassword(emailOrCredentials);
429+
430+
try {
431+
return this.resetPassword(emailOrCredentials);
432+
} catch (error) {
433+
return this._q(function(resolve, reject) {
434+
return reject(error);
435+
});
436+
}
369437
},
370438

371439
/**
@@ -388,7 +456,11 @@
388456
};
389457
}
390458

391-
this._ref.resetPassword(credentials, this._utils.makeNodeResolver(deferred));
459+
try {
460+
this._ref.resetPassword(credentials, this._utils.makeNodeResolver(deferred));
461+
} catch (error) {
462+
deferred.reject(error);
463+
}
392464

393465
return deferred.promise;
394466
}

src/FirebaseObject.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
(function() {
22
'use strict';
33
/**
4-
* Creates and maintains a synchronized boject. This constructor should not be
4+
* Creates and maintains a synchronized object. This constructor should not be
55
* manually invoked. Instead, one should create a $firebase object and call $asObject
66
* on it: <code>$firebase( firebaseRef ).$asObject()</code>;
77
*

tests/automatic_karma.conf.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ module.exports = function(config) {
1010
singleRun: true,
1111

1212
preprocessors: {
13-
"../src/*.js": "coverage"
13+
"../src/*.js": "coverage",
14+
"./fixtures/**/*.json": "html2js"
1415
},
1516

1617
coverageReporter: {
@@ -35,6 +36,7 @@ module.exports = function(config) {
3536
'../src/module.js',
3637
'../src/**/*.js',
3738
'mocks/**/*.js',
39+
"fixtures/**/*.json",
3840
'unit/**/*.spec.js'
3941
]
4042
});

tests/fixtures/data.json

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
{
2+
"data": {
3+
"a": {
4+
"aString": "alpha",
5+
"aNumber": 1,
6+
"aBoolean": false
7+
},
8+
"b": {
9+
"aString": "bravo",
10+
"aNumber": 2,
11+
"aBoolean": true
12+
},
13+
"c": {
14+
"aString": "charlie",
15+
"aNumber": 3,
16+
"aBoolean": true
17+
},
18+
"d": {
19+
"aString": "delta",
20+
"aNumber": 4,
21+
"aBoolean": true
22+
},
23+
"e": {
24+
"aString": "echo",
25+
"aNumber": 5
26+
}
27+
},
28+
"index": {
29+
"b": true,
30+
"c": 1,
31+
"e": false,
32+
"z": true
33+
},
34+
"ordered": {
35+
"null_a": {
36+
"aNumber": 0,
37+
"aLetter": "a"
38+
},
39+
"null_b": {
40+
"aNumber": 0,
41+
"aLetter": "b"
42+
},
43+
"null_c": {
44+
"aNumber": 0,
45+
"aLetter": "c"
46+
},
47+
"num_1_a": {
48+
".priority": 1,
49+
"aNumber": 1
50+
},
51+
"num_1_b": {
52+
".priority": 1,
53+
"aNumber": 1
54+
},
55+
"num_2": {
56+
".priority": 2,
57+
"aNumber": 2
58+
},
59+
"num_3": {
60+
".priority": 3,
61+
"aNumber": 3
62+
},
63+
"char_a_1": {
64+
".priority": "a",
65+
"aNumber": 1,
66+
"aLetter": "a"
67+
},
68+
"char_a_2": {
69+
".priority": "a",
70+
"aNumber": 2,
71+
"aLetter": "a"
72+
},
73+
"char_b": {
74+
".priority": "b",
75+
"aLetter": "b"
76+
},
77+
"char_c": {
78+
".priority": "c",
79+
"aLetter": "c"
80+
}
81+
}
82+
}

tests/mocks/mocks.firebase.js

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1 @@
1-
2-
angular.module('mock.firebase', [])
3-
.run(function($window) {
4-
$window.mockfirebase.override();
5-
$window.Firebase = $window.MockFirebase;
6-
})
7-
.factory('Firebase', function($window) {
8-
return $window.MockFirebase;
9-
});
1+
MockFirebase.override();

0 commit comments

Comments
 (0)