@angular-wave/angular.ts 0.9.4 → 0.9.6
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.
- package/@types/index.d.ts +1 -84
- package/{src/index.ts → @types/namespace.d.ts} +4 -24
- package/@types/router/template-factory.d.ts +2 -2
- package/dist/angular-ts.esm.js +3 -3
- package/dist/angular-ts.umd.js +3 -3
- package/dist/angular-ts.umd.min.js +1 -1
- package/package.json +9 -2
- package/.github/workflows/ci.yml +0 -104
- package/.github/workflows/gh-pages.yml +0 -75
- package/.husky/pre-commit +0 -5
- package/.prettierignore +0 -9
- package/CHANGELOG.md +0 -17667
- package/CODE_OF_CONDUCT.md +0 -3
- package/CONTRIBUTING.md +0 -247
- package/DEVELOPERS.md +0 -499
- package/Makefile +0 -60
- package/RELEASE.md +0 -86
- package/TRIAGING.md +0 -127
- package/docs/.cspell.yml +0 -8
- package/docs/.github/dependabot.yml +0 -14
- package/docs/.nvmrc +0 -1
- package/docs/CONTRIBUTING.md +0 -28
- package/docs/Dockerfile +0 -4
- package/docs/LICENSE +0 -201
- package/docs/README.md +0 -217
- package/docs/assets/icons/logo.svg +0 -1
- package/docs/assets/scss/_variables_project.scss +0 -12
- package/docs/assets/scss/_variables_project_after_bs.scss +0 -8
- package/docs/assets/scss/index.scss +0 -48
- package/docs/config.yaml +0 -15
- package/docs/content/_index.md +0 -28
- package/docs/content/docs/_index.md +0 -61
- package/docs/content/docs/directive/_index.md +0 -4
- package/docs/content/docs/directive/app.md +0 -11
- package/docs/content/docs/directive/aria.md +0 -0
- package/docs/content/docs/directive/bind.md +0 -72
- package/docs/content/docs/directive/blur.md +0 -38
- package/docs/content/docs/directive/channel.md +0 -37
- package/docs/content/docs/directive/class-even.md +0 -47
- package/docs/content/docs/directive/class-odd.md +0 -48
- package/docs/content/docs/directive/class.md +0 -64
- package/docs/content/docs/directive/click.md +0 -41
- package/docs/content/docs/directive/cloak.md +0 -74
- package/docs/content/docs/directive/copy.md +0 -38
- package/docs/content/docs/directive/cut.md +0 -40
- package/docs/content/docs/directive/dblclick.md +0 -41
- package/docs/content/docs/directive/focus.md +0 -38
- package/docs/content/docs/directive/get.md +0 -203
- package/docs/content/docs/directive/include.md +0 -7
- package/docs/content/docs/directive/keydown.md +0 -38
- package/docs/content/docs/directive/keyup.md +0 -38
- package/docs/content/docs/directive/load.md +0 -43
- package/docs/content/docs/directive/mousedown.md +0 -38
- package/docs/content/docs/directive/mouseenter.md +0 -38
- package/docs/content/docs/directive/mouseleave.md +0 -38
- package/docs/content/docs/directive/mousemove.md +0 -38
- package/docs/content/docs/directive/mouseout.md +0 -38
- package/docs/content/docs/directive/mouseover.md +0 -38
- package/docs/content/docs/directive/mouseup.md +0 -38
- package/docs/content/docs/directive/non-bindable.md +0 -28
- package/docs/content/docs/filter/_index.md +0 -4
- package/docs/content/docs/filter/filter.md +0 -78
- package/docs/content/docs/filter/json.md +0 -19
- package/docs/content/docs/filter/limit-to.md +0 -30
- package/docs/content/docs/filter/order-by.md +0 -123
- package/docs/content/docs/provider/_index.md +0 -4
- package/docs/content/docs/provider/eventBusProvider.md +0 -35
- package/docs/content/docs/provider/locationProvider.md +0 -26
- package/docs/content/docs/provider/logProvider.md +0 -59
- package/docs/content/docs/provider/sceProvider.md +0 -194
- package/docs/content/docs/provider/templateCacheProvider.md +0 -100
- package/docs/content/docs/provider/templateRequestProvider.md +0 -5
- package/docs/content/docs/service/_index.md +0 -4
- package/docs/content/docs/service/compile.md +0 -5
- package/docs/content/docs/service/controller.md +0 -5
- package/docs/content/docs/service/eventBus.md +0 -56
- package/docs/content/docs/service/http.md +0 -161
- package/docs/content/docs/service/interpolation.md +0 -5
- package/docs/content/docs/service/location.md +0 -57
- package/docs/content/docs/service/log.md +0 -113
- package/docs/content/docs/service/parse.md +0 -5
- package/docs/content/docs/service/rootElement.md +0 -5
- package/docs/content/docs/service/rootScope.md +0 -5
- package/docs/content/docs/service/sce.md +0 -194
- package/docs/content/docs/service/templateCache.md +0 -64
- package/docs/content/docs/service/templateRequest.md +0 -5
- package/docs/content/docs/service/url.md +0 -5
- package/docs/content/docs/values/_index.md +0 -4
- package/docs/content/docs/values/document.md +0 -29
- package/docs/content/docs/values/window.md +0 -29
- package/docs/docker-compose.yaml +0 -12
- package/docs/docsy.work +0 -5
- package/docs/docsy.work.sum +0 -0
- package/docs/go.mod +0 -5
- package/docs/go.sum +0 -6
- package/docs/hugo-disabled.toml +0 -220
- package/docs/hugo.yaml +0 -200
- package/docs/layouts/404.html +0 -13
- package/docs/layouts/_markup/render-heading.html +0 -1
- package/docs/layouts/partials/hooks/head-end.html +0 -3
- package/docs/layouts/shortcodes/showcss.html +0 -2
- package/docs/layouts/shortcodes/showhtml.html +0 -2
- package/docs/layouts/shortcodes/showjs.html +0 -2
- package/docs/layouts/shortcodes/showraw.html +0 -1
- package/docs/layouts/shortcodes/version.html +0 -1
- package/docs/package-lock.json +0 -2293
- package/docs/package.json +0 -53
- package/docs/static/examples/counter/counter-test.html +0 -13
- package/docs/static/examples/counter/counter.html +0 -5
- package/docs/static/examples/counter/counter.test.js +0 -28
- package/docs/static/examples/document/document.html +0 -3
- package/docs/static/examples/eventbus/eventbus-test.html +0 -15
- package/docs/static/examples/eventbus/eventbus.html +0 -13
- package/docs/static/examples/eventbus/eventbus.js +0 -15
- package/docs/static/examples/eventbus/eventbus.test.js +0 -19
- package/docs/static/examples/i18n/i18n.html +0 -77
- package/docs/static/examples/ng-bind/ng-bind.html +0 -9
- package/docs/static/examples/ng-blur/ng-blur.html +0 -9
- package/docs/static/examples/ng-channel/ng-channel-test.html +0 -17
- package/docs/static/examples/ng-channel/ng-channel.html +0 -24
- package/docs/static/examples/ng-channel/ng-channel.test.js +0 -31
- package/docs/static/examples/ng-class/ng-class.html +0 -71
- package/docs/static/examples/ng-class-even/ng-class-even.html +0 -8
- package/docs/static/examples/ng-class-odd/ng-class-odd.html +0 -8
- package/docs/static/examples/ng-click/ng-click.html +0 -6
- package/docs/static/examples/ng-copy/ng-copy.html +0 -6
- package/docs/static/examples/ng-cut/ng-cut.html +0 -6
- package/docs/static/examples/ng-dblclick/ng-dblclick.html +0 -10
- package/docs/static/examples/ng-focus/ng-focus.html +0 -9
- package/docs/static/examples/ng-keydown/ng-keydown.html +0 -9
- package/docs/static/examples/ng-keyup/ng-keyup.html +0 -9
- package/docs/static/examples/ng-load/ng-load.html +0 -8
- package/docs/static/examples/ng-mousedown/ng-mousedown.html +0 -6
- package/docs/static/examples/ng-mouseenter/ng-mouseenter.html +0 -4
- package/docs/static/examples/ng-mouseleave/ng-mouseleave.html +0 -4
- package/docs/static/examples/ng-mousemove/ng-mousemove.html +0 -4
- package/docs/static/examples/ng-mouseout/ng-mouseout.html +0 -4
- package/docs/static/examples/ng-mouseover/ng-mouseover.html +0 -4
- package/docs/static/examples/ng-mouseup/ng-mouseup.html +0 -4
- package/docs/static/examples/ng-non-bindable/ng-non-bindable-test.html +0 -13
- package/docs/static/examples/ng-non-bindable/ng-non-bindable.html +0 -3
- package/docs/static/examples/ng-non-bindable/ng-non-bindable.test.js +0 -11
- package/docs/static/examples/window/window.html +0 -4
- package/docs/static/typedoc/.nojekyll +0 -1
- package/docs/static/typedoc/assets/hierarchy.js +0 -1
- package/docs/static/typedoc/assets/highlight.css +0 -29
- package/docs/static/typedoc/assets/icons.js +0 -18
- package/docs/static/typedoc/assets/icons.svg +0 -1
- package/docs/static/typedoc/assets/main.js +0 -60
- package/docs/static/typedoc/assets/navigation.js +0 -1
- package/docs/static/typedoc/assets/search.js +0 -1
- package/docs/static/typedoc/assets/style.css +0 -1633
- package/docs/static/typedoc/classes/Location.html +0 -55
- package/docs/static/typedoc/classes/LocationProvider.html +0 -20
- package/docs/static/typedoc/classes/LogProvider.html +0 -6
- package/docs/static/typedoc/classes/PubSub.html +0 -71
- package/docs/static/typedoc/classes/PubSubProvider.html +0 -4
- package/docs/static/typedoc/classes/TemplateCacheProvider.html +0 -5
- package/docs/static/typedoc/hierarchy.html +0 -1
- package/docs/static/typedoc/index.html +0 -1
- package/docs/static/typedoc/interfaces/DefaultPorts.html +0 -5
- package/docs/static/typedoc/interfaces/Html5Mode.html +0 -23
- package/docs/static/typedoc/interfaces/HttpHeadersGetter.html +0 -1
- package/docs/static/typedoc/interfaces/HttpProviderDefaults.html +0 -31
- package/docs/static/typedoc/interfaces/HttpRequestConfigHeaders.html +0 -6
- package/docs/static/typedoc/interfaces/HttpRequestTransformer.html +0 -1
- package/docs/static/typedoc/interfaces/HttpResponse.html +0 -7
- package/docs/static/typedoc/interfaces/HttpResponseTransformer.html +0 -1
- package/docs/static/typedoc/interfaces/HttpService.html +0 -38
- package/docs/static/typedoc/interfaces/LogService.html +0 -12
- package/docs/static/typedoc/interfaces/RequestConfig.html +0 -48
- package/docs/static/typedoc/interfaces/RequestShortcutConfig.html +0 -38
- package/docs/static/typedoc/interfaces/ServiceProvider.html +0 -5
- package/docs/static/typedoc/interfaces/UrlParts.html +0 -9
- package/docs/static/typedoc/types/HttpParamSerializer.html +0 -2
- package/docs/static/typedoc/types/HttpParams.html +0 -2
- package/docs/static/typedoc/types/HttpPromise.html +0 -1
- package/docs/static/typedoc/types/HttpResponseStatus.html +0 -1
- package/docs/static/typedoc/types/LogCall.html +0 -2
- package/docs/static/typedoc/types/LogServiceFactory.html +0 -2
- package/docs/static/typedoc/types/UrlChangeListener.html +0 -5
- package/docs/static/typedoc/variables/EventBus.html +0 -1
- package/docs/static/version.js +0 -13
- package/docs/test-results/.last-run.json +0 -4
- package/docs/test-results/static-examples-counter-counter-counter-example/error-context.md +0 -50
- package/eslint.config.js +0 -26
- package/images/android-chrome-192x192.png +0 -0
- package/images/android-chrome-512x512.png +0 -0
- package/images/apple-touch-icon.png +0 -0
- package/images/favicon-16x16.png +0 -0
- package/images/favicon-32x32.png +0 -0
- package/images/favicon.ico +0 -0
- package/images/site.webmanifest +0 -19
- package/index.html +0 -86
- package/legacy.d.ts +0 -1678
- package/playwright.config.ts +0 -81
- package/public/jasmine/boot0.js +0 -66
- package/public/jasmine/boot1.js +0 -134
- package/public/jasmine/jasmine-html.js +0 -970
- package/public/jasmine/jasmine.css +0 -323
- package/public/jasmine/jasmine.js +0 -11406
- package/public/public/README.md +0 -1
- package/public/public/circle.html +0 -1
- package/public/public/jasmine-helper.css +0 -9
- package/public/public/my_child_directive.html +0 -1
- package/public/public/my_directive.html +0 -1
- package/public/public/my_other_directive.html +0 -1
- package/public/public/test.html +0 -1
- package/rollup.config.js +0 -51
- package/src/angular.js +0 -286
- package/src/angular.spec.js +0 -1191
- package/src/animations/animate-cache.js +0 -80
- package/src/animations/animate-children-directive.js +0 -32
- package/src/animations/animate-children-directive.md +0 -80
- package/src/animations/animate-css-driver.js +0 -284
- package/src/animations/animate-css.html +0 -58
- package/src/animations/animate-css.js +0 -915
- package/src/animations/animate-css.md +0 -263
- package/src/animations/animate-js-driver.js +0 -60
- package/src/animations/animate-js.html +0 -47
- package/src/animations/animate-js.js +0 -371
- package/src/animations/animate-queue.js +0 -859
- package/src/animations/animate-runner.js +0 -193
- package/src/animations/animate-swap.js +0 -33
- package/src/animations/animate-swap.md +0 -88
- package/src/animations/animate.html +0 -19
- package/src/animations/animate.js +0 -546
- package/src/animations/animate.md +0 -933
- package/src/animations/animate.spec.js +0 -490
- package/src/animations/animation.js +0 -519
- package/src/animations/animations.test.js +0 -10
- package/src/animations/interface.ts +0 -19
- package/src/animations/raf-scheduler.html +0 -19
- package/src/animations/raf-scheduler.js +0 -92
- package/src/animations/raf-scheduler.spec.js +0 -98
- package/src/animations/shared.js +0 -341
- package/src/binding.html +0 -19
- package/src/binding.spec.js +0 -474
- package/src/binding.test.js +0 -10
- package/src/core/compile/attributes.js +0 -337
- package/src/core/compile/compile.html +0 -19
- package/src/core/compile/compile.js +0 -3271
- package/src/core/compile/compile.md +0 -1128
- package/src/core/compile/compile.spec.js +0 -15574
- package/src/core/compile/compile.test.js +0 -12
- package/src/core/controller/controller.html +0 -22
- package/src/core/controller/controller.js +0 -193
- package/src/core/controller/controller.spec.js +0 -334
- package/src/core/controller/controller.test.js +0 -12
- package/src/core/controller/interface.ts +0 -6
- package/src/core/core.html +0 -20
- package/src/core/core.test.js +0 -12
- package/src/core/di/injector.html +0 -19
- package/src/core/di/injector.js +0 -307
- package/src/core/di/injector.md +0 -740
- package/src/core/di/injector.spec.js +0 -2310
- package/src/core/di/injector.test.js +0 -12
- package/src/core/di/internal-injector.js +0 -286
- package/src/core/di/ng-module.html +0 -19
- package/src/core/di/ng-module.js +0 -229
- package/src/core/di/ng-module.spec.js +0 -263
- package/src/core/di/ng-module.test.js +0 -12
- package/src/core/filter/filter.html +0 -19
- package/src/core/filter/filter.js +0 -55
- package/src/core/filter/filter.md +0 -132
- package/src/core/filter/filter.spec.js +0 -149
- package/src/core/filter/filter.test.js +0 -12
- package/src/core/interpolate/interface.ts +0 -14
- package/src/core/interpolate/interpolate.html +0 -22
- package/src/core/interpolate/interpolate.js +0 -410
- package/src/core/interpolate/interpolate.spec.js +0 -601
- package/src/core/interpolate/interpolate.test.js +0 -12
- package/src/core/parse/ast/ast-node.ts +0 -81
- package/src/core/parse/ast/ast.html +0 -19
- package/src/core/parse/ast/ast.js +0 -574
- package/src/core/parse/ast/ast.spec.js +0 -1453
- package/src/core/parse/ast/ast.test.js +0 -10
- package/src/core/parse/ast-type.js +0 -23
- package/src/core/parse/interface.ts +0 -84
- package/src/core/parse/interpreter.js +0 -915
- package/src/core/parse/lexer/lexer.html +0 -19
- package/src/core/parse/lexer/lexer.js +0 -338
- package/src/core/parse/lexer/lexer.spec.js +0 -303
- package/src/core/parse/lexer/lexer.test.js +0 -10
- package/src/core/parse/lexer/token.ts +0 -22
- package/src/core/parse/parse.html +0 -19
- package/src/core/parse/parse.js +0 -337
- package/src/core/parse/parse.md +0 -57
- package/src/core/parse/parse.spec.js +0 -2107
- package/src/core/parse/parse.test.js +0 -10
- package/src/core/parse/parser/parser.html +0 -19
- package/src/core/parse/parser/parser.js +0 -64
- package/src/core/parse/parser/parser.spec.js +0 -8
- package/src/core/parse/parser/parser.test.js +0 -10
- package/src/core/prop.spec.js +0 -775
- package/src/core/root-element.spec.js +0 -14
- package/src/core/sanitize/interface.ts +0 -10
- package/src/core/sanitize/sanitize-uri.js +0 -75
- package/src/core/sanitize/sanitize-uri.spec.js +0 -249
- package/src/core/sanitize/sanitize-uri.test.js +0 -12
- package/src/core/sanitize/sanitize.html +0 -22
- package/src/core/scope/scope.html +0 -19
- package/src/core/scope/scope.js +0 -1252
- package/src/core/scope/scope.spec.js +0 -3000
- package/src/core/scope/scope.test.js +0 -12
- package/src/directive/aria/aria.html +0 -19
- package/src/directive/aria/aria.js +0 -382
- package/src/directive/aria/aria.md +0 -145
- package/src/directive/aria/aria.spec.js +0 -1241
- package/src/directive/aria/aria.test.js +0 -12
- package/src/directive/attrs/attrs.html +0 -19
- package/src/directive/attrs/attrs.js +0 -106
- package/src/directive/attrs/attrs.md +0 -224
- package/src/directive/attrs/attrs.spec.js +0 -71
- package/src/directive/attrs/attrs.test.js +0 -12
- package/src/directive/attrs/boolean.html +0 -19
- package/src/directive/attrs/boolean.spec.js +0 -137
- package/src/directive/attrs/boolean.test.js +0 -12
- package/src/directive/attrs/element-style.html +0 -22
- package/src/directive/attrs/element-style.spec.js +0 -85
- package/src/directive/attrs/element-style.test.js +0 -12
- package/src/directive/attrs/src.html +0 -19
- package/src/directive/attrs/src.spec.js +0 -163
- package/src/directive/attrs/src.test.js +0 -12
- package/src/directive/bind/bind-html.spec.js +0 -36
- package/src/directive/bind/bind.html +0 -20
- package/src/directive/bind/bind.js +0 -78
- package/src/directive/bind/bind.md +0 -142
- package/src/directive/bind/bind.spec.js +0 -314
- package/src/directive/bind/bind.test.js +0 -12
- package/src/directive/channel/channel.html +0 -19
- package/src/directive/channel/channel.js +0 -30
- package/src/directive/channel/channel.spec.js +0 -67
- package/src/directive/channel/channel.test.js +0 -10
- package/src/directive/class/class-test.html +0 -23
- package/src/directive/class/class.html +0 -19
- package/src/directive/class/class.js +0 -184
- package/src/directive/class/class.spec.js +0 -704
- package/src/directive/class/class.test.js +0 -12
- package/src/directive/cloak/cloak.html +0 -19
- package/src/directive/cloak/cloak.js +0 -11
- package/src/directive/cloak/cloak.spec.js +0 -44
- package/src/directive/cloak/cloak.test.js +0 -12
- package/src/directive/controller/controller.html +0 -22
- package/src/directive/controller/controller.js +0 -11
- package/src/directive/controller/controller.md +0 -46
- package/src/directive/controller/controller.spec.js +0 -175
- package/src/directive/controller/controller.test.js +0 -12
- package/src/directive/events/click.spec.js +0 -35
- package/src/directive/events/event.spec.js +0 -267
- package/src/directive/events/events-test.html +0 -36
- package/src/directive/events/events.html +0 -20
- package/src/directive/events/events.js +0 -65
- package/src/directive/events/events.md +0 -125
- package/src/directive/events/events.test.js +0 -12
- package/src/directive/form/form.html +0 -19
- package/src/directive/form/form.js +0 -669
- package/src/directive/form/form.spec.js +0 -1515
- package/src/directive/form/form.test.js +0 -12
- package/src/directive/http/delete.spec.js +0 -23
- package/src/directive/http/form-router-test.html +0 -44
- package/src/directive/http/form-test.html +0 -18
- package/src/directive/http/get.spec.js +0 -488
- package/src/directive/http/http.html +0 -22
- package/src/directive/http/http.js +0 -342
- package/src/directive/http/http.test.js +0 -12
- package/src/directive/http/interface.ts +0 -36
- package/src/directive/http/post-example.html +0 -30
- package/src/directive/http/post.spec.js +0 -521
- package/src/directive/http/put.spec.js +0 -23
- package/src/directive/if/if-animate-css.html +0 -57
- package/src/directive/if/if-animate-svg.html +0 -25
- package/src/directive/if/if.html +0 -19
- package/src/directive/if/if.js +0 -72
- package/src/directive/if/if.md +0 -76
- package/src/directive/if/if.spec.js +0 -293
- package/src/directive/if/if.test.js +0 -114
- package/src/directive/include/include.html +0 -19
- package/src/directive/include/include.js +0 -151
- package/src/directive/include/include.md +0 -87
- package/src/directive/include/include.spec.js +0 -734
- package/src/directive/include/include.test.js +0 -12
- package/src/directive/init/init.html +0 -19
- package/src/directive/init/init.js +0 -22
- package/src/directive/init/init.md +0 -41
- package/src/directive/init/init.spec.js +0 -68
- package/src/directive/init/init.test.js +0 -12
- package/src/directive/inject/inject.html +0 -19
- package/src/directive/inject/inject.js +0 -35
- package/src/directive/inject/inject.spec.js +0 -108
- package/src/directive/inject/inject.test.js +0 -12
- package/src/directive/input/input-example.html +0 -15
- package/src/directive/input/input.html +0 -19
- package/src/directive/input/input.js +0 -1078
- package/src/directive/input/input.md +0 -706
- package/src/directive/input/input.spec.js +0 -3700
- package/src/directive/input/input.test.js +0 -12
- package/src/directive/messages/messages.html +0 -22
- package/src/directive/messages/messages.js +0 -349
- package/src/directive/messages/messages.md +0 -543
- package/src/directive/messages/messages.spec.js +0 -1083
- package/src/directive/messages/messages.test.js +0 -12
- package/src/directive/model/change.md +0 -25
- package/src/directive/model/model.html +0 -19
- package/src/directive/model/model.js +0 -1170
- package/src/directive/model/model.spec.js +0 -1976
- package/src/directive/model/model.test.js +0 -12
- package/src/directive/model-options/model-option.test.js +0 -12
- package/src/directive/model-options/model-options.html +0 -22
- package/src/directive/model-options/model-options.js +0 -142
- package/src/directive/model-options/model-options.md +0 -407
- package/src/directive/model-options/model-options.spec.js +0 -1022
- package/src/directive/non-bindable/non-bindable.html +0 -22
- package/src/directive/non-bindable/non-bindable.js +0 -9
- package/src/directive/non-bindable/non-bindable.spec.js +0 -59
- package/src/directive/non-bindable/non-bindable.test.js +0 -12
- package/src/directive/observe/observe-demo.html +0 -184
- package/src/directive/observe/observe.html +0 -19
- package/src/directive/observe/observe.js +0 -41
- package/src/directive/observe/observe.spec.js +0 -106
- package/src/directive/observe/observe.test.js +0 -10
- package/src/directive/on/on.html +0 -19
- package/src/directive/on/on.spec.js +0 -215
- package/src/directive/on/on.test.js +0 -12
- package/src/directive/options/options-example.html +0 -17
- package/src/directive/options/options.html +0 -22
- package/src/directive/options/options.js +0 -542
- package/src/directive/options/options.md +0 -179
- package/src/directive/options/options.spec.js +0 -3554
- package/src/directive/options/options.test.js +0 -12
- package/src/directive/ref/href.html +0 -19
- package/src/directive/ref/href.spec.js +0 -141
- package/src/directive/ref/href.test.js +0 -19
- package/src/directive/ref/ref.html +0 -19
- package/src/directive/ref/ref.js +0 -89
- package/src/directive/ref/ref.spec.js +0 -546
- package/src/directive/repeat/repeat.html +0 -19
- package/src/directive/repeat/repeat.js +0 -333
- package/src/directive/repeat/repeat.md +0 -330
- package/src/directive/repeat/repeat.spec.js +0 -1209
- package/src/directive/repeat/repeat.test.js +0 -12
- package/src/directive/script/script.html +0 -19
- package/src/directive/script/script.js +0 -17
- package/src/directive/script/script.md +0 -11
- package/src/directive/script/script.spec.js +0 -47
- package/src/directive/script/script.test.js +0 -12
- package/src/directive/select/select.html +0 -19
- package/src/directive/select/select.js +0 -594
- package/src/directive/select/select.md +0 -74
- package/src/directive/select/select.spec.js +0 -2566
- package/src/directive/select/select.test.js +0 -12
- package/src/directive/setter/setter.html +0 -19
- package/src/directive/setter/setter.js +0 -59
- package/src/directive/setter/setter.spec.js +0 -100
- package/src/directive/setter/setter.test.js +0 -12
- package/src/directive/show-hide/show-hide.html +0 -22
- package/src/directive/show-hide/show-hide.js +0 -65
- package/src/directive/show-hide/show-hide.md +0 -255
- package/src/directive/show-hide/show-hide.spec.js +0 -268
- package/src/directive/show-hide/show-hide.test.js +0 -12
- package/src/directive/style/style.html +0 -19
- package/src/directive/style/style.js +0 -27
- package/src/directive/style/style.md +0 -23
- package/src/directive/style/style.spec.js +0 -183
- package/src/directive/style/style.test.js +0 -12
- package/src/directive/switch/switch.html +0 -19
- package/src/directive/switch/switch.js +0 -133
- package/src/directive/switch/switch.md +0 -66
- package/src/directive/switch/switch.spec.js +0 -509
- package/src/directive/switch/switch.test.js +0 -12
- package/src/directive/transclude/transclude.js +0 -122
- package/src/directive/validators/validators.html +0 -22
- package/src/directive/validators/validators.js +0 -346
- package/src/directive/validators/validators.spec.js +0 -740
- package/src/directive/validators/validators.test.js +0 -12
- package/src/filters/filter.js +0 -213
- package/src/filters/filter.spec.js +0 -719
- package/src/filters/filters.html +0 -22
- package/src/filters/filters.js +0 -239
- package/src/filters/filters.spec.js +0 -36
- package/src/filters/filters.test.js +0 -12
- package/src/filters/interface.ts +0 -9
- package/src/filters/limit-to.js +0 -55
- package/src/filters/limit-to.spec.js +0 -252
- package/src/filters/order-by.js +0 -181
- package/src/filters/order-by.spec.js +0 -883
- package/src/index.js +0 -6
- package/src/index.spec.js +0 -11
- package/src/injection-tokens.js +0 -81
- package/src/interface.ts +0 -430
- package/src/ng.js +0 -291
- package/src/ng.spec.js +0 -45
- package/src/router/common/trace.js +0 -240
- package/src/router/directives/component-example.html +0 -37
- package/src/router/directives/state-directives.html +0 -22
- package/src/router/directives/state-directives.js +0 -393
- package/src/router/directives/state-directives.md +0 -435
- package/src/router/directives/state-directives.spec.js +0 -1091
- package/src/router/directives/state-directives.test.js +0 -10
- package/src/router/directives/view-directive.js +0 -489
- package/src/router/directives/view-directive.spec.js +0 -1921
- package/src/router/directives/view-directive.test.js +0 -10
- package/src/router/directives/view-directives.html +0 -22
- package/src/router/glob/glob.html +0 -19
- package/src/router/glob/glob.js +0 -102
- package/src/router/glob/glob.spec.js +0 -108
- package/src/router/glob/glob.test.js +0 -12
- package/src/router/hooks/core-resolvables.js +0 -38
- package/src/router/hooks/ignored-transition.js +0 -25
- package/src/router/hooks/invalid-transition.js +0 -14
- package/src/router/hooks/lazy-load.js +0 -104
- package/src/router/hooks/on-enter-exit-retain.js +0 -55
- package/src/router/hooks/redirect-to.js +0 -38
- package/src/router/hooks/resolve.js +0 -57
- package/src/router/hooks/update-globals.js +0 -34
- package/src/router/hooks/url.js +0 -34
- package/src/router/hooks/views.js +0 -41
- package/src/router/params/interface.ts +0 -626
- package/src/router/params/param-factory.js +0 -23
- package/src/router/params/param-type.js +0 -133
- package/src/router/params/param-types.js +0 -153
- package/src/router/params/param.js +0 -243
- package/src/router/params/state-params.js +0 -36
- package/src/router/path/path-node.js +0 -78
- package/src/router/path/path-utils.js +0 -207
- package/src/router/resolve/interface.ts +0 -208
- package/src/router/resolve/resolvable.js +0 -123
- package/src/router/resolve/resolve-context.js +0 -190
- package/src/router/router-test-hashbang.html +0 -45
- package/src/router/router-test.html +0 -41
- package/src/router/router.html +0 -22
- package/src/router/router.js +0 -54
- package/src/router/router.test.js +0 -12
- package/src/router/services.spec.js +0 -52
- package/src/router/state/interface.ts +0 -1007
- package/src/router/state/state-builder.js +0 -376
- package/src/router/state/state-builder.spec.js +0 -86
- package/src/router/state/state-matcher.js +0 -64
- package/src/router/state/state-object.js +0 -118
- package/src/router/state/state-queue-manager.js +0 -95
- package/src/router/state/state-registry.js +0 -262
- package/src/router/state/state-service.js +0 -687
- package/src/router/state/state.html +0 -23
- package/src/router/state/state.spec.js +0 -1002
- package/src/router/state/state.test.js +0 -12
- package/src/router/state/target-state.js +0 -162
- package/src/router/state/views.js +0 -195
- package/src/router/state-filter.spec.js +0 -139
- package/src/router/state-filters.js +0 -46
- package/src/router/template-factory.html +0 -19
- package/src/router/template-factory.js +0 -249
- package/src/router/template-factory.spec.js +0 -146
- package/src/router/template-factory.test.js +0 -12
- package/src/router/transition/hook-builder.js +0 -137
- package/src/router/transition/hook-registry.js +0 -181
- package/src/router/transition/interface.js +0 -18
- package/src/router/transition/interface.ts +0 -922
- package/src/router/transition/reject-factory.js +0 -122
- package/src/router/transition/transition-event-type.js +0 -26
- package/src/router/transition/transition-hook.js +0 -199
- package/src/router/transition/transition-service.js +0 -297
- package/src/router/transition/transition.js +0 -653
- package/src/router/url/url-config.js +0 -155
- package/src/router/url/url-matcher.js +0 -532
- package/src/router/url/url-rule.js +0 -231
- package/src/router/url/url-rules.js +0 -350
- package/src/router/url/url-service.js +0 -446
- package/src/router/url/url-service.spec.js +0 -1288
- package/src/router/url/url.html +0 -19
- package/src/router/url/url.test.js +0 -12
- package/src/router/view/interface.ts +0 -51
- package/src/router/view/view.html +0 -19
- package/src/router/view/view.js +0 -262
- package/src/router/view/view.spec.js +0 -100
- package/src/router/view/view.test.js +0 -12
- package/src/router/view-hook.spec.js +0 -215
- package/src/router/view-scroll.js +0 -33
- package/src/router/view-scroll.spec.js +0 -72
- package/src/services/anchor-scroll/anchor-scroll.html +0 -76
- package/src/services/anchor-scroll/anchor-scroll.js +0 -147
- package/src/services/exception/exception-handler.js +0 -75
- package/src/services/exception/interface.ts +0 -7
- package/src/services/http/http.html +0 -23
- package/src/services/http/http.js +0 -1109
- package/src/services/http/http.spec.js +0 -4320
- package/src/services/http/http.test.js +0 -11
- package/src/services/http/interface.ts +0 -256
- package/src/services/http/template-request.spec.js +0 -220
- package/src/services/location/interface.ts +0 -70
- package/src/services/location/location.html +0 -22
- package/src/services/location/location.js +0 -1006
- package/src/services/location/location.spec.js +0 -3792
- package/src/services/location/location.test.js +0 -12
- package/src/services/log/interface.ts +0 -39
- package/src/services/log/log.html +0 -19
- package/src/services/log/log.js +0 -74
- package/src/services/log/log.spec.js +0 -64
- package/src/services/log/log.test.js +0 -12
- package/src/services/pubsub/pubsub.html +0 -19
- package/src/services/pubsub/pubsub.js +0 -349
- package/src/services/pubsub/pubsub.spec.js +0 -400
- package/src/services/pubsub/pubsub.test.js +0 -12
- package/src/services/sce/sce.html +0 -19
- package/src/services/sce/sce.js +0 -852
- package/src/services/sce/sce.spec.js +0 -617
- package/src/services/sce/sce.test.js +0 -12
- package/src/services/template-cache/template-cache.html +0 -22
- package/src/services/template-cache/template-cache.js +0 -15
- package/src/services/template-cache/template-cache.spec.js +0 -134
- package/src/services/template-cache/template-cache.test.js +0 -12
- package/src/services/template-request/interface.ts +0 -23
- package/src/services/template-request/template-request.js +0 -142
- package/src/shared/cache.js +0 -7
- package/src/shared/common.js +0 -365
- package/src/shared/common.spec.js +0 -294
- package/src/shared/constants.js +0 -21
- package/src/shared/dom.js +0 -716
- package/src/shared/hof.js +0 -157
- package/src/shared/hof.spec.js +0 -60
- package/src/shared/interface.ts +0 -21
- package/src/shared/min-err.spec.js +0 -178
- package/src/shared/noderef.js +0 -225
- package/src/shared/predicates.js +0 -34
- package/src/shared/queue.js +0 -105
- package/src/shared/queue.spec.js +0 -80
- package/src/shared/shared.html +0 -24
- package/src/shared/shared.test.js +0 -12
- package/src/shared/strings.js +0 -142
- package/src/shared/strings.spec.js +0 -40
- package/src/shared/test-utils.js +0 -47
- package/src/shared/url-utils/interface.ts +0 -54
- package/src/shared/url-utils/url-utils.html +0 -22
- package/src/shared/url-utils/url-utils.js +0 -122
- package/src/shared/url-utils/url-utils.spec.js +0 -148
- package/src/shared/url-utils/url-utils.test.js +0 -12
- package/src/shared/utils.js +0 -1255
- package/src/shared/utils.spec.js +0 -178
- package/src/src.html +0 -21
- package/src/src.test.js +0 -10
- package/tsconfig.json +0 -19
- package/tsconfig.types.json +0 -14
- package/typedoc.json +0 -8
- package/utils/express.js +0 -203
- package/utils/version.cjs +0 -23
- package/vite.config.js +0 -14
|
@@ -1,1006 +0,0 @@
|
|
|
1
|
-
import { trimEmptyHash, urlResolve } from "../../shared/url-utils/url-utils.js";
|
|
2
|
-
import {
|
|
3
|
-
encodeUriSegment,
|
|
4
|
-
isDefined,
|
|
5
|
-
isNumber,
|
|
6
|
-
isObject,
|
|
7
|
-
isString,
|
|
8
|
-
isUndefined,
|
|
9
|
-
minErr,
|
|
10
|
-
parseKeyValue,
|
|
11
|
-
toKeyValue,
|
|
12
|
-
equals,
|
|
13
|
-
startsWith,
|
|
14
|
-
} from "../../shared/utils.js";
|
|
15
|
-
import { getBaseHref } from "../../shared/dom.js";
|
|
16
|
-
import { $injectTokens as $t } from "../../injection-tokens.js";
|
|
17
|
-
|
|
18
|
-
const PATH_MATCH = /^([^?#]*)(\?([^#]*))?(#(.*))?$/;
|
|
19
|
-
const $locationMinErr = minErr("$location");
|
|
20
|
-
|
|
21
|
-
let urlUpdatedByLocation = false;
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* @ignore
|
|
25
|
-
* The pathname, beginning with "/"
|
|
26
|
-
* @type {string}
|
|
27
|
-
*/
|
|
28
|
-
let $$path;
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* @type {Object.<string,boolean|Array>}
|
|
32
|
-
*/
|
|
33
|
-
let $$search;
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* @ignore
|
|
37
|
-
* The hash string, minus the hash symbol
|
|
38
|
-
* @type {string}
|
|
39
|
-
*/
|
|
40
|
-
let $$hash;
|
|
41
|
-
|
|
42
|
-
export class Location {
|
|
43
|
-
/**
|
|
44
|
-
* @param {string} appBase application base URL
|
|
45
|
-
* @param {string} appBaseNoFile application base URL stripped of any filename
|
|
46
|
-
* @param {boolean} [html5] Defaults to true
|
|
47
|
-
* @param {string} [prefix] URL path prefix for html5 mode or hash prefix for hashbang mode
|
|
48
|
-
*/
|
|
49
|
-
constructor(appBase, appBaseNoFile, html5 = true, prefix) {
|
|
50
|
-
/** @type {string} */
|
|
51
|
-
this.appBase = appBase;
|
|
52
|
-
|
|
53
|
-
/** @type {string} */
|
|
54
|
-
this.appBaseNoFile = appBaseNoFile;
|
|
55
|
-
|
|
56
|
-
/** @type {boolean} */
|
|
57
|
-
this.html5 = html5;
|
|
58
|
-
|
|
59
|
-
/** @type {string | undefined} */
|
|
60
|
-
this.basePrefix = html5 ? prefix || "" : undefined;
|
|
61
|
-
|
|
62
|
-
/** @type {string | undefined} */
|
|
63
|
-
this.hashPrefix = html5 ? undefined : prefix;
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* An absolute URL is the full URL, including protocol (http/https ), the optional subdomain (e.g. www ), domain (example.com), and path (which includes the directory and slug)
|
|
67
|
-
* with all segments encoded according to rules specified in [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt).
|
|
68
|
-
* @type {string}
|
|
69
|
-
*/
|
|
70
|
-
this.absUrl = "";
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* @ignore
|
|
74
|
-
* Current url
|
|
75
|
-
* @type {string}
|
|
76
|
-
*/
|
|
77
|
-
this.$$url = undefined;
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* @ignore
|
|
81
|
-
* Callback to update browser url
|
|
82
|
-
* @type {Function}
|
|
83
|
-
*/
|
|
84
|
-
this.$$updateBrowser = undefined;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Change path, search and hash, when called with parameter and return `$location`.
|
|
89
|
-
*
|
|
90
|
-
* @param {string} url New URL without base prefix (e.g. `/path?a=b#hash`)
|
|
91
|
-
* @return {Location} url
|
|
92
|
-
*/
|
|
93
|
-
setUrl(url) {
|
|
94
|
-
const match = PATH_MATCH.exec(url);
|
|
95
|
-
|
|
96
|
-
if (match[1] !== undefined || url === "") {
|
|
97
|
-
this.setPath(match[1] || "");
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
if (match[2] !== undefined || match[1] !== undefined || url === "") {
|
|
101
|
-
this.setSearch(match[3] || "");
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
this.setHash(match[5] || "");
|
|
105
|
-
|
|
106
|
-
return this;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Return URL (e.g. `/path?a=b#hash`) when called without any parameter.
|
|
111
|
-
*
|
|
112
|
-
* @return {string} url
|
|
113
|
-
*/
|
|
114
|
-
getUrl() {
|
|
115
|
-
return this.$$url;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Change path parameter and return `$location`.
|
|
120
|
-
*
|
|
121
|
-
* @param {(string|number)} path New path
|
|
122
|
-
* @return {Location}
|
|
123
|
-
*/
|
|
124
|
-
setPath(path) {
|
|
125
|
-
let newPath = path !== null ? path.toString() : "";
|
|
126
|
-
$$path = newPath.charAt(0) === "/" ? newPath : `/${newPath}`;
|
|
127
|
-
this.$$compose();
|
|
128
|
-
return this;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
*
|
|
133
|
-
* Return path of current URL
|
|
134
|
-
*
|
|
135
|
-
* @return {string}
|
|
136
|
-
*/
|
|
137
|
-
getPath() {
|
|
138
|
-
return $$path;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Changes the hash fragment when called with a parameter and returns `$location`.
|
|
143
|
-
* @param {(string|number)} hash New hash fragment
|
|
144
|
-
* @return {Location} hash
|
|
145
|
-
*/
|
|
146
|
-
setHash(hash) {
|
|
147
|
-
$$hash = hash !== null ? hash.toString() : "";
|
|
148
|
-
this.$$compose();
|
|
149
|
-
return this;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Returns the hash fragment when called without any parameters.
|
|
154
|
-
* @return {string} hash
|
|
155
|
-
*/
|
|
156
|
-
getHash() {
|
|
157
|
-
return $$hash;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Sets the search part (as object) of current URL
|
|
162
|
-
*
|
|
163
|
-
* @param {string|Object} search New search params - string or hash object.
|
|
164
|
-
* @param {(string|number|Array<string>|boolean)=} paramValue If search is a string or number, then paramValue will override only a single search property.
|
|
165
|
-
* @returns {Object} Search object or Location object
|
|
166
|
-
*/
|
|
167
|
-
setSearch(search, paramValue) {
|
|
168
|
-
switch (arguments.length) {
|
|
169
|
-
case 1:
|
|
170
|
-
if (isString(search) || isNumber(search)) {
|
|
171
|
-
search = search.toString();
|
|
172
|
-
$$search = parseKeyValue(search);
|
|
173
|
-
} else if (isObject(search)) {
|
|
174
|
-
search = structuredClone(search, {});
|
|
175
|
-
// remove object undefined or null properties
|
|
176
|
-
Object.entries(search).forEach(([key, value]) => {
|
|
177
|
-
if (value == null) delete search[key];
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
$$search = search;
|
|
181
|
-
} else {
|
|
182
|
-
throw $locationMinErr(
|
|
183
|
-
"isrcharg",
|
|
184
|
-
"The first argument of the `$location#search()` call must be a string or an object.",
|
|
185
|
-
);
|
|
186
|
-
}
|
|
187
|
-
break;
|
|
188
|
-
default:
|
|
189
|
-
if (isUndefined(paramValue) || paramValue === null) {
|
|
190
|
-
delete $$search[search];
|
|
191
|
-
} else {
|
|
192
|
-
// @ts-ignore
|
|
193
|
-
$$search[search] = paramValue;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
this.$$compose();
|
|
198
|
-
return this;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Returns the search part (as object) of current URL
|
|
203
|
-
*
|
|
204
|
-
* @returns {Object} Search object or Location object
|
|
205
|
-
*/
|
|
206
|
-
getSearch() {
|
|
207
|
-
return $$search;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* @private
|
|
212
|
-
* Compose url and update `url` and `absUrl` property
|
|
213
|
-
*/
|
|
214
|
-
$$compose() {
|
|
215
|
-
this.$$url = normalizePath($$path, $$search, $$hash);
|
|
216
|
-
this.absUrl = this.html5
|
|
217
|
-
? this.appBaseNoFile + this.$$url.substring(1)
|
|
218
|
-
: this.appBase + (this.$$url ? this.hashPrefix + this.$$url : "");
|
|
219
|
-
urlUpdatedByLocation = true;
|
|
220
|
-
setTimeout(() => this.$$updateBrowser && this.$$updateBrowser());
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* Change the history state object when called with one parameter and return `$location`.
|
|
225
|
-
* The state object is later passed to `pushState` or `replaceState`.
|
|
226
|
-
* See {@link https://developer.mozilla.org/en-US/docs/Web/API/History/pushState#state|History.state}
|
|
227
|
-
*
|
|
228
|
-
* NOTE: This method is supported only in HTML5 mode and only in browsers supporting
|
|
229
|
-
* the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support
|
|
230
|
-
* older browsers (like IE9 or Android < 4.0), don't use this method.
|
|
231
|
-
* @param {any} state
|
|
232
|
-
* @returns {Location}
|
|
233
|
-
*/
|
|
234
|
-
setState(state) {
|
|
235
|
-
if (!this.html5) {
|
|
236
|
-
throw $locationMinErr(
|
|
237
|
-
"nostate",
|
|
238
|
-
"History API state support is available only in HTML5 mode",
|
|
239
|
-
);
|
|
240
|
-
}
|
|
241
|
-
// The user might modify `stateObject` after invoking `$location.setState(stateObject)`
|
|
242
|
-
// but we're changing the $$state reference to $browser.state() during the $digest
|
|
243
|
-
// so the modification window is narrow.
|
|
244
|
-
this.$$state = isUndefined(state) ? null : state;
|
|
245
|
-
urlUpdatedByLocation = true;
|
|
246
|
-
return this;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/**
|
|
250
|
-
* Return the history state object
|
|
251
|
-
* @returns {any}
|
|
252
|
-
*/
|
|
253
|
-
getState() {
|
|
254
|
-
return this.$$state;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* @param {string} url
|
|
259
|
-
* @param {string} relHref
|
|
260
|
-
* @returns {boolean}
|
|
261
|
-
*/
|
|
262
|
-
parseLinkUrl(url, relHref) {
|
|
263
|
-
if (this.html5) {
|
|
264
|
-
if (relHref && relHref[0] === "#") {
|
|
265
|
-
// special case for links to hash fragments:
|
|
266
|
-
// keep the old url and only replace the hash fragment
|
|
267
|
-
this.setHash(relHref.slice(1));
|
|
268
|
-
return true;
|
|
269
|
-
}
|
|
270
|
-
let appUrl;
|
|
271
|
-
let prevAppUrl;
|
|
272
|
-
let rewrittenUrl;
|
|
273
|
-
|
|
274
|
-
if (isDefined((appUrl = stripBaseUrl(this.appBase, url)))) {
|
|
275
|
-
prevAppUrl = appUrl;
|
|
276
|
-
if (
|
|
277
|
-
this.basePrefix &&
|
|
278
|
-
isDefined((appUrl = stripBaseUrl(this.basePrefix, appUrl)))
|
|
279
|
-
) {
|
|
280
|
-
rewrittenUrl =
|
|
281
|
-
this.appBaseNoFile + (stripBaseUrl("/", appUrl) || appUrl);
|
|
282
|
-
} else {
|
|
283
|
-
rewrittenUrl = this.appBase + prevAppUrl;
|
|
284
|
-
}
|
|
285
|
-
} else if (isDefined((appUrl = stripBaseUrl(this.appBaseNoFile, url)))) {
|
|
286
|
-
rewrittenUrl = this.appBaseNoFile + appUrl;
|
|
287
|
-
} else if (this.appBaseNoFile === `${url}/`) {
|
|
288
|
-
rewrittenUrl = this.appBaseNoFile;
|
|
289
|
-
}
|
|
290
|
-
if (rewrittenUrl) {
|
|
291
|
-
this.parse(rewrittenUrl);
|
|
292
|
-
}
|
|
293
|
-
return !!rewrittenUrl;
|
|
294
|
-
} else {
|
|
295
|
-
if (stripHash(this.appBase) === stripHash(url)) {
|
|
296
|
-
this.parse(url);
|
|
297
|
-
return true;
|
|
298
|
-
}
|
|
299
|
-
return false;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Parse given HTML5 (regular) URL string into properties
|
|
305
|
-
* @param {string} url HTML5 URL
|
|
306
|
-
*/
|
|
307
|
-
parse(url) {
|
|
308
|
-
if (this.html5) {
|
|
309
|
-
const pathUrl = stripBaseUrl(this.appBaseNoFile, url);
|
|
310
|
-
if (!isString(pathUrl)) {
|
|
311
|
-
throw $locationMinErr(
|
|
312
|
-
"ipthprfx",
|
|
313
|
-
'Invalid url "{0}", missing path prefix "{1}".',
|
|
314
|
-
url,
|
|
315
|
-
this.appBaseNoFile,
|
|
316
|
-
);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
parseAppUrl(pathUrl, true);
|
|
320
|
-
|
|
321
|
-
if (!$$path) {
|
|
322
|
-
$$path = "/";
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
this.$$compose();
|
|
326
|
-
} else {
|
|
327
|
-
const withoutBaseUrl =
|
|
328
|
-
stripBaseUrl(this.appBase, url) ||
|
|
329
|
-
stripBaseUrl(this.appBaseNoFile, url);
|
|
330
|
-
let withoutHashUrl;
|
|
331
|
-
|
|
332
|
-
if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === "#") {
|
|
333
|
-
// The rest of the URL starts with a hash so we have
|
|
334
|
-
// got either a hashbang path or a plain hash fragment
|
|
335
|
-
withoutHashUrl = stripBaseUrl(this.hashPrefix, withoutBaseUrl);
|
|
336
|
-
if (isUndefined(withoutHashUrl)) {
|
|
337
|
-
// There was no hashbang prefix so we just have a hash fragment
|
|
338
|
-
withoutHashUrl = withoutBaseUrl;
|
|
339
|
-
}
|
|
340
|
-
} else {
|
|
341
|
-
// There was no hashbang path nor hash fragment:
|
|
342
|
-
// If we are in HTML5 mode we use what is left as the path;
|
|
343
|
-
// Otherwise we ignore what is left
|
|
344
|
-
if (this.html5) {
|
|
345
|
-
withoutHashUrl = withoutBaseUrl;
|
|
346
|
-
} else {
|
|
347
|
-
withoutHashUrl = "";
|
|
348
|
-
if (isUndefined(withoutBaseUrl)) {
|
|
349
|
-
this.appBase = url;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
parseAppUrl(withoutHashUrl, false);
|
|
355
|
-
|
|
356
|
-
$$path = removeWindowsDriveName($$path, withoutHashUrl, this.appBase);
|
|
357
|
-
|
|
358
|
-
this.$$compose();
|
|
359
|
-
|
|
360
|
-
/*
|
|
361
|
-
* In Windows, on an anchor node on documents loaded from
|
|
362
|
-
* the filesystem, the browser will return a pathname
|
|
363
|
-
* prefixed with the drive name ('/C:/path') when a
|
|
364
|
-
* pathname without a drive is set:
|
|
365
|
-
* * a.setAttribute('href', '/foo')
|
|
366
|
-
* * a.pathname === '/C:/foo' //true
|
|
367
|
-
*
|
|
368
|
-
* Inside of AngularTS, we're always using pathnames that
|
|
369
|
-
* do not include drive names for routing.
|
|
370
|
-
*/
|
|
371
|
-
function removeWindowsDriveName(path, url, base) {
|
|
372
|
-
/*
|
|
373
|
-
Matches paths for file protocol on windows,
|
|
374
|
-
such as /C:/foo/bar, and captures only /foo/bar.
|
|
375
|
-
*/
|
|
376
|
-
const windowsFilePathExp = /^\/[A-Z]:(\/.*)/;
|
|
377
|
-
|
|
378
|
-
let firstPathSegmentMatch;
|
|
379
|
-
|
|
380
|
-
// Get the relative path from the input URL.
|
|
381
|
-
if (startsWith(url, base)) {
|
|
382
|
-
url = url.replace(base, "");
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
// The input URL intentionally contains a first path segment that ends with a colon.
|
|
386
|
-
if (windowsFilePathExp.exec(url)) {
|
|
387
|
-
return path;
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
firstPathSegmentMatch = windowsFilePathExp.exec(path);
|
|
391
|
-
return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path;
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
export class LocationProvider {
|
|
398
|
-
constructor() {
|
|
399
|
-
/** @type {string} */
|
|
400
|
-
this.hashPrefixConf = "!";
|
|
401
|
-
|
|
402
|
-
/** @type {import("./interface.ts").Html5Mode} */
|
|
403
|
-
this.html5ModeConf = {
|
|
404
|
-
enabled: true,
|
|
405
|
-
requireBase: false,
|
|
406
|
-
rewriteLinks: true,
|
|
407
|
-
};
|
|
408
|
-
|
|
409
|
-
/** @type {Array<import("./interface.ts").UrlChangeListener>} */
|
|
410
|
-
this.urlChangeListeners = [];
|
|
411
|
-
this.urlChangeInit = false;
|
|
412
|
-
|
|
413
|
-
/** @type {History['state']} */
|
|
414
|
-
this.cachedState = null;
|
|
415
|
-
/** @type {History['state']} */
|
|
416
|
-
this.lastHistoryState = null;
|
|
417
|
-
/** @type {string} */
|
|
418
|
-
this.lastBrowserUrl = window.location.href;
|
|
419
|
-
this.cacheState();
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
/// ///////////////////////////////////////////////////////////
|
|
423
|
-
// URL API
|
|
424
|
-
/// ///////////////////////////////////////////////////////////
|
|
425
|
-
|
|
426
|
-
/**
|
|
427
|
-
* Updates the browser's current URL and history state.
|
|
428
|
-
*
|
|
429
|
-
* @param {string|undefined} url - The target URL to navigate to.
|
|
430
|
-
* @param {*} [state=null] - Optional history state object to associate with the new URL.
|
|
431
|
-
* @returns {LocationProvider}
|
|
432
|
-
*/
|
|
433
|
-
setUrl(url, state) {
|
|
434
|
-
if (state === undefined) {
|
|
435
|
-
state = null;
|
|
436
|
-
}
|
|
437
|
-
if (url) {
|
|
438
|
-
url = new URL(url).href;
|
|
439
|
-
|
|
440
|
-
if (this.lastBrowserUrl === url && this.lastHistoryState === state) {
|
|
441
|
-
return this;
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
this.lastBrowserUrl = url;
|
|
445
|
-
this.lastHistoryState = state;
|
|
446
|
-
history.pushState(state, "", url);
|
|
447
|
-
this.cacheState();
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
/**
|
|
452
|
-
* Returns the current URL with any empty hash (`#`) removed.
|
|
453
|
-
* @return {string}
|
|
454
|
-
*/
|
|
455
|
-
getBrowserUrl() {
|
|
456
|
-
return trimEmptyHash(window.location.href);
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
/**
|
|
460
|
-
* Returns the cached state.
|
|
461
|
-
* @returns {History['state']} The cached state.
|
|
462
|
-
*/
|
|
463
|
-
state() {
|
|
464
|
-
return this.cachedState;
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
/**
|
|
468
|
-
* Caches the current state.
|
|
469
|
-
*
|
|
470
|
-
* @private
|
|
471
|
-
*/
|
|
472
|
-
cacheState() {
|
|
473
|
-
const currentState = history.state ?? null;
|
|
474
|
-
if (!equals(currentState, this.lastCachedState)) {
|
|
475
|
-
this.cachedState = currentState;
|
|
476
|
-
this.lastCachedState = currentState;
|
|
477
|
-
this.lastHistoryState = currentState;
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
/**
|
|
482
|
-
* Fires the state or URL change event.
|
|
483
|
-
*/
|
|
484
|
-
#fireStateOrUrlChange() {
|
|
485
|
-
const prevLastHistoryState = this.lastHistoryState;
|
|
486
|
-
this.cacheState();
|
|
487
|
-
if (
|
|
488
|
-
this.lastBrowserUrl === this.getBrowserUrl() &&
|
|
489
|
-
prevLastHistoryState === this.cachedState
|
|
490
|
-
) {
|
|
491
|
-
return;
|
|
492
|
-
}
|
|
493
|
-
this.lastBrowserUrl = this.getBrowserUrl();
|
|
494
|
-
this.lastHistoryState = this.cachedState;
|
|
495
|
-
this.urlChangeListeners.forEach((listener) => {
|
|
496
|
-
listener(trimEmptyHash(window.location.href), this.cachedState);
|
|
497
|
-
});
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
/**
|
|
501
|
-
* Registers a callback to be called when the URL changes.
|
|
502
|
-
*
|
|
503
|
-
* @param {import("./interface.js").UrlChangeListener} callback - The callback function to register.
|
|
504
|
-
* @returns void
|
|
505
|
-
*/
|
|
506
|
-
#onUrlChange(callback) {
|
|
507
|
-
if (!this.urlChangeInit) {
|
|
508
|
-
window.addEventListener(
|
|
509
|
-
"popstate",
|
|
510
|
-
this.#fireStateOrUrlChange.bind(this),
|
|
511
|
-
);
|
|
512
|
-
window.addEventListener(
|
|
513
|
-
"hashchange",
|
|
514
|
-
this.#fireStateOrUrlChange.bind(this),
|
|
515
|
-
);
|
|
516
|
-
this.urlChangeInit = true;
|
|
517
|
-
}
|
|
518
|
-
this.urlChangeListeners.push(callback);
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
$get = [
|
|
522
|
-
$t.$rootScope,
|
|
523
|
-
$t.$rootElement,
|
|
524
|
-
/**
|
|
525
|
-
*
|
|
526
|
-
* @param {ng.Scope} $rootScope
|
|
527
|
-
* @param {Element} $rootElement
|
|
528
|
-
* @returns {Location}
|
|
529
|
-
*/
|
|
530
|
-
($rootScope, $rootElement) => {
|
|
531
|
-
/** @type {Location} */
|
|
532
|
-
let $location;
|
|
533
|
-
const baseHref = getBaseHref(); // if base[href] is undefined, it defaults to ''
|
|
534
|
-
const initialUrl = trimEmptyHash(window.location.href);
|
|
535
|
-
let appBase;
|
|
536
|
-
|
|
537
|
-
if (this.html5ModeConf.enabled) {
|
|
538
|
-
if (!baseHref && this.html5ModeConf.requireBase) {
|
|
539
|
-
throw $locationMinErr(
|
|
540
|
-
"nobase",
|
|
541
|
-
"$location in HTML5 mode requires a <base> tag to be present!",
|
|
542
|
-
);
|
|
543
|
-
}
|
|
544
|
-
appBase = serverBase(initialUrl) + (baseHref || "/");
|
|
545
|
-
} else {
|
|
546
|
-
appBase = stripHash(initialUrl);
|
|
547
|
-
}
|
|
548
|
-
const appBaseNoFile = stripFile(appBase);
|
|
549
|
-
|
|
550
|
-
$location = new Location(
|
|
551
|
-
appBase,
|
|
552
|
-
appBaseNoFile,
|
|
553
|
-
this.html5ModeConf.enabled,
|
|
554
|
-
`#${this.hashPrefixConf}`,
|
|
555
|
-
);
|
|
556
|
-
$location.parseLinkUrl(initialUrl, initialUrl);
|
|
557
|
-
|
|
558
|
-
$location.$$state = this.state();
|
|
559
|
-
|
|
560
|
-
const IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i;
|
|
561
|
-
|
|
562
|
-
const setBrowserUrlWithFallback = (url, state) => {
|
|
563
|
-
const oldUrl = $location.getUrl();
|
|
564
|
-
const oldState = $location.$$state;
|
|
565
|
-
try {
|
|
566
|
-
this.setUrl(url, state);
|
|
567
|
-
|
|
568
|
-
// Make sure $location.getState() returns referentially identical (not just deeply equal)
|
|
569
|
-
// state object; this makes possible quick checking if the state changed in the digest
|
|
570
|
-
// loop. Checking deep equality would be too expensive.
|
|
571
|
-
$location.$$state = this.state();
|
|
572
|
-
} catch (e) {
|
|
573
|
-
// Restore old values if pushState fails
|
|
574
|
-
$location.setUrl(/** @type {string} */ (oldUrl));
|
|
575
|
-
$location.$$state = oldState;
|
|
576
|
-
|
|
577
|
-
throw e;
|
|
578
|
-
}
|
|
579
|
-
};
|
|
580
|
-
|
|
581
|
-
$rootElement.addEventListener(
|
|
582
|
-
"click",
|
|
583
|
-
/** @param {MouseEvent} event */
|
|
584
|
-
(event) => {
|
|
585
|
-
const rewriteLinks = this.html5ModeConf.rewriteLinks;
|
|
586
|
-
// TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)
|
|
587
|
-
// currently we open nice url link and redirect then
|
|
588
|
-
|
|
589
|
-
if (
|
|
590
|
-
!rewriteLinks ||
|
|
591
|
-
event.ctrlKey ||
|
|
592
|
-
event.metaKey ||
|
|
593
|
-
event.shiftKey ||
|
|
594
|
-
event.button === 2
|
|
595
|
-
) {
|
|
596
|
-
return;
|
|
597
|
-
}
|
|
598
|
-
let elm = /** @type {HTMLAnchorElement} */ (event.target);
|
|
599
|
-
|
|
600
|
-
// traverse the DOM up to find first A tag
|
|
601
|
-
while (elm.nodeName.toLowerCase() !== "a") {
|
|
602
|
-
// ignore rewriting if no A tag (reached root element, or no parent - removed from document)
|
|
603
|
-
// @ts-ignore
|
|
604
|
-
if (elm === $rootElement || !(elm = elm.parentElement)) return;
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
if (
|
|
608
|
-
isString(rewriteLinks) &&
|
|
609
|
-
isUndefined(elm.getAttribute(/** @type {string} */ (rewriteLinks)))
|
|
610
|
-
) {
|
|
611
|
-
return;
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
let absHref = elm.href;
|
|
615
|
-
// get the actual href attribute - see
|
|
616
|
-
// http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx
|
|
617
|
-
const relHref =
|
|
618
|
-
elm.getAttribute("href") || elm.getAttribute("xlink:href");
|
|
619
|
-
|
|
620
|
-
if (
|
|
621
|
-
isObject(absHref) &&
|
|
622
|
-
absHref.toString() === "[object SVGAnimatedString]"
|
|
623
|
-
) {
|
|
624
|
-
// SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during
|
|
625
|
-
// an animation.
|
|
626
|
-
|
|
627
|
-
const scvAnimatedString = /** @type {unknown} */ (absHref);
|
|
628
|
-
absHref = new URL(
|
|
629
|
-
/** @type {SVGAnimatedString } */ (scvAnimatedString).animVal,
|
|
630
|
-
).href;
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
// Ignore when url is started with javascript: or mailto:
|
|
634
|
-
if (IGNORE_URI_REGEXP.test(absHref)) return;
|
|
635
|
-
|
|
636
|
-
if (
|
|
637
|
-
absHref &&
|
|
638
|
-
!elm.getAttribute("target") &&
|
|
639
|
-
!event.defaultPrevented
|
|
640
|
-
) {
|
|
641
|
-
if ($location.parseLinkUrl(absHref, relHref)) {
|
|
642
|
-
// We do a preventDefault for all urls that are part of the AngularTS application,
|
|
643
|
-
// in html5mode and also without, so that we are able to abort navigation without
|
|
644
|
-
// getting double entries in the location history.
|
|
645
|
-
event.preventDefault();
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
},
|
|
649
|
-
);
|
|
650
|
-
|
|
651
|
-
// rewrite hashbang url <> html5 url
|
|
652
|
-
if ($location.absUrl !== initialUrl) {
|
|
653
|
-
this.setUrl($location.absUrl, true);
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
let initializing = true;
|
|
657
|
-
|
|
658
|
-
// update $location when $browser url changes
|
|
659
|
-
this.#onUrlChange((newUrl, newState) => {
|
|
660
|
-
if (!startsWith(newUrl, appBaseNoFile)) {
|
|
661
|
-
// If we are navigating outside of the app then force a reload
|
|
662
|
-
window.location.href = newUrl;
|
|
663
|
-
return;
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
Promise.resolve().then(() => {
|
|
667
|
-
const oldUrl = $location.absUrl;
|
|
668
|
-
const oldState = $location.$$state;
|
|
669
|
-
let defaultPrevented;
|
|
670
|
-
$location.parse(newUrl);
|
|
671
|
-
$location.$$state = newState;
|
|
672
|
-
|
|
673
|
-
defaultPrevented = $rootScope.$broadcast(
|
|
674
|
-
"$locationChangeStart",
|
|
675
|
-
newUrl,
|
|
676
|
-
oldUrl,
|
|
677
|
-
newState,
|
|
678
|
-
oldState,
|
|
679
|
-
).defaultPrevented;
|
|
680
|
-
|
|
681
|
-
// if the location was changed by a `$locationChangeStart` handler then stop
|
|
682
|
-
// processing this location change
|
|
683
|
-
if ($location.absUrl !== newUrl) return;
|
|
684
|
-
|
|
685
|
-
if (defaultPrevented) {
|
|
686
|
-
$location.parse(oldUrl);
|
|
687
|
-
$location.$$state = oldState;
|
|
688
|
-
setBrowserUrlWithFallback(oldUrl, oldState);
|
|
689
|
-
} else {
|
|
690
|
-
initializing = false;
|
|
691
|
-
afterLocationChange(oldUrl, oldState);
|
|
692
|
-
}
|
|
693
|
-
});
|
|
694
|
-
});
|
|
695
|
-
|
|
696
|
-
// update browser
|
|
697
|
-
const updateBrowser = () => {
|
|
698
|
-
if (initializing || urlUpdatedByLocation) {
|
|
699
|
-
urlUpdatedByLocation = false;
|
|
700
|
-
|
|
701
|
-
const oldUrl = /** @type {string} */ (this.getBrowserUrl());
|
|
702
|
-
const newUrl = $location.absUrl;
|
|
703
|
-
const oldState = this.state();
|
|
704
|
-
const urlOrStateChanged =
|
|
705
|
-
!urlsEqual(oldUrl, newUrl) ||
|
|
706
|
-
($location.html5 && oldState !== $location.$$state);
|
|
707
|
-
|
|
708
|
-
if (initializing || urlOrStateChanged) {
|
|
709
|
-
initializing = false;
|
|
710
|
-
|
|
711
|
-
setTimeout(() => {
|
|
712
|
-
const newUrl = $location.absUrl;
|
|
713
|
-
const { defaultPrevented } = $rootScope.$broadcast(
|
|
714
|
-
"$locationChangeStart",
|
|
715
|
-
newUrl,
|
|
716
|
-
oldUrl,
|
|
717
|
-
$location.$$state,
|
|
718
|
-
oldState,
|
|
719
|
-
);
|
|
720
|
-
|
|
721
|
-
// if the location was changed by a `$locationChangeStart` handler then stop
|
|
722
|
-
// processing this location change
|
|
723
|
-
if ($location.absUrl !== newUrl) return;
|
|
724
|
-
|
|
725
|
-
if (defaultPrevented) {
|
|
726
|
-
$location.parse(oldUrl);
|
|
727
|
-
$location.$$state = oldState;
|
|
728
|
-
} else {
|
|
729
|
-
if (urlOrStateChanged) {
|
|
730
|
-
setBrowserUrlWithFallback(
|
|
731
|
-
newUrl,
|
|
732
|
-
oldState === $location.$$state ? null : $location.$$state,
|
|
733
|
-
);
|
|
734
|
-
}
|
|
735
|
-
afterLocationChange(oldUrl, oldState);
|
|
736
|
-
}
|
|
737
|
-
});
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
};
|
|
741
|
-
$location.$$updateBrowser = updateBrowser;
|
|
742
|
-
updateBrowser();
|
|
743
|
-
$rootScope.$on("$updateBrowser", updateBrowser);
|
|
744
|
-
|
|
745
|
-
return $location;
|
|
746
|
-
|
|
747
|
-
function afterLocationChange(oldUrl, oldState) {
|
|
748
|
-
$rootScope.$broadcast(
|
|
749
|
-
"$locationChangeSuccess",
|
|
750
|
-
$location.absUrl,
|
|
751
|
-
oldUrl,
|
|
752
|
-
$location.$$state,
|
|
753
|
-
oldState,
|
|
754
|
-
);
|
|
755
|
-
}
|
|
756
|
-
},
|
|
757
|
-
];
|
|
758
|
-
}
|
|
759
|
-
|
|
760
|
-
/**
|
|
761
|
-
* ///////////////////////////
|
|
762
|
-
* PRIVATE HELPERS
|
|
763
|
-
* ///////////////////////////
|
|
764
|
-
*/
|
|
765
|
-
|
|
766
|
-
/**
|
|
767
|
-
* @ignore
|
|
768
|
-
* Encodes a URL path by encoding each path segment individually using `encodeUriSegment`,
|
|
769
|
-
* while preserving forward slashes (`/`) as segment separators.
|
|
770
|
-
*
|
|
771
|
-
* This function first decodes any existing percent-encodings (such as `%20` or `%2F`)
|
|
772
|
-
* in each segment to prevent double encoding, except for encoded forward slashes (`%2F`),
|
|
773
|
-
* which are replaced with literal slashes before decoding to keep path boundaries intact.
|
|
774
|
-
*
|
|
775
|
-
* After decoding, each segment is re-encoded with `encodeUriSegment` according to RFC 3986,
|
|
776
|
-
* encoding only characters that must be encoded in a path segment.
|
|
777
|
-
*
|
|
778
|
-
* The encoded segments are then rejoined with `/` to form the encoded path.
|
|
779
|
-
*
|
|
780
|
-
* @param {string} path - The URL path string to encode. May contain multiple segments separated by `/`.
|
|
781
|
-
* @returns {string} The encoded path, where each segment is encoded, but forward slashes are preserved.
|
|
782
|
-
*
|
|
783
|
-
* @example
|
|
784
|
-
* encodePath("user profile/images/pic 1.jpg")
|
|
785
|
-
* // returns "user%20profile/images/pic%201.jpg"
|
|
786
|
-
*
|
|
787
|
-
* @example
|
|
788
|
-
* encodePath("folder1%2Fsub/folder2")
|
|
789
|
-
* // returns "folder1%2Fsub/folder2"
|
|
790
|
-
*/
|
|
791
|
-
export function encodePath(path) {
|
|
792
|
-
const segments = path.split("/");
|
|
793
|
-
let i = segments.length;
|
|
794
|
-
|
|
795
|
-
while (i--) {
|
|
796
|
-
// Decode any existing encodings (e.g. %20, %2F) to prevent double-encoding
|
|
797
|
-
// But keep slashes intact (they were split on)
|
|
798
|
-
const decodedSegment = decodeURIComponent(
|
|
799
|
-
segments[i].replace(/%2F/gi, "/"),
|
|
800
|
-
);
|
|
801
|
-
segments[i] = encodeUriSegment(decodedSegment);
|
|
802
|
-
}
|
|
803
|
-
|
|
804
|
-
return segments.join("/");
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
/**
|
|
808
|
-
* @ignore
|
|
809
|
-
* Decodes each segment of a URL path.
|
|
810
|
-
*
|
|
811
|
-
* Splits the input path by "/", decodes each segment using decodeURIComponent,
|
|
812
|
-
* and if html5Mode is enabled, re-encodes any forward slashes inside segments
|
|
813
|
-
* as "%2F" to avoid confusion with path separators.
|
|
814
|
-
*
|
|
815
|
-
* @param {string} path - The URL path to decode.
|
|
816
|
-
* @param {boolean} html5Mode - If true, encodes forward slashes in segments as "%2F".
|
|
817
|
-
* @returns {string} The decoded path with segments optionally encoding slashes.
|
|
818
|
-
*/
|
|
819
|
-
export function decodePath(path, html5Mode) {
|
|
820
|
-
const segments = path.split("/");
|
|
821
|
-
let i = segments.length;
|
|
822
|
-
|
|
823
|
-
while (i--) {
|
|
824
|
-
segments[i] = decodeURIComponent(segments[i]);
|
|
825
|
-
if (html5Mode) {
|
|
826
|
-
// encode forward slashes to prevent them from being mistaken for path separators
|
|
827
|
-
segments[i] = segments[i].replace(/\//g, "%2F");
|
|
828
|
-
}
|
|
829
|
-
}
|
|
830
|
-
|
|
831
|
-
return segments.join("/");
|
|
832
|
-
}
|
|
833
|
-
|
|
834
|
-
/**
|
|
835
|
-
* @ignore
|
|
836
|
-
* Normalizes a URL path by encoding the path segments, query parameters, and hash fragment.
|
|
837
|
-
*
|
|
838
|
-
* - Path segments are encoded using `encodePath`, which encodes each segment individually.
|
|
839
|
-
* - Query parameters (`searchValue`) are converted to a query string using `toKeyValue`.
|
|
840
|
-
* - Hash fragment (`hashValue`) is encoded using `encodeUriSegment` and prefixed with `#`.
|
|
841
|
-
*
|
|
842
|
-
* This function returns a fully constructed URL path with optional query and hash components.
|
|
843
|
-
*
|
|
844
|
-
* @param {string} pathValue - The base URL path (e.g., "folder/item name").
|
|
845
|
-
* @param {Object.<string, any> | string | null} searchValue - An object or string representing query parameters.
|
|
846
|
-
* - If an object, it can contain strings, numbers, booleans, or arrays of values.
|
|
847
|
-
* - If a string, it is assumed to be a raw query string.
|
|
848
|
-
* - If null or undefined, no query string is added.
|
|
849
|
-
* @param {string | null} hashValue - The URL fragment (everything after `#`). If null or undefined, no hash is added.
|
|
850
|
-
*
|
|
851
|
-
* @returns {string} The normalized URL path including encoded path, optional query string, and optional hash.
|
|
852
|
-
*
|
|
853
|
-
* @example
|
|
854
|
-
* normalizePath("products/list", { category: "books", page: 2 }, "section1")
|
|
855
|
-
* // returns "products/list?category=books&page=2#section1"
|
|
856
|
-
*
|
|
857
|
-
* @example
|
|
858
|
-
* normalizePath("user profile/images", null, null)
|
|
859
|
-
* // returns "user%20profile/images"
|
|
860
|
-
*/
|
|
861
|
-
export function normalizePath(pathValue, searchValue, hashValue) {
|
|
862
|
-
const search = toKeyValue(searchValue);
|
|
863
|
-
const hash = hashValue ? `#${encodeUriSegment(hashValue)}` : "";
|
|
864
|
-
const path = encodePath(pathValue);
|
|
865
|
-
|
|
866
|
-
return path + (search ? `?${search}` : "") + hash;
|
|
867
|
-
}
|
|
868
|
-
|
|
869
|
-
/**
|
|
870
|
-
* @ignore
|
|
871
|
-
* Parses the application URL and updates the location object with path, search, and hash.
|
|
872
|
-
*
|
|
873
|
-
* @param {string} url - The URL string to parse.
|
|
874
|
-
* @param {boolean} html5Mode - Whether HTML5 mode is enabled (affects decoding).
|
|
875
|
-
* @throws Will throw an error if the URL starts with invalid slashes.
|
|
876
|
-
*/
|
|
877
|
-
export function parseAppUrl(url, html5Mode) {
|
|
878
|
-
if (/^\s*[\\/]{2,}/.test(url)) {
|
|
879
|
-
throw $locationMinErr("badpath", 'Invalid url "{0}".', url);
|
|
880
|
-
}
|
|
881
|
-
|
|
882
|
-
const prefixed = url.charAt(0) !== "/";
|
|
883
|
-
if (prefixed) {
|
|
884
|
-
url = `/${url}`;
|
|
885
|
-
}
|
|
886
|
-
const match = urlResolve(url);
|
|
887
|
-
const path =
|
|
888
|
-
prefixed && match.pathname.charAt(0) === "/"
|
|
889
|
-
? match.pathname.substring(1)
|
|
890
|
-
: match.pathname;
|
|
891
|
-
$$path = decodePath(path, html5Mode);
|
|
892
|
-
$$search = parseKeyValue(match.search);
|
|
893
|
-
$$hash = decodeURIComponent(match.hash);
|
|
894
|
-
|
|
895
|
-
// make sure path starts with '/';
|
|
896
|
-
if ($$path && $$path.charAt(0) !== "/") {
|
|
897
|
-
$$path = `/${$$path}`;
|
|
898
|
-
}
|
|
899
|
-
}
|
|
900
|
-
|
|
901
|
-
/**
|
|
902
|
-
* @ignore
|
|
903
|
-
* Returns the substring of `url` after the `base` string if `url` starts with `base`.
|
|
904
|
-
* Returns `undefined` if `url` does not start with `base`.
|
|
905
|
-
* @param {string} base
|
|
906
|
-
* @param {string} url
|
|
907
|
-
* @returns {string} returns text from `url` after `base` or `undefined` if it does not begin with
|
|
908
|
-
* the expected string.
|
|
909
|
-
*/
|
|
910
|
-
export function stripBaseUrl(base, url) {
|
|
911
|
-
if (startsWith(url, base)) {
|
|
912
|
-
return url.substring(base.length);
|
|
913
|
-
}
|
|
914
|
-
}
|
|
915
|
-
|
|
916
|
-
/**
|
|
917
|
-
* @ignore
|
|
918
|
-
* Removes the hash fragment (including the '#') from the given URL string.
|
|
919
|
-
*
|
|
920
|
-
* @param {string} url - The URL string to process.
|
|
921
|
-
* @returns {string} The URL without the hash fragment.
|
|
922
|
-
*/
|
|
923
|
-
export function stripHash(url) {
|
|
924
|
-
const index = url.indexOf("#");
|
|
925
|
-
return index === -1 ? url : url.substring(0, index);
|
|
926
|
-
}
|
|
927
|
-
|
|
928
|
-
/**
|
|
929
|
-
* @ignore
|
|
930
|
-
* Removes the file name (and any hash) from a URL, returning the base directory path.
|
|
931
|
-
*
|
|
932
|
-
* For example:
|
|
933
|
-
* - Input: "https://example.com/path/to/file.js"
|
|
934
|
-
* Output: "https://example.com/path/to/"
|
|
935
|
-
*
|
|
936
|
-
* - Input: "https://example.com/path/to/file.js#section"
|
|
937
|
-
* Output: "https://example.com/path/to/"
|
|
938
|
-
*
|
|
939
|
-
* @param {string} url - The URL from which to strip the file name and hash.
|
|
940
|
-
* @returns {string} The base path of the URL, ending with a slash.
|
|
941
|
-
*/
|
|
942
|
-
export function stripFile(url) {
|
|
943
|
-
return url.substring(0, stripHash(url).lastIndexOf("/") + 1);
|
|
944
|
-
}
|
|
945
|
-
|
|
946
|
-
/**
|
|
947
|
-
* @ignore
|
|
948
|
-
* Extracts the base server URL (scheme, host, and optional port) from a full URL.
|
|
949
|
-
*
|
|
950
|
-
* If no path is present, returns the full URL.
|
|
951
|
-
*
|
|
952
|
-
* For example:
|
|
953
|
-
* - Input: "https://example.com/path/to/file"
|
|
954
|
-
* Output: "https://example.com"
|
|
955
|
-
*
|
|
956
|
-
* - Input: "http://localhost:3000/api/data"
|
|
957
|
-
* Output: "http://localhost:3000"
|
|
958
|
-
*
|
|
959
|
-
* @param {string} url - The full URL to extract the server base from.
|
|
960
|
-
* @returns {string} The server base, including scheme and host (and port if present).
|
|
961
|
-
*/
|
|
962
|
-
export function serverBase(url) {
|
|
963
|
-
const start = url.indexOf("//") + 2;
|
|
964
|
-
const slashIndex = url.indexOf("/", start);
|
|
965
|
-
return slashIndex === -1 ? url : url.substring(0, slashIndex);
|
|
966
|
-
}
|
|
967
|
-
|
|
968
|
-
/**
|
|
969
|
-
* @ignore
|
|
970
|
-
* Determine if two URLs are equal despite potential differences in encoding,
|
|
971
|
-
* trailing slashes, or empty hash fragments, such as between $location.absUrl() and $browser.url().
|
|
972
|
-
*
|
|
973
|
-
* @param {string} a - First URL to compare.
|
|
974
|
-
* @param {string} b - Second URL to compare.
|
|
975
|
-
* @returns {boolean} True if URLs are equivalent after normalization.
|
|
976
|
-
*/
|
|
977
|
-
export function urlsEqual(a, b) {
|
|
978
|
-
return normalizeUrl(a) === normalizeUrl(b);
|
|
979
|
-
}
|
|
980
|
-
|
|
981
|
-
/**
|
|
982
|
-
* @ignore
|
|
983
|
-
* Normalize a URL by resolving it via a DOM anchor element,
|
|
984
|
-
* removing trailing slashes (except root), and trimming empty hashes.
|
|
985
|
-
*
|
|
986
|
-
* @param {string} url - URL to normalize.
|
|
987
|
-
* @returns {string} Normalized URL string.
|
|
988
|
-
*/
|
|
989
|
-
function normalizeUrl(url) {
|
|
990
|
-
const anchor = document.createElement("a");
|
|
991
|
-
anchor.href = url;
|
|
992
|
-
|
|
993
|
-
let normalized = anchor.href;
|
|
994
|
-
|
|
995
|
-
// Remove trailing slash unless it's root (e.g., https://example.com/)
|
|
996
|
-
if (normalized.endsWith("/") && !/^https?:\/\/[^/]+\/$/.test(normalized)) {
|
|
997
|
-
normalized = normalized.slice(0, -1);
|
|
998
|
-
}
|
|
999
|
-
|
|
1000
|
-
// Remove empty hash (e.g., https://example.com/foo# -> https://example.com/foo)
|
|
1001
|
-
if (normalized.endsWith("#")) {
|
|
1002
|
-
normalized = normalized.slice(0, -1);
|
|
1003
|
-
}
|
|
1004
|
-
|
|
1005
|
-
return normalized;
|
|
1006
|
-
}
|