@angular/common 16.0.0-next.4 → 16.0.0-next.5
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/{esm2020 → esm2022}/http/src/client.mjs +4 -4
- package/{esm2020 → esm2022}/http/src/interceptor.mjs +4 -4
- package/{esm2020 → esm2022}/http/src/jsonp.mjs +7 -7
- package/esm2022/http/src/module.mjs +133 -0
- package/esm2022/http/src/xhr.mjs +317 -0
- package/{esm2020 → esm2022}/http/src/xsrf.mjs +7 -7
- package/{esm2020 → esm2022}/http/testing/src/backend.mjs +4 -4
- package/{esm2020 → esm2022}/http/testing/src/module.mjs +7 -7
- package/{esm2020 → esm2022}/src/common_module.mjs +5 -5
- package/{esm2020 → esm2022}/src/directives/ng_class.mjs +4 -4
- package/{esm2020 → esm2022}/src/directives/ng_component_outlet.mjs +4 -4
- package/esm2022/src/directives/ng_for_of.mjs +292 -0
- package/{esm2020 → esm2022}/src/directives/ng_if.mjs +4 -4
- package/esm2022/src/directives/ng_optimized_image/image_loaders/imagekit_loader.mjs +49 -0
- package/{esm2020 → esm2022}/src/directives/ng_optimized_image/lcp_image_observer.mjs +4 -4
- package/{esm2020 → esm2022}/src/directives/ng_optimized_image/ng_optimized_image.mjs +4 -4
- package/{esm2020 → esm2022}/src/directives/ng_optimized_image/preconnect_link_checker.mjs +4 -4
- package/{esm2020 → esm2022}/src/directives/ng_optimized_image/preload-link-creator.mjs +4 -4
- package/{esm2020 → esm2022}/src/directives/ng_plural.mjs +7 -7
- package/{esm2020 → esm2022}/src/directives/ng_style.mjs +4 -4
- package/{esm2020 → esm2022}/src/directives/ng_switch.mjs +10 -10
- package/esm2022/src/directives/ng_template_outlet.mjs +89 -0
- package/{esm2020 → esm2022}/src/i18n/localization.mjs +7 -7
- package/{esm2020 → esm2022}/src/location/hash_location_strategy.mjs +4 -4
- package/{esm2020 → esm2022}/src/location/location.mjs +32 -32
- package/{esm2020 → esm2022}/src/location/location_strategy.mjs +7 -7
- package/{esm2020 → esm2022}/src/location/platform_location.mjs +7 -7
- package/{esm2020 → esm2022}/src/pipes/async_pipe.mjs +4 -4
- package/{esm2020 → esm2022}/src/pipes/case_conversion_pipes.mjs +10 -10
- package/{esm2020 → esm2022}/src/pipes/date_pipe.mjs +4 -4
- package/{esm2020 → esm2022}/src/pipes/i18n_plural_pipe.mjs +4 -4
- package/{esm2020 → esm2022}/src/pipes/i18n_select_pipe.mjs +4 -4
- package/{esm2020 → esm2022}/src/pipes/json_pipe.mjs +4 -4
- package/{esm2020 → esm2022}/src/pipes/keyvalue_pipe.mjs +4 -4
- package/{esm2020 → esm2022}/src/pipes/number_pipe.mjs +10 -10
- package/{esm2020 → esm2022}/src/pipes/slice_pipe.mjs +4 -4
- package/{esm2020 → esm2022}/src/version.mjs +1 -1
- package/esm2022/src/viewport_scroller.mjs +212 -0
- package/{esm2020 → esm2022}/testing/src/location_mock.mjs +4 -4
- package/esm2022/testing/src/mock_location_strategy.mjs +93 -0
- package/{esm2020 → esm2022}/testing/src/mock_platform_location.mjs +4 -4
- package/{esm2020 → esm2022}/upgrade/src/location_upgrade_module.mjs +5 -5
- package/{fesm2020 → fesm2022}/common.mjs +165 -160
- package/fesm2022/common.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/http/testing.mjs +10 -10
- package/{fesm2020 → fesm2022}/http/testing.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/http.mjs +78 -47
- package/{fesm2015 → fesm2022}/http.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/testing.mjs +10 -10
- package/fesm2022/testing.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/upgrade.mjs +5 -5
- package/{fesm2020 → fesm2022}/upgrade.mjs.map +1 -1
- package/http/index.d.ts +5 -2
- package/http/testing/index.d.ts +1 -1
- package/index.d.ts +6 -6
- package/package.json +18 -32
- package/testing/index.d.ts +1 -1
- package/upgrade/index.d.ts +1 -1
- package/esm2020/http/src/module.mjs +0 -133
- package/esm2020/http/src/xhr.mjs +0 -286
- package/esm2020/src/directives/ng_for_of.mjs +0 -293
- package/esm2020/src/directives/ng_optimized_image/image_loaders/imagekit_loader.mjs +0 -44
- package/esm2020/src/directives/ng_template_outlet.mjs +0 -88
- package/esm2020/src/viewport_scroller.mjs +0 -212
- package/esm2020/testing/src/mock_location_strategy.mjs +0 -93
- package/fesm2015/common.mjs +0 -6706
- package/fesm2015/common.mjs.map +0 -1
- package/fesm2015/http/testing.mjs +0 -362
- package/fesm2015/http/testing.mjs.map +0 -1
- package/fesm2015/http.mjs +0 -2383
- package/fesm2015/testing.mjs +0 -535
- package/fesm2015/testing.mjs.map +0 -1
- package/fesm2015/upgrade.mjs +0 -894
- package/fesm2015/upgrade.mjs.map +0 -1
- package/fesm2020/common.mjs.map +0 -1
- package/fesm2020/http.mjs.map +0 -1
- package/fesm2020/testing.mjs.map +0 -1
- /package/{esm2020 → esm2022}/common.mjs +0 -0
- /package/{esm2020 → esm2022}/http/http.mjs +0 -0
- /package/{esm2020 → esm2022}/http/index.mjs +0 -0
- /package/{esm2020 → esm2022}/http/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/http/src/backend.mjs +0 -0
- /package/{esm2020 → esm2022}/http/src/context.mjs +0 -0
- /package/{esm2020 → esm2022}/http/src/headers.mjs +0 -0
- /package/{esm2020 → esm2022}/http/src/params.mjs +0 -0
- /package/{esm2020 → esm2022}/http/src/provider.mjs +0 -0
- /package/{esm2020 → esm2022}/http/src/request.mjs +0 -0
- /package/{esm2020 → esm2022}/http/src/response.mjs +0 -0
- /package/{esm2020 → esm2022}/http/testing/index.mjs +0 -0
- /package/{esm2020 → esm2022}/http/testing/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/http/testing/src/api.mjs +0 -0
- /package/{esm2020 → esm2022}/http/testing/src/provider.mjs +0 -0
- /package/{esm2020 → esm2022}/http/testing/src/request.mjs +0 -0
- /package/{esm2020 → esm2022}/http/testing/testing.mjs +0 -0
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/src/common.mjs +0 -0
- /package/{esm2020 → esm2022}/src/cookie.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/index.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/ng_optimized_image/asserts.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/ng_optimized_image/error_helper.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/ng_optimized_image/image_loaders/cloudflare_loader.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/ng_optimized_image/image_loaders/cloudinary_loader.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/ng_optimized_image/image_loaders/image_loader.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/ng_optimized_image/image_loaders/imgix_loader.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/ng_optimized_image/index.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/ng_optimized_image/tokens.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/ng_optimized_image/url.mjs +0 -0
- /package/{esm2020 → esm2022}/src/dom_adapter.mjs +0 -0
- /package/{esm2020 → esm2022}/src/dom_tokens.mjs +0 -0
- /package/{esm2020 → esm2022}/src/errors.mjs +0 -0
- /package/{esm2020 → esm2022}/src/i18n/currencies.mjs +0 -0
- /package/{esm2020 → esm2022}/src/i18n/format_date.mjs +0 -0
- /package/{esm2020 → esm2022}/src/i18n/format_number.mjs +0 -0
- /package/{esm2020 → esm2022}/src/i18n/locale_data.mjs +0 -0
- /package/{esm2020 → esm2022}/src/i18n/locale_data_api.mjs +0 -0
- /package/{esm2020 → esm2022}/src/location/index.mjs +0 -0
- /package/{esm2020 → esm2022}/src/location/util.mjs +0 -0
- /package/{esm2020 → esm2022}/src/pipes/date_pipe_config.mjs +0 -0
- /package/{esm2020 → esm2022}/src/pipes/index.mjs +0 -0
- /package/{esm2020 → esm2022}/src/pipes/invalid_pipe_argument_error.mjs +0 -0
- /package/{esm2020 → esm2022}/src/platform_id.mjs +0 -0
- /package/{esm2020 → esm2022}/src/private_export.mjs +0 -0
- /package/{esm2020 → esm2022}/src/xhr.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/index.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/src/provide_location_mocks.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/src/testing.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/testing.mjs +0 -0
- /package/{esm2020 → esm2022}/upgrade/index.mjs +0 -0
- /package/{esm2020 → esm2022}/upgrade/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/upgrade/src/index.mjs +0 -0
- /package/{esm2020 → esm2022}/upgrade/src/location_shim.mjs +0 -0
- /package/{esm2020 → esm2022}/upgrade/src/params.mjs +0 -0
- /package/{esm2020 → esm2022}/upgrade/src/utils.mjs +0 -0
- /package/{esm2020 → esm2022}/upgrade/upgrade.mjs +0 -0
package/fesm2015/testing.mjs
DELETED
|
@@ -1,535 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license Angular v16.0.0-next.4
|
|
3
|
-
* (c) 2010-2022 Google LLC. https://angular.io/
|
|
4
|
-
* License: MIT
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import * as i0 from '@angular/core';
|
|
8
|
-
import { EventEmitter, Injectable, InjectionToken, Inject, Optional } from '@angular/core';
|
|
9
|
-
import { LocationStrategy, Location } from '@angular/common';
|
|
10
|
-
import { Subject } from 'rxjs';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Joins two parts of a URL with a slash if needed.
|
|
14
|
-
*
|
|
15
|
-
* @param start URL string
|
|
16
|
-
* @param end URL string
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* @returns The joined URL string.
|
|
20
|
-
*/
|
|
21
|
-
function joinWithSlash(start, end) {
|
|
22
|
-
if (start.length == 0) {
|
|
23
|
-
return end;
|
|
24
|
-
}
|
|
25
|
-
if (end.length == 0) {
|
|
26
|
-
return start;
|
|
27
|
-
}
|
|
28
|
-
let slashes = 0;
|
|
29
|
-
if (start.endsWith('/')) {
|
|
30
|
-
slashes++;
|
|
31
|
-
}
|
|
32
|
-
if (end.startsWith('/')) {
|
|
33
|
-
slashes++;
|
|
34
|
-
}
|
|
35
|
-
if (slashes == 2) {
|
|
36
|
-
return start + end.substring(1);
|
|
37
|
-
}
|
|
38
|
-
if (slashes == 1) {
|
|
39
|
-
return start + end;
|
|
40
|
-
}
|
|
41
|
-
return start + '/' + end;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Removes a trailing slash from a URL string if needed.
|
|
45
|
-
* Looks for the first occurrence of either `#`, `?`, or the end of the
|
|
46
|
-
* line as `/` characters and removes the trailing slash if one exists.
|
|
47
|
-
*
|
|
48
|
-
* @param url URL string.
|
|
49
|
-
*
|
|
50
|
-
* @returns The URL string, modified if needed.
|
|
51
|
-
*/
|
|
52
|
-
function stripTrailingSlash(url) {
|
|
53
|
-
const match = url.match(/#|\?|$/);
|
|
54
|
-
const pathEndIdx = match && match.index || url.length;
|
|
55
|
-
const droppedSlashIdx = pathEndIdx - (url[pathEndIdx - 1] === '/' ? 1 : 0);
|
|
56
|
-
return url.slice(0, droppedSlashIdx) + url.slice(pathEndIdx);
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Normalizes URL parameters by prepending with `?` if needed.
|
|
60
|
-
*
|
|
61
|
-
* @param params String of URL parameters.
|
|
62
|
-
*
|
|
63
|
-
* @returns The normalized URL parameters string.
|
|
64
|
-
*/
|
|
65
|
-
function normalizeQueryParams(params) {
|
|
66
|
-
return params && params[0] !== '?' ? '?' + params : params;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* A spy for {@link Location} that allows tests to fire simulated location events.
|
|
71
|
-
*
|
|
72
|
-
* @publicApi
|
|
73
|
-
*/
|
|
74
|
-
class SpyLocation {
|
|
75
|
-
constructor() {
|
|
76
|
-
this.urlChanges = [];
|
|
77
|
-
this._history = [new LocationState('', '', null)];
|
|
78
|
-
this._historyIndex = 0;
|
|
79
|
-
/** @internal */
|
|
80
|
-
this._subject = new EventEmitter();
|
|
81
|
-
/** @internal */
|
|
82
|
-
this._basePath = '';
|
|
83
|
-
/** @internal */
|
|
84
|
-
this._locationStrategy = null;
|
|
85
|
-
/** @internal */
|
|
86
|
-
this._urlChangeListeners = [];
|
|
87
|
-
/** @internal */
|
|
88
|
-
this._urlChangeSubscription = null;
|
|
89
|
-
}
|
|
90
|
-
/** @nodoc */
|
|
91
|
-
ngOnDestroy() {
|
|
92
|
-
var _a;
|
|
93
|
-
(_a = this._urlChangeSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
94
|
-
this._urlChangeListeners = [];
|
|
95
|
-
}
|
|
96
|
-
setInitialPath(url) {
|
|
97
|
-
this._history[this._historyIndex].path = url;
|
|
98
|
-
}
|
|
99
|
-
setBaseHref(url) {
|
|
100
|
-
this._basePath = url;
|
|
101
|
-
}
|
|
102
|
-
path() {
|
|
103
|
-
return this._history[this._historyIndex].path;
|
|
104
|
-
}
|
|
105
|
-
getState() {
|
|
106
|
-
return this._history[this._historyIndex].state;
|
|
107
|
-
}
|
|
108
|
-
isCurrentPathEqualTo(path, query = '') {
|
|
109
|
-
const givenPath = path.endsWith('/') ? path.substring(0, path.length - 1) : path;
|
|
110
|
-
const currPath = this.path().endsWith('/') ? this.path().substring(0, this.path().length - 1) : this.path();
|
|
111
|
-
return currPath == givenPath + (query.length > 0 ? ('?' + query) : '');
|
|
112
|
-
}
|
|
113
|
-
simulateUrlPop(pathname) {
|
|
114
|
-
this._subject.emit({ 'url': pathname, 'pop': true, 'type': 'popstate' });
|
|
115
|
-
}
|
|
116
|
-
simulateHashChange(pathname) {
|
|
117
|
-
const path = this.prepareExternalUrl(pathname);
|
|
118
|
-
this.pushHistory(path, '', null);
|
|
119
|
-
this.urlChanges.push('hash: ' + pathname);
|
|
120
|
-
// the browser will automatically fire popstate event before each `hashchange` event, so we need
|
|
121
|
-
// to simulate it.
|
|
122
|
-
this._subject.emit({ 'url': pathname, 'pop': true, 'type': 'popstate' });
|
|
123
|
-
this._subject.emit({ 'url': pathname, 'pop': true, 'type': 'hashchange' });
|
|
124
|
-
}
|
|
125
|
-
prepareExternalUrl(url) {
|
|
126
|
-
if (url.length > 0 && !url.startsWith('/')) {
|
|
127
|
-
url = '/' + url;
|
|
128
|
-
}
|
|
129
|
-
return this._basePath + url;
|
|
130
|
-
}
|
|
131
|
-
go(path, query = '', state = null) {
|
|
132
|
-
path = this.prepareExternalUrl(path);
|
|
133
|
-
this.pushHistory(path, query, state);
|
|
134
|
-
const locationState = this._history[this._historyIndex - 1];
|
|
135
|
-
if (locationState.path == path && locationState.query == query) {
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
const url = path + (query.length > 0 ? ('?' + query) : '');
|
|
139
|
-
this.urlChanges.push(url);
|
|
140
|
-
this._notifyUrlChangeListeners(path + normalizeQueryParams(query), state);
|
|
141
|
-
}
|
|
142
|
-
replaceState(path, query = '', state = null) {
|
|
143
|
-
path = this.prepareExternalUrl(path);
|
|
144
|
-
const history = this._history[this._historyIndex];
|
|
145
|
-
history.state = state;
|
|
146
|
-
if (history.path == path && history.query == query) {
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
history.path = path;
|
|
150
|
-
history.query = query;
|
|
151
|
-
const url = path + (query.length > 0 ? ('?' + query) : '');
|
|
152
|
-
this.urlChanges.push('replace: ' + url);
|
|
153
|
-
this._notifyUrlChangeListeners(path + normalizeQueryParams(query), state);
|
|
154
|
-
}
|
|
155
|
-
forward() {
|
|
156
|
-
if (this._historyIndex < (this._history.length - 1)) {
|
|
157
|
-
this._historyIndex++;
|
|
158
|
-
this._subject.emit({ 'url': this.path(), 'state': this.getState(), 'pop': true, 'type': 'popstate' });
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
back() {
|
|
162
|
-
if (this._historyIndex > 0) {
|
|
163
|
-
this._historyIndex--;
|
|
164
|
-
this._subject.emit({ 'url': this.path(), 'state': this.getState(), 'pop': true, 'type': 'popstate' });
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
historyGo(relativePosition = 0) {
|
|
168
|
-
const nextPageIndex = this._historyIndex + relativePosition;
|
|
169
|
-
if (nextPageIndex >= 0 && nextPageIndex < this._history.length) {
|
|
170
|
-
this._historyIndex = nextPageIndex;
|
|
171
|
-
this._subject.emit({ 'url': this.path(), 'state': this.getState(), 'pop': true, 'type': 'popstate' });
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
onUrlChange(fn) {
|
|
175
|
-
this._urlChangeListeners.push(fn);
|
|
176
|
-
if (!this._urlChangeSubscription) {
|
|
177
|
-
this._urlChangeSubscription = this.subscribe(v => {
|
|
178
|
-
this._notifyUrlChangeListeners(v.url, v.state);
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
return () => {
|
|
182
|
-
var _a;
|
|
183
|
-
const fnIndex = this._urlChangeListeners.indexOf(fn);
|
|
184
|
-
this._urlChangeListeners.splice(fnIndex, 1);
|
|
185
|
-
if (this._urlChangeListeners.length === 0) {
|
|
186
|
-
(_a = this._urlChangeSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
187
|
-
this._urlChangeSubscription = null;
|
|
188
|
-
}
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
/** @internal */
|
|
192
|
-
_notifyUrlChangeListeners(url = '', state) {
|
|
193
|
-
this._urlChangeListeners.forEach(fn => fn(url, state));
|
|
194
|
-
}
|
|
195
|
-
subscribe(onNext, onThrow, onReturn) {
|
|
196
|
-
return this._subject.subscribe({ next: onNext, error: onThrow, complete: onReturn });
|
|
197
|
-
}
|
|
198
|
-
normalize(url) {
|
|
199
|
-
return null;
|
|
200
|
-
}
|
|
201
|
-
pushHistory(path, query, state) {
|
|
202
|
-
if (this._historyIndex > 0) {
|
|
203
|
-
this._history.splice(this._historyIndex + 1);
|
|
204
|
-
}
|
|
205
|
-
this._history.push(new LocationState(path, query, state));
|
|
206
|
-
this._historyIndex = this._history.length - 1;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
SpyLocation.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0-next.4", ngImport: i0, type: SpyLocation, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
210
|
-
SpyLocation.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0-next.4", ngImport: i0, type: SpyLocation });
|
|
211
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0-next.4", ngImport: i0, type: SpyLocation, decorators: [{
|
|
212
|
-
type: Injectable
|
|
213
|
-
}] });
|
|
214
|
-
class LocationState {
|
|
215
|
-
constructor(path, query, state) {
|
|
216
|
-
this.path = path;
|
|
217
|
-
this.query = query;
|
|
218
|
-
this.state = state;
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* A mock implementation of {@link LocationStrategy} that allows tests to fire simulated
|
|
224
|
-
* location events.
|
|
225
|
-
*
|
|
226
|
-
* @publicApi
|
|
227
|
-
*/
|
|
228
|
-
class MockLocationStrategy extends LocationStrategy {
|
|
229
|
-
constructor() {
|
|
230
|
-
super();
|
|
231
|
-
this.internalBaseHref = '/';
|
|
232
|
-
this.internalPath = '/';
|
|
233
|
-
this.internalTitle = '';
|
|
234
|
-
this.urlChanges = [];
|
|
235
|
-
/** @internal */
|
|
236
|
-
this._subject = new EventEmitter();
|
|
237
|
-
this.stateChanges = [];
|
|
238
|
-
}
|
|
239
|
-
simulatePopState(url) {
|
|
240
|
-
this.internalPath = url;
|
|
241
|
-
this._subject.emit(new _MockPopStateEvent(this.path()));
|
|
242
|
-
}
|
|
243
|
-
path(includeHash = false) {
|
|
244
|
-
return this.internalPath;
|
|
245
|
-
}
|
|
246
|
-
prepareExternalUrl(internal) {
|
|
247
|
-
if (internal.startsWith('/') && this.internalBaseHref.endsWith('/')) {
|
|
248
|
-
return this.internalBaseHref + internal.substring(1);
|
|
249
|
-
}
|
|
250
|
-
return this.internalBaseHref + internal;
|
|
251
|
-
}
|
|
252
|
-
pushState(ctx, title, path, query) {
|
|
253
|
-
// Add state change to changes array
|
|
254
|
-
this.stateChanges.push(ctx);
|
|
255
|
-
this.internalTitle = title;
|
|
256
|
-
const url = path + (query.length > 0 ? ('?' + query) : '');
|
|
257
|
-
this.internalPath = url;
|
|
258
|
-
const externalUrl = this.prepareExternalUrl(url);
|
|
259
|
-
this.urlChanges.push(externalUrl);
|
|
260
|
-
}
|
|
261
|
-
replaceState(ctx, title, path, query) {
|
|
262
|
-
// Reset the last index of stateChanges to the ctx (state) object
|
|
263
|
-
this.stateChanges[(this.stateChanges.length || 1) - 1] = ctx;
|
|
264
|
-
this.internalTitle = title;
|
|
265
|
-
const url = path + (query.length > 0 ? ('?' + query) : '');
|
|
266
|
-
this.internalPath = url;
|
|
267
|
-
const externalUrl = this.prepareExternalUrl(url);
|
|
268
|
-
this.urlChanges.push('replace: ' + externalUrl);
|
|
269
|
-
}
|
|
270
|
-
onPopState(fn) {
|
|
271
|
-
this._subject.subscribe({ next: fn });
|
|
272
|
-
}
|
|
273
|
-
getBaseHref() {
|
|
274
|
-
return this.internalBaseHref;
|
|
275
|
-
}
|
|
276
|
-
back() {
|
|
277
|
-
if (this.urlChanges.length > 0) {
|
|
278
|
-
this.urlChanges.pop();
|
|
279
|
-
this.stateChanges.pop();
|
|
280
|
-
const nextUrl = this.urlChanges.length > 0 ? this.urlChanges[this.urlChanges.length - 1] : '';
|
|
281
|
-
this.simulatePopState(nextUrl);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
forward() {
|
|
285
|
-
throw 'not implemented';
|
|
286
|
-
}
|
|
287
|
-
getState() {
|
|
288
|
-
return this.stateChanges[(this.stateChanges.length || 1) - 1];
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
MockLocationStrategy.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0-next.4", ngImport: i0, type: MockLocationStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
292
|
-
MockLocationStrategy.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0-next.4", ngImport: i0, type: MockLocationStrategy });
|
|
293
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0-next.4", ngImport: i0, type: MockLocationStrategy, decorators: [{
|
|
294
|
-
type: Injectable
|
|
295
|
-
}], ctorParameters: function () { return []; } });
|
|
296
|
-
class _MockPopStateEvent {
|
|
297
|
-
constructor(newUrl) {
|
|
298
|
-
this.newUrl = newUrl;
|
|
299
|
-
this.pop = true;
|
|
300
|
-
this.type = 'popstate';
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Parser from https://tools.ietf.org/html/rfc3986#appendix-B
|
|
306
|
-
* ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
|
|
307
|
-
* 12 3 4 5 6 7 8 9
|
|
308
|
-
*
|
|
309
|
-
* Example: http://www.ics.uci.edu/pub/ietf/uri/#Related
|
|
310
|
-
*
|
|
311
|
-
* Results in:
|
|
312
|
-
*
|
|
313
|
-
* $1 = http:
|
|
314
|
-
* $2 = http
|
|
315
|
-
* $3 = //www.ics.uci.edu
|
|
316
|
-
* $4 = www.ics.uci.edu
|
|
317
|
-
* $5 = /pub/ietf/uri/
|
|
318
|
-
* $6 = <undefined>
|
|
319
|
-
* $7 = <undefined>
|
|
320
|
-
* $8 = #Related
|
|
321
|
-
* $9 = Related
|
|
322
|
-
*/
|
|
323
|
-
const urlParse = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;
|
|
324
|
-
function parseUrl(urlStr, baseHref) {
|
|
325
|
-
const verifyProtocol = /^((http[s]?|ftp):\/\/)/;
|
|
326
|
-
let serverBase;
|
|
327
|
-
// URL class requires full URL. If the URL string doesn't start with protocol, we need to add
|
|
328
|
-
// an arbitrary base URL which can be removed afterward.
|
|
329
|
-
if (!verifyProtocol.test(urlStr)) {
|
|
330
|
-
serverBase = 'http://empty.com/';
|
|
331
|
-
}
|
|
332
|
-
let parsedUrl;
|
|
333
|
-
try {
|
|
334
|
-
parsedUrl = new URL(urlStr, serverBase);
|
|
335
|
-
}
|
|
336
|
-
catch (e) {
|
|
337
|
-
const result = urlParse.exec(serverBase || '' + urlStr);
|
|
338
|
-
if (!result) {
|
|
339
|
-
throw new Error(`Invalid URL: ${urlStr} with base: ${baseHref}`);
|
|
340
|
-
}
|
|
341
|
-
const hostSplit = result[4].split(':');
|
|
342
|
-
parsedUrl = {
|
|
343
|
-
protocol: result[1],
|
|
344
|
-
hostname: hostSplit[0],
|
|
345
|
-
port: hostSplit[1] || '',
|
|
346
|
-
pathname: result[5],
|
|
347
|
-
search: result[6],
|
|
348
|
-
hash: result[8],
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
if (parsedUrl.pathname && parsedUrl.pathname.indexOf(baseHref) === 0) {
|
|
352
|
-
parsedUrl.pathname = parsedUrl.pathname.substring(baseHref.length);
|
|
353
|
-
}
|
|
354
|
-
return {
|
|
355
|
-
hostname: !serverBase && parsedUrl.hostname || '',
|
|
356
|
-
protocol: !serverBase && parsedUrl.protocol || '',
|
|
357
|
-
port: !serverBase && parsedUrl.port || '',
|
|
358
|
-
pathname: parsedUrl.pathname || '/',
|
|
359
|
-
search: parsedUrl.search || '',
|
|
360
|
-
hash: parsedUrl.hash || '',
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* Provider for mock platform location config
|
|
365
|
-
*
|
|
366
|
-
* @publicApi
|
|
367
|
-
*/
|
|
368
|
-
const MOCK_PLATFORM_LOCATION_CONFIG = new InjectionToken('MOCK_PLATFORM_LOCATION_CONFIG');
|
|
369
|
-
/**
|
|
370
|
-
* Mock implementation of URL state.
|
|
371
|
-
*
|
|
372
|
-
* @publicApi
|
|
373
|
-
*/
|
|
374
|
-
class MockPlatformLocation {
|
|
375
|
-
constructor(config) {
|
|
376
|
-
this.baseHref = '';
|
|
377
|
-
this.hashUpdate = new Subject();
|
|
378
|
-
this.popStateSubject = new Subject();
|
|
379
|
-
this.urlChangeIndex = 0;
|
|
380
|
-
this.urlChanges = [{ hostname: '', protocol: '', port: '', pathname: '/', search: '', hash: '', state: null }];
|
|
381
|
-
if (config) {
|
|
382
|
-
this.baseHref = config.appBaseHref || '';
|
|
383
|
-
const parsedChanges = this.parseChanges(null, config.startUrl || 'http://_empty_/', this.baseHref);
|
|
384
|
-
this.urlChanges[0] = Object.assign({}, parsedChanges);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
get hostname() {
|
|
388
|
-
return this.urlChanges[this.urlChangeIndex].hostname;
|
|
389
|
-
}
|
|
390
|
-
get protocol() {
|
|
391
|
-
return this.urlChanges[this.urlChangeIndex].protocol;
|
|
392
|
-
}
|
|
393
|
-
get port() {
|
|
394
|
-
return this.urlChanges[this.urlChangeIndex].port;
|
|
395
|
-
}
|
|
396
|
-
get pathname() {
|
|
397
|
-
return this.urlChanges[this.urlChangeIndex].pathname;
|
|
398
|
-
}
|
|
399
|
-
get search() {
|
|
400
|
-
return this.urlChanges[this.urlChangeIndex].search;
|
|
401
|
-
}
|
|
402
|
-
get hash() {
|
|
403
|
-
return this.urlChanges[this.urlChangeIndex].hash;
|
|
404
|
-
}
|
|
405
|
-
get state() {
|
|
406
|
-
return this.urlChanges[this.urlChangeIndex].state;
|
|
407
|
-
}
|
|
408
|
-
getBaseHrefFromDOM() {
|
|
409
|
-
return this.baseHref;
|
|
410
|
-
}
|
|
411
|
-
onPopState(fn) {
|
|
412
|
-
const subscription = this.popStateSubject.subscribe(fn);
|
|
413
|
-
return () => subscription.unsubscribe();
|
|
414
|
-
}
|
|
415
|
-
onHashChange(fn) {
|
|
416
|
-
const subscription = this.hashUpdate.subscribe(fn);
|
|
417
|
-
return () => subscription.unsubscribe();
|
|
418
|
-
}
|
|
419
|
-
get href() {
|
|
420
|
-
let url = `${this.protocol}//${this.hostname}${this.port ? ':' + this.port : ''}`;
|
|
421
|
-
url += `${this.pathname === '/' ? '' : this.pathname}${this.search}${this.hash}`;
|
|
422
|
-
return url;
|
|
423
|
-
}
|
|
424
|
-
get url() {
|
|
425
|
-
return `${this.pathname}${this.search}${this.hash}`;
|
|
426
|
-
}
|
|
427
|
-
parseChanges(state, url, baseHref = '') {
|
|
428
|
-
// When the `history.state` value is stored, it is always copied.
|
|
429
|
-
state = JSON.parse(JSON.stringify(state));
|
|
430
|
-
return Object.assign(Object.assign({}, parseUrl(url, baseHref)), { state });
|
|
431
|
-
}
|
|
432
|
-
replaceState(state, title, newUrl) {
|
|
433
|
-
const { pathname, search, state: parsedState, hash } = this.parseChanges(state, newUrl);
|
|
434
|
-
this.urlChanges[this.urlChangeIndex] = Object.assign(Object.assign({}, this.urlChanges[this.urlChangeIndex]), { pathname, search, hash, state: parsedState });
|
|
435
|
-
}
|
|
436
|
-
pushState(state, title, newUrl) {
|
|
437
|
-
const { pathname, search, state: parsedState, hash } = this.parseChanges(state, newUrl);
|
|
438
|
-
if (this.urlChangeIndex > 0) {
|
|
439
|
-
this.urlChanges.splice(this.urlChangeIndex + 1);
|
|
440
|
-
}
|
|
441
|
-
this.urlChanges.push(Object.assign(Object.assign({}, this.urlChanges[this.urlChangeIndex]), { pathname, search, hash, state: parsedState }));
|
|
442
|
-
this.urlChangeIndex = this.urlChanges.length - 1;
|
|
443
|
-
}
|
|
444
|
-
forward() {
|
|
445
|
-
const oldUrl = this.url;
|
|
446
|
-
const oldHash = this.hash;
|
|
447
|
-
if (this.urlChangeIndex < this.urlChanges.length) {
|
|
448
|
-
this.urlChangeIndex++;
|
|
449
|
-
}
|
|
450
|
-
this.emitEvents(oldHash, oldUrl);
|
|
451
|
-
}
|
|
452
|
-
back() {
|
|
453
|
-
const oldUrl = this.url;
|
|
454
|
-
const oldHash = this.hash;
|
|
455
|
-
if (this.urlChangeIndex > 0) {
|
|
456
|
-
this.urlChangeIndex--;
|
|
457
|
-
}
|
|
458
|
-
this.emitEvents(oldHash, oldUrl);
|
|
459
|
-
}
|
|
460
|
-
historyGo(relativePosition = 0) {
|
|
461
|
-
const oldUrl = this.url;
|
|
462
|
-
const oldHash = this.hash;
|
|
463
|
-
const nextPageIndex = this.urlChangeIndex + relativePosition;
|
|
464
|
-
if (nextPageIndex >= 0 && nextPageIndex < this.urlChanges.length) {
|
|
465
|
-
this.urlChangeIndex = nextPageIndex;
|
|
466
|
-
}
|
|
467
|
-
this.emitEvents(oldHash, oldUrl);
|
|
468
|
-
}
|
|
469
|
-
getState() {
|
|
470
|
-
return this.state;
|
|
471
|
-
}
|
|
472
|
-
/**
|
|
473
|
-
* Browsers are inconsistent in when they fire events and perform the state updates
|
|
474
|
-
* The most easiest thing to do in our mock is synchronous and that happens to match
|
|
475
|
-
* Firefox and Chrome, at least somewhat closely
|
|
476
|
-
*
|
|
477
|
-
* https://github.com/WICG/navigation-api#watching-for-navigations
|
|
478
|
-
* https://docs.google.com/document/d/1Pdve-DJ1JCGilj9Yqf5HxRJyBKSel5owgOvUJqTauwU/edit#heading=h.3ye4v71wsz94
|
|
479
|
-
* popstate is always sent before hashchange:
|
|
480
|
-
* https://developer.mozilla.org/en-US/docs/Web/API/Window/popstate_event#when_popstate_is_sent
|
|
481
|
-
*/
|
|
482
|
-
emitEvents(oldHash, oldUrl) {
|
|
483
|
-
this.popStateSubject.next({ type: 'popstate', state: this.getState(), oldUrl, newUrl: this.url });
|
|
484
|
-
if (oldHash !== this.hash) {
|
|
485
|
-
this.hashUpdate.next({ type: 'hashchange', state: null, oldUrl, newUrl: this.url });
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
MockPlatformLocation.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0-next.4", ngImport: i0, type: MockPlatformLocation, deps: [{ token: MOCK_PLATFORM_LOCATION_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
490
|
-
MockPlatformLocation.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0-next.4", ngImport: i0, type: MockPlatformLocation });
|
|
491
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0-next.4", ngImport: i0, type: MockPlatformLocation, decorators: [{
|
|
492
|
-
type: Injectable
|
|
493
|
-
}], ctorParameters: function () {
|
|
494
|
-
return [{ type: undefined, decorators: [{
|
|
495
|
-
type: Inject,
|
|
496
|
-
args: [MOCK_PLATFORM_LOCATION_CONFIG]
|
|
497
|
-
}, {
|
|
498
|
-
type: Optional
|
|
499
|
-
}] }];
|
|
500
|
-
} });
|
|
501
|
-
|
|
502
|
-
/**
|
|
503
|
-
* Returns mock providers for the `Location` and `LocationStrategy` classes.
|
|
504
|
-
* The mocks are helpful in tests to fire simulated location events.
|
|
505
|
-
*
|
|
506
|
-
* @publicApi
|
|
507
|
-
*/
|
|
508
|
-
function provideLocationMocks() {
|
|
509
|
-
return [
|
|
510
|
-
{ provide: Location, useClass: SpyLocation },
|
|
511
|
-
{ provide: LocationStrategy, useClass: MockLocationStrategy },
|
|
512
|
-
];
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
/**
|
|
516
|
-
* @module
|
|
517
|
-
* @description
|
|
518
|
-
* Entry point for all public APIs of the common/testing package.
|
|
519
|
-
*/
|
|
520
|
-
|
|
521
|
-
/**
|
|
522
|
-
* @module
|
|
523
|
-
* @description
|
|
524
|
-
* Entry point for all public APIs of this package.
|
|
525
|
-
*/
|
|
526
|
-
// This file only reexports content of the `src` folder. Keep it that way.
|
|
527
|
-
|
|
528
|
-
// This file is not used to build this module. It is only used during editing
|
|
529
|
-
|
|
530
|
-
/**
|
|
531
|
-
* Generated bundle index. Do not edit.
|
|
532
|
-
*/
|
|
533
|
-
|
|
534
|
-
export { MOCK_PLATFORM_LOCATION_CONFIG, MockLocationStrategy, MockPlatformLocation, SpyLocation, provideLocationMocks };
|
|
535
|
-
//# sourceMappingURL=testing.mjs.map
|
package/fesm2015/testing.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"testing.mjs","sources":["../../../../../../packages/common/src/location/util.ts","../../../../../../packages/common/testing/src/location_mock.ts","../../../../../../packages/common/testing/src/mock_location_strategy.ts","../../../../../../packages/common/testing/src/mock_platform_location.ts","../../../../../../packages/common/testing/src/provide_location_mocks.ts","../../../../../../packages/common/testing/src/testing.ts","../../../../../../packages/common/testing/public_api.ts","../../../../../../packages/common/testing/index.ts","../../../../../../packages/common/testing/testing.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n\n/**\n * Joins two parts of a URL with a slash if needed.\n *\n * @param start URL string\n * @param end URL string\n *\n *\n * @returns The joined URL string.\n */\nexport function joinWithSlash(start: string, end: string): string {\n if (start.length == 0) {\n return end;\n }\n if (end.length == 0) {\n return start;\n }\n let slashes = 0;\n if (start.endsWith('/')) {\n slashes++;\n }\n if (end.startsWith('/')) {\n slashes++;\n }\n if (slashes == 2) {\n return start + end.substring(1);\n }\n if (slashes == 1) {\n return start + end;\n }\n return start + '/' + end;\n}\n\n/**\n * Removes a trailing slash from a URL string if needed.\n * Looks for the first occurrence of either `#`, `?`, or the end of the\n * line as `/` characters and removes the trailing slash if one exists.\n *\n * @param url URL string.\n *\n * @returns The URL string, modified if needed.\n */\nexport function stripTrailingSlash(url: string): string {\n const match = url.match(/#|\\?|$/);\n const pathEndIdx = match && match.index || url.length;\n const droppedSlashIdx = pathEndIdx - (url[pathEndIdx - 1] === '/' ? 1 : 0);\n return url.slice(0, droppedSlashIdx) + url.slice(pathEndIdx);\n}\n\n/**\n * Normalizes URL parameters by prepending with `?` if needed.\n *\n * @param params String of URL parameters.\n *\n * @returns The normalized URL parameters string.\n */\nexport function normalizeQueryParams(params: string): string {\n return params && params[0] !== '?' ? '?' + params : params;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Location, LocationStrategy} from '@angular/common';\nimport {EventEmitter, Injectable} from '@angular/core';\nimport {SubscriptionLike} from 'rxjs';\n\nimport {normalizeQueryParams} from '../../src/location/util';\n\n/**\n * A spy for {@link Location} that allows tests to fire simulated location events.\n *\n * @publicApi\n */\n@Injectable()\nexport class SpyLocation implements Location {\n urlChanges: string[] = [];\n private _history: LocationState[] = [new LocationState('', '', null)];\n private _historyIndex: number = 0;\n /** @internal */\n _subject: EventEmitter<any> = new EventEmitter();\n /** @internal */\n _basePath: string = '';\n /** @internal */\n _locationStrategy: LocationStrategy = null!;\n /** @internal */\n _urlChangeListeners: ((url: string, state: unknown) => void)[] = [];\n /** @internal */\n _urlChangeSubscription: SubscriptionLike|null = null;\n\n /** @nodoc */\n ngOnDestroy(): void {\n this._urlChangeSubscription?.unsubscribe();\n this._urlChangeListeners = [];\n }\n\n setInitialPath(url: string) {\n this._history[this._historyIndex].path = url;\n }\n\n setBaseHref(url: string) {\n this._basePath = url;\n }\n\n path(): string {\n return this._history[this._historyIndex].path;\n }\n\n getState(): unknown {\n return this._history[this._historyIndex].state;\n }\n\n isCurrentPathEqualTo(path: string, query: string = ''): boolean {\n const givenPath = path.endsWith('/') ? path.substring(0, path.length - 1) : path;\n const currPath =\n this.path().endsWith('/') ? this.path().substring(0, this.path().length - 1) : this.path();\n\n return currPath == givenPath + (query.length > 0 ? ('?' + query) : '');\n }\n\n simulateUrlPop(pathname: string) {\n this._subject.emit({'url': pathname, 'pop': true, 'type': 'popstate'});\n }\n\n simulateHashChange(pathname: string) {\n const path = this.prepareExternalUrl(pathname);\n this.pushHistory(path, '', null);\n\n this.urlChanges.push('hash: ' + pathname);\n // the browser will automatically fire popstate event before each `hashchange` event, so we need\n // to simulate it.\n this._subject.emit({'url': pathname, 'pop': true, 'type': 'popstate'});\n this._subject.emit({'url': pathname, 'pop': true, 'type': 'hashchange'});\n }\n\n prepareExternalUrl(url: string): string {\n if (url.length > 0 && !url.startsWith('/')) {\n url = '/' + url;\n }\n return this._basePath + url;\n }\n\n go(path: string, query: string = '', state: any = null) {\n path = this.prepareExternalUrl(path);\n\n this.pushHistory(path, query, state);\n\n const locationState = this._history[this._historyIndex - 1];\n if (locationState.path == path && locationState.query == query) {\n return;\n }\n\n const url = path + (query.length > 0 ? ('?' + query) : '');\n this.urlChanges.push(url);\n this._notifyUrlChangeListeners(path + normalizeQueryParams(query), state);\n }\n\n replaceState(path: string, query: string = '', state: any = null) {\n path = this.prepareExternalUrl(path);\n\n const history = this._history[this._historyIndex];\n\n history.state = state;\n\n if (history.path == path && history.query == query) {\n return;\n }\n\n history.path = path;\n history.query = query;\n\n const url = path + (query.length > 0 ? ('?' + query) : '');\n this.urlChanges.push('replace: ' + url);\n this._notifyUrlChangeListeners(path + normalizeQueryParams(query), state);\n }\n\n forward() {\n if (this._historyIndex < (this._history.length - 1)) {\n this._historyIndex++;\n this._subject.emit(\n {'url': this.path(), 'state': this.getState(), 'pop': true, 'type': 'popstate'});\n }\n }\n\n back() {\n if (this._historyIndex > 0) {\n this._historyIndex--;\n this._subject.emit(\n {'url': this.path(), 'state': this.getState(), 'pop': true, 'type': 'popstate'});\n }\n }\n\n historyGo(relativePosition: number = 0): void {\n const nextPageIndex = this._historyIndex + relativePosition;\n if (nextPageIndex >= 0 && nextPageIndex < this._history.length) {\n this._historyIndex = nextPageIndex;\n this._subject.emit(\n {'url': this.path(), 'state': this.getState(), 'pop': true, 'type': 'popstate'});\n }\n }\n\n onUrlChange(fn: (url: string, state: unknown) => void): VoidFunction {\n this._urlChangeListeners.push(fn);\n\n if (!this._urlChangeSubscription) {\n this._urlChangeSubscription = this.subscribe(v => {\n this._notifyUrlChangeListeners(v.url, v.state);\n });\n }\n\n return () => {\n const fnIndex = this._urlChangeListeners.indexOf(fn);\n this._urlChangeListeners.splice(fnIndex, 1);\n\n if (this._urlChangeListeners.length === 0) {\n this._urlChangeSubscription?.unsubscribe();\n this._urlChangeSubscription = null;\n }\n };\n }\n\n /** @internal */\n _notifyUrlChangeListeners(url: string = '', state: unknown) {\n this._urlChangeListeners.forEach(fn => fn(url, state));\n }\n\n subscribe(\n onNext: (value: any) => void, onThrow?: ((error: any) => void)|null,\n onReturn?: (() => void)|null): SubscriptionLike {\n return this._subject.subscribe({next: onNext, error: onThrow, complete: onReturn});\n }\n\n normalize(url: string): string {\n return null!;\n }\n\n private pushHistory(path: string, query: string, state: any) {\n if (this._historyIndex > 0) {\n this._history.splice(this._historyIndex + 1);\n }\n this._history.push(new LocationState(path, query, state));\n this._historyIndex = this._history.length - 1;\n }\n}\n\nclass LocationState {\n constructor(public path: string, public query: string, public state: any) {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {LocationStrategy} from '@angular/common';\nimport {EventEmitter, Injectable} from '@angular/core';\n\n\n\n/**\n * A mock implementation of {@link LocationStrategy} that allows tests to fire simulated\n * location events.\n *\n * @publicApi\n */\n@Injectable()\nexport class MockLocationStrategy extends LocationStrategy {\n internalBaseHref: string = '/';\n internalPath: string = '/';\n internalTitle: string = '';\n urlChanges: string[] = [];\n /** @internal */\n _subject: EventEmitter<any> = new EventEmitter();\n private stateChanges: any[] = [];\n constructor() {\n super();\n }\n\n simulatePopState(url: string): void {\n this.internalPath = url;\n this._subject.emit(new _MockPopStateEvent(this.path()));\n }\n\n path(includeHash: boolean = false): string {\n return this.internalPath;\n }\n\n prepareExternalUrl(internal: string): string {\n if (internal.startsWith('/') && this.internalBaseHref.endsWith('/')) {\n return this.internalBaseHref + internal.substring(1);\n }\n return this.internalBaseHref + internal;\n }\n\n pushState(ctx: any, title: string, path: string, query: string): void {\n // Add state change to changes array\n this.stateChanges.push(ctx);\n\n this.internalTitle = title;\n\n const url = path + (query.length > 0 ? ('?' + query) : '');\n this.internalPath = url;\n\n const externalUrl = this.prepareExternalUrl(url);\n this.urlChanges.push(externalUrl);\n }\n\n replaceState(ctx: any, title: string, path: string, query: string): void {\n // Reset the last index of stateChanges to the ctx (state) object\n this.stateChanges[(this.stateChanges.length || 1) - 1] = ctx;\n\n this.internalTitle = title;\n\n const url = path + (query.length > 0 ? ('?' + query) : '');\n this.internalPath = url;\n\n const externalUrl = this.prepareExternalUrl(url);\n this.urlChanges.push('replace: ' + externalUrl);\n }\n\n onPopState(fn: (value: any) => void): void {\n this._subject.subscribe({next: fn});\n }\n\n getBaseHref(): string {\n return this.internalBaseHref;\n }\n\n back(): void {\n if (this.urlChanges.length > 0) {\n this.urlChanges.pop();\n this.stateChanges.pop();\n const nextUrl = this.urlChanges.length > 0 ? this.urlChanges[this.urlChanges.length - 1] : '';\n this.simulatePopState(nextUrl);\n }\n }\n\n forward(): void {\n throw 'not implemented';\n }\n\n getState(): unknown {\n return this.stateChanges[(this.stateChanges.length || 1) - 1];\n }\n}\n\nclass _MockPopStateEvent {\n pop: boolean = true;\n type: string = 'popstate';\n constructor(public newUrl: string) {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {LocationChangeEvent, LocationChangeListener, PlatformLocation} from '@angular/common';\nimport {Inject, Injectable, InjectionToken, Optional} from '@angular/core';\nimport {Subject} from 'rxjs';\n\n/**\n * Parser from https://tools.ietf.org/html/rfc3986#appendix-B\n * ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?\n * 12 3 4 5 6 7 8 9\n *\n * Example: http://www.ics.uci.edu/pub/ietf/uri/#Related\n *\n * Results in:\n *\n * $1 = http:\n * $2 = http\n * $3 = //www.ics.uci.edu\n * $4 = www.ics.uci.edu\n * $5 = /pub/ietf/uri/\n * $6 = <undefined>\n * $7 = <undefined>\n * $8 = #Related\n * $9 = Related\n */\nconst urlParse = /^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/;\n\nfunction parseUrl(urlStr: string, baseHref: string) {\n const verifyProtocol = /^((http[s]?|ftp):\\/\\/)/;\n let serverBase: string|undefined;\n\n // URL class requires full URL. If the URL string doesn't start with protocol, we need to add\n // an arbitrary base URL which can be removed afterward.\n if (!verifyProtocol.test(urlStr)) {\n serverBase = 'http://empty.com/';\n }\n let parsedUrl: {\n protocol: string,\n hostname: string,\n port: string,\n pathname: string,\n search: string,\n hash: string\n };\n try {\n parsedUrl = new URL(urlStr, serverBase);\n } catch (e) {\n const result = urlParse.exec(serverBase || '' + urlStr);\n if (!result) {\n throw new Error(`Invalid URL: ${urlStr} with base: ${baseHref}`);\n }\n const hostSplit = result[4].split(':');\n parsedUrl = {\n protocol: result[1],\n hostname: hostSplit[0],\n port: hostSplit[1] || '',\n pathname: result[5],\n search: result[6],\n hash: result[8],\n };\n }\n if (parsedUrl.pathname && parsedUrl.pathname.indexOf(baseHref) === 0) {\n parsedUrl.pathname = parsedUrl.pathname.substring(baseHref.length);\n }\n return {\n hostname: !serverBase && parsedUrl.hostname || '',\n protocol: !serverBase && parsedUrl.protocol || '',\n port: !serverBase && parsedUrl.port || '',\n pathname: parsedUrl.pathname || '/',\n search: parsedUrl.search || '',\n hash: parsedUrl.hash || '',\n };\n}\n\n/**\n * Mock platform location config\n *\n * @publicApi\n */\nexport interface MockPlatformLocationConfig {\n startUrl?: string;\n appBaseHref?: string;\n}\n\n/**\n * Provider for mock platform location config\n *\n * @publicApi\n */\nexport const MOCK_PLATFORM_LOCATION_CONFIG =\n new InjectionToken<MockPlatformLocationConfig>('MOCK_PLATFORM_LOCATION_CONFIG');\n\n/**\n * Mock implementation of URL state.\n *\n * @publicApi\n */\n@Injectable()\nexport class MockPlatformLocation implements PlatformLocation {\n private baseHref: string = '';\n private hashUpdate = new Subject<LocationChangeEvent>();\n private popStateSubject = new Subject<LocationChangeEvent>();\n private urlChangeIndex: number = 0;\n private urlChanges: {\n hostname: string,\n protocol: string,\n port: string,\n pathname: string,\n search: string,\n hash: string,\n state: unknown\n }[] = [{hostname: '', protocol: '', port: '', pathname: '/', search: '', hash: '', state: null}];\n\n constructor(@Inject(MOCK_PLATFORM_LOCATION_CONFIG) @Optional() config?:\n MockPlatformLocationConfig) {\n if (config) {\n this.baseHref = config.appBaseHref || '';\n\n const parsedChanges =\n this.parseChanges(null, config.startUrl || 'http://_empty_/', this.baseHref);\n this.urlChanges[0] = {...parsedChanges};\n }\n }\n\n get hostname() {\n return this.urlChanges[this.urlChangeIndex].hostname;\n }\n get protocol() {\n return this.urlChanges[this.urlChangeIndex].protocol;\n }\n get port() {\n return this.urlChanges[this.urlChangeIndex].port;\n }\n get pathname() {\n return this.urlChanges[this.urlChangeIndex].pathname;\n }\n get search() {\n return this.urlChanges[this.urlChangeIndex].search;\n }\n get hash() {\n return this.urlChanges[this.urlChangeIndex].hash;\n }\n get state() {\n return this.urlChanges[this.urlChangeIndex].state;\n }\n\n\n getBaseHrefFromDOM(): string {\n return this.baseHref;\n }\n\n onPopState(fn: LocationChangeListener): VoidFunction {\n const subscription = this.popStateSubject.subscribe(fn);\n return () => subscription.unsubscribe();\n }\n\n onHashChange(fn: LocationChangeListener): VoidFunction {\n const subscription = this.hashUpdate.subscribe(fn);\n return () => subscription.unsubscribe();\n }\n\n get href(): string {\n let url = `${this.protocol}//${this.hostname}${this.port ? ':' + this.port : ''}`;\n url += `${this.pathname === '/' ? '' : this.pathname}${this.search}${this.hash}`;\n return url;\n }\n\n get url(): string {\n return `${this.pathname}${this.search}${this.hash}`;\n }\n\n private parseChanges(state: unknown, url: string, baseHref: string = '') {\n // When the `history.state` value is stored, it is always copied.\n state = JSON.parse(JSON.stringify(state));\n return {...parseUrl(url, baseHref), state};\n }\n\n replaceState(state: any, title: string, newUrl: string): void {\n const {pathname, search, state: parsedState, hash} = this.parseChanges(state, newUrl);\n\n this.urlChanges[this.urlChangeIndex] =\n {...this.urlChanges[this.urlChangeIndex], pathname, search, hash, state: parsedState};\n }\n\n pushState(state: any, title: string, newUrl: string): void {\n const {pathname, search, state: parsedState, hash} = this.parseChanges(state, newUrl);\n if (this.urlChangeIndex > 0) {\n this.urlChanges.splice(this.urlChangeIndex + 1);\n }\n this.urlChanges.push(\n {...this.urlChanges[this.urlChangeIndex], pathname, search, hash, state: parsedState});\n this.urlChangeIndex = this.urlChanges.length - 1;\n }\n\n forward(): void {\n const oldUrl = this.url;\n const oldHash = this.hash;\n if (this.urlChangeIndex < this.urlChanges.length) {\n this.urlChangeIndex++;\n }\n this.emitEvents(oldHash, oldUrl);\n }\n\n back(): void {\n const oldUrl = this.url;\n const oldHash = this.hash;\n if (this.urlChangeIndex > 0) {\n this.urlChangeIndex--;\n }\n this.emitEvents(oldHash, oldUrl);\n }\n\n historyGo(relativePosition: number = 0): void {\n const oldUrl = this.url;\n const oldHash = this.hash;\n const nextPageIndex = this.urlChangeIndex + relativePosition;\n if (nextPageIndex >= 0 && nextPageIndex < this.urlChanges.length) {\n this.urlChangeIndex = nextPageIndex;\n }\n this.emitEvents(oldHash, oldUrl);\n }\n\n getState(): unknown {\n return this.state;\n }\n\n /**\n * Browsers are inconsistent in when they fire events and perform the state updates\n * The most easiest thing to do in our mock is synchronous and that happens to match\n * Firefox and Chrome, at least somewhat closely\n *\n * https://github.com/WICG/navigation-api#watching-for-navigations\n * https://docs.google.com/document/d/1Pdve-DJ1JCGilj9Yqf5HxRJyBKSel5owgOvUJqTauwU/edit#heading=h.3ye4v71wsz94\n * popstate is always sent before hashchange:\n * https://developer.mozilla.org/en-US/docs/Web/API/Window/popstate_event#when_popstate_is_sent\n */\n private emitEvents(oldHash: string, oldUrl: string) {\n this.popStateSubject.next(\n {type: 'popstate', state: this.getState(), oldUrl, newUrl: this.url} as\n LocationChangeEvent);\n if (oldHash !== this.hash) {\n this.hashUpdate.next(\n {type: 'hashchange', state: null, oldUrl, newUrl: this.url} as LocationChangeEvent);\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Location, LocationStrategy} from '@angular/common';\nimport {Provider} from '@angular/core';\n\nimport {SpyLocation} from './location_mock';\nimport {MockLocationStrategy} from './mock_location_strategy';\n\n/**\n * Returns mock providers for the `Location` and `LocationStrategy` classes.\n * The mocks are helpful in tests to fire simulated location events.\n *\n * @publicApi\n */\nexport function provideLocationMocks(): Provider[] {\n return [\n {provide: Location, useClass: SpyLocation},\n {provide: LocationStrategy, useClass: MockLocationStrategy},\n ];\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @module\n * @description\n * Entry point for all public APIs of the common/testing package.\n */\nexport {SpyLocation} from './location_mock';\nexport {MockLocationStrategy} from './mock_location_strategy';\nexport {MOCK_PLATFORM_LOCATION_CONFIG, MockPlatformLocation, MockPlatformLocationConfig} from './mock_platform_location';\nexport {provideLocationMocks} from './provide_location_mocks';\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @module\n * @description\n * Entry point for all public APIs of this package.\n */\nexport * from './src/testing';\n\n// This file only reexports content of the `src` folder. Keep it that way.\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n// This file is not used to build this module. It is only used during editing\n// by the TypeScript language service and during build for verification. `ngc`\n// replaces this file with production index.ts when it rewrites private symbol\n// names.\n\nexport * from './public_api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|