ng-easycommerce 0.0.688 → 0.0.689
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/README.md +13 -0
- package/assets/docs/SEO.md +174 -0
- package/bundles/ng-easycommerce.umd.js +859 -558
- package/bundles/ng-easycommerce.umd.js.map +1 -1
- package/bundles/ng-easycommerce.umd.min.js +1 -1
- package/bundles/ng-easycommerce.umd.min.js.map +1 -1
- package/esm2015/lib/ec-component/auth-ec/auth-ec.component.js +31 -3
- package/esm2015/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +14 -3
- package/esm2015/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +14 -3
- package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +17 -3
- package/esm2015/lib/ec-component/checkout-ec/checkout-ec.component.js +17 -3
- package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +3 -3
- package/esm2015/lib/ec-component/collection-ec/collection-ec.component.js +36 -3
- package/esm2015/lib/ec-component/home-ec/home-ec.component.js +14 -3
- package/esm2015/lib/ec-component/password-reset-ec/password-reset-ec.component.js +14 -3
- package/esm2015/lib/ec-component/product-detail-ec/product-detail-ec.component.js +17 -12
- package/esm2015/lib/ec-component/section-container-ec/section-container-ec.component.js +45 -4
- package/esm2015/lib/ec-directive/add-action-redirect.directive.js +35 -13
- package/esm2015/lib/ec-directive/product-off.directive.js +2 -2
- package/esm2015/lib/services/seo.service.js +112 -0
- package/esm2015/public-api.js +2 -1
- package/esm5/lib/ec-component/auth-ec/auth-ec.component.js +31 -3
- package/esm5/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +14 -3
- package/esm5/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +14 -3
- package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +17 -3
- package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +17 -3
- package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +3 -3
- package/esm5/lib/ec-component/collection-ec/collection-ec.component.js +36 -3
- package/esm5/lib/ec-component/home-ec/home-ec.component.js +14 -3
- package/esm5/lib/ec-component/password-reset-ec/password-reset-ec.component.js +14 -3
- package/esm5/lib/ec-component/product-detail-ec/product-detail-ec.component.js +17 -12
- package/esm5/lib/ec-component/section-container-ec/section-container-ec.component.js +45 -4
- package/esm5/lib/ec-directive/add-action-redirect.directive.js +35 -13
- package/esm5/lib/ec-directive/product-off.directive.js +2 -2
- package/esm5/lib/services/seo.service.js +116 -0
- package/esm5/public-api.js +2 -1
- package/fesm2015/ng-easycommerce.js +855 -559
- package/fesm2015/ng-easycommerce.js.map +1 -1
- package/fesm5/ng-easycommerce.js +860 -560
- package/fesm5/ng-easycommerce.js.map +1 -1
- package/lib/ec-component/auth-ec/auth-ec.component.d.ts +4 -1
- package/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.d.ts +3 -1
- package/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.d.ts +3 -1
- package/lib/ec-component/cart-ec/cart-ec.component.d.ts +4 -1
- package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +4 -1
- package/lib/ec-component/collection-ec/collection-ec.component.d.ts +5 -1
- package/lib/ec-component/home-ec/home-ec.component.d.ts +3 -1
- package/lib/ec-component/password-reset-ec/password-reset-ec.component.d.ts +3 -1
- package/lib/ec-component/product-detail-ec/product-detail-ec.component.d.ts +3 -3
- package/lib/ec-component/section-container-ec/section-container-ec.component.d.ts +7 -1
- package/lib/ec-directive/add-action-redirect.directive.d.ts +1 -0
- package/lib/services/seo.service.d.ts +16 -0
- package/ng-easycommerce.metadata.json +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
package/README.md
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
# Version 0.0.689
|
|
2
|
+
- SEO: `CollectionEcComponent` normaliza el breadcrumb antes de armar el `title`, aceptando valores string u objetos con `title`, `name` o `label` para evitar renders como `[object Object] | ...`.
|
|
3
|
+
- SEO: el `title` de colección mantiene el patrón `'<sección> | <sitio>'` y la `description` vuelve a derivarse del texto visible de la categoría o del término de búsqueda.
|
|
4
|
+
- SEO: la corrección es compatible con clientes anteriores que ya entregaban strings en `breadcrumb` y con los que todavía exponen objetos de navegación.
|
|
5
|
+
- SEO: `CartEcComponent` ahora setea `title`, `description`, `canonical` y `noindex` para la ruta de carrito, manteniendo la ruta fuera de indexación pero con metadata consistente.
|
|
6
|
+
- SEO: `CheckoutEcComponent` adopta el mismo patrón con `title`, `description`, `canonical` y `noindex`, dejando la ruta interna fuera de indexación.
|
|
7
|
+
- SEO: se amplía la documentación de adopción para `cart` y `checkout` en `src/lib/assets/docs/SEO.md` y se conserva el patrón opt-in para los frontends que quieran reutilizarlo.
|
|
8
|
+
- SEO: se agrega `SeoService` reutilizable en `projects/ng-easycommerce/src/lib/services/seo.service.ts` con helpers para `title`, `description`, `og:image`, `og:type`, `canonical` y `robots`.
|
|
9
|
+
- SEO: el servicio es opt-in y no altera por sí solo el comportamiento de los clientes existentes; los frontends pueden adoptarlo por ruta sin romper integraciones viejas.
|
|
10
|
+
- SEO: el paquete lo expone desde `src/public-api.ts` para que los consumidores puedan inyectarlo desde el core compartido.
|
|
11
|
+
- SEO: se documenta el patrón de integración en `src/lib/assets/docs/SEO.md` para que otros frontends puedan adoptarlo de forma gradual.
|
|
12
|
+
- SEO: `ecAddActionRedirect` publica `href` también para rutas internas calculadas por `blocksService.formUrl(banner)`, mejorando crawlability en banners y bloques.
|
|
13
|
+
- SEO: `ProductOffDirective` deja de crear un ancla para el badge `% OFF`, evitando links vacíos en tarjetas de producto.
|
|
1
14
|
# Version 0.0.688
|
|
2
15
|
- Facebook Pixel: se mantiene la carga única e idempotente, evitando reinyecciones y dobles inicializaciones del script.
|
|
3
16
|
- Facebook Pixel: el tracking se ejecuta fuera de la zona de Angular y conserva un fallback seguro si `NgZone` no está disponible.
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# SEO base para Angular 9
|
|
2
|
+
|
|
3
|
+
Este documento describe cómo integrar el SEO base que expone `ng-easycommerce` para los frontends que todavía trabajan con Angular 9.
|
|
4
|
+
|
|
5
|
+
## Objetivo
|
|
6
|
+
|
|
7
|
+
Centralizar en el core una capa reutilizable de metadata para:
|
|
8
|
+
|
|
9
|
+
- títulos por ruta;
|
|
10
|
+
- meta description;
|
|
11
|
+
- `og:type`;
|
|
12
|
+
- `og:image`;
|
|
13
|
+
- canonical;
|
|
14
|
+
- `robots`.
|
|
15
|
+
|
|
16
|
+
La funcionalidad es opt-in. Un frontend que no inyecta `SeoService` sigue funcionando igual que antes.
|
|
17
|
+
|
|
18
|
+
## Alcance
|
|
19
|
+
|
|
20
|
+
Esta implementación cubre SEO on-page y metadata dinámica desde Angular 9.
|
|
21
|
+
|
|
22
|
+
No reemplaza:
|
|
23
|
+
|
|
24
|
+
- SSR;
|
|
25
|
+
- prerender;
|
|
26
|
+
- sitemap;
|
|
27
|
+
- `robots.txt`;
|
|
28
|
+
- JSON-LD;
|
|
29
|
+
- indexación del contenido inicial del HTML renderizado por servidor.
|
|
30
|
+
|
|
31
|
+
Sirve para mejorar el HTML que emite el frontend una vez cargado y para ordenar la metadata por ruta.
|
|
32
|
+
|
|
33
|
+
## API pública
|
|
34
|
+
|
|
35
|
+
El servicio se exporta desde `src/public-api.ts`:
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import { SeoService } from 'ng-easycommerce';
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Helpers disponibles en `SeoService`:
|
|
42
|
+
|
|
43
|
+
- `setTitle(title: string, suffix = true)`
|
|
44
|
+
- `setDescription(description: string)`
|
|
45
|
+
- `setOgImage(url: string)`
|
|
46
|
+
- `setOgType(type: string)`
|
|
47
|
+
- `setCanonical(url: string)`
|
|
48
|
+
- `setRobots(content: string)`
|
|
49
|
+
- `setNoIndex(noIndex = true)`
|
|
50
|
+
- `getSiteName()`
|
|
51
|
+
|
|
52
|
+
## Cómo funciona
|
|
53
|
+
|
|
54
|
+
El servicio usa las APIs nativas de Angular para metadata:
|
|
55
|
+
|
|
56
|
+
- `Title`
|
|
57
|
+
- `Meta`
|
|
58
|
+
|
|
59
|
+
Además:
|
|
60
|
+
|
|
61
|
+
- el canonical se aplica solo en navegador;
|
|
62
|
+
- si una etiqueta ya existe, el servicio la reutiliza o la actualiza;
|
|
63
|
+
- el `siteName` se toma desde la configuración del canal cuando existe;
|
|
64
|
+
- si el frontend no usa el servicio, no cambia ninguna ruta ni metadata.
|
|
65
|
+
|
|
66
|
+
Además, la adopción SEO en bloques y banners puede apoyarse en `ecAddActionRedirect`:
|
|
67
|
+
|
|
68
|
+
- cuando el banner no trae `url`, el core calcula una ruta interna con `blocksService.formUrl(banner)`;
|
|
69
|
+
- esa ruta queda publicada en `href` para que el enlace sea rastreable;
|
|
70
|
+
- el click sigue resolviéndose por Angular en rutas internas;
|
|
71
|
+
- los enlaces externos conservan `target="_blank"` y `rel="noopener noreferrer"`.
|
|
72
|
+
|
|
73
|
+
## Patrón de integración
|
|
74
|
+
|
|
75
|
+
La idea es que cada frontend llame al servicio en los componentes que representan una ruta pública.
|
|
76
|
+
|
|
77
|
+
### Páginas indexables
|
|
78
|
+
|
|
79
|
+
Usar cuando la ruta debe aparecer en buscadores:
|
|
80
|
+
|
|
81
|
+
- home;
|
|
82
|
+
- colecciones;
|
|
83
|
+
- ficha de producto;
|
|
84
|
+
- secciones públicas;
|
|
85
|
+
- páginas de contenido público.
|
|
86
|
+
|
|
87
|
+
Ejemplo:
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
constructor(private seoService: SeoService) {}
|
|
91
|
+
|
|
92
|
+
ngOnInit(): void {
|
|
93
|
+
this.seoService.setTitle('Colección Mujer');
|
|
94
|
+
this.seoService.setDescription('Ropa y accesorios para mujer.');
|
|
95
|
+
this.seoService.setCanonical(this.currentUrl);
|
|
96
|
+
this.seoService.setOgType('website');
|
|
97
|
+
this.seoService.setRobots('index,follow');
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Páginas que no deben indexarse
|
|
102
|
+
|
|
103
|
+
Usar para rutas internas, de autenticación o de cuenta:
|
|
104
|
+
|
|
105
|
+
- cart;
|
|
106
|
+
- checkout;
|
|
107
|
+
- login;
|
|
108
|
+
- registro;
|
|
109
|
+
- recuperar contraseña;
|
|
110
|
+
- reset de contraseña;
|
|
111
|
+
- confirmación de cuenta;
|
|
112
|
+
- backoffice o áreas internas equivalentes.
|
|
113
|
+
|
|
114
|
+
Ejemplo:
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
constructor(private seoService: SeoService) {}
|
|
118
|
+
|
|
119
|
+
ngOnInit(): void {
|
|
120
|
+
this.seoService.setTitle('Checkout');
|
|
121
|
+
this.seoService.setDescription('Finalizá tu compra en la tienda.');
|
|
122
|
+
this.seoService.setCanonical(this.currentUrl);
|
|
123
|
+
this.seoService.setNoIndex(true);
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Recomendaciones de uso
|
|
128
|
+
|
|
129
|
+
- Definir metadata por ruta, no solo de forma global.
|
|
130
|
+
- Usar títulos descriptivos y consistentes con el contenido visible.
|
|
131
|
+
- Mantener `robots` explícito en páginas que no deban indexarse.
|
|
132
|
+
- Si la ficha de producto, el carrito, el checkout o la sección no tiene descripción real, usar un texto corto derivado del contenido visible.
|
|
133
|
+
- No asumir que todos los frontends necesitan activar esta capa al mismo tiempo.
|
|
134
|
+
|
|
135
|
+
## Compatibilidad
|
|
136
|
+
|
|
137
|
+
La implementación fue pensada para no romper clientes que aún no la adoptan:
|
|
138
|
+
|
|
139
|
+
- el servicio no se ejecuta solo;
|
|
140
|
+
- no modifica rutas ni guardas;
|
|
141
|
+
- no cambia el HTML si el frontend no lo invoca;
|
|
142
|
+
- soporta frontend/core viejos sin exigir SSR;
|
|
143
|
+
- permite adopción gradual por componente o por ruta.
|
|
144
|
+
|
|
145
|
+
Si un cliente actualiza el core pero no incorpora `SeoService`, conserva el comportamiento anterior.
|
|
146
|
+
|
|
147
|
+
## Qué debe implementar cada frontend
|
|
148
|
+
|
|
149
|
+
Cada frontend que quiera usar esta base debe:
|
|
150
|
+
|
|
151
|
+
1. inyectar `SeoService` en los componentes de las rutas públicas;
|
|
152
|
+
2. setear título y description según el contenido real;
|
|
153
|
+
3. marcar `noindex` en rutas internas;
|
|
154
|
+
4. completar canonical con la URL actual;
|
|
155
|
+
5. ajustar `og:type` y `og:image` cuando corresponda.
|
|
156
|
+
|
|
157
|
+
No hace falta duplicar la lógica de metadata en cada proyecto si el core ya la resuelve.
|
|
158
|
+
|
|
159
|
+
## Ejemplos de rutas ya cubiertas en el core
|
|
160
|
+
|
|
161
|
+
El core ya aplica esta lógica en:
|
|
162
|
+
|
|
163
|
+
- `src/lib/ec-component/home-ec/home-ec.component.ts`
|
|
164
|
+
- `src/lib/ec-component/collection-ec/collection-ec.component.ts`
|
|
165
|
+
- `src/lib/ec-component/cart-ec/cart-ec.component.ts`
|
|
166
|
+
- `src/lib/ec-component/checkout-ec/checkout-ec.component.ts`
|
|
167
|
+
- `src/lib/ec-component/product-detail-ec/product-detail-ec.component.ts`
|
|
168
|
+
- `src/lib/ec-component/section-container-ec/section-container-ec.component.ts`
|
|
169
|
+
- `src/lib/ec-component/auth-ec/auth-ec.component.ts`
|
|
170
|
+
- `src/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.ts`
|
|
171
|
+
- `src/lib/ec-component/password-reset-ec/password-reset-ec.component.ts`
|
|
172
|
+
- `src/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.ts`
|
|
173
|
+
|
|
174
|
+
Esa lista sirve como referencia para nuevos frontends que quieran replicar el mismo patrón.
|