@ethlete/core 0.2.0-next.7 → 0.2.0-next.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,4 +9,5 @@ export * from './repeat/public-api';
9
9
  export * from './scroll-observer-first-element/public-api';
10
10
  export * from './scroll-observer-ignore-target/public-api';
11
11
  export * from './scroll-observer-last-element/public-api';
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL2RpcmVjdGl2ZXMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLG1DQUFtQyxDQUFDO0FBQ2xELGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMsMkNBQTJDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NsaWNrLW91dHNpZGUvcHVibGljLWFwaSc7XG5leHBvcnQgKiBmcm9tICcuL2N1cnNvci1kcmFnLXNjcm9sbC9wdWJsaWMtYXBpJztcbmV4cG9ydCAqIGZyb20gJy4vZGVzdHJveS9wdWJsaWMtYXBpJztcbmV4cG9ydCAqIGZyb20gJy4vbGV0L3B1YmxpYy1hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9vYnNlcnZlLWNvbnRlbnQvcHVibGljLWFwaSc7XG5leHBvcnQgKiBmcm9tICcuL29ic2VydmUtcmVzaXplL3B1YmxpYy1hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9vYnNlcnZlLXNjcm9sbC1zdGF0ZS9wdWJsaWMtYXBpJztcbmV4cG9ydCAqIGZyb20gJy4vcmVwZWF0L3B1YmxpYy1hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9zY3JvbGwtb2JzZXJ2ZXItZmlyc3QtZWxlbWVudC9wdWJsaWMtYXBpJztcbmV4cG9ydCAqIGZyb20gJy4vc2Nyb2xsLW9ic2VydmVyLWlnbm9yZS10YXJnZXQvcHVibGljLWFwaSc7XG5leHBvcnQgKiBmcm9tICcuL3Njcm9sbC1vYnNlcnZlci1sYXN0LWVsZW1lbnQvcHVibGljLWFwaSc7XG4iXX0=
12
+ export * from './seo/public-api';
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL2RpcmVjdGl2ZXMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLG1DQUFtQyxDQUFDO0FBQ2xELGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMsMkNBQTJDLENBQUM7QUFDMUQsY0FBYyxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY2xpY2stb3V0c2lkZS9wdWJsaWMtYXBpJztcbmV4cG9ydCAqIGZyb20gJy4vY3Vyc29yLWRyYWctc2Nyb2xsL3B1YmxpYy1hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9kZXN0cm95L3B1YmxpYy1hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9sZXQvcHVibGljLWFwaSc7XG5leHBvcnQgKiBmcm9tICcuL29ic2VydmUtY29udGVudC9wdWJsaWMtYXBpJztcbmV4cG9ydCAqIGZyb20gJy4vb2JzZXJ2ZS1yZXNpemUvcHVibGljLWFwaSc7XG5leHBvcnQgKiBmcm9tICcuL29ic2VydmUtc2Nyb2xsLXN0YXRlL3B1YmxpYy1hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9yZXBlYXQvcHVibGljLWFwaSc7XG5leHBvcnQgKiBmcm9tICcuL3Njcm9sbC1vYnNlcnZlci1maXJzdC1lbGVtZW50L3B1YmxpYy1hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9zY3JvbGwtb2JzZXJ2ZXItaWdub3JlLXRhcmdldC9wdWJsaWMtYXBpJztcbmV4cG9ydCAqIGZyb20gJy4vc2Nyb2xsLW9ic2VydmVyLWxhc3QtZWxlbWVudC9wdWJsaWMtYXBpJztcbmV4cG9ydCAqIGZyb20gJy4vc2VvL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,5 @@
1
+ export * from './seo.directive';
2
+ export * from './seo.directive.constants';
3
+ export * from './seo.directive.types';
4
+ export * from './seo.directive.utils';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL2RpcmVjdGl2ZXMvc2VvL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc2VvLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3Nlby5kaXJlY3RpdmUuY29uc3RhbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vc2VvLmRpcmVjdGl2ZS50eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3Nlby5kaXJlY3RpdmUudXRpbHMnO1xuIl19
@@ -0,0 +1,3 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export const SEO_DIRECTIVE_TOKEN = new InjectionToken('SEO_DIRECTIVE_TOKEN');
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLmRpcmVjdGl2ZS5jb25zdGFudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9kaXJlY3RpdmVzL3Nlby9zZW8uZGlyZWN0aXZlLmNvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9DLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksY0FBYyxDQUFlLHFCQUFxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2VvRGlyZWN0aXZlIH0gZnJvbSAnLi9zZW8uZGlyZWN0aXZlJztcblxuZXhwb3J0IGNvbnN0IFNFT19ESVJFQ1RJVkVfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW48U2VvRGlyZWN0aXZlPignU0VPX0RJUkVDVElWRV9UT0tFTicpO1xuIl19
@@ -0,0 +1,162 @@
1
+ import { Directive, inject } from '@angular/core';
2
+ import { Meta, Title } from '@angular/platform-browser';
3
+ import { Observable, Subject, takeUntil } from 'rxjs';
4
+ import { SEO_DIRECTIVE_TOKEN } from './seo.directive.constants';
5
+ import { mergeSeoConfig } from './seo.directive.utils';
6
+ import * as i0 from "@angular/core";
7
+ export class SeoDirective {
8
+ constructor() {
9
+ this._metaService = inject(Meta);
10
+ this._titleService = inject(Title);
11
+ this._onDeactivate$ = new Subject();
12
+ this._isDeactivated = false;
13
+ this.parent = inject(SEO_DIRECTIVE_TOKEN, { optional: true, skipSelf: true });
14
+ this._config = {};
15
+ }
16
+ get config() {
17
+ return this._config;
18
+ }
19
+ ngOnInit() {
20
+ this.parent?._deactivate();
21
+ }
22
+ ngOnDestroy() {
23
+ this._deactivate();
24
+ this._cleanUp();
25
+ this.parent?._activate();
26
+ }
27
+ updateConfig(config) {
28
+ this._config = mergeSeoConfig(config, this.parent?.config || {});
29
+ if (this._isDeactivated) {
30
+ return;
31
+ }
32
+ this._deactivate();
33
+ this._activate();
34
+ }
35
+ _activate() {
36
+ this._onDeactivate$.next(false);
37
+ this._isDeactivated = false;
38
+ for (const [key, value] of Object.entries(this._config)) {
39
+ if (value instanceof Observable) {
40
+ value.pipe(takeUntil(this._onDeactivate$)).subscribe((value) => this._update(key, value));
41
+ }
42
+ else if (Array.isArray(value)) {
43
+ value.forEach((value) => {
44
+ if (value instanceof Observable) {
45
+ value.pipe(takeUntil(this._onDeactivate$)).subscribe((value) => this._update(key, value));
46
+ }
47
+ else {
48
+ this._update(key, value);
49
+ }
50
+ });
51
+ }
52
+ else if (typeof value === 'object' && value !== null) {
53
+ for (const [subKey, subValue] of Object.entries(value)) {
54
+ if (subValue instanceof Observable) {
55
+ subValue.pipe(takeUntil(this._onDeactivate$)).subscribe((value) => this._update(`${key}:${subKey}`, value));
56
+ }
57
+ else {
58
+ this._update(`${key}:${subKey}`, subValue);
59
+ }
60
+ }
61
+ }
62
+ else {
63
+ this._update(key, value);
64
+ }
65
+ }
66
+ }
67
+ _deactivate() {
68
+ this._onDeactivate$.next(true);
69
+ this._isDeactivated = true;
70
+ }
71
+ _update(key, value) {
72
+ switch (key) {
73
+ case 'title':
74
+ if (value && typeof value === 'string') {
75
+ this._titleService.setTitle(value);
76
+ }
77
+ break;
78
+ case 'canonical':
79
+ {
80
+ const link = document.querySelector(`link[rel="${key}"]`);
81
+ if (link) {
82
+ link.setAttribute('href', value);
83
+ }
84
+ else {
85
+ const newLink = document.createElement('link');
86
+ newLink.setAttribute('rel', key);
87
+ newLink.setAttribute('href', value);
88
+ document.head.appendChild(newLink);
89
+ }
90
+ }
91
+ break;
92
+ case 'alternate':
93
+ {
94
+ const link = document.querySelector(`link[rel="${key}"][hreflang="${value.hreflang}"]`);
95
+ if (link) {
96
+ link.setAttribute('href', value.href);
97
+ }
98
+ else {
99
+ const newLink = document.createElement('link');
100
+ newLink.setAttribute('rel', key);
101
+ newLink.setAttribute('hreflang', value.hreflang);
102
+ newLink.setAttribute('href', value.href);
103
+ document.head.appendChild(newLink);
104
+ }
105
+ }
106
+ break;
107
+ default:
108
+ if (value !== undefined && value !== null) {
109
+ const val = Array.isArray(value) ? value.join(', ') : value;
110
+ this._metaService.updateTag({ name: key, content: val });
111
+ }
112
+ else {
113
+ this._metaService.removeTag(`name="${key}"`);
114
+ }
115
+ break;
116
+ }
117
+ }
118
+ _cleanUp() {
119
+ for (const key in this._config) {
120
+ if (key === 'alternate') {
121
+ const links = document.querySelectorAll(`link[rel="${key}"]`);
122
+ links.forEach((link) => {
123
+ link.remove();
124
+ });
125
+ continue;
126
+ }
127
+ if (key === 'canonical') {
128
+ const link = document.querySelector(`link[rel="${key}"]`);
129
+ if (link) {
130
+ link.remove();
131
+ }
132
+ continue;
133
+ }
134
+ if (typeof this._config[key] === 'object' &&
135
+ this._config[key] !== null &&
136
+ !(this._config[key] instanceof Observable)) {
137
+ for (const subKey in this._config[key]) {
138
+ const parentValue = this.parent?.config?.[key]?.[subKey];
139
+ if (parentValue === undefined) {
140
+ this._update(`${key}:${subKey}`, undefined);
141
+ }
142
+ }
143
+ }
144
+ else {
145
+ const parentValue = this.parent?.config?.[key];
146
+ if (parentValue === undefined) {
147
+ this._update(key, null);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ }
153
+ SeoDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: SeoDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
154
+ SeoDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.0", type: SeoDirective, isStandalone: true, providers: [{ provide: SEO_DIRECTIVE_TOKEN, useExisting: SeoDirective }], ngImport: i0 });
155
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: SeoDirective, decorators: [{
156
+ type: Directive,
157
+ args: [{
158
+ standalone: true,
159
+ providers: [{ provide: SEO_DIRECTIVE_TOKEN, useExisting: SeoDirective }],
160
+ }]
161
+ }] });
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL2RpcmVjdGl2ZXMvc2VvL3Nlby5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7QUFNdkQsTUFBTSxPQUFPLFlBQVk7SUFKekI7UUFLbUIsaUJBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsa0JBQWEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBRWpELG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRXRCLFdBQU0sR0FBRyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBSzFFLFlBQU8sR0FBYyxFQUFFLENBQUM7S0EwSmpDO0lBN0pDLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBR0QsUUFBUTtRQUNOLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsRUFB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RGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNZXRhLCBUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTRU9fRElSRUNUSVZFX1RPS0VOIH0gZnJvbSAnLi9zZW8uZGlyZWN0aXZlLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBBbHRlcm5hdGVMaW5rLCBTZW9Db25maWcgfSBmcm9tICcuL3Nlby5kaXJlY3RpdmUudHlwZXMnO1xuaW1wb3J0IHsgbWVyZ2VTZW9Db25maWcgfSBmcm9tICcuL3Nlby5kaXJlY3RpdmUudXRpbHMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBTRU9fRElSRUNUSVZFX1RPS0VOLCB1c2VFeGlzdGluZzogU2VvRGlyZWN0aXZlIH1dLFxufSlcbmV4cG9ydCBjbGFzcyBTZW9EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21ldGFTZXJ2aWNlID0gaW5qZWN0KE1ldGEpO1xuICBwcml2YXRlIHJlYWRvbmx5IF90aXRsZVNlcnZpY2UgPSBpbmplY3QoVGl0bGUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlYWN0aXZhdGUkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICBwcml2YXRlIF9pc0RlYWN0aXZhdGVkID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgcGFyZW50ID0gaW5qZWN0KFNFT19ESVJFQ1RJVkVfVE9LRU4sIHsgb3B0aW9uYWw6IHRydWUsIHNraXBTZWxmOiB0cnVlIH0pO1xuXG4gIGdldCBjb25maWcoKTogU2VvQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG4gIHByaXZhdGUgX2NvbmZpZzogU2VvQ29uZmlnID0ge307XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnQ/Ll9kZWFjdGl2YXRlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZWFjdGl2YXRlKCk7XG4gICAgdGhpcy5fY2xlYW5VcCgpO1xuICAgIHRoaXMucGFyZW50Py5fYWN0aXZhdGUoKTtcbiAgfVxuXG4gIHVwZGF0ZUNvbmZpZyhjb25maWc6IFNlb0NvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IG1lcmdlU2VvQ29uZmlnKGNvbmZpZywgdGhpcy5wYXJlbnQ/LmNvbmZpZyB8fCB7fSk7XG5cbiAgICBpZiAodGhpcy5faXNEZWFjdGl2YXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2RlYWN0aXZhdGUoKTtcbiAgICB0aGlzLl9hY3RpdmF0ZSgpO1xuICB9XG5cbiAgX2FjdGl2YXRlKCkge1xuICAgIHRoaXMuX29uRGVhY3RpdmF0ZSQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5faXNEZWFjdGl2YXRlZCA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fY29uZmlnKSkge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICB2YWx1ZS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlYWN0aXZhdGUkKSkuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy5fdXBkYXRlKGtleSwgdmFsdWUpKTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICB2YWx1ZS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlYWN0aXZhdGUkKSkuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy5fdXBkYXRlKGtleSwgdmFsdWUpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKGtleSwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgZm9yIChjb25zdCBbc3ViS2V5LCBzdWJWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgaWYgKHN1YlZhbHVlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgc3ViVmFsdWUucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZWFjdGl2YXRlJCkpLnN1YnNjcmliZSgodmFsdWUpID0+IHRoaXMuX3VwZGF0ZShgJHtrZXl9OiR7c3ViS2V5fWAsIHZhbHVlKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZShgJHtrZXl9OiR7c3ViS2V5fWAsIHN1YlZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZShrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfZGVhY3RpdmF0ZSgpIHtcbiAgICB0aGlzLl9vbkRlYWN0aXZhdGUkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5faXNEZWFjdGl2YXRlZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ3RpdGxlJzpcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLl90aXRsZVNlcnZpY2Uuc2V0VGl0bGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdjYW5vbmljYWwnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGxpbmtbcmVsPVwiJHtrZXl9XCJdYCk7XG5cbiAgICAgICAgICBpZiAobGluaykge1xuICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB2YWx1ZSBhcyBzdHJpbmcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXdMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgICAgbmV3TGluay5zZXRBdHRyaWJ1dGUoJ3JlbCcsIGtleSk7XG4gICAgICAgICAgICBuZXdMaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIHZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKG5ld0xpbmspO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhbHRlcm5hdGUnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGxpbmtbcmVsPVwiJHtrZXl9XCJdW2hyZWZsYW5nPVwiJHsodmFsdWUgYXMgQWx0ZXJuYXRlTGluaykuaHJlZmxhbmd9XCJdYCk7XG5cbiAgICAgICAgICBpZiAobGluaykge1xuICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAodmFsdWUgYXMgQWx0ZXJuYXRlTGluaykuaHJlZik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0xpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICBuZXdMaW5rLnNldEF0dHJpYnV0ZSgncmVsJywga2V5KTtcbiAgICAgICAgICAgIG5ld0xpbmsuc2V0QXR0cmlidXRlKCdocmVmbGFuZycsICh2YWx1ZSBhcyBBbHRlcm5hdGVMaW5rKS5ocmVmbGFuZyk7XG4gICAgICAgICAgICBuZXdMaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsICh2YWx1ZSBhcyBBbHRlcm5hdGVMaW5rKS5ocmVmKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobmV3TGluayk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgdmFsID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5qb2luKCcsICcpIDogKHZhbHVlIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICB0aGlzLl9tZXRhU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiBrZXksIGNvbnRlbnQ6IHZhbCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9tZXRhU2VydmljZS5yZW1vdmVUYWcoYG5hbWU9XCIke2tleX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFuVXAoKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5fY29uZmlnKSB7XG4gICAgICBpZiAoa2V5ID09PSAnYWx0ZXJuYXRlJykge1xuICAgICAgICBjb25zdCBsaW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYGxpbmtbcmVsPVwiJHtrZXl9XCJdYCk7XG5cbiAgICAgICAgbGlua3MuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgICAgIGxpbmsucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoa2V5ID09PSAnY2Fub25pY2FsJykge1xuICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgbGlua1tyZWw9XCIke2tleX1cIl1gKTtcblxuICAgICAgICBpZiAobGluaykge1xuICAgICAgICAgIGxpbmsucmVtb3ZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgdGhpcy5fY29uZmlnW2tleV0gPT09ICdvYmplY3QnICYmXG4gICAgICAgIHRoaXMuX2NvbmZpZ1trZXldICE9PSBudWxsICYmXG4gICAgICAgICEodGhpcy5fY29uZmlnW2tleV0gaW5zdGFuY2VvZiBPYnNlcnZhYmxlKVxuICAgICAgKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc3ViS2V5IGluIHRoaXMuX2NvbmZpZ1trZXldIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50VmFsdWUgPVxuICAgICAgICAgICAgdGhpcy5wYXJlbnQ/LmNvbmZpZz8uW2tleSBhcyBrZXlvZiBTZW9Db25maWddPy5bc3ViS2V5IGFzIGtleW9mIFNlb0NvbmZpZ1trZXlvZiBTZW9Db25maWddXTtcblxuICAgICAgICAgIGlmIChwYXJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoYCR7a2V5fToke3N1YktleX1gLCB1bmRlZmluZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGFyZW50VmFsdWUgPSB0aGlzLnBhcmVudD8uY29uZmlnPy5ba2V5IGFzIGtleW9mIFNlb0NvbmZpZ107XG5cbiAgICAgICAgaWYgKHBhcmVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl91cGRhdGUoa2V5LCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLmRpcmVjdGl2ZS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL2RpcmVjdGl2ZXMvc2VvL3Nlby5kaXJlY3RpdmUudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IHR5cGUgTWF5YmVPYnNlcnZhYmxlPFQ+ID0gVCB8IE9ic2VydmFibGU8VD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VvQ29uZmlnIHtcbiAgdGl0bGU/OiBNYXliZU9ic2VydmFibGU8c3RyaW5nPjtcbiAgZGVzY3JpcHRpb24/OiBNYXliZU9ic2VydmFibGU8c3RyaW5nPjtcbiAga2V5d29yZHM/OiBNYXliZU9ic2VydmFibGU8c3RyaW5nW10+O1xuICBpY29uPzogTWF5YmVPYnNlcnZhYmxlPHN0cmluZz47XG4gIHRoZW1lQ29sb3I/OiBNYXliZU9ic2VydmFibGU8c3RyaW5nPjtcbiAgY29sb3JTY2hlbWU/OiBNYXliZU9ic2VydmFibGU8J2xpZ2h0JyB8ICdkYXJrJz47XG4gIHJvYm90cz86IE1heWJlT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBjYW5vbmljYWw/OiBNYXliZU9ic2VydmFibGU8c3RyaW5nPjtcbiAgYWx0ZXJuYXRlPzogTWF5YmVPYnNlcnZhYmxlPEFsdGVybmF0ZUxpbms+W107XG4gIG9nPzogTWF5YmVPYnNlcnZhYmxlPE9wZW5HcmFwaD47XG4gIHR3aXR0ZXI/OiBNYXliZU9ic2VydmFibGU8VHdpdHRlckNhcmQ+O1xuICBmYWNlYm9vaz86IE1heWJlT2JzZXJ2YWJsZTxGYWNlYm9va0NhcmQ+O1xuXG4gIFtrZXk6IHN0cmluZ106IE1heWJlT2JzZXJ2YWJsZTx1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBbHRlcm5hdGVMaW5rIHtcbiAgaHJlZjogc3RyaW5nO1xuICBocmVmbGFuZzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5HcmFwaCB7XG4gIHRpdGxlPzogTWF5YmVPYnNlcnZhYmxlPHN0cmluZz47XG4gIGRlc2NyaXB0aW9uPzogTWF5YmVPYnNlcnZhYmxlPHN0cmluZz47XG4gIHR5cGU/OiBNYXliZU9ic2VydmFibGU8c3RyaW5nPjtcbiAgdXJsPzogTWF5YmVPYnNlcnZhYmxlPHN0cmluZz47XG4gIGltYWdlPzogTWF5YmVPYnNlcnZhYmxlPHN0cmluZz47XG4gIHNpdGVOYW1lPzogTWF5YmVPYnNlcnZhYmxlPHN0cmluZz47XG4gIGxvY2FsZT86IE1heWJlT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBsb2NhbGVBbHRlcm5hdGU/OiBNYXliZU9ic2VydmFibGU8c3RyaW5nW10+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR3aXR0ZXJDYXJkIHtcbiAgY2FyZD86IE1heWJlT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBzaXRlPzogTWF5YmVPYnNlcnZhYmxlPHN0cmluZz47XG4gIGNyZWF0b3I/OiBNYXliZU9ic2VydmFibGU8c3RyaW5nPjtcbiAgdGl0bGU/OiBNYXliZU9ic2VydmFibGU8c3RyaW5nPjtcbiAgZGVzY3JpcHRpb24/OiBNYXliZU9ic2VydmFibGU8c3RyaW5nPjtcbiAgaW1hZ2U/OiBNYXliZU9ic2VydmFibGU8c3RyaW5nPjtcbiAgaW1hZ2VBbHQ/OiBNYXliZU9ic2VydmFibGU8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGYWNlYm9va0NhcmQge1xuICB0aXRsZT86IE1heWJlT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBkZXNjcmlwdGlvbj86IE1heWJlT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBpbWFnZT86IE1heWJlT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBpbWFnZUFsdD86IE1heWJlT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICB0eXBlPzogTWF5YmVPYnNlcnZhYmxlPHN0cmluZz47XG4gIHVybD86IE1heWJlT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBzaXRlTmFtZT86IE1heWJlT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBsb2NhbGU/OiBNYXliZU9ic2VydmFibGU8c3RyaW5nPjtcbiAgbG9jYWxlQWx0ZXJuYXRlPzogTWF5YmVPYnNlcnZhYmxlPHN0cmluZ1tdPjtcbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ export const mergeSeoConfig = (config, parentConfig) => {
2
+ return {
3
+ ...parentConfig,
4
+ ...config,
5
+ };
6
+ };
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLmRpcmVjdGl2ZS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL2RpcmVjdGl2ZXMvc2VvL3Nlby5kaXJlY3RpdmUudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsTUFBaUIsRUFBRSxZQUF1QixFQUFhLEVBQUU7SUFDdEYsT0FBTztRQUNMLEdBQUcsWUFBWTtRQUNmLEdBQUcsTUFBTTtLQUNWLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZW9Db25maWcgfSBmcm9tICcuL3Nlby5kaXJlY3RpdmUudHlwZXMnO1xuXG5leHBvcnQgY29uc3QgbWVyZ2VTZW9Db25maWcgPSAoY29uZmlnOiBTZW9Db25maWcsIHBhcmVudENvbmZpZzogU2VvQ29uZmlnKTogU2VvQ29uZmlnID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5wYXJlbnRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICB9O1xufTtcbiJdfQ==
@@ -6,6 +6,7 @@ import { DOCUMENT } from '@angular/common';
6
6
  import { __decorate, __metadata } from 'tslib';
7
7
  import * as i1 from '@angular/cdk/layout';
8
8
  import { debounceTime as debounceTime$1 } from 'rxjs/operators';
9
+ import { Meta, Title } from '@angular/platform-browser';
9
10
 
10
11
  const VIEWPORT_CONFIG = new InjectionToken('ViewportConfig');
11
12
  /**
@@ -1138,6 +1139,172 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImpor
1138
1139
  args: ['etRepeat']
1139
1140
  }] } });
1140
1141
 
1142
+ const SEO_DIRECTIVE_TOKEN = new InjectionToken('SEO_DIRECTIVE_TOKEN');
1143
+
1144
+ const mergeSeoConfig = (config, parentConfig) => {
1145
+ return Object.assign(Object.assign({}, parentConfig), config);
1146
+ };
1147
+
1148
+ class SeoDirective {
1149
+ constructor() {
1150
+ this._metaService = inject(Meta);
1151
+ this._titleService = inject(Title);
1152
+ this._onDeactivate$ = new Subject();
1153
+ this._isDeactivated = false;
1154
+ this.parent = inject(SEO_DIRECTIVE_TOKEN, { optional: true, skipSelf: true });
1155
+ this._config = {};
1156
+ }
1157
+ get config() {
1158
+ return this._config;
1159
+ }
1160
+ ngOnInit() {
1161
+ var _a;
1162
+ (_a = this.parent) === null || _a === void 0 ? void 0 : _a._deactivate();
1163
+ }
1164
+ ngOnDestroy() {
1165
+ var _a;
1166
+ this._deactivate();
1167
+ this._cleanUp();
1168
+ (_a = this.parent) === null || _a === void 0 ? void 0 : _a._activate();
1169
+ }
1170
+ updateConfig(config) {
1171
+ var _a;
1172
+ this._config = mergeSeoConfig(config, ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.config) || {});
1173
+ if (this._isDeactivated) {
1174
+ return;
1175
+ }
1176
+ this._deactivate();
1177
+ this._activate();
1178
+ }
1179
+ _activate() {
1180
+ this._onDeactivate$.next(false);
1181
+ this._isDeactivated = false;
1182
+ for (const [key, value] of Object.entries(this._config)) {
1183
+ if (value instanceof Observable) {
1184
+ value.pipe(takeUntil(this._onDeactivate$)).subscribe((value) => this._update(key, value));
1185
+ }
1186
+ else if (Array.isArray(value)) {
1187
+ value.forEach((value) => {
1188
+ if (value instanceof Observable) {
1189
+ value.pipe(takeUntil(this._onDeactivate$)).subscribe((value) => this._update(key, value));
1190
+ }
1191
+ else {
1192
+ this._update(key, value);
1193
+ }
1194
+ });
1195
+ }
1196
+ else if (typeof value === 'object' && value !== null) {
1197
+ for (const [subKey, subValue] of Object.entries(value)) {
1198
+ if (subValue instanceof Observable) {
1199
+ subValue.pipe(takeUntil(this._onDeactivate$)).subscribe((value) => this._update(`${key}:${subKey}`, value));
1200
+ }
1201
+ else {
1202
+ this._update(`${key}:${subKey}`, subValue);
1203
+ }
1204
+ }
1205
+ }
1206
+ else {
1207
+ this._update(key, value);
1208
+ }
1209
+ }
1210
+ }
1211
+ _deactivate() {
1212
+ this._onDeactivate$.next(true);
1213
+ this._isDeactivated = true;
1214
+ }
1215
+ _update(key, value) {
1216
+ switch (key) {
1217
+ case 'title':
1218
+ if (value && typeof value === 'string') {
1219
+ this._titleService.setTitle(value);
1220
+ }
1221
+ break;
1222
+ case 'canonical':
1223
+ {
1224
+ const link = document.querySelector(`link[rel="${key}"]`);
1225
+ if (link) {
1226
+ link.setAttribute('href', value);
1227
+ }
1228
+ else {
1229
+ const newLink = document.createElement('link');
1230
+ newLink.setAttribute('rel', key);
1231
+ newLink.setAttribute('href', value);
1232
+ document.head.appendChild(newLink);
1233
+ }
1234
+ }
1235
+ break;
1236
+ case 'alternate':
1237
+ {
1238
+ const link = document.querySelector(`link[rel="${key}"][hreflang="${value.hreflang}"]`);
1239
+ if (link) {
1240
+ link.setAttribute('href', value.href);
1241
+ }
1242
+ else {
1243
+ const newLink = document.createElement('link');
1244
+ newLink.setAttribute('rel', key);
1245
+ newLink.setAttribute('hreflang', value.hreflang);
1246
+ newLink.setAttribute('href', value.href);
1247
+ document.head.appendChild(newLink);
1248
+ }
1249
+ }
1250
+ break;
1251
+ default:
1252
+ if (value !== undefined && value !== null) {
1253
+ const val = Array.isArray(value) ? value.join(', ') : value;
1254
+ this._metaService.updateTag({ name: key, content: val });
1255
+ }
1256
+ else {
1257
+ this._metaService.removeTag(`name="${key}"`);
1258
+ }
1259
+ break;
1260
+ }
1261
+ }
1262
+ _cleanUp() {
1263
+ var _a, _b, _c, _d, _e;
1264
+ for (const key in this._config) {
1265
+ if (key === 'alternate') {
1266
+ const links = document.querySelectorAll(`link[rel="${key}"]`);
1267
+ links.forEach((link) => {
1268
+ link.remove();
1269
+ });
1270
+ continue;
1271
+ }
1272
+ if (key === 'canonical') {
1273
+ const link = document.querySelector(`link[rel="${key}"]`);
1274
+ if (link) {
1275
+ link.remove();
1276
+ }
1277
+ continue;
1278
+ }
1279
+ if (typeof this._config[key] === 'object' &&
1280
+ this._config[key] !== null &&
1281
+ !(this._config[key] instanceof Observable)) {
1282
+ for (const subKey in this._config[key]) {
1283
+ const parentValue = (_c = (_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b[key]) === null || _c === void 0 ? void 0 : _c[subKey];
1284
+ if (parentValue === undefined) {
1285
+ this._update(`${key}:${subKey}`, undefined);
1286
+ }
1287
+ }
1288
+ }
1289
+ else {
1290
+ const parentValue = (_e = (_d = this.parent) === null || _d === void 0 ? void 0 : _d.config) === null || _e === void 0 ? void 0 : _e[key];
1291
+ if (parentValue === undefined) {
1292
+ this._update(key, null);
1293
+ }
1294
+ }
1295
+ }
1296
+ }
1297
+ }
1298
+ SeoDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: SeoDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1299
+ SeoDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.0", type: SeoDirective, isStandalone: true, providers: [{ provide: SEO_DIRECTIVE_TOKEN, useExisting: SeoDirective }], ngImport: i0 });
1300
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: SeoDirective, decorators: [{
1301
+ type: Directive,
1302
+ args: [{
1303
+ standalone: true,
1304
+ providers: [{ provide: SEO_DIRECTIVE_TOKEN, useExisting: SeoDirective }],
1305
+ }]
1306
+ }] });
1307
+
1141
1308
  const toArray = (value) => {
1142
1309
  return Array.from({ length: value }, (_, i) => i);
1143
1310
  };
@@ -1159,5 +1326,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImpor
1159
1326
  * Generated bundle index. Do not edit.
1160
1327
  */
1161
1328
 
1162
- export { ClickObserverFactory, ClickObserverService, ClickOutsideDirective, ContentObserverService, CursorDragScrollDirective, DEFAULT_VIEWPORT_CONFIG, DestroyDirective, DestroyService, FocusVisibleService, LetContext, LetDirective, Memo, MutationObserverFactory, OBSERVE_SCROLL_STATE, ObserveContentDirective, ObserveResizeDirective, ObserveScrollStateDirective, RepeatDirective, ResizeObserverFactory, ResizeObserverService, SCROLL_OBSERVER_FIRST_ELEMENT_CLASS, SCROLL_OBSERVER_IGNORE_TARGET_CLASS, SCROLL_OBSERVER_LAST_ELEMENT_CLASS, ScrollObserverFirstElementDirective, ScrollObserverIgnoreTargetDirective, ScrollObserverLastElementDirective, ToArrayPipe, VIEWPORT_CONFIG, ViewportService, clamp, elementCanScroll, provideViewportConfig, toArray, toArrayTrackByFn };
1329
+ export { ClickObserverFactory, ClickObserverService, ClickOutsideDirective, ContentObserverService, CursorDragScrollDirective, DEFAULT_VIEWPORT_CONFIG, DestroyDirective, DestroyService, FocusVisibleService, LetContext, LetDirective, Memo, MutationObserverFactory, OBSERVE_SCROLL_STATE, ObserveContentDirective, ObserveResizeDirective, ObserveScrollStateDirective, RepeatDirective, ResizeObserverFactory, ResizeObserverService, SCROLL_OBSERVER_FIRST_ELEMENT_CLASS, SCROLL_OBSERVER_IGNORE_TARGET_CLASS, SCROLL_OBSERVER_LAST_ELEMENT_CLASS, SEO_DIRECTIVE_TOKEN, ScrollObserverFirstElementDirective, ScrollObserverIgnoreTargetDirective, ScrollObserverLastElementDirective, SeoDirective, ToArrayPipe, VIEWPORT_CONFIG, ViewportService, clamp, elementCanScroll, mergeSeoConfig, provideViewportConfig, toArray, toArrayTrackByFn };
1163
1330
  //# sourceMappingURL=ethlete-core.mjs.map