praxis 0.0.1 → 0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.ruby-version +1 -0
  5. data/.simplecov +7 -0
  6. data/.travis.yml +4 -0
  7. data/CONTRIBUTING.md +183 -0
  8. data/Gemfile +3 -0
  9. data/Guardfile +8 -0
  10. data/LICENSE +22 -0
  11. data/MAINTAINERS +2 -0
  12. data/MAINTAINERS.md +86 -0
  13. data/README.md +69 -3
  14. data/Rakefile +18 -0
  15. data/bin/praxis +10 -0
  16. data/lib/api_browser/.bowerrc +3 -0
  17. data/lib/api_browser/.editorconfig +21 -0
  18. data/lib/api_browser/Gruntfile.js +264 -0
  19. data/lib/api_browser/app/bower_components/angular/.bower.json +16 -0
  20. data/lib/api_browser/app/bower_components/angular/README.md +48 -0
  21. data/lib/api_browser/app/bower_components/angular/angular-csp.css +18 -0
  22. data/lib/api_browser/app/bower_components/angular/angular.js +21464 -0
  23. data/lib/api_browser/app/bower_components/angular/angular.min.js +210 -0
  24. data/lib/api_browser/app/bower_components/angular/angular.min.js.gzip +0 -0
  25. data/lib/api_browser/app/bower_components/angular/angular.min.js.map +8 -0
  26. data/lib/api_browser/app/bower_components/angular/bower.json +7 -0
  27. data/lib/api_browser/app/bower_components/angular-sanitize/.bower.json +19 -0
  28. data/lib/api_browser/app/bower_components/angular-sanitize/README.md +54 -0
  29. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.js +624 -0
  30. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js +14 -0
  31. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js.map +8 -0
  32. data/lib/api_browser/app/bower_components/angular-sanitize/bower.json +8 -0
  33. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/.bower.json +24 -0
  34. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/bower.json +11 -0
  35. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js +4116 -0
  36. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js +10 -0
  37. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.js +3799 -0
  38. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.min.js +9 -0
  39. data/lib/api_browser/app/bower_components/angular-ui-router/.bower.json +34 -0
  40. data/lib/api_browser/app/bower_components/angular-ui-router/CHANGELOG.md +23 -0
  41. data/lib/api_browser/app/bower_components/angular-ui-router/LICENSE +21 -0
  42. data/lib/api_browser/app/bower_components/angular-ui-router/README.md +280 -0
  43. data/lib/api_browser/app/bower_components/angular-ui-router/bower.json +23 -0
  44. data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.js +3223 -0
  45. data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.min.js +7 -0
  46. data/lib/api_browser/app/bower_components/angular-ui-router/src/common.js +246 -0
  47. data/lib/api_browser/app/bower_components/angular-ui-router/src/compat.js +146 -0
  48. data/lib/api_browser/app/bower_components/angular-ui-router/src/resolve.js +242 -0
  49. data/lib/api_browser/app/bower_components/angular-ui-router/src/state.js +1204 -0
  50. data/lib/api_browser/app/bower_components/angular-ui-router/src/stateDirectives.js +226 -0
  51. data/lib/api_browser/app/bower_components/angular-ui-router/src/stateFilters.js +35 -0
  52. data/lib/api_browser/app/bower_components/angular-ui-router/src/templateFactory.js +110 -0
  53. data/lib/api_browser/app/bower_components/angular-ui-router/src/urlMatcherFactory.js +325 -0
  54. data/lib/api_browser/app/bower_components/angular-ui-router/src/urlRouter.js +273 -0
  55. data/lib/api_browser/app/bower_components/angular-ui-router/src/view.js +71 -0
  56. data/lib/api_browser/app/bower_components/angular-ui-router/src/viewDirective.js +290 -0
  57. data/lib/api_browser/app/bower_components/angular-ui-router/src/viewScroll.js +52 -0
  58. data/lib/api_browser/app/bower_components/bootstrap-sass/.bower.json +26 -0
  59. data/lib/api_browser/app/bower_components/bootstrap-sass/CNAME +1 -0
  60. data/lib/api_browser/app/bower_components/bootstrap-sass/CONTRIBUTING.md +61 -0
  61. data/lib/api_browser/app/bower_components/bootstrap-sass/DOCS-LICENSE +319 -0
  62. data/lib/api_browser/app/bower_components/bootstrap-sass/Gemfile +5 -0
  63. data/lib/api_browser/app/bower_components/bootstrap-sass/Gemfile.lock +14 -0
  64. data/lib/api_browser/app/bower_components/bootstrap-sass/Gruntfile.js +244 -0
  65. data/lib/api_browser/app/bower_components/bootstrap-sass/LICENSE +176 -0
  66. data/lib/api_browser/app/bower_components/bootstrap-sass/LICENSE-MIT +21 -0
  67. data/lib/api_browser/app/bower_components/bootstrap-sass/README.md +277 -0
  68. data/lib/api_browser/app/bower_components/bootstrap-sass/Rakefile +44 -0
  69. data/lib/api_browser/app/bower_components/bootstrap-sass/_config.yml +25 -0
  70. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/ads.html +1 -0
  71. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/footer.html +34 -0
  72. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/header.html +42 -0
  73. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-about.html +12 -0
  74. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-components.html +137 -0
  75. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-css.html +99 -0
  76. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-customize.html +40 -0
  77. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-getting-started.html +44 -0
  78. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-javascript.html +88 -0
  79. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-main.html +37 -0
  80. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/old-bs-docs.html +8 -0
  81. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/social-buttons.html +16 -0
  82. data/lib/api_browser/app/bower_components/bootstrap-sass/_layouts/default.html +79 -0
  83. data/lib/api_browser/app/bower_components/bootstrap-sass/_layouts/home.html +47 -0
  84. data/lib/api_browser/app/bower_components/bootstrap-sass/about.html +93 -0
  85. data/lib/api_browser/app/bower_components/bootstrap-sass/bower.json +11 -0
  86. data/lib/api_browser/app/bower_components/bootstrap-sass/browserstack.json +37 -0
  87. data/lib/api_browser/app/bower_components/bootstrap-sass/components.html +3689 -0
  88. data/lib/api_browser/app/bower_components/bootstrap-sass/composer.json +28 -0
  89. data/lib/api_browser/app/bower_components/bootstrap-sass/css.html +2674 -0
  90. data/lib/api_browser/app/bower_components/bootstrap-sass/customize.html +1715 -0
  91. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap-theme.css +427 -0
  92. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap-theme.min.css +1 -0
  93. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap.css +6350 -0
  94. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap.min.css +1 -0
  95. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/fonts/glyphicons-halflings-regular.eot +0 -0
  96. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/fonts/glyphicons-halflings-regular.svg +229 -0
  97. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  98. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/fonts/glyphicons-halflings-regular.woff +0 -0
  99. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/js/bootstrap.js +2002 -0
  100. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/js/bootstrap.min.js +9 -0
  101. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/css/docs.css +1195 -0
  102. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/css/pygments-manni.css +66 -0
  103. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/ico/apple-touch-icon-144-precomposed.png +0 -0
  104. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/ico/favicon.png +0 -0
  105. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/application.js +103 -0
  106. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/customizer.js +332 -0
  107. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/filesaver.js +169 -0
  108. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/holder.js +404 -0
  109. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/ie8-responsive-file-warning.js +12 -0
  110. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/jszip.js +1467 -0
  111. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/less.js +9 -0
  112. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/raw-files.js +3 -0
  113. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/uglify.js +14 -0
  114. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/carousel/carousel.css +148 -0
  115. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/carousel/index.html +206 -0
  116. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/grid/grid.css +28 -0
  117. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/grid/index.html +148 -0
  118. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron/index.html +99 -0
  119. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron/jumbotron.css +5 -0
  120. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron-narrow/index.html +82 -0
  121. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron-narrow/jumbotron-narrow.css +79 -0
  122. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/justified-nav/index.html +83 -0
  123. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/justified-nav/justified-nav.css +88 -0
  124. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar/index.html +88 -0
  125. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar/navbar.css +8 -0
  126. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-fixed-top/index.html +91 -0
  127. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-fixed-top/navbar-fixed-top.css +4 -0
  128. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-static-top/index.html +92 -0
  129. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-static-top/navbar-static-top.css +7 -0
  130. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/non-responsive/index.html +101 -0
  131. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/non-responsive/non-responsive.css +116 -0
  132. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/index.html +130 -0
  133. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/offcanvas.css +50 -0
  134. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/offcanvas.js +5 -0
  135. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/carousel.jpg +0 -0
  136. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/grid.jpg +0 -0
  137. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/jumbotron-narrow.jpg +0 -0
  138. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/jumbotron.jpg +0 -0
  139. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/justified-nav.jpg +0 -0
  140. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar-fixed.jpg +0 -0
  141. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar-static.jpg +0 -0
  142. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar.jpg +0 -0
  143. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/non-responsive.jpg +0 -0
  144. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/offcanvas.jpg +0 -0
  145. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sign-in.jpg +0 -0
  146. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/starter-template.jpg +0 -0
  147. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sticky-footer-navbar.jpg +0 -0
  148. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sticky-footer.jpg +0 -0
  149. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/theme.jpg +0 -0
  150. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/signin/index.html +50 -0
  151. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/signin/signin.css +40 -0
  152. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/starter-template/index.html +68 -0
  153. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/starter-template/starter-template.css +7 -0
  154. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer/index.html +55 -0
  155. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer/sticky-footer.css +38 -0
  156. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer-navbar/index.html +91 -0
  157. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer-navbar/sticky-footer-navbar.css +45 -0
  158. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/theme/index.html +384 -0
  159. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/theme/theme.css +14 -0
  160. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.eot +0 -0
  161. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.svg +229 -0
  162. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.ttf +0 -0
  163. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.woff +0 -0
  164. data/lib/api_browser/app/bower_components/bootstrap-sass/getting-started.html +1021 -0
  165. data/lib/api_browser/app/bower_components/bootstrap-sass/index.html +16 -0
  166. data/lib/api_browser/app/bower_components/bootstrap-sass/javascript.html +1983 -0
  167. data/lib/api_browser/app/bower_components/bootstrap-sass/js/affix.js +126 -0
  168. data/lib/api_browser/app/bower_components/bootstrap-sass/js/alert.js +98 -0
  169. data/lib/api_browser/app/bower_components/bootstrap-sass/js/button.js +109 -0
  170. data/lib/api_browser/app/bower_components/bootstrap-sass/js/carousel.js +217 -0
  171. data/lib/api_browser/app/bower_components/bootstrap-sass/js/collapse.js +179 -0
  172. data/lib/api_browser/app/bower_components/bootstrap-sass/js/dropdown.js +154 -0
  173. data/lib/api_browser/app/bower_components/bootstrap-sass/js/modal.js +246 -0
  174. data/lib/api_browser/app/bower_components/bootstrap-sass/js/popover.js +117 -0
  175. data/lib/api_browser/app/bower_components/bootstrap-sass/js/scrollspy.js +158 -0
  176. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tab.js +135 -0
  177. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/index.html +52 -0
  178. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/affix.js +25 -0
  179. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/alert.js +62 -0
  180. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/button.js +116 -0
  181. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/carousel.js +87 -0
  182. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/collapse.js +164 -0
  183. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/dropdown.js +219 -0
  184. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/modal.js +196 -0
  185. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/phantom.js +69 -0
  186. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/popover.js +133 -0
  187. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/scrollspy.js +37 -0
  188. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/tab.js +86 -0
  189. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/tooltip.js +437 -0
  190. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/transition.js +13 -0
  191. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/jquery.js +6 -0
  192. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/qunit.css +232 -0
  193. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/qunit.js +1510 -0
  194. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tooltip.js +386 -0
  195. data/lib/api_browser/app/bower_components/bootstrap-sass/js/transition.js +56 -0
  196. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_alerts.scss +67 -0
  197. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_badges.scss +51 -0
  198. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_breadcrumbs.scss +23 -0
  199. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_button-groups.scss +253 -0
  200. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_buttons.scss +158 -0
  201. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_carousel.scss +231 -0
  202. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_close.scss +35 -0
  203. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_code.scss +53 -0
  204. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_component-animations.scss +29 -0
  205. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_dropdowns.scss +193 -0
  206. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_forms.scss +363 -0
  207. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_glyphicons.scss +237 -0
  208. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_grid.scss +93 -0
  209. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_input-groups.scss +136 -0
  210. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_jumbotron.scss +40 -0
  211. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_labels.scss +58 -0
  212. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_list-group.scss +88 -0
  213. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_media.scss +56 -0
  214. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_mixins.scss +861 -0
  215. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_modals.scss +132 -0
  216. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_navbar.scss +628 -0
  217. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_navs.scss +262 -0
  218. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_normalize.scss +406 -0
  219. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_pager.scss +55 -0
  220. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_pagination.scss +85 -0
  221. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_panels.scss +172 -0
  222. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_popovers.scss +133 -0
  223. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_print.scss +105 -0
  224. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_progress-bars.scss +92 -0
  225. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_responsive-utilities.scss +198 -0
  226. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_scaffolding.scss +119 -0
  227. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_tables.scss +244 -0
  228. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_theme.scss +247 -0
  229. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_thumbnails.scss +32 -0
  230. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_tooltip.scss +95 -0
  231. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_type.scss +279 -0
  232. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_utilities.scss +56 -0
  233. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_variables.scss +637 -0
  234. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_wells.scss +29 -0
  235. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/bootstrap.scss +49 -0
  236. data/lib/api_browser/app/bower_components/bootstrap-sass/package.json +40 -0
  237. data/lib/api_browser/app/bower_components/jquery/.bower.json +38 -0
  238. data/lib/api_browser/app/bower_components/jquery/MIT-LICENSE.txt +21 -0
  239. data/lib/api_browser/app/bower_components/jquery/bower.json +27 -0
  240. data/lib/api_browser/app/bower_components/jquery/dist/jquery.js +9190 -0
  241. data/lib/api_browser/app/bower_components/jquery/dist/jquery.min.js +5 -0
  242. data/lib/api_browser/app/bower_components/jquery/dist/jquery.min.map +1 -0
  243. data/lib/api_browser/app/bower_components/jquery/src/ajax/jsonp.js +89 -0
  244. data/lib/api_browser/app/bower_components/jquery/src/ajax/load.js +75 -0
  245. data/lib/api_browser/app/bower_components/jquery/src/ajax/parseJSON.js +13 -0
  246. data/lib/api_browser/app/bower_components/jquery/src/ajax/parseXML.js +28 -0
  247. data/lib/api_browser/app/bower_components/jquery/src/ajax/script.js +64 -0
  248. data/lib/api_browser/app/bower_components/jquery/src/ajax/var/nonce.js +5 -0
  249. data/lib/api_browser/app/bower_components/jquery/src/ajax/var/rquery.js +3 -0
  250. data/lib/api_browser/app/bower_components/jquery/src/ajax/xhr.js +135 -0
  251. data/lib/api_browser/app/bower_components/jquery/src/ajax.js +806 -0
  252. data/lib/api_browser/app/bower_components/jquery/src/attributes/attr.js +143 -0
  253. data/lib/api_browser/app/bower_components/jquery/src/attributes/classes.js +158 -0
  254. data/lib/api_browser/app/bower_components/jquery/src/attributes/prop.js +96 -0
  255. data/lib/api_browser/app/bower_components/jquery/src/attributes/support.js +35 -0
  256. data/lib/api_browser/app/bower_components/jquery/src/attributes/val.js +163 -0
  257. data/lib/api_browser/app/bower_components/jquery/src/attributes.js +11 -0
  258. data/lib/api_browser/app/bower_components/jquery/src/callbacks.js +205 -0
  259. data/lib/api_browser/app/bower_components/jquery/src/core/access.js +60 -0
  260. data/lib/api_browser/app/bower_components/jquery/src/core/init.js +123 -0
  261. data/lib/api_browser/app/bower_components/jquery/src/core/parseHTML.js +39 -0
  262. data/lib/api_browser/app/bower_components/jquery/src/core/ready.js +97 -0
  263. data/lib/api_browser/app/bower_components/jquery/src/core/var/rsingleTag.js +4 -0
  264. data/lib/api_browser/app/bower_components/jquery/src/core.js +498 -0
  265. data/lib/api_browser/app/bower_components/jquery/src/css/addGetHookIf.js +24 -0
  266. data/lib/api_browser/app/bower_components/jquery/src/css/curCSS.js +57 -0
  267. data/lib/api_browser/app/bower_components/jquery/src/css/defaultDisplay.js +70 -0
  268. data/lib/api_browser/app/bower_components/jquery/src/css/hiddenVisibleSelectors.js +15 -0
  269. data/lib/api_browser/app/bower_components/jquery/src/css/support.js +91 -0
  270. data/lib/api_browser/app/bower_components/jquery/src/css/swap.js +28 -0
  271. data/lib/api_browser/app/bower_components/jquery/src/css/var/cssExpand.js +3 -0
  272. data/lib/api_browser/app/bower_components/jquery/src/css/var/getStyles.js +5 -0
  273. data/lib/api_browser/app/bower_components/jquery/src/css/var/isHidden.js +13 -0
  274. data/lib/api_browser/app/bower_components/jquery/src/css/var/rmargin.js +3 -0
  275. data/lib/api_browser/app/bower_components/jquery/src/css/var/rnumnonpx.js +5 -0
  276. data/lib/api_browser/app/bower_components/jquery/src/css.js +451 -0
  277. data/lib/api_browser/app/bower_components/jquery/src/data/Data.js +181 -0
  278. data/lib/api_browser/app/bower_components/jquery/src/data/accepts.js +20 -0
  279. data/lib/api_browser/app/bower_components/jquery/src/data/var/data_priv.js +5 -0
  280. data/lib/api_browser/app/bower_components/jquery/src/data/var/data_user.js +5 -0
  281. data/lib/api_browser/app/bower_components/jquery/src/data.js +179 -0
  282. data/lib/api_browser/app/bower_components/jquery/src/deferred.js +149 -0
  283. data/lib/api_browser/app/bower_components/jquery/src/deprecated.js +13 -0
  284. data/lib/api_browser/app/bower_components/jquery/src/dimensions.js +50 -0
  285. data/lib/api_browser/app/bower_components/jquery/src/effects/Tween.js +114 -0
  286. data/lib/api_browser/app/bower_components/jquery/src/effects/animatedSelector.js +13 -0
  287. data/lib/api_browser/app/bower_components/jquery/src/effects.js +649 -0
  288. data/lib/api_browser/app/bower_components/jquery/src/event/alias.js +39 -0
  289. data/lib/api_browser/app/bower_components/jquery/src/event/support.js +9 -0
  290. data/lib/api_browser/app/bower_components/jquery/src/event.js +868 -0
  291. data/lib/api_browser/app/bower_components/jquery/src/exports/amd.js +24 -0
  292. data/lib/api_browser/app/bower_components/jquery/src/exports/global.js +32 -0
  293. data/lib/api_browser/app/bower_components/jquery/src/intro.js +44 -0
  294. data/lib/api_browser/app/bower_components/jquery/src/jquery.js +36 -0
  295. data/lib/api_browser/app/bower_components/jquery/src/manipulation/_evalUrl.js +18 -0
  296. data/lib/api_browser/app/bower_components/jquery/src/manipulation/support.js +31 -0
  297. data/lib/api_browser/app/bower_components/jquery/src/manipulation/var/rcheckableType.js +3 -0
  298. data/lib/api_browser/app/bower_components/jquery/src/manipulation.js +582 -0
  299. data/lib/api_browser/app/bower_components/jquery/src/offset.js +204 -0
  300. data/lib/api_browser/app/bower_components/jquery/src/outro.js +1 -0
  301. data/lib/api_browser/app/bower_components/jquery/src/queue/delay.js +22 -0
  302. data/lib/api_browser/app/bower_components/jquery/src/queue.js +142 -0
  303. data/lib/api_browser/app/bower_components/jquery/src/selector-native.js +172 -0
  304. data/lib/api_browser/app/bower_components/jquery/src/selector-sizzle.js +14 -0
  305. data/lib/api_browser/app/bower_components/jquery/src/selector.js +1 -0
  306. data/lib/api_browser/app/bower_components/jquery/src/serialize.js +111 -0
  307. data/lib/api_browser/app/bower_components/jquery/src/sizzle/dist/sizzle.js +2044 -0
  308. data/lib/api_browser/app/bower_components/jquery/src/sizzle/dist/sizzle.min.js +3 -0
  309. data/lib/api_browser/app/bower_components/jquery/src/sizzle/dist/sizzle.min.map +1 -0
  310. data/lib/api_browser/app/bower_components/jquery/src/traversing/findFilter.js +100 -0
  311. data/lib/api_browser/app/bower_components/jquery/src/traversing/var/rneedsContext.js +6 -0
  312. data/lib/api_browser/app/bower_components/jquery/src/traversing.js +200 -0
  313. data/lib/api_browser/app/bower_components/jquery/src/var/arr.js +3 -0
  314. data/lib/api_browser/app/bower_components/jquery/src/var/class2type.js +4 -0
  315. data/lib/api_browser/app/bower_components/jquery/src/var/concat.js +5 -0
  316. data/lib/api_browser/app/bower_components/jquery/src/var/hasOwn.js +5 -0
  317. data/lib/api_browser/app/bower_components/jquery/src/var/indexOf.js +5 -0
  318. data/lib/api_browser/app/bower_components/jquery/src/var/pnum.js +3 -0
  319. data/lib/api_browser/app/bower_components/jquery/src/var/push.js +5 -0
  320. data/lib/api_browser/app/bower_components/jquery/src/var/rnotwhite.js +3 -0
  321. data/lib/api_browser/app/bower_components/jquery/src/var/slice.js +5 -0
  322. data/lib/api_browser/app/bower_components/jquery/src/var/strundefined.js +3 -0
  323. data/lib/api_browser/app/bower_components/jquery/src/var/support.js +4 -0
  324. data/lib/api_browser/app/bower_components/jquery/src/var/toString.js +5 -0
  325. data/lib/api_browser/app/bower_components/jquery/src/wrap.js +78 -0
  326. data/lib/api_browser/app/bower_components/lodash/.bower.json +34 -0
  327. data/lib/api_browser/app/bower_components/lodash/LICENSE.txt +22 -0
  328. data/lib/api_browser/app/bower_components/lodash/bower.json +23 -0
  329. data/lib/api_browser/app/bower_components/lodash/dist/lodash.compat.js +7157 -0
  330. data/lib/api_browser/app/bower_components/lodash/dist/lodash.compat.min.js +61 -0
  331. data/lib/api_browser/app/bower_components/lodash/dist/lodash.js +6785 -0
  332. data/lib/api_browser/app/bower_components/lodash/dist/lodash.min.js +56 -0
  333. data/lib/api_browser/app/bower_components/lodash/dist/lodash.underscore.js +4979 -0
  334. data/lib/api_browser/app/bower_components/lodash/dist/lodash.underscore.min.js +39 -0
  335. data/lib/api_browser/app/css/main.css +4510 -0
  336. data/lib/api_browser/app/index.html +51 -0
  337. data/lib/api_browser/app/js/app.js +32 -0
  338. data/lib/api_browser/app/js/controllers/action.js +51 -0
  339. data/lib/api_browser/app/js/controllers/controller.js +10 -0
  340. data/lib/api_browser/app/js/controllers/menu.js +49 -0
  341. data/lib/api_browser/app/js/controllers/type.js +28 -0
  342. data/lib/api_browser/app/js/directives/attribute_description.js +43 -0
  343. data/lib/api_browser/app/js/directives/attribute_table.js +27 -0
  344. data/lib/api_browser/app/js/directives/attribute_table_row.js +17 -0
  345. data/lib/api_browser/app/js/directives/no_container.js +8 -0
  346. data/lib/api_browser/app/js/directives/request_body.js +25 -0
  347. data/lib/api_browser/app/js/directives/request_headers.js +20 -0
  348. data/lib/api_browser/app/js/directives/request_parameters.js +20 -0
  349. data/lib/api_browser/app/js/directives/type_label.js +53 -0
  350. data/lib/api_browser/app/js/factories/Documentation.js +16 -0
  351. data/lib/api_browser/app/js/factories/PayloadTemplates.js +10 -0
  352. data/lib/api_browser/app/js/factories/TemplateProvider.js +45 -0
  353. data/lib/api_browser/app/js/factories/TypeTemplates.js +11 -0
  354. data/lib/api_browser/app/js/filters/attribute_name.js +9 -0
  355. data/lib/api_browser/app/js/filters/friendly_json.js +5 -0
  356. data/lib/api_browser/app/js/filters/is_empty.js +8 -0
  357. data/lib/api_browser/app/js/filters/resource_name.js +5 -0
  358. data/lib/api_browser/app/sass/main.scss +59 -0
  359. data/lib/api_browser/app/sass/modules/_body.scss +11 -0
  360. data/lib/api_browser/app/sass/modules/_cloke.scss +8 -0
  361. data/lib/api_browser/app/sass/modules/_header.scss +15 -0
  362. data/lib/api_browser/app/sass/modules/_nav.scss +7 -0
  363. data/lib/api_browser/app/sass/modules/_sidebar.scss +26 -0
  364. data/lib/api_browser/app/sass/modules/_switch.scss +55 -0
  365. data/lib/api_browser/app/sass/modules/_table.scss +13 -0
  366. data/lib/api_browser/app/sass/variables/_bootstrap-variables.scss +762 -0
  367. data/lib/api_browser/app/views/action.html +83 -0
  368. data/lib/api_browser/app/views/controller.html +24 -0
  369. data/lib/api_browser/app/views/directives/attribute_description/_default.html +2 -0
  370. data/lib/api_browser/app/views/directives/attribute_description/_example.html +8 -0
  371. data/lib/api_browser/app/views/directives/attribute_description/_headers.html +8 -0
  372. data/lib/api_browser/app/views/directives/attribute_description.html +2 -0
  373. data/lib/api_browser/app/views/directives/attribute_table.html +23 -0
  374. data/lib/api_browser/app/views/directives/attribute_table_row/_default.html +10 -0
  375. data/lib/api_browser/app/views/directives/attribute_table_row/_links.html +10 -0
  376. data/lib/api_browser/app/views/directives/attribute_table_row/_struct.html +2 -0
  377. data/lib/api_browser/app/views/directives/request_body/_default.html +20 -0
  378. data/lib/api_browser/app/views/directives/request_body/_struct.html +1 -0
  379. data/lib/api_browser/app/views/home.html +7 -0
  380. data/lib/api_browser/app/views/layout.html +50 -0
  381. data/lib/api_browser/app/views/resource/_actions.html +23 -0
  382. data/lib/api_browser/app/views/type/_details.html +29 -0
  383. data/lib/api_browser/app/views/type.html +25 -0
  384. data/lib/api_browser/bower.json +26 -0
  385. data/lib/api_browser/package.json +30 -0
  386. data/lib/praxis/action_definition/headers_dsl_compiler.rb +36 -0
  387. data/lib/praxis/action_definition.rb +153 -0
  388. data/lib/praxis/api_definition.rb +59 -0
  389. data/lib/praxis/application.rb +65 -0
  390. data/lib/praxis/bootloader.rb +91 -0
  391. data/lib/praxis/bootloader_stages/environment.rb +57 -0
  392. data/lib/praxis/bootloader_stages/file_loader.rb +31 -0
  393. data/lib/praxis/bootloader_stages/routing.rb +34 -0
  394. data/lib/praxis/bootloader_stages/subgroup_loader.rb +27 -0
  395. data/lib/praxis/bootloader_stages/warn_unloaded_files.rb +40 -0
  396. data/lib/praxis/config.rb +92 -0
  397. data/lib/praxis/content_type_parser.rb +62 -0
  398. data/lib/praxis/controller.rb +59 -0
  399. data/lib/praxis/dispatcher.rb +102 -0
  400. data/lib/praxis/exception.rb +4 -0
  401. data/lib/praxis/exceptions/config.rb +6 -0
  402. data/lib/praxis/exceptions/config_load.rb +9 -0
  403. data/lib/praxis/exceptions/config_validation.rb +9 -0
  404. data/lib/praxis/exceptions/invalid_configuration.rb +6 -0
  405. data/lib/praxis/exceptions/invalid_response.rb +6 -0
  406. data/lib/praxis/exceptions/invalid_trait.rb +6 -0
  407. data/lib/praxis/exceptions/stage_not_found.rb +6 -0
  408. data/lib/praxis/exceptions/validation.rb +6 -0
  409. data/lib/praxis/file_group.rb +39 -0
  410. data/lib/praxis/links.rb +110 -0
  411. data/lib/praxis/media_type.rb +40 -0
  412. data/lib/praxis/media_type_collection.rb +120 -0
  413. data/lib/praxis/multipart/parser.rb +213 -0
  414. data/lib/praxis/multipart/part.rb +26 -0
  415. data/lib/praxis/plugin.rb +30 -0
  416. data/lib/praxis/request.rb +131 -0
  417. data/lib/praxis/request_stages/action.rb +20 -0
  418. data/lib/praxis/request_stages/load_request.rb +13 -0
  419. data/lib/praxis/request_stages/request_stage.rb +52 -0
  420. data/lib/praxis/request_stages/response.rb +26 -0
  421. data/lib/praxis/request_stages/validate.rb +20 -0
  422. data/lib/praxis/request_stages/validate_params_and_headers.rb +38 -0
  423. data/lib/praxis/request_stages/validate_payload.rb +32 -0
  424. data/lib/praxis/resource_definition.rb +89 -0
  425. data/lib/praxis/response.rb +107 -0
  426. data/lib/praxis/response_definition.rb +264 -0
  427. data/lib/praxis/response_template.rb +34 -0
  428. data/lib/praxis/responses/http.rb +166 -0
  429. data/lib/praxis/responses/validation_error.rb +36 -0
  430. data/lib/praxis/route.rb +27 -0
  431. data/lib/praxis/router.rb +89 -0
  432. data/lib/praxis/simple_media_type.rb +24 -0
  433. data/lib/praxis/skeletor/restful_routing_config.rb +45 -0
  434. data/lib/praxis/stage.rb +94 -0
  435. data/lib/praxis/tasks/api_docs.rb +336 -0
  436. data/lib/praxis/tasks/console.rb +11 -0
  437. data/lib/praxis/tasks/environment.rb +5 -0
  438. data/lib/praxis/tasks/routes.rb +45 -0
  439. data/lib/praxis/tasks.rb +4 -0
  440. data/lib/praxis/types/collection.rb +17 -0
  441. data/lib/praxis/types/multipart.rb +69 -0
  442. data/lib/praxis/version.rb +3 -0
  443. data/lib/praxis.rb +119 -1
  444. data/praxis.gemspec +50 -0
  445. data/spec/functional_spec.rb +186 -0
  446. data/spec/praxis/action_definition_spec.rb +134 -0
  447. data/spec/praxis/api_resource_spec.rb +0 -0
  448. data/spec/praxis/application_spec.rb +46 -0
  449. data/spec/praxis/bootloader_spec.rb +58 -0
  450. data/spec/praxis/config_spec.rb +118 -0
  451. data/spec/praxis/content_type_parser_spec.rb +91 -0
  452. data/spec/praxis/controller_spec.rb +73 -0
  453. data/spec/praxis/dispatcher_spec.rb +0 -0
  454. data/spec/praxis/file_group_spec.rb +34 -0
  455. data/spec/praxis/links_spec.rb +45 -0
  456. data/spec/praxis/media_type_collection_spec.rb +145 -0
  457. data/spec/praxis/media_type_spec.rb +80 -0
  458. data/spec/praxis/multipart/parser_spec.rb +54 -0
  459. data/spec/praxis/request_spec.rb +109 -0
  460. data/spec/praxis/request_stages_validate_spec.rb +34 -0
  461. data/spec/praxis/resource_definition_spec.rb +116 -0
  462. data/spec/praxis/response_definition_spec.rb +500 -0
  463. data/spec/praxis/response_spec.rb +166 -0
  464. data/spec/praxis/restful_routing_config_spec.rb +88 -0
  465. data/spec/praxis/route_spec.rb +42 -0
  466. data/spec/praxis/router_spec.rb +148 -0
  467. data/spec/praxis/stage_spec.rb +110 -0
  468. data/spec/praxis/types/multipart_spec.rb +81 -0
  469. data/spec/spec_app/app/controllers/instances.rb +63 -0
  470. data/spec/spec_app/app/responses/bulk_response.rb +6 -0
  471. data/spec/spec_app/app/responses/multipart.rb +10 -0
  472. data/spec/spec_app/app/responses/other_response.rb +6 -0
  473. data/spec/spec_app/config/environment.rb +17 -0
  474. data/spec/spec_app/config.ru +17 -0
  475. data/spec/spec_app/design/api.rb +27 -0
  476. data/spec/spec_app/design/media_types/instance.rb +35 -0
  477. data/spec/spec_app/design/media_types/volume.rb +34 -0
  478. data/spec/spec_app/design/media_types/volume_snapshot.rb +38 -0
  479. data/spec/spec_app/design/resources/instances.rb +161 -0
  480. data/spec/spec_helper.rb +39 -0
  481. data/spec/support/spec_media_types.rb +46 -0
  482. data/spec/support/spec_resource_definitions.rb +33 -0
  483. data/tasks/praxis_app_generator.thor +307 -0
  484. metadata +847 -12
@@ -0,0 +1,1204 @@
1
+ /**
2
+ * @ngdoc object
3
+ * @name ui.router.state.$stateProvider
4
+ *
5
+ * @requires ui.router.router.$urlRouterProvider
6
+ * @requires ui.router.util.$urlMatcherFactoryProvider
7
+ * @requires $locationProvider
8
+ *
9
+ * @description
10
+ * The new `$stateProvider` works similar to Angular's v1 router, but it focuses purely
11
+ * on state.
12
+ *
13
+ * A state corresponds to a "place" in the application in terms of the overall UI and
14
+ * navigation. A state describes (via the controller / template / view properties) what
15
+ * the UI looks like and does at that place.
16
+ *
17
+ * States often have things in common, and the primary way of factoring out these
18
+ * commonalities in this model is via the state hierarchy, i.e. parent/child states aka
19
+ * nested states.
20
+ *
21
+ * The `$stateProvider` provides interfaces to declare these states for your app.
22
+ */
23
+ $StateProvider.$inject = ['$urlRouterProvider', '$urlMatcherFactoryProvider', '$locationProvider'];
24
+ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $locationProvider) {
25
+
26
+ var root, states = {}, $state, queue = {}, abstractKey = 'abstract';
27
+
28
+ // Builds state properties from definition passed to registerState()
29
+ var stateBuilder = {
30
+
31
+ // Derive parent state from a hierarchical name only if 'parent' is not explicitly defined.
32
+ // state.children = [];
33
+ // if (parent) parent.children.push(state);
34
+ parent: function(state) {
35
+ if (isDefined(state.parent) && state.parent) return findState(state.parent);
36
+ // regex matches any valid composite state name
37
+ // would match "contact.list" but not "contacts"
38
+ var compositeName = /^(.+)\.[^.]+$/.exec(state.name);
39
+ return compositeName ? findState(compositeName[1]) : root;
40
+ },
41
+
42
+ // inherit 'data' from parent and override by own values (if any)
43
+ data: function(state) {
44
+ if (state.parent && state.parent.data) {
45
+ state.data = state.self.data = extend({}, state.parent.data, state.data);
46
+ }
47
+ return state.data;
48
+ },
49
+
50
+ // Build a URLMatcher if necessary, either via a relative or absolute URL
51
+ url: function(state) {
52
+ var url = state.url;
53
+
54
+ if (isString(url)) {
55
+ if (url.charAt(0) == '^') {
56
+ return $urlMatcherFactory.compile(url.substring(1));
57
+ }
58
+ return (state.parent.navigable || root).url.concat(url);
59
+ }
60
+
61
+ if ($urlMatcherFactory.isMatcher(url) || url == null) {
62
+ return url;
63
+ }
64
+ throw new Error("Invalid url '" + url + "' in state '" + state + "'");
65
+ },
66
+
67
+ // Keep track of the closest ancestor state that has a URL (i.e. is navigable)
68
+ navigable: function(state) {
69
+ return state.url ? state : (state.parent ? state.parent.navigable : null);
70
+ },
71
+
72
+ // Derive parameters for this state and ensure they're a super-set of parent's parameters
73
+ params: function(state) {
74
+ if (!state.params) {
75
+ return state.url ? state.url.parameters() : state.parent.params;
76
+ }
77
+ if (!isArray(state.params)) throw new Error("Invalid params in state '" + state + "'");
78
+ if (state.url) throw new Error("Both params and url specicified in state '" + state + "'");
79
+ return state.params;
80
+ },
81
+
82
+ // If there is no explicit multi-view configuration, make one up so we don't have
83
+ // to handle both cases in the view directive later. Note that having an explicit
84
+ // 'views' property will mean the default unnamed view properties are ignored. This
85
+ // is also a good time to resolve view names to absolute names, so everything is a
86
+ // straight lookup at link time.
87
+ views: function(state) {
88
+ var views = {};
89
+
90
+ forEach(isDefined(state.views) ? state.views : { '': state }, function (view, name) {
91
+ if (name.indexOf('@') < 0) name += '@' + state.parent.name;
92
+ views[name] = view;
93
+ });
94
+ return views;
95
+ },
96
+
97
+ ownParams: function(state) {
98
+ if (!state.parent) {
99
+ return state.params;
100
+ }
101
+ var paramNames = {}; forEach(state.params, function (p) { paramNames[p] = true; });
102
+
103
+ forEach(state.parent.params, function (p) {
104
+ if (!paramNames[p]) {
105
+ throw new Error("Missing required parameter '" + p + "' in state '" + state.name + "'");
106
+ }
107
+ paramNames[p] = false;
108
+ });
109
+ var ownParams = [];
110
+
111
+ forEach(paramNames, function (own, p) {
112
+ if (own) ownParams.push(p);
113
+ });
114
+ return ownParams;
115
+ },
116
+
117
+ // Keep a full path from the root down to this state as this is needed for state activation.
118
+ path: function(state) {
119
+ return state.parent ? state.parent.path.concat(state) : []; // exclude root from path
120
+ },
121
+
122
+ // Speed up $state.contains() as it's used a lot
123
+ includes: function(state) {
124
+ var includes = state.parent ? extend({}, state.parent.includes) : {};
125
+ includes[state.name] = true;
126
+ return includes;
127
+ },
128
+
129
+ $delegates: {}
130
+ };
131
+
132
+ function isRelative(stateName) {
133
+ return stateName.indexOf(".") === 0 || stateName.indexOf("^") === 0;
134
+ }
135
+
136
+ function findState(stateOrName, base) {
137
+ var isStr = isString(stateOrName),
138
+ name = isStr ? stateOrName : stateOrName.name,
139
+ path = isRelative(name);
140
+
141
+ if (path) {
142
+ if (!base) throw new Error("No reference point given for path '" + name + "'");
143
+ var rel = name.split("."), i = 0, pathLength = rel.length, current = base;
144
+
145
+ for (; i < pathLength; i++) {
146
+ if (rel[i] === "" && i === 0) {
147
+ current = base;
148
+ continue;
149
+ }
150
+ if (rel[i] === "^") {
151
+ if (!current.parent) throw new Error("Path '" + name + "' not valid for state '" + base.name + "'");
152
+ current = current.parent;
153
+ continue;
154
+ }
155
+ break;
156
+ }
157
+ rel = rel.slice(i).join(".");
158
+ name = current.name + (current.name && rel ? "." : "") + rel;
159
+ }
160
+ var state = states[name];
161
+
162
+ if (state && (isStr || (!isStr && (state === stateOrName || state.self === stateOrName)))) {
163
+ return state;
164
+ }
165
+ return undefined;
166
+ }
167
+
168
+ function queueState(parentName, state) {
169
+ if (!queue[parentName]) {
170
+ queue[parentName] = [];
171
+ }
172
+ queue[parentName].push(state);
173
+ }
174
+
175
+ function registerState(state) {
176
+ // Wrap a new object around the state so we can store our private details easily.
177
+ state = inherit(state, {
178
+ self: state,
179
+ resolve: state.resolve || {},
180
+ toString: function() { return this.name; }
181
+ });
182
+
183
+ var name = state.name;
184
+ if (!isString(name) || name.indexOf('@') >= 0) throw new Error("State must have a valid name");
185
+ if (states.hasOwnProperty(name)) throw new Error("State '" + name + "'' is already defined");
186
+
187
+ // Get parent name
188
+ var parentName = (name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.'))
189
+ : (isString(state.parent)) ? state.parent
190
+ : '';
191
+
192
+ // If parent is not registered yet, add state to queue and register later
193
+ if (parentName && !states[parentName]) {
194
+ return queueState(parentName, state.self);
195
+ }
196
+
197
+ for (var key in stateBuilder) {
198
+ if (isFunction(stateBuilder[key])) state[key] = stateBuilder[key](state, stateBuilder.$delegates[key]);
199
+ }
200
+ states[name] = state;
201
+
202
+ // Register the state in the global state list and with $urlRouter if necessary.
203
+ if (!state[abstractKey] && state.url) {
204
+ $urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) {
205
+ if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {
206
+ $state.transitionTo(state, $match, { location: false });
207
+ }
208
+ }]);
209
+ }
210
+
211
+ // Register any queued children
212
+ if (queue[name]) {
213
+ for (var i = 0; i < queue[name].length; i++) {
214
+ registerState(queue[name][i]);
215
+ }
216
+ }
217
+
218
+ return state;
219
+ }
220
+
221
+ // Checks text to see if it looks like a glob.
222
+ function isGlob (text) {
223
+ return text.indexOf('*') > -1;
224
+ }
225
+
226
+ // Returns true if glob matches current $state name.
227
+ function doesStateMatchGlob (glob) {
228
+ var globSegments = glob.split('.'),
229
+ segments = $state.$current.name.split('.');
230
+
231
+ //match greedy starts
232
+ if (globSegments[0] === '**') {
233
+ segments = segments.slice(segments.indexOf(globSegments[1]));
234
+ segments.unshift('**');
235
+ }
236
+ //match greedy ends
237
+ if (globSegments[globSegments.length - 1] === '**') {
238
+ segments.splice(segments.indexOf(globSegments[globSegments.length - 2]) + 1, Number.MAX_VALUE);
239
+ segments.push('**');
240
+ }
241
+
242
+ if (globSegments.length != segments.length) {
243
+ return false;
244
+ }
245
+
246
+ //match single stars
247
+ for (var i = 0, l = globSegments.length; i < l; i++) {
248
+ if (globSegments[i] === '*') {
249
+ segments[i] = '*';
250
+ }
251
+ }
252
+
253
+ return segments.join('') === globSegments.join('');
254
+ }
255
+
256
+
257
+ // Implicit root state that is always active
258
+ root = registerState({
259
+ name: '',
260
+ url: '^',
261
+ views: null,
262
+ 'abstract': true
263
+ });
264
+ root.navigable = null;
265
+
266
+
267
+ /**
268
+ * @ngdoc function
269
+ * @name ui.router.state.$stateProvider#decorator
270
+ * @methodOf ui.router.state.$stateProvider
271
+ *
272
+ * @description
273
+ * Allows you to extend (carefully) or override (at your own peril) the
274
+ * `stateBuilder` object used internally by `$stateProvider`. This can be used
275
+ * to add custom functionality to ui-router, for example inferring templateUrl
276
+ * based on the state name.
277
+ *
278
+ * When passing only a name, it returns the current (original or decorated) builder
279
+ * function that matches `name`.
280
+ *
281
+ * The builder functions that can be decorated are listed below. Though not all
282
+ * necessarily have a good use case for decoration, that is up to you to decide.
283
+ *
284
+ * In addition, users can attach custom decorators, which will generate new
285
+ * properties within the state's internal definition. There is currently no clear
286
+ * use-case for this beyond accessing internal states (i.e. $state.$current),
287
+ * however, expect this to become increasingly relevant as we introduce additional
288
+ * meta-programming features.
289
+ *
290
+ * **Warning**: Decorators should not be interdependent because the order of
291
+ * execution of the builder functions in non-deterministic. Builder functions
292
+ * should only be dependent on the state definition object and super function.
293
+ *
294
+ *
295
+ * Existing builder functions and current return values:
296
+ *
297
+ * - **parent** `{object}` - returns the parent state object.
298
+ * - **data** `{object}` - returns state data, including any inherited data that is not
299
+ * overridden by own values (if any).
300
+ * - **url** `{object}` - returns a {link ui.router.util.type:UrlMatcher} or null.
301
+ * - **navigable** `{object}` - returns closest ancestor state that has a URL (aka is
302
+ * navigable).
303
+ * - **params** `{object}` - returns an array of state params that are ensured to
304
+ * be a super-set of parent's params.
305
+ * - **views** `{object}` - returns a views object where each key is an absolute view
306
+ * name (i.e. "viewName@stateName") and each value is the config object
307
+ * (template, controller) for the view. Even when you don't use the views object
308
+ * explicitly on a state config, one is still created for you internally.
309
+ * So by decorating this builder function you have access to decorating template
310
+ * and controller properties.
311
+ * - **ownParams** `{object}` - returns an array of params that belong to the state,
312
+ * not including any params defined by ancestor states.
313
+ * - **path** `{string}` - returns the full path from the root down to this state.
314
+ * Needed for state activation.
315
+ * - **includes** `{object}` - returns an object that includes every state that
316
+ * would pass a '$state.includes()' test.
317
+ *
318
+ * @example
319
+ * <pre>
320
+ * // Override the internal 'views' builder with a function that takes the state
321
+ * // definition, and a reference to the internal function being overridden:
322
+ * $stateProvider.decorator('views', function ($state, parent) {
323
+ * var result = {},
324
+ * views = parent(state);
325
+ *
326
+ * angular.forEach(view, function (config, name) {
327
+ * var autoName = (state.name + '.' + name).replace('.', '/');
328
+ * config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html';
329
+ * result[name] = config;
330
+ * });
331
+ * return result;
332
+ * });
333
+ *
334
+ * $stateProvider.state('home', {
335
+ * views: {
336
+ * 'contact.list': { controller: 'ListController' },
337
+ * 'contact.item': { controller: 'ItemController' }
338
+ * }
339
+ * });
340
+ *
341
+ * // ...
342
+ *
343
+ * $state.go('home');
344
+ * // Auto-populates list and item views with /partials/home/contact/list.html,
345
+ * // and /partials/home/contact/item.html, respectively.
346
+ * </pre>
347
+ *
348
+ * @param {string} name The name of the builder function to decorate.
349
+ * @param {object} func A function that is responsible for decorating the original
350
+ * builder function. The function receives two parameters:
351
+ *
352
+ * - `{object}` - state - The state config object.
353
+ * - `{object}` - super - The original builder function.
354
+ *
355
+ * @return {object} $stateProvider - $stateProvider instance
356
+ */
357
+ this.decorator = decorator;
358
+ function decorator(name, func) {
359
+ /*jshint validthis: true */
360
+ if (isString(name) && !isDefined(func)) {
361
+ return stateBuilder[name];
362
+ }
363
+ if (!isFunction(func) || !isString(name)) {
364
+ return this;
365
+ }
366
+ if (stateBuilder[name] && !stateBuilder.$delegates[name]) {
367
+ stateBuilder.$delegates[name] = stateBuilder[name];
368
+ }
369
+ stateBuilder[name] = func;
370
+ return this;
371
+ }
372
+
373
+ /**
374
+ * @ngdoc function
375
+ * @name ui.router.state.$stateProvider#state
376
+ * @methodOf ui.router.state.$stateProvider
377
+ *
378
+ * @description
379
+ * Registers a state configuration under a given state name. The stateConfig object
380
+ * has the following acceptable properties.
381
+ *
382
+ * <a id='template'></a>
383
+ *
384
+ * - **`template`** - {string|function=} - html template as a string or a function that returns
385
+ * an html template as a string which should be used by the uiView directives. This property
386
+ * takes precedence over templateUrl.
387
+ *
388
+ * If `template` is a function, it will be called with the following parameters:
389
+ *
390
+ * - {array.&lt;object&gt;} - state parameters extracted from the current $location.path() by
391
+ * applying the current state
392
+ *
393
+ * <a id='templateUrl'></a>
394
+ *
395
+ * - **`templateUrl`** - {string|function=} - path or function that returns a path to an html
396
+ * template that should be used by uiView.
397
+ *
398
+ * If `templateUrl` is a function, it will be called with the following parameters:
399
+ *
400
+ * - {array.&lt;object&gt;} - state parameters extracted from the current $location.path() by
401
+ * applying the current state
402
+ *
403
+ * <a id='templateProvider'></a>
404
+ *
405
+ * - **`templateProvider`** - {function=} - Provider function that returns HTML content
406
+ * string.
407
+ *
408
+ * <a id='controller'></a>
409
+ *
410
+ * - **`controller`** - {string|function=} - Controller fn that should be associated with newly
411
+ * related scope or the name of a registered controller if passed as a string.
412
+ *
413
+ * <a id='controllerProvider'></a>
414
+ *
415
+ * - **`controllerProvider`** - {function=} - Injectable provider function that returns
416
+ * the actual controller or string.
417
+ *
418
+ * <a id='controllerAs'></a>
419
+ *
420
+ * - **`controllerAs`** – {string=} – A controller alias name. If present the controller will be
421
+ * published to scope under the controllerAs name.
422
+ *
423
+ * <a id='resolve'></a>
424
+ *
425
+ * - **`resolve`** - {object.&lt;string, function&gt;=} - An optional map of dependencies which
426
+ * should be injected into the controller. If any of these dependencies are promises,
427
+ * the router will wait for them all to be resolved or one to be rejected before the
428
+ * controller is instantiated. If all the promises are resolved successfully, the values
429
+ * of the resolved promises are injected and $stateChangeSuccess event is fired. If any
430
+ * of the promises are rejected the $stateChangeError event is fired. The map object is:
431
+ *
432
+ * - key - {string}: name of dependency to be injected into controller
433
+ * - factory - {string|function}: If string then it is alias for service. Otherwise if function,
434
+ * it is injected and return value it treated as dependency. If result is a promise, it is
435
+ * resolved before its value is injected into controller.
436
+ *
437
+ * <a id='url'></a>
438
+ *
439
+ * - **`url`** - {string=} - A url with optional parameters. When a state is navigated or
440
+ * transitioned to, the `$stateParams` service will be populated with any
441
+ * parameters that were passed.
442
+ *
443
+ * <a id='params'></a>
444
+ *
445
+ * - **`params`** - {object=} - An array of parameter names or regular expressions. Only
446
+ * use this within a state if you are not using url. Otherwise you can specify your
447
+ * parameters within the url. When a state is navigated or transitioned to, the
448
+ * $stateParams service will be populated with any parameters that were passed.
449
+ *
450
+ * <a id='views'></a>
451
+ *
452
+ * - **`views`** - {object=} - Use the views property to set up multiple views or to target views
453
+ * manually/explicitly.
454
+ *
455
+ * <a id='abstract'></a>
456
+ *
457
+ * - **`abstract`** - {boolean=} - An abstract state will never be directly activated,
458
+ * but can provide inherited properties to its common children states.
459
+ *
460
+ * <a id='onEnter'></a>
461
+ *
462
+ * - **`onEnter`** - {object=} - Callback function for when a state is entered. Good way
463
+ * to trigger an action or dispatch an event, such as opening a dialog.
464
+ *
465
+ * <a id='onExit'></a>
466
+ *
467
+ * - **`onExit`** - {object=} - Callback function for when a state is exited. Good way to
468
+ * trigger an action or dispatch an event, such as opening a dialog.
469
+ *
470
+ * <a id='reloadOnSearch'></a>
471
+ *
472
+ * - **`reloadOnSearch = true`** - {boolean=} - If `false`, will not retrigger the same state
473
+ * just because a search/query parameter has changed (via $location.search() or $location.hash()).
474
+ * Useful for when you'd like to modify $location.search() without triggering a reload.
475
+ *
476
+ * <a id='data'></a>
477
+ *
478
+ * - **`data`** - {object=} - Arbitrary data object, useful for custom configuration.
479
+ *
480
+ * @example
481
+ * <pre>
482
+ * // Some state name examples
483
+ *
484
+ * // stateName can be a single top-level name (must be unique).
485
+ * $stateProvider.state("home", {});
486
+ *
487
+ * // Or it can be a nested state name. This state is a child of the
488
+ * // above "home" state.
489
+ * $stateProvider.state("home.newest", {});
490
+ *
491
+ * // Nest states as deeply as needed.
492
+ * $stateProvider.state("home.newest.abc.xyz.inception", {});
493
+ *
494
+ * // state() returns $stateProvider, so you can chain state declarations.
495
+ * $stateProvider
496
+ * .state("home", {})
497
+ * .state("about", {})
498
+ * .state("contacts", {});
499
+ * </pre>
500
+ *
501
+ * @param {string} name A unique state name, e.g. "home", "about", "contacts".
502
+ * To create a parent/child state use a dot, e.g. "about.sales", "home.newest".
503
+ * @param {object} definition State configuration object.
504
+ */
505
+ this.state = state;
506
+ function state(name, definition) {
507
+ /*jshint validthis: true */
508
+ if (isObject(name)) definition = name;
509
+ else definition.name = name;
510
+ registerState(definition);
511
+ return this;
512
+ }
513
+
514
+ /**
515
+ * @ngdoc object
516
+ * @name ui.router.state.$state
517
+ *
518
+ * @requires $rootScope
519
+ * @requires $q
520
+ * @requires ui.router.state.$view
521
+ * @requires $injector
522
+ * @requires ui.router.util.$resolve
523
+ * @requires ui.router.state.$stateParams
524
+ *
525
+ * @property {object} params A param object, e.g. {sectionId: section.id)}, that
526
+ * you'd like to test against the current active state.
527
+ * @property {object} current A reference to the state's config object. However
528
+ * you passed it in. Useful for accessing custom data.
529
+ * @property {object} transition Currently pending transition. A promise that'll
530
+ * resolve or reject.
531
+ *
532
+ * @description
533
+ * `$state` service is responsible for representing states as well as transitioning
534
+ * between them. It also provides interfaces to ask for current state or even states
535
+ * you're coming from.
536
+ */
537
+ // $urlRouter is injected just to ensure it gets instantiated
538
+ this.$get = $get;
539
+ $get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$location', '$urlRouter', '$browser'];
540
+ function $get( $rootScope, $q, $view, $injector, $resolve, $stateParams, $location, $urlRouter, $browser) {
541
+
542
+ var TransitionSuperseded = $q.reject(new Error('transition superseded'));
543
+ var TransitionPrevented = $q.reject(new Error('transition prevented'));
544
+ var TransitionAborted = $q.reject(new Error('transition aborted'));
545
+ var TransitionFailed = $q.reject(new Error('transition failed'));
546
+ var currentLocation = $location.url();
547
+ var baseHref = $browser.baseHref();
548
+
549
+ function syncUrl() {
550
+ if ($location.url() !== currentLocation) {
551
+ $location.url(currentLocation);
552
+ $location.replace();
553
+ }
554
+ }
555
+
556
+ root.locals = { resolve: null, globals: { $stateParams: {} } };
557
+ $state = {
558
+ params: {},
559
+ current: root.self,
560
+ $current: root,
561
+ transition: null
562
+ };
563
+
564
+ /**
565
+ * @ngdoc function
566
+ * @name ui.router.state.$state#reload
567
+ * @methodOf ui.router.state.$state
568
+ *
569
+ * @description
570
+ * A method that force reloads the current state. All resolves are re-resolved, events are not re-fired,
571
+ * and controllers reinstantiated (bug with controllers reinstantiating right now, fixing soon).
572
+ *
573
+ * @example
574
+ * <pre>
575
+ * var app angular.module('app', ['ui.router']);
576
+ *
577
+ * app.controller('ctrl', function ($scope, $state) {
578
+ * $scope.reload = function(){
579
+ * $state.reload();
580
+ * }
581
+ * });
582
+ * </pre>
583
+ *
584
+ * `reload()` is just an alias for:
585
+ * <pre>
586
+ * $state.transitionTo($state.current, $stateParams, {
587
+ * reload: true, inherit: false, notify: false
588
+ * });
589
+ * </pre>
590
+ */
591
+ $state.reload = function reload() {
592
+ $state.transitionTo($state.current, $stateParams, { reload: true, inherit: false, notify: false });
593
+ };
594
+
595
+ /**
596
+ * @ngdoc function
597
+ * @name ui.router.state.$state#go
598
+ * @methodOf ui.router.state.$state
599
+ *
600
+ * @description
601
+ * Convenience method for transitioning to a new state. `$state.go` calls
602
+ * `$state.transitionTo` internally but automatically sets options to
603
+ * `{ location: true, inherit: true, relative: $state.$current, notify: true }`.
604
+ * This allows you to easily use an absolute or relative to path and specify
605
+ * only the parameters you'd like to update (while letting unspecified parameters
606
+ * inherit from the currently active ancestor states).
607
+ *
608
+ * @example
609
+ * <pre>
610
+ * var app = angular.module('app', ['ui.router']);
611
+ *
612
+ * app.controller('ctrl', function ($scope, $state) {
613
+ * $scope.changeState = function () {
614
+ * $state.go('contact.detail');
615
+ * };
616
+ * });
617
+ * </pre>
618
+ * <img src='../ngdoc_assets/StateGoExamples.png'/>
619
+ *
620
+ * @param {string} to Absolute state name or relative state path. Some examples:
621
+ *
622
+ * - `$state.go('contact.detail')` - will go to the `contact.detail` state
623
+ * - `$state.go('^')` - will go to a parent state
624
+ * - `$state.go('^.sibling')` - will go to a sibling state
625
+ * - `$state.go('.child.grandchild')` - will go to grandchild state
626
+ *
627
+ * @param {object=} params A map of the parameters that will be sent to the state,
628
+ * will populate $stateParams. Any parameters that are not specified will be inherited from currently
629
+ * defined parameters. This allows, for example, going to a sibling state that shares parameters
630
+ * specified in a parent state. Parameter inheritance only works between common ancestor states, I.e.
631
+ * transitioning to a sibling will get you the parameters for all parents, transitioning to a child
632
+ * will get you all current parameters, etc.
633
+ * @param {object=} options Options object. The options are:
634
+ *
635
+ * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`
636
+ * will not. If string, must be `"replace"`, which will update url and also replace last history record.
637
+ * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url.
638
+ * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'),
639
+ * defines which state to be relative from.
640
+ * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.
641
+ * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params
642
+ * have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd
643
+ * use this when you want to force a reload when *everything* is the same, including search params.
644
+ *
645
+ * @returns {promise} A promise representing the state of the new transition.
646
+ *
647
+ * Possible success values:
648
+ *
649
+ * - $state.current
650
+ *
651
+ * <br/>Possible rejection values:
652
+ *
653
+ * - 'transition superseded' - when a newer transition has been started after this one
654
+ * - 'transition prevented' - when `event.preventDefault()` has been called in a `$stateChangeStart` listener
655
+ * - 'transition aborted' - when `event.preventDefault()` has been called in a `$stateNotFound` listener or
656
+ * when a `$stateNotFound` `event.retry` promise errors.
657
+ * - 'transition failed' - when a state has been unsuccessfully found after 2 tries.
658
+ * - *resolve error* - when an error has occurred with a `resolve`
659
+ *
660
+ */
661
+ $state.go = function go(to, params, options) {
662
+ return this.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options));
663
+ };
664
+
665
+ /**
666
+ * @ngdoc function
667
+ * @name ui.router.state.$state#transitionTo
668
+ * @methodOf ui.router.state.$state
669
+ *
670
+ * @description
671
+ * Low-level method for transitioning to a new state. {@link ui.router.state.$state#methods_go $state.go}
672
+ * uses `transitionTo` internally. `$state.go` is recommended in most situations.
673
+ *
674
+ * @example
675
+ * <pre>
676
+ * var app = angular.module('app', ['ui.router']);
677
+ *
678
+ * app.controller('ctrl', function ($scope, $state) {
679
+ * $scope.changeState = function () {
680
+ * $state.transitionTo('contact.detail');
681
+ * };
682
+ * });
683
+ * </pre>
684
+ *
685
+ * @param {string} to State name.
686
+ * @param {object=} toParams A map of the parameters that will be sent to the state,
687
+ * will populate $stateParams.
688
+ * @param {object=} options Options object. The options are:
689
+ *
690
+ * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`
691
+ * will not. If string, must be `"replace"`, which will update url and also replace last history record.
692
+ * - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url.
693
+ * - **`relative`** - {object=}, When transitioning with relative path (e.g '^'),
694
+ * defines which state to be relative from.
695
+ * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.
696
+ * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params
697
+ * have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd
698
+ * use this when you want to force a reload when *everything* is the same, including search params.
699
+ *
700
+ * @returns {promise} A promise representing the state of the new transition. See
701
+ * {@link ui.router.state.$state#methods_go $state.go}.
702
+ */
703
+ $state.transitionTo = function transitionTo(to, toParams, options) {
704
+ toParams = toParams || {};
705
+ options = extend({
706
+ location: true, inherit: false, relative: null, notify: true, reload: false, $retry: false
707
+ }, options || {});
708
+
709
+ var from = $state.$current, fromParams = $state.params, fromPath = from.path;
710
+ var evt, toState = findState(to, options.relative);
711
+
712
+ if (!isDefined(toState)) {
713
+ // Broadcast not found event and abort the transition if prevented
714
+ var redirect = { to: to, toParams: toParams, options: options };
715
+
716
+ /**
717
+ * @ngdoc event
718
+ * @name ui.router.state.$state#$stateNotFound
719
+ * @eventOf ui.router.state.$state
720
+ * @eventType broadcast on root scope
721
+ * @description
722
+ * Fired when a requested state **cannot be found** using the provided state name during transition.
723
+ * The event is broadcast allowing any handlers a single chance to deal with the error (usually by
724
+ * lazy-loading the unfound state). A special `unfoundState` object is passed to the listener handler,
725
+ * you can see its three properties in the example. You can use `event.preventDefault()` to abort the
726
+ * transition and the promise returned from `go` will be rejected with a `'transition aborted'` value.
727
+ *
728
+ * @param {Object} event Event object.
729
+ * @param {Object} unfoundState Unfound State information. Contains: `to, toParams, options` properties.
730
+ * @param {State} fromState Current state object.
731
+ * @param {Object} fromParams Current state params.
732
+ *
733
+ * @example
734
+ *
735
+ * <pre>
736
+ * // somewhere, assume lazy.state has not been defined
737
+ * $state.go("lazy.state", {a:1, b:2}, {inherit:false});
738
+ *
739
+ * // somewhere else
740
+ * $scope.$on('$stateNotFound',
741
+ * function(event, unfoundState, fromState, fromParams){
742
+ * console.log(unfoundState.to); // "lazy.state"
743
+ * console.log(unfoundState.toParams); // {a:1, b:2}
744
+ * console.log(unfoundState.options); // {inherit:false} + default options
745
+ * })
746
+ * </pre>
747
+ */
748
+ evt = $rootScope.$broadcast('$stateNotFound', redirect, from.self, fromParams);
749
+ if (evt.defaultPrevented) {
750
+ syncUrl();
751
+ return TransitionAborted;
752
+ }
753
+
754
+ // Allow the handler to return a promise to defer state lookup retry
755
+ if (evt.retry) {
756
+ if (options.$retry) {
757
+ syncUrl();
758
+ return TransitionFailed;
759
+ }
760
+ var retryTransition = $state.transition = $q.when(evt.retry);
761
+ retryTransition.then(function() {
762
+ if (retryTransition !== $state.transition) return TransitionSuperseded;
763
+ redirect.options.$retry = true;
764
+ return $state.transitionTo(redirect.to, redirect.toParams, redirect.options);
765
+ }, function() {
766
+ return TransitionAborted;
767
+ });
768
+ syncUrl();
769
+ return retryTransition;
770
+ }
771
+
772
+ // Always retry once if the $stateNotFound was not prevented
773
+ // (handles either redirect changed or state lazy-definition)
774
+ to = redirect.to;
775
+ toParams = redirect.toParams;
776
+ options = redirect.options;
777
+ toState = findState(to, options.relative);
778
+ if (!isDefined(toState)) {
779
+ if (options.relative) throw new Error("Could not resolve '" + to + "' from state '" + options.relative + "'");
780
+ throw new Error("No such state '" + to + "'");
781
+ }
782
+ }
783
+ if (toState[abstractKey]) throw new Error("Cannot transition to abstract state '" + to + "'");
784
+ if (options.inherit) toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState);
785
+ to = toState;
786
+
787
+ var toPath = to.path;
788
+
789
+ // Starting from the root of the path, keep all levels that haven't changed
790
+ var keep, state, locals = root.locals, toLocals = [];
791
+ for (keep = 0, state = toPath[keep];
792
+ state && state === fromPath[keep] && equalForKeys(toParams, fromParams, state.ownParams) && !options.reload;
793
+ keep++, state = toPath[keep]) {
794
+ locals = toLocals[keep] = state.locals;
795
+ }
796
+
797
+ // If we're going to the same state and all locals are kept, we've got nothing to do.
798
+ // But clear 'transition', as we still want to cancel any other pending transitions.
799
+ // TODO: We may not want to bump 'transition' if we're called from a location change that we've initiated ourselves,
800
+ // because we might accidentally abort a legitimate transition initiated from code?
801
+ if (shouldTriggerReload(to, from, locals, options) ) {
802
+ if ( to.self.reloadOnSearch !== false )
803
+ syncUrl();
804
+ $state.transition = null;
805
+ return $q.when($state.current);
806
+ }
807
+
808
+ // Normalize/filter parameters before we pass them to event handlers etc.
809
+ toParams = normalize(to.params, toParams || {});
810
+
811
+ // Broadcast start event and cancel the transition if requested
812
+ if (options.notify) {
813
+ /**
814
+ * @ngdoc event
815
+ * @name ui.router.state.$state#$stateChangeStart
816
+ * @eventOf ui.router.state.$state
817
+ * @eventType broadcast on root scope
818
+ * @description
819
+ * Fired when the state transition **begins**. You can use `event.preventDefault()`
820
+ * to prevent the transition from happening and then the transition promise will be
821
+ * rejected with a `'transition prevented'` value.
822
+ *
823
+ * @param {Object} event Event object.
824
+ * @param {State} toState The state being transitioned to.
825
+ * @param {Object} toParams The params supplied to the `toState`.
826
+ * @param {State} fromState The current state, pre-transition.
827
+ * @param {Object} fromParams The params supplied to the `fromState`.
828
+ *
829
+ * @example
830
+ *
831
+ * <pre>
832
+ * $rootScope.$on('$stateChangeStart',
833
+ * function(event, toState, toParams, fromState, fromParams){
834
+ * event.preventDefault();
835
+ * // transitionTo() promise will be rejected with
836
+ * // a 'transition prevented' error
837
+ * })
838
+ * </pre>
839
+ */
840
+ evt = $rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams);
841
+ if (evt.defaultPrevented) {
842
+ syncUrl();
843
+ return TransitionPrevented;
844
+ }
845
+ }
846
+
847
+ // Resolve locals for the remaining states, but don't update any global state just
848
+ // yet -- if anything fails to resolve the current state needs to remain untouched.
849
+ // We also set up an inheritance chain for the locals here. This allows the view directive
850
+ // to quickly look up the correct definition for each view in the current state. Even
851
+ // though we create the locals object itself outside resolveState(), it is initially
852
+ // empty and gets filled asynchronously. We need to keep track of the promise for the
853
+ // (fully resolved) current locals, and pass this down the chain.
854
+ var resolved = $q.when(locals);
855
+ for (var l=keep; l<toPath.length; l++, state=toPath[l]) {
856
+ locals = toLocals[l] = inherit(locals);
857
+ resolved = resolveState(state, toParams, state===to, resolved, locals);
858
+ }
859
+
860
+ // Once everything is resolved, we are ready to perform the actual transition
861
+ // and return a promise for the new state. We also keep track of what the
862
+ // current promise is, so that we can detect overlapping transitions and
863
+ // keep only the outcome of the last transition.
864
+ var transition = $state.transition = resolved.then(function () {
865
+ var l, entering, exiting;
866
+
867
+ if ($state.transition !== transition) return TransitionSuperseded;
868
+
869
+ // Exit 'from' states not kept
870
+ for (l=fromPath.length-1; l>=keep; l--) {
871
+ exiting = fromPath[l];
872
+ if (exiting.self.onExit) {
873
+ $injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals);
874
+ }
875
+ exiting.locals = null;
876
+ }
877
+
878
+ // Enter 'to' states not kept
879
+ for (l=keep; l<toPath.length; l++) {
880
+ entering = toPath[l];
881
+ entering.locals = toLocals[l];
882
+ if (entering.self.onEnter) {
883
+ $injector.invoke(entering.self.onEnter, entering.self, entering.locals.globals);
884
+ }
885
+ }
886
+
887
+ // Run it again, to catch any transitions in callbacks
888
+ if ($state.transition !== transition) return TransitionSuperseded;
889
+
890
+ // Update globals in $state
891
+ $state.$current = to;
892
+ $state.current = to.self;
893
+ $state.params = toParams;
894
+ copy($state.params, $stateParams);
895
+ $state.transition = null;
896
+
897
+ // Update $location
898
+ var toNav = to.navigable;
899
+ if (options.location && toNav) {
900
+ $location.url(toNav.url.format(toNav.locals.globals.$stateParams));
901
+
902
+ if (options.location === 'replace') {
903
+ $location.replace();
904
+ }
905
+ }
906
+
907
+ if (options.notify) {
908
+ /**
909
+ * @ngdoc event
910
+ * @name ui.router.state.$state#$stateChangeSuccess
911
+ * @eventOf ui.router.state.$state
912
+ * @eventType broadcast on root scope
913
+ * @description
914
+ * Fired once the state transition is **complete**.
915
+ *
916
+ * @param {Object} event Event object.
917
+ * @param {State} toState The state being transitioned to.
918
+ * @param {Object} toParams The params supplied to the `toState`.
919
+ * @param {State} fromState The current state, pre-transition.
920
+ * @param {Object} fromParams The params supplied to the `fromState`.
921
+ */
922
+ $rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams);
923
+ }
924
+ currentLocation = $location.url();
925
+
926
+ return $state.current;
927
+ }, function (error) {
928
+ if ($state.transition !== transition) return TransitionSuperseded;
929
+
930
+ $state.transition = null;
931
+ /**
932
+ * @ngdoc event
933
+ * @name ui.router.state.$state#$stateChangeError
934
+ * @eventOf ui.router.state.$state
935
+ * @eventType broadcast on root scope
936
+ * @description
937
+ * Fired when an **error occurs** during transition. It's important to note that if you
938
+ * have any errors in your resolve functions (javascript errors, non-existent services, etc)
939
+ * they will not throw traditionally. You must listen for this $stateChangeError event to
940
+ * catch **ALL** errors.
941
+ *
942
+ * @param {Object} event Event object.
943
+ * @param {State} toState The state being transitioned to.
944
+ * @param {Object} toParams The params supplied to the `toState`.
945
+ * @param {State} fromState The current state, pre-transition.
946
+ * @param {Object} fromParams The params supplied to the `fromState`.
947
+ * @param {Error} error The resolve error object.
948
+ */
949
+ $rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error);
950
+ syncUrl();
951
+
952
+ return $q.reject(error);
953
+ });
954
+
955
+ return transition;
956
+ };
957
+
958
+ /**
959
+ * @ngdoc function
960
+ * @name ui.router.state.$state#is
961
+ * @methodOf ui.router.state.$state
962
+ *
963
+ * @description
964
+ * Similar to {@link ui.router.state.$state#methods_includes $state.includes},
965
+ * but only checks for the full state name. If params is supplied then it will be
966
+ * tested for strict equality against the current active params object, so all params
967
+ * must match with none missing and no extras.
968
+ *
969
+ * @example
970
+ * <pre>
971
+ * $state.is('contact.details.item'); // returns true
972
+ * $state.is(contactDetailItemStateObject); // returns true
973
+ *
974
+ * // everything else would return false
975
+ * </pre>
976
+ *
977
+ * @param {string|object} stateName The state name or state object you'd like to check.
978
+ * @param {object=} params A param object, e.g. `{sectionId: section.id}`, that you'd like
979
+ * to test against the current active state.
980
+ * @returns {boolean} Returns true if it is the state.
981
+ */
982
+ $state.is = function is(stateOrName, params) {
983
+ var state = findState(stateOrName);
984
+
985
+ if (!isDefined(state)) {
986
+ return undefined;
987
+ }
988
+
989
+ if ($state.$current !== state) {
990
+ return false;
991
+ }
992
+
993
+ return isDefined(params) && params !== null ? angular.equals($stateParams, params) : true;
994
+ };
995
+
996
+ /**
997
+ * @ngdoc function
998
+ * @name ui.router.state.$state#includes
999
+ * @methodOf ui.router.state.$state
1000
+ *
1001
+ * @description
1002
+ * A method to determine if the current active state is equal to or is the child of the
1003
+ * state stateName. If any params are passed then they will be tested for a match as well.
1004
+ * Not all the parameters need to be passed, just the ones you'd like to test for equality.
1005
+ *
1006
+ * @example
1007
+ * <pre>
1008
+ * $state.$current.name = 'contacts.details.item';
1009
+ *
1010
+ * $state.includes("contacts"); // returns true
1011
+ * $state.includes("contacts.details"); // returns true
1012
+ * $state.includes("contacts.details.item"); // returns true
1013
+ * $state.includes("contacts.list"); // returns false
1014
+ * $state.includes("about"); // returns false
1015
+ * </pre>
1016
+ *
1017
+ * @description
1018
+ * Basic globing patterns will also work.
1019
+ *
1020
+ * @example
1021
+ * <pre>
1022
+ * $state.$current.name = 'contacts.details.item.url';
1023
+ *
1024
+ * $state.includes("*.details.*.*"); // returns true
1025
+ * $state.includes("*.details.**"); // returns true
1026
+ * $state.includes("**.item.**"); // returns true
1027
+ * $state.includes("*.details.item.url"); // returns true
1028
+ * $state.includes("*.details.*.url"); // returns true
1029
+ * $state.includes("*.details.*"); // returns false
1030
+ * $state.includes("item.**"); // returns false
1031
+ * </pre>
1032
+ *
1033
+ * @param {string} stateOrName A partial name to be searched for within the current state name.
1034
+ * @param {object} params A param object, e.g. `{sectionId: section.id}`,
1035
+ * that you'd like to test against the current active state.
1036
+ * @returns {boolean} Returns true if it does include the state
1037
+ */
1038
+
1039
+ $state.includes = function includes(stateOrName, params) {
1040
+ if (isString(stateOrName) && isGlob(stateOrName)) {
1041
+ if (doesStateMatchGlob(stateOrName)) {
1042
+ stateOrName = $state.$current.name;
1043
+ } else {
1044
+ return false;
1045
+ }
1046
+ }
1047
+
1048
+ var state = findState(stateOrName);
1049
+ if (!isDefined(state)) {
1050
+ return undefined;
1051
+ }
1052
+
1053
+ if (!isDefined($state.$current.includes[state.name])) {
1054
+ return false;
1055
+ }
1056
+
1057
+ var validParams = true;
1058
+ angular.forEach(params, function(value, key) {
1059
+ if (!isDefined($stateParams[key]) || $stateParams[key] !== value) {
1060
+ validParams = false;
1061
+ }
1062
+ });
1063
+ return validParams;
1064
+ };
1065
+
1066
+
1067
+ /**
1068
+ * @ngdoc function
1069
+ * @name ui.router.state.$state#href
1070
+ * @methodOf ui.router.state.$state
1071
+ *
1072
+ * @description
1073
+ * A url generation method that returns the compiled url for the given state populated with the given params.
1074
+ *
1075
+ * @example
1076
+ * <pre>
1077
+ * expect($state.href("about.person", { person: "bob" })).toEqual("/about/bob");
1078
+ * </pre>
1079
+ *
1080
+ * @param {string|object} stateOrName The state name or state object you'd like to generate a url from.
1081
+ * @param {object=} params An object of parameter values to fill the state's required parameters.
1082
+ * @param {object=} options Options object. The options are:
1083
+ *
1084
+ * - **`lossy`** - {boolean=true} - If true, and if there is no url associated with the state provided in the
1085
+ * first parameter, then the constructed href url will be built from the first navigable ancestor (aka
1086
+ * ancestor with a valid url).
1087
+ * - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url.
1088
+ * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'),
1089
+ * defines which state to be relative from.
1090
+ * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl".
1091
+ *
1092
+ * @returns {string} compiled state url
1093
+ */
1094
+ $state.href = function href(stateOrName, params, options) {
1095
+ options = extend({ lossy: true, inherit: false, absolute: false, relative: $state.$current }, options || {});
1096
+ var state = findState(stateOrName, options.relative);
1097
+ if (!isDefined(state)) return null;
1098
+
1099
+ params = inheritParams($stateParams, params || {}, $state.$current, state);
1100
+ var nav = (state && options.lossy) ? state.navigable : state;
1101
+ var url = (nav && nav.url) ? nav.url.format(normalize(state.params, params || {})) : null;
1102
+ if (!$locationProvider.html5Mode() && url) {
1103
+ url = "#" + $locationProvider.hashPrefix() + url;
1104
+ }
1105
+
1106
+ if (baseHref !== '/') {
1107
+ if ($locationProvider.html5Mode()) {
1108
+ url = baseHref.slice(0, -1) + url;
1109
+ } else if (options.absolute){
1110
+ url = baseHref.slice(1) + url;
1111
+ }
1112
+ }
1113
+
1114
+ if (options.absolute && url) {
1115
+ url = $location.protocol() + '://' +
1116
+ $location.host() +
1117
+ ($location.port() == 80 || $location.port() == 443 ? '' : ':' + $location.port()) +
1118
+ (!$locationProvider.html5Mode() && url ? '/' : '') +
1119
+ url;
1120
+ }
1121
+ return url;
1122
+ };
1123
+
1124
+ /**
1125
+ * @ngdoc function
1126
+ * @name ui.router.state.$state#get
1127
+ * @methodOf ui.router.state.$state
1128
+ *
1129
+ * @description
1130
+ * Returns the state configuration object for any specific state or all states.
1131
+ *
1132
+ * @param {string|object=} stateOrName If provided, will only get the config for
1133
+ * the requested state. If not provided, returns an array of ALL state configs.
1134
+ * @returns {object|array} State configuration object or array of all objects.
1135
+ */
1136
+ $state.get = function (stateOrName, context) {
1137
+ if (!isDefined(stateOrName)) {
1138
+ var list = [];
1139
+ forEach(states, function(state) { list.push(state.self); });
1140
+ return list;
1141
+ }
1142
+ var state = findState(stateOrName, context);
1143
+ return (state && state.self) ? state.self : null;
1144
+ };
1145
+
1146
+ function resolveState(state, params, paramsAreFiltered, inherited, dst) {
1147
+ // Make a restricted $stateParams with only the parameters that apply to this state if
1148
+ // necessary. In addition to being available to the controller and onEnter/onExit callbacks,
1149
+ // we also need $stateParams to be available for any $injector calls we make during the
1150
+ // dependency resolution process.
1151
+ var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params, params);
1152
+ var locals = { $stateParams: $stateParams };
1153
+
1154
+ // Resolve 'global' dependencies for the state, i.e. those not specific to a view.
1155
+ // We're also including $stateParams in this; that way the parameters are restricted
1156
+ // to the set that should be visible to the state, and are independent of when we update
1157
+ // the global $state and $stateParams values.
1158
+ dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state);
1159
+ var promises = [ dst.resolve.then(function (globals) {
1160
+ dst.globals = globals;
1161
+ }) ];
1162
+ if (inherited) promises.push(inherited);
1163
+
1164
+ // Resolve template and dependencies for all views.
1165
+ forEach(state.views, function (view, name) {
1166
+ var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {});
1167
+ injectables.$template = [ function () {
1168
+ return $view.load(name, { view: view, locals: locals, params: $stateParams, notify: false }) || '';
1169
+ }];
1170
+
1171
+ promises.push($resolve.resolve(injectables, locals, dst.resolve, state).then(function (result) {
1172
+ // References to the controller (only instantiated at link time)
1173
+ if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) {
1174
+ var injectLocals = angular.extend({}, injectables, locals);
1175
+ result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals);
1176
+ } else {
1177
+ result.$$controller = view.controller;
1178
+ }
1179
+ // Provide access to the state itself for internal use
1180
+ result.$$state = state;
1181
+ result.$$controllerAs = view.controllerAs;
1182
+ dst[name] = result;
1183
+ }));
1184
+ });
1185
+
1186
+ // Wait for all the promises and then return the activation object
1187
+ return $q.all(promises).then(function (values) {
1188
+ return dst;
1189
+ });
1190
+ }
1191
+
1192
+ return $state;
1193
+ }
1194
+
1195
+ function shouldTriggerReload(to, from, locals, options) {
1196
+ if ( to === from && ((locals === from.locals && !options.reload) || (to.self.reloadOnSearch === false)) ) {
1197
+ return true;
1198
+ }
1199
+ }
1200
+ }
1201
+
1202
+ angular.module('ui.router.state')
1203
+ .value('$stateParams', {})
1204
+ .provider('$state', $StateProvider);