Skip to content

Commit bd04316

Browse files
committed
refactor(services): migrate angular.service -> module
1 parent ed36b9d commit bd04316

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+2206
-2176
lines changed

angularFiles.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ angularFiles = {
7070
'src/jstd-scenario-adapter/*.js',
7171
'src/scenario/*.js',
7272
'src/angular-mocks.js',
73-
'test/mocks.js',
7473
'test/scenario/*.js',
7574
'test/scenario/output/*.js',
7675
'test/jstd-scenario-adapter/*.js',
@@ -133,7 +132,6 @@ angularFiles = {
133132
'src/jstd-scenario-adapter/*.js',
134133
'src/scenario/*.js',
135134
'src/angular-mocks.js',
136-
'test/mocks.js',
137135
'test/scenario/*.js',
138136
'test/scenario/output/*.js',
139137
'test/jstd-scenario-adapter/*.js',

docs/src/templates/docs.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,12 @@ function TutorialInstructionsCtrl($cookieStore) {
148148
};
149149
}
150150

151-
angular.service('$locationConfig', function() {
152-
return {
151+
window.angular = window.angular || {};
152+
angular.module = angular.module || {};
153+
154+
angular.module.ngdocs = function($provide) {
155+
$provide.value('$locationConfig', {
153156
html5Mode: true,
154157
hashPrefix: '!'
155-
};
156-
});
158+
});
159+
};

example/personalLog/test/personalLogSpec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ describe('example.personalLog.LogCtrl', function() {
22
var logCtrl;
33

44
function createNotesCtrl() {
5-
var injector = angular.injector('NG');
5+
var injector = angular.injector('NG', 'NG_MOCK');
66
var scope = injector('$rootScope');
77
scope.$cookies = injector('$cookies');
88
return scope.$new(example.personalLog.LogCtrl);

src/Angular.js

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ var _undefined = undefined,
9999
: noop,
100100

101101
/** @name angular */
102-
angular = window[$angular] || (window[$angular] = {}),
103-
angularModules = angular.modules || (angular.modules = {}),
102+
angular = window.angular || (window.angular = {}),
103+
angularModule = angular.module || (angular.module = {}),
104104
/** @name angular.markup */
105105
angularTextMarkup = extensionMap(angular, 'markup'),
106106
/** @name angular.attrMarkup */
@@ -114,7 +114,6 @@ var _undefined = undefined,
114114
/** @name angular.service */
115115
angularInputType = extensionMap(angular, 'inputType', lowercase),
116116
/** @name angular.service */
117-
angularService = extensionMap(angular, 'service'),
118117
angularCallbacks = extensionMap(angular, 'callbacks'),
119118
nodeName_,
120119
uid = ['0', '0', '0'],
@@ -188,18 +187,6 @@ function forEachSorted(obj, iterator, context) {
188187
}
189188

190189

191-
function formatError(arg) {
192-
if (arg instanceof Error) {
193-
if (arg.stack) {
194-
arg = (arg.message && arg.stack.indexOf(arg.message) === -1) ?
195-
'Error: ' + arg.message + '\n' + arg.stack : arg.stack;
196-
} else if (arg.sourceURL) {
197-
arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line;
198-
}
199-
}
200-
return arg;
201-
}
202-
203190
/**
204191
* A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric
205192
* characters such as '012ABC'. The reason why we are not using simply a number counter is that
@@ -957,7 +944,7 @@ function angularInit(config, document){
957944
modules.push(module);
958945
}
959946
});
960-
createInjector(modules, angularModules)(['$rootScope', '$compile', function(scope, compile){
947+
createInjector(modules, angularModule)(['$rootScope', '$compile', '$injector', function(scope, compile, injector){
961948
scope.$apply(function(){
962949
compile(isString(autobind) ? document.getElementById(autobind) : document)(scope);
963950
});
@@ -1030,7 +1017,7 @@ function publishExternalAPI(angular){
10301017
'extend': extend,
10311018
'equals': equals,
10321019
'forEach': forEach,
1033-
'injector': function(){ return createInjector(arguments, angularModules); },
1020+
'injector': function(){ return createInjector(arguments, angularModule); },
10341021
'noop':noop,
10351022
'bind':bind,
10361023
'toJson': toJson,
@@ -1049,14 +1036,39 @@ function publishExternalAPI(angular){
10491036
'uppercase': uppercase
10501037
});
10511038

1052-
angularModules.NG = ngModule;
1039+
angularModule.NG = ngModule;
10531040
}
10541041

1055-
ngModule.$inject = ['$provide'];
1056-
function ngModule($provide) {
1057-
forEach(angularService, function(factory, name){
1058-
$provide.factory(name, factory);
1059-
});
1042+
ngModule.$inject = ['$provide', '$injector'];
1043+
function ngModule($provide, $injector) {
1044+
// TODO(misko): temporary services to get the compiler working;
1045+
$provide.value('$textMarkup', angularTextMarkup);
1046+
$provide.value('$attrMarkup', angularAttrMarkup);
1047+
$provide.value('$directive', angularDirective);
1048+
$provide.value('$widget', angularWidget);
1049+
1050+
$provide.service('$browser', $BrowserProvider);
1051+
$provide.service('$compile', $CompileProvider);
1052+
$provide.service('$cookies', $CookiesProvider);
1053+
$provide.service('$cookieStore', $CookieStoreProvider);
1054+
$provide.service('$defer', $DeferProvider);
1055+
$provide.service('$document', $DocumentProvider);
1056+
$provide.service('$exceptionHandler', $ExceptionHandlerProvider);
1057+
$provide.service('$formFactory', $FormFactoryProvider);
1058+
$provide.service('$locale', $LocaleProvider);
1059+
$provide.service('$location', $LocationProvider);
1060+
$provide.service('$locationConfig', $LocationConfigProvider);
1061+
$provide.service('$log', $LogProvider);
1062+
$provide.service('$resource', $ResourceProvider);
1063+
$provide.service('$route', $RouteProvider);
1064+
$provide.service('$routeParams', $RouteParamsProvider);
1065+
$provide.service('$rootScope', $RootScopeProvider);
1066+
$provide.service('$sniffer', $SnifferProvider);
1067+
$provide.service('$window', $WindowProvider);
1068+
$provide.service('$xhr.bulk', $XhrBulkProvider);
1069+
$provide.service('$xhr.cache', $XhrCacheProvider);
1070+
$provide.service('$xhr.error', $XhrErrorProvider);
1071+
$provide.service('$xhr', $XhrProvider);
10601072
}
10611073

10621074

src/AngularPublic.js

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,5 @@
11
'use strict';
22

3-
var browserSingleton;
4-
5-
angularService('$browser', function($log, $sniffer) {
6-
if (!browserSingleton) {
7-
browserSingleton = new Browser(window, jqLite(window.document), jqLite(window.document.body),
8-
XHR, $log, $sniffer);
9-
}
10-
return browserSingleton;
11-
}, {$inject: ['$log', '$sniffer']});
12-
13-
143
publishExternalAPI(angular);
154

165
//try to bind to jquery now so that one can write angular.element().read()

src/Browser.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,3 +473,10 @@ function Browser(window, document, body, XHR, $log, $sniffer) {
473473
return href ? href.replace(/^https?\:\/\/[^\/]*/, '') : href;
474474
};
475475
}
476+
477+
function $BrowserProvider(){
478+
this.$get = ['$window', '$log', '$sniffer', '$document',
479+
function( $window, $log, $sniffer, $document){
480+
return new Browser($window, $document, $document.find('body'), XHR, $log, $sniffer);
481+
}];
482+
}

src/Injector.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,6 @@
3333
* `injector.eager()`
3434
*/
3535

36-
function angularServiceInject(name, fn, inject, eager) {
37-
angularService(name, fn, {$inject:inject, $eager:eager});
38-
}
39-
4036

4137
/**
4238
* @returns the $inject property of function. If not found the
@@ -177,7 +173,11 @@ function createInjector(modulesToLoad, moduleRegistry) {
177173

178174
forEach(modulesToLoad, function(module){
179175
if (isString(module)) {
180-
module = moduleRegistry[module];
176+
if (moduleRegistry[module]) {
177+
module = moduleRegistry[module];
178+
} else {
179+
throw Error("Module '" + module + "' is not defined!");
180+
}
181181
}
182182
if (isFunction(module) || isArray(module)) {
183183
$injector(module);

src/angular-mocks.js

Lines changed: 75 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
'use strict';
21

32
/**
43
* @license AngularJS v"NG_VERSION_FULL"
@@ -8,30 +7,6 @@
87

98

109
/*
11-
12-
NUGGGGGH MUST TONGUE WANGS
13-
\
14-
.....
15-
C C /
16-
/< /
17-
___ __________/_#__=o
18-
/(- /(\_\________ \
19-
\ ) \ )_ \o \
20-
/|\ /|\ |' |
21-
| _|
22-
/o __\
23-
/ ' |
24-
/ / |
25-
/_/\______|
26-
( _( <
27-
\ \ \
28-
\ \ |
29-
\____\____\
30-
____\_\__\_\
31-
/` /` o\
32-
|___ |_______|.. . b'ger
33-
34-
3510
IN THE FINAL BUILD THIS FILE DOESN'T HAVE DIRECT ACCESS TO GLOBAL FUNCTIONS
3611
DEFINED IN Angular.js YOU *MUST* REFER TO THEM VIA angular OBJECT
3712
(e.g. angular.forEach(...)) AND MAKE SURE THAT THE GIVEN FUNCTION IS EXPORTED
@@ -56,8 +31,15 @@
5631
* the angular service exception handler.
5732
* * {@link angular.mock.service.$log $log } - A mock implementation of the angular service log.
5833
*/
59-
angular.mock = {};
34+
window.angular = window.angular || {};
35+
angular.module = angular.module || {};
36+
angular.mock = angular.mock || {};
6037

38+
angular.module.NG_MOCK = ['$provide', function($provide){
39+
$provide.service('$browser', angular.mock.$BrowserProvider);
40+
$provide.service('$exceptionHandler', angular.mock.$ExceptionHandlerProvider);
41+
$provide.service('$log', angular.mock.$LogProvider);
42+
}];
6143

6244
/**
6345
* @ngdoc service
@@ -81,7 +63,12 @@ angular.mock = {};
8163
* - $browser.defer — enables testing of code that uses
8264
* {@link angular.service.$defer $defer service} for executing functions via the `setTimeout` api.
8365
*/
84-
function MockBrowser() {
66+
angular.mock.$BrowserProvider = function(){
67+
this.$get = function(){
68+
return new angular.mock.$Browser();
69+
};
70+
};
71+
angular.mock.$Browser = function() {
8572
var self = this,
8673
expectations = {},
8774
requests = [];
@@ -309,7 +296,7 @@ function MockBrowser() {
309296
return this.$$baseHref;
310297
};
311298
}
312-
MockBrowser.prototype = {
299+
angular.mock.$Browser.prototype = {
313300

314301
/**
315302
* @name angular.mock.service.$browser#poll
@@ -360,10 +347,6 @@ MockBrowser.prototype = {
360347
addJs: function() {}
361348
};
362349

363-
angular.service('$browser', function() {
364-
return new MockBrowser();
365-
});
366-
367350

368351
/**
369352
* @ngdoc service
@@ -376,9 +359,29 @@ angular.service('$browser', function() {
376359
*
377360
* See {@link angular.mock} for more info on angular mocks.
378361
*/
379-
angular.service('$exceptionHandler', function() {
380-
return function(e) { throw e; };
381-
});
362+
angular.mock.$ExceptionHandlerProvider = function(){
363+
var handler;
364+
365+
this.mode = function(mode){
366+
handler = {
367+
rethrow: function(e) {
368+
throw e;
369+
},
370+
log: angular.extend(function log(e) {
371+
log.errors.push(e);
372+
}, {errors:[]})
373+
}[mode];
374+
if (!handler) {
375+
throw Error("Unknown mode '" + mode + "', only 'log'/'rethrow' modes are allowed!");
376+
}
377+
};
378+
379+
this.$get = function(){
380+
return handler;
381+
};
382+
383+
this.mode('rethrow');
384+
};
382385

383386

384387
/**
@@ -392,23 +395,43 @@ angular.service('$exceptionHandler', function() {
392395
*
393396
* See {@link angular.mock} for more info on angular mocks.
394397
*/
395-
angular.service('$log', MockLogFactory);
396-
397-
function MockLogFactory() {
398-
var $log = {
399-
log: function() { $log.log.logs.push(arguments); },
400-
warn: function() { $log.warn.logs.push(arguments); },
401-
info: function() { $log.info.logs.push(arguments); },
402-
error: function() { $log.error.logs.push(arguments); }
403-
};
398+
angular.mock.$LogProvider = function(){
399+
this.$get = function () {
400+
var $log = {
401+
log: function() { $log.log.logs.push(concat([], arguments, 0)); },
402+
warn: function() { $log.warn.logs.push(concat([], arguments, 0)); },
403+
info: function() { $log.info.logs.push(concat([], arguments, 0)); },
404+
error: function() { $log.error.logs.push(concat([], arguments, 0)); }
405+
};
404406

405-
$log.log.logs = [];
406-
$log.warn.logs = [];
407-
$log.info.logs = [];
408-
$log.error.logs = [];
407+
$log.reset = function (){
408+
$log.log.logs = [];
409+
$log.warn.logs = [];
410+
$log.info.logs = [];
411+
$log.error.logs = [];
412+
};
409413

410-
return $log;
411-
}
414+
$log.assertEmpty = function(){
415+
var errors = [];
416+
angular.forEach(['error', 'warn', 'info', 'log'], function(logLevel) {
417+
angular.forEach($log[logLevel].logs, function(log) {
418+
angular.forEach(log, function (logItem) {
419+
errors.push('MOCK $log (' + logLevel + '): ' + (logItem.stack || logItem));
420+
});
421+
});
422+
});
423+
if (errors.length) {
424+
errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or an expected " +
425+
"log message was not checked and removed:");
426+
errors.push('')
427+
throw new Error(errors.join('\n---------\n'));
428+
}
429+
};
430+
431+
$log.reset();
432+
return $log;
433+
};
434+
};
412435

413436

414437
/**
@@ -441,7 +464,7 @@ function MockLogFactory() {
441464
* </pre>
442465
*
443466
*/
444-
function TzDate(offset, timestamp) {
467+
angular.mock.TzDate = function (offset, timestamp) {
445468
if (angular.isString(timestamp)) {
446469
var tsStr = timestamp;
447470

@@ -545,4 +568,4 @@ function TzDate(offset, timestamp) {
545568
}
546569

547570
//make "tzDateInstance instanceof Date" return true
548-
TzDate.prototype = Date.prototype;
571+
angular.mock.TzDate.prototype = Date.prototype;

0 commit comments

Comments
 (0)