@griddo/cx 11.9.11-rc.9 → 11.9.12-rc.0

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 (254) hide show
  1. package/README.md +13 -240
  2. package/build/commands/end-render.d.ts +0 -1
  3. package/build/commands/end-render.js +31 -0
  4. package/build/commands/end-render.js.map +7 -0
  5. package/build/commands/prepare-assets-directory.js +9 -0
  6. package/build/commands/prepare-assets-directory.js.map +7 -0
  7. package/build/commands/prepare-domains-render.js +38 -0
  8. package/build/commands/prepare-domains-render.js.map +7 -0
  9. package/build/commands/reset-render.d.ts +0 -1
  10. package/build/commands/reset-render.js +31 -0
  11. package/build/commands/reset-render.js.map +7 -0
  12. package/build/commands/single-domain-upload-search-content.d.ts +1 -0
  13. package/build/commands/start-render.d.ts +0 -1
  14. package/build/commands/start-render.js +66 -0
  15. package/build/commands/start-render.js.map +7 -0
  16. package/build/commands/upload-search-content.d.ts +0 -1
  17. package/build/commands/upload-search-content.js +32 -0
  18. package/build/commands/upload-search-content.js.map +7 -0
  19. package/build/core/GriddoLog.d.ts +16 -0
  20. package/build/{utils/health-checks.d.ts → core/check-env-health.d.ts} +4 -2
  21. package/build/core/db-class.d.ts +11 -0
  22. package/build/core/db.d.ts +4 -0
  23. package/build/core/dist-rollback.d.ts +11 -0
  24. package/build/core/errors.d.ts +26 -0
  25. package/build/core/fs.d.ts +69 -0
  26. package/build/core/life-cycle.d.ts +26 -0
  27. package/build/core/logger.d.ts +18 -0
  28. package/build/core/objects.d.ts +11 -0
  29. package/build/core/print-logos.d.ts +5 -0
  30. package/build/index.d.ts +10 -29
  31. package/build/index.js +406 -73
  32. package/build/react/DynamicScript/index.d.ts +4 -0
  33. package/build/react/GriddoFavicon/index.d.ts +4 -0
  34. package/build/react/GriddoIntegrations/index.d.ts +3 -4
  35. package/build/react/GriddoIntegrations/utils.d.ts +7 -6
  36. package/build/react/GriddoOpenGraph/index.d.ts +10 -0
  37. package/build/react/index.d.ts +3 -2
  38. package/build/react/index.js +1 -3
  39. package/build/{utils → services}/api.d.ts +1 -1
  40. package/build/services/auth.d.ts +2 -5
  41. package/build/services/domains.d.ts +3 -4
  42. package/build/services/manage-sites.d.ts +22 -0
  43. package/build/services/manage-store.d.ts +32 -0
  44. package/build/services/navigation.d.ts +16 -16
  45. package/build/{utils → services}/pages.d.ts +3 -3
  46. package/build/services/reference-fields.d.ts +3 -3
  47. package/build/services/render-artifacts.d.ts +6 -0
  48. package/build/services/render.d.ts +70 -0
  49. package/build/services/robots.d.ts +2 -19
  50. package/build/services/sitemaps.d.ts +5 -0
  51. package/build/services/sites.d.ts +8 -5
  52. package/build/services/store.d.ts +10 -1
  53. package/build/shared/context.d.ts +36 -0
  54. package/build/shared/envs.d.ts +19 -0
  55. package/build/{errors/errors-data.d.ts → shared/errors.d.ts} +5 -3
  56. package/build/shared/npm-modules/brush.d.ts +18 -0
  57. package/build/shared/npm-modules/find-up-simple.d.ts +34 -0
  58. package/build/shared/npm-modules/pkg-dir.d.ts +7 -0
  59. package/build/shared/npm-modules/xml-parser.d.ts +4 -0
  60. package/build/{types → shared/types}/api.d.ts +18 -18
  61. package/build/{types → shared/types}/global.d.ts +15 -16
  62. package/build/{types → shared/types}/navigation.d.ts +5 -5
  63. package/build/{types → shared/types}/pages.d.ts +9 -9
  64. package/build/shared/types/render.d.ts +54 -0
  65. package/build/{types → shared/types}/sites.d.ts +18 -19
  66. package/build/shared/types.d.ts +15 -0
  67. package/build/ssg-adapters/gatsby/actions/clean.d.ts +3 -0
  68. package/build/ssg-adapters/gatsby/actions/close.d.ts +3 -0
  69. package/build/ssg-adapters/gatsby/actions/data.d.ts +2 -0
  70. package/build/ssg-adapters/gatsby/actions/healthCheck.d.ts +2 -0
  71. package/build/ssg-adapters/gatsby/actions/init.d.ts +2 -0
  72. package/build/ssg-adapters/gatsby/actions/logs.d.ts +3 -0
  73. package/build/ssg-adapters/gatsby/actions/meta.d.ts +2 -0
  74. package/build/ssg-adapters/gatsby/actions/prepare.d.ts +2 -0
  75. package/build/ssg-adapters/gatsby/actions/relocation.d.ts +2 -0
  76. package/build/ssg-adapters/gatsby/actions/restore.d.ts +3 -0
  77. package/build/ssg-adapters/gatsby/actions/ssg.d.ts +3 -0
  78. package/build/ssg-adapters/gatsby/actions/sync.d.ts +3 -0
  79. package/build/ssg-adapters/gatsby/index.d.ts +9 -0
  80. package/build/ssg-adapters/gatsby/shared/artifacts.d.ts +4 -0
  81. package/build/ssg-adapters/gatsby/shared/diff-assets.d.ts +15 -0
  82. package/build/ssg-adapters/gatsby/shared/extract-assets.d.ts +7 -0
  83. package/build/ssg-adapters/gatsby/shared/gatsby-build.d.ts +7 -0
  84. package/build/ssg-adapters/gatsby/shared/render-rollback.d.ts +18 -0
  85. package/build/ssg-adapters/gatsby/shared/sync-render.d.ts +26 -0
  86. package/build/ssg-adapters/gatsby/shared/types.d.ts +34 -0
  87. package/cli.mjs +231 -0
  88. package/exporter/build-esbuild.noop +42 -0
  89. package/exporter/build.sh +16 -24
  90. package/exporter/commands/README.md +151 -0
  91. package/exporter/commands/end-render.ts +65 -86
  92. package/exporter/commands/prepare-assets-directory.ts +35 -0
  93. package/exporter/commands/prepare-domains-render.ts +132 -35
  94. package/exporter/commands/reset-render.ts +13 -8
  95. package/exporter/commands/single-domain-upload-search-content.ts +206 -0
  96. package/exporter/commands/start-render.ts +26 -64
  97. package/exporter/commands/upload-search-content.ts +204 -26
  98. package/exporter/core/GriddoLog.ts +45 -0
  99. package/exporter/core/check-env-health.ts +204 -0
  100. package/exporter/core/db-class.ts +54 -0
  101. package/exporter/core/db.ts +33 -0
  102. package/exporter/core/dist-rollback.ts +49 -0
  103. package/exporter/core/errors.ts +93 -0
  104. package/exporter/core/fs.ts +385 -0
  105. package/exporter/{utils → core}/images.ts +1 -6
  106. package/exporter/{utils → core}/instance.ts +9 -13
  107. package/exporter/core/life-cycle.ts +73 -0
  108. package/exporter/core/logger.ts +141 -0
  109. package/exporter/core/objects.ts +37 -0
  110. package/exporter/core/print-logos.ts +21 -0
  111. package/exporter/index.ts +14 -56
  112. package/exporter/react/DynamicScript/index.tsx +33 -0
  113. package/exporter/react/{Favicon → GriddoFavicon}/index.tsx +3 -9
  114. package/exporter/react/GriddoIntegrations/index.tsx +17 -23
  115. package/exporter/react/GriddoIntegrations/utils.ts +24 -12
  116. package/exporter/react/GriddoOpenGraph/index.tsx +39 -0
  117. package/exporter/react/index.tsx +3 -9
  118. package/exporter/services/api.ts +306 -0
  119. package/exporter/services/auth.ts +8 -10
  120. package/exporter/services/domains.ts +23 -8
  121. package/exporter/services/manage-sites.ts +116 -0
  122. package/exporter/services/manage-store.ts +173 -0
  123. package/exporter/services/navigation.ts +12 -18
  124. package/exporter/{utils → services}/pages.ts +27 -92
  125. package/exporter/services/reference-fields.ts +14 -32
  126. package/exporter/services/render-artifacts.ts +44 -0
  127. package/exporter/services/render.ts +229 -0
  128. package/exporter/services/robots.ts +33 -61
  129. package/exporter/services/sitemaps.ts +129 -0
  130. package/exporter/services/sites.ts +40 -28
  131. package/exporter/services/store.ts +354 -321
  132. package/exporter/shared/context.ts +49 -0
  133. package/exporter/{constants → shared}/endpoints.ts +12 -11
  134. package/exporter/shared/envs.ts +62 -0
  135. package/exporter/{errors/errors-data.ts → shared/errors.ts} +24 -14
  136. package/exporter/shared/npm-modules/README.md +36 -0
  137. package/exporter/shared/npm-modules/brush.ts +34 -0
  138. package/exporter/shared/npm-modules/find-up-simple.ts +100 -0
  139. package/exporter/shared/npm-modules/pkg-dir.ts +17 -0
  140. package/exporter/shared/npm-modules/xml-parser.ts +57 -0
  141. package/exporter/{types → shared/types}/api.ts +40 -41
  142. package/exporter/{types → shared/types}/global.ts +17 -21
  143. package/exporter/{types → shared/types}/navigation.ts +3 -3
  144. package/exporter/{types → shared/types}/pages.ts +10 -11
  145. package/exporter/shared/types/render.ts +63 -0
  146. package/exporter/{types → shared/types}/sites.ts +18 -19
  147. package/exporter/shared/types.ts +15 -0
  148. package/exporter/ssg-adapters/gatsby/actions/clean.ts +26 -0
  149. package/exporter/ssg-adapters/gatsby/actions/close.ts +17 -0
  150. package/exporter/ssg-adapters/gatsby/actions/data.ts +22 -0
  151. package/exporter/ssg-adapters/gatsby/actions/healthCheck.ts +10 -0
  152. package/exporter/ssg-adapters/gatsby/actions/init.ts +12 -0
  153. package/exporter/ssg-adapters/gatsby/actions/logs.ts +10 -0
  154. package/exporter/ssg-adapters/gatsby/actions/meta.ts +13 -0
  155. package/exporter/ssg-adapters/gatsby/actions/prepare.ts +9 -0
  156. package/exporter/ssg-adapters/gatsby/actions/relocation.ts +15 -0
  157. package/exporter/ssg-adapters/gatsby/actions/restore.ts +21 -0
  158. package/exporter/ssg-adapters/gatsby/actions/ssg.ts +12 -0
  159. package/exporter/ssg-adapters/gatsby/actions/sync.ts +65 -0
  160. package/exporter/ssg-adapters/gatsby/index.ts +114 -0
  161. package/exporter/ssg-adapters/gatsby/shared/artifacts.ts +17 -0
  162. package/exporter/ssg-adapters/gatsby/shared/diff-assets.ts +128 -0
  163. package/exporter/ssg-adapters/gatsby/shared/extract-assets.ts +75 -0
  164. package/exporter/ssg-adapters/gatsby/shared/gatsby-build.ts +58 -0
  165. package/exporter/ssg-adapters/gatsby/shared/render-rollback.ts +33 -0
  166. package/exporter/ssg-adapters/gatsby/shared/sync-render.ts +298 -0
  167. package/exporter/ssg-adapters/gatsby/shared/types.ts +35 -0
  168. package/gatsby-browser.tsx +41 -58
  169. package/gatsby-config.ts +10 -17
  170. package/gatsby-node.ts +20 -79
  171. package/gatsby-ssr.tsx +2 -1
  172. package/package.json +41 -80
  173. package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +55 -0
  174. package/plugins/gatsby-plugin-svgr-loader/package.json +8 -0
  175. package/src/components/Head.tsx +28 -73
  176. package/src/components/template.tsx +6 -29
  177. package/src/gatsby-node-utils.ts +76 -2
  178. package/src/html.tsx +2 -11
  179. package/src/types.ts +3 -3
  180. package/tsconfig.commands.json +36 -0
  181. package/tsconfig.exporter.json +21 -0
  182. package/tsconfig.json +5 -3
  183. package/build/adapters/gatsby/index.d.ts +0 -4
  184. package/build/adapters/gatsby/utils.d.ts +0 -22
  185. package/build/artifacts/index.d.ts +0 -6
  186. package/build/constants/envs.d.ts +0 -37
  187. package/build/constants/index.d.ts +0 -57
  188. package/build/end-render.js +0 -74
  189. package/build/end-render.js.map +0 -7
  190. package/build/errors/index.d.ts +0 -15
  191. package/build/index.js.map +0 -7
  192. package/build/prepare-domains-render.js +0 -73
  193. package/build/prepare-domains-render.js.map +0 -7
  194. package/build/react/Favicon/index.d.ts +0 -5
  195. package/build/registers/api.d.ts +0 -9
  196. package/build/registers/gatsby.d.ts +0 -9
  197. package/build/registers/index.d.ts +0 -3
  198. package/build/reset-render.js +0 -74
  199. package/build/reset-render.js.map +0 -7
  200. package/build/services/register.d.ts +0 -36
  201. package/build/services/settings.d.ts +0 -4
  202. package/build/start-render.js +0 -100
  203. package/build/start-render.js.map +0 -7
  204. package/build/upload-search-content.js +0 -74
  205. package/build/upload-search-content.js.map +0 -7
  206. package/build/utils/alerts.d.ts +0 -3
  207. package/build/utils/cache.d.ts +0 -35
  208. package/build/utils/core-utils.d.ts +0 -107
  209. package/build/utils/create-build-data.d.ts +0 -8
  210. package/build/utils/domains.d.ts +0 -13
  211. package/build/utils/folders.d.ts +0 -53
  212. package/build/utils/loggin.d.ts +0 -51
  213. package/build/utils/render.d.ts +0 -13
  214. package/build/utils/searches.d.ts +0 -15
  215. package/build/utils/sites.d.ts +0 -31
  216. package/build/utils/store.d.ts +0 -81
  217. package/cx.config.d.ts +0 -5
  218. package/cx.config.js +0 -36
  219. package/exporter/adapters/gatsby/index.ts +0 -162
  220. package/exporter/adapters/gatsby/utils.ts +0 -161
  221. package/exporter/artifacts/README.md +0 -34
  222. package/exporter/artifacts/index.ts +0 -33
  223. package/exporter/commands/move-assets.ts +0 -11
  224. package/exporter/constants/envs.ts +0 -94
  225. package/exporter/constants/index.ts +0 -129
  226. package/exporter/errors/index.ts +0 -40
  227. package/exporter/registers/api.ts +0 -14
  228. package/exporter/registers/gatsby.ts +0 -14
  229. package/exporter/registers/index.ts +0 -4
  230. package/exporter/services/register.ts +0 -113
  231. package/exporter/services/settings.ts +0 -17
  232. package/exporter/utils/alerts.ts +0 -29
  233. package/exporter/utils/api.ts +0 -243
  234. package/exporter/utils/cache.ts +0 -142
  235. package/exporter/utils/core-utils.ts +0 -458
  236. package/exporter/utils/create-build-data.ts +0 -17
  237. package/exporter/utils/domains.ts +0 -39
  238. package/exporter/utils/folders.ts +0 -320
  239. package/exporter/utils/health-checks.ts +0 -64
  240. package/exporter/utils/loggin.ts +0 -184
  241. package/exporter/utils/render.ts +0 -71
  242. package/exporter/utils/searches.ts +0 -156
  243. package/exporter/utils/sites.ts +0 -312
  244. package/exporter/utils/store.ts +0 -314
  245. package/src/README.md +0 -7
  246. package/start-render.js +0 -7
  247. /package/build/commands/{move-assets.d.ts → prepare-assets-directory.d.ts} +0 -0
  248. /package/build/{utils → core}/images.d.ts +0 -0
  249. /package/build/{utils → core}/instance.d.ts +0 -0
  250. /package/build/react/{Favicon → GriddoFavicon}/utils.d.ts +0 -0
  251. /package/build/{constants → shared}/endpoints.d.ts +0 -0
  252. /package/build/{types → shared/types}/templates.d.ts +0 -0
  253. /package/exporter/react/{Favicon → GriddoFavicon}/utils.ts +0 -0
  254. /package/exporter/{types → shared/types}/templates.ts +0 -0
@@ -0,0 +1,298 @@
1
+ import fsp from "node:fs/promises";
2
+ import path from "node:path";
3
+
4
+ import pLimit from "p-limit";
5
+
6
+ import { findFilesBySuffix } from "../../../core/fs";
7
+ import { GriddoLog } from "../../../core/GriddoLog";
8
+ import { GRIDDO_SSG_BUNDLE_ANALYZER } from "../../../shared/envs";
9
+ import { getAssetsDiffBetweenRenders, patchHtmlFile } from "./diff-assets";
10
+
11
+ interface SyncRenderConfig {
12
+ src: string;
13
+ dst: string;
14
+ pagesToCreate: number[];
15
+ pagesToDelete: number[];
16
+ artifactsToCopyToExports: string[];
17
+ }
18
+ interface CopyFilePath {
19
+ from: string;
20
+ to: string;
21
+ }
22
+ interface SyncState {
23
+ htmlToAdd: CopyFilePath[];
24
+ jsonToAdd: CopyFilePath[];
25
+ htmlToDelete: string[];
26
+ jsonToDelete: string[];
27
+ }
28
+ interface PageInfo {
29
+ id: number;
30
+ composePath: string; // p.ej. '/about-us' o '/'
31
+ htmlPath: string; // p.ej. '/path/to/public/about-us/index.html'
32
+ jsonPath: string; // p.ej. '/path/to/public/page-data/about-us/page-data.json'
33
+ }
34
+ interface GatsbyPageData {
35
+ result: {
36
+ pageContext: {
37
+ id: number;
38
+ fullPath: {
39
+ site: string;
40
+ domain: string;
41
+ domainUrl: string;
42
+ language: string;
43
+ page: string;
44
+ compose: string;
45
+ };
46
+ };
47
+ };
48
+ }
49
+
50
+ class SyncRender {
51
+ private bundleDir: string;
52
+ private currentRenderDir: string;
53
+ private pagesToCreate: number[];
54
+ private pagesToDelete: number[];
55
+ private assetArtifacts: string[];
56
+
57
+ private state: SyncState = {
58
+ htmlToAdd: [],
59
+ jsonToAdd: [],
60
+ htmlToDelete: [],
61
+ jsonToDelete: [],
62
+ };
63
+
64
+ constructor(config: SyncRenderConfig) {
65
+ this.bundleDir = config.dst;
66
+ this.currentRenderDir = config.src;
67
+ this.pagesToCreate = config.pagesToCreate;
68
+ this.pagesToDelete = config.pagesToDelete;
69
+ this.assetArtifacts = config.artifactsToCopyToExports;
70
+ }
71
+
72
+ public async execute() {
73
+ await this.setPagesToDelete();
74
+ await this.setPagesToAdd();
75
+ await this.sync();
76
+ if (GRIDDO_SSG_BUNDLE_ANALYZER) {
77
+ await this.assertAssetsAreValid();
78
+ }
79
+ }
80
+
81
+ private async assertAssetsAreValid() {
82
+ const isDifferent = await getAssetsDiffBetweenRenders(this.currentRenderDir, this.bundleDir);
83
+ if (isDifferent) {
84
+ GriddoLog.info(
85
+ "Warning: JavaScript and CSS bundles must have the same files and content. You can ignore this warning if the rendering process only has pages to unpublish.",
86
+ );
87
+ } else {
88
+ GriddoLog.info("Previous and current JavaScript and CSS packages successfully matched");
89
+ }
90
+ }
91
+
92
+ private async setPagesToDelete() {
93
+ // INCLUIMOS LAS PÁGINAS A CREAR EN LAS CANDIDATAS A BORRAR
94
+ // =======================================================
95
+ // El set de ids incluye tanto las páginas a borrar como las que se van
96
+ // a crear para manejar correctamente los cambios de slug.
97
+ //
98
+ // Ejemplo: Si la página `id=3` tiene slug `about` y después viene con
99
+ // `slug=about-us`, necesitamos borrar la página `id=3` del render previo
100
+ // y volver a crearla con la nueva ruta.
101
+ //
102
+ // ¿Por qué? Porque el slug determina dónde se guarda la página:
103
+ // - /about/index.html -> /about-us/index.html
104
+ //
105
+ // Si no la borrásemos previamente, tendríamos ambas páginas:
106
+ // `/about/index.html` y `/about-us/index.html`
107
+ const candidateIdsToDelete = new Set<number>([...this.pagesToDelete, ...this.pagesToCreate]);
108
+ const existingPreviousPages = await this.scanPages(this.bundleDir);
109
+
110
+ for (const page of existingPreviousPages) {
111
+ if (candidateIdsToDelete.has(page.id)) {
112
+ this.state.htmlToDelete.push(page.htmlPath);
113
+ this.state.jsonToDelete.push(page.jsonPath);
114
+ }
115
+ }
116
+
117
+ GriddoLog.verbose(`${this.state.htmlToDelete.length} pages HTML to delete`);
118
+ GriddoLog.verbose(`${this.state.jsonToDelete.length} pages JSON to delete`);
119
+ }
120
+
121
+ private async setPagesToAdd() {
122
+ const candidateIdsToCreate = new Set<number>(this.pagesToCreate);
123
+ const newPages = await this.scanPages(this.currentRenderDir);
124
+
125
+ for (const page of newPages) {
126
+ if (candidateIdsToCreate.has(page.id)) {
127
+ const htmlTo = path.join(this.bundleDir, page.composePath, "index.html");
128
+ const normalizedCompose = page.composePath === "/" ? "index" : page.composePath;
129
+ const jsonTo = path.join(this.bundleDir, "page-data", normalizedCompose, "page-data.json");
130
+
131
+ this.state.htmlToAdd.push({ from: page.htmlPath, to: htmlTo });
132
+ this.state.jsonToAdd.push({ from: page.jsonPath, to: jsonTo });
133
+ }
134
+ }
135
+
136
+ GriddoLog.verbose(`${this.state.htmlToAdd.length} pages HTML to create`);
137
+ GriddoLog.verbose(`${this.state.jsonToAdd.length} pages JSON to create`);
138
+ }
139
+
140
+ private async sync() {
141
+ // Delete...
142
+ const allFilesToDelete = [...this.state.htmlToDelete, ...this.state.jsonToDelete];
143
+ for (const file of allFilesToDelete) {
144
+ try {
145
+ // Usar `force: true` para no fallar si el archivo ya no existe.
146
+ await fsp.rm(file, { force: true });
147
+ GriddoLog.verbose(`Sync (remove) : ${file}`);
148
+ } catch (e) {
149
+ // El error solo se registraría si es un problema de permisos, etc.
150
+ GriddoLog.error(`Failed to remove ${file}:`, e);
151
+ }
152
+ }
153
+
154
+ await this.restoreWebpackCompilationHash();
155
+
156
+ // Copy...
157
+ const allFilesToAdd = [...this.state.htmlToAdd, ...this.state.jsonToAdd];
158
+ for (const file of allFilesToAdd) {
159
+ try {
160
+ await fsp.mkdir(path.dirname(file.to), { recursive: true });
161
+ await fsp.copyFile(file.from, file.to);
162
+ GriddoLog.verbose(`Sync (copy) : ${file.from} -> ${file.to}`);
163
+ } catch (e) {
164
+ GriddoLog.error(`Failed to copy ${file.from} to ${file.to}:`, e);
165
+ }
166
+ }
167
+
168
+ // AVOID TO RESTORE webpackCompilationHash
169
+ // await this.copyAppDataJsonFile();
170
+ await this.copyAssetArtifacts();
171
+ await this.copySitemaps();
172
+ }
173
+
174
+ // TODO: Optimizar esto a lo bestia...
175
+ private async restoreWebpackCompilationHash() {
176
+ const appDataJsonFile = path.join(this.bundleDir, "page-data", "app-data.json");
177
+ const webpackCompilationHash = JSON.parse(
178
+ await fsp.readFile(appDataJsonFile, "utf8"),
179
+ ).webpackCompilationHash;
180
+ GriddoLog.build(
181
+ `Reading webpackCompilationHash from ${appDataJsonFile} = ${webpackCompilationHash}`,
182
+ );
183
+
184
+ const changedHtmlFilePaths = this.state.htmlToAdd.map(({ from }) => from);
185
+
186
+ for (const htmlFilePath of changedHtmlFilePaths) {
187
+ GriddoLog.build(`Patching HTML file ${htmlFilePath} with the new webpackCompilationHash`);
188
+ await patchHtmlFile(htmlFilePath, webpackCompilationHash);
189
+ }
190
+ }
191
+
192
+ // private async copyAppDataJsonFile() {
193
+ // try {
194
+ // const src = path.join(this.currentRenderDir, "page-data", "app-data.json");
195
+ // const dst = path.join(this.bundleDir, "page-data", "app-data.json");
196
+ // await fsp.copyFile(src, dst);
197
+ // GriddoLog.verbose("Copied app-data.json");
198
+ // } catch (e) {
199
+ // GriddoLog.error("Failed to copy app-data.json:", e);
200
+ // }
201
+ // }
202
+
203
+ private async copyAssetArtifacts() {
204
+ for (const assetArtifact of this.assetArtifacts) {
205
+ const src = path.join(this.currentRenderDir, assetArtifact);
206
+ const dst = path.join(this.bundleDir, assetArtifact);
207
+ try {
208
+ await fsp.mkdir(path.dirname(dst), { recursive: true });
209
+ await fsp.copyFile(src, dst);
210
+ GriddoLog.verbose(`Copied artifact: ${assetArtifact}`);
211
+ } catch (e) {
212
+ GriddoLog.error(`Failed to copy artifact ${src} to ${dst}:`, e);
213
+ }
214
+ }
215
+ }
216
+
217
+ private async copySitemaps() {
218
+ const renderSrc = path.resolve(this.currentRenderDir);
219
+ const renderDst = path.resolve(this.bundleDir);
220
+
221
+ // Primero, elimina los sitemaps existentes en el destino
222
+ const xmlFilesInDst = findFilesBySuffix(renderDst, ".xml");
223
+ for await (const xmlFile of xmlFilesInDst) {
224
+ const basename = path.basename(xmlFile);
225
+ if (basename.startsWith("sitemap-") || basename === "sitemap.xml") {
226
+ await fsp.rm(xmlFile, { force: true });
227
+ }
228
+ }
229
+
230
+ // Segundo, copia los nuevos sitemaps desde el origen
231
+ const xmlFilesInSrc = findFilesBySuffix(renderSrc, ".xml");
232
+ for await (const src of xmlFilesInSrc) {
233
+ // Reconstruye la ruta de destino de forma más robusta
234
+ const relativePath = path.relative(renderSrc, src);
235
+ const dst = path.join(renderDst, relativePath);
236
+
237
+ try {
238
+ await fsp.mkdir(path.dirname(dst), { recursive: true });
239
+ await fsp.copyFile(src, dst);
240
+ } catch (e) {
241
+ GriddoLog.error(`Failed to copy sitemap ${src} to ${dst}:`, e);
242
+ }
243
+ }
244
+
245
+ GriddoLog.verbose(`Copied sitemap files.`);
246
+ }
247
+
248
+ /**
249
+ * Escanea un directorio de build de Gatsby y extrae la información esencial
250
+ * (PageInfo[]) de cada página.
251
+ * @param dir Directorio a escanear (src o dst).
252
+ * @returns Un array con la información de cada página encontrada.
253
+ */
254
+ private async scanPages(dir: string): Promise<PageInfo[]> {
255
+ // 1. Crea una instancia de p-limit con 128 lecturas a la vez...
256
+ // Como ejemplo: macOS tiene un límite que suele empezar en 256.
257
+ // De todas maneras libuv tiene un límite de 4 hilos en node
258
+ const limit = pLimit(32);
259
+
260
+ // 2. Recolecta todos los paths de los archivos.
261
+ const gatsbyPageDataGenerator = findFilesBySuffix(
262
+ path.join(dir, "page-data"),
263
+ "page-data.json",
264
+ );
265
+ const processingPromises: Promise<PageInfo | null>[] = [];
266
+ for await (const file of gatsbyPageDataGenerator) {
267
+ processingPromises.push(
268
+ limit(async (): Promise<PageInfo | null> => {
269
+ try {
270
+ const fileContent = await fsp.readFile(file, "utf-8");
271
+ const content = JSON.parse(fileContent) as GatsbyPageData;
272
+
273
+ const id = content.result.pageContext.id;
274
+ const composePath = content.result.pageContext.fullPath.compose;
275
+
276
+ return {
277
+ id,
278
+ composePath,
279
+ htmlPath: path.join(dir, composePath, "index.html"),
280
+ jsonPath: file,
281
+ };
282
+ } catch (e) {
283
+ GriddoLog.error(`Error reading or parsing page data from ${file}:`, e);
284
+ return null;
285
+ }
286
+ }),
287
+ );
288
+ }
289
+
290
+ // 4. Go :)
291
+ const pagesFoundOrNull = await Promise.all(processingPromises);
292
+
293
+ // 5. Filtra los nulos y devuelve solo las páginas válidas.
294
+ return pagesFoundOrNull.filter((page): page is PageInfo => page !== null);
295
+ }
296
+ }
297
+
298
+ export { SyncRender };
@@ -0,0 +1,35 @@
1
+ interface SSG {
2
+ assetPrefix: string;
3
+ ssgArtifacts: {
4
+ disposables: string[];
5
+ cacheables: string[];
6
+ };
7
+ }
8
+
9
+ // Minimal representation of the page structure
10
+ interface GatsbyPageData {
11
+ path: string;
12
+ result: {
13
+ pageContext: {
14
+ id: number;
15
+ title: string;
16
+ path: string;
17
+ openGraph: any;
18
+ pageMetadata: any;
19
+ page: {
20
+ site: number;
21
+ id: number;
22
+ fullPath: { compose: string };
23
+ language: number;
24
+ title: string;
25
+ fullUrl: string;
26
+ templateId: string;
27
+ template: {
28
+ templateType: string;
29
+ };
30
+ };
31
+ };
32
+ };
33
+ }
34
+
35
+ export type { GatsbyPageData, SSG };
@@ -2,7 +2,6 @@ import type { GatsbyBrowser } from "gatsby";
2
2
 
3
3
  import { SessionProvider } from "@griddo/core";
4
4
  import { browser } from "@griddo-instance";
5
- import * as React from "react";
6
5
 
7
6
  export const disableCorePrefetching = () => {
8
7
  if (browser.disableCorePrefetching) {
@@ -22,9 +21,7 @@ export const onInitialClientRender = () => {
22
21
  }
23
22
  };
24
23
 
25
- export const onPostPrefetchPathname: GatsbyBrowser["onPostPrefetchPathname"] = (
26
- props,
27
- ) => {
24
+ export const onPostPrefetchPathname: GatsbyBrowser["onPostPrefetchPathname"] = (props) => {
28
25
  if (browser.onPostPrefetchPathname) {
29
26
  browser.onPostPrefetchPathname(props);
30
27
  }
@@ -36,75 +33,61 @@ export const onPreRouteUpdate: GatsbyBrowser["onPreRouteUpdate"] = (props) => {
36
33
  }
37
34
  };
38
35
 
39
- export const onPrefetchPathname: GatsbyBrowser["onPrefetchPathname"] = (
40
- props,
41
- ) => {
36
+ export const onPrefetchPathname: GatsbyBrowser["onPrefetchPathname"] = (props) => {
42
37
  if (browser.onPrefetchPathname) {
43
38
  browser.onPrefetchPathname(props);
44
39
  }
45
40
  };
46
41
 
47
- export const onRouteUpdateDelayed: GatsbyBrowser["onRouteUpdateDelayed"] = (
48
- props,
49
- ) => {
42
+ export const onRouteUpdateDelayed: GatsbyBrowser["onRouteUpdateDelayed"] = (props) => {
50
43
  if (browser.onServiceWorkerActive) {
51
44
  browser.onRouteUpdateDelayed(props);
52
45
  }
53
46
  };
54
47
 
55
- export const onServiceWorkerActive: GatsbyBrowser["onServiceWorkerActive"] = (
56
- props,
57
- ) => {
48
+ export const onServiceWorkerActive: GatsbyBrowser["onServiceWorkerActive"] = (props) => {
58
49
  if (browser.onServiceWorkerActive) {
59
50
  browser.onServiceWorkerActive(props);
60
51
  }
61
52
  };
62
53
 
63
- export const onServiceWorkerInstalled: GatsbyBrowser["onServiceWorkerInstalled"] =
64
- (props) => {
65
- if (browser.onServiceWorkerInstalled) {
66
- browser.onServiceWorkerInstalled(props);
67
- }
68
- };
69
-
70
- export const onServiceWorkerRedundant: GatsbyBrowser["onServiceWorkerRedundant"] =
71
- (props) => {
72
- if (browser.onServiceWorkerRedundant) {
73
- browser.onServiceWorkerRedundant(props);
74
- }
75
- };
76
-
77
- export const onServiceWorkerUpdateFound: GatsbyBrowser["onServiceWorkerUpdateFound"] =
78
- (props) => {
79
- if (browser.onServiceWorkerUpdateFound) {
80
- browser.onServiceWorkerUpdateFound(props);
81
- }
82
- };
83
-
84
- export const onServiceWorkerUpdateReady: GatsbyBrowser["onServiceWorkerUpdateReady"] =
85
- (props) => {
86
- if (browser.onServiceWorkerUpdateReady) {
87
- browser.onServiceWorkerUpdateReady(props);
88
- }
89
- };
90
-
91
- export const registerServiceWorker: GatsbyBrowser["registerServiceWorker"] =
92
- () => {
93
- if (browser.registerServiceWorker) {
94
- return browser.registerServiceWorker();
95
- }
96
- };
97
-
98
- export const replaceHydrateFunction: GatsbyBrowser["replaceHydrateFunction"] =
99
- () => {
100
- if (browser.replaceHydrateFunction) {
101
- return browser.replaceHydrateFunction();
102
- }
103
- };
104
-
105
- export const shouldUpdateScroll: GatsbyBrowser["shouldUpdateScroll"] = (
106
- props,
107
- ) => {
54
+ export const onServiceWorkerInstalled: GatsbyBrowser["onServiceWorkerInstalled"] = (props) => {
55
+ if (browser.onServiceWorkerInstalled) {
56
+ browser.onServiceWorkerInstalled(props);
57
+ }
58
+ };
59
+
60
+ export const onServiceWorkerRedundant: GatsbyBrowser["onServiceWorkerRedundant"] = (props) => {
61
+ if (browser.onServiceWorkerRedundant) {
62
+ browser.onServiceWorkerRedundant(props);
63
+ }
64
+ };
65
+
66
+ export const onServiceWorkerUpdateFound: GatsbyBrowser["onServiceWorkerUpdateFound"] = (props) => {
67
+ if (browser.onServiceWorkerUpdateFound) {
68
+ browser.onServiceWorkerUpdateFound(props);
69
+ }
70
+ };
71
+
72
+ export const onServiceWorkerUpdateReady: GatsbyBrowser["onServiceWorkerUpdateReady"] = (props) => {
73
+ if (browser.onServiceWorkerUpdateReady) {
74
+ browser.onServiceWorkerUpdateReady(props);
75
+ }
76
+ };
77
+
78
+ export const registerServiceWorker: GatsbyBrowser["registerServiceWorker"] = () => {
79
+ if (browser.registerServiceWorker) {
80
+ return browser.registerServiceWorker();
81
+ }
82
+ };
83
+
84
+ export const replaceHydrateFunction: GatsbyBrowser["replaceHydrateFunction"] = () => {
85
+ if (browser.replaceHydrateFunction) {
86
+ return browser.replaceHydrateFunction();
87
+ }
88
+ };
89
+
90
+ export const shouldUpdateScroll: GatsbyBrowser["shouldUpdateScroll"] = (props) => {
108
91
  if (browser.shouldUpdateScroll) {
109
92
  return browser.shouldUpdateScroll(props);
110
93
  }
package/gatsby-config.ts CHANGED
@@ -1,33 +1,26 @@
1
1
  import type { GatsbyConfig } from "gatsby";
2
2
 
3
- import { resolveComponentsPath, verboseLog } from "@griddo/cx";
4
- import dotenv from "dotenv";
5
-
6
- dotenv.config();
3
+ import { resolveComponentsPath } from "@griddo/cx";
7
4
 
8
5
  /**
9
6
  * Este process.env.SPAWN_ASSET_PREFIX_WITH_DOMAIN se lee porque
10
- * se ha introducido en el spawnSync del la función runGatsbyBuildCommand.
7
+ * se ha introducido en el spawnSync del la función gatsbyBuild.
11
8
  *
12
9
  * ...
13
- * env: Object.assign(process.env, {
14
- * GRIDDO_EXPORTER: "true",
10
+ * env: {
11
+ * ...process.env,
15
12
  * SPAWN_ASSET_PREFIX_WITH_DOMAIN: assetPrefixWithDomain, <--------------
16
13
  * NODE_OPTIONS: undefined,
17
- * }),
18
- *
19
- * @see runGatsbyBuildCommand()
20
- * @todo quiar el `... || undefined`
14
+ * },
21
15
  */
22
- const griddoAssetPrefixWithDomain =
23
- process.env.SPAWN_ASSET_PREFIX_WITH_DOMAIN || undefined;
16
+ const griddoAssetPrefixWithDomain = process.env.SPAWN_ASSET_PREFIX_WITH_DOMAIN || undefined;
24
17
 
25
- verboseLog(`set config.assetPrefix=${griddoAssetPrefixWithDomain}`);
18
+ if (process.env.GRIDDO_SSG_VERBOSE_LOGS) {
19
+ console.log(`set config.assetPrefix=${griddoAssetPrefixWithDomain}`);
20
+ }
26
21
 
27
22
  // Gatsby configuration file from client
28
- const { plugins, ...gatsbyConfig } = require(
29
- resolveComponentsPath("builder.config.js"),
30
- );
23
+ const { plugins, ...gatsbyConfig } = require(resolveComponentsPath("builder.config.js"));
31
24
 
32
25
  const config: GatsbyConfig = {
33
26
  // Client config
package/gatsby-node.ts CHANGED
@@ -1,49 +1,34 @@
1
- import type { GatsbyPageObject } from "./src/types";
2
1
  import type { GatsbyNode } from "gatsby";
2
+ import type { GatsbyPageObject } from "./src/types";
3
3
 
4
4
  import path from "node:path";
5
5
 
6
- import {
7
- buildLog,
8
- debugLog,
9
- envs,
10
- getBuildPagesFromStore,
11
- getConfig,
12
- pageSizeLog,
13
- verboseLog,
14
- } from "@griddo/cx";
6
+ import { addLogToBuffer, isComponentLibrary } from "@griddo/cx";
15
7
 
16
- import { gatsbyRegister } from "./exporter/registers";
17
- import { insertAlert } from "./exporter/utils/alerts";
18
-
19
- const showGriddoBuildLogs = envs.GRIDDO_BUILD_LOGS;
8
+ import { getBuildPagesFromStore, pageSizeLog } from "./src/gatsby-node-utils";
20
9
 
21
10
  // process.env available through gatsbyBuildCommand.
11
+ const showGriddoBuildLogs = JSON.parse(process.env.GRIDDO_BUILD_LOGS || "false");
12
+ const showSSGVerboseLogs = JSON.parse(process.env.GRIDDO_VERBOSE_SSG || "false");
22
13
  const assetPrefixWithDomain = process.env.SPAWN_ASSET_PREFIX_WITH_DOMAIN;
23
- const sendAlertActive = JSON.parse(process.env.GRIDDO_ALERT_FEATURE || "false");
24
- const avoidMatchPath = JSON.parse(
25
- process.env.GRIDDO_EXPERIMENTAL_DO_NOT_USE_MATCH_PATH || "false",
26
- );
27
- const useMatchPaths = !avoidMatchPath;
28
- const needsAssetDomainPrefix =
29
- !!assetPrefixWithDomain && assetPrefixWithDomain !== "";
14
+ const needsAssetDomainPrefix = !!assetPrefixWithDomain && assetPrefixWithDomain !== "";
15
+ const nodeOptions = process.env.NODE_OPTIONS;
30
16
 
31
- const { __ssg } = getConfig().paths();
32
- const template = path.join(__ssg, "src/components/template.tsx");
17
+ const template = path.resolve("./src/components/template.tsx");
18
+ const dbFilePath = isComponentLibrary
19
+ ? path.resolve(__dirname, "../../..", ".griddo/cache/db.json")
20
+ : path.resolve(__dirname, "../..", ".griddo/cache/db.json");
33
21
 
34
22
  const pages = getBuildPagesFromStore<GatsbyPageObject>({
35
23
  withSizeProp: showGriddoBuildLogs,
24
+ dbFilePath,
36
25
  });
37
26
 
38
27
  const createPages: GatsbyNode["createPages"] = async ({ actions }) => {
39
- verboseLog(`read assetPrefixWithDomain=${assetPrefixWithDomain}`);
40
- verboseLog(`set needsAssetDomainPrefix=${needsAssetDomainPrefix}`);
41
- console.log(
42
- `using this NODE_OPTIONS in gatsby-node.ts: ${process.env.NODE_OPTIONS}`,
43
- );
44
-
45
- if (avoidMatchPath) {
46
- console.log(`[!] GRIDDO EXPERIMENTAL: Avoiding use of matchPath`);
28
+ if (showSSGVerboseLogs) {
29
+ console.log(`read assetPrefixWithDomain=${assetPrefixWithDomain}`);
30
+ console.log(`set needsAssetDomainPrefix=${needsAssetDomainPrefix}`);
31
+ console.log(`using NODE_OPTIONS in gatsby-node.ts: ${nodeOptions}`);
47
32
  }
48
33
 
49
34
  for await (const page of pages) {
@@ -51,60 +36,16 @@ const createPages: GatsbyNode["createPages"] = async ({ actions }) => {
51
36
  return;
52
37
  }
53
38
 
54
- const matchPath =
55
- needsAssetDomainPrefix && useMatchPaths
56
- ? page.context.fullPath.compose
57
- : "";
58
-
59
39
  page.component = template;
60
- page.matchPath = matchPath;
61
40
 
62
41
  actions.createPage(page);
63
42
 
64
- const path = page.path;
65
- const id = page.context.id;
66
- const size = pageSizeLog(Math.round(page.size || 0));
67
-
68
- if (sendAlertActive && page.size) {
69
- const pageMaxSizeReached =
70
- page.size >
71
- Number.parseInt(process.env.GRIDDO_SSG_MAX_PAGE_SIZE || "524288") /
72
- 1024;
73
-
74
- if (pageMaxSizeReached) {
75
- gatsbyRegister.insert("GATSBY_PAGE_SIZE_TOO_BIG", {
76
- path: page.path,
77
- size: `${Math.round(page.size)}KB`,
78
- });
79
- }
80
- }
81
-
82
43
  if (showGriddoBuildLogs) {
83
- buildLog(`Creating page ${path} - ${id} - ${size}`);
84
- }
85
- }
86
-
87
- if (sendAlertActive) {
88
- const registerContent = gatsbyRegister.get("GATSBY_PAGE_SIZE_TOO_BIG");
89
-
90
- if (registerContent.entries.length < 1) {
91
- return;
44
+ const id = page.context.id;
45
+ const path = page.path;
46
+ const size = pageSizeLog(Math.round(page.size || 0));
47
+ addLogToBuffer(`Creating page ${path} - ${id} - ${size}`);
92
48
  }
93
-
94
- debugLog("\nRender register report\n");
95
- debugLog(registerContent);
96
- debugLog();
97
-
98
- await insertAlert({
99
- description: "Render register report",
100
- area: "Griddo",
101
- level: "W",
102
- fullData: {
103
- output: registerContent,
104
- date: new Date().toISOString(),
105
- },
106
- instantNotification: false,
107
- });
108
49
  }
109
50
  };
110
51
 
package/gatsby-ssr.tsx CHANGED
@@ -1,8 +1,9 @@
1
1
  import type { GatsbySSR } from "gatsby";
2
2
 
3
+ import * as React from "react";
4
+
3
5
  import { SessionProvider } from "@griddo/core";
4
6
  import { ssr } from "@griddo-instance";
5
- import * as React from "react";
6
7
 
7
8
  export const wrapPageElement: GatsbySSR["wrapPageElement"] = (props) => {
8
9
  if (ssr.wrapPageElement) {