UNPKG

28.8 kBJavaScriptView Raw
1import * as i0 from '@angular/core';
2import { ElementRef, Injector, Directive, EventEmitter, Inject, Output, NgModule } from '@angular/core';
3import { DOCUMENT } from '@angular/common';
4
5/**
6 * @license
7 * Copyright Google LLC All Rights Reserved.
8 *
9 * Use of this source code is governed by an MIT-style license that can be
10 * found in the LICENSE file at https://angular.io/license
11 */
12/**
13 * Throws an exception when attempting to attach a null portal to a host.
14 * @docs-private
15 */
16function throwNullPortalError() {
17 throw Error('Must provide a portal to attach');
18}
19/**
20 * Throws an exception when attempting to attach a portal to a host that is already attached.
21 * @docs-private
22 */
23function throwPortalAlreadyAttachedError() {
24 throw Error('Host already has a portal attached');
25}
26/**
27 * Throws an exception when attempting to attach a portal to an already-disposed host.
28 * @docs-private
29 */
30function throwPortalOutletAlreadyDisposedError() {
31 throw Error('This PortalOutlet has already been disposed');
32}
33/**
34 * Throws an exception when attempting to attach an unknown portal type.
35 * @docs-private
36 */
37function throwUnknownPortalTypeError() {
38 throw Error('Attempting to attach an unknown Portal type. BasePortalOutlet accepts either ' +
39 'a ComponentPortal or a TemplatePortal.');
40}
41/**
42 * Throws an exception when attempting to attach a portal to a null host.
43 * @docs-private
44 */
45function throwNullPortalOutletError() {
46 throw Error('Attempting to attach a portal to a null PortalOutlet');
47}
48/**
49 * Throws an exception when attempting to detach a portal that is not attached.
50 * @docs-private
51 */
52function throwNoPortalAttachedError() {
53 throw Error('Attempting to detach a portal that is not attached to a host');
54}
55
56/**
57 * @license
58 * Copyright Google LLC All Rights Reserved.
59 *
60 * Use of this source code is governed by an MIT-style license that can be
61 * found in the LICENSE file at https://angular.io/license
62 */
63/**
64 * A `Portal` is something that you want to render somewhere else.
65 * It can be attach to / detached from a `PortalOutlet`.
66 */
67class Portal {
68 /** Attach this portal to a host. */
69 attach(host) {
70 if (typeof ngDevMode === 'undefined' || ngDevMode) {
71 if (host == null) {
72 throwNullPortalOutletError();
73 }
74 if (host.hasAttached()) {
75 throwPortalAlreadyAttachedError();
76 }
77 }
78 this._attachedHost = host;
79 return host.attach(this);
80 }
81 /** Detach this portal from its host */
82 detach() {
83 let host = this._attachedHost;
84 if (host != null) {
85 this._attachedHost = null;
86 host.detach();
87 }
88 else if (typeof ngDevMode === 'undefined' || ngDevMode) {
89 throwNoPortalAttachedError();
90 }
91 }
92 /** Whether this portal is attached to a host. */
93 get isAttached() {
94 return this._attachedHost != null;
95 }
96 /**
97 * Sets the PortalOutlet reference without performing `attach()`. This is used directly by
98 * the PortalOutlet when it is performing an `attach()` or `detach()`.
99 */
100 setAttachedHost(host) {
101 this._attachedHost = host;
102 }
103}
104/**
105 * A `ComponentPortal` is a portal that instantiates some Component upon attachment.
106 */
107class ComponentPortal extends Portal {
108 constructor(component, viewContainerRef, injector, componentFactoryResolver) {
109 super();
110 this.component = component;
111 this.viewContainerRef = viewContainerRef;
112 this.injector = injector;
113 this.componentFactoryResolver = componentFactoryResolver;
114 }
115}
116/**
117 * A `TemplatePortal` is a portal that represents some embedded template (TemplateRef).
118 */
119class TemplatePortal extends Portal {
120 constructor(
121 /** The embedded template that will be used to instantiate an embedded View in the host. */
122 templateRef,
123 /** Reference to the ViewContainer into which the template will be stamped out. */
124 viewContainerRef,
125 /** Contextual data to be passed in to the embedded view. */
126 context,
127 /** The injector to use for the embedded view. */
128 injector) {
129 super();
130 this.templateRef = templateRef;
131 this.viewContainerRef = viewContainerRef;
132 this.context = context;
133 this.injector = injector;
134 }
135 get origin() {
136 return this.templateRef.elementRef;
137 }
138 /**
139 * Attach the portal to the provided `PortalOutlet`.
140 * When a context is provided it will override the `context` property of the `TemplatePortal`
141 * instance.
142 */
143 attach(host, context = this.context) {
144 this.context = context;
145 return super.attach(host);
146 }
147 detach() {
148 this.context = undefined;
149 return super.detach();
150 }
151}
152/**
153 * A `DomPortal` is a portal whose DOM element will be taken from its current position
154 * in the DOM and moved into a portal outlet, when it is attached. On detach, the content
155 * will be restored to its original position.
156 */
157class DomPortal extends Portal {
158 constructor(element) {
159 super();
160 this.element = element instanceof ElementRef ? element.nativeElement : element;
161 }
162}
163/**
164 * Partial implementation of PortalOutlet that handles attaching
165 * ComponentPortal and TemplatePortal.
166 */
167class BasePortalOutlet {
168 constructor() {
169 /** Whether this host has already been permanently disposed. */
170 this._isDisposed = false;
171 // @breaking-change 10.0.0 `attachDomPortal` to become a required abstract method.
172 this.attachDomPortal = null;
173 }
174 /** Whether this host has an attached portal. */
175 hasAttached() {
176 return !!this._attachedPortal;
177 }
178 /** Attaches a portal. */
179 attach(portal) {
180 if (typeof ngDevMode === 'undefined' || ngDevMode) {
181 if (!portal) {
182 throwNullPortalError();
183 }
184 if (this.hasAttached()) {
185 throwPortalAlreadyAttachedError();
186 }
187 if (this._isDisposed) {
188 throwPortalOutletAlreadyDisposedError();
189 }
190 }
191 if (portal instanceof ComponentPortal) {
192 this._attachedPortal = portal;
193 return this.attachComponentPortal(portal);
194 }
195 else if (portal instanceof TemplatePortal) {
196 this._attachedPortal = portal;
197 return this.attachTemplatePortal(portal);
198 // @breaking-change 10.0.0 remove null check for `this.attachDomPortal`.
199 }
200 else if (this.attachDomPortal && portal instanceof DomPortal) {
201 this._attachedPortal = portal;
202 return this.attachDomPortal(portal);
203 }
204 if (typeof ngDevMode === 'undefined' || ngDevMode) {
205 throwUnknownPortalTypeError();
206 }
207 }
208 /** Detaches a previously attached portal. */
209 detach() {
210 if (this._attachedPortal) {
211 this._attachedPortal.setAttachedHost(null);
212 this._attachedPortal = null;
213 }
214 this._invokeDisposeFn();
215 }
216 /** Permanently dispose of this portal host. */
217 dispose() {
218 if (this.hasAttached()) {
219 this.detach();
220 }
221 this._invokeDisposeFn();
222 this._isDisposed = true;
223 }
224 /** @docs-private */
225 setDisposeFn(fn) {
226 this._disposeFn = fn;
227 }
228 _invokeDisposeFn() {
229 if (this._disposeFn) {
230 this._disposeFn();
231 this._disposeFn = null;
232 }
233 }
234}
235/**
236 * @deprecated Use `BasePortalOutlet` instead.
237 * @breaking-change 9.0.0
238 */
239class BasePortalHost extends BasePortalOutlet {
240}
241
242/**
243 * @license
244 * Copyright Google LLC All Rights Reserved.
245 *
246 * Use of this source code is governed by an MIT-style license that can be
247 * found in the LICENSE file at https://angular.io/license
248 */
249/**
250 * A PortalOutlet for attaching portals to an arbitrary DOM element outside of the Angular
251 * application context.
252 */
253class DomPortalOutlet extends BasePortalOutlet {
254 /**
255 * @param outletElement Element into which the content is projected.
256 * @param _componentFactoryResolver Used to resolve the component factory.
257 * Only required when attaching component portals.
258 * @param _appRef Reference to the application. Only used in component portals when there
259 * is no `ViewContainerRef` available.
260 * @param _defaultInjector Injector to use as a fallback when the portal being attached doesn't
261 * have one. Only used for component portals.
262 * @param _document Reference to the document. Used when attaching a DOM portal. Will eventually
263 * become a required parameter.
264 */
265 constructor(
266 /** Element into which the content is projected. */
267 outletElement, _componentFactoryResolver, _appRef, _defaultInjector,
268 /**
269 * @deprecated `_document` Parameter to be made required.
270 * @breaking-change 10.0.0
271 */
272 _document) {
273 super();
274 this.outletElement = outletElement;
275 this._componentFactoryResolver = _componentFactoryResolver;
276 this._appRef = _appRef;
277 this._defaultInjector = _defaultInjector;
278 /**
279 * Attaches a DOM portal by transferring its content into the outlet.
280 * @param portal Portal to be attached.
281 * @deprecated To be turned into a method.
282 * @breaking-change 10.0.0
283 */
284 this.attachDomPortal = (portal) => {
285 // @breaking-change 10.0.0 Remove check and error once the
286 // `_document` constructor parameter is required.
287 if (!this._document && (typeof ngDevMode === 'undefined' || ngDevMode)) {
288 throw Error('Cannot attach DOM portal without _document constructor parameter');
289 }
290 const element = portal.element;
291 if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {
292 throw Error('DOM portal content must be attached to a parent node.');
293 }
294 // Anchor used to save the element's previous position so
295 // that we can restore it when the portal is detached.
296 const anchorNode = this._document.createComment('dom-portal');
297 element.parentNode.insertBefore(anchorNode, element);
298 this.outletElement.appendChild(element);
299 this._attachedPortal = portal;
300 super.setDisposeFn(() => {
301 // We can't use `replaceWith` here because IE doesn't support it.
302 if (anchorNode.parentNode) {
303 anchorNode.parentNode.replaceChild(element, anchorNode);
304 }
305 });
306 };
307 this._document = _document;
308 }
309 /**
310 * Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver.
311 * @param portal Portal to be attached
312 * @returns Reference to the created component.
313 */
314 attachComponentPortal(portal) {
315 const resolver = (portal.componentFactoryResolver || this._componentFactoryResolver);
316 if ((typeof ngDevMode === 'undefined' || ngDevMode) && !resolver) {
317 throw Error('Cannot attach component portal to outlet without a ComponentFactoryResolver.');
318 }
319 const componentFactory = resolver.resolveComponentFactory(portal.component);
320 let componentRef;
321 // If the portal specifies a ViewContainerRef, we will use that as the attachment point
322 // for the component (in terms of Angular's component tree, not rendering).
323 // When the ViewContainerRef is missing, we use the factory to create the component directly
324 // and then manually attach the view to the application.
325 if (portal.viewContainerRef) {
326 componentRef = portal.viewContainerRef.createComponent(componentFactory, portal.viewContainerRef.length, portal.injector || portal.viewContainerRef.injector);
327 this.setDisposeFn(() => componentRef.destroy());
328 }
329 else {
330 if ((typeof ngDevMode === 'undefined' || ngDevMode) && !this._appRef) {
331 throw Error('Cannot attach component portal to outlet without an ApplicationRef.');
332 }
333 componentRef = componentFactory.create(portal.injector || this._defaultInjector || Injector.NULL);
334 this._appRef.attachView(componentRef.hostView);
335 this.setDisposeFn(() => {
336 // Verify that the ApplicationRef has registered views before trying to detach a host view.
337 // This check also protects the `detachView` from being called on a destroyed ApplicationRef.
338 if (this._appRef.viewCount > 0) {
339 this._appRef.detachView(componentRef.hostView);
340 }
341 componentRef.destroy();
342 });
343 }
344 // At this point the component has been instantiated, so we move it to the location in the DOM
345 // where we want it to be rendered.
346 this.outletElement.appendChild(this._getComponentRootNode(componentRef));
347 this._attachedPortal = portal;
348 return componentRef;
349 }
350 /**
351 * Attaches a template portal to the DOM as an embedded view.
352 * @param portal Portal to be attached.
353 * @returns Reference to the created embedded view.
354 */
355 attachTemplatePortal(portal) {
356 let viewContainer = portal.viewContainerRef;
357 let viewRef = viewContainer.createEmbeddedView(portal.templateRef, portal.context, {
358 injector: portal.injector,
359 });
360 // The method `createEmbeddedView` will add the view as a child of the viewContainer.
361 // But for the DomPortalOutlet the view can be added everywhere in the DOM
362 // (e.g Overlay Container) To move the view to the specified host element. We just
363 // re-append the existing root nodes.
364 viewRef.rootNodes.forEach(rootNode => this.outletElement.appendChild(rootNode));
365 // Note that we want to detect changes after the nodes have been moved so that
366 // any directives inside the portal that are looking at the DOM inside a lifecycle
367 // hook won't be invoked too early.
368 viewRef.detectChanges();
369 this.setDisposeFn(() => {
370 let index = viewContainer.indexOf(viewRef);
371 if (index !== -1) {
372 viewContainer.remove(index);
373 }
374 });
375 this._attachedPortal = portal;
376 // TODO(jelbourn): Return locals from view.
377 return viewRef;
378 }
379 /**
380 * Clears out a portal from the DOM.
381 */
382 dispose() {
383 super.dispose();
384 this.outletElement.remove();
385 }
386 /** Gets the root HTMLElement for an instantiated component. */
387 _getComponentRootNode(componentRef) {
388 return componentRef.hostView.rootNodes[0];
389 }
390}
391/**
392 * @deprecated Use `DomPortalOutlet` instead.
393 * @breaking-change 9.0.0
394 */
395class DomPortalHost extends DomPortalOutlet {
396}
397
398/**
399 * @license
400 * Copyright Google LLC All Rights Reserved.
401 *
402 * Use of this source code is governed by an MIT-style license that can be
403 * found in the LICENSE file at https://angular.io/license
404 */
405/**
406 * Directive version of a `TemplatePortal`. Because the directive *is* a TemplatePortal,
407 * the directive instance itself can be attached to a host, enabling declarative use of portals.
408 */
409class CdkPortal extends TemplatePortal {
410 constructor(templateRef, viewContainerRef) {
411 super(templateRef, viewContainerRef);
412 }
413}
414CdkPortal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: CdkPortal, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
415CdkPortal.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.1", type: CdkPortal, selector: "[cdkPortal]", exportAs: ["cdkPortal"], usesInheritance: true, ngImport: i0 });
416i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: CdkPortal, decorators: [{
417 type: Directive,
418 args: [{
419 selector: '[cdkPortal]',
420 exportAs: 'cdkPortal',
421 }]
422 }], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }]; } });
423/**
424 * @deprecated Use `CdkPortal` instead.
425 * @breaking-change 9.0.0
426 */
427class TemplatePortalDirective extends CdkPortal {
428}
429TemplatePortalDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: TemplatePortalDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
430TemplatePortalDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.1", type: TemplatePortalDirective, selector: "[cdk-portal], [portal]", providers: [
431 {
432 provide: CdkPortal,
433 useExisting: TemplatePortalDirective,
434 },
435 ], exportAs: ["cdkPortal"], usesInheritance: true, ngImport: i0 });
436i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: TemplatePortalDirective, decorators: [{
437 type: Directive,
438 args: [{
439 selector: '[cdk-portal], [portal]',
440 exportAs: 'cdkPortal',
441 providers: [
442 {
443 provide: CdkPortal,
444 useExisting: TemplatePortalDirective,
445 },
446 ],
447 }]
448 }] });
449/**
450 * Directive version of a PortalOutlet. Because the directive *is* a PortalOutlet, portals can be
451 * directly attached to it, enabling declarative use.
452 *
453 * Usage:
454 * `<ng-template [cdkPortalOutlet]="greeting"></ng-template>`
455 */
456class CdkPortalOutlet extends BasePortalOutlet {
457 constructor(_componentFactoryResolver, _viewContainerRef,
458 /**
459 * @deprecated `_document` parameter to be made required.
460 * @breaking-change 9.0.0
461 */
462 _document) {
463 super();
464 this._componentFactoryResolver = _componentFactoryResolver;
465 this._viewContainerRef = _viewContainerRef;
466 /** Whether the portal component is initialized. */
467 this._isInitialized = false;
468 /** Emits when a portal is attached to the outlet. */
469 this.attached = new EventEmitter();
470 /**
471 * Attaches the given DomPortal to this PortalHost by moving all of the portal content into it.
472 * @param portal Portal to be attached.
473 * @deprecated To be turned into a method.
474 * @breaking-change 10.0.0
475 */
476 this.attachDomPortal = (portal) => {
477 // @breaking-change 9.0.0 Remove check and error once the
478 // `_document` constructor parameter is required.
479 if (!this._document && (typeof ngDevMode === 'undefined' || ngDevMode)) {
480 throw Error('Cannot attach DOM portal without _document constructor parameter');
481 }
482 const element = portal.element;
483 if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {
484 throw Error('DOM portal content must be attached to a parent node.');
485 }
486 // Anchor used to save the element's previous position so
487 // that we can restore it when the portal is detached.
488 const anchorNode = this._document.createComment('dom-portal');
489 portal.setAttachedHost(this);
490 element.parentNode.insertBefore(anchorNode, element);
491 this._getRootNode().appendChild(element);
492 this._attachedPortal = portal;
493 super.setDisposeFn(() => {
494 if (anchorNode.parentNode) {
495 anchorNode.parentNode.replaceChild(element, anchorNode);
496 }
497 });
498 };
499 this._document = _document;
500 }
501 /** Portal associated with the Portal outlet. */
502 get portal() {
503 return this._attachedPortal;
504 }
505 set portal(portal) {
506 // Ignore the cases where the `portal` is set to a falsy value before the lifecycle hooks have
507 // run. This handles the cases where the user might do something like `<div cdkPortalOutlet>`
508 // and attach a portal programmatically in the parent component. When Angular does the first CD
509 // round, it will fire the setter with empty string, causing the user's content to be cleared.
510 if (this.hasAttached() && !portal && !this._isInitialized) {
511 return;
512 }
513 if (this.hasAttached()) {
514 super.detach();
515 }
516 if (portal) {
517 super.attach(portal);
518 }
519 this._attachedPortal = portal || null;
520 }
521 /** Component or view reference that is attached to the portal. */
522 get attachedRef() {
523 return this._attachedRef;
524 }
525 ngOnInit() {
526 this._isInitialized = true;
527 }
528 ngOnDestroy() {
529 super.dispose();
530 this._attachedPortal = null;
531 this._attachedRef = null;
532 }
533 /**
534 * Attach the given ComponentPortal to this PortalOutlet using the ComponentFactoryResolver.
535 *
536 * @param portal Portal to be attached to the portal outlet.
537 * @returns Reference to the created component.
538 */
539 attachComponentPortal(portal) {
540 portal.setAttachedHost(this);
541 // If the portal specifies an origin, use that as the logical location of the component
542 // in the application tree. Otherwise use the location of this PortalOutlet.
543 const viewContainerRef = portal.viewContainerRef != null ? portal.viewContainerRef : this._viewContainerRef;
544 const resolver = portal.componentFactoryResolver || this._componentFactoryResolver;
545 const componentFactory = resolver.resolveComponentFactory(portal.component);
546 const ref = viewContainerRef.createComponent(componentFactory, viewContainerRef.length, portal.injector || viewContainerRef.injector);
547 // If we're using a view container that's different from the injected one (e.g. when the portal
548 // specifies its own) we need to move the component into the outlet, otherwise it'll be rendered
549 // inside of the alternate view container.
550 if (viewContainerRef !== this._viewContainerRef) {
551 this._getRootNode().appendChild(ref.hostView.rootNodes[0]);
552 }
553 super.setDisposeFn(() => ref.destroy());
554 this._attachedPortal = portal;
555 this._attachedRef = ref;
556 this.attached.emit(ref);
557 return ref;
558 }
559 /**
560 * Attach the given TemplatePortal to this PortalHost as an embedded View.
561 * @param portal Portal to be attached.
562 * @returns Reference to the created embedded view.
563 */
564 attachTemplatePortal(portal) {
565 portal.setAttachedHost(this);
566 const viewRef = this._viewContainerRef.createEmbeddedView(portal.templateRef, portal.context, {
567 injector: portal.injector,
568 });
569 super.setDisposeFn(() => this._viewContainerRef.clear());
570 this._attachedPortal = portal;
571 this._attachedRef = viewRef;
572 this.attached.emit(viewRef);
573 return viewRef;
574 }
575 /** Gets the root node of the portal outlet. */
576 _getRootNode() {
577 const nativeElement = this._viewContainerRef.element.nativeElement;
578 // The directive could be set on a template which will result in a comment
579 // node being the root. Use the comment's parent node if that is the case.
580 return (nativeElement.nodeType === nativeElement.ELEMENT_NODE
581 ? nativeElement
582 : nativeElement.parentNode);
583 }
584}
585CdkPortalOutlet.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: CdkPortalOutlet, deps: [{ token: i0.ComponentFactoryResolver }, { token: i0.ViewContainerRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive });
586CdkPortalOutlet.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.1", type: CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: { portal: ["cdkPortalOutlet", "portal"] }, outputs: { attached: "attached" }, exportAs: ["cdkPortalOutlet"], usesInheritance: true, ngImport: i0 });
587i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: CdkPortalOutlet, decorators: [{
588 type: Directive,
589 args: [{
590 selector: '[cdkPortalOutlet]',
591 exportAs: 'cdkPortalOutlet',
592 inputs: ['portal: cdkPortalOutlet'],
593 }]
594 }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{
595 type: Inject,
596 args: [DOCUMENT]
597 }] }]; }, propDecorators: { attached: [{
598 type: Output
599 }] } });
600/**
601 * @deprecated Use `CdkPortalOutlet` instead.
602 * @breaking-change 9.0.0
603 */
604class PortalHostDirective extends CdkPortalOutlet {
605}
606PortalHostDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: PortalHostDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
607PortalHostDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.1", type: PortalHostDirective, selector: "[cdkPortalHost], [portalHost]", inputs: { portal: ["cdkPortalHost", "portal"] }, providers: [
608 {
609 provide: CdkPortalOutlet,
610 useExisting: PortalHostDirective,
611 },
612 ], exportAs: ["cdkPortalHost"], usesInheritance: true, ngImport: i0 });
613i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: PortalHostDirective, decorators: [{
614 type: Directive,
615 args: [{
616 selector: '[cdkPortalHost], [portalHost]',
617 exportAs: 'cdkPortalHost',
618 inputs: ['portal: cdkPortalHost'],
619 providers: [
620 {
621 provide: CdkPortalOutlet,
622 useExisting: PortalHostDirective,
623 },
624 ],
625 }]
626 }] });
627class PortalModule {
628}
629PortalModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: PortalModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
630PortalModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.1", ngImport: i0, type: PortalModule, declarations: [CdkPortal, CdkPortalOutlet, TemplatePortalDirective, PortalHostDirective], exports: [CdkPortal, CdkPortalOutlet, TemplatePortalDirective, PortalHostDirective] });
631PortalModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: PortalModule });
632i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: PortalModule, decorators: [{
633 type: NgModule,
634 args: [{
635 exports: [CdkPortal, CdkPortalOutlet, TemplatePortalDirective, PortalHostDirective],
636 declarations: [CdkPortal, CdkPortalOutlet, TemplatePortalDirective, PortalHostDirective],
637 }]
638 }] });
639
640/**
641 * @license
642 * Copyright Google LLC All Rights Reserved.
643 *
644 * Use of this source code is governed by an MIT-style license that can be
645 * found in the LICENSE file at https://angular.io/license
646 */
647/**
648 * Custom injector to be used when providing custom
649 * injection tokens to components inside a portal.
650 * @docs-private
651 * @deprecated Use `Injector.create` instead.
652 * @breaking-change 11.0.0
653 */
654class PortalInjector {
655 constructor(_parentInjector, _customTokens) {
656 this._parentInjector = _parentInjector;
657 this._customTokens = _customTokens;
658 }
659 get(token, notFoundValue) {
660 const value = this._customTokens.get(token);
661 if (typeof value !== 'undefined') {
662 return value;
663 }
664 return this._parentInjector.get(token, notFoundValue);
665 }
666}
667
668/**
669 * @license
670 * Copyright Google LLC All Rights Reserved.
671 *
672 * Use of this source code is governed by an MIT-style license that can be
673 * found in the LICENSE file at https://angular.io/license
674 */
675
676/**
677 * @license
678 * Copyright Google LLC All Rights Reserved.
679 *
680 * Use of this source code is governed by an MIT-style license that can be
681 * found in the LICENSE file at https://angular.io/license
682 */
683
684/**
685 * Generated bundle index. Do not edit.
686 */
687
688export { BasePortalHost, BasePortalOutlet, CdkPortal, CdkPortalOutlet, ComponentPortal, DomPortal, DomPortalHost, DomPortalOutlet, Portal, PortalHostDirective, PortalInjector, PortalModule, TemplatePortal, TemplatePortalDirective };
689//# sourceMappingURL=portal.mjs.map