123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549 |
- /**
- * @license Angular v19.2.13
- * (c) 2010-2025 Google LLC. https://angular.io/
- * License: MIT
- */
- import { ɵDomAdapter as _DomAdapter, ɵsetRootDomAdapter as _setRootDomAdapter, ɵparseCookieValue as _parseCookieValue, ɵgetDOM as _getDOM, DOCUMENT, CommonModule, XhrFactory, ɵPLATFORM_BROWSER_ID as _PLATFORM_BROWSER_ID } from '@angular/common';
- import * as i0 from '@angular/core';
- import { ɵglobal as _global, ɵRuntimeError as _RuntimeError, Injectable, Inject, createPlatformFactory, ɵinternalCreateApplication as _internalCreateApplication, inject, InjectionToken, ApplicationModule, ɵINJECTOR_SCOPE as _INJECTOR_SCOPE, ErrorHandler, RendererFactory2, ɵTESTABILITY_GETTER as _TESTABILITY_GETTER, NgZone, TestabilityRegistry, Testability, ɵTESTABILITY as _TESTABILITY, platformCore, PLATFORM_ID, PLATFORM_INITIALIZER, ɵsetDocument as _setDocument, NgModule } from '@angular/core';
- import { EventManagerPlugin, EVENT_MANAGER_PLUGINS, DomRendererFactory2, SharedStylesHost, EventManager } from './dom_renderer-DGKzginR.mjs';
- /**
- * A `DomAdapter` powered by full browser DOM APIs.
- *
- * @security Tread carefully! Interacting with the DOM directly is dangerous and
- * can introduce XSS risks.
- */
- class BrowserDomAdapter extends _DomAdapter {
- supportsDOMEvents = true;
- static makeCurrent() {
- _setRootDomAdapter(new BrowserDomAdapter());
- }
- onAndCancel(el, evt, listener, options) {
- el.addEventListener(evt, listener, options);
- return () => {
- el.removeEventListener(evt, listener, options);
- };
- }
- dispatchEvent(el, evt) {
- el.dispatchEvent(evt);
- }
- remove(node) {
- node.remove();
- }
- createElement(tagName, doc) {
- doc = doc || this.getDefaultDocument();
- return doc.createElement(tagName);
- }
- createHtmlDocument() {
- return document.implementation.createHTMLDocument('fakeTitle');
- }
- getDefaultDocument() {
- return document;
- }
- isElementNode(node) {
- return node.nodeType === Node.ELEMENT_NODE;
- }
- isShadowRoot(node) {
- return node instanceof DocumentFragment;
- }
- /** @deprecated No longer being used in Ivy code. To be removed in version 14. */
- getGlobalEventTarget(doc, target) {
- if (target === 'window') {
- return window;
- }
- if (target === 'document') {
- return doc;
- }
- if (target === 'body') {
- return doc.body;
- }
- return null;
- }
- getBaseHref(doc) {
- const href = getBaseElementHref();
- return href == null ? null : relativePath(href);
- }
- resetBaseElement() {
- baseElement = null;
- }
- getUserAgent() {
- return window.navigator.userAgent;
- }
- getCookie(name) {
- return _parseCookieValue(document.cookie, name);
- }
- }
- let baseElement = null;
- function getBaseElementHref() {
- baseElement = baseElement || document.head.querySelector('base');
- return baseElement ? baseElement.getAttribute('href') : null;
- }
- function relativePath(url) {
- // The base URL doesn't really matter, we just need it so relative paths have something
- // to resolve against. In the browser `HTMLBaseElement.href` is always absolute.
- return new URL(url, document.baseURI).pathname;
- }
- class BrowserGetTestability {
- addToWindow(registry) {
- _global['getAngularTestability'] = (elem, findInAncestors = true) => {
- const testability = registry.findTestabilityInTree(elem, findInAncestors);
- if (testability == null) {
- throw new _RuntimeError(5103 /* RuntimeErrorCode.TESTABILITY_NOT_FOUND */, (typeof ngDevMode === 'undefined' || ngDevMode) &&
- 'Could not find testability for element.');
- }
- return testability;
- };
- _global['getAllAngularTestabilities'] = () => registry.getAllTestabilities();
- _global['getAllAngularRootElements'] = () => registry.getAllRootElements();
- const whenAllStable = (callback) => {
- const testabilities = _global['getAllAngularTestabilities']();
- let count = testabilities.length;
- const decrement = function () {
- count--;
- if (count == 0) {
- callback();
- }
- };
- testabilities.forEach((testability) => {
- testability.whenStable(decrement);
- });
- };
- if (!_global['frameworkStabilizers']) {
- _global['frameworkStabilizers'] = [];
- }
- _global['frameworkStabilizers'].push(whenAllStable);
- }
- findTestabilityInTree(registry, elem, findInAncestors) {
- if (elem == null) {
- return null;
- }
- const t = registry.getTestability(elem);
- if (t != null) {
- return t;
- }
- else if (!findInAncestors) {
- return null;
- }
- if (_getDOM().isShadowRoot(elem)) {
- return this.findTestabilityInTree(registry, elem.host, true);
- }
- return this.findTestabilityInTree(registry, elem.parentElement, true);
- }
- }
- /**
- * A factory for `HttpXhrBackend` that uses the `XMLHttpRequest` browser API.
- */
- class BrowserXhr {
- build() {
- return new XMLHttpRequest();
- }
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: BrowserXhr, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: BrowserXhr });
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: BrowserXhr, decorators: [{
- type: Injectable
- }] });
- class DomEventsPlugin extends EventManagerPlugin {
- constructor(doc) {
- super(doc);
- }
- // This plugin should come last in the list of plugins, because it accepts all
- // events.
- supports(eventName) {
- return true;
- }
- addEventListener(element, eventName, handler, options) {
- element.addEventListener(eventName, handler, options);
- return () => this.removeEventListener(element, eventName, handler, options);
- }
- removeEventListener(target, eventName, callback, options) {
- return target.removeEventListener(eventName, callback, options);
- }
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: DomEventsPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: DomEventsPlugin });
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: DomEventsPlugin, decorators: [{
- type: Injectable
- }], ctorParameters: () => [{ type: undefined, decorators: [{
- type: Inject,
- args: [DOCUMENT]
- }] }] });
- /**
- * Defines supported modifiers for key events.
- */
- const MODIFIER_KEYS = ['alt', 'control', 'meta', 'shift'];
- // The following values are here for cross-browser compatibility and to match the W3C standard
- // cf https://www.w3.org/TR/DOM-Level-3-Events-key/
- const _keyMap = {
- '\b': 'Backspace',
- '\t': 'Tab',
- '\x7F': 'Delete',
- '\x1B': 'Escape',
- 'Del': 'Delete',
- 'Esc': 'Escape',
- 'Left': 'ArrowLeft',
- 'Right': 'ArrowRight',
- 'Up': 'ArrowUp',
- 'Down': 'ArrowDown',
- 'Menu': 'ContextMenu',
- 'Scroll': 'ScrollLock',
- 'Win': 'OS',
- };
- /**
- * Retrieves modifiers from key-event objects.
- */
- const MODIFIER_KEY_GETTERS = {
- 'alt': (event) => event.altKey,
- 'control': (event) => event.ctrlKey,
- 'meta': (event) => event.metaKey,
- 'shift': (event) => event.shiftKey,
- };
- /**
- * A browser plug-in that provides support for handling of key events in Angular.
- */
- class KeyEventsPlugin extends EventManagerPlugin {
- /**
- * Initializes an instance of the browser plug-in.
- * @param doc The document in which key events will be detected.
- */
- constructor(doc) {
- super(doc);
- }
- /**
- * Reports whether a named key event is supported.
- * @param eventName The event name to query.
- * @return True if the named key event is supported.
- */
- supports(eventName) {
- return KeyEventsPlugin.parseEventName(eventName) != null;
- }
- /**
- * Registers a handler for a specific element and key event.
- * @param element The HTML element to receive event notifications.
- * @param eventName The name of the key event to listen for.
- * @param handler A function to call when the notification occurs. Receives the
- * event object as an argument.
- * @returns The key event that was registered.
- */
- addEventListener(element, eventName, handler, options) {
- const parsedEvent = KeyEventsPlugin.parseEventName(eventName);
- const outsideHandler = KeyEventsPlugin.eventCallback(parsedEvent['fullKey'], handler, this.manager.getZone());
- return this.manager.getZone().runOutsideAngular(() => {
- return _getDOM().onAndCancel(element, parsedEvent['domEventName'], outsideHandler, options);
- });
- }
- /**
- * Parses the user provided full keyboard event definition and normalizes it for
- * later internal use. It ensures the string is all lowercase, converts special
- * characters to a standard spelling, and orders all the values consistently.
- *
- * @param eventName The name of the key event to listen for.
- * @returns an object with the full, normalized string, and the dom event name
- * or null in the case when the event doesn't match a keyboard event.
- */
- static parseEventName(eventName) {
- const parts = eventName.toLowerCase().split('.');
- const domEventName = parts.shift();
- if (parts.length === 0 || !(domEventName === 'keydown' || domEventName === 'keyup')) {
- return null;
- }
- const key = KeyEventsPlugin._normalizeKey(parts.pop());
- let fullKey = '';
- let codeIX = parts.indexOf('code');
- if (codeIX > -1) {
- parts.splice(codeIX, 1);
- fullKey = 'code.';
- }
- MODIFIER_KEYS.forEach((modifierName) => {
- const index = parts.indexOf(modifierName);
- if (index > -1) {
- parts.splice(index, 1);
- fullKey += modifierName + '.';
- }
- });
- fullKey += key;
- if (parts.length != 0 || key.length === 0) {
- // returning null instead of throwing to let another plugin process the event
- return null;
- }
- // NOTE: Please don't rewrite this as so, as it will break JSCompiler property renaming.
- // The code must remain in the `result['domEventName']` form.
- // return {domEventName, fullKey};
- const result = {};
- result['domEventName'] = domEventName;
- result['fullKey'] = fullKey;
- return result;
- }
- /**
- * Determines whether the actual keys pressed match the configured key code string.
- * The `fullKeyCode` event is normalized in the `parseEventName` method when the
- * event is attached to the DOM during the `addEventListener` call. This is unseen
- * by the end user and is normalized for internal consistency and parsing.
- *
- * @param event The keyboard event.
- * @param fullKeyCode The normalized user defined expected key event string
- * @returns boolean.
- */
- static matchEventFullKeyCode(event, fullKeyCode) {
- let keycode = _keyMap[event.key] || event.key;
- let key = '';
- if (fullKeyCode.indexOf('code.') > -1) {
- keycode = event.code;
- key = 'code.';
- }
- // the keycode could be unidentified so we have to check here
- if (keycode == null || !keycode)
- return false;
- keycode = keycode.toLowerCase();
- if (keycode === ' ') {
- keycode = 'space'; // for readability
- }
- else if (keycode === '.') {
- keycode = 'dot'; // because '.' is used as a separator in event names
- }
- MODIFIER_KEYS.forEach((modifierName) => {
- if (modifierName !== keycode) {
- const modifierGetter = MODIFIER_KEY_GETTERS[modifierName];
- if (modifierGetter(event)) {
- key += modifierName + '.';
- }
- }
- });
- key += keycode;
- return key === fullKeyCode;
- }
- /**
- * Configures a handler callback for a key event.
- * @param fullKey The event name that combines all simultaneous keystrokes.
- * @param handler The function that responds to the key event.
- * @param zone The zone in which the event occurred.
- * @returns A callback function.
- */
- static eventCallback(fullKey, handler, zone) {
- return (event) => {
- if (KeyEventsPlugin.matchEventFullKeyCode(event, fullKey)) {
- zone.runGuarded(() => handler(event));
- }
- };
- }
- /** @internal */
- static _normalizeKey(keyName) {
- return keyName === 'esc' ? 'escape' : keyName;
- }
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: KeyEventsPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: KeyEventsPlugin });
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: KeyEventsPlugin, decorators: [{
- type: Injectable
- }], ctorParameters: () => [{ type: undefined, decorators: [{
- type: Inject,
- args: [DOCUMENT]
- }] }] });
- /**
- * Bootstraps an instance of an Angular application and renders a standalone component as the
- * application's root component. More information about standalone components can be found in [this
- * guide](guide/components/importing).
- *
- * @usageNotes
- * The root component passed into this function *must* be a standalone one (should have the
- * `standalone: true` flag in the `@Component` decorator config).
- *
- * ```angular-ts
- * @Component({
- * standalone: true,
- * template: 'Hello world!'
- * })
- * class RootComponent {}
- *
- * const appRef: ApplicationRef = await bootstrapApplication(RootComponent);
- * ```
- *
- * You can add the list of providers that should be available in the application injector by
- * specifying the `providers` field in an object passed as the second argument:
- *
- * ```ts
- * await bootstrapApplication(RootComponent, {
- * providers: [
- * {provide: BACKEND_URL, useValue: 'https://yourdomain.com/api'}
- * ]
- * });
- * ```
- *
- * The `importProvidersFrom` helper method can be used to collect all providers from any
- * existing NgModule (and transitively from all NgModules that it imports):
- *
- * ```ts
- * await bootstrapApplication(RootComponent, {
- * providers: [
- * importProvidersFrom(SomeNgModule)
- * ]
- * });
- * ```
- *
- * Note: the `bootstrapApplication` method doesn't include [Testability](api/core/Testability) by
- * default. You can add [Testability](api/core/Testability) by getting the list of necessary
- * providers using `provideProtractorTestingSupport()` function and adding them into the `providers`
- * array, for example:
- *
- * ```ts
- * import {provideProtractorTestingSupport} from '@angular/platform-browser';
- *
- * await bootstrapApplication(RootComponent, {providers: [provideProtractorTestingSupport()]});
- * ```
- *
- * @param rootComponent A reference to a standalone component that should be rendered.
- * @param options Extra configuration for the bootstrap operation, see `ApplicationConfig` for
- * additional info.
- * @returns A promise that returns an `ApplicationRef` instance once resolved.
- *
- * @publicApi
- */
- function bootstrapApplication(rootComponent, options) {
- return _internalCreateApplication({ rootComponent, ...createProvidersConfig(options) });
- }
- /**
- * Create an instance of an Angular application without bootstrapping any components. This is useful
- * for the situation where one wants to decouple application environment creation (a platform and
- * associated injectors) from rendering components on a screen. Components can be subsequently
- * bootstrapped on the returned `ApplicationRef`.
- *
- * @param options Extra configuration for the application environment, see `ApplicationConfig` for
- * additional info.
- * @returns A promise that returns an `ApplicationRef` instance once resolved.
- *
- * @publicApi
- */
- function createApplication(options) {
- return _internalCreateApplication(createProvidersConfig(options));
- }
- function createProvidersConfig(options) {
- return {
- appProviders: [...BROWSER_MODULE_PROVIDERS, ...(options?.providers ?? [])],
- platformProviders: INTERNAL_BROWSER_PLATFORM_PROVIDERS,
- };
- }
- /**
- * Returns a set of providers required to setup [Testability](api/core/Testability) for an
- * application bootstrapped using the `bootstrapApplication` function. The set of providers is
- * needed to support testing an application with Protractor (which relies on the Testability APIs
- * to be present).
- *
- * @returns An array of providers required to setup Testability for an application and make it
- * available for testing using Protractor.
- *
- * @publicApi
- */
- function provideProtractorTestingSupport() {
- // Return a copy to prevent changes to the original array in case any in-place
- // alterations are performed to the `provideProtractorTestingSupport` call results in app
- // code.
- return [...TESTABILITY_PROVIDERS];
- }
- function initDomAdapter() {
- BrowserDomAdapter.makeCurrent();
- }
- function errorHandler() {
- return new ErrorHandler();
- }
- function _document() {
- // Tell ivy about the global document
- _setDocument(document);
- return document;
- }
- const INTERNAL_BROWSER_PLATFORM_PROVIDERS = [
- { provide: PLATFORM_ID, useValue: _PLATFORM_BROWSER_ID },
- { provide: PLATFORM_INITIALIZER, useValue: initDomAdapter, multi: true },
- { provide: DOCUMENT, useFactory: _document },
- ];
- /**
- * A factory function that returns a `PlatformRef` instance associated with browser service
- * providers.
- *
- * @publicApi
- */
- const platformBrowser = createPlatformFactory(platformCore, 'browser', INTERNAL_BROWSER_PLATFORM_PROVIDERS);
- /**
- * Internal marker to signal whether providers from the `BrowserModule` are already present in DI.
- * This is needed to avoid loading `BrowserModule` providers twice. We can't rely on the
- * `BrowserModule` presence itself, since the standalone-based bootstrap just imports
- * `BrowserModule` providers without referencing the module itself.
- */
- const BROWSER_MODULE_PROVIDERS_MARKER = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'BrowserModule Providers Marker' : '');
- const TESTABILITY_PROVIDERS = [
- {
- provide: _TESTABILITY_GETTER,
- useClass: BrowserGetTestability,
- },
- {
- provide: _TESTABILITY,
- useClass: Testability,
- deps: [NgZone, TestabilityRegistry, _TESTABILITY_GETTER],
- },
- {
- provide: Testability, // Also provide as `Testability` for backwards-compatibility.
- useClass: Testability,
- deps: [NgZone, TestabilityRegistry, _TESTABILITY_GETTER],
- },
- ];
- const BROWSER_MODULE_PROVIDERS = [
- { provide: _INJECTOR_SCOPE, useValue: 'root' },
- { provide: ErrorHandler, useFactory: errorHandler },
- {
- provide: EVENT_MANAGER_PLUGINS,
- useClass: DomEventsPlugin,
- multi: true,
- deps: [DOCUMENT],
- },
- { provide: EVENT_MANAGER_PLUGINS, useClass: KeyEventsPlugin, multi: true, deps: [DOCUMENT] },
- DomRendererFactory2,
- SharedStylesHost,
- EventManager,
- { provide: RendererFactory2, useExisting: DomRendererFactory2 },
- { provide: XhrFactory, useClass: BrowserXhr },
- typeof ngDevMode === 'undefined' || ngDevMode
- ? { provide: BROWSER_MODULE_PROVIDERS_MARKER, useValue: true }
- : [],
- ];
- /**
- * Exports required infrastructure for all Angular apps.
- * Included by default in all Angular apps created with the CLI
- * `new` command.
- * Re-exports `CommonModule` and `ApplicationModule`, making their
- * exports and providers available to all apps.
- *
- * @publicApi
- */
- class BrowserModule {
- constructor() {
- if (typeof ngDevMode === 'undefined' || ngDevMode) {
- const providersAlreadyPresent = inject(BROWSER_MODULE_PROVIDERS_MARKER, {
- optional: true,
- skipSelf: true,
- });
- if (providersAlreadyPresent) {
- throw new _RuntimeError(5100 /* RuntimeErrorCode.BROWSER_MODULE_ALREADY_LOADED */, `Providers from the \`BrowserModule\` have already been loaded. If you need access ` +
- `to common directives such as NgIf and NgFor, import the \`CommonModule\` instead.`);
- }
- }
- }
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: BrowserModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.13", ngImport: i0, type: BrowserModule, exports: [CommonModule, ApplicationModule] });
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: BrowserModule, providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS], imports: [CommonModule, ApplicationModule] });
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: BrowserModule, decorators: [{
- type: NgModule,
- args: [{
- providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS],
- exports: [CommonModule, ApplicationModule],
- }]
- }], ctorParameters: () => [] });
- export { BrowserDomAdapter, BrowserGetTestability, BrowserModule, DomEventsPlugin, KeyEventsPlugin, bootstrapApplication, createApplication, platformBrowser, provideProtractorTestingSupport };
- //# sourceMappingURL=browser-D-u-fknz.mjs.map
|