@griddo/cx 11.7.10 → 11.7.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 (302) hide show
  1. package/README.md +27 -226
  2. package/build/adapters/gatsby/actions/clean.js +10 -0
  3. package/build/adapters/gatsby/actions/clean.js.map +1 -0
  4. package/build/adapters/gatsby/actions/close.js +14 -0
  5. package/build/adapters/gatsby/actions/close.js.map +1 -0
  6. package/build/adapters/gatsby/actions/data.js +18 -0
  7. package/build/adapters/gatsby/actions/data.js.map +1 -0
  8. package/build/adapters/gatsby/actions/healthCheck.js +10 -0
  9. package/build/adapters/gatsby/actions/healthCheck.js.map +1 -0
  10. package/build/adapters/gatsby/actions/init.js +22 -0
  11. package/build/adapters/gatsby/actions/init.js.map +1 -0
  12. package/build/adapters/gatsby/actions/logs.js +9 -0
  13. package/build/adapters/gatsby/actions/logs.js.map +1 -0
  14. package/build/adapters/gatsby/actions/meta.js +13 -0
  15. package/build/adapters/gatsby/actions/meta.js.map +1 -0
  16. package/build/adapters/gatsby/actions/prepare.js +9 -0
  17. package/build/adapters/gatsby/actions/prepare.js.map +1 -0
  18. package/build/adapters/gatsby/actions/relocation.js +15 -0
  19. package/build/adapters/gatsby/actions/relocation.js.map +1 -0
  20. package/build/adapters/gatsby/actions/restore.js +26 -0
  21. package/build/adapters/gatsby/actions/restore.js.map +1 -0
  22. package/build/adapters/gatsby/actions/ssg.js +9 -0
  23. package/build/adapters/gatsby/actions/ssg.js.map +1 -0
  24. package/build/adapters/gatsby/actions/sync.js +51 -0
  25. package/build/adapters/gatsby/actions/sync.js.map +1 -0
  26. package/build/adapters/gatsby/index.js +78 -0
  27. package/build/adapters/gatsby/index.js.map +1 -0
  28. package/build/adapters/gatsby/shared/artifacts.js +20 -0
  29. package/build/adapters/gatsby/shared/artifacts.js.map +1 -0
  30. package/build/adapters/gatsby/shared/context.js +31 -0
  31. package/build/adapters/gatsby/shared/context.js.map +1 -0
  32. package/build/adapters/gatsby/shared/diff-assets.js +101 -0
  33. package/build/adapters/gatsby/shared/diff-assets.js.map +1 -0
  34. package/build/adapters/gatsby/shared/extract-assets.js +58 -0
  35. package/build/adapters/gatsby/shared/extract-assets.js.map +1 -0
  36. package/build/adapters/gatsby/shared/gatsby-build.js +55 -0
  37. package/build/adapters/gatsby/shared/gatsby-build.js.map +1 -0
  38. package/build/adapters/gatsby/shared/sync-render.js +210 -0
  39. package/build/adapters/gatsby/shared/sync-render.js.map +1 -0
  40. package/build/adapters/gatsby/shared/types.js +3 -0
  41. package/build/adapters/gatsby/shared/types.js.map +1 -0
  42. package/build/commands/end-render.js +87 -0
  43. package/build/commands/end-render.js.map +1 -0
  44. package/build/commands/prepare-assets-directory.js +30 -0
  45. package/build/commands/prepare-assets-directory.js.map +1 -0
  46. package/build/commands/prepare-domains-render.js +133 -0
  47. package/build/commands/prepare-domains-render.js.map +1 -0
  48. package/build/commands/reset-render.js +21 -0
  49. package/build/commands/reset-render.js.map +1 -0
  50. package/build/commands/start-render.js +44 -0
  51. package/build/commands/start-render.js.map +1 -0
  52. package/build/commands/upload-search-content.js +180 -0
  53. package/build/commands/upload-search-content.js.map +1 -0
  54. package/build/constants/endpoints.js +43 -0
  55. package/build/constants/endpoints.js.map +1 -0
  56. package/build/constants/envs.js +68 -0
  57. package/build/constants/envs.js.map +1 -0
  58. package/build/constants/errors.js +81 -0
  59. package/build/constants/errors.js.map +1 -0
  60. package/build/services/auth.js +40 -0
  61. package/build/services/auth.js.map +1 -0
  62. package/build/services/db-class.js +49 -0
  63. package/build/services/db-class.js.map +1 -0
  64. package/build/services/db.js +34 -0
  65. package/build/services/db.js.map +1 -0
  66. package/build/services/navigation.js +96 -0
  67. package/build/services/navigation.js.map +1 -0
  68. package/build/services/reference-fields.js +131 -0
  69. package/build/services/reference-fields.js.map +1 -0
  70. package/build/services/robots.js +60 -0
  71. package/build/services/robots.js.map +1 -0
  72. package/build/services/sites.js +110 -0
  73. package/build/services/sites.js.map +1 -0
  74. package/build/services/store.js +257 -0
  75. package/build/services/store.js.map +1 -0
  76. package/build/types/api.js +3 -0
  77. package/build/types/api.js.map +1 -0
  78. package/build/types/global.js +3 -0
  79. package/build/types/global.js.map +1 -0
  80. package/build/types/navigation.js +3 -0
  81. package/build/types/navigation.js.map +1 -0
  82. package/build/types/pages.js +3 -0
  83. package/build/types/pages.js.map +1 -0
  84. package/build/types/render.js +10 -0
  85. package/build/types/render.js.map +1 -0
  86. package/build/types/sites.js +3 -0
  87. package/build/types/sites.js.map +1 -0
  88. package/build/types/templates.js +3 -0
  89. package/build/types/templates.js.map +1 -0
  90. package/build/utils/api.js +165 -0
  91. package/build/utils/api.js.map +1 -0
  92. package/build/utils/artifacts.js +38 -0
  93. package/build/utils/artifacts.js.map +1 -0
  94. package/build/utils/brush.js +30 -0
  95. package/build/utils/brush.js.map +1 -0
  96. package/build/utils/cache.js +106 -0
  97. package/build/utils/cache.js.map +1 -0
  98. package/build/utils/check-environment-health.js +69 -0
  99. package/build/utils/check-environment-health.js.map +1 -0
  100. package/build/utils/core-utils.js +270 -0
  101. package/build/utils/core-utils.js.map +1 -0
  102. package/build/utils/domains.js +37 -0
  103. package/build/utils/domains.js.map +1 -0
  104. package/build/utils/errors.js +30 -0
  105. package/build/utils/errors.js.map +1 -0
  106. package/build/utils/folders.js +341 -0
  107. package/build/utils/folders.js.map +1 -0
  108. package/build/utils/images.js +45 -0
  109. package/build/utils/images.js.map +1 -0
  110. package/build/utils/instance.js +66 -0
  111. package/build/utils/instance.js.map +1 -0
  112. package/build/utils/loggin.js +119 -0
  113. package/build/utils/loggin.js.map +1 -0
  114. package/build/utils/npm-deps/find-up-simple.js +75 -0
  115. package/build/utils/npm-deps/find-up-simple.js.map +1 -0
  116. package/build/utils/npm-deps/pkg-dir.js +20 -0
  117. package/build/utils/npm-deps/pkg-dir.js.map +1 -0
  118. package/build/utils/npm-deps/xml-parser.js +49 -0
  119. package/build/utils/npm-deps/xml-parser.js.map +1 -0
  120. package/build/utils/pages.js +359 -0
  121. package/build/utils/pages.js.map +1 -0
  122. package/build/utils/render.js +168 -0
  123. package/build/utils/render.js.map +1 -0
  124. package/build/utils/sitemaps.js +110 -0
  125. package/build/utils/sitemaps.js.map +1 -0
  126. package/build/utils/sites.js +105 -0
  127. package/build/utils/sites.js.map +1 -0
  128. package/build/utils/store.js +193 -0
  129. package/build/utils/store.js.map +1 -0
  130. package/exporter/adapters/gatsby/actions/clean.ts +14 -0
  131. package/exporter/adapters/gatsby/actions/close.ts +20 -0
  132. package/exporter/adapters/gatsby/actions/data.ts +25 -0
  133. package/exporter/adapters/gatsby/actions/healthCheck.ts +10 -0
  134. package/exporter/adapters/gatsby/actions/init.ts +26 -0
  135. package/exporter/adapters/gatsby/actions/logs.ts +10 -0
  136. package/exporter/adapters/gatsby/actions/meta.ts +16 -0
  137. package/exporter/adapters/gatsby/actions/prepare.ts +9 -0
  138. package/exporter/adapters/gatsby/actions/relocation.ts +15 -0
  139. package/exporter/adapters/gatsby/actions/restore.ts +36 -0
  140. package/exporter/adapters/gatsby/actions/ssg.ts +12 -0
  141. package/exporter/adapters/gatsby/actions/sync.ts +71 -0
  142. package/exporter/adapters/gatsby/index.ts +73 -153
  143. package/exporter/adapters/gatsby/shared/artifacts.ts +16 -0
  144. package/exporter/adapters/gatsby/shared/context.ts +50 -0
  145. package/exporter/adapters/gatsby/shared/diff-assets.ts +113 -0
  146. package/exporter/adapters/gatsby/shared/extract-assets.ts +61 -0
  147. package/exporter/adapters/gatsby/shared/gatsby-build.ts +58 -0
  148. package/exporter/adapters/gatsby/shared/sync-render.ts +276 -0
  149. package/exporter/adapters/gatsby/shared/types.ts +35 -0
  150. package/exporter/build-esbuild.noop +42 -0
  151. package/exporter/build.sh +4 -38
  152. package/exporter/commands/end-render.ts +72 -70
  153. package/exporter/commands/prepare-assets-directory.ts +30 -0
  154. package/exporter/commands/prepare-domains-render.ts +143 -31
  155. package/exporter/commands/reset-render.ts +10 -3
  156. package/exporter/commands/start-render.ts +22 -45
  157. package/exporter/commands/upload-search-content.ts +194 -21
  158. package/exporter/constants/endpoints.ts +2 -1
  159. package/exporter/constants/envs.ts +57 -55
  160. package/exporter/{errors/errors-data.ts → constants/errors.ts} +24 -14
  161. package/exporter/services/auth.ts +7 -6
  162. package/exporter/services/db-class.ts +54 -0
  163. package/exporter/services/db.ts +32 -0
  164. package/exporter/services/navigation.ts +4 -10
  165. package/exporter/services/reference-fields.ts +9 -24
  166. package/exporter/services/robots.ts +9 -16
  167. package/exporter/services/sites.ts +36 -24
  168. package/exporter/services/store.ts +107 -96
  169. package/exporter/types/api.ts +27 -28
  170. package/exporter/types/global.ts +8 -11
  171. package/exporter/types/navigation.ts +1 -1
  172. package/exporter/types/pages.ts +2 -3
  173. package/exporter/types/render.ts +59 -0
  174. package/exporter/types/sites.ts +1 -2
  175. package/exporter/utils/api.ts +55 -75
  176. package/exporter/utils/artifacts.ts +38 -0
  177. package/exporter/utils/brush.ts +34 -0
  178. package/exporter/utils/cache.ts +37 -62
  179. package/exporter/utils/check-environment-health.ts +80 -0
  180. package/exporter/utils/core-utils.ts +133 -272
  181. package/exporter/utils/domains.ts +10 -7
  182. package/exporter/{errors/index.ts → utils/errors.ts} +10 -9
  183. package/exporter/utils/folders.ts +163 -98
  184. package/exporter/utils/images.ts +1 -6
  185. package/exporter/utils/instance.ts +9 -13
  186. package/exporter/utils/loggin.ts +44 -91
  187. package/exporter/utils/npm-deps/find-up-simple.ts +100 -0
  188. package/exporter/utils/npm-deps/pkg-dir.ts +17 -0
  189. package/exporter/utils/npm-deps/xml-parser.ts +57 -0
  190. package/exporter/utils/pages.ts +23 -88
  191. package/exporter/utils/render.ts +180 -48
  192. package/exporter/utils/sitemaps.ts +129 -0
  193. package/exporter/utils/sites.ts +19 -197
  194. package/exporter/utils/store.ts +87 -180
  195. package/gatsby-browser.tsx +41 -58
  196. package/gatsby-config.ts +10 -17
  197. package/gatsby-node.ts +17 -78
  198. package/gatsby-ssr.tsx +2 -1
  199. package/package.json +35 -86
  200. package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +55 -0
  201. package/plugins/gatsby-plugin-svgr-loader/package.json +8 -0
  202. package/react/DynamicScript/index.tsx +33 -0
  203. package/{exporter/react → react}/Favicon/index.tsx +1 -7
  204. package/{exporter/react → react}/GriddoIntegrations/index.tsx +16 -22
  205. package/{exporter/react → react}/GriddoIntegrations/utils.ts +21 -9
  206. package/{build/react/index.d.ts → react/index.tsx} +1 -0
  207. package/src/components/Head.tsx +13 -46
  208. package/src/components/template.tsx +8 -30
  209. package/src/gatsby-node-utils.ts +73 -2
  210. package/src/html.tsx +2 -11
  211. package/src/types.ts +5 -5
  212. package/tsconfig.commands.json +36 -0
  213. package/tsconfig.exporter.json +19 -0
  214. package/tsconfig.json +5 -3
  215. package/build/adapters/gatsby/index.d.ts +0 -4
  216. package/build/adapters/gatsby/utils.d.ts +0 -22
  217. package/build/artifacts/index.d.ts +0 -6
  218. package/build/commands/end-render.d.ts +0 -2
  219. package/build/commands/move-assets.d.ts +0 -1
  220. package/build/commands/prepare-domains-render.d.ts +0 -1
  221. package/build/commands/reset-render.d.ts +0 -2
  222. package/build/commands/start-render.d.ts +0 -2
  223. package/build/commands/upload-search-content.d.ts +0 -2
  224. package/build/constants/endpoints.d.ts +0 -19
  225. package/build/constants/envs.d.ts +0 -37
  226. package/build/constants/index.d.ts +0 -57
  227. package/build/end-render.js +0 -74
  228. package/build/end-render.js.map +0 -7
  229. package/build/errors/errors-data.d.ts +0 -22
  230. package/build/errors/index.d.ts +0 -15
  231. package/build/index.d.ts +0 -29
  232. package/build/index.js +0 -73
  233. package/build/index.js.map +0 -7
  234. package/build/prepare-domains-render.js +0 -73
  235. package/build/prepare-domains-render.js.map +0 -7
  236. package/build/react/Favicon/index.d.ts +0 -5
  237. package/build/react/Favicon/utils.d.ts +0 -9
  238. package/build/react/GriddoIntegrations/index.d.ts +0 -20
  239. package/build/react/GriddoIntegrations/utils.d.ts +0 -26
  240. package/build/react/index.js +0 -3
  241. package/build/registers/api.d.ts +0 -9
  242. package/build/registers/gatsby.d.ts +0 -9
  243. package/build/registers/index.d.ts +0 -3
  244. package/build/reset-render.js +0 -74
  245. package/build/reset-render.js.map +0 -7
  246. package/build/services/auth.d.ts +0 -10
  247. package/build/services/domains.d.ts +0 -6
  248. package/build/services/navigation.d.ts +0 -50
  249. package/build/services/reference-fields.d.ts +0 -20
  250. package/build/services/register.d.ts +0 -36
  251. package/build/services/robots.d.ts +0 -19
  252. package/build/services/settings.d.ts +0 -4
  253. package/build/services/sites.d.ts +0 -29
  254. package/build/services/store.d.ts +0 -6
  255. package/build/start-render.js +0 -100
  256. package/build/start-render.js.map +0 -7
  257. package/build/types/api.d.ts +0 -142
  258. package/build/types/global.d.ts +0 -84
  259. package/build/types/navigation.d.ts +0 -28
  260. package/build/types/pages.d.ts +0 -144
  261. package/build/types/sites.d.ts +0 -57
  262. package/build/types/templates.d.ts +0 -8
  263. package/build/upload-search-content.js +0 -74
  264. package/build/upload-search-content.js.map +0 -7
  265. package/build/utils/alerts.d.ts +0 -3
  266. package/build/utils/api.d.ts +0 -23
  267. package/build/utils/cache.d.ts +0 -35
  268. package/build/utils/core-utils.d.ts +0 -107
  269. package/build/utils/create-build-data.d.ts +0 -8
  270. package/build/utils/domains.d.ts +0 -13
  271. package/build/utils/folders.d.ts +0 -53
  272. package/build/utils/health-checks.d.ts +0 -7
  273. package/build/utils/images.d.ts +0 -16
  274. package/build/utils/instance.d.ts +0 -21
  275. package/build/utils/loggin.d.ts +0 -51
  276. package/build/utils/pages.d.ts +0 -34
  277. package/build/utils/render.d.ts +0 -13
  278. package/build/utils/searches.d.ts +0 -15
  279. package/build/utils/sites.d.ts +0 -31
  280. package/build/utils/store.d.ts +0 -81
  281. package/cx.config.d.ts +0 -5
  282. package/cx.config.js +0 -36
  283. package/exporter/adapters/gatsby/utils.ts +0 -161
  284. package/exporter/artifacts/README.md +0 -34
  285. package/exporter/artifacts/index.ts +0 -33
  286. package/exporter/commands/move-assets.ts +0 -11
  287. package/exporter/constants/index.ts +0 -129
  288. package/exporter/index.ts +0 -82
  289. package/exporter/react/index.tsx +0 -11
  290. package/exporter/registers/api.ts +0 -14
  291. package/exporter/registers/gatsby.ts +0 -14
  292. package/exporter/registers/index.ts +0 -4
  293. package/exporter/services/domains.ts +0 -16
  294. package/exporter/services/register.ts +0 -113
  295. package/exporter/services/settings.ts +0 -17
  296. package/exporter/utils/alerts.ts +0 -29
  297. package/exporter/utils/create-build-data.ts +0 -17
  298. package/exporter/utils/health-checks.ts +0 -64
  299. package/exporter/utils/searches.ts +0 -156
  300. package/src/README.md +0 -7
  301. package/start-render.js +0 -7
  302. /package/{exporter/react → react}/Favicon/utils.ts +0 -0
@@ -1,71 +1,203 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
1
+ import type { RenderModeTuple } from "../types/render";
3
2
 
4
- import { envs } from "../constants";
5
- import { throwError } from "../errors";
6
- import { RenderUUIDError } from "../errors/errors-data";
7
- import { apiRegister } from "../registers";
8
- import { insertAlert } from "./alerts";
9
- import { getConfig } from "./core-utils";
10
- import { debugLog } from "./loggin";
3
+ import { execSync } from "node:child_process";
4
+ import fsp from "node:fs/promises";
5
+ import path from "node:path";
11
6
 
12
- const config = getConfig();
7
+ import { RenderUUIDError } from "../constants/errors";
8
+ import { AuthService } from "../services/auth";
9
+ import { readDB, writeDB } from "../services/db";
10
+ import { RENDER_MODE } from "../types/render";
11
+ import { throwError } from "./errors";
12
+ import { pathExists } from "./folders";
13
+ import { infoLog, verboseLog } from "./loggin";
14
+ import { getBuildMetadata } from "./store";
13
15
 
14
16
  /**
15
17
  * Creates a sentinel file with the current date and time.
16
18
  * This file is used to track later if node_modules/@griddo/cx was cleaned by a
17
- * npm install from a deploy.
19
+ * npm install coming from a deploy.
18
20
  */
19
- function createSentinelRenderFile() {
20
- const { __cx } = config.paths();
21
- const renderSentinelFile = path.join(__cx, ".render-sentinel");
22
- fs.writeFileSync(renderSentinelFile, new Date().toISOString());
21
+ async function markRenderAsStarted(options: { domain: string; basePath: string }) {
22
+ const { domain } = options;
23
+
24
+ const db = await readDB();
25
+ db.domains[domain].isRendering = true;
26
+ await writeDB(db);
27
+
28
+ // Creamos un archivo centinela, si al terminar el render este archivo no
29
+ // existe es que ha habido un deploy por medio y hay que invalidar el render
30
+ const { __ssg } = await getRenderPathsFromDB();
31
+
32
+ const renderSentinelFile = path.join(__ssg, `.render-sentinel-${domain}`);
33
+ await fsp.writeFile(renderSentinelFile, new Date().toISOString());
23
34
  }
24
35
 
25
- function deleteSentinelRenderFile() {
26
- const { __cx } = config.paths();
27
- const renderSentinelFile = path.join(__cx, ".render-sentinel");
28
- fs.unlinkSync(renderSentinelFile);
36
+ async function markRenderAsCompleted(domain: string) {
37
+ const db = await readDB();
38
+ db.domains[domain].isRendering = false;
39
+ // db.domains[domain].renderMode = undefined;
40
+ // db.domains[domain].shouldBeRendered = false;
41
+ await writeDB(db);
42
+
43
+ // Borramos finalmente el archivo centinela
44
+ const { __ssg } = await getRenderPathsFromDB();
45
+ const renderSentinelFile = path.join(__ssg, `.render-sentinel-${domain}`);
46
+ await fsp.unlink(renderSentinelFile);
29
47
  }
30
48
 
31
- function isValidRender() {
32
- const { __cx } = config.paths();
33
- const renderSentinelFile = path.join(__cx, ".render-sentinel");
34
- if (!fs.existsSync(renderSentinelFile)) {
49
+ async function assertRenderIsValid(domain: string) {
50
+ // Comprobamos que .render-sentinel exista, si no es que un deploy lo borro
51
+ // y hay que invalidar el render.
52
+ const { __ssg } = await getRenderPathsFromDB();
53
+ const renderSentinelFile = path.join(__ssg, `.render-sentinel-${domain}`);
54
+ if (!(await pathExists(renderSentinelFile))) {
35
55
  throwError(RenderUUIDError);
36
56
  }
37
57
  }
38
58
 
39
- /**
40
- * Send the default registers through Griddo alerts.
41
- */
42
- async function sendGriddoDefaultAlerts() {
43
- if (envs.GRIDDO_ALERT_FEATURE) {
44
- const registerContent = apiRegister.get("API_RESPONSE_TOO_BIG");
59
+ // @todo add more messages...
60
+ async function resolveDomainRenderMode(options: { domain: string; shouldBeRendered: boolean }) {
61
+ const { domain, shouldBeRendered } = options;
62
+ const { __cache, __exports } = await getRenderPathsFromDB({ domain });
63
+
64
+ // missing exports
65
+ const missingExports = !(await pathExists(path.join(__exports)));
66
+ // render with errors
67
+ const db = await readDB();
68
+ const wasRenderWithError = db.domains[domain]?.isRendering;
69
+ // new deploy or machine
70
+ const isNewDeploy = await hasNewCommit(__cache);
71
+
72
+ if (missingExports) {
73
+ infoLog(`[${domain}]: Render from Scratch due to missing exports (first render)`);
74
+ return {
75
+ renderMode: RENDER_MODE.FROM_SCRATCH,
76
+ reason: "Missing exports directory",
77
+ };
78
+ }
45
79
 
46
- if (registerContent.entries.length < 1) {
47
- return;
80
+ if (wasRenderWithError) {
81
+ infoLog(`[${domain}]: Render from Scratch due to a previous render error`);
82
+ return {
83
+ renderMode: RENDER_MODE.FROM_SCRATCH,
84
+ reason: "error in previous render",
85
+ };
86
+ }
87
+
88
+ if (isNewDeploy) {
89
+ infoLog(`[${domain}]: Render from Scratch due to a changes in the repo (commit hash)`);
90
+ return { renderMode: RENDER_MODE.FROM_SCRATCH, reason: "new commit hash" };
91
+ }
92
+
93
+ if (!shouldBeRendered) {
94
+ infoLog(`[${domain}]: Skipping render as it is not marked for rendering (IDLE).`);
95
+ return { renderMode: RENDER_MODE.IDLE, reason: "" };
96
+ }
97
+
98
+ console.log(
99
+ `[${domain}]: {DEBUG} Render INCREMENTAL porque no se cumplen: missingExports (FROM_SCRATCH), wasRenderWithError (FROM_SCRATCH), isNewDeploy (FROM_SCRATCH) o !shouldBeRendered (IDLE)`,
100
+ );
101
+ return { renderMode: RENDER_MODE.INCREMENTAL, reason: "" };
102
+ }
103
+
104
+ async function hasNewCommit(basePath: string): Promise<boolean> {
105
+ const commitFile = path.join(basePath, "commit");
106
+ const currentCommit = execSync("git rev-parse HEAD").toString().trim();
107
+
108
+ if (await pathExists(commitFile)) {
109
+ const savedCommit = (await fsp.readFile(commitFile, "utf-8")).trim();
110
+ if (savedCommit === currentCommit) {
111
+ return false; // No hay nuevo commit
48
112
  }
49
113
 
50
- debugLog("\nRender register report\n");
51
- debugLog(registerContent);
52
- debugLog();
53
-
54
- await insertAlert({
55
- description: `API response size is too large (${envs.GRIDDO_API_MAX_RESPONSE_SIZE}KB).`,
56
- area: "Griddo",
57
- level: "W",
58
- fullData: {
59
- output: registerContent,
60
- date: new Date().toISOString(),
61
- },
62
- });
114
+ return true;
115
+ }
116
+
117
+ return true;
118
+ }
119
+
120
+ async function updateCommitFile(options: { basePath: string }) {
121
+ const { basePath } = options;
122
+ const currentCommit = execSync("git rev-parse HEAD").toString().trim();
123
+ await fsp.writeFile(path.join(basePath, "commit"), currentCommit);
124
+ }
125
+
126
+ async function getRenderMode(domain: string): Promise<RenderModeTuple> {
127
+ const db = await readDB();
128
+
129
+ if (!db.domains[domain].renderMode) {
130
+ throw new Error(`Render mode not found for domain ${domain}`);
63
131
  }
132
+
133
+ return {
134
+ renderMode: db.domains[domain].renderMode,
135
+ reason: db.domains[domain].renderModeReason,
136
+ };
137
+ }
138
+
139
+ async function getRenderPathsFromDB(options?: { domain?: string; dbFilePath?: string }) {
140
+ const { domain, dbFilePath } = options || {};
141
+
142
+ const db = await readDB(dbFilePath);
143
+ const paths = db.paths;
144
+
145
+ return {
146
+ __root: paths.root,
147
+ __cache: path.join(paths.cxCache, domain || ""),
148
+ __components: paths.components,
149
+ __cx: paths.cx,
150
+ __sites: paths.exportsDir,
151
+ __exports: path.join(paths.exportsDir, domain || ""),
152
+ __ssg: paths.ssg,
153
+ __exports_dist: path.join(paths.exportsDir, domain || "", "dist"),
154
+ };
155
+ }
156
+
157
+ async function getRenderMetadataFromDB() {
158
+ const db = await readDB();
159
+ return {
160
+ proDomainPrefix: db.proDomainPrefix,
161
+ griddoVersion: db.griddoVersion,
162
+ buildReportFileName: db.buildReportFileName,
163
+ };
164
+ }
165
+
166
+ /**
167
+ * Save a file with the end of build process to use as `build-end` signal.
168
+ */
169
+ async function generateBuildReport(domain: string) {
170
+ const authControl = await AuthService.login();
171
+
172
+ const { __root } = await getRenderPathsFromDB();
173
+ const { buildReportFileName } = await getRenderMetadataFromDB();
174
+ const { buildProcessData } = await getBuildMetadata(domain);
175
+
176
+ const buildSitesInfo = Object.keys(buildProcessData).map((siteID) => ({
177
+ ...buildProcessData[siteID],
178
+ siteId: Number.parseInt(siteID),
179
+ }));
180
+
181
+ const report = {
182
+ authControl,
183
+ sites: buildSitesInfo,
184
+ };
185
+
186
+ const reportFilePath = path.join(__root, "dist", buildReportFileName);
187
+
188
+ await fsp.writeFile(reportFilePath, JSON.stringify(report));
189
+
190
+ verboseLog(`build report saved in ${reportFilePath}`);
64
191
  }
65
192
 
66
193
  export {
67
- createSentinelRenderFile,
68
- deleteSentinelRenderFile,
69
- isValidRender,
70
- sendGriddoDefaultAlerts,
194
+ assertRenderIsValid,
195
+ generateBuildReport,
196
+ getRenderMetadataFromDB,
197
+ getRenderMode,
198
+ getRenderPathsFromDB,
199
+ markRenderAsCompleted,
200
+ markRenderAsStarted,
201
+ resolveDomainRenderMode,
202
+ updateCommitFile,
71
203
  };
@@ -0,0 +1,129 @@
1
+ import fsp from "node:fs/promises";
2
+ import path from "node:path";
3
+
4
+ import { AuthService } from "../services/auth";
5
+ import { getSitemap } from "../services/sites";
6
+ import { pathExists } from "./folders";
7
+ import { verboseLog } from "./loggin";
8
+ import { generateSitemapIndexXml, generateUrlsetXml } from "./npm-deps/xml-parser";
9
+ import { getRenderPathsFromDB } from "./render";
10
+ import { getBuildMetadata } from "./store";
11
+
12
+ /**
13
+ * Generate sitemaps and save them into file system.
14
+ */
15
+ async function generateSitemaps(domain: string) {
16
+ const { __root } = await getRenderPathsFromDB();
17
+ const { sitesToPublish } = await getBuildMetadata(domain);
18
+ const distDir = path.join(__root, "dist");
19
+ const templateSitemapPrefix = "sitemap-";
20
+
21
+ const isGriddoSitemapFile = (file: string) =>
22
+ file === "sitemap.xml" || (file.startsWith(templateSitemapPrefix) && file.endsWith(".xml"));
23
+
24
+ for (const site of sitesToPublish) {
25
+ const { id, languages } = site;
26
+
27
+ for (const lang of languages) {
28
+ // Local copy of headers to avoid mutating the shared object
29
+ const localHeaders: Record<string, string> = AuthService.headers
30
+ ? { ...AuthService.headers }
31
+ : {};
32
+ localHeaders.lang = lang.id.toString();
33
+
34
+ const response = await getSitemap({ siteId: id, headers: localHeaders });
35
+
36
+ if (!response) {
37
+ continue;
38
+ }
39
+
40
+ const { items: sitemapPagesGroup, url } = response;
41
+ const { home, domain } = url;
42
+
43
+ if (!home) {
44
+ continue;
45
+ }
46
+
47
+ const domainLanguage = site.domains.find(
48
+ (domain) => Object.keys(domain)[0] === lang.id.toString(),
49
+ );
50
+
51
+ if (!domainLanguage) {
52
+ continue;
53
+ }
54
+
55
+ const slug = Object.values(domainLanguage)[0];
56
+ const sitemaps: Array<string> = [];
57
+ const sitemapPageGroupKeys = Object.keys(sitemapPagesGroup);
58
+ const sitemapBasePath = path.join(distDir, slug.replace(domain, ""));
59
+
60
+ /** delete every griddo sitemap file before create the new ones */
61
+ if (await pathExists(sitemapBasePath)) {
62
+ try {
63
+ const files = await fsp.readdir(sitemapBasePath);
64
+ for (const file of files) {
65
+ if (isGriddoSitemapFile(file)) {
66
+ const filePath = path.join(sitemapBasePath, file);
67
+ try {
68
+ await fsp.rm(filePath);
69
+ } catch (err) {
70
+ console.error(`Error deleting file ${filePath}:`, err);
71
+ }
72
+ }
73
+ }
74
+ } catch (err) {
75
+ console.error(`Error reading ${sitemapBasePath}:`, err);
76
+ }
77
+ }
78
+
79
+ for (const templateId of sitemapPageGroupKeys) {
80
+ const sitemapPages = sitemapPagesGroup[templateId];
81
+
82
+ if (!sitemapPages.length) {
83
+ continue;
84
+ }
85
+
86
+ const siteMap = generateUrlsetXml(sitemapPages);
87
+
88
+ const sitemapName = `/${templateSitemapPrefix}${templateId.toLowerCase()}.xml`;
89
+ const exactPath = path.join(sitemapBasePath, sitemapName);
90
+
91
+ await saveFile(exactPath, siteMap);
92
+
93
+ sitemaps.push(`${home.endsWith("/") ? home.slice(0, -1) : home}${sitemapName}`);
94
+ }
95
+
96
+ if (!sitemaps.length) {
97
+ continue;
98
+ }
99
+
100
+ const siteMap = generateSitemapIndexXml(sitemaps);
101
+
102
+ const exactPath = path.join(sitemapBasePath, "sitemap.xml");
103
+
104
+ await saveFile(exactPath, siteMap);
105
+ verboseLog(`sitemap generated in ${exactPath}`);
106
+ }
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Saves the content to a file specified by its path. If the file exists, it will be overwritten.
112
+ *
113
+ * @param filePath The path of the file to save the content to.
114
+ * @param content The content to save to the file.
115
+ */
116
+ async function saveFile(filePath: string, content: string) {
117
+ try {
118
+ const pathName = path.dirname(filePath);
119
+ if (!(await pathExists(pathName))) {
120
+ await fsp.mkdir(pathName, { recursive: true });
121
+ }
122
+ await fsp.writeFile(filePath, content);
123
+ } catch (error) {
124
+ console.log(error);
125
+ throw new Error(`Error saving a file`);
126
+ }
127
+ }
128
+
129
+ export { generateSitemaps };
@@ -1,49 +1,35 @@
1
1
  import type { Site, SiteData } from "../types/sites";
2
2
 
3
+ import fsp from "node:fs/promises";
3
4
  import path from "node:path";
4
5
 
5
- import fs from "fs-extra";
6
- import { parse } from "js2xmlparser";
7
-
8
- import { envs } from "../constants";
9
- import { getConfig } from "./core-utils";
10
- import { buildLog, verboseLog } from "./loggin";
11
- import { getBuildMetadata } from "./store";
12
- import { AuthService } from "../services/auth";
6
+ import {
7
+ GRIDDO_RENDER_ALL_SITES,
8
+ GRIDDO_RENDER_PAGES,
9
+ GRIDDO_RENDER_SITE,
10
+ } from "../constants/envs";
13
11
  import {
14
12
  endSiteRender,
15
13
  getAllSites,
16
14
  getSiteInfo,
17
15
  getSiteLanguages,
18
- getSitemap,
19
16
  getSiteSocials,
20
17
  startSiteRender,
21
18
  } from "../services/sites";
22
-
23
- const config = getConfig();
19
+ import { getRenderPathsFromDB } from "./render";
24
20
 
25
21
  /**
26
22
  * Check the instance sites and returns site prepared to be published and unpublished.
27
23
  */
28
24
  async function getSitesToRender(domain: string) {
29
- console.info(`API URL ${envs.GRIDDO_API_URL as string}`);
30
-
31
- // Login to API
32
- await AuthService.login();
33
-
34
25
  // Get all sites. An array of Site
35
26
  const allSites = await getAllSites(domain);
36
27
 
37
28
  // Filter the array of sites to get only the ones to build/render
38
- const validSites = envs.GRIDDO_RENDER_ALL_SITES
39
- ? allSites.filter(
40
- (site) =>
41
- !envs.GRIDDO_RENDER_SITE || site.id === envs.GRIDDO_RENDER_SITE,
42
- )
29
+ const validSites = GRIDDO_RENDER_ALL_SITES
30
+ ? allSites.filter((site) => !GRIDDO_RENDER_SITE || site.id === GRIDDO_RENDER_SITE)
43
31
  : allSites.filter((site) =>
44
- envs.GRIDDO_RENDER_SITE
45
- ? site.id === envs.GRIDDO_RENDER_SITE
46
- : !!site.shouldBeUpdated,
32
+ GRIDDO_RENDER_SITE ? site.id === GRIDDO_RENDER_SITE : !!site.shouldBeUpdated,
47
33
  );
48
34
 
49
35
  // If there are valid sites...
@@ -58,8 +44,7 @@ async function getSitesToRender(domain: string) {
58
44
  site.domains = items
59
45
  .filter(
60
46
  (item) =>
61
- item.domain &&
62
- (item.domain.slug === domain || item.domain.slug === `/${domain}`),
47
+ item.domain && (item.domain.slug === domain || item.domain.slug === `/${domain}`),
63
48
  )
64
49
  .map((item) => ({ [item.id]: `${item.domain.slug}${item.path}` }));
65
50
  }
@@ -67,15 +52,11 @@ async function getSitesToRender(domain: string) {
67
52
 
68
53
  // Save sites object to publish
69
54
  const sitesToPublish = validSites.filter((site) =>
70
- envs.GRIDDO_RENDER_SITE
71
- ? site.id === envs.GRIDDO_RENDER_SITE
72
- : !!site.isPublished,
55
+ GRIDDO_RENDER_SITE ? site.id === GRIDDO_RENDER_SITE : !!site.isPublished,
73
56
  );
74
57
 
75
58
  // Save sites object to unpublish
76
- const sitesToUnpublish = validSites.filter(
77
- (site) => !site.isPublished && site.shouldBeUpdated,
78
- );
59
+ const sitesToUnpublish = validSites.filter((site) => !site.isPublished && site.shouldBeUpdated);
79
60
 
80
61
  return {
81
62
  sitesToPublish,
@@ -90,7 +71,7 @@ async function getSitesToRender(domain: string) {
90
71
  * @see https://griddoio.notion.site/Sites-d7bb0b7cb8d24894a5337e1139fc3d09#2019d3255bda4d219c7e19cf28d0c4fe
91
72
  */
92
73
  async function unpublishSites(sites: Array<Site>) {
93
- const { __cx } = config.paths();
74
+ const { __root } = await getRenderPathsFromDB();
94
75
 
95
76
  for (const site of sites) {
96
77
  // API
@@ -107,7 +88,8 @@ async function unpublishSites(sites: Array<Site>) {
107
88
 
108
89
  // STORE
109
90
  // Remove site directory from the Store
110
- fs.rmSync(path.join(__cx, "store", site.id.toString()), {
91
+ // @todo: quitar. Como ya no hay persistenci de store, esto debería eliminarse de forma segura.
92
+ await fsp.rm(path.join(__root, "store", site.id.toString()), {
111
93
  force: true,
112
94
  recursive: true,
113
95
  });
@@ -130,8 +112,8 @@ async function getSiteData(siteID: number) {
130
112
 
131
113
  const { siteHash, unpublishHashes, publishIds } = buildData;
132
114
  const { headers, footers } = siteInfo;
133
- const validPagesIds = envs.GRIDDO_RENDER_PAGES.length
134
- ? envs.GRIDDO_RENDER_PAGES.filter((item) => publishIds.includes(item))
115
+ const validPagesIds = GRIDDO_RENDER_PAGES.length
116
+ ? GRIDDO_RENDER_PAGES.filter((item) => publishIds.includes(item))
135
117
  : publishIds;
136
118
 
137
119
  const siteData: SiteData = {
@@ -149,164 +131,4 @@ async function getSiteData(siteID: number) {
149
131
  return siteData;
150
132
  }
151
133
 
152
- /**
153
- * Save a file with the end of build process to use as `build-end` signal.
154
- */
155
- async function generateBuildReport() {
156
- const { __cx } = config.paths();
157
- const { buildReportFileName } = config;
158
-
159
- const { buildProcessData } = await getBuildMetadata();
160
-
161
- // Get the token
162
- const authControl = await AuthService.login();
163
-
164
- const buildSitesInfo = Object.keys(buildProcessData).map((siteID) => ({
165
- ...buildProcessData[siteID],
166
- siteId: Number.parseInt(siteID),
167
- }));
168
-
169
- const report = {
170
- authControl,
171
- sites: buildSitesInfo,
172
- };
173
-
174
- const reportFilePath = path.join(__cx, "dist", buildReportFileName);
175
- fs.writeFileSync(reportFilePath, JSON.stringify(report));
176
-
177
- verboseLog(`build report saved in ${reportFilePath}`);
178
-
179
- buildLog(`Build report saved for ${buildSitesInfo.length} site(s)`);
180
- }
181
-
182
- /**
183
- * Generate sitemaps and save them into file system.
184
- */
185
- async function generateSitemaps() {
186
- const { sitesToPublish } = await getBuildMetadata();
187
- const { __cx } = config.paths();
188
- const distDir = path.join(__cx, "dist");
189
-
190
- const templateSitemapPrefix = "sitemap-";
191
-
192
- const isGriddoSitemapFile = (file: string) =>
193
- file === "sitemap.xml" ||
194
- (file.startsWith(templateSitemapPrefix) && file.endsWith(".xml"));
195
-
196
- for (const site of sitesToPublish) {
197
- const { id, languages } = site;
198
-
199
- for (const lang of languages) {
200
- if (AuthService.headers) {
201
- AuthService.headers.lang = lang.id.toString();
202
- }
203
-
204
- const response = await getSitemap(id);
205
-
206
- if (!response) continue;
207
-
208
- const {
209
- items: sitemapPagesGroup,
210
- url: { home, domain },
211
- } = response;
212
-
213
- if (!home) continue;
214
-
215
- const domainLanguage = site.domains.find(
216
- (domain) => Object.keys(domain)[0] === lang.id.toString(),
217
- );
218
-
219
- if (!domainLanguage) continue;
220
-
221
- const slug = Object.values(domainLanguage)[0];
222
- const sitemaps: Array<string> = [];
223
- const sitemapPageGroupKeys = Object.keys(sitemapPagesGroup);
224
- const sitemapBasePath = path.join(distDir, slug.replace(domain, ""));
225
-
226
- /** delete every griddo sitemap file before create the new ones */
227
- if (fs.existsSync(sitemapBasePath)) {
228
- try {
229
- const files = fs.readdirSync(sitemapBasePath);
230
- for (const file of files) {
231
- if (isGriddoSitemapFile(file)) {
232
- const filePath = path.join(sitemapBasePath, file);
233
- try {
234
- fs.unlinkSync(filePath);
235
- } catch (err) {
236
- console.error(`Error removing ${filePath}:`, err);
237
- }
238
- }
239
- }
240
- } catch (err) {
241
- console.error(`Error reading ${sitemapBasePath}:`, err);
242
- }
243
- }
244
-
245
- for (const templateId of sitemapPageGroupKeys) {
246
- const sitemapPages = sitemapPagesGroup[templateId];
247
-
248
- if (!sitemapPages.length) continue;
249
-
250
- const siteMap = parse("urlset", {
251
- "@": {
252
- xmlns: "http://www.sitemaps.org/schemas/sitemap/0.9",
253
- "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
254
- "xsi:schemaLocation":
255
- "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd",
256
- },
257
- url: sitemapPages,
258
- });
259
-
260
- const sitemapName = `/${templateSitemapPrefix}${templateId.toLowerCase()}.xml`;
261
- const exactPath = path.join(sitemapBasePath, sitemapName);
262
-
263
- saveFile(exactPath, siteMap);
264
-
265
- sitemaps.push(
266
- `${home.endsWith("/") ? home.slice(0, -1) : home}${sitemapName}`,
267
- );
268
- }
269
-
270
- if (!sitemaps.length) {
271
- continue;
272
- }
273
-
274
- const siteMap = parse("sitemapindex", {
275
- "@": { xmlns: "http://www.sitemaps.org/schemas/sitemap/0.9" },
276
- sitemap: sitemaps.map((loc) => ({ loc })),
277
- });
278
-
279
- const exactPath = path.join(sitemapBasePath, "sitemap.xml");
280
-
281
- saveFile(exactPath, siteMap);
282
- verboseLog(`sitemap generated in ${exactPath}`);
283
- }
284
- }
285
- }
286
-
287
- /**
288
- * Saves the content to a file specified by its path. If the file exists, it will be overwritten.
289
- *
290
- * @param filePath The path of the file to save the content to.
291
- * @param content The content to save to the file.
292
- */
293
- function saveFile(filePath: string, content: string) {
294
- try {
295
- const pathName = path.dirname(filePath);
296
- if (!fs.existsSync(pathName)) {
297
- fs.mkdirSync(pathName, { recursive: true });
298
- }
299
- fs.writeFileSync(filePath, content);
300
- } catch (error) {
301
- console.log(error);
302
- throw new Error(`Error saving a file`);
303
- }
304
- }
305
-
306
- export {
307
- generateBuildReport,
308
- generateSitemaps,
309
- getSiteData,
310
- getSitesToRender,
311
- unpublishSites,
312
- };
134
+ export { getSiteData, getSitesToRender, unpublishSites };