browser-D-u-fknz.mjs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. /**
  2. * @license Angular v19.2.13
  3. * (c) 2010-2025 Google LLC. https://angular.io/
  4. * License: MIT
  5. */
  6. 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';
  7. import * as i0 from '@angular/core';
  8. 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';
  9. import { EventManagerPlugin, EVENT_MANAGER_PLUGINS, DomRendererFactory2, SharedStylesHost, EventManager } from './dom_renderer-DGKzginR.mjs';
  10. /**
  11. * A `DomAdapter` powered by full browser DOM APIs.
  12. *
  13. * @security Tread carefully! Interacting with the DOM directly is dangerous and
  14. * can introduce XSS risks.
  15. */
  16. class BrowserDomAdapter extends _DomAdapter {
  17. supportsDOMEvents = true;
  18. static makeCurrent() {
  19. _setRootDomAdapter(new BrowserDomAdapter());
  20. }
  21. onAndCancel(el, evt, listener, options) {
  22. el.addEventListener(evt, listener, options);
  23. return () => {
  24. el.removeEventListener(evt, listener, options);
  25. };
  26. }
  27. dispatchEvent(el, evt) {
  28. el.dispatchEvent(evt);
  29. }
  30. remove(node) {
  31. node.remove();
  32. }
  33. createElement(tagName, doc) {
  34. doc = doc || this.getDefaultDocument();
  35. return doc.createElement(tagName);
  36. }
  37. createHtmlDocument() {
  38. return document.implementation.createHTMLDocument('fakeTitle');
  39. }
  40. getDefaultDocument() {
  41. return document;
  42. }
  43. isElementNode(node) {
  44. return node.nodeType === Node.ELEMENT_NODE;
  45. }
  46. isShadowRoot(node) {
  47. return node instanceof DocumentFragment;
  48. }
  49. /** @deprecated No longer being used in Ivy code. To be removed in version 14. */
  50. getGlobalEventTarget(doc, target) {
  51. if (target === 'window') {
  52. return window;
  53. }
  54. if (target === 'document') {
  55. return doc;
  56. }
  57. if (target === 'body') {
  58. return doc.body;
  59. }
  60. return null;
  61. }
  62. getBaseHref(doc) {
  63. const href = getBaseElementHref();
  64. return href == null ? null : relativePath(href);
  65. }
  66. resetBaseElement() {
  67. baseElement = null;
  68. }
  69. getUserAgent() {
  70. return window.navigator.userAgent;
  71. }
  72. getCookie(name) {
  73. return _parseCookieValue(document.cookie, name);
  74. }
  75. }
  76. let baseElement = null;
  77. function getBaseElementHref() {
  78. baseElement = baseElement || document.head.querySelector('base');
  79. return baseElement ? baseElement.getAttribute('href') : null;
  80. }
  81. function relativePath(url) {
  82. // The base URL doesn't really matter, we just need it so relative paths have something
  83. // to resolve against. In the browser `HTMLBaseElement.href` is always absolute.
  84. return new URL(url, document.baseURI).pathname;
  85. }
  86. class BrowserGetTestability {
  87. addToWindow(registry) {
  88. _global['getAngularTestability'] = (elem, findInAncestors = true) => {
  89. const testability = registry.findTestabilityInTree(elem, findInAncestors);
  90. if (testability == null) {
  91. throw new _RuntimeError(5103 /* RuntimeErrorCode.TESTABILITY_NOT_FOUND */, (typeof ngDevMode === 'undefined' || ngDevMode) &&
  92. 'Could not find testability for element.');
  93. }
  94. return testability;
  95. };
  96. _global['getAllAngularTestabilities'] = () => registry.getAllTestabilities();
  97. _global['getAllAngularRootElements'] = () => registry.getAllRootElements();
  98. const whenAllStable = (callback) => {
  99. const testabilities = _global['getAllAngularTestabilities']();
  100. let count = testabilities.length;
  101. const decrement = function () {
  102. count--;
  103. if (count == 0) {
  104. callback();
  105. }
  106. };
  107. testabilities.forEach((testability) => {
  108. testability.whenStable(decrement);
  109. });
  110. };
  111. if (!_global['frameworkStabilizers']) {
  112. _global['frameworkStabilizers'] = [];
  113. }
  114. _global['frameworkStabilizers'].push(whenAllStable);
  115. }
  116. findTestabilityInTree(registry, elem, findInAncestors) {
  117. if (elem == null) {
  118. return null;
  119. }
  120. const t = registry.getTestability(elem);
  121. if (t != null) {
  122. return t;
  123. }
  124. else if (!findInAncestors) {
  125. return null;
  126. }
  127. if (_getDOM().isShadowRoot(elem)) {
  128. return this.findTestabilityInTree(registry, elem.host, true);
  129. }
  130. return this.findTestabilityInTree(registry, elem.parentElement, true);
  131. }
  132. }
  133. /**
  134. * A factory for `HttpXhrBackend` that uses the `XMLHttpRequest` browser API.
  135. */
  136. class BrowserXhr {
  137. build() {
  138. return new XMLHttpRequest();
  139. }
  140. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: BrowserXhr, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
  141. static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: BrowserXhr });
  142. }
  143. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: BrowserXhr, decorators: [{
  144. type: Injectable
  145. }] });
  146. class DomEventsPlugin extends EventManagerPlugin {
  147. constructor(doc) {
  148. super(doc);
  149. }
  150. // This plugin should come last in the list of plugins, because it accepts all
  151. // events.
  152. supports(eventName) {
  153. return true;
  154. }
  155. addEventListener(element, eventName, handler, options) {
  156. element.addEventListener(eventName, handler, options);
  157. return () => this.removeEventListener(element, eventName, handler, options);
  158. }
  159. removeEventListener(target, eventName, callback, options) {
  160. return target.removeEventListener(eventName, callback, options);
  161. }
  162. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: DomEventsPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
  163. static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: DomEventsPlugin });
  164. }
  165. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: DomEventsPlugin, decorators: [{
  166. type: Injectable
  167. }], ctorParameters: () => [{ type: undefined, decorators: [{
  168. type: Inject,
  169. args: [DOCUMENT]
  170. }] }] });
  171. /**
  172. * Defines supported modifiers for key events.
  173. */
  174. const MODIFIER_KEYS = ['alt', 'control', 'meta', 'shift'];
  175. // The following values are here for cross-browser compatibility and to match the W3C standard
  176. // cf https://www.w3.org/TR/DOM-Level-3-Events-key/
  177. const _keyMap = {
  178. '\b': 'Backspace',
  179. '\t': 'Tab',
  180. '\x7F': 'Delete',
  181. '\x1B': 'Escape',
  182. 'Del': 'Delete',
  183. 'Esc': 'Escape',
  184. 'Left': 'ArrowLeft',
  185. 'Right': 'ArrowRight',
  186. 'Up': 'ArrowUp',
  187. 'Down': 'ArrowDown',
  188. 'Menu': 'ContextMenu',
  189. 'Scroll': 'ScrollLock',
  190. 'Win': 'OS',
  191. };
  192. /**
  193. * Retrieves modifiers from key-event objects.
  194. */
  195. const MODIFIER_KEY_GETTERS = {
  196. 'alt': (event) => event.altKey,
  197. 'control': (event) => event.ctrlKey,
  198. 'meta': (event) => event.metaKey,
  199. 'shift': (event) => event.shiftKey,
  200. };
  201. /**
  202. * A browser plug-in that provides support for handling of key events in Angular.
  203. */
  204. class KeyEventsPlugin extends EventManagerPlugin {
  205. /**
  206. * Initializes an instance of the browser plug-in.
  207. * @param doc The document in which key events will be detected.
  208. */
  209. constructor(doc) {
  210. super(doc);
  211. }
  212. /**
  213. * Reports whether a named key event is supported.
  214. * @param eventName The event name to query.
  215. * @return True if the named key event is supported.
  216. */
  217. supports(eventName) {
  218. return KeyEventsPlugin.parseEventName(eventName) != null;
  219. }
  220. /**
  221. * Registers a handler for a specific element and key event.
  222. * @param element The HTML element to receive event notifications.
  223. * @param eventName The name of the key event to listen for.
  224. * @param handler A function to call when the notification occurs. Receives the
  225. * event object as an argument.
  226. * @returns The key event that was registered.
  227. */
  228. addEventListener(element, eventName, handler, options) {
  229. const parsedEvent = KeyEventsPlugin.parseEventName(eventName);
  230. const outsideHandler = KeyEventsPlugin.eventCallback(parsedEvent['fullKey'], handler, this.manager.getZone());
  231. return this.manager.getZone().runOutsideAngular(() => {
  232. return _getDOM().onAndCancel(element, parsedEvent['domEventName'], outsideHandler, options);
  233. });
  234. }
  235. /**
  236. * Parses the user provided full keyboard event definition and normalizes it for
  237. * later internal use. It ensures the string is all lowercase, converts special
  238. * characters to a standard spelling, and orders all the values consistently.
  239. *
  240. * @param eventName The name of the key event to listen for.
  241. * @returns an object with the full, normalized string, and the dom event name
  242. * or null in the case when the event doesn't match a keyboard event.
  243. */
  244. static parseEventName(eventName) {
  245. const parts = eventName.toLowerCase().split('.');
  246. const domEventName = parts.shift();
  247. if (parts.length === 0 || !(domEventName === 'keydown' || domEventName === 'keyup')) {
  248. return null;
  249. }
  250. const key = KeyEventsPlugin._normalizeKey(parts.pop());
  251. let fullKey = '';
  252. let codeIX = parts.indexOf('code');
  253. if (codeIX > -1) {
  254. parts.splice(codeIX, 1);
  255. fullKey = 'code.';
  256. }
  257. MODIFIER_KEYS.forEach((modifierName) => {
  258. const index = parts.indexOf(modifierName);
  259. if (index > -1) {
  260. parts.splice(index, 1);
  261. fullKey += modifierName + '.';
  262. }
  263. });
  264. fullKey += key;
  265. if (parts.length != 0 || key.length === 0) {
  266. // returning null instead of throwing to let another plugin process the event
  267. return null;
  268. }
  269. // NOTE: Please don't rewrite this as so, as it will break JSCompiler property renaming.
  270. // The code must remain in the `result['domEventName']` form.
  271. // return {domEventName, fullKey};
  272. const result = {};
  273. result['domEventName'] = domEventName;
  274. result['fullKey'] = fullKey;
  275. return result;
  276. }
  277. /**
  278. * Determines whether the actual keys pressed match the configured key code string.
  279. * The `fullKeyCode` event is normalized in the `parseEventName` method when the
  280. * event is attached to the DOM during the `addEventListener` call. This is unseen
  281. * by the end user and is normalized for internal consistency and parsing.
  282. *
  283. * @param event The keyboard event.
  284. * @param fullKeyCode The normalized user defined expected key event string
  285. * @returns boolean.
  286. */
  287. static matchEventFullKeyCode(event, fullKeyCode) {
  288. let keycode = _keyMap[event.key] || event.key;
  289. let key = '';
  290. if (fullKeyCode.indexOf('code.') > -1) {
  291. keycode = event.code;
  292. key = 'code.';
  293. }
  294. // the keycode could be unidentified so we have to check here
  295. if (keycode == null || !keycode)
  296. return false;
  297. keycode = keycode.toLowerCase();
  298. if (keycode === ' ') {
  299. keycode = 'space'; // for readability
  300. }
  301. else if (keycode === '.') {
  302. keycode = 'dot'; // because '.' is used as a separator in event names
  303. }
  304. MODIFIER_KEYS.forEach((modifierName) => {
  305. if (modifierName !== keycode) {
  306. const modifierGetter = MODIFIER_KEY_GETTERS[modifierName];
  307. if (modifierGetter(event)) {
  308. key += modifierName + '.';
  309. }
  310. }
  311. });
  312. key += keycode;
  313. return key === fullKeyCode;
  314. }
  315. /**
  316. * Configures a handler callback for a key event.
  317. * @param fullKey The event name that combines all simultaneous keystrokes.
  318. * @param handler The function that responds to the key event.
  319. * @param zone The zone in which the event occurred.
  320. * @returns A callback function.
  321. */
  322. static eventCallback(fullKey, handler, zone) {
  323. return (event) => {
  324. if (KeyEventsPlugin.matchEventFullKeyCode(event, fullKey)) {
  325. zone.runGuarded(() => handler(event));
  326. }
  327. };
  328. }
  329. /** @internal */
  330. static _normalizeKey(keyName) {
  331. return keyName === 'esc' ? 'escape' : keyName;
  332. }
  333. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: KeyEventsPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
  334. static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: KeyEventsPlugin });
  335. }
  336. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: KeyEventsPlugin, decorators: [{
  337. type: Injectable
  338. }], ctorParameters: () => [{ type: undefined, decorators: [{
  339. type: Inject,
  340. args: [DOCUMENT]
  341. }] }] });
  342. /**
  343. * Bootstraps an instance of an Angular application and renders a standalone component as the
  344. * application's root component. More information about standalone components can be found in [this
  345. * guide](guide/components/importing).
  346. *
  347. * @usageNotes
  348. * The root component passed into this function *must* be a standalone one (should have the
  349. * `standalone: true` flag in the `@Component` decorator config).
  350. *
  351. * ```angular-ts
  352. * @Component({
  353. * standalone: true,
  354. * template: 'Hello world!'
  355. * })
  356. * class RootComponent {}
  357. *
  358. * const appRef: ApplicationRef = await bootstrapApplication(RootComponent);
  359. * ```
  360. *
  361. * You can add the list of providers that should be available in the application injector by
  362. * specifying the `providers` field in an object passed as the second argument:
  363. *
  364. * ```ts
  365. * await bootstrapApplication(RootComponent, {
  366. * providers: [
  367. * {provide: BACKEND_URL, useValue: 'https://yourdomain.com/api'}
  368. * ]
  369. * });
  370. * ```
  371. *
  372. * The `importProvidersFrom` helper method can be used to collect all providers from any
  373. * existing NgModule (and transitively from all NgModules that it imports):
  374. *
  375. * ```ts
  376. * await bootstrapApplication(RootComponent, {
  377. * providers: [
  378. * importProvidersFrom(SomeNgModule)
  379. * ]
  380. * });
  381. * ```
  382. *
  383. * Note: the `bootstrapApplication` method doesn't include [Testability](api/core/Testability) by
  384. * default. You can add [Testability](api/core/Testability) by getting the list of necessary
  385. * providers using `provideProtractorTestingSupport()` function and adding them into the `providers`
  386. * array, for example:
  387. *
  388. * ```ts
  389. * import {provideProtractorTestingSupport} from '@angular/platform-browser';
  390. *
  391. * await bootstrapApplication(RootComponent, {providers: [provideProtractorTestingSupport()]});
  392. * ```
  393. *
  394. * @param rootComponent A reference to a standalone component that should be rendered.
  395. * @param options Extra configuration for the bootstrap operation, see `ApplicationConfig` for
  396. * additional info.
  397. * @returns A promise that returns an `ApplicationRef` instance once resolved.
  398. *
  399. * @publicApi
  400. */
  401. function bootstrapApplication(rootComponent, options) {
  402. return _internalCreateApplication({ rootComponent, ...createProvidersConfig(options) });
  403. }
  404. /**
  405. * Create an instance of an Angular application without bootstrapping any components. This is useful
  406. * for the situation where one wants to decouple application environment creation (a platform and
  407. * associated injectors) from rendering components on a screen. Components can be subsequently
  408. * bootstrapped on the returned `ApplicationRef`.
  409. *
  410. * @param options Extra configuration for the application environment, see `ApplicationConfig` for
  411. * additional info.
  412. * @returns A promise that returns an `ApplicationRef` instance once resolved.
  413. *
  414. * @publicApi
  415. */
  416. function createApplication(options) {
  417. return _internalCreateApplication(createProvidersConfig(options));
  418. }
  419. function createProvidersConfig(options) {
  420. return {
  421. appProviders: [...BROWSER_MODULE_PROVIDERS, ...(options?.providers ?? [])],
  422. platformProviders: INTERNAL_BROWSER_PLATFORM_PROVIDERS,
  423. };
  424. }
  425. /**
  426. * Returns a set of providers required to setup [Testability](api/core/Testability) for an
  427. * application bootstrapped using the `bootstrapApplication` function. The set of providers is
  428. * needed to support testing an application with Protractor (which relies on the Testability APIs
  429. * to be present).
  430. *
  431. * @returns An array of providers required to setup Testability for an application and make it
  432. * available for testing using Protractor.
  433. *
  434. * @publicApi
  435. */
  436. function provideProtractorTestingSupport() {
  437. // Return a copy to prevent changes to the original array in case any in-place
  438. // alterations are performed to the `provideProtractorTestingSupport` call results in app
  439. // code.
  440. return [...TESTABILITY_PROVIDERS];
  441. }
  442. function initDomAdapter() {
  443. BrowserDomAdapter.makeCurrent();
  444. }
  445. function errorHandler() {
  446. return new ErrorHandler();
  447. }
  448. function _document() {
  449. // Tell ivy about the global document
  450. _setDocument(document);
  451. return document;
  452. }
  453. const INTERNAL_BROWSER_PLATFORM_PROVIDERS = [
  454. { provide: PLATFORM_ID, useValue: _PLATFORM_BROWSER_ID },
  455. { provide: PLATFORM_INITIALIZER, useValue: initDomAdapter, multi: true },
  456. { provide: DOCUMENT, useFactory: _document },
  457. ];
  458. /**
  459. * A factory function that returns a `PlatformRef` instance associated with browser service
  460. * providers.
  461. *
  462. * @publicApi
  463. */
  464. const platformBrowser = createPlatformFactory(platformCore, 'browser', INTERNAL_BROWSER_PLATFORM_PROVIDERS);
  465. /**
  466. * Internal marker to signal whether providers from the `BrowserModule` are already present in DI.
  467. * This is needed to avoid loading `BrowserModule` providers twice. We can't rely on the
  468. * `BrowserModule` presence itself, since the standalone-based bootstrap just imports
  469. * `BrowserModule` providers without referencing the module itself.
  470. */
  471. const BROWSER_MODULE_PROVIDERS_MARKER = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'BrowserModule Providers Marker' : '');
  472. const TESTABILITY_PROVIDERS = [
  473. {
  474. provide: _TESTABILITY_GETTER,
  475. useClass: BrowserGetTestability,
  476. },
  477. {
  478. provide: _TESTABILITY,
  479. useClass: Testability,
  480. deps: [NgZone, TestabilityRegistry, _TESTABILITY_GETTER],
  481. },
  482. {
  483. provide: Testability, // Also provide as `Testability` for backwards-compatibility.
  484. useClass: Testability,
  485. deps: [NgZone, TestabilityRegistry, _TESTABILITY_GETTER],
  486. },
  487. ];
  488. const BROWSER_MODULE_PROVIDERS = [
  489. { provide: _INJECTOR_SCOPE, useValue: 'root' },
  490. { provide: ErrorHandler, useFactory: errorHandler },
  491. {
  492. provide: EVENT_MANAGER_PLUGINS,
  493. useClass: DomEventsPlugin,
  494. multi: true,
  495. deps: [DOCUMENT],
  496. },
  497. { provide: EVENT_MANAGER_PLUGINS, useClass: KeyEventsPlugin, multi: true, deps: [DOCUMENT] },
  498. DomRendererFactory2,
  499. SharedStylesHost,
  500. EventManager,
  501. { provide: RendererFactory2, useExisting: DomRendererFactory2 },
  502. { provide: XhrFactory, useClass: BrowserXhr },
  503. typeof ngDevMode === 'undefined' || ngDevMode
  504. ? { provide: BROWSER_MODULE_PROVIDERS_MARKER, useValue: true }
  505. : [],
  506. ];
  507. /**
  508. * Exports required infrastructure for all Angular apps.
  509. * Included by default in all Angular apps created with the CLI
  510. * `new` command.
  511. * Re-exports `CommonModule` and `ApplicationModule`, making their
  512. * exports and providers available to all apps.
  513. *
  514. * @publicApi
  515. */
  516. class BrowserModule {
  517. constructor() {
  518. if (typeof ngDevMode === 'undefined' || ngDevMode) {
  519. const providersAlreadyPresent = inject(BROWSER_MODULE_PROVIDERS_MARKER, {
  520. optional: true,
  521. skipSelf: true,
  522. });
  523. if (providersAlreadyPresent) {
  524. throw new _RuntimeError(5100 /* RuntimeErrorCode.BROWSER_MODULE_ALREADY_LOADED */, `Providers from the \`BrowserModule\` have already been loaded. If you need access ` +
  525. `to common directives such as NgIf and NgFor, import the \`CommonModule\` instead.`);
  526. }
  527. }
  528. }
  529. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: BrowserModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
  530. static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.13", ngImport: i0, type: BrowserModule, exports: [CommonModule, ApplicationModule] });
  531. 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] });
  532. }
  533. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: BrowserModule, decorators: [{
  534. type: NgModule,
  535. args: [{
  536. providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS],
  537. exports: [CommonModule, ApplicationModule],
  538. }]
  539. }], ctorParameters: () => [] });
  540. export { BrowserDomAdapter, BrowserGetTestability, BrowserModule, DomEventsPlugin, KeyEventsPlugin, bootstrapApplication, createApplication, platformBrowser, provideProtractorTestingSupport };
  541. //# sourceMappingURL=browser-D-u-fknz.mjs.map