@griddo/cx 11.9.8-rc.1 → 11.9.8-rc.3

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.
Files changed (222) hide show
  1. package/README.md +193 -78
  2. package/build/adapters/gatsby/index.d.ts +4 -0
  3. package/build/adapters/gatsby/utils.d.ts +22 -0
  4. package/build/artifacts/index.d.ts +6 -0
  5. package/build/commands/end-render.d.ts +2 -0
  6. package/build/commands/move-assets.d.ts +1 -0
  7. package/build/commands/prepare-domains-render.d.ts +1 -0
  8. package/build/commands/reset-render.d.ts +2 -0
  9. package/build/commands/start-render.d.ts +2 -0
  10. package/build/commands/upload-search-content.d.ts +2 -0
  11. package/build/constants/envs.d.ts +37 -0
  12. package/build/constants/index.d.ts +57 -0
  13. package/build/end-render.js +74 -0
  14. package/build/end-render.js.map +7 -0
  15. package/build/{shared/errors.d.ts → errors/errors-data.d.ts} +3 -5
  16. package/build/{core/errors.d.ts → errors/index.d.ts} +4 -5
  17. package/build/index.d.ts +29 -10
  18. package/build/index.js +73 -406
  19. package/build/index.js.map +7 -0
  20. package/build/prepare-domains-render.js +73 -0
  21. package/build/prepare-domains-render.js.map +7 -0
  22. package/build/react/Favicon/index.d.ts +5 -0
  23. package/build/react/Favicon/utils.d.ts +9 -0
  24. package/build/react/GriddoIntegrations/index.d.ts +20 -0
  25. package/build/react/GriddoIntegrations/utils.d.ts +26 -0
  26. package/build/react/index.d.ts +3 -0
  27. package/build/react/index.js +3 -0
  28. package/build/registers/api.d.ts +9 -0
  29. package/build/registers/gatsby.d.ts +9 -0
  30. package/build/registers/index.d.ts +3 -0
  31. package/build/reset-render.js +74 -0
  32. package/build/reset-render.js.map +7 -0
  33. package/build/services/auth.d.ts +5 -2
  34. package/build/services/domains.d.ts +6 -0
  35. package/build/services/navigation.d.ts +50 -0
  36. package/build/services/reference-fields.d.ts +20 -0
  37. package/build/services/register.d.ts +36 -0
  38. package/build/services/robots.d.ts +19 -0
  39. package/build/services/settings.d.ts +4 -0
  40. package/build/services/sites.d.ts +29 -0
  41. package/build/services/store.d.ts +6 -0
  42. package/build/start-render.js +100 -0
  43. package/build/start-render.js.map +7 -0
  44. package/build/{shared/types → types}/api.d.ts +18 -18
  45. package/build/{shared/types → types}/global.d.ts +16 -15
  46. package/build/{shared/types → types}/navigation.d.ts +5 -5
  47. package/build/{shared/types → types}/pages.d.ts +9 -9
  48. package/build/{shared/types → types}/sites.d.ts +19 -18
  49. package/build/types/templates.d.ts +8 -0
  50. package/build/upload-search-content.js +74 -0
  51. package/build/upload-search-content.js.map +7 -0
  52. package/build/utils/alerts.d.ts +3 -0
  53. package/build/utils/api.d.ts +23 -0
  54. package/build/utils/cache.d.ts +35 -0
  55. package/build/utils/core-utils.d.ts +107 -0
  56. package/build/utils/create-build-data.d.ts +8 -0
  57. package/build/utils/domains.d.ts +13 -0
  58. package/build/utils/folders.d.ts +53 -0
  59. package/build/utils/health-checks.d.ts +7 -0
  60. package/build/utils/images.d.ts +16 -0
  61. package/build/utils/loggin.d.ts +51 -0
  62. package/build/utils/pages.d.ts +34 -0
  63. package/build/utils/render.d.ts +13 -0
  64. package/build/utils/searches.d.ts +15 -0
  65. package/build/utils/sites.d.ts +31 -0
  66. package/build/utils/store.d.ts +81 -0
  67. package/cx.config.d.ts +5 -0
  68. package/cx.config.js +36 -0
  69. package/exporter/adapters/gatsby/index.ts +162 -0
  70. package/exporter/adapters/gatsby/utils.ts +161 -0
  71. package/exporter/artifacts/README.md +34 -0
  72. package/exporter/artifacts/index.ts +33 -0
  73. package/exporter/build.sh +28 -17
  74. package/exporter/commands/end-render.ts +86 -65
  75. package/exporter/commands/move-assets.ts +11 -0
  76. package/exporter/commands/prepare-domains-render.ts +35 -143
  77. package/exporter/commands/reset-render.ts +7 -12
  78. package/exporter/commands/start-render.ts +64 -26
  79. package/exporter/commands/upload-search-content.ts +26 -201
  80. package/exporter/{shared → constants}/endpoints.ts +11 -12
  81. package/exporter/constants/envs.ts +94 -0
  82. package/exporter/constants/index.ts +129 -0
  83. package/exporter/{shared/errors.ts → errors/errors-data.ts} +14 -24
  84. package/exporter/errors/index.ts +40 -0
  85. package/exporter/index.ts +56 -14
  86. package/{react/GriddoFavicon → exporter/react/Favicon}/index.tsx +9 -3
  87. package/{react → exporter/react}/GriddoIntegrations/index.tsx +23 -17
  88. package/{react → exporter/react}/GriddoIntegrations/utils.ts +12 -24
  89. package/exporter/react/index.tsx +11 -0
  90. package/exporter/registers/api.ts +14 -0
  91. package/exporter/registers/gatsby.ts +14 -0
  92. package/exporter/registers/index.ts +4 -0
  93. package/exporter/services/auth.ts +10 -8
  94. package/exporter/services/domains.ts +8 -23
  95. package/exporter/services/navigation.ts +18 -12
  96. package/exporter/services/reference-fields.ts +32 -14
  97. package/exporter/services/register.ts +113 -0
  98. package/exporter/services/robots.ts +61 -33
  99. package/exporter/services/settings.ts +17 -0
  100. package/exporter/services/sites.ts +28 -40
  101. package/exporter/services/store.ts +319 -386
  102. package/exporter/{shared/types → types}/api.ts +41 -40
  103. package/exporter/{shared/types → types}/global.ts +21 -17
  104. package/exporter/{shared/types → types}/navigation.ts +3 -3
  105. package/exporter/{shared/types → types}/pages.ts +11 -10
  106. package/exporter/{shared/types → types}/sites.ts +19 -18
  107. package/exporter/utils/alerts.ts +29 -0
  108. package/exporter/utils/api.ts +243 -0
  109. package/exporter/utils/cache.ts +142 -0
  110. package/exporter/utils/core-utils.ts +458 -0
  111. package/exporter/utils/create-build-data.ts +17 -0
  112. package/exporter/utils/domains.ts +39 -0
  113. package/exporter/utils/folders.ts +320 -0
  114. package/exporter/utils/health-checks.ts +64 -0
  115. package/exporter/{core → utils}/images.ts +6 -1
  116. package/exporter/{core → utils}/instance.ts +13 -9
  117. package/exporter/utils/loggin.ts +184 -0
  118. package/exporter/{services → utils}/pages.ts +92 -27
  119. package/exporter/utils/render.ts +71 -0
  120. package/exporter/utils/searches.ts +156 -0
  121. package/exporter/utils/sites.ts +312 -0
  122. package/exporter/utils/store.ts +314 -0
  123. package/gatsby-browser.tsx +58 -41
  124. package/gatsby-config.ts +17 -10
  125. package/gatsby-node.ts +80 -20
  126. package/gatsby-ssr.tsx +1 -2
  127. package/package.json +92 -41
  128. package/src/README.md +7 -0
  129. package/src/components/Head.tsx +73 -30
  130. package/src/components/template.tsx +30 -8
  131. package/src/gatsby-node-utils.ts +2 -76
  132. package/src/html.tsx +11 -2
  133. package/src/types.ts +5 -5
  134. package/start-render.js +7 -0
  135. package/tsconfig.json +3 -5
  136. package/build/commands/end-render.js +0 -31
  137. package/build/commands/end-render.js.map +0 -7
  138. package/build/commands/prepare-assets-directory.js +0 -9
  139. package/build/commands/prepare-assets-directory.js.map +0 -7
  140. package/build/commands/prepare-domains-render.js +0 -38
  141. package/build/commands/prepare-domains-render.js.map +0 -7
  142. package/build/commands/reset-render.js +0 -31
  143. package/build/commands/reset-render.js.map +0 -7
  144. package/build/commands/start-embeddings.js +0 -31
  145. package/build/commands/start-embeddings.js.map +0 -7
  146. package/build/commands/start-render.js +0 -66
  147. package/build/commands/start-render.js.map +0 -7
  148. package/build/commands/upload-search-content.js +0 -31
  149. package/build/commands/upload-search-content.js.map +0 -7
  150. package/build/core/GriddoLog.d.ts +0 -16
  151. package/build/core/db.d.ts +0 -4
  152. package/build/core/dist-rollback.d.ts +0 -2
  153. package/build/core/fs.d.ts +0 -69
  154. package/build/core/logger.d.ts +0 -18
  155. package/build/services/manage-store.d.ts +0 -48
  156. package/build/services/render.d.ts +0 -70
  157. package/build/shared/envs.d.ts +0 -19
  158. package/build/shared/npm-modules/brush.d.ts +0 -18
  159. package/build/shared/npm-modules/find-up-simple.d.ts +0 -34
  160. package/build/shared/npm-modules/pkg-dir.d.ts +0 -7
  161. package/build/shared/types/render.d.ts +0 -54
  162. package/cli.mjs +0 -239
  163. package/exporter/build-esbuild.noop +0 -42
  164. package/exporter/commands/README.md +0 -151
  165. package/exporter/commands/prepare-assets-directory.ts +0 -34
  166. package/exporter/commands/single-domain-upload-search-content.noop +0 -206
  167. package/exporter/commands/start-embeddings.ts +0 -29
  168. package/exporter/core/GriddoLog.ts +0 -45
  169. package/exporter/core/check-env-health.ts +0 -200
  170. package/exporter/core/db-class.ts +0 -54
  171. package/exporter/core/db.ts +0 -33
  172. package/exporter/core/dist-rollback.ts +0 -40
  173. package/exporter/core/errors.ts +0 -82
  174. package/exporter/core/fs.ts +0 -385
  175. package/exporter/core/life-cycle.ts +0 -73
  176. package/exporter/core/logger.ts +0 -141
  177. package/exporter/core/objects.ts +0 -37
  178. package/exporter/core/print-logos.ts +0 -21
  179. package/exporter/services/api.ts +0 -306
  180. package/exporter/services/manage-sites.ts +0 -116
  181. package/exporter/services/manage-store.ts +0 -235
  182. package/exporter/services/render-artifacts.ts +0 -44
  183. package/exporter/services/render.ts +0 -229
  184. package/exporter/services/sitemaps.ts +0 -129
  185. package/exporter/shared/context.ts +0 -49
  186. package/exporter/shared/envs.ts +0 -62
  187. package/exporter/shared/npm-modules/README.md +0 -36
  188. package/exporter/shared/npm-modules/brush.ts +0 -34
  189. package/exporter/shared/npm-modules/find-up-simple.ts +0 -100
  190. package/exporter/shared/npm-modules/pkg-dir.ts +0 -17
  191. package/exporter/shared/npm-modules/xml-parser.ts +0 -57
  192. package/exporter/shared/types/render.ts +0 -63
  193. package/exporter/ssg-adapters/gatsby/actions/clean.ts +0 -26
  194. package/exporter/ssg-adapters/gatsby/actions/close.ts +0 -17
  195. package/exporter/ssg-adapters/gatsby/actions/data.ts +0 -22
  196. package/exporter/ssg-adapters/gatsby/actions/healthCheck.ts +0 -10
  197. package/exporter/ssg-adapters/gatsby/actions/init.ts +0 -12
  198. package/exporter/ssg-adapters/gatsby/actions/logs.ts +0 -10
  199. package/exporter/ssg-adapters/gatsby/actions/meta.ts +0 -13
  200. package/exporter/ssg-adapters/gatsby/actions/prepare.ts +0 -9
  201. package/exporter/ssg-adapters/gatsby/actions/relocation.ts +0 -15
  202. package/exporter/ssg-adapters/gatsby/actions/restore.ts +0 -21
  203. package/exporter/ssg-adapters/gatsby/actions/ssg.ts +0 -12
  204. package/exporter/ssg-adapters/gatsby/actions/sync.ts +0 -65
  205. package/exporter/ssg-adapters/gatsby/index.ts +0 -114
  206. package/exporter/ssg-adapters/gatsby/shared/artifacts.ts +0 -16
  207. package/exporter/ssg-adapters/gatsby/shared/diff-assets.ts +0 -128
  208. package/exporter/ssg-adapters/gatsby/shared/extract-assets.ts +0 -75
  209. package/exporter/ssg-adapters/gatsby/shared/gatsby-build.ts +0 -58
  210. package/exporter/ssg-adapters/gatsby/shared/sync-render.ts +0 -300
  211. package/exporter/ssg-adapters/gatsby/shared/types.ts +0 -35
  212. package/exporter/ssg-adapters/gatsby/shared/utils.ts +0 -33
  213. package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +0 -55
  214. package/plugins/gatsby-plugin-svgr-loader/package.json +0 -8
  215. package/react/DynamicScript/index.tsx +0 -33
  216. package/react/GriddoOpenGraph/index.tsx +0 -39
  217. package/tsconfig.commands.json +0 -36
  218. package/tsconfig.exporter.json +0 -20
  219. /package/build/{shared → constants}/endpoints.d.ts +0 -0
  220. /package/build/{core → utils}/instance.d.ts +0 -0
  221. /package/{react/GriddoFavicon → exporter/react/Favicon}/utils.ts +0 -0
  222. /package/exporter/{shared/types → types}/templates.ts +0 -0
package/README.md CHANGED
@@ -1,131 +1,246 @@
1
- # Proceso de Renderizado en CX
1
+ # Griddo CX
2
2
 
3
- Este documento describe el flujo del render en Griddo CX y otros aspectos técnicos relevantes.
3
+ Griddo CX es un package dentro del monorepo de Griddo (`packages/griddo-cx`) que se encarga de ofrecer herramientas para orquestar el render de una instancia utilizando la biblioteca de componentes, un framework SSG y los datos obtenidos de la API privada de Griddo.
4
4
 
5
- _Nota: Se asume que todos los comandos se invocan a través del [CLI de CX](#cli-de-cx)._
5
+ # Arquitectura
6
6
 
7
- ---
7
+ CX está escrito como una biblioteca en TypeScript. \**Los consumidores de la misma son el *Adapter, el framework SSG y una serie de scripts en TypeScript que viven en el propio `package/griddo-cx` y que son utilizados por infra, normalmente invocados mediante un `npm run ...`
8
8
 
9
- ## Flujo General del render
9
+ \*Para los casos del Adapter y los “scripts para infra”, estos utilizarán directamente el código Typescript de la biblioteca de CX. Para el caso del SSG, este utilizará el código bundlelizado disponible en `@griddo/cx` y `griddo/cx/react`
10
10
 
11
- El proceso sigue una secuencia de fases bien definida:
11
+ Como ejemplo aquí vemos un snippet dentro de Gatsby (actual framework SSG) importando un componente `<GriddoIntegrations>` que forma parte de la biblioteca de CX, en concreto del export de react.
12
12
 
13
- **preparación → renderizado → reseteo (en caso de error) → finalización**
13
+ ```tsx
14
+ // src/components/template.tsx
15
+ import { GriddoIntegrations } from "@griddo/cx/react";
16
+ ```
17
+
18
+ ## Exports
19
+
20
+ CX tiene dos exports separados: **main y react**.
21
+
22
+ - **main** se exporta en `@griddo/cx` . Es código que se ejecuta en un entorno nodejs.
23
+ - **react** se exporta en `@griddo-cx/react` . Es código React :)
24
+
25
+ **Ejemplo de import**
26
+
27
+ ```tsx
28
+ // React import
29
+ import { GriddoIntegrations } from "@griddo/cx/react";
30
+ // Core import
31
+ import {
32
+ IS_COMPONENT_LIBRARY,
33
+ PROJECT_ALIASES,
34
+ resolveComponentsPath,
35
+ } from "@griddo/cx";
36
+ ```
37
+
38
+ ## Bundle
14
39
 
15
- El ciclo se inicia cuando la **infra** detecta la necesidad de un nuevo render y orquesta el proceso invocando al CLI de CX con una serie de comandos. A continuación, se detallan las fases y los comandos asociados.
40
+ El bundle del código TypeScript se genera con [esbuild](https://esbuild.github.io/). Compilando el código a CommonJS junto con las definiciones de tipos.
16
41
 
17
- ### 1. `prepare-renders-domain`
42
+ Se puede ejecutar el bundle de todo CX con `yarn run build` desde `packages/griddo-cx` . Esto creará los distintos exports: _node_, _react_ y también los scripts para _infra_: reset-render, build-complete y upload-search-content junto con los archivos de definición de tipos.
18
43
 
19
- La **infra** inicia esta fase ejecutando:
20
- `node cli.mjs prepare-renders-domain --root=<builder-root-dir>`
44
+ Este comando, `yarn run build` se ejecuta en el despliegue del monorepo, npm prepare, etc. No es necesario que manualmente hagamos un build para los despliegues.
21
45
 
22
- 1. **Creación de la caché**: Se crea el directorio `<builder-root-dir>/.cx-cache` y, dentro de él, el archivo `db.json`. Este archivo actúa como una base de datos interna para almacenar metadatos del render (dominios, modos de render, hashes, etc.). El directorio `.cx-cache` también almacena archivos de caché de Gatsby y de CX.
23
- 2. **Generación de la lista de dominios**: Se genera el archivo `<cx-package>/domains.json`, que contiene la lista de dominios a renderizar (ej: `["pro-griddo", "pre-griddo"]`), ordenados por la cantidad de páginas de menor a mayor. Está previsto que este archivo sea reemplazado por `db.json` en el futuro.
46
+ # Features
24
47
 
25
- ### 2. `start-render` (por dominio)
48
+ ## Archivo de configuración
26
49
 
27
- Para cada dominio, la **infra** ejecuta:
28
- `node cli.mjs start-render`
50
+ CX tiene un archivo de configuración en el raíz del package `griddo-cx/cx.config.js` donde se establecen ciertos valores globales para todo el package.
29
51
 
30
- Este es el comando principal y gestiona la mayor parte del proceso de renderizado.
52
+ Los siguientes puntos están incluidos en el archivo de configuración y deben ser leídos de este, evitando hardcodear o volver a calcularlos en el resto del código.
31
53
 
32
- 1. Se realiza una comprobación de estado (**`check-health`**). Si esta verificación falla, el render se aborta y el proceso de Node finaliza con un código de error.
33
- 2. Si el `check-health` es exitoso, comienza el renderizado con sus sub-fases correspondientes: **restore**, **data**, **ssg**, **archive**, etc.
34
- 3. **Manejo de errores**: Si ocurre un error durante el renderizado, se aplican las siguientes lógicas de recuperación:
35
- - Si el fallo ocurre en una fase inicial segura (ej: durante el login), el render se reintenta automáticamente.
36
- - Si el fallo ocurre tras haber modificado archivos del _bundle_ o descargado datos, el sistema realiza una limpieza para evitar un estado corrupto:
37
- - Se elimina el directorio `exports/sites/<domain>/dist`.
38
- - Se restaura una copia de seguridad desde `exports/sites/<domain>/dist-backup`, si existe. Si no hay _backup_, el siguiente render será más lento, ya que deberá reconstruir el _bundle_ desde cero.
39
- - En cualquier caso de error, el `RenderMode` del dominio se forzará a **`FROM_SCRATCH`** por seguridad. Para más información, consulta la sección [Rollback por Errores](#rollback-por-errores-funcionamiento-optimista).
54
+ ```jsx
55
+ const config = {
56
+ proDomain: "pro-", // Prefijo para los dominios "pro"
57
+ griddoVersion, // Versión de griddo obtenida del package.json
58
+ buildReportFileName: "build-report.json", // Archivo de reporte de render
59
+ // función que resuelve la ruta absoluta a los placeholders
60
+ paths: (domain) => ({
61
+ __cache: path.join(CX_CACHE_DIR, domain || ""),
62
+ __components: COMPONENTS_DIR,
63
+ __cx: CX_ROOT_DIR,
64
+ __exports: path.join(EXPORTS_DIR, domain || ""),
65
+ __root: REPO_ROOT_DIR,
66
+ __ssg: SSG_DIR,
67
+ }),
68
+ };
69
+ ```
40
70
 
41
- Una vez `start-render` finaliza, la **infra** actúa según el resultado:
71
+ El contenido del archivo de configuración se leerá con la función `getConfig()` donde sea que necesitemos acceder a la misma.
42
72
 
43
- - **Si falla**: La **infra** ejecuta `node cli.mjs reset-render` para limpiar el estado.
44
- - **Si tiene éxito**: La **infra** comienza la subida de los artefactos generados a S3.
73
+ **Ejemplo**
45
74
 
46
- ### 3. `end-render` (por dominio)
75
+ ```tsx
76
+ const config = getConfig()
77
+ const { proDomain, ... } = config
78
+ ```
47
79
 
48
- Cuando la subida a S3 ha finalizado con éxito, la **infra** notifica a CX ejecutando:
49
- `node cli.mjs end-render --domain=<domain-name>`
80
+ ### Dominio \*pro-\*\*
50
81
 
51
- ### `upload-search-content`
82
+ En los renders de Griddo se diferencia cuando el render es de un dominio de producción, esto es que el dominio interno empieza por `pro-` , por ejemplo `pro-griddo`
52
83
 
53
- La **infra** ejecuta este comando para todos los dominios de la instancia:
54
- `node cli.mjs upload-search-content`
84
+ Este `pro-` se especifica directamente y una sola vez en el archivo de configuración.
55
85
 
56
- Este script sube contenido a la base de datos de búsqueda mediante una llamada `POST` a la API. Su ejecución depende de una variable de entorno; si no está activada, el script no realiza ninguna acción.
86
+ ### Versión de Griddo
57
87
 
58
- Aunque es un proceso independiente, requiere que un render previo se haya completado para disponer de contenido actualizado. Si la funcionalidad de _embeddings_ está activa, también se encarga de invocarlos.
88
+ Si es necesario obtener la versión de CX la podemos tomar directamente del archivo de configuración
59
89
 
60
- ---
90
+ ### Sistema de paths interno
61
91
 
62
- ## Render Incremental y `RenderMode`
92
+ Mediante el archivo de configuración se establecen unas rutas absolutas globales a todo CX e instancia (ya sea instancia interna del monorepo o la de un cliente) que nos ayudará a orquestar los artefactos durante los LifeCycles de un render. Un uso parecido a los `__dirname` o `__filename` de javascript CommonJS.
63
93
 
64
- El flujo del render incremental utiliza las mismas fases descritas anteriormente. La principal diferencia radica en cómo `prepare-renders-domain` determina la estrategia a seguir para cada dominio y cómo se llama a Gatsby tan solo con ls páginas necesarias, necesitando después una sincronización entre la salida de Gatsby y el render previo.
94
+ **Rutas con el dominio actual concatenado**
65
95
 
66
- Para optimizar el proceso, `prepare-renders-domain` analiza cada dominio y le asigna un `RenderMode`, que define si un dominio tiene cambios, si es su primer render, o si puede ser ignorado.
96
+ Ya que la mayoría de las veces el uso de estas rutas son durante el render de un dominio, la ruta incluirá el dominio para así hacer operaciones más fácilmente sin tener que estar adjuntándolo (concat) constantemente. Esto es así para los placeholders `__exports` y `__cache` . Para ello a `paths()` hay que pasarle el dominio como único argumento cuando obtengamos las rutas con `config.paths()`
67
97
 
68
- Posteriormente, `start-render` realiza una segunda evaluación de los `RenderMode` para manejar posibles efectos secundarios o inconsistencias detectadas tras la primera evaluación. Por ejemplo, un dominio marcado como `INCREMENTAL` podría pasar a `FROM_SCRATCH` si se detecta un error en un render previo.
98
+ **Ejemplo**
69
99
 
70
- Los `RenderMode` disponibles son:
100
+ ```tsx
101
+ const { __exports, __cache } = getConfig().paths("mi-dominio");
102
+ console.log(__exports); // ...export/sites/**mi-dominio**
103
+ console.log(__cache); // ...griddo-cx/.cx-cache/**mi-dominio**
104
+ ```
71
105
 
72
- - **`FROM_SCRATCH`**: Indica que el dominio debe ser renderizado completamente desde cero. Esto ocurre en el primer render, tras un cambio de código en la instancia, o si un render anterior falló.
73
- - **`INCREMENTAL`**: Indica que el dominio ya tiene un render previo válido. El nuevo render solo procesará las páginas nuevas, modificadas o eliminadas. Tras el cómputo, CX realiza una **sincronización** entre los nuevos artefactos y los existentes.
74
- > Este modo implicó un refactor significativo en CX. La sincronización que antes delegaba en Gatsby ahora es gestionada al 100% por CX, lo que requirió un análisis detallado de su funcionamiento interno (ej: `page-data.json`).
75
- - **`IDLE`**: El dominio no presenta ningún cambio y, por tanto, se ignora. Aunque `start-render` se ejecuta, el proceso finaliza inmediatamente indicando que no hay tareas que realizar. En este caso, no se ejecutan `end-render` ni `upload-search-content`.
106
+ Esta son las rutas existentes.
76
107
 
77
- ---
108
+ - `__cx` La ruta absoluta del package de CX
109
+ - `__ssg` La ruta absoluta del SGG configurado
110
+ - `__exports` La ruta donde se aloja el render final
111
+ - `__cache` La ruta del caché de CX, donde se guardan artefactos entre renders
112
+ - `__components` La ruta de la instancia. En el monorepo la de `griddo-components`
113
+ - `__root` El directorio raíz siempre, en el monorepo y en la instancia. (uso residual)
78
114
 
79
- ## Carpetas de CX
115
+ **Ejemplo de uso real**
80
116
 
81
- En CX existen dos ubicaciones principales relacionadas con el render: una donde CX guarda sus cachés y otra donde CX deja el resultado del render para que infra lo suba definitivamente a S3 para publicar los sites.
117
+ ```tsx
118
+ import { getConfig } from "./utils/config";
82
119
 
83
- Ambos directorios se guardan en el directorio pasado como argumento al cli mediante `--root`
120
+ // Sin dominio
121
+ const config = await getConfig();
122
+ const { __cx, __ssg } = config.paths();
123
+ const storeDir = path.join(__cx, "store");
124
+ const templateFile = path.join(__ssg, "src/components/template.tsx");
84
125
 
85
- ## CLI de CX
126
+ // Con dominio
127
+ const { __cache } = config.paths("pre-griddo");
128
+ console.log(__exports); // /griddo/packages/griddo-cx/.cx-cache/**pre-griddo**
129
+ ```
86
130
 
87
- CX proporciona una interfaz de línea de comandos para ejecutar las distintas fases del renderizado. Se puede obtener ayuda sobre los comandos disponibles ejecutando `node cli.mjs` o `node cli.mjs --help`.
131
+ ## LifeCycles
88
132
 
89
- **Ejemplos de uso:**
133
+ Los LifeCycles se utilizan dentro del contexto de un _Adapter_. Se usa a través de la función `doLifeCycle` que ejecuta un batch de funciones (`actions`) de forma secuencial. Informando por consola del inicio, fin y tiempo invertido en ejecutar todas las funciones del `actions`, manejando cualquier error en las mismas. En caso de error, es posible indicar un número de _attempts_ que hará que se ejecute de nuevo el clico de vida las veces indicadas.
90
134
 
91
- ```bash
92
- # Resetear un render fallido
93
- node cli.mjs reset-render
135
+ En CX existen estos LifeCycles: `Prepare`, `Restore`, `Data`, `SSG`, `Relocation`, `Meta`, `Archive`, `Clean`, `HealthCheck` y uno de `__DEBUG__` internamente son iguales (usan `doLifeCycle`) y se utilizan estos distintos nombres para identificarlos dentro de un render, poner distintos _attempts_, etc..
94
136
 
95
- # Preparar los dominios para el renderizado
96
- node cli.mjs prepare-domains-render --root=<path-builder-cx-root>
137
+ **Ejemplo:**
97
138
 
98
- # Iniciar el render de un dominio específico
99
- node cli.mjs start-render --domain=<domain-name>
139
+ ```tsx
140
+ await doLifeCycle({
141
+ name: "SSG",
142
+ attempts: 2, // intentará hacer **todos** las actions dos veces si hay un error en alguno de ellos
143
+ actions: [func1, func2, func3],
144
+ });
100
145
  ```
101
146
 
102
- ## Argumentos:
147
+ # Scripts para infra.
148
+
149
+ Como hemos visto uno de los consumidores de CX son scripts “individuales” que están alojados en `griddo-cx/src/scripts` Estos scripts son siempre llamados por infra, o por el desarrollador cuando se hacen render en local.
150
+
151
+ ## `start-render`
152
+
153
+ CX es una biblioteca por lo tanto no tiene nada ejecutable como tal, no hay un entry point desde el punto de vista del _package_. En el package.json existe un binario `griddo-cx` que usa infra/API para ejecutar un render, este binario apunta a `griddo-cx/start-rener.js` con el que se desencadena el proceso de publicación.
154
+
155
+ ## `reset-render`
156
+
157
+ Lo ejecuta infra mediante `yarn run reset-render` . Este resetea la API en caso de que un render salga mal. De esa manera la API al ser preguntada volverá a comunicar que hay un render pendiente y comenzará con ello de nuevo.
158
+
159
+ Si no se llamase correctamente al script, la API se quedaría esperando a que finalice el render “eternamente”. Hay un time-out de X horas.
160
+
161
+ ## `build-complete`
162
+
163
+ Lo ejecuta infra mediante `yarn run build-complete` cuando un render acaba de manera exitosa y el contenido ha sido subido al servidor, es decir, cuando se ha completado **una publicación**. Este script envía a la API información del render y le comunica que este ha terminado y que está disponible para un rrnuevo render.
164
+
165
+ ## `upload-search-content`
166
+
167
+ Lo ejecuta infra mediante `yarn run upload-search-content` cuando un render ha acabado o con cierta frecuencia. Sube contenido de los estáticos del render a un endpoint para el uso en buscadores.
168
+
169
+ # Adapter
170
+
171
+ Un Adapter es una función que se ejecuta en el script `start-render.js` que es el que se triggea cuando API avisa de un nuevo render. Los Adapters están en el directorio `griddo-cx/exporter/adapters`
172
+
173
+ El Adapter es el responsable de manejar el proceso de render mediante las utilidades de la biblioteca. En el proceso puede hacer lo que estime oportuno salvando ciertas obligaciones para que un render sea Griddo-compliant.
174
+
175
+ <aside>
176
+ 💡 Los Adapters utilizarán el código TypeScript de CX, no el bundlelizado. Ya que el propio adapter también se bundleliza.
177
+
178
+ </aside>
179
+
180
+ ### **Obligaciones de un Adapter**
181
+
182
+ **Exports**
183
+
184
+ **Dist**
185
+
186
+ Dejar una carpeta con los archivos estáticos finales en el path `__exports` , que es una carpeta `exports/sites/<dominio>/dist` donde `dominio` es cada dominio de la instancia de Griddo. Una vez terminado el render, _infra_ tomará esa carpeta y la subirá. Infra la sube mediante sincronización por lo que siempre tiene que estar actualizada y con la totalidad de los datos. Si en la carpeta destino hay un archivo que no existe en la carpeta fuente `exports/sites/<dominio>/dist` se borrará.
187
+
188
+ **Assets**
189
+
190
+ Igualmente dejar una carpeta con los “assets” de javascript. Esto es verdad en el mundo Gatsby no sabremos qué pasará con otros frameworks.
191
+
192
+ **Caches**
193
+
194
+ El adapter deberá manejar manualmente la caché de Griddo utilizando las funciones `moveDirsSync`, `copyDirsSync` y `removeDirsSync`.
195
+
196
+ La caché de Griddo son dos directorios que se crean en `griddo-cx` por cada render y dominio: `store` y `apiCache` . Para facilitar el trabajo CX cuenta con placeholders para las rutas, en este caso `__cache` que haría referencia `griddo-cx/.cx-cache/<domain>`
197
+
198
+ ```tsx
199
+ griddo-cx
200
+ |-.cx-cache
201
+ |- store
202
+ |- apiCache
203
+ ```
204
+
205
+ ¿Cómo se maneja la caché? ¿Qué hago con ella?
206
+
207
+ Los datos de la caché se generan de forma automática en `griddo-cx`El manejo se basa en _restaurar (Restore)_, _archivar_ (Arhive) o _invalidar (Clean)_ los directorios de la caché, tanto `store` como `apiCache`
208
+
209
+ **Restaurando la caché**
210
+
211
+ Cuando se inicia un render debemos mover tanto `store` como `apiCache` que estarán dentro de `griddo-cx/.rendrr-cache/<dominio>` al raíz de CX `griddo-cx` para que el proceso de render haga uso de las mismas.
212
+
213
+ **Archivando la caché**
214
+
215
+ Cuando el render de un dominio termina correctamente, se deben mover las carpetas `store` y `apiCache` a la carpeta de caches `griddo-cx/.cx-cache/<domain>` para poder restaurarlas en un próximo render.
216
+
217
+ **Invalidando la caché**
218
+
219
+ Si un render ha dado error pueden quedarse en el raíz de CX las carpetas `store` y `apiCache`. **Estas deben ser borradas** antes de la nueva fase de restauración. De hecho probablemente no exista nada que restaurar porque el render dio error. En ese caso lo que ocurre es que efectivamente no hay nada que restaurar y habrá que descargarse de nuevo todos los datos.
220
+
221
+ A su vez, en cada despliegue que exista en la instancia también se borrarán ya que de alguna manera se alojan en lo que sería el `node_modules` de la instancia. Y se borrará CX enteramente.
103
222
 
104
- `--domain`: El nombre del dominio sobre el que actuará el comando.
223
+ <aside>
224
+ 💡 Coming soon: Gestión automática de la caché de Griddo (no de los frameworks SSGS)
105
225
 
106
- `--root`: Directorio raíz del builder. Este directorio contiene las carpetas `exports/sites` y `.cx-cache`.
226
+ </aside>
107
227
 
108
- ## Rollback por Errores (Funcionamiento Optimista)
228
+ # Logs
109
229
 
110
- El render de CX opera de forma "optimista", lo que significa que modifica directamente los archivos en la carpeta de destino `exports/sites/<domain>/*` en lugar de trabajar en un directorio temporal.
230
+
111
231
 
112
- Este enfoque mejora el rendimiento, pero implica que si se produce un error, es crucial revertir los cambios para no dejar el sitio en un estado corrupto. Este proceso de restauración y limpieza se detalla en la sección de manejo de errores de `start-render`.
232
+ # Errores
113
233
 
114
- ## Tareas Pendientes (TODO)
234
+
115
235
 
116
- - Implementar `--root` en el CLI, solo en el `prepare-domains-render` y este ya lo deja escrito en `db.json`
117
- - Optimizar el caso en que un dominio solo tenga páginas para despublicar y/o eliminar. En esta situación, no sería necesario ejecutar Gatsby; bastaría con una sincronización para eliminar los archivos html y page-data correspondientes y regenerar los sitemaps.
236
+ # Testing
118
237
 
238
+
119
239
 
120
- ## Flujos de errores
240
+ # FAQ’s
121
241
 
122
- - (start-render) login error -> exit
123
- - (start-render) retry n -> exit -> rollback? -> reset-render
124
- - (end-render) exit -> reset-render
242
+ ### ¿Griddo procesa imágenes en tiempo de render?
125
243
 
126
- ## TODO:
244
+ No, los proyectos actuales de Griddo se apoyan en imágenes alojadas en remoto, en concreto en un servicio externo “DAM” propiedad de Secuoyas. Este servicio ofrece las transformaciones necesarias. Existen un componente de React en Griddo `<GriddoImage>` que las instancias pueden utilizar y que se integra con el “DAM”.
127
245
 
128
- - Usar el CLI.
129
- - Rollback. Ver qué hacemos con el dist-backup... copy y después rsync.
130
- - Llamar a search y embedding sigue igual: se sube para todos los dominios que tengan algo en exports...
131
- - Usar db.json en lugar de archivo domains si es posible... (actualmente se lee domains.json)
246
+ Algunas de las primeras instancias utilizan la misma estrategia con cloudinary, usando un componente de React proporcionado también por Griddo: `<CloudinaryImage>`
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Render every instance domain with the Gatsby adapter.
3
+ */
4
+ export declare function renderDomainsWithGatsbyAdapter(domain: string): Promise<void>;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Return the assetPrefix with the domain concatenated `assetPrefix/domain` only
3
+ * if the domain is "pro-" **and** there is a env `GRIDDO_ASSET_PREFIX` with any
4
+ * value different from `null`, `undefined` or `empty string`
5
+ *
6
+ * else...
7
+ * - If assetPrefix or domain is falsy, returns ""
8
+ * - If the domain is not "pro-", returns ""
9
+ */
10
+ declare function getGatsbyAssetPrefixWithDomain(domain: string): string;
11
+ /**
12
+ * Spawn a new node process `yarn gatsby-build`
13
+ * @note This proccess (`yarn gatsby-build`) can not access to the custom Griddo
14
+ * `process.env` so it needs variables passed to it via the `env` prop.
15
+ */
16
+ declare function runGatsbyBuildCommand(assetPrefixWithDomain: string): void;
17
+ /**
18
+ * Update the Griddo's `/dist` dir with the contents from `public` dir only
19
+ * with files of type: js, json and css.
20
+ */
21
+ declare function createDistFromGatsbyPublic(domain: string, needsAssetPrefix: boolean): Promise<void>;
22
+ export { createDistFromGatsbyPublic, getGatsbyAssetPrefixWithDomain, runGatsbyBuildCommand, };
@@ -0,0 +1,6 @@
1
+ import type { Artifacts } from "../types/global";
2
+ /**
3
+ * Returns the artifacts of CX.
4
+ */
5
+ declare function getCxArtifacts(domain: string): Artifacts;
6
+ export default getCxArtifacts;
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Here are all the environment variables that the CX code uses.
3
+ */
4
+ declare const GRIDDO_API_URL: string | undefined;
5
+ declare const GRIDDO_PUBLIC_API_URL: string | undefined;
6
+ declare const GRIDDO_BOT_USER: string | undefined;
7
+ declare const GRIDDO_BOT_PASSWORD: string | undefined;
8
+ declare const GRIDDO_API_CONCURRENCY_COUNT: number;
9
+ declare const GRIDDO_RENDER_ALL_SITES: boolean;
10
+ declare const GRIDDO_RENDER_SITE: number;
11
+ declare const GRIDDO_RENDER_PAGES: number[];
12
+ declare const GRIDDO_SKIP_BUILD_CHECKS: boolean;
13
+ declare const GRIDDO_DEBUG_LOGS: boolean;
14
+ declare const GRIDDO_BUILD_LOGS: boolean;
15
+ declare const GRIDDO_RENDER_BREAKPOINTS_FEATURE: boolean;
16
+ declare const GRIDDO_SSG_VERBOSE_LOGS: boolean;
17
+ declare const GRIDDO_SEARCH_FEATURE: boolean;
18
+ declare const GRIDDO_ASSET_PREFIX: string | undefined;
19
+ declare const GRIDDO_REACT_APP_INSTANCE: string | undefined;
20
+ declare const GRIDDO_AI_EMBEDDINGS: boolean;
21
+ declare const GRIDDO_VERBOSE_LOGS: boolean;
22
+ declare const GRIDDO_ALERT_FEATURE: boolean;
23
+ declare const GRIDDO_API_MAX_RESPONSE_SIZE: number;
24
+ declare const GRIDDO_SSG_MAX_PAGE_SIZE: number;
25
+ declare const GRIDDO_INIT_LIFECYCLE_MAX_ATTEMPTS: number;
26
+ declare const GRIDDO_CLEAN_LIFECYCLE_MAX_ATTEMPTS: number;
27
+ declare const GRIDDO_CLOSE_LIFECYCLE_MAX_ATTEMPTS: number;
28
+ declare const GRIDDO_PREPARE_LIFECYCLE_MAX_ATTEMPTS: number;
29
+ declare const GRIDDO_RESTORE_LIFECYCLE_MAX_ATTEMPTS: number;
30
+ declare const GRIDDO_DATA_LIFECYCLE_MAX_ATTEMPTS: number;
31
+ declare const GRIDDO_SSG_LIFECYCLE_MAX_ATTEMPTS: number;
32
+ declare const GRIDDO_RELOCATION_LIFECYCLE_MAX_ATTEMPTS: number;
33
+ declare const GRIDDO_META_LIFECYCLE_MAX_ATTEMPTS: number;
34
+ declare const GRIDDO_ARCHIVE_LIFECYCLE_MAX_ATTEMPTS: number;
35
+ declare const GRIDDO_FIXTURES_DOMAIN_NAMES: string | undefined;
36
+ declare const GRIDDO_FIXTURES_SITE_NAMES: string | undefined;
37
+ export { GRIDDO_AI_EMBEDDINGS, GRIDDO_ALERT_FEATURE, GRIDDO_API_CONCURRENCY_COUNT, GRIDDO_API_MAX_RESPONSE_SIZE, GRIDDO_API_URL, GRIDDO_ARCHIVE_LIFECYCLE_MAX_ATTEMPTS, GRIDDO_ASSET_PREFIX, GRIDDO_BOT_PASSWORD, GRIDDO_BOT_USER, GRIDDO_BUILD_LOGS, GRIDDO_CLEAN_LIFECYCLE_MAX_ATTEMPTS, GRIDDO_CLOSE_LIFECYCLE_MAX_ATTEMPTS, GRIDDO_DATA_LIFECYCLE_MAX_ATTEMPTS, GRIDDO_DEBUG_LOGS, GRIDDO_FIXTURES_DOMAIN_NAMES, GRIDDO_FIXTURES_SITE_NAMES, GRIDDO_INIT_LIFECYCLE_MAX_ATTEMPTS, GRIDDO_META_LIFECYCLE_MAX_ATTEMPTS, GRIDDO_PREPARE_LIFECYCLE_MAX_ATTEMPTS, GRIDDO_PUBLIC_API_URL, GRIDDO_REACT_APP_INSTANCE, GRIDDO_RELOCATION_LIFECYCLE_MAX_ATTEMPTS, GRIDDO_RENDER_ALL_SITES, GRIDDO_RENDER_BREAKPOINTS_FEATURE, GRIDDO_RENDER_PAGES, GRIDDO_RENDER_SITE, GRIDDO_RESTORE_LIFECYCLE_MAX_ATTEMPTS, GRIDDO_SEARCH_FEATURE, GRIDDO_SKIP_BUILD_CHECKS, GRIDDO_SSG_LIFECYCLE_MAX_ATTEMPTS, GRIDDO_SSG_MAX_PAGE_SIZE, GRIDDO_SSG_VERBOSE_LOGS, GRIDDO_VERBOSE_LOGS, };
@@ -0,0 +1,57 @@
1
+ import type { LifeCyclesNames } from "../types/global";
2
+ declare const endpoints: {
3
+ ALERT: string;
4
+ AI_EMBEDDINGS: string;
5
+ BUILD_END: string[];
6
+ BUILD_START: string[];
7
+ DOMAINS: string;
8
+ GET_ALL: string;
9
+ GET_PAGE: string;
10
+ GET_PAGES: string[];
11
+ GET_REFERENCE_FIELD_DATA: string[];
12
+ GET_SITEMAP: string[];
13
+ INFO: string[];
14
+ LANGUAGES: string[];
15
+ LOGIN: string;
16
+ RESET_RENDER: string;
17
+ ROBOTS: string;
18
+ SEARCH: string;
19
+ SETTINGS: string;
20
+ SOCIALS: string[];
21
+ };
22
+ declare const envs: {
23
+ GRIDDO_AI_EMBEDDINGS: boolean;
24
+ GRIDDO_ALERT_FEATURE: boolean;
25
+ GRIDDO_API_CONCURRENCY_COUNT: number;
26
+ GRIDDO_API_MAX_RESPONSE_SIZE: number;
27
+ GRIDDO_API_URL: string | undefined;
28
+ GRIDDO_ARCHIVE_LIFECYCLE_MAX_ATTEMPTS: number;
29
+ GRIDDO_ASSET_PREFIX: string | undefined;
30
+ GRIDDO_BOT_PASSWORD: string | undefined;
31
+ GRIDDO_BOT_USER: string | undefined;
32
+ GRIDDO_BUILD_LOGS: boolean;
33
+ GRIDDO_CLEAN_LIFECYCLE_MAX_ATTEMPTS: number;
34
+ GRIDDO_CLOSE_LIFECYCLE_MAX_ATTEMPTS: number;
35
+ GRIDDO_DATA_LIFECYCLE_MAX_ATTEMPTS: number;
36
+ GRIDDO_DEBUG_LOGS: boolean;
37
+ GRIDDO_FIXTURES_DOMAIN_NAMES: string | undefined;
38
+ GRIDDO_FIXTURES_SITE_NAMES: string | undefined;
39
+ GRIDDO_META_LIFECYCLE_MAX_ATTEMPTS: number;
40
+ GRIDDO_PREPARE_LIFECYCLE_MAX_ATTEMPTS: number;
41
+ GRIDDO_PUBLIC_API_URL: string | undefined;
42
+ GRIDDO_REACT_APP_INSTANCE: string | undefined;
43
+ GRIDDO_RELOCATION_LIFECYCLE_MAX_ATTEMPTS: number;
44
+ GRIDDO_RENDER_ALL_SITES: boolean;
45
+ GRIDDO_RENDER_BREAKPOINTS_FEATURE: boolean;
46
+ GRIDDO_RENDER_PAGES: number[];
47
+ GRIDDO_RENDER_SITE: number;
48
+ GRIDDO_RESTORE_LIFECYCLE_MAX_ATTEMPTS: number;
49
+ GRIDDO_SEARCH_FEATURE: boolean;
50
+ GRIDDO_SKIP_BUILD_CHECKS: boolean;
51
+ GRIDDO_SSG_LIFECYCLE_MAX_ATTEMPTS: number;
52
+ GRIDDO_SSG_MAX_PAGE_SIZE: number;
53
+ GRIDDO_SSG_VERBOSE_LOGS: boolean;
54
+ GRIDDO_VERBOSE_LOGS: boolean;
55
+ };
56
+ declare const lifeCycleNames: Record<LifeCyclesNames, LifeCyclesNames>;
57
+ export { endpoints, envs, lifeCycleNames };