Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/news.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Posselt <dev@bernhard-posselt.com>2014-05-22 01:43:28 +0400
committerBernhard Posselt <dev@bernhard-posselt.com>2014-05-22 01:43:28 +0400
commit0fa67552247b2d29a6ca438c2605b8db2bbdbab7 (patch)
tree8109135e2fc141a324e8f21c66243ee4277b3b7c
parentd3a774b2bd79654360a3ef12618102abf85a2ce3 (diff)
es6 all the things
-rw-r--r--js/.jshintrc43
-rw-r--r--js/Gruntfile.js78
-rw-r--r--js/app/App.js2
-rw-r--r--js/app/Config.js25
-rw-r--r--js/app/Run.js44
-rw-r--r--js/bower.json3
-rw-r--r--js/build/app.js1072
-rw-r--r--js/controller/AppController.js6
-rw-r--r--js/controller/ContentController.js7
-rw-r--r--js/gui/keyboardshortcuts.js100
-rw-r--r--js/karma.conf.js34
-rw-r--r--js/package.json8
-rw-r--r--js/service/FeedResource.js12
-rw-r--r--js/service/FolderResource.js12
-rw-r--r--js/service/ItemResource.js45
-rw-r--r--js/service/Loading.js4
-rw-r--r--js/service/Publisher.js28
-rw-r--r--js/service/Resource.js68
-rw-r--r--js/service/Settings.js13
-rw-r--r--js/tests/e2e/main.js7
-rw-r--r--js/tests/unit/controller/AppControllerSpec.js14
-rw-r--r--js/tests/unit/controller/ContentControllerSpec.js8
-rw-r--r--js/tests/unit/service/ItemResourceSpec.js8
-rw-r--r--js/tests/unit/service/LoadingSpec.js6
-rw-r--r--js/tests/unit/service/PublisherSpec.js10
-rw-r--r--js/tests/unit/service/ResourceSpec.js109
-rw-r--r--js/tests/unit/service/SettingsSpec.js6
-rw-r--r--js/tests/unit/stubs/App.js (renamed from js/tests/unit/stubs/app.js)7
-rw-r--r--js/tests/unit/stubs/OC.js (renamed from js/tests/unit/stubs/oc.js)4
-rw-r--r--js/vendor/traceur-runtime/.bower.json22
-rw-r--r--js/vendor/traceur-runtime/README.md35
-rw-r--r--js/vendor/traceur-runtime/traceur-runtime.js1712
-rw-r--r--js/vendor/traceur-runtime/traceur-runtime.min.js2
-rw-r--r--js/vendor/traceur-runtime/traceur-runtime.min.map1
34 files changed, 2681 insertions, 874 deletions
diff --git a/js/.jshintrc b/js/.jshintrc
new file mode 100644
index 000000000..cd85aa807
--- /dev/null
+++ b/js/.jshintrc
@@ -0,0 +1,43 @@
+{
+ "esnext": true,
+ "bitwise": false,
+ "camelcase": true,
+ "curly": true,
+ "eqeqeq": true,
+ "forin": false,
+ "immed": true,
+ "indent": 4,
+ "latedef": true,
+ "newcap": true,
+ "noarg": true,
+ "noempty": true,
+ "nonew": true,
+ "plusplus": true,
+ "quotmark": "single",
+ "undef": false,
+ "unused": true,
+ "strict": true,
+ "maxparams": false,
+ "maxdepth": 3,
+ "maxlen": 80,
+ "browser": true,
+ "devel": true,
+ "jquery": true,
+ "globals": {
+ "angular": true,
+ "app": true,
+ "OC": true,
+ "csrfToken": true,
+ "inject": true,
+ "module": true,
+ "protractor": true,
+ "browser": true,
+ "By": true,
+ "jasmine": true,
+ "it": true,
+ "describe": true,
+ "beforeEach": true,
+ "expect": true,
+ "exports": true
+ }
+}
diff --git a/js/Gruntfile.js b/js/Gruntfile.js
index 1baf2d7d1..e40900f5a 100644
--- a/js/Gruntfile.js
+++ b/js/Gruntfile.js
@@ -7,36 +7,6 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2012, 2014
*/
-
-var globals = [
- // libs
- '$',
- 'jQuery',
- 'angular',
- // app
- 'app',
- // ownCloud
- 'OC',
- 'oc_requesttoken',
- // angular
- 'inject',
- 'module',
-
- // protractor
- 'protractor',
- 'browser',
- 'By',
- // jasmine
- 'jasmine',
- 'it',
- 'describe',
- 'beforeEach',
- 'expect',
- // js
- 'console',
- 'exports'
-];
-
module.exports = function (grunt) {
'use strict';
@@ -44,11 +14,12 @@ module.exports = function (grunt) {
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-connect');
- grunt.loadNpmTasks('grunt-jslint');
+ grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-phpunit');
grunt.loadNpmTasks('grunt-wrap');
grunt.loadNpmTasks('grunt-karma');
grunt.loadNpmTasks('grunt-ngmin');
+ grunt.loadNpmTasks('grunt-traceur');
grunt.loadNpmTasks('grunt-protractor-runner');
grunt.loadNpmTasks('grunt-protractor-webdriver');
@@ -72,7 +43,6 @@ module.exports = function (grunt) {
'filter/**/*.js',
'service/**/*.js',
'gui/**/*.js',
- 'model/**/*.js',
'directive/**/*.js'
],
dest: '<%= meta.production %>app.js'
@@ -84,37 +54,50 @@ module.exports = function (grunt) {
dest: '<%= meta.production %>app.js'
}
},
+ traceur: {
+ app: {
+ files: {
+ '<%= meta.production %>app.js': ['<%= meta.production %>app.js']
+ }
+ },
+ options: {
+ blockBinding: true,
+ sourceMap: false,
+ experimental: true,
+ modules: 'inline'
+ }
+ },
wrap: {
basic: {
src: ['<%= meta.production %>app.js'],
dest: '<%= meta.production %>app.js',
options: {
wrapper: [
- '(function(angular, $, OC, oc_requesttoken, undefined){\n\n\'use strict\';\n\n',
- '\n})(angular, jQuery, OC, oc_requesttoken);'
+ '(function(window, document, angular, $, OC, ' +
+ 'csrfToken, undefined){\n\n\'use strict\';\n\n',
+
+ '\n})(window, document, angular, jQuery, OC, ' +
+ 'oc_requesttoken);'
]
}
}
},
- jslint: {
- browser: {
+ jshint: {
+ app: {
src: [
- 'app/**/*.js',
+ 'app/Config.js',
+ 'app/Run.js',
'filter/**/*.js',
'service/**/*.js',
'model/**/*.js',
'controller/**/*.js',
'directive/**/*.js',
'tests/**/*.js',
- 'gui/**/*.js',
- 'Gruntfile.js',
- 'karma.conf.js',
- 'protractor*conf.js'
- ],
- directives: {
- browser: true,
- predef: globals
- }
+ 'gui/**/*.js'
+ ]
+ },
+ options: {
+ jshintrc: true
}
},
watch: {
@@ -146,7 +129,6 @@ module.exports = function (grunt) {
karma: {
unit: {
configFile: 'karma.conf.js',
- browsers: ['PhantomJS'],
autoWatch: true
},
continuous: {
@@ -199,7 +181,7 @@ module.exports = function (grunt) {
});
// make tasks available under simpler commands
- grunt.registerTask('default', ['jslint', 'concat', 'ngmin', 'wrap']);
+ grunt.registerTask('default', ['jshint', 'concat', 'wrap', 'traceur', 'ngmin']);
grunt.registerTask('dev', ['watch:concat']);
grunt.registerTask('test', ['karma:unit']);
grunt.registerTask('phpunit', ['watch:phpunit']);
diff --git a/js/app/App.js b/js/app/App.js
index 947a68a2e..3dbc907da 100644
--- a/js/app/App.js
+++ b/js/app/App.js
@@ -7,4 +7,4 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-var app = angular.module('News', ['ngRoute', 'ngSanitize', 'ngAnimate']); \ No newline at end of file
+let app = angular.module('News', ['ngRoute', 'ngSanitize', 'ngAnimate']); \ No newline at end of file
diff --git a/js/app/Config.js b/js/app/Config.js
index 5581af0e4..bd38f897b 100644
--- a/js/app/Config.js
+++ b/js/app/Config.js
@@ -9,10 +9,8 @@
*/
app.config(function ($routeProvider, $provide, $httpProvider) {
'use strict';
- var getResolve,
- feedType;
- feedType = {
+ let feedType = {
FEED: 0,
FOLDER: 1,
STARRED: 2,
@@ -21,17 +19,17 @@ app.config(function ($routeProvider, $provide, $httpProvider) {
};
// constants
- $provide.constant('REFRESH_RATE', 60); // seconds, how often feeds and folders shoudl be refreshed
+ $provide.constant('REFRESH_RATE', 60); // seconds
$provide.constant('ITEM_BATCH_SIZE', 50); // how many items to autopage by
$provide.constant('BASE_URL', OC.generateUrl('/apps/news'));
$provide.constant('FEED_TYPE', feedType);
// make sure that the CSRF header is only sent to the ownCloud domain
- $provide.factory('CSRFInterceptor', function ($q, BASE_URL) {
+ $provide.factory('CSRFInterceptor', ($q, BASE_URL) => {
return {
- request: function (config) {
+ request: (config) => {
if (config.url.indexOf(BASE_URL) === 0) {
- config.headers.requesttoken = oc_requesttoken;
+ config.headers.requesttoken = csrfToken;
}
return config || $q.when(config);
@@ -41,7 +39,7 @@ app.config(function ($routeProvider, $provide, $httpProvider) {
$httpProvider.interceptors.push('CSRFInterceptor');
// routing
- getResolve = function (type) {
+ let getResolve = (type) => {
return {
// request to items also returns feeds
data: [
@@ -50,12 +48,9 @@ app.config(function ($routeProvider, $provide, $httpProvider) {
'$q',
'BASE_URL',
'ITEM_BATCH_SIZE',
- function ($http, $route, $q, BASE_URL, ITEM_BATCH_SIZE) {
+ ($http, $route, $q, BASE_URL, ITEM_BATCH_SIZE) => {
- var parameters,
- deferred;
-
- parameters = {
+ let parameters = {
type: type,
limit: ITEM_BATCH_SIZE
};
@@ -64,13 +59,13 @@ app.config(function ($routeProvider, $provide, $httpProvider) {
parameters.id = $route.current.params.id;
}
- deferred = $q.defer();
+ let deferred = $q.defer();
$http({
url: BASE_URL + '/items',
method: 'GET',
params: parameters
- }).success(function (data) {
+ }).success((data) => {
deferred.resolve(data);
});
diff --git a/js/app/Run.js b/js/app/Run.js
index c60150fbe..743f83c9b 100644
--- a/js/app/Run.js
+++ b/js/app/Run.js
@@ -7,36 +7,34 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-app.run(function ($rootScope, $location, $http, $q, $interval, Loading,
- ItemResource, FeedResource, FolderResource, Settings,
- Publisher, BASE_URL, FEED_TYPE, REFRESH_RATE) {
+app.run(($rootScope, $location, $http, $q, $interval, Loading, ItemResource,
+ FeedResource, FolderResource, Settings, Publisher, BASE_URL, FEED_TYPE,
+ REFRESH_RATE) => {
'use strict';
+ console.log($location);
+
// show Loading screen
Loading.setLoading('global', true);
// listen to keys in returned queries to automatically distribute the
// incoming values to models
- Publisher.subscribe(ItemResource).toChannels('items', 'newestItemId', 'starred');
+ Publisher.subscribe(ItemResource).toChannels('items', 'newestItemId',
+ 'starred');
Publisher.subscribe(FolderResource).toChannels('folders');
Publisher.subscribe(FeedResource).toChannels('feeds');
Publisher.subscribe(Settings).toChannels('settings');
// load feeds, settings and last read feed
- var settingsDeferred,
- activeFeedDeferred,
- folderDeferred,
- feedDeferred;
-
- settingsDeferred = $q.defer();
- $http.get(BASE_URL + '/settings').success(function (data) {
+ let settingsDeferred = $q.defer();
+ $http.get(BASE_URL + '/settings').success((data) => {
Publisher.publishAll(data);
settingsDeferred.resolve();
});
- activeFeedDeferred = $q.defer();
- $http.get(BASE_URL + '/feeds/active').success(function (data) {
- var url;
+ let activeFeedDeferred = $q.defer();
+ $http.get(BASE_URL + '/feeds/active').success((data) => {
+ let url;
switch (data.type) {
@@ -60,14 +58,14 @@ app.run(function ($rootScope, $location, $http, $q, $interval, Loading,
activeFeedDeferred.resolve();
});
- folderDeferred = $q.defer();
- $http.get(BASE_URL + '/folders').success(function (data) {
+ let folderDeferred = $q.defer();
+ $http.get(BASE_URL + '/folders').success((data) => {
Publisher.publishAll(data);
folderDeferred.resolve();
});
- feedDeferred = $q.defer();
- $http.get(BASE_URL + '/feeds').success(function (data) {
+ let feedDeferred = $q.defer();
+ $http.get(BASE_URL + '/feeds').success((data) => {
Publisher.publishAll(data);
feedDeferred.resolve();
});
@@ -81,27 +79,27 @@ app.run(function ($rootScope, $location, $http, $q, $interval, Loading,
folderDeferred.promise
]
)
- .then(function () {
+ .then(() => {
Loading.setLoading('global', false);
});
// refresh feeds and folders
- $interval(function () {
+ $interval(() => {
$http.get(BASE_URL + '/feeds');
$http.get(BASE_URL + '/folders');
}, REFRESH_RATE * 1000);
- $rootScope.$on('$routeChangeStart', function () {
+ $rootScope.$on('$routeChangeStart', () => {
Loading.setLoading('content', true);
});
- $rootScope.$on('$routeChangeSuccess', function () {
+ $rootScope.$on('$routeChangeSuccess', () => {
Loading.setLoading('content', false);
});
// in case of wrong id etc show all items
- $rootScope.$on('$routeChangeError', function () {
+ $rootScope.$on('$routeChangeError', () => {
$location.path('/items');
});
}); \ No newline at end of file
diff --git a/js/bower.json b/js/bower.json
index 0ed1b0cc4..f48e00076 100644
--- a/js/bower.json
+++ b/js/bower.json
@@ -30,6 +30,7 @@
"angular-sanitize": "~1.2.16",
"jquery": "~2.1.1",
"momentjs": "~2.6.0",
- "angular-animate": "~1.2.16"
+ "angular-animate": "~1.2.16",
+ "traceur-runtime": "~0.0.41"
}
}
diff --git a/js/build/app.js b/js/build/app.js
index cad42c8ae..7e68fc320 100644
--- a/js/build/app.js
+++ b/js/build/app.js
@@ -1,521 +1,569 @@
-(function(angular, $, OC, oc_requesttoken, undefined){
-
-'use strict';
-
-
-var app = angular.module('News', [
- 'ngRoute',
- 'ngSanitize',
- 'ngAnimate'
- ]);
-app.config([
- '$routeProvider',
- '$provide',
- '$httpProvider',
- function ($routeProvider, $provide, $httpProvider) {
+var $__build_47_app__ = function () {
'use strict';
- var getResolve, feedType;
- feedType = {
- FEED: 0,
- FOLDER: 1,
- STARRED: 2,
- SUBSCRIPTIONS: 3,
- SHARED: 4
- };
- // constants
- $provide.constant('REFRESH_RATE', 60);
- // seconds, how often feeds and folders shoudl be refreshed
- $provide.constant('ITEM_BATCH_SIZE', 50);
- // how many items to autopage by
- $provide.constant('BASE_URL', OC.generateUrl('/apps/news'));
- $provide.constant('FEED_TYPE', feedType);
- // make sure that the CSRF header is only sent to the ownCloud domain
- $provide.factory('CSRFInterceptor', function ($q, BASE_URL) {
- return {
- request: function (config) {
- if (config.url.indexOf(BASE_URL) === 0) {
- config.headers.requesttoken = oc_requesttoken;
- }
- return config || $q.when(config);
- }
- };
- });
- $httpProvider.interceptors.push('CSRFInterceptor');
- // routing
- getResolve = function (type) {
- return {
- data: [
- '$http',
- '$route',
- '$q',
- 'BASE_URL',
- 'ITEM_BATCH_SIZE',
- function ($http, $route, $q, BASE_URL, ITEM_BATCH_SIZE) {
- var parameters, deferred;
- parameters = {
- type: type,
- limit: ITEM_BATCH_SIZE
+ var __moduleName = 'build/app';
+ (function (window, document, angular, $, OC, csrfToken, undefined) {
+ 'use strict';
+ var app = angular.module('News', [
+ 'ngRoute',
+ 'ngSanitize',
+ 'ngAnimate'
+ ]);
+ app.config([
+ '$routeProvider',
+ '$provide',
+ '$httpProvider',
+ function ($routeProvider, $provide, $httpProvider) {
+ 'use strict';
+ var feedType = {
+ FEED: 0,
+ FOLDER: 1,
+ STARRED: 2,
+ SUBSCRIPTIONS: 3,
+ SHARED: 4
+ };
+ $provide.constant('REFRESH_RATE', 60);
+ $provide.constant('ITEM_BATCH_SIZE', 50);
+ $provide.constant('BASE_URL', OC.generateUrl('/apps/news'));
+ $provide.constant('FEED_TYPE', feedType);
+ $provide.factory('CSRFInterceptor', function ($q, BASE_URL) {
+ return {
+ request: function (config) {
+ if (config.url.indexOf(BASE_URL) === 0) {
+ config.headers.requesttoken = csrfToken;
+ }
+ return config || $q.when(config);
+ }
};
- if ($route.current.params.id !== undefined) {
- parameters.id = $route.current.params.id;
+ });
+ $httpProvider.interceptors.push('CSRFInterceptor');
+ var getResolve = function (type) {
+ return {
+ data: [
+ '$http',
+ '$route',
+ '$q',
+ 'BASE_URL',
+ 'ITEM_BATCH_SIZE',
+ function ($http, $route, $q, BASE_URL, ITEM_BATCH_SIZE) {
+ var parameters = {
+ type: type,
+ limit: ITEM_BATCH_SIZE
+ };
+ if ($route.current.params.id !== undefined) {
+ parameters.id = $route.current.params.id;
+ }
+ var deferred = $q.defer();
+ $http({
+ url: BASE_URL + '/items',
+ method: 'GET',
+ params: parameters
+ }).success(function (data) {
+ deferred.resolve(data);
+ });
+ return deferred.promise;
+ }
+ ]
+ };
+ };
+ $routeProvider.when('/items', {
+ controller: 'ContentController',
+ templateUrl: 'content.html',
+ resolve: getResolve(feedType.SUBSCRIPTIONS)
+ }).when('/items/starred', {
+ controller: 'ContentController',
+ templateUrl: 'content.html',
+ resolve: getResolve(feedType.STARRED)
+ }).when('/items/feeds/:id', {
+ controller: 'ContentController',
+ templateUrl: 'content.html',
+ resolve: getResolve(feedType.FEED)
+ }).when('/items/folders/:id', {
+ controller: 'ContentController',
+ templateUrl: 'content.html',
+ resolve: getResolve(feedType.FOLDER)
+ }).otherwise({ redirectTo: '/items' });
+ }
+ ]);
+ app.run([
+ '$rootScope',
+ '$location',
+ '$http',
+ '$q',
+ '$interval',
+ 'Loading',
+ 'ItemResource',
+ 'FeedResource',
+ 'FolderResource',
+ 'Settings',
+ 'Publisher',
+ 'BASE_URL',
+ 'FEED_TYPE',
+ 'REFRESH_RATE',
+ function ($rootScope, $location, $http, $q, $interval, Loading, ItemResource, FeedResource, FolderResource, Settings, Publisher, BASE_URL, FEED_TYPE, REFRESH_RATE) {
+ 'use strict';
+ console.log($location);
+ Loading.setLoading('global', true);
+ Publisher.subscribe(ItemResource).toChannels('items', 'newestItemId', 'starred');
+ Publisher.subscribe(FolderResource).toChannels('folders');
+ Publisher.subscribe(FeedResource).toChannels('feeds');
+ Publisher.subscribe(Settings).toChannels('settings');
+ var settingsDeferred = $q.defer();
+ $http.get(BASE_URL + '/settings').success(function (data) {
+ Publisher.publishAll(data);
+ settingsDeferred.resolve();
+ });
+ var activeFeedDeferred = $q.defer();
+ $http.get(BASE_URL + '/feeds/active').success(function (data) {
+ var url;
+ switch (data.type) {
+ case FEED_TYPE.FEED:
+ url = '/items/feeds/' + data.id;
+ break;
+ case FEED_TYPE.FOLDER:
+ url = '/items/folders/' + data.id;
+ break;
+ case FEED_TYPE.STARRED:
+ url = '/items/starred';
+ break;
+ default:
+ url = '/items';
}
- deferred = $q.defer();
- $http({
- url: BASE_URL + '/items',
- method: 'GET',
- params: parameters
- }).success(function (data) {
- deferred.resolve(data);
- });
- return deferred.promise;
- }
- ]
- };
- };
- $routeProvider.when('/items', {
- controller: 'ContentController',
- templateUrl: 'content.html',
- resolve: getResolve(feedType.SUBSCRIPTIONS)
- }).when('/items/starred', {
- controller: 'ContentController',
- templateUrl: 'content.html',
- resolve: getResolve(feedType.STARRED)
- }).when('/items/feeds/:id', {
- controller: 'ContentController',
- templateUrl: 'content.html',
- resolve: getResolve(feedType.FEED)
- }).when('/items/folders/:id', {
- controller: 'ContentController',
- templateUrl: 'content.html',
- resolve: getResolve(feedType.FOLDER)
- }).otherwise({ redirectTo: '/items' });
- }
-]);
-app.run([
- '$rootScope',
- '$location',
- '$http',
- '$q',
- '$interval',
- 'Loading',
- 'ItemResource',
- 'FeedResource',
- 'FolderResource',
- 'Settings',
- 'Publisher',
- 'BASE_URL',
- 'FEED_TYPE',
- 'REFRESH_RATE',
- function ($rootScope, $location, $http, $q, $interval, Loading, ItemResource, FeedResource, FolderResource, Settings, Publisher, BASE_URL, FEED_TYPE, REFRESH_RATE) {
- 'use strict';
- // show Loading screen
- Loading.setLoading('global', true);
- // listen to keys in returned queries to automatically distribute the
- // incoming values to models
- Publisher.subscribe(ItemResource).toChannels('items', 'newestItemId', 'starred');
- Publisher.subscribe(FolderResource).toChannels('folders');
- Publisher.subscribe(FeedResource).toChannels('feeds');
- Publisher.subscribe(Settings).toChannels('settings');
- // load feeds, settings and last read feed
- var settingsDeferred, activeFeedDeferred, folderDeferred, feedDeferred;
- settingsDeferred = $q.defer();
- $http.get(BASE_URL + '/settings').success(function (data) {
- Publisher.publishAll(data);
- settingsDeferred.resolve();
- });
- activeFeedDeferred = $q.defer();
- $http.get(BASE_URL + '/feeds/active').success(function (data) {
- var url;
- switch (data.type) {
- case FEED_TYPE.FEED:
- url = '/items/feeds/' + data.id;
- break;
- case FEED_TYPE.FOLDER:
- url = '/items/folders/' + data.id;
- break;
- case FEED_TYPE.STARRED:
- url = '/items/starred';
- break;
- default:
- url = '/items';
- }
- $location.path(url);
- activeFeedDeferred.resolve();
- });
- folderDeferred = $q.defer();
- $http.get(BASE_URL + '/folders').success(function (data) {
- Publisher.publishAll(data);
- folderDeferred.resolve();
- });
- feedDeferred = $q.defer();
- $http.get(BASE_URL + '/feeds').success(function (data) {
- Publisher.publishAll(data);
- feedDeferred.resolve();
- });
- // disable loading if all initial requests finished
- $q.all([
- settingsDeferred.promise,
- activeFeedDeferred.promise,
- feedDeferred.promise,
- folderDeferred.promise
- ]).then(function () {
- Loading.setLoading('global', false);
- });
- // refresh feeds and folders
- $interval(function () {
- $http.get(BASE_URL + '/feeds');
- $http.get(BASE_URL + '/folders');
- }, REFRESH_RATE * 1000);
- $rootScope.$on('$routeChangeStart', function () {
- Loading.setLoading('content', true);
- });
- $rootScope.$on('$routeChangeSuccess', function () {
- Loading.setLoading('content', false);
- });
- // in case of wrong id etc show all items
- $rootScope.$on('$routeChangeError', function () {
- $location.path('/items');
- });
- }
-]);
-app.controller('AppController', [
- 'Loading',
- 'FeedResource',
- 'FolderResource',
- function (Loading, FeedResource, FolderResource) {
- 'use strict';
- this.loading = Loading;
- this.isFirstRun = function () {
- return FeedResource.size() === 0 && FolderResource.size() === 0;
- };
- }
-]);
-app.controller('ContentController', [
- 'Publisher',
- 'FeedResource',
- 'ItemResource',
- 'data',
- function (Publisher, FeedResource, ItemResource, data) {
- 'use strict';
- // distribute data to models based on key
- Publisher.publishAll(data);
- this.getItems = function () {
- return ItemResource.getAll();
- };
- this.getFeeds = function () {
- return FeedResource.getAll();
- };
- }
-]);
-app.controller('NavigationController', function () {
- 'use strict';
- console.log('here');
-});
-app.controller('SettingsController', function () {
- 'use strict';
- console.log('here');
-});
-app.factory('FeedResource', [
- 'Resource',
- '$http',
- function (Resource, $http) {
- 'use strict';
- var FeedResource = function ($http) {
- Resource.call(this, 'url', $http);
- };
- FeedResource.prototype = Object.create(Resource.prototype);
- return new FeedResource($http);
- }
-]);
-app.factory('FolderResource', [
- 'Resource',
- '$http',
- function (Resource, $http) {
- 'use strict';
- var FolderResource = function ($http) {
- Resource.call(this, 'name', $http);
- };
- FolderResource.prototype = Object.create(Resource.prototype);
- return new FolderResource($http);
- }
-]);
-app.factory('ItemResource', [
- 'Resource',
- '$http',
- function (Resource, $http) {
- 'use strict';
- var ItemResource = function ($http) {
- Resource.call(this, 'id', $http);
- };
- ItemResource.prototype = Object.create(Resource.prototype);
- ItemResource.prototype.receive = function (value, channel) {
- switch (channel) {
- case 'newestItemId':
- this.newestItemId = value;
- break;
- case 'starred':
- this.starredCount = value;
- break;
- default:
- Resource.prototype.receive.call(this, value, channel);
- }
- };
- ItemResource.prototype.getNewestItemId = function () {
- return this.newestItemId;
- };
- ItemResource.prototype.getStarredCount = function () {
- return this.starredCount;
- };
- return new ItemResource($http);
- }
-]);
-app.service('Loading', function () {
- 'use strict';
- this.loading = {
- global: false,
- content: false,
- autopaging: false
- };
- this.setLoading = function (area, isLoading) {
- this.loading[area] = isLoading;
- };
- this.isLoading = function (area) {
- return this.loading[area];
- };
-});
-app.service('Publisher', function () {
- 'use strict';
- var self = this;
- this.channels = {};
- this.subscribe = function (object) {
- return {
- toChannels: function () {
- var counter, channel;
- for (counter = 0; counter < arguments.length; counter += 1) {
- channel = arguments[counter];
- self.channels[channel] = self.channels[channel] || [];
- self.channels[channel].push(object);
+ $location.path(url);
+ activeFeedDeferred.resolve();
+ });
+ var folderDeferred = $q.defer();
+ $http.get(BASE_URL + '/folders').success(function (data) {
+ Publisher.publishAll(data);
+ folderDeferred.resolve();
+ });
+ var feedDeferred = $q.defer();
+ $http.get(BASE_URL + '/feeds').success(function (data) {
+ Publisher.publishAll(data);
+ feedDeferred.resolve();
+ });
+ $q.all([
+ settingsDeferred.promise,
+ activeFeedDeferred.promise,
+ feedDeferred.promise,
+ folderDeferred.promise
+ ]).then(function () {
+ Loading.setLoading('global', false);
+ });
+ $interval(function () {
+ $http.get(BASE_URL + '/feeds');
+ $http.get(BASE_URL + '/folders');
+ }, REFRESH_RATE * 1000);
+ $rootScope.$on('$routeChangeStart', function () {
+ Loading.setLoading('content', true);
+ });
+ $rootScope.$on('$routeChangeSuccess', function () {
+ Loading.setLoading('content', false);
+ });
+ $rootScope.$on('$routeChangeError', function () {
+ $location.path('/items');
+ });
+ }
+ ]);
+ app.controller('AppController', [
+ 'Loading',
+ 'FeedResource',
+ 'FolderResource',
+ function (Loading, FeedResource, FolderResource) {
+ 'use strict';
+ this.loading = Loading;
+ this.isFirstRun = function () {
+ return FeedResource.size() === 0 && FolderResource.size() === 0;
+ };
}
- }
- };
- };
- this.publishAll = function (data) {
- var channel, counter;
- for (channel in data) {
- if (data.hasOwnProperty(channel) && this.channels[channel] !== undefined) {
- for (counter = 0; counter < this.channels[channel].length; counter += 1) {
- this.channels[channel][counter].receive(data[channel], channel);
+ ]);
+ app.controller('ContentController', [
+ 'Publisher',
+ 'FeedResource',
+ 'ItemResource',
+ 'data',
+ function (Publisher, FeedResource, ItemResource, data) {
+ 'use strict';
+ Publisher.publishAll(data);
+ this.getItems = function () {
+ return ItemResource.getAll();
+ };
+ this.getFeeds = function () {
+ return FeedResource.getAll();
+ };
}
- }
- }
- };
-});
-app.factory('Resource', function () {
- 'use strict';
- var Resource = function (id, http) {
- this.id = id;
- this.values = [];
- this.hashMap = {};
- this.http = http;
- };
- Resource.prototype = {
- receive: function (values) {
- var self = this;
- values.forEach(function (value) {
- self.add(value);
+ ]);
+ app.controller('NavigationController', function () {
+ 'use strict';
+ console.log('here');
});
- },
- add: function (value) {
- var key, existing;
- existing = this.hashMap[value[this.id]];
- if (existing === undefined) {
- this.values.push(value);
- this.hashMap[value[this.id]] = value;
- } else {
- // copy values from new to old object if it exists already
- for (key in value) {
- if (value.hasOwnProperty(key)) {
- existing[key] = value[key];
- }
+ app.controller('SettingsController', function () {
+ 'use strict';
+ console.log('here');
+ });
+ app.factory('FeedResource', [
+ 'Resource',
+ '$http',
+ function (Resource, $http) {
+ 'use strict';
+ var FeedResource = function FeedResource($http) {
+ $traceurRuntime.superCall(this, $FeedResource.prototype, 'constructor', [
+ 'url',
+ $http
+ ]);
+ };
+ var $FeedResource = FeedResource;
+ $traceurRuntime.createClass(FeedResource, {}, {}, Resource);
+ return new FeedResource($http);
}
- }
- },
- size: function () {
- return this.values.length;
- },
- get: function (id) {
- return this.hashMap[id];
- },
- delete: function (id) {
- // find index of object that should be deleted
- var i, deleteAtIndex;
- for (i = 0; i < this.values.length; i += 1) {
- if (this.values[i][this.id] === id) {
- deleteAtIndex = i;
- break;
+ ]);
+ app.factory('FolderResource', [
+ 'Resource',
+ '$http',
+ function (Resource, $http) {
+ 'use strict';
+ var FolderResource = function FolderResource($http) {
+ $traceurRuntime.superCall(this, $FolderResource.prototype, 'constructor', [
+ 'name',
+ $http
+ ]);
+ };
+ var $FolderResource = FolderResource;
+ $traceurRuntime.createClass(FolderResource, {}, {}, Resource);
+ return new FolderResource($http);
}
- }
- if (deleteAtIndex !== undefined) {
- this.values.splice(deleteAtIndex, 1);
- }
- if (this.hashMap[id] !== undefined) {
- delete this.hashMap[id];
- }
- },
- clear: function () {
- this.hashMap = {};
- // http://stackoverflow.com/questions/1232040/how-to-empty-an-array-in-javascript
- // this is the fastes way to empty an array when you want to keep the
- // reference around
- while (this.values.length > 0) {
- this.values.pop();
- }
- },
- getAll: function () {
- return this.values;
- }
- };
- return Resource;
-});
-app.service('Settings', function () {
- 'use strict';
- this.settings = {};
- this.receive = function (data) {
- var key;
- for (key in data) {
- if (data.hasOwnProperty(key)) {
- this.settings[key] = data[key];
- }
- }
- };
- this.get = function (key) {
- return this.settings[key];
- };
- this.set = function (key, value) {
- this.settings[key] = value;
- };
-});
-/**
- * Code in here acts only as a click shortcut mechanism. That's why its not
- * being put into a directive since it has to be tested with protractor
- * anyways and theres no benefit from wiring it into the angular app
- */
-(function (window, document, $) {
- 'use strict';
- var noInputFocused, noModifierKey, scrollArea, scrollToItem, scrollToNextItem, scrollToPreviousItem, toggleStar, toggleUnread, expandItem, openLink, getActiveItem;
- scrollArea = $('#app-content');
- noInputFocused = function (element) {
- return !(element.is('input') && element.is('select') && element.is('textarea') && element.is('checkbox'));
- };
- noModifierKey = function (event) {
- return !(event.shiftKey || event.altKey || event.ctrlKey || event.metaKey);
- };
- scrollToItem = function (item, scrollArea) {
- scrollArea.scrollTop(item.offset().top - scrollArea.offset().top + scrollArea.scrollTop());
- };
- scrollToNextItem = function (scrollArea) {
- var items, counter, item;
- items = scrollArea.find('.feed_item');
- for (counter = 0; counter < items.length; counter += 1) {
- item = $(items[counter]);
- if (item.position().top > 1) {
- scrollToItem(scrollArea, item);
- return;
- }
- }
- // in case this is the last item it should still scroll below the top
- scrollArea.scrollTop(scrollArea.prop('scrollHeight'));
- };
- scrollToPreviousItem = function (scrollArea) {
- var items, item, counter, previous;
- items = scrollArea.find('.feed_item');
- for (counter = 0; counter < items.length; counter += 1) {
- item = $(items[counter]);
- if (item.position().top >= 0) {
- previous = item.prev();
- // if there are no items before the current one
- if (previous.length > 0) {
- scrollToItem(scrollArea, previous);
+ ]);
+ app.factory('ItemResource', [
+ 'Resource',
+ '$http',
+ function (Resource, $http) {
+ 'use strict';
+ var ItemResource = function ItemResource($http) {
+ $traceurRuntime.superCall(this, $ItemResource.prototype, 'constructor', [
+ 'id',
+ $http
+ ]);
+ };
+ var $ItemResource = ItemResource;
+ $traceurRuntime.createClass(ItemResource, {
+ receive: function (value, channel) {
+ switch (channel) {
+ case 'newestItemId':
+ this.newestItemId = value;
+ break;
+ case 'starred':
+ this.starredCount = value;
+ break;
+ default:
+ $traceurRuntime.superCall(this, $ItemResource.prototype, 'receive', [
+ value,
+ channel
+ ]);
+ }
+ },
+ getNewestItemId: function () {
+ return this.newestItemId;
+ },
+ getStarredCount: function () {
+ return this.starredCount;
+ }
+ }, {}, Resource);
+ return new ItemResource($http);
}
- return;
- }
- }
- // if there was no jump jump to the last element
- if (items.length > 0) {
- scrollToItem(scrollArea, items.last());
- }
- };
- getActiveItem = function (scrollArea) {
- var items, item, counter;
- items = scrollArea.find('.feed_item');
- for (counter = 0; counter < items.length; counter += 1) {
- item = $(items[counter]);
- // 130px of the item should be visible
- if (item.height() + item.position().top > 30) {
- return item;
- }
- }
- };
- toggleUnread = function (scrollArea) {
- var item = getActiveItem(scrollArea);
- item.find('.keep_unread').trigger('click');
- };
- toggleStar = function (scrollArea) {
- var item = getActiveItem(scrollArea);
- item.find('.item_utils .star').trigger('click');
- };
- expandItem = function (scrollArea) {
- var item = getActiveItem(scrollArea);
- item.find('.item_heading a').trigger('click');
- };
- openLink = function (scrollArea) {
- var item = getActiveItem(scrollArea).find('.item_title a');
- item.trigger('click');
- // mark read
- window.open(item.attr('href'), '_blank');
- };
- $(document).keyup(function (event) {
- var keyCode;
- keyCode = event.keyCode;
- if (noInputFocused($(':focus')) && noModifierKey(event)) {
- // j, n, right arrow
- if ([
- 74,
- 78,
- 34
- ].indexOf(keyCode) >= 0) {
- event.preventDefault();
- scrollToNextItem(scrollArea); // k, p, left arrow
- } else if ([
- 75,
- 80,
- 37
- ].indexOf(keyCode) >= 0) {
- event.preventDefault();
- scrollToPreviousItem(scrollArea); // u
- } else if ([85].indexOf(keyCode) >= 0) {
- event.preventDefault();
- toggleUnread(scrollArea); // e
- } else if ([69].indexOf(keyCode) >= 0) {
- event.preventDefault();
- expandItem(scrollArea); // s, i, l
- } else if ([
- 73,
- 83,
- 76
- ].indexOf(keyCode) >= 0) {
- event.preventDefault();
- toggleStar(scrollArea); // h
- } else if ([72].indexOf(keyCode) >= 0) {
- event.preventDefault();
- toggleStar(scrollArea);
- scrollToNextItem(scrollArea); // o
- } else if ([79].indexOf(keyCode) >= 0) {
- event.preventDefault();
- openLink(scrollArea);
- }
- }
- });
-}(window, document, jQuery));
-
-})(angular, jQuery, OC, oc_requesttoken); \ No newline at end of file
+ ]);
+ app.service('Loading', function () {
+ 'use strict';
+ var $__0 = this;
+ this.loading = {
+ global: false,
+ content: false,
+ autopaging: false
+ };
+ this.setLoading = function (area, isLoading) {
+ $traceurRuntime.setProperty($__0.loading, area, isLoading);
+ };
+ this.isLoading = function (area) {
+ return $__0.loading[$traceurRuntime.toProperty(area)];
+ };
+ });
+ app.service('Publisher', function () {
+ 'use strict';
+ var $__0 = this;
+ this.channels = {};
+ this.subscribe = function (obj) {
+ return {
+ toChannels: function () {
+ for (var channels = [], $__4 = 0; $__4 < arguments.length; $__4++)
+ $traceurRuntime.setProperty(channels, $__4, arguments[$traceurRuntime.toProperty($__4)]);
+ for (var $__2 = channels[$traceurRuntime.toProperty(Symbol.iterator)](), $__3; !($__3 = $__2.next()).done;) {
+ try {
+ throw undefined;
+ } catch (channel) {
+ channel = $__3.value;
+ {
+ $traceurRuntime.setProperty($__0.channels, channel, $__0.channels[$traceurRuntime.toProperty(channel)] || []);
+ $__0.channels[$traceurRuntime.toProperty(channel)].push(obj);
+ }
+ }
+ }
+ }
+ };
+ };
+ this.publishAll = function (data) {
+ for (var $channel in data) {
+ try {
+ throw undefined;
+ } catch (channel) {
+ channel = $channel;
+ if ($__0.channels[$traceurRuntime.toProperty(channel)] !== undefined) {
+ for (var $__2 = $__0.channels[$traceurRuntime.toProperty(channel)][$traceurRuntime.toProperty(Symbol.iterator)](), $__3; !($__3 = $__2.next()).done;) {
+ try {
+ throw undefined;
+ } catch (listener) {
+ listener = $__3.value;
+ {
+ listener.receive(data[$traceurRuntime.toProperty(channel)], channel);
+ }
+ }
+ }
+ }
+ }
+ }
+ };
+ });
+ app.factory('Resource', function () {
+ 'use strict';
+ var Resource = function Resource(id, http) {
+ this.id = id;
+ this.values = [];
+ this.hashMap = {};
+ this.http = http;
+ };
+ $traceurRuntime.createClass(Resource, {
+ receive: function (values) {
+ var $__0 = this;
+ values.forEach(function (value) {
+ $__0.add(value);
+ });
+ },
+ add: function (value) {
+ var existing = this.hashMap[$traceurRuntime.toProperty(value[$traceurRuntime.toProperty(this.id)])];
+ if (existing === undefined) {
+ this.values.push(value);
+ $traceurRuntime.setProperty(this.hashMap, value[$traceurRuntime.toProperty(this.id)], value);
+ } else {
+ for (var $key in value) {
+ try {
+ throw undefined;
+ } catch (key) {
+ key = $key;
+ if (value.hasOwnProperty(key)) {
+ $traceurRuntime.setProperty(existing, key, value[$traceurRuntime.toProperty(key)]);
+ }
+ }
+ }
+ }
+ },
+ size: function () {
+ return this.values.length;
+ },
+ get: function (id) {
+ return this.hashMap[$traceurRuntime.toProperty(id)];
+ },
+ delete: function (id) {
+ var deleteAtIndex;
+ {
+ try {
+ throw undefined;
+ } catch ($i) {
+ $i = 0;
+ for (; $i < this.values.length; $i += 1) {
+ try {
+ throw undefined;
+ } catch (i) {
+ i = $i;
+ try {
+ if (this.values[$traceurRuntime.toProperty(i)][$traceurRuntime.toProperty(this.id)] === id) {
+ deleteAtIndex = i;
+ break;
+ }
+ } finally {
+ $i = i;
+ }
+ }
+ }
+ }
+ }
+ if (deleteAtIndex !== undefined) {
+ this.values.splice(deleteAtIndex, 1);
+ }
+ if (this.hashMap[$traceurRuntime.toProperty(id)] !== undefined) {
+ delete this.hashMap[$traceurRuntime.toProperty(id)];
+ }
+ },
+ clear: function () {
+ this.hashMap = {};
+ while (this.values.length > 0) {
+ this.values.pop();
+ }
+ },
+ getAll: function () {
+ return this.values;
+ }
+ }, {});
+ return Resource;
+ });
+ app.service('Settings', function () {
+ 'use strict';
+ var $__0 = this;
+ this.settings = {};
+ this.receive = function (data) {
+ for (var $key in data) {
+ try {
+ throw undefined;
+ } catch (key) {
+ key = $key;
+ $traceurRuntime.setProperty($__0.settings, key, data[$traceurRuntime.toProperty(key)]);
+ }
+ }
+ };
+ this.get = function (key) {
+ return $__0.settings[$traceurRuntime.toProperty(key)];
+ };
+ this.set = function (key, value) {
+ $traceurRuntime.setProperty($__0.settings, key, value);
+ };
+ });
+ (function (window, document, $) {
+ 'use strict';
+ var scrollArea = $('#app-content');
+ var noInputFocused = function (element) {
+ return !(element.is('input') && element.is('select') && element.is('textarea') && element.is('checkbox'));
+ };
+ var noModifierKey = function (event) {
+ return !(event.shiftKey || event.altKey || event.ctrlKey || event.metaKey);
+ };
+ var scrollToItem = function (item, scrollArea) {
+ scrollArea.scrollTop(item.offset().top - scrollArea.offset().top + scrollArea.scrollTop());
+ };
+ var scrollToNextItem = function (scrollArea) {
+ var items = scrollArea.find('.feed_item');
+ for (var $__2 = items[$traceurRuntime.toProperty(Symbol.iterator)](), $__3; !($__3 = $__2.next()).done;) {
+ try {
+ throw undefined;
+ } catch (item) {
+ item = $__3.value;
+ {
+ item = $(item);
+ if (item.position().top > 1) {
+ scrollToItem(scrollArea, item);
+ return;
+ }
+ }
+ }
+ }
+ scrollArea.scrollTop(scrollArea.prop('scrollHeight'));
+ };
+ var scrollToPreviousItem = function (scrollArea) {
+ var items = scrollArea.find('.feed_item');
+ for (var $__2 = items[$traceurRuntime.toProperty(Symbol.iterator)](), $__3; !($__3 = $__2.next()).done;) {
+ try {
+ throw undefined;
+ } catch (item) {
+ item = $__3.value;
+ {
+ item = $(item);
+ if (item.position().top >= 0) {
+ try {
+ throw undefined;
+ } catch (previous) {
+ previous = item.prev();
+ if (previous.length > 0) {
+ scrollToItem(scrollArea, previous);
+ }
+ return;
+ }
+ }
+ }
+ }
+ }
+ if (items.length > 0) {
+ scrollToItem(scrollArea, items.last());
+ }
+ };
+ var getActiveItem = function (scrollArea) {
+ var items = scrollArea.find('.feed_item');
+ for (var $__2 = items[$traceurRuntime.toProperty(Symbol.iterator)](), $__3; !($__3 = $__2.next()).done;) {
+ try {
+ throw undefined;
+ } catch (item) {
+ item = $__3.value;
+ {
+ item = $(item);
+ if (item.height() + item.position().top > 30) {
+ return item;
+ }
+ }
+ }
+ }
+ };
+ var toggleUnread = function (scrollArea) {
+ var item = getActiveItem(scrollArea);
+ item.find('.keep_unread').trigger('click');
+ };
+ var toggleStar = function (scrollArea) {
+ var item = getActiveItem(scrollArea);
+ item.find('.item_utils .star').trigger('click');
+ };
+ var expandItem = function (scrollArea) {
+ var item = getActiveItem(scrollArea);
+ item.find('.item_heading a').trigger('click');
+ };
+ var openLink = function (scrollArea) {
+ var item = getActiveItem(scrollArea).find('.item_title a');
+ item.trigger('click');
+ window.open(item.attr('href'), '_blank');
+ };
+ $(document).keyup(function (event) {
+ var keyCode = event.keyCode;
+ if (noInputFocused($(':focus')) && noModifierKey(event)) {
+ if ([
+ 74,
+ 78,
+ 34
+ ].indexOf(keyCode) >= 0) {
+ event.preventDefault();
+ scrollToNextItem(scrollArea);
+ } else if ([
+ 75,
+ 80,
+ 37
+ ].indexOf(keyCode) >= 0) {
+ event.preventDefault();
+ scrollToPreviousItem(scrollArea);
+ } else if ([85].indexOf(keyCode) >= 0) {
+ event.preventDefault();
+ toggleUnread(scrollArea);
+ } else if ([69].indexOf(keyCode) >= 0) {
+ event.preventDefault();
+ expandItem(scrollArea);
+ } else if ([
+ 73,
+ 83,
+ 76
+ ].indexOf(keyCode) >= 0) {
+ event.preventDefault();
+ toggleStar(scrollArea);
+ } else if ([72].indexOf(keyCode) >= 0) {
+ event.preventDefault();
+ toggleStar(scrollArea);
+ scrollToNextItem(scrollArea);
+ } else if ([79].indexOf(keyCode) >= 0) {
+ event.preventDefault();
+ openLink(scrollArea);
+ }
+ }
+ });
+ }(window, document, jQuery));
+ }(window, document, angular, jQuery, OC, oc_requesttoken));
+ return {};
+ }(); \ No newline at end of file
diff --git a/js/controller/AppController.js b/js/controller/AppController.js
index b833d3fe1..17471e71e 100644
--- a/js/controller/AppController.js
+++ b/js/controller/AppController.js
@@ -7,12 +7,14 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-app.controller('AppController', function (Loading, FeedResource, FolderResource) {
+app.controller('AppController',
+function (Loading, FeedResource, FolderResource) {
+
'use strict';
this.loading = Loading;
- this.isFirstRun = function () {
+ this.isFirstRun = () => {
return FeedResource.size() === 0 && FolderResource.size() === 0;
};
diff --git a/js/controller/ContentController.js b/js/controller/ContentController.js
index 8e4632f7e..ae5116dbb 100644
--- a/js/controller/ContentController.js
+++ b/js/controller/ContentController.js
@@ -7,17 +7,18 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-app.controller('ContentController', function (Publisher, FeedResource, ItemResource, data) {
+app.controller('ContentController',
+function (Publisher, FeedResource, ItemResource, data) {
'use strict';
// distribute data to models based on key
Publisher.publishAll(data);
- this.getItems = function () {
+ this.getItems = () => {
return ItemResource.getAll();
};
- this.getFeeds = function () {
+ this.getFeeds = () => {
return FeedResource.getAll();
};
}); \ No newline at end of file
diff --git a/js/gui/keyboardshortcuts.js b/js/gui/keyboardshortcuts.js
index ba777dc16..8ba93880e 100644
--- a/js/gui/keyboardshortcuts.js
+++ b/js/gui/keyboardshortcuts.js
@@ -16,53 +16,37 @@
(function (window, document, $) {
'use strict';
- var noInputFocused,
- noModifierKey,
- scrollArea,
- scrollToItem,
- scrollToNextItem,
- scrollToPreviousItem,
- toggleStar,
- toggleUnread,
- expandItem,
- openLink,
- getActiveItem;
-
- scrollArea = $('#app-content');
-
- noInputFocused = function (element) {
+ let scrollArea = $('#app-content');
+
+ let noInputFocused = (element) => {
return !(
- element.is('input')
- && element.is('select')
- && element.is('textarea')
- && element.is('checkbox')
+ element.is('input') &&
+ element.is('select') &&
+ element.is('textarea') &&
+ element.is('checkbox')
);
};
- noModifierKey = function (event) {
+ let noModifierKey = (event) => {
return !(
- event.shiftKey
- || event.altKey
- || event.ctrlKey
- || event.metaKey
+ event.shiftKey ||
+ event.altKey ||
+ event.ctrlKey ||
+ event.metaKey
);
};
- scrollToItem = function (item, scrollArea) {
+ let scrollToItem = (item, scrollArea) => {
scrollArea.scrollTop(
item.offset().top - scrollArea.offset().top + scrollArea.scrollTop()
);
};
- scrollToNextItem = function (scrollArea) {
- var items,
- counter,
- item;
-
- items = scrollArea.find('.feed_item');
+ let scrollToNextItem = (scrollArea) => {
+ let items = scrollArea.find('.feed_item');
- for (counter = 0; counter < items.length; counter += 1) {
- item = $(items[counter]);
+ for (let item of items) {
+ item = $(item);
if (item.position().top > 1) {
scrollToItem(scrollArea, item);
@@ -75,19 +59,14 @@
};
- scrollToPreviousItem = function (scrollArea) {
- var items,
- item,
- counter,
- previous;
-
- items = scrollArea.find('.feed_item');
+ let scrollToPreviousItem = (scrollArea) => {
+ let items = scrollArea.find('.feed_item');
- for (counter = 0; counter < items.length; counter += 1) {
- item = $(items[counter]);
+ for (let item of items) {
+ item = $(item);
if (item.position().top >= 0) {
- previous = item.prev();
+ let previous = item.prev();
// if there are no items before the current one
if (previous.length > 0) {
@@ -104,15 +83,11 @@
}
};
- getActiveItem = function (scrollArea) {
- var items,
- item,
- counter;
+ let getActiveItem = (scrollArea) => {
+ let items = scrollArea.find('.feed_item');
- items = scrollArea.find('.feed_item');
-
- for (counter = 0; counter < items.length; counter += 1) {
- item = $(items[counter]);
+ for (let item of items) {
+ item = $(item);
// 130px of the item should be visible
if ((item.height() + item.position().top) > 30) {
@@ -121,32 +96,29 @@
}
};
- toggleUnread = function (scrollArea) {
- var item = getActiveItem(scrollArea);
+ let toggleUnread = (scrollArea) => {
+ let item = getActiveItem(scrollArea);
item.find('.keep_unread').trigger('click');
};
- toggleStar = function (scrollArea) {
- var item = getActiveItem(scrollArea);
+ let toggleStar = (scrollArea) => {
+ let item = getActiveItem(scrollArea);
item.find('.item_utils .star').trigger('click');
};
- expandItem = function (scrollArea) {
- var item = getActiveItem(scrollArea);
+ let expandItem = (scrollArea) => {
+ let item = getActiveItem(scrollArea);
item.find('.item_heading a').trigger('click');
};
- openLink = function (scrollArea) {
- var item = getActiveItem(scrollArea).find('.item_title a');
+ let openLink = (scrollArea) => {
+ let item = getActiveItem(scrollArea).find('.item_title a');
item.trigger('click'); // mark read
window.open(item.attr('href'), '_blank');
};
- $(document).keyup(function (event) {
- var keyCode;
-
- keyCode = event.keyCode;
-
+ $(document).keyup((event) => {
+ let keyCode = event.keyCode;
if (noInputFocused($(':focus')) && noModifierKey(event)) {
diff --git a/js/karma.conf.js b/js/karma.conf.js
index 5b33469dd..73c083350 100644
--- a/js/karma.conf.js
+++ b/js/karma.conf.js
@@ -12,8 +12,25 @@ module.exports = function (config) {
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
- frameworks: ['jasmine'],
+ frameworks: ['jasmine', 'traceur'],
+ preprocessors: {
+ 'tests/unit/stubs/*.js': ['traceur'],
+ 'controller/**/*.js': ['traceur'],
+ 'filter/**/*.js': ['traceur'],
+ 'service/**/*.js': ['traceur'],
+ 'directive/**/*.js': ['traceur'],
+ 'tests/unit/**/*Spec.js': ['traceur']
+ },
+
+ traceurPreprocessor: {
+ options: {
+ blockBinding: true,
+ experimental: true,
+ sourceMap: false,
+ modules: 'inline'
+ }
+ },
// list of files / patterns to load in the browser
files: [
@@ -25,13 +42,13 @@ module.exports = function (config) {
'vendor/angular-route/angular-route.js',
'vendor/angular-sanitize/angular-sanitize.js',
'vendor/angular-animate/angular-animate.js',
- 'tests/unit/stubs/*.js',
+ 'tests/unit/stubs/App.js',
+ 'tests/unit/stubs/OC.js',
'controller/**/*.js',
'filter/**/*.js',
'service/**/*.js',
- 'model/**/*.js',
'directive/**/*.js',
- 'tests/unit/**/*Spec.js'
+ 'tests/unit/**/*Spec.js',
],
@@ -41,13 +58,6 @@ module.exports = function (config) {
],
- // preprocess matching files before serving them to the browser
- // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
- preprocessors: {
-
- },
-
-
// test results reporter to use
// possible values: 'dots', 'progress'
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
@@ -73,7 +83,7 @@ module.exports = function (config) {
// start these browsers
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
- browsers: ['PhantomJS'],
+ browsers: ['Firefox'],
// Continuous Integration mode
diff --git a/js/package.json b/js/package.json
index 6a6cea1ac..f1d7fd509 100644
--- a/js/package.json
+++ b/js/package.json
@@ -28,17 +28,21 @@
"grunt": "^0.4.5",
"grunt-contrib-concat": "^0.4.0",
"grunt-contrib-connect": "^0.7.1",
+ "grunt-contrib-jshint": "^0.10.0",
"grunt-contrib-watch": "^0.6.1",
- "grunt-jslint": "^1.1.11",
"grunt-karma": "^0.8.3",
"grunt-ngmin": "0.0.3",
"grunt-phpunit": "^0.3.3",
"grunt-protractor-runner": "^0.2.4",
"grunt-protractor-webdriver": "^0.1.6",
+ "grunt-traceur": "^0.1.2",
"grunt-wrap": "^0.3.0",
"karma": "^0.12.16",
"karma-coverage": "^0.2.1",
+ "karma-firefox-launcher": "^0.1.3",
"karma-jasmine": "^0.1.5",
- "karma-phantomjs-launcher": "^0.1.4"
+ "karma-phantomjs-launcher": "^0.1.4",
+ "karma-traceur-preprocessor": "^0.2.2",
+ "traceur": "0.0.42"
}
}
diff --git a/js/service/FeedResource.js b/js/service/FeedResource.js
index 09de0a607..903a58241 100644
--- a/js/service/FeedResource.js
+++ b/js/service/FeedResource.js
@@ -7,14 +7,14 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-app.factory('FeedResource', function (Resource, $http) {
+app.factory('FeedResource', (Resource, $http) => {
'use strict';
- var FeedResource = function ($http) {
- Resource.call(this, 'url', $http);
- };
-
- FeedResource.prototype = Object.create(Resource.prototype);
+ class FeedResource extends Resource {
+ constructor ($http) {
+ super('url', $http);
+ }
+ }
return new FeedResource($http);
}); \ No newline at end of file
diff --git a/js/service/FolderResource.js b/js/service/FolderResource.js
index 30026b9a2..b1c0271dd 100644
--- a/js/service/FolderResource.js
+++ b/js/service/FolderResource.js
@@ -7,14 +7,14 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-app.factory('FolderResource', function (Resource, $http) {
+app.factory('FolderResource', (Resource, $http) => {
'use strict';
- var FolderResource = function ($http) {
- Resource.call(this, 'name', $http);
- };
-
- FolderResource.prototype = Object.create(Resource.prototype);
+ class FolderResource extends Resource {
+ constructor ($http) {
+ super('name', $http);
+ }
+ }
return new FolderResource($http);
}); \ No newline at end of file
diff --git a/js/service/ItemResource.js b/js/service/ItemResource.js
index 9b13f07c7..8cb47d527 100644
--- a/js/service/ItemResource.js
+++ b/js/service/ItemResource.js
@@ -7,38 +7,39 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-app.factory('ItemResource', function (Resource, $http) {
+app.factory('ItemResource', (Resource, $http) => {
'use strict';
- var ItemResource = function ($http) {
- Resource.call(this, 'id', $http);
- };
+ class ItemResource extends Resource {
- ItemResource.prototype = Object.create(Resource.prototype);
+ constructor ($http) {
+ super('id', $http);
+ }
- ItemResource.prototype.receive = function (value, channel) {
- switch (channel) {
+ receive (value, channel) {
+ switch (channel) {
- case 'newestItemId':
- this.newestItemId = value;
- break;
+ case 'newestItemId':
+ this.newestItemId = value;
+ break;
- case 'starred':
- this.starredCount = value;
- break;
- default:
- Resource.prototype.receive.call(this, value, channel);
+ case 'starred':
+ this.starredCount = value;
+ break;
+ default:
+ super.receive(value, channel);
+ }
}
- };
- ItemResource.prototype.getNewestItemId = function () {
- return this.newestItemId;
- };
+ getNewestItemId () {
+ return this.newestItemId;
+ }
- ItemResource.prototype.getStarredCount = function () {
- return this.starredCount;
- };
+ getStarredCount () {
+ return this.starredCount;
+ }
+ }
return new ItemResource($http);
}); \ No newline at end of file
diff --git a/js/service/Loading.js b/js/service/Loading.js
index eb42655a5..c07dba9fe 100644
--- a/js/service/Loading.js
+++ b/js/service/Loading.js
@@ -16,11 +16,11 @@ app.service('Loading', function () {
autopaging: false
};
- this.setLoading = function (area, isLoading) {
+ this.setLoading = (area, isLoading) => {
this.loading[area] = isLoading;
};
- this.isLoading = function (area) {
+ this.isLoading = (area) => {
return this.loading[area];
};
diff --git a/js/service/Publisher.js b/js/service/Publisher.js
index 784b2fff6..b6ea722ce 100644
--- a/js/service/Publisher.js
+++ b/js/service/Publisher.js
@@ -10,31 +10,25 @@
app.service('Publisher', function () {
'use strict';
- var self = this;
this.channels = {};
- this.subscribe = function (object) {
+ this.subscribe = (obj) => {
return {
- toChannels: function () {
- var counter,
- channel;
- for (counter = 0; counter < arguments.length; counter += 1) {
- channel = arguments[counter];
- self.channels[channel] = self.channels[channel] || [];
- self.channels[channel].push(object);
+ toChannels: (...channels) => {
+ for (let channel of channels) {
+ this.channels[channel] = this.channels[channel] || [];
+ this.channels[channel].push(obj);
}
}
};
- };
- this.publishAll = function (data) {
- var channel,
- counter;
+ };
- for (channel in data) {
- if (data.hasOwnProperty(channel) && this.channels[channel] !== undefined) {
- for (counter = 0; counter < this.channels[channel].length; counter += 1) {
- this.channels[channel][counter].receive(data[channel], channel);
+ this.publishAll = (data) => {
+ for (let channel in data) {
+ if (this.channels[channel] !== undefined) {
+ for (let listener of this.channels[channel]) {
+ listener.receive(data[channel], channel);
}
}
}
diff --git a/js/service/Resource.js b/js/service/Resource.js
index ecae0fcfd..3c17872dc 100644
--- a/js/service/Resource.js
+++ b/js/service/Resource.js
@@ -7,57 +7,53 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-app.factory('Resource', function () {
+app.factory('Resource', () => {
'use strict';
- var Resource = function (id, http) {
- this.id = id;
- this.values = [];
- this.hashMap = {};
- this.http = http;
- };
+ class Resource {
- Resource.prototype = {
- receive: function (values) {
- var self = this;
- values.forEach(function (value) {
- self.add(value);
- });
- },
+ constructor (id, http) {
+ this.id = id;
+ this.values = [];
+ this.hashMap = {};
+ this.http = http;
+ }
- add: function (value) {
- var key,
- existing;
+ receive (values) {
+ values.forEach((value) => {
+ this.add(value);
+ });
+ }
- existing = this.hashMap[value[this.id]];
+ add (value) {
+ let existing = this.hashMap[value[this.id]];
if (existing === undefined) {
this.values.push(value);
this.hashMap[value[this.id]] = value;
} else {
// copy values from new to old object if it exists already
- for (key in value) {
+ for (let key in value) {
if (value.hasOwnProperty(key)) {
existing[key] = value[key];
}
}
}
- },
+ }
- size: function () {
+ size () {
return this.values.length;
- },
+ }
- get: function (id) {
+ get (id) {
return this.hashMap[id];
- },
+ }
- delete: function (id) {
+ delete (id) {
// find index of object that should be deleted
- var i,
- deleteAtIndex;
+ let deleteAtIndex;
- for (i = 0; i < this.values.length; i += 1) {
+ for (let i = 0; i < this.values.length; i += 1) {
if (this.values[i][this.id] === id) {
deleteAtIndex = i;
break;
@@ -71,23 +67,23 @@ app.factory('Resource', function () {
if (this.hashMap[id] !== undefined) {
delete this.hashMap[id];
}
- },
+ }
- clear: function () {
+ clear () {
this.hashMap = {};
- // http://stackoverflow.com/questions/1232040/how-to-empty-an-array-in-javascript
- // this is the fastes way to empty an array when you want to keep the
- // reference around
+ // http://stackoverflow.com/questions/1232040
+ // this is the fastes way to empty an array when you want to keep
+ // the reference around
while (this.values.length > 0) {
this.values.pop();
}
- },
+ }
- getAll: function () {
+ getAll () {
return this.values;
}
- };
+ }
return Resource;
}); \ No newline at end of file
diff --git a/js/service/Settings.js b/js/service/Settings.js
index 09a89f6ed..61e79b25d 100644
--- a/js/service/Settings.js
+++ b/js/service/Settings.js
@@ -12,20 +12,17 @@ app.service('Settings', function () {
this.settings = {};
- this.receive = function (data) {
- var key;
- for (key in data) {
- if (data.hasOwnProperty(key)) {
- this.settings[key] = data[key];
- }
+ this.receive = (data) => {
+ for (let key in data) {
+ this.settings[key] = data[key];
}
};
- this.get = function (key) {
+ this.get = (key) => {
return this.settings[key];
};
- this.set = function (key, value) {
+ this.set = (key, value) => {
this.settings[key] = value;
};
diff --git a/js/tests/e2e/main.js b/js/tests/e2e/main.js
index b76110c65..247deb47b 100644
--- a/js/tests/e2e/main.js
+++ b/js/tests/e2e/main.js
@@ -23,12 +23,9 @@ describe('news page', function () {
it('should show the first run page', function () {
- var firstRun;
-
-
- firstRun = browser.findElement(By.id('first-run'));
+ let firstRun = browser.findElement(By.id('first-run'));
//firstRun.findElement(By.tagName('h1')).then(function (greeting) {
- // expect(greeting.getText()).toBe('Welcome to the ownCloud News app!');
+ //expect(greeting.getText()).toBe('Welcome to the ownCloud News app!');
//});
expect(firstRun.isDisplayed()).toBe(true);
diff --git a/js/tests/unit/controller/AppControllerSpec.js b/js/tests/unit/controller/AppControllerSpec.js
index d44d8b0c3..fc5780a40 100644
--- a/js/tests/unit/controller/AppControllerSpec.js
+++ b/js/tests/unit/controller/AppControllerSpec.js
@@ -7,36 +7,36 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-describe('AppController', function () {
+describe('AppController', () => {
'use strict';
- var controller;
+ let controller;
beforeEach(module('News'));
- beforeEach(inject(function ($controller) {
+ beforeEach(inject(($controller) => {
controller = $controller('AppController');
}));
- it('should expose Loading', inject(function (Loading) {
+ it('should expose Loading', inject((Loading) => {
expect(controller.loading).toBe(Loading);
}));
- it('should expose set firstrun if no feeds and folders', inject(function () {
+ it('should expose set firstrun if no feeds and folders', inject(() => {
expect(controller.isFirstRun()).toBe(true);
}));
- it('should expose set firstrun if feeds', inject(function (FeedResource) {
+ it('should expose set firstrun if feeds', inject((FeedResource) => {
FeedResource.add({url: 'test'});
expect(controller.isFirstRun()).toBe(false);
}));
- it('should expose set firstrun if folders', inject(function (FolderResource) {
+ it('should expose set firstrun if folders', inject((FolderResource) => {
FolderResource.add({name: 'test'});
expect(controller.isFirstRun()).toBe(false);
diff --git a/js/tests/unit/controller/ContentControllerSpec.js b/js/tests/unit/controller/ContentControllerSpec.js
index c99cb79ab..1dbd3d936 100644
--- a/js/tests/unit/controller/ContentControllerSpec.js
+++ b/js/tests/unit/controller/ContentControllerSpec.js
@@ -7,19 +7,19 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-describe('ContentController', function () {
+describe('ContentController', () => {
'use strict';
beforeEach(module('News'));
- it('should publish data to models', inject(function ($controller, Publisher,
- FeedResource, ItemResource) {
+ it('should publish data to models', inject(($controller, Publisher,
+ FeedResource, ItemResource) => {
Publisher.subscribe(ItemResource).toChannels('items');
Publisher.subscribe(FeedResource).toChannels('feeds');
- var controller = $controller('ContentController', {
+ let controller = $controller('ContentController', {
data: {
'items': [
{
diff --git a/js/tests/unit/service/ItemResourceSpec.js b/js/tests/unit/service/ItemResourceSpec.js
index 9d6c10ae0..acbf0850c 100644
--- a/js/tests/unit/service/ItemResourceSpec.js
+++ b/js/tests/unit/service/ItemResourceSpec.js
@@ -7,27 +7,27 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-describe('ItemResource', function () {
+describe('ItemResource', () => {
'use strict';
beforeEach(module('News'));
- it('should receive the newestItemId', inject(function (ItemResource) {
+ it('should receive the newestItemId', inject((ItemResource) => {
ItemResource.receive(3, 'newestItemId');
expect(ItemResource.getNewestItemId()).toBe(3);
}));
- it('should receive the newestItemId', inject(function (ItemResource) {
+ it('should receive the newestItemId', inject((ItemResource) => {
ItemResource.receive(2, 'starred');
expect(ItemResource.getStarredCount()).toBe(2);
}));
- it('should receive items', inject(function (ItemResource) {
+ it('should receive items', inject((ItemResource) => {
ItemResource.receive([
{
id: 3
diff --git a/js/tests/unit/service/LoadingSpec.js b/js/tests/unit/service/LoadingSpec.js
index 2033f33cc..be654641c 100644
--- a/js/tests/unit/service/LoadingSpec.js
+++ b/js/tests/unit/service/LoadingSpec.js
@@ -7,18 +7,18 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-describe('Loading', function () {
+describe('Loading', () => {
'use strict';
beforeEach(module('News'));
- it('should be not load by default', inject(function (Loading) {
+ it('should be not load by default', inject((Loading) => {
expect(Loading.isLoading('global')).toBe(false);
expect(Loading.isLoading('content')).toBe(false);
expect(Loading.isLoading('autopaging')).toBe(false);
}));
- it('should set loading', inject(function (Loading) {
+ it('should set loading', inject((Loading) => {
Loading.setLoading('global', true);
expect(Loading.isLoading('global')).toBe(true);
}));
diff --git a/js/tests/unit/service/PublisherSpec.js b/js/tests/unit/service/PublisherSpec.js
index 06cd48c6a..38efa9398 100644
--- a/js/tests/unit/service/PublisherSpec.js
+++ b/js/tests/unit/service/PublisherSpec.js
@@ -7,13 +7,13 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-describe('Publisher', function () {
+describe('Publisher', () => {
'use strict';
beforeEach(module('News'));
- it('should should publish on all possible channels', inject(function (Publisher) {
- var obj = {
+ it('should should publish on all possible channels', inject((Publisher) => {
+ let obj = {
receive: jasmine.createSpy('receive')
};
@@ -27,7 +27,7 @@ describe('Publisher', function () {
}));
- it('should should publish on all possible channels', inject(function (Publisher) {
+ it('should should publish on all possible channels', inject((Publisher) => {
var obj = {
receive: jasmine.createSpy('receive')
};
@@ -42,7 +42,7 @@ describe('Publisher', function () {
}));
- it('should not broadcast to not subscribed channels', inject(function (Publisher) {
+ it('should not broadcast not subscribed channels', inject((Publisher) => {
Publisher.publishAll({
test: 'tom'
});
diff --git a/js/tests/unit/service/ResourceSpec.js b/js/tests/unit/service/ResourceSpec.js
index ba877fcd4..ec0b95ed9 100644
--- a/js/tests/unit/service/ResourceSpec.js
+++ b/js/tests/unit/service/ResourceSpec.js
@@ -7,25 +7,26 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-describe('Resource', function () {
+describe('Resource', () => {
'use strict';
- var childModel;
+ let childResource;
beforeEach(module('News'));
- beforeEach(inject(function (Resource) {
- var ChildModel = function () {
- Resource.call(this, 'id');
- };
- ChildModel.prototype = Object.create(Resource.prototype);
+ beforeEach(inject((Resource, $http) => {
+ class ChildResource extends Resource {
+ constructor ($http) {
+ super('id', $http);
+ }
+ }
- childModel = new ChildModel();
+ childResource = new ChildResource($http);
}));
- it('should receive an object', function () {
- var objects = [
+ it('should receive an object', () => {
+ let objects = [
{
id: 2
},
@@ -34,118 +35,106 @@ describe('Resource', function () {
}
];
- childModel.receive(objects);
+ childResource.receive(objects);
- expect(childModel.size()).toBe(2);
+ expect(childResource.size()).toBe(2);
});
- it('should add an object', function () {
- var object = {
+ it('should add an object', () => {
+ let object = {
id: 3,
name: 'test'
};
- childModel.add(object);
+ childResource.add(object);
- expect(childModel.get(3)).toBe(object);
+ expect(childResource.get(3)).toBe(object);
});
- it('should overwrite an object if it already exists', function () {
- var object1,
- object2;
-
- object1 = {
+ it('should overwrite an object if it already exists', () => {
+ let object1 = {
id: 3,
name: 'test',
test: 'ho'
};
- object2 = {
+ let object2 = {
id: 3,
name: 'test2'
};
- childModel.add(object1);
- childModel.add(object2);
+ childResource.add(object1);
+ childResource.add(object2);
- expect(childModel.get(3).name).toBe('test2');
- expect(childModel.get(3).test).toBe('ho');
- expect(childModel.size()).toBe(1);
+ expect(childResource.get(3).name).toBe('test2');
+ expect(childResource.get(3).test).toBe('ho');
+ expect(childResource.size()).toBe(1);
});
- it('should delete a Resource', function () {
- var object1,
- object2;
-
- object1 = {
+ it('should delete a Resource', () => {
+ let object1 = {
id: 3,
name: 'test',
test: 'ho'
};
- object2 = {
+ let object2 = {
id: 4,
name: 'test2'
};
- childModel.add(object1);
- childModel.add(object2);
+ childResource.add(object1);
+ childResource.add(object2);
- childModel.delete(3);
+ childResource.delete(3);
- expect(childModel.get(3)).not.toBeDefined();
- expect(childModel.get(4).name).toBe('test2');
- expect(childModel.size()).toBe(1);
+ expect(childResource.get(3)).not.toBeDefined();
+ expect(childResource.get(4).name).toBe('test2');
+ expect(childResource.size()).toBe(1);
});
- it('should clear all models', function () {
- var object1,
- object2;
-
- object1 = {
+ it('should clear all models', () => {
+ let object1 = {
id: 3,
name: 'test',
test: 'ho'
};
- object2 = {
+ let object2 = {
id: 4,
name: 'test2'
};
- childModel.add(object1);
- childModel.add(object2);
+ childResource.add(object1);
+ childResource.add(object2);
- childModel.clear();
+ childResource.clear();
- expect(childModel.get(3)).not.toBeDefined();
- expect(childModel.get(4)).not.toBeDefined();
- expect(childModel.size()).toBe(0);
+ expect(childResource.get(3)).not.toBeDefined();
+ expect(childResource.get(4)).not.toBeDefined();
+ expect(childResource.size()).toBe(0);
});
- it('should get all models', function () {
- var object1,
- object2;
-
- object1 = {
+ it('should get all models', () => {
+ let object1 = {
id: 3,
name: 'test',
test: 'ho'
};
- object2 = {
+ let object2 = {
id: 4,
name: 'test2'
};
- childModel.add(object1);
- childModel.add(object2);
+ childResource.add(object1);
+ childResource.add(object2);
- expect(childModel.getAll()[1].id).toBe(4);
+ expect(childResource.getAll()[1].id).toBe(4);
});
}); \ No newline at end of file
diff --git a/js/tests/unit/service/SettingsSpec.js b/js/tests/unit/service/SettingsSpec.js
index 65dc4bf2f..b76251e3a 100644
--- a/js/tests/unit/service/SettingsSpec.js
+++ b/js/tests/unit/service/SettingsSpec.js
@@ -7,12 +7,12 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2014
*/
-describe('Settings', function () {
+describe('Settings', () => {
'use strict';
beforeEach(module('News'));
- it('should receive default settings', inject(function (Settings) {
+ it('should receive default settings', inject((Settings) => {
Settings.receive({
'showAll': true
});
@@ -21,7 +21,7 @@ describe('Settings', function () {
}));
- it('should set values', inject(function (Settings) {
+ it('should set values', inject((Settings) => {
Settings.set('showAll', true);
expect(Settings.get('showAll')).toBe(true);
diff --git a/js/tests/unit/stubs/app.js b/js/tests/unit/stubs/App.js
index 3cb1b1d3f..dc512f5e1 100644
--- a/js/tests/unit/stubs/app.js
+++ b/js/tests/unit/stubs/App.js
@@ -7,4 +7,9 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2012, 2014
*/
-var app = angular.module('News', ['ngRoute', 'ngSanitize', 'ngAnimate', 'ngMock']); \ No newline at end of file
+window.app = angular.module('News', [
+ 'ngRoute',
+ 'ngSanitize',
+ 'ngAnimate',
+ 'ngMock'
+]); \ No newline at end of file
diff --git a/js/tests/unit/stubs/oc.js b/js/tests/unit/stubs/OC.js
index 07ac96491..82622aab5 100644
--- a/js/tests/unit/stubs/oc.js
+++ b/js/tests/unit/stubs/OC.js
@@ -7,8 +7,8 @@
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2012, 2014
*/
-var OC = {
- generateUrl: function () {
+window.OC = {
+ generateUrl: () => {
'use strict';
return '';
diff --git a/js/vendor/traceur-runtime/.bower.json b/js/vendor/traceur-runtime/.bower.json
new file mode 100644
index 000000000..952c74fff
--- /dev/null
+++ b/js/vendor/traceur-runtime/.bower.json
@@ -0,0 +1,22 @@
+{
+ "name": "traceur-runtime",
+ "version": "0.0.41",
+ "main": "./traceur-runtime.js",
+ "ignore": [
+ "node_modules",
+ "Gruntfile.js",
+ "*.json",
+ ".*"
+ ],
+ "homepage": "https://github.com/jmcriffey/bower-traceur-runtime",
+ "_release": "0.0.41",
+ "_resolution": {
+ "type": "version",
+ "tag": "0.0.41",
+ "commit": "1327dd26531cc4c5371bbab30f72c908e1abab2e"
+ },
+ "_source": "git://github.com/jmcriffey/bower-traceur-runtime.git",
+ "_target": "~0.0.41",
+ "_originalSource": "traceur-runtime",
+ "_direct": true
+} \ No newline at end of file
diff --git a/js/vendor/traceur-runtime/README.md b/js/vendor/traceur-runtime/README.md
new file mode 100644
index 000000000..a1150103b
--- /dev/null
+++ b/js/vendor/traceur-runtime/README.md
@@ -0,0 +1,35 @@
+# bower-traceur-runtime
+
+This repo is for distribution on `bower`. The source for this module is in the
+[main traceur repo](https://github.com/google/traceur-compiler/).
+Please file issues and pull requests against that repo.
+
+## Install
+
+Install with `bower`:
+
+```shell
+bower install traceur-runtime
+```
+
+Add a `<script>` to your `index.html`:
+
+```html
+<script src="/bower_components/traceur-runtime/traceur-runtime.js"></script>
+```
+
+## License
+
+Copyright 2012 Traceur Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/js/vendor/traceur-runtime/traceur-runtime.js b/js/vendor/traceur-runtime/traceur-runtime.js
new file mode 100644
index 000000000..b3f9f54d5
--- /dev/null
+++ b/js/vendor/traceur-runtime/traceur-runtime.js
@@ -0,0 +1,1712 @@
+(function(global) {
+ 'use strict';
+ if (global.$traceurRuntime) {
+ return;
+ }
+ var $Object = Object;
+ var $TypeError = TypeError;
+ var $create = $Object.create;
+ var $defineProperties = $Object.defineProperties;
+ var $defineProperty = $Object.defineProperty;
+ var $freeze = $Object.freeze;
+ var $getOwnPropertyDescriptor = $Object.getOwnPropertyDescriptor;
+ var $getOwnPropertyNames = $Object.getOwnPropertyNames;
+ var $getPrototypeOf = $Object.getPrototypeOf;
+ var $keys = $Object.keys;
+ var $hasOwnProperty = $Object.prototype.hasOwnProperty;
+ var $toString = $Object.prototype.toString;
+ var $preventExtensions = Object.preventExtensions;
+ var $seal = Object.seal;
+ var $isExtensible = Object.isExtensible;
+ function nonEnum(value) {
+ return {
+ configurable: true,
+ enumerable: false,
+ value: value,
+ writable: true
+ };
+ }
+ var types = {
+ void: function voidType() {},
+ any: function any() {},
+ string: function string() {},
+ number: function number() {},
+ boolean: function boolean() {}
+ };
+ var method = nonEnum;
+ var counter = 0;
+ function newUniqueString() {
+ return '__$' + Math.floor(Math.random() * 1e9) + '$' + ++counter + '$__';
+ }
+ var symbolInternalProperty = newUniqueString();
+ var symbolDescriptionProperty = newUniqueString();
+ var symbolDataProperty = newUniqueString();
+ var symbolValues = $create(null);
+ var privateNames = $create(null);
+ function createPrivateName() {
+ var s = newUniqueString();
+ privateNames[s] = true;
+ return s;
+ }
+ function isSymbol(symbol) {
+ return typeof symbol === 'object' && symbol instanceof SymbolValue;
+ }
+ function typeOf(v) {
+ if (isSymbol(v))
+ return 'symbol';
+ return typeof v;
+ }
+ function Symbol(description) {
+ var value = new SymbolValue(description);
+ if (!(this instanceof Symbol))
+ return value;
+ throw new TypeError('Symbol cannot be new\'ed');
+ }
+ $defineProperty(Symbol.prototype, 'constructor', nonEnum(Symbol));
+ $defineProperty(Symbol.prototype, 'toString', method(function() {
+ var symbolValue = this[symbolDataProperty];
+ if (!getOption('symbols'))
+ return symbolValue[symbolInternalProperty];
+ if (!symbolValue)
+ throw TypeError('Conversion from symbol to string');
+ var desc = symbolValue[symbolDescriptionProperty];
+ if (desc === undefined)
+ desc = '';
+ return 'Symbol(' + desc + ')';
+ }));
+ $defineProperty(Symbol.prototype, 'valueOf', method(function() {
+ var symbolValue = this[symbolDataProperty];
+ if (!symbolValue)
+ throw TypeError('Conversion from symbol to string');
+ if (!getOption('symbols'))
+ return symbolValue[symbolInternalProperty];
+ return symbolValue;
+ }));
+ function SymbolValue(description) {
+ var key = newUniqueString();
+ $defineProperty(this, symbolDataProperty, {value: this});
+ $defineProperty(this, symbolInternalProperty, {value: key});
+ $defineProperty(this, symbolDescriptionProperty, {value: description});
+ freeze(this);
+ symbolValues[key] = this;
+ }
+ $defineProperty(SymbolValue.prototype, 'constructor', nonEnum(Symbol));
+ $defineProperty(SymbolValue.prototype, 'toString', {
+ value: Symbol.prototype.toString,
+ enumerable: false
+ });
+ $defineProperty(SymbolValue.prototype, 'valueOf', {
+ value: Symbol.prototype.valueOf,
+ enumerable: false
+ });
+ var hashProperty = createPrivateName();
+ var hashPropertyDescriptor = {value: undefined};
+ var hashObjectProperties = {
+ hash: {value: undefined},
+ self: {value: undefined}
+ };
+ var hashCounter = 0;
+ function getOwnHashObject(object) {
+ var hashObject = object[hashProperty];
+ if (hashObject && hashObject.self === object)
+ return hashObject;
+ if ($isExtensible(object)) {
+ hashObjectProperties.hash.value = hashCounter++;
+ hashObjectProperties.self.value = object;
+ hashPropertyDescriptor.value = $create(null, hashObjectProperties);
+ $defineProperty(object, hashProperty, hashPropertyDescriptor);
+ return hashPropertyDescriptor.value;
+ }
+ return undefined;
+ }
+ function freeze(object) {
+ getOwnHashObject(object);
+ return $freeze.apply(this, arguments);
+ }
+ function preventExtensions(object) {
+ getOwnHashObject(object);
+ return $preventExtensions.apply(this, arguments);
+ }
+ function seal(object) {
+ getOwnHashObject(object);
+ return $seal.apply(this, arguments);
+ }
+ Symbol.iterator = Symbol();
+ freeze(SymbolValue.prototype);
+ function toProperty(name) {
+ if (isSymbol(name))
+ return name[symbolInternalProperty];
+ return name;
+ }
+ function getOwnPropertyNames(object) {
+ var rv = [];
+ var names = $getOwnPropertyNames(object);
+ for (var i = 0; i < names.length; i++) {
+ var name = names[i];
+ if (!symbolValues[name] && !privateNames[name])
+ rv.push(name);
+ }
+ return rv;
+ }
+ function getOwnPropertyDescriptor(object, name) {
+ return $getOwnPropertyDescriptor(object, toProperty(name));
+ }
+ function getOwnPropertySymbols(object) {
+ var rv = [];
+ var names = $getOwnPropertyNames(object);
+ for (var i = 0; i < names.length; i++) {
+ var symbol = symbolValues[names[i]];
+ if (symbol)
+ rv.push(symbol);
+ }
+ return rv;
+ }
+ function hasOwnProperty(name) {
+ return $hasOwnProperty.call(this, toProperty(name));
+ }
+ function getOption(name) {
+ return global.traceur && global.traceur.options[name];
+ }
+ function setProperty(object, name, value) {
+ var sym,
+ desc;
+ if (isSymbol(name)) {
+ sym = name;
+ name = name[symbolInternalProperty];
+ }
+ object[name] = value;
+ if (sym && (desc = $getOwnPropertyDescriptor(object, name)))
+ $defineProperty(object, name, {enumerable: false});
+ return value;
+ }
+ function defineProperty(object, name, descriptor) {
+ if (isSymbol(name)) {
+ if (descriptor.enumerable) {
+ descriptor = $create(descriptor, {enumerable: {value: false}});
+ }
+ name = name[symbolInternalProperty];
+ }
+ $defineProperty(object, name, descriptor);
+ return object;
+ }
+ function polyfillObject(Object) {
+ $defineProperty(Object, 'defineProperty', {value: defineProperty});
+ $defineProperty(Object, 'getOwnPropertyNames', {value: getOwnPropertyNames});
+ $defineProperty(Object, 'getOwnPropertyDescriptor', {value: getOwnPropertyDescriptor});
+ $defineProperty(Object.prototype, 'hasOwnProperty', {value: hasOwnProperty});
+ $defineProperty(Object, 'freeze', {value: freeze});
+ $defineProperty(Object, 'preventExtensions', {value: preventExtensions});
+ $defineProperty(Object, 'seal', {value: seal});
+ Object.getOwnPropertySymbols = getOwnPropertySymbols;
+ function is(left, right) {
+ if (left === right)
+ return left !== 0 || 1 / left === 1 / right;
+ return left !== left && right !== right;
+ }
+ $defineProperty(Object, 'is', method(is));
+ function assign(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ var props = $keys(source);
+ var p,
+ length = props.length;
+ for (p = 0; p < length; p++) {
+ var name = props[p];
+ if (privateNames[name])
+ continue;
+ target[name] = source[name];
+ }
+ }
+ return target;
+ }
+ $defineProperty(Object, 'assign', method(assign));
+ function mixin(target, source) {
+ var props = $getOwnPropertyNames(source);
+ var p,
+ descriptor,
+ length = props.length;
+ for (p = 0; p < length; p++) {
+ var name = props[p];
+ if (privateNames[name])
+ continue;
+ descriptor = $getOwnPropertyDescriptor(source, props[p]);
+ $defineProperty(target, props[p], descriptor);
+ }
+ return target;
+ }
+ $defineProperty(Object, 'mixin', method(mixin));
+ }
+ function exportStar(object) {
+ for (var i = 1; i < arguments.length; i++) {
+ var names = $getOwnPropertyNames(arguments[i]);
+ for (var j = 0; j < names.length; j++) {
+ var name = names[j];
+ if (privateNames[name])
+ continue;
+ (function(mod, name) {
+ $defineProperty(object, name, {
+ get: function() {
+ return mod[name];
+ },
+ enumerable: true
+ });
+ })(arguments[i], names[j]);
+ }
+ }
+ return object;
+ }
+ function isObject(x) {
+ return x != null && (typeof x === 'object' || typeof x === 'function');
+ }
+ function toObject(x) {
+ if (x == null)
+ throw $TypeError();
+ return $Object(x);
+ }
+ function assertObject(x) {
+ if (!isObject(x))
+ throw $TypeError(x + ' is not an Object');
+ return x;
+ }
+ function spread() {
+ var rv = [],
+ k = 0;
+ for (var i = 0; i < arguments.length; i++) {
+ var valueToSpread = toObject(arguments[i]);
+ for (var j = 0; j < valueToSpread.length; j++) {
+ rv[k++] = valueToSpread[j];
+ }
+ }
+ return rv;
+ }
+ function superDescriptor(homeObject, name) {
+ var proto = $getPrototypeOf(homeObject);
+ do {
+ var result = $getOwnPropertyDescriptor(proto, name);
+ if (result)
+ return result;
+ proto = $getPrototypeOf(proto);
+ } while (proto);
+ return undefined;
+ }
+ function superCall(self, homeObject, name, args) {
+ return superGet(self, homeObject, name).apply(self, args);
+ }
+ function superGet(self, homeObject, name) {
+ var descriptor = superDescriptor(homeObject, name);
+ if (descriptor) {
+ if (!descriptor.get)
+ return descriptor.value;
+ return descriptor.get.call(self);
+ }
+ return undefined;
+ }
+ function superSet(self, homeObject, name, value) {
+ var descriptor = superDescriptor(homeObject, name);
+ if (descriptor && descriptor.set) {
+ descriptor.set.call(self, value);
+ return value;
+ }
+ throw $TypeError("super has no setter '" + name + "'.");
+ }
+ function getDescriptors(object) {
+ var descriptors = {},
+ name,
+ names = $getOwnPropertyNames(object);
+ for (var i = 0; i < names.length; i++) {
+ var name = names[i];
+ descriptors[name] = $getOwnPropertyDescriptor(object, name);
+ }
+ return descriptors;
+ }
+ function createClass(ctor, object, staticObject, superClass) {
+ $defineProperty(object, 'constructor', {
+ value: ctor,
+ configurable: true,
+ enumerable: false,
+ writable: true
+ });
+ if (arguments.length > 3) {
+ if (typeof superClass === 'function')
+ ctor.__proto__ = superClass;
+ ctor.prototype = $create(getProtoParent(superClass), getDescriptors(object));
+ } else {
+ ctor.prototype = object;
+ }
+ $defineProperty(ctor, 'prototype', {
+ configurable: false,
+ writable: false
+ });
+ return $defineProperties(ctor, getDescriptors(staticObject));
+ }
+ function getProtoParent(superClass) {
+ if (typeof superClass === 'function') {
+ var prototype = superClass.prototype;
+ if ($Object(prototype) === prototype || prototype === null)
+ return superClass.prototype;
+ }
+ if (superClass === null)
+ return null;
+ throw new TypeError();
+ }
+ function defaultSuperCall(self, homeObject, args) {
+ if ($getPrototypeOf(homeObject) !== null)
+ superCall(self, homeObject, 'constructor', args);
+ }
+ var ST_NEWBORN = 0;
+ var ST_EXECUTING = 1;
+ var ST_SUSPENDED = 2;
+ var ST_CLOSED = 3;
+ var END_STATE = -2;
+ var RETHROW_STATE = -3;
+ function getInternalError(state) {
+ return new Error('Traceur compiler bug: invalid state in state machine: ' + state);
+ }
+ function GeneratorContext() {
+ this.state = 0;
+ this.GState = ST_NEWBORN;
+ this.storedException = undefined;
+ this.finallyFallThrough = undefined;
+ this.sent_ = undefined;
+ this.returnValue = undefined;
+ this.tryStack_ = [];
+ }
+ GeneratorContext.prototype = {
+ pushTry: function(catchState, finallyState) {
+ if (finallyState !== null) {
+ var finallyFallThrough = null;
+ for (var i = this.tryStack_.length - 1; i >= 0; i--) {
+ if (this.tryStack_[i].catch !== undefined) {
+ finallyFallThrough = this.tryStack_[i].catch;
+ break;
+ }
+ }
+ if (finallyFallThrough === null)
+ finallyFallThrough = RETHROW_STATE;
+ this.tryStack_.push({
+ finally: finallyState,
+ finallyFallThrough: finallyFallThrough
+ });
+ }
+ if (catchState !== null) {
+ this.tryStack_.push({catch: catchState});
+ }
+ },
+ popTry: function() {
+ this.tryStack_.pop();
+ },
+ get sent() {
+ this.maybeThrow();
+ return this.sent_;
+ },
+ set sent(v) {
+ this.sent_ = v;
+ },
+ get sentIgnoreThrow() {
+ return this.sent_;
+ },
+ maybeThrow: function() {
+ if (this.action === 'throw') {
+ this.action = 'next';
+ throw this.sent_;
+ }
+ },
+ end: function() {
+ switch (this.state) {
+ case END_STATE:
+ return this;
+ case RETHROW_STATE:
+ throw this.storedException;
+ default:
+ throw getInternalError(this.state);
+ }
+ },
+ handleException: function(ex) {
+ this.GState = ST_CLOSED;
+ this.state = END_STATE;
+ throw ex;
+ }
+ };
+ function nextOrThrow(ctx, moveNext, action, x) {
+ switch (ctx.GState) {
+ case ST_EXECUTING:
+ throw new Error(("\"" + action + "\" on executing generator"));
+ case ST_CLOSED:
+ throw new Error(("\"" + action + "\" on closed generator"));
+ case ST_NEWBORN:
+ if (action === 'throw') {
+ ctx.GState = ST_CLOSED;
+ throw x;
+ }
+ if (x !== undefined)
+ throw $TypeError('Sent value to newborn generator');
+ case ST_SUSPENDED:
+ ctx.GState = ST_EXECUTING;
+ ctx.action = action;
+ ctx.sent = x;
+ var value = moveNext(ctx);
+ var done = value === ctx;
+ if (done)
+ value = ctx.returnValue;
+ ctx.GState = done ? ST_CLOSED : ST_SUSPENDED;
+ return {
+ value: value,
+ done: done
+ };
+ }
+ }
+ var ctxName = createPrivateName();
+ var moveNextName = createPrivateName();
+ function GeneratorFunction() {}
+ function GeneratorFunctionPrototype() {}
+ GeneratorFunction.prototype = GeneratorFunctionPrototype;
+ $defineProperty(GeneratorFunctionPrototype, 'constructor', nonEnum(GeneratorFunction));
+ GeneratorFunctionPrototype.prototype = {
+ constructor: GeneratorFunctionPrototype,
+ next: function(v) {
+ return nextOrThrow(this[ctxName], this[moveNextName], 'next', v);
+ },
+ throw: function(v) {
+ return nextOrThrow(this[ctxName], this[moveNextName], 'throw', v);
+ }
+ };
+ $defineProperties(GeneratorFunctionPrototype.prototype, {
+ constructor: {enumerable: false},
+ next: {enumerable: false},
+ throw: {enumerable: false}
+ });
+ defineProperty(GeneratorFunctionPrototype.prototype, Symbol.iterator, nonEnum(function() {
+ return this;
+ }));
+ function createGeneratorInstance(innerFunction, functionObject, self) {
+ var moveNext = getMoveNext(innerFunction, self);
+ var ctx = new GeneratorContext();
+ var object = $create(functionObject.prototype);
+ object[ctxName] = ctx;
+ object[moveNextName] = moveNext;
+ return object;
+ }
+ function initGeneratorFunction(functionObject) {
+ functionObject.prototype = $create(GeneratorFunctionPrototype.prototype);
+ functionObject.__proto__ = GeneratorFunctionPrototype;
+ return functionObject;
+ }
+ function AsyncFunctionContext() {
+ GeneratorContext.call(this);
+ this.err = undefined;
+ var ctx = this;
+ ctx.result = new Promise(function(resolve, reject) {
+ ctx.resolve = resolve;
+ ctx.reject = reject;
+ });
+ }
+ AsyncFunctionContext.prototype = Object.create(GeneratorContext.prototype);
+ AsyncFunctionContext.prototype.end = function() {
+ switch (this.state) {
+ case END_STATE:
+ this.resolve(this.returnValue);
+ break;
+ case RETHROW_STATE:
+ this.reject(this.storedException);
+ break;
+ default:
+ this.reject(getInternalError(this.state));
+ }
+ };
+ AsyncFunctionContext.prototype.handleException = function() {
+ this.state = RETHROW_STATE;
+ };
+ function asyncWrap(innerFunction, self) {
+ var moveNext = getMoveNext(innerFunction, self);
+ var ctx = new AsyncFunctionContext();
+ ctx.createCallback = function(newState) {
+ return function(value) {
+ ctx.state = newState;
+ ctx.value = value;
+ moveNext(ctx);
+ };
+ };
+ ctx.errback = function(err) {
+ handleCatch(ctx, err);
+ moveNext(ctx);
+ };
+ moveNext(ctx);
+ return ctx.result;
+ }
+ function getMoveNext(innerFunction, self) {
+ return function(ctx) {
+ while (true) {
+ try {
+ return innerFunction.call(self, ctx);
+ } catch (ex) {
+ handleCatch(ctx, ex);
+ }
+ }
+ };
+ }
+ function handleCatch(ctx, ex) {
+ ctx.storedException = ex;
+ var last = ctx.tryStack_[ctx.tryStack_.length - 1];
+ if (!last) {
+ ctx.handleException(ex);
+ return;
+ }
+ ctx.state = last.catch !== undefined ? last.catch : last.finally;
+ if (last.finallyFallThrough !== undefined)
+ ctx.finallyFallThrough = last.finallyFallThrough;
+ }
+ function setupGlobals(global) {
+ global.Symbol = Symbol;
+ polyfillObject(global.Object);
+ }
+ setupGlobals(global);
+ global.$traceurRuntime = {
+ assertObject: assertObject,
+ asyncWrap: asyncWrap,
+ createClass: createClass,
+ defaultSuperCall: defaultSuperCall,
+ exportStar: exportStar,
+ initGeneratorFunction: initGeneratorFunction,
+ createGeneratorInstance: createGeneratorInstance,
+ getOwnHashObject: getOwnHashObject,
+ setProperty: setProperty,
+ setupGlobals: setupGlobals,
+ spread: spread,
+ superCall: superCall,
+ superGet: superGet,
+ superSet: superSet,
+ toObject: toObject,
+ toProperty: toProperty,
+ type: types,
+ typeof: typeOf
+ };
+})(typeof global !== 'undefined' ? global : this);
+(function() {
+ function buildFromEncodedParts(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData, opt_fragment) {
+ var out = [];
+ if (opt_scheme) {
+ out.push(opt_scheme, ':');
+ }
+ if (opt_domain) {
+ out.push('//');
+ if (opt_userInfo) {
+ out.push(opt_userInfo, '@');
+ }
+ out.push(opt_domain);
+ if (opt_port) {
+ out.push(':', opt_port);
+ }
+ }
+ if (opt_path) {
+ out.push(opt_path);
+ }
+ if (opt_queryData) {
+ out.push('?', opt_queryData);
+ }
+ if (opt_fragment) {
+ out.push('#', opt_fragment);
+ }
+ return out.join('');
+ }
+ ;
+ var splitRe = new RegExp('^' + '(?:' + '([^:/?#.]+)' + ':)?' + '(?://' + '(?:([^/?#]*)@)?' + '([\\w\\d\\-\\u0100-\\uffff.%]*)' + '(?::([0-9]+))?' + ')?' + '([^?#]+)?' + '(?:\\?([^#]*))?' + '(?:#(.*))?' + '$');
+ var ComponentIndex = {
+ SCHEME: 1,
+ USER_INFO: 2,
+ DOMAIN: 3,
+ PORT: 4,
+ PATH: 5,
+ QUERY_DATA: 6,
+ FRAGMENT: 7
+ };
+ function split(uri) {
+ return (uri.match(splitRe));
+ }
+ function removeDotSegments(path) {
+ if (path === '/')
+ return '/';
+ var leadingSlash = path[0] === '/' ? '/' : '';
+ var trailingSlash = path.slice(-1) === '/' ? '/' : '';
+ var segments = path.split('/');
+ var out = [];
+ var up = 0;
+ for (var pos = 0; pos < segments.length; pos++) {
+ var segment = segments[pos];
+ switch (segment) {
+ case '':
+ case '.':
+ break;
+ case '..':
+ if (out.length)
+ out.pop();
+ else
+ up++;
+ break;
+ default:
+ out.push(segment);
+ }
+ }
+ if (!leadingSlash) {
+ while (up-- > 0) {
+ out.unshift('..');
+ }
+ if (out.length === 0)
+ out.push('.');
+ }
+ return leadingSlash + out.join('/') + trailingSlash;
+ }
+ function joinAndCanonicalizePath(parts) {
+ var path = parts[ComponentIndex.PATH] || '';
+ path = removeDotSegments(path);
+ parts[ComponentIndex.PATH] = path;
+ return buildFromEncodedParts(parts[ComponentIndex.SCHEME], parts[ComponentIndex.USER_INFO], parts[ComponentIndex.DOMAIN], parts[ComponentIndex.PORT], parts[ComponentIndex.PATH], parts[ComponentIndex.QUERY_DATA], parts[ComponentIndex.FRAGMENT]);
+ }
+ function canonicalizeUrl(url) {
+ var parts = split(url);
+ return joinAndCanonicalizePath(parts);
+ }
+ function resolveUrl(base, url) {
+ var parts = split(url);
+ var baseParts = split(base);
+ if (parts[ComponentIndex.SCHEME]) {
+ return joinAndCanonicalizePath(parts);
+ } else {
+ parts[ComponentIndex.SCHEME] = baseParts[ComponentIndex.SCHEME];
+ }
+ for (var i = ComponentIndex.SCHEME; i <= ComponentIndex.PORT; i++) {
+ if (!parts[i]) {
+ parts[i] = baseParts[i];
+ }
+ }
+ if (parts[ComponentIndex.PATH][0] == '/') {
+ return joinAndCanonicalizePath(parts);
+ }
+ var path = baseParts[ComponentIndex.PATH];
+ var index = path.lastIndexOf('/');
+ path = path.slice(0, index + 1) + parts[ComponentIndex.PATH];
+ parts[ComponentIndex.PATH] = path;
+ return joinAndCanonicalizePath(parts);
+ }
+ function isAbsolute(name) {
+ if (!name)
+ return false;
+ if (name[0] === '/')
+ return true;
+ var parts = split(name);
+ if (parts[ComponentIndex.SCHEME])
+ return true;
+ return false;
+ }
+ $traceurRuntime.canonicalizeUrl = canonicalizeUrl;
+ $traceurRuntime.isAbsolute = isAbsolute;
+ $traceurRuntime.removeDotSegments = removeDotSegments;
+ $traceurRuntime.resolveUrl = resolveUrl;
+})();
+(function(global) {
+ 'use strict';
+ var $__2 = $traceurRuntime.assertObject($traceurRuntime),
+ canonicalizeUrl = $__2.canonicalizeUrl,
+ resolveUrl = $__2.resolveUrl,
+ isAbsolute = $__2.isAbsolute;
+ var moduleInstantiators = Object.create(null);
+ var baseURL;
+ if (global.location && global.location.href)
+ baseURL = resolveUrl(global.location.href, './');
+ else
+ baseURL = '';
+ var UncoatedModuleEntry = function UncoatedModuleEntry(url, uncoatedModule) {
+ this.url = url;
+ this.value_ = uncoatedModule;
+ };
+ ($traceurRuntime.createClass)(UncoatedModuleEntry, {}, {});
+ var UncoatedModuleInstantiator = function UncoatedModuleInstantiator(url, func) {
+ $traceurRuntime.superCall(this, $UncoatedModuleInstantiator.prototype, "constructor", [url, null]);
+ this.func = func;
+ };
+ var $UncoatedModuleInstantiator = UncoatedModuleInstantiator;
+ ($traceurRuntime.createClass)(UncoatedModuleInstantiator, {getUncoatedModule: function() {
+ if (this.value_)
+ return this.value_;
+ return this.value_ = this.func.call(global);
+ }}, {}, UncoatedModuleEntry);
+ function getUncoatedModuleInstantiator(name) {
+ if (!name)
+ return;
+ var url = ModuleStore.normalize(name);
+ return moduleInstantiators[url];
+ }
+ ;
+ var moduleInstances = Object.create(null);
+ var liveModuleSentinel = {};
+ function Module(uncoatedModule) {
+ var isLive = arguments[1];
+ var coatedModule = Object.create(null);
+ Object.getOwnPropertyNames(uncoatedModule).forEach((function(name) {
+ var getter,
+ value;
+ if (isLive === liveModuleSentinel) {
+ var descr = Object.getOwnPropertyDescriptor(uncoatedModule, name);
+ if (descr.get)
+ getter = descr.get;
+ }
+ if (!getter) {
+ value = uncoatedModule[name];
+ getter = function() {
+ return value;
+ };
+ }
+ Object.defineProperty(coatedModule, name, {
+ get: getter,
+ enumerable: true
+ });
+ }));
+ Object.preventExtensions(coatedModule);
+ return coatedModule;
+ }
+ var ModuleStore = {
+ normalize: function(name, refererName, refererAddress) {
+ if (typeof name !== "string")
+ throw new TypeError("module name must be a string, not " + typeof name);
+ if (isAbsolute(name))
+ return canonicalizeUrl(name);
+ if (/[^\.]\/\.\.\//.test(name)) {
+ throw new Error('module name embeds /../: ' + name);
+ }
+ if (name[0] === '.' && refererName)
+ return resolveUrl(refererName, name);
+ return canonicalizeUrl(name);
+ },
+ get: function(normalizedName) {
+ var m = getUncoatedModuleInstantiator(normalizedName);
+ if (!m)
+ return undefined;
+ var moduleInstance = moduleInstances[m.url];
+ if (moduleInstance)
+ return moduleInstance;
+ moduleInstance = Module(m.getUncoatedModule(), liveModuleSentinel);
+ return moduleInstances[m.url] = moduleInstance;
+ },
+ set: function(normalizedName, module) {
+ normalizedName = String(normalizedName);
+ moduleInstantiators[normalizedName] = new UncoatedModuleInstantiator(normalizedName, (function() {
+ return module;
+ }));
+ moduleInstances[normalizedName] = module;
+ },
+ get baseURL() {
+ return baseURL;
+ },
+ set baseURL(v) {
+ baseURL = String(v);
+ },
+ registerModule: function(name, func) {
+ var normalizedName = ModuleStore.normalize(name);
+ if (moduleInstantiators[normalizedName])
+ throw new Error('duplicate module named ' + normalizedName);
+ moduleInstantiators[normalizedName] = new UncoatedModuleInstantiator(normalizedName, func);
+ },
+ bundleStore: Object.create(null),
+ register: function(name, deps, func) {
+ if (!deps || !deps.length && !func.length) {
+ this.registerModule(name, func);
+ } else {
+ this.bundleStore[name] = {
+ deps: deps,
+ execute: function() {
+ var $__0 = arguments;
+ var depMap = {};
+ deps.forEach((function(dep, index) {
+ return depMap[dep] = $__0[index];
+ }));
+ var registryEntry = func.call(this, depMap);
+ registryEntry.execute.call(this);
+ return registryEntry.exports;
+ }
+ };
+ }
+ },
+ getAnonymousModule: function(func) {
+ return new Module(func.call(global), liveModuleSentinel);
+ },
+ getForTesting: function(name) {
+ var $__0 = this;
+ if (!this.testingPrefix_) {
+ Object.keys(moduleInstances).some((function(key) {
+ var m = /(traceur@[^\/]*\/)/.exec(key);
+ if (m) {
+ $__0.testingPrefix_ = m[1];
+ return true;
+ }
+ }));
+ }
+ return this.get(this.testingPrefix_ + name);
+ }
+ };
+ ModuleStore.set('@traceur/src/runtime/ModuleStore', new Module({ModuleStore: ModuleStore}));
+ var setupGlobals = $traceurRuntime.setupGlobals;
+ $traceurRuntime.setupGlobals = function(global) {
+ setupGlobals(global);
+ };
+ $traceurRuntime.ModuleStore = ModuleStore;
+ global.System = {
+ register: ModuleStore.register.bind(ModuleStore),
+ get: ModuleStore.get,
+ set: ModuleStore.set,
+ normalize: ModuleStore.normalize
+ };
+ $traceurRuntime.getModuleImpl = function(name) {
+ var instantiator = getUncoatedModuleInstantiator(name);
+ return instantiator && instantiator.getUncoatedModule();
+ };
+})(typeof global !== 'undefined' ? global : this);
+System.register("traceur-runtime@0.0.41/src/runtime/polyfills/utils", [], function() {
+ "use strict";
+ var __moduleName = "traceur-runtime@0.0.41/src/runtime/polyfills/utils";
+ var toObject = $traceurRuntime.toObject;
+ function toUint32(x) {
+ return x | 0;
+ }
+ function isObject(x) {
+ return x && (typeof x === 'object' || typeof x === 'function');
+ }
+ function isCallable(x) {
+ return typeof x === 'function';
+ }
+ function toInteger(x) {
+ x = +x;
+ if (isNaN(x))
+ return 0;
+ if (!isFinite(x) || x === 0)
+ return x;
+ return x > 0 ? Math.floor(x) : Math.ceil(x);
+ }
+ var MAX_SAFE_LENGTH = Math.pow(2, 53) - 1;
+ function toLength(x) {
+ var len = toInteger(x);
+ return len < 0 ? 0 : Math.min(len, MAX_SAFE_LENGTH);
+ }
+ return {
+ get toObject() {
+ return toObject;
+ },
+ get toUint32() {
+ return toUint32;
+ },
+ get isObject() {
+ return isObject;
+ },
+ get isCallable() {
+ return isCallable;
+ },
+ get toInteger() {
+ return toInteger;
+ },
+ get toLength() {
+ return toLength;
+ }
+ };
+});
+System.register("traceur-runtime@0.0.41/src/runtime/polyfills/Array", [], function() {
+ "use strict";
+ var __moduleName = "traceur-runtime@0.0.41/src/runtime/polyfills/Array";
+ var $__3 = $traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/utils")),
+ toInteger = $__3.toInteger,
+ toLength = $__3.toLength,
+ toObject = $__3.toObject,
+ isCallable = $__3.isCallable;
+ function fill(value) {
+ var start = arguments[1] !== (void 0) ? arguments[1] : 0;
+ var end = arguments[2];
+ var object = toObject(this);
+ var len = toLength(object.length);
+ var fillStart = toInteger(start);
+ var fillEnd = end !== undefined ? toInteger(end) : len;
+ fillStart = fillStart < 0 ? Math.max(len + fillStart, 0) : Math.min(fillStart, len);
+ fillEnd = fillEnd < 0 ? Math.max(len + fillEnd, 0) : Math.min(fillEnd, len);
+ while (fillStart < fillEnd) {
+ object[fillStart] = value;
+ fillStart++;
+ }
+ return object;
+ }
+ function find(predicate) {
+ var thisArg = arguments[1];
+ return findHelper(this, predicate, thisArg);
+ }
+ function findIndex(predicate) {
+ var thisArg = arguments[1];
+ return findHelper(this, predicate, thisArg, true);
+ }
+ function findHelper(self, predicate) {
+ var thisArg = arguments[2];
+ var returnIndex = arguments[3] !== (void 0) ? arguments[3] : false;
+ var object = toObject(self);
+ var len = toLength(object.length);
+ if (!isCallable(predicate)) {
+ throw TypeError();
+ }
+ for (var i = 0; i < len; i++) {
+ if (i in object) {
+ var value = object[i];
+ if (predicate.call(thisArg, value, i, object)) {
+ return returnIndex ? i : value;
+ }
+ }
+ }
+ return returnIndex ? -1 : undefined;
+ }
+ return {
+ get fill() {
+ return fill;
+ },
+ get find() {
+ return find;
+ },
+ get findIndex() {
+ return findIndex;
+ }
+ };
+});
+System.register("traceur-runtime@0.0.41/src/runtime/polyfills/ArrayIterator", [], function() {
+ "use strict";
+ var $__5;
+ var __moduleName = "traceur-runtime@0.0.41/src/runtime/polyfills/ArrayIterator";
+ var $__6 = $traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/utils")),
+ toObject = $__6.toObject,
+ toUint32 = $__6.toUint32;
+ var ARRAY_ITERATOR_KIND_KEYS = 1;
+ var ARRAY_ITERATOR_KIND_VALUES = 2;
+ var ARRAY_ITERATOR_KIND_ENTRIES = 3;
+ var ArrayIterator = function ArrayIterator() {};
+ ($traceurRuntime.createClass)(ArrayIterator, ($__5 = {}, Object.defineProperty($__5, "next", {
+ value: function() {
+ var iterator = toObject(this);
+ var array = iterator.iteratorObject_;
+ if (!array) {
+ throw new TypeError('Object is not an ArrayIterator');
+ }
+ var index = iterator.arrayIteratorNextIndex_;
+ var itemKind = iterator.arrayIterationKind_;
+ var length = toUint32(array.length);
+ if (index >= length) {
+ iterator.arrayIteratorNextIndex_ = Infinity;
+ return createIteratorResultObject(undefined, true);
+ }
+ iterator.arrayIteratorNextIndex_ = index + 1;
+ if (itemKind == ARRAY_ITERATOR_KIND_VALUES)
+ return createIteratorResultObject(array[index], false);
+ if (itemKind == ARRAY_ITERATOR_KIND_ENTRIES)
+ return createIteratorResultObject([index, array[index]], false);
+ return createIteratorResultObject(index, false);
+ },
+ configurable: true,
+ enumerable: true,
+ writable: true
+ }), Object.defineProperty($__5, Symbol.iterator, {
+ value: function() {
+ return this;
+ },
+ configurable: true,
+ enumerable: true,
+ writable: true
+ }), $__5), {});
+ function createArrayIterator(array, kind) {
+ var object = toObject(array);
+ var iterator = new ArrayIterator;
+ iterator.iteratorObject_ = object;
+ iterator.arrayIteratorNextIndex_ = 0;
+ iterator.arrayIterationKind_ = kind;
+ return iterator;
+ }
+ function createIteratorResultObject(value, done) {
+ return {
+ value: value,
+ done: done
+ };
+ }
+ function entries() {
+ return createArrayIterator(this, ARRAY_ITERATOR_KIND_ENTRIES);
+ }
+ function keys() {
+ return createArrayIterator(this, ARRAY_ITERATOR_KIND_KEYS);
+ }
+ function values() {
+ return createArrayIterator(this, ARRAY_ITERATOR_KIND_VALUES);
+ }
+ return {
+ get entries() {
+ return entries;
+ },
+ get keys() {
+ return keys;
+ },
+ get values() {
+ return values;
+ }
+ };
+});
+System.register("traceur-runtime@0.0.41/src/runtime/polyfills/Map", [], function() {
+ "use strict";
+ var __moduleName = "traceur-runtime@0.0.41/src/runtime/polyfills/Map";
+ var isObject = $traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/utils")).isObject;
+ var getOwnHashObject = $traceurRuntime.getOwnHashObject;
+ var $hasOwnProperty = Object.prototype.hasOwnProperty;
+ var deletedSentinel = {};
+ function lookupIndex(map, key) {
+ if (isObject(key)) {
+ var hashObject = getOwnHashObject(key);
+ return hashObject && map.objectIndex_[hashObject.hash];
+ }
+ if (typeof key === 'string')
+ return map.stringIndex_[key];
+ return map.primitiveIndex_[key];
+ }
+ function initMap(map) {
+ map.entries_ = [];
+ map.objectIndex_ = Object.create(null);
+ map.stringIndex_ = Object.create(null);
+ map.primitiveIndex_ = Object.create(null);
+ map.deletedCount_ = 0;
+ }
+ var Map = function Map() {
+ var iterable = arguments[0];
+ if (!isObject(this))
+ throw new TypeError("Constructor Map requires 'new'");
+ if ($hasOwnProperty.call(this, 'entries_')) {
+ throw new TypeError("Map can not be reentrantly initialised");
+ }
+ initMap(this);
+ if (iterable !== null && iterable !== undefined) {
+ var iter = iterable[Symbol.iterator];
+ if (iter !== undefined) {
+ for (var $__8 = iterable[Symbol.iterator](),
+ $__9; !($__9 = $__8.next()).done; ) {
+ var $__10 = $traceurRuntime.assertObject($__9.value),
+ key = $__10[0],
+ value = $__10[1];
+ {
+ this.set(key, value);
+ }
+ }
+ }
+ }
+ };
+ ($traceurRuntime.createClass)(Map, {
+ get size() {
+ return this.entries_.length / 2 - this.deletedCount_;
+ },
+ get: function(key) {
+ var index = lookupIndex(this, key);
+ if (index !== undefined)
+ return this.entries_[index + 1];
+ },
+ set: function(key, value) {
+ var objectMode = isObject(key);
+ var stringMode = typeof key === 'string';
+ var index = lookupIndex(this, key);
+ if (index !== undefined) {
+ this.entries_[index + 1] = value;
+ } else {
+ index = this.entries_.length;
+ this.entries_[index] = key;
+ this.entries_[index + 1] = value;
+ if (objectMode) {
+ var hashObject = getOwnHashObject(key);
+ var hash = hashObject.hash;
+ this.objectIndex_[hash] = index;
+ } else if (stringMode) {
+ this.stringIndex_[key] = index;
+ } else {
+ this.primitiveIndex_[key] = index;
+ }
+ }
+ return this;
+ },
+ has: function(key) {
+ return lookupIndex(this, key) !== undefined;
+ },
+ delete: function(key) {
+ var objectMode = isObject(key);
+ var stringMode = typeof key === 'string';
+ var index;
+ var hash;
+ if (objectMode) {
+ var hashObject = getOwnHashObject(key);
+ if (hashObject) {
+ index = this.objectIndex_[hash = hashObject.hash];
+ delete this.objectIndex_[hash];
+ }
+ } else if (stringMode) {
+ index = this.stringIndex_[key];
+ delete this.stringIndex_[key];
+ } else {
+ index = this.primitiveIndex_[key];
+ delete this.primitiveIndex_[key];
+ }
+ if (index !== undefined) {
+ this.entries_[index] = deletedSentinel;
+ this.entries_[index + 1] = undefined;
+ this.deletedCount_++;
+ }
+ },
+ clear: function() {
+ initMap(this);
+ },
+ forEach: function(callbackFn) {
+ var thisArg = arguments[1];
+ for (var i = 0,
+ len = this.entries_.length; i < len; i += 2) {
+ var key = this.entries_[i];
+ var value = this.entries_[i + 1];
+ if (key === deletedSentinel)
+ continue;
+ callbackFn.call(thisArg, value, key, this);
+ }
+ }
+ }, {});
+ return {get Map() {
+ return Map;
+ }};
+});
+System.register("traceur-runtime@0.0.41/node_modules/rsvp/lib/rsvp/asap", [], function() {
+ "use strict";
+ var __moduleName = "traceur-runtime@0.0.41/node_modules/rsvp/lib/rsvp/asap";
+ var $__default = function asap(callback, arg) {
+ var length = queue.push([callback, arg]);
+ if (length === 1) {
+ scheduleFlush();
+ }
+ };
+ var browserGlobal = (typeof window !== 'undefined') ? window : {};
+ var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
+ function useNextTick() {
+ return function() {
+ process.nextTick(flush);
+ };
+ }
+ function useMutationObserver() {
+ var iterations = 0;
+ var observer = new BrowserMutationObserver(flush);
+ var node = document.createTextNode('');
+ observer.observe(node, {characterData: true});
+ return function() {
+ node.data = (iterations = ++iterations % 2);
+ };
+ }
+ function useSetTimeout() {
+ return function() {
+ setTimeout(flush, 1);
+ };
+ }
+ var queue = [];
+ function flush() {
+ for (var i = 0; i < queue.length; i++) {
+ var tuple = queue[i];
+ var callback = tuple[0],
+ arg = tuple[1];
+ callback(arg);
+ }
+ queue = [];
+ }
+ var scheduleFlush;
+ if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {
+ scheduleFlush = useNextTick();
+ } else if (BrowserMutationObserver) {
+ scheduleFlush = useMutationObserver();
+ } else {
+ scheduleFlush = useSetTimeout();
+ }
+ return {get default() {
+ return $__default;
+ }};
+});
+System.register("traceur-runtime@0.0.41/src/runtime/polyfills/Promise", [], function() {
+ "use strict";
+ var __moduleName = "traceur-runtime@0.0.41/src/runtime/polyfills/Promise";
+ var async = $traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/node_modules/rsvp/lib/rsvp/asap")).default;
+ var promiseRaw = {};
+ function isPromise(x) {
+ return x && typeof x === 'object' && x.status_ !== undefined;
+ }
+ function idResolveHandler(x) {
+ return x;
+ }
+ function idRejectHandler(x) {
+ throw x;
+ }
+ function chain(promise) {
+ var onResolve = arguments[1] !== (void 0) ? arguments[1] : idResolveHandler;
+ var onReject = arguments[2] !== (void 0) ? arguments[2] : idRejectHandler;
+ var deferred = getDeferred(promise.constructor);
+ switch (promise.status_) {
+ case undefined:
+ throw TypeError;
+ case 0:
+ promise.onResolve_.push(onResolve, deferred);
+ promise.onReject_.push(onReject, deferred);
+ break;
+ case +1:
+ promiseEnqueue(promise.value_, [onResolve, deferred]);
+ break;
+ case -1:
+ promiseEnqueue(promise.value_, [onReject, deferred]);
+ break;
+ }
+ return deferred.promise;
+ }
+ function getDeferred(C) {
+ if (this === $Promise) {
+ var promise = promiseInit(new $Promise(promiseRaw));
+ return {
+ promise: promise,
+ resolve: (function(x) {
+ promiseResolve(promise, x);
+ }),
+ reject: (function(r) {
+ promiseReject(promise, r);
+ })
+ };
+ } else {
+ var result = {};
+ result.promise = new C((function(resolve, reject) {
+ result.resolve = resolve;
+ result.reject = reject;
+ }));
+ return result;
+ }
+ }
+ function promiseSet(promise, status, value, onResolve, onReject) {
+ promise.status_ = status;
+ promise.value_ = value;
+ promise.onResolve_ = onResolve;
+ promise.onReject_ = onReject;
+ return promise;
+ }
+ function promiseInit(promise) {
+ return promiseSet(promise, 0, undefined, [], []);
+ }
+ var Promise = function Promise(resolver) {
+ if (resolver === promiseRaw)
+ return;
+ if (typeof resolver !== 'function')
+ throw new TypeError;
+ var promise = promiseInit(this);
+ try {
+ resolver((function(x) {
+ promiseResolve(promise, x);
+ }), (function(r) {
+ promiseReject(promise, r);
+ }));
+ } catch (e) {
+ promiseReject(promise, e);
+ }
+ };
+ ($traceurRuntime.createClass)(Promise, {
+ catch: function(onReject) {
+ return this.then(undefined, onReject);
+ },
+ then: function(onResolve, onReject) {
+ if (typeof onResolve !== 'function')
+ onResolve = idResolveHandler;
+ if (typeof onReject !== 'function')
+ onReject = idRejectHandler;
+ var that = this;
+ var constructor = this.constructor;
+ return chain(this, function(x) {
+ x = promiseCoerce(constructor, x);
+ return x === that ? onReject(new TypeError) : isPromise(x) ? x.then(onResolve, onReject) : onResolve(x);
+ }, onReject);
+ }
+ }, {
+ resolve: function(x) {
+ if (this === $Promise) {
+ return promiseSet(new $Promise(promiseRaw), +1, x);
+ } else {
+ return new this(function(resolve, reject) {
+ resolve(x);
+ });
+ }
+ },
+ reject: function(r) {
+ if (this === $Promise) {
+ return promiseSet(new $Promise(promiseRaw), -1, r);
+ } else {
+ return new this((function(resolve, reject) {
+ reject(r);
+ }));
+ }
+ },
+ cast: function(x) {
+ if (x instanceof this)
+ return x;
+ if (isPromise(x)) {
+ var result = getDeferred(this);
+ chain(x, result.resolve, result.reject);
+ return result.promise;
+ }
+ return this.resolve(x);
+ },
+ all: function(values) {
+ var deferred = getDeferred(this);
+ var resolutions = [];
+ try {
+ var count = values.length;
+ if (count === 0) {
+ deferred.resolve(resolutions);
+ } else {
+ for (var i = 0; i < values.length; i++) {
+ this.resolve(values[i]).then(function(i, x) {
+ resolutions[i] = x;
+ if (--count === 0)
+ deferred.resolve(resolutions);
+ }.bind(undefined, i), (function(r) {
+ deferred.reject(r);
+ }));
+ }
+ }
+ } catch (e) {
+ deferred.reject(e);
+ }
+ return deferred.promise;
+ },
+ race: function(values) {
+ var deferred = getDeferred(this);
+ try {
+ for (var i = 0; i < values.length; i++) {
+ this.resolve(values[i]).then((function(x) {
+ deferred.resolve(x);
+ }), (function(r) {
+ deferred.reject(r);
+ }));
+ }
+ } catch (e) {
+ deferred.reject(e);
+ }
+ return deferred.promise;
+ }
+ });
+ var $Promise = Promise;
+ var $PromiseReject = $Promise.reject;
+ function promiseResolve(promise, x) {
+ promiseDone(promise, +1, x, promise.onResolve_);
+ }
+ function promiseReject(promise, r) {
+ promiseDone(promise, -1, r, promise.onReject_);
+ }
+ function promiseDone(promise, status, value, reactions) {
+ if (promise.status_ !== 0)
+ return;
+ promiseEnqueue(value, reactions);
+ promiseSet(promise, status, value);
+ }
+ function promiseEnqueue(value, tasks) {
+ async((function() {
+ for (var i = 0; i < tasks.length; i += 2) {
+ promiseHandle(value, tasks[i], tasks[i + 1]);
+ }
+ }));
+ }
+ function promiseHandle(value, handler, deferred) {
+ try {
+ var result = handler(value);
+ if (result === deferred.promise)
+ throw new TypeError;
+ else if (isPromise(result))
+ chain(result, deferred.resolve, deferred.reject);
+ else
+ deferred.resolve(result);
+ } catch (e) {
+ try {
+ deferred.reject(e);
+ } catch (e) {}
+ }
+ }
+ var thenableSymbol = '@@thenable';
+ function isObject(x) {
+ return x && (typeof x === 'object' || typeof x === 'function');
+ }
+ function promiseCoerce(constructor, x) {
+ if (!isPromise(x) && isObject(x)) {
+ var then;
+ try {
+ then = x.then;
+ } catch (r) {
+ var promise = $PromiseReject.call(constructor, r);
+ x[thenableSymbol] = promise;
+ return promise;
+ }
+ if (typeof then === 'function') {
+ var p = x[thenableSymbol];
+ if (p) {
+ return p;
+ } else {
+ var deferred = getDeferred(constructor);
+ x[thenableSymbol] = deferred.promise;
+ try {
+ then.call(x, deferred.resolve, deferred.reject);
+ } catch (r) {
+ deferred.reject(r);
+ }
+ return deferred.promise;
+ }
+ }
+ }
+ return x;
+ }
+ return {get Promise() {
+ return Promise;
+ }};
+});
+System.register("traceur-runtime@0.0.41/src/runtime/polyfills/String", [], function() {
+ "use strict";
+ var __moduleName = "traceur-runtime@0.0.41/src/runtime/polyfills/String";
+ var $toString = Object.prototype.toString;
+ var $indexOf = String.prototype.indexOf;
+ var $lastIndexOf = String.prototype.lastIndexOf;
+ function startsWith(search) {
+ var string = String(this);
+ if (this == null || $toString.call(search) == '[object RegExp]') {
+ throw TypeError();
+ }
+ var stringLength = string.length;
+ var searchString = String(search);
+ var searchLength = searchString.length;
+ var position = arguments.length > 1 ? arguments[1] : undefined;
+ var pos = position ? Number(position) : 0;
+ if (isNaN(pos)) {
+ pos = 0;
+ }
+ var start = Math.min(Math.max(pos, 0), stringLength);
+ return $indexOf.call(string, searchString, pos) == start;
+ }
+ function endsWith(search) {
+ var string = String(this);
+ if (this == null || $toString.call(search) == '[object RegExp]') {
+ throw TypeError();
+ }
+ var stringLength = string.length;
+ var searchString = String(search);
+ var searchLength = searchString.length;
+ var pos = stringLength;
+ if (arguments.length > 1) {
+ var position = arguments[1];
+ if (position !== undefined) {
+ pos = position ? Number(position) : 0;
+ if (isNaN(pos)) {
+ pos = 0;
+ }
+ }
+ }
+ var end = Math.min(Math.max(pos, 0), stringLength);
+ var start = end - searchLength;
+ if (start < 0) {
+ return false;
+ }
+ return $lastIndexOf.call(string, searchString, start) == start;
+ }
+ function contains(search) {
+ if (this == null) {
+ throw TypeError();
+ }
+ var string = String(this);
+ var stringLength = string.length;
+ var searchString = String(search);
+ var searchLength = searchString.length;
+ var position = arguments.length > 1 ? arguments[1] : undefined;
+ var pos = position ? Number(position) : 0;
+ if (isNaN(pos)) {
+ pos = 0;
+ }
+ var start = Math.min(Math.max(pos, 0), stringLength);
+ return $indexOf.call(string, searchString, pos) != -1;
+ }
+ function repeat(count) {
+ if (this == null) {
+ throw TypeError();
+ }
+ var string = String(this);
+ var n = count ? Number(count) : 0;
+ if (isNaN(n)) {
+ n = 0;
+ }
+ if (n < 0 || n == Infinity) {
+ throw RangeError();
+ }
+ if (n == 0) {
+ return '';
+ }
+ var result = '';
+ while (n--) {
+ result += string;
+ }
+ return result;
+ }
+ function codePointAt(position) {
+ if (this == null) {
+ throw TypeError();
+ }
+ var string = String(this);
+ var size = string.length;
+ var index = position ? Number(position) : 0;
+ if (isNaN(index)) {
+ index = 0;
+ }
+ if (index < 0 || index >= size) {
+ return undefined;
+ }
+ var first = string.charCodeAt(index);
+ var second;
+ if (first >= 0xD800 && first <= 0xDBFF && size > index + 1) {
+ second = string.charCodeAt(index + 1);
+ if (second >= 0xDC00 && second <= 0xDFFF) {
+ return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
+ }
+ }
+ return first;
+ }
+ function raw(callsite) {
+ var raw = callsite.raw;
+ var len = raw.length >>> 0;
+ if (len === 0)
+ return '';
+ var s = '';
+ var i = 0;
+ while (true) {
+ s += raw[i];
+ if (i + 1 === len)
+ return s;
+ s += arguments[++i];
+ }
+ }
+ function fromCodePoint() {
+ var codeUnits = [];
+ var floor = Math.floor;
+ var highSurrogate;
+ var lowSurrogate;
+ var index = -1;
+ var length = arguments.length;
+ if (!length) {
+ return '';
+ }
+ while (++index < length) {
+ var codePoint = Number(arguments[index]);
+ if (!isFinite(codePoint) || codePoint < 0 || codePoint > 0x10FFFF || floor(codePoint) != codePoint) {
+ throw RangeError('Invalid code point: ' + codePoint);
+ }
+ if (codePoint <= 0xFFFF) {
+ codeUnits.push(codePoint);
+ } else {
+ codePoint -= 0x10000;
+ highSurrogate = (codePoint >> 10) + 0xD800;
+ lowSurrogate = (codePoint % 0x400) + 0xDC00;
+ codeUnits.push(highSurrogate, lowSurrogate);
+ }
+ }
+ return String.fromCharCode.apply(null, codeUnits);
+ }
+ return {
+ get startsWith() {
+ return startsWith;
+ },
+ get endsWith() {
+ return endsWith;
+ },
+ get contains() {
+ return contains;
+ },
+ get repeat() {
+ return repeat;
+ },
+ get codePointAt() {
+ return codePointAt;
+ },
+ get raw() {
+ return raw;
+ },
+ get fromCodePoint() {
+ return fromCodePoint;
+ }
+ };
+});
+System.register("traceur-runtime@0.0.41/src/runtime/polyfills/polyfills", [], function() {
+ "use strict";
+ var __moduleName = "traceur-runtime@0.0.41/src/runtime/polyfills/polyfills";
+ var Map = $traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/Map")).Map;
+ var Promise = $traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/Promise")).Promise;
+ var $__13 = $traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/String")),
+ codePointAt = $__13.codePointAt,
+ contains = $__13.contains,
+ endsWith = $__13.endsWith,
+ fromCodePoint = $__13.fromCodePoint,
+ repeat = $__13.repeat,
+ raw = $__13.raw,
+ startsWith = $__13.startsWith;
+ var $__13 = $traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/Array")),
+ fill = $__13.fill,
+ find = $__13.find,
+ findIndex = $__13.findIndex;
+ var $__13 = $traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/ArrayIterator")),
+ entries = $__13.entries,
+ keys = $__13.keys,
+ values = $__13.values;
+ function maybeDefineMethod(object, name, value) {
+ if (!(name in object)) {
+ Object.defineProperty(object, name, {
+ value: value,
+ configurable: true,
+ enumerable: false,
+ writable: true
+ });
+ }
+ }
+ function maybeAddFunctions(object, functions) {
+ for (var i = 0; i < functions.length; i += 2) {
+ var name = functions[i];
+ var value = functions[i + 1];
+ maybeDefineMethod(object, name, value);
+ }
+ }
+ function polyfillPromise(global) {
+ if (!global.Promise)
+ global.Promise = Promise;
+ }
+ function polyfillCollections(global) {
+ if (!global.Map)
+ global.Map = Map;
+ }
+ function polyfillString(String) {
+ maybeAddFunctions(String.prototype, ['codePointAt', codePointAt, 'contains', contains, 'endsWith', endsWith, 'startsWith', startsWith, 'repeat', repeat]);
+ maybeAddFunctions(String, ['fromCodePoint', fromCodePoint, 'raw', raw]);
+ }
+ function polyfillArray(Array, Symbol) {
+ maybeAddFunctions(Array.prototype, ['entries', entries, 'keys', keys, 'values', values, 'fill', fill, 'find', find, 'findIndex', findIndex]);
+ if (Symbol && Symbol.iterator) {
+ Object.defineProperty(Array.prototype, Symbol.iterator, {
+ value: values,
+ configurable: true,
+ enumerable: false,
+ writable: true
+ });
+ }
+ }
+ function polyfill(global) {
+ polyfillPromise(global);
+ polyfillCollections(global);
+ polyfillString(global.String);
+ polyfillArray(global.Array, global.Symbol);
+ }
+ polyfill(this);
+ var setupGlobals = $traceurRuntime.setupGlobals;
+ $traceurRuntime.setupGlobals = function(global) {
+ setupGlobals(global);
+ polyfill(global);
+ };
+ return {};
+});
+System.register("traceur-runtime@0.0.41/src/runtime/polyfill-import", [], function() {
+ "use strict";
+ var __moduleName = "traceur-runtime@0.0.41/src/runtime/polyfill-import";
+ var $__15 = $traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/polyfills"));
+ return {};
+});
+System.get("traceur-runtime@0.0.41/src/runtime/polyfill-import" + '');
diff --git a/js/vendor/traceur-runtime/traceur-runtime.min.js b/js/vendor/traceur-runtime/traceur-runtime.min.js
new file mode 100644
index 000000000..2bcc8c2d3
--- /dev/null
+++ b/js/vendor/traceur-runtime/traceur-runtime.min.js
@@ -0,0 +1,2 @@
+!function(a){"use strict";function b(a){return{configurable:!0,enumerable:!1,value:a,writable:!0}}function c(){return"__$"+Math.floor(1e9*Math.random())+"$"+ ++ib+"$__"}function d(){var a=c();return nb[a]=!0,a}function e(a){return"object"==typeof a&&a instanceof h}function f(a){return e(a)?"symbol":typeof a}function g(a){var b=new h(a);if(!(this instanceof g))return b;throw new TypeError("Symbol cannot be new'ed")}function h(a){var b=c();Y(this,lb,{value:this}),Y(this,jb,{value:b}),Y(this,kb,{value:a}),j(this),mb[b]=this}function i(a){var b=a[ob];return b&&b.self===a?b:fb(a)?(qb.hash.value=rb++,qb.self.value=a,pb.value=W(null,qb),Y(a,ob,pb),pb.value):void 0}function j(a){return i(a),Z.apply(this,arguments)}function k(a){return i(a),db.apply(this,arguments)}function l(a){return i(a),eb.apply(this,arguments)}function m(a){return e(a)?a[jb]:a}function n(a){for(var b=[],c=_(a),d=0;d<c.length;d++){var e=c[d];mb[e]||nb[e]||b.push(e)}return b}function o(a,b){return $(a,m(b))}function p(a){for(var b=[],c=_(a),d=0;d<c.length;d++){var e=mb[c[d]];e&&b.push(e)}return b}function q(a){return cb.call(this,m(a))}function r(b){return a.traceur&&a.traceur.options[b]}function s(a,b,c){var d,f;return e(b)&&(d=b,b=b[jb]),a[b]=c,d&&(f=$(a,b))&&Y(a,b,{enumerable:!1}),c}function t(a,b,c){return e(b)&&(c.enumerable&&(c=W(c,{enumerable:{value:!1}})),b=b[jb]),Y(a,b,c),a}function u(a){function b(a,b){return a===b?0!==a||1/a===1/b:a!==a&&b!==b}function c(a){for(var b=1;b<arguments.length;b++){var c,d=arguments[b],e=bb(d),f=e.length;for(c=0;f>c;c++){var g=e[c];nb[g]||(a[g]=d[g])}}return a}function d(a,b){var c,d,e=_(b),f=e.length;for(c=0;f>c;c++){var g=e[c];nb[g]||(d=$(b,e[c]),Y(a,e[c],d))}return a}Y(a,"defineProperty",{value:t}),Y(a,"getOwnPropertyNames",{value:n}),Y(a,"getOwnPropertyDescriptor",{value:o}),Y(a.prototype,"hasOwnProperty",{value:q}),Y(a,"freeze",{value:j}),Y(a,"preventExtensions",{value:k}),Y(a,"seal",{value:l}),a.getOwnPropertySymbols=p,Y(a,"is",hb(b)),Y(a,"assign",hb(c)),Y(a,"mixin",hb(d))}function v(a){for(var b=1;b<arguments.length;b++)for(var c=_(arguments[b]),d=0;d<c.length;d++){var e=c[d];nb[e]||!function(b,c){Y(a,c,{get:function(){return b[c]},enumerable:!0})}(arguments[b],c[d])}return a}function w(a){return null!=a&&("object"==typeof a||"function"==typeof a)}function x(a){if(null==a)throw V();return U(a)}function y(a){if(!w(a))throw V(a+" is not an Object");return a}function z(){for(var a=[],b=0,c=0;c<arguments.length;c++)for(var d=x(arguments[c]),e=0;e<d.length;e++)a[b++]=d[e];return a}function A(a,b){var c=ab(a);do{var d=$(c,b);if(d)return d;c=ab(c)}while(c);return void 0}function B(a,b,c,d){return C(a,b,c).apply(a,d)}function C(a,b,c){var d=A(b,c);return d?d.get?d.get.call(a):d.value:void 0}function D(a,b,c,d){var e=A(b,c);if(e&&e.set)return e.set.call(a,d),d;throw V("super has no setter '"+c+"'.")}function E(a){for(var b,c={},d=_(a),e=0;e<d.length;e++){var b=d[e];c[b]=$(a,b)}return c}function F(a,b,c,d){return Y(b,"constructor",{value:a,configurable:!0,enumerable:!1,writable:!0}),arguments.length>3?("function"==typeof d&&(a.__proto__=d),a.prototype=W(G(d),E(b))):a.prototype=b,Y(a,"prototype",{configurable:!1,writable:!1}),X(a,E(c))}function G(a){if("function"==typeof a){var b=a.prototype;if(U(b)===b||null===b)return a.prototype}if(null===a)return null;throw new TypeError}function H(a,b,c){null!==ab(b)&&B(a,b,"constructor",c)}function I(a){return new Error("Traceur compiler bug: invalid state in state machine: "+a)}function J(){this.state=0,this.GState=sb,this.storedException=void 0,this.finallyFallThrough=void 0,this.sent_=void 0,this.returnValue=void 0,this.tryStack_=[]}function K(a,b,c,d){switch(a.GState){case tb:throw new Error('"'+c+'" on executing generator');case vb:throw new Error('"'+c+'" on closed generator');case sb:if("throw"===c)throw a.GState=vb,d;if(void 0!==d)throw V("Sent value to newborn generator");case ub:a.GState=tb,a.action=c,a.sent=d;var e=b(a),f=e===a;return f&&(e=a.returnValue),a.GState=f?vb:ub,{value:e,done:f}}}function L(){}function M(){}function N(a,b,c){var d=R(a,c),e=new J,f=W(b.prototype);return f[yb]=e,f[zb]=d,f}function O(a){return a.prototype=W(M.prototype),a.__proto__=M,a}function P(){J.call(this),this.err=void 0;var a=this;a.result=new Promise(function(b,c){a.resolve=b,a.reject=c})}function Q(a,b){var c=R(a,b),d=new P;return d.createCallback=function(a){return function(b){d.state=a,d.value=b,c(d)}},d.errback=function(a){S(d,a),c(d)},c(d),d.result}function R(a,b){return function(c){for(;;)try{return a.call(b,c)}catch(d){S(c,d)}}}function S(a,b){a.storedException=b;var c=a.tryStack_[a.tryStack_.length-1];return c?(a.state=void 0!==c.catch?c.catch:c.finally,void(void 0!==c.finallyFallThrough&&(a.finallyFallThrough=c.finallyFallThrough))):void a.handleException(b)}function T(a){a.Symbol=g,u(a.Object)}if(!a.$traceurRuntime){var U=Object,V=TypeError,W=U.create,X=U.defineProperties,Y=U.defineProperty,Z=U.freeze,$=U.getOwnPropertyDescriptor,_=U.getOwnPropertyNames,ab=U.getPrototypeOf,bb=U.keys,cb=U.prototype.hasOwnProperty,db=(U.prototype.toString,Object.preventExtensions),eb=Object.seal,fb=Object.isExtensible,gb={"void":function(){},any:function(){},string:function(){},number:function(){},"boolean":function(){}},hb=b,ib=0,jb=c(),kb=c(),lb=c(),mb=W(null),nb=W(null);Y(g.prototype,"constructor",b(g)),Y(g.prototype,"toString",hb(function(){var a=this[lb];if(!r("symbols"))return a[jb];if(!a)throw TypeError("Conversion from symbol to string");var b=a[kb];return void 0===b&&(b=""),"Symbol("+b+")"})),Y(g.prototype,"valueOf",hb(function(){var a=this[lb];if(!a)throw TypeError("Conversion from symbol to string");return r("symbols")?a:a[jb]})),Y(h.prototype,"constructor",b(g)),Y(h.prototype,"toString",{value:g.prototype.toString,enumerable:!1}),Y(h.prototype,"valueOf",{value:g.prototype.valueOf,enumerable:!1});var ob=d(),pb={value:void 0},qb={hash:{value:void 0},self:{value:void 0}},rb=0;g.iterator=g(),j(h.prototype);var sb=0,tb=1,ub=2,vb=3,wb=-2,xb=-3;J.prototype={pushTry:function(a,b){if(null!==b){for(var c=null,d=this.tryStack_.length-1;d>=0;d--)if(void 0!==this.tryStack_[d].catch){c=this.tryStack_[d].catch;break}null===c&&(c=xb),this.tryStack_.push({"finally":b,finallyFallThrough:c})}null!==a&&this.tryStack_.push({"catch":a})},popTry:function(){this.tryStack_.pop()},get sent(){return this.maybeThrow(),this.sent_},set sent(a){this.sent_=a},get sentIgnoreThrow(){return this.sent_},maybeThrow:function(){if("throw"===this.action)throw this.action="next",this.sent_},end:function(){switch(this.state){case wb:return this;case xb:throw this.storedException;default:throw I(this.state)}},handleException:function(a){throw this.GState=vb,this.state=wb,a}};var yb=d(),zb=d();L.prototype=M,Y(M,"constructor",b(L)),M.prototype={constructor:M,next:function(a){return K(this[yb],this[zb],"next",a)},"throw":function(a){return K(this[yb],this[zb],"throw",a)}},X(M.prototype,{constructor:{enumerable:!1},next:{enumerable:!1},"throw":{enumerable:!1}}),t(M.prototype,g.iterator,b(function(){return this})),P.prototype=Object.create(J.prototype),P.prototype.end=function(){switch(this.state){case wb:this.resolve(this.returnValue);break;case xb:this.reject(this.storedException);break;default:this.reject(I(this.state))}},P.prototype.handleException=function(){this.state=xb},T(a),a.$traceurRuntime={assertObject:y,asyncWrap:Q,createClass:F,defaultSuperCall:H,exportStar:v,initGeneratorFunction:O,createGeneratorInstance:N,getOwnHashObject:i,setProperty:s,setupGlobals:T,spread:z,superCall:B,superGet:C,superSet:D,toObject:x,toProperty:m,type:gb,"typeof":f}}}("undefined"!=typeof global?global:this),function(){function a(a,b,c,d,e,f,g){var h=[];return a&&h.push(a,":"),c&&(h.push("//"),b&&h.push(b,"@"),h.push(c),d&&h.push(":",d)),e&&h.push(e),f&&h.push("?",f),g&&h.push("#",g),h.join("")}function b(a){return a.match(h)}function c(a){if("/"===a)return"/";for(var b="/"===a[0]?"/":"",c="/"===a.slice(-1)?"/":"",d=a.split("/"),e=[],f=0,g=0;g<d.length;g++){var h=d[g];switch(h){case"":case".":break;case"..":e.length?e.pop():f++;break;default:e.push(h)}}if(!b){for(;f-->0;)e.unshift("..");0===e.length&&e.push(".")}return b+e.join("/")+c}function d(b){var d=b[i.PATH]||"";return d=c(d),b[i.PATH]=d,a(b[i.SCHEME],b[i.USER_INFO],b[i.DOMAIN],b[i.PORT],b[i.PATH],b[i.QUERY_DATA],b[i.FRAGMENT])}function e(a){var c=b(a);return d(c)}function f(a,c){var e=b(c),f=b(a);if(e[i.SCHEME])return d(e);e[i.SCHEME]=f[i.SCHEME];for(var g=i.SCHEME;g<=i.PORT;g++)e[g]||(e[g]=f[g]);if("/"==e[i.PATH][0])return d(e);var h=f[i.PATH],j=h.lastIndexOf("/");return h=h.slice(0,j+1)+e[i.PATH],e[i.PATH]=h,d(e)}function g(a){if(!a)return!1;if("/"===a[0])return!0;var c=b(a);return c[i.SCHEME]?!0:!1}var h=new RegExp("^(?:([^:/?#.]+):)?(?://(?:([^/?#]*)@)?([\\w\\d\\-\\u0100-\\uffff.%]*)(?::([0-9]+))?)?([^?#]+)?(?:\\?([^#]*))?(?:#(.*))?$"),i={SCHEME:1,USER_INFO:2,DOMAIN:3,PORT:4,PATH:5,QUERY_DATA:6,FRAGMENT:7};$traceurRuntime.canonicalizeUrl=e,$traceurRuntime.isAbsolute=g,$traceurRuntime.removeDotSegments=c,$traceurRuntime.resolveUrl=f}(),function(a){"use strict";function b(a){if(a){var b=o.normalize(a);return i[b]}}function c(a){var b=arguments[1],c=Object.create(null);return Object.getOwnPropertyNames(a).forEach(function(d){var e,f;if(b===n){var g=Object.getOwnPropertyDescriptor(a,d);g.get&&(e=g.get)}e||(f=a[d],e=function(){return f}),Object.defineProperty(c,d,{get:e,enumerable:!0})}),Object.preventExtensions(c),c}var d,e=$traceurRuntime.assertObject($traceurRuntime),f=e.canonicalizeUrl,g=e.resolveUrl,h=e.isAbsolute,i=Object.create(null);d=a.location&&a.location.href?g(a.location.href,"./"):"";var j=function(a,b){this.url=a,this.value_=b};$traceurRuntime.createClass(j,{},{});var k=function(a,b){$traceurRuntime.superCall(this,l.prototype,"constructor",[a,null]),this.func=b},l=k;$traceurRuntime.createClass(k,{getUncoatedModule:function(){return this.value_?this.value_:this.value_=this.func.call(a)}},{},j);var m=Object.create(null),n={},o={normalize:function(a,b){if("string"!=typeof a)throw new TypeError("module name must be a string, not "+typeof a);if(h(a))return f(a);if(/[^\.]\/\.\.\//.test(a))throw new Error("module name embeds /../: "+a);return"."===a[0]&&b?g(b,a):f(a)},get:function(a){var d=b(a);if(!d)return void 0;var e=m[d.url];return e?e:(e=c(d.getUncoatedModule(),n),m[d.url]=e)},set:function(a,b){a=String(a),i[a]=new k(a,function(){return b}),m[a]=b},get baseURL(){return d},set baseURL(a){d=String(a)},registerModule:function(a,b){var c=o.normalize(a);if(i[c])throw new Error("duplicate module named "+c);i[c]=new k(c,b)},bundleStore:Object.create(null),register:function(a,b,c){b&&(b.length||c.length)?this.bundleStore[a]={deps:b,execute:function(){var a=arguments,d={};b.forEach(function(b,c){return d[b]=a[c]});var e=c.call(this,d);return e.execute.call(this),e.exports}}:this.registerModule(a,c)},getAnonymousModule:function(b){return new c(b.call(a),n)},getForTesting:function(a){var b=this;return this.testingPrefix_||Object.keys(m).some(function(a){var c=/(traceur@[^\/]*\/)/.exec(a);return c?(b.testingPrefix_=c[1],!0):void 0}),this.get(this.testingPrefix_+a)}};o.set("@traceur/src/runtime/ModuleStore",new c({ModuleStore:o}));var p=$traceurRuntime.setupGlobals;$traceurRuntime.setupGlobals=function(a){p(a)},$traceurRuntime.ModuleStore=o,a.System={register:o.register.bind(o),get:o.get,set:o.set,normalize:o.normalize},$traceurRuntime.getModuleImpl=function(a){var c=b(a);return c&&c.getUncoatedModule()}}("undefined"!=typeof global?global:this),System.register("traceur-runtime@0.0.41/src/runtime/polyfills/utils",[],function(){"use strict";function a(a){return 0|a}function b(a){return a&&("object"==typeof a||"function"==typeof a)}function c(a){return"function"==typeof a}function d(a){return a=+a,isNaN(a)?0:isFinite(a)&&0!==a?a>0?Math.floor(a):Math.ceil(a):a}function e(a){var b=d(a);return 0>b?0:Math.min(b,g)}var f=$traceurRuntime.toObject,g=Math.pow(2,53)-1;return{get toObject(){return f},get toUint32(){return a},get isObject(){return b},get isCallable(){return c},get toInteger(){return d},get toLength(){return e}}}),System.register("traceur-runtime@0.0.41/src/runtime/polyfills/Array",[],function(){"use strict";function a(a){var b=void 0!==arguments[1]?arguments[1]:0,c=arguments[2],d=h(this),e=g(d.length),i=f(b),j=void 0!==c?f(c):e;for(i=0>i?Math.max(e+i,0):Math.min(i,e),j=0>j?Math.max(e+j,0):Math.min(j,e);j>i;)d[i]=a,i++;return d}function b(a){var b=arguments[1];return d(this,a,b)}function c(a){var b=arguments[1];return d(this,a,b,!0)}function d(a,b){var c=arguments[2],d=void 0!==arguments[3]?arguments[3]:!1,e=h(a),f=g(e.length);if(!i(b))throw TypeError();for(var j=0;f>j;j++)if(j in e){var k=e[j];if(b.call(c,k,j,e))return d?j:k}return d?-1:void 0}var e=$traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/utils")),f=e.toInteger,g=e.toLength,h=e.toObject,i=e.isCallable;return{get fill(){return a},get find(){return b},get findIndex(){return c}}}),System.register("traceur-runtime@0.0.41/src/runtime/polyfills/ArrayIterator",[],function(){"use strict";function a(a,b){var c=h(a),d=new m;return d.iteratorObject_=c,d.arrayIteratorNextIndex_=0,d.arrayIterationKind_=b,d}function b(a,b){return{value:a,done:b}}function c(){return a(this,l)}function d(){return a(this,j)}function e(){return a(this,k)}var f,g=$traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/utils")),h=g.toObject,i=g.toUint32,j=1,k=2,l=3,m=function(){};return $traceurRuntime.createClass(m,(f={},Object.defineProperty(f,"next",{value:function(){var a=h(this),c=a.iteratorObject_;if(!c)throw new TypeError("Object is not an ArrayIterator");var d=a.arrayIteratorNextIndex_,e=a.arrayIterationKind_,f=i(c.length);return d>=f?(a.arrayIteratorNextIndex_=1/0,b(void 0,!0)):(a.arrayIteratorNextIndex_=d+1,e==k?b(c[d],!1):e==l?b([d,c[d]],!1):b(d,!1))},configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(f,Symbol.iterator,{value:function(){return this},configurable:!0,enumerable:!0,writable:!0}),f),{}),{get entries(){return c},get keys(){return d},get values(){return e}}}),System.register("traceur-runtime@0.0.41/src/runtime/polyfills/Map",[],function(){"use strict";function a(a,b){if(c(b)){var e=d(b);return e&&a.objectIndex_[e.hash]}return"string"==typeof b?a.stringIndex_[b]:a.primitiveIndex_[b]}function b(a){a.entries_=[],a.objectIndex_=Object.create(null),a.stringIndex_=Object.create(null),a.primitiveIndex_=Object.create(null),a.deletedCount_=0}var c=$traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/utils")).isObject,d=$traceurRuntime.getOwnHashObject,e=Object.prototype.hasOwnProperty,f={},g=function(){var a=arguments[0];if(!c(this))throw new TypeError("Constructor Map requires 'new'");if(e.call(this,"entries_"))throw new TypeError("Map can not be reentrantly initialised");if(b(this),null!==a&&void 0!==a){var d=a[Symbol.iterator];if(void 0!==d)for(var f,g=a[Symbol.iterator]();!(f=g.next()).done;){var h=$traceurRuntime.assertObject(f.value),i=h[0],j=h[1];this.set(i,j)}}};return $traceurRuntime.createClass(g,{get size(){return this.entries_.length/2-this.deletedCount_},get:function(b){var c=a(this,b);return void 0!==c?this.entries_[c+1]:void 0},set:function(b,e){var f=c(b),g="string"==typeof b,h=a(this,b);if(void 0!==h)this.entries_[h+1]=e;else if(h=this.entries_.length,this.entries_[h]=b,this.entries_[h+1]=e,f){var i=d(b),j=i.hash;this.objectIndex_[j]=h}else g?this.stringIndex_[b]=h:this.primitiveIndex_[b]=h;return this},has:function(b){return void 0!==a(this,b)},"delete":function(a){var b,e,g=c(a),h="string"==typeof a;if(g){var i=d(a);i&&(b=this.objectIndex_[e=i.hash],delete this.objectIndex_[e])}else h?(b=this.stringIndex_[a],delete this.stringIndex_[a]):(b=this.primitiveIndex_[a],delete this.primitiveIndex_[a]);void 0!==b&&(this.entries_[b]=f,this.entries_[b+1]=void 0,this.deletedCount_++)},clear:function(){b(this)},forEach:function(a){for(var b=arguments[1],c=0,d=this.entries_.length;d>c;c+=2){var e=this.entries_[c],g=this.entries_[c+1];e!==f&&a.call(b,g,e,this)}}},{}),{get Map(){return g}}}),System.register("traceur-runtime@0.0.41/node_modules/rsvp/lib/rsvp/asap",[],function(){"use strict";function a(){return function(){process.nextTick(d)}}function b(){var a=0,b=new h(d),c=document.createTextNode("");return b.observe(c,{characterData:!0}),function(){c.data=a=++a%2}}function c(){return function(){setTimeout(d,1)}}function d(){for(var a=0;a<i.length;a++){var b=i[a],c=b[0],d=b[1];c(d)}i=[]}var e,f=function(a,b){var c=i.push([a,b]);1===c&&e()},g="undefined"!=typeof window?window:{},h=g.MutationObserver||g.WebKitMutationObserver,i=[];return e="undefined"!=typeof process&&"[object process]"==={}.toString.call(process)?a():h?b():c(),{get default(){return f}}}),System.register("traceur-runtime@0.0.41/src/runtime/polyfills/Promise",[],function(){"use strict";function a(a){return a&&"object"==typeof a&&void 0!==a.status_}function b(a){return a}function c(a){throw a}function d(a){var d=void 0!==arguments[1]?arguments[1]:b,f=void 0!==arguments[2]?arguments[2]:c,g=e(a.constructor);switch(a.status_){case void 0:throw TypeError;case 0:a.onResolve_.push(d,g),a.onReject_.push(f,g);break;case 1:k(a.value_,[d,g]);break;case-1:k(a.value_,[f,g])}return g.promise}function e(a){if(this===r){var b=g(new r(p));return{promise:b,resolve:function(a){h(b,a)},reject:function(a){i(b,a)}}}var c={};return c.promise=new a(function(a,b){c.resolve=a,c.reject=b}),c}function f(a,b,c,d,e){return a.status_=b,a.value_=c,a.onResolve_=d,a.onReject_=e,a}function g(a){return f(a,0,void 0,[],[])}function h(a,b){j(a,1,b,a.onResolve_)}function i(a,b){j(a,-1,b,a.onReject_)}function j(a,b,c,d){0===a.status_&&(k(c,d),f(a,b,c))}function k(a,b){o(function(){for(var c=0;c<b.length;c+=2)l(a,b[c],b[c+1])})}function l(b,c,e){try{var f=c(b);if(f===e.promise)throw new TypeError;a(f)?d(f,e.resolve,e.reject):e.resolve(f)}catch(g){try{e.reject(g)}catch(g){}}}function m(a){return a&&("object"==typeof a||"function"==typeof a)}function n(b,c){if(!a(c)&&m(c)){var d;try{d=c.then}catch(f){var g=s.call(b,f);return c[t]=g,g}if("function"==typeof d){var h=c[t];if(h)return h;var i=e(b);c[t]=i.promise;try{d.call(c,i.resolve,i.reject)}catch(f){i.reject(f)}return i.promise}}return c}var o=$traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/node_modules/rsvp/lib/rsvp/asap")).default,p={},q=function(a){if(a!==p){if("function"!=typeof a)throw new TypeError;var b=g(this);try{a(function(a){h(b,a)},function(a){i(b,a)})}catch(c){i(b,c)}}};$traceurRuntime.createClass(q,{"catch":function(a){return this.then(void 0,a)},then:function(e,f){"function"!=typeof e&&(e=b),"function"!=typeof f&&(f=c);var g=this,h=this.constructor;return d(this,function(b){return b=n(h,b),b===g?f(new TypeError):a(b)?b.then(e,f):e(b)},f)}},{resolve:function(a){return this===r?f(new r(p),1,a):new this(function(b){b(a)})},reject:function(a){return this===r?f(new r(p),-1,a):new this(function(b,c){c(a)})},cast:function(b){if(b instanceof this)return b;if(a(b)){var c=e(this);return d(b,c.resolve,c.reject),c.promise}return this.resolve(b)},all:function(a){var b=e(this),c=[];try{var d=a.length;if(0===d)b.resolve(c);else for(var f=0;f<a.length;f++)this.resolve(a[f]).then(function(a,e){c[a]=e,0===--d&&b.resolve(c)}.bind(void 0,f),function(a){b.reject(a)})}catch(g){b.reject(g)}return b.promise},race:function(a){var b=e(this);try{for(var c=0;c<a.length;c++)this.resolve(a[c]).then(function(a){b.resolve(a)},function(a){b.reject(a)})}catch(d){b.reject(d)}return b.promise}});var r=q,s=r.reject,t="@@thenable";return{get Promise(){return q}}}),System.register("traceur-runtime@0.0.41/src/runtime/polyfills/String",[],function(){"use strict";function a(a){var b=String(this);if(null==this||"[object RegExp]"==h.call(a))throw TypeError();var c=b.length,d=String(a),e=(d.length,arguments.length>1?arguments[1]:void 0),f=e?Number(e):0;isNaN(f)&&(f=0);var g=Math.min(Math.max(f,0),c);return i.call(b,d,f)==g}function b(a){var b=String(this);if(null==this||"[object RegExp]"==h.call(a))throw TypeError();var c=b.length,d=String(a),e=d.length,f=c;if(arguments.length>1){var g=arguments[1];void 0!==g&&(f=g?Number(g):0,isNaN(f)&&(f=0))}var i=Math.min(Math.max(f,0),c),k=i-e;return 0>k?!1:j.call(b,d,k)==k}function c(a){if(null==this)throw TypeError();var b=String(this),c=b.length,d=String(a),e=(d.length,arguments.length>1?arguments[1]:void 0),f=e?Number(e):0;isNaN(f)&&(f=0);Math.min(Math.max(f,0),c);return-1!=i.call(b,d,f)}function d(a){if(null==this)throw TypeError();var b=String(this),c=a?Number(a):0;if(isNaN(c)&&(c=0),0>c||1/0==c)throw RangeError();if(0==c)return"";for(var d="";c--;)d+=b;return d}function e(a){if(null==this)throw TypeError();var b=String(this),c=b.length,d=a?Number(a):0;if(isNaN(d)&&(d=0),0>d||d>=c)return void 0;var e,f=b.charCodeAt(d);return f>=55296&&56319>=f&&c>d+1&&(e=b.charCodeAt(d+1),e>=56320&&57343>=e)?1024*(f-55296)+e-56320+65536:f}function f(a){var b=a.raw,c=b.length>>>0;if(0===c)return"";for(var d="",e=0;;){if(d+=b[e],e+1===c)return d;d+=arguments[++e]}}function g(){var a,b,c=[],d=Math.floor,e=-1,f=arguments.length;if(!f)return"";for(;++e<f;){var g=Number(arguments[e]);if(!isFinite(g)||0>g||g>1114111||d(g)!=g)throw RangeError("Invalid code point: "+g);65535>=g?c.push(g):(g-=65536,a=(g>>10)+55296,b=g%1024+56320,c.push(a,b))}return String.fromCharCode.apply(null,c)}var h=Object.prototype.toString,i=String.prototype.indexOf,j=String.prototype.lastIndexOf;return{get startsWith(){return a},get endsWith(){return b},get contains(){return c},get repeat(){return d},get codePointAt(){return e},get raw(){return f},get fromCodePoint(){return g}}}),System.register("traceur-runtime@0.0.41/src/runtime/polyfills/polyfills",[],function(){"use strict";function a(a,b,c){b in a||Object.defineProperty(a,b,{value:c,configurable:!0,enumerable:!1,writable:!0})}function b(b,c){for(var d=0;d<c.length;d+=2){var e=c[d],f=c[d+1];a(b,e,f)}}function c(a){a.Promise||(a.Promise=i)}function d(a){a.Map||(a.Map=h)}function e(a){b(a.prototype,["codePointAt",k,"contains",l,"endsWith",m,"startsWith",q,"repeat",o]),b(a,["fromCodePoint",n,"raw",p])}function f(a,c){b(a.prototype,["entries",u,"keys",v,"values",w,"fill",r,"find",s,"findIndex",t]),c&&c.iterator&&Object.defineProperty(a.prototype,c.iterator,{value:w,configurable:!0,enumerable:!1,writable:!0})}function g(a){c(a),d(a),e(a.String),f(a.Array,a.Symbol)}var h=$traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/Map")).Map,i=$traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/Promise")).Promise,j=$traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/String")),k=j.codePointAt,l=j.contains,m=j.endsWith,n=j.fromCodePoint,o=j.repeat,p=j.raw,q=j.startsWith,j=$traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/Array")),r=j.fill,s=j.find,t=j.findIndex,j=$traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/ArrayIterator")),u=j.entries,v=j.keys,w=j.values;g(this);var x=$traceurRuntime.setupGlobals;return $traceurRuntime.setupGlobals=function(a){x(a),g(a)},{}}),System.register("traceur-runtime@0.0.41/src/runtime/polyfill-import",[],function(){"use strict";$traceurRuntime.assertObject(System.get("traceur-runtime@0.0.41/src/runtime/polyfills/polyfills"));return{}}),System.get("traceur-runtime@0.0.41/src/runtime/polyfill-import");
+//# sourceMappingURL=traceur-runtime.min.map \ No newline at end of file
diff --git a/js/vendor/traceur-runtime/traceur-runtime.min.map b/js/vendor/traceur-runtime/traceur-runtime.min.map
new file mode 100644
index 000000000..11092fb99
--- /dev/null
+++ b/js/vendor/traceur-runtime/traceur-runtime.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"traceur-runtime.min.js","sources":["traceur-runtime.js"],"names":["global","nonEnum","value","configurable","enumerable","writable","newUniqueString","Math","floor","random","counter","createPrivateName","s","privateNames","isSymbol","symbol","SymbolValue","typeOf","v","Symbol","description","this","TypeError","key","$defineProperty","symbolDataProperty","symbolInternalProperty","symbolDescriptionProperty","freeze","symbolValues","getOwnHashObject","object","hashObject","hashProperty","self","$isExtensible","hashObjectProperties","hash","hashCounter","hashPropertyDescriptor","$create","undefined","$freeze","apply","arguments","preventExtensions","$preventExtensions","seal","$seal","toProperty","name","getOwnPropertyNames","rv","names","$getOwnPropertyNames","i","length","push","getOwnPropertyDescriptor","$getOwnPropertyDescriptor","getOwnPropertySymbols","hasOwnProperty","$hasOwnProperty","call","getOption","traceur","options","setProperty","sym","desc","defineProperty","descriptor","polyfillObject","Object","is","left","right","assign","target","p","source","props","$keys","mixin","prototype","method","exportStar","j","mod","get","isObject","x","toObject","$TypeError","$Object","assertObject","spread","k","valueToSpread","superDescriptor","homeObject","proto","$getPrototypeOf","result","superCall","args","superGet","superSet","set","getDescriptors","descriptors","createClass","ctor","staticObject","superClass","__proto__","getProtoParent","$defineProperties","defaultSuperCall","getInternalError","state","Error","GeneratorContext","GState","ST_NEWBORN","storedException","finallyFallThrough","sent_","returnValue","tryStack_","nextOrThrow","ctx","moveNext","action","ST_EXECUTING","ST_CLOSED","ST_SUSPENDED","sent","done","GeneratorFunction","GeneratorFunctionPrototype","createGeneratorInstance","innerFunction","functionObject","getMoveNext","ctxName","moveNextName","initGeneratorFunction","AsyncFunctionContext","err","Promise","resolve","reject","asyncWrap","createCallback","newState","errback","handleCatch","ex","last","catch","finally","handleException","setupGlobals","$traceurRuntime","create","defineProperties","getPrototypeOf","keys","toString","isExtensible","types","void","any","string","number","boolean","symbolValue","valueOf","iterator","END_STATE","RETHROW_STATE","pushTry","catchState","finallyState","popTry","pop",{"end":{"file":"traceur-runtime.js","comments_before":[],"nlb":false,"endpos":12621,"pos":12617,"col":8,"line":398,"value":"sent","type":"name"},"start":{"file":"traceur-runtime.js","comments_before":[],"nlb":false,"endpos":12621,"pos":12617,"col":8,"line":398,"value":"sent","type":"name"},"name":"sent"},"maybeThrow","sentIgnoreThrow","end","constructor","next","throw","type","typeof","buildFromEncodedParts","opt_scheme","opt_userInfo","opt_domain","opt_port","opt_path","opt_queryData","opt_fragment","out","join","split","uri","match","splitRe","removeDotSegments","path","leadingSlash","trailingSlash","slice","segments","up","pos","segment","unshift","joinAndCanonicalizePath","parts","ComponentIndex","PATH","SCHEME","USER_INFO","DOMAIN","PORT","QUERY_DATA","FRAGMENT","canonicalizeUrl","url","resolveUrl","base","baseParts","index","lastIndexOf","isAbsolute","RegExp","getUncoatedModuleInstantiator","ModuleStore","normalize","moduleInstantiators","Module","uncoatedModule","isLive","coatedModule","forEach","getter","liveModuleSentinel","descr","baseURL","$__2","location","href","UncoatedModuleEntry","value_","UncoatedModuleInstantiator","func","$UncoatedModuleInstantiator","getUncoatedModule","moduleInstances","refererName","test","normalizedName","m","moduleInstance","module","String","registerModule","bundleStore","register","deps","execute","$__0","depMap","dep","registryEntry","exports","getAnonymousModule","getForTesting","testingPrefix_","some","exec","System","bind","getModuleImpl","instantiator","toUint32","isCallable","toInteger","isNaN","isFinite","ceil","toLength","len","min","MAX_SAFE_LENGTH","pow","fill","start","fillStart","fillEnd","max","find","predicate","thisArg","findHelper","findIndex","returnIndex","$__3","createArrayIterator","array","kind","ArrayIterator","iteratorObject_","arrayIteratorNextIndex_","arrayIterationKind_","createIteratorResultObject","entries","ARRAY_ITERATOR_KIND_ENTRIES","ARRAY_ITERATOR_KIND_KEYS","values","ARRAY_ITERATOR_KIND_VALUES","$__5","$__6","itemKind","Infinity","lookupIndex","map","objectIndex_","stringIndex_","primitiveIndex_","initMap","entries_","deletedCount_","deletedSentinel","Map","iterable","iter","$__9","$__8","$__10","size","objectMode","stringMode","has","delete","clear","callbackFn","useNextTick","process","nextTick","flush","useMutationObserver","iterations","observer","BrowserMutationObserver","node","document","createTextNode","observe","characterData","data","useSetTimeout","setTimeout","queue","tuple","callback","arg","scheduleFlush","$__default","browserGlobal","window","MutationObserver","WebKitMutationObserver","isPromise","status_","idResolveHandler","idRejectHandler","chain","promise","onResolve","onReject","deferred","getDeferred","onResolve_","onReject_","promiseEnqueue","C","$Promise","promiseInit","promiseRaw","promiseResolve","r","promiseReject","promiseSet","status","promiseDone","reactions","tasks","async","promiseHandle","handler","e","promiseCoerce","then","$PromiseReject","thenableSymbol","default","resolver","that","cast","all","resolutions","count","race","startsWith","search","$toString","stringLength","searchString","position","Number","$indexOf","endsWith","searchLength","$lastIndexOf","contains","repeat","n","RangeError","codePointAt","second","first","charCodeAt","raw","callsite","fromCodePoint","highSurrogate","lowSurrogate","codeUnits","codePoint","fromCharCode","indexOf","maybeDefineMethod","maybeAddFunctions","functions","polyfillPromise","polyfillCollections","polyfillString","polyfillArray","Array","polyfill","$__13"],"mappings":"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"} \ No newline at end of file