@angular/platform-browser 19.0.0-next.1 → 19.0.0-next.10
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/LICENSE +21 -0
- package/animations/async/index.d.ts +10 -1
- package/animations/index.d.ts +1 -1
- package/fesm2022/animations/async.mjs +25 -9
- package/fesm2022/animations/async.mjs.map +1 -1
- package/fesm2022/animations.mjs +12 -12
- package/fesm2022/animations.mjs.map +1 -1
- package/fesm2022/platform-browser.mjs +192 -203
- package/fesm2022/platform-browser.mjs.map +1 -1
- package/fesm2022/testing.mjs +5 -5
- package/fesm2022/testing.mjs.map +1 -1
- package/index.d.ts +48 -32
- package/package.json +4 -12
- package/testing/index.d.ts +1 -1
- package/esm2022/animations/animations.mjs +0 -5
- package/esm2022/animations/async/async.mjs +0 -5
- package/esm2022/animations/async/index.mjs +0 -13
- package/esm2022/animations/async/public_api.mjs +0 -14
- package/esm2022/animations/async/src/async-animations.mjs +0 -15
- package/esm2022/animations/async/src/async_animation_renderer.mjs +0 -207
- package/esm2022/animations/async/src/private_export.mjs +0 -9
- package/esm2022/animations/async/src/providers.mjs +0 -55
- package/esm2022/animations/index.mjs +0 -13
- package/esm2022/animations/public_api.mjs +0 -14
- package/esm2022/animations/src/animations.mjs +0 -16
- package/esm2022/animations/src/module.mjs +0 -123
- package/esm2022/animations/src/private_export.mjs +0 -9
- package/esm2022/animations/src/providers.mjs +0 -66
- package/esm2022/index.mjs +0 -13
- package/esm2022/platform-browser.mjs +0 -5
- package/esm2022/public_api.mjs +0 -15
- package/esm2022/src/browser/browser_adapter.mjs +0 -86
- package/esm2022/src/browser/generic_browser_adapter.mjs +0 -21
- package/esm2022/src/browser/meta.mjs +0 -176
- package/esm2022/src/browser/testability.mjs +0 -57
- package/esm2022/src/browser/title.mjs +0 -48
- package/esm2022/src/browser/tools/common_tools.mjs +0 -63
- package/esm2022/src/browser/tools/tools.mjs +0 -36
- package/esm2022/src/browser/xhr.mjs +0 -16
- package/esm2022/src/browser.mjs +0 -241
- package/esm2022/src/dom/debug/by.mjs +0 -61
- package/esm2022/src/dom/dom_renderer.mjs +0 -381
- package/esm2022/src/dom/events/dom_events.mjs +0 -37
- package/esm2022/src/dom/events/event_delegation.mjs +0 -37
- package/esm2022/src/dom/events/event_manager.mjs +0 -91
- package/esm2022/src/dom/events/hammer_gestures.mjs +0 -266
- package/esm2022/src/dom/events/key_events.mjs +0 -183
- package/esm2022/src/dom/shared_styles_host.mjs +0 -161
- package/esm2022/src/dom/util.mjs +0 -26
- package/esm2022/src/errors.mjs +0 -2
- package/esm2022/src/hydration.mjs +0 -183
- package/esm2022/src/platform-browser.mjs +0 -20
- package/esm2022/src/private_export.mjs +0 -18
- package/esm2022/src/security/dom_sanitization_service.mjs +0 -119
- package/esm2022/src/version.mjs +0 -18
- package/esm2022/testing/index.mjs +0 -13
- package/esm2022/testing/public_api.mjs +0 -15
- package/esm2022/testing/src/browser.mjs +0 -52
- package/esm2022/testing/src/browser_util.mjs +0 -130
- package/esm2022/testing/src/matchers.mjs +0 -146
- package/esm2022/testing/src/testing.mjs +0 -14
- package/esm2022/testing/testing.mjs +0 -5
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Angular v19.0.0-next.
|
2
|
+
* @license Angular v19.0.0-next.10
|
3
3
|
* (c) 2010-2024 Google LLC. https://angular.io/
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -7,7 +7,7 @@
|
|
7
7
|
import { ɵDomAdapter, ɵsetRootDomAdapter, ɵparseCookieValue, ɵgetDOM, isPlatformServer, DOCUMENT, ɵPLATFORM_BROWSER_ID, XhrFactory, CommonModule } from '@angular/common';
|
8
8
|
export { ɵgetDOM } from '@angular/common';
|
9
9
|
import * as i0 from '@angular/core';
|
10
|
-
import { ɵglobal, ɵRuntimeError, Injectable, InjectionToken, Inject, APP_ID, CSP_NONCE, PLATFORM_ID, Optional, ViewEncapsulation, RendererStyleFlags2,
|
10
|
+
import { ɵglobal, ɵRuntimeError, Injectable, InjectionToken, Inject, APP_ID, CSP_NONCE, PLATFORM_ID, Optional, ViewEncapsulation, RendererStyleFlags2, ɵinternalCreateApplication, ErrorHandler, ɵsetDocument, PLATFORM_INITIALIZER, createPlatformFactory, platformCore, ɵTESTABILITY_GETTER, ɵTESTABILITY, Testability, NgZone, TestabilityRegistry, ɵINJECTOR_SCOPE, RendererFactory2, ApplicationModule, NgModule, SkipSelf, ApplicationRef, ɵConsole, forwardRef, ɵXSS_SECURITY_URL, SecurityContext, ɵallowSanitizationBypassAndThrow, ɵunwrapSafeValue, ɵ_sanitizeUrl, ɵ_sanitizeHtml, ɵbypassSanitizationTrustHtml, ɵbypassSanitizationTrustStyle, ɵbypassSanitizationTrustScript, ɵbypassSanitizationTrustUrl, ɵbypassSanitizationTrustResourceUrl, ɵwithI18nSupport, ɵwithEventReplay, ENVIRONMENT_INITIALIZER, inject, ɵZONELESS_ENABLED, ɵformatRuntimeError, makeEnvironmentProviders, ɵwithDomHydration, Version } from '@angular/core';
|
11
11
|
import { ɵwithHttpTransferCache } from '@angular/common/http';
|
12
12
|
|
13
13
|
/**
|
@@ -155,10 +155,10 @@ class BrowserXhr {
|
|
155
155
|
build() {
|
156
156
|
return new XMLHttpRequest();
|
157
157
|
}
|
158
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.
|
159
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.
|
158
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: BrowserXhr, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
159
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: BrowserXhr }); }
|
160
160
|
}
|
161
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.
|
161
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: BrowserXhr, decorators: [{
|
162
162
|
type: Injectable
|
163
163
|
}] });
|
164
164
|
|
@@ -220,10 +220,10 @@ class EventManager {
|
|
220
220
|
this._eventNameToPlugin.set(eventName, plugin);
|
221
221
|
return plugin;
|
222
222
|
}
|
223
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.
|
224
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.
|
223
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: EventManager, deps: [{ token: EVENT_MANAGER_PLUGINS }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
224
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: EventManager }); }
|
225
225
|
}
|
226
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.
|
226
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: EventManager, decorators: [{
|
227
227
|
type: Injectable
|
228
228
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
229
229
|
type: Inject,
|
@@ -246,138 +246,173 @@ class EventManagerPlugin {
|
|
246
246
|
|
247
247
|
/** The style elements attribute name used to set value of `APP_ID` token. */
|
248
248
|
const APP_ID_ATTRIBUTE_NAME = 'ng-app-id';
|
249
|
+
/**
|
250
|
+
* Removes all provided elements from the document.
|
251
|
+
* @param elements An array of HTML Elements.
|
252
|
+
*/
|
253
|
+
function removeElements(elements) {
|
254
|
+
for (const element of elements) {
|
255
|
+
element.remove();
|
256
|
+
}
|
257
|
+
}
|
258
|
+
/**
|
259
|
+
* Creates a `style` element with the provided inline style content.
|
260
|
+
* @param style A string of the inline style content.
|
261
|
+
* @param doc A DOM Document to use to create the element.
|
262
|
+
* @returns An HTMLStyleElement instance.
|
263
|
+
*/
|
264
|
+
function createStyleElement(style, doc) {
|
265
|
+
const styleElement = doc.createElement('style');
|
266
|
+
styleElement.textContent = style;
|
267
|
+
return styleElement;
|
268
|
+
}
|
269
|
+
/**
|
270
|
+
* Searches a DOM document's head element for style elements with a matching application
|
271
|
+
* identifier attribute (`ng-app-id`) to the provide identifier and adds usage records for each.
|
272
|
+
* @param doc An HTML DOM document instance.
|
273
|
+
* @param appId A string containing an Angular application identifer.
|
274
|
+
* @param usages A Map object for tracking style usage.
|
275
|
+
*/
|
276
|
+
function addServerStyles(doc, appId, usages) {
|
277
|
+
const styleElements = doc.head?.querySelectorAll(`style[${APP_ID_ATTRIBUTE_NAME}="${appId}"]`);
|
278
|
+
if (styleElements) {
|
279
|
+
for (const styleElement of styleElements) {
|
280
|
+
if (styleElement.textContent) {
|
281
|
+
styleElement.removeAttribute(APP_ID_ATTRIBUTE_NAME);
|
282
|
+
usages.set(styleElement.textContent, { usage: 0, elements: [styleElement] });
|
283
|
+
}
|
284
|
+
}
|
285
|
+
}
|
286
|
+
}
|
287
|
+
/**
|
288
|
+
* Creates a `link` element for the provided external style URL.
|
289
|
+
* @param url A string of the URL for the stylesheet.
|
290
|
+
* @param doc A DOM Document to use to create the element.
|
291
|
+
* @returns An HTMLLinkElement instance.
|
292
|
+
*/
|
293
|
+
function createLinkElement(url, doc) {
|
294
|
+
const linkElement = doc.createElement('link');
|
295
|
+
linkElement.setAttribute('rel', 'stylesheet');
|
296
|
+
linkElement.setAttribute('href', url);
|
297
|
+
return linkElement;
|
298
|
+
}
|
249
299
|
class SharedStylesHost {
|
250
300
|
constructor(doc, appId, nonce, platformId = {}) {
|
251
301
|
this.doc = doc;
|
252
302
|
this.appId = appId;
|
253
303
|
this.nonce = nonce;
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
this.
|
259
|
-
|
260
|
-
|
304
|
+
/**
|
305
|
+
* Provides usage information for active inline style content and associated HTML <style> elements.
|
306
|
+
* Embedded styles typically originate from the `styles` metadata of a rendered component.
|
307
|
+
*/
|
308
|
+
this.inline = new Map();
|
309
|
+
/**
|
310
|
+
* Provides usage information for active external style URLs and the associated HTML <link> elements.
|
311
|
+
* External styles typically originate from the `ɵɵExternalStylesFeature` of a rendered component.
|
312
|
+
*/
|
313
|
+
this.external = new Map();
|
314
|
+
/**
|
315
|
+
* Set of host DOM nodes that will have styles attached.
|
316
|
+
*/
|
317
|
+
this.hosts = new Set();
|
318
|
+
this.isServer = isPlatformServer(platformId);
|
319
|
+
addServerStyles(doc, appId, this.inline);
|
320
|
+
this.hosts.add(doc.head);
|
261
321
|
}
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
322
|
+
/**
|
323
|
+
* Adds embedded styles to the DOM via HTML `style` elements.
|
324
|
+
* @param styles An array of style content strings.
|
325
|
+
*/
|
326
|
+
addStyles(styles, urls) {
|
327
|
+
for (const value of styles) {
|
328
|
+
this.addUsage(value, this.inline, createStyleElement);
|
329
|
+
}
|
330
|
+
urls?.forEach((value) => this.addUsage(value, this.external, createLinkElement));
|
331
|
+
}
|
332
|
+
/**
|
333
|
+
* Removes embedded styles from the DOM that were added as HTML `style` elements.
|
334
|
+
* @param styles An array of style content strings.
|
335
|
+
*/
|
336
|
+
removeStyles(styles, urls) {
|
337
|
+
for (const value of styles) {
|
338
|
+
this.removeUsage(value, this.inline);
|
339
|
+
}
|
340
|
+
urls?.forEach((value) => this.removeUsage(value, this.external));
|
341
|
+
}
|
342
|
+
addUsage(value, usages, creator) {
|
343
|
+
// Attempt to get any current usage of the value
|
344
|
+
const record = usages.get(value);
|
345
|
+
// If existing, just increment the usage count
|
346
|
+
if (record) {
|
347
|
+
if ((typeof ngDevMode === 'undefined' || ngDevMode) && record.usage === 0) {
|
348
|
+
// A usage count of zero indicates a preexisting server generated style.
|
349
|
+
// This attribute is solely used for debugging purposes of SSR style reuse.
|
350
|
+
record.elements.forEach((element) => element.setAttribute('ng-style-reused', ''));
|
267
351
|
}
|
352
|
+
record.usage++;
|
353
|
+
}
|
354
|
+
else {
|
355
|
+
// Otherwise, create an entry to track the elements and add element for each host
|
356
|
+
usages.set(value, {
|
357
|
+
usage: 1,
|
358
|
+
elements: [...this.hosts].map((host) => this.addElement(host, creator(value, this.doc))),
|
359
|
+
});
|
268
360
|
}
|
269
361
|
}
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
362
|
+
removeUsage(value, usages) {
|
363
|
+
// Attempt to get any current usage of the value
|
364
|
+
const record = usages.get(value);
|
365
|
+
// If there is a record, reduce the usage count and if no longer used,
|
366
|
+
// remove from DOM and delete usage record.
|
367
|
+
if (record) {
|
368
|
+
record.usage--;
|
369
|
+
if (record.usage <= 0) {
|
370
|
+
removeElements(record.elements);
|
371
|
+
usages.delete(value);
|
275
372
|
}
|
276
373
|
}
|
277
374
|
}
|
278
375
|
ngOnDestroy() {
|
279
|
-
const
|
280
|
-
|
281
|
-
styleNodesInDOM.forEach((node) => node.remove());
|
282
|
-
styleNodesInDOM.clear();
|
376
|
+
for (const [, { elements }] of [...this.inline, ...this.external]) {
|
377
|
+
removeElements(elements);
|
283
378
|
}
|
284
|
-
|
285
|
-
this.onStyleRemoved(style);
|
286
|
-
}
|
287
|
-
this.resetHostNodes();
|
379
|
+
this.hosts.clear();
|
288
380
|
}
|
381
|
+
/**
|
382
|
+
* Adds a host node to the set of style hosts and adds all existing style usage to
|
383
|
+
* the newly added host node.
|
384
|
+
*
|
385
|
+
* This is currently only used for Shadow DOM encapsulation mode.
|
386
|
+
*/
|
289
387
|
addHost(hostNode) {
|
290
|
-
this.
|
291
|
-
|
292
|
-
|
388
|
+
this.hosts.add(hostNode);
|
389
|
+
// Add existing styles to new host
|
390
|
+
for (const [style, { elements }] of this.inline) {
|
391
|
+
elements.push(this.addElement(hostNode, createStyleElement(style, this.doc)));
|
293
392
|
}
|
294
|
-
|
295
|
-
|
296
|
-
this.hostNodes.delete(hostNode);
|
297
|
-
}
|
298
|
-
getAllStyles() {
|
299
|
-
return this.styleRef.keys();
|
300
|
-
}
|
301
|
-
onStyleAdded(style) {
|
302
|
-
for (const host of this.hostNodes) {
|
303
|
-
this.addStyleToHost(host, style);
|
393
|
+
for (const [url, { elements }] of this.external) {
|
394
|
+
elements.push(this.addElement(hostNode, createLinkElement(url, this.doc)));
|
304
395
|
}
|
305
396
|
}
|
306
|
-
|
307
|
-
|
308
|
-
styleRef.get(style)?.elements?.forEach((node) => node.remove());
|
309
|
-
styleRef.delete(style);
|
310
|
-
}
|
311
|
-
collectServerRenderedStyles() {
|
312
|
-
const styles = this.doc.head?.querySelectorAll(`style[${APP_ID_ATTRIBUTE_NAME}="${this.appId}"]`);
|
313
|
-
if (styles?.length) {
|
314
|
-
const styleMap = new Map();
|
315
|
-
styles.forEach((style) => {
|
316
|
-
if (style.textContent != null) {
|
317
|
-
styleMap.set(style.textContent, style);
|
318
|
-
}
|
319
|
-
});
|
320
|
-
return styleMap;
|
321
|
-
}
|
322
|
-
return null;
|
323
|
-
}
|
324
|
-
changeUsageCount(style, delta) {
|
325
|
-
const map = this.styleRef;
|
326
|
-
if (map.has(style)) {
|
327
|
-
const styleRefValue = map.get(style);
|
328
|
-
styleRefValue.usage += delta;
|
329
|
-
return styleRefValue.usage;
|
330
|
-
}
|
331
|
-
map.set(style, { usage: delta, elements: [] });
|
332
|
-
return delta;
|
333
|
-
}
|
334
|
-
getStyleElement(host, style) {
|
335
|
-
const styleNodesInDOM = this.styleNodesInDOM;
|
336
|
-
const styleEl = styleNodesInDOM?.get(style);
|
337
|
-
if (styleEl?.parentNode === host) {
|
338
|
-
// `styleNodesInDOM` cannot be undefined due to the above `styleNodesInDOM?.get`.
|
339
|
-
styleNodesInDOM.delete(style);
|
340
|
-
styleEl.removeAttribute(APP_ID_ATTRIBUTE_NAME);
|
341
|
-
if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
342
|
-
// This attribute is solely used for debugging purposes.
|
343
|
-
styleEl.setAttribute('ng-style-reused', '');
|
344
|
-
}
|
345
|
-
return styleEl;
|
346
|
-
}
|
347
|
-
else {
|
348
|
-
const styleEl = this.doc.createElement('style');
|
349
|
-
if (this.nonce) {
|
350
|
-
styleEl.setAttribute('nonce', this.nonce);
|
351
|
-
}
|
352
|
-
styleEl.textContent = style;
|
353
|
-
if (this.platformIsServer) {
|
354
|
-
styleEl.setAttribute(APP_ID_ATTRIBUTE_NAME, this.appId);
|
355
|
-
}
|
356
|
-
host.appendChild(styleEl);
|
357
|
-
return styleEl;
|
358
|
-
}
|
397
|
+
removeHost(hostNode) {
|
398
|
+
this.hosts.delete(hostNode);
|
359
399
|
}
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
if (styleElRef) {
|
365
|
-
styleElRef.push(styleEl);
|
400
|
+
addElement(host, element) {
|
401
|
+
// Add a nonce if present
|
402
|
+
if (this.nonce) {
|
403
|
+
element.setAttribute('nonce', this.nonce);
|
366
404
|
}
|
367
|
-
|
368
|
-
|
405
|
+
// Add application identifier when on the server to support client-side reuse
|
406
|
+
if (this.isServer) {
|
407
|
+
element.setAttribute(APP_ID_ATTRIBUTE_NAME, this.appId);
|
369
408
|
}
|
409
|
+
// Insert the element into the DOM with the host node as parent
|
410
|
+
return host.appendChild(element);
|
370
411
|
}
|
371
|
-
|
372
|
-
|
373
|
-
hostNodes.clear();
|
374
|
-
// Re-add the head element back since this is the default host.
|
375
|
-
hostNodes.add(this.doc.head);
|
376
|
-
}
|
377
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.1", ngImport: i0, type: SharedStylesHost, deps: [{ token: DOCUMENT }, { token: APP_ID }, { token: CSP_NONCE, optional: true }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
378
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.1", ngImport: i0, type: SharedStylesHost }); }
|
412
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: SharedStylesHost, deps: [{ token: DOCUMENT }, { token: APP_ID }, { token: CSP_NONCE, optional: true }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
413
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: SharedStylesHost }); }
|
379
414
|
}
|
380
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.
|
415
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: SharedStylesHost, decorators: [{
|
381
416
|
type: Injectable
|
382
417
|
}], ctorParameters: () => [{ type: Document, decorators: [{
|
383
418
|
type: Inject,
|
@@ -491,10 +526,10 @@ class DomRendererFactory2 {
|
|
491
526
|
ngOnDestroy() {
|
492
527
|
this.rendererByCompId.clear();
|
493
528
|
}
|
494
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.
|
495
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.
|
529
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomRendererFactory2, deps: [{ token: EventManager }, { token: SharedStylesHost }, { token: APP_ID }, { token: REMOVE_STYLES_ON_COMPONENT_DESTROY }, { token: DOCUMENT }, { token: PLATFORM_ID }, { token: i0.NgZone }, { token: CSP_NONCE }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
530
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomRendererFactory2 }); }
|
496
531
|
}
|
497
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.
|
532
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomRendererFactory2, decorators: [{
|
498
533
|
type: Injectable
|
499
534
|
}], ctorParameters: () => [{ type: EventManager }, { type: SharedStylesHost }, { type: undefined, decorators: [{
|
500
535
|
type: Inject,
|
@@ -733,15 +768,16 @@ class NoneEncapsulationDomRenderer extends DefaultDomRenderer2 {
|
|
733
768
|
this.sharedStylesHost = sharedStylesHost;
|
734
769
|
this.removeStylesOnCompDestroy = removeStylesOnCompDestroy;
|
735
770
|
this.styles = compId ? shimStylesContent(compId, component.styles) : component.styles;
|
771
|
+
this.styleUrls = component.getExternalStyles?.(compId);
|
736
772
|
}
|
737
773
|
applyStyles() {
|
738
|
-
this.sharedStylesHost.addStyles(this.styles);
|
774
|
+
this.sharedStylesHost.addStyles(this.styles, this.styleUrls);
|
739
775
|
}
|
740
776
|
destroy() {
|
741
777
|
if (!this.removeStylesOnCompDestroy) {
|
742
778
|
return;
|
743
779
|
}
|
744
|
-
this.sharedStylesHost.removeStyles(this.styles);
|
780
|
+
this.sharedStylesHost.removeStyles(this.styles, this.styleUrls);
|
745
781
|
}
|
746
782
|
}
|
747
783
|
class EmulatedEncapsulationDomRenderer2 extends NoneEncapsulationDomRenderer {
|
@@ -778,36 +814,10 @@ class DomEventsPlugin extends EventManagerPlugin {
|
|
778
814
|
removeEventListener(target, eventName, callback) {
|
779
815
|
return target.removeEventListener(eventName, callback);
|
780
816
|
}
|
781
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.
|
782
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.
|
817
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomEventsPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
818
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomEventsPlugin }); }
|
783
819
|
}
|
784
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.
|
785
|
-
type: Injectable
|
786
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
787
|
-
type: Inject,
|
788
|
-
args: [DOCUMENT]
|
789
|
-
}] }] });
|
790
|
-
|
791
|
-
class EventDelegationPlugin extends EventManagerPlugin {
|
792
|
-
constructor(doc) {
|
793
|
-
super(doc);
|
794
|
-
this.delegate = inject(ɵGLOBAL_EVENT_DELEGATION, { optional: true });
|
795
|
-
}
|
796
|
-
supports(eventName) {
|
797
|
-
// If `GlobalDelegationEventPlugin` implementation is not provided,
|
798
|
-
// this plugin is kept disabled.
|
799
|
-
return this.delegate ? this.delegate.supports(eventName) : false;
|
800
|
-
}
|
801
|
-
addEventListener(element, eventName, handler) {
|
802
|
-
return this.delegate.addEventListener(element, eventName, handler);
|
803
|
-
}
|
804
|
-
removeEventListener(element, eventName, callback) {
|
805
|
-
return this.delegate.removeEventListener(element, eventName, callback);
|
806
|
-
}
|
807
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.1", ngImport: i0, type: EventDelegationPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
808
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.1", ngImport: i0, type: EventDelegationPlugin }); }
|
809
|
-
}
|
810
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.1", ngImport: i0, type: EventDelegationPlugin, decorators: [{
|
820
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomEventsPlugin, decorators: [{
|
811
821
|
type: Injectable
|
812
822
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
813
823
|
type: Inject,
|
@@ -976,10 +986,10 @@ class KeyEventsPlugin extends EventManagerPlugin {
|
|
976
986
|
static _normalizeKey(keyName) {
|
977
987
|
return keyName === 'esc' ? 'escape' : keyName;
|
978
988
|
}
|
979
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.
|
980
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.
|
989
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: KeyEventsPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
990
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: KeyEventsPlugin }); }
|
981
991
|
}
|
982
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.
|
992
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: KeyEventsPlugin, decorators: [{
|
983
993
|
type: Injectable
|
984
994
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
985
995
|
type: Inject,
|
@@ -1143,11 +1153,6 @@ const BROWSER_MODULE_PROVIDERS = [
|
|
1143
1153
|
deps: [DOCUMENT, NgZone, PLATFORM_ID],
|
1144
1154
|
},
|
1145
1155
|
{ provide: EVENT_MANAGER_PLUGINS, useClass: KeyEventsPlugin, multi: true, deps: [DOCUMENT] },
|
1146
|
-
{
|
1147
|
-
provide: EVENT_MANAGER_PLUGINS,
|
1148
|
-
useClass: EventDelegationPlugin,
|
1149
|
-
multi: true,
|
1150
|
-
},
|
1151
1156
|
DomRendererFactory2,
|
1152
1157
|
SharedStylesHost,
|
1153
1158
|
EventManager,
|
@@ -1173,27 +1178,11 @@ class BrowserModule {
|
|
1173
1178
|
`to common directives such as NgIf and NgFor, import the \`CommonModule\` instead.`);
|
1174
1179
|
}
|
1175
1180
|
}
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
*
|
1180
|
-
* @param params An object containing an identifier for the app to transition.
|
1181
|
-
* The ID must match between the client and server versions of the app.
|
1182
|
-
* @returns The reconfigured `BrowserModule` to import into the app's root `AppModule`.
|
1183
|
-
*
|
1184
|
-
* @deprecated Use {@link APP_ID} instead to set the application ID.
|
1185
|
-
*/
|
1186
|
-
static withServerTransition(params) {
|
1187
|
-
return {
|
1188
|
-
ngModule: BrowserModule,
|
1189
|
-
providers: [{ provide: APP_ID, useValue: params.appId }],
|
1190
|
-
};
|
1191
|
-
}
|
1192
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.1", ngImport: i0, type: BrowserModule, deps: [{ token: BROWSER_MODULE_PROVIDERS_MARKER, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
|
1193
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0-next.1", ngImport: i0, type: BrowserModule, exports: [CommonModule, ApplicationModule] }); }
|
1194
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0-next.1", ngImport: i0, type: BrowserModule, providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS], imports: [CommonModule, ApplicationModule] }); }
|
1181
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: BrowserModule, deps: [{ token: BROWSER_MODULE_PROVIDERS_MARKER, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
|
1182
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0-next.10", ngImport: i0, type: BrowserModule, exports: [CommonModule, ApplicationModule] }); }
|
1183
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: BrowserModule, providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS], imports: [CommonModule, ApplicationModule] }); }
|
1195
1184
|
}
|
1196
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.
|
1185
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: BrowserModule, decorators: [{
|
1197
1186
|
type: NgModule,
|
1198
1187
|
args: [{
|
1199
1188
|
providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS],
|
@@ -1357,10 +1346,10 @@ class Meta {
|
|
1357
1346
|
_getMetaKeyMap(prop) {
|
1358
1347
|
return META_KEYS_MAP[prop] || prop;
|
1359
1348
|
}
|
1360
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.
|
1361
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.
|
1349
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Meta, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
1350
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Meta, providedIn: 'root' }); }
|
1362
1351
|
}
|
1363
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.
|
1352
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Meta, decorators: [{
|
1364
1353
|
type: Injectable,
|
1365
1354
|
args: [{ providedIn: 'root' }]
|
1366
1355
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
@@ -1401,10 +1390,10 @@ class Title {
|
|
1401
1390
|
setTitle(newTitle) {
|
1402
1391
|
this._doc.title = newTitle || '';
|
1403
1392
|
}
|
1404
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.
|
1405
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.
|
1393
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Title, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
1394
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Title, providedIn: 'root' }); }
|
1406
1395
|
}
|
1407
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.
|
1396
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Title, decorators: [{
|
1408
1397
|
type: Injectable,
|
1409
1398
|
args: [{ providedIn: 'root' }]
|
1410
1399
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
@@ -1668,10 +1657,10 @@ class HammerGestureConfig {
|
|
1668
1657
|
}
|
1669
1658
|
return mc;
|
1670
1659
|
}
|
1671
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.
|
1672
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.
|
1660
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerGestureConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
1661
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerGestureConfig }); }
|
1673
1662
|
}
|
1674
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.
|
1663
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerGestureConfig, decorators: [{
|
1675
1664
|
type: Injectable
|
1676
1665
|
}] });
|
1677
1666
|
/**
|
@@ -1764,10 +1753,10 @@ class HammerGesturesPlugin extends EventManagerPlugin {
|
|
1764
1753
|
isCustomEvent(eventName) {
|
1765
1754
|
return this._config.events.indexOf(eventName) > -1;
|
1766
1755
|
}
|
1767
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.
|
1768
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.
|
1756
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerGesturesPlugin, deps: [{ token: DOCUMENT }, { token: HAMMER_GESTURE_CONFIG }, { token: i0.ɵConsole }, { token: HAMMER_LOADER, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
1757
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerGesturesPlugin }); }
|
1769
1758
|
}
|
1770
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.
|
1759
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerGesturesPlugin, decorators: [{
|
1771
1760
|
type: Injectable
|
1772
1761
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
1773
1762
|
type: Inject,
|
@@ -1793,9 +1782,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.1",
|
|
1793
1782
|
* @publicApi
|
1794
1783
|
*/
|
1795
1784
|
class HammerModule {
|
1796
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.
|
1797
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0-next.
|
1798
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0-next.
|
1785
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
1786
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerModule }); }
|
1787
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerModule, providers: [
|
1799
1788
|
{
|
1800
1789
|
provide: EVENT_MANAGER_PLUGINS,
|
1801
1790
|
useClass: HammerGesturesPlugin,
|
@@ -1805,7 +1794,7 @@ class HammerModule {
|
|
1805
1794
|
{ provide: HAMMER_GESTURE_CONFIG, useClass: HammerGestureConfig, deps: [] },
|
1806
1795
|
] }); }
|
1807
1796
|
}
|
1808
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.
|
1797
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerModule, decorators: [{
|
1809
1798
|
type: NgModule,
|
1810
1799
|
args: [{
|
1811
1800
|
providers: [
|
@@ -1852,10 +1841,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.1",
|
|
1852
1841
|
* @publicApi
|
1853
1842
|
*/
|
1854
1843
|
class DomSanitizer {
|
1855
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.
|
1856
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.
|
1844
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomSanitizer, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
1845
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomSanitizer, providedIn: 'root', useExisting: i0.forwardRef(() => DomSanitizerImpl) }); }
|
1857
1846
|
}
|
1858
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.
|
1847
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomSanitizer, decorators: [{
|
1859
1848
|
type: Injectable,
|
1860
1849
|
args: [{ providedIn: 'root', useExisting: forwardRef(() => DomSanitizerImpl) }]
|
1861
1850
|
}] });
|
@@ -1917,10 +1906,10 @@ class DomSanitizerImpl extends DomSanitizer {
|
|
1917
1906
|
bypassSecurityTrustResourceUrl(value) {
|
1918
1907
|
return ɵbypassSanitizationTrustResourceUrl(value);
|
1919
1908
|
}
|
1920
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.
|
1921
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.
|
1909
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomSanitizerImpl, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
1910
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomSanitizerImpl, providedIn: 'root' }); }
|
1922
1911
|
}
|
1923
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.
|
1912
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomSanitizerImpl, decorators: [{
|
1924
1913
|
type: Injectable,
|
1925
1914
|
args: [{ providedIn: 'root' }]
|
1926
1915
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
@@ -1993,7 +1982,6 @@ function withI18nSupport() {
|
|
1993
1982
|
* providers: [provideClientHydration(withEventReplay())]
|
1994
1983
|
* });
|
1995
1984
|
* ```
|
1996
|
-
* @developerPreview
|
1997
1985
|
* @publicApi
|
1998
1986
|
* @see {@link provideClientHydration}
|
1999
1987
|
*/
|
@@ -2011,9 +1999,10 @@ function provideZoneJsCompatibilityDetector() {
|
|
2011
1999
|
provide: ENVIRONMENT_INITIALIZER,
|
2012
2000
|
useValue: () => {
|
2013
2001
|
const ngZone = inject(NgZone);
|
2002
|
+
const isZoneless = inject(ɵZONELESS_ENABLED);
|
2014
2003
|
// Checking `ngZone instanceof NgZone` would be insufficient here,
|
2015
2004
|
// because custom implementations might use NgZone as a base class.
|
2016
|
-
if (ngZone.constructor !== NgZone) {
|
2005
|
+
if (!isZoneless && ngZone.constructor !== NgZone) {
|
2017
2006
|
const console = inject(ɵConsole);
|
2018
2007
|
const message = ɵformatRuntimeError(-5000 /* RuntimeErrorCode.UNSUPPORTED_ZONEJS_INSTANCE */, 'Angular detected that hydration was enabled for an application ' +
|
2019
2008
|
'that uses a custom or a noop Zone.js implementation. ' +
|
@@ -2110,7 +2099,7 @@ function provideClientHydration(...features) {
|
|
2110
2099
|
/**
|
2111
2100
|
* @publicApi
|
2112
2101
|
*/
|
2113
|
-
const VERSION = new Version('19.0.0-next.
|
2102
|
+
const VERSION = new Version('19.0.0-next.10');
|
2114
2103
|
|
2115
2104
|
/**
|
2116
2105
|
* @module
|