chunk-NFFN32GK.js 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232
  1. import {
  2. CommonModule,
  3. DomAdapter,
  4. PLATFORM_BROWSER_ID,
  5. getDOM,
  6. isPlatformServer,
  7. setRootDomAdapter
  8. } from "./chunk-VHSNDQRF.js";
  9. import {
  10. XhrFactory,
  11. parseCookieValue
  12. } from "./chunk-OPGNYZHR.js";
  13. import {
  14. APP_ID,
  15. ApplicationModule,
  16. CSP_NONCE,
  17. DOCUMENT,
  18. ErrorHandler,
  19. INJECTOR_SCOPE,
  20. Inject,
  21. Injectable,
  22. InjectionToken,
  23. NgModule,
  24. NgZone,
  25. Optional,
  26. PLATFORM_ID,
  27. PLATFORM_INITIALIZER,
  28. RendererFactory2,
  29. RendererStyleFlags2,
  30. RuntimeError,
  31. TESTABILITY,
  32. TESTABILITY_GETTER,
  33. Testability,
  34. TestabilityRegistry,
  35. TracingService,
  36. ViewEncapsulation,
  37. _global,
  38. createPlatformFactory,
  39. inject,
  40. internalCreateApplication,
  41. platformCore,
  42. setClassMetadata,
  43. setDocument,
  44. ɵɵdefineInjectable,
  45. ɵɵdefineInjector,
  46. ɵɵdefineNgModule,
  47. ɵɵinject
  48. } from "./chunk-Y7NS2SYH.js";
  49. import {
  50. __spreadValues
  51. } from "./chunk-WDMUDEB6.js";
  52. // node_modules/@angular/platform-browser/fesm2022/dom_renderer.mjs
  53. var EVENT_MANAGER_PLUGINS = new InjectionToken(ngDevMode ? "EventManagerPlugins" : "");
  54. var EventManager = class _EventManager {
  55. _zone;
  56. _plugins;
  57. _eventNameToPlugin = /* @__PURE__ */ new Map();
  58. /**
  59. * Initializes an instance of the event-manager service.
  60. */
  61. constructor(plugins, _zone) {
  62. this._zone = _zone;
  63. plugins.forEach((plugin) => {
  64. plugin.manager = this;
  65. });
  66. this._plugins = plugins.slice().reverse();
  67. }
  68. /**
  69. * Registers a handler for a specific element and event.
  70. *
  71. * @param element The HTML element to receive event notifications.
  72. * @param eventName The name of the event to listen for.
  73. * @param handler A function to call when the notification occurs. Receives the
  74. * event object as an argument.
  75. * @param options Options that configure how the event listener is bound.
  76. * @returns A callback function that can be used to remove the handler.
  77. */
  78. addEventListener(element, eventName, handler, options) {
  79. const plugin = this._findPluginFor(eventName);
  80. return plugin.addEventListener(element, eventName, handler, options);
  81. }
  82. /**
  83. * Retrieves the compilation zone in which event listeners are registered.
  84. */
  85. getZone() {
  86. return this._zone;
  87. }
  88. /** @internal */
  89. _findPluginFor(eventName) {
  90. let plugin = this._eventNameToPlugin.get(eventName);
  91. if (plugin) {
  92. return plugin;
  93. }
  94. const plugins = this._plugins;
  95. plugin = plugins.find((plugin2) => plugin2.supports(eventName));
  96. if (!plugin) {
  97. throw new RuntimeError(5101, (typeof ngDevMode === "undefined" || ngDevMode) && `No event manager plugin found for event ${eventName}`);
  98. }
  99. this._eventNameToPlugin.set(eventName, plugin);
  100. return plugin;
  101. }
  102. static ɵfac = function EventManager_Factory(__ngFactoryType__) {
  103. return new (__ngFactoryType__ || _EventManager)(ɵɵinject(EVENT_MANAGER_PLUGINS), ɵɵinject(NgZone));
  104. };
  105. static ɵprov = ɵɵdefineInjectable({
  106. token: _EventManager,
  107. factory: _EventManager.ɵfac
  108. });
  109. };
  110. (() => {
  111. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(EventManager, [{
  112. type: Injectable
  113. }], () => [{
  114. type: void 0,
  115. decorators: [{
  116. type: Inject,
  117. args: [EVENT_MANAGER_PLUGINS]
  118. }]
  119. }, {
  120. type: NgZone
  121. }], null);
  122. })();
  123. var EventManagerPlugin = class {
  124. _doc;
  125. // TODO: remove (has some usage in G3)
  126. constructor(_doc) {
  127. this._doc = _doc;
  128. }
  129. // Using non-null assertion because it's set by EventManager's constructor
  130. manager;
  131. };
  132. var APP_ID_ATTRIBUTE_NAME = "ng-app-id";
  133. function removeElements(elements) {
  134. for (const element of elements) {
  135. element.remove();
  136. }
  137. }
  138. function createStyleElement(style, doc) {
  139. const styleElement = doc.createElement("style");
  140. styleElement.textContent = style;
  141. return styleElement;
  142. }
  143. function addServerStyles(doc, appId, inline, external) {
  144. const elements = doc.head?.querySelectorAll(`style[${APP_ID_ATTRIBUTE_NAME}="${appId}"],link[${APP_ID_ATTRIBUTE_NAME}="${appId}"]`);
  145. if (elements) {
  146. for (const styleElement of elements) {
  147. styleElement.removeAttribute(APP_ID_ATTRIBUTE_NAME);
  148. if (styleElement instanceof HTMLLinkElement) {
  149. external.set(styleElement.href.slice(styleElement.href.lastIndexOf("/") + 1), {
  150. usage: 0,
  151. elements: [styleElement]
  152. });
  153. } else if (styleElement.textContent) {
  154. inline.set(styleElement.textContent, {
  155. usage: 0,
  156. elements: [styleElement]
  157. });
  158. }
  159. }
  160. }
  161. }
  162. function createLinkElement(url, doc) {
  163. const linkElement = doc.createElement("link");
  164. linkElement.setAttribute("rel", "stylesheet");
  165. linkElement.setAttribute("href", url);
  166. return linkElement;
  167. }
  168. var SharedStylesHost = class _SharedStylesHost {
  169. doc;
  170. appId;
  171. nonce;
  172. /**
  173. * Provides usage information for active inline style content and associated HTML <style> elements.
  174. * Embedded styles typically originate from the `styles` metadata of a rendered component.
  175. */
  176. inline = /* @__PURE__ */ new Map();
  177. /**
  178. * Provides usage information for active external style URLs and the associated HTML <link> elements.
  179. * External styles typically originate from the `ɵɵExternalStylesFeature` of a rendered component.
  180. */
  181. external = /* @__PURE__ */ new Map();
  182. /**
  183. * Set of host DOM nodes that will have styles attached.
  184. */
  185. hosts = /* @__PURE__ */ new Set();
  186. /**
  187. * Whether the application code is currently executing on a server.
  188. */
  189. isServer;
  190. constructor(doc, appId, nonce, platformId = {}) {
  191. this.doc = doc;
  192. this.appId = appId;
  193. this.nonce = nonce;
  194. this.isServer = isPlatformServer(platformId);
  195. addServerStyles(doc, appId, this.inline, this.external);
  196. this.hosts.add(doc.head);
  197. }
  198. /**
  199. * Adds embedded styles to the DOM via HTML `style` elements.
  200. * @param styles An array of style content strings.
  201. */
  202. addStyles(styles, urls) {
  203. for (const value of styles) {
  204. this.addUsage(value, this.inline, createStyleElement);
  205. }
  206. urls?.forEach((value) => this.addUsage(value, this.external, createLinkElement));
  207. }
  208. /**
  209. * Removes embedded styles from the DOM that were added as HTML `style` elements.
  210. * @param styles An array of style content strings.
  211. */
  212. removeStyles(styles, urls) {
  213. for (const value of styles) {
  214. this.removeUsage(value, this.inline);
  215. }
  216. urls?.forEach((value) => this.removeUsage(value, this.external));
  217. }
  218. addUsage(value, usages, creator) {
  219. const record = usages.get(value);
  220. if (record) {
  221. if ((typeof ngDevMode === "undefined" || ngDevMode) && record.usage === 0) {
  222. record.elements.forEach((element) => element.setAttribute("ng-style-reused", ""));
  223. }
  224. record.usage++;
  225. } else {
  226. usages.set(value, {
  227. usage: 1,
  228. elements: [...this.hosts].map((host) => this.addElement(host, creator(value, this.doc)))
  229. });
  230. }
  231. }
  232. removeUsage(value, usages) {
  233. const record = usages.get(value);
  234. if (record) {
  235. record.usage--;
  236. if (record.usage <= 0) {
  237. removeElements(record.elements);
  238. usages.delete(value);
  239. }
  240. }
  241. }
  242. ngOnDestroy() {
  243. for (const [, {
  244. elements
  245. }] of [...this.inline, ...this.external]) {
  246. removeElements(elements);
  247. }
  248. this.hosts.clear();
  249. }
  250. /**
  251. * Adds a host node to the set of style hosts and adds all existing style usage to
  252. * the newly added host node.
  253. *
  254. * This is currently only used for Shadow DOM encapsulation mode.
  255. */
  256. addHost(hostNode) {
  257. this.hosts.add(hostNode);
  258. for (const [style, {
  259. elements
  260. }] of this.inline) {
  261. elements.push(this.addElement(hostNode, createStyleElement(style, this.doc)));
  262. }
  263. for (const [url, {
  264. elements
  265. }] of this.external) {
  266. elements.push(this.addElement(hostNode, createLinkElement(url, this.doc)));
  267. }
  268. }
  269. removeHost(hostNode) {
  270. this.hosts.delete(hostNode);
  271. }
  272. addElement(host, element) {
  273. if (this.nonce) {
  274. element.setAttribute("nonce", this.nonce);
  275. }
  276. if (this.isServer) {
  277. element.setAttribute(APP_ID_ATTRIBUTE_NAME, this.appId);
  278. }
  279. return host.appendChild(element);
  280. }
  281. static ɵfac = function SharedStylesHost_Factory(__ngFactoryType__) {
  282. return new (__ngFactoryType__ || _SharedStylesHost)(ɵɵinject(DOCUMENT), ɵɵinject(APP_ID), ɵɵinject(CSP_NONCE, 8), ɵɵinject(PLATFORM_ID));
  283. };
  284. static ɵprov = ɵɵdefineInjectable({
  285. token: _SharedStylesHost,
  286. factory: _SharedStylesHost.ɵfac
  287. });
  288. };
  289. (() => {
  290. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(SharedStylesHost, [{
  291. type: Injectable
  292. }], () => [{
  293. type: Document,
  294. decorators: [{
  295. type: Inject,
  296. args: [DOCUMENT]
  297. }]
  298. }, {
  299. type: void 0,
  300. decorators: [{
  301. type: Inject,
  302. args: [APP_ID]
  303. }]
  304. }, {
  305. type: void 0,
  306. decorators: [{
  307. type: Inject,
  308. args: [CSP_NONCE]
  309. }, {
  310. type: Optional
  311. }]
  312. }, {
  313. type: void 0,
  314. decorators: [{
  315. type: Inject,
  316. args: [PLATFORM_ID]
  317. }]
  318. }], null);
  319. })();
  320. var NAMESPACE_URIS = {
  321. "svg": "http://www.w3.org/2000/svg",
  322. "xhtml": "http://www.w3.org/1999/xhtml",
  323. "xlink": "http://www.w3.org/1999/xlink",
  324. "xml": "http://www.w3.org/XML/1998/namespace",
  325. "xmlns": "http://www.w3.org/2000/xmlns/",
  326. "math": "http://www.w3.org/1998/Math/MathML"
  327. };
  328. var COMPONENT_REGEX = /%COMP%/g;
  329. var SOURCEMAP_URL_REGEXP = /\/\*#\s*sourceMappingURL=(.+?)\s*\*\//;
  330. var PROTOCOL_REGEXP = /^https?:/;
  331. var COMPONENT_VARIABLE = "%COMP%";
  332. var HOST_ATTR = `_nghost-${COMPONENT_VARIABLE}`;
  333. var CONTENT_ATTR = `_ngcontent-${COMPONENT_VARIABLE}`;
  334. var REMOVE_STYLES_ON_COMPONENT_DESTROY_DEFAULT = true;
  335. var REMOVE_STYLES_ON_COMPONENT_DESTROY = new InjectionToken(ngDevMode ? "RemoveStylesOnCompDestroy" : "", {
  336. providedIn: "root",
  337. factory: () => REMOVE_STYLES_ON_COMPONENT_DESTROY_DEFAULT
  338. });
  339. function shimContentAttribute(componentShortId) {
  340. return CONTENT_ATTR.replace(COMPONENT_REGEX, componentShortId);
  341. }
  342. function shimHostAttribute(componentShortId) {
  343. return HOST_ATTR.replace(COMPONENT_REGEX, componentShortId);
  344. }
  345. function shimStylesContent(compId, styles) {
  346. return styles.map((s) => s.replace(COMPONENT_REGEX, compId));
  347. }
  348. function addBaseHrefToCssSourceMap(baseHref, styles) {
  349. if (!baseHref) {
  350. return styles;
  351. }
  352. const absoluteBaseHrefUrl = new URL(baseHref, "http://localhost");
  353. return styles.map((cssContent) => {
  354. if (!cssContent.includes("sourceMappingURL=")) {
  355. return cssContent;
  356. }
  357. return cssContent.replace(SOURCEMAP_URL_REGEXP, (_, sourceMapUrl) => {
  358. if (sourceMapUrl[0] === "/" || sourceMapUrl.startsWith("data:") || PROTOCOL_REGEXP.test(sourceMapUrl)) {
  359. return `/*# sourceMappingURL=${sourceMapUrl} */`;
  360. }
  361. const {
  362. pathname: resolvedSourceMapUrl
  363. } = new URL(sourceMapUrl, absoluteBaseHrefUrl);
  364. return `/*# sourceMappingURL=${resolvedSourceMapUrl} */`;
  365. });
  366. });
  367. }
  368. var DomRendererFactory2 = class _DomRendererFactory2 {
  369. eventManager;
  370. sharedStylesHost;
  371. appId;
  372. removeStylesOnCompDestroy;
  373. doc;
  374. platformId;
  375. ngZone;
  376. nonce;
  377. tracingService;
  378. rendererByCompId = /* @__PURE__ */ new Map();
  379. defaultRenderer;
  380. platformIsServer;
  381. constructor(eventManager, sharedStylesHost, appId, removeStylesOnCompDestroy, doc, platformId, ngZone, nonce = null, tracingService = null) {
  382. this.eventManager = eventManager;
  383. this.sharedStylesHost = sharedStylesHost;
  384. this.appId = appId;
  385. this.removeStylesOnCompDestroy = removeStylesOnCompDestroy;
  386. this.doc = doc;
  387. this.platformId = platformId;
  388. this.ngZone = ngZone;
  389. this.nonce = nonce;
  390. this.tracingService = tracingService;
  391. this.platformIsServer = false;
  392. this.defaultRenderer = new DefaultDomRenderer2(eventManager, doc, ngZone, this.platformIsServer, this.tracingService);
  393. }
  394. createRenderer(element, type) {
  395. if (!element || !type) {
  396. return this.defaultRenderer;
  397. }
  398. if (false) {
  399. type = __spreadProps(__spreadValues({}, type), {
  400. encapsulation: ViewEncapsulation.Emulated
  401. });
  402. }
  403. const renderer = this.getOrCreateRenderer(element, type);
  404. if (renderer instanceof EmulatedEncapsulationDomRenderer2) {
  405. renderer.applyToHost(element);
  406. } else if (renderer instanceof NoneEncapsulationDomRenderer) {
  407. renderer.applyStyles();
  408. }
  409. return renderer;
  410. }
  411. getOrCreateRenderer(element, type) {
  412. const rendererByCompId = this.rendererByCompId;
  413. let renderer = rendererByCompId.get(type.id);
  414. if (!renderer) {
  415. const doc = this.doc;
  416. const ngZone = this.ngZone;
  417. const eventManager = this.eventManager;
  418. const sharedStylesHost = this.sharedStylesHost;
  419. const removeStylesOnCompDestroy = this.removeStylesOnCompDestroy;
  420. const platformIsServer = this.platformIsServer;
  421. const tracingService = this.tracingService;
  422. switch (type.encapsulation) {
  423. case ViewEncapsulation.Emulated:
  424. renderer = new EmulatedEncapsulationDomRenderer2(eventManager, sharedStylesHost, type, this.appId, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService);
  425. break;
  426. case ViewEncapsulation.ShadowDom:
  427. return new ShadowDomRenderer(eventManager, sharedStylesHost, element, type, doc, ngZone, this.nonce, platformIsServer, tracingService);
  428. default:
  429. renderer = new NoneEncapsulationDomRenderer(eventManager, sharedStylesHost, type, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService);
  430. break;
  431. }
  432. rendererByCompId.set(type.id, renderer);
  433. }
  434. return renderer;
  435. }
  436. ngOnDestroy() {
  437. this.rendererByCompId.clear();
  438. }
  439. /**
  440. * Used during HMR to clear any cached data about a component.
  441. * @param componentId ID of the component that is being replaced.
  442. */
  443. componentReplaced(componentId) {
  444. this.rendererByCompId.delete(componentId);
  445. }
  446. static ɵfac = function DomRendererFactory2_Factory(__ngFactoryType__) {
  447. return new (__ngFactoryType__ || _DomRendererFactory2)(ɵɵinject(EventManager), ɵɵinject(SharedStylesHost), ɵɵinject(APP_ID), ɵɵinject(REMOVE_STYLES_ON_COMPONENT_DESTROY), ɵɵinject(DOCUMENT), ɵɵinject(PLATFORM_ID), ɵɵinject(NgZone), ɵɵinject(CSP_NONCE), ɵɵinject(TracingService, 8));
  448. };
  449. static ɵprov = ɵɵdefineInjectable({
  450. token: _DomRendererFactory2,
  451. factory: _DomRendererFactory2.ɵfac
  452. });
  453. };
  454. (() => {
  455. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DomRendererFactory2, [{
  456. type: Injectable
  457. }], () => [{
  458. type: EventManager
  459. }, {
  460. type: SharedStylesHost
  461. }, {
  462. type: void 0,
  463. decorators: [{
  464. type: Inject,
  465. args: [APP_ID]
  466. }]
  467. }, {
  468. type: void 0,
  469. decorators: [{
  470. type: Inject,
  471. args: [REMOVE_STYLES_ON_COMPONENT_DESTROY]
  472. }]
  473. }, {
  474. type: Document,
  475. decorators: [{
  476. type: Inject,
  477. args: [DOCUMENT]
  478. }]
  479. }, {
  480. type: Object,
  481. decorators: [{
  482. type: Inject,
  483. args: [PLATFORM_ID]
  484. }]
  485. }, {
  486. type: NgZone
  487. }, {
  488. type: void 0,
  489. decorators: [{
  490. type: Inject,
  491. args: [CSP_NONCE]
  492. }]
  493. }, {
  494. type: TracingService,
  495. decorators: [{
  496. type: Inject,
  497. args: [TracingService]
  498. }, {
  499. type: Optional
  500. }]
  501. }], null);
  502. })();
  503. var DefaultDomRenderer2 = class {
  504. eventManager;
  505. doc;
  506. ngZone;
  507. platformIsServer;
  508. tracingService;
  509. data = /* @__PURE__ */ Object.create(null);
  510. /**
  511. * By default this renderer throws when encountering synthetic properties
  512. * This can be disabled for example by the AsyncAnimationRendererFactory
  513. */
  514. throwOnSyntheticProps = true;
  515. constructor(eventManager, doc, ngZone, platformIsServer, tracingService) {
  516. this.eventManager = eventManager;
  517. this.doc = doc;
  518. this.ngZone = ngZone;
  519. this.platformIsServer = platformIsServer;
  520. this.tracingService = tracingService;
  521. }
  522. destroy() {
  523. }
  524. destroyNode = null;
  525. createElement(name, namespace) {
  526. if (namespace) {
  527. return this.doc.createElementNS(NAMESPACE_URIS[namespace] || namespace, name);
  528. }
  529. return this.doc.createElement(name);
  530. }
  531. createComment(value) {
  532. return this.doc.createComment(value);
  533. }
  534. createText(value) {
  535. return this.doc.createTextNode(value);
  536. }
  537. appendChild(parent, newChild) {
  538. const targetParent = isTemplateNode(parent) ? parent.content : parent;
  539. targetParent.appendChild(newChild);
  540. }
  541. insertBefore(parent, newChild, refChild) {
  542. if (parent) {
  543. const targetParent = isTemplateNode(parent) ? parent.content : parent;
  544. targetParent.insertBefore(newChild, refChild);
  545. }
  546. }
  547. removeChild(_parent, oldChild) {
  548. oldChild.remove();
  549. }
  550. selectRootElement(selectorOrNode, preserveContent) {
  551. let el = typeof selectorOrNode === "string" ? this.doc.querySelector(selectorOrNode) : selectorOrNode;
  552. if (!el) {
  553. throw new RuntimeError(-5104, (typeof ngDevMode === "undefined" || ngDevMode) && `The selector "${selectorOrNode}" did not match any elements`);
  554. }
  555. if (!preserveContent) {
  556. el.textContent = "";
  557. }
  558. return el;
  559. }
  560. parentNode(node) {
  561. return node.parentNode;
  562. }
  563. nextSibling(node) {
  564. return node.nextSibling;
  565. }
  566. setAttribute(el, name, value, namespace) {
  567. if (namespace) {
  568. name = namespace + ":" + name;
  569. const namespaceUri = NAMESPACE_URIS[namespace];
  570. if (namespaceUri) {
  571. el.setAttributeNS(namespaceUri, name, value);
  572. } else {
  573. el.setAttribute(name, value);
  574. }
  575. } else {
  576. el.setAttribute(name, value);
  577. }
  578. }
  579. removeAttribute(el, name, namespace) {
  580. if (namespace) {
  581. const namespaceUri = NAMESPACE_URIS[namespace];
  582. if (namespaceUri) {
  583. el.removeAttributeNS(namespaceUri, name);
  584. } else {
  585. el.removeAttribute(`${namespace}:${name}`);
  586. }
  587. } else {
  588. el.removeAttribute(name);
  589. }
  590. }
  591. addClass(el, name) {
  592. el.classList.add(name);
  593. }
  594. removeClass(el, name) {
  595. el.classList.remove(name);
  596. }
  597. setStyle(el, style, value, flags) {
  598. if (flags & (RendererStyleFlags2.DashCase | RendererStyleFlags2.Important)) {
  599. el.style.setProperty(style, value, flags & RendererStyleFlags2.Important ? "important" : "");
  600. } else {
  601. el.style[style] = value;
  602. }
  603. }
  604. removeStyle(el, style, flags) {
  605. if (flags & RendererStyleFlags2.DashCase) {
  606. el.style.removeProperty(style);
  607. } else {
  608. el.style[style] = "";
  609. }
  610. }
  611. setProperty(el, name, value) {
  612. if (el == null) {
  613. return;
  614. }
  615. (typeof ngDevMode === "undefined" || ngDevMode) && this.throwOnSyntheticProps && checkNoSyntheticProp(name, "property");
  616. el[name] = value;
  617. }
  618. setValue(node, value) {
  619. node.nodeValue = value;
  620. }
  621. listen(target, event, callback, options) {
  622. (typeof ngDevMode === "undefined" || ngDevMode) && this.throwOnSyntheticProps && checkNoSyntheticProp(event, "listener");
  623. if (typeof target === "string") {
  624. target = getDOM().getGlobalEventTarget(this.doc, target);
  625. if (!target) {
  626. throw new RuntimeError(5102, (typeof ngDevMode === "undefined" || ngDevMode) && `Unsupported event target ${target} for event ${event}`);
  627. }
  628. }
  629. let wrappedCallback = this.decoratePreventDefault(callback);
  630. if (this.tracingService?.wrapEventListener) {
  631. wrappedCallback = this.tracingService.wrapEventListener(target, event, wrappedCallback);
  632. }
  633. return this.eventManager.addEventListener(target, event, wrappedCallback, options);
  634. }
  635. decoratePreventDefault(eventHandler) {
  636. return (event) => {
  637. if (event === "__ngUnwrap__") {
  638. return eventHandler;
  639. }
  640. const allowDefaultBehavior = false ? this.ngZone.runGuarded(() => eventHandler(event)) : eventHandler(event);
  641. if (allowDefaultBehavior === false) {
  642. event.preventDefault();
  643. }
  644. return void 0;
  645. };
  646. }
  647. };
  648. var AT_CHARCODE = (() => "@".charCodeAt(0))();
  649. function checkNoSyntheticProp(name, nameKind) {
  650. if (name.charCodeAt(0) === AT_CHARCODE) {
  651. throw new RuntimeError(5105, `Unexpected synthetic ${nameKind} ${name} found. Please make sure that:
  652. - Make sure \`provideAnimationsAsync()\`, \`provideAnimations()\` or \`provideNoopAnimations()\` call was added to a list of providers used to bootstrap an application.
  653. - There is a corresponding animation configuration named \`${name}\` defined in the \`animations\` field of the \`@Component\` decorator (see https://angular.dev/api/core/Component#animations).`);
  654. }
  655. }
  656. function isTemplateNode(node) {
  657. return node.tagName === "TEMPLATE" && node.content !== void 0;
  658. }
  659. var ShadowDomRenderer = class extends DefaultDomRenderer2 {
  660. sharedStylesHost;
  661. hostEl;
  662. shadowRoot;
  663. constructor(eventManager, sharedStylesHost, hostEl, component, doc, ngZone, nonce, platformIsServer, tracingService) {
  664. super(eventManager, doc, ngZone, platformIsServer, tracingService);
  665. this.sharedStylesHost = sharedStylesHost;
  666. this.hostEl = hostEl;
  667. this.shadowRoot = hostEl.attachShadow({
  668. mode: "open"
  669. });
  670. this.sharedStylesHost.addHost(this.shadowRoot);
  671. let styles = component.styles;
  672. if (ngDevMode) {
  673. const baseHref = getDOM().getBaseHref(doc) ?? "";
  674. styles = addBaseHrefToCssSourceMap(baseHref, styles);
  675. }
  676. styles = shimStylesContent(component.id, styles);
  677. for (const style of styles) {
  678. const styleEl = document.createElement("style");
  679. if (nonce) {
  680. styleEl.setAttribute("nonce", nonce);
  681. }
  682. styleEl.textContent = style;
  683. this.shadowRoot.appendChild(styleEl);
  684. }
  685. const styleUrls = component.getExternalStyles?.();
  686. if (styleUrls) {
  687. for (const styleUrl of styleUrls) {
  688. const linkEl = createLinkElement(styleUrl, doc);
  689. if (nonce) {
  690. linkEl.setAttribute("nonce", nonce);
  691. }
  692. this.shadowRoot.appendChild(linkEl);
  693. }
  694. }
  695. }
  696. nodeOrShadowRoot(node) {
  697. return node === this.hostEl ? this.shadowRoot : node;
  698. }
  699. appendChild(parent, newChild) {
  700. return super.appendChild(this.nodeOrShadowRoot(parent), newChild);
  701. }
  702. insertBefore(parent, newChild, refChild) {
  703. return super.insertBefore(this.nodeOrShadowRoot(parent), newChild, refChild);
  704. }
  705. removeChild(_parent, oldChild) {
  706. return super.removeChild(null, oldChild);
  707. }
  708. parentNode(node) {
  709. return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(node)));
  710. }
  711. destroy() {
  712. this.sharedStylesHost.removeHost(this.shadowRoot);
  713. }
  714. };
  715. var NoneEncapsulationDomRenderer = class extends DefaultDomRenderer2 {
  716. sharedStylesHost;
  717. removeStylesOnCompDestroy;
  718. styles;
  719. styleUrls;
  720. constructor(eventManager, sharedStylesHost, component, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService, compId) {
  721. super(eventManager, doc, ngZone, platformIsServer, tracingService);
  722. this.sharedStylesHost = sharedStylesHost;
  723. this.removeStylesOnCompDestroy = removeStylesOnCompDestroy;
  724. let styles = component.styles;
  725. if (ngDevMode) {
  726. const baseHref = getDOM().getBaseHref(doc) ?? "";
  727. styles = addBaseHrefToCssSourceMap(baseHref, styles);
  728. }
  729. this.styles = compId ? shimStylesContent(compId, styles) : styles;
  730. this.styleUrls = component.getExternalStyles?.(compId);
  731. }
  732. applyStyles() {
  733. this.sharedStylesHost.addStyles(this.styles, this.styleUrls);
  734. }
  735. destroy() {
  736. if (!this.removeStylesOnCompDestroy) {
  737. return;
  738. }
  739. this.sharedStylesHost.removeStyles(this.styles, this.styleUrls);
  740. }
  741. };
  742. var EmulatedEncapsulationDomRenderer2 = class extends NoneEncapsulationDomRenderer {
  743. contentAttr;
  744. hostAttr;
  745. constructor(eventManager, sharedStylesHost, component, appId, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService) {
  746. const compId = appId + "-" + component.id;
  747. super(eventManager, sharedStylesHost, component, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService, compId);
  748. this.contentAttr = shimContentAttribute(compId);
  749. this.hostAttr = shimHostAttribute(compId);
  750. }
  751. applyToHost(element) {
  752. this.applyStyles();
  753. this.setAttribute(element, this.hostAttr, "");
  754. }
  755. createElement(parent, name) {
  756. const el = super.createElement(parent, name);
  757. super.setAttribute(el, this.contentAttr, "");
  758. return el;
  759. }
  760. };
  761. // node_modules/@angular/platform-browser/fesm2022/browser.mjs
  762. var BrowserDomAdapter = class _BrowserDomAdapter extends DomAdapter {
  763. supportsDOMEvents = true;
  764. static makeCurrent() {
  765. setRootDomAdapter(new _BrowserDomAdapter());
  766. }
  767. onAndCancel(el, evt, listener, options) {
  768. el.addEventListener(evt, listener, options);
  769. return () => {
  770. el.removeEventListener(evt, listener, options);
  771. };
  772. }
  773. dispatchEvent(el, evt) {
  774. el.dispatchEvent(evt);
  775. }
  776. remove(node) {
  777. node.remove();
  778. }
  779. createElement(tagName, doc) {
  780. doc = doc || this.getDefaultDocument();
  781. return doc.createElement(tagName);
  782. }
  783. createHtmlDocument() {
  784. return document.implementation.createHTMLDocument("fakeTitle");
  785. }
  786. getDefaultDocument() {
  787. return document;
  788. }
  789. isElementNode(node) {
  790. return node.nodeType === Node.ELEMENT_NODE;
  791. }
  792. isShadowRoot(node) {
  793. return node instanceof DocumentFragment;
  794. }
  795. /** @deprecated No longer being used in Ivy code. To be removed in version 14. */
  796. getGlobalEventTarget(doc, target) {
  797. if (target === "window") {
  798. return window;
  799. }
  800. if (target === "document") {
  801. return doc;
  802. }
  803. if (target === "body") {
  804. return doc.body;
  805. }
  806. return null;
  807. }
  808. getBaseHref(doc) {
  809. const href = getBaseElementHref();
  810. return href == null ? null : relativePath(href);
  811. }
  812. resetBaseElement() {
  813. baseElement = null;
  814. }
  815. getUserAgent() {
  816. return window.navigator.userAgent;
  817. }
  818. getCookie(name) {
  819. return parseCookieValue(document.cookie, name);
  820. }
  821. };
  822. var baseElement = null;
  823. function getBaseElementHref() {
  824. baseElement = baseElement || document.head.querySelector("base");
  825. return baseElement ? baseElement.getAttribute("href") : null;
  826. }
  827. function relativePath(url) {
  828. return new URL(url, document.baseURI).pathname;
  829. }
  830. var BrowserGetTestability = class {
  831. addToWindow(registry) {
  832. _global["getAngularTestability"] = (elem, findInAncestors = true) => {
  833. const testability = registry.findTestabilityInTree(elem, findInAncestors);
  834. if (testability == null) {
  835. throw new RuntimeError(5103, (typeof ngDevMode === "undefined" || ngDevMode) && "Could not find testability for element.");
  836. }
  837. return testability;
  838. };
  839. _global["getAllAngularTestabilities"] = () => registry.getAllTestabilities();
  840. _global["getAllAngularRootElements"] = () => registry.getAllRootElements();
  841. const whenAllStable = (callback) => {
  842. const testabilities = _global["getAllAngularTestabilities"]();
  843. let count = testabilities.length;
  844. const decrement = function() {
  845. count--;
  846. if (count == 0) {
  847. callback();
  848. }
  849. };
  850. testabilities.forEach((testability) => {
  851. testability.whenStable(decrement);
  852. });
  853. };
  854. if (!_global["frameworkStabilizers"]) {
  855. _global["frameworkStabilizers"] = [];
  856. }
  857. _global["frameworkStabilizers"].push(whenAllStable);
  858. }
  859. findTestabilityInTree(registry, elem, findInAncestors) {
  860. if (elem == null) {
  861. return null;
  862. }
  863. const t = registry.getTestability(elem);
  864. if (t != null) {
  865. return t;
  866. } else if (!findInAncestors) {
  867. return null;
  868. }
  869. if (getDOM().isShadowRoot(elem)) {
  870. return this.findTestabilityInTree(registry, elem.host, true);
  871. }
  872. return this.findTestabilityInTree(registry, elem.parentElement, true);
  873. }
  874. };
  875. var BrowserXhr = class _BrowserXhr {
  876. build() {
  877. return new XMLHttpRequest();
  878. }
  879. static ɵfac = function BrowserXhr_Factory(__ngFactoryType__) {
  880. return new (__ngFactoryType__ || _BrowserXhr)();
  881. };
  882. static ɵprov = ɵɵdefineInjectable({
  883. token: _BrowserXhr,
  884. factory: _BrowserXhr.ɵfac
  885. });
  886. };
  887. (() => {
  888. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(BrowserXhr, [{
  889. type: Injectable
  890. }], null, null);
  891. })();
  892. var DomEventsPlugin = class _DomEventsPlugin extends EventManagerPlugin {
  893. constructor(doc) {
  894. super(doc);
  895. }
  896. // This plugin should come last in the list of plugins, because it accepts all
  897. // events.
  898. supports(eventName) {
  899. return true;
  900. }
  901. addEventListener(element, eventName, handler, options) {
  902. element.addEventListener(eventName, handler, options);
  903. return () => this.removeEventListener(element, eventName, handler, options);
  904. }
  905. removeEventListener(target, eventName, callback, options) {
  906. return target.removeEventListener(eventName, callback, options);
  907. }
  908. static ɵfac = function DomEventsPlugin_Factory(__ngFactoryType__) {
  909. return new (__ngFactoryType__ || _DomEventsPlugin)(ɵɵinject(DOCUMENT));
  910. };
  911. static ɵprov = ɵɵdefineInjectable({
  912. token: _DomEventsPlugin,
  913. factory: _DomEventsPlugin.ɵfac
  914. });
  915. };
  916. (() => {
  917. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DomEventsPlugin, [{
  918. type: Injectable
  919. }], () => [{
  920. type: void 0,
  921. decorators: [{
  922. type: Inject,
  923. args: [DOCUMENT]
  924. }]
  925. }], null);
  926. })();
  927. var MODIFIER_KEYS = ["alt", "control", "meta", "shift"];
  928. var _keyMap = {
  929. "\b": "Backspace",
  930. " ": "Tab",
  931. "": "Delete",
  932. "\x1B": "Escape",
  933. "Del": "Delete",
  934. "Esc": "Escape",
  935. "Left": "ArrowLeft",
  936. "Right": "ArrowRight",
  937. "Up": "ArrowUp",
  938. "Down": "ArrowDown",
  939. "Menu": "ContextMenu",
  940. "Scroll": "ScrollLock",
  941. "Win": "OS"
  942. };
  943. var MODIFIER_KEY_GETTERS = {
  944. "alt": (event) => event.altKey,
  945. "control": (event) => event.ctrlKey,
  946. "meta": (event) => event.metaKey,
  947. "shift": (event) => event.shiftKey
  948. };
  949. var KeyEventsPlugin = class _KeyEventsPlugin extends EventManagerPlugin {
  950. /**
  951. * Initializes an instance of the browser plug-in.
  952. * @param doc The document in which key events will be detected.
  953. */
  954. constructor(doc) {
  955. super(doc);
  956. }
  957. /**
  958. * Reports whether a named key event is supported.
  959. * @param eventName The event name to query.
  960. * @return True if the named key event is supported.
  961. */
  962. supports(eventName) {
  963. return _KeyEventsPlugin.parseEventName(eventName) != null;
  964. }
  965. /**
  966. * Registers a handler for a specific element and key event.
  967. * @param element The HTML element to receive event notifications.
  968. * @param eventName The name of the key event to listen for.
  969. * @param handler A function to call when the notification occurs. Receives the
  970. * event object as an argument.
  971. * @returns The key event that was registered.
  972. */
  973. addEventListener(element, eventName, handler, options) {
  974. const parsedEvent = _KeyEventsPlugin.parseEventName(eventName);
  975. const outsideHandler = _KeyEventsPlugin.eventCallback(parsedEvent["fullKey"], handler, this.manager.getZone());
  976. return this.manager.getZone().runOutsideAngular(() => {
  977. return getDOM().onAndCancel(element, parsedEvent["domEventName"], outsideHandler, options);
  978. });
  979. }
  980. /**
  981. * Parses the user provided full keyboard event definition and normalizes it for
  982. * later internal use. It ensures the string is all lowercase, converts special
  983. * characters to a standard spelling, and orders all the values consistently.
  984. *
  985. * @param eventName The name of the key event to listen for.
  986. * @returns an object with the full, normalized string, and the dom event name
  987. * or null in the case when the event doesn't match a keyboard event.
  988. */
  989. static parseEventName(eventName) {
  990. const parts = eventName.toLowerCase().split(".");
  991. const domEventName = parts.shift();
  992. if (parts.length === 0 || !(domEventName === "keydown" || domEventName === "keyup")) {
  993. return null;
  994. }
  995. const key = _KeyEventsPlugin._normalizeKey(parts.pop());
  996. let fullKey = "";
  997. let codeIX = parts.indexOf("code");
  998. if (codeIX > -1) {
  999. parts.splice(codeIX, 1);
  1000. fullKey = "code.";
  1001. }
  1002. MODIFIER_KEYS.forEach((modifierName) => {
  1003. const index = parts.indexOf(modifierName);
  1004. if (index > -1) {
  1005. parts.splice(index, 1);
  1006. fullKey += modifierName + ".";
  1007. }
  1008. });
  1009. fullKey += key;
  1010. if (parts.length != 0 || key.length === 0) {
  1011. return null;
  1012. }
  1013. const result = {};
  1014. result["domEventName"] = domEventName;
  1015. result["fullKey"] = fullKey;
  1016. return result;
  1017. }
  1018. /**
  1019. * Determines whether the actual keys pressed match the configured key code string.
  1020. * The `fullKeyCode` event is normalized in the `parseEventName` method when the
  1021. * event is attached to the DOM during the `addEventListener` call. This is unseen
  1022. * by the end user and is normalized for internal consistency and parsing.
  1023. *
  1024. * @param event The keyboard event.
  1025. * @param fullKeyCode The normalized user defined expected key event string
  1026. * @returns boolean.
  1027. */
  1028. static matchEventFullKeyCode(event, fullKeyCode) {
  1029. let keycode = _keyMap[event.key] || event.key;
  1030. let key = "";
  1031. if (fullKeyCode.indexOf("code.") > -1) {
  1032. keycode = event.code;
  1033. key = "code.";
  1034. }
  1035. if (keycode == null || !keycode) return false;
  1036. keycode = keycode.toLowerCase();
  1037. if (keycode === " ") {
  1038. keycode = "space";
  1039. } else if (keycode === ".") {
  1040. keycode = "dot";
  1041. }
  1042. MODIFIER_KEYS.forEach((modifierName) => {
  1043. if (modifierName !== keycode) {
  1044. const modifierGetter = MODIFIER_KEY_GETTERS[modifierName];
  1045. if (modifierGetter(event)) {
  1046. key += modifierName + ".";
  1047. }
  1048. }
  1049. });
  1050. key += keycode;
  1051. return key === fullKeyCode;
  1052. }
  1053. /**
  1054. * Configures a handler callback for a key event.
  1055. * @param fullKey The event name that combines all simultaneous keystrokes.
  1056. * @param handler The function that responds to the key event.
  1057. * @param zone The zone in which the event occurred.
  1058. * @returns A callback function.
  1059. */
  1060. static eventCallback(fullKey, handler, zone) {
  1061. return (event) => {
  1062. if (_KeyEventsPlugin.matchEventFullKeyCode(event, fullKey)) {
  1063. zone.runGuarded(() => handler(event));
  1064. }
  1065. };
  1066. }
  1067. /** @internal */
  1068. static _normalizeKey(keyName) {
  1069. return keyName === "esc" ? "escape" : keyName;
  1070. }
  1071. static ɵfac = function KeyEventsPlugin_Factory(__ngFactoryType__) {
  1072. return new (__ngFactoryType__ || _KeyEventsPlugin)(ɵɵinject(DOCUMENT));
  1073. };
  1074. static ɵprov = ɵɵdefineInjectable({
  1075. token: _KeyEventsPlugin,
  1076. factory: _KeyEventsPlugin.ɵfac
  1077. });
  1078. };
  1079. (() => {
  1080. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(KeyEventsPlugin, [{
  1081. type: Injectable
  1082. }], () => [{
  1083. type: void 0,
  1084. decorators: [{
  1085. type: Inject,
  1086. args: [DOCUMENT]
  1087. }]
  1088. }], null);
  1089. })();
  1090. function bootstrapApplication(rootComponent, options) {
  1091. return internalCreateApplication(__spreadValues({
  1092. rootComponent
  1093. }, createProvidersConfig(options)));
  1094. }
  1095. function createApplication(options) {
  1096. return internalCreateApplication(createProvidersConfig(options));
  1097. }
  1098. function createProvidersConfig(options) {
  1099. return {
  1100. appProviders: [...BROWSER_MODULE_PROVIDERS, ...options?.providers ?? []],
  1101. platformProviders: INTERNAL_BROWSER_PLATFORM_PROVIDERS
  1102. };
  1103. }
  1104. function provideProtractorTestingSupport() {
  1105. return [...TESTABILITY_PROVIDERS];
  1106. }
  1107. function initDomAdapter() {
  1108. BrowserDomAdapter.makeCurrent();
  1109. }
  1110. function errorHandler() {
  1111. return new ErrorHandler();
  1112. }
  1113. function _document() {
  1114. setDocument(document);
  1115. return document;
  1116. }
  1117. var INTERNAL_BROWSER_PLATFORM_PROVIDERS = [{
  1118. provide: PLATFORM_ID,
  1119. useValue: PLATFORM_BROWSER_ID
  1120. }, {
  1121. provide: PLATFORM_INITIALIZER,
  1122. useValue: initDomAdapter,
  1123. multi: true
  1124. }, {
  1125. provide: DOCUMENT,
  1126. useFactory: _document
  1127. }];
  1128. var platformBrowser = createPlatformFactory(platformCore, "browser", INTERNAL_BROWSER_PLATFORM_PROVIDERS);
  1129. var BROWSER_MODULE_PROVIDERS_MARKER = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "BrowserModule Providers Marker" : "");
  1130. var TESTABILITY_PROVIDERS = [{
  1131. provide: TESTABILITY_GETTER,
  1132. useClass: BrowserGetTestability
  1133. }, {
  1134. provide: TESTABILITY,
  1135. useClass: Testability,
  1136. deps: [NgZone, TestabilityRegistry, TESTABILITY_GETTER]
  1137. }, {
  1138. provide: Testability,
  1139. // Also provide as `Testability` for backwards-compatibility.
  1140. useClass: Testability,
  1141. deps: [NgZone, TestabilityRegistry, TESTABILITY_GETTER]
  1142. }];
  1143. var BROWSER_MODULE_PROVIDERS = [{
  1144. provide: INJECTOR_SCOPE,
  1145. useValue: "root"
  1146. }, {
  1147. provide: ErrorHandler,
  1148. useFactory: errorHandler
  1149. }, {
  1150. provide: EVENT_MANAGER_PLUGINS,
  1151. useClass: DomEventsPlugin,
  1152. multi: true,
  1153. deps: [DOCUMENT]
  1154. }, {
  1155. provide: EVENT_MANAGER_PLUGINS,
  1156. useClass: KeyEventsPlugin,
  1157. multi: true,
  1158. deps: [DOCUMENT]
  1159. }, DomRendererFactory2, SharedStylesHost, EventManager, {
  1160. provide: RendererFactory2,
  1161. useExisting: DomRendererFactory2
  1162. }, {
  1163. provide: XhrFactory,
  1164. useClass: BrowserXhr
  1165. }, typeof ngDevMode === "undefined" || ngDevMode ? {
  1166. provide: BROWSER_MODULE_PROVIDERS_MARKER,
  1167. useValue: true
  1168. } : []];
  1169. var BrowserModule = class _BrowserModule {
  1170. constructor() {
  1171. if (typeof ngDevMode === "undefined" || ngDevMode) {
  1172. const providersAlreadyPresent = inject(BROWSER_MODULE_PROVIDERS_MARKER, {
  1173. optional: true,
  1174. skipSelf: true
  1175. });
  1176. if (providersAlreadyPresent) {
  1177. throw new RuntimeError(5100, `Providers from the \`BrowserModule\` have already been loaded. If you need access to common directives such as NgIf and NgFor, import the \`CommonModule\` instead.`);
  1178. }
  1179. }
  1180. }
  1181. static ɵfac = function BrowserModule_Factory(__ngFactoryType__) {
  1182. return new (__ngFactoryType__ || _BrowserModule)();
  1183. };
  1184. static ɵmod = ɵɵdefineNgModule({
  1185. type: _BrowserModule,
  1186. exports: [CommonModule, ApplicationModule]
  1187. });
  1188. static ɵinj = ɵɵdefineInjector({
  1189. providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS],
  1190. imports: [CommonModule, ApplicationModule]
  1191. });
  1192. };
  1193. (() => {
  1194. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(BrowserModule, [{
  1195. type: NgModule,
  1196. args: [{
  1197. providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS],
  1198. exports: [CommonModule, ApplicationModule]
  1199. }]
  1200. }], () => [], null);
  1201. })();
  1202. export {
  1203. EVENT_MANAGER_PLUGINS,
  1204. EventManager,
  1205. EventManagerPlugin,
  1206. SharedStylesHost,
  1207. REMOVE_STYLES_ON_COMPONENT_DESTROY,
  1208. DomRendererFactory2,
  1209. BrowserDomAdapter,
  1210. BrowserGetTestability,
  1211. DomEventsPlugin,
  1212. KeyEventsPlugin,
  1213. bootstrapApplication,
  1214. createApplication,
  1215. provideProtractorTestingSupport,
  1216. platformBrowser,
  1217. BrowserModule
  1218. };
  1219. /*! Bundled license information:
  1220. @angular/platform-browser/fesm2022/dom_renderer.mjs:
  1221. @angular/platform-browser/fesm2022/browser.mjs:
  1222. (**
  1223. * @license Angular v20.0.5
  1224. * (c) 2010-2025 Google LLC. https://angular.io/
  1225. * License: MIT
  1226. *)
  1227. */
  1228. //# sourceMappingURL=chunk-NFFN32GK.js.map