sass-template-common 0.10.1 → 0.10.11

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 CHANGED
@@ -1,36 +1,36 @@
1
- # sass-template-common
2
-
3
- Librería web, maqueta de configuración y componentes para proyectos sass.
4
-
5
- ## Publicar nueva versión
6
-
7
- Para que los cambios se reflejen al publicar:
8
-
9
- 1. **Subir versión** (obligatorio; si no, npm rechaza o se usa la misma versión):
10
- ```bash
11
- pnpm version:patch # 0.3.21 → 0.3.22
12
- # o
13
- pnpm version:minor # 0.3.21 → 0.4.0
14
- pnpm version:major # 0.3.21 → 1.0.0
15
- ```
16
-
17
- 2. **Build limpio + publicar**:
18
- ```bash
19
- pnpm run clean && pnpm run build && pnpm publish
20
- ```
21
- O en un solo paso (patch):
22
- ```bash
23
- pnpm release:patch
24
- ```
25
-
26
- 3. **`prepublishOnly`**: Antes de cada `pnpm publish` se ejecuta `clean` + `build`, así siempre se publica un build nuevo.
27
-
28
- 4. **En proyectos que consumen la lib**: Actualizar la dependencia y reinstalar:
29
- ```bash
30
- pnpm update sass-template-common
31
- # o cambiar la versión en package.json y luego
32
- pnpm install
33
- ```
34
- Si usan versión fija (`"0.3.21"`), hay que actualizarla a la nueva (p. ej. `"0.3.22"`).
35
-
36
- **Si no ves los cambios:** comprueba que subiste la versión (`version:patch` o similar), que hiciste `clean` + `build` antes de publicar, y que el proyecto consumidor tiene actualizada la dependencia (o `^0.3.21` y ha ejecutado `pnpm update`).
1
+ # sass-template-common
2
+
3
+ Librería web, maqueta de configuración y componentes para proyectos sass.
4
+
5
+ ## Publicar nueva versión
6
+
7
+ Para que los cambios se reflejen al publicar:
8
+
9
+ 1. **Subir versión** (obligatorio; si no, npm rechaza o se usa la misma versión):
10
+ ```bash
11
+ pnpm version:patch # 0.3.21 → 0.3.22
12
+ # o
13
+ pnpm version:minor # 0.3.21 → 0.4.0
14
+ pnpm version:major # 0.3.21 → 1.0.0
15
+ ```
16
+
17
+ 2. **Build limpio + publicar**:
18
+ ```bash
19
+ pnpm run clean && pnpm run build && pnpm publish
20
+ ```
21
+ O en un solo paso (patch):
22
+ ```bash
23
+ pnpm release:patch
24
+ ```
25
+
26
+ 3. **`prepublishOnly`**: Antes de cada `pnpm publish` se ejecuta `clean` + `build`, así siempre se publica un build nuevo.
27
+
28
+ 4. **En proyectos que consumen la lib**: Actualizar la dependencia y reinstalar:
29
+ ```bash
30
+ pnpm update sass-template-common
31
+ # o cambiar la versión en package.json y luego
32
+ pnpm install
33
+ ```
34
+ Si usan versión fija (`"0.3.21"`), hay que actualizarla a la nueva (p. ej. `"0.3.22"`).
35
+
36
+ **Si no ves los cambios:** comprueba que subiste la versión (`version:patch` o similar), que hiciste `clean` + `build` antes de publicar, y que el proyecto consumidor tiene actualizada la dependencia (o `^0.3.21` y ha ejecutado `pnpm update`).
@@ -51,6 +51,15 @@ export declare type Analytics = {
51
51
  comscore: string | undefined;
52
52
  };
53
53
 
54
+ /**
55
+ * Red de seguridad runtime para consumidores JS (sin type-check). El tipo
56
+ * marca la forma en build; esto valida presencia de cada slot y que matchee
57
+ * el formato exacto en runtime — enforcement doble, decisión del owner (§3).
58
+ */
59
+ export declare function assertImageSizesContract(x: unknown): asserts x is ImageSizesContract;
60
+
61
+ export declare const assetsImagesPrefixer: (imagePath: string, assetsClient?: string) => string;
62
+
54
63
  export declare const AssetsPreconnect: () => false | "" | JSX.Element | undefined;
55
64
 
56
65
  export declare function auditConfigOrigin(entry: ConfigOriginAuditEntry): void;
@@ -179,15 +188,14 @@ export declare const bannersReplace: (bannerLineAd: string, replaces?: {
179
188
  }) => string;
180
189
 
181
190
  /**
182
- * Splits a single large news-list fetch into `batchCount` parallel requests
183
- * of `batchSize` items each, then combines results in order.
191
+ * Variante metadata: mismo split que `createBatchedFetch` pero devuelve
192
+ * `hasNextPage` (último batch lleno) y el primer response crudo, para derivar
193
+ * next/prev y el título de sección. Lee el conteo de batches del MISMO
194
+ * `CONFIG_batchedFetch` que el render (vía `resolveBatchCount`), de modo que la
195
+ * paginación de metadata y la lista visible nunca discrepan.
184
196
  *
185
- * Page mapping (batchCount=3, newsListLimit=45 batchSize=15):
186
- * userPage=1 API pages 1, 2, 3 (items 1–45)
187
- * userPage=2 → API pages 4, 5, 6 (items 46–90)
188
- *
189
- * hasNextPage is true when the last batch came back full (length === batchSize),
190
- * which is equivalent to the original `data.length === newsListLimit` check.
197
+ * `ceil` (antes `floor`) alinea la matemática con `createBatchedFetch`; para los
198
+ * totales usados en prod (45, 15) ambos coinciden por ser divisibles.
191
199
  */
192
200
  export declare function batchedNewsFetch({ fetchFn, baseParams, userPage, newsListLimit, batchCount, }: BatchFetchParams): Promise<BatchFetchResult>;
193
201
 
@@ -308,6 +316,9 @@ declare interface CarruselCardProps extends Omit<CarrouselProps, 'slot_id'> {
308
316
 
309
317
  export declare const CarruselOpinion: FC<SectionCardCarouselProps>;
310
318
 
319
+ /** Corre `resolveImageSizes` y reduce el resultado a pass/fail para CI. */
320
+ export declare function checkImageSizes(input: ImageSizesContractInput | undefined): ImageSizesCheckReport;
321
+
311
322
  /**
312
323
  * Recorre recursivamente un schema (objeto o array) y elimina toda entry
313
324
  * que quede sin valor. Si una propiedad de un objeto queda sin valor, la
@@ -511,6 +522,11 @@ export declare class CommonServices {
511
522
  protected props?: ICommonServices | undefined;
512
523
  configVersion: string;
513
524
  exclude: string;
525
+ /**
526
+ * Contrato de tamaños resuelto UNA vez en el punto de entrada (§3). El resto
527
+ * de los métodos consume `this.contract.<slot>` — cero literales sueltos.
528
+ */
529
+ readonly contract: ImageSizesContract;
514
530
  constructor(props?: ICommonServices | undefined);
515
531
  generateTokenOffline: (browserId: string) => Promise<any>;
516
532
  getEntitySection: (params: Params) => Promise<AxiosResponse<{
@@ -808,6 +824,25 @@ declare interface CreateAssessmentParams {
808
824
  userIpAddress?: string;
809
825
  }
810
826
 
827
+ /**
828
+ * Divide un fetch de lista en `batches` requests paralelos de `ceil(totalSize/
829
+ * batches)` ítems cada uno (páginas contiguas del upstream) y concatena los
830
+ * resultados en orden, devolviendo el MISMO envelope que un fetch único
831
+ * (`{ data: { data: [] } }`) para que caiga directo en un `PromiseArray` con
832
+ * `custom_extractData: getResponse`.
833
+ *
834
+ * Mapeo de páginas (batches=5, totalSize=45 → batchSize=9):
835
+ * userPage=1 → API pages 1..5 (ítems 1–45)
836
+ * userPage=2 → API pages 6..10 (ítems 46–90)
837
+ *
838
+ * `fetchFn` recibe `(size, page)` y devuelve la respuesta del CMS o `undefined`.
839
+ */
840
+ export declare function createBatchedFetch(fetchFn: (size: number, page: number) => Promise<any> | undefined, totalSize: number, userPage: number, batches?: number): Promise<{
841
+ data: {
842
+ data: any[];
843
+ };
844
+ }>;
845
+
811
846
  export declare const cutString: (text: string, length?: number) => string;
812
847
 
813
848
  export declare interface DataNews {
@@ -1056,6 +1091,18 @@ export declare type FetchConfig = {
1056
1091
  newsType: string;
1057
1092
  };
1058
1093
 
1094
+ /**
1095
+ * Envuelve `fetchFn` con batch SI la ruta está activada en config; si no, hace
1096
+ * el fetch único (comportamiento de master). Behavior-preserving cuando el batch
1097
+ * está off, así que es seguro envolver todas las rutas de lista de una — solo
1098
+ * las que estén en `CONFIG_batchedFetch.routes` cambian de comportamiento.
1099
+ */
1100
+ export declare function fetchMaybeBatched(route: string, fetchFn: (size: number, page: number) => Promise<any> | undefined, totalSize: number, userPage: number): Promise<{
1101
+ data: {
1102
+ data: any[];
1103
+ };
1104
+ }>;
1105
+
1059
1106
  /**
1060
1107
  * Cache in-memory + deduplicación de requests en vuelo (misma clave → misma promesa).
1061
1108
  * TTL corto pensado para SSR: evita 4–5 GETs repetidos de menú/banners por instancia.
@@ -1431,10 +1478,24 @@ export declare const HeaderSectionComponent: FC<Props_12>;
1431
1478
 
1432
1479
  export declare function HomeCard(props: SectionCardProps_3): JSX.Element;
1433
1480
 
1481
+ /**
1482
+ * Genera el string HTML de una HomeCard de tipo "imagen" sin pasar por React.
1483
+ * Reemplaza a <HomeCard> para el tipo imagen en LandingTemplate.
1484
+ *
1485
+ * - `priorityHigh` (lo decide el caller) → fetchpriority="high" / loading="eager".
1486
+ * Por default false → low/lazy.
1487
+ * - Sin espacio extra en la clase homeCardImage cuando no hay preRenderClass.
1488
+ */
1489
+ export declare function homeCardImagenToHTMLString(item: NewListResponseData, index: number, paths: RoutePathConfig, share?: Omit<NoteShare, 'googleProfile'>, priorityHigh?: boolean): string;
1490
+
1434
1491
  declare interface ICommonServices {
1435
1492
  config?: Config;
1493
+ /** @deprecated Ya no se lee acá; los tamaños salen de `contract` (§3). Se acepta por retrocompat hasta Fase 3. */
1436
1494
  imgSizes?: any;
1495
+ /** @deprecated No se lee en CommonServices; se acepta por retrocompat hasta Fase 3. */
1437
1496
  imgSizesVideo?: any;
1497
+ /** Nuevo contrato de tamaños (REFACTOR_IMGSIZES_PLAN.md §3). Ausente → `resolveImageSizes` cae a los defaults congelados (§4) → output idéntico. */
1498
+ imageSizes?: ImageSizesContractInput;
1438
1499
  axiosApi: AxiosInstance;
1439
1500
  exclude?: string;
1440
1501
  }
@@ -1519,6 +1580,60 @@ declare interface ImageProps_4 {
1519
1580
  figCaption?: string;
1520
1581
  }
1521
1582
 
1583
+ export declare interface ImageSizesCheckReport {
1584
+ /** `true` si el contrato no necesitó ningún default congelado. */
1585
+ ok: boolean;
1586
+ legacyFieldsUsed: string[];
1587
+ }
1588
+
1589
+ export declare interface ImageSizesContract {
1590
+ note: {
1591
+ detailMain: SizeString;
1592
+ detailSecondary: SizeString;
1593
+ itemsListPrimary: SizeString;
1594
+ relatedPrimary: SizeString;
1595
+ relatedThumb: SizeString;
1596
+ listStandard: SizeString;
1597
+ cardTall: SizeString;
1598
+ square: SizeString;
1599
+ gallery: SizeString;
1600
+ featuredSuperSecondary: SizeString;
1601
+ featuredVerticalPrimary: SizeString;
1602
+ featuredVerticalSecondary: SizeString;
1603
+ featuredHorizontalPrimary: SizeString;
1604
+ featuredHorizontalSecondary: SizeString;
1605
+ featuredDiarioImageThumb: SizeString;
1606
+ };
1607
+ author: {
1608
+ avatar: SizeString;
1609
+ multiCrop: SizeString;
1610
+ };
1611
+ video: {
1612
+ xl: SizeString;
1613
+ lg: SizeString;
1614
+ md: SizeString;
1615
+ };
1616
+ og: {
1617
+ social: SizeString;
1618
+ };
1619
+ }
1620
+
1621
+ /**
1622
+ * Partial real (por slot, no solo por grupo): `Partial<ImageSizesContract>` es
1623
+ * shallow y obligaría a mandar cada grupo completo o nada. Un app puede mandar
1624
+ * solo algunos slots de `note` y dejar el resto en manos del default congelado.
1625
+ */
1626
+ export declare type ImageSizesContractInput = {
1627
+ [G in keyof ImageSizesContract]?: Partial<ImageSizesContract[G]>;
1628
+ };
1629
+
1630
+ export declare interface ImageSizesResolution {
1631
+ /** Siempre completo — nunca undefined para el resto del paquete. */
1632
+ contract: ImageSizesContract;
1633
+ /** Slots resueltos por el default congelado, no provistos por el app. */
1634
+ legacyFieldsUsed: string[];
1635
+ }
1636
+
1522
1637
  export declare interface Info {
1523
1638
  type?: string;
1524
1639
  section?: {
@@ -1559,6 +1674,14 @@ export declare const isHomePath: (pathname?: string) => boolean;
1559
1674
 
1560
1675
  export declare const isPhotoGallery: (news: NewListResponseData) => boolean | undefined;
1561
1676
 
1677
+ /**
1678
+ * ¿La ruta tiene batch activo? Precedencia:
1679
+ * 1. `CONFIG_batchedFetch.routes[route]` explícito (true/false) gana.
1680
+ * 2. Retro-compat: el legacy `CONFIG_sectionBatchedFetch` solo cubría `seccion`.
1681
+ * 3. Off por default.
1682
+ */
1683
+ export declare function isRouteBatched(route: string): boolean;
1684
+
1562
1685
  export declare class IssuuServices {
1563
1686
  private issuuApi;
1564
1687
  private api;
@@ -1666,12 +1789,45 @@ export declare type LibraryConfig = {
1666
1789
  */
1667
1790
  CONFIG_sectionMetaInfo?: boolean;
1668
1791
  /**
1669
- * [renderizado] Cuando es `true`, la lista de sección se obtiene con
1670
- * `batchedNewsFetch` (N fetches paralelos en lugar de uno). Hoy implementado
1671
- * en el sitio soyfutbol; se formaliza acá como opt-in. Default `false`
1672
- * un único fetch (comportamiento de master).
1792
+ * @deprecated Reemplazado por `CONFIG_batchedFetch.routes.seccion`. Se mantiene
1793
+ * como shim de retro-compatibilidad: si `CONFIG_batchedFetch` no está seteado y
1794
+ * este flag es `true`, el batch de sección (solo metadata next/prev) sigue
1795
+ * funcionando con el conteo default. Cuando ambos están, `CONFIG_batchedFetch`
1796
+ * gana. Remover cuando todos los sitios migren a `CONFIG_batchedFetch`.
1673
1797
  */
1674
1798
  CONFIG_sectionBatchedFetch?: boolean;
1799
+ /**
1800
+ * [renderizado] Formaliza el fetch de listas de noticias por batches: divide un
1801
+ * único fetch de `config.newsListLimit` ítems en `batches` fetches paralelos
1802
+ * (páginas contiguas del upstream) y los concatena, devolviendo el MISMO
1803
+ * envelope que un fetch único. Es la versión canónica del sistema que vivía
1804
+ * suelto en soyfutbol (`newsListBatches` + `batchFetchRoutes`).
1805
+ *
1806
+ * - `batches`: número de fetches paralelos por lista. Sin la key (o 1) → un
1807
+ * único fetch = comportamiento de master (aditivo, cero cambio por default).
1808
+ * - `routes`: opt-in por ruta (`home`/`seccion`/`tema`/`ultimas-noticias`/
1809
+ * `autor`/...). Solo las rutas en `true` se batchean; el resto hace fetch único.
1810
+ *
1811
+ * Unifica render y metadata: cuando una ruta está activa acá, tanto la lista
1812
+ * visible como la derivación next/prev usan el MISMO `batches`, evitando el
1813
+ * desajuste "next dice que hay más pero la página muestra un solo fetch".
1814
+ * Reemplaza al legacy `CONFIG_sectionBatchedFetch`.
1815
+ */
1816
+ CONFIG_batchedFetch?: {
1817
+ /** N fetches paralelos por lista. Default efectivo 3 si algo lo activa sin fijarlo. */
1818
+ batches?: number;
1819
+ /** Opt-in por ruta. Claves = route keys de `MetadataDefaultsKeys`. */
1820
+ routes?: Record<string, boolean>;
1821
+ };
1822
+ /**
1823
+ * [render] Cuando es `true`, `LandingTemplate` renderiza las cards de tipo
1824
+ * `imagen` con el fast-render HTML-string (`homeCardImagenToHTMLString`) en
1825
+ * lugar del componente React `<HomeCard>`, ahorrando reconciliación/hidratación.
1826
+ * El fast-render se saltea online cuando la URL de preview no es absoluta y
1827
+ * SIEMPRE cae a `<HomeCard>` en offline (el path HTML-string no pasa por el
1828
+ * hidratador de imágenes offline). Default `false` → usa `<HomeCard>` React.
1829
+ */
1830
+ CONFIG_landingFastRender?: boolean;
1675
1831
  CONFIG_deferBanners?: {
1676
1832
  common?: boolean;
1677
1833
  middle?: boolean;
@@ -1804,11 +1960,19 @@ export declare interface MainBlock1Props extends SectionCardProps, NewDescriptio
1804
1960
  export declare class MainComponentServices {
1805
1961
  exclude: string;
1806
1962
  config: any;
1963
+ /**
1964
+ * @deprecated Ya no se lee: los tamaños salen de `this.contract` (§3). Bigfish
1965
+ * pasa `imgSizesVideo` acá (quirk documentado en el snapshot de Fase 0), por eso
1966
+ * `this.imgSizes.lg` valía `video.lg`; ahora eso se expresa como `contract.video.lg`.
1967
+ * Se mantiene el parámetro posicional por retrocompat hasta Fase 3.
1968
+ */
1807
1969
  imgSizes: any;
1808
1970
  configVersion: string;
1809
1971
  axiosApi: AxiosInstance | undefined;
1810
1972
  customMainImagesSize: string | undefined;
1811
- constructor(config: Config, imgSizes: any, axiosApi: AxiosInstance, exclude?: string, customMainImagesSizes?: string);
1973
+ /** Contrato de tamaños resuelto UNA vez (§3); el resto consume `this.contract.<slot>`. */
1974
+ readonly contract: ImageSizesContract;
1975
+ constructor(config: Config, imgSizes: any, axiosApi: AxiosInstance, exclude?: string, customMainImagesSizes?: string, imageSizes?: ImageSizesContractInput);
1812
1976
  getNewsListZone(params: Params): Promise<AxiosResponse<NewListResponse, any, {}> | undefined>;
1813
1977
  getOutstandingBlock(params: Params): Promise<AxiosResponse< {
1814
1978
  data: Array<Outstanding>;
@@ -2492,7 +2656,10 @@ export declare interface Preview {
2492
2656
  photographer?: string | false;
2493
2657
  }
2494
2658
 
2495
- export declare const processExtractedRelatedNews: (relatedNews: string[][], getNews: (params: any) => any) => Promise<any[]>;
2659
+ /** Única función que imprime: nada de `console.warn` en el runtime de la app (§3.1). */
2660
+ export declare function printImageSizesReport(report: ImageSizesCheckReport, label?: string): void;
2661
+
2662
+ export declare const processExtractedRelatedNews: (relatedNews: string[][], getNews: (params: any) => any, imagesizes?: string) => Promise<any[]>;
2496
2663
 
2497
2664
  export declare type PromiseArray = {
2498
2665
  [key: string]: {
@@ -3113,10 +3280,29 @@ export declare interface ResilientFetchOptions {
3113
3280
  baseDelayMs?: number;
3114
3281
  }
3115
3282
 
3283
+ /**
3284
+ * Conteo de batches efectivo leído de `getConfig().CONFIG_batchedFetch.batches`.
3285
+ * Default `3` cuando algo activa el batch sin fijar el número (preserva el
3286
+ * comportamiento histórico del path de metadata, cuyo default era 3).
3287
+ */
3288
+ export declare function resolveBatchCount(): number;
3289
+
3116
3290
  export declare function resolveBucketMenuSubtype(path?: string): string;
3117
3291
 
3118
3292
  export declare function resolveBucketOriginUrl(bucket: BucketOriginConfig, servicePrefix: string | undefined, type: 'menu' | 'banners', subtype: string): string;
3119
3293
 
3294
+ /**
3295
+ * Recibe lo que el app mande hoy (contrato completo, parcial, o nada) y
3296
+ * devuelve SIEMPRE un contrato completo. Los constructores públicos del
3297
+ * paquete llaman esto una sola vez, en su punto de entrada, y de ahí en
3298
+ * adelante consumen `contract.<slot>` sin condicionales ni valores propios.
3299
+ *
3300
+ * Puede tirar (vía `assertImageSizesContract`) si un slot provisto por el
3301
+ * app no matchea el formato esperado — enforcement doble (§3): tipos en
3302
+ * build, assert en runtime.
3303
+ */
3304
+ export declare function resolveImageSizes(input: ImageSizesContractInput | undefined): ImageSizesResolution;
3305
+
3120
3306
  export declare interface RoutePathConfig {
3121
3307
  autor: string | 'autor';
3122
3308
  tema: string | 'tema';
@@ -3296,6 +3482,9 @@ export declare interface SizeImage {
3296
3482
  scale?: string;
3297
3483
  }
3298
3484
 
3485
+ /** Formato: `"w:{n},h:{n},t:{n}[,c:{hex}];"` (uno o más, cada uno separado y terminado en `;`). */
3486
+ export declare type SizeString = string;
3487
+
3299
3488
  declare interface Social {
3300
3489
  title: boolean;
3301
3490
  description: boolean;