@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.
- package/esm2020/lib/directives/public-api.mjs +2 -1
- package/esm2020/lib/directives/seo/public-api.mjs +5 -0
- package/esm2020/lib/directives/seo/seo.directive.constants.mjs +3 -0
- package/esm2020/lib/directives/seo/seo.directive.mjs +162 -0
- package/esm2020/lib/directives/seo/seo.directive.types.mjs +2 -0
- package/esm2020/lib/directives/seo/seo.directive.utils.mjs +7 -0
- package/fesm2015/ethlete-core.mjs +168 -1
- package/fesm2015/ethlete-core.mjs.map +1 -1
- package/fesm2020/ethlete-core.mjs +167 -1
- package/fesm2020/ethlete-core.mjs.map +1 -1
- package/lib/directives/public-api.d.ts +1 -0
- package/lib/directives/seo/public-api.d.ts +4 -0
- package/lib/directives/seo/seo.directive.constants.d.ts +3 -0
- package/lib/directives/seo/seo.directive.d.ts +21 -0
- package/lib/directives/seo/seo.directive.types.d.ts +51 -0
- package/lib/directives/seo/seo.directive.utils.d.ts +2 -0
- package/package.json +3 -2
|
@@ -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
|
-
|
|
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
|