You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1898 lines
57KB

  1. import {
  2. withHttpTransferCache
  3. } from "./chunk-65KGLH7J.js";
  4. import {
  5. CommonModule,
  6. DOCUMENT,
  7. DomAdapter,
  8. PLATFORM_BROWSER_ID,
  9. XhrFactory,
  10. getDOM,
  11. isPlatformServer,
  12. parseCookieValue,
  13. setRootDomAdapter
  14. } from "./chunk-GBYLXCNQ.js";
  15. import {
  16. APP_ID,
  17. ApplicationModule,
  18. ApplicationRef,
  19. CSP_NONCE,
  20. Console,
  21. ENVIRONMENT_INITIALIZER,
  22. ErrorHandler,
  23. INJECTOR_SCOPE,
  24. Inject,
  25. Injectable,
  26. InjectionToken,
  27. NgModule,
  28. NgZone,
  29. Optional,
  30. PLATFORM_ID,
  31. PLATFORM_INITIALIZER,
  32. RendererFactory2,
  33. RendererStyleFlags2,
  34. RuntimeError,
  35. SecurityContext,
  36. SkipSelf,
  37. TESTABILITY,
  38. TESTABILITY_GETTER,
  39. Testability,
  40. TestabilityRegistry,
  41. TransferState,
  42. Version,
  43. ViewEncapsulation$1,
  44. XSS_SECURITY_URL,
  45. _global,
  46. _sanitizeHtml,
  47. _sanitizeUrl,
  48. allowSanitizationBypassAndThrow,
  49. bypassSanitizationTrustHtml,
  50. bypassSanitizationTrustResourceUrl,
  51. bypassSanitizationTrustScript,
  52. bypassSanitizationTrustStyle,
  53. bypassSanitizationTrustUrl,
  54. createPlatformFactory,
  55. formatRuntimeError,
  56. forwardRef,
  57. inject,
  58. internalCreateApplication,
  59. makeEnvironmentProviders,
  60. makeStateKey,
  61. platformCore,
  62. setClassMetadata,
  63. setDocument,
  64. unwrapSafeValue,
  65. withDomHydration,
  66. ɵɵdefineInjectable,
  67. ɵɵdefineInjector,
  68. ɵɵdefineNgModule,
  69. ɵɵinject
  70. } from "./chunk-NYIFMCVF.js";
  71. import {
  72. __spreadProps,
  73. __spreadValues
  74. } from "./chunk-SXIXOCJ4.js";
  75. // node_modules/@angular/platform-browser/fesm2022/platform-browser.mjs
  76. var GenericBrowserDomAdapter = class extends DomAdapter {
  77. constructor() {
  78. super(...arguments);
  79. this.supportsDOMEvents = true;
  80. }
  81. };
  82. var BrowserDomAdapter = class _BrowserDomAdapter extends GenericBrowserDomAdapter {
  83. static makeCurrent() {
  84. setRootDomAdapter(new _BrowserDomAdapter());
  85. }
  86. onAndCancel(el, evt, listener) {
  87. el.addEventListener(evt, listener);
  88. return () => {
  89. el.removeEventListener(evt, listener);
  90. };
  91. }
  92. dispatchEvent(el, evt) {
  93. el.dispatchEvent(evt);
  94. }
  95. remove(node) {
  96. if (node.parentNode) {
  97. node.parentNode.removeChild(node);
  98. }
  99. }
  100. createElement(tagName, doc) {
  101. doc = doc || this.getDefaultDocument();
  102. return doc.createElement(tagName);
  103. }
  104. createHtmlDocument() {
  105. return document.implementation.createHTMLDocument("fakeTitle");
  106. }
  107. getDefaultDocument() {
  108. return document;
  109. }
  110. isElementNode(node) {
  111. return node.nodeType === Node.ELEMENT_NODE;
  112. }
  113. isShadowRoot(node) {
  114. return node instanceof DocumentFragment;
  115. }
  116. /** @deprecated No longer being used in Ivy code. To be removed in version 14. */
  117. getGlobalEventTarget(doc, target) {
  118. if (target === "window") {
  119. return window;
  120. }
  121. if (target === "document") {
  122. return doc;
  123. }
  124. if (target === "body") {
  125. return doc.body;
  126. }
  127. return null;
  128. }
  129. getBaseHref(doc) {
  130. const href = getBaseElementHref();
  131. return href == null ? null : relativePath(href);
  132. }
  133. resetBaseElement() {
  134. baseElement = null;
  135. }
  136. getUserAgent() {
  137. return window.navigator.userAgent;
  138. }
  139. getCookie(name) {
  140. return parseCookieValue(document.cookie, name);
  141. }
  142. };
  143. var baseElement = null;
  144. function getBaseElementHref() {
  145. baseElement = baseElement || document.querySelector("base");
  146. return baseElement ? baseElement.getAttribute("href") : null;
  147. }
  148. function relativePath(url) {
  149. return new URL(url, document.baseURI).pathname;
  150. }
  151. var BrowserGetTestability = class {
  152. addToWindow(registry) {
  153. _global["getAngularTestability"] = (elem, findInAncestors = true) => {
  154. const testability = registry.findTestabilityInTree(elem, findInAncestors);
  155. if (testability == null) {
  156. throw new RuntimeError(5103, (typeof ngDevMode === "undefined" || ngDevMode) && "Could not find testability for element.");
  157. }
  158. return testability;
  159. };
  160. _global["getAllAngularTestabilities"] = () => registry.getAllTestabilities();
  161. _global["getAllAngularRootElements"] = () => registry.getAllRootElements();
  162. const whenAllStable = (callback) => {
  163. const testabilities = _global["getAllAngularTestabilities"]();
  164. let count = testabilities.length;
  165. const decrement = function() {
  166. count--;
  167. if (count == 0) {
  168. callback();
  169. }
  170. };
  171. testabilities.forEach((testability) => {
  172. testability.whenStable(decrement);
  173. });
  174. };
  175. if (!_global["frameworkStabilizers"]) {
  176. _global["frameworkStabilizers"] = [];
  177. }
  178. _global["frameworkStabilizers"].push(whenAllStable);
  179. }
  180. findTestabilityInTree(registry, elem, findInAncestors) {
  181. if (elem == null) {
  182. return null;
  183. }
  184. const t = registry.getTestability(elem);
  185. if (t != null) {
  186. return t;
  187. } else if (!findInAncestors) {
  188. return null;
  189. }
  190. if (getDOM().isShadowRoot(elem)) {
  191. return this.findTestabilityInTree(registry, elem.host, true);
  192. }
  193. return this.findTestabilityInTree(registry, elem.parentElement, true);
  194. }
  195. };
  196. var _BrowserXhr = class _BrowserXhr {
  197. build() {
  198. return new XMLHttpRequest();
  199. }
  200. };
  201. _BrowserXhr.ɵfac = function BrowserXhr_Factory(t) {
  202. return new (t || _BrowserXhr)();
  203. };
  204. _BrowserXhr.ɵprov = ɵɵdefineInjectable({
  205. token: _BrowserXhr,
  206. factory: _BrowserXhr.ɵfac
  207. });
  208. var BrowserXhr = _BrowserXhr;
  209. (() => {
  210. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(BrowserXhr, [{
  211. type: Injectable
  212. }], null, null);
  213. })();
  214. var EVENT_MANAGER_PLUGINS = new InjectionToken(ngDevMode ? "EventManagerPlugins" : "");
  215. var _EventManager = class _EventManager {
  216. /**
  217. * Initializes an instance of the event-manager service.
  218. */
  219. constructor(plugins, _zone) {
  220. this._zone = _zone;
  221. this._eventNameToPlugin = /* @__PURE__ */ new Map();
  222. plugins.forEach((plugin) => {
  223. plugin.manager = this;
  224. });
  225. this._plugins = plugins.slice().reverse();
  226. }
  227. /**
  228. * Registers a handler for a specific element and event.
  229. *
  230. * @param element The HTML element to receive event notifications.
  231. * @param eventName The name of the event to listen for.
  232. * @param handler A function to call when the notification occurs. Receives the
  233. * event object as an argument.
  234. * @returns A callback function that can be used to remove the handler.
  235. */
  236. addEventListener(element, eventName, handler) {
  237. const plugin = this._findPluginFor(eventName);
  238. return plugin.addEventListener(element, eventName, handler);
  239. }
  240. /**
  241. * Retrieves the compilation zone in which event listeners are registered.
  242. */
  243. getZone() {
  244. return this._zone;
  245. }
  246. /** @internal */
  247. _findPluginFor(eventName) {
  248. let plugin = this._eventNameToPlugin.get(eventName);
  249. if (plugin) {
  250. return plugin;
  251. }
  252. const plugins = this._plugins;
  253. plugin = plugins.find((plugin2) => plugin2.supports(eventName));
  254. if (!plugin) {
  255. throw new RuntimeError(5101, (typeof ngDevMode === "undefined" || ngDevMode) && `No event manager plugin found for event ${eventName}`);
  256. }
  257. this._eventNameToPlugin.set(eventName, plugin);
  258. return plugin;
  259. }
  260. };
  261. _EventManager.ɵfac = function EventManager_Factory(t) {
  262. return new (t || _EventManager)(ɵɵinject(EVENT_MANAGER_PLUGINS), ɵɵinject(NgZone));
  263. };
  264. _EventManager.ɵprov = ɵɵdefineInjectable({
  265. token: _EventManager,
  266. factory: _EventManager.ɵfac
  267. });
  268. var EventManager = _EventManager;
  269. (() => {
  270. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(EventManager, [{
  271. type: Injectable
  272. }], () => [{
  273. type: void 0,
  274. decorators: [{
  275. type: Inject,
  276. args: [EVENT_MANAGER_PLUGINS]
  277. }]
  278. }, {
  279. type: NgZone
  280. }], null);
  281. })();
  282. var EventManagerPlugin = class {
  283. // TODO: remove (has some usage in G3)
  284. constructor(_doc) {
  285. this._doc = _doc;
  286. }
  287. };
  288. var APP_ID_ATTRIBUTE_NAME = "ng-app-id";
  289. var _SharedStylesHost = class _SharedStylesHost {
  290. constructor(doc, appId, nonce, platformId = {}) {
  291. this.doc = doc;
  292. this.appId = appId;
  293. this.nonce = nonce;
  294. this.platformId = platformId;
  295. this.styleRef = /* @__PURE__ */ new Map();
  296. this.hostNodes = /* @__PURE__ */ new Set();
  297. this.styleNodesInDOM = this.collectServerRenderedStyles();
  298. this.platformIsServer = isPlatformServer(platformId);
  299. this.resetHostNodes();
  300. }
  301. addStyles(styles) {
  302. for (const style of styles) {
  303. const usageCount = this.changeUsageCount(style, 1);
  304. if (usageCount === 1) {
  305. this.onStyleAdded(style);
  306. }
  307. }
  308. }
  309. removeStyles(styles) {
  310. for (const style of styles) {
  311. const usageCount = this.changeUsageCount(style, -1);
  312. if (usageCount <= 0) {
  313. this.onStyleRemoved(style);
  314. }
  315. }
  316. }
  317. ngOnDestroy() {
  318. const styleNodesInDOM = this.styleNodesInDOM;
  319. if (styleNodesInDOM) {
  320. styleNodesInDOM.forEach((node) => node.remove());
  321. styleNodesInDOM.clear();
  322. }
  323. for (const style of this.getAllStyles()) {
  324. this.onStyleRemoved(style);
  325. }
  326. this.resetHostNodes();
  327. }
  328. addHost(hostNode) {
  329. this.hostNodes.add(hostNode);
  330. for (const style of this.getAllStyles()) {
  331. this.addStyleToHost(hostNode, style);
  332. }
  333. }
  334. removeHost(hostNode) {
  335. this.hostNodes.delete(hostNode);
  336. }
  337. getAllStyles() {
  338. return this.styleRef.keys();
  339. }
  340. onStyleAdded(style) {
  341. for (const host of this.hostNodes) {
  342. this.addStyleToHost(host, style);
  343. }
  344. }
  345. onStyleRemoved(style) {
  346. const styleRef = this.styleRef;
  347. styleRef.get(style)?.elements?.forEach((node) => node.remove());
  348. styleRef.delete(style);
  349. }
  350. collectServerRenderedStyles() {
  351. const styles = this.doc.head?.querySelectorAll(`style[${APP_ID_ATTRIBUTE_NAME}="${this.appId}"]`);
  352. if (styles?.length) {
  353. const styleMap = /* @__PURE__ */ new Map();
  354. styles.forEach((style) => {
  355. if (style.textContent != null) {
  356. styleMap.set(style.textContent, style);
  357. }
  358. });
  359. return styleMap;
  360. }
  361. return null;
  362. }
  363. changeUsageCount(style, delta) {
  364. const map = this.styleRef;
  365. if (map.has(style)) {
  366. const styleRefValue = map.get(style);
  367. styleRefValue.usage += delta;
  368. return styleRefValue.usage;
  369. }
  370. map.set(style, {
  371. usage: delta,
  372. elements: []
  373. });
  374. return delta;
  375. }
  376. getStyleElement(host, style) {
  377. const styleNodesInDOM = this.styleNodesInDOM;
  378. const styleEl = styleNodesInDOM?.get(style);
  379. if (styleEl?.parentNode === host) {
  380. styleNodesInDOM.delete(style);
  381. styleEl.removeAttribute(APP_ID_ATTRIBUTE_NAME);
  382. if (typeof ngDevMode === "undefined" || ngDevMode) {
  383. styleEl.setAttribute("ng-style-reused", "");
  384. }
  385. return styleEl;
  386. } else {
  387. const styleEl2 = this.doc.createElement("style");
  388. if (this.nonce) {
  389. styleEl2.setAttribute("nonce", this.nonce);
  390. }
  391. styleEl2.textContent = style;
  392. if (this.platformIsServer) {
  393. styleEl2.setAttribute(APP_ID_ATTRIBUTE_NAME, this.appId);
  394. }
  395. host.appendChild(styleEl2);
  396. return styleEl2;
  397. }
  398. }
  399. addStyleToHost(host, style) {
  400. const styleEl = this.getStyleElement(host, style);
  401. const styleRef = this.styleRef;
  402. const styleElRef = styleRef.get(style)?.elements;
  403. if (styleElRef) {
  404. styleElRef.push(styleEl);
  405. } else {
  406. styleRef.set(style, {
  407. elements: [styleEl],
  408. usage: 1
  409. });
  410. }
  411. }
  412. resetHostNodes() {
  413. const hostNodes = this.hostNodes;
  414. hostNodes.clear();
  415. hostNodes.add(this.doc.head);
  416. }
  417. };
  418. _SharedStylesHost.ɵfac = function SharedStylesHost_Factory(t) {
  419. return new (t || _SharedStylesHost)(ɵɵinject(DOCUMENT), ɵɵinject(APP_ID), ɵɵinject(CSP_NONCE, 8), ɵɵinject(PLATFORM_ID));
  420. };
  421. _SharedStylesHost.ɵprov = ɵɵdefineInjectable({
  422. token: _SharedStylesHost,
  423. factory: _SharedStylesHost.ɵfac
  424. });
  425. var SharedStylesHost = _SharedStylesHost;
  426. (() => {
  427. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(SharedStylesHost, [{
  428. type: Injectable
  429. }], () => [{
  430. type: Document,
  431. decorators: [{
  432. type: Inject,
  433. args: [DOCUMENT]
  434. }]
  435. }, {
  436. type: void 0,
  437. decorators: [{
  438. type: Inject,
  439. args: [APP_ID]
  440. }]
  441. }, {
  442. type: void 0,
  443. decorators: [{
  444. type: Inject,
  445. args: [CSP_NONCE]
  446. }, {
  447. type: Optional
  448. }]
  449. }, {
  450. type: void 0,
  451. decorators: [{
  452. type: Inject,
  453. args: [PLATFORM_ID]
  454. }]
  455. }], null);
  456. })();
  457. var NAMESPACE_URIS = {
  458. "svg": "http://www.w3.org/2000/svg",
  459. "xhtml": "http://www.w3.org/1999/xhtml",
  460. "xlink": "http://www.w3.org/1999/xlink",
  461. "xml": "http://www.w3.org/XML/1998/namespace",
  462. "xmlns": "http://www.w3.org/2000/xmlns/",
  463. "math": "http://www.w3.org/1998/MathML/"
  464. };
  465. var COMPONENT_REGEX = /%COMP%/g;
  466. var COMPONENT_VARIABLE = "%COMP%";
  467. var HOST_ATTR = `_nghost-${COMPONENT_VARIABLE}`;
  468. var CONTENT_ATTR = `_ngcontent-${COMPONENT_VARIABLE}`;
  469. var REMOVE_STYLES_ON_COMPONENT_DESTROY_DEFAULT = true;
  470. var REMOVE_STYLES_ON_COMPONENT_DESTROY = new InjectionToken(ngDevMode ? "RemoveStylesOnCompDestroy" : "", {
  471. providedIn: "root",
  472. factory: () => REMOVE_STYLES_ON_COMPONENT_DESTROY_DEFAULT
  473. });
  474. function shimContentAttribute(componentShortId) {
  475. return CONTENT_ATTR.replace(COMPONENT_REGEX, componentShortId);
  476. }
  477. function shimHostAttribute(componentShortId) {
  478. return HOST_ATTR.replace(COMPONENT_REGEX, componentShortId);
  479. }
  480. function shimStylesContent(compId, styles) {
  481. return styles.map((s) => s.replace(COMPONENT_REGEX, compId));
  482. }
  483. var _DomRendererFactory2 = class _DomRendererFactory2 {
  484. constructor(eventManager, sharedStylesHost, appId, removeStylesOnCompDestroy, doc, platformId, ngZone, nonce = null) {
  485. this.eventManager = eventManager;
  486. this.sharedStylesHost = sharedStylesHost;
  487. this.appId = appId;
  488. this.removeStylesOnCompDestroy = removeStylesOnCompDestroy;
  489. this.doc = doc;
  490. this.platformId = platformId;
  491. this.ngZone = ngZone;
  492. this.nonce = nonce;
  493. this.rendererByCompId = /* @__PURE__ */ new Map();
  494. this.platformIsServer = isPlatformServer(platformId);
  495. this.defaultRenderer = new DefaultDomRenderer2(eventManager, doc, ngZone, this.platformIsServer);
  496. }
  497. createRenderer(element, type) {
  498. if (!element || !type) {
  499. return this.defaultRenderer;
  500. }
  501. if (this.platformIsServer && type.encapsulation === ViewEncapsulation$1.ShadowDom) {
  502. type = __spreadProps(__spreadValues({}, type), {
  503. encapsulation: ViewEncapsulation$1.Emulated
  504. });
  505. }
  506. const renderer = this.getOrCreateRenderer(element, type);
  507. if (renderer instanceof EmulatedEncapsulationDomRenderer2) {
  508. renderer.applyToHost(element);
  509. } else if (renderer instanceof NoneEncapsulationDomRenderer) {
  510. renderer.applyStyles();
  511. }
  512. return renderer;
  513. }
  514. getOrCreateRenderer(element, type) {
  515. const rendererByCompId = this.rendererByCompId;
  516. let renderer = rendererByCompId.get(type.id);
  517. if (!renderer) {
  518. const doc = this.doc;
  519. const ngZone = this.ngZone;
  520. const eventManager = this.eventManager;
  521. const sharedStylesHost = this.sharedStylesHost;
  522. const removeStylesOnCompDestroy = this.removeStylesOnCompDestroy;
  523. const platformIsServer = this.platformIsServer;
  524. switch (type.encapsulation) {
  525. case ViewEncapsulation$1.Emulated:
  526. renderer = new EmulatedEncapsulationDomRenderer2(eventManager, sharedStylesHost, type, this.appId, removeStylesOnCompDestroy, doc, ngZone, platformIsServer);
  527. break;
  528. case ViewEncapsulation$1.ShadowDom:
  529. return new ShadowDomRenderer(eventManager, sharedStylesHost, element, type, doc, ngZone, this.nonce, platformIsServer);
  530. default:
  531. renderer = new NoneEncapsulationDomRenderer(eventManager, sharedStylesHost, type, removeStylesOnCompDestroy, doc, ngZone, platformIsServer);
  532. break;
  533. }
  534. rendererByCompId.set(type.id, renderer);
  535. }
  536. return renderer;
  537. }
  538. ngOnDestroy() {
  539. this.rendererByCompId.clear();
  540. }
  541. };
  542. _DomRendererFactory2.ɵfac = function DomRendererFactory2_Factory(t) {
  543. return new (t || _DomRendererFactory2)(ɵɵinject(EventManager), ɵɵinject(SharedStylesHost), ɵɵinject(APP_ID), ɵɵinject(REMOVE_STYLES_ON_COMPONENT_DESTROY), ɵɵinject(DOCUMENT), ɵɵinject(PLATFORM_ID), ɵɵinject(NgZone), ɵɵinject(CSP_NONCE));
  544. };
  545. _DomRendererFactory2.ɵprov = ɵɵdefineInjectable({
  546. token: _DomRendererFactory2,
  547. factory: _DomRendererFactory2.ɵfac
  548. });
  549. var DomRendererFactory2 = _DomRendererFactory2;
  550. (() => {
  551. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DomRendererFactory2, [{
  552. type: Injectable
  553. }], () => [{
  554. type: EventManager
  555. }, {
  556. type: SharedStylesHost
  557. }, {
  558. type: void 0,
  559. decorators: [{
  560. type: Inject,
  561. args: [APP_ID]
  562. }]
  563. }, {
  564. type: void 0,
  565. decorators: [{
  566. type: Inject,
  567. args: [REMOVE_STYLES_ON_COMPONENT_DESTROY]
  568. }]
  569. }, {
  570. type: Document,
  571. decorators: [{
  572. type: Inject,
  573. args: [DOCUMENT]
  574. }]
  575. }, {
  576. type: Object,
  577. decorators: [{
  578. type: Inject,
  579. args: [PLATFORM_ID]
  580. }]
  581. }, {
  582. type: NgZone
  583. }, {
  584. type: void 0,
  585. decorators: [{
  586. type: Inject,
  587. args: [CSP_NONCE]
  588. }]
  589. }], null);
  590. })();
  591. var DefaultDomRenderer2 = class {
  592. constructor(eventManager, doc, ngZone, platformIsServer) {
  593. this.eventManager = eventManager;
  594. this.doc = doc;
  595. this.ngZone = ngZone;
  596. this.platformIsServer = platformIsServer;
  597. this.data = /* @__PURE__ */ Object.create(null);
  598. this.throwOnSyntheticProps = true;
  599. this.destroyNode = null;
  600. }
  601. destroy() {
  602. }
  603. createElement(name, namespace) {
  604. if (namespace) {
  605. return this.doc.createElementNS(NAMESPACE_URIS[namespace] || namespace, name);
  606. }
  607. return this.doc.createElement(name);
  608. }
  609. createComment(value) {
  610. return this.doc.createComment(value);
  611. }
  612. createText(value) {
  613. return this.doc.createTextNode(value);
  614. }
  615. appendChild(parent, newChild) {
  616. const targetParent = isTemplateNode(parent) ? parent.content : parent;
  617. targetParent.appendChild(newChild);
  618. }
  619. insertBefore(parent, newChild, refChild) {
  620. if (parent) {
  621. const targetParent = isTemplateNode(parent) ? parent.content : parent;
  622. targetParent.insertBefore(newChild, refChild);
  623. }
  624. }
  625. removeChild(parent, oldChild) {
  626. if (parent) {
  627. parent.removeChild(oldChild);
  628. }
  629. }
  630. selectRootElement(selectorOrNode, preserveContent) {
  631. let el = typeof selectorOrNode === "string" ? this.doc.querySelector(selectorOrNode) : selectorOrNode;
  632. if (!el) {
  633. throw new RuntimeError(-5104, (typeof ngDevMode === "undefined" || ngDevMode) && `The selector "${selectorOrNode}" did not match any elements`);
  634. }
  635. if (!preserveContent) {
  636. el.textContent = "";
  637. }
  638. return el;
  639. }
  640. parentNode(node) {
  641. return node.parentNode;
  642. }
  643. nextSibling(node) {
  644. return node.nextSibling;
  645. }
  646. setAttribute(el, name, value, namespace) {
  647. if (namespace) {
  648. name = namespace + ":" + name;
  649. const namespaceUri = NAMESPACE_URIS[namespace];
  650. if (namespaceUri) {
  651. el.setAttributeNS(namespaceUri, name, value);
  652. } else {
  653. el.setAttribute(name, value);
  654. }
  655. } else {
  656. el.setAttribute(name, value);
  657. }
  658. }
  659. removeAttribute(el, name, namespace) {
  660. if (namespace) {
  661. const namespaceUri = NAMESPACE_URIS[namespace];
  662. if (namespaceUri) {
  663. el.removeAttributeNS(namespaceUri, name);
  664. } else {
  665. el.removeAttribute(`${namespace}:${name}`);
  666. }
  667. } else {
  668. el.removeAttribute(name);
  669. }
  670. }
  671. addClass(el, name) {
  672. el.classList.add(name);
  673. }
  674. removeClass(el, name) {
  675. el.classList.remove(name);
  676. }
  677. setStyle(el, style, value, flags) {
  678. if (flags & (RendererStyleFlags2.DashCase | RendererStyleFlags2.Important)) {
  679. el.style.setProperty(style, value, flags & RendererStyleFlags2.Important ? "important" : "");
  680. } else {
  681. el.style[style] = value;
  682. }
  683. }
  684. removeStyle(el, style, flags) {
  685. if (flags & RendererStyleFlags2.DashCase) {
  686. el.style.removeProperty(style);
  687. } else {
  688. el.style[style] = "";
  689. }
  690. }
  691. setProperty(el, name, value) {
  692. if (el == null) {
  693. return;
  694. }
  695. (typeof ngDevMode === "undefined" || ngDevMode) && this.throwOnSyntheticProps && checkNoSyntheticProp(name, "property");
  696. el[name] = value;
  697. }
  698. setValue(node, value) {
  699. node.nodeValue = value;
  700. }
  701. listen(target, event, callback) {
  702. (typeof ngDevMode === "undefined" || ngDevMode) && this.throwOnSyntheticProps && checkNoSyntheticProp(event, "listener");
  703. if (typeof target === "string") {
  704. target = getDOM().getGlobalEventTarget(this.doc, target);
  705. if (!target) {
  706. throw new Error(`Unsupported event target ${target} for event ${event}`);
  707. }
  708. }
  709. return this.eventManager.addEventListener(target, event, this.decoratePreventDefault(callback));
  710. }
  711. decoratePreventDefault(eventHandler) {
  712. return (event) => {
  713. if (event === "__ngUnwrap__") {
  714. return eventHandler;
  715. }
  716. const allowDefaultBehavior = this.platformIsServer ? this.ngZone.runGuarded(() => eventHandler(event)) : eventHandler(event);
  717. if (allowDefaultBehavior === false) {
  718. event.preventDefault();
  719. }
  720. return void 0;
  721. };
  722. }
  723. };
  724. var AT_CHARCODE = (() => "@".charCodeAt(0))();
  725. function checkNoSyntheticProp(name, nameKind) {
  726. if (name.charCodeAt(0) === AT_CHARCODE) {
  727. throw new RuntimeError(5105, `Unexpected synthetic ${nameKind} ${name} found. Please make sure that:
  728. - Either \`BrowserAnimationsModule\` or \`NoopAnimationsModule\` are imported in your application.
  729. - There is corresponding configuration for the animation named \`${name}\` defined in the \`animations\` field of the \`@Component\` decorator (see https://angular.io/api/core/Component#animations).`);
  730. }
  731. }
  732. function isTemplateNode(node) {
  733. return node.tagName === "TEMPLATE" && node.content !== void 0;
  734. }
  735. var ShadowDomRenderer = class extends DefaultDomRenderer2 {
  736. constructor(eventManager, sharedStylesHost, hostEl, component, doc, ngZone, nonce, platformIsServer) {
  737. super(eventManager, doc, ngZone, platformIsServer);
  738. this.sharedStylesHost = sharedStylesHost;
  739. this.hostEl = hostEl;
  740. this.shadowRoot = hostEl.attachShadow({
  741. mode: "open"
  742. });
  743. this.sharedStylesHost.addHost(this.shadowRoot);
  744. const styles = shimStylesContent(component.id, component.styles);
  745. for (const style of styles) {
  746. const styleEl = document.createElement("style");
  747. if (nonce) {
  748. styleEl.setAttribute("nonce", nonce);
  749. }
  750. styleEl.textContent = style;
  751. this.shadowRoot.appendChild(styleEl);
  752. }
  753. }
  754. nodeOrShadowRoot(node) {
  755. return node === this.hostEl ? this.shadowRoot : node;
  756. }
  757. appendChild(parent, newChild) {
  758. return super.appendChild(this.nodeOrShadowRoot(parent), newChild);
  759. }
  760. insertBefore(parent, newChild, refChild) {
  761. return super.insertBefore(this.nodeOrShadowRoot(parent), newChild, refChild);
  762. }
  763. removeChild(parent, oldChild) {
  764. return super.removeChild(this.nodeOrShadowRoot(parent), oldChild);
  765. }
  766. parentNode(node) {
  767. return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(node)));
  768. }
  769. destroy() {
  770. this.sharedStylesHost.removeHost(this.shadowRoot);
  771. }
  772. };
  773. var NoneEncapsulationDomRenderer = class extends DefaultDomRenderer2 {
  774. constructor(eventManager, sharedStylesHost, component, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, compId) {
  775. super(eventManager, doc, ngZone, platformIsServer);
  776. this.sharedStylesHost = sharedStylesHost;
  777. this.removeStylesOnCompDestroy = removeStylesOnCompDestroy;
  778. this.styles = compId ? shimStylesContent(compId, component.styles) : component.styles;
  779. }
  780. applyStyles() {
  781. this.sharedStylesHost.addStyles(this.styles);
  782. }
  783. destroy() {
  784. if (!this.removeStylesOnCompDestroy) {
  785. return;
  786. }
  787. this.sharedStylesHost.removeStyles(this.styles);
  788. }
  789. };
  790. var EmulatedEncapsulationDomRenderer2 = class extends NoneEncapsulationDomRenderer {
  791. constructor(eventManager, sharedStylesHost, component, appId, removeStylesOnCompDestroy, doc, ngZone, platformIsServer) {
  792. const compId = appId + "-" + component.id;
  793. super(eventManager, sharedStylesHost, component, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, compId);
  794. this.contentAttr = shimContentAttribute(compId);
  795. this.hostAttr = shimHostAttribute(compId);
  796. }
  797. applyToHost(element) {
  798. this.applyStyles();
  799. this.setAttribute(element, this.hostAttr, "");
  800. }
  801. createElement(parent, name) {
  802. const el = super.createElement(parent, name);
  803. super.setAttribute(el, this.contentAttr, "");
  804. return el;
  805. }
  806. };
  807. var _DomEventsPlugin = class _DomEventsPlugin extends EventManagerPlugin {
  808. constructor(doc) {
  809. super(doc);
  810. }
  811. // This plugin should come last in the list of plugins, because it accepts all
  812. // events.
  813. supports(eventName) {
  814. return true;
  815. }
  816. addEventListener(element, eventName, handler) {
  817. element.addEventListener(eventName, handler, false);
  818. return () => this.removeEventListener(element, eventName, handler);
  819. }
  820. removeEventListener(target, eventName, callback) {
  821. return target.removeEventListener(eventName, callback);
  822. }
  823. };
  824. _DomEventsPlugin.ɵfac = function DomEventsPlugin_Factory(t) {
  825. return new (t || _DomEventsPlugin)(ɵɵinject(DOCUMENT));
  826. };
  827. _DomEventsPlugin.ɵprov = ɵɵdefineInjectable({
  828. token: _DomEventsPlugin,
  829. factory: _DomEventsPlugin.ɵfac
  830. });
  831. var DomEventsPlugin = _DomEventsPlugin;
  832. (() => {
  833. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DomEventsPlugin, [{
  834. type: Injectable
  835. }], () => [{
  836. type: void 0,
  837. decorators: [{
  838. type: Inject,
  839. args: [DOCUMENT]
  840. }]
  841. }], null);
  842. })();
  843. var MODIFIER_KEYS = ["alt", "control", "meta", "shift"];
  844. var _keyMap = {
  845. "\b": "Backspace",
  846. " ": "Tab",
  847. "": "Delete",
  848. "\x1B": "Escape",
  849. "Del": "Delete",
  850. "Esc": "Escape",
  851. "Left": "ArrowLeft",
  852. "Right": "ArrowRight",
  853. "Up": "ArrowUp",
  854. "Down": "ArrowDown",
  855. "Menu": "ContextMenu",
  856. "Scroll": "ScrollLock",
  857. "Win": "OS"
  858. };
  859. var MODIFIER_KEY_GETTERS = {
  860. "alt": (event) => event.altKey,
  861. "control": (event) => event.ctrlKey,
  862. "meta": (event) => event.metaKey,
  863. "shift": (event) => event.shiftKey
  864. };
  865. var _KeyEventsPlugin = class _KeyEventsPlugin extends EventManagerPlugin {
  866. /**
  867. * Initializes an instance of the browser plug-in.
  868. * @param doc The document in which key events will be detected.
  869. */
  870. constructor(doc) {
  871. super(doc);
  872. }
  873. /**
  874. * Reports whether a named key event is supported.
  875. * @param eventName The event name to query.
  876. * @return True if the named key event is supported.
  877. */
  878. supports(eventName) {
  879. return _KeyEventsPlugin.parseEventName(eventName) != null;
  880. }
  881. /**
  882. * Registers a handler for a specific element and key event.
  883. * @param element The HTML element to receive event notifications.
  884. * @param eventName The name of the key event to listen for.
  885. * @param handler A function to call when the notification occurs. Receives the
  886. * event object as an argument.
  887. * @returns The key event that was registered.
  888. */
  889. addEventListener(element, eventName, handler) {
  890. const parsedEvent = _KeyEventsPlugin.parseEventName(eventName);
  891. const outsideHandler = _KeyEventsPlugin.eventCallback(parsedEvent["fullKey"], handler, this.manager.getZone());
  892. return this.manager.getZone().runOutsideAngular(() => {
  893. return getDOM().onAndCancel(element, parsedEvent["domEventName"], outsideHandler);
  894. });
  895. }
  896. /**
  897. * Parses the user provided full keyboard event definition and normalizes it for
  898. * later internal use. It ensures the string is all lowercase, converts special
  899. * characters to a standard spelling, and orders all the values consistently.
  900. *
  901. * @param eventName The name of the key event to listen for.
  902. * @returns an object with the full, normalized string, and the dom event name
  903. * or null in the case when the event doesn't match a keyboard event.
  904. */
  905. static parseEventName(eventName) {
  906. const parts = eventName.toLowerCase().split(".");
  907. const domEventName = parts.shift();
  908. if (parts.length === 0 || !(domEventName === "keydown" || domEventName === "keyup")) {
  909. return null;
  910. }
  911. const key = _KeyEventsPlugin._normalizeKey(parts.pop());
  912. let fullKey = "";
  913. let codeIX = parts.indexOf("code");
  914. if (codeIX > -1) {
  915. parts.splice(codeIX, 1);
  916. fullKey = "code.";
  917. }
  918. MODIFIER_KEYS.forEach((modifierName) => {
  919. const index = parts.indexOf(modifierName);
  920. if (index > -1) {
  921. parts.splice(index, 1);
  922. fullKey += modifierName + ".";
  923. }
  924. });
  925. fullKey += key;
  926. if (parts.length != 0 || key.length === 0) {
  927. return null;
  928. }
  929. const result = {};
  930. result["domEventName"] = domEventName;
  931. result["fullKey"] = fullKey;
  932. return result;
  933. }
  934. /**
  935. * Determines whether the actual keys pressed match the configured key code string.
  936. * The `fullKeyCode` event is normalized in the `parseEventName` method when the
  937. * event is attached to the DOM during the `addEventListener` call. This is unseen
  938. * by the end user and is normalized for internal consistency and parsing.
  939. *
  940. * @param event The keyboard event.
  941. * @param fullKeyCode The normalized user defined expected key event string
  942. * @returns boolean.
  943. */
  944. static matchEventFullKeyCode(event, fullKeyCode) {
  945. let keycode = _keyMap[event.key] || event.key;
  946. let key = "";
  947. if (fullKeyCode.indexOf("code.") > -1) {
  948. keycode = event.code;
  949. key = "code.";
  950. }
  951. if (keycode == null || !keycode)
  952. return false;
  953. keycode = keycode.toLowerCase();
  954. if (keycode === " ") {
  955. keycode = "space";
  956. } else if (keycode === ".") {
  957. keycode = "dot";
  958. }
  959. MODIFIER_KEYS.forEach((modifierName) => {
  960. if (modifierName !== keycode) {
  961. const modifierGetter = MODIFIER_KEY_GETTERS[modifierName];
  962. if (modifierGetter(event)) {
  963. key += modifierName + ".";
  964. }
  965. }
  966. });
  967. key += keycode;
  968. return key === fullKeyCode;
  969. }
  970. /**
  971. * Configures a handler callback for a key event.
  972. * @param fullKey The event name that combines all simultaneous keystrokes.
  973. * @param handler The function that responds to the key event.
  974. * @param zone The zone in which the event occurred.
  975. * @returns A callback function.
  976. */
  977. static eventCallback(fullKey, handler, zone) {
  978. return (event) => {
  979. if (_KeyEventsPlugin.matchEventFullKeyCode(event, fullKey)) {
  980. zone.runGuarded(() => handler(event));
  981. }
  982. };
  983. }
  984. /** @internal */
  985. static _normalizeKey(keyName) {
  986. return keyName === "esc" ? "escape" : keyName;
  987. }
  988. };
  989. _KeyEventsPlugin.ɵfac = function KeyEventsPlugin_Factory(t) {
  990. return new (t || _KeyEventsPlugin)(ɵɵinject(DOCUMENT));
  991. };
  992. _KeyEventsPlugin.ɵprov = ɵɵdefineInjectable({
  993. token: _KeyEventsPlugin,
  994. factory: _KeyEventsPlugin.ɵfac
  995. });
  996. var KeyEventsPlugin = _KeyEventsPlugin;
  997. (() => {
  998. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(KeyEventsPlugin, [{
  999. type: Injectable
  1000. }], () => [{
  1001. type: void 0,
  1002. decorators: [{
  1003. type: Inject,
  1004. args: [DOCUMENT]
  1005. }]
  1006. }], null);
  1007. })();
  1008. function bootstrapApplication(rootComponent, options) {
  1009. return internalCreateApplication(__spreadValues({
  1010. rootComponent
  1011. }, createProvidersConfig(options)));
  1012. }
  1013. function createApplication(options) {
  1014. return internalCreateApplication(createProvidersConfig(options));
  1015. }
  1016. function createProvidersConfig(options) {
  1017. return {
  1018. appProviders: [...BROWSER_MODULE_PROVIDERS, ...options?.providers ?? []],
  1019. platformProviders: INTERNAL_BROWSER_PLATFORM_PROVIDERS
  1020. };
  1021. }
  1022. function provideProtractorTestingSupport() {
  1023. return [...TESTABILITY_PROVIDERS];
  1024. }
  1025. function initDomAdapter() {
  1026. BrowserDomAdapter.makeCurrent();
  1027. }
  1028. function errorHandler() {
  1029. return new ErrorHandler();
  1030. }
  1031. function _document() {
  1032. setDocument(document);
  1033. return document;
  1034. }
  1035. var INTERNAL_BROWSER_PLATFORM_PROVIDERS = [{
  1036. provide: PLATFORM_ID,
  1037. useValue: PLATFORM_BROWSER_ID
  1038. }, {
  1039. provide: PLATFORM_INITIALIZER,
  1040. useValue: initDomAdapter,
  1041. multi: true
  1042. }, {
  1043. provide: DOCUMENT,
  1044. useFactory: _document,
  1045. deps: []
  1046. }];
  1047. var platformBrowser = createPlatformFactory(platformCore, "browser", INTERNAL_BROWSER_PLATFORM_PROVIDERS);
  1048. var BROWSER_MODULE_PROVIDERS_MARKER = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "BrowserModule Providers Marker" : "");
  1049. var TESTABILITY_PROVIDERS = [{
  1050. provide: TESTABILITY_GETTER,
  1051. useClass: BrowserGetTestability,
  1052. deps: []
  1053. }, {
  1054. provide: TESTABILITY,
  1055. useClass: Testability,
  1056. deps: [NgZone, TestabilityRegistry, TESTABILITY_GETTER]
  1057. }, {
  1058. provide: Testability,
  1059. // Also provide as `Testability` for backwards-compatibility.
  1060. useClass: Testability,
  1061. deps: [NgZone, TestabilityRegistry, TESTABILITY_GETTER]
  1062. }];
  1063. var BROWSER_MODULE_PROVIDERS = [{
  1064. provide: INJECTOR_SCOPE,
  1065. useValue: "root"
  1066. }, {
  1067. provide: ErrorHandler,
  1068. useFactory: errorHandler,
  1069. deps: []
  1070. }, {
  1071. provide: EVENT_MANAGER_PLUGINS,
  1072. useClass: DomEventsPlugin,
  1073. multi: true,
  1074. deps: [DOCUMENT, NgZone, PLATFORM_ID]
  1075. }, {
  1076. provide: EVENT_MANAGER_PLUGINS,
  1077. useClass: KeyEventsPlugin,
  1078. multi: true,
  1079. deps: [DOCUMENT]
  1080. }, DomRendererFactory2, SharedStylesHost, EventManager, {
  1081. provide: RendererFactory2,
  1082. useExisting: DomRendererFactory2
  1083. }, {
  1084. provide: XhrFactory,
  1085. useClass: BrowserXhr,
  1086. deps: []
  1087. }, typeof ngDevMode === "undefined" || ngDevMode ? {
  1088. provide: BROWSER_MODULE_PROVIDERS_MARKER,
  1089. useValue: true
  1090. } : []];
  1091. var _BrowserModule = class _BrowserModule {
  1092. constructor(providersAlreadyPresent) {
  1093. if ((typeof ngDevMode === "undefined" || ngDevMode) && providersAlreadyPresent) {
  1094. 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.`);
  1095. }
  1096. }
  1097. /**
  1098. * Configures a browser-based app to transition from a server-rendered app, if
  1099. * one is present on the page.
  1100. *
  1101. * @param params An object containing an identifier for the app to transition.
  1102. * The ID must match between the client and server versions of the app.
  1103. * @returns The reconfigured `BrowserModule` to import into the app's root `AppModule`.
  1104. *
  1105. * @deprecated Use {@link APP_ID} instead to set the application ID.
  1106. */
  1107. static withServerTransition(params) {
  1108. return {
  1109. ngModule: _BrowserModule,
  1110. providers: [{
  1111. provide: APP_ID,
  1112. useValue: params.appId
  1113. }]
  1114. };
  1115. }
  1116. };
  1117. _BrowserModule.ɵfac = function BrowserModule_Factory(t) {
  1118. return new (t || _BrowserModule)(ɵɵinject(BROWSER_MODULE_PROVIDERS_MARKER, 12));
  1119. };
  1120. _BrowserModule.ɵmod = ɵɵdefineNgModule({
  1121. type: _BrowserModule,
  1122. exports: [CommonModule, ApplicationModule]
  1123. });
  1124. _BrowserModule.ɵinj = ɵɵdefineInjector({
  1125. providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS],
  1126. imports: [CommonModule, ApplicationModule]
  1127. });
  1128. var BrowserModule = _BrowserModule;
  1129. (() => {
  1130. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(BrowserModule, [{
  1131. type: NgModule,
  1132. args: [{
  1133. providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS],
  1134. exports: [CommonModule, ApplicationModule]
  1135. }]
  1136. }], () => [{
  1137. type: void 0,
  1138. decorators: [{
  1139. type: Optional
  1140. }, {
  1141. type: SkipSelf
  1142. }, {
  1143. type: Inject,
  1144. args: [BROWSER_MODULE_PROVIDERS_MARKER]
  1145. }]
  1146. }], null);
  1147. })();
  1148. var _Meta = class _Meta {
  1149. constructor(_doc) {
  1150. this._doc = _doc;
  1151. this._dom = getDOM();
  1152. }
  1153. /**
  1154. * Retrieves or creates a specific `<meta>` tag element in the current HTML document.
  1155. * In searching for an existing tag, Angular attempts to match the `name` or `property` attribute
  1156. * values in the provided tag definition, and verifies that all other attribute values are equal.
  1157. * If an existing element is found, it is returned and is not modified in any way.
  1158. * @param tag The definition of a `<meta>` element to match or create.
  1159. * @param forceCreation True to create a new element without checking whether one already exists.
  1160. * @returns The existing element with the same attributes and values if found,
  1161. * the new element if no match is found, or `null` if the tag parameter is not defined.
  1162. */
  1163. addTag(tag, forceCreation = false) {
  1164. if (!tag)
  1165. return null;
  1166. return this._getOrCreateElement(tag, forceCreation);
  1167. }
  1168. /**
  1169. * Retrieves or creates a set of `<meta>` tag elements in the current HTML document.
  1170. * In searching for an existing tag, Angular attempts to match the `name` or `property` attribute
  1171. * values in the provided tag definition, and verifies that all other attribute values are equal.
  1172. * @param tags An array of tag definitions to match or create.
  1173. * @param forceCreation True to create new elements without checking whether they already exist.
  1174. * @returns The matching elements if found, or the new elements.
  1175. */
  1176. addTags(tags, forceCreation = false) {
  1177. if (!tags)
  1178. return [];
  1179. return tags.reduce((result, tag) => {
  1180. if (tag) {
  1181. result.push(this._getOrCreateElement(tag, forceCreation));
  1182. }
  1183. return result;
  1184. }, []);
  1185. }
  1186. /**
  1187. * Retrieves a `<meta>` tag element in the current HTML document.
  1188. * @param attrSelector The tag attribute and value to match against, in the format
  1189. * `"tag_attribute='value string'"`.
  1190. * @returns The matching element, if any.
  1191. */
  1192. getTag(attrSelector) {
  1193. if (!attrSelector)
  1194. return null;
  1195. return this._doc.querySelector(`meta[${attrSelector}]`) || null;
  1196. }
  1197. /**
  1198. * Retrieves a set of `<meta>` tag elements in the current HTML document.
  1199. * @param attrSelector The tag attribute and value to match against, in the format
  1200. * `"tag_attribute='value string'"`.
  1201. * @returns The matching elements, if any.
  1202. */
  1203. getTags(attrSelector) {
  1204. if (!attrSelector)
  1205. return [];
  1206. const list = this._doc.querySelectorAll(`meta[${attrSelector}]`);
  1207. return list ? [].slice.call(list) : [];
  1208. }
  1209. /**
  1210. * Modifies an existing `<meta>` tag element in the current HTML document.
  1211. * @param tag The tag description with which to replace the existing tag content.
  1212. * @param selector A tag attribute and value to match against, to identify
  1213. * an existing tag. A string in the format `"tag_attribute=`value string`"`.
  1214. * If not supplied, matches a tag with the same `name` or `property` attribute value as the
  1215. * replacement tag.
  1216. * @return The modified element.
  1217. */
  1218. updateTag(tag, selector) {
  1219. if (!tag)
  1220. return null;
  1221. selector = selector || this._parseSelector(tag);
  1222. const meta = this.getTag(selector);
  1223. if (meta) {
  1224. return this._setMetaElementAttributes(tag, meta);
  1225. }
  1226. return this._getOrCreateElement(tag, true);
  1227. }
  1228. /**
  1229. * Removes an existing `<meta>` tag element from the current HTML document.
  1230. * @param attrSelector A tag attribute and value to match against, to identify
  1231. * an existing tag. A string in the format `"tag_attribute=`value string`"`.
  1232. */
  1233. removeTag(attrSelector) {
  1234. this.removeTagElement(this.getTag(attrSelector));
  1235. }
  1236. /**
  1237. * Removes an existing `<meta>` tag element from the current HTML document.
  1238. * @param meta The tag definition to match against to identify an existing tag.
  1239. */
  1240. removeTagElement(meta) {
  1241. if (meta) {
  1242. this._dom.remove(meta);
  1243. }
  1244. }
  1245. _getOrCreateElement(meta, forceCreation = false) {
  1246. if (!forceCreation) {
  1247. const selector = this._parseSelector(meta);
  1248. const elem = this.getTags(selector).filter((elem2) => this._containsAttributes(meta, elem2))[0];
  1249. if (elem !== void 0)
  1250. return elem;
  1251. }
  1252. const element = this._dom.createElement("meta");
  1253. this._setMetaElementAttributes(meta, element);
  1254. const head = this._doc.getElementsByTagName("head")[0];
  1255. head.appendChild(element);
  1256. return element;
  1257. }
  1258. _setMetaElementAttributes(tag, el) {
  1259. Object.keys(tag).forEach((prop) => el.setAttribute(this._getMetaKeyMap(prop), tag[prop]));
  1260. return el;
  1261. }
  1262. _parseSelector(tag) {
  1263. const attr = tag.name ? "name" : "property";
  1264. return `${attr}="${tag[attr]}"`;
  1265. }
  1266. _containsAttributes(tag, elem) {
  1267. return Object.keys(tag).every((key) => elem.getAttribute(this._getMetaKeyMap(key)) === tag[key]);
  1268. }
  1269. _getMetaKeyMap(prop) {
  1270. return META_KEYS_MAP[prop] || prop;
  1271. }
  1272. };
  1273. _Meta.ɵfac = function Meta_Factory(t) {
  1274. return new (t || _Meta)(ɵɵinject(DOCUMENT));
  1275. };
  1276. _Meta.ɵprov = ɵɵdefineInjectable({
  1277. token: _Meta,
  1278. factory: _Meta.ɵfac,
  1279. providedIn: "root"
  1280. });
  1281. var Meta = _Meta;
  1282. (() => {
  1283. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(Meta, [{
  1284. type: Injectable,
  1285. args: [{
  1286. providedIn: "root"
  1287. }]
  1288. }], () => [{
  1289. type: void 0,
  1290. decorators: [{
  1291. type: Inject,
  1292. args: [DOCUMENT]
  1293. }]
  1294. }], null);
  1295. })();
  1296. var META_KEYS_MAP = {
  1297. httpEquiv: "http-equiv"
  1298. };
  1299. var _Title = class _Title {
  1300. constructor(_doc) {
  1301. this._doc = _doc;
  1302. }
  1303. /**
  1304. * Get the title of the current HTML document.
  1305. */
  1306. getTitle() {
  1307. return this._doc.title;
  1308. }
  1309. /**
  1310. * Set the title of the current HTML document.
  1311. * @param newTitle
  1312. */
  1313. setTitle(newTitle) {
  1314. this._doc.title = newTitle || "";
  1315. }
  1316. };
  1317. _Title.ɵfac = function Title_Factory(t) {
  1318. return new (t || _Title)(ɵɵinject(DOCUMENT));
  1319. };
  1320. _Title.ɵprov = ɵɵdefineInjectable({
  1321. token: _Title,
  1322. factory: _Title.ɵfac,
  1323. providedIn: "root"
  1324. });
  1325. var Title = _Title;
  1326. (() => {
  1327. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(Title, [{
  1328. type: Injectable,
  1329. args: [{
  1330. providedIn: "root"
  1331. }]
  1332. }], () => [{
  1333. type: void 0,
  1334. decorators: [{
  1335. type: Inject,
  1336. args: [DOCUMENT]
  1337. }]
  1338. }], null);
  1339. })();
  1340. function exportNgVar(name, value) {
  1341. if (typeof COMPILED === "undefined" || !COMPILED) {
  1342. const ng = _global["ng"] = _global["ng"] || {};
  1343. ng[name] = value;
  1344. }
  1345. }
  1346. var ChangeDetectionPerfRecord = class {
  1347. constructor(msPerTick, numTicks) {
  1348. this.msPerTick = msPerTick;
  1349. this.numTicks = numTicks;
  1350. }
  1351. };
  1352. var AngularProfiler = class {
  1353. constructor(ref) {
  1354. this.appRef = ref.injector.get(ApplicationRef);
  1355. }
  1356. // tslint:disable:no-console
  1357. /**
  1358. * Exercises change detection in a loop and then prints the average amount of
  1359. * time in milliseconds how long a single round of change detection takes for
  1360. * the current state of the UI. It runs a minimum of 5 rounds for a minimum
  1361. * of 500 milliseconds.
  1362. *
  1363. * Optionally, a user may pass a `config` parameter containing a map of
  1364. * options. Supported options are:
  1365. *
  1366. * `record` (boolean) - causes the profiler to record a CPU profile while
  1367. * it exercises the change detector. Example:
  1368. *
  1369. * ```
  1370. * ng.profiler.timeChangeDetection({record: true})
  1371. * ```
  1372. */
  1373. timeChangeDetection(config) {
  1374. const record = config && config["record"];
  1375. const profileName = "Change Detection";
  1376. if (record && "profile" in console && typeof console.profile === "function") {
  1377. console.profile(profileName);
  1378. }
  1379. const start = performance.now();
  1380. let numTicks = 0;
  1381. while (numTicks < 5 || performance.now() - start < 500) {
  1382. this.appRef.tick();
  1383. numTicks++;
  1384. }
  1385. const end = performance.now();
  1386. if (record && "profileEnd" in console && typeof console.profileEnd === "function") {
  1387. console.profileEnd(profileName);
  1388. }
  1389. const msPerTick = (end - start) / numTicks;
  1390. console.log(`ran ${numTicks} change detection cycles`);
  1391. console.log(`${msPerTick.toFixed(2)} ms per check`);
  1392. return new ChangeDetectionPerfRecord(msPerTick, numTicks);
  1393. }
  1394. };
  1395. var PROFILER_GLOBAL_NAME = "profiler";
  1396. function enableDebugTools(ref) {
  1397. exportNgVar(PROFILER_GLOBAL_NAME, new AngularProfiler(ref));
  1398. return ref;
  1399. }
  1400. function disableDebugTools() {
  1401. exportNgVar(PROFILER_GLOBAL_NAME, null);
  1402. }
  1403. var By = class {
  1404. /**
  1405. * Match all nodes.
  1406. *
  1407. * @usageNotes
  1408. * ### Example
  1409. *
  1410. * {@example platform-browser/dom/debug/ts/by/by.ts region='by_all'}
  1411. */
  1412. static all() {
  1413. return () => true;
  1414. }
  1415. /**
  1416. * Match elements by the given CSS selector.
  1417. *
  1418. * @usageNotes
  1419. * ### Example
  1420. *
  1421. * {@example platform-browser/dom/debug/ts/by/by.ts region='by_css'}
  1422. */
  1423. static css(selector) {
  1424. return (debugElement) => {
  1425. return debugElement.nativeElement != null ? elementMatches(debugElement.nativeElement, selector) : false;
  1426. };
  1427. }
  1428. /**
  1429. * Match nodes that have the given directive present.
  1430. *
  1431. * @usageNotes
  1432. * ### Example
  1433. *
  1434. * {@example platform-browser/dom/debug/ts/by/by.ts region='by_directive'}
  1435. */
  1436. static directive(type) {
  1437. return (debugNode) => debugNode.providerTokens.indexOf(type) !== -1;
  1438. }
  1439. };
  1440. function elementMatches(n, selector) {
  1441. if (getDOM().isElementNode(n)) {
  1442. return n.matches && n.matches(selector) || n.msMatchesSelector && n.msMatchesSelector(selector) || n.webkitMatchesSelector && n.webkitMatchesSelector(selector);
  1443. }
  1444. return false;
  1445. }
  1446. var EVENT_NAMES = {
  1447. // pan
  1448. "pan": true,
  1449. "panstart": true,
  1450. "panmove": true,
  1451. "panend": true,
  1452. "pancancel": true,
  1453. "panleft": true,
  1454. "panright": true,
  1455. "panup": true,
  1456. "pandown": true,
  1457. // pinch
  1458. "pinch": true,
  1459. "pinchstart": true,
  1460. "pinchmove": true,
  1461. "pinchend": true,
  1462. "pinchcancel": true,
  1463. "pinchin": true,
  1464. "pinchout": true,
  1465. // press
  1466. "press": true,
  1467. "pressup": true,
  1468. // rotate
  1469. "rotate": true,
  1470. "rotatestart": true,
  1471. "rotatemove": true,
  1472. "rotateend": true,
  1473. "rotatecancel": true,
  1474. // swipe
  1475. "swipe": true,
  1476. "swipeleft": true,
  1477. "swiperight": true,
  1478. "swipeup": true,
  1479. "swipedown": true,
  1480. // tap
  1481. "tap": true,
  1482. "doubletap": true
  1483. };
  1484. var HAMMER_GESTURE_CONFIG = new InjectionToken("HammerGestureConfig");
  1485. var HAMMER_LOADER = new InjectionToken("HammerLoader");
  1486. var _HammerGestureConfig = class _HammerGestureConfig {
  1487. constructor() {
  1488. this.events = [];
  1489. this.overrides = {};
  1490. }
  1491. /**
  1492. * Creates a [HammerJS Manager](https://hammerjs.github.io/api/#hammermanager)
  1493. * and attaches it to a given HTML element.
  1494. * @param element The element that will recognize gestures.
  1495. * @returns A HammerJS event-manager object.
  1496. */
  1497. buildHammer(element) {
  1498. const mc = new Hammer(element, this.options);
  1499. mc.get("pinch").set({
  1500. enable: true
  1501. });
  1502. mc.get("rotate").set({
  1503. enable: true
  1504. });
  1505. for (const eventName in this.overrides) {
  1506. mc.get(eventName).set(this.overrides[eventName]);
  1507. }
  1508. return mc;
  1509. }
  1510. };
  1511. _HammerGestureConfig.ɵfac = function HammerGestureConfig_Factory(t) {
  1512. return new (t || _HammerGestureConfig)();
  1513. };
  1514. _HammerGestureConfig.ɵprov = ɵɵdefineInjectable({
  1515. token: _HammerGestureConfig,
  1516. factory: _HammerGestureConfig.ɵfac
  1517. });
  1518. var HammerGestureConfig = _HammerGestureConfig;
  1519. (() => {
  1520. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HammerGestureConfig, [{
  1521. type: Injectable
  1522. }], null, null);
  1523. })();
  1524. var _HammerGesturesPlugin = class _HammerGesturesPlugin extends EventManagerPlugin {
  1525. constructor(doc, _config, console2, loader) {
  1526. super(doc);
  1527. this._config = _config;
  1528. this.console = console2;
  1529. this.loader = loader;
  1530. this._loaderPromise = null;
  1531. }
  1532. supports(eventName) {
  1533. if (!EVENT_NAMES.hasOwnProperty(eventName.toLowerCase()) && !this.isCustomEvent(eventName)) {
  1534. return false;
  1535. }
  1536. if (!window.Hammer && !this.loader) {
  1537. if (typeof ngDevMode === "undefined" || ngDevMode) {
  1538. this.console.warn(`The "${eventName}" event cannot be bound because Hammer.JS is not loaded and no custom loader has been specified.`);
  1539. }
  1540. return false;
  1541. }
  1542. return true;
  1543. }
  1544. addEventListener(element, eventName, handler) {
  1545. const zone = this.manager.getZone();
  1546. eventName = eventName.toLowerCase();
  1547. if (!window.Hammer && this.loader) {
  1548. this._loaderPromise = this._loaderPromise || zone.runOutsideAngular(() => this.loader());
  1549. let cancelRegistration = false;
  1550. let deregister = () => {
  1551. cancelRegistration = true;
  1552. };
  1553. zone.runOutsideAngular(() => this._loaderPromise.then(() => {
  1554. if (!window.Hammer) {
  1555. if (typeof ngDevMode === "undefined" || ngDevMode) {
  1556. this.console.warn(`The custom HAMMER_LOADER completed, but Hammer.JS is not present.`);
  1557. }
  1558. deregister = () => {
  1559. };
  1560. return;
  1561. }
  1562. if (!cancelRegistration) {
  1563. deregister = this.addEventListener(element, eventName, handler);
  1564. }
  1565. }).catch(() => {
  1566. if (typeof ngDevMode === "undefined" || ngDevMode) {
  1567. this.console.warn(`The "${eventName}" event cannot be bound because the custom Hammer.JS loader failed.`);
  1568. }
  1569. deregister = () => {
  1570. };
  1571. }));
  1572. return () => {
  1573. deregister();
  1574. };
  1575. }
  1576. return zone.runOutsideAngular(() => {
  1577. const mc = this._config.buildHammer(element);
  1578. const callback = function(eventObj) {
  1579. zone.runGuarded(function() {
  1580. handler(eventObj);
  1581. });
  1582. };
  1583. mc.on(eventName, callback);
  1584. return () => {
  1585. mc.off(eventName, callback);
  1586. if (typeof mc.destroy === "function") {
  1587. mc.destroy();
  1588. }
  1589. };
  1590. });
  1591. }
  1592. isCustomEvent(eventName) {
  1593. return this._config.events.indexOf(eventName) > -1;
  1594. }
  1595. };
  1596. _HammerGesturesPlugin.ɵfac = function HammerGesturesPlugin_Factory(t) {
  1597. return new (t || _HammerGesturesPlugin)(ɵɵinject(DOCUMENT), ɵɵinject(HAMMER_GESTURE_CONFIG), ɵɵinject(Console), ɵɵinject(HAMMER_LOADER, 8));
  1598. };
  1599. _HammerGesturesPlugin.ɵprov = ɵɵdefineInjectable({
  1600. token: _HammerGesturesPlugin,
  1601. factory: _HammerGesturesPlugin.ɵfac
  1602. });
  1603. var HammerGesturesPlugin = _HammerGesturesPlugin;
  1604. (() => {
  1605. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HammerGesturesPlugin, [{
  1606. type: Injectable
  1607. }], () => [{
  1608. type: void 0,
  1609. decorators: [{
  1610. type: Inject,
  1611. args: [DOCUMENT]
  1612. }]
  1613. }, {
  1614. type: HammerGestureConfig,
  1615. decorators: [{
  1616. type: Inject,
  1617. args: [HAMMER_GESTURE_CONFIG]
  1618. }]
  1619. }, {
  1620. type: Console
  1621. }, {
  1622. type: void 0,
  1623. decorators: [{
  1624. type: Optional
  1625. }, {
  1626. type: Inject,
  1627. args: [HAMMER_LOADER]
  1628. }]
  1629. }], null);
  1630. })();
  1631. var _HammerModule = class _HammerModule {
  1632. };
  1633. _HammerModule.ɵfac = function HammerModule_Factory(t) {
  1634. return new (t || _HammerModule)();
  1635. };
  1636. _HammerModule.ɵmod = ɵɵdefineNgModule({
  1637. type: _HammerModule
  1638. });
  1639. _HammerModule.ɵinj = ɵɵdefineInjector({
  1640. providers: [{
  1641. provide: EVENT_MANAGER_PLUGINS,
  1642. useClass: HammerGesturesPlugin,
  1643. multi: true,
  1644. deps: [DOCUMENT, HAMMER_GESTURE_CONFIG, Console, [new Optional(), HAMMER_LOADER]]
  1645. }, {
  1646. provide: HAMMER_GESTURE_CONFIG,
  1647. useClass: HammerGestureConfig,
  1648. deps: []
  1649. }]
  1650. });
  1651. var HammerModule = _HammerModule;
  1652. (() => {
  1653. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HammerModule, [{
  1654. type: NgModule,
  1655. args: [{
  1656. providers: [{
  1657. provide: EVENT_MANAGER_PLUGINS,
  1658. useClass: HammerGesturesPlugin,
  1659. multi: true,
  1660. deps: [DOCUMENT, HAMMER_GESTURE_CONFIG, Console, [new Optional(), HAMMER_LOADER]]
  1661. }, {
  1662. provide: HAMMER_GESTURE_CONFIG,
  1663. useClass: HammerGestureConfig,
  1664. deps: []
  1665. }]
  1666. }]
  1667. }], null, null);
  1668. })();
  1669. var _DomSanitizer = class _DomSanitizer {
  1670. };
  1671. _DomSanitizer.ɵfac = function DomSanitizer_Factory(t) {
  1672. return new (t || _DomSanitizer)();
  1673. };
  1674. _DomSanitizer.ɵprov = ɵɵdefineInjectable({
  1675. token: _DomSanitizer,
  1676. factory: function DomSanitizer_Factory(t) {
  1677. let r = null;
  1678. if (t) {
  1679. r = new (t || _DomSanitizer)();
  1680. } else {
  1681. r = ɵɵinject(DomSanitizerImpl);
  1682. }
  1683. return r;
  1684. },
  1685. providedIn: "root"
  1686. });
  1687. var DomSanitizer = _DomSanitizer;
  1688. (() => {
  1689. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DomSanitizer, [{
  1690. type: Injectable,
  1691. args: [{
  1692. providedIn: "root",
  1693. useExisting: forwardRef(() => DomSanitizerImpl)
  1694. }]
  1695. }], null, null);
  1696. })();
  1697. var _DomSanitizerImpl = class _DomSanitizerImpl extends DomSanitizer {
  1698. constructor(_doc) {
  1699. super();
  1700. this._doc = _doc;
  1701. }
  1702. sanitize(ctx, value) {
  1703. if (value == null)
  1704. return null;
  1705. switch (ctx) {
  1706. case SecurityContext.NONE:
  1707. return value;
  1708. case SecurityContext.HTML:
  1709. if (allowSanitizationBypassAndThrow(
  1710. value,
  1711. "HTML"
  1712. /* BypassType.Html */
  1713. )) {
  1714. return unwrapSafeValue(value);
  1715. }
  1716. return _sanitizeHtml(this._doc, String(value)).toString();
  1717. case SecurityContext.STYLE:
  1718. if (allowSanitizationBypassAndThrow(
  1719. value,
  1720. "Style"
  1721. /* BypassType.Style */
  1722. )) {
  1723. return unwrapSafeValue(value);
  1724. }
  1725. return value;
  1726. case SecurityContext.SCRIPT:
  1727. if (allowSanitizationBypassAndThrow(
  1728. value,
  1729. "Script"
  1730. /* BypassType.Script */
  1731. )) {
  1732. return unwrapSafeValue(value);
  1733. }
  1734. throw new RuntimeError(5200, (typeof ngDevMode === "undefined" || ngDevMode) && "unsafe value used in a script context");
  1735. case SecurityContext.URL:
  1736. if (allowSanitizationBypassAndThrow(
  1737. value,
  1738. "URL"
  1739. /* BypassType.Url */
  1740. )) {
  1741. return unwrapSafeValue(value);
  1742. }
  1743. return _sanitizeUrl(String(value));
  1744. case SecurityContext.RESOURCE_URL:
  1745. if (allowSanitizationBypassAndThrow(
  1746. value,
  1747. "ResourceURL"
  1748. /* BypassType.ResourceUrl */
  1749. )) {
  1750. return unwrapSafeValue(value);
  1751. }
  1752. throw new RuntimeError(5201, (typeof ngDevMode === "undefined" || ngDevMode) && `unsafe value used in a resource URL context (see ${XSS_SECURITY_URL})`);
  1753. default:
  1754. throw new RuntimeError(5202, (typeof ngDevMode === "undefined" || ngDevMode) && `Unexpected SecurityContext ${ctx} (see ${XSS_SECURITY_URL})`);
  1755. }
  1756. }
  1757. bypassSecurityTrustHtml(value) {
  1758. return bypassSanitizationTrustHtml(value);
  1759. }
  1760. bypassSecurityTrustStyle(value) {
  1761. return bypassSanitizationTrustStyle(value);
  1762. }
  1763. bypassSecurityTrustScript(value) {
  1764. return bypassSanitizationTrustScript(value);
  1765. }
  1766. bypassSecurityTrustUrl(value) {
  1767. return bypassSanitizationTrustUrl(value);
  1768. }
  1769. bypassSecurityTrustResourceUrl(value) {
  1770. return bypassSanitizationTrustResourceUrl(value);
  1771. }
  1772. };
  1773. _DomSanitizerImpl.ɵfac = function DomSanitizerImpl_Factory(t) {
  1774. return new (t || _DomSanitizerImpl)(ɵɵinject(DOCUMENT));
  1775. };
  1776. _DomSanitizerImpl.ɵprov = ɵɵdefineInjectable({
  1777. token: _DomSanitizerImpl,
  1778. factory: _DomSanitizerImpl.ɵfac,
  1779. providedIn: "root"
  1780. });
  1781. var DomSanitizerImpl = _DomSanitizerImpl;
  1782. (() => {
  1783. (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DomSanitizerImpl, [{
  1784. type: Injectable,
  1785. args: [{
  1786. providedIn: "root"
  1787. }]
  1788. }], () => [{
  1789. type: void 0,
  1790. decorators: [{
  1791. type: Inject,
  1792. args: [DOCUMENT]
  1793. }]
  1794. }], null);
  1795. })();
  1796. var HydrationFeatureKind;
  1797. (function(HydrationFeatureKind2) {
  1798. HydrationFeatureKind2[HydrationFeatureKind2["NoHttpTransferCache"] = 0] = "NoHttpTransferCache";
  1799. HydrationFeatureKind2[HydrationFeatureKind2["HttpTransferCacheOptions"] = 1] = "HttpTransferCacheOptions";
  1800. })(HydrationFeatureKind || (HydrationFeatureKind = {}));
  1801. function hydrationFeature(ɵkind, ɵproviders = [], ɵoptions = {}) {
  1802. return {
  1803. ɵkind,
  1804. ɵproviders
  1805. };
  1806. }
  1807. function withNoHttpTransferCache() {
  1808. return hydrationFeature(HydrationFeatureKind.NoHttpTransferCache);
  1809. }
  1810. function withHttpTransferCacheOptions(options) {
  1811. return hydrationFeature(HydrationFeatureKind.HttpTransferCacheOptions, withHttpTransferCache(options));
  1812. }
  1813. function provideZoneJsCompatibilityDetector() {
  1814. return [{
  1815. provide: ENVIRONMENT_INITIALIZER,
  1816. useValue: () => {
  1817. const ngZone = inject(NgZone);
  1818. if (ngZone.constructor !== NgZone) {
  1819. const console2 = inject(Console);
  1820. const message = formatRuntimeError(-5e3, "Angular detected that hydration was enabled for an application that uses a custom or a noop Zone.js implementation. This is not yet a fully supported configuration.");
  1821. console2.warn(message);
  1822. }
  1823. },
  1824. multi: true
  1825. }];
  1826. }
  1827. function provideClientHydration(...features) {
  1828. const providers = [];
  1829. const featuresKind = /* @__PURE__ */ new Set();
  1830. const hasHttpTransferCacheOptions = featuresKind.has(HydrationFeatureKind.HttpTransferCacheOptions);
  1831. for (const {
  1832. ɵproviders,
  1833. ɵkind
  1834. } of features) {
  1835. featuresKind.add(ɵkind);
  1836. if (ɵproviders.length) {
  1837. providers.push(ɵproviders);
  1838. }
  1839. }
  1840. if (typeof ngDevMode !== "undefined" && ngDevMode && featuresKind.has(HydrationFeatureKind.NoHttpTransferCache) && hasHttpTransferCacheOptions) {
  1841. throw new Error("Configuration error: found both withHttpTransferCacheOptions() and withNoHttpTransferCache() in the same call to provideClientHydration(), which is a contradiction.");
  1842. }
  1843. return makeEnvironmentProviders([typeof ngDevMode !== "undefined" && ngDevMode ? provideZoneJsCompatibilityDetector() : [], withDomHydration(), featuresKind.has(HydrationFeatureKind.NoHttpTransferCache) || hasHttpTransferCacheOptions ? [] : withHttpTransferCache({}), providers]);
  1844. }
  1845. var VERSION = new Version("17.2.2");
  1846. var makeStateKey2 = makeStateKey;
  1847. var TransferState2 = TransferState;
  1848. export {
  1849. BrowserDomAdapter,
  1850. BrowserGetTestability,
  1851. EVENT_MANAGER_PLUGINS,
  1852. EventManager,
  1853. EventManagerPlugin,
  1854. SharedStylesHost,
  1855. REMOVE_STYLES_ON_COMPONENT_DESTROY,
  1856. DomRendererFactory2,
  1857. DomEventsPlugin,
  1858. KeyEventsPlugin,
  1859. bootstrapApplication,
  1860. createApplication,
  1861. provideProtractorTestingSupport,
  1862. initDomAdapter,
  1863. INTERNAL_BROWSER_PLATFORM_PROVIDERS,
  1864. platformBrowser,
  1865. BrowserModule,
  1866. Meta,
  1867. Title,
  1868. enableDebugTools,
  1869. disableDebugTools,
  1870. By,
  1871. HAMMER_GESTURE_CONFIG,
  1872. HAMMER_LOADER,
  1873. HammerGestureConfig,
  1874. HammerGesturesPlugin,
  1875. HammerModule,
  1876. DomSanitizer,
  1877. DomSanitizerImpl,
  1878. HydrationFeatureKind,
  1879. withNoHttpTransferCache,
  1880. withHttpTransferCacheOptions,
  1881. provideClientHydration,
  1882. VERSION,
  1883. makeStateKey2 as makeStateKey,
  1884. TransferState2 as TransferState
  1885. };
  1886. /*! Bundled license information:
  1887. @angular/platform-browser/fesm2022/platform-browser.mjs:
  1888. (**
  1889. * @license Angular v17.2.2
  1890. * (c) 2010-2022 Google LLC. https://angular.io/
  1891. * License: MIT
  1892. *)
  1893. */
  1894. //# sourceMappingURL=chunk-VD5HY7AQ.js.map