Showing preview only (8,690K chars total). Download the full file or copy to clipboard to get everything.
Repository: sahat/satellizer
Branch: master
Commit: ae2863338ab7
Files: 342
Total size: 8.2 MB
Directory structure:
gitextract_wvdtvayn/
├── .gitignore
├── .npmignore
├── .publishrc
├── .travis.yml
├── LICENSE
├── README.md
├── bower.json
├── dist/
│ └── satellizer.js
├── examples/
│ ├── client/
│ │ ├── app.js
│ │ ├── controllers/
│ │ │ ├── home.js
│ │ │ ├── login.js
│ │ │ ├── logout.js
│ │ │ ├── navbar.js
│ │ │ ├── profile.js
│ │ │ └── signup.js
│ │ ├── directives/
│ │ │ ├── passwordMatch.js
│ │ │ └── passwordStrength.js
│ │ ├── index.html
│ │ ├── partials/
│ │ │ ├── home.html
│ │ │ ├── login.html
│ │ │ ├── profile.html
│ │ │ └── signup.html
│ │ ├── services/
│ │ │ └── account.js
│ │ ├── stylesheets/
│ │ │ ├── angular-toastr.css
│ │ │ └── styles.css
│ │ └── vendor/
│ │ ├── angular-animate.js
│ │ ├── angular-messages.js
│ │ ├── angular-mocks.js
│ │ ├── angular-resource.js
│ │ ├── angular-sanitize.js
│ │ ├── angular-toastr.js
│ │ ├── angular-toastr.tpls.js
│ │ ├── angular-ui-router.js
│ │ ├── angular.js
│ │ └── satellizer.js
│ ├── ionic/
│ │ ├── .bowerrc
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── bower.json
│ │ ├── config.xml
│ │ ├── gulpfile.js
│ │ ├── hooks/
│ │ │ ├── README.md
│ │ │ ├── after_platform_add/
│ │ │ │ └── 010_install_plugins.js
│ │ │ └── after_prepare/
│ │ │ └── 010_add_platform_class.js
│ │ ├── ionic.project
│ │ ├── package.json
│ │ ├── scss/
│ │ │ └── ionic.app.scss
│ │ └── www/
│ │ ├── css/
│ │ │ └── style.css
│ │ ├── index.html
│ │ ├── js/
│ │ │ ├── app.js
│ │ │ └── controllers.js
│ │ ├── lib/
│ │ │ ├── ionic/
│ │ │ │ ├── css/
│ │ │ │ │ └── ionic.css
│ │ │ │ ├── js/
│ │ │ │ │ ├── angular/
│ │ │ │ │ │ ├── angular-animate.js
│ │ │ │ │ │ ├── angular-resource.js
│ │ │ │ │ │ ├── angular-sanitize.js
│ │ │ │ │ │ └── angular.js
│ │ │ │ │ ├── angular-ui/
│ │ │ │ │ │ └── angular-ui-router.js
│ │ │ │ │ ├── ionic-angular.js
│ │ │ │ │ ├── ionic.bundle.js
│ │ │ │ │ └── ionic.js
│ │ │ │ ├── scss/
│ │ │ │ │ ├── _action-sheet.scss
│ │ │ │ │ ├── _animations.scss
│ │ │ │ │ ├── _backdrop.scss
│ │ │ │ │ ├── _badge.scss
│ │ │ │ │ ├── _bar.scss
│ │ │ │ │ ├── _button-bar.scss
│ │ │ │ │ ├── _button.scss
│ │ │ │ │ ├── _checkbox.scss
│ │ │ │ │ ├── _form.scss
│ │ │ │ │ ├── _grid.scss
│ │ │ │ │ ├── _items.scss
│ │ │ │ │ ├── _list.scss
│ │ │ │ │ ├── _loading.scss
│ │ │ │ │ ├── _menu.scss
│ │ │ │ │ ├── _mixins.scss
│ │ │ │ │ ├── _modal.scss
│ │ │ │ │ ├── _platform.scss
│ │ │ │ │ ├── _popover.scss
│ │ │ │ │ ├── _popup.scss
│ │ │ │ │ ├── _progress.scss
│ │ │ │ │ ├── _radio.scss
│ │ │ │ │ ├── _range.scss
│ │ │ │ │ ├── _refresher.scss
│ │ │ │ │ ├── _reset.scss
│ │ │ │ │ ├── _scaffolding.scss
│ │ │ │ │ ├── _select.scss
│ │ │ │ │ ├── _slide-box.scss
│ │ │ │ │ ├── _spinner.scss
│ │ │ │ │ ├── _tabs.scss
│ │ │ │ │ ├── _toggle.scss
│ │ │ │ │ ├── _transitions.scss
│ │ │ │ │ ├── _type.scss
│ │ │ │ │ ├── _util.scss
│ │ │ │ │ ├── _variables.scss
│ │ │ │ │ ├── ionic.scss
│ │ │ │ │ └── ionicons/
│ │ │ │ │ ├── _ionicons-font.scss
│ │ │ │ │ ├── _ionicons-icons.scss
│ │ │ │ │ ├── _ionicons-variables.scss
│ │ │ │ │ └── ionicons.scss
│ │ │ │ └── version.json
│ │ │ └── satellizer/
│ │ │ ├── dist/
│ │ │ │ └── satellizer.js
│ │ │ └── satellizer.js
│ │ └── templates/
│ │ ├── home.html
│ │ └── menu.html
│ └── server/
│ ├── java/
│ │ ├── README.md
│ │ ├── example.keystore
│ │ ├── example.yml
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── helloworld/
│ │ │ ├── HelloWorldApplication.java
│ │ │ ├── HelloWorldConfiguration.java
│ │ │ ├── auth/
│ │ │ │ ├── AuthFilter.java
│ │ │ │ ├── AuthUtils.java
│ │ │ │ └── PasswordService.java
│ │ │ ├── core/
│ │ │ │ ├── Token.java
│ │ │ │ └── User.java
│ │ │ ├── db/
│ │ │ │ └── UserDAO.java
│ │ │ └── resources/
│ │ │ ├── AuthResource.java
│ │ │ ├── ClientResource.java
│ │ │ └── UserResource.java
│ │ └── resources/
│ │ ├── banner.txt
│ │ └── migrations.xml
│ ├── node/
│ │ ├── config.js
│ │ ├── package.json
│ │ └── server.js
│ ├── php/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── app/
│ │ │ ├── Commands/
│ │ │ │ └── Command.php
│ │ │ ├── Console/
│ │ │ │ ├── Commands/
│ │ │ │ │ └── Inspire.php
│ │ │ │ └── Kernel.php
│ │ │ ├── Events/
│ │ │ │ └── Event.php
│ │ │ ├── Exceptions/
│ │ │ │ └── Handler.php
│ │ │ ├── Handlers/
│ │ │ │ ├── Commands/
│ │ │ │ │ └── .gitkeep
│ │ │ │ └── Events/
│ │ │ │ └── .gitkeep
│ │ │ ├── Http/
│ │ │ │ ├── Controllers/
│ │ │ │ │ ├── AuthController.php
│ │ │ │ │ ├── Controller.php
│ │ │ │ │ ├── HomeController.php
│ │ │ │ │ └── UserController.php
│ │ │ │ ├── Kernel.php
│ │ │ │ ├── Middleware/
│ │ │ │ │ ├── Authenticate.php
│ │ │ │ │ ├── RedirectIfAuthenticated.php
│ │ │ │ │ └── VerifyCsrfToken.php
│ │ │ │ ├── Requests/
│ │ │ │ │ └── Request.php
│ │ │ │ └── routes.php
│ │ │ ├── Providers/
│ │ │ │ ├── AppServiceProvider.php
│ │ │ │ ├── AuthServiceProvider.php
│ │ │ │ ├── BusServiceProvider.php
│ │ │ │ ├── ConfigServiceProvider.php
│ │ │ │ ├── EventServiceProvider.php
│ │ │ │ └── RouteServiceProvider.php
│ │ │ └── User.php
│ │ ├── artisan
│ │ ├── bootstrap/
│ │ │ ├── app.php
│ │ │ ├── autoload.php
│ │ │ └── cache/
│ │ │ └── .gitignore
│ │ ├── composer.json
│ │ ├── config/
│ │ │ ├── app.php
│ │ │ ├── auth.php
│ │ │ ├── cache.php
│ │ │ ├── compile.php
│ │ │ ├── database.php
│ │ │ ├── filesystems.php
│ │ │ ├── mail.php
│ │ │ ├── queue.php
│ │ │ ├── services.php
│ │ │ ├── session.php
│ │ │ └── view.php
│ │ ├── database/
│ │ │ ├── .gitignore
│ │ │ ├── migrations/
│ │ │ │ ├── .gitkeep
│ │ │ │ └── 2015_04_18_080047_create_users_table.php
│ │ │ └── seeds/
│ │ │ ├── .gitkeep
│ │ │ └── DatabaseSeeder.php
│ │ ├── gulpfile.js
│ │ ├── package.json
│ │ ├── phpspec.yml
│ │ ├── phpunit.xml
│ │ ├── public/
│ │ │ ├── .htaccess
│ │ │ ├── app.js
│ │ │ ├── controllers/
│ │ │ │ ├── home.js
│ │ │ │ ├── login.js
│ │ │ │ ├── logout.js
│ │ │ │ ├── navbar.js
│ │ │ │ ├── profile.js
│ │ │ │ └── signup.js
│ │ │ ├── directives/
│ │ │ │ ├── passwordMatch.js
│ │ │ │ └── passwordStrength.js
│ │ │ ├── index.html
│ │ │ ├── index.php
│ │ │ ├── partials/
│ │ │ │ ├── home.html
│ │ │ │ ├── login.html
│ │ │ │ ├── profile.html
│ │ │ │ └── signup.html
│ │ │ ├── robots.txt
│ │ │ ├── services/
│ │ │ │ └── account.js
│ │ │ ├── stylesheets/
│ │ │ │ ├── angular-toastr.css
│ │ │ │ └── styles.css
│ │ │ └── vendor/
│ │ │ ├── angular-animate.js
│ │ │ ├── angular-messages.js
│ │ │ ├── angular-mocks.js
│ │ │ ├── angular-resource.js
│ │ │ ├── angular-sanitize.js
│ │ │ ├── angular-toastr.js
│ │ │ ├── angular-toastr.tpls.js
│ │ │ ├── angular-ui-router.js
│ │ │ ├── angular.js
│ │ │ ├── dist/
│ │ │ │ └── satellizer.js
│ │ │ └── satellizer.js
│ │ ├── resources/
│ │ │ ├── assets/
│ │ │ │ └── less/
│ │ │ │ └── app.less
│ │ │ ├── lang/
│ │ │ │ └── en/
│ │ │ │ ├── pagination.php
│ │ │ │ ├── passwords.php
│ │ │ │ └── validation.php
│ │ │ └── views/
│ │ │ ├── errors/
│ │ │ │ └── 503.blade.php
│ │ │ ├── vendor/
│ │ │ │ └── .gitkeep
│ │ │ └── welcome.blade.php
│ │ ├── server.php
│ │ ├── storage/
│ │ │ ├── app/
│ │ │ │ └── .gitignore
│ │ │ ├── framework/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── cache/
│ │ │ │ │ └── .gitignore
│ │ │ │ ├── sessions/
│ │ │ │ │ └── .gitignore
│ │ │ │ └── views/
│ │ │ │ └── .gitignore
│ │ │ └── logs/
│ │ │ └── .gitkeep
│ │ └── tests/
│ │ ├── ExampleTest.php
│ │ └── TestCase.php
│ ├── python/
│ │ ├── app.py
│ │ ├── config.py
│ │ └── requirements.txt
│ └── ruby/
│ ├── .gitignore
│ ├── Gemfile
│ ├── README.rdoc
│ ├── Rakefile
│ ├── app/
│ │ ├── assets/
│ │ │ ├── images/
│ │ │ │ └── .keep
│ │ │ ├── javascripts/
│ │ │ │ └── application.js
│ │ │ └── stylesheets/
│ │ │ └── application.css
│ │ ├── controllers/
│ │ │ ├── api_controller.rb
│ │ │ ├── application_controller.rb
│ │ │ ├── auth_controller.rb
│ │ │ └── concerns/
│ │ │ └── .keep
│ │ ├── helpers/
│ │ │ └── application_helper.rb
│ │ ├── mailers/
│ │ │ └── .keep
│ │ ├── models/
│ │ │ ├── .keep
│ │ │ ├── authorization.rb
│ │ │ ├── concerns/
│ │ │ │ └── .keep
│ │ │ ├── oauth/
│ │ │ │ ├── base.rb
│ │ │ │ ├── facebook.rb
│ │ │ │ ├── foursquare.rb
│ │ │ │ ├── github.rb
│ │ │ │ ├── google.rb
│ │ │ │ ├── linkedin.rb
│ │ │ │ └── twitter.rb
│ │ │ ├── token.rb
│ │ │ └── user.rb
│ │ ├── serializers/
│ │ │ └── user_serializer.rb
│ │ └── views/
│ │ └── layouts/
│ │ └── application.html.erb
│ ├── bin/
│ │ ├── bundle
│ │ ├── rails
│ │ ├── rake
│ │ ├── setup
│ │ └── spring
│ ├── config/
│ │ ├── application.rb
│ │ ├── boot.rb
│ │ ├── database.yml
│ │ ├── environment.rb
│ │ ├── environments/
│ │ │ ├── development.rb
│ │ │ ├── production.rb
│ │ │ └── test.rb
│ │ ├── initializers/
│ │ │ ├── assets.rb
│ │ │ ├── backtrace_silencers.rb
│ │ │ ├── cookies_serializer.rb
│ │ │ ├── filter_parameter_logging.rb
│ │ │ ├── hash.rb
│ │ │ ├── inflections.rb
│ │ │ ├── mime_types.rb
│ │ │ ├── session_store.rb
│ │ │ └── wrap_parameters.rb
│ │ ├── locales/
│ │ │ └── en.yml
│ │ ├── routes.rb
│ │ └── secrets.yml
│ ├── config.ru
│ ├── db/
│ │ ├── migrate/
│ │ │ ├── 20150331192120_create_users.rb
│ │ │ └── 20160703114821_create_authorizations.rb
│ │ ├── schema.rb
│ │ └── seeds.rb
│ ├── log/
│ │ └── .keep
│ ├── public/
│ │ ├── 404.html
│ │ ├── 422.html
│ │ ├── 500.html
│ │ ├── index.html
│ │ └── robots.txt
│ ├── sinatra_static.rb
│ ├── test/
│ │ ├── controllers/
│ │ │ └── .keep
│ │ ├── fixtures/
│ │ │ ├── .keep
│ │ │ └── users.yml
│ │ ├── helpers/
│ │ │ └── .keep
│ │ ├── integration/
│ │ │ └── .keep
│ │ ├── mailers/
│ │ │ └── .keep
│ │ ├── models/
│ │ │ ├── .keep
│ │ │ └── user_test.rb
│ │ └── test_helper.rb
│ └── vendor/
│ └── assets/
│ ├── javascripts/
│ │ └── .keep
│ └── stylesheets/
│ └── .keep
├── karma.conf.js
├── package.json
├── rollup.config.js
├── src/
│ ├── authProvider.ts
│ ├── config.ts
│ ├── httpProviderConfig.ts
│ ├── interceptor.ts
│ ├── local.ts
│ ├── ng1.ts
│ ├── oauth.ts
│ ├── oauth1.ts
│ ├── oauth2.ts
│ ├── popup.ts
│ ├── shared.ts
│ ├── storage.ts
│ └── utils.ts
├── test/
│ ├── annotations.spec.ts
│ ├── authProvider.spec.ts
│ ├── local.spec.ts
│ ├── oauth.spec.ts
│ ├── oauth1.spec.ts
│ ├── oauth2.spec.ts
│ ├── popup.spec.ts
│ ├── shared.spec.ts
│ ├── storage.spec.ts
│ └── utils.spec.ts
├── tsconfig.json
├── tslint.json
├── typings/
│ ├── globals/
│ │ ├── angular/
│ │ │ ├── index.d.ts
│ │ │ └── typings.json
│ │ ├── angular-mocks/
│ │ │ ├── index.d.ts
│ │ │ └── typings.json
│ │ ├── es6-shim/
│ │ │ ├── index.d.ts
│ │ │ └── typings.json
│ │ ├── jasmine/
│ │ │ ├── index.d.ts
│ │ │ └── typings.json
│ │ ├── jquery/
│ │ │ ├── index.d.ts
│ │ │ └── typings.json
│ │ └── node/
│ │ ├── index.d.ts
│ │ └── typings.json
│ └── index.d.ts
└── typings.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Runtime data
pids
*.pid
*.seed
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
build
# Dependency directory
node_modules
bower_components
# Editors
.idea
*.iml
# OS metadata
.DS_Store
Thumbs.db
================================================
FILE: .npmignore
================================================
.idea
build
examples
node_modules
test
.travis.yml
karma.conf.js
rollup.config.js
tslint.json
================================================
FILE: .publishrc
================================================
{
"validations": {
"vulnerableDependencies": true,
"uncommittedChanges": true,
"untrackedFiles": true,
"sensitiveData": true,
"branch": "master",
"gitTag": true
},
"confirm": true,
"publishTag": "latest",
"prePublishScript": "npm run build"
}
================================================
FILE: .travis.yml
================================================
language: node_js
node_js:
- "6.1"
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2016 Sahat Yalkabov
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: README.md
================================================

# [Satellizer](https://github.com/sahat/satellizer/)
[](https://paypal.me/sahat)
[](https://gitter.im/sahat/satellizer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[](https://travis-ci.org/sahat/satellizer)
[](https://badge.fury.io/js/satellizer)
[](https://www.codementor.io/sahatyalkabov?utm_source=github&utm_medium=button&utm_term=sahatyalkabov&utm_campaign=github)
[](#backers)
[](#sponsors)
[**Live Demo**](https://satellizer-sahat.rhcloud.com)
---
**Satellizer** is a simple to use, end-to-end, token-based authentication module
for [AngularJS](http://angularjs.org) with built-in support for Google, Facebook,
LinkedIn, Twitter, Instagram, GitHub, Bitbucket, Yahoo, Twitch, Microsoft (Windows Live) OAuth providers, as well as Email
and Password sign-in. However, you are not limited to the sign-in options above, in fact
you can add any *OAuth 1.0* or *OAuth 2.0* provider by passing provider-specific information
in the app *config* block.

## Backers
Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/satellizer#backer)]
<a href="https://opencollective.com/satellizer/backer/0/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/0/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/1/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/1/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/2/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/2/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/3/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/3/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/4/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/4/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/5/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/5/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/6/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/6/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/7/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/7/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/8/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/8/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/9/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/9/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/10/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/10/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/11/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/11/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/12/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/12/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/13/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/13/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/14/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/14/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/15/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/15/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/16/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/16/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/17/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/17/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/18/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/18/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/19/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/19/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/20/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/20/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/21/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/21/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/22/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/22/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/23/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/23/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/24/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/24/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/25/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/25/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/26/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/26/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/27/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/27/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/28/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/28/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/backer/29/website" target="_blank"><img src="https://opencollective.com/satellizer/backer/29/avatar.svg"></a>
## Sponsors
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/satellizer#sponsor)]
<a href="https://opencollective.com/satellizer/sponsor/0/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/0/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/1/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/1/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/2/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/2/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/3/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/3/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/4/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/4/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/5/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/5/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/6/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/6/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/7/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/8/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/9/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/9/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/10/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/10/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/11/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/11/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/12/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/12/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/13/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/13/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/14/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/14/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/15/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/15/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/16/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/16/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/17/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/17/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/18/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/18/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/19/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/19/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/20/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/20/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/21/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/21/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/22/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/22/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/23/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/23/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/24/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/24/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/25/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/25/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/26/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/26/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/27/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/27/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/28/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/28/avatar.svg"></a>
<a href="https://opencollective.com/satellizer/sponsor/29/website" target="_blank"><img src="https://opencollective.com/satellizer/sponsor/29/avatar.svg"></a>
## Table of Contents
- [Installation](#installation)
- [Requirements for Mobile Apps](#requirements-for-mobile-apps)
- [Usage](#usage)
- [Configuration](#configuration)
- [Browser Support](#browser-support)
- [Authentication Flow](#authentication-flow)
- [Login with Email and Password](#-login-with-email-and-password)
- [Login with OAuth 1.0](#-login-with-oauth-10)
- [Login with OAuth 2.0](#-login-with-oauth-20)
- [Logout](#-log-out)
- [Obtaining OAuth Keys](#obtaining-oauth-keys)
- [API Reference](#api-reference)
- [FAQ](#faq)
- [Community Resources](#community-resources)
- [Backers](#backers)
- [Sponsors](#sponsors)
- [Credits](#credits)
- [License](#license)
## Installation
#### <img src="https://upload.wikimedia.org/wikipedia/commons/e/e2/Google_Chrome_icon_%282011%29.svg" height="22" align="top"> Browser
```html
<script src="angular.js"></script>
<script src="satellizer.js"></script>
```
```html
<!-- Satellizer CDN -->
<script src="https://cdn.jsdelivr.net/satellizer/0.15.5/satellizer.min.js"></script>
```
#### <img src="https://upload.wikimedia.org/wikipedia/commons/d/db/Npm-logo.svg" height="22" align="top"> NPM
```
$ npm install satellizer
```
#### <img src="https://bower.io/img/bower-logo.svg" height="22" align="top"> Bower
```
$ bower install satellizer
```
### Requirements for Mobile Apps
With any Cordova mobile apps or any framework that uses Cordova, such as [Ionic Framework](http://ionicframework.com/), you will need to add [cordova-plugin-inappbrowser](https://cordova.apache.org/docs/en/3.0.0/cordova/inappbrowser/inappbrowser.html) plugin:
```
$ cordova plugin add cordova-plugin-inappbrowser
```
Make sure that **inAppBrowser** is listed in your project:
```
$ cordova plugins
cordova-plugin-console 1.0.2 "Console"
cordova-plugin-device 1.1.1 "Device"
cordova-plugin-inappbrowser 1.3.0 "InAppBrowser"
cordova-plugin-splashscreen 3.2.0 "Splashscreen"
cordova-plugin-statusbar 2.1.1 "StatusBar"
cordova-plugin-whitelist 1.2.1 "Whitelist"
ionic-plugin-keyboard 1.0.8 "Keyboard"
```
## Usage
**Step 1. App Module**
```js
angular.module('MyApp', ['satellizer'])
.config(function($authProvider) {
$authProvider.facebook({
clientId: 'Facebook App ID'
});
// Optional: For client-side use (Implicit Grant), set responseType to 'token' (default: 'code')
$authProvider.facebook({
clientId: 'Facebook App ID',
responseType: 'token'
});
$authProvider.google({
clientId: 'Google Client ID'
});
$authProvider.github({
clientId: 'GitHub Client ID'
});
$authProvider.linkedin({
clientId: 'LinkedIn Client ID'
});
$authProvider.instagram({
clientId: 'Instagram Client ID'
});
$authProvider.yahoo({
clientId: 'Yahoo Client ID / Consumer Key'
});
$authProvider.live({
clientId: 'Microsoft Client ID'
});
$authProvider.twitch({
clientId: 'Twitch Client ID'
});
$authProvider.bitbucket({
clientId: 'Bitbucket Client ID'
});
$authProvider.spotify({
clientId: 'Spotify Client ID'
});
// No additional setup required for Twitter
$authProvider.oauth2({
name: 'foursquare',
url: '/auth/foursquare',
clientId: 'Foursquare Client ID',
redirectUri: window.location.origin,
authorizationEndpoint: 'https://foursquare.com/oauth2/authenticate',
});
});
```
**Step 2. Controller**
```js
angular.module('MyApp')
.controller('LoginCtrl', function($scope, $auth) {
$scope.authenticate = function(provider) {
$auth.authenticate(provider);
};
});
```
**Step 3. Template**
```html
<button ng-click="authenticate('facebook')">Sign in with Facebook</button>
<button ng-click="authenticate('google')">Sign in with Google</button>
<button ng-click="authenticate('github')">Sign in with GitHub</button>
<button ng-click="authenticate('linkedin')">Sign in with LinkedIn</button>
<button ng-click="authenticate('instagram')">Sign in with Instagram</button>
<button ng-click="authenticate('twitter')">Sign in with Twitter</button>
<button ng-click="authenticate('foursquare')">Sign in with Foursquare</button>
<button ng-click="authenticate('yahoo')">Sign in with Yahoo</button>
<button ng-click="authenticate('live')">Sign in with Windows Live</button>
<button ng-click="authenticate('twitch')">Sign in with Twitch</button>
<button ng-click="authenticate('bitbucket')">Sign in with Bitbucket</button>
<button ng-click="authenticate('spotify')">Sign in with Spotify</button>
```
**Note:** For server-side usage please refer to the [**examples**](https://github.com/sahat/satellizer/tree/master/examples/server)
directory.
## Configuration
Below is a complete listing of all default configuration options.
```js
$authProvider.httpInterceptor = function() { return true; },
$authProvider.withCredentials = false;
$authProvider.tokenRoot = null;
$authProvider.baseUrl = '/';
$authProvider.loginUrl = '/auth/login';
$authProvider.signupUrl = '/auth/signup';
$authProvider.unlinkUrl = '/auth/unlink/';
$authProvider.tokenName = 'token';
$authProvider.tokenPrefix = 'satellizer';
$authProvider.tokenHeader = 'Authorization';
$authProvider.tokenType = 'Bearer';
$authProvider.storageType = 'localStorage';
// Facebook
$authProvider.facebook({
name: 'facebook',
url: '/auth/facebook',
authorizationEndpoint: 'https://www.facebook.com/v2.5/dialog/oauth',
redirectUri: window.location.origin + '/',
requiredUrlParams: ['display', 'scope'],
scope: ['email'],
scopeDelimiter: ',',
display: 'popup',
oauthType: '2.0',
popupOptions: { width: 580, height: 400 }
});
// Google
$authProvider.google({
url: '/auth/google',
authorizationEndpoint: 'https://accounts.google.com/o/oauth2/auth',
redirectUri: window.location.origin,
requiredUrlParams: ['scope'],
optionalUrlParams: ['display'],
scope: ['profile', 'email'],
scopePrefix: 'openid',
scopeDelimiter: ' ',
display: 'popup',
oauthType: '2.0',
popupOptions: { width: 452, height: 633 }
});
// GitHub
$authProvider.github({
url: '/auth/github',
authorizationEndpoint: 'https://github.com/login/oauth/authorize',
redirectUri: window.location.origin,
optionalUrlParams: ['scope'],
scope: ['user:email'],
scopeDelimiter: ' ',
oauthType: '2.0',
popupOptions: { width: 1020, height: 618 }
});
// Instagram
$authProvider.instagram({
name: 'instagram',
url: '/auth/instagram',
authorizationEndpoint: 'https://api.instagram.com/oauth/authorize',
redirectUri: window.location.origin,
requiredUrlParams: ['scope'],
scope: ['basic'],
scopeDelimiter: '+',
oauthType: '2.0'
});
// LinkedIn
$authProvider.linkedin({
url: '/auth/linkedin',
authorizationEndpoint: 'https://www.linkedin.com/uas/oauth2/authorization',
redirectUri: window.location.origin,
requiredUrlParams: ['state'],
scope: ['r_emailaddress'],
scopeDelimiter: ' ',
state: 'STATE',
oauthType: '2.0',
popupOptions: { width: 527, height: 582 }
});
// Twitter
$authProvider.twitter({
url: '/auth/twitter',
authorizationEndpoint: 'https://api.twitter.com/oauth/authenticate',
redirectUri: window.location.origin,
oauthType: '1.0',
popupOptions: { width: 495, height: 645 }
});
// Twitch
$authProvider.twitch({
url: '/auth/twitch',
authorizationEndpoint: 'https://api.twitch.tv/kraken/oauth2/authorize',
redirectUri: window.location.origin,
requiredUrlParams: ['scope'],
scope: ['user_read'],
scopeDelimiter: ' ',
display: 'popup',
oauthType: '2.0',
popupOptions: { width: 500, height: 560 }
});
// Windows Live
$authProvider.live({
url: '/auth/live',
authorizationEndpoint: 'https://login.live.com/oauth20_authorize.srf',
redirectUri: window.location.origin,
requiredUrlParams: ['display', 'scope'],
scope: ['wl.emails'],
scopeDelimiter: ' ',
display: 'popup',
oauthType: '2.0',
popupOptions: { width: 500, height: 560 }
});
// Yahoo
$authProvider.yahoo({
url: '/auth/yahoo',
authorizationEndpoint: 'https://api.login.yahoo.com/oauth2/request_auth',
redirectUri: window.location.origin,
scope: [],
scopeDelimiter: ',',
oauthType: '2.0',
popupOptions: { width: 559, height: 519 }
});
// Bitbucket
$authProvider.bitbucket({
url: '/auth/bitbucket',
authorizationEndpoint: 'https://bitbucket.org/site/oauth2/authorize',
redirectUri: window.location.origin + '/',
optionalUrlParams: ['scope'],
scope: ['email'],
scopeDelimiter: ' ',
oauthType: '2.0',
popupOptions: { width: 1020, height: 618 }
});
// Spotify
$authProvider.spotify({
url: '/auth/spotify',
authorizationEndpoint: 'https://accounts.spotify.com/authorize',
redirectUri: window.location.origin,
optionalUrlParams: ['state'],
requiredUrlParams: ['scope'],
scope: ['user-read-email'],
scopePrefix: '',
scopeDelimiter: ',',
oauthType: '2.0',
popupOptions: { width: 500, height: 530 }
});
// Generic OAuth 2.0
$authProvider.oauth2({
name: null,
url: null,
clientId: null,
redirectUri: null,
authorizationEndpoint: null,
defaultUrlParams: ['response_type', 'client_id', 'redirect_uri'],
requiredUrlParams: null,
optionalUrlParams: null,
scope: null,
scopePrefix: null,
scopeDelimiter: null,
state: null,
oauthType: null,
popupOptions: null,
responseType: 'code',
responseParams: {
code: 'code',
clientId: 'clientId',
redirectUri: 'redirectUri'
}
});
// Generic OAuth 1.0
$authProvider.oauth1({
name: null,
url: null,
authorizationEndpoint: null,
redirectUri: null,
oauthType: null,
popupOptions: null
});
```
## Browser Support
<table>
<tbody>
<tr>
<td><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Internet_Explorer_9_icon.svg/2000px-Internet_Explorer_9_icon.svg.png" height="35"></td>
<td><img src="http://vignette1.wikia.nocookie.net/unanything/images/f/ff/Microsoft_Edge_logo_svg.png/revision/latest?cb=20150728233335" height="35"></td>
<td><img src="http://img4.wikia.nocookie.net/__cb20140907211937/logopedia/images/b/b6/Chrome_new_logo.png" height="35"></td>
<td><img src="http://media.idownloadblog.com/wp-content/uploads/2014/06/Safari-logo-OS-X-Yosemite.png" height="35"></td>
<td><img src="https://mozorg.cdn.mozilla.net/media/img/styleguide/identity/firefox/guidelines-logo.7ea045a4e288.png" height="35"></td>
<td><img src="http://upload.wikimedia.org/wikipedia/commons/d/d4/Opera_browser_logo_2013.png" height="35"></td>
</tr>
<tr>
<td align="center">9+</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
</tr>
</tbody>
</table>
## Authentication Flow
Satellizer relies on *token-based authentication* using
[JSON Web Tokens](https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/)
instead of cookies.
Additionally, **authorization** (obtaining user's information with their permission) and **authentication** (application sign-in) requires sever-side implementation. See provided [examples](https://github.com/sahat/satellizer/tree/master/examples/server) implemented in multiple languages for your convenience. In other words, you cannot just launch your AngularJS application and expect everything to work. The only exception is when you use *OAuth 2.0 Implicit Grant* (client-side) authorization by setting `responseType: 'token'` in provider's [configuration](https://github.com/sahat/satellizer#configuration).
### <img height="34" align="top" src="http://tech-lives.com/wp-content/uploads/2012/03/Lock-icon.png"> Login with Email and Password
1. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** Enter your email and password into the login form.
2. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** On form submit call `$auth.login()` with email and password.
3. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** Send a `POST` request to `/auth/login`.
4. <img height="24" align="top" src="http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/256/Places-network-server-database-icon.png"> **Server:** Check if email exists, if not - return `401`.
5. <img height="24" align="top" src="http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/256/Places-network-server-database-icon.png"> **Server:** Check if password is correct, if not - return `401`.
6. <img height="24" align="top" src="http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/256/Places-network-server-database-icon.png"> **Server:** Create a JSON Web Token and send it back to the client.
7. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** Parse the token and save it to *Local Storage* for subsequent
use after page reload.
### <img height="34" align="top" src="https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Oauth_logo.svg/180px-Oauth_logo.svg.png"> Login with OAuth 1.0
1. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** Open an **empty** popup window via `$auth.authenticate('provider name')`.
2. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** Unlike OAuth 2.0, with OAuth 1.0 you cannot go directly to the authorization
screen without a valid `request_token`.
3. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** The OAuth 1.0 flow starts with an empty **POST** request to */auth/provider*.
4. <img height="24" align="top" src="http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/256/Places-network-server-database-icon.png"> **Server:** Obtain and return `request_token`for the authorization popup.
5. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** Set the URL location of a popup to the `authorizationEndpoint` with a valid `request_token` query parameter, as well as popup options for height and width. This will redirect a user to the authorization screen. After this point, the flow is very similar to OAuth 2.0.
6. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** Sign in with your username and password if necessary, then authorize
the application.
7. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** Send a *POST* request back to the */auth/provider* with
`oauth_token` and `oauth_verifier` query parameters.
8. <img height="24" align="top" src="http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/256/Places-network-server-database-icon.png"> **Server:** Do an OAuth-signed `POST` request to the */access_token* URL since we now have `oauth_token` and
`oauth_verifier` parameters.
10. <img height="24" align="top" src="http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/256/Places-network-server-database-icon.png"> **Server:** Look up the user by their unique *Provider ID*. If user already
exists, grab the existing user, otherwise create a new user account.
11. <img height="24" align="top" src="http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/256/Places-network-server-database-icon.png"> **Server:** Create a JSON Web Token and send it back to the client.
12. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** Parse the token and save it to *Local Storage* for subsequent
use after page reload.
### <img height="34" align="top" src="https://getkong.org/assets/images/icons/plugins/oauth2-authentication.png"> Login with OAuth 2.0
1. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** Open a popup window via `$auth.authenticate('provider name')`.
2. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** Sign in with that provider, if necessary, then authorize the application.
3. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** After successful authorization, the popup is redirected back to
your app, e.g. *http://localhost:3000*, with the `code` (authorization code)
query string parameter.
4. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** The `code` parameter is sent back to the parent window that opened the popup.
5. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** Parent window closes the popup and sends a **POST**
request to */auth/provider* with`code` parameter.
6. <img height="24" align="top" src="http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/256/Places-network-server-database-icon.png"> **Server:** *Authorization code* is exchanged for *access token*.
7. <img height="24" align="top" src="http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/256/Places-network-server-database-icon.png"> **Server:** User information is retrived using the *access token* from **Step 6**.
8. <img height="24" align="top" src="http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/256/Places-network-server-database-icon.png"> **Server:** Look up the user by their unique *Provider ID*. If user already
exists, grab the existing user, otherwise create a new user account.
9. <img height="24" align="top" src="http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/256/Places-network-server-database-icon.png"> **Server:** In both cases of Step 8, create a JSON Web Token and send it back to the client.
10. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** Parse the token and save it to *Local Storage* for subsequent
use after page reload.
### <img height="34" align="top" src="http://i.imgur.com/S5Ei6Rj.png"> Log out
1. <img height="24" align="top" src="https://i.ytimg.com/i/bn1OgGei-DV7aSRo_HaAiw/mq1.jpg?v=4f8f2cc9"> **Client:** Remove token from Local Storage.
**Note:** To learn more about JSON Web Tokens visit <img src="http://jwt.io/img/pic_logo.svg" height="22" align="top"> [JWT.io](http://jwt.io/).
## Obtaining OAuth Keys
<img src="https://camo.githubusercontent.com/204e6b07369021b5b9eb7d228d051aca72a457ef/68747470733a2f2f75706c6f61642e77696b696d656469612e6f72672f77696b6970656469612f636f6d6d6f6e732f7468756d622f322f32662f476f6f676c655f323031355f6c6f676f2e7376672f3130303070782d476f6f676c655f323031355f6c6f676f2e7376672e706e67" width="150">
- Visit [Google Developer Console](https://console.developers.google.com/iam-admin/projects)
- Click **CREATE PROJECT** button
- Enter *Project Name*, then click **CREATE**
- Then select *APIs & auth* from the sidebar and click on *Credentials* tab
- Click **CREATE NEW CLIENT ID** button
- **Application Type**: Web Application
- **Authorized Javascript origins**: *http://localhost:3000*
- **Authorized redirect URI**: *http://localhost:3000*
**Note:** Make sure you have turned on **Contacts API** and **Google+ API** in the *APIs* tab.
<hr>
<img src="http://www.doit.ba/img/facebook.jpg" width="150">
- Visit [Facebook Developers](https://developers.facebook.com/)
- Click **Apps > Create a New App** in the navigation bar
- Enter *Display Name*, then choose a category, then click **Create app**
- Click on *Settings* on the sidebar, then click **+ Add Platform**
- Select **Website**
- Enter *http://localhost:3000* for *Site URL*
<hr>
<img src="https://g.twimg.com/Twitter_logo_blue.png" height="70">
- Sign in at [https://apps.twitter.com](https://apps.twitter.com/)
- Click on **Create New App**
- Enter your *Application Name*, *Description* and *Website*
- For **Callback URL**: *http://127.0.0.1:3000*
- Go to **Settings** tab
- Under *Application Type* select **Read and Write** access
- Check the box **Allow this application to be used to Sign in with Twitter**
- Click **Update this Twitter's applications settings**
<hr>
<img src="http://blogs.unity3d.com/wp-content/uploads/2013/12/New-Microsoft-Logo.png" width="150">
- Visit [Live Connect App Management](http://go.microsoft.com/fwlink/p/?LinkId=193157).
- Click on **Create application**
- Enter an *Application name*, then click on **I accept** button
- Go to **API Settings** tab
- Enter a *Redirect URL*
- Click **Save**
- Go to **App Settings** tab to get *Client ID* and *Client Secret*
> **Note:** Microsoft does not consider `localhost` or `127.0.0.1` to be a valid URL.
As a workaround for local development add `127.0.0.1 mylocalwebsite.net` to **/etc/hosts** file
and specify `mylocalwebsite.net` as your *Redirect URL* in the **API Settings** tab.
<img src="https://camo.githubusercontent.com/7318ebef474f99229892e6bf052f0117ca86f0e4/68747470733a2f2f6769746875622e676c6f62616c2e73736c2e666173746c792e6e65742f696d616765732f6d6f64756c65732f6c6f676f735f706167652f4769744875622d4c6f676f2e706e67" width="150">
- Visit [https://github.com/settings/profile](https://github.com/settings/profile)
- Select **Applications** in the left panel
- Go to **Developer applications** tab, then click on the **Register new application** button
- **Application name**: Your app name
- **Homepage URL**: *http://localhost:3000*
- **Authorization callback URL**: *http://localhost:3000*
- Click on the **Register application** button
<img
src="http://i.imgur.com/qCkAeZl.png"
width="150" />
- Visit
[https://developer.spotify.com](https://developer.spotify.com)
- Select **My Apps** on the top menu
- Select **Create an App** on the right side
- **Application Name**: Your app name
- **Application Description**: Your app Description
- Click **Create**
- Fill out the following:
- **Redirect URIs**: *http://localhost:3000*
- Click **Save**
<hr>
## API Reference
- [`$auth.login(user, [options])`](#authloginuser-options)
- [`$auth.signup(user, [options])`](#authsignupuser-options)
- [`$auth.authenticate(name, [userData])`](#authauthenticatename-userdata)
- [`$auth.logout()`](#authlogout)
- [`$auth.isAuthenticated()`](#authisauthenticated)
- [`$auth.link(name, [userData])`](#authlinkname-userdata)
- [`$auth.unlink(name, [options])`](#authunlinkname-options)
- [`$auth.getToken()`](#authgettoken)
- [`$auth.getPayload()`](#authgetpayload)
- [`$auth.setToken(token)`](#authsettokentoken)
- [`$auth.removeToken()`](#authremovetoken)
- [`$auth.setStorageType(type)`](#authsetstoragetypetype)
#### `$auth.login(user, [options])`
Sign in using Email and Password.
##### Parameters
| Param | Type | Details
| ------------------------ | -------- | ---------------------------------------------------------------------------------------
| **user** | `Object` | JavaScript object containing user information.
| **options** *(optional)* | `Object` | HTTP config object. See [`$http(config)`](https://docs.angularjs.org/api/ng/service/$http) docs.
##### Returns
- **response** - The HTTP response object from the server.
##### Usage
```js
var user = {
email: $scope.email,
password: $scope.password
};
$auth.login(user)
.then(function(response) {
// Redirect user here after a successful log in.
})
.catch(function(response) {
// Handle errors here, such as displaying a notification
// for invalid email and/or password.
});
```
<hr>
#### `$auth.signup(user, [options])`
Create a new account with Email and Password.
##### Parameters
| Param | Type | Details
| ------------------------ | -------- | ---------------------------------------------------------------------------------------
| **user** | `Object` | JavaScript object containing user information.
| **options** *(optional)* | `Object` | HTTP config object. See [`$http(config)`](https://docs.angularjs.org/api/ng/service/$http) docs.
##### Returns
- **response** - The HTTP response object from the server.
##### Usage
```js
var user = {
firstName: $scope.firstName,
lastName: $scope.lastName,
email: $scope.email,
password: $scope.password
};
$auth.signup(user)
.then(function(response) {
// Redirect user here to login page or perhaps some other intermediate page
// that requires email address verification before any other part of the site
// can be accessed.
})
.catch(function(response) {
// Handle errors here.
});
```
<hr>
#### `$auth.authenticate(name, [userData])`
Starts the OAuth 1.0 or the OAuth 2.0 authorization flow by opening a popup window. If used client side, [`responseType: "token"`](#authentication-flow) is required in the provider setup to get the actual access token.
##### Parameters
| Param | Type | Details
| ------------------------- | -------- | --------------------------------------------------------------------------------
| **name** | `String` | One of the built-in or custom OAuth provider names created via `$authProvider.oauth1()` or `$authProvider.oauth2()`.
| **userData** *(optional)* | `Object` | If you need to send additional data to the server along with `code`, `clientId` and `redirectUri` (OAuth 2.0) or `oauth_token` and `oauth_verifier` (OAuth 1.0).
##### Returns
- **response** - The HTTP response object from the server.
##### Usage
```js
$auth.authenticate('google')
.then(function(response) {
// Signed in with Google.
})
.catch(function(response) {
// Something went wrong.
});
```
<hr>
#### `$auth.logout()`
Deletes a token from Local Storage (or Session Storage).
##### Usage
```js
$auth.logout();
```
<hr>
#### `$auth.isAuthenticated()`
Checks authentication status of a user.
| State | True | False
| -------------------------------------- | -------- | -------
| No token in Local Storage | | ✓
| Token present, but not a valid JWT | ✓ |
| JWT present without [`exp`]((http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#expDef)) | ✓ |
| JWT present with [`exp`]((http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#expDef)) and not expired | ✓ |
| JWT present with [`exp`]((http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#expDef)) and expired | | ✓
##### Usage
```js
// Controller
$scope.isAuthenticated = function() {
return $auth.isAuthenticated();
};
```
```html
<!-- Template -->
<ul ng-if="!isAuthenticated()">
<li><a href="/login">Login</a></li>
<li><a href="/signup">Sign up</a></li>
</ul>
<ul ng-if="isAuthenticated()">
<li><a href="/logout">Logout</a></li>
</ul>
```
<hr>
#### `$auth.link(name, [userData])`
Alias for [`$auth.authenticate(name, [userData])`](#authauthenticatename-userdata).
:bulb: **Note:** Account linking (and merging) business logic is handled entirely on the server.
##### Usage
```js
// Controller
$scope.link = function(provider) {
$auth.link(provider)
.then(function(response) {
// You have successfully linked an account.
})
.catch(function(response) {
// Handle errors here.
});
};
```
```html
<!-- Template -->
<button ng-click="link('facebook')">
Connect Facebook Account
</button>
```
<hr>
#### `$auth.unlink(name, [options])`
Unlinks an OAuth provider.
By default, sends a POST request to `/auth/unlink` with the `{ provider: name }` data object.
##### Parameters
| Param | Type | Details
| ------------------------- | -------- | --------------------------------------------------------------------------------
| **name** | `String` | One of the built-in or custom OAuth provider names created via `$authProvider.oauth1()` or `$authProvider.oauth2()`.
| **options** *(optional)* | `Object` | HTTP config object. See [`$http(config)`](https://docs.angularjs.org/api/ng/service/$http) docs.
##### Returns
- **response** - The HTTP response object from the server.
##### Usage
```js
$auth.unlink('github')
.then(function(response) {
// You have unlinked a GitHub account.
})
.catch(function(response) {
// Handle errors here.
});
```
<hr>
#### `$auth.getToken()`
Returns a token from Local Storage (or Session Storage).
```js
$auth.getToken();
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEyMzQ1Njc4OTAsIm5hbWUiOiJKb2huIERvZSJ9.kRkUHzvZMWXjgB4zkO3d6P1imkdp0ogebLuxnTCiYUU
```
<hr>
#### `$auth.getPayload()`
Returns a JWT Claims Set, i.e. the middle part of a JSON Web Token.
##### Usage
```js
$auth.getPayload();
// { exp: 1414978281, iat: 1413765081, userId: "544457a3eb129ee822a38fdd" }
```
<hr>
#### `$auth.setToken(token)`
Saves a JWT or an access token to Local Storage / Session Storage.
##### Parameters
| Param | Type | Details
| ------------------------ | -------- | ---------------------------------------------------------------------------------------
| **token** | `Object` | An object that takes a JWT (`response.data[config.tokenName]`) or an access token (`response.access_token`).
<hr>
#### `$auth.removeToken()`
Removes a token from Local Storage / Session Storage. Used internally by [`$auth.logout()`](#authlogout).
##### Usage
```js
$auth.removeToken();
```
<hr>
#### `$auth.setStorageType(type)`
Sets storage type to Local Storage or Session Storage.
##### Parameters
| Param | Type | Details
| ------------------------ | -------- | -------------------------------------------------------
| **type** | `String` | Accepts `'localStorage'` and `'sessionStorage'` values.
##### Usage
```js
$auth.setStorageType('sessionStorage');
```
## FAQ
#### :question: How do I set `offline_access`?
```js
$authProvider.google({
optionalUrlParams: ['access_type'],
accessType: 'offline'
});
```
#### :question: Can I change `redirectUri` to something other than base URL?
By default, `redirectUri` is set to `window.location.origin` (protocol, hostname, port number of a URL) for all OAuth providers. This `redirectUri` must match *exactly* the URL¹ specified in your OAuth app settings.
**Facebook (example)**

However, you can set `redirectUri` to any URL *path* you desire. For instance, you may follow the naming convention of [Passport.js](http://passportjs.org/):
```js
// Note: Must be absolute path.
window.location.origin + '/auth/facebook/facebook/callback'
window.location.origin + '/auth/facebook/google/callback'
...
```
Using the example above, a popup window will be redirected to `http://localhost:3000/auth/facebook/callback?code=YOUR_AUTHORIZATION_CODE` after a successful Facebook authorization. To avoid potential 404 errors, create server routes for each `redirectUri` URL that return **200 OK**. Or alternatively, you may render a custom template with a loading spinner. For the moment, a popup will not stay long enough to see that custom template, due to 20ms interval polling, but in the future I may add support for overriding this polling interval value.
As far as Satellizer is concerned, it does not matter what is the value of `redirectUri` as long as it matches URL in your OAuth app settings. Satellizer's primary concern is to read URL query/hash parameters, then close a popup.
¹ **Note:** Depending on the OAuth provider, it may be called *Site URL*, *Callback URL*, *Redirect URL*, and so on.
#### :question: How can I send a token in a format other than `Authorization: Bearer <token>`?
If you are unable to send a token to your server in the following format - `Authorization: Bearer <token>`, then use
**`$authProvider.tokenHeader`** and **`$authProvider.tokenType`** config options to change the header format. The default values are `Authorization` and `Bearer`, respectively.
For example, if you need to use `Authorization: Basic` header, this is where you change it.
#### :question: How can I avoid sending Authorization header on all HTTP requests?
By default, once user is authenticated, JWT will be sent on every request. If you would like to prevent that, you could use `skipAuthorization` option in your `$http` request. For example:
```js
$http({
method: 'GET',
url: '/api/endpoint',
skipAuthorization: true // `Authorization: Bearer <token>` will not be sent on this request.
});
```
#### :question: Is there a way to dynamically change `localStorage` to `sessionStorage`?
Yes, you can toggle between [`localStorage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) and [`sessionStorage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionstorage) via the following Satellizer methods:
- `$auth.setStorageType('sessionStorage');`
- `$auth.setStorageType('localStorage');`
#### :question: I am having a problem with Ionic authentication on iOS 9.
First, check what kind of error you are getting by opening the Web Inspector from **Develop > Simulator > index.html** menu.
If you have configured everything correctly, chances are you running into the following error:
> Failed to load resource: The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.
Follow instructions on this [StackOverflow post](http://stackoverflow.com/questions/32631184/the-resource-could-not-be-loaded-because-the-app-transport-security-policy-requi) by adding `NSAppTransportSecurity` to *info.plist*. That should fix the problem.
## Community Resources
### Tutorials
- Ionic JWT auth with Facebook using Node.js ([Part 1](http://blog.grossman.io/ionic-jwt-auth-with-facebook-using-nodejs-part-1/) and [Part 2](http://blog.grossman.io/ionic-jwt-auth-with-facebook-using-nodejs-part-2-2/))
- [Build an Instagram clone with AngularJS, Satellizer, Node.js and MongoDB](https://hackhands.com/building-instagram-clone-angularjs-satellizer-nodejs-mongodb/)
## Credits
| Contribution | User
| -------------------------- | --------------------------------------
| Dropwizard (Java) Example | [Alice Chen](https://github.com/chena)
| Go Example | [Salim Alami](https://github.com/celrenheit)
| Ruby on Rails Example | [Simonas Gildutis](https://github.com/simonasdev)
| Ionic Framework Example | [Dimitris Bozelos](https://github.com/krystalcode)
Additionally, I would like to thank all other contributors who have reported
bugs, submitted pull requests and suggested new features!
## License
The MIT License (MIT)
Copyright (c) 2016 Sahat Yalkabov
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: bower.json
================================================
{
"name": "satellizer",
"main": "dist/satellizer.js",
"homepage": "https://github.com/sahat/satellizer",
"ignore": [
"examples",
"src",
"test",
"typings",
".gitignore",
".npmignore",
"karma.conf.js",
"rollup.config.js",
"tsconfig.json",
"tslint.json",
"typings.json"
],
"dependencies": {
"angular": "1.3.0 - 1.5.x"
}
}
================================================
FILE: dist/satellizer.js
================================================
/**
* Satellizer 0.15.5
* (c) 2016 Sahat Yalkabov
* License: MIT
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.satellizer = factory());
}(this, function () { 'use strict';
var Config = (function () {
function Config() {
this.baseUrl = '/';
this.loginUrl = '/auth/login';
this.signupUrl = '/auth/signup';
this.unlinkUrl = '/auth/unlink/';
this.tokenName = 'token';
this.tokenPrefix = 'satellizer';
this.tokenHeader = 'Authorization';
this.tokenType = 'Bearer';
this.storageType = 'localStorage';
this.tokenRoot = null;
this.withCredentials = false;
this.providers = {
facebook: {
name: 'facebook',
url: '/auth/facebook',
authorizationEndpoint: 'https://www.facebook.com/v2.5/dialog/oauth',
redirectUri: window.location.origin + '/',
requiredUrlParams: ['display', 'scope'],
scope: ['email'],
scopeDelimiter: ',',
display: 'popup',
oauthType: '2.0',
popupOptions: { width: 580, height: 400 }
},
google: {
name: 'google',
url: '/auth/google',
authorizationEndpoint: 'https://accounts.google.com/o/oauth2/auth',
redirectUri: window.location.origin,
requiredUrlParams: ['scope'],
optionalUrlParams: ['display', 'state'],
scope: ['profile', 'email'],
scopePrefix: 'openid',
scopeDelimiter: ' ',
display: 'popup',
oauthType: '2.0',
popupOptions: { width: 452, height: 633 },
state: function () { return encodeURIComponent(Math.random().toString(36).substr(2)); }
},
github: {
name: 'github',
url: '/auth/github',
authorizationEndpoint: 'https://github.com/login/oauth/authorize',
redirectUri: window.location.origin,
optionalUrlParams: ['scope'],
scope: ['user:email'],
scopeDelimiter: ' ',
oauthType: '2.0',
popupOptions: { width: 1020, height: 618 }
},
instagram: {
name: 'instagram',
url: '/auth/instagram',
authorizationEndpoint: 'https://api.instagram.com/oauth/authorize',
redirectUri: window.location.origin,
requiredUrlParams: ['scope'],
scope: ['basic'],
scopeDelimiter: '+',
oauthType: '2.0'
},
linkedin: {
name: 'linkedin',
url: '/auth/linkedin',
authorizationEndpoint: 'https://www.linkedin.com/uas/oauth2/authorization',
redirectUri: window.location.origin,
requiredUrlParams: ['state'],
scope: ['r_emailaddress'],
scopeDelimiter: ' ',
state: 'STATE',
oauthType: '2.0',
popupOptions: { width: 527, height: 582 }
},
twitter: {
name: 'twitter',
url: '/auth/twitter',
authorizationEndpoint: 'https://api.twitter.com/oauth/authenticate',
redirectUri: window.location.origin,
oauthType: '1.0',
popupOptions: { width: 495, height: 645 }
},
twitch: {
name: 'twitch',
url: '/auth/twitch',
authorizationEndpoint: 'https://api.twitch.tv/kraken/oauth2/authorize',
redirectUri: window.location.origin,
requiredUrlParams: ['scope'],
scope: ['user_read'],
scopeDelimiter: ' ',
display: 'popup',
oauthType: '2.0',
popupOptions: { width: 500, height: 560 }
},
live: {
name: 'live',
url: '/auth/live',
authorizationEndpoint: 'https://login.live.com/oauth20_authorize.srf',
redirectUri: window.location.origin,
requiredUrlParams: ['display', 'scope'],
scope: ['wl.emails'],
scopeDelimiter: ' ',
display: 'popup',
oauthType: '2.0',
popupOptions: { width: 500, height: 560 }
},
yahoo: {
name: 'yahoo',
url: '/auth/yahoo',
authorizationEndpoint: 'https://api.login.yahoo.com/oauth2/request_auth',
redirectUri: window.location.origin,
scope: [],
scopeDelimiter: ',',
oauthType: '2.0',
popupOptions: { width: 559, height: 519 }
},
bitbucket: {
name: 'bitbucket',
url: '/auth/bitbucket',
authorizationEndpoint: 'https://bitbucket.org/site/oauth2/authorize',
redirectUri: window.location.origin + '/',
requiredUrlParams: ['scope'],
scope: ['email'],
scopeDelimiter: ' ',
oauthType: '2.0',
popupOptions: { width: 1028, height: 529 }
},
spotify: {
name: 'spotify',
url: '/auth/spotify',
authorizationEndpoint: 'https://accounts.spotify.com/authorize',
redirectUri: window.location.origin,
optionalUrlParams: ['state'],
requiredUrlParams: ['scope'],
scope: ['user-read-email'],
scopePrefix: '',
scopeDelimiter: ',',
oauthType: '2.0',
popupOptions: { width: 500, height: 530 },
state: function () { return encodeURIComponent(Math.random().toString(36).substr(2)); }
}
};
this.httpInterceptor = function () { return true; };
}
Object.defineProperty(Config, "getConstant", {
get: function () {
return new Config();
},
enumerable: true,
configurable: true
});
return Config;
}());
;
var AuthProvider = (function () {
function AuthProvider(SatellizerConfig) {
this.SatellizerConfig = SatellizerConfig;
}
Object.defineProperty(AuthProvider.prototype, "baseUrl", {
get: function () { return this.SatellizerConfig.baseUrl; },
set: function (value) { this.SatellizerConfig.baseUrl = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "loginUrl", {
get: function () { return this.SatellizerConfig.loginUrl; },
set: function (value) { this.SatellizerConfig.loginUrl = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "signupUrl", {
get: function () { return this.SatellizerConfig.signupUrl; },
set: function (value) { this.SatellizerConfig.signupUrl = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "unlinkUrl", {
get: function () { return this.SatellizerConfig.unlinkUrl; },
set: function (value) { this.SatellizerConfig.unlinkUrl = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "tokenRoot", {
get: function () { return this.SatellizerConfig.tokenRoot; },
set: function (value) { this.SatellizerConfig.tokenRoot = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "tokenName", {
get: function () { return this.SatellizerConfig.tokenName; },
set: function (value) { this.SatellizerConfig.tokenName = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "tokenPrefix", {
get: function () { return this.SatellizerConfig.tokenPrefix; },
set: function (value) { this.SatellizerConfig.tokenPrefix = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "tokenHeader", {
get: function () { return this.SatellizerConfig.tokenHeader; },
set: function (value) { this.SatellizerConfig.tokenHeader = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "tokenType", {
get: function () { return this.SatellizerConfig.tokenType; },
set: function (value) { this.SatellizerConfig.tokenType = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "withCredentials", {
get: function () { return this.SatellizerConfig.withCredentials; },
set: function (value) { this.SatellizerConfig.withCredentials = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "storageType", {
get: function () { return this.SatellizerConfig.storageType; },
set: function (value) { this.SatellizerConfig.storageType = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "httpInterceptor", {
get: function () { return this.SatellizerConfig.httpInterceptor; },
set: function (value) {
if (typeof value === 'function') {
this.SatellizerConfig.httpInterceptor = value;
}
else {
this.SatellizerConfig.httpInterceptor = function () { return value; };
}
},
enumerable: true,
configurable: true
});
AuthProvider.prototype.facebook = function (options) {
angular.extend(this.SatellizerConfig.providers.facebook, options);
};
AuthProvider.prototype.google = function (options) {
angular.extend(this.SatellizerConfig.providers.google, options);
};
AuthProvider.prototype.github = function (options) {
angular.extend(this.SatellizerConfig.providers.github, options);
};
AuthProvider.prototype.instagram = function (options) {
angular.extend(this.SatellizerConfig.providers.instagram, options);
};
AuthProvider.prototype.linkedin = function (options) {
angular.extend(this.SatellizerConfig.providers.linkedin, options);
};
AuthProvider.prototype.twitter = function (options) {
angular.extend(this.SatellizerConfig.providers.twitter, options);
};
AuthProvider.prototype.twitch = function (options) {
angular.extend(this.SatellizerConfig.providers.twitch, options);
};
AuthProvider.prototype.live = function (options) {
angular.extend(this.SatellizerConfig.providers.live, options);
};
AuthProvider.prototype.yahoo = function (options) {
angular.extend(this.SatellizerConfig.providers.yahoo, options);
};
AuthProvider.prototype.bitbucket = function (options) {
angular.extend(this.SatellizerConfig.providers.bitbucket, options);
};
AuthProvider.prototype.spotify = function (options) {
angular.extend(this.SatellizerConfig.providers.spotify, options);
};
AuthProvider.prototype.oauth1 = function (options) {
this.SatellizerConfig.providers[options.name] = angular.extend(options, {
oauthType: '1.0'
});
};
AuthProvider.prototype.oauth2 = function (options) {
this.SatellizerConfig.providers[options.name] = angular.extend(options, {
oauthType: '2.0'
});
};
AuthProvider.prototype.$get = function (SatellizerShared, SatellizerLocal, SatellizerOAuth) {
return {
login: function (user, options) { return SatellizerLocal.login(user, options); },
signup: function (user, options) { return SatellizerLocal.signup(user, options); },
logout: function () { return SatellizerShared.logout(); },
authenticate: function (name, data) { return SatellizerOAuth.authenticate(name, data); },
link: function (name, data) { return SatellizerOAuth.authenticate(name, data); },
unlink: function (name, options) { return SatellizerOAuth.unlink(name, options); },
isAuthenticated: function () { return SatellizerShared.isAuthenticated(); },
getPayload: function () { return SatellizerShared.getPayload(); },
getToken: function () { return SatellizerShared.getToken(); },
setToken: function (token) { return SatellizerShared.setToken({ access_token: token }); },
removeToken: function () { return SatellizerShared.removeToken(); },
setStorageType: function (type) { return SatellizerShared.setStorageType(type); }
};
};
AuthProvider.$inject = ['SatellizerConfig'];
return AuthProvider;
}());
AuthProvider.prototype.$get.$inject = ['SatellizerShared', 'SatellizerLocal', 'SatellizerOAuth'];
function joinUrl(baseUrl, url) {
if (/^(?:[a-z]+:)?\/\//i.test(url)) {
return url;
}
var joined = [baseUrl, url].join('/');
var normalize = function (str) {
return str
.replace(/[\/]+/g, '/')
.replace(/\/\?/g, '?')
.replace(/\/\#/g, '#')
.replace(/\:\//g, '://');
};
return normalize(joined);
}
function getFullUrlPath(location) {
var isHttps = location.protocol === 'https:';
return location.protocol + '//' + location.hostname +
':' + (location.port || (isHttps ? '443' : '80')) +
(/^\//.test(location.pathname) ? location.pathname : '/' + location.pathname);
}
function parseQueryString(str) {
var obj = {};
var key;
var value;
angular.forEach((str || '').split('&'), function (keyValue) {
if (keyValue) {
value = keyValue.split('=');
key = decodeURIComponent(value[0]);
obj[key] = angular.isDefined(value[1]) ? decodeURIComponent(value[1]) : true;
}
});
return obj;
}
function decodeBase64(str) {
var buffer;
if (typeof module !== 'undefined' && module.exports) {
try {
buffer = require('buffer').Buffer;
}
catch (err) {
}
}
var fromCharCode = String.fromCharCode;
var re_btou = new RegExp([
'[\xC0-\xDF][\x80-\xBF]',
'[\xE0-\xEF][\x80-\xBF]{2}',
'[\xF0-\xF7][\x80-\xBF]{3}'
].join('|'), 'g');
var cb_btou = function (cccc) {
switch (cccc.length) {
case 4:
var cp = ((0x07 & cccc.charCodeAt(0)) << 18)
| ((0x3f & cccc.charCodeAt(1)) << 12)
| ((0x3f & cccc.charCodeAt(2)) << 6)
| (0x3f & cccc.charCodeAt(3));
var offset = cp - 0x10000;
return (fromCharCode((offset >>> 10) + 0xD800)
+ fromCharCode((offset & 0x3FF) + 0xDC00));
case 3:
return fromCharCode(((0x0f & cccc.charCodeAt(0)) << 12)
| ((0x3f & cccc.charCodeAt(1)) << 6)
| (0x3f & cccc.charCodeAt(2)));
default:
return fromCharCode(((0x1f & cccc.charCodeAt(0)) << 6)
| (0x3f & cccc.charCodeAt(1)));
}
};
var btou = function (b) {
return b.replace(re_btou, cb_btou);
};
var _decode = buffer ? function (a) {
return (a.constructor === buffer.constructor
? a : new buffer(a, 'base64')).toString();
}
: function (a) {
return btou(atob(a));
};
return _decode(String(str).replace(/[-_]/g, function (m0) {
return m0 === '-' ? '+' : '/';
})
.replace(/[^A-Za-z0-9\+\/]/g, ''));
}
var Shared = (function () {
function Shared($q, $window, SatellizerConfig, SatellizerStorage) {
this.$q = $q;
this.$window = $window;
this.SatellizerConfig = SatellizerConfig;
this.SatellizerStorage = SatellizerStorage;
var _a = this.SatellizerConfig, tokenName = _a.tokenName, tokenPrefix = _a.tokenPrefix;
this.prefixedTokenName = tokenPrefix ? [tokenPrefix, tokenName].join('_') : tokenName;
}
Shared.prototype.getToken = function () {
return this.SatellizerStorage.get(this.prefixedTokenName);
};
Shared.prototype.getPayload = function () {
var token = this.SatellizerStorage.get(this.prefixedTokenName);
if (token && token.split('.').length === 3) {
try {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace('-', '+').replace('_', '/');
return JSON.parse(decodeBase64(base64));
}
catch (e) {
}
}
};
Shared.prototype.setToken = function (response) {
var tokenRoot = this.SatellizerConfig.tokenRoot;
var tokenName = this.SatellizerConfig.tokenName;
var accessToken = response && response.access_token;
var token;
if (accessToken) {
if (angular.isObject(accessToken) && angular.isObject(accessToken.data)) {
response = accessToken;
}
else if (angular.isString(accessToken)) {
token = accessToken;
}
}
if (!token && response) {
var tokenRootData = tokenRoot && tokenRoot.split('.').reduce(function (o, x) { return o[x]; }, response.data);
token = tokenRootData ? tokenRootData[tokenName] : response.data && response.data[tokenName];
}
if (token) {
this.SatellizerStorage.set(this.prefixedTokenName, token);
}
};
Shared.prototype.removeToken = function () {
this.SatellizerStorage.remove(this.prefixedTokenName);
};
Shared.prototype.isAuthenticated = function () {
var token = this.SatellizerStorage.get(this.prefixedTokenName);
if (token) {
if (token.split('.').length === 3) {
try {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace('-', '+').replace('_', '/');
var exp = JSON.parse(this.$window.atob(base64)).exp;
if (typeof exp === 'number') {
return Math.round(new Date().getTime() / 1000) < exp;
}
}
catch (e) {
return true; // Pass: Non-JWT token that looks like JWT
}
}
return true; // Pass: All other tokens
}
return false; // Fail: No token at all
};
Shared.prototype.logout = function () {
this.SatellizerStorage.remove(this.prefixedTokenName);
return this.$q.when();
};
Shared.prototype.setStorageType = function (type) {
this.SatellizerConfig.storageType = type;
};
Shared.$inject = ['$q', '$window', 'SatellizerConfig', 'SatellizerStorage'];
return Shared;
}());
var Local = (function () {
function Local($http, SatellizerConfig, SatellizerShared) {
this.$http = $http;
this.SatellizerConfig = SatellizerConfig;
this.SatellizerShared = SatellizerShared;
}
Local.prototype.login = function (user, options) {
var _this = this;
if (options === void 0) { options = {}; }
options.url = options.url ? options.url : joinUrl(this.SatellizerConfig.baseUrl, this.SatellizerConfig.loginUrl);
options.data = user || options.data;
options.method = options.method || 'POST';
options.withCredentials = options.withCredentials || this.SatellizerConfig.withCredentials;
return this.$http(options).then(function (response) {
_this.SatellizerShared.setToken(response);
return response;
});
};
Local.prototype.signup = function (user, options) {
if (options === void 0) { options = {}; }
options.url = options.url ? options.url : joinUrl(this.SatellizerConfig.baseUrl, this.SatellizerConfig.signupUrl);
options.data = user || options.data;
options.method = options.method || 'POST';
options.withCredentials = options.withCredentials || this.SatellizerConfig.withCredentials;
return this.$http(options);
};
Local.$inject = ['$http', 'SatellizerConfig', 'SatellizerShared'];
return Local;
}());
var Popup = (function () {
function Popup($interval, $window, $q) {
this.$interval = $interval;
this.$window = $window;
this.$q = $q;
this.popup = null;
this.defaults = {
redirectUri: null
};
}
Popup.prototype.stringifyOptions = function (options) {
var parts = [];
angular.forEach(options, function (value, key) {
parts.push(key + '=' + value);
});
return parts.join(',');
};
Popup.prototype.open = function (url, name, popupOptions, redirectUri, dontPoll) {
var width = popupOptions.width || 500;
var height = popupOptions.height || 500;
var options = this.stringifyOptions({
width: width,
height: height,
top: this.$window.screenY + ((this.$window.outerHeight - height) / 2.5),
left: this.$window.screenX + ((this.$window.outerWidth - width) / 2)
});
var popupName = this.$window['cordova'] || this.$window.navigator.userAgent.indexOf('CriOS') > -1 ? '_blank' : name;
this.popup = this.$window.open(url, popupName, options);
if (this.popup && this.popup.focus) {
this.popup.focus();
}
if (dontPoll) {
return;
}
if (this.$window['cordova']) {
return this.eventListener(redirectUri);
}
else {
if (url === 'about:blank') {
this.popup.location = url;
}
return this.polling(redirectUri);
}
};
Popup.prototype.polling = function (redirectUri) {
var _this = this;
return this.$q(function (resolve, reject) {
var redirectUriParser = document.createElement('a');
redirectUriParser.href = redirectUri;
var redirectUriPath = getFullUrlPath(redirectUriParser);
var polling = _this.$interval(function () {
if (!_this.popup || _this.popup.closed || _this.popup.closed === undefined) {
_this.$interval.cancel(polling);
reject(new Error('The popup window was closed'));
}
try {
var popupWindowPath = getFullUrlPath(_this.popup.location);
if (popupWindowPath === redirectUriPath) {
if (_this.popup.location.search || _this.popup.location.hash) {
var query = parseQueryString(_this.popup.location.search.substring(1).replace(/\/$/, ''));
var hash = parseQueryString(_this.popup.location.hash.substring(1).replace(/[\/$]/, ''));
var params = angular.extend({}, query, hash);
if (params.error) {
reject(new Error(params.error));
}
else {
resolve(params);
}
}
else {
reject(new Error('OAuth redirect has occurred but no query or hash parameters were found. ' +
'They were either not set during the redirect, or were removed—typically by a ' +
'routing library—before Satellizer could read it.'));
}
_this.$interval.cancel(polling);
_this.popup.close();
}
}
catch (error) {
}
}, 500);
});
};
Popup.prototype.eventListener = function (redirectUri) {
var _this = this;
return this.$q(function (resolve, reject) {
_this.popup.addEventListener('loadstart', function (event) {
if (event.url.indexOf(redirectUri) !== 0) {
return;
}
var parser = document.createElement('a');
parser.href = event.url;
if (parser.search || parser.hash) {
var query = parseQueryString(parser.search.substring(1).replace(/\/$/, ''));
var hash = parseQueryString(parser.hash.substring(1).replace(/[\/$]/, ''));
var params = angular.extend({}, query, hash);
if (params.error) {
reject(new Error(params.error));
}
else {
resolve(params);
}
_this.popup.close();
}
});
_this.popup.addEventListener('loaderror', function () {
reject(new Error('Authorization failed'));
});
_this.popup.addEventListener('exit', function () {
reject(new Error('The popup window was closed'));
});
});
};
Popup.$inject = ['$interval', '$window', '$q'];
return Popup;
}());
var OAuth1 = (function () {
function OAuth1($http, $window, SatellizerConfig, SatellizerPopup) {
this.$http = $http;
this.$window = $window;
this.SatellizerConfig = SatellizerConfig;
this.SatellizerPopup = SatellizerPopup;
this.defaults = {
name: null,
url: null,
authorizationEndpoint: null,
scope: null,
scopePrefix: null,
scopeDelimiter: null,
redirectUri: null,
requiredUrlParams: null,
defaultUrlParams: null,
oauthType: '1.0',
popupOptions: { width: null, height: null }
};
}
;
OAuth1.prototype.init = function (options, userData) {
var _this = this;
angular.extend(this.defaults, options);
var name = options.name, popupOptions = options.popupOptions;
var redirectUri = this.defaults.redirectUri;
// Should open an empty popup and wait until request token is received
if (!this.$window['cordova']) {
this.SatellizerPopup.open('about:blank', name, popupOptions, redirectUri, true);
}
return this.getRequestToken().then(function (response) {
return _this.openPopup(options, response).then(function (popupResponse) {
return _this.exchangeForToken(popupResponse, userData);
});
});
};
OAuth1.prototype.openPopup = function (options, response) {
var url = [options.authorizationEndpoint, this.buildQueryString(response.data)].join('?');
var redirectUri = this.defaults.redirectUri;
if (this.$window['cordova']) {
return this.SatellizerPopup.open(url, options.name, options.popupOptions, redirectUri);
}
else {
this.SatellizerPopup.popup.location = url;
return this.SatellizerPopup.polling(redirectUri);
}
};
OAuth1.prototype.getRequestToken = function () {
var url = this.SatellizerConfig.baseUrl ? joinUrl(this.SatellizerConfig.baseUrl, this.defaults.url) : this.defaults.url;
return this.$http.post(url, this.defaults);
};
OAuth1.prototype.exchangeForToken = function (oauthData, userData) {
var payload = angular.extend({}, userData, oauthData);
var exchangeForTokenUrl = this.SatellizerConfig.baseUrl ? joinUrl(this.SatellizerConfig.baseUrl, this.defaults.url) : this.defaults.url;
return this.$http.post(exchangeForTokenUrl, payload, { withCredentials: this.SatellizerConfig.withCredentials });
};
OAuth1.prototype.buildQueryString = function (obj) {
var str = [];
angular.forEach(obj, function (value, key) {
str.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
});
return str.join('&');
};
OAuth1.$inject = ['$http', '$window', 'SatellizerConfig', 'SatellizerPopup'];
return OAuth1;
}());
var OAuth2 = (function () {
function OAuth2($http, $window, $timeout, $q, SatellizerConfig, SatellizerPopup, SatellizerStorage) {
this.$http = $http;
this.$window = $window;
this.$timeout = $timeout;
this.$q = $q;
this.SatellizerConfig = SatellizerConfig;
this.SatellizerPopup = SatellizerPopup;
this.SatellizerStorage = SatellizerStorage;
this.defaults = {
name: null,
url: null,
clientId: null,
authorizationEndpoint: null,
redirectUri: null,
scope: null,
scopePrefix: null,
scopeDelimiter: null,
state: null,
requiredUrlParams: null,
defaultUrlParams: ['response_type', 'client_id', 'redirect_uri'],
responseType: 'code',
responseParams: {
code: 'code',
clientId: 'clientId',
redirectUri: 'redirectUri'
},
oauthType: '2.0',
popupOptions: { width: null, height: null }
};
}
OAuth2.camelCase = function (name) {
return name.replace(/([\:\-\_]+(.))/g, function (_, separator, letter, offset) {
return offset ? letter.toUpperCase() : letter;
});
};
OAuth2.prototype.init = function (options, userData) {
var _this = this;
return this.$q(function (resolve, reject) {
angular.extend(_this.defaults, options);
var stateName = _this.defaults.name + '_state';
var _a = _this.defaults, name = _a.name, state = _a.state, popupOptions = _a.popupOptions, redirectUri = _a.redirectUri, responseType = _a.responseType;
if (typeof state === 'function') {
_this.SatellizerStorage.set(stateName, state());
}
else if (typeof state === 'string') {
_this.SatellizerStorage.set(stateName, state);
}
var url = [_this.defaults.authorizationEndpoint, _this.buildQueryString()].join('?');
_this.SatellizerPopup.open(url, name, popupOptions, redirectUri).then(function (oauth) {
if (responseType === 'token' || !url) {
return resolve(oauth);
}
if (oauth.state && oauth.state !== _this.SatellizerStorage.get(stateName)) {
return reject(new Error('The value returned in the state parameter does not match the state value from your original ' +
'authorization code request.'));
}
resolve(_this.exchangeForToken(oauth, userData));
}).catch(function (error) { return reject(error); });
});
};
OAuth2.prototype.exchangeForToken = function (oauthData, userData) {
var _this = this;
var payload = angular.extend({}, userData);
angular.forEach(this.defaults.responseParams, function (value, key) {
switch (key) {
case 'code':
payload[value] = oauthData.code;
break;
case 'clientId':
payload[value] = _this.defaults.clientId;
break;
case 'redirectUri':
payload[value] = _this.defaults.redirectUri;
break;
default:
payload[value] = oauthData[key];
}
});
if (oauthData.state) {
payload.state = oauthData.state;
}
var exchangeForTokenUrl = this.SatellizerConfig.baseUrl ?
joinUrl(this.SatellizerConfig.baseUrl, this.defaults.url) :
this.defaults.url;
return this.$http.post(exchangeForTokenUrl, payload, { withCredentials: this.SatellizerConfig.withCredentials });
};
OAuth2.prototype.buildQueryString = function () {
var _this = this;
var keyValuePairs = [];
var urlParamsCategories = ['defaultUrlParams', 'requiredUrlParams', 'optionalUrlParams'];
angular.forEach(urlParamsCategories, function (paramsCategory) {
angular.forEach(_this.defaults[paramsCategory], function (paramName) {
var camelizedName = OAuth2.camelCase(paramName);
var paramValue = angular.isFunction(_this.defaults[paramName]) ? _this.defaults[paramName]() : _this.defaults[camelizedName];
if (paramName === 'redirect_uri' && !paramValue) {
return;
}
if (paramName === 'state') {
var stateName = _this.defaults.name + '_state';
paramValue = encodeURIComponent(_this.SatellizerStorage.get(stateName));
}
if (paramName === 'scope' && Array.isArray(paramValue)) {
paramValue = paramValue.join(_this.defaults.scopeDelimiter);
if (_this.defaults.scopePrefix) {
paramValue = [_this.defaults.scopePrefix, paramValue].join(_this.defaults.scopeDelimiter);
}
}
keyValuePairs.push([paramName, paramValue]);
});
});
return keyValuePairs.map(function (pair) { return pair.join('='); }).join('&');
};
OAuth2.$inject = ['$http', '$window', '$timeout', '$q', 'SatellizerConfig', 'SatellizerPopup', 'SatellizerStorage'];
return OAuth2;
}());
var OAuth = (function () {
function OAuth($http, $window, $timeout, $q, SatellizerConfig, SatellizerPopup, SatellizerStorage, SatellizerShared, SatellizerOAuth1, SatellizerOAuth2) {
this.$http = $http;
this.$window = $window;
this.$timeout = $timeout;
this.$q = $q;
this.SatellizerConfig = SatellizerConfig;
this.SatellizerPopup = SatellizerPopup;
this.SatellizerStorage = SatellizerStorage;
this.SatellizerShared = SatellizerShared;
this.SatellizerOAuth1 = SatellizerOAuth1;
this.SatellizerOAuth2 = SatellizerOAuth2;
}
OAuth.prototype.authenticate = function (name, userData) {
var _this = this;
return this.$q(function (resolve, reject) {
var provider = _this.SatellizerConfig.providers[name];
var oauth = null;
switch (provider.oauthType) {
case '1.0':
oauth = new OAuth1(_this.$http, _this.$window, _this.SatellizerConfig, _this.SatellizerPopup);
break;
case '2.0':
oauth = new OAuth2(_this.$http, _this.$window, _this.$timeout, _this.$q, _this.SatellizerConfig, _this.SatellizerPopup, _this.SatellizerStorage);
break;
default:
return reject(new Error('Invalid OAuth Type'));
}
return oauth.init(provider, userData).then(function (response) {
if (provider.url) {
_this.SatellizerShared.setToken(response);
}
resolve(response);
}).catch(function (error) {
reject(error);
});
});
};
OAuth.prototype.unlink = function (provider, httpOptions) {
if (httpOptions === void 0) { httpOptions = {}; }
httpOptions.url = httpOptions.url ? httpOptions.url : joinUrl(this.SatellizerConfig.baseUrl, this.SatellizerConfig.unlinkUrl);
httpOptions.data = { provider: provider } || httpOptions.data;
httpOptions.method = httpOptions.method || 'POST';
httpOptions.withCredentials = httpOptions.withCredentials || this.SatellizerConfig.withCredentials;
return this.$http(httpOptions);
};
OAuth.$inject = [
'$http',
'$window',
'$timeout',
'$q',
'SatellizerConfig',
'SatellizerPopup',
'SatellizerStorage',
'SatellizerShared',
'SatellizerOAuth1',
'SatellizerOAuth2'
];
return OAuth;
}());
var Storage = (function () {
function Storage($window, SatellizerConfig) {
this.$window = $window;
this.SatellizerConfig = SatellizerConfig;
this.memoryStore = {};
}
Storage.prototype.get = function (key) {
try {
return this.$window[this.SatellizerConfig.storageType].getItem(key);
}
catch (e) {
return this.memoryStore[key];
}
};
Storage.prototype.set = function (key, value) {
try {
this.$window[this.SatellizerConfig.storageType].setItem(key, value);
}
catch (e) {
this.memoryStore[key] = value;
}
};
Storage.prototype.remove = function (key) {
try {
this.$window[this.SatellizerConfig.storageType].removeItem(key);
}
catch (e) {
delete this.memoryStore[key];
}
};
Storage.$inject = ['$window', 'SatellizerConfig'];
return Storage;
}());
var Interceptor = (function () {
function Interceptor(SatellizerConfig, SatellizerShared, SatellizerStorage) {
var _this = this;
this.SatellizerConfig = SatellizerConfig;
this.SatellizerShared = SatellizerShared;
this.SatellizerStorage = SatellizerStorage;
this.request = function (config) {
if (config['skipAuthorization']) {
return config;
}
if (_this.SatellizerShared.isAuthenticated() && _this.SatellizerConfig.httpInterceptor()) {
var tokenName = _this.SatellizerConfig.tokenPrefix ?
[_this.SatellizerConfig.tokenPrefix, _this.SatellizerConfig.tokenName].join('_') : _this.SatellizerConfig.tokenName;
var token = _this.SatellizerStorage.get(tokenName);
if (_this.SatellizerConfig.tokenHeader && _this.SatellizerConfig.tokenType) {
token = _this.SatellizerConfig.tokenType + ' ' + token;
}
config.headers[_this.SatellizerConfig.tokenHeader] = token;
}
return config;
};
}
Interceptor.Factory = function (SatellizerConfig, SatellizerShared, SatellizerStorage) {
return new Interceptor(SatellizerConfig, SatellizerShared, SatellizerStorage);
};
Interceptor.$inject = ['SatellizerConfig', 'SatellizerShared', 'SatellizerStorage'];
return Interceptor;
}());
Interceptor.Factory.$inject = ['SatellizerConfig', 'SatellizerShared', 'SatellizerStorage'];
var HttpProviderConfig = (function () {
function HttpProviderConfig($httpProvider) {
this.$httpProvider = $httpProvider;
$httpProvider.interceptors.push(Interceptor.Factory);
}
HttpProviderConfig.$inject = ['$httpProvider'];
return HttpProviderConfig;
}());
angular.module('satellizer', [])
.provider('$auth', ['SatellizerConfig', function (SatellizerConfig) { return new AuthProvider(SatellizerConfig); }])
.constant('SatellizerConfig', Config.getConstant)
.service('SatellizerShared', Shared)
.service('SatellizerLocal', Local)
.service('SatellizerPopup', Popup)
.service('SatellizerOAuth', OAuth)
.service('SatellizerOAuth2', OAuth2)
.service('SatellizerOAuth1', OAuth1)
.service('SatellizerStorage', Storage)
.service('SatellizerInterceptor', Interceptor)
.config(['$httpProvider', function ($httpProvider) { return new HttpProviderConfig($httpProvider); }]);
var ng1 = 'satellizer';
return ng1;
}));
//# sourceMappingURL=satellizer.js.map
================================================
FILE: examples/client/app.js
================================================
angular.module('MyApp', ['ngResource', 'ngMessages', 'ngAnimate', 'toastr', 'ui.router', 'satellizer'])
.config(function($stateProvider, $urlRouterProvider, $authProvider) {
/**
* Helper auth functions
*/
var skipIfLoggedIn = ['$q', '$auth', function($q, $auth) {
var deferred = $q.defer();
if ($auth.isAuthenticated()) {
deferred.reject();
} else {
deferred.resolve();
}
return deferred.promise;
}];
var loginRequired = ['$q', '$location', '$auth', function($q, $location, $auth) {
var deferred = $q.defer();
if ($auth.isAuthenticated()) {
deferred.resolve();
} else {
$location.path('/login');
}
return deferred.promise;
}];
/**
* App routes
*/
$stateProvider
.state('home', {
url: '/',
controller: 'HomeCtrl',
templateUrl: 'partials/home.html'
})
.state('login', {
url: '/login',
templateUrl: 'partials/login.html',
controller: 'LoginCtrl',
resolve: {
skipIfLoggedIn: skipIfLoggedIn
}
})
.state('signup', {
url: '/signup',
templateUrl: 'partials/signup.html',
controller: 'SignupCtrl',
resolve: {
skipIfLoggedIn: skipIfLoggedIn
}
})
.state('logout', {
url: '/logout',
template: null,
controller: 'LogoutCtrl'
})
.state('profile', {
url: '/profile',
templateUrl: 'partials/profile.html',
controller: 'ProfileCtrl',
resolve: {
loginRequired: loginRequired
}
});
$urlRouterProvider.otherwise('/');
/**
* Satellizer config
*/
$authProvider.facebook({
clientId: '603122136500203'
});
$authProvider.google({
clientId: 'YOUR_GOOGLE_CLIENT_ID'
});
$authProvider.github({
clientId: 'YOUR_GITHUB_CLIENT_ID'
});
$authProvider.linkedin({
clientId: 'YOUR_LINKEDIN_CLIENT_ID'
});
$authProvider.instagram({
clientId: 'YOUR_INSTAGRAM_CLIENT_ID'
});
$authProvider.yahoo({
clientId: 'YOUR_YAHOO_CLIENT_ID'
});
$authProvider.live({
clientId: 'YOUR_MICROSOFT_CLIENT_ID'
});
$authProvider.twitch({
clientId: 'YOUR_TWITCH_CLIENT_ID'
});
$authProvider.bitbucket({
clientId: 'YOUR_BITBUCKET_CLIENT_ID'
});
$authProvider.spotify({
clientId: 'YOUR_SPOTIFY_CLIENT_ID'
});
$authProvider.twitter({
url: '/auth/twitter'
});
$authProvider.oauth2({
name: 'foursquare',
url: '/auth/foursquare',
clientId: 'MTCEJ3NGW2PNNB31WOSBFDSAD4MTHYVAZ1UKIULXZ2CVFC2K',
redirectUri: window.location.origin || window.location.protocol + '//' + window.location.host,
authorizationEndpoint: 'https://foursquare.com/oauth2/authenticate'
});
});
================================================
FILE: examples/client/controllers/home.js
================================================
angular.module('MyApp')
.controller('HomeCtrl', function($scope, $http) {
$http.jsonp('https://api.github.com/repos/sahat/satellizer?callback=JSON_CALLBACK')
.success(function(data) {
if (data) {
if (data.data.stargazers_count) {
$scope.stars = data.data.stargazers_count;
}
if (data.data.forks) {
$scope.forks = data.data.forks;
}
if (data.data.open_issues) {
$scope.issues = data.data.open_issues;
}
}
});
});
================================================
FILE: examples/client/controllers/login.js
================================================
angular.module('MyApp')
.controller('LoginCtrl', function($scope, $location, $auth, toastr) {
$scope.login = function() {
$auth.login($scope.user)
.then(function() {
toastr.success('You have successfully signed in!');
$location.path('/');
})
.catch(function(error) {
toastr.error(error.data.message, error.status);
});
};
$scope.authenticate = function(provider) {
$auth.authenticate(provider)
.then(function() {
toastr.success('You have successfully signed in with ' + provider + '!');
$location.path('/');
})
.catch(function(error) {
if (error.message) {
// Satellizer promise reject error.
toastr.error(error.message);
} else if (error.data) {
// HTTP response error from server
toastr.error(error.data.message, error.status);
} else {
toastr.error(error);
}
});
};
});
================================================
FILE: examples/client/controllers/logout.js
================================================
angular.module('MyApp')
.controller('LogoutCtrl', function($location, $auth, toastr) {
if (!$auth.isAuthenticated()) { return; }
$auth.logout()
.then(function() {
toastr.info('You have been logged out');
$location.path('/');
});
});
================================================
FILE: examples/client/controllers/navbar.js
================================================
angular.module('MyApp')
.controller('NavbarCtrl', function($scope, $auth) {
$scope.isAuthenticated = function() {
return $auth.isAuthenticated();
};
});
================================================
FILE: examples/client/controllers/profile.js
================================================
angular.module('MyApp')
.controller('ProfileCtrl', function($scope, $auth, toastr, Account) {
$scope.getProfile = function() {
Account.getProfile()
.then(function(response) {
$scope.user = response.data;
})
.catch(function(response) {
toastr.error(response.data.message, response.status);
});
};
$scope.updateProfile = function() {
Account.updateProfile($scope.user)
.then(function() {
toastr.success('Profile has been updated');
})
.catch(function(response) {
toastr.error(response.data.message, response.status);
});
};
$scope.link = function(provider) {
$auth.link(provider)
.then(function() {
toastr.success('You have successfully linked a ' + provider + ' account');
$scope.getProfile();
})
.catch(function(response) {
toastr.error(response.data.message, response.status);
});
};
$scope.unlink = function(provider) {
$auth.unlink(provider)
.then(function() {
toastr.info('You have unlinked a ' + provider + ' account');
$scope.getProfile();
})
.catch(function(response) {
toastr.error(response.data ? response.data.message : 'Could not unlink ' + provider + ' account', response.status);
});
};
$scope.getProfile();
});
================================================
FILE: examples/client/controllers/signup.js
================================================
angular.module('MyApp')
.controller('SignupCtrl', function($scope, $location, $auth, toastr) {
$scope.signup = function() {
$auth.signup($scope.user)
.then(function(response) {
$auth.setToken(response);
$location.path('/');
toastr.info('You have successfully created a new account and have been signed-in');
})
.catch(function(response) {
toastr.error(response.data.message);
});
};
});
================================================
FILE: examples/client/directives/passwordMatch.js
================================================
angular.module('MyApp')
.directive('passwordMatch', function() {
return {
require: 'ngModel',
scope: {
otherModelValue: '=passwordMatch'
},
link: function(scope, element, attributes, ngModel) {
ngModel.$validators.compareTo = function(modelValue) {
return modelValue === scope.otherModelValue;
};
scope.$watch('otherModelValue', function() {
ngModel.$validate();
});
}
};
});
================================================
FILE: examples/client/directives/passwordStrength.js
================================================
angular.module('MyApp')
.directive('passwordStrength', function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
var indicator = element.children();
var dots = Array.prototype.slice.call(indicator.children());
var weakest = dots.slice(-1)[0];
var weak = dots.slice(-2);
var strong = dots.slice(-3);
var strongest = dots.slice(-4);
element.after(indicator);
element.bind('keyup', function() {
var matches = {
positive: {},
negative: {}
},
counts = {
positive: {},
negative: {}
},
tmp,
strength = 0,
letters = 'abcdefghijklmnopqrstuvwxyz',
numbers = '01234567890',
symbols = '\\!@#$%&/()=?¿',
strValue;
angular.forEach(dots, function(el) {
el.style.backgroundColor = '#ebeef1';
});
if (ngModel.$viewValue) {
// Increase strength level
matches.positive.lower = ngModel.$viewValue.match(/[a-z]/g);
matches.positive.upper = ngModel.$viewValue.match(/[A-Z]/g);
matches.positive.numbers = ngModel.$viewValue.match(/\d/g);
matches.positive.symbols = ngModel.$viewValue.match(/[$-/:-?{-~!^_`\[\]]/g);
matches.positive.middleNumber = ngModel.$viewValue.slice(1, -1).match(/\d/g);
matches.positive.middleSymbol = ngModel.$viewValue.slice(1, -1).match(/[$-/:-?{-~!^_`\[\]]/g);
counts.positive.lower = matches.positive.lower ? matches.positive.lower.length : 0;
counts.positive.upper = matches.positive.upper ? matches.positive.upper.length : 0;
counts.positive.numbers = matches.positive.numbers ? matches.positive.numbers.length : 0;
counts.positive.symbols = matches.positive.symbols ? matches.positive.symbols.length : 0;
counts.positive.numChars = ngModel.$viewValue.length;
tmp += (counts.positive.numChars >= 8) ? 1 : 0;
counts.positive.requirements = (tmp >= 3) ? tmp : 0;
counts.positive.middleNumber = matches.positive.middleNumber ? matches.positive.middleNumber.length : 0;
counts.positive.middleSymbol = matches.positive.middleSymbol ? matches.positive.middleSymbol.length : 0;
// Decrease strength level
matches.negative.consecLower = ngModel.$viewValue.match(/(?=([a-z]{2}))/g);
matches.negative.consecUpper = ngModel.$viewValue.match(/(?=([A-Z]{2}))/g);
matches.negative.consecNumbers = ngModel.$viewValue.match(/(?=(\d{2}))/g);
matches.negative.onlyNumbers = ngModel.$viewValue.match(/^[0-9]*$/g);
matches.negative.onlyLetters = ngModel.$viewValue.match(/^([a-z]|[A-Z])*$/g);
counts.negative.consecLower = matches.negative.consecLower ? matches.negative.consecLower.length : 0;
counts.negative.consecUpper = matches.negative.consecUpper ? matches.negative.consecUpper.length : 0;
counts.negative.consecNumbers = matches.negative.consecNumbers ? matches.negative.consecNumbers.length : 0;
// Calculations
strength += counts.positive.numChars * 4;
if (counts.positive.upper) {
strength += (counts.positive.numChars - counts.positive.upper) * 2;
}
if (counts.positive.lower) {
strength += (counts.positive.numChars - counts.positive.lower) * 2;
}
if (counts.positive.upper || counts.positive.lower) {
strength += counts.positive.numbers * 4;
}
strength += counts.positive.symbols * 6;
strength += (counts.positive.middleSymbol + counts.positive.middleNumber) * 2;
strength += counts.positive.requirements * 2;
strength -= counts.negative.consecLower * 2;
strength -= counts.negative.consecUpper * 2;
strength -= counts.negative.consecNumbers * 2;
if (matches.negative.onlyNumbers) {
strength -= counts.positive.numChars;
}
if (matches.negative.onlyLetters) {
strength -= counts.positive.numChars;
}
strength = Math.max(0, Math.min(100, Math.round(strength)));
if (strength > 85) {
angular.forEach(strongest, function(el) {
el.style.backgroundColor = '#008cdd';
});
} else if (strength > 65) {
angular.forEach(strong, function(el) {
el.style.backgroundColor = '#6ead09';
});
} else if (strength > 30) {
angular.forEach(weak, function(el) {
el.style.backgroundColor = '#e09115';
});
} else {
weakest.style.backgroundColor = '#e01414';
}
}
});
},
template: '<span class="password-strength-indicator"><span></span><span></span><span></span><span></span></span>'
};
});
================================================
FILE: examples/client/index.html
================================================
<!DOCTYPE html>
<html ng-app="MyApp">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Satellizer</title>
<link href="favicon.png" rel="shortcut icon">
<link href="//fonts.googleapis.com/css?family=Roboto|Montserrat:400,700|Open+Sans:400,300,600" rel="stylesheet">
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">
<link href="//code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css" rel="stylesheet">
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet">
<link href="//cdn.jsdelivr.net/animatecss/3.2.0/animate.css" rel="stylesheet">
<link href="/stylesheets/angular-toastr.css" rel="stylesheet">
<link href="/stylesheets/styles.css" rel="stylesheet">
</head>
<body>
<div ng-controller="NavbarCtrl" class="navbar navbar-default navbar-static-top">
<div class="navbar-header">
<a class="navbar-brand" href="/"><i class="ion-ios7-pulse-strong"></i> Satellizer</a>
</div>
<ul class="nav navbar-nav">
<li><a href="/#/">Home</a></li>
<li ng-if="isAuthenticated()"><a href="/#/profile">Profile</a></li>
</ul>
<ul ng-if="!isAuthenticated()" class="nav navbar-nav pull-right">
<li><a href="/#/login">Login</a></li>
<li><a href="/#/signup">Sign up</a></li>
</ul>
<ul ng-if="isAuthenticated()" class="nav navbar-nav pull-right">
<li><a href="/#/logout">Logout</a></li>
</ul>
</div>
<div ui-view></div>
<!-- Third-party Libraries -->
<script src="/vendor/angular.js"></script>
<script src="/vendor/angular-animate.js"></script>
<script src="/vendor/angular-messages.js"></script>
<script src="/vendor/angular-resource.js"></script>
<script src="/vendor/angular-sanitize.js"></script>
<script src="/vendor/angular-ui-router.js"></script>
<script src="/vendor/angular-toastr.tpls.js"></script>
<script src="/vendor/satellizer.js"></script>
<!-- Application Code -->
<script src="/app.js"></script>
<script src="/directives/passwordStrength.js"></script>
<script src="/directives/passwordMatch.js"></script>
<script src="/controllers/home.js"></script>
<script src="/controllers/login.js"></script>
<script src="/controllers/signup.js"></script>
<script src="/controllers/logout.js"></script>
<script src="/controllers/profile.js"></script>
<script src="/controllers/navbar.js"></script>
<script src="/services/account.js"></script>
</body>
</html>
================================================
FILE: examples/client/partials/home.html
================================================
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">Home Page</div>
<div class="panel-body">
<div class="row">
<div class="col-sm-6">
<h2>Heading</h2>
<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus,
tellus ac cursus commodo, tortor mauris condimentum nibh, ut
fermentum massa justo sit amet risus. Etiam porta sem malesuada
magna mollis euismod. Donec sed odio dui.</p>
<p><a class="btn btn-primary" href="#">View details »</a></p>
</div>
<div class="col-sm-6">
<h2>Heading</h2>
<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus,
tellus ac cursus commodo, tortor mauris condimentum nibh, ut
fermentum massa justo sit amet risus. Etiam porta sem malesuada
magna mollis euismod. Donec sed odio dui.</p>
<p><a class="btn btn-primary" href="#">View details »</a></p>
</div>
</div>
</div>
<div class="panel-footer text-center">
<ul class="list-inline">
<li><i class="ion-star"></i> {{stars | number}} stars</li>
<li><i class="ion-fork-repo"></i> {{forks | number}} forks</li>
<li><i class="ion-pull-request"></i> {{issues | number}} issues</li>
</ul>
</div>
</div>
</div>
<div class="text-center">
<a class="btn btn-default" href="https://github.com/sahat/satellizer"><i class="ion-social-github"></i> GitHub project</a>
<a class="btn btn-default" href="https://github.com/sahat/satellizer/issues/new"><i class="ion-bug"></i> Report issue</a>
</div>
</div>
================================================
FILE: examples/client/partials/login.html
================================================
<div class="container">
<div class="row">
<div class="center-form panel">
<div class="panel-body">
<h2 class="text-center">Log in</h2>
<form method="post" ng-submit="login()" name="loginForm">
<div class="form-group has-feedback">
<input class="form-control input-lg" type="text" name="email" ng-model="user.email" placeholder="Email" required autofocus>
<span class="ion-at form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<input class="form-control input-lg" type="password" name="password" ng-model="user.password" placeholder="Password" required>
<span class="ion-key form-control-feedback"></span>
</div>
<button type="submit" ng-disabled="loginForm.$invalid" class="btn btn-lg btn-block btn-success">Log in</button>
<br/>
<p class="text-center text-muted">
<small>Don't have an account yet? <a href="/#/signup">Sign up</a></small>
</p>
<div class="signup-or-separator">
<h6 class="text">or</h6>
<hr>
</div>
</form>
<button class="btn btn-block btn-facebook" ng-click="authenticate('facebook')">
<i class="ion-social-facebook"></i> Sign in with Facebook
</button>
<button class="btn btn-block btn-google-plus" ng-click="authenticate('google')">
<span class="ion-social-googleplus"></span>Sign in with Google
</button>
<button class="btn btn-block btn-linkedin" ng-click="authenticate('linkedin')">
<i class="ion-social-linkedin"></i> Sign in with LinkedIn
</button>
<button class="btn btn-block btn-instagram" ng-click="authenticate('instagram')">
<i class="ion-social-instagram"></i> Sign in with Instagram
</button>
<button class="btn btn-block btn-twitter" ng-click="authenticate('twitter')">
<i class="ion-social-twitter"></i> Sign in with Twitter
</button>
<button class="btn btn-block btn-foursquare" ng-click="authenticate('foursquare')">
<i class="fa fa-foursquare"></i> Sign in with Foursquare
</button>
<button class="btn btn-block btn-github" ng-click="authenticate('github')">
<i class="ion-social-github"></i> Sign in with GitHub
</button>
<button class="btn btn-block btn-bitbucket" ng-click="authenticate('bitbucket')">
<i class="fa fa-bitbucket"></i> Sign in with Bitbucket
</button>
<button class="btn btn-block btn-yahoo" ng-click="authenticate('yahoo')">
<i class="ion-social-yahoo"></i> Sign in with Yahoo
</button>
<button class="btn btn-block btn-live" ng-click="authenticate('live')">
<i class="ion-social-windows"></i> Sign in with Windows Live
</button>
<button class="btn btn-block btn-twitch" ng-click="authenticate('twitch')">
<i class="ion-social-twitch"></i> Sign in with Twitch
</button>
<button class="btn btn-block btn-spotify" ng-click="authenticate('spotify')">
<i class="fa fa-spotify"></i> Sign in with Spotify
</button>
</div>
</div>
</div>
</div>
================================================
FILE: examples/client/partials/profile.html
================================================
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">Profile</div>
<div class="panel-body">
<legend><i class="ion-clipboard"></i> Edit My Profile</legend>
<form method="post" ng-submit="updateProfile()">
<div class="form-group">
<label class="control-label">Profile Picture</label>
<img class="profile-picture" ng-src="{{user.picture || 'https://placehold.it/100x100'}}">
</div>
<div class="form-group">
<label class="control-label"><i class="ion-person"></i> Display Name</label>
<input type="text" class="form-control" ng-model="user.displayName" />
</div>
<div class="form-group">
<label class="control-label"><i class="ion-at"></i> Email Address</label>
<input type="email" class="form-control" ng-model="user.email" />
</div>
<button class="btn btn-lg btn-success">Update Information</button>
</form>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">Accounts</div>
<div class="panel-body">
<legend><i class="ion-link"></i> Linked Accounts</legend>
<div class="btn-group-vertical">
<button class="btn btn-sm btn-danger" ng-if="user.facebook" ng-click="unlink('facebook')">
<i class="ion-social-facebook"></i> Unlink Facebook Account
</button>
<button class="btn btn-sm btn-primary" ng-if="!user.facebook" ng-click="link('facebook')">
<i class="ion-social-facebook"></i> Link Facebook Account
</button>
<button class="btn btn-sm btn-danger" ng-if="user.google" ng-click="unlink('google')">
<i class="ion-social-googleplus"></i> Unlink Google Account
</button>
<button class="btn btn-sm btn-primary" ng-if="!user.google" ng-click="link('google')">
<i class="ion-social-googleplus"></i> Link Google Account
</button>
<button class="btn btn-sm btn-danger" ng-if="user.linkedin" ng-click="unlink('linkedin')">
<i class="ion-social-linkedin"></i> Unlink LinkedIn Account
</button>
<button class="btn btn-sm btn-primary" ng-if="!user.linkedin" ng-click="link('linkedin')">
<i class="ion-social-linkedin"></i> Link LinkedIn Account
</button>
<button class="btn btn-sm btn-danger" ng-if="user.twitter" ng-click="unlink('twitter')">
<i class="ion-social-twitter"></i> Unlink Twitter Account
</button>
<button class="btn btn-sm btn-primary" ng-if="!user.twitter" ng-click="link('twitter')">
<i class="ion-social-twitter"></i> Link Twitter Account
</button>
<button class="btn btn-sm btn-danger" ng-if="user.github" ng-click="unlink('github')">
<i class="ion-social-github"></i> Unlink GitHub Account
</button>
<button class="btn btn-sm btn-primary" ng-if="!user.github" ng-click="link('github')">
<i class="ion-social-github"></i> Link GitHub Account
</button>
<button class="btn btn-sm btn-danger" ng-if="user.instagram" ng-click="unlink('instagram')">
<i class="ion-social-instagram"></i> Unlink Instagram Account
</button>
<button class="btn btn-sm btn-primary" ng-if="!user.instagram" ng-click="link('instagram')">
<i class="ion-social-instagram"></i> Link Instagram Account
</button>
<button class="btn btn-sm btn-danger" ng-if="user.foursquare" ng-click="unlink('foursquare')">
<i class="ion-social-foursquare"></i> Unlink Foursquare Account
</button>
<button class="btn btn-sm btn-primary" ng-if="!user.foursquare" ng-click="link('foursquare')">
<i class="ion-social-foursquare"></i> Link Foursquare Account
</button>
<button class="btn btn-sm btn-danger" ng-if="user.yahoo" ng-click="unlink('yahoo')">
<i class="ion-social-yahoo"></i> Unlink Yahoo Account
</button>
<button class="btn btn-sm btn-primary" ng-if="!user.yahoo" ng-click="link('yahoo')">
<i class="ion-social-yahoo"></i> Link Yahoo Account
</button>
<button class="btn btn-sm btn-danger" ng-if="user.live" ng-click="unlink('live')">
<i class="ion-social-windows"></i> Unlink Windows Live Account
</button>
<button class="btn btn-sm btn-primary" ng-if="!user.live" ng-click="link('live')">
<i class="ion-social-windows"></i> Link Windows Live Account
</button>
<button class="btn btn-sm btn-danger" ng-if="user.twitch" ng-click="unlink('twitch')">
<i class="ion-social-twitch"></i> Unlink Twitch Account
</button>
<button class="btn btn-sm btn-primary" ng-if="!user.twitch" ng-click="link('twitch')">
<i class="ion-social-twitch"></i> Link Twitch Account
</button>
<button class="btn btn-sm btn-danger" ng-if="user.bitbucket" ng-click="unlink('bitbucket')">
<i class="fa fa-bitbucket"></i> Unlink Bitbucket Account
</button>
<button class="btn btn-sm btn-primary" ng-if="!user.bitbucket" ng-click="link('bitbucket')">
<i class="fa fa-bitbucket"></i> Link Bitbucket Account
</button>
<button class="btn btn-sm btn-danger" ng-if="user.spotify" ng-click="unlink('spotify')">
<i class="fa fa-spotify"></i> Unlink Spotify Account
</button>
<button class="btn btn-sm btn-primary" ng-if="!user.spotify" ng-click="link('spotify')">
<i class="fa fa-spotify"></i> Link Spotify Account
</button>
</div>
</div>
</div>
</div>
================================================
FILE: examples/client/partials/signup.html
================================================
<div class="container">
<div class="row">
<div class="center-form panel">
<div class="panel-body">
<h2 class="text-center">Sign up</h2>
<form method="post" ng-submit="signup()" name="signupForm">
<div class="form-group has-feedback" ng-class="{ 'has-error' : signupForm.displayName.$invalid && signupForm.displayName.$dirty }">
<input class="form-control input-lg" type="text" name="displayName" ng-model="user.displayName" placeholder="Name" required autofocus>
<span class="ion-person form-control-feedback"></span>
<div class="help-block text-danger" ng-if="signupForm.displayName.$dirty" ng-messages="signupForm.displayName.$error">
<div ng-message="required">You must enter your name.</div>
</div>
</div>
<div class="form-group has-feedback" ng-class="{ 'has-error' : signupForm.email.$invalid && signupForm.email.$dirty }">
<input class="form-control input-lg" type="email" id="email" name="email" ng-model="user.email" placeholder="Email" required>
<span class="ion-at form-control-feedback"></span>
<div class="help-block text-danger" ng-if="signupForm.email.$dirty" ng-messages="signupForm.email.$error">
<div ng-message="required">Your email address is required.</div>
<div ng-message="pattern">Your email address is invalid.</div>
</div>
</div>
<div class="form-group has-feedback" ng-class="{ 'has-error' : signupForm.password.$invalid && signupForm.password.$dirty }">
<input password-strength class="form-control input-lg" type="password" name="password" ng-model="user.password" placeholder="Password" required>
<span class="ion-key form-control-feedback"></span>
<div class="help-block text-danger" ng-if="signupForm.password.$dirty" ng-messages="signupForm.password.$error">
<div ng-message="required">Password is required.</div>
</div>
</div>
<div class="form-group has-feedback" ng-class="{ 'has-error' : signupForm.confirmPassword.$invalid && signupForm.confirmPassword.$dirty }">
<input password-match="user.password" class="form-control input-lg" type="password" name="confirmPassword" ng-model="confirmPassword" placeholder="Confirm Password">
<span class="ion-key form-control-feedback"></span>
<div class="help-block text-danger" ng-if="signupForm.confirmPassword.$dirty" ng-messages="signupForm.confirmPassword.$error">
<div ng-message="compareTo">Password must match.</div>
</div>
</div>
<p class="text-center text-muted"><small>By clicking on Sign up, you agree to <a href="#">terms & conditions</a> and <a href="#">privacy policy</a></small></p>
<button type="submit" ng-disabled="signupForm.$invalid" class="btn btn-lg btn-block btn-primary">Sign up</button>
<br/>
<p class="text-center text-muted">Already have an account? <a href="/#/login">Log in now</a></p>
</form>
</div>
</div>
</div>
</div>
================================================
FILE: examples/client/services/account.js
================================================
angular.module('MyApp')
.factory('Account', function($http) {
return {
getProfile: function() {
return $http.get('/api/me');
},
updateProfile: function(profileData) {
return $http.put('/api/me', profileData);
}
};
});
================================================
FILE: examples/client/stylesheets/angular-toastr.css
================================================
.toast-title {
font-weight: bold;
}
.toast-message {
word-wrap: break-word;
}
.toast-message a,
.toast-message label {
color: #ffffff;
}
.toast-message a:hover {
color: #cccccc;
text-decoration: none;
}
.toast-close-button {
position: relative;
right: -0.3em;
top: -0.3em;
float: right;
font-size: 20px;
font-weight: bold;
color: #ffffff;
-webkit-text-shadow: 0 1px 0 #ffffff;
text-shadow: 0 1px 0 #ffffff;
opacity: 0.8;
}
.toast-close-button:hover,
.toast-close-button:focus {
color: #000000;
text-decoration: none;
cursor: pointer;
opacity: 0.4;
}
/*Additional properties for button version
iOS requires the button element instead of an anchor tag.
If you want the anchor version, it requires `href="#"`.*/
button.toast-close-button {
padding: 0;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
}
.toast-top-center {
top: 0;
right: 0;
width: 100%;
}
.toast-bottom-center {
bottom: 0;
right: 0;
width: 100%;
}
.toast-top-full-width {
top: 0;
right: 0;
width: 100%;
}
.toast-bottom-full-width {
bottom: 0;
right: 0;
width: 100%;
}
.toast-top-left {
top: 12px;
left: 12px;
}
.toast-top-right {
top: 12px;
right: 12px;
}
.toast-bottom-right {
right: 12px;
bottom: 12px;
}
.toast-bottom-left {
bottom: 12px;
left: 12px;
}
#toast-container {
position: fixed;
z-index: 999999;
/*overrides*/
}
#toast-container * {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
#toast-container > div {
position: relative;
overflow: hidden;
margin: 0 0 6px;
padding: 15px 15px 15px 50px;
width: 300px;
-moz-border-radius: 3px 3px 3px 3px;
-webkit-border-radius: 3px 3px 3px 3px;
border-radius: 3px 3px 3px 3px;
background-position: 15px center;
background-repeat: no-repeat;
-moz-box-shadow: 0 0 12px #999999;
-webkit-box-shadow: 0 0 12px #999999;
box-shadow: 0 0 12px #999999;
color: #ffffff;
opacity: 0.8;
}
#toast-container > :hover {
-moz-box-shadow: 0 0 12px #000000;
-webkit-box-shadow: 0 0 12px #000000;
box-shadow: 0 0 12px #000000;
opacity: 1;
cursor: pointer;
}
#toast-container > .toast-info {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important;
}
#toast-container > .toast-error {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important;
}
#toast-container > .toast-success {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important;
}
#toast-container > .toast-warning {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important;
}
#toast-container.toast-top-center > div,
#toast-container.toast-bottom-center > div {
width: 300px;
margin: auto;
}
#toast-container.toast-top-full-width > div,
#toast-container.toast-bottom-full-width > div {
width: 96%;
margin: auto;
}
.toast {
background-color: #030303;
}
.toast-success {
background-color: #51a351;
}
.toast-error {
background-color: #bd362f;
}
.toast-info {
background-color: #2f96b4;
}
.toast-warning {
background-color: #f89406;
}
.toast-progress {
position: absolute;
left: 0;
bottom: 0;
height: 4px;
background-color: #000000;
opacity: 0.4;
}
/*Animations*/
.toast {
opacity: 1 !important;
}
.toast.ng-enter {
opacity: 0 !important;
transition: opacity .3s linear;
}
.toast.ng-enter.ng-enter-active {
opacity: 1 !important;
}
.toast.ng-leave {
opacity: 1;
transition: opacity .3s linear;
}
.toast.ng-leave.ng-leave-active {
opacity: 0 !important;
}
/*Responsive Design*/
@media all and (max-width: 240px) {
#toast-container > div {
padding: 8px 8px 8px 50px;
width: 11em;
}
#toast-container .toast-close-button {
right: -0.2em;
top: -0.2em;
}
}
@media all and (min-width: 241px) and (max-width: 480px) {
#toast-container > div {
padding: 8px 8px 8px 50px;
width: 18em;
}
#toast-container .toast-close-button {
right: -0.2em;
top: -0.2em;
}
}
@media all and (min-width: 481px) and (max-width: 768px) {
#toast-container > div {
padding: 15px 15px 15px 50px;
width: 25em;
}
}
================================================
FILE: examples/client/stylesheets/styles.css
================================================
body {
font-family: 'Open Sans', sans-serif;
background: #e4e7ec;
}
h1, h2, h3, h4, h5, h6 {
font-family: 'Montserrat', sans-serif;
font-weight: bold;
}
a {
color: #000;
}
ul {
margin-bottom: 0;
}
.list-inline > li {
padding-left: 15px;
padding-right: 15px;
}
.text-muted {
color: #90939a;
}
.navbar {
border: 0;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .26);
}
.navbar-header {
float: left;
padding-left: 15px;
}
.navbar-nav {
float: left;
margin: 0;
}
.navbar-nav > li {
float: left;
}
.navbar-nav > li > a {
padding: 15px;
}
.navbar-default {
color: #fff;
background: #fff;
}
.navbar-default .navbar-brand {
color: #333;
background-color: #ffe939;
}
.navbar-default .navbar-brand:hover {
color: #ffe939;
background-color: #333;
}
.navbar-brand {
margin-left: -15px;
transition: 0.25s all;
}
.panel {
border-color: #cfd9D7;
border-radius: 2px;
box-shadow: 0 8px 17px rgba(0, 0, 0, .2);
}
.panel-default > .panel-heading {
font-size: 85%;
font-weight: bold;
color: #444;
text-transform: uppercase;
background-color: #f6f6f6;
border-color: #cfd9db;
}
.form-control {
border-radius: 0;
}
.center-form {
width: 330px;
margin: 12% auto;
}
.signup-or-separator {
position: relative;
height: 34px;
text-align: center;
background: none;
}
.signup-or-separator hr {
width: 90%;
margin: -16px auto 10px auto;
border-top: 1px solid #dce0e0;
}
.signup-or-separator .text {
display: inline-block;
padding: 8px;
margin: 0;
background-color: #fff;
}
.has-feedback .form-control-feedback {
top: 0;
left: 0;
width: 46px;
height: 46px;
line-height: 46px;
color: #555;
}
.password-strength-indicator {
position: absolute;
top: 10px;
right: 0;
width: 5px;
padding: 0 15px;
}
.password-strength-indicator span {
display: block;
width: 5px;
height: 5px;
margin-bottom: 2px;
background: #ebeef1;
border-radius: 5px;
}
[class^='ion-'] {
font-size: 1.2em;
}
.has-feedback .form-control {
padding-left: 42.5px;
}
.alert-material {
position: fixed;
right: 12px;
bottom: 12px;
z-index: 1;
display: inline-block;
min-height: 48px;
padding: 13px 24px 12px;
font-family: 'Roboto', sans-serif;
color: #f1f1f1;
cursor: default;
background: #323232;
border-radius: 2px;
outline: none;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
}
.profile-picture {
height: 100px;
display: block;
}
.btn {
font-weight: bold;
border-radius: 2px;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .26);
}
.btn-primary {
background-color: #4285f4;
}
.btn-primary:hover {
background-color: #3367d6;
}
.btn-success {
background-color: #0f9d58;
}
.btn-success:hover {
background-color: #196c4a;
}
.btn-danger {
background-color: #db4437;
}
.btn-danger:hover {
background-color: #b04c3b;
}
.btn-group-vertical .btn {
margin-bottom: 10px;
}
.btn-group-vertical > .btn:first-child:not(:last-child) {
border-radius: 2px;
}
.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
border-radius: 2px;
}
.btn-group-vertical > .btn:last-child:not(:first-child) {
border-radius: 2px;
}
.btn-lg {
font-size: 14px;
}
.btn [class^='ion-'] {
margin-right: 5px;
}
.btn .fa {
margin-right: 5px;
}
/*********************
* Social Buttons
*********************/
.btn-google-plus {
color: #fff;
background-color: #dd4b39;
border: 1px solid #d54331;
}
.btn-google-plus:hover,
.btn-google-plus:focus {
color: #fff;
background-color: #cb3927;
}
.btn-facebook {
color: #fff;
background-color: #3b5998;
border: 1px solid #335190;
}
.btn-facebook:hover,
.btn-facebook:focus {
color: #fff;
background-color: #294786;
}
.btn-linkedin {
color: #fff;
background-color: #007bb6;
border: 1px solid #0073ae;
}
.btn-linkedin:hover,
.btn-linkedin:focus {
color: #fff;
background-color: #0069a4;
}
.btn-twitter {
color: #fff;
background-color: #00aced;
border: 1px solid #009fdb;
}
.btn-twitter:hover,
.btn-twitter:focus {
color: #fff;
background-color: #0090c7;
}
.btn-foursquare {
color: #fff;
background-color: #f94877;
border: 1px solid #f8215a;
}
.btn-foursquare:hover,
.btn-foursquare:focus {
color: #fff;
background-color: #f71752;
}
.btn-github {
color: #fff;
background-color: #444;
border: 1px solid #3b3b3b;
}
.btn-github:hover,
.btn-github:focus {
color: #fff;
background-color: #303030;
}
.btn-instagram {
color: #fff;
background-color: #3f729b;
}
.btn-instagram:hover,
.btn-instagram:focus {
color: #fff;
background-color: #305777;
}
.btn-yahoo {
color: #fff;
background-color: #720e9e;
}
.btn-yahoo:hover,
.btn-yahoo:focus {
color: #fff;
background-color: #600e85;
}
.btn-live {
color: #fff;
background-color: #2672ec;
}
.btn-live:hover,
.btn-live:focus {
color: #fff;
background-color: #125acd;
}
.btn-twitch {
color: #fff;
background-color: #6441a5;
}
.btn-twitch:hover,
.btn-twitch:focus {
color: #fff;
background-color: #7550ba;
}
.btn-bitbucket {
color: #fff;
background-color: #10375e;
}
.btn-bitbucket:hover,
.btn-bitbucket:focus {
color: #fff;
background-color: #0d2c4a;
}
.btn-spotify {
color: #fff;
background-color: #2ebd59;
}
.btn-spotify:hover,
.btn-spotify:focus {
color: #fff;
background-color: #29a34e;
}
/*********************
* Animations
*********************/
.fadeZoom.ng-enter {
-webkit-animation-duration: 0.6s, 0.2s;
-moz-animation-duration: 0.2s, 0.2s;
-ms-animation-duration: 0.2s, 0.2s;
animation-duration: 0.2, 0.2s;
-webkit-animation-name: fadeIn, zoomIn;
-moz-animation-name: fadeIn, zoomIn;
-ms-animation-name: fadeIn, zoomIn;
animation-name: fadeIn, zoomIn;
}
.fadeZoomFadeDown.ng-enter {
-webkit-animation-duration: 0.2s, 0.2s;
-moz-animation-duration: 0.2s, 0.2s;
-ms-animation-duration: 0.2s, 0.2s;
animation-duration: 0.2s, 0.2s;
-webkit-animation-name: fadeIn, zoomIn;
-moz-animation-name: fadeIn, zoomIn;
-ms-animation-name: fadeIn, zoomIn;
animation-name: fadeIn, zoomIn;
}
.fadeZoomFadeDown.ng-leave {
-webkit-animation: fadeOutDown 0.2s;
-moz-animation: fadeOutDown 0.2s;
-ms-animation: fadeOutDown 0.2s;
animation: fadeOutDown 0.2s;
}
@-webkit-keyframes zoomIn {
0% {
opacity: 0;
-webkit-transform: scale3d(0.8, 0.8, 0.8);
-moz-transform: scale3d(0.8, 0.8, 0.8);
-ms-transform: scale3d(0.8, 0.8, 0.8);
transform: scale3d(0.8, 0.8, 0.8);
}
50% {
opacity: 1;
}
}
@keyframes zoomIn {
0% {
opacity: 0;
-webkit-transform: scale3d(0.8, 0.8, 0.8);
-moz-transform: scale3d(0.8, 0.8, 0.8);
-ms-transform: scale3d(0.8, 0.8, 0.8);
transform: scale3d(0.8, 0.8, 0.8);
}
50% {
opacity: 1;
}
}
================================================
FILE: examples/client/vendor/angular-animate.js
================================================
/**
* @license AngularJS v1.4.7
* (c) 2010-2015 Google, Inc. http://angularjs.org
* License: MIT
*/
(function(window, angular, undefined) {'use strict';
/* jshint ignore:start */
var noop = angular.noop;
var extend = angular.extend;
var jqLite = angular.element;
var forEach = angular.forEach;
var isArray = angular.isArray;
var isString = angular.isString;
var isObject = angular.isObject;
var isUndefined = angular.isUndefined;
var isDefined = angular.isDefined;
var isFunction = angular.isFunction;
var isElement = angular.isElement;
var ELEMENT_NODE = 1;
var COMMENT_NODE = 8;
var ADD_CLASS_SUFFIX = '-add';
var REMOVE_CLASS_SUFFIX = '-remove';
var EVENT_CLASS_PREFIX = 'ng-';
var ACTIVE_CLASS_SUFFIX = '-active';
var NG_ANIMATE_CLASSNAME = 'ng-animate';
var NG_ANIMATE_CHILDREN_DATA = '$$ngAnimateChildren';
// Detect proper transitionend/animationend event names.
var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT;
// If unprefixed events are not supported but webkit-prefixed are, use the latter.
// Otherwise, just use W3C names, browsers not supporting them at all will just ignore them.
// Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend`
// but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`.
// Register both events in case `window.onanimationend` is not supported because of that,
// do the same for `transitionend` as Safari is likely to exhibit similar behavior.
// Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit
// therefore there is no reason to test anymore for other vendor prefixes:
// http://caniuse.com/#search=transition
if (isUndefined(window.ontransitionend) && isDefined(window.onwebkittransitionend)) {
CSS_PREFIX = '-webkit-';
TRANSITION_PROP = 'WebkitTransition';
TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend';
} else {
TRANSITION_PROP = 'transition';
TRANSITIONEND_EVENT = 'transitionend';
}
if (isUndefined(window.onanimationend) && isDefined(window.onwebkitanimationend)) {
CSS_PREFIX = '-webkit-';
ANIMATION_PROP = 'WebkitAnimation';
ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend';
} else {
ANIMATION_PROP = 'animation';
ANIMATIONEND_EVENT = 'animationend';
}
var DURATION_KEY = 'Duration';
var PROPERTY_KEY = 'Property';
var DELAY_KEY = 'Delay';
var TIMING_KEY = 'TimingFunction';
var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount';
var ANIMATION_PLAYSTATE_KEY = 'PlayState';
var SAFE_FAST_FORWARD_DURATION_VALUE = 9999;
var ANIMATION_DELAY_PROP = ANIMATION_PROP + DELAY_KEY;
var ANIMATION_DURATION_PROP = ANIMATION_PROP + DURATION_KEY;
var TRANSITION_DELAY_PROP = TRANSITION_PROP + DELAY_KEY;
var TRANSITION_DURATION_PROP = TRANSITION_PROP + DURATION_KEY;
var isPromiseLike = function(p) {
return p && p.then ? true : false;
};
function assertArg(arg, name, reason) {
if (!arg) {
throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required"));
}
return arg;
}
function mergeClasses(a,b) {
if (!a && !b) return '';
if (!a) return b;
if (!b) return a;
if (isArray(a)) a = a.join(' ');
if (isArray(b)) b = b.join(' ');
return a + ' ' + b;
}
function packageStyles(options) {
var styles = {};
if (options && (options.to || options.from)) {
styles.to = options.to;
styles.from = options.from;
}
return styles;
}
function pendClasses(classes, fix, isPrefix) {
var className = '';
classes = isArray(classes)
? classes
: classes && isString(classes) && classes.length
? classes.split(/\s+/)
: [];
forEach(classes, function(klass, i) {
if (klass && klass.length > 0) {
className += (i > 0) ? ' ' : '';
className += isPrefix ? fix + klass
: klass + fix;
}
});
return className;
}
function removeFromArray(arr, val) {
var index = arr.indexOf(val);
if (val >= 0) {
arr.splice(index, 1);
}
}
function stripCommentsFromElement(element) {
if (element instanceof jqLite) {
switch (element.length) {
case 0:
return [];
break;
case 1:
// there is no point of stripping anything if the element
// is the only element within the jqLite wrapper.
// (it's important that we retain the element instance.)
if (element[0].nodeType === ELEMENT_NODE) {
return element;
}
break;
default:
return jqLite(extractElementNode(element));
break;
}
}
if (element.nodeType === ELEMENT_NODE) {
return jqLite(element);
}
}
function extractElementNode(element) {
if (!element[0]) return element;
for (var i = 0; i < element.length; i++) {
var elm = element[i];
if (elm.nodeType == ELEMENT_NODE) {
return elm;
}
}
}
function $$addClass($$jqLite, element, className) {
forEach(element, function(elm) {
$$jqLite.addClass(elm, className);
});
}
function $$removeClass($$jqLite, element, className) {
forEach(element, function(elm) {
$$jqLite.removeClass(elm, className);
});
}
function applyAnimationClassesFactory($$jqLite) {
return function(element, options) {
if (options.addClass) {
$$addClass($$jqLite, element, options.addClass);
options.addClass = null;
}
if (options.removeClass) {
$$removeClass($$jqLite, element, options.removeClass);
options.removeClass = null;
}
}
}
function prepareAnimationOptions(options) {
options = options || {};
if (!options.$$prepared) {
var domOperation = options.domOperation || noop;
options.domOperation = function() {
options.$$domOperationFired = true;
domOperation();
domOperation = noop;
};
options.$$prepared = true;
}
return options;
}
function applyAnimationStyles(element, options) {
applyAnimationFromStyles(element, options);
applyAnimationToStyles(element, options);
}
function applyAnimationFromStyles(element, options) {
if (options.from) {
element.css(options.from);
options.from = null;
}
}
function applyAnimationToStyles(element, options) {
if (options.to) {
element.css(options.to);
options.to = null;
}
}
function mergeAnimationOptions(element, target, newOptions) {
var toAdd = (target.addClass || '') + ' ' + (newOptions.addClass || '');
var toRemove = (target.removeClass || '') + ' ' + (newOptions.removeClass || '');
var classes = resolveElementClasses(element.attr('class'), toAdd, toRemove);
if (newOptions.preparationClasses) {
target.preparationClasses = concatWithSpace(newOptions.preparationClasses, target.preparationClasses);
delete newOptions.preparationClasses;
}
// noop is basically when there is no callback; otherwise something has been set
var realDomOperation = target.domOperation !== noop ? target.domOperation : null;
extend(target, newOptions);
// TODO(matsko or sreeramu): proper fix is to maintain all animation callback in array and call at last,but now only leave has the callback so no issue with this.
if (realDomOperation) {
target.domOperation = realDomOperation;
}
if (classes.addClass) {
target.addClass = classes.addClass;
} else {
target.addClass = null;
}
if (classes.removeClass) {
target.removeClass = classes.removeClass;
} else {
target.removeClass = null;
}
return target;
}
function resolveElementClasses(existing, toAdd, toRemove) {
var ADD_CLASS = 1;
var REMOVE_CLASS = -1;
var flags = {};
existing = splitClassesToLookup(existing);
toAdd = splitClassesToLookup(toAdd);
forEach(toAdd, function(value, key) {
flags[key] = ADD_CLASS;
});
toRemove = splitClassesToLookup(toRemove);
forEach(toRemove, function(value, key) {
flags[key] = flags[key] === ADD_CLASS ? null : REMOVE_CLASS;
});
var classes = {
addClass: '',
removeClass: ''
};
forEach(flags, function(val, klass) {
var prop, allow;
if (val === ADD_CLASS) {
prop = 'addClass';
allow = !existing[klass];
} else if (val === REMOVE_CLASS) {
prop = 'removeClass';
allow = existing[klass];
}
if (allow) {
if (classes[prop].length) {
classes[prop] += ' ';
}
classes[prop] += klass;
}
});
function splitClassesToLookup(classes) {
if (isString(classes)) {
classes = classes.split(' ');
}
var obj = {};
forEach(classes, function(klass) {
// sometimes the split leaves empty string values
// incase extra spaces were applied to the options
if (klass.length) {
obj[klass] = true;
}
});
return obj;
}
return classes;
}
function getDomNode(element) {
return (element instanceof angular.element) ? element[0] : element;
}
function applyGeneratedPreparationClasses(element, event, options) {
var classes = '';
if (event) {
classes = pendClasses(event, EVENT_CLASS_PREFIX, true);
}
if (options.addClass) {
classes = concatWithSpace(classes, pendClasses(options.addClass, ADD_CLASS_SUFFIX));
}
if (options.removeClass) {
classes = concatWithSpace(classes, pendClasses(options.removeClass, REMOVE_CLASS_SUFFIX));
}
if (classes.length) {
options.preparationClasses = classes;
element.addClass(classes);
}
}
function clearGeneratedClasses(element, options) {
if (options.preparationClasses) {
element.removeClass(options.preparationClasses);
options.preparationClasses = null;
}
if (options.activeClasses) {
element.removeClass(options.activeClasses);
options.activeClasses = null;
}
}
function blockTransitions(node, duration) {
// we use a negative delay value since it performs blocking
// yet it doesn't kill any existing transitions running on the
// same element which makes this safe for class-based animations
var value = duration ? '-' + duration + 's' : '';
applyInlineStyle(node, [TRANSITION_DELAY_PROP, value]);
return [TRANSITION_DELAY_PROP, value];
}
function blockKeyframeAnimations(node, applyBlock) {
var value = applyBlock ? 'paused' : '';
var key = ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY;
applyInlineStyle(node, [key, value]);
return [key, value];
}
function applyInlineStyle(node, styleTuple) {
var prop = styleTuple[0];
var value = styleTuple[1];
node.style[prop] = value;
}
function concatWithSpace(a,b) {
if (!a) return b;
if (!b) return a;
return a + ' ' + b;
}
var $$rAFSchedulerFactory = ['$$rAF', function($$rAF) {
var queue, cancelFn;
function scheduler(tasks) {
// we make a copy since RAFScheduler mutates the state
// of the passed in array variable and this would be difficult
// to track down on the outside code
queue = queue.concat(tasks);
nextTick();
}
queue = scheduler.queue = [];
/* waitUntilQuiet does two things:
* 1. It will run the FINAL `fn` value only when an uncancelled RAF has passed through
* 2. It will delay the next wave of tasks from running until the quiet `fn` has run.
*
* The motivation here is that animation code can request more time from the scheduler
* before the next wave runs. This allows for certain DOM properties such as classes to
* be resolved in time for the next animation to run.
*/
scheduler.waitUntilQuiet = function(fn) {
if (cancelFn) cancelFn();
cancelFn = $$rAF(function() {
cancelFn = null;
fn();
nextTick();
});
};
return scheduler;
function nextTick() {
if (!queue.length) return;
var items = queue.shift();
for (var i = 0; i < items.length; i++) {
items[i]();
}
if (!cancelFn) {
$$rAF(function() {
if (!cancelFn) nextTick();
});
}
}
}];
var $$AnimateChildrenDirective = [function() {
return function(scope, element, attrs) {
var val = attrs.ngAnimateChildren;
if (angular.isString(val) && val.length === 0) { //empty attribute
element.data(NG_ANIMATE_CHILDREN_DATA, true);
} else {
attrs.$observe('ngAnimateChildren', function(value) {
value = value === 'on' || value === 'true';
element.data(NG_ANIMATE_CHILDREN_DATA, value);
});
}
};
}];
var ANIMATE_TIMER_KEY = '$$animateCss';
/**
* @ngdoc service
* @name $animateCss
* @kind object
*
* @description
* The `$animateCss` service is a useful utility to trigger customized CSS-based transitions/keyframes
* from a JavaScript-based animation or directly from a directive. The purpose of `$animateCss` is NOT
* to side-step how `$animate` and ngAnimate work, but the goal is to allow pre-existing animations or
* directives to create more complex animations that can be purely driven using CSS code.
*
* Note that only browsers that support CSS transitions and/or keyframe animations are capable of
* rendering animations triggered via `$animateCss` (bad news for IE9 and lower).
*
* ## Usage
* Once again, `$animateCss` is designed to be used inside of a registered JavaScript animation that
* is powered by ngAnimate. It is possible to use `$animateCss` directly inside of a directive, however,
* any automatic control over cancelling animations and/or preventing animations from being run on
* child elements will not be handled by Angular. For this to work as expected, please use `$animate` to
* trigger the animation and then setup a JavaScript animation that injects `$animateCss` to trigger
* the CSS animation.
*
* The example below shows how we can create a folding animation on an element using `ng-if`:
*
* ```html
* <!-- notice the `fold-animation` CSS class -->
* <div ng-if="onOff" class="fold-animation">
* This element will go BOOM
* </div>
* <button ng-click="onOff=true">Fold In</button>
* ```
*
* Now we create the **JavaScript animation** that will trigger the CSS transition:
*
* ```js
* ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) {
* return {
* enter: function(element, doneFn) {
* var height = element[0].offsetHeight;
* return $animateCss(element, {
* from: { height:'0px' },
* to: { height:height + 'px' },
* duration: 1 // one second
* });
* }
* }
* }]);
* ```
*
* ## More Advanced Uses
*
* `$animateCss` is the underlying code that ngAnimate uses to power **CSS-based animations** behind the scenes. Therefore CSS hooks
* like `.ng-EVENT`, `.ng-EVENT-active`, `.ng-EVENT-stagger` are all features that can be triggered using `$animateCss` via JavaScript code.
*
* This also means that just about any combination of adding classes, removing classes, setting styles, dynamically setting a keyframe animation,
* applying a hardcoded duration or delay value, changing the animation easing or applying a stagger animation are all options that work with
* `$animateCss`. The service itself is smart enough to figure out the combination of options and examine the element styling properties in order
* to provide a working animation that will run in CSS.
*
* The example below showcases a more advanced version of the `.fold-animation` from the example above:
*
* ```js
* ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) {
* return {
* enter: function(element, doneFn) {
* var height = element[0].offsetHeight;
* return $animateCss(element, {
* addClass: 'red large-text pulse-twice',
* easing: 'ease-out',
* from: { height:'0px' },
* to: { height:height + 'px' },
* duration: 1 // one second
* });
* }
* }
* }]);
* ```
*
* Since we're adding/removing CSS classes then the CSS transition will also pick those up:
*
* ```css
* /* since a hardcoded duration value of 1 was provided in the JavaScript animation code,
* the CSS classes below will be transitioned despite them being defined as regular CSS classes */
* .red { background:red; }
* .large-text { font-size:20px; }
*
* /* we can also use a keyframe animation and $animateCss will make it work alongside the transition */
* .pulse-twice {
* animation: 0.5s pulse linear 2;
* -webkit-animation: 0.5s pulse linear 2;
* }
*
* @keyframes pulse {
* from { transform: scale(0.5); }
* to { transform: scale(1.5); }
* }
*
* @-webkit-keyframes pulse {
* from { -webkit-transform: scale(0.5); }
* to { -webkit-transform: scale(1.5); }
* }
* ```
*
* Given this complex combination of CSS classes, styles and options, `$animateCss` will figure everything out and make the animation happen.
*
* ## How the Options are handled
*
* `$animateCss` is very versatile and intelligent when it comes to figuring out what configurations to apply to the element to ensure the animation
* works with the options provided. Say for example we were adding a class that contained a keyframe value and we wanted to also animate some inline
* styles using the `from` and `to` properties.
*
* ```js
* var animator = $animateCss(element, {
* from: { background:'red' },
* to: { background:'blue' }
* });
* animator.start();
* ```
*
* ```css
* .rotating-animation {
* animation:0.5s rotate linear;
* -webkit-animation:0.5s rotate linear;
* }
*
* @keyframes rotate {
* from { transform: rotate(0deg); }
* to { transform: rotate(360deg); }
* }
*
* @-webkit-keyframes rotate {
* from { -webkit-transform: rotate(0deg); }
* to { -webkit-transform: rotate(360deg); }
* }
* ```
*
* The missing pieces here are that we do not have a transition set (within the CSS code nor within the `$animateCss` options) and the duration of the animation is
* going to be detected from what the keyframe styles on the CSS class are. In this event, `$animateCss` will automatically create an inline transition
* style matching the duration detected from the keyframe style (which is present in the CSS class that is being added) and then prepare both the transition
* and keyframe animations to run in parallel on the element. Then when the animation is underway the provided `from` and `to` CSS styles will be applied
* and spread across the transition and keyframe animation.
*
* ## What is returned
*
* `$animateCss` works in two stages: a preparation phase and an animation phase. Therefore when `$animateCss` is first called it will NOT actually
* start the animation. All that is going on here is that the element is being prepared for the animation (which means that the generated CSS classes are
* added and removed on the element). Once `$animateCss` is called it will return an object with the following properties:
*
* ```js
* var animator = $animateCss(element, { ... });
* ```
*
* Now what do the contents of our `animator` variable look like:
*
* ```js
* {
* // starts the animation
* start: Function,
*
* // ends (aborts) the animation
* end: Function
* }
* ```
*
* To actually start the animation we need to run `animation.start()` which will then return a promise that we can hook into to detect when the animation ends.
* If we choose not to run the animation then we MUST run `animation.end()` to perform a cleanup on the element (since some CSS classes and stlyes may have been
* applied to the element during the preparation phase). Note that all other properties such as duration, delay, transitions and keyframes are just properties
* and that changing them will not reconfigure the parameters of the animation.
*
* ### runner.done() vs runner.then()
* It is documented that `animation.start()` will return a promise object and this is true, however, there is also an additional method available on the
* runner called `.done(callbackFn)`. The done method works the same as `.finally(callbackFn)`, however, it does **not trigger a digest to occur**.
* Therefore, for performance reasons, it's always best to use `runner.done(callback)` instead of `runner.then()`, `runner.catch()` or `runner.finally()`
* unless you really need a digest to kick off afterwards.
*
* Keep in mind that, to make this easier, ngAnimate has tweaked the JS animations API to recognize when a runner instance is returned from $animateCss
* (so there is no need to call `runner.done(doneFn)` inside of your JavaScript animation code).
* Check the {@link ngAnimate.$animateCss#usage animation code above} to see how this works.
*
* @param {DOMElement} element the element that will be animated
* @param {object} options the animation-related options that will be applied during the animation
*
* * `event` - The DOM event (e.g. enter, leave, move). When used, a generated CSS class of `ng-EVENT` and `ng-EVENT-active` will be applied
* to the element during the animation. Multiple events can be provided when spaces are used as a separator. (Note that this will not perform any DOM operation.)
* * `easing` - The CSS easing value that will be applied to the transition or keyframe animation (or both).
* * `transitionStyle` - The raw CSS transition style that will be used (e.g. `1s linear all`).
* * `keyframeStyle` - The raw CSS keyframe animation style that will be used (e.g. `1s my_animation linear`).
* * `from` - The starting CSS styles (a key/value object) that will be applied at the start of the animation.
* * `to` - The ending CSS styles (a key/value object) that will be applied across the animation via a CSS transition.
* * `addClass` - A space separated list of CSS classes that will be added to the element and spread across the animation.
* * `removeClass` - A space separated list of CSS classes that will be removed from the element and spread across the animation.
* * `duration` - A number value representing the total duration of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `0`
* is provided then the animation will be skipped entirely.
* * `delay` - A number value representing the total delay of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `true` is
* used then whatever delay value is detected from the CSS classes will be mirrored on the elements styles (e.g. by setting delay true then the style value
* of the element will be `transition-delay: DETECTED_VALUE`). Using `true` is useful when you want the CSS classes and inline styles to all share the same
* CSS delay value.
* * `stagger` - A numeric time value representing the delay between successively animated elements
* ({@link ngAnimate#css-staggering-animations Click here to learn how CSS-based staggering works in ngAnimate.})
* * `staggerIndex` - The numeric index representing the stagger item (e.g. a value of 5 is equal to the sixth item in the stagger; therefore when a
* * `stagger` option value of `0.1` is used then there will be a stagger delay of `600ms`)
* * `applyClassesEarly` - Whether or not the classes being added or removed will be used when detecting the animation. This is set by `$animate` when enter/leave/move animations are fired to ensure that the CSS classes are resolved in time. (Note that this will prevent any transitions from occuring on the classes being added and removed.)
* * `cleanupStyles` - Whether or not the provided `from` and `to` styles will be removed once
* the animation is closed. This is useful for when the styles are used purely for the sake of
* the animation and do not have a lasting visual effect on the element (e.g. a colapse and open animation).
* By default this value is set to `false`.
*
* @return {object} an object with start and end methods and details about the animation.
*
* * `start` - The method to start the animation. This will return a `Promise` when called.
* * `end` - This method will cancel the animation and remove all applied CSS classes and styles.
*/
var ONE_SECOND = 1000;
var BASE_TEN = 10;
var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3;
var CLOSING_TIME_BUFFER = 1.5;
var DETECT_CSS_PROPERTIES = {
transitionDuration: TRANSITION_DURATION_PROP,
transitionDelay: TRANSITION_DELAY_PROP,
transitionProperty: TRANSITION_PROP + PROPERTY_KEY,
animationDuration: ANIMATION_DURATION_PROP,
animationDelay: ANIMATION_DELAY_PROP,
animationIterationCount: ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY
};
var DETECT_STAGGER_CSS_PROPERTIES = {
transitionDuration: TRANSITION_DURATION_PROP,
transitionDelay: TRANSITION_DELAY_PROP,
animationDuration: ANIMATION_DURATION_PROP,
animationDelay: ANIMATION_DELAY_PROP
};
function getCssKeyframeDurationStyle(duration) {
return [ANIMATION_DURATION_PROP, duration + 's'];
}
function getCssDelayStyle(delay, isKeyframeAnimation) {
var prop = isKeyframeAnimation ? ANIMATION_DELAY_PROP : TRANSITION_DELAY_PROP;
return [prop, delay + 's'];
}
function computeCssStyles($window, element, properties) {
var styles = Object.create(null);
var detectedStyles = $window.getComputedStyle(element) || {};
forEach(properties, function(formalStyleName, actualStyleName) {
var val = detectedStyles[formalStyleName];
if (val) {
var c = val.charAt(0);
// only numerical-based values have a negative sign or digit as the first value
if (c === '-' || c === '+' || c >= 0) {
val = parseMaxTime(val);
}
// by setting this to null in the event that the delay is not set or is set directly as 0
// then we can still allow for zegative values to be used later on and not mistake this
// value for being greater than any other negative value.
if (val === 0) {
val = null;
}
styles[actualStyleName] = val;
}
});
return styles;
}
function parseMaxTime(str) {
var maxValue = 0;
var values = str.split(/\s*,\s*/);
forEach(values, function(value) {
// it's always safe to consider only second values and omit `ms` values since
// getComputedStyle will always handle the conversion for us
if (value.charAt(value.length - 1) == 's') {
value = value.substring(0, value.length - 1);
}
value = parseFloat(value) || 0;
maxValue = maxValue ? Math.max(value, maxValue) : value;
});
return maxValue;
}
function truthyTimingValue(val) {
return val === 0 || val != null;
}
function getCssTransitionDurationStyle(duration, applyOnlyDuration) {
var style = TRANSITION_PROP;
var value = duration + 's';
if (applyOnlyDuration) {
style += DURATION_KEY;
} else {
value += ' linear all';
}
return [style, value];
}
function createLocalCacheLookup() {
var cache = Object.create(null);
return {
flush: function() {
cache = Object.create(null);
},
count: function(key) {
var entry = cache[key];
return entry ? entry.total : 0;
},
get: function(key) {
var entry = cache[key];
return entry && entry.value;
},
put: function(key, value) {
if (!cache[key]) {
cache[key] = { total: 1, value: value };
} else {
cache[key].total++;
}
}
};
}
// we do not reassign an already present style value since
// if we detect the style property value again we may be
// detecting styles that were added via the `from` styles.
// We make use of `isDefined` here since an empty string
// or null value (which is what getPropertyValue will return
// for a non-existing style) will still be marked as a valid
// value for the style (a falsy value implies that the style
// is to be removed at the end of the animation). If we had a simple
// "OR" statement then it would not be enough to catch that.
function registerRestorableStyles(backup, node, properties) {
forEach(properties, function(prop) {
backup[prop] = isDefined(backup[prop])
? backup[prop]
: node.style.getPropertyValue(prop);
});
}
var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
var gcsLookup = createLocalCacheLookup();
var gcsStaggerLookup = createLocalCacheLookup();
this.$get = ['$window', '$$jqLite', '$$AnimateRunner', '$timeout',
'$$forceReflow', '$sniffer', '$$rAFScheduler', '$animate',
function($window, $$jqLite, $$AnimateRunner, $timeout,
$$forceReflow, $sniffer, $$rAFScheduler, $animate) {
var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);
var parentCounter = 0;
function gcsHashFn(node, extraClasses) {
var KEY = "$$ngAnimateParentKey";
var parentNode = node.parentNode;
var parentID = parentNode[KEY] || (parentNode[KEY] = ++parentCounter);
return parentID + '-' + node.getAttribute('class') + '-' + extraClasses;
}
function computeCachedCssStyles(node, className, cacheKey, properties) {
var timings = gcsLookup.get(cacheKey);
if (!timings) {
timings = computeCssStyles($window, node, properties);
if (timings.animationIterationCount === 'infinite') {
timings.animationIterationCount = 1;
}
}
// we keep putting this in multiple times even though the value and the cacheKey are the same
// because we're keeping an interal tally of how many duplicate animations are detected.
gcsLookup.put(cacheKey, timings);
return timings;
}
function computeCachedCssStaggerStyles(node, className, cacheKey, properties) {
var stagger;
// if we have one or more existing matches of matching elements
// containing the same parent + CSS styles (which is how cacheKey works)
// then staggering is possible
if (gcsLookup.count(cacheKey) > 0) {
stagger = gcsStaggerLookup.get(cacheKey);
if (!stagger) {
var staggerClassName = pendClasses(className, '-stagger');
$$jqLite.addClass(node, staggerClassName);
stagger = computeCssStyles($window, node, properties);
// force the conversion of a null value to zero incase not set
stagger.animationDuration = Math.max(stagger.animationDuration, 0);
stagger.transitionDuration = Math.max(stagger.transitionDuration, 0);
$$jqLite.removeClass(node, staggerClassName);
gcsStaggerLookup.put(cacheKey, stagger);
}
}
return stagger || {};
}
var cancelLastRAFRequest;
var rafWaitQueue = [];
function waitUntilQuiet(callback) {
rafWaitQueue.push(callback);
$$rAFScheduler.waitUntilQuiet(function() {
gcsLookup.flush();
gcsStaggerLookup.flush();
// DO NOT REMOVE THIS LINE OR REFACTOR OUT THE `pageWidth` variable.
// PLEASE EXAMINE THE `$$forceReflow` service to understand why.
var pageWidth = $$forceReflow();
// we use a for loop to ensure that if the queue is changed
// during this looping then it will consider new requests
for (var i = 0; i < rafWaitQueue.length; i++) {
rafWaitQueue[i](pageWidth);
}
rafWaitQueue.length = 0;
});
}
function computeTimings(node, className, cacheKey) {
var timings = computeCachedCssStyles(node, className, cacheKey, DETECT_CSS_PROPERTIES);
var aD = timings.animationDelay;
var tD = timings.transitionDelay;
timings.maxDelay = aD && tD
? Math.max(aD, tD)
: (aD || tD);
timings.maxDuration = Math.max(
timings.animationDuration * timings.animationIterationCount,
timings.transitionDuration);
return timings;
}
return function init(element, options) {
var restoreStyles = {};
var node = getDomNode(element);
if (!node
|| !node.parentNode
|| !$animate.enabled()) {
return closeAndReturnNoopAnimator();
}
options = prepareAnimationOptions(options);
var temporaryStyles = [];
var classes = element.attr('class');
var styles = packageStyles(options);
var animationClosed;
var animationPaused;
var animationCompleted;
var runner;
var runnerHost;
var maxDelay;
var maxDelayTime;
var maxDuration;
var maxDurationTime;
if (options.duration === 0 || (!$sniffer.animations && !$sniffer.transitions)) {
return closeAndReturnNoopAnimator();
}
var method = options.event && isArray(options.event)
? options.event.join(' ')
: options.event;
var isStructural = method && options.structural;
var structuralClassName = '';
var addRemoveClassName = '';
if (isStructural) {
structuralClassName = pendClasses(method, EVENT_CLASS_PREFIX, true);
} else if (method) {
structuralClassName = method;
}
if (options.addClass) {
addRemoveClassName += pendClasses(options.addClass, ADD_CLASS_SUFFIX);
}
if (options.removeClass) {
if (addRemoveClassName.length) {
addRemoveClassName += ' ';
}
addRemoveClassName += pendClasses(options.removeClass, REMOVE_CLASS_SUFFIX);
}
// there may be a situation where a structural animation is combined together
// with CSS classes that need to resolve before the animation is computed.
// However this means that there is no explicit CSS code to block the animation
// from happening (by setting 0s none in the class name). If this is the case
// we need to apply the classes before the first rAF so we know to continue if
// there actually is a detected transition or keyframe animation
if (options.applyClassesEarly && addRemoveClassName.length) {
applyAnimationClasses(element, options);
}
var preparationClasses = [structuralClassName, addRemoveClassName].join(' ').trim();
var fullClassName = classes + ' ' + preparationClasses;
var activeClasses = pendClasses(preparationClasses, ACTIVE_CLASS_SUFFIX);
var hasToStyles = styles.to && Object.keys(styles.to).length > 0;
var containsKeyframeAnimation = (options.keyframeStyle || '').length > 0;
// there is no way we can trigger an animation if no styles and
// no classes are being applied which would then trigger a transition,
// unless there a is raw keyframe value that is applied to the element.
if (!containsKeyframeAnimation
&& !hasToStyles
&& !preparationClasses) {
return closeAndReturnNoopAnimator();
}
var cacheKey, stagger;
if (options.stagger > 0) {
var staggerVal = parseFloat(options.stagger);
stagger = {
transitionDelay: staggerVal,
animationDelay: staggerVal,
transitionDuration: 0,
animationDuration: 0
};
} else {
cacheKey = gcsHashFn(node, fullClassName);
stagger = computeCachedCssStaggerStyles(node, preparationClasses, cacheKey, DETECT_STAGGER_CSS_PROPERTIES);
}
if (!options.$$skipPreparationClasses) {
$$jqLite.addClass(element, preparationClasses);
}
var applyOnlyDuration;
if (options.transitionStyle) {
var transitionStyle = [TRANSITION_PROP, options.transitionStyle];
applyInlineStyle(node, transitionStyle);
temporaryStyles.push(transitionStyle);
}
if (options.duration >= 0) {
applyOnlyDuration = node.style[TRANSITION_PROP].length > 0;
var durationStyle = getCssTransitionDurationStyle(options.duration, applyOnlyDuration);
// we set the duration so that it will be picked up by getComputedStyle later
applyInlineStyle(node, durationStyle);
temporaryStyles.push(durationStyle);
}
if (options.keyframeStyle) {
var keyframeStyle = [ANIMATION_PROP, options.keyframeStyle];
applyInlineStyle(node, keyframeStyle);
temporaryStyles.push(keyframeStyle);
}
var itemIndex = stagger
? options.staggerIndex >= 0
? options.staggerIndex
: gcsLookup.count(cacheKey)
: 0;
var isFirst = itemIndex === 0;
// this is a pre-emptive way of forcing the setup classes to be added and applied INSTANTLY
// without causing any combination of transitions to kick in. By adding a negative delay value
// it forces the setup class' transition to end immediately. We later then remove the negative
// transition delay to allow for the transition to naturally do it's thing. The beauty here is
// that if there is no transition defined then nothing will happen and this will also allow
// other transitions to be stacked on top of each other without any chopping them out.
if (isFirst && !options.skipBlocking) {
blockTransitions(node, SAFE_FAST_FORWARD_DURATION_VALUE);
}
var timings = computeTimings(node, fullClassName, cacheKey);
var relativeDelay = timings.maxDelay;
maxDelay = Math.max(relativeDelay, 0);
maxDuration = timings.maxDuration;
var flags = {};
flags.hasTransitions = timings.transitionDuration > 0;
flags.hasAnimations = timings.animationDuration > 0;
flags.hasTransitionAll = flags.hasTransitions && timings.transitionProperty == 'all';
flags.applyTransitionDuration = hasToStyles && (
(flags.hasTransitions && !flags.hasTransitionAll)
|| (flags.hasAnimations && !flags.hasTransitions));
flags.applyAnimationDuration = options.duration && flags.hasAnimations;
flags.applyTransitionDelay = truthyTimingValue(options.delay) && (flags.applyTransitionDuration || flags.hasTransitions);
flags.applyAnimationDelay = truthyTimingValue(options.delay) && flags.hasAnimations;
flags.recalculateTimingStyles = addRemoveClassName.length > 0;
if (flags.applyTransitionDuration || flags.applyAnimationDuration) {
maxDuration = options.duration ? parseFloat(options.duration) : maxDuration;
if (flags.applyTransitionDuration) {
flags.hasTransitions = true;
timings.transitionDuration = maxDuration;
applyOnlyDuration = node.style[TRANSITION_PROP + PROPERTY_KEY].length > 0;
temporaryStyles.push(getCssTransitionDurationStyle(maxDuration, applyOnlyDuration));
}
if (flags.applyAnimationDuration) {
flags.hasAnimations = true;
timings.animationDuration = maxDuration;
temporaryStyles.push(getCssKeyframeDurationStyle(maxDuration));
}
}
if (maxDuration === 0 && !flags.recalculateTimingStyles) {
return closeAndReturnNoopAnimator();
}
if (options.delay != null) {
var delayStyle = parseFloat(options.delay);
if (flags.applyTransitionDelay) {
temporaryStyles.push(getCssDelayStyle(delayStyle));
}
if (flags.applyAnimationDelay) {
temporaryStyles.push(getCssDelayStyle(delayStyle, true));
}
}
// we need to recalculate the delay value since we used a pre-emptive negative
// delay value and the delay value is required for the final event checking. This
// property will ensure that this will happen after the RAF phase has passed.
if (options.duration == null && timings.transitionDuration > 0) {
flags.recalculateTimingStyles = flags.recalculateTimingStyles || isFirst;
}
maxDelayTime = maxDelay * ONE_SECOND;
maxDurationTime = maxDuration * ONE_SECOND;
if (!options.skipBlocking) {
flags.blockTransition = timings.transitionDuration > 0;
flags.blockKeyframeAnimation = timings.animationDuration > 0 &&
stagger.animationDelay > 0 &&
stagger.animationDuration === 0;
}
if (options.from) {
if (options.cleanupStyles) {
registerRestorableStyles(restoreStyles, node, Object.keys(options.from));
}
applyAnimationFromStyles(element, options);
}
if (flags.blockTransition || flags.blockKeyframeAnimation) {
applyBlocking(maxDuration);
} else if (!options.skipBlocking) {
blockTransitions(node, false);
}
// TODO(matsko): for 1.5 change this code to have an animator object for better debugging
return {
$$willAnimate: true,
end: endFn,
start: function() {
if (animationClosed) return;
runnerHost = {
end: endFn,
cancel: cancelFn,
resume: null, //this will be set during the start() phase
pause: null
};
runner = new $$AnimateRunner(runnerHost);
waitUntilQuiet(start);
// we don't have access to pause/resume the animation
// since it hasn't run yet. AnimateRunner will therefore
// set noop functions for resume and pause and they will
// later be overridden once the animation is triggered
return runner;
}
};
function endFn() {
close();
}
function cancelFn() {
close(true);
}
function close(rejected) { // jshint ignore:line
// if the promise has been called already then we shouldn't close
// the animation again
if (animationClosed || (animationCompleted && animationPaused)) return;
animationClosed = true;
animationPaused = false;
if (!options.$$skipPreparationClasses) {
$$jqLite.removeClass(element, preparationClasses);
}
$$jqLite.removeClass(element, activeClasses);
blockKeyframeAnimations(node, false);
blockTransitions(node, false);
forEach(temporaryStyles, function(entry) {
// There is only one way to remove inline style properties entirely from elements.
// By using `removeProperty` this works, but we need to convert camel-cased CSS
// styles down to hyphenated values.
node.style[entry[0]] = '';
});
applyAnimationClasses(element, options);
applyAnimationStyles(element, options);
if (Object.keys(restoreStyles).length) {
forEach(restoreStyles, function(value, prop) {
value ? node.style.setProperty(prop, value)
: node.style.removeProperty(prop);
});
}
// the reason why we have this option is to allow a synchronous closing callback
// that is fired as SOON as the animation ends (when the CSS is removed) or if
// the animation never takes off at all. A good example is a leave animation since
// the element must be removed just after the animation is over or else the element
// will appear on screen for one animation frame causing an overbearing flicker.
if (options.onDone) {
options.onDone();
}
// if the preparation function fails then the promise is not setup
if (runner) {
runner.complete(!rejected);
}
}
function applyBlocking(duration) {
if (flags.blockTransition) {
blockTransitions(node, duration);
}
if (flags.blockKeyframeAnimation) {
blockKeyframeAnimations(node, !!duration);
}
}
function closeAndReturnNoopAnimator() {
runner = new $$AnimateRunner({
end: endFn,
cancel: cancelFn
});
// should flush the cache animation
waitUntilQuiet(noop);
close();
return {
$$willAnimate: false,
start: function() {
return runner;
},
end: endFn
};
}
function start() {
if (animationClosed) return;
if (!node.parentNode) {
close();
return;
}
var startTime, events = [];
// even though we only pause keyframe animations here the pause flag
// will still happen when transitions are used. Only the transition will
// not be paused since that is not possible. If the animation ends when
// paused then it will not complete until unpaused or cancelled.
var playPause = function(playAnimation) {
if (!animationCompleted) {
animationPaused = !playAnimation;
if (timings.animationDuration) {
var value = blockKeyframeAnimations(node, animationPaused);
animationPaused
? temporaryStyles.push(value)
: removeFromArray(temporaryStyles, value);
}
} else if (animationPaused && playAnimation) {
animationPaused = false;
close();
}
};
// checking the stagger duration prevents an accidently cascade of the CSS delay style
// being inherited from the parent. If the transition duration is zero then we can safely
// rely that the delay value is an intential stagger delay style.
var maxStagger = itemIndex > 0
&& ((timings.transitionDuration && stagger.transitionDuration === 0) ||
(timings.animationDuration && stagger.animationDuration === 0))
&& Math.max(stagger.animationDelay, stagger.transitionDelay);
if (maxStagger) {
$timeout(triggerAnimationStart,
Math.floor(maxStagger * itemIndex * ONE_SECOND),
false);
} else {
triggerAnimationStart();
}
// this will decorate the existing promise runner with pause/resume methods
runnerHost.resume = function() {
playPause(true);
};
runnerHost.pause = function() {
playPause(false);
};
function triggerAnimationStart() {
// just incase a stagger animation kicks in when the animation
// itself was cancelled entirely
if (animationClosed) return;
applyBlocking(false);
forEach(temporaryStyles, function(entry) {
var key = entry[0];
var value = entry[1];
node.style[key] = value;
});
applyAnimationClasses(element, options);
$$jqLite.addClass(element, activeClasses);
if (flags.recalculateTimingStyles) {
fullClassName = node.className + ' ' + preparationClasses;
cacheKey = gcsHashFn(node, fullClassName);
timings = computeTimings(node, fullClassName, cacheKey);
relativeDelay = timings.maxDelay;
maxDelay = Math.max(relativeDelay, 0);
maxDuration = timings.maxDuration;
if (maxDuration === 0) {
close();
return;
}
flags.hasTransitions = timings.transitionDuration > 0;
flags.hasAnimations = timings.animationDuration > 0;
}
if (flags.applyAnimationDelay) {
relativeDelay = typeof options.delay !== "boolean" && truthyTimingValue(options.delay)
? parseFloat(options.delay)
: relativeDelay;
maxDelay = Math.max(relativeDelay, 0);
timings.animationDelay = relativeDelay;
delayStyle = getCssDelayStyle(relativeDelay, true);
temporaryStyles.push(delayStyle);
node.style[delayStyle[0]] = delayStyle[1];
}
maxDelayTime = maxDelay * ONE_SECOND;
maxDurationTime = maxDuration * ONE_SECOND;
if (options.easing) {
var easeProp, easeVal = options.easing;
if (flags.hasTransitions) {
easeProp = TRANSITION_PROP + TIMING_KEY;
temporaryStyles.push([easeProp, easeVal]);
node.style[easeProp] = easeVal;
}
if (flags.hasAnimations) {
easeProp = ANIMATION_PROP + TIMING_KEY;
temporaryStyles.push([easeProp, easeVal]);
node.style[easeProp] = easeVal;
}
}
if (timings.transitionDuration) {
events.push(TRANSITIONEND_EVENT);
}
if (timings.animationDuration) {
events.push(ANIMATIONEND_EVENT);
}
startTime = Date.now();
var timerTime = maxDelayTime + CLOSING_TIME_BUFFER * maxDurationTime;
var endTime = startTime + timerTime;
var animationsData = element.data(ANIMATE_TIMER_KEY) || [];
var setupFallbackTimer = true;
if (animationsData.length) {
var currentTimerData = animationsData[0];
setupFallbackTimer = endTime > currentTimerData.expectedEndTime;
if (setupFallbackTimer) {
$timeout.cancel(currentTimerData.timer);
} else {
animationsData.push(close);
}
}
if (setupFallbackTimer) {
var timer = $timeout(onAnimationExpired, timerTime, false);
animationsData[0] = {
timer: timer,
expectedEndTime: endTime
};
animationsData.push(close);
element.data(ANIMATE_TIMER_KEY, animationsData);
}
element.on(events.join(' '), onAnimationProgress);
if (options.to) {
if (options.cleanupStyles) {
registerRestorableStyles(restoreStyles, node, Object.keys(options.to));
}
applyAnimationToStyles(element, options);
}
}
function onAnimationExpired() {
var animationsData = element.data(ANIMATE_TIMER_KEY);
// this will be false in the event that the element was
// removed from the DOM (via a leave animation or something
// similar)
if (animationsData) {
for (var i = 1; i < animationsData.length; i++) {
animationsData[i]();
}
element.removeData(ANIMATE_TIMER_KEY);
}
}
function onAnimationProgress(event) {
event.stopPropagation();
var ev = event.originalEvent || event;
var timeStamp = ev.$manualTimeStamp || ev.timeStamp || Date.now();
/* Firefox (or possibly just Gecko) likes to not round values up
* when a ms measurement is used for the animation */
var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES));
/* $manualTimeStamp is a mocked timeStamp value which is set
* within browserTrigger(). This is only here so that tests can
* mock animations properly. Real events fallback to event.timeStamp,
* or, if they don't, then a timeStamp is automatically created for them.
* We're checking to see if the timeStamp surpasses the expected delay,
* but we're using elapsedTime instead of the timeStamp on the 2nd
* pre-condition since animations sometimes close off early */
if (Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) {
// we set this flag to ensure that if the transition is paused then, when resumed,
// the animation will automatically close itself since transitions cannot be paused.
animationCompleted = true;
close();
}
}
}
};
}];
}];
var $$AnimateCssDriverProvider = ['$$animationProvider', function($$animationProvider) {
$$animationProvider.drivers.push('$$animateCssDriver');
var NG_ANIMATE_SHIM_CLASS_NAME = 'ng-animate-shim';
var NG_ANIMATE_ANCHOR_CLASS_NAME = 'ng-anchor';
var NG_OUT_ANCHOR_CLASS_NAME = 'ng-anchor-out';
var NG_IN_ANCHOR_CLASS_NAME = 'ng-anchor-in';
function isDocumentFragment(node) {
return node.parentNode && node.parentNode.nodeType === 11;
}
this.$get = ['$animateCss', '$rootScope', '$$AnimateRunner', '$rootElement', '$sniffer', '$$jqLite', '$document',
function($animateCss, $rootScope, $$AnimateRunner, $rootElement, $sniffer, $$jqLite, $document) {
// only browsers that support these properties can render animations
if (!$sniffer.animations && !$sniffer.transitions) return noop;
var bodyNode = $document[0].body;
var rootNode = getDomNode($rootElement);
var rootBodyElement = jqLite(
// this is to avoid using something that exists outside of the body
// we also special case the doc fragement case because our unit test code
// appends the $rootElement to the body after the app has been bootstrapped
isDocumentFragment(rootNode) || bodyNode.contains(rootNode) ? rootNode : bodyNode
);
var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);
return function initDriverFn(animationDetails) {
return animationDetails.from && animationDetails.to
? prepareFromToAnchorAnimation(animationDetails.from,
animationDetails.to,
animationDetails.classes,
animationDetails.anchors)
: prepareRegularAnimation(animationDetails);
};
function filterCssClasses(classes) {
//remove all the `ng-` stuff
return classes.replace(/\bng-\S+\b/g, '');
}
function getUniqueValues(a, b) {
if (isString(a)) a = a.split(' ');
if (isString(b)) b = b.split(' ');
return a.filter(function(val) {
return b.indexOf(val) === -1;
}).join(' ');
}
function prepareAnchoredAnimation(classes, outAnchor, inAnchor) {
var clone = jqLite(getDomNode(outAnchor).cloneNode(true));
var startingClasses = filterCssClasses(getClassVal(clone));
outAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME);
inAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME);
clone.addClass(NG_ANIMATE_ANCHOR_CLASS_NAME);
rootBodyElement.append(clone);
var animatorIn, animatorOut = prepareOutAnimation();
// the user may not end up using the `out` animation and
// only making use of the `in` animation or vice-versa.
// In either case we should allow this and not assume the
// animation is over unless both animations are not used.
if (!animatorOut) {
animatorIn = prepareInAnimation();
if (!animatorIn) {
return end();
}
}
var startingAnimator = animatorOut || animatorIn;
return {
start: function() {
var runner;
var currentAnimation = startingAnimator.start();
currentAnimation.done(function() {
currentAnimation = null;
if (!animatorIn) {
animatorIn = prepareInAnimation();
if (animatorIn) {
currentAnimation = animatorIn.start();
currentAnimation.done(function() {
currentAnimation = null;
end();
runner.complete();
});
return currentAnimation;
}
}
// in the event that there is no `in` animation
end();
runner.complete();
});
runner = new $$AnimateRunner({
end: endFn,
cancel: endFn
});
return runner;
function endFn() {
if (currentAnimation) {
currentAnimation.end();
}
}
}
};
function calculateAnchorStyles(anchor) {
var styles = {};
var coords = getDomNode(anchor).getBoundingClientRect();
// we iterate directly since safari messes up and doesn't return
// all the keys for the coods object when iterated
forEach(['width','height','top','left'], function(key) {
var value = coords[key];
switch (key) {
case 'top':
value += bodyNode.scrollTop;
break;
case 'left':
value += bodyNode.scrollLeft;
break;
}
styles[key] = Math.floor(value) + 'px';
});
return styles;
}
function prepareOutAnimation() {
var animator = $animateCss(clone, {
addClass: NG_OUT_ANCHOR_CLASS_NAME,
delay: true,
from: calculateAnchorStyles(outAnchor)
});
// read the comment within `prepareRegularAnimation` to understand
// why this check is necessary
return animator.$$willAnimate ? animator : null;
}
function getClassVal(element) {
return element.attr('class') || '';
}
function prepareInAnimation() {
var endingClasses = filterCssClasses(getClassVal(inAnchor));
var toAdd = getUniqueValues(endingClasses, startingClasses);
var toRemove = getUniqueValues(startingClasses, endingClasses);
var animator = $animateCss(clone, {
to: calculateAnchorStyles(inAnchor),
addClass: NG_IN_ANCHOR_CLASS_NAME + ' ' + toAdd,
removeClass: NG_OUT_ANCHOR_CLASS_NAME + ' ' + toRemove,
delay: true
});
// read the comment within `prepareRegularAnimation` to understand
// why this check is necessary
return animator.$$willAnimate ? animator : null;
}
function end() {
clone.remove();
outAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME);
inAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME);
}
}
function prepareFromToAnchorAnimation(from, to, classes, anchors) {
var fromAnimation = prepareRegularAnimation(from, noop);
var toAnimation = prepareRegularAnimation(to, noop);
var anchorAnimations = [];
forEach(anchors, function(anchor) {
var outElement = anchor['out'];
var inElement = anchor['in'];
var animator = prepareAnchoredAnimation(classes, outElement, inElement);
if (animator) {
anchorAnimations.push(animator);
}
});
// no point in doing anything when there are no elements to animate
if (!fromAnimation && !toAnimation && anchorAnimations.length === 0) return;
return {
start: function() {
var animationRunners = [];
if (fromAnimation) {
animationRunners.push(fromAnimation.start());
}
if (toAnimation) {
animationRunners.push(toAnimation.start());
}
forEach(anchorAnimations, function(animation) {
animationRunners.push(animation.start());
});
var runner = new $$AnimateRunner({
end: endFn,
cancel: endFn // CSS-driven animations cannot be cancelled, only ended
});
$$AnimateRunner.all(animationRunners, function(status) {
runner.complete(status);
});
return runner;
function endFn() {
forEach(animationRunners, function(runner) {
runner.end();
});
}
}
};
}
function prepareRegularAnimation(animationDetails) {
var element = animationDetails.element;
var options = animationDetails.options || {};
if (animationDetails.structural) {
options.event = animationDetails.event;
options.structural = true;
options.applyClassesEarly = true;
// we special case the leave animation since we want to ensure that
// the element is removed as soon as the animation is over. Otherwise
// a flicker might appear or the element may not be removed at all
if (animationDetails.event === 'leave') {
options.onDone = options.domOperation;
}
}
// We assign the preparationClasses as the actual animation event since
// the internals of $animateCss will just suffix the event token values
// with `-active` to trigger the animation.
if (options.preparationClasses) {
options.event = concatWithSpace(options.event, options.preparationClasses);
}
var animator = $animateCss(element, options);
// the driver lookup code inside of $$animation attempts to spawn a
// driver one by one until a driver returns a.$$willAnimate animator object.
// $animateCss will always return an object, however, it will pass in
// a flag as a hint as to whether an animation was detected or not
return animator.$$willAnimate ? ani
gitextract_wvdtvayn/ ├── .gitignore ├── .npmignore ├── .publishrc ├── .travis.yml ├── LICENSE ├── README.md ├── bower.json ├── dist/ │ └── satellizer.js ├── examples/ │ ├── client/ │ │ ├── app.js │ │ ├── controllers/ │ │ │ ├── home.js │ │ │ ├── login.js │ │ │ ├── logout.js │ │ │ ├── navbar.js │ │ │ ├── profile.js │ │ │ └── signup.js │ │ ├── directives/ │ │ │ ├── passwordMatch.js │ │ │ └── passwordStrength.js │ │ ├── index.html │ │ ├── partials/ │ │ │ ├── home.html │ │ │ ├── login.html │ │ │ ├── profile.html │ │ │ └── signup.html │ │ ├── services/ │ │ │ └── account.js │ │ ├── stylesheets/ │ │ │ ├── angular-toastr.css │ │ │ └── styles.css │ │ └── vendor/ │ │ ├── angular-animate.js │ │ ├── angular-messages.js │ │ ├── angular-mocks.js │ │ ├── angular-resource.js │ │ ├── angular-sanitize.js │ │ ├── angular-toastr.js │ │ ├── angular-toastr.tpls.js │ │ ├── angular-ui-router.js │ │ ├── angular.js │ │ └── satellizer.js │ ├── ionic/ │ │ ├── .bowerrc │ │ ├── .gitignore │ │ ├── README.md │ │ ├── bower.json │ │ ├── config.xml │ │ ├── gulpfile.js │ │ ├── hooks/ │ │ │ ├── README.md │ │ │ ├── after_platform_add/ │ │ │ │ └── 010_install_plugins.js │ │ │ └── after_prepare/ │ │ │ └── 010_add_platform_class.js │ │ ├── ionic.project │ │ ├── package.json │ │ ├── scss/ │ │ │ └── ionic.app.scss │ │ └── www/ │ │ ├── css/ │ │ │ └── style.css │ │ ├── index.html │ │ ├── js/ │ │ │ ├── app.js │ │ │ └── controllers.js │ │ ├── lib/ │ │ │ ├── ionic/ │ │ │ │ ├── css/ │ │ │ │ │ └── ionic.css │ │ │ │ ├── js/ │ │ │ │ │ ├── angular/ │ │ │ │ │ │ ├── angular-animate.js │ │ │ │ │ │ ├── angular-resource.js │ │ │ │ │ │ ├── angular-sanitize.js │ │ │ │ │ │ └── angular.js │ │ │ │ │ ├── angular-ui/ │ │ │ │ │ │ └── angular-ui-router.js │ │ │ │ │ ├── ionic-angular.js │ │ │ │ │ ├── ionic.bundle.js │ │ │ │ │ └── ionic.js │ │ │ │ ├── scss/ │ │ │ │ │ ├── _action-sheet.scss │ │ │ │ │ ├── _animations.scss │ │ │ │ │ ├── _backdrop.scss │ │ │ │ │ ├── _badge.scss │ │ │ │ │ ├── _bar.scss │ │ │ │ │ ├── _button-bar.scss │ │ │ │ │ ├── _button.scss │ │ │ │ │ ├── _checkbox.scss │ │ │ │ │ ├── _form.scss │ │ │ │ │ ├── _grid.scss │ │ │ │ │ ├── _items.scss │ │ │ │ │ ├── _list.scss │ │ │ │ │ ├── _loading.scss │ │ │ │ │ ├── _menu.scss │ │ │ │ │ ├── _mixins.scss │ │ │ │ │ ├── _modal.scss │ │ │ │ │ ├── _platform.scss │ │ │ │ │ ├── _popover.scss │ │ │ │ │ ├── _popup.scss │ │ │ │ │ ├── _progress.scss │ │ │ │ │ ├── _radio.scss │ │ │ │ │ ├── _range.scss │ │ │ │ │ ├── _refresher.scss │ │ │ │ │ ├── _reset.scss │ │ │ │ │ ├── _scaffolding.scss │ │ │ │ │ ├── _select.scss │ │ │ │ │ ├── _slide-box.scss │ │ │ │ │ ├── _spinner.scss │ │ │ │ │ ├── _tabs.scss │ │ │ │ │ ├── _toggle.scss │ │ │ │ │ ├── _transitions.scss │ │ │ │ │ ├── _type.scss │ │ │ │ │ ├── _util.scss │ │ │ │ │ ├── _variables.scss │ │ │ │ │ ├── ionic.scss │ │ │ │ │ └── ionicons/ │ │ │ │ │ ├── _ionicons-font.scss │ │ │ │ │ ├── _ionicons-icons.scss │ │ │ │ │ ├── _ionicons-variables.scss │ │ │ │ │ └── ionicons.scss │ │ │ │ └── version.json │ │ │ └── satellizer/ │ │ │ ├── dist/ │ │ │ │ └── satellizer.js │ │ │ └── satellizer.js │ │ └── templates/ │ │ ├── home.html │ │ └── menu.html │ └── server/ │ ├── java/ │ │ ├── README.md │ │ ├── example.keystore │ │ ├── example.yml │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── helloworld/ │ │ │ ├── HelloWorldApplication.java │ │ │ ├── HelloWorldConfiguration.java │ │ │ ├── auth/ │ │ │ │ ├── AuthFilter.java │ │ │ │ ├── AuthUtils.java │ │ │ │ └── PasswordService.java │ │ │ ├── core/ │ │ │ │ ├── Token.java │ │ │ │ └── User.java │ │ │ ├── db/ │ │ │ │ └── UserDAO.java │ │ │ └── resources/ │ │ │ ├── AuthResource.java │ │ │ ├── ClientResource.java │ │ │ └── UserResource.java │ │ └── resources/ │ │ ├── banner.txt │ │ └── migrations.xml │ ├── node/ │ │ ├── config.js │ │ ├── package.json │ │ └── server.js │ ├── php/ │ │ ├── .gitattributes │ │ ├── .gitignore │ │ ├── README.md │ │ ├── app/ │ │ │ ├── Commands/ │ │ │ │ └── Command.php │ │ │ ├── Console/ │ │ │ │ ├── Commands/ │ │ │ │ │ └── Inspire.php │ │ │ │ └── Kernel.php │ │ │ ├── Events/ │ │ │ │ └── Event.php │ │ │ ├── Exceptions/ │ │ │ │ └── Handler.php │ │ │ ├── Handlers/ │ │ │ │ ├── Commands/ │ │ │ │ │ └── .gitkeep │ │ │ │ └── Events/ │ │ │ │ └── .gitkeep │ │ │ ├── Http/ │ │ │ │ ├── Controllers/ │ │ │ │ │ ├── AuthController.php │ │ │ │ │ ├── Controller.php │ │ │ │ │ ├── HomeController.php │ │ │ │ │ └── UserController.php │ │ │ │ ├── Kernel.php │ │ │ │ ├── Middleware/ │ │ │ │ │ ├── Authenticate.php │ │ │ │ │ ├── RedirectIfAuthenticated.php │ │ │ │ │ └── VerifyCsrfToken.php │ │ │ │ ├── Requests/ │ │ │ │ │ └── Request.php │ │ │ │ └── routes.php │ │ │ ├── Providers/ │ │ │ │ ├── AppServiceProvider.php │ │ │ │ ├── AuthServiceProvider.php │ │ │ │ ├── BusServiceProvider.php │ │ │ │ ├── ConfigServiceProvider.php │ │ │ │ ├── EventServiceProvider.php │ │ │ │ └── RouteServiceProvider.php │ │ │ └── User.php │ │ ├── artisan │ │ ├── bootstrap/ │ │ │ ├── app.php │ │ │ ├── autoload.php │ │ │ └── cache/ │ │ │ └── .gitignore │ │ ├── composer.json │ │ ├── config/ │ │ │ ├── app.php │ │ │ ├── auth.php │ │ │ ├── cache.php │ │ │ ├── compile.php │ │ │ ├── database.php │ │ │ ├── filesystems.php │ │ │ ├── mail.php │ │ │ ├── queue.php │ │ │ ├── services.php │ │ │ ├── session.php │ │ │ └── view.php │ │ ├── database/ │ │ │ ├── .gitignore │ │ │ ├── migrations/ │ │ │ │ ├── .gitkeep │ │ │ │ └── 2015_04_18_080047_create_users_table.php │ │ │ └── seeds/ │ │ │ ├── .gitkeep │ │ │ └── DatabaseSeeder.php │ │ ├── gulpfile.js │ │ ├── package.json │ │ ├── phpspec.yml │ │ ├── phpunit.xml │ │ ├── public/ │ │ │ ├── .htaccess │ │ │ ├── app.js │ │ │ ├── controllers/ │ │ │ │ ├── home.js │ │ │ │ ├── login.js │ │ │ │ ├── logout.js │ │ │ │ ├── navbar.js │ │ │ │ ├── profile.js │ │ │ │ └── signup.js │ │ │ ├── directives/ │ │ │ │ ├── passwordMatch.js │ │ │ │ └── passwordStrength.js │ │ │ ├── index.html │ │ │ ├── index.php │ │ │ ├── partials/ │ │ │ │ ├── home.html │ │ │ │ ├── login.html │ │ │ │ ├── profile.html │ │ │ │ └── signup.html │ │ │ ├── robots.txt │ │ │ ├── services/ │ │ │ │ └── account.js │ │ │ ├── stylesheets/ │ │ │ │ ├── angular-toastr.css │ │ │ │ └── styles.css │ │ │ └── vendor/ │ │ │ ├── angular-animate.js │ │ │ ├── angular-messages.js │ │ │ ├── angular-mocks.js │ │ │ ├── angular-resource.js │ │ │ ├── angular-sanitize.js │ │ │ ├── angular-toastr.js │ │ │ ├── angular-toastr.tpls.js │ │ │ ├── angular-ui-router.js │ │ │ ├── angular.js │ │ │ ├── dist/ │ │ │ │ └── satellizer.js │ │ │ └── satellizer.js │ │ ├── resources/ │ │ │ ├── assets/ │ │ │ │ └── less/ │ │ │ │ └── app.less │ │ │ ├── lang/ │ │ │ │ └── en/ │ │ │ │ ├── pagination.php │ │ │ │ ├── passwords.php │ │ │ │ └── validation.php │ │ │ └── views/ │ │ │ ├── errors/ │ │ │ │ └── 503.blade.php │ │ │ ├── vendor/ │ │ │ │ └── .gitkeep │ │ │ └── welcome.blade.php │ │ ├── server.php │ │ ├── storage/ │ │ │ ├── app/ │ │ │ │ └── .gitignore │ │ │ ├── framework/ │ │ │ │ ├── .gitignore │ │ │ │ ├── cache/ │ │ │ │ │ └── .gitignore │ │ │ │ ├── sessions/ │ │ │ │ │ └── .gitignore │ │ │ │ └── views/ │ │ │ │ └── .gitignore │ │ │ └── logs/ │ │ │ └── .gitkeep │ │ └── tests/ │ │ ├── ExampleTest.php │ │ └── TestCase.php │ ├── python/ │ │ ├── app.py │ │ ├── config.py │ │ └── requirements.txt │ └── ruby/ │ ├── .gitignore │ ├── Gemfile │ ├── README.rdoc │ ├── Rakefile │ ├── app/ │ │ ├── assets/ │ │ │ ├── images/ │ │ │ │ └── .keep │ │ │ ├── javascripts/ │ │ │ │ └── application.js │ │ │ └── stylesheets/ │ │ │ └── application.css │ │ ├── controllers/ │ │ │ ├── api_controller.rb │ │ │ ├── application_controller.rb │ │ │ ├── auth_controller.rb │ │ │ └── concerns/ │ │ │ └── .keep │ │ ├── helpers/ │ │ │ └── application_helper.rb │ │ ├── mailers/ │ │ │ └── .keep │ │ ├── models/ │ │ │ ├── .keep │ │ │ ├── authorization.rb │ │ │ ├── concerns/ │ │ │ │ └── .keep │ │ │ ├── oauth/ │ │ │ │ ├── base.rb │ │ │ │ ├── facebook.rb │ │ │ │ ├── foursquare.rb │ │ │ │ ├── github.rb │ │ │ │ ├── google.rb │ │ │ │ ├── linkedin.rb │ │ │ │ └── twitter.rb │ │ │ ├── token.rb │ │ │ └── user.rb │ │ ├── serializers/ │ │ │ └── user_serializer.rb │ │ └── views/ │ │ └── layouts/ │ │ └── application.html.erb │ ├── bin/ │ │ ├── bundle │ │ ├── rails │ │ ├── rake │ │ ├── setup │ │ └── spring │ ├── config/ │ │ ├── application.rb │ │ ├── boot.rb │ │ ├── database.yml │ │ ├── environment.rb │ │ ├── environments/ │ │ │ ├── development.rb │ │ │ ├── production.rb │ │ │ └── test.rb │ │ ├── initializers/ │ │ │ ├── assets.rb │ │ │ ├── backtrace_silencers.rb │ │ │ ├── cookies_serializer.rb │ │ │ ├── filter_parameter_logging.rb │ │ │ ├── hash.rb │ │ │ ├── inflections.rb │ │ │ ├── mime_types.rb │ │ │ ├── session_store.rb │ │ │ └── wrap_parameters.rb │ │ ├── locales/ │ │ │ └── en.yml │ │ ├── routes.rb │ │ └── secrets.yml │ ├── config.ru │ ├── db/ │ │ ├── migrate/ │ │ │ ├── 20150331192120_create_users.rb │ │ │ └── 20160703114821_create_authorizations.rb │ │ ├── schema.rb │ │ └── seeds.rb │ ├── log/ │ │ └── .keep │ ├── public/ │ │ ├── 404.html │ │ ├── 422.html │ │ ├── 500.html │ │ ├── index.html │ │ └── robots.txt │ ├── sinatra_static.rb │ ├── test/ │ │ ├── controllers/ │ │ │ └── .keep │ │ ├── fixtures/ │ │ │ ├── .keep │ │ │ └── users.yml │ │ ├── helpers/ │ │ │ └── .keep │ │ ├── integration/ │ │ │ └── .keep │ │ ├── mailers/ │ │ │ └── .keep │ │ ├── models/ │ │ │ ├── .keep │ │ │ └── user_test.rb │ │ └── test_helper.rb │ └── vendor/ │ └── assets/ │ ├── javascripts/ │ │ └── .keep │ └── stylesheets/ │ └── .keep ├── karma.conf.js ├── package.json ├── rollup.config.js ├── src/ │ ├── authProvider.ts │ ├── config.ts │ ├── httpProviderConfig.ts │ ├── interceptor.ts │ ├── local.ts │ ├── ng1.ts │ ├── oauth.ts │ ├── oauth1.ts │ ├── oauth2.ts │ ├── popup.ts │ ├── shared.ts │ ├── storage.ts │ └── utils.ts ├── test/ │ ├── annotations.spec.ts │ ├── authProvider.spec.ts │ ├── local.spec.ts │ ├── oauth.spec.ts │ ├── oauth1.spec.ts │ ├── oauth2.spec.ts │ ├── popup.spec.ts │ ├── shared.spec.ts │ ├── storage.spec.ts │ └── utils.spec.ts ├── tsconfig.json ├── tslint.json ├── typings/ │ ├── globals/ │ │ ├── angular/ │ │ │ ├── index.d.ts │ │ │ └── typings.json │ │ ├── angular-mocks/ │ │ │ ├── index.d.ts │ │ │ └── typings.json │ │ ├── es6-shim/ │ │ │ ├── index.d.ts │ │ │ └── typings.json │ │ ├── jasmine/ │ │ │ ├── index.d.ts │ │ │ └── typings.json │ │ ├── jquery/ │ │ │ ├── index.d.ts │ │ │ └── typings.json │ │ └── node/ │ │ ├── index.d.ts │ │ └── typings.json │ └── index.d.ts └── typings.json
Showing preview only (209K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2640 symbols across 111 files)
FILE: dist/satellizer.js
function Config (line 14) | function Config() {
function AuthProvider (line 169) | function AuthProvider(SatellizerConfig) {
function joinUrl (line 315) | function joinUrl(baseUrl, url) {
function getFullUrlPath (line 329) | function getFullUrlPath(location) {
function parseQueryString (line 335) | function parseQueryString(str) {
function decodeBase64 (line 348) | function decodeBase64(str) {
function Shared (line 399) | function Shared($q, $window, SatellizerConfig, SatellizerStorage) {
function Local (line 478) | function Local($http, SatellizerConfig, SatellizerShared) {
function Popup (line 508) | function Popup($interval, $window, $q) {
function OAuth1 (line 625) | function OAuth1($http, $window, SatellizerConfig, SatellizerPopup) {
function OAuth2 (line 692) | function OAuth2($http, $window, $timeout, $q, SatellizerConfig, Satelliz...
function OAuth (line 809) | function OAuth($http, $window, $timeout, $q, SatellizerConfig, Satellize...
function Storage (line 870) | function Storage($window, SatellizerConfig) {
function Interceptor (line 904) | function Interceptor(SatellizerConfig, SatellizerShared, SatellizerStora...
function HttpProviderConfig (line 934) | function HttpProviderConfig($httpProvider) {
FILE: examples/client/vendor/angular-animate.js
function assertArg (line 79) | function assertArg(arg, name, reason) {
function mergeClasses (line 86) | function mergeClasses(a,b) {
function packageStyles (line 95) | function packageStyles(options) {
function pendClasses (line 104) | function pendClasses(classes, fix, isPrefix) {
function removeFromArray (line 121) | function removeFromArray(arr, val) {
function stripCommentsFromElement (line 128) | function stripCommentsFromElement(element) {
function extractElementNode (line 155) | function extractElementNode(element) {
function $$addClass (line 165) | function $$addClass($$jqLite, element, className) {
function $$removeClass (line 171) | function $$removeClass($$jqLite, element, className) {
function applyAnimationClassesFactory (line 177) | function applyAnimationClassesFactory($$jqLite) {
function prepareAnimationOptions (line 190) | function prepareAnimationOptions(options) {
function applyAnimationStyles (line 204) | function applyAnimationStyles(element, options) {
function applyAnimationFromStyles (line 209) | function applyAnimationFromStyles(element, options) {
function applyAnimationToStyles (line 216) | function applyAnimationToStyles(element, options) {
function mergeAnimationOptions (line 223) | function mergeAnimationOptions(element, target, newOptions) {
function resolveElementClasses (line 258) | function resolveElementClasses(existing, toAdd, toRemove) {
function getDomNode (line 316) | function getDomNode(element) {
function applyGeneratedPreparationClasses (line 320) | function applyGeneratedPreparationClasses(element, event, options) {
function clearGeneratedClasses (line 337) | function clearGeneratedClasses(element, options) {
function blockTransitions (line 348) | function blockTransitions(node, duration) {
function blockKeyframeAnimations (line 357) | function blockKeyframeAnimations(node, applyBlock) {
function applyInlineStyle (line 364) | function applyInlineStyle(node, styleTuple) {
function concatWithSpace (line 370) | function concatWithSpace(a,b) {
function scheduler (line 379) | function scheduler(tasks) {
function nextTick (line 409) | function nextTick() {
function getCssKeyframeDurationStyle (line 675) | function getCssKeyframeDurationStyle(duration) {
function getCssDelayStyle (line 679) | function getCssDelayStyle(delay, isKeyframeAnimation) {
function computeCssStyles (line 684) | function computeCssStyles($window, element, properties) {
function parseMaxTime (line 710) | function parseMaxTime(str) {
function truthyTimingValue (line 725) | function truthyTimingValue(val) {
function getCssTransitionDurationStyle (line 729) | function getCssTransitionDurationStyle(duration, applyOnlyDuration) {
function createLocalCacheLookup (line 740) | function createLocalCacheLookup() {
function registerRestorableStyles (line 776) | function registerRestorableStyles(backup, node, properties) {
function gcsHashFn (line 796) | function gcsHashFn(node, extraClasses) {
function computeCachedCssStyles (line 803) | function computeCachedCssStyles(node, className, cacheKey, properties) {
function computeCachedCssStaggerStyles (line 819) | function computeCachedCssStaggerStyles(node, className, cacheKey, proper...
function waitUntilQuiet (line 850) | function waitUntilQuiet(callback) {
function computeTimings (line 869) | function computeTimings(node, className, cacheKey) {
function endFn (line 1125) | function endFn() {
function cancelFn (line 1129) | function cancelFn() {
function close (line 1133) | function close(rejected) { // jshint ignore:line
function applyBlocking (line 1180) | function applyBlocking(duration) {
function closeAndReturnNoopAnimator (line 1190) | function closeAndReturnNoopAnimator() {
function start (line 1209) | function start() {
function isDocumentFragment (line 1418) | function isDocumentFragment(node) {
function filterCssClasses (line 1449) | function filterCssClasses(classes) {
function getUniqueValues (line 1454) | function getUniqueValues(a, b) {
function prepareAnchoredAnimation (line 1462) | function prepareAnchoredAnimation(classes, outAnchor, inAnchor) {
function prepareFromToAnchorAnimation (line 1589) | function prepareFromToAnchorAnimation(from, to, classes, anchors) {
function prepareRegularAnimation (line 1642) | function prepareRegularAnimation(animationDetails) {
function applyOptions (line 1735) | function applyOptions() {
function onComplete (line 1779) | function onComplete(success) {
function endAnimations (line 1786) | function endAnimations(cancelled) {
function executeAnimationFn (line 1795) | function executeAnimationFn(fn, element, event, options, onDone) {
function groupEventedAnimations (line 1838) | function groupEventedAnimations(element, event, options, animations, fnN...
function packageAnimations (line 1879) | function packageAnimations(element, event, options, animations, fnName) {
function lookupAnimations (line 1921) | function lookupAnimations(classes) {
function endFnFactory (line 1967) | function endFnFactory() {
function done (line 1976) | function done(status) {
function prepareAnimation (line 1986) | function prepareAnimation(animationDetails) {
function isAllowed (line 2009) | function isAllowed(ruleType, element, currentAnimation, previousAnimatio...
function hasAnimationClasses (line 2015) | function hasAnimationClasses(options, and) {
function postDigestTaskFactory (line 2072) | function postDigestTaskFactory() {
function normalizeAnimationOptions (line 2132) | function normalizeAnimationOptions(element, options) {
function findCallbacks (line 2136) | function findCallbacks(element, event) {
function filterFromRegistry (line 2170) | function filterFromRegistry(list, matchContainer, matchCallback) {
function queueAnimation (line 2232) | function queueAnimation(element, event, options) {
function closeChildAnimations (line 2495) | function closeChildAnimations(element) {
function clearElementAnimationState (line 2514) | function clearElementAnimationState(element) {
function isMatchingElement (line 2520) | function isMatchingElement(nodeOrElmA, nodeOrElmB) {
function areAnimationsAllowed (line 2524) | function areAnimationsAllowed(element, parentElement, event) {
function markElementAnimationState (line 2592) | function markElementAnimationState(element, state, details) {
function waitForTick (line 2611) | function waitForTick(fn) {
function next (line 2644) | function next() {
function onProgress (line 2668) | function onProgress(response) {
function AnimateRunner (line 2676) | function AnimateRunner(host) {
function setRunner (line 2780) | function setRunner(element, runner) {
function removeRunner (line 2784) | function removeRunner(element) {
function getRunner (line 2788) | function getRunner(element) {
function sortAnimations (line 2798) | function sortAnimations(animations) {
function getAnchorNodes (line 2992) | function getAnchorNodes(node) {
function groupAnimations (line 3007) | function groupAnimations(animations) {
function cssClassesIntersection (line 3090) | function cssClassesIntersection(a,b) {
function invokeFirstDriver (line 3110) | function invokeFirstDriver(animationDetails) {
function beforeStart (line 3125) | function beforeStart() {
function updateAnimationRunners (line 3132) | function updateAnimationRunners(animation, newRunner) {
function handleDestroyedElement (line 3145) | function handleDestroyedElement() {
function close (line 3152) | function close(rejected) { // jshint ignore:line
FILE: examples/client/vendor/angular-messages.js
function findPreviousMessage (line 428) | function findPreviousMessage(parent, comment) {
function insertMessageNode (line 448) | function insertMessageNode(parent, comment, key) {
function removeMessageNode (line 464) | function removeMessageNode(parent, comment, key) {
function isAttrTruthy (line 477) | function isAttrTruthy(scope, attr) {
function truthy (line 482) | function truthy(val) {
function ngMessageDirectiveFactory (line 607) | function ngMessageDirectiveFactory(restrict) {
FILE: examples/client/vendor/angular-mocks.js
function concat (line 281) | function concat(array1, array2, index) {
function tick (line 461) | function tick() {
function jsonStringToDate (line 557) | function jsonStringToDate(string) {
function toInt (line 577) | function toInt(str) {
function padNumber (line 581) | function padNumber(num, digits, trim) {
function reflowFn (line 766) | function reflowFn() {
method reflows (line 803) | get reflows() {
function serialize (line 870) | function serialize(object) {
function serializeScope (line 903) | function serializeScope(scope, offset) {
function createHttpBackendMock (line 1155) | function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
function MockHttpExpectation (line 1633) | function MockHttpExpectation(method, url, data, headers) {
function createMockXhr (line 1674) | function createMockXhr() {
function MockXhr (line 1678) | function MockXhr() {
function formatPendingTasksAsString (line 1767) | function formatPendingTasksAsString(tasks) {
function countChildScopes (line 2156) | function countChildScopes() {
function countWatchers (line 2188) | function countWatchers() {
function workFn (line 2288) | function workFn() {
function workFn (line 2412) | function workFn() {
function workFn (line 2457) | function workFn() {
FILE: examples/client/vendor/angular-resource.js
function isValidDottedPath (line 15) | function isValidDottedPath(path) {
function lookupDottedPath (line 20) | function lookupDottedPath(obj, path) {
function shallowClearAndCopy (line 35) | function shallowClearAndCopy(src, dst) {
function encodeUriSegment (line 392) | function encodeUriSegment(val) {
function encodeUriQuery (line 411) | function encodeUriQuery(val, pctEncodeSpaces) {
function Route (line 420) | function Route(template, defaults) {
function resourceFactory (line 493) | function resourceFactory(url, paramDefaults, actions, options) {
FILE: examples/client/vendor/angular-sanitize.js
function $SanitizeProvider (line 151) | function $SanitizeProvider() {
function sanitizeText (line 163) | function sanitizeText(chars) {
function makeMap (line 262) | function makeMap(str, lowercaseKeys) {
function htmlParser (line 283) | function htmlParser(html, handler) {
function decodeEntities (line 439) | function decodeEntities(value) {
function encodeEntities (line 455) | function encodeEntities(value) {
function htmlSanitizeWriter (line 480) | function htmlSanitizeWriter(buf, uriValidator) {
function addText (line 659) | function addText(text) {
function addLink (line 666) | function addLink(url, text) {
FILE: examples/client/vendor/angular-toastr.js
function toastr (line 9) | function toastr($animate, $injector, $document, $rootScope, $sce, toastr...
function progressBar (line 312) | function progressBar(toastrConfig) {
function ToastController (line 362) | function ToastController() {
function toast (line 387) | function toast($injector, $interval, toastrConfig, toastr) {
FILE: examples/client/vendor/angular-toastr.tpls.js
function toastr (line 9) | function toastr($animate, $injector, $document, $rootScope, $sce, toastr...
function progressBar (line 312) | function progressBar(toastrConfig) {
function ToastController (line 362) | function ToastController() {
function toast (line 387) | function toast($injector, $interval, toastrConfig, toastr) {
FILE: examples/client/vendor/angular-ui-router.js
function inherit (line 27) | function inherit(parent, extra) {
function merge (line 31) | function merge(dst) {
function ancestors (line 49) | function ancestors(first, second) {
function objectKeys (line 65) | function objectKeys(object) {
function indexOf (line 84) | function indexOf(array, value) {
function inheritParams (line 108) | function inheritParams(currentParams, newParams, $current, $to) {
function equalForKeys (line 134) | function equalForKeys(a, b, keys) {
function filterByKeys (line 154) | function filterByKeys(keys, values) {
function indexBy (line 165) | function indexBy(array, propName) {
function pick (line 175) | function pick(obj) {
function omit (line 186) | function omit(obj) {
function pluck (line 195) | function pluck(collection, key) {
function filter (line 204) | function filter(collection, callback) {
function map (line 215) | function map(collection, callback) {
function $Resolve (line 318) | function $Resolve( $q, $injector) {
function $TemplateFactory (line 572) | function $TemplateFactory( $http, $templateCache, $injector) {
function UrlMatcher (line 738) | function UrlMatcher(pattern, config, parentMatcher) {
function decodePathArray (line 913) | function decodePathArray(string) {
function encodeDashes (line 999) | function encodeDashes(str) { // Replace dashes with encoded "\-"
function Type (line 1069) | function Type(config) {
function ArrayType (line 1172) | function ArrayType(type, mode) {
function $UrlMatcherFactory (line 1237) | function $UrlMatcherFactory() {
function $UrlRouterProvider (line 1739) | function $UrlRouterProvider( $locationProvider, $urlMatcherFactory) {
function $StateProvider (line 2172) | function $StateProvider( $urlRouterProvider, $urlMatcherFactory) {
function $ViewProvider (line 3618) | function $ViewProvider() {
function $ViewScrollProvider (line 3695) | function $ViewScrollProvider() {
function $ViewDirective (line 3855) | function $ViewDirective( $state, $injector, $uiViewScroll, $inte...
function $ViewDirectiveFill (line 3995) | function $ViewDirectiveFill ( $compile, $controller, $state, $int...
function getUiViewName (line 4036) | function getUiViewName(scope, attrs, element, $interpolate) {
function parseStateRef (line 4045) | function parseStateRef(ref, current) {
function stateContext (line 4053) | function stateContext(el) {
function $StateRefDirective (line 4124) | function $StateRefDirective($state, $timeout) {
function $StateRefActiveDirective (line 4272) | function $StateRefActiveDirective($state, $stateParams, $interpolate) {
function $IsStateFilter (line 4341) | function $IsStateFilter($state) {
function $IncludedByStateFilter (line 4359) | function $IncludedByStateFilter($state) {
FILE: examples/client/vendor/angular.js
function minErr (line 38) | function minErr(module, ErrorConstructor) {
function isArrayLike (line 269) | function isArrayLike(obj) {
function forEach (line 321) | function forEach(obj, iterator, context) {
function forEachSorted (line 365) | function forEachSorted(obj, iterator, context) {
function reverseParams (line 379) | function reverseParams(iteratorFn) {
function nextUid (line 393) | function nextUid() {
function setHashKey (line 403) | function setHashKey(obj, h) {
function baseExtend (line 412) | function baseExtend(dst, objs, deep) {
function extend (line 460) | function extend(dst) {
function merge (line 483) | function merge(dst) {
function toInt (line 489) | function toInt(str) {
function inherit (line 494) | function inherit(parent, extra) {
function noop (line 514) | function noop() {}
function identity (line 536) | function identity($) {return $;}
function valueFn (line 540) | function valueFn(value) {return function() {return value;};}
function hasCustomToString (line 542) | function hasCustomToString(obj) {
function isUndefined (line 559) | function isUndefined(value) {return typeof value === 'undefined';}
function isDefined (line 574) | function isDefined(value) {return typeof value !== 'undefined';}
function isObject (line 590) | function isObject(value) {
function isBlankObject (line 601) | function isBlankObject(value) {
function isString (line 618) | function isString(value) {return typeof value === 'string';}
function isNumber (line 639) | function isNumber(value) {return typeof value === 'number';}
function isDate (line 654) | function isDate(value) {
function isFunction (line 685) | function isFunction(value) {return typeof value === 'function';}
function isRegExp (line 695) | function isRegExp(value) {
function isWindow (line 707) | function isWindow(obj) {
function isScope (line 712) | function isScope(obj) {
function isFile (line 717) | function isFile(obj) {
function isFormData (line 722) | function isFormData(obj) {
function isBlob (line 727) | function isBlob(obj) {
function isBoolean (line 732) | function isBoolean(value) {
function isPromiseLike (line 737) | function isPromiseLike(obj) {
function isTypedArray (line 743) | function isTypedArray(value) {
function isElement (line 773) | function isElement(node) {
function makeMap (line 783) | function makeMap(str) {
function nodeName_ (line 792) | function nodeName_(element) {
function includes (line 796) | function includes(array, obj) {
function arrayRemove (line 800) | function arrayRemove(array, value) {
function copy (line 866) | function copy(source, destination, stackSource, stackDest) {
function shallowCopy (line 965) | function shallowCopy(src, dst) {
function equals (line 1015) | function equals(o1, o2) {
function noUnsafeEval (line 1081) | function noUnsafeEval() {
function concat (line 1146) | function concat(array1, array2, index) {
function sliceArgs (line 1150) | function sliceArgs(args, startIndex) {
function bind (line 1174) | function bind(self, fn) {
function toJsonReplacer (line 1195) | function toJsonReplacer(key, value) {
function toJson (line 1227) | function toJson(obj, pretty) {
function fromJson (line 1248) | function fromJson(json) {
function timezoneToOffset (line 1255) | function timezoneToOffset(timezone, fallback) {
function addDateMinutes (line 1261) | function addDateMinutes(date, minutes) {
function convertTimezoneToLocal (line 1268) | function convertTimezoneToLocal(date, timezone, reverse) {
function startingTag (line 1278) | function startingTag(element) {
function tryDecodeURIComponent (line 1308) | function tryDecodeURIComponent(value) {
function parseKeyValue (line 1321) | function parseKeyValue(/**string*/keyValue) {
function toKeyValue (line 1348) | function toKeyValue(obj) {
function encodeUriSegment (line 1376) | function encodeUriSegment(val) {
function encodeUriQuery (line 1395) | function encodeUriQuery(val, pctEncodeSpaces) {
function getNgAttribute (line 1407) | function getNgAttribute(element, ngAttr) {
function angularInit (line 1545) | function angularInit(element, bootstrap) {
function bootstrap (line 1624) | function bootstrap(element, modules, config) {
function reloadWithDebugInfo (line 1702) | function reloadWithDebugInfo() {
function getTestability (line 1715) | function getTestability(rootElement) {
function snake_case (line 1725) | function snake_case(name, separator) {
function bindJQuery (line 1734) | function bindJQuery() {
function assertArg (line 1793) | function assertArg(arg, name, reason) {
function assertArgFn (line 1800) | function assertArgFn(arg, name, acceptArrayAnnotation) {
function assertNotHasOwnProperty (line 1815) | function assertNotHasOwnProperty(name, context) {
function getter (line 1829) | function getter(obj, path, bindFnToScope) {
function getBlockNodes (line 1853) | function getBlockNodes(nodes) {
function createMap (line 1881) | function createMap() {
function setupModuleLoader (line 1901) | function setupModuleLoader(window) {
function serializeObject (line 2243) | function serializeObject(obj) {
function toDebugString (line 2258) | function toDebugString(obj) {
function publishExternalAPI (line 2385) | function publishExternalAPI(angular) {
function jqNextId (line 2651) | function jqNextId() { return ++jqId; }
function camelCase (line 2664) | function camelCase(name) {
function jqLiteIsTextNode (line 2692) | function jqLiteIsTextNode(html) {
function jqLiteAcceptsData (line 2696) | function jqLiteAcceptsData(node) {
function jqLiteHasData (line 2703) | function jqLiteHasData(node) {
function jqLiteBuildFragment (line 2710) | function jqLiteBuildFragment(html, context) {
function jqLiteParseHTML (line 2747) | function jqLiteParseHTML(html, context) {
function JQLite (line 2763) | function JQLite(element) {
function jqLiteClone (line 2788) | function jqLiteClone(element) {
function jqLiteDealoc (line 2792) | function jqLiteDealoc(element, onlyDescendants) {
function jqLiteOff (line 2803) | function jqLiteOff(element, type, fn, unsupported) {
function jqLiteRemoveData (line 2835) | function jqLiteRemoveData(element, name) {
function jqLiteExpandoStore (line 2857) | function jqLiteExpandoStore(element, createIfNecessary) {
function jqLiteData (line 2870) | function jqLiteData(element, key, value) {
function jqLiteHasClass (line 2896) | function jqLiteHasClass(element, selector) {
function jqLiteRemoveClass (line 2902) | function jqLiteRemoveClass(element, cssClasses) {
function jqLiteAddClass (line 2914) | function jqLiteAddClass(element, cssClasses) {
function jqLiteAddNodes (line 2931) | function jqLiteAddNodes(root, elements) {
function jqLiteController (line 2957) | function jqLiteController(element, name) {
function jqLiteInheritedData (line 2961) | function jqLiteInheritedData(element, name, value) {
function jqLiteEmpty (line 2981) | function jqLiteEmpty(element) {
function jqLiteRemove (line 2988) | function jqLiteRemove(element, keepData) {
function jqLiteDocumentLoaded (line 2995) | function jqLiteDocumentLoaded(action, win) {
function trigger (line 3015) | function trigger() {
function getBooleanAttrName (line 3069) | function getBooleanAttrName(element, name) {
function getAliasedAttrName (line 3077) | function getAliasedAttrName(element, name) {
function getText (line 3170) | function getText(element, value) {
function createEventHandler (line 3255) | function createEventHandler(element, events) {
function $$jqLiteProvider (line 3551) | function $$jqLiteProvider() {
function hashKey (line 3582) | function hashKey(obj, nextUidFn) {
function HashMap (line 3605) | function HashMap(array, isolatedUid) {
function anonFn (line 3717) | function anonFn(fn) {
function annotate (line 3728) | function annotate(fn, strictDi, name) {
function createInjector (line 4263) | function createInjector(modulesToLoad, strictDi) {
function $AnchorScrollProvider (line 4508) | function $AnchorScrollProvider() {
function mergeClasses (line 4775) | function mergeClasses(a,b) {
function extractElementNode (line 4784) | function extractElementNode(element) {
function splitClasses (line 4793) | function splitClasses(classes) {
function prepareAnimateOptions (line 4818) | function prepareAnimateOptions(options) {
function AnimateRunner (line 4826) | function AnimateRunner() {}
function addRemoveClassesPostDigest (line 4876) | function addRemoveClassesPostDigest(element, add, remove) {
function domInsert (line 5030) | function domInsert(element, parentElement, afterElement) {
function run (line 5414) | function run() {
function close (line 5425) | function close() {
function Browser (line 5466) | function Browser(window, document, $log, $sniffer) {
function $BrowserProvider (line 5791) | function $BrowserProvider() {
function $CacheFactoryProvider (line 5879) | function $CacheFactoryProvider() {
function $TemplateCacheProvider (line 6192) | function $TemplateCacheProvider() {
function $CompileProvider (line 6920) | function $CompileProvider($provide, $$sanitizeUriProvider) {
function directiveNormalize (line 8861) | function directiveNormalize(name) {
function nodesetLinkingFn (line 8910) | function nodesetLinkingFn(
function directiveLinkingFn (line 8917) | function directiveLinkingFn(
function tokenDifference (line 8925) | function tokenDifference(str1, str2) {
function removeComments (line 8941) | function removeComments(jqNodes) {
function identifierForController (line 8962) | function identifierForController(controller, ident) {
function $ControllerProvider (line 8981) | function $ControllerProvider() {
function $DocumentProvider (line 9154) | function $DocumentProvider() {
function $ExceptionHandlerProvider (line 9200) | function $ExceptionHandlerProvider() {
function serializeValue (line 9246) | function serializeValue(v) {
function $HttpParamSerializerProvider (line 9254) | function $HttpParamSerializerProvider() {
function $HttpParamSerializerJQLikeProvider (line 9291) | function $HttpParamSerializerJQLikeProvider() {
function defaultHttpResponseTransform (line 9363) | function defaultHttpResponseTransform(data, headers) {
function isJsonLike (line 9379) | function isJsonLike(str) {
function parseHeaders (line 9390) | function parseHeaders(headers) {
function headersGetter (line 9426) | function headersGetter(headers) {
function transformData (line 9456) | function transformData(data, headers, status, fns) {
function isSuccess (line 9469) | function isSuccess(status) {
function $HttpProvider (line 9480) | function $HttpProvider() {
function createXhr (line 10552) | function createXhr() {
function $HttpBackendProvider (line 10572) | function $HttpBackendProvider() {
function createHttpBackend (line 10578) | function createHttpBackend($browser, createXhr, $browserDefer, callbacks...
function $InterpolateProvider (line 10772) | function $InterpolateProvider() {
function $IntervalProvider (line 11075) | function $IntervalProvider() {
function encodePath (line 11287) | function encodePath(path) {
function parseAbsoluteUrl (line 11298) | function parseAbsoluteUrl(absoluteUrl, locationObj) {
function parseAppUrl (line 11307) | function parseAppUrl(relativeUrl, locationObj) {
function beginsWith (line 11332) | function beginsWith(begin, whole) {
function stripHash (line 11339) | function stripHash(url) {
function trimEmptyHash (line 11344) | function trimEmptyHash(url) {
function stripFile (line 11349) | function stripFile(url) {
function serverBase (line 11354) | function serverBase(url) {
function LocationHtml5Url (line 11368) | function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {
function LocationHashbangUrl (line 11447) | function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {
function LocationHashbangInHtml5Url (line 11559) | function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) {
function locationGetter (line 11923) | function locationGetter(property) {
function locationGetterSetter (line 11930) | function locationGetterSetter(property, preprocess) {
function $LocationProvider (line 11976) | function $LocationProvider() {
function $LogProvider (line 12310) | function $LogProvider() {
function ensureSafeMemberName (line 12466) | function ensureSafeMemberName(name, fullExpression) {
function ensureSafeObject (line 12477) | function ensureSafeObject(obj, fullExpression) {
function ensureSafeFunction (line 12508) | function ensureSafeFunction(obj, fullExpression) {
function ifDefined (line 13029) | function ifDefined(v, d) {
function plusFn (line 13033) | function plusFn(l, r) {
function isStateless (line 13039) | function isStateless($filter, filterName) {
function findConstantAndWatchExpressions (line 13044) | function findConstantAndWatchExpressions(ast, $filter) {
function getInputs (line 13148) | function getInputs(body) {
function isAssignable (line 13156) | function isAssignable(ast) {
function assignableAST (line 13160) | function assignableAST(ast) {
function isLiteral (line 13166) | function isLiteral(ast) {
function isConstant (line 13174) | function isConstant(ast) {
function ASTCompiler (line 13178) | function ASTCompiler(astBuilder, $filter) {
function ASTInterpreter (line 13651) | function ASTInterpreter(astBuilder, $filter) {
function isPossiblyDangerousMemberName (line 14042) | function isPossiblyDangerousMemberName(name) {
function getValueOf (line 14048) | function getValueOf(value) {
function $ParseProvider (line 14103) | function $ParseProvider() {
function $QProvider (line 14531) | function $QProvider() {
function $$QProvider (line 14540) | function $$QProvider() {
function qFactory (line 14556) | function qFactory(nextTick, exceptionHandler) {
function $$RAFProvider (line 14910) | function $$RAFProvider() { //rAF
function $RootScopeProvider (line 15045) | function $RootScopeProvider() {
function $$SanitizeUriProvider (line 16330) | function $$SanitizeUriProvider() {
function adjustMatcher (line 16421) | function adjustMatcher(matcher) {
function adjustMatchers (line 16449) | function adjustMatchers(matchers) {
function $SceDelegateProvider (line 16527) | function $SceDelegateProvider() {
function $SceProvider (line 17057) | function $SceProvider() {
function $SnifferProvider (line 17469) | function $SnifferProvider() {
function $TemplateRequestProvider (line 17563) | function $TemplateRequestProvider() {
function $$TestabilityProvider (line 17616) | function $$TestabilityProvider() {
function $TimeoutProvider (line 17731) | function $TimeoutProvider() {
function urlResolve (line 17882) | function urlResolve(url) {
function urlIsSameOrigin (line 17916) | function urlIsSameOrigin(requestUrl) {
function $WindowProvider (line 17963) | function $WindowProvider() {
function $$CookieReader (line 17976) | function $$CookieReader($document) {
function $$CookieReaderProvider (line 18018) | function $$CookieReaderProvider() {
function $FilterProvider (line 18122) | function $FilterProvider($provide) {
function filterFilter (line 18312) | function filterFilter() {
function createPredicateFn (line 18349) | function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
function deepCompare (line 18386) | function deepCompare(actual, expected, comparator, matchAgainstAnyProp, ...
function getTypeForFilter (line 18436) | function getTypeForFilter(val) {
function currencyFilter (line 18493) | function currencyFilter($locale) {
function numberFilter (line 18567) | function numberFilter($locale) {
function formatNumber (line 18580) | function formatNumber(number, pattern, groupSep, decimalSep, fractionSiz...
function padNumber (line 18667) | function padNumber(num, digits, trim) {
function dateGetter (line 18682) | function dateGetter(name, size, offset, trim) {
function dateStrGetter (line 18694) | function dateStrGetter(name, shortForm) {
function timeZoneGetter (line 18703) | function timeZoneGetter(date, formats, offset) {
function getFirstThursdayOfYear (line 18713) | function getFirstThursdayOfYear(year) {
function getThursdayThisWeek (line 18721) | function getThursdayThisWeek(datetime) {
function weekGetter (line 18727) | function weekGetter(size) {
function ampmGetter (line 18739) | function ampmGetter(date, formats) {
function eraGetter (line 18743) | function eraGetter(date, formats) {
function longEraGetter (line 18747) | function longEraGetter(date, formats) {
function dateFilter (line 18881) | function dateFilter($locale) {
function jsonFilter (line 18988) | function jsonFilter() {
function limitToFilter (line 19117) | function limitToFilter() {
function orderByFilter (line 19318) | function orderByFilter($parse) {
function ngDirective (line 19436) | function ngDirective(directive) {
function defaultLinkFn (line 19838) | function defaultLinkFn(scope, element, attr) {
function nullFormRenameControl (line 19940) | function nullFormRenameControl(control, name) {
function FormController (line 19987) | function FormController(element, attrs, $scope, $animate, $interpolate) {
function getSetter (line 20442) | function getSetter(expression) {
function stringBasedInputType (line 21490) | function stringBasedInputType(ctrl) {
function textInputType (line 21496) | function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function baseInputType (line 21501) | function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function weekParser (line 21591) | function weekParser(isoWeek, existingDate) {
function createDateParser (line 21623) | function createDateParser(regexp, mapping) {
function createDateInputType (line 21673) | function createDateInputType(type, regexp, parseDate, format) {
function badInputChecker (line 21745) | function badInputChecker(scope, element, attr, ctrl) {
function numberInputType (line 21760) | function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function urlInputType (line 21814) | function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function emailInputType (line 21827) | function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function radioInputType (line 21840) | function radioInputType(scope, element, attr, ctrl) {
function parseConstantExpr (line 21862) | function parseConstantExpr($parse, context, name, expression, fallback) {
function checkboxInputType (line 21875) | function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browse...
function classDirective (line 22458) | function classDirective(name, selector) {
function processParseErrors (line 25004) | function processParseErrors() {
function processSyncValidators (line 25024) | function processSyncValidators() {
function processAsyncValidators (line 25040) | function processAsyncValidators() {
function setValidity (line 25066) | function setValidity(name, isValid) {
function validationDone (line 25072) | function validationDone(allValid) {
function writeToModelIfNeeded (line 25151) | function writeToModelIfNeeded() {
function addSetValidityMethod (line 25696) | function addSetValidityMethod(context) {
function isObjectEmpty (line 25791) | function isObjectEmpty(obj) {
function parseOptionsExpression (line 26066) | function parseOptionsExpression(optionsExp, selectElement, scope) {
function updateOptionElement (line 26412) | function updateOptionElement(option, element) {
function addOrReuseElement (line 26422) | function addOrReuseElement(parent, current, type, templateElement) {
function removeExcessElements (line 26443) | function removeExcessElements(current) {
function skipEmptyAndUnknownOptions (line 26453) | function skipEmptyAndUnknownOptions(current) {
function updateOptions (line 26468) | function updateOptions() {
function updateElementText (line 26794) | function updateElementText(newText) {
function chromeHack (line 28301) | function chromeHack(optionElement) {
function getDecimals (line 28472) | function getDecimals(n) {
function getVF (line 28478) | function getVF(n, opt_precision) {
FILE: examples/client/vendor/satellizer.js
function Config (line 14) | function Config() {
function AuthProvider (line 169) | function AuthProvider(SatellizerConfig) {
function joinUrl (line 315) | function joinUrl(baseUrl, url) {
function getFullUrlPath (line 329) | function getFullUrlPath(location) {
function parseQueryString (line 335) | function parseQueryString(str) {
function decodeBase64 (line 348) | function decodeBase64(str) {
function Shared (line 399) | function Shared($q, $window, SatellizerConfig, SatellizerStorage) {
function Local (line 478) | function Local($http, SatellizerConfig, SatellizerShared) {
function Popup (line 508) | function Popup($interval, $window, $q) {
function OAuth1 (line 625) | function OAuth1($http, $window, SatellizerConfig, SatellizerPopup) {
function OAuth2 (line 692) | function OAuth2($http, $window, $timeout, $q, SatellizerConfig, Satelliz...
function OAuth (line 809) | function OAuth($http, $window, $timeout, $q, SatellizerConfig, Satellize...
function Storage (line 870) | function Storage($window, SatellizerConfig) {
function Interceptor (line 904) | function Interceptor(SatellizerConfig, SatellizerShared, SatellizerStora...
function HttpProviderConfig (line 934) | function HttpProviderConfig($httpProvider) {
FILE: examples/ionic/hooks/after_platform_add/010_install_plugins.js
function puts (line 24) | function puts(error, stdout, stderr) {
FILE: examples/ionic/hooks/after_prepare/010_add_platform_class.js
function addPlatformBodyTag (line 16) | function addPlatformBodyTag(indexPath, platform) {
function findBodyTag (line 54) | function findBodyTag(html) {
function findClassAttr (line 61) | function findClassAttr(bodyTag) {
FILE: examples/ionic/www/lib/ionic/js/angular-ui/angular-ui-router.js
function inherit (line 27) | function inherit(parent, extra) {
function merge (line 31) | function merge(dst) {
function ancestors (line 49) | function ancestors(first, second) {
function objectKeys (line 65) | function objectKeys(object) {
function indexOf (line 84) | function indexOf(array, value) {
function inheritParams (line 108) | function inheritParams(currentParams, newParams, $current, $to) {
function equalForKeys (line 134) | function equalForKeys(a, b, keys) {
function filterByKeys (line 154) | function filterByKeys(keys, values) {
function indexBy (line 165) | function indexBy(array, propName) {
function pick (line 175) | function pick(obj) {
function omit (line 186) | function omit(obj) {
function pluck (line 195) | function pluck(collection, key) {
function filter (line 204) | function filter(collection, callback) {
function map (line 215) | function map(collection, callback) {
function $Resolve (line 318) | function $Resolve( $q, $injector) {
function $TemplateFactory (line 572) | function $TemplateFactory( $http, $templateCache, $injector) {
function UrlMatcher (line 738) | function UrlMatcher(pattern, config, parentMatcher) {
function decodePathArray (line 913) | function decodePathArray(string) {
function encodeDashes (line 999) | function encodeDashes(str) { // Replace dashes with encoded "\-"
function Type (line 1069) | function Type(config) {
function ArrayType (line 1168) | function ArrayType(type, mode) {
function $UrlMatcherFactory (line 1229) | function $UrlMatcherFactory() {
function $UrlRouterProvider (line 1725) | function $UrlRouterProvider( $locationProvider, $urlMatcherFactory) {
function $StateProvider (line 2144) | function $StateProvider( $urlRouterProvider, $urlMatcherFactory) {
function $ViewProvider (line 3498) | function $ViewProvider() {
function $ViewScrollProvider (line 3575) | function $ViewScrollProvider() {
function $ViewDirective (line 3735) | function $ViewDirective( $state, $injector, $uiViewScroll, $inte...
function $ViewDirectiveFill (line 3875) | function $ViewDirectiveFill ( $compile, $controller, $state, $int...
function getUiViewName (line 3915) | function getUiViewName(scope, attrs, element, $interpolate) {
function parseStateRef (line 3924) | function parseStateRef(ref, current) {
function stateContext (line 3932) | function stateContext(el) {
function $StateRefDirective (line 4003) | function $StateRefDirective($state, $timeout) {
function $StateRefActiveDirective (line 4148) | function $StateRefActiveDirective($state, $stateParams, $interpolate) {
function $IsStateFilter (line 4203) | function $IsStateFilter($state) {
function $IncludedByStateFilter (line 4221) | function $IncludedByStateFilter($state) {
FILE: examples/ionic/www/lib/ionic/js/angular/angular-animate.js
function extractElementNode (line 462) | function extractElementNode(element) {
function prepareElement (line 471) | function prepareElement(element) {
function stripCommentsFromElement (line 475) | function stripCommentsFromElement(element) {
function isMatchingElement (line 479) | function isMatchingElement(elm1, elm2) {
function classBasedAnimationsBlocked (line 523) | function classBasedAnimationsBlocked(element, setter) {
function runAnimationPostDigest (line 533) | function runAnimationPostDigest(fn) {
function parseAnimateOptions (line 546) | function parseAnimateOptions(options) {
function resolveElementClasses (line 558) | function resolveElementClasses(element, cache, runningAnimations) {
function lookup (line 602) | function lookup(name) {
function animationRunner (line 632) | function animationRunner(element, animationEvent, className, options) {
function performAnimation (line 1282) | function performAnimation(animationEvent, className, element, parentElem...
function cancelChildAnimations (line 1499) | function cancelChildAnimations(element) {
function cleanup (line 1517) | function cleanup(element, className) {
function animationsDisabled (line 1539) | function animationsDisabled(element, parentElement) {
function clearCacheAfterReflow (line 1632) | function clearCacheAfterReflow() {
function afterReflow (line 1642) | function afterReflow(element, callback) {
function animationCloseHandler (line 1661) | function animationCloseHandler(element, totalTime) {
function closeAllAnimations (line 1685) | function closeAllAnimations(elements) {
function getElementAnimationDetails (line 1696) | function getElementAnimationDetails(element, cacheKey) {
function parseMaxTime (line 1740) | function parseMaxTime(str) {
function getCacheKey (line 1751) | function getCacheKey(element) {
function animateSetup (line 1761) | function animateSetup(animationEvent, element, className, styles) {
function animateRun (line 1824) | function animateRun(animationEvent, element, className, activeAnimationC...
function blockTransitions (line 1979) | function blockTransitions(node, bool) {
function blockAnimations (line 1983) | function blockAnimations(node, bool) {
function animateBefore (line 1987) | function animateBefore(animationEvent, element, className, styles) {
function animateAfter (line 1995) | function animateAfter(animationEvent, element, className, afterAnimation...
function animate (line 2004) | function animate(animationEvent, element, className, animationComplete, ...
function animateClose (line 2033) | function animateClose(element, className) {
function suffixClasses (line 2123) | function suffixClasses(classes, suffix) {
FILE: examples/ionic/www/lib/ionic/js/angular/angular-resource.js
function isValidDottedPath (line 15) | function isValidDottedPath(path) {
function lookupDottedPath (line 20) | function lookupDottedPath(obj, path) {
function shallowClearAndCopy (line 35) | function shallowClearAndCopy(src, dst) {
function encodeUriSegment (line 389) | function encodeUriSegment(val) {
function encodeUriQuery (line 408) | function encodeUriQuery(val, pctEncodeSpaces) {
function Route (line 417) | function Route(template, defaults) {
function resourceFactory (line 485) | function resourceFactory(url, paramDefaults, actions, options) {
FILE: examples/ionic/www/lib/ionic/js/angular/angular-sanitize.js
function $SanitizeProvider (line 140) | function $SanitizeProvider() {
function sanitizeText (line 152) | function sanitizeText(chars) {
function makeMap (line 251) | function makeMap(str) {
function htmlParser (line 270) | function htmlParser(html, handler) {
function decodeEntities (line 425) | function decodeEntities(value) {
function encodeEntities (line 453) | function encodeEntities(value) {
function htmlSanitizeWriter (line 478) | function htmlSanitizeWriter(buf, uriValidator) {
function addText (line 657) | function addText(text) {
function addLink (line 664) | function addLink(url, text) {
FILE: examples/ionic/www/lib/ionic/js/angular/angular.js
function minErr (line 38) | function minErr(module, ErrorConstructor) {
function isArrayLike (line 258) | function isArrayLike(obj) {
function forEach (line 308) | function forEach(obj, iterator, context) {
function sortedKeys (line 339) | function sortedKeys(obj) {
function forEachSorted (line 343) | function forEachSorted(obj, iterator, context) {
function reverseParams (line 357) | function reverseParams(iteratorFn) {
function nextUid (line 371) | function nextUid() {
function setHashKey (line 381) | function setHashKey(obj, h) {
function extend (line 405) | function extend(dst) {
function int (line 423) | function int(str) {
function inherit (line 428) | function inherit(parent, extra) {
function noop (line 448) | function noop() {}
function identity (line 470) | function identity($) {return $;}
function valueFn (line 474) | function valueFn(value) {return function() {return value;};}
function isUndefined (line 488) | function isUndefined(value) {return typeof value === 'undefined';}
function isDefined (line 503) | function isDefined(value) {return typeof value !== 'undefined';}
function isObject (line 519) | function isObject(value) {
function isString (line 537) | function isString(value) {return typeof value === 'string';}
function isNumber (line 552) | function isNumber(value) {return typeof value === 'number';}
function isDate (line 567) | function isDate(value) {
function isFunction (line 598) | function isFunction(value) {return typeof value === 'function';}
function isRegExp (line 608) | function isRegExp(value) {
function isWindow (line 620) | function isWindow(obj) {
function isScope (line 625) | function isScope(obj) {
function isFile (line 630) | function isFile(obj) {
function isFormData (line 635) | function isFormData(obj) {
function isBlob (line 640) | function isBlob(obj) {
function isBoolean (line 645) | function isBoolean(value) {
function isPromiseLike (line 650) | function isPromiseLike(obj) {
function isElement (line 680) | function isElement(node) {
function makeMap (line 690) | function makeMap(str) {
function nodeName_ (line 698) | function nodeName_(element) {
function includes (line 702) | function includes(array, obj) {
function arrayRemove (line 706) | function arrayRemove(array, value) {
function copy (line 771) | function copy(source, destination, stackSource, stackDest) {
function shallowCopy (line 849) | function shallowCopy(src, dst) {
function equals (line 899) | function equals(o1, o2) {
function concat (line 961) | function concat(array1, array2, index) {
function sliceArgs (line 965) | function sliceArgs(args, startIndex) {
function bind (line 989) | function bind(self, fn) {
function toJsonReplacer (line 1010) | function toJsonReplacer(key, value) {
function toJson (line 1042) | function toJson(obj, pretty) {
function fromJson (line 1063) | function fromJson(json) {
function startingTag (line 1073) | function startingTag(element) {
function tryDecodeURIComponent (line 1103) | function tryDecodeURIComponent(value) {
function parseKeyValue (line 1116) | function parseKeyValue(/**string*/keyValue) {
function toKeyValue (line 1137) | function toKeyValue(obj) {
function encodeUriSegment (line 1165) | function encodeUriSegment(val) {
function encodeUriQuery (line 1184) | function encodeUriQuery(val, pctEncodeSpaces) {
function getNgAttribute (line 1196) | function getNgAttribute(element, ngAttr) {
function angularInit (line 1335) | function angularInit(element, bootstrap) {
function bootstrap (line 1414) | function bootstrap(element, modules, config) {
function reloadWithDebugInfo (line 1492) | function reloadWithDebugInfo() {
function getTestability (line 1505) | function getTestability(rootElement) {
function snake_case (line 1515) | function snake_case(name, separator) {
function bindJQuery (line 1524) | function bindJQuery() {
function assertArg (line 1578) | function assertArg(arg, name, reason) {
function assertArgFn (line 1585) | function assertArgFn(arg, name, acceptArrayAnnotation) {
function assertNotHasOwnProperty (line 1600) | function assertNotHasOwnProperty(name, context) {
function getter (line 1614) | function getter(obj, path, bindFnToScope) {
function getBlockNodes (line 1638) | function getBlockNodes(nodes) {
function createMap (line 1666) | function createMap() {
function setupModuleLoader (line 1685) | function setupModuleLoader(window) {
function serializeObject (line 1995) | function serializeObject(obj) {
function toDebugString (line 2010) | function toDebugString(obj) {
function publishExternalAPI (line 2132) | function publishExternalAPI(angular) {
function jqNextId (line 2384) | function jqNextId() { return ++jqId; }
function camelCase (line 2397) | function camelCase(name) {
function jqLiteIsTextNode (line 2425) | function jqLiteIsTextNode(html) {
function jqLiteAcceptsData (line 2429) | function jqLiteAcceptsData(node) {
function jqLiteBuildFragment (line 2436) | function jqLiteBuildFragment(html, context) {
function jqLiteParseHTML (line 2473) | function jqLiteParseHTML(html, context) {
function JQLite (line 2489) | function JQLite(element) {
function jqLiteClone (line 2514) | function jqLiteClone(element) {
function jqLiteDealoc (line 2518) | function jqLiteDealoc(element, onlyDescendants) {
function jqLiteOff (line 2529) | function jqLiteOff(element, type, fn, unsupported) {
function jqLiteRemoveData (line 2561) | function jqLiteRemoveData(element, name) {
function jqLiteExpandoStore (line 2583) | function jqLiteExpandoStore(element, createIfNecessary) {
function jqLiteData (line 2596) | function jqLiteData(element, key, value) {
function jqLiteHasClass (line 2622) | function jqLiteHasClass(element, selector) {
function jqLiteRemoveClass (line 2628) | function jqLiteRemoveClass(element, cssClasses) {
function jqLiteAddClass (line 2640) | function jqLiteAddClass(element, cssClasses) {
function jqLiteAddNodes (line 2657) | function jqLiteAddNodes(root, elements) {
function jqLiteController (line 2683) | function jqLiteController(element, name) {
function jqLiteInheritedData (line 2687) | function jqLiteInheritedData(element, name, value) {
function jqLiteEmpty (line 2707) | function jqLiteEmpty(element) {
function jqLiteRemove (line 2714) | function jqLiteRemove(element, keepData) {
function jqLiteDocumentLoaded (line 2721) | function jqLiteDocumentLoaded(action, win) {
function trigger (line 2741) | function trigger() {
function getBooleanAttrName (line 2795) | function getBooleanAttrName(element, name) {
function getAliasedAttrName (line 2803) | function getAliasedAttrName(element, name) {
function getText (line 2891) | function getText(element, value) {
function createEventHandler (line 2976) | function createEventHandler(element, events) {
function $$jqLiteProvider (line 3271) | function $$jqLiteProvider() {
function hashKey (line 3302) | function hashKey(obj, nextUidFn) {
function HashMap (line 3325) | function HashMap(array, isolatedUid) {
function anonFn (line 3431) | function anonFn(fn) {
function annotate (line 3442) | function annotate(fn, strictDi, name) {
function createInjector (line 3976) | function createInjector(modulesToLoad, strictDi) {
function $AnchorScrollProvider (line 4220) | function $AnchorScrollProvider() {
function runAnimationPostDigest (line 4563) | function runAnimationPostDigest(fn) {
function resolveElementClasses (line 4578) | function resolveElementClasses(element, classes) {
function cachedClassManipulation (line 4604) | function cachedClassManipulation(cache, classes, op) {
function asyncPromise (line 4611) | function asyncPromise() {
function applyStyles (line 4623) | function applyStyles(element, options) {
function $$AsyncCallbackProvider (line 4848) | function $$AsyncCallbackProvider() {
function Browser (line 4881) | function Browser(window, document, $log, $sniffer) {
function $BrowserProvider (line 5314) | function $BrowserProvider() {
function $CacheFactoryProvider (line 5402) | function $CacheFactoryProvider() {
function $TemplateCacheProvider (line 5715) | function $TemplateCacheProvider() {
function $CompileProvider (line 6420) | function $CompileProvider($provide, $$sanitizeUriProvider) {
function directiveNormalize (line 8232) | function directiveNormalize(name) {
function nodesetLinkingFn (line 8281) | function nodesetLinkingFn(
function directiveLinkingFn (line 8288) | function directiveLinkingFn(
function tokenDifference (line 8296) | function tokenDifference(str1, str2) {
function removeComments (line 8312) | function removeComments(jqNodes) {
function $ControllerProvider (line 8341) | function $ControllerProvider() {
function $DocumentProvider (line 8508) | function $DocumentProvider() {
function $ExceptionHandlerProvider (line 8554) | function $ExceptionHandlerProvider() {
function defaultHttpResponseTransform (line 8571) | function defaultHttpResponseTransform(data, headers) {
function isJsonLike (line 8587) | function isJsonLike(str) {
function parseHeaders (line 8598) | function parseHeaders(headers) {
function headersGetter (line 8629) | function headersGetter(headers) {
function transformData (line 8659) | function transformData(data, headers, status, fns) {
function isSuccess (line 8671) | function isSuccess(status) {
function $HttpProvider (line 8682) | function $HttpProvider() {
function createXhr (line 9718) | function createXhr() {
function $HttpBackendProvider (line 9738) | function $HttpBackendProvider() {
function createHttpBackend (line 9744) | function createHttpBackend($browser, createXhr, $browserDefer, callbacks...
function $InterpolateProvider (line 9928) | function $InterpolateProvider() {
function $IntervalProvider (line 10238) | function $IntervalProvider() {
function $LocaleProvider (line 10433) | function $LocaleProvider() {
function encodePath (line 10506) | function encodePath(path) {
function parseAbsoluteUrl (line 10517) | function parseAbsoluteUrl(absoluteUrl, locationObj) {
function parseAppUrl (line 10526) | function parseAppUrl(relativeUrl, locationObj) {
function beginsWith (line 10551) | function beginsWith(begin, whole) {
function stripHash (line 10558) | function stripHash(url) {
function trimEmptyHash (line 10563) | function trimEmptyHash(url) {
function stripFile (line 10568) | function stripFile(url) {
function serverBase (line 10573) | function serverBase(url) {
function LocationHtml5Url (line 10586) | function LocationHtml5Url(appBase, basePrefix) {
function LocationHashbangUrl (line 10665) | function LocationHashbangUrl(appBase, hashPrefix) {
function LocationHashbangInHtml5Url (line 10769) | function LocationHashbangInHtml5Url(appBase, hashPrefix) {
function locationGetter (line 11125) | function locationGetter(property) {
function locationGetterSetter (line 11132) | function locationGetterSetter(property, preprocess) {
function $LocationProvider (line 11177) | function $LocationProvider() {
function $LogProvider (line 11501) | function $LogProvider() {
function ensureSafeMemberName (line 11646) | function ensureSafeMemberName(name, fullExpression) {
function ensureSafeObject (line 11657) | function ensureSafeObject(obj, fullExpression) {
function ensureSafeFunction (line 11688) | function ensureSafeFunction(obj, fullExpression) {
function isConstant (line 11934) | function isConstant(exp) {
function setter (line 12425) | function setter(obj, locals, path, setValue, fullExp) {
function isPossiblyDangerousMemberName (line 12448) | function isPossiblyDangerousMemberName(name) {
function cspSafeGetterFn (line 12457) | function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, expensiv...
function getterFnWithEnsureSafeObject (line 12498) | function getterFnWithEnsureSafeObject(fn, fullExpression) {
function getterFn (line 12504) | function getterFn(path, options, fullExp) {
function getValueOf (line 12573) | function getValueOf(value) {
function $ParseProvider (line 12628) | function $ParseProvider() {
function $QProvider (line 13089) | function $QProvider() {
function $$QProvider (line 13098) | function $$QProvider() {
function qFactory (line 13114) | function qFactory(nextTick, exceptionHandler) {
function $$RAFProvider (line 13445) | function $$RAFProvider() { //rAF
function $RootScopeProvider (line 13542) | function $RootScopeProvider() {
function $$SanitizeUriProvider (line 14807) | function $$SanitizeUriProvider() {
function adjustMatcher (line 14887) | function adjustMatcher(matcher) {
function adjustMatchers (line 14915) | function adjustMatchers(matchers) {
function $SceDelegateProvider (line 14993) | function $SceDelegateProvider() {
function $SceProvider (line 15523) | function $SceProvider() {
function $SnifferProvider (line 15935) | function $SnifferProvider() {
function $TemplateRequestProvider (line 16027) | function $TemplateRequestProvider() {
function $$TestabilityProvider (line 16069) | function $$TestabilityProvider() {
function $TimeoutProvider (line 16184) | function $TimeoutProvider() {
function urlResolve (line 16330) | function urlResolve(url) {
function urlIsSameOrigin (line 16364) | function urlIsSameOrigin(requestUrl) {
function $WindowProvider (line 16411) | function $WindowProvider() {
function $FilterProvider (line 16508) | function $FilterProvider($provide) {
function filterFilter (line 16685) | function filterFilter() {
function createPredicateFn (line 16714) | function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
function deepCompare (line 16743) | function deepCompare(actual, expected, comparator, matchAgainstAnyProp, ...
function currencyFilter (line 16845) | function currencyFilter($locale) {
function numberFilter (line 16916) | function numberFilter($locale) {
function formatNumber (line 16929) | function formatNumber(number, pattern, groupSep, decimalSep, fractionSiz...
function padNumber (line 17010) | function padNumber(num, digits, trim) {
function dateGetter (line 17024) | function dateGetter(name, size, offset, trim) {
function dateStrGetter (line 17035) | function dateStrGetter(name, shortForm) {
function timeZoneGetter (line 17044) | function timeZoneGetter(date) {
function getFirstThursdayOfYear (line 17054) | function getFirstThursdayOfYear(year) {
function getThursdayThisWeek (line 17062) | function getThursdayThisWeek(datetime) {
function weekGetter (line 17068) | function weekGetter(size) {
function ampmGetter (line 17080) | function ampmGetter(date, formats) {
function dateFilter (line 17206) | function dateFilter($locale) {
function jsonFilter (line 17312) | function jsonFilter() {
function limitToFilter (line 17429) | function limitToFilter() {
function orderByFilter (line 17565) | function orderByFilter($parse) {
function ngDirective (line 17653) | function ngDirective(directive) {
function nullFormRenameControl (line 18134) | function nullFormRenameControl(control, name) {
function FormController (line 18181) | function FormController(element, attrs, $scope, $animate, $interpolate) {
function stringBasedInputType (line 19603) | function stringBasedInputType(ctrl) {
function textInputType (line 19609) | function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function baseInputType (line 19614) | function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function weekParser (line 19700) | function weekParser(isoWeek, existingDate) {
function createDateParser (line 19732) | function createDateParser(regexp, mapping) {
function createDateInputType (line 19782) | function createDateInputType(type, regexp, parseDate, format) {
function badInputChecker (line 19855) | function badInputChecker(scope, element, attr, ctrl) {
function numberInputType (line 19870) | function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function urlInputType (line 19924) | function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function emailInputType (line 19937) | function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function radioInputType (line 19950) | function radioInputType(scope, element, attr, ctrl) {
function parseConstantExpr (line 19972) | function parseConstantExpr($parse, context, name, expression, fallback) {
function checkboxInputType (line 19985) | function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browse...
function classDirective (line 20546) | function classDirective(name, selector) {
function processParseErrors (line 23027) | function processParseErrors(parseValid) {
function processSyncValidators (line 23046) | function processSyncValidators() {
function processAsyncValidators (line 23062) | function processAsyncValidators() {
function setValidity (line 23088) | function setValidity(name, isValid) {
function validationDone (line 23094) | function validationDone(allValid) {
function writeToModelIfNeeded (line 23173) | function writeToModelIfNeeded() {
function addSetValidityMethod (line 23699) | function addSetValidityMethod(context) {
function isObjectEmpty (line 23794) | function isObjectEmpty(obj) {
function updateElementText (line 24058) | function updateElementText(newText) {
function setupAsSingle (line 25549) | function setupAsSingle(scope, selectElement, ngModelCtrl, selectCtrl) {
function setupAsMultiple (line 25574) | function setupAsMultiple(scope, selectElement, ctrl) {
function setupAsOptions (line 25605) | function setupAsOptions(scope, selectElement, ctrl) {
FILE: examples/ionic/www/lib/ionic/js/ionic-angular.js
function actionSheet (line 120) | function actionSheet(opts) {
function retain (line 353) | function retain() {
function release (line 363) | function release() {
function getElement (line 374) | function getElement() {
function preventClick (line 527) | function preventClick(ev) {
function addClickBlock (line 532) | function addClickBlock() {
function removeClickBlock (line 547) | function removeClickBlock() {
function getViewById (line 693) | function getViewById(viewId) {
function getBackView (line 697) | function getBackView(view) {
function getForwardView (line 701) | function getForwardView(view) {
function getHistoryById (line 705) | function getHistoryById(historyId) {
function getHistory (line 709) | function getHistory(scope) {
function getParentHistoryObj (line 725) | function getParentHistoryObj(scope) {
function setNavViews (line 739) | function setNavViews(viewId) {
function getCurrentStateId (line 745) | function getCurrentStateId() {
function getCurrentStateParams (line 762) | function getCurrentStateParams() {
function isAbstractTag (line 1356) | function isAbstractTag(ele) {
function canSwipeBack (line 1360) | function canSwipeBack(ele, viewLocals) {
function onHardwareBackButton (line 1431) | function onHardwareBackButton(e) {
function setStyles (line 1823) | function setStyles(ele, opacity, x, boxShadowOpacity) {
function setStyles (line 1858) | function setStyles(ctrl, opacity, titleX, backTextX) {
function enter (line 1874) | function enter(ctrlA, ctrlB, step) {
function leave (line 1881) | function leave(ctrlA, ctrlB, step) {
function setStyles (line 1913) | function setStyles(ele, x) {
function setStyles (line 1944) | function setStyles(ctrl, opacity) {
function setPlatformConfig (line 1990) | function setPlatformConfig(platformName, platformConfigs) {
function addConfig (line 2001) | function addConfig(configObj, platformObj) {
function createConfig (line 2019) | function createConfig(configObj, providerObj, platformPath) {
function stringObj (line 2050) | function stringObj(obj, str) {
function getLoader (line 2193) | function getLoader() {
function showLoader (line 2277) | function showLoader(options) {
function hideLoader (line 2313) | function hideLoader() {
function positionView (line 3007) | function positionView(target, popoverEle) {
function createPopup (line 3416) | function createPopup(options) {
function onHardwareBackButton (line 3498) | function onHardwareBackButton() {
function showPopup (line 3503) | function showPopup(options) {
function focusInput (line 3566) | function focusInput(element) {
function showAlert (line 3573) | function showAlert(opts) {
function showConfirm (line 3585) | function showConfirm(opts) {
function showPrompt (line 3599) | function showPrompt(opts) {
function getStyle (line 3641) | function getStyle(el, cssprop) {
function isStaticPositioned (line 3655) | function isStaticPositioned(element) {
function $ionicTemplateCache (line 4238) | function $ionicTemplateCache(templates) {
function run (line 4254) | function run() {
function fetchTemplate (line 4324) | function fetchTemplate(url) {
function loadAndCompile (line 4331) | function loadAndCompile(options) {
function warn (line 4383) | function warn(oldMethod, newMethod) {
function onReflow (line 4635) | function onReflow() {
function completeOnTransitionEnd (line 4656) | function completeOnTransitionEnd(ev) {
function transitionComplete (line 4660) | function transitionComplete() {
function cancelOnTransitionEnd (line 4693) | function cancelOnTransitionEnd(ev) {
function cancelTransition (line 4697) | function cancelTransition() {
function getViewElementIdentifier (line 4833) | function getViewElementIdentifier(locals, view) {
function viewState (line 4839) | function viewState(locals) {
function getTransitionData (line 4843) | function getTransitionData(viewLocals, enteringEle, direction, view) {
function getViewData (line 4865) | function getViewData(view) {
function navViewAttr (line 4876) | function navViewAttr(ele, value) {
function destroyViewEle (line 4884) | function destroyViewEle(ele) {
function $LocationDecorator (line 4921) | function $LocationDecorator($location, $timeout) {
function getEle (line 5305) | function getEle(className) {
function onInfinite (line 5351) | function onInfinite() {
function finishInfiniteScroll (line 5359) | function finishInfiniteScroll() {
function checkInfiniteBounds (line 5375) | function checkInfiniteBounds() {
function calculateMaxValue (line 5433) | function calculateMaxValue(maximum) {
function positionItem (line 5718) | function positionItem(ele, itemType) {
function transitionEnd (line 5885) | function transitionEnd() {
function deprecatedWarning (line 6025) | function deprecatedWarning(oldMethod, newMethod) {
function createNavElement (line 6032) | function createNavElement(type) {
function getOnScreenHeaderBar (line 6039) | function getOnScreenHeaderBar() {
function getOffScreenHeaderBar (line 6046) | function getOffScreenHeaderBar() {
function navBarAttr (line 6053) | function navBarAttr(ctrl, val) {
function navSwipeAttr (line 6057) | function navSwipeAttr(val) {
function onTabsLeave (line 6273) | function onTabsLeave(ev, data) {
function onDragStart (line 6426) | function onDragStart(ev) {
function onDrag (line 6465) | function onDrag(ev) {
function onRelease (line 6486) | function onRelease(ev) {
function getDragX (line 6534) | function getDragX(ev) {
function getSwipeCompletion (line 6538) | function getSwipeCompletion(dragX) {
function navSwipeAttr (line 6553) | function navSwipeAttr(val) {
function onTabsTop (line 6558) | function onTabsTop(ev, isTabsTop) {
function onBarSubheader (line 6563) | function onBarSubheader(ev, isBarSubheader) {
function getAssociatedNavBarCtrl (line 6568) | function getAssociatedNavBarCtrl() {
function handleTouchend (line 6622) | function handleTouchend() {
function handleTouchmove (line 6651) | function handleTouchmove(e) {
function handleScroll (line 6717) | function handleScroll(e) {
function overscroll (line 6722) | function overscroll(val) {
function nativescroll (line 6727) | function nativescroll(target, newScrollTop) {
function setScrollLock (line 6736) | function setScrollLock(enabled) {
function scrollTo (line 6776) | function scrollTo(Y, duration, callback) {
function destroy (line 6838) | function destroy() {
function activate (line 6859) | function activate() {
function deactivate (line 6864) | function deactivate() {
function start (line 6873) | function start() {
function show (line 6879) | function show() {
function hide (line 6884) | function hide() {
function tail (line 6889) | function tail() {
function freezeAllScrolls (line 7243) | function freezeAllScrolls(shouldFreeze) {
function createSvgElement (line 7569) | function createSvgElement(tagName, data, parent, spinnerName) {
function setSvgAttribute (line 7594) | function setSvgAttribute(ele, k, v) {
function animationValues (line 7598) | function animationValues(strValues, i) {
function run (line 7876) | function run() {
function easeInOutCubic (line 7918) | function easeInOutCubic(t, c) {
function afterEnter (line 8183) | function afterEnter() {
function titleUpdate (line 8206) | function titleUpdate(newTitle) {
function deregisterFns (line 8214) | function deregisterFns() {
function generateNavBarItem (line 8223) | function generateNavBarItem(html) {
function attrTrue (line 8231) | function attrTrue(key) {
function CollectionRepeatDirective (line 8440) | function CollectionRepeatDirective($ionicCollectionManager, $parse, $win...
function RepeatManagerFactory (line 8748) | function RepeatManagerFactory($rootScope, $window, $$rAF) {
function prelink (line 9424) | function prelink($scope, $element, $attr) {
function checkAsideExpose (line 9575) | function checkAsideExpose() {
function onResize (line 9581) | function onResize() {
function gestureDirective (line 9854) | function gestureDirective(directiveName) {
function tapScrollToTopDirective (line 9957) | function tapScrollToTopDirective() {
function headerFooterBarDirective (line 9997) | function headerFooterBarDirective(isHeader) {
function stopPropagation (line 10283) | function stopPropagation(ev) {
function init (line 10309) | function init() {
function stopPropagation (line 10387) | function stopPropagation(e) {
function onShow (line 10543) | function onShow(e) {
function onHide (line 10557) | function onHide() {
function keyboardAttachGetClientHeight (line 10579) | function keyboardAttachGetClientHeight(element) {
function init (line 10688) | function init() {
function hasIconClass (line 11003) | function hasIconClass(ele) {
function updateView (line 11506) | function updateView(firstTime) {
function eventStopPropagation (line 11572) | function eventStopPropagation(e) {
function prelink (line 11867) | function prelink($scope, $element, $attr) {
function prelink (line 12026) | function prelink($scope, $element, $attr, sideMenuCtrl) {
function prelink (line 12283) | function prelink($scope, $element, $attrs, ctrl) {
function freezeAllScrolls (line 12401) | function freezeAllScrolls(shouldFreeze) {
function getPager (line 12475) | function getPager() {
function attrStr (line 12772) | function attrStr(k, v) {
function selectIfMatchesState (line 12860) | function selectIfMatchesState() {
function tabSelected (line 12872) | function tabSelected(isSelected) {
function destroyTab (line 12907) | function destroyTab() {
function prelink (line 13061) | function prelink($scope, $element, $attr, tabsCtrl) {
function postLink (line 13103) | function postLink($scope, $element, $attr, tabsCtrl) {
FILE: examples/ionic/www/lib/ionic/js/ionic.bundle.js
function trueFn (line 38) | function trueFn() { return true; }
function DelegateInstance (line 58) | function DelegateInstance(instances, handle) {
function DelegateService (line 72) | function DelegateService() {
function instanceMethodCaller (line 95) | function instanceMethodCaller(methodName) {
function domReady (line 138) | function domReady() {
function setup (line 687) | function setup() {
function getParameterByName (line 2027) | function getParameterByName(name) {
function onWindowLoad (line 2418) | function onWindowLoad() {
function onPlatformReady (line 2439) | function onPlatformReady() {
function update (line 2501) | function update(fn) {
function tapEventListener (line 2834) | function tapEventListener(type, enable, useCapture) {
function tapClick (line 2842) | function tapClick(e) {
function triggerMouseEvent (line 2858) | function triggerMouseEvent(type, ele, x, y) {
function tapClickGateKeeper (line 2866) | function tapClickGateKeeper(e) {
function tapMouseDown (line 2888) | function tapMouseDown(e) {
function tapMouseUp (line 2914) | function tapMouseUp(e) {
function tapMouseMove (line 2932) | function tapMouseMove(e) {
function tapTouchStart (line 2943) | function tapTouchStart(e) {
function tapTouchEnd (line 2969) | function tapTouchEnd(e) {
function tapTouchMove (line 2986) | function tapTouchMove(e) {
function tapTouchCancel (line 2995) | function tapTouchCancel() {
function tapEnableTouchEvents (line 3001) | function tapEnableTouchEvents() {
function tapIgnoreEvent (line 3009) | function tapIgnoreEvent(e) {
function tapHandleFocus (line 3019) | function tapHandleFocus(ele) {
function tapFocusOutActive (line 3054) | function tapFocusOutActive() {
function tapFocusIn (line 3063) | function tapFocusIn(e) {
function tapFocusOut (line 3085) | function tapFocusOut() {
function tapActiveElement (line 3090) | function tapActiveElement(ele) {
function tapHasPointerMoved (line 3097) | function tapHasPointerMoved(endEvent) {
function tapContainingElement (line 3113) | function tapContainingElement(ele, allowSelf) {
function tapTargetElement (line 3123) | function tapTargetElement(ele) {
function clear (line 3208) | function clear() {
function activateElements (line 3216) | function activateElements() {
function deactivateElements (line 3227) | function deactivateElements() {
function keyboardInit (line 3691) | function keyboardInit() {
function keyboardNativeShow (line 3721) | function keyboardNativeShow(e) {
function keyboardFocusIn (line 3750) | function keyboardFocusIn(e) {
function keyboardFocusOut (line 3811) | function keyboardFocusOut() {
function keyboardOrientationChange (line 3852) | function keyboardOrientationChange() {
function keyboardOnKeyDown (line 3884) | function keyboardOnKeyDown(e) {
function keyboardPreventDefault (line 3894) | function keyboardPreventDefault(e) {
function keyboardWaitForResize (line 3918) | function keyboardWaitForResize(callback, isOpening) {
function keyboardHide (line 3982) | function keyboardHide() {
function keyboardShow (line 4022) | function keyboardShow() {
function keyboardGetHeight (line 4062) | function keyboardGetHeight() {
function isPortraitViewportHeight (line 4101) | function isPortraitViewportHeight(viewportHeight) {
function isLandscapeViewportHeight (line 4107) | function isLandscapeViewportHeight(viewportHeight) {
function keyboardUpdateViewportHeight (line 4113) | function keyboardUpdateViewportHeight() {
function keyboardInitViewportHeight (line 4137) | function keyboardInitViewportHeight() {
function getViewportHeight (line 4155) | function getViewportHeight() {
function inputScrollView (line 4172) | function inputScrollView(ele) {
function keyboardHasPlugin (line 4182) | function keyboardHasPlugin() {
function viewportLoadTag (line 4240) | function viewportLoadTag() {
function viewportUpdate (line 4263) | function viewportUpdate() {
function viewportTagUpdate (line 4347) | function viewportTagUpdate() {
function getEventTouches (line 5151) | function getEventTouches(e) {
function animateScroll (line 7066) | function animateScroll(Y, X) {
function makeInvisible (line 7309) | function makeInvisible() {
function setup (line 7975) | function setup() {
function prev (line 8033) | function prev(slideSpeed) {
function next (line 8040) | function next(slideSpeed) {
function circle (line 8047) | function circle(index) {
function slide (line 8054) | function slide(to, slideSpeed) {
function move (line 8097) | function move(index, dist, speed) {
function translate (line 8104) | function translate(index, dist, speed) {
function animate (line 8124) | function animate(from, to, speed) {
function begin (line 8163) | function begin() {
function stop (line 8169) | function stop() {
function minErr (line 8737) | function minErr(module, ErrorConstructor) {
function isArrayLike (line 8957) | function isArrayLike(obj) {
function forEach (line 9007) | function forEach(obj, iterator, context) {
function sortedKeys (line 9038) | function sortedKeys(obj) {
function forEachSorted (line 9042) | function forEachSorted(obj, iterator, context) {
function reverseParams (line 9056) | function reverseParams(iteratorFn) {
function nextUid (line 9070) | function nextUid() {
function setHashKey (line 9080) | function setHashKey(obj, h) {
function extend (line 9104) | function extend(dst) {
function int (line 9122) | function int(str) {
function inherit (line 9127) | function inherit(parent, extra) {
function noop (line 9147) | function noop() {}
function identity (line 9169) | function identity($) {return $;}
function valueFn (line 9173) | function valueFn(value) {return function() {return value;};}
function isUndefined (line 9187) | function isUndefined(value) {return typeof value === 'undefined';}
function isDefined (line 9202) | function isDefined(value) {return typeof value !== 'undefined';}
function isObject (line 9218) | function isObject(value) {
function isString (line 9236) | function isString(value) {return typeof value === 'string';}
function isNumber (line 9251) | function isNumber(value) {return typeof value === 'number';}
function isDate (line 9266) | function isDate(value) {
function isFunction (line 9297) | function isFunction(value) {return typeof value === 'function';}
function isRegExp (line 9307) | function isRegExp(value) {
function isWindow (line 9319) | function isWindow(obj) {
function isScope (line 9324) | function isScope(obj) {
function isFile (line 9329) | function isFile(obj) {
function isFormData (line 9334) | function isFormData(obj) {
function isBlob (line 9339) | function isBlob(obj) {
function isBoolean (line 9344) | function isBoolean(value) {
function isPromiseLike (line 9349) | function isPromiseLike(obj) {
function isElement (line 9379) | function isElement(node) {
function makeMap (line 9389) | function makeMap(str) {
function nodeName_ (line 9397) | function nodeName_(element) {
function includes (line 9401) | function includes(array, obj) {
function arrayRemove (line 9405) | function arrayRemove(array, value) {
function copy (line 9470) | function copy(source, destination, stackSource, stackDest) {
function shallowCopy (line 9548) | function shallowCopy(src, dst) {
function equals (line 9598) | function equals(o1, o2) {
function concat (line 9660) | function concat(array1, array2, index) {
function sliceArgs (line 9664) | function sliceArgs(args, startIndex) {
function bind (line 9688) | function bind(self, fn) {
function toJsonReplacer (line 9709) | function toJsonReplacer(key, value) {
function toJson (line 9741) | function toJson(obj, pretty) {
function fromJson (line 9762) | function fromJson(json) {
function startingTag (line 9772) | function startingTag(element) {
function tryDecodeURIComponent (line 9802) | function tryDecodeURIComponent(value) {
function parseKeyValue (line 9815) | function parseKeyValue(/**string*/keyValue) {
function toKeyValue (line 9836) | function toKeyValue(obj) {
function encodeUriSegment (line 9864) | function encodeUriSegment(val) {
function encodeUriQuery (line 9883) | function encodeUriQuery(val, pctEncodeSpaces) {
function getNgAttribute (line 9895) | function getNgAttribute(element, ngAttr) {
function angularInit (line 10034) | function angularInit(element, bootstrap) {
function bootstrap (line 10113) | function bootstrap(element, modules, config) {
function reloadWithDebugInfo (line 10191) | function reloadWithDebugInfo() {
function getTestability (line 10204) | function getTestability(rootElement) {
function snake_case (line 10214) | function snake_case(name, separator) {
function bindJQuery (line 10223) | function bindJQuery() {
function assertArg (line 10277) | function assertArg(arg, name, reason) {
function assertArgFn (line 10284) | function assertArgFn(arg, name, acceptArrayAnnotation) {
function assertNotHasOwnProperty (line 10299) | function assertNotHasOwnProperty(name, context) {
function getter (line 10313) | function getter(obj, path, bindFnToScope) {
function getBlockNodes (line 10337) | function getBlockNodes(nodes) {
function createMap (line 10365) | function createMap() {
function setupModuleLoader (line 10384) | function setupModuleLoader(window) {
function serializeObject (line 10694) | function serializeObject(obj) {
function toDebugString (line 10709) | function toDebugString(obj) {
function publishExternalAPI (line 10831) | function publishExternalAPI(angular) {
function jqNextId (line 11083) | function jqNextId() { return ++jqId; }
function camelCase (line 11096) | function camelCase(name) {
function jqLiteIsTextNode (line 11124) | function jqLiteIsTextNode(html) {
function jqLiteAcceptsData (line 11128) | function jqLiteAcceptsData(node) {
function jqLiteBuildFragment (line 11135) | function jqLiteBuildFragment(html, context) {
function jqLiteParseHTML (line 11172) | function jqLiteParseHTML(html, context) {
function JQLite (line 11188) | function JQLite(element) {
function jqLiteClone (line 11213) | function jqLiteClone(element) {
function jqLiteDealoc (line 11217) | function jqLiteDealoc(element, onlyDescendants) {
function jqLiteOff (line 11228) | function jqLiteOff(element, type, fn, unsupported) {
function jqLiteRemoveData (line 11260) | function jqLiteRemoveData(element, name) {
function jqLiteExpandoStore (line 11282) | function jqLiteExpandoStore(element, createIfNecessary) {
function jqLiteData (line 11295) | function jqLiteData(element, key, value) {
function jqLiteHasClass (line 11321) | function jqLiteHasClass(element, selector) {
function jqLiteRemoveClass (line 11327) | function jqLiteRemoveClass(element, cssClasses) {
function jqLiteAddClass (line 11339) | function jqLiteAddClass(element, cssClasses) {
function jqLiteAddNodes (line 11356) | function jqLiteAddNodes(root, elements) {
function jqLiteController (line 11382) | function jqLiteController(element, name) {
function jqLiteInheritedData (line 11386) | function jqLiteInheritedData(element, name, value) {
function jqLiteEmpty (line 11406) | function jqLiteEmpty(element) {
function jqLiteRemove (line 11413) | function jqLiteRemove(element, keepData) {
function jqLiteDocumentLoaded (line 11420) | function jqLiteDocumentLoaded(action, win) {
function trigger (line 11440) | function trigger() {
function getBooleanAttrName (line 11494) | function getBooleanAttrName(element, name) {
function getAliasedAttrName (line 11502) | function getAliasedAttrName(element, name) {
function getText (line 11590) | function getText(element, value) {
function createEventHandler (line 11675) | function createEventHandler(element, events) {
function $$jqLiteProvider (line 11970) | function $$jqLiteProvider() {
function hashKey (line 12001) | function hashKey(obj, nextUidFn) {
function HashMap (line 12024) | function HashMap(array, isolatedUid) {
function anonFn (line 12130) | function anonFn(fn) {
function annotate (line 12141) | function annotate(fn, strictDi, name) {
function createInjector (line 12675) | function createInjector(modulesToLoad, strictDi) {
function $AnchorScrollProvider (line 12919) | function $AnchorScrollProvider() {
function runAnimationPostDigest (line 13262) | function runAnimationPostDigest(fn) {
function resolveElementClasses (line 13277) | function resolveElementClasses(element, classes) {
function cachedClassManipulation (line 13303) | function cachedClassManipulation(cache, classes, op) {
function asyncPromise (line 13310) | function asyncPromise() {
function applyStyles (line 13322) | function applyStyles(element, options) {
function $$AsyncCallbackProvider (line 13547) | function $$AsyncCallbackProvider() {
function Browser (line 13580) | function Browser(window, document, $log, $sniffer) {
function $BrowserProvider (line 14013) | function $BrowserProvider() {
function $CacheFactoryProvider (line 14101) | function $CacheFactoryProvider() {
function $TemplateCacheProvider (line 14414) | function $TemplateCacheProvider() {
function $CompileProvider (line 15119) | function $CompileProvider($provide, $$sanitizeUriProvider) {
function directiveNormalize (line 16931) | function directiveNormalize(name) {
function nodesetLinkingFn (line 16980) | function nodesetLinkingFn(
function directiveLinkingFn (line 16987) | function directiveLinkingFn(
function tokenDifference (line 16995) | function tokenDifference(str1, str2) {
function removeComments (line 17011) | function removeComments(jqNodes) {
function $ControllerProvider (line 17040) | function $ControllerProvider() {
function $DocumentProvider (line 17207) | function $DocumentProvider() {
function $ExceptionHandlerProvider (line 17253) | function $ExceptionHandlerProvider() {
function defaultHttpResponseTransform (line 17270) | function defaultHttpResponseTransform(data, headers) {
function isJsonLike (line 17286) | function isJsonLike(str) {
function parseHeaders (line 17297) | function parseHeaders(headers) {
function headersGetter (line 17328) | function headersGetter(headers) {
function transformData (line 17358) | function transformData(data, headers, status, fns) {
function isSuccess (line 17370) | function isSuccess(status) {
function $HttpProvider (line 17381) | function $HttpProvider() {
function createXhr (line 18417) | function createXhr() {
function $HttpBackendProvider (line 18437) | function $HttpBackendProvider() {
function createHttpBackend (line 18443) | function createHttpBackend($browser, createXhr, $browserDefer, callbacks...
function $InterpolateProvider (line 18627) | function $InterpolateProvider() {
function $IntervalProvider (line 18937) | function $IntervalProvider() {
function $LocaleProvider (line 19132) | function $LocaleProvider() {
function encodePath (line 19205) | function encodePath(path) {
function parseAbsoluteUrl (line 19216) | function parseAbsoluteUrl(absoluteUrl, locationObj) {
function parseAppUrl (line 19225) | function parseAppUrl(relativeUrl, locationObj) {
function beginsWith (line 19250) | function beginsWith(begin, whole) {
function stripHash (line 19257) | function stripHash(url) {
function trimEmptyHash (line 19262) | function trimEmptyHash(url) {
function stripFile (line 19267) | function stripFile(url) {
function serverBase (line 19272) | function serverBase(url) {
function LocationHtml5Url (line 19285) | function LocationHtml5Url(appBase, basePrefix) {
function LocationHashbangUrl (line 19364) | function LocationHashbangUrl(appBase, hashPrefix) {
function LocationHashbangInHtml5Url (line 19468) | function LocationHashbangInHtml5Url(appBase, hashPrefix) {
function locationGetter (line 19824) | function locationGetter(property) {
function locationGetterSetter (line 19831) | function locationGetterSetter(property, preprocess) {
function $LocationProvider (line 19876) | function $LocationProvider() {
function $LogProvider (line 20200) | function $LogProvider() {
function ensureSafeMemberName (line 20345) | function ensureSafeMemberName(name, fullExpression) {
function ensureSafeObject (line 20356) | function ensureSafeObject(obj, fullExpression) {
function ensureSafeFunction (line 20387) | function ensureSafeFunction(obj, fullExpression) {
function isConstant (line 20633) | function isConstant(exp) {
function setter (line 21124) | function setter(obj, locals, path, setValue, fullExp) {
function isPossiblyDangerousMemberName (line 21147) | function isPossiblyDangerousMemberName(name) {
function cspSafeGetterFn (line 21156) | function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, expensiv...
function getterFnWithEnsureSafeObject (line 21197) | function getterFnWithEnsureSafeObject(fn, fullExpression) {
function getterFn (line 21203) | function getterFn(path, options, fullExp) {
function getValueOf (line 21272) | function getValueOf(value) {
function $ParseProvider (line 21327) | function $ParseProvider() {
function $QProvider (line 21788) | function $QProvider() {
function $$QProvider (line 21797) | function $$QProvider() {
function qFactory (line 21813) | function qFactory(nextTick, exceptionHandler) {
function $$RAFProvider (line 22144) | function $$RAFProvider() { //rAF
function $RootScopeProvider (line 22241) | function $RootScopeProvider() {
function $$SanitizeUriProvider (line 23506) | function $$SanitizeUriProvider() {
function adjustMatcher (line 23586) | function adjustMatcher(matcher) {
function adjustMatchers (line 23614) | function adjustMatchers(matchers) {
function $SceDelegateProvider (line 23692) | function $SceDelegateProvider() {
function $SceProvider (line 24222) | function $SceProvider() {
function $SnifferProvider (line 24634) | function $SnifferProvider() {
function $TemplateRequestProvider (line 24726) | function $TemplateRequestProvider() {
function $$TestabilityProvider (line 24768) | function $$TestabilityProvider() {
function $TimeoutProvider (line 24883) | function $TimeoutProvider() {
function urlResolve (line 25029) | function urlResolve(url) {
function urlIsSameOrigin (line 25063) | function urlIsSameOrigin(requestUrl) {
function $WindowProvider (line 25110) | function $WindowProvider() {
function $FilterProvider (line 25207) | function $FilterProvider($provide) {
function filterFilter (line 25384) | function filterFilter() {
function createPredicateFn (line 25413) | function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
function deepCompare (line 25442) | function deepCompare(actual, expected, comparator, matchAgainstAnyProp, ...
function currencyFilter (line 25544) | function currencyFilter($locale) {
function numberFilter (line 25615) | function numberFilter($locale) {
function formatNumber (line 25628) | function formatNumber(number, pattern, groupSep, decimalSep, fractionSiz...
function padNumber (line 25709) | function padNumber(num, digits, trim) {
function dateGetter (line 25723) | function dateGetter(name, size, offset, trim) {
function dateStrGetter (line 25734) | function dateStrGetter(name, shortForm) {
function timeZoneGetter (line 25743) | function timeZoneGetter(date) {
function getFirstThursdayOfYear (line 25753) | function getFirstThursdayOfYear(year) {
function getThursdayThisWeek (line 25761) | function getThursdayThisWeek(datetime) {
function weekGetter (line 25767) | function weekGetter(size) {
function ampmGetter (line 25779) | function ampmGetter(date, formats) {
function dateFilter (line 25905) | function dateFilter($locale) {
function jsonFilter (line 26011) | function jsonFilter() {
function limitToFilter (line 26128) | function limitToFilter() {
function orderByFilter (line 26264) | function orderByFilter($parse) {
function ngDirective (line 26352) | function ngDirective(directive) {
function nullFormRenameControl (line 26833) | function nullFormRenameControl(control, name) {
function FormController (line 26880) | function FormController(element, attrs, $scope, $animate, $interpolate) {
function stringBasedInputType (line 28302) | function stringBasedInputType(ctrl) {
function textInputType (line 28308) | function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function baseInputType (line 28313) | function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function weekParser (line 28399) | function weekParser(isoWeek, existingDate) {
function createDateParser (line 28431) | function createDateParser(regexp, mapping) {
function createDateInputType (line 28481) | function createDateInputType(type, regexp, parseDate, format) {
function badInputChecker (line 28554) | function badInputChecker(scope, element, attr, ctrl) {
function numberInputType (line 28569) | function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function urlInputType (line 28623) | function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function emailInputType (line 28636) | function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function radioInputType (line 28649) | function radioInputType(scope, element, attr, ctrl) {
function parseConstantExpr (line 28671) | function parseConstantExpr($parse, context, name, expression, fallback) {
function checkboxInputType (line 28684) | function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browse...
function classDirective (line 29245) | function classDirective(name, selector) {
function processParseErrors (line 31726) | function processParseErrors(parseValid) {
function processSyncValidators (line 31745) | function processSyncValidators() {
function processAsyncValidators (line 31761) | function processAsyncValidators() {
function setValidity (line 31787) | function setValidity(name, isValid) {
function validationDone (line 31793) | function validationDone(allValid) {
function writeToModelIfNeeded (line 31872) | function writeToModelIfNeeded() {
function addSetValidityMethod (line 32398) | function addSetValidityMethod(context) {
function isObjectEmpty (line 32493) | function isObjectEmpty(obj) {
function updateElementText (line 32757) | function updateElementText(newText) {
function setupAsSingle (line 34248) | function setupAsSingle(scope, selectElement, ngModelCtrl, selectCtrl) {
function setupAsMultiple (line 34273) | function setupAsMultiple(scope, selectElement, ctrl) {
function setupAsOptions (line 34304) | function setupAsOptions(scope, selectElement, ctrl) {
function extractElementNode (line 35299) | function extractElementNode(element) {
function prepareElement (line 35308) | function prepareElement(element) {
function stripCommentsFromElement (line 35312) | function stripCommentsFromElement(element) {
function isMatchingElement (line 35316) | function isMatchingElement(elm1, elm2) {
function classBasedAnimationsBlocked (line 35360) | function classBasedAnimationsBlocked(element, setter) {
function runAnimationPostDigest (line 35370) | function runAnimationPostDigest(fn) {
function parseAnimateOptions (line 35383) | function parseAnimateOptions(options) {
function resolveElementClasses (line 35395) | function resolveElementClasses(element, cache, runningAnimations) {
function lookup (line 35439) | function lookup(name) {
function animationRunner (line 35469) | function animationRunner(element, animationEvent, className, options) {
function performAnimation (line 36119) | function performAnimation(animationEvent, className, element, parentElem...
function cancelChildAnimations (line 36336) | function cancelChildAnimations(element) {
function cleanup (line 36354) | function cleanup(element, className) {
function animationsDisabled (line 36376) | function animationsDisabled(element, parentElement) {
function clearCacheAfterReflow (line 36469) | function clearCacheAfterReflow() {
function afterReflow (line 36479) | function afterReflow(element, callback) {
function animationCloseHandler (line 36498) | function animationCloseHandler(element, totalTime) {
function closeAllAnimations (line 36522) | function closeAllAnimations(elements) {
function getElementAnimationDetails (line 36533) | function getElementAnimationDetails(element, cacheKey) {
function parseMaxTime (line 36577) | function parseMaxTime(str) {
function getCacheKey (line 36588) | function getCacheKey(element) {
function animateSetup (line 36598) | function animateSetup(animationEvent, element, className, styles) {
function animateRun (line 36661) | function animateRun(animationEvent, element, className, activeAnimationC...
function blockTransitions (line 36816) | function blockTransitions(node, bool) {
function blockAnimations (line 36820) | function blockAnimations(node, bool) {
function animateBefore (line 36824) | function animateBefore(animationEvent, element, className, styles) {
function animateAfter (line 36832) | function animateAfter(animationEvent, element, className, afterAnimation...
function animate (line 36841) | function animate(animationEvent, element, className, animationComplete, ...
function animateClose (line 36870) | function animateClose(element, className) {
function suffixClasses (line 36960) | function suffixClasses(classes, suffix) {
function $SanitizeProvider (line 37122) | function $SanitizeProvider() {
function sanitizeText (line 37134) | function sanitizeText(chars) {
function makeMap (line 37233) | function makeMap(str) {
function htmlParser (line 37252) | function htmlParser(html, handler) {
function decodeEntities (line 37407) | function decodeEntities(value) {
function encodeEntities (line 37435) | function encodeEntities(value) {
function htmlSanitizeWriter (line 37460) | function htmlSanitizeWriter(buf, uriValidator) {
function addText (line 37639) | function addText(text) {
function addLink (line 37646) | function addLink(url, text) {
function inherit (line 37698) | function inherit(parent, extra) {
function merge (line 37702) | function merge(dst) {
function ancestors (line 37720) | function ancestors(first, second) {
function objectKeys (line 37736) | function objectKeys(object) {
function indexOf (line 37755) | function indexOf(array, value) {
function inheritParams (line 37779) | function inheritParams(currentParams, newParams, $current, $to) {
function equalForKeys (line 37805) | function equalForKeys(a, b, keys) {
function filterByKeys (line 37825) | function filterByKeys(keys, values) {
function indexBy (line 37836) | function indexBy(array, propName) {
function pick (line 37846) | function pick(obj) {
function omit (line 37857) | function omit(obj) {
function pluck (line 37866) | function pluck(collection, key) {
function filter (line 37875) | function filter(collection, callback) {
function map (line 37886) | function map(collection, callback) {
function $Resolve (line 37989) | function $Resolve( $q, $injector) {
function $TemplateFactory (line 38243) | function $TemplateFactory( $http, $templateCache, $injector) {
function UrlMatcher (line 38409) | function UrlMatcher(pattern, config, parentMatcher) {
function decodePathArray (line 38584) | function decodePathArray(string) {
function encodeDashes (line 38670) | function encodeDashes(str) { // Replace dashes with encoded "\-"
function Type (line 38740) | function Type(config) {
function ArrayType (line 38839) | function ArrayType(type, mode) {
function $UrlMatcherFactory (line 38900) | function $UrlMatcherFactory() {
function $UrlRouterProvider (line 39396) | function $UrlRouterProvider( $locationProvider, $urlMatcherFactory) {
function $StateProvider (line 39815) | function $StateProvider( $urlRouterProvider, $urlMatcherFactory) {
function $ViewProvider (line 41169) | function $ViewProvider() {
function $ViewScrollProvider (line 41246) | function $ViewScrollProvider() {
function $ViewDirective (line 41406) | function $ViewDirective( $state, $injector, $uiViewScroll, $inte...
function $ViewDirectiveFill (line 41546) | function $ViewDirectiveFill ( $compile, $controller, $state, $int...
function getUiViewName (line 41586) | function getUiViewName(scope, attrs, element, $interpolate) {
function parseStateRef (line 41595) | function parseStateRef(ref, current) {
function stateContext (line 41603) | function stateContext(el) {
function $StateRefDirective (line 41674) | function $StateRefDirective($state, $timeout) {
function $StateRefActiveDirective (line 41819) | function $StateRefActiveDirective($state, $stateParams, $interpolate) {
function $IsStateFilter (line 41874) | function $IsStateFilter($state) {
function $IncludedByStateFilter (line 41892) | function $IncludedByStateFilter($state) {
function actionSheet (line 42030) | function actionSheet(opts) {
function retain (line 42263) | function retain() {
function release (line 42273) | function release() {
function getElement (line 42284) | function getElement() {
function preventClick (line 42437) | function preventClick(ev) {
function addClickBlock (line 42442) | function addClickBlock() {
function removeClickBlock (line 42457) | function removeClickBlock() {
function getViewById (line 42603) | function getViewById(viewId) {
function getBackView (line 42607) | function getBackView(view) {
function getForwardView (line 42611) | function getForwardView(view) {
function getHistoryById (line 42615) | function getHistoryById(historyId) {
function getHistory (line 42619) | function getHistory(scope) {
function getParentHistoryObj (line 42635) | function getParentHistoryObj(scope) {
function setNavViews (line 42649) | function setNavViews(viewId) {
function getCurrentStateId (line 42655) | function getCurrentStateId() {
function getCurrentStateParams (line 42672) | function getCurrentStateParams() {
function isAbstractTag (line 43266) | function isAbstractTag(ele) {
function canSwipeBack (line 43270) | function canSwipeBack(ele, viewLocals) {
function onHardwareBackButton (line 43341) | function onHardwareBackButton(e) {
function setStyles (line 43733) | function setStyles(ele, opacity, x, boxShadowOpacity) {
function setStyles (line 43768) | function setStyles(ctrl, opacity, titleX, backTextX) {
function enter (line 43784) | function enter(ctrlA, ctrlB, step) {
function leave (line 43791) | function leave(ctrlA, ctrlB, step) {
function setStyles (line 43823) | function setStyles(ele, x) {
function setStyles (line 43854) | function setStyles(ctrl, opacity) {
function setPlatformConfig (line 43900) | function setPlatformConfig(platformName, platformConfigs) {
function addConfig (line 43911) | function addConfig(configObj, platformObj) {
function createConfig (line 43929) | function createConfig(configObj, providerObj, platformPath) {
function stringObj (line 43960) | function stringObj(obj, str) {
function getLoader (line 44103) | function getLoader() {
function showLoader (line 44187) | function showLoader(options) {
function hideLoader (line 44223) | function hideLoader() {
function positionView (line 44917) | function positionView(target, popoverEle) {
function createPopup (line 45326) | function createPopup(options) {
function onHardwareBackButton (line 45408) | function onHardwareBackButton() {
function showPopup (line 45413) | function showPopup(options) {
function focusInput (line 45476) | function focusInput(element) {
function showAlert (line 45483) | function showAlert(opts) {
function showConfirm (line 45495) | function showConfirm(opts) {
function showPrompt (line 45509) | function showPrompt(opts) {
function getStyle (line 45551) | function getStyle(el, cssprop) {
function isStaticPositioned (line 45565) | function isStaticPositioned(element) {
function $ionicTemplateCache (line 46148) | function $ionicTemplateCache(templates) {
function run (line 46164) | function run() {
function fetchTemplate (line 46234) | function fetchTemplate(url) {
function loadAndCompile (line 46241) | function loadAndCompile(options) {
function warn (line 46293) | function warn(oldMethod, newMethod) {
function onReflow (line 46545) | function onReflow() {
function completeOnTransitionEnd (line 46566) | function completeOnTransitionEnd(ev) {
function transitionComplete (line 46570) | function transitionComplete() {
function cancelOnTransitionEnd (line 46603) | function cancelOnTransitionEnd(ev) {
function cancelTransition (line 46607) | function cancelTransition() {
function getViewElementIdentifier (line 46743) | function getViewElementIdentifier(locals, view) {
function viewState (line 46749) | function viewState(locals) {
function getTransitionData (line 46753) | function getTransitionData(viewLocals, enteringEle, direction, view) {
function getViewData (line 46775) | function getViewData(view) {
function navViewAttr (line 46786) | function navViewAttr(ele, value) {
function destroyViewEle (line 46794) | function destroyViewEle(ele) {
function $LocationDecorator (line 46831) | function $LocationDecorator($location, $timeout) {
function getEle (line 47215) | function getEle(className) {
function onInfinite (line 47261) | function onInfinite() {
function finishInfiniteScroll (line 47269) | function finishInfiniteScroll() {
function checkInfiniteBounds (line 47285) | function checkInfiniteBounds() {
function calculateMaxValue (line 47343) | function calculateMaxValue(maximum) {
function positionItem (line 47628) | function positionItem(ele, itemType) {
function transitionEnd (line 47795) | function transitionEnd() {
function deprecatedWarning (line 47935) | function deprecatedWarning(oldMethod, newMethod) {
function createNavElement (line 47942) | function createNavElement(type) {
function getOnScreenHeaderBar (line 47949) | function getOnScreenHeaderBar() {
function getOffScreenHeaderBar (line 47956) | function getOffScreenHeaderBar() {
function navBarAttr (line 47963) | function navBarAttr(ctrl, val) {
function navSwipeAttr (line 47967) | function navSwipeAttr(val) {
function onTabsLeave (line 48183) | function onTabsLeave(ev, data) {
function onDragStart (line 48336) | function onDragStart(ev) {
function onDrag (line 48375) | function onDrag(ev) {
function onRelease (line 48396) | function onRelease(ev) {
function getDragX (line 48444) | function getDragX(ev) {
function getSwipeCompletion (line 48448) | function getSwipeCompletion(dragX) {
function navSwipeAttr (line 48463) | function navSwipeAttr(val) {
function onTabsTop (line 48468) | function onTabsTop(ev, isTabsTop) {
function onBarSubheader (line 48473) | function onBarSubheader(ev, isBarSubheader) {
function getAssociatedNavBarCtrl (line 48478) | function getAssociatedNavBarCtrl() {
function handleTouchend (line 48532) | function handleTouchend() {
function handleTouchmove (line 48561) | function handleTouchmove(e) {
function handleScroll (line 48627) | function handleScroll(e) {
function overscroll (line 48632) | function overscroll(val) {
function nativescroll (line 48637) | function nativescroll(target, newScrollTop) {
function setScrollLock (line 48646) | function setScrollLock(enabled) {
function scrollTo (line 48686) | function scrollTo(Y, duration, callback) {
function destroy (line 48748) | function destroy() {
function activate (line 48769) | function activate() {
function deactivate (line 48774) | function deactivate() {
function start (line 48783) | function start() {
function show (line 48789) | function show() {
function hide (line 48794) | function hide() {
function tail (line 48799) | function tail() {
function freezeAllScrolls (line 49153) | function freezeAllScrolls(shouldFreeze) {
function createSvgElement (line 49479) | function createSvgElement(tagName, data, parent, spinnerName) {
function setSvgAttribute (line 49504) | function setSvgAttribute(ele, k, v) {
function animationValues (line 49508) | function animationValues(strValues, i) {
function run (line 49786) | function run() {
function easeInOutCubic (line 49828) | function easeInOutCubic(t, c) {
function afterEnter (line 50093) | function afterEnter() {
function titleUpdate (line 50116) | function titleUpdate(newTitle) {
function deregisterFns (line 50124) | function deregisterFns() {
function generateNavBarItem (line 50133) | function generateNavBarItem(html) {
function attrTrue (line 50141) | function attrTrue(key) {
function CollectionRepeatDirective (line 50350) | function CollectionRepeatDirective($ionicCollectionManager, $parse, $win...
function RepeatManagerFactory (line 50658) | function RepeatManagerFactory($rootScope, $window, $$rAF) {
function prelink (line 51334) | function prelink($scope, $element, $attr) {
function checkAsideExpose (line 51485) | function checkAsideExpose() {
function onResize (line 51491) | function onResize() {
function gestureDirective (line 51764) | function gestureDirective(directiveName) {
function tapScrollToTopDirective (line 51867) | function tapScrollToTopDirective() {
function headerFooterBarDirective (line 51907) | function headerFooterBarDirective(isHeader) {
function stopPropagation (line 52193) | function stopPropagation(ev) {
function init (line 52219) | function init() {
function stopPropagation (line 52297) | function stopPropagation(e) {
function onShow (line 52453) | function onShow(e) {
function onHide (line 52467) | function onHide() {
function keyboardAttachGetClientHeight (line 52489) | function keyboardAttachGetClientHeight(element) {
function init (line 52598) | function init() {
function hasIconClass (line 52913) | function hasIconClass(ele) {
function updateView (line 53416) | function updateView(firstTime) {
function eventStopPropagation (line 53482) | function eventStopPropagation(e) {
function prelink (line 53777) | function prelink($scope, $element, $attr) {
function prelink (line 53936) | function prelink($scope, $element, $attr, sideMenuCtrl) {
function prelink (line 54193) | function prelink($scope, $element, $attrs, ctrl) {
function freezeAllScrolls (line 54311) | function freezeAllScrolls(shouldFreeze) {
function getPager (line 54385) | function getPager() {
function attrStr (line 54682) | function attrStr(k, v) {
function selectIfMatchesState (line 54770) | function selectIfMatchesState() {
function tabSelected (line 54782) | function tabSelected(isSelected) {
function destroyTab (line 54817) | function destroyTab() {
function prelink (line 54971) | function prelink($scope, $element, $attr, tabsCtrl) {
function postLink (line 55013) | function postLink($scope, $element, $attr, tabsCtrl) {
FILE: examples/ionic/www/lib/ionic/js/ionic.js
function trueFn (line 31) | function trueFn() { return true; }
function DelegateInstance (line 51) | function DelegateInstance(instances, handle) {
function DelegateService (line 65) | function DelegateService() {
function instanceMethodCaller (line 88) | function instanceMethodCaller(methodName) {
function domReady (line 131) | function domReady() {
function setup (line 680) | function setup() {
function getParameterByName (line 2020) | function getParameterByName(name) {
function onWindowLoad (line 2411) | function onWindowLoad() {
function onPlatformReady (line 2432) | function onPlatformReady() {
function update (line 2494) | function update(fn) {
function tapEventListener (line 2827) | function tapEventListener(type, enable, useCapture) {
function tapClick (line 2835) | function tapClick(e) {
function triggerMouseEvent (line 2851) | function triggerMouseEvent(type, ele, x, y) {
function tapClickGateKeeper (line 2859) | function tapClickGateKeeper(e) {
function tapMouseDown (line 2881) | function tapMouseDown(e) {
function tapMouseUp (line 2907) | function tapMouseUp(e) {
function tapMouseMove (line 2925) | function tapMouseMove(e) {
function tapTouchStart (line 2936) | function tapTouchStart(e) {
function tapTouchEnd (line 2962) | function tapTouchEnd(e) {
function tapTouchMove (line 2979) | function tapTouchMove(e) {
function tapTouchCancel (line 2988) | function tapTouchCancel() {
function tapEnableTouchEvents (line 2994) | function tapEnableTouchEvents() {
function tapIgnoreEvent (line 3002) | function tapIgnoreEvent(e) {
function tapHandleFocus (line 3012) | function tapHandleFocus(ele) {
function tapFocusOutActive (line 3047) | function tapFocusOutActive() {
function tapFocusIn (line 3056) | function tapFocusIn(e) {
function tapFocusOut (line 3078) | function tapFocusOut() {
function tapActiveElement (line 3083) | function tapActiveElement(ele) {
function tapHasPointerMoved (line 3090) | function tapHasPointerMoved(endEvent) {
function tapContainingElement (line 3106) | function tapContainingElement(ele, allowSelf) {
function tapTargetElement (line 3116) | function tapTargetElement(ele) {
function clear (line 3201) | function clear() {
function activateElements (line 3209) | function activateElements() {
function deactivateElements (line 3220) | function deactivateElements() {
function keyboardInit (line 3684) | function keyboardInit() {
function keyboardNativeShow (line 3714) | function keyboardNativeShow(e) {
function keyboardFocusIn (line 3743) | function keyboardFocusIn(e) {
function keyboardFocusOut (line 3804) | function keyboardFocusOut() {
function keyboardOrientationChange (line 3845) | function keyboardOrientationChange() {
function keyboardOnKeyDown (line 3877) | function keyboardOnKeyDown(e) {
function keyboardPreventDefault (line 3887) | function keyboardPreventDefault(e) {
function keyboardWaitForResize (line 3911) | function keyboardWaitForResize(callback, isOpening) {
function keyboardHide (line 3975) | function keyboardHide() {
function keyboardShow (line 4015) | function keyboardShow() {
function keyboardGetHeight (line 4055) | function keyboardGetHeight() {
function isPortraitViewportHeight (line 4094) | function isPortraitViewportHeight(viewportHeight) {
function isLandscapeViewportHeight (line 4100) | function isLandscapeViewportHeight(viewportHeight) {
function keyboardUpdateViewportHeight (line 4106) | function keyboardUpdateViewportHeight() {
function keyboardInitViewportHeight (line 4130) | function keyboardInitViewportHeight() {
function getViewportHeight (line 4148) | function getViewportHeight() {
function inputScrollView (line 4165) | function inputScrollView(ele) {
function keyboardHasPlugin (line 4175) | function keyboardHasPlugin() {
function viewportLoadTag (line 4233) | function viewportLoadTag() {
function viewportUpdate (line 4256) | function viewportUpdate() {
function viewportTagUpdate (line 4340) | function viewportTagUpdate() {
function getEventTouches (line 5144) | function getEventTouches(e) {
function animateScroll (line 7059) | function animateScroll(Y, X) {
function makeInvisible (line 7302) | function makeInvisible() {
function setup (line 7968) | function setup() {
function prev (line 8026) | function prev(slideSpeed) {
function next (line 8033) | function next(slideSpeed) {
function circle (line 8040) | function circle(index) {
function slide (line 8047) | function slide(to, slideSpeed) {
function move (line 8090) | function move(index, dist, speed) {
function translate (line 8097) | function translate(index, dist, speed) {
function animate (line 8117) | function animate(from, to, speed) {
function begin (line 8156) | function begin() {
function stop (line 8162) | function stop() {
FILE: examples/ionic/www/lib/satellizer/dist/satellizer.js
function Config (line 14) | function Config() {
function AuthProvider (line 169) | function AuthProvider(SatellizerConfig) {
function joinUrl (line 315) | function joinUrl(baseUrl, url) {
function getFullUrlPath (line 329) | function getFullUrlPath(location) {
function parseQueryString (line 335) | function parseQueryString(str) {
function decodeBase64 (line 348) | function decodeBase64(str) {
function Shared (line 399) | function Shared($q, $window, SatellizerConfig, SatellizerStorage) {
function Local (line 478) | function Local($http, SatellizerConfig, SatellizerShared) {
function Popup (line 508) | function Popup($interval, $window, $q) {
function OAuth1 (line 625) | function OAuth1($http, $window, SatellizerConfig, SatellizerPopup) {
function OAuth2 (line 692) | function OAuth2($http, $window, $timeout, $q, SatellizerConfig, Satelliz...
function OAuth (line 809) | function OAuth($http, $window, $timeout, $q, SatellizerConfig, Satellize...
function Storage (line 870) | function Storage($window, SatellizerConfig) {
function Interceptor (line 904) | function Interceptor(SatellizerConfig, SatellizerShared, SatellizerStora...
function HttpProviderConfig (line 934) | function HttpProviderConfig($httpProvider) {
FILE: examples/server/java/src/main/java/com/example/helloworld/HelloWorldApplication.java
class HelloWorldApplication (line 22) | public class HelloWorldApplication extends Application<HelloWorldConfigu...
method main (line 23) | public static void main(final String[] args) throws Exception {
method getDataSourceFactory (line 29) | @Override
method getName (line 35) | @Override
method initialize (line 40) | @Override
method run (line 61) | @Override
FILE: examples/server/java/src/main/java/com/example/helloworld/HelloWorldConfiguration.java
class HelloWorldConfiguration (line 14) | public class HelloWorldConfiguration extends Configuration {
method getDataSourceFactory (line 31) | public DataSourceFactory getDataSourceFactory() {
method setDataSourceFactory (line 35) | public void setDataSourceFactory(DataSourceFactory dataSourceFactory) {
method getJerseyClient (line 39) | public JerseyClientConfiguration getJerseyClient() {
method getClientSecrets (line 43) | public ClientSecretsConfiguration getClientSecrets() {
class ClientSecretsConfiguration (line 47) | public static class ClientSecretsConfiguration {
method getFacebook (line 73) | public String getFacebook() {
method getGoogle (line 77) | public String getGoogle() {
method getLinkedin (line 81) | public String getLinkedin() {
method getFoursquare (line 85) | public String getFoursquare() {
method getTwitter (line 89) | public String getTwitter() {
FILE: examples/server/java/src/main/java/com/example/helloworld/auth/AuthFilter.java
class AuthFilter (line 21) | public class AuthFilter implements Filter {
method doFilter (line 30) | @Override
method destroy (line 62) | @Override
method init (line 65) | @Override
FILE: examples/server/java/src/main/java/com/example/helloworld/auth/AuthUtils.java
class AuthUtils (line 18) | public final class AuthUtils {
method getSubject (line 24) | public static String getSubject(String authHeader) throws ParseExcepti...
method decodeToken (line 28) | public static ReadOnlyJWTClaimsSet decodeToken(String authHeader) thro...
method createToken (line 37) | public static Token createToken(String host, long sub) throws JOSEExce...
method getSerializedToken (line 51) | public static String getSerializedToken(String authHeader) {
FILE: examples/server/java/src/main/java/com/example/helloworld/auth/PasswordService.java
class PasswordService (line 5) | public final class PasswordService {
method hashPassword (line 6) | public static String hashPassword(String plaintext) {
method checkPassword (line 10) | public static boolean checkPassword(String plaintext , String hashed) {
FILE: examples/server/java/src/main/java/com/example/helloworld/core/Token.java
class Token (line 5) | public class Token {
method Token (line 8) | public Token(@JsonProperty("token") String token) {
method getToken (line 12) | public String getToken() {
FILE: examples/server/java/src/main/java/com/example/helloworld/core/User.java
class User (line 17) | @Entity
type Provider (line 66) | public enum Provider {
method Provider (line 72) | Provider(final String name) {
method getName (line 76) | public String getName() {
method capitalize (line 80) | public String capitalize() {
method getId (line 85) | public long getId() {
method getEmail (line 89) | public String getEmail() {
method getPassword (line 93) | @JsonIgnore
method getDisplayName (line 98) | public String getDisplayName() {
method getFacebook (line 102) | public String getFacebook() {
method getGoogle (line 106) | public String getGoogle() {
method getLinkedin (line 110) | public String getLinkedin() {
method getGithub (line 114) | public String getGithub() {
method getFoursquare (line 118) | public String getFoursquare() {
method getTwitter (line 122) | public String getTwitter() {
method setEmail (line 126) | public void setEmail(final String email) {
method setPassword (line 130) | public void setPassword(final String password) {
method setDisplayName (line 134) | public void setDisplayName(final String name) {
method setProviderId (line 138) | public void setProviderId(final Provider provider, final String value) {
method getSignInMethodCount (line 163) | @JsonIgnore
FILE: examples/server/java/src/main/java/com/example/helloworld/db/UserDAO.java
class UserDAO (line 13) | public class UserDAO extends AbstractDAO<User> {
method UserDAO (line 14) | public UserDAO(SessionFactory factory) {
method findById (line 18) | public Optional<User> findById(Long id) {
method findByEmail (line 22) | public Optional<User> findByEmail(String email) {
method findByProvider (line 29) | public Optional<User> findByProvider(Provider provider, String provide...
method save (line 36) | public User save(User user) {
method findAll (line 40) | public List<User> findAll() {
FILE: examples/server/java/src/main/java/com/example/helloworld/resources/AuthResource.java
class AuthResource (line 48) | @Path("/auth")
method AuthResource (line 67) | public AuthResource(final Client client, final UserDAO dao,
method login (line 74) | @POST
method signup (line 88) | @POST
method loginFacebook (line 99) | @POST
method loginGoogle (line 134) | @POST
method loginLinkedin (line 166) | @POST
method loginGithub (line 173) | @POST
method loginFoursquare (line 180) | @POST
method loginTwitter (line 187) | @GET
method unlink (line 195) | @POST
class UnlinkRequest (line 230) | public static class UnlinkRequest {
method getProvider (line 234) | public String getProvider() {
method setProvider (line 238) | public void setProvider(String provider) {
class Payload (line 247) | public static class Payload {
method getClientId (line 257) | public String getClientId() {
method getRedirectUri (line 261) | public String getRedirectUri() {
method getCode (line 265) | public String getCode() {
method getResponseEntity (line 273) | private Map<String, Object> getResponseEntity(final Response response)...
method processUser (line 279) | private Response processUser(final HttpServletRequest request, final P...
FILE: examples/server/java/src/main/java/com/example/helloworld/resources/ClientResource.java
class ClientResource (line 15) | @Path("/")
method getPage (line 19) | @GET
FILE: examples/server/java/src/main/java/com/example/helloworld/resources/UserResource.java
class UserResource (line 26) | @Path("/api/me")
method UserResource (line 33) | public UserResource(UserDAO userDAO) {
method getUser (line 37) | @GET
method getAllUsers (line 49) | @GET
method updateUser (line 56) | @PUT
method getAuthUser (line 78) | private Optional<User> getAuthUser(HttpServletRequest request) throws ...
FILE: examples/server/node/server.js
function ensureAuthenticated (line 92) | function ensureAuthenticated(req, res, next) {
function createJWT (line 118) | function createJWT(user) {
FILE: examples/server/php/app/Commands/Command.php
class Command (line 3) | abstract class Command {
FILE: examples/server/php/app/Console/Commands/Inspire.php
class Inspire (line 6) | class Inspire extends Command {
method handle (line 27) | public function handle()
FILE: examples/server/php/app/Console/Kernel.php
class Kernel (line 6) | class Kernel extends ConsoleKernel {
method schedule (line 23) | protected function schedule(Schedule $schedule)
FILE: examples/server/php/app/Events/Event.php
class Event (line 3) | abstract class Event {
FILE: examples/server/php/app/Exceptions/Handler.php
class Handler (line 6) | class Handler extends ExceptionHandler {
method report (line 25) | public function report(Exception $e)
method render (line 37) | public function render($request, Exception $e)
FILE: examples/server/php/app/Http/Controllers/AuthController.php
class AuthController (line 12) | class AuthController extends Controller {
method createToken (line 17) | protected function createToken($user)
method unlink (line 31) | public function unlink(Request $request, $provider)
method login (line 49) | public function login(Request $request)
method signup (line 76) | public function signup(Request $request)
method facebook (line 100) | public function facebook(Request $request)
method google (line 171) | public function google(Request $request)
method linkedin (line 239) | public function linkedin(Request $request)
method twitter (line 308) | public function twitter(Request $request)
method foursquare (line 426) | public function foursquare(Request $request)
method instagram (line 495) | public function instagram(Request $request)
method github (line 554) | public function github(Request $request)
FILE: examples/server/php/app/Http/Controllers/Controller.php
class Controller (line 7) | abstract class Controller extends BaseController {
FILE: examples/server/php/app/Http/Controllers/HomeController.php
class HomeController (line 5) | class HomeController extends Controller {
method index (line 7) | public function index()
FILE: examples/server/php/app/Http/Controllers/UserController.php
class UserController (line 8) | class UserController extends Controller {
method createToken (line 13) | protected function createToken($user)
method getUser (line 26) | public function getUser(Request $request)
method updateUser (line 36) | public function updateUser(Request $request)
FILE: examples/server/php/app/Http/Kernel.php
class Kernel (line 5) | class Kernel extends HttpKernel {
FILE: examples/server/php/app/Http/Middleware/Authenticate.php
class Authenticate (line 8) | class Authenticate {
method __construct (line 23) | public function __construct(Guard $auth)
method handle (line 35) | public function handle($request, Closure $next)
FILE: examples/server/php/app/Http/Middleware/RedirectIfAuthenticated.php
class RedirectIfAuthenticated (line 7) | class RedirectIfAuthenticated {
method __construct (line 22) | public function __construct(Guard $auth)
method handle (line 34) | public function handle($request, Closure $next)
FILE: examples/server/php/app/Http/Middleware/VerifyCsrfToken.php
class VerifyCsrfToken (line 6) | class VerifyCsrfToken extends BaseVerifier {
method handle (line 15) | public function handle($request, Closure $next)
FILE: examples/server/php/app/Http/Requests/Request.php
class Request (line 5) | abstract class Request extends FormRequest {
FILE: examples/server/php/app/Providers/AppServiceProvider.php
class AppServiceProvider (line 5) | class AppServiceProvider extends ServiceProvider {
method boot (line 12) | public function boot()
method register (line 22) | public function register()
FILE: examples/server/php/app/Providers/AuthServiceProvider.php
class AuthServiceProvider (line 8) | class AuthServiceProvider extends ServiceProvider
method boot (line 25) | public function boot(GateContract $gate)
FILE: examples/server/php/app/Providers/BusServiceProvider.php
class BusServiceProvider (line 6) | class BusServiceProvider extends ServiceProvider {
method boot (line 14) | public function boot(Dispatcher $dispatcher)
method register (line 29) | public function register()
FILE: examples/server/php/app/Providers/ConfigServiceProvider.php
class ConfigServiceProvider (line 5) | class ConfigServiceProvider extends ServiceProvider {
method register (line 16) | public function register()
FILE: examples/server/php/app/Providers/EventServiceProvider.php
class EventServiceProvider (line 6) | class EventServiceProvider extends ServiceProvider {
method boot (line 25) | public function boot(DispatcherContract $events)
FILE: examples/server/php/app/Providers/RouteServiceProvider.php
class RouteServiceProvider (line 6) | class RouteServiceProvider extends ServiceProvider {
method boot (line 23) | public function boot(Router $router)
method map (line 36) | public function map(Router $router)
FILE: examples/server/php/app/User.php
class User (line 5) | class User extends Model {
FILE: examples/server/php/database/migrations/2015_04_18_080047_create_users_table.php
class CreateUsersTable (line 6) | class CreateUsersTable extends Migration {
method up (line 13) | public function up()
method down (line 38) | public function down()
FILE: examples/server/php/database/seeds/DatabaseSeeder.php
class DatabaseSeeder (line 6) | class DatabaseSeeder extends Seeder {
method run (line 13) | public function run()
FILE: examples/server/php/public/vendor/angular-animate.js
function assertArg (line 79) | function assertArg(arg, name, reason) {
function mergeClasses (line 86) | function mergeClasses(a,b) {
function packageStyles (line 95) | function packageStyles(options) {
function pendClasses (line 104) | function pendClasses(classes, fix, isPrefix) {
function removeFromArray (line 121) | function removeFromArray(arr, val) {
function stripCommentsFromElement (line 128) | function stripCommentsFromElement(element) {
function extractElementNode (line 155) | function extractElementNode(element) {
function $$addClass (line 165) | function $$addClass($$jqLite, element, className) {
function $$removeClass (line 171) | function $$removeClass($$jqLite, element, className) {
function applyAnimationClassesFactory (line 177) | function applyAnimationClassesFactory($$jqLite) {
function prepareAnimationOptions (line 190) | function prepareAnimationOptions(options) {
function applyAnimationStyles (line 204) | function applyAnimationStyles(element, options) {
function applyAnimationFromStyles (line 209) | function applyAnimationFromStyles(element, options) {
function applyAnimationToStyles (line 216) | function applyAnimationToStyles(element, options) {
function mergeAnimationOptions (line 223) | function mergeAnimationOptions(element, target, newOptions) {
function resolveElementClasses (line 258) | function resolveElementClasses(existing, toAdd, toRemove) {
function getDomNode (line 316) | function getDomNode(element) {
function applyGeneratedPreparationClasses (line 320) | function applyGeneratedPreparationClasses(element, event, options) {
function clearGeneratedClasses (line 337) | function clearGeneratedClasses(element, options) {
function blockTransitions (line 348) | function blockTransitions(node, duration) {
function blockKeyframeAnimations (line 357) | function blockKeyframeAnimations(node, applyBlock) {
function applyInlineStyle (line 364) | function applyInlineStyle(node, styleTuple) {
function concatWithSpace (line 370) | function concatWithSpace(a,b) {
function scheduler (line 379) | function scheduler(tasks) {
function nextTick (line 409) | function nextTick() {
function getCssKeyframeDurationStyle (line 675) | function getCssKeyframeDurationStyle(duration) {
function getCssDelayStyle (line 679) | function getCssDelayStyle(delay, isKeyframeAnimation) {
function computeCssStyles (line 684) | function computeCssStyles($window, element, properties) {
function parseMaxTime (line 710) | function parseMaxTime(str) {
function truthyTimingValue (line 725) | function truthyTimingValue(val) {
function getCssTransitionDurationStyle (line 729) | function getCssTransitionDurationStyle(duration, applyOnlyDuration) {
function createLocalCacheLookup (line 740) | function createLocalCacheLookup() {
function registerRestorableStyles (line 776) | function registerRestorableStyles(backup, node, properties) {
function gcsHashFn (line 796) | function gcsHashFn(node, extraClasses) {
function computeCachedCssStyles (line 803) | function computeCachedCssStyles(node, className, cacheKey, properties) {
function computeCachedCssStaggerStyles (line 819) | function computeCachedCssStaggerStyles(node, className, cacheKey, proper...
function waitUntilQuiet (line 850) | function waitUntilQuiet(callback) {
function computeTimings (line 869) | function computeTimings(node, className, cacheKey) {
function endFn (line 1125) | function endFn() {
function cancelFn (line 1129) | function cancelFn() {
function close (line 1133) | function close(rejected) { // jshint ignore:line
function applyBlocking (line 1180) | function applyBlocking(duration) {
function closeAndReturnNoopAnimator (line 1190) | function closeAndReturnNoopAnimator() {
function start (line 1209) | function start() {
function isDocumentFragment (line 1418) | function isDocumentFragment(node) {
function filterCssClasses (line 1449) | function filterCssClasses(classes) {
function getUniqueValues (line 1454) | function getUniqueValues(a, b) {
function prepareAnchoredAnimation (line 1462) | function prepareAnchoredAnimation(classes, outAnchor, inAnchor) {
function prepareFromToAnchorAnimation (line 1589) | function prepareFromToAnchorAnimation(from, to, classes, anchors) {
function prepareRegularAnimation (line 1642) | function prepareRegularAnimation(animationDetails) {
function applyOptions (line 1735) | function applyOptions() {
function onComplete (line 1779) | function onComplete(success) {
function endAnimations (line 1786) | function endAnimations(cancelled) {
function executeAnimationFn (line 1795) | function executeAnimationFn(fn, element, event, options, onDone) {
function groupEventedAnimations (line 1838) | function groupEventedAnimations(element, event, options, animations, fnN...
function packageAnimations (line 1879) | function packageAnimations(element, event, options, animations, fnName) {
function lookupAnimations (line 1921) | function lookupAnimations(classes) {
function endFnFactory (line 1967) | function endFnFactory() {
function done (line 1976) | function done(status) {
function prepareAnimation (line 1986) | function prepareAnimation(animationDetails) {
function isAllowed (line 2009) | function isAllowed(ruleType, element, currentAnimation, previousAnimatio...
function hasAnimationClasses (line 2015) | function hasAnimationClasses(options, and) {
function postDigestTaskFactory (line 2072) | function postDigestTaskFactory() {
function normalizeAnimationOptions (line 2132) | function normalizeAnimationOptions(element, options) {
function findCallbacks (line 2136) | function findCallbacks(element, event) {
function filterFromRegistry (line 2170) | function filterFromRegistry(list, matchContainer, matchCallback) {
function queueAnimation (line 2232) | function queueAnimation(element, event, options) {
function closeChildAnimations (line 2495) | function closeChildAnimations(element) {
function clearElementAnimationState (line 2514) | function clearElementAnimationState(element) {
function isMatchingElement (line 2520) | function isMatchingElement(nodeOrElmA, nodeOrElmB) {
function areAnimationsAllowed (line 2524) | function areAnimationsAllowed(element, parentElement, event) {
function markElementAnimationState (line 2592) | function markElementAnimationState(element, state, details) {
function waitForTick (line 2611) | function waitForTick(fn) {
function next (line 2644) | function next() {
function onProgress (line 2668) | function onProgress(response) {
function AnimateRunner (line 2676) | function AnimateRunner(host) {
function setRunner (line 2780) | function setRunner(element, runner) {
function removeRunner (line 2784) | function removeRunner(element) {
function getRunner (line 2788) | function getRunner(element) {
function sortAnimations (line 2798) | function sortAnimations(animations) {
function getAnchorNodes (line 2992) | function getAnchorNodes(node) {
function groupAnimations (line 3007) | function groupAnimations(animations) {
function cssClassesIntersection (line 3090) | function cssClassesIntersection(a,b) {
function invokeFirstDriver (line 3110) | function invokeFirstDriver(animationDetails) {
function beforeStart (line 3125) | function beforeStart() {
function updateAnimationRunners (line 3132) | function updateAnimationRunners(animation, newRunner) {
function handleDestroyedElement (line 3145) | function handleDestroyedElement() {
function close (line 3152) | function close(rejected) { // jshint ignore:line
FILE: examples/server/php/public/vendor/angular-messages.js
function findPreviousMessage (line 428) | function findPreviousMessage(parent, comment) {
function insertMessageNode (line 448) | function insertMessageNode(parent, comment, key) {
function removeMessageNode (line 464) | function removeMessageNode(parent, comment, key) {
function isAttrTruthy (line 477) | function isAttrTruthy(scope, attr) {
function truthy (line 482) | function truthy(val) {
function ngMessageDirectiveFactory (line 607) | function ngMessageDirectiveFactory(restrict) {
FILE: examples/server/php/public/vendor/angular-mocks.js
function concat (line 281) | function concat(array1, array2, index) {
function tick (line 461) | function tick() {
function jsonStringToDate (line 557) | function jsonStringToDate(string) {
function toInt (line 577) | function toInt(str) {
function padNumber (line 581) | function padNumber(num, digits, trim) {
function reflowFn (line 766) | function reflowFn() {
method reflows (line 803) | get reflows() {
function serialize (line 870) | function serialize(object) {
function serializeScope (line 903) | function serializeScope(scope, offset) {
function createHttpBackendMock (line 1155) | function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
function MockHttpExpectation (line 1633) | function MockHttpExpectation(method, url, data, headers) {
function createMockXhr (line 1674) | function createMockXhr() {
function MockXhr (line 1678) | function MockXhr() {
function formatPendingTasksAsString (line 1767) | function formatPendingTasksAsString(tasks) {
function countChildScopes (line 2156) | function countChildScopes() {
function countWatchers (line 2188) | function countWatchers() {
function workFn (line 2288) | function workFn() {
function workFn (line 2412) | function workFn() {
function workFn (line 2457) | function workFn() {
FILE: examples/server/php/public/vendor/angular-resource.js
function isValidDottedPath (line 15) | function isValidDottedPath(path) {
function lookupDottedPath (line 20) | function lookupDottedPath(obj, path) {
function shallowClearAndCopy (line 35) | function shallowClearAndCopy(src, dst) {
function encodeUriSegment (line 392) | function encodeUriSegment(val) {
function encodeUriQuery (line 411) | function encodeUriQuery(val, pctEncodeSpaces) {
function Route (line 420) | function Route(template, defaults) {
function resourceFactory (line 493) | function resourceFactory(url, paramDefaults, actions, options) {
FILE: examples/server/php/public/vendor/angular-sanitize.js
function $SanitizeProvider (line 151) | function $SanitizeProvider() {
function sanitizeText (line 163) | function sanitizeText(chars) {
function makeMap (line 262) | function makeMap(str, lowercaseKeys) {
function htmlParser (line 283) | function htmlParser(html, handler) {
function decodeEntities (line 439) | function decodeEntities(value) {
function encodeEntities (line 455) | function encodeEntities(value) {
function htmlSanitizeWriter (line 480) | function htmlSanitizeWriter(buf, uriValidator) {
function addText (line 659) | function addText(text) {
function addLink (line 666) | function addLink(url, text) {
FILE: examples/server/php/public/vendor/angular-toastr.js
function toastr (line 9) | function toastr($animate, $injector, $document, $rootScope, $sce, toastr...
function progressBar (line 312) | function progressBar(toastrConfig) {
function ToastController (line 362) | function ToastController() {
function toast (line 387) | function toast($injector, $interval, toastrConfig, toastr) {
FILE: examples/server/php/public/vendor/angular-toastr.tpls.js
function toastr (line 9) | function toastr($animate, $injector, $document, $rootScope, $sce, toastr...
function progressBar (line 312) | function progressBar(toastrConfig) {
function ToastController (line 362) | function ToastController() {
function toast (line 387) | function toast($injector, $interval, toastrConfig, toastr) {
FILE: examples/server/php/public/vendor/angular-ui-router.js
function inherit (line 27) | function inherit(parent, extra) {
function merge (line 31) | function merge(dst) {
function ancestors (line 49) | function ancestors(first, second) {
function objectKeys (line 65) | function objectKeys(object) {
function indexOf (line 84) | function indexOf(array, value) {
function inheritParams (line 108) | function inheritParams(currentParams, newParams, $current, $to) {
function equalForKeys (line 134) | function equalForKeys(a, b, keys) {
function filterByKeys (line 154) | function filterByKeys(keys, values) {
function indexBy (line 165) | function indexBy(array, propName) {
function pick (line 175) | function pick(obj) {
function omit (line 186) | function omit(obj) {
function pluck (line 195) | function pluck(collection, key) {
function filter (line 204) | function filter(collection, callback) {
function map (line 215) | function map(collection, callback) {
function $Resolve (line 318) | function $Resolve( $q, $injector) {
function $TemplateFactory (line 572) | function $TemplateFactory( $http, $templateCache, $injector) {
function UrlMatcher (line 738) | function UrlMatcher(pattern, config, parentMatcher) {
function decodePathArray (line 913) | function decodePathArray(string) {
function encodeDashes (line 999) | function encodeDashes(str) { // Replace dashes with encoded "\-"
function Type (line 1069) | function Type(config) {
function ArrayType (line 1172) | function ArrayType(type, mode) {
function $UrlMatcherFactory (line 1237) | function $UrlMatcherFactory() {
function $UrlRouterProvider (line 1739) | function $UrlRouterProvider( $locationProvider, $urlMatcherFactory) {
function $StateProvider (line 2172) | function $StateProvider( $urlRouterProvider, $urlMatcherFactory) {
function $ViewProvider (line 3618) | function $ViewProvider() {
function $ViewScrollProvider (line 3695) | function $ViewScrollProvider() {
function $ViewDirective (line 3855) | function $ViewDirective( $state, $injector, $uiViewScroll, $inte...
function $ViewDirectiveFill (line 3995) | function $ViewDirectiveFill ( $compile, $controller, $state, $int...
function getUiViewName (line 4036) | function getUiViewName(scope, attrs, element, $interpolate) {
function parseStateRef (line 4045) | function parseStateRef(ref, current) {
function stateContext (line 4053) | function stateContext(el) {
function $StateRefDirective (line 4124) | function $StateRefDirective($state, $timeout) {
function $StateRefActiveDirective (line 4272) | function $StateRefActiveDirective($state, $stateParams, $interpolate) {
function $IsStateFilter (line 4341) | function $IsStateFilter($state) {
function $IncludedByStateFilter (line 4359) | function $IncludedByStateFilter($state) {
FILE: examples/server/php/public/vendor/angular.js
function minErr (line 38) | function minErr(module, ErrorConstructor) {
function isArrayLike (line 269) | function isArrayLike(obj) {
function forEach (line 321) | function forEach(obj, iterator, context) {
function forEachSorted (line 365) | function forEachSorted(obj, iterator, context) {
function reverseParams (line 379) | function reverseParams(iteratorFn) {
function nextUid (line 393) | function nextUid() {
function setHashKey (line 403) | function setHashKey(obj, h) {
function baseExtend (line 412) | function baseExtend(dst, objs, deep) {
function extend (line 460) | function extend(dst) {
function merge (line 483) | function merge(dst) {
function toInt (line 489) | function toInt(str) {
function inherit (line 494) | function inherit(parent, extra) {
function noop (line 514) | function noop() {}
function identity (line 536) | function identity($) {return $;}
function valueFn (line 540) | function valueFn(value) {return function() {return value;};}
function hasCustomToString (line 542) | function hasCustomToString(obj) {
function isUndefined (line 559) | function isUndefined(value) {return typeof value === 'undefined';}
function isDefined (line 574) | function isDefined(value) {return typeof value !== 'undefined';}
function isObject (line 590) | function isObject(value) {
function isBlankObject (line 601) | function isBlankObject(value) {
function isString (line 618) | function isString(value) {return typeof value === 'string';}
function isNumber (line 639) | function isNumber(value) {return typeof value === 'number';}
function isDate (line 654) | function isDate(value) {
function isFunction (line 685) | function isFunction(value) {return typeof value === 'function';}
function isRegExp (line 695) | function isRegExp(value) {
function isWindow (line 707) | function isWindow(obj) {
function isScope (line 712) | function isScope(obj) {
function isFile (line 717) | function isFile(obj) {
function isFormData (line 722) | function isFormData(obj) {
function isBlob (line 727) | function isBlob(obj) {
function isBoolean (line 732) | function isBoolean(value) {
function isPromiseLike (line 737) | function isPromiseLike(obj) {
function isTypedArray (line 743) | function isTypedArray(value) {
function isElement (line 773) | function isElement(node) {
function makeMap (line 783) | function makeMap(str) {
function nodeName_ (line 792) | function nodeName_(element) {
function includes (line 796) | function includes(array, obj) {
function arrayRemove (line 800) | function arrayRemove(array, value) {
function copy (line 866) | function copy(source, destination, stackSource, stackDest) {
function shallowCopy (line 965) | function shallowCopy(src, dst) {
function equals (line 1015) | function equals(o1, o2) {
function noUnsafeEval (line 1081) | function noUnsafeEval() {
function concat (line 1146) | function concat(array1, array2, index) {
function sliceArgs (line 1150) | function sliceArgs(args, startIndex) {
function bind (line 1174) | function bind(self, fn) {
function toJsonReplacer (line 1195) | function toJsonReplacer(key, value) {
function toJson (line 1227) | function toJson(obj, pretty) {
function fromJson (line 1248) | function fromJson(json) {
function timezoneToOffset (line 1255) | function timezoneToOffset(timezone, fallback) {
function addDateMinutes (line 1261) | function addDateMinutes(date, minutes) {
function convertTimezoneToLocal (line 1268) | function convertTimezoneToLocal(date, timezone, reverse) {
function startingTag (line 1278) | function startingTag(element) {
function tryDecodeURIComponent (line 1308) | function tryDecodeURIComponent(value) {
function parseKeyValue (line 1321) | function parseKeyValue(/**string*/keyValue) {
function toKeyValue (line 1348) | function toKeyValue(obj) {
function encodeUriSegment (line 1376) | function encodeUriSegment(val) {
function encodeUriQuery (line 1395) | function encodeUriQuery(val, pctEncodeSpaces) {
function getNgAttribute (line 1407) | function getNgAttribute(element, ngAttr) {
function angularInit (line 1545) | function angularInit(element, bootstrap) {
function bootstrap (line 1624) | function bootstrap(element, modules, config) {
function reloadWithDebugInfo (line 1702) | function reloadWithDebugInfo() {
function getTestability (line 1715) | function getTestability(rootElement) {
function snake_case (line 1725) | function snake_case(name, separator) {
function bindJQuery (line 1734) | function bindJQuery() {
function assertArg (line 1793) | function assertArg(arg, name, reason) {
function assertArgFn (line 1800) | function assertArgFn(arg, name, acceptArrayAnnotation) {
function assertNotHasOwnProperty (line 1815) | function assertNotHasOwnProperty(name, context) {
function getter (line 1829) | function getter(obj, path, bindFnToScope) {
function getBlockNodes (line 1853) | function getBlockNodes(nodes) {
function createMap (line 1881) | function createMap() {
function setupModuleLoader (line 1901) | function setupModuleLoader(window) {
function serializeObject (line 2243) | function serializeObject(obj) {
function toDebugString (line 2258) | function toDebugString(obj) {
function publishExternalAPI (line 2385) | function publishExternalAPI(angular) {
function jqNextId (line 2651) | function jqNextId() { return ++jqId; }
function camelCase (line 2664) | function camelCase(name) {
function jqLiteIsTextNode (line 2692) | function jqLiteIsTextNode(html) {
function jqLiteAcceptsData (line 2696) | function jqLiteAcceptsData(node) {
function jqLiteHasData (line 2703) | function jqLiteHasData(node) {
function jqLiteBuildFragment (line 2710) | function jqLiteBuildFragment(html, context) {
function jqLiteParseHTML (line 2747) | function jqLiteParseHTML(html, context) {
function JQLite (line 2763) | function JQLite(element) {
function jqLiteClone (line 2788) | function jqLiteClone(element) {
function jqLiteDealoc (line 2792) | function jqLiteDealoc(element, onlyDescendants) {
function jqLiteOff (line 2803) | function jqLiteOff(element, type, fn, unsupported) {
function jqLiteRemoveData (line 2835) | function jqLiteRemoveData(element, name) {
function jqLiteExpandoStore (line 2857) | function jqLiteExpandoStore(element, createIfNecessary) {
function jqLiteData (line 2870) | function jqLiteData(element, key, value) {
function jqLiteHasClass (line 2896) | function jqLiteHasClass(element, selector) {
function jqLiteRemoveClass (line 2902) | function jqLiteRemoveClass(element, cssClasses) {
function jqLiteAddClass (line 2914) | function jqLiteAddClass(element, cssClasses) {
function jqLiteAddNodes (line 2931) | function jqLiteAddNodes(root, elements) {
function jqLiteController (line 2957) | function jqLiteController(element, name) {
function jqLiteInheritedData (line 2961) | function jqLiteInheritedData(element, name, value) {
function jqLiteEmpty (line 2981) | function jqLiteEmpty(element) {
function jqLiteRemove (line 2988) | function jqLiteRemove(element, keepData) {
function jqLiteDocumentLoaded (line 2995) | function jqLiteDocumentLoaded(action, win) {
function trigger (line 3015) | function trigger() {
function getBooleanAttrName (line 3069) | function getBooleanAttrName(element, name) {
function getAliasedAttrName (line 3077) | function getAliasedAttrName(element, name) {
function getText (line 3170) | function getText(element, value) {
function createEventHandler (line 3255) | function createEventHandler(element, events) {
function $$jqLiteProvider (line 3551) | function $$jqLiteProvider() {
function hashKey (line 3582) | function hashKey(obj, nextUidFn) {
function HashMap (line 3605) | function HashMap(array, isolatedUid) {
function anonFn (line 3717) | function anonFn(fn) {
function annotate (line 3728) | function annotate(fn, strictDi, name) {
function createInjector (line 4263) | function createInjector(modulesToLoad, strictDi) {
function $AnchorScrollProvider (line 4508) | function $AnchorScrollProvider() {
function mergeClasses (line 4775) | function mergeClasses(a,b) {
function extractElementNode (line 4784) | function extractElementNode(element) {
function splitClasses (line 4793) | function splitClasses(classes) {
function prepareAnimateOptions (line 4818) | function prepareAnimateOptions(options) {
function AnimateRunner (line 4826) | function AnimateRunner() {}
function addRemoveClassesPostDigest (line 4876) | function addRemoveClassesPostDigest(element, add, remove) {
function domInsert (line 5030) | function domInsert(element, parentElement, afterElement) {
function run (line 5414) | function run() {
function close (line 5425) | function close() {
function Browser (line 5466) | function Browser(window, document, $log, $sniffer) {
function $BrowserProvider (line 5791) | function $BrowserProvider() {
function $CacheFactoryProvider (line 5879) | function $CacheFactoryProvider() {
function $TemplateCacheProvider (line 6192) | function $TemplateCacheProvider() {
function $CompileProvider (line 6920) | function $CompileProvider($provide, $$sanitizeUriProvider) {
function directiveNormalize (line 8861) | function directiveNormalize(name) {
function nodesetLinkingFn (line 8910) | function nodesetLinkingFn(
function directiveLinkingFn (line 8917) | function directiveLinkingFn(
function tokenDifference (line 8925) | function tokenDifference(str1, str2) {
function removeComments (line 8941) | function removeComments(jqNodes) {
function identifierForController (line 8962) | function identifierForController(controller, ident) {
function $ControllerProvider (line 8981) | function $ControllerProvider() {
function $DocumentProvider (line 9154) | function $DocumentProvider() {
function $ExceptionHandlerProvider (line 9200) | function $ExceptionHandlerProvider() {
function serializeValue (line 9246) | function serializeValue(v) {
function $HttpParamSerializerProvider (line 9254) | function $HttpParamSerializerProvider() {
function $HttpParamSerializerJQLikeProvider (line 9291) | function $HttpParamSerializerJQLikeProvider() {
function defaultHttpResponseTransform (line 9363) | function defaultHttpResponseTransform(data, headers) {
function isJsonLike (line 9379) | function isJsonLike(str) {
function parseHeaders (line 9390) | function parseHeaders(headers) {
function headersGetter (line 9426) | function headersGetter(headers) {
function transformData (line 9456) | function transformData(data, headers, status, fns) {
function isSuccess (line 9469) | function isSuccess(status) {
function $HttpProvider (line 9480) | function $HttpProvider() {
function createXhr (line 10552) | function createXhr() {
function $HttpBackendProvider (line 10572) | function $HttpBackendProvider() {
function createHttpBackend (line 10578) | function createHttpBackend($browser, createXhr, $browserDefer, callbacks...
function $InterpolateProvider (line 10772) | function $InterpolateProvider() {
function $IntervalProvider (line 11075) | function $IntervalProvider() {
function encodePath (line 11287) | function encodePath(path) {
function parseAbsoluteUrl (line 11298) | function parseAbsoluteUrl(absoluteUrl, locationObj) {
function parseAppUrl (line 11307) | function parseAppUrl(relativeUrl, locationObj) {
function beginsWith (line 11332) | function beginsWith(begin, whole) {
function stripHash (line 11339) | function stripHash(url) {
function trimEmptyHash (line 11344) | function trimEmptyHash(url) {
function stripFile (line 11349) | function stripFile(url) {
function serverBase (line 11354) | function serverBase(url) {
function LocationHtml5Url (line 11368) | function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {
function LocationHashbangUrl (line 11447) | function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {
function LocationHashbangInHtml5Url (line 11559) | function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) {
function locationGetter (line 11923) | function locationGetter(property) {
function locationGetterSetter (line 11930) | function locationGetterSetter(property, preprocess) {
function $LocationProvider (line 11976) | function $LocationProvider() {
function $LogProvider (line 12310) | function $LogProvider() {
function ensureSafeMemberName (line 12466) | function ensureSafeMemberName(name, fullExpression) {
function ensureSafeObject (line 12477) | function ensureSafeObject(obj, fullExpression) {
function ensureSafeFunction (line 12508) | function ensureSafeFunction(obj, fullExpression) {
function ifDefined (line 13029) | function ifDefined(v, d) {
function plusFn (line 13033) | function plusFn(l, r) {
function isStateless (line 13039) | function isStateless($filter, filterName) {
function findConstantAndWatchExpressions (line 13044) | function findConstantAndWatchExpressions(ast, $filter) {
function getInputs (line 13148) | function getInputs(body) {
function isAssignable (line 13156) | function isAssignable(ast) {
function assignableAST (line 13160) | function assignableAST(ast) {
function isLiteral (line 13166) | function isLiteral(ast) {
function isConstant (line 13174) | function isConstant(ast) {
function ASTCompiler (line 13178) | function ASTCompiler(astBuilder, $filter) {
function ASTInterpreter (line 13651) | function ASTInterpreter(astBuilder, $filter) {
function isPossiblyDangerousMemberName (line 14042) | function isPossiblyDangerousMemberName(name) {
function getValueOf (line 14048) | function getValueOf(value) {
function $ParseProvider (line 14103) | function $ParseProvider() {
function $QProvider (line 14531) | function $QProvider() {
function $$QProvider (line 14540) | function $$QProvider() {
function qFactory (line 14556) | function qFactory(nextTick, exceptionHandler) {
function $$RAFProvider (line 14910) | function $$RAFProvider() { //rAF
function $RootScopeProvider (line 15045) | function $RootScopeProvider() {
function $$SanitizeUriProvider (line 16330) | function $$SanitizeUriProvider() {
function adjustMatcher (line 16421) | function adjustMatcher(matcher) {
function adjustMatchers (line 16449) | function adjustMatchers(matchers) {
function $SceDelegateProvider (line 16527) | function $SceDelegateProvider() {
function $SceProvider (line 17057) | function $SceProvider() {
function $SnifferProvider (line 17469) | function $SnifferProvider() {
function $TemplateRequestProvider (line 17563) | function $TemplateRequestProvider() {
function $$TestabilityProvider (line 17616) | function $$TestabilityProvider() {
function $TimeoutProvider (line 17731) | function $TimeoutProvider() {
function urlResolve (line 17882) | function urlResolve(url) {
function urlIsSameOrigin (line 17916) | function urlIsSameOrigin(requestUrl) {
function $WindowProvider (line 17963) | function $WindowProvider() {
function $$CookieReader (line 17976) | function $$CookieReader($document) {
function $$CookieReaderProvider (line 18018) | function $$CookieReaderProvider() {
function $FilterProvider (line 18122) | function $FilterProvider($provide) {
function filterFilter (line 18312) | function filterFilter() {
function createPredicateFn (line 18349) | function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
function deepCompare (line 18386) | function deepCompare(actual, expected, comparator, matchAgainstAnyProp, ...
function getTypeForFilter (line 18436) | function getTypeForFilter(val) {
function currencyFilter (line 18493) | function currencyFilter($locale) {
function numberFilter (line 18567) | function numberFilter($locale) {
function formatNumber (line 18580) | function formatNumber(number, pattern, groupSep, decimalSep, fractionSiz...
function padNumber (line 18667) | function padNumber(num, digits, trim) {
function dateGetter (line 18682) | function dateGetter(name, size, offset, trim) {
function dateStrGetter (line 18694) | function dateStrGetter(name, shortForm) {
function timeZoneGetter (line 18703) | function timeZoneGetter(date, formats, offset) {
function getFirstThursdayOfYear (line 18713) | function getFirstThursdayOfYear(year) {
function getThursdayThisWeek (line 18721) | function getThursdayThisWeek(datetime) {
function weekGetter (line 18727) | function weekGetter(size) {
function ampmGetter (line 18739) | function ampmGetter(date, formats) {
function eraGetter (line 18743) | function eraGetter(date, formats) {
function longEraGetter (line 18747) | function longEraGetter(date, formats) {
function dateFilter (line 18881) | function dateFilter($locale) {
function jsonFilter (line 18988) | function jsonFilter() {
function limitToFilter (line 19117) | function limitToFilter() {
function orderByFilter (line 19318) | function orderByFilter($parse) {
function ngDirective (line 19436) | function ngDirective(directive) {
function defaultLinkFn (line 19838) | function defaultLinkFn(scope, element, attr) {
function nullFormRenameControl (line 19940) | function nullFormRenameControl(control, name) {
function FormController (line 19987) | function FormController(element, attrs, $scope, $animate, $interpolate) {
function getSetter (line 20442) | function getSetter(expression) {
function stringBasedInputType (line 21490) | function stringBasedInputType(ctrl) {
function textInputType (line 21496) | function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function baseInputType (line 21501) | function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function weekParser (line 21591) | function weekParser(isoWeek, existingDate) {
function createDateParser (line 21623) | function createDateParser(regexp, mapping) {
function createDateInputType (line 21673) | function createDateInputType(type, regexp, parseDate, format) {
function badInputChecker (line 21745) | function badInputChecker(scope, element, attr, ctrl) {
function numberInputType (line 21760) | function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function urlInputType (line 21814) | function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function emailInputType (line 21827) | function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function radioInputType (line 21840) | function radioInputType(scope, element, attr, ctrl) {
function parseConstantExpr (line 21862) | function parseConstantExpr($parse, context, name, expression, fallback) {
function checkboxInputType (line 21875) | function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browse...
function classDirective (line 22458) | function classDirective(name, selector) {
function processParseErrors (line 25004) | function processParseErrors() {
function processSyncValidators (line 25024) | function processSyncValidators() {
function processAsyncValidators (line 25040) | function processAsyncValidators() {
function setValidity (line 25066) | function setValidity(name, isValid) {
function validationDone (line 25072) | function validationDone(allValid) {
function writeToModelIfNeeded (line 25151) | function writeToModelIfNeeded() {
function addSetValidityMethod (line 25696) | function addSetValidityMethod(context) {
function isObjectEmpty (line 25791) | function isObjectEmpty(obj) {
function parseOptionsExpression (line 26066) | function parseOptionsExpression(optionsExp, selectElement, scope) {
function updateOptionElement (line 26412) | function updateOptionElement(option, element) {
function addOrReuseElement (line 26422) | function addOrReuseElement(parent, current, type, templateElement) {
function removeExcessElements (line 26443) | function removeExcessElements(current) {
function skipEmptyAndUnknownOptions (line 26453) | function skipEmptyAndUnknownOptions(current) {
function updateOptions (line 26468) | function updateOptions() {
function updateElementText (line 26794) | function updateElementText(newText) {
function chromeHack (line 28301) | function chromeHack(optionElement) {
function getDecimals (line 28472) | function getDecimals(n) {
function getVF (line 28478) | function getVF(n, opt_precision) {
FILE: examples/server/php/public/vendor/dist/satellizer.js
function Config (line 8) | function Config() {
function AuthProvider (line 149) | function AuthProvider(SatellizerConfig) {
function joinUrl (line 291) | function joinUrl(baseUrl, url) {
function getFullUrlPath (line 305) | function getFullUrlPath(location) {
function parseQueryString (line 311) | function parseQueryString(str) {
function decodeBase64 (line 324) | function decodeBase64(str) {
function Shared (line 375) | function Shared($q, $window, $log, SatellizerConfig, SatellizerStorage) {
function Local (line 458) | function Local($http, SatellizerConfig, SatellizerShared) {
function Popup (line 488) | function Popup($interval, $window) {
function OAuth (line 597) | function OAuth($http, SatellizerConfig, SatellizerShared, SatellizerOAut...
function OAuth2 (line 632) | function OAuth2($http, $window, $timeout, SatellizerConfig, SatellizerPo...
function OAuth1 (line 752) | function OAuth1($http, $window, SatellizerConfig, SatellizerPopup) {
function Storage (line 816) | function Storage($window, SatellizerConfig) {
function Interceptor (line 851) | function Interceptor(SatellizerConfig, SatellizerShared, SatellizerStora...
function HttpProviderConfig (line 877) | function HttpProviderConfig($httpProvider) {
FILE: examples/server/php/public/vendor/satellizer.js
function Config (line 14) | function Config() {
function AuthProvider (line 169) | function AuthProvider(SatellizerConfig) {
function joinUrl (line 315) | function joinUrl(baseUrl, url) {
function getFullUrlPath (line 329) | function getFullUrlPath(location) {
function parseQueryString (line 335) | function parseQueryString(str) {
function decodeBase64 (line 348) | function decodeBase64(str) {
function Shared (line 399) | function Shared($q, $window, SatellizerConfig, SatellizerStorage) {
function Local (line 478) | function Local($http, SatellizerConfig, SatellizerShared) {
function Popup (line 508) | function Popup($interval, $window, $q) {
function OAuth1 (line 625) | function OAuth1($http, $window, SatellizerConfig, SatellizerPopup) {
function OAuth2 (line 692) | function OAuth2($http, $window, $timeout, $q, SatellizerConfig, Satelliz...
function OAuth (line 809) | function OAuth($http, $window, $timeout, $q, SatellizerConfig, Satellize...
function Storage (line 870) | function Storage($window, SatellizerConfig) {
function Interceptor (line 904) | function Interceptor(SatellizerConfig, SatellizerShared, SatellizerStora...
function HttpProviderConfig (line 934) | function HttpProviderConfig($httpProvider) {
FILE: examples/server/php/tests/ExampleTest.php
class ExampleTest (line 3) | class ExampleTest extends TestCase {
method testBasicExample (line 10) | public function testBasicExample()
FILE: examples/server/php/tests/TestCase.php
class TestCase (line 3) | class TestCase extends Illuminate\Foundation\Testing\TestCase {
method createApplication (line 10) | public function createApplication()
FILE: examples/server/python/app.py
class User (line 27) | class User(db.Model):
method __init__ (line 39) | def __init__(self, email=None, password=None, display_name=None,
method set_password (line 59) | def set_password(self, password):
method check_password (line 62) | def check_password(self, password):
method to_json (line 65) | def to_json(self):
function create_token (line 75) | def create_token(user):
function parse_token (line 85) | def parse_token(req):
function login_required (line 90) | def login_required(f):
function index (line 119) | def index():
function me (line 125) | def me():
function login (line 131) | def login():
function signup (line 142) | def signup():
function facebook (line 151) | def facebook():
function github (line 205) | def github():
function google (line 262) | def google():
function linkedin (line 317) | def linkedin():
function twitter (line 373) | def twitter():
function bitbucket (line 405) | def bitbucket():
FILE: examples/server/ruby/app/controllers/api_controller.rb
class APIController (line 1) | class APIController < ApplicationController
method show (line 4) | def show
method update (line 8) | def update
method api_params (line 16) | def api_params
FILE: examples/server/ruby/app/controllers/application_controller.rb
class ApplicationController (line 1) | class ApplicationController < ActionController::Base
method authenticate_user! (line 8) | def authenticate_user!
method unauthorized! (line 12) | def unauthorized!
method current_user (line 16) | def current_user
method set_current_user (line 20) | def set_current_user
FILE: examples/server/ruby/app/controllers/auth_controller.rb
class AuthController (line 1) | class AuthController < ApplicationController
method render_data (line 3) | def render_data(data, status)
method render_error (line 7) | def render_error(message, status = :unprocessable_entity)
method render_success (line 11) | def render_success(data, status = :ok)
method signup (line 19) | def signup
method login (line 24) | def login
method authenticate (line 34) | def authenticate
method twitter (line 49) | def twitter
method twitter_step_2 (line 57) | def twitter_step_2
method twitter_oauth (line 71) | def twitter_oauth
method auth_params (line 75) | def auth_params
FILE: examples/server/ruby/app/helpers/application_helper.rb
type ApplicationHelper (line 1) | module ApplicationHelper
FILE: examples/server/ruby/app/models/authorization.rb
class Authorization (line 19) | class Authorization < ActiveRecord::Base
method fetch_details (line 27) | def fetch_details
method fetch_details_from_facebook (line 31) | def fetch_details_from_facebook
method fetch_details_from_linkedin (line 41) | def fetch_details_from_linkedin
method fetch_details_from_google_oauth2 (line 44) | def fetch_details_from_google_oauth2
method fetch_details_from_github (line 47) | def fetch_details_from_github
FILE: examples/server/ruby/app/models/oauth/base.rb
type Oauth (line 1) | module Oauth
class Base (line 2) | class Base
method initialize (line 5) | def initialize params
method get_access_token (line 15) | def get_access_token
method prepare_params (line 21) | def prepare_params params
method authorized? (line 31) | def authorized?
FILE: examples/server/ruby/app/models/oauth/facebook.rb
type Oauth (line 1) | module Oauth
class Facebook (line 2) | class Facebook < Oauth::Base
method get_data (line 6) | def get_data
method formatted_user_data (line 14) | def formatted_user_data
FILE: examples/server/ruby/app/models/oauth/foursquare.rb
type Oauth (line 1) | module Oauth
class Foursquare (line 2) | class Foursquare < Oauth::Base
method get_data (line 6) | def get_data
method formatted_user_data (line 13) | def formatted_user_data
FILE: examples/server/ruby/app/models/oauth/github.rb
type Oauth (line 1) | module Oauth
class Github (line 2) | class Github < Oauth::Base
method get_access_token (line 7) | def get_access_token
method get_data (line 12) | def get_data
method formatted_user_data (line 20) | def formatted_user_data
method email_is_in_scopes (line 32) | def email_is_in_scopes headers
method get_email (line 36) | def get_email
FILE: examples/server/ruby/app/models/oauth/google.rb
type Oauth (line 1) | module Oauth
class Google (line 2) | class Google < Oauth::Base
method get_names (line 6) | def get_names
method get_data (line 11) | def get_data
method formatted_user_data (line 18) | def formatted_user_data
FILE: examples/server/ruby/app/models/oauth/linkedin.rb
type Oauth (line 1) | module Oauth
class Linkedin (line 2) | class Linkedin < Oauth::Base
method get_data (line 6) | def get_data
method formatted_user_data (line 13) | def formatted_user_data
FILE: examples/server/ruby/app/models/oauth/twitter.rb
type Oauth (line 1) | module Oauth
class Twitter (line 2) | class Twitter
method initialize (line 5) | def initialize params
method request_token (line 17) | def request_token
method get_access_token (line 27) | def get_access_token
method get_account (line 36) | def get_account
method authorized? (line 45) | def authorized?
method format_account_info (line 49) | def format_account_info
FILE: examples/server/ruby/app/models/token.rb
class Token (line 1) | class Token
method initialize (line 7) | def initialize token
method valid? (line 12) | def valid?
method encode (line 16) | def self.encode user_id
FILE: examples/server/ruby/app/models/user.rb
class User (line 1) | class User < ActiveRecord::Base
method for_oauth (line 4) | def self.for_oauth oauth
method from_auth (line 21) | def self.from_auth(params, current_user)
method displayName= (line 68) | def displayName= name
FILE: examples/server/ruby/app/serializers/user_serializer.rb
class UserSerializer (line 1) | class UserSerializer < ActiveModel::Serializer
method displayName (line 6) | def displayName
FILE: examples/server/ruby/config/application.rb
type SatellizerBackend (line 9) | module SatellizerBackend
class Application (line 10) | class Application < Rails::Application
FILE: examples/server/ruby/config/initializers/hash.rb
class Hash (line 1) | class Hash
method except (line 2) | def except(*blacklist)
method only (line 6) | def only(*whitelist)
method smash (line 10) | def smash(prefix = nil)
FILE: examples/server/ruby/db/migrate/20150331192120_create_users.rb
class CreateUsers (line 1) | class CreateUsers < ActiveRecord::Migration
method change (line 2) | def change
FILE: examples/server/ruby/db/migrate/20160703114821_create_authorizations.rb
class CreateAuthorizations (line 1) | class CreateAuthorizations < ActiveRecord::Migration
method change (line 2) | def change
FILE: examples/server/ruby/sinatra_static.rb
class SinatraStatic (line 3) | class SinatraStatic < Sinatra::Base
FILE: examples/server/ruby/test/models/user_test.rb
class UserTest (line 3) | class UserTest < ActiveSupport::TestCase
FILE: examples/server/ruby/test/test_helper.rb
class ActiveSupport::TestCase (line 5) | class ActiveSupport::TestCase
FILE: src/authProvider.ts
class AuthProvider (line 5) | class AuthProvider {
method constructor (line 8) | constructor(private SatellizerConfig: Config) {}
method baseUrl (line 10) | get baseUrl(): string { return this.SatellizerConfig.baseUrl; }
method baseUrl (line 11) | set baseUrl(value) { this.SatellizerConfig.baseUrl = value; }
method loginUrl (line 13) | get loginUrl(): string { return this.SatellizerConfig.loginUrl; }
method loginUrl (line 14) | set loginUrl(value) { this.SatellizerConfig.loginUrl = value; }
method signupUrl (line 16) | get signupUrl(): string { return this.SatellizerConfig.signupUrl; }
method signupUrl (line 17) | set signupUrl(value) { this.SatellizerConfig.signupUrl = value; }
method unlinkUrl (line 19) | get unlinkUrl(): string { return this.SatellizerConfig.unlinkUrl; }
method unlinkUrl (line 20) | set unlinkUrl(value) { this.SatellizerConfig.unlinkUrl = value; }
method tokenRoot (line 22) | get tokenRoot(): string { return this.SatellizerConfig.tokenRoot; }
method tokenRoot (line 23) | set tokenRoot(value) { this.SatellizerConfig.tokenRoot = value; }
method tokenName (line 25) | get tokenName(): string { return this.SatellizerConfig.tokenName; }
method tokenName (line 26) | set tokenName(value) { this.SatellizerConfig.tokenName = value; }
method tokenPrefix (line 28) | get tokenPrefix(): string { return this.SatellizerConfig.tokenPrefix; }
method tokenPrefix (line 29) | set tokenPrefix(value) { this.SatellizerConfig.tokenPrefix = value; }
method tokenHeader (line 31) | get tokenHeader(): string { return this.SatellizerConfig.tokenHeader; }
method tokenHeader (line 32) | set tokenHeader(value) { this.SatellizerConfig.tokenHeader = value; }
method tokenType (line 34) | get tokenType(): string { return this.SatellizerConfig.tokenType; }
method tokenType (line 35) | set tokenType(value) { this.SatellizerConfig.tokenType = value; }
method withCredentials (line 37) | get withCredentials(): boolean { return this.SatellizerConfig.withCred...
method withCredentials (line 38) | set withCredentials(value) { this.SatellizerConfig.withCredentials = v...
method storageType (line 40) | get storageType(): string { return this.SatellizerConfig.storageType; }
method storageType (line 41) | set storageType(value) { this.SatellizerConfig.storageType = value; }
method httpInterceptor (line 43) | get httpInterceptor(): boolean { return this.SatellizerConfig.httpInte...
method httpInterceptor (line 44) | set httpInterceptor(value) {
method facebook (line 52) | facebook(options: IOAuth2Options): void {
method google (line 56) | google(options: IOAuth2Options): void {
method github (line 60) | github(options: IOAuth2Options): void {
method instagram (line 64) | instagram(options: IOAuth2Options): void {
method linkedin (line 68) | linkedin(options: IOAuth2Options): void {
method twitter (line 72) | twitter(options: IOAuth1Options): void {
method twitch (line 76) | twitch(options: IOAuth2Options): void {
method live (line 80) | live(options: IOAuth2Options): void {
method yahoo (line 84) | yahoo(options: IOAuth2Options): void {
method bitbucket (line 88) | bitbucket(options: IOAuth2Options): void {
method spotify (line 92) | spotify(options: IOAuth2Options): void {
method oauth1 (line 96) | oauth1(options: IOAuth1Options): void {
method oauth2 (line 102) | oauth2(options: IOAuth2Options): void {
method $get (line 108) | $get(SatellizerShared, SatellizerLocal, SatellizerOAuth): any {
FILE: src/config.ts
class Config (line 1) | class Config {
method getConstant (line 2) | static get getConstant() {
FILE: src/httpProviderConfig.ts
class HttpProviderConfig (line 3) | class HttpProviderConfig {
method constructor (line 6) | constructor(private $httpProvider: angular.IHttpProvider) {
FILE: src/interceptor.ts
class Interceptor (line 5) | class Interceptor implements angular.IHttpInterceptor {
method Factory (line 9) | static Factory(SatellizerConfig: Config, SatellizerShared: Shared, Sat...
method constructor (line 13) | constructor(private SatellizerConfig: Config,
FILE: src/local.ts
class Local (line 5) | class Local {
method constructor (line 9) | constructor(private $http: angular.IHttpService,
method login (line 13) | login(user: string|Object, options: any = {}): angular.IHttpPromise<an...
method signup (line 25) | signup(user: string|Object, options: any = {}): angular.IHttpPromise<a...
FILE: src/oauth.ts
class OAuth (line 9) | class OAuth {
method constructor (line 23) | constructor(private $http: angular.IHttpService,
method authenticate (line 34) | authenticate(name: string, userData?: any): angular.IPromise<any> {
method unlink (line 62) | unlink(provider: string, httpOptions: any = {}): angular.IHttpPromise<...
FILE: src/oauth1.ts
type IOAuth1 (line 6) | interface IOAuth1 {
type IOAuth1Options (line 14) | interface IOAuth1Options {
class OAuth1 (line 28) | class OAuth1 implements IOAuth1 {
method constructor (line 33) | constructor(private $http: angular.IHttpService,
method init (line 53) | init(options: IOAuth1Options, userData: any): angular.IHttpPromise<any> {
method openPopup (line 70) | openPopup(options: IOAuth1Options, response: angular.IHttpPromiseCallb...
method getRequestToken (line 82) | getRequestToken(): angular.IHttpPromise<any> {
method exchangeForToken (line 87) | exchangeForToken(oauthData, userData): angular.IHttpPromise<any> {
method buildQueryString (line 93) | buildQueryString(obj): string {
FILE: src/oauth2.ts
type IOAuth2Options (line 6) | interface IOAuth2Options {
class OAuth2 (line 28) | class OAuth2 {
method camelCase (line 31) | static camelCase(name): string {
method constructor (line 39) | constructor(private $http: angular.IHttpService,
method init (line 70) | init(options: IOAuth2Options, userData: any): angular.IPromise<any> {
method exchangeForToken (line 102) | exchangeForToken(oauthData: { code?, state? }, userData: any): angular...
method buildQueryString (line 132) | buildQueryString(): string {
FILE: src/popup.ts
type IPopup (line 3) | interface IPopup {
class Popup (line 10) | class Popup implements IPopup {
method constructor (line 17) | constructor(private $interval: angular.IIntervalService,
method stringifyOptions (line 26) | stringifyOptions (options: any): string {
method open (line 34) | open(url: string,
method polling (line 72) | polling(redirectUri: string): angular.IPromise<any> {
method eventListener (line 117) | eventListener(redirectUri): angular.IPromise<any> {
FILE: src/shared.ts
class Shared (line 5) | class Shared {
method constructor (line 10) | constructor(private $q: angular.IQService,
method getToken (line 18) | getToken(): string {
method getPayload (line 22) | getPayload(): any {
method setToken (line 36) | setToken(response): void {
method removeToken (line 61) | removeToken(): void {
method isAuthenticated (line 65) | isAuthenticated(): boolean {
method logout (line 86) | logout(): angular.IPromise<void> {
method setStorageType (line 91) | setStorageType(type): void {
FILE: src/storage.ts
class Storage (line 3) | class Storage {
method constructor (line 9) | constructor(private $window: angular.IHttpService,
method get (line 14) | get(key: string): string {
method set (line 22) | set(key: string, value: string): void {
method remove (line 30) | remove(key: string): void {
FILE: src/utils.ts
function joinUrl (line 1) | function joinUrl (baseUrl, url) {
function getFullUrlPath (line 16) | function getFullUrlPath (location) {
function parseQueryString (line 23) | function parseQueryString (str) {
function decodeBase64 (line 37) | function decodeBase64 (str) {
FILE: typings/globals/angular-mocks/index.d.ts
type IAngularStatic (line 27) | interface IAngularStatic {
type IInjectStatic (line 32) | interface IInjectStatic {
type IMockStatic (line 38) | interface IMockStatic {
type IExceptionHandlerProvider (line 60) | interface IExceptionHandlerProvider extends IServiceProvider {
type ITimeoutService (line 69) | interface ITimeoutService {
type IIntervalService (line 80) | interface IIntervalService {
type ILogService (line 89) | interface ILogService {
type ILogCall (line 94) | interface ILogCall {
type IControllerService (line 103) | interface IControllerService {
type IComponentControllerService (line 114) | interface IComponentControllerService {
type IHttpBackendService (line 125) | interface IHttpBackendService {
type IRequestHandler (line 313) | interface IRequestHandler {
FILE: typings/globals/angular/index.d.ts
type Function (line 6) | interface Function {
type IServiceProviderClass (line 23) | interface IServiceProviderClass {
type IServiceProviderFactory (line 27) | interface IServiceProviderFactory {
type IServiceProvider (line 32) | interface IServiceProvider {
type IAngularBootstrapConfig (line 36) | interface IAngularBootstrapConfig {
type IAngularStatic (line 45) | interface IAngularStatic {
type IModule (line 174) | interface IModule {
type IAttributes (line 311) | interface IAttributes {
type IFormController (line 372) | interface IFormController {
type INgModelController (line 401) | interface INgModelController {
type INgModelOptions (line 441) | interface INgModelOptions {
type IModelValidators (line 449) | interface IModelValidators {
type IAsyncModelValidators (line 456) | interface IAsyncModelValidators {
type IModelParser (line 460) | interface IModelParser {
type IModelFormatter (line 464) | interface IModelFormatter {
type IModelViewChangeListener (line 468) | interface IModelViewChangeListener {
type IRootScopeService (line 476) | interface IRootScopeService {
type IScope (line 553) | interface IScope extends IRootScopeService { }
type IRepeatScope (line 559) | interface IRepeatScope extends IScope {
type IAngularEvent (line 593) | interface IAngularEvent {
type IWindowService (line 624) | interface IWindowService extends Window {
type ITimeoutService (line 632) | interface ITimeoutService {
type IIntervalService (line 642) | interface IIntervalService {
type IFilterService (line 654) | interface IFilterService {
type IFilterFilter (line 673) | interface IFilterFilter {
type IFilterFilterPatternObject (line 677) | interface IFilterFilterPatternObject {
type IFilterFilterPredicateFunc (line 681) | interface IFilterFilterPredicateFunc<T> {
type IFilterFilterComparatorFunc (line 685) | interface IFilterFilterComparatorFunc<T> {
type IFilterCurrency (line 689) | interface IFilterCurrency {
type IFilterNumber (line 700) | interface IFilterNumber {
type IFilterDate (line 710) | interface IFilterDate {
type IFilterJson (line 722) | interface IFilterJson {
type IFilterLowercase (line 732) | interface IFilterLowercase {
type IFilterUppercase (line 739) | interface IFilterUppercase {
type IFilterLimitTo (line 746) | interface IFilterLimitTo {
type IFilterOrderBy (line 765) | interface IFilterOrderBy {
type IFilterProvider (line 783) | interface IFilterProvider extends IServiceProvider {
type ILocaleService (line 796) | interface ILocaleService {
type ILocaleNumberFormatDescriptor (line 806) | interface ILocaleNumberFormatDescriptor {
type ILocaleNumberPatternDescriptor (line 813) | interface ILocaleNumberPatternDescriptor {
type ILocaleDateTimeFormatDescriptor (line 825) | interface ILocaleDateTimeFormatDescriptor {
type ILogService (line 846) | interface ILogService {
type ILogProvider (line 854) | interface ILogProvider extends IServiceProvider {
type ILogCall (line 861) | interface ILogCall {
type IParseService (line 870) | interface IParseService {
type IParseProvider (line 874) | interface IParseProvider {
type ICompiledExpression (line 900) | interface ICompiledExpression {
type ILocationService (line 916) | interface ILocationService {
type ILocationProvider (line 967) | interface ILocationProvider extends IServiceProvider {
type IDocumentService (line 983) | interface IDocumentService extends JQuery {}
type IExceptionHandlerService (line 989) | interface IExceptionHandlerService {
type IRootElementService (line 997) | interface IRootElementService extends JQuery {}
type IQResolveReject (line 999) | interface IQResolveReject<T> {
type IQService (line 1008) | interface IQService {
type IPromise (line 1074) | interface IPromise<T> {
type IDeferred (line 1095) | interface IDeferred<T> {
type IAnchorScrollService (line 1106) | interface IAnchorScrollService {
type IAnchorScrollProvider (line 1112) | interface IAnchorScrollProvider extends IServiceProvider {
type ICacheFactoryService (line 1123) | interface ICacheFactoryService {
type ICacheObject (line 1155) | interface ICacheObject {
type ICompileService (line 1213) | interface ICompileService {
type ICompileProvider (line 1219) | interface ICompileProvider extends IServiceProvider {
type ICloneAttachFunction (line 1239) | interface ICloneAttachFunction {
type ITemplateLinkingFunction (line 1245) | interface ITemplateLinkingFunction {
type ITranscludeFunction (line 1250) | interface ITranscludeFunction {
type IControllerService (line 1262) | interface IControllerService {
type IControllerProvider (line 1269) | interface IControllerProvider extends IServiceProvider {
type IXhrFactory (line 1280) | interface IXhrFactory<T> {
type IHttpService (line 1288) | interface IHttpService {
type IRequestShortcutConfig (line 1368) | interface IRequestShortcutConfig extends IHttpProviderDefaults {
type IRequestConfig (line 1396) | interface IRequestConfig extends IRequestShortcutConfig {
type IHttpHeadersGetter (line 1407) | interface IHttpHeadersGetter {
type IHttpPromiseCallback (line 1412) | interface IHttpPromiseCallback<T> {
type IHttpPromiseCallbackArg (line 1416) | interface IHttpPromiseCallbackArg<T> {
type IHttpPromise (line 1424) | interface IHttpPromise<T> extends IPromise<IHttpPromiseCallbackArg<T>> {
type IHttpRequestTransformer (line 1440) | interface IHttpRequestTransformer {
type IHttpResponseTransformer (line 1445) | interface IHttpResponseTransformer {
type HttpHeaderType (line 1449) | type HttpHeaderType = {[requestType: string]:string|((config:IRequestCon...
type IHttpRequestConfigHeaders (line 1451) | interface IHttpRequestConfigHeaders {
type IHttpProviderDefaults (line 1467) | interface IHttpProviderDefaults {
type IHttpInterceptor (line 1514) | interface IHttpInterceptor {
type IHttpInterceptorFactory (line 1521) | interface IHttpInterceptorFactory {
type IHttpProvider (line 1525) | interface IHttpProvider extends IServiceProvider {
type IHttpBackendService (line 1550) | interface IHttpBackendService {
type IInterpolateService (line 1560) | interface IInterpolateService {
type IInterpolationFunction (line 1566) | interface IInterpolationFunction {
type IInterpolateProvider (line 1570) | interface IInterpolateProvider extends IServiceProvider {
type ITemplateCacheService (line 1581) | interface ITemplateCacheService extends ICacheObject {}
type ISCEService (line 1587) | interface ISCEService {
type ISCEProvider (line 1612) | interface ISCEProvider extends IServiceProvider {
type ISCEDelegateService (line 1620) | interface ISCEDelegateService {
type ISCEDelegateProvider (line 1631) | interface ISCEDelegateProvider extends IServiceProvider {
type ITemplateRequestService (line 1642) | interface ITemplateRequestService {
type IComponentOptions (line 1674) | interface IComponentOptions {
type IComponentTemplateFn (line 1716) | interface IComponentTemplateFn {
type IComponentController (line 1725) | interface IComponentController {
type IChangesObject (line 1755) | interface IChangesObject {
type IDirectiveFactory (line 1767) | interface IDirectiveFactory {
type IDirectiveLinkFn (line 1771) | interface IDirectiveLinkFn {
type IDirectivePrePost (line 1781) | interface IDirectivePrePost {
type IDirectiveCompileFn (line 1786) | interface IDirectiveCompileFn {
type IDirective (line 1800) | interface IDirective {
type IAugmentedJQueryStatic (line 1836) | interface IAugmentedJQueryStatic extends JQueryStatic {}
type IAugmentedJQuery (line 1837) | interface IAugmentedJQuery extends JQuery {}
type IInjectorService (line 1848) | interface IInjectorService {
type IProvideService (line 1890) | interface IProvideService {
type IHttpParamSerializer (line 1935) | interface IHttpParamSerializer {
type JQuery (line 1940) | interface JQuery {
FILE: typings/globals/es6-shim/index.d.ts
type PropertyKey (line 3) | type PropertyKey = string | number | symbol;
type IteratorResult (line 5) | interface IteratorResult<T> {
type IterableShim (line 10) | interface IterableShim<T> {
type Iterator (line 17) | interface Iterator<T> {
type IterableIteratorShim (line 23) | interface IterableIteratorShim<T> extends IterableShim<T>, Iterator<T> {
type StringConstructor (line 30) | interface StringConstructor {
type String (line 47) | interface String {
type ArrayConstructor (line 138) | interface ArrayConstructor {
type Array (line 174) | interface Array<T> {
type NumberConstructor (line 239) | interface NumberConstructor {
type ObjectConstructor (line 305) | interface ObjectConstructor {
type RegExp (line 330) | interface RegExp {
type Math (line 346) | interface Math {
type PromiseLike (line 458) | interface PromiseLike<T> {
type Promise (line 472) | interface Promise<T> {
type PromiseConstructor (line 491) | interface PromiseConstructor {
type Map (line 551) | interface Map<K, V> {
type MapConstructor (line 564) | interface MapConstructor {
type Set (line 572) | interface Set<T> {
type SetConstructor (line 585) | interface SetConstructor {
type WeakMap (line 593) | interface WeakMap<K, V> {
type WeakMapConstructor (line 600) | interface WeakMapConstructor {
type WeakSet (line 608) | interface WeakSet<T> {
type WeakSetConstructor (line 614) | interface WeakSetConstructor {
FILE: typings/globals/jasmine/index.d.ts
type DoneFn (line 32) | interface DoneFn extends Function {
type Any (line 63) | interface Any {
type ArrayLike (line 72) | interface ArrayLike<T> {
type ArrayContaining (line 77) | interface ArrayContaining {
type ObjectContaining (line 84) | interface ObjectContaining {
type Block (line 91) | interface Block {
type WaitsBlock (line 98) | interface WaitsBlock extends Block {
type WaitsForBlock (line 102) | interface WaitsForBlock extends Block {
type Clock (line 106) | interface Clock {
type CustomEqualityTester (line 114) | interface CustomEqualityTester {
type CustomMatcher (line 118) | interface CustomMatcher {
type CustomMatcherFactory (line 123) | interface CustomMatcherFactory {
type CustomMatcherFactories (line 127) | interface CustomMatcherFactories {
type CustomMatcherResult (line 131) | interface CustomMatcherResult {
type MatchersUtil (line 136) | interface MatchersUtil {
type Env (line 142) | interface Env {
type FakeTimer (line 179) | interface FakeTimer {
type HtmlReporter (line 189) | interface HtmlReporter {
type HtmlSpecFilter (line 193) | interface HtmlSpecFilter {
type Result (line 197) | interface Result {
type NestedResults (line 201) | interface NestedResults extends Result {
type MessageResult (line 217) | interface MessageResult extends Result {
type ExpectationResult (line 222) | interface ExpectationResult extends Result {
type Trace (line 231) | interface Trace {
type PrettyPrinter (line 237) | interface PrettyPrinter {
type StringPrettyPrinter (line 250) | interface StringPrettyPrinter extends PrettyPrinter {
type Queue (line 253) | interface Queue {
type Matchers (line 274) | interface Matchers {
type Reporter (line 308) | interface Reporter {
type MultiReporter (line 317) | interface MultiReporter extends Reporter {
type Runner (line 321) | interface Runner {
type SpecFunction (line 339) | interface SpecFunction {
type SuiteOrSpec (line 343) | interface SuiteOrSpec {
type Spec (line 350) | interface Spec extends SuiteOrSpec {
type XSpec (line 384) | interface XSpec {
type Suite (line 389) | interface Suite extends SuiteOrSpec {
type XSuite (line 409) | interface XSuite {
type Spy (line 413) | interface Spy {
type SpyAnd (line 424) | interface SpyAnd {
type Calls (line 439) | interface Calls {
type CallInfo (line 458) | interface CallInfo {
type Util (line 467) | interface Util {
type JsApiReporter (line 475) | interface JsApiReporter extends Reporter {
type Jasmine (line 493) | interface Jasmine {
FILE: typings/globals/jquery/index.d.ts
type JQueryAjaxSettings (line 3) | interface JQueryAjaxSettings {
type JQueryXHR (line 147) | interface JQueryXHR extends XMLHttpRequest, JQueryPromise<any> {
type JQueryCallback (line 175) | interface JQueryCallback {
type JQueryGenericPromise (line 258) | interface JQueryGenericPromise<T> {
type JQueryPromiseCallback (line 279) | interface JQueryPromiseCallback<T> {
type JQueryPromiseOperator (line 283) | interface JQueryPromiseOperator<T, U> {
type JQueryPromise (line 290) | interface JQueryPromise<T> extends JQueryGenericPromise<T> {
type JQueryDeferred (line 330) | interface JQueryDeferred<T> extends JQueryGenericPromise<T> {
type BaseJQueryEventObject (line 422) | interface BaseJQueryEventObject extends Event {
type JQueryInputEventObject (line 442) | interface JQueryInputEventObject extends BaseJQueryEventObject {
type JQueryMouseEventObject (line 449) | interface JQueryMouseEventObject extends JQueryInputEventObject {
type JQueryKeyEventObject (line 461) | interface JQueryKeyEventObject extends JQueryInputEventObject {
type JQueryEventObject (line 468) | interface JQueryEventObject extends BaseJQueryEventObject, JQueryInputEv...
type JQuerySupport (line 475) | interface JQuerySupport {
type JQueryParam (line 497) | interface JQueryParam {
type JQueryEventConstructor (line 520) | interface JQueryEventConstructor {
type JQueryCoordinates (line 528) | interface JQueryCoordinates {
type JQuerySerializeArrayElement (line 536) | interface JQuerySerializeArrayElement {
type JQueryAnimationOptions (line 541) | interface JQueryAnimationOptions {
type JQueryEasingFunction (line 588) | interface JQueryEasingFunction {
type JQueryEasingFunctions (line 592) | interface JQueryEasingFunctions {
type JQueryStatic (line 601) | interface JQueryStatic {
type JQuery (line 1156) | interface JQuery {
FILE: typings/globals/node/index.d.ts
type Error (line 3) | interface Error {
type ErrorConstructor (line 7) | interface ErrorConstructor {
type MapConstructor (line 15) | interface MapConstructor {}
type WeakMapConstructor (line 16) | interface WeakMapConstructor {}
type SetConstructor (line 17) | interface SetConstructor {}
type WeakSetConstructor (line 18) | interface WeakSetConstructor {}
type NodeRequireFunction (line 38) | interface NodeRequireFunction {
type NodeRequire (line 42) | interface NodeRequire extends NodeRequireFunction {
type NodeModule (line 51) | interface NodeModule {
type BufferEncoding (line 78) | type BufferEncoding = "ascii" | "utf8" | "utf16le" | "ucs2" | "binary" |...
type Buffer (line 79) | interface Buffer extends NodeBuffer {}
type ErrnoException (line 226) | interface ErrnoException extends Error {
type EventEmitter (line 234) | interface EventEmitter {
type Rea
Condensed preview — 342 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,927K chars).
[
{
"path": ".gitignore",
"chars": 361,
"preview": "# Runtime data\npids\n*.pid\n*.seed\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage "
},
{
"path": ".npmignore",
"chars": 94,
"preview": ".idea\nbuild\nexamples\nnode_modules\ntest\n.travis.yml\nkarma.conf.js\nrollup.config.js\ntslint.json\n"
},
{
"path": ".publishrc",
"chars": 276,
"preview": "{\n \"validations\": {\n \"vulnerableDependencies\": true,\n \"uncommittedChanges\": true,\n \"untrackedFiles\": true,\n "
},
{
"path": ".travis.yml",
"chars": 38,
"preview": "language: node_js\n\nnode_js:\n - \"6.1\"\n"
},
{
"path": "LICENSE",
"chars": 1081,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2016 Sahat Yalkabov\n\nPermission is hereby granted, free of charge, to any person ob"
},
{
"path": "README.md",
"chars": 47219,
"preview": "\n\n# [Satellizer](https://github.com/sahat/satellizer/)\n\n[ 2016 Sahat Yalkabov \n * License: MIT \n */\n\n(function (global, factory) {\n typeof expo"
},
{
"path": "examples/client/app.js",
"chars": 2926,
"preview": "angular.module('MyApp', ['ngResource', 'ngMessages', 'ngAnimate', 'toastr', 'ui.router', 'satellizer'])\n .config(functi"
},
{
"path": "examples/client/controllers/home.js",
"chars": 544,
"preview": "angular.module('MyApp')\n .controller('HomeCtrl', function($scope, $http) {\n $http.jsonp('https://api.github.com/repo"
},
{
"path": "examples/client/controllers/login.js",
"chars": 1019,
"preview": "angular.module('MyApp')\n .controller('LoginCtrl', function($scope, $location, $auth, toastr) {\n $scope.login = funct"
},
{
"path": "examples/client/controllers/logout.js",
"chars": 272,
"preview": "angular.module('MyApp')\n .controller('LogoutCtrl', function($location, $auth, toastr) {\n if (!$auth.isAuthenticated("
},
{
"path": "examples/client/controllers/navbar.js",
"chars": 171,
"preview": "angular.module('MyApp')\n .controller('NavbarCtrl', function($scope, $auth) {\n $scope.isAuthenticated = function() {\n"
},
{
"path": "examples/client/controllers/profile.js",
"chars": 1418,
"preview": "angular.module('MyApp')\n .controller('ProfileCtrl', function($scope, $auth, toastr, Account) {\n $scope.getProfile = "
},
{
"path": "examples/client/controllers/signup.js",
"chars": 476,
"preview": "angular.module('MyApp')\n .controller('SignupCtrl', function($scope, $location, $auth, toastr) {\n $scope.signup = fun"
},
{
"path": "examples/client/directives/passwordMatch.js",
"chars": 479,
"preview": "angular.module('MyApp')\n .directive('passwordMatch', function() {\n return {\n require: 'ngModel',\n scope: {"
},
{
"path": "examples/client/directives/passwordStrength.js",
"chars": 5207,
"preview": "angular.module('MyApp')\n .directive('passwordStrength', function() {\n return {\n restrict: 'A',\n require: '"
},
{
"path": "examples/client/index.html",
"chars": 2441,
"preview": "<!DOCTYPE html>\n<html ng-app=\"MyApp\">\n<head>\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=e"
},
{
"path": "examples/client/partials/home.html",
"chars": 1661,
"preview": "<div class=\"container\">\n <div class=\"panel panel-default\">\n <div class=\"panel-heading\">Home Page</div>\n <div clas"
},
{
"path": "examples/client/partials/login.html",
"chars": 3263,
"preview": "<div class=\"container\">\n <div class=\"row\">\n <div class=\"center-form panel\">\n <div class=\"panel-body\">\n <"
},
{
"path": "examples/client/partials/profile.html",
"chars": 5655,
"preview": "<div class=\"container\">\n <div class=\"panel panel-default\">\n <div class=\"panel-heading\">Profile</div>\n <div class="
},
{
"path": "examples/client/partials/signup.html",
"chars": 3157,
"preview": "<div class=\"container\">\n <div class=\"row\">\n <div class=\"center-form panel\">\n <div class=\"panel-body\">\n <"
},
{
"path": "examples/client/services/account.js",
"chars": 269,
"preview": "angular.module('MyApp')\n .factory('Account', function($http) {\n return {\n getProfile: function() {\n retu"
},
{
"path": "examples/client/stylesheets/angular-toastr.css",
"chars": 6689,
"preview": ".toast-title {\n font-weight: bold;\n}\n.toast-message {\n word-wrap: break-word;\n}\n.toast-message a,\n.toast-message label"
},
{
"path": "examples/client/stylesheets/styles.css",
"chars": 6727,
"preview": "body {\n font-family: 'Open Sans', sans-serif;\n background: #e4e7ec;\n}\n\nh1, h2, h3, h4, h5, h6 {\n font-family: 'Montse"
},
{
"path": "examples/client/vendor/angular-animate.js",
"chars": 141215,
"preview": "/**\n * @license AngularJS v1.4.7\n * (c) 2010-2015 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
},
{
"path": "examples/client/vendor/angular-messages.js",
"chars": 25732,
"preview": "/**\n * @license AngularJS v1.4.7\n * (c) 2010-2015 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
},
{
"path": "examples/client/vendor/angular-mocks.js",
"chars": 82751,
"preview": "/**\n * @license AngularJS v1.4.7\n * (c) 2010-2015 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
},
{
"path": "examples/client/vendor/angular-resource.js",
"chars": 27143,
"preview": "/**\n * @license AngularJS v1.4.7\n * (c) 2010-2015 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
},
{
"path": "examples/client/vendor/angular-sanitize.js",
"chars": 24546,
"preview": "/**\n * @license AngularJS v1.4.7\n * (c) 2010-2015 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
},
{
"path": "examples/client/vendor/angular-toastr.js",
"chars": 12710,
"preview": "(function() {\n 'use strict';\n\n angular.module('toastr', [])\n .factory('toastr', toastr);\n\n toastr.$inject = ['$ani"
},
{
"path": "examples/client/vendor/angular-toastr.tpls.js",
"chars": 13481,
"preview": "(function() {\n 'use strict';\n\n angular.module('toastr', [])\n .factory('toastr', toastr);\n\n toastr.$inject = ['$ani"
},
{
"path": "examples/client/vendor/angular-ui-router.js",
"chars": 162905,
"preview": "/**\n * State-based routing for AngularJS\n * @version v0.2.15\n * @link http://angular-ui.github.com/\n * @license MIT Lice"
},
{
"path": "examples/client/vendor/angular.js",
"chars": 1047870,
"preview": "/**\n * @license AngularJS v1.4.4\n * (c) 2010-2015 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
},
{
"path": "examples/client/vendor/satellizer.js",
"chars": 44173,
"preview": "/**\n * Satellizer 0.15.5\n * (c) 2016 Sahat Yalkabov \n * License: MIT \n */\n\n(function (global, factory) {\n typeof expo"
},
{
"path": "examples/ionic/.bowerrc",
"chars": 29,
"preview": "{\n \"directory\": \"www/lib\"\n}\n"
},
{
"path": "examples/ionic/.gitignore",
"chars": 138,
"preview": "# Specifies intentionally untracked files to ignore when using Git\n# http://git-scm.com/docs/gitignore\n\nnode_modules/\npl"
},
{
"path": "examples/ionic/README.md",
"chars": 999,
"preview": "<img src=\"http://ionicframework.com/img/ionic-logo-blue.svg\">\n\nIonic is the beautiful, open source front-end SDK for dev"
},
{
"path": "examples/ionic/bower.json",
"chars": 119,
"preview": "{\n \"name\": \"satellizer-ionic-example\",\n \"devDependencies\": {\n \"ionic\": \"^1.3.1\",\n \"satellizer\": \"latest\"\n }\n}\n"
},
{
"path": "examples/ionic/config.xml",
"chars": 5069,
"preview": "<?xml version='1.0' encoding='utf-8'?>\n<widget id=\"com.ionicframework.sidemenu268668\" version=\"0.0.1\" xmlns=\"http://www."
},
{
"path": "examples/ionic/gulpfile.js",
"chars": 1353,
"preview": "var gulp = require('gulp');\nvar gutil = require('gulp-util');\nvar bower = require('bower');\nvar concat = require('gulp-c"
},
{
"path": "examples/ionic/hooks/README.md",
"chars": 3018,
"preview": "<!--\n#\n# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the N"
},
{
"path": "examples/ionic/hooks/after_platform_add/010_install_plugins.js",
"chars": 802,
"preview": "#!/usr/bin/env node\n\n// This hook installs all cordova plugins.\n\n// Add plugins to this list - either the identifier or "
},
{
"path": "examples/ionic/hooks/after_prepare/010_add_platform_class.js",
"chars": 2735,
"preview": "#!/usr/bin/env node\n\n// Add Platform Class\n// v1.0\n// Automatically adds the platform class to the body tag\n// after the"
},
{
"path": "examples/ionic/ionic.project",
"chars": 48,
"preview": "{\n \"name\": \"satellizer-ionic\",\n \"app_id\": \"\"\n}"
},
{
"path": "examples/ionic/package.json",
"chars": 567,
"preview": "{\n \"name\": \"satellizer-ionic-example\",\n \"version\": \"1.0.0\",\n \"dependencies\": {\n \"gulp\": \"^3.9.1\",\n \"gulp-sass\":"
},
{
"path": "examples/ionic/scss/ionic.app.scss",
"chars": 832,
"preview": "/*\nTo customize the look and feel of Ionic, you can override the variables\nin ionic's _variables.scss file.\n\nFor example"
},
{
"path": "examples/ionic/www/css/style.css",
"chars": 42,
"preview": "/* Empty. Add your own CSS if you like */\n"
},
{
"path": "examples/ionic/www/index.html",
"chars": 945,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"initial-scale=1, maximum-s"
},
{
"path": "examples/ionic/www/js/app.js",
"chars": 1612,
"preview": "angular.module('starter', ['ionic', 'satellizer', 'starter.controllers'])\n .config(function ($stateProvider, $urlRouter"
},
{
"path": "examples/ionic/www/js/controllers.js",
"chars": 792,
"preview": "angular.module('starter.controllers', [])\n .controller('AppCtrl', function($scope, $ionicModal, $timeout) {\n })\n .con"
},
{
"path": "examples/ionic/www/lib/ionic/css/ionic.css",
"chars": 221566,
"preview": "/*!\n * Copyright 2014 Drifty Co.\n * http://drifty.com/\n *\n * Ionic, v1.0.0\n * A powerful HTML5 mobile app framework.\n * "
},
{
"path": "examples/ionic/www/lib/ionic/js/angular/angular-animate.js",
"chars": 104238,
"preview": "/**\n * @license AngularJS v1.3.13\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(windo"
},
{
"path": "examples/ionic/www/lib/ionic/js/angular/angular-resource.js",
"chars": 26734,
"preview": "/**\n * @license AngularJS v1.3.13\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(windo"
},
{
"path": "examples/ionic/www/lib/ionic/js/angular/angular-sanitize.js",
"chars": 24095,
"preview": "/**\n * @license AngularJS v1.3.13\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(windo"
},
{
"path": "examples/ionic/www/lib/ionic/js/angular/angular.js",
"chars": 952424,
"preview": "/**\n * @license AngularJS v1.3.13\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(windo"
},
{
"path": "examples/ionic/www/lib/ionic/js/angular-ui/angular-ui-router.js",
"chars": 156740,
"preview": "/**\n * State-based routing for AngularJS\n * @version v0.2.13\n * @link http://angular-ui.github.com/\n * @license MIT Lice"
},
{
"path": "examples/ionic/www/lib/ionic/js/ionic-angular.js",
"chars": 426700,
"preview": "/*!\n * Copyright 2014 Drifty Co.\n * http://drifty.com/\n *\n * Ionic, v1.0.0\n * A powerful HTML5 mobile app framework.\n * "
},
{
"path": "examples/ionic/www/lib/ionic/js/ionic.bundle.js",
"chars": 1940021,
"preview": "/*!\n * ionic.bundle.js is a concatenation of:\n * ionic.js, angular.js, angular-animate.js,\n * angular-sanitize.js, angul"
},
{
"path": "examples/ionic/www/lib/ionic/js/ionic.js",
"chars": 274823,
"preview": "/*!\n * Copyright 2014 Drifty Co.\n * http://drifty.com/\n *\n * Ionic, v1.0.0\n * A powerful HTML5 mobile app framework.\n * "
},
{
"path": "examples/ionic/www/lib/ionic/scss/_action-sheet.scss",
"chars": 2815,
"preview": "/**\n * Action Sheets\n * --------------------------------------------------\n */\n\n.action-sheet-backdrop {\n @include tran"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_animations.scss",
"chars": 1153,
"preview": "\n// Slide up from the bottom, used for modals\n// -------------------------------\n\n.slide-in-up {\n @include translate3d("
},
{
"path": "examples/ionic/www/lib/ionic/scss/_backdrop.scss",
"chars": 354,
"preview": "\n.backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $z-index-backdrop;\n\n width: 100%;\n height: 100%;\n\n ba"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_badge.scss",
"chars": 1507,
"preview": "\n/**\n * Badges\n * --------------------------------------------------\n */\n\n.badge {\n @include badge-style($badge-default"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_bar.scss",
"chars": 9707,
"preview": "\n/**\n * Bar (Headers and Footers)\n * --------------------------------------------------\n */\n\n.bar {\n @include display-f"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_button-bar.scss",
"chars": 859,
"preview": "\n/**\n * Button Bar\n * --------------------------------------------------\n */\n\n.button-bar {\n @include display-flex();\n "
},
{
"path": "examples/ionic/www/lib/ionic/scss/_button.scss",
"chars": 6430,
"preview": "\n/**\n * Buttons\n * --------------------------------------------------\n */\n\n.button {\n // set the color defaults\n @incl"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_checkbox.scss",
"chars": 4626,
"preview": "\n/**\n * Checkbox\n * --------------------------------------------------\n */\n\n.checkbox {\n // set the color defaults\n @i"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_form.scss",
"chars": 6075,
"preview": "/**\n * Forms\n * --------------------------------------------------\n */\n\n// Make all forms have space below them\nform {\n "
},
{
"path": "examples/ionic/www/lib/ionic/scss/_grid.scss",
"chars": 2906,
"preview": "/**\n * Grid\n * --------------------------------------------------\n * Using flexbox for the grid, inspired by Philip Walt"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_items.scss",
"chars": 19263,
"preview": "/**\n * Items\n * --------------------------------------------------\n */\n\n.item {\n @include item-style($item-default-bg, "
},
{
"path": "examples/ionic/www/lib/ionic/scss/_list.scss",
"chars": 2383,
"preview": "\n/**\n * Lists\n * --------------------------------------------------\n */\n\n.list {\n position: relative;\n padding-top: $i"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_loading.scss",
"chars": 825,
"preview": "\n/**\n * Loading\n * --------------------------------------------------\n */\n\n.loading-container {\n position: absolute;\n "
},
{
"path": "examples/ionic/www/lib/ionic/scss/_menu.scss",
"chars": 1000,
"preview": "\n/**\n * Menus\n * --------------------------------------------------\n * Side panel structure\n */\n\n.menu {\n position: abs"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_mixins.scss",
"chars": 15543,
"preview": "\n// Button Mixins\n// --------------------------------------------------\n\n@mixin button-style($bg-color, $border-color, $"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_modal.scss",
"chars": 2129,
"preview": "\n/**\n * Modals\n * --------------------------------------------------\n * Modals are independent windows that slide in fro"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_platform.scss",
"chars": 1575,
"preview": "\n/**\n * Platform\n * --------------------------------------------------\n * Platform specific tweaks\n */\n\n.platform-ios.pl"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_popover.scss",
"chars": 2998,
"preview": "\n/**\n * Popovers\n * --------------------------------------------------\n * Popovers are independent views which float ove"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_popup.scss",
"chars": 2014,
"preview": "\n/**\n * Popups\n * --------------------------------------------------\n */\n\n.popup-container {\n position: absolute;\n top"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_progress.scss",
"chars": 161,
"preview": "\n/**\n * Progress\n * --------------------------------------------------\n */\n\nprogress {\n display: block;\n margin: $prog"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_radio.scss",
"chars": 1201,
"preview": "\n/**\n * Radio Button Inputs\n * --------------------------------------------------\n */\n\n.item-radio {\n padding: 0;\n\n &:"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_range.scss",
"chars": 3618,
"preview": "\n/**\n * Range\n * --------------------------------------------------\n */\n\n .range input{\n display: inline-block;\n overf"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_refresher.scss",
"chars": 2571,
"preview": "\n// Scroll refresher (for pull to refresh)\n.scroll-refresher {\n position: absolute;\n top: -60px;\n right: 0;\n left: 0"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_reset.scss",
"chars": 6919,
"preview": "\n/**\n * Resets\n * --------------------------------------------------\n * Adapted from normalize.css and some reset.css. W"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_scaffolding.scss",
"chars": 5237,
"preview": "\n/**\n * Scaffolding\n * --------------------------------------------------\n */\n\n*,\n*:before,\n*:after {\n @include box-siz"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_select.scss",
"chars": 2612,
"preview": "\n/**\n * Select\n * --------------------------------------------------\n */\n\n.item-select {\n position: relative;\n\n select"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_slide-box.scss",
"chars": 828,
"preview": "\n/**\n * Slide Box\n * --------------------------------------------------\n */\n\n.slider {\n position: relative;\n visibilit"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_spinner.scss",
"chars": 1978,
"preview": "/**\n * Spinners\n * --------------------------------------------------\n */\n\n.spinner {\n svg {\n width: $spinner-width;"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_tabs.scss",
"chars": 13205,
"preview": "/**\n * Tabs\n * --------------------------------------------------\n * A navigation bar with any number of tab items suppo"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_toggle.scss",
"chars": 5100,
"preview": "\n/**\n * Toggle\n * --------------------------------------------------\n */\n\n.item-toggle {\n pointer-events: none;\n}\n\n.tog"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_transitions.scss",
"chars": 3878,
"preview": "\n// iOS View Transitions\n// -------------------------------\n\n$ios-transition-duration: 500ms !default;\n$ios"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_type.scss",
"chars": 2845,
"preview": "\n/**\n * Typography\n * --------------------------------------------------\n */\n\n\n// Body text\n// -------------------------"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_util.scss",
"chars": 5037,
"preview": "\n/**\n * Utility Classes\n * --------------------------------------------------\n */\n\n.hide {\n display: none;\n}\n.opacity-h"
},
{
"path": "examples/ionic/www/lib/ionic/scss/_variables.scss",
"chars": 31771,
"preview": "\n// Colors\n// -------------------------------\n\n$light: #fff !default;\n$stable: "
},
{
"path": "examples/ionic/www/lib/ionic/scss/ionic.scss",
"chars": 595,
"preview": "@charset \"UTF-8\";\n\n@import\n // Ionicons\n \"ionicons/ionicons.scss\",\n\n // Variables\n \"mixins\",\n \"variables\",\n\n // Ba"
},
{
"path": "examples/ionic/www/lib/ionic/scss/ionicons/_ionicons-font.scss",
"chars": 967,
"preview": "// Ionicons Font Path\n// --------------------------\n\n@font-face {\n font-family: $ionicons-font-family;\n src:url(\"#{$ioni"
},
{
"path": "examples/ionic/www/lib/ionic/scss/ionicons/_ionicons-icons.scss",
"chars": 91501,
"preview": "// Ionicons Icons\n// --------------------------\n\n.ionicons,\n.#{$ionicons-prefix}alert:before,\n.#{$ionicons-prefix}alert-"
},
{
"path": "examples/ionic/www/lib/ionic/scss/ionicons/_ionicons-variables.scss",
"chars": 27507,
"preview": "// Ionicons Variables\n// --------------------------\n\n$ionicons-font-path: \"../fonts\" !default;\n$ionicons-font-family: \"I"
},
{
"path": "examples/ionic/www/lib/ionic/scss/ionicons/ionicons.scss",
"chars": 559,
"preview": "@charset \"UTF-8\";\n@import \"ionicons-variables\";\n/*!\n Ionicons, v2.0.1\n Created by Ben Sperry for the Ionic Framework, "
},
{
"path": "examples/ionic/www/lib/ionic/version.json",
"chars": 104,
"preview": "{\n \"version\": \"1.0.0\",\n \"codename\": \"uranium-unicorn\",\n \"date\": \"2015-05-12\",\n \"time\": \"17:23:22\"\n}\n"
},
{
"path": "examples/ionic/www/lib/satellizer/dist/satellizer.js",
"chars": 44173,
"preview": "/**\n * Satellizer 0.15.5\n * (c) 2016 Sahat Yalkabov \n * License: MIT \n */\n\n(function (global, factory) {\n typeof expo"
},
{
"path": "examples/ionic/www/lib/satellizer/satellizer.js",
"chars": 32627,
"preview": "/**\n * Satellizer 0.14.1\n * (c) 2016 Sahat Yalkabov\n * License: MIT\n */\n\n// CommonJS package manager support.\nif (typeof"
},
{
"path": "examples/ionic/www/templates/home.html",
"chars": 1654,
"preview": "<ion-view title=\"Satellizer Ionic\">\n <ion-content class=\"padding\">\n <div ng-if=\"!isAuthenticated()\">\n <button n"
},
{
"path": "examples/ionic/www/templates/menu.html",
"chars": 260,
"preview": "<ion-nav-bar class=\"bar-positive nav-title-slide-ios7\">\n <ion-nav-back-button class=\"button-clear\"><i class=\"icon ion-i"
},
{
"path": "examples/server/java/README.md",
"chars": 2287,
"preview": "# Introduction\n\nThe drop wizard example application was developed to, as its name implies, provide examples of some of t"
},
{
"path": "examples/server/java/example.yml",
"chars": 805,
"preview": "# Database settings.\ndatabase:\n # the name of your JDBC driver\n driverClass: org.h2.Driver\n\n # the username\n user: s"
},
{
"path": "examples/server/java/pom.xml",
"chars": 6295,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
},
{
"path": "examples/server/java/src/main/java/com/example/helloworld/HelloWorldApplication.java",
"chars": 3235,
"preview": "package com.example.helloworld;\n\nimport io.dropwizard.Application;\nimport io.dropwizard.assets.AssetsBundle;\nimport io.d"
},
{
"path": "examples/server/java/src/main/java/com/example/helloworld/HelloWorldConfiguration.java",
"chars": 1824,
"preview": "package com.example.helloworld;\n\nimport io.dropwizard.Configuration;\nimport io.dropwizard.client.JerseyClientConfigurati"
},
{
"path": "examples/server/java/src/main/java/com/example/helloworld/auth/AuthFilter.java",
"chars": 2188,
"preview": "package com.example.helloworld.auth;\n\nimport java.io.IOException;\nimport java.text.ParseException;\n\nimport javax.servlet"
},
{
"path": "examples/server/java/src/main/java/com/example/helloworld/auth/AuthUtils.java",
"chars": 1818,
"preview": "package com.example.helloworld.auth;\n\nimport java.text.ParseException;\n\nimport com.nimbusds.jose.crypto.MACVerifier;\nimp"
},
{
"path": "examples/server/java/src/main/java/com/example/helloworld/auth/PasswordService.java",
"chars": 346,
"preview": "package com.example.helloworld.auth;\n\nimport org.mindrot.jbcrypt.BCrypt;\n\npublic final class PasswordService {\n\tpublic s"
},
{
"path": "examples/server/java/src/main/java/com/example/helloworld/core/Token.java",
"chars": 257,
"preview": "package com.example.helloworld.core;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\n\npublic class Token {\n\tStrin"
},
{
"path": "examples/server/java/src/main/java/com/example/helloworld/core/User.java",
"chars": 4193,
"preview": "package com.example.helloworld.core;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.per"
},
{
"path": "examples/server/java/src/main/java/com/example/helloworld/db/UserDAO.java",
"chars": 1207,
"preview": "package com.example.helloworld.db;\n\nimport java.util.List;\n\nimport io.dropwizard.hibernate.AbstractDAO;\n\nimport org.hibe"
},
{
"path": "examples/server/java/src/main/java/com/example/helloworld/resources/AuthResource.java",
"chars": 11057,
"preview": "package com.example.helloworld.resources;\n\nimport io.dropwizard.hibernate.UnitOfWork;\nimport io.dropwizard.jersey.errors"
},
{
"path": "examples/server/java/src/main/java/com/example/helloworld/resources/ClientResource.java",
"chars": 599,
"preview": "package com.example.helloworld.resources;\n\nimport java.io.IOException;\nimport java.net.URL;\n\nimport javax.ws.rs.GET;\nimp"
},
{
"path": "examples/server/java/src/main/java/com/example/helloworld/resources/UserResource.java",
"chars": 2240,
"preview": "package com.example.helloworld.resources;\n\nimport com.nimbusds.jose.JOSEException;\nimport io.dropwizard.hibernate.UnitOf"
},
{
"path": "examples/server/java/src/main/resources/banner.txt",
"chars": 446,
"preview": " web-scale hello world dP for the web\n 88\n .d"
},
{
"path": "examples/server/java/src/main/resources/migrations.xml",
"chars": 1065,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<databaseChangeLog xmlns=\"http://www.liquibase.org/xml/ns/dbchangelog\"\n\txmlns:xs"
},
{
"path": "examples/server/node/config.js",
"chars": 1258,
"preview": "module.exports = {\n // App Settings\n MONGO_URI: process.env.MONGO_URI || 'localhost',\n TOKEN_SECRET: process.env.TOKE"
},
{
"path": "examples/server/node/package.json",
"chars": 383,
"preview": "{\n \"name\": \"satellizer-server\",\n \"version\": \"0.0.0\",\n \"main\": \"server.js\",\n \"dependencies\": {\n \"async\": \"^1.5.2\","
},
{
"path": "examples/server/node/server.js",
"chars": 39999,
"preview": "/**\n * Satellizer Node.js Example\n * (c) 2015 Sahat Yalkabov\n * License: MIT\n */\n\nvar path = require('path');\nvar qs = r"
},
{
"path": "examples/server/php/.gitattributes",
"chars": 61,
"preview": "* text=auto\n*.css linguist-vendored\n*.less linguist-vendored\n"
},
{
"path": "examples/server/php/.gitignore",
"chars": 27,
"preview": "/vendor\n/node_modules\n.env\n"
},
{
"path": "examples/server/php/README.md",
"chars": 1777,
"preview": "<img src=\"http://blog.legacyteam.info/wp-content/uploads/2014/10/laravel-logo-white.png\" width=\"280px\">\n\nLaravel is a we"
},
{
"path": "examples/server/php/app/Commands/Command.php",
"chars": 64,
"preview": "<?php namespace App\\Commands;\n\nabstract class Command {\n\n\t//\n\n}\n"
},
{
"path": "examples/server/php/app/Console/Commands/Inspire.php",
"chars": 511,
"preview": "<?php namespace App\\Console\\Commands;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Foundation\\Inspiring;\n\nclass Inspi"
},
{
"path": "examples/server/php/app/Console/Kernel.php",
"chars": 568,
"preview": "<?php namespace App\\Console;\n\nuse Illuminate\\Console\\Scheduling\\Schedule;\nuse Illuminate\\Foundation\\Console\\Kernel as Co"
},
{
"path": "examples/server/php/app/Events/Event.php",
"chars": 60,
"preview": "<?php namespace App\\Events;\n\nabstract class Event {\n\n\t//\n\n}\n"
},
{
"path": "examples/server/php/app/Exceptions/Handler.php",
"chars": 844,
"preview": "<?php namespace App\\Exceptions;\n\nuse Exception;\nuse Illuminate\\Foundation\\Exceptions\\Handler as ExceptionHandler;\n\nclass"
},
{
"path": "examples/server/php/app/Handlers/Commands/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "examples/server/php/app/Handlers/Events/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "examples/server/php/app/Http/Controllers/AuthController.php",
"chars": 22138,
"preview": "<?php namespace App\\Http\\Controllers;\n\nuse Hash;\nuse Config;\nuse Validator;\nuse Firebase\\JWT\\JWT;\nuse Illuminate\\Http\\Re"
},
{
"path": "examples/server/php/app/Http/Controllers/Controller.php",
"chars": 290,
"preview": "<?php namespace App\\Http\\Controllers;\n\nuse Illuminate\\Foundation\\Bus\\DispatchesJobs;\nuse Illuminate\\Routing\\Controller a"
},
{
"path": "examples/server/php/app/Http/Controllers/HomeController.php",
"chars": 190,
"preview": "<?php namespace App\\Http\\Controllers;\n\nuse File;\n\nclass HomeController extends Controller {\n\n public function index()"
},
{
"path": "examples/server/php/app/Http/Controllers/UserController.php",
"chars": 1074,
"preview": "<?php namespace App\\Http\\Controllers;\n\nuse Illuminate\\Http\\Request;\nuse Config;\nuse Firebase\\JWT\\JWT;\nuse App\\User;\n\ncla"
},
{
"path": "examples/server/php/app/Http/Kernel.php",
"chars": 842,
"preview": "<?php namespace App\\Http;\n\nuse Illuminate\\Foundation\\Http\\Kernel as HttpKernel;\n\nclass Kernel extends HttpKernel {\n\n\t/**"
},
{
"path": "examples/server/php/app/Http/Middleware/Authenticate.php",
"chars": 1081,
"preview": "<?php namespace App\\Http\\Middleware;\n\nuse Firebase\\JWT\\JWT;\nuse Config;\nuse Closure;\nuse Illuminate\\Contracts\\Auth\\Guard"
},
{
"path": "examples/server/php/app/Http/Middleware/RedirectIfAuthenticated.php",
"chars": 706,
"preview": "<?php namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Contracts\\Auth\\Guard;\nuse Illuminate\\Http\\RedirectResp"
},
{
"path": "examples/server/php/app/Http/Middleware/VerifyCsrfToken.php",
"chars": 412,
"preview": "<?php namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken as BaseVeri"
},
{
"path": "examples/server/php/app/Http/Requests/Request.php",
"chars": 134,
"preview": "<?php namespace App\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nabstract class Request extends FormRequ"
},
{
"path": "examples/server/php/app/Http/routes.php",
"chars": 1291,
"preview": "<?php\n\n/*\n|--------------------------------------------------------------------------\n| Application Routes\n|------------"
},
{
"path": "examples/server/php/app/Providers/AppServiceProvider.php",
"chars": 344,
"preview": "<?php namespace App\\Providers;\n\nuse Illuminate\\Support\\ServiceProvider;\n\nclass AppServiceProvider extends ServiceProvide"
},
{
"path": "examples/server/php/app/Providers/AuthServiceProvider.php",
"chars": 692,
"preview": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Contracts\\Auth\\Access\\Gate as GateContract;\nuse Illuminate\\Foundation\\Su"
},
{
"path": "examples/server/php/app/Providers/BusServiceProvider.php",
"chars": 594,
"preview": "<?php namespace App\\Providers;\n\nuse Illuminate\\Bus\\Dispatcher;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass BusService"
},
{
"path": "examples/server/php/app/Providers/ConfigServiceProvider.php",
"chars": 502,
"preview": "<?php namespace App\\Providers;\n\nuse Illuminate\\Support\\ServiceProvider;\n\nclass ConfigServiceProvider extends ServiceProv"
},
{
"path": "examples/server/php/app/Providers/EventServiceProvider.php",
"chars": 626,
"preview": "<?php namespace App\\Providers;\n\nuse Illuminate\\Contracts\\Events\\Dispatcher as DispatcherContract;\nuse Illuminate\\Foundat"
},
{
"path": "examples/server/php/app/Providers/RouteServiceProvider.php",
"chars": 933,
"preview": "<?php namespace App\\Providers;\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Foundation\\Support\\Providers\\RouteServiceP"
},
{
"path": "examples/server/php/app/User.php",
"chars": 316,
"preview": "<?php namespace App;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass User extends Model {\n\n\t/**\n\t * The database table u"
},
{
"path": "examples/server/php/artisan",
"chars": 1635,
"preview": "#!/usr/bin/env php\n<?php\n\n/*\n|--------------------------------------------------------------------------\n| Register The "
},
{
"path": "examples/server/php/bootstrap/app.php",
"chars": 1551,
"preview": "<?php\n\n/*\n|--------------------------------------------------------------------------\n| Create The Application\n|--------"
},
{
"path": "examples/server/php/bootstrap/autoload.php",
"chars": 1175,
"preview": "<?php\n\ndefine('LARAVEL_START', microtime(true));\n\n/*\n|------------------------------------------------------------------"
},
{
"path": "examples/server/php/bootstrap/cache/.gitignore",
"chars": 13,
"preview": "*\n!.gitignore"
},
{
"path": "examples/server/php/composer.json",
"chars": 973,
"preview": "{\n\t\"name\": \"laravel/laravel\",\n\t\"description\": \"The Laravel Framework.\",\n\t\"keywords\": [\"framework\", \"laravel\"],\n\t\"license"
},
{
"path": "examples/server/php/config/app.php",
"chars": 7978,
"preview": "<?php\n\nreturn [\n\n\t'token_secret' => 'some random string',\n\t'facebook_secret' => '',\n\t'foursquare_secret' => '',\n\t'google"
},
{
"path": "examples/server/php/config/auth.php",
"chars": 3381,
"preview": "<?php\n\nreturn [\n\n\t/*\n |--------------------------------------------------------------------------\n | Authenticatio"
},
{
"path": "examples/server/php/config/cache.php",
"chars": 1819,
"preview": "<?php\n\nreturn [\n\n\t/*\n\t|--------------------------------------------------------------------------\n\t| Default Cache Store"
},
{
"path": "examples/server/php/config/compile.php",
"chars": 1223,
"preview": "<?php\n\nreturn [\n\n\t/*\n\t|--------------------------------------------------------------------------\n\t| Additional Compiled"
},
{
"path": "examples/server/php/config/database.php",
"chars": 3524,
"preview": "<?php\n\nreturn [\n\n\t/*\n\t|--------------------------------------------------------------------------\n\t| PDO Fetch Style\n\t|-"
},
{
"path": "examples/server/php/config/filesystems.php",
"chars": 1865,
"preview": "<?php\n\nreturn [\n\n\t/*\n\t|--------------------------------------------------------------------------\n\t| Default Filesystem "
},
{
"path": "examples/server/php/config/mail.php",
"chars": 4069,
"preview": "<?php\n\nreturn [\n\n\t/*\n\t|--------------------------------------------------------------------------\n\t| Mail Driver\n\t|-----"
},
{
"path": "examples/server/php/config/queue.php",
"chars": 2227,
"preview": "<?php\n\nreturn [\n\n\t/*\n\t|--------------------------------------------------------------------------\n\t| Default Queue Drive"
},
{
"path": "examples/server/php/config/services.php",
"chars": 745,
"preview": "<?php\n\nreturn [\n\n\t/*\n\t|--------------------------------------------------------------------------\n\t| Third Party Service"
},
{
"path": "examples/server/php/config/session.php",
"chars": 4928,
"preview": "<?php\n\nreturn [\n\n\t/*\n\t|--------------------------------------------------------------------------\n\t| Default Session Dri"
},
{
"path": "examples/server/php/config/view.php",
"chars": 946,
"preview": "<?php\n\nreturn [\n\n\t/*\n\t|--------------------------------------------------------------------------\n\t| View Storage Paths\n"
},
{
"path": "examples/server/php/database/.gitignore",
"chars": 9,
"preview": "*.sqlite\n"
},
{
"path": "examples/server/php/database/migrations/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "examples/server/php/database/migrations/2015_04_18_080047_create_users_table.php",
"chars": 928,
"preview": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreateUsersTable e"
},
{
"path": "examples/server/php/database/seeds/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "examples/server/php/database/seeds/DatabaseSeeder.php",
"chars": 268,
"preview": "<?php\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass DatabaseSeeder extends Seeder {\n\n\t"
},
{
"path": "examples/server/php/gulpfile.js",
"chars": 503,
"preview": "var elixir = require('laravel-elixir');\n\n/*\n |--------------------------------------------------------------------------"
},
{
"path": "examples/server/php/package.json",
"chars": 98,
"preview": "{\n \"private\": true,\n \"devDependencies\": {\n \"gulp\": \"^3.8.8\",\n \"laravel-elixir\": \"*\"\n }\n}\n"
},
{
"path": "examples/server/php/phpspec.yml",
"chars": 87,
"preview": "suites:\n main:\n namespace: App\n psr4_prefix: App\n src_path: app"
},
{
"path": "examples/server/php/phpunit.xml",
"chars": 777,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit backupGlobals=\"false\"\n backupStaticAttributes=\"false\"\n b"
},
{
"path": "examples/server/php/public/.htaccess",
"chars": 516,
"preview": "<IfModule mod_rewrite.c>\n <IfModule mod_negotiation.c>\n Options -MultiViews\n </IfModule>\n\n RewriteEngine"
},
{
"path": "examples/server/php/public/app.js",
"chars": 2879,
"preview": "angular.module('MyApp', ['ngResource', 'ngMessages', 'ngAnimate', 'toastr', 'ui.router', 'satellizer'])\n .config(functi"
},
{
"path": "examples/server/php/public/controllers/home.js",
"chars": 544,
"preview": "angular.module('MyApp')\n .controller('HomeCtrl', function($scope, $http) {\n $http.jsonp('https://api.github.com/repo"
},
{
"path": "examples/server/php/public/controllers/login.js",
"chars": 1019,
"preview": "angular.module('MyApp')\n .controller('LoginCtrl', function($scope, $location, $auth, toastr) {\n $scope.login = funct"
},
{
"path": "examples/server/php/public/controllers/logout.js",
"chars": 272,
"preview": "angular.module('MyApp')\n .controller('LogoutCtrl', function($location, $auth, toastr) {\n if (!$auth.isAuthenticated("
},
{
"path": "examples/server/php/public/controllers/navbar.js",
"chars": 171,
"preview": "angular.module('MyApp')\n .controller('NavbarCtrl', function($scope, $auth) {\n $scope.isAuthenticated = function() {\n"
},
{
"path": "examples/server/php/public/controllers/profile.js",
"chars": 1418,
"preview": "angular.module('MyApp')\n .controller('ProfileCtrl', function($scope, $auth, toastr, Account) {\n $scope.getProfile = "
},
{
"path": "examples/server/php/public/controllers/signup.js",
"chars": 476,
"preview": "angular.module('MyApp')\n .controller('SignupCtrl', function($scope, $location, $auth, toastr) {\n $scope.signup = fun"
},
{
"path": "examples/server/php/public/directives/passwordMatch.js",
"chars": 479,
"preview": "angular.module('MyApp')\n .directive('passwordMatch', function() {\n return {\n require: 'ngModel',\n scope: {"
},
{
"path": "examples/server/php/public/directives/passwordStrength.js",
"chars": 5207,
"preview": "angular.module('MyApp')\n .directive('passwordStrength', function() {\n return {\n restrict: 'A',\n require: '"
},
{
"path": "examples/server/php/public/index.html",
"chars": 2441,
"preview": "<!DOCTYPE html>\n<html ng-app=\"MyApp\">\n<head>\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=e"
},
{
"path": "examples/server/php/public/index.php",
"chars": 1777,
"preview": "<?php\n/**\n * Laravel - A PHP Framework For Web Artisans\n *\n * @package Laravel\n * @author Taylor Otwell <taylorotwell"
},
{
"path": "examples/server/php/public/partials/home.html",
"chars": 1661,
"preview": "<div class=\"container\">\n <div class=\"panel panel-default\">\n <div class=\"panel-heading\">Home Page</div>\n <div clas"
},
{
"path": "examples/server/php/public/partials/login.html",
"chars": 3263,
"preview": "<div class=\"container\">\n <div class=\"row\">\n <div class=\"center-form panel\">\n <div class=\"panel-body\">\n <"
},
{
"path": "examples/server/php/public/partials/profile.html",
"chars": 5289,
"preview": "<div class=\"container\">\n <div class=\"panel panel-default\">\n <div class=\"panel-heading\">Profile</div>\n <div class="
},
{
"path": "examples/server/php/public/partials/signup.html",
"chars": 3157,
"preview": "<div class=\"container\">\n <div class=\"row\">\n <div class=\"center-form panel\">\n <div class=\"panel-body\">\n <"
},
{
"path": "examples/server/php/public/robots.txt",
"chars": 24,
"preview": "User-agent: *\nDisallow:\n"
},
{
"path": "examples/server/php/public/services/account.js",
"chars": 269,
"preview": "angular.module('MyApp')\n .factory('Account', function($http) {\n return {\n getProfile: function() {\n retu"
},
{
"path": "examples/server/php/public/stylesheets/angular-toastr.css",
"chars": 6689,
"preview": ".toast-title {\n font-weight: bold;\n}\n.toast-message {\n word-wrap: break-word;\n}\n.toast-message a,\n.toast-message label"
},
{
"path": "examples/server/php/public/stylesheets/styles.css",
"chars": 6727,
"preview": "body {\n font-family: 'Open Sans', sans-serif;\n background: #e4e7ec;\n}\n\nh1, h2, h3, h4, h5, h6 {\n font-family: 'Montse"
},
{
"path": "examples/server/php/public/vendor/angular-animate.js",
"chars": 141215,
"preview": "/**\n * @license AngularJS v1.4.7\n * (c) 2010-2015 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
},
{
"path": "examples/server/php/public/vendor/angular-messages.js",
"chars": 25732,
"preview": "/**\n * @license AngularJS v1.4.7\n * (c) 2010-2015 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
},
{
"path": "examples/server/php/public/vendor/angular-mocks.js",
"chars": 82751,
"preview": "/**\n * @license AngularJS v1.4.7\n * (c) 2010-2015 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
},
{
"path": "examples/server/php/public/vendor/angular-resource.js",
"chars": 27143,
"preview": "/**\n * @license AngularJS v1.4.7\n * (c) 2010-2015 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
},
{
"path": "examples/server/php/public/vendor/angular-sanitize.js",
"chars": 24546,
"preview": "/**\n * @license AngularJS v1.4.7\n * (c) 2010-2015 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
}
]
// ... and 142 more files (download for full content)
About this extraction
This page contains the full source code of the sahat/satellizer GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 342 files (8.2 MB), approximately 2.2M tokens, and a symbol index with 2640 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.