@griddo/cx 11.7.12-rc.4 → 11.7.12

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 (303) hide show
  1. package/README.md +226 -27
  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/endpoints.d.ts +19 -0
  12. package/build/constants/envs.d.ts +37 -0
  13. package/build/constants/index.d.ts +57 -0
  14. package/build/end-render.js +74 -0
  15. package/build/end-render.js.map +7 -0
  16. package/build/errors/errors-data.d.ts +22 -0
  17. package/build/errors/index.d.ts +15 -0
  18. package/build/index.d.ts +29 -0
  19. package/build/index.js +73 -0
  20. package/build/index.js.map +7 -0
  21. package/build/prepare-domains-render.js +73 -0
  22. package/build/prepare-domains-render.js.map +7 -0
  23. package/build/react/Favicon/index.d.ts +5 -0
  24. package/build/react/Favicon/utils.d.ts +9 -0
  25. package/build/react/GriddoIntegrations/index.d.ts +20 -0
  26. package/build/react/GriddoIntegrations/utils.d.ts +26 -0
  27. package/{react/index.tsx → build/react/index.d.ts} +0 -1
  28. package/build/react/index.js +3 -0
  29. package/build/registers/api.d.ts +9 -0
  30. package/build/registers/gatsby.d.ts +9 -0
  31. package/build/registers/index.d.ts +3 -0
  32. package/build/reset-render.js +74 -0
  33. package/build/reset-render.js.map +7 -0
  34. package/build/services/auth.d.ts +10 -0
  35. package/build/services/domains.d.ts +6 -0
  36. package/build/services/navigation.d.ts +50 -0
  37. package/build/services/reference-fields.d.ts +20 -0
  38. package/build/services/register.d.ts +36 -0
  39. package/build/services/robots.d.ts +19 -0
  40. package/build/services/settings.d.ts +4 -0
  41. package/build/services/sites.d.ts +29 -0
  42. package/build/services/store.d.ts +6 -0
  43. package/build/start-render.js +100 -0
  44. package/build/start-render.js.map +7 -0
  45. package/build/types/api.d.ts +142 -0
  46. package/build/types/global.d.ts +84 -0
  47. package/build/types/navigation.d.ts +28 -0
  48. package/build/types/pages.d.ts +144 -0
  49. package/build/types/sites.d.ts +57 -0
  50. package/build/types/templates.d.ts +8 -0
  51. package/build/upload-search-content.js +74 -0
  52. package/build/upload-search-content.js.map +7 -0
  53. package/build/utils/alerts.d.ts +3 -0
  54. package/build/utils/api.d.ts +23 -0
  55. package/build/utils/cache.d.ts +35 -0
  56. package/build/utils/core-utils.d.ts +107 -0
  57. package/build/utils/create-build-data.d.ts +8 -0
  58. package/build/utils/domains.d.ts +13 -0
  59. package/build/utils/folders.d.ts +53 -0
  60. package/build/utils/health-checks.d.ts +7 -0
  61. package/build/utils/images.d.ts +16 -0
  62. package/build/utils/instance.d.ts +21 -0
  63. package/build/utils/loggin.d.ts +51 -0
  64. package/build/utils/pages.d.ts +34 -0
  65. package/build/utils/render.d.ts +13 -0
  66. package/build/utils/searches.d.ts +15 -0
  67. package/build/utils/sites.d.ts +31 -0
  68. package/build/utils/store.d.ts +81 -0
  69. package/cx.config.d.ts +5 -0
  70. package/cx.config.js +36 -0
  71. package/exporter/adapters/gatsby/index.ts +153 -73
  72. package/exporter/adapters/gatsby/utils.ts +161 -0
  73. package/exporter/artifacts/README.md +34 -0
  74. package/exporter/artifacts/index.ts +33 -0
  75. package/exporter/build.sh +38 -4
  76. package/exporter/commands/end-render.ts +70 -72
  77. package/exporter/commands/move-assets.ts +11 -0
  78. package/exporter/commands/prepare-domains-render.ts +31 -143
  79. package/exporter/commands/reset-render.ts +3 -10
  80. package/exporter/commands/start-render.ts +45 -22
  81. package/exporter/commands/upload-search-content.ts +21 -194
  82. package/exporter/constants/endpoints.ts +1 -2
  83. package/exporter/constants/envs.ts +55 -57
  84. package/exporter/constants/index.ts +129 -0
  85. package/exporter/{constants/errors.ts → errors/errors-data.ts} +14 -24
  86. package/exporter/{utils/errors.ts → errors/index.ts} +9 -10
  87. package/exporter/index.ts +82 -0
  88. package/{react → exporter/react}/Favicon/index.tsx +7 -1
  89. package/{react → exporter/react}/GriddoIntegrations/index.tsx +22 -16
  90. package/{react → exporter/react}/GriddoIntegrations/utils.ts +9 -21
  91. package/exporter/react/index.tsx +11 -0
  92. package/exporter/registers/api.ts +14 -0
  93. package/exporter/registers/gatsby.ts +14 -0
  94. package/exporter/registers/index.ts +4 -0
  95. package/exporter/services/auth.ts +6 -7
  96. package/exporter/services/domains.ts +16 -0
  97. package/exporter/services/navigation.ts +10 -4
  98. package/exporter/services/reference-fields.ts +24 -9
  99. package/exporter/services/register.ts +113 -0
  100. package/exporter/services/robots.ts +16 -9
  101. package/exporter/services/settings.ts +17 -0
  102. package/exporter/services/sites.ts +24 -36
  103. package/exporter/services/store.ts +96 -107
  104. package/exporter/types/api.ts +28 -27
  105. package/exporter/types/global.ts +11 -8
  106. package/exporter/types/navigation.ts +1 -1
  107. package/exporter/types/pages.ts +3 -2
  108. package/exporter/types/sites.ts +2 -1
  109. package/exporter/utils/alerts.ts +29 -0
  110. package/exporter/utils/api.ts +75 -55
  111. package/exporter/utils/cache.ts +62 -37
  112. package/exporter/utils/core-utils.ts +272 -133
  113. package/exporter/utils/create-build-data.ts +17 -0
  114. package/exporter/utils/domains.ts +7 -10
  115. package/exporter/utils/folders.ts +98 -163
  116. package/exporter/utils/health-checks.ts +64 -0
  117. package/exporter/utils/images.ts +6 -1
  118. package/exporter/utils/instance.ts +13 -9
  119. package/exporter/utils/loggin.ts +91 -44
  120. package/exporter/utils/pages.ts +88 -23
  121. package/exporter/utils/render.ts +48 -180
  122. package/exporter/utils/searches.ts +156 -0
  123. package/exporter/utils/sites.ts +197 -19
  124. package/exporter/utils/store.ts +180 -87
  125. package/gatsby-browser.tsx +58 -41
  126. package/gatsby-config.ts +17 -10
  127. package/gatsby-node.ts +78 -17
  128. package/gatsby-ssr.tsx +1 -2
  129. package/package.json +86 -36
  130. package/src/README.md +7 -0
  131. package/src/components/Head.tsx +46 -13
  132. package/src/components/template.tsx +30 -8
  133. package/src/gatsby-node-utils.ts +2 -73
  134. package/src/html.tsx +11 -2
  135. package/src/types.ts +5 -5
  136. package/start-render.js +7 -0
  137. package/tsconfig.json +3 -5
  138. package/build/adapters/gatsby/actions/clean.js +0 -10
  139. package/build/adapters/gatsby/actions/clean.js.map +0 -1
  140. package/build/adapters/gatsby/actions/close.js +0 -12
  141. package/build/adapters/gatsby/actions/close.js.map +0 -1
  142. package/build/adapters/gatsby/actions/data.js +0 -18
  143. package/build/adapters/gatsby/actions/data.js.map +0 -1
  144. package/build/adapters/gatsby/actions/healthCheck.js +0 -10
  145. package/build/adapters/gatsby/actions/healthCheck.js.map +0 -1
  146. package/build/adapters/gatsby/actions/init.js +0 -22
  147. package/build/adapters/gatsby/actions/init.js.map +0 -1
  148. package/build/adapters/gatsby/actions/logs.js +0 -12
  149. package/build/adapters/gatsby/actions/logs.js.map +0 -1
  150. package/build/adapters/gatsby/actions/meta.js +0 -13
  151. package/build/adapters/gatsby/actions/meta.js.map +0 -1
  152. package/build/adapters/gatsby/actions/prepare.js +0 -9
  153. package/build/adapters/gatsby/actions/prepare.js.map +0 -1
  154. package/build/adapters/gatsby/actions/relocation.js +0 -15
  155. package/build/adapters/gatsby/actions/relocation.js.map +0 -1
  156. package/build/adapters/gatsby/actions/restore.js +0 -26
  157. package/build/adapters/gatsby/actions/restore.js.map +0 -1
  158. package/build/adapters/gatsby/actions/ssg.js +0 -9
  159. package/build/adapters/gatsby/actions/ssg.js.map +0 -1
  160. package/build/adapters/gatsby/actions/sync.js +0 -51
  161. package/build/adapters/gatsby/actions/sync.js.map +0 -1
  162. package/build/adapters/gatsby/index.js +0 -78
  163. package/build/adapters/gatsby/index.js.map +0 -1
  164. package/build/adapters/gatsby/shared/artifacts.js +0 -20
  165. package/build/adapters/gatsby/shared/artifacts.js.map +0 -1
  166. package/build/adapters/gatsby/shared/context.js +0 -31
  167. package/build/adapters/gatsby/shared/context.js.map +0 -1
  168. package/build/adapters/gatsby/shared/diff-assets.js +0 -101
  169. package/build/adapters/gatsby/shared/diff-assets.js.map +0 -1
  170. package/build/adapters/gatsby/shared/extract-assets.js +0 -58
  171. package/build/adapters/gatsby/shared/extract-assets.js.map +0 -1
  172. package/build/adapters/gatsby/shared/gatsby-build.js +0 -55
  173. package/build/adapters/gatsby/shared/gatsby-build.js.map +0 -1
  174. package/build/adapters/gatsby/shared/sync-render.js +0 -210
  175. package/build/adapters/gatsby/shared/sync-render.js.map +0 -1
  176. package/build/adapters/gatsby/shared/types.js +0 -3
  177. package/build/adapters/gatsby/shared/types.js.map +0 -1
  178. package/build/commands/end-render.js +0 -87
  179. package/build/commands/end-render.js.map +0 -1
  180. package/build/commands/prepare-assets-directory.js +0 -30
  181. package/build/commands/prepare-assets-directory.js.map +0 -1
  182. package/build/commands/prepare-domains-render.js +0 -133
  183. package/build/commands/prepare-domains-render.js.map +0 -1
  184. package/build/commands/reset-render.js +0 -21
  185. package/build/commands/reset-render.js.map +0 -1
  186. package/build/commands/start-render.js +0 -44
  187. package/build/commands/start-render.js.map +0 -1
  188. package/build/commands/upload-search-content.js +0 -180
  189. package/build/commands/upload-search-content.js.map +0 -1
  190. package/build/constants/endpoints.js +0 -43
  191. package/build/constants/endpoints.js.map +0 -1
  192. package/build/constants/envs.js +0 -68
  193. package/build/constants/envs.js.map +0 -1
  194. package/build/constants/errors.js +0 -81
  195. package/build/constants/errors.js.map +0 -1
  196. package/build/services/auth.js +0 -40
  197. package/build/services/auth.js.map +0 -1
  198. package/build/services/db-class.js +0 -49
  199. package/build/services/db-class.js.map +0 -1
  200. package/build/services/db.js +0 -34
  201. package/build/services/db.js.map +0 -1
  202. package/build/services/navigation.js +0 -96
  203. package/build/services/navigation.js.map +0 -1
  204. package/build/services/reference-fields.js +0 -131
  205. package/build/services/reference-fields.js.map +0 -1
  206. package/build/services/robots.js +0 -60
  207. package/build/services/robots.js.map +0 -1
  208. package/build/services/sites.js +0 -110
  209. package/build/services/sites.js.map +0 -1
  210. package/build/services/store.js +0 -257
  211. package/build/services/store.js.map +0 -1
  212. package/build/types/api.js +0 -3
  213. package/build/types/api.js.map +0 -1
  214. package/build/types/global.js +0 -3
  215. package/build/types/global.js.map +0 -1
  216. package/build/types/navigation.js +0 -3
  217. package/build/types/navigation.js.map +0 -1
  218. package/build/types/pages.js +0 -3
  219. package/build/types/pages.js.map +0 -1
  220. package/build/types/render.js +0 -10
  221. package/build/types/render.js.map +0 -1
  222. package/build/types/sites.js +0 -3
  223. package/build/types/sites.js.map +0 -1
  224. package/build/types/templates.js +0 -3
  225. package/build/types/templates.js.map +0 -1
  226. package/build/utils/api.js +0 -165
  227. package/build/utils/api.js.map +0 -1
  228. package/build/utils/artifacts.js +0 -38
  229. package/build/utils/artifacts.js.map +0 -1
  230. package/build/utils/brush.js +0 -30
  231. package/build/utils/brush.js.map +0 -1
  232. package/build/utils/cache.js +0 -106
  233. package/build/utils/cache.js.map +0 -1
  234. package/build/utils/check-environment-health.js +0 -73
  235. package/build/utils/check-environment-health.js.map +0 -1
  236. package/build/utils/core-utils.js +0 -270
  237. package/build/utils/core-utils.js.map +0 -1
  238. package/build/utils/domains.js +0 -37
  239. package/build/utils/domains.js.map +0 -1
  240. package/build/utils/errors.js +0 -30
  241. package/build/utils/errors.js.map +0 -1
  242. package/build/utils/folders.js +0 -341
  243. package/build/utils/folders.js.map +0 -1
  244. package/build/utils/images.js +0 -45
  245. package/build/utils/images.js.map +0 -1
  246. package/build/utils/instance.js +0 -66
  247. package/build/utils/instance.js.map +0 -1
  248. package/build/utils/loggin.js +0 -119
  249. package/build/utils/loggin.js.map +0 -1
  250. package/build/utils/npm-deps/find-up-simple.js +0 -75
  251. package/build/utils/npm-deps/find-up-simple.js.map +0 -1
  252. package/build/utils/npm-deps/pkg-dir.js +0 -20
  253. package/build/utils/npm-deps/pkg-dir.js.map +0 -1
  254. package/build/utils/npm-deps/xml-parser.js +0 -49
  255. package/build/utils/npm-deps/xml-parser.js.map +0 -1
  256. package/build/utils/pages.js +0 -359
  257. package/build/utils/pages.js.map +0 -1
  258. package/build/utils/render.js +0 -168
  259. package/build/utils/render.js.map +0 -1
  260. package/build/utils/sitemaps.js +0 -110
  261. package/build/utils/sitemaps.js.map +0 -1
  262. package/build/utils/sites.js +0 -105
  263. package/build/utils/sites.js.map +0 -1
  264. package/build/utils/store.js +0 -193
  265. package/build/utils/store.js.map +0 -1
  266. package/cli.mjs +0 -136
  267. package/exporter/adapters/gatsby/actions/clean.ts +0 -14
  268. package/exporter/adapters/gatsby/actions/close.ts +0 -17
  269. package/exporter/adapters/gatsby/actions/data.ts +0 -25
  270. package/exporter/adapters/gatsby/actions/healthCheck.ts +0 -10
  271. package/exporter/adapters/gatsby/actions/init.ts +0 -26
  272. package/exporter/adapters/gatsby/actions/logs.ts +0 -13
  273. package/exporter/adapters/gatsby/actions/meta.ts +0 -16
  274. package/exporter/adapters/gatsby/actions/prepare.ts +0 -9
  275. package/exporter/adapters/gatsby/actions/relocation.ts +0 -15
  276. package/exporter/adapters/gatsby/actions/restore.ts +0 -36
  277. package/exporter/adapters/gatsby/actions/ssg.ts +0 -12
  278. package/exporter/adapters/gatsby/actions/sync.ts +0 -71
  279. package/exporter/adapters/gatsby/shared/artifacts.ts +0 -16
  280. package/exporter/adapters/gatsby/shared/context.ts +0 -50
  281. package/exporter/adapters/gatsby/shared/diff-assets.ts +0 -113
  282. package/exporter/adapters/gatsby/shared/extract-assets.ts +0 -61
  283. package/exporter/adapters/gatsby/shared/gatsby-build.ts +0 -58
  284. package/exporter/adapters/gatsby/shared/sync-render.ts +0 -276
  285. package/exporter/adapters/gatsby/shared/types.ts +0 -35
  286. package/exporter/build-esbuild.noop +0 -42
  287. package/exporter/commands/prepare-assets-directory.ts +0 -30
  288. package/exporter/services/db-class.ts +0 -54
  289. package/exporter/services/db.ts +0 -32
  290. package/exporter/types/render.ts +0 -59
  291. package/exporter/utils/artifacts.ts +0 -38
  292. package/exporter/utils/brush.ts +0 -34
  293. package/exporter/utils/check-environment-health.ts +0 -84
  294. package/exporter/utils/npm-deps/find-up-simple.ts +0 -100
  295. package/exporter/utils/npm-deps/pkg-dir.ts +0 -17
  296. package/exporter/utils/npm-deps/xml-parser.ts +0 -57
  297. package/exporter/utils/sitemaps.ts +0 -129
  298. package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +0 -55
  299. package/plugins/gatsby-plugin-svgr-loader/package.json +0 -8
  300. package/react/DynamicScript/index.tsx +0 -33
  301. package/tsconfig.commands.json +0 -36
  302. package/tsconfig.exporter.json +0 -19
  303. /package/{react → exporter/react}/Favicon/utils.ts +0 -0
@@ -1,203 +1,71 @@
1
- import type { RenderModeTuple } from "../types/render";
2
-
3
- import { execSync } from "node:child_process";
4
- import fsp from "node:fs/promises";
1
+ import fs from "node:fs";
5
2
  import path from "node:path";
6
3
 
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";
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";
11
+
12
+ const config = getConfig();
15
13
 
16
14
  /**
17
15
  * Creates a sentinel file with the current date and time.
18
16
  * This file is used to track later if node_modules/@griddo/cx was cleaned by a
19
- * npm install coming from a deploy.
17
+ * npm install from a deploy.
20
18
  */
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());
19
+ function createSentinelRenderFile() {
20
+ const { __cx } = config.paths();
21
+ const renderSentinelFile = path.join(__cx, ".render-sentinel");
22
+ fs.writeFileSync(renderSentinelFile, new Date().toISOString());
34
23
  }
35
24
 
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);
25
+ function deleteSentinelRenderFile() {
26
+ const { __cx } = config.paths();
27
+ const renderSentinelFile = path.join(__cx, ".render-sentinel");
28
+ fs.unlinkSync(renderSentinelFile);
47
29
  }
48
30
 
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))) {
31
+ function isValidRender() {
32
+ const { __cx } = config.paths();
33
+ const renderSentinelFile = path.join(__cx, ".render-sentinel");
34
+ if (!fs.existsSync(renderSentinelFile)) {
55
35
  throwError(RenderUUIDError);
56
36
  }
57
37
  }
58
38
 
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
- }
79
-
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
112
- }
113
-
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}`);
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
39
  /**
167
- * Save a file with the end of build process to use as `build-end` signal.
40
+ * Send the default registers through Griddo alerts.
168
41
  */
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);
42
+ async function sendGriddoDefaultAlerts() {
43
+ if (envs.GRIDDO_ALERT_FEATURE) {
44
+ const registerContent = apiRegister.get("API_RESPONSE_TOO_BIG");
175
45
 
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));
46
+ if (registerContent.entries.length < 1) {
47
+ return;
48
+ }
189
49
 
190
- verboseLog(`build report saved in ${reportFilePath}`);
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
+ });
63
+ }
191
64
  }
192
65
 
193
66
  export {
194
- assertRenderIsValid,
195
- generateBuildReport,
196
- getRenderMetadataFromDB,
197
- getRenderMode,
198
- getRenderPathsFromDB,
199
- markRenderAsCompleted,
200
- markRenderAsStarted,
201
- resolveDomainRenderMode,
202
- updateCommitFile,
67
+ createSentinelRenderFile,
68
+ deleteSentinelRenderFile,
69
+ isValidRender,
70
+ sendGriddoDefaultAlerts,
203
71
  };
@@ -0,0 +1,156 @@
1
+ import type { PostSearchInfoResponse } from "../types/api";
2
+ import type {
3
+ AIEmbeddingsResponse,
4
+ PostSearchInfoProps,
5
+ } from "../types/global";
6
+
7
+ import fs from "node:fs";
8
+ import path from "node:path";
9
+
10
+ import { post } from "./api";
11
+ import { getConfig } from "./core-utils";
12
+ import { getBuildPagesFromCachedStore } from "./store";
13
+ import { endpoints } from "../constants";
14
+
15
+ /**
16
+ * Save in the BBDD the content of a page parsed without HTML tags.
17
+ *
18
+ * @param props Object with parts of the final page object to be saved in the BBDD.
19
+ */
20
+ async function postSearchInfo(props: PostSearchInfoProps) {
21
+ const {
22
+ title,
23
+ description,
24
+ image,
25
+ pageId,
26
+ languageId,
27
+ siteId,
28
+ url,
29
+ content,
30
+ template,
31
+ } = props;
32
+
33
+ const response = await post<PostSearchInfoResponse>({
34
+ endpoint: endpoints.SEARCH,
35
+ body: {
36
+ title,
37
+ description,
38
+ image,
39
+ pageId,
40
+ languageId,
41
+ siteId,
42
+ url,
43
+ template,
44
+ content,
45
+ },
46
+ useApiCacheDir: false,
47
+ });
48
+
49
+ return response;
50
+ }
51
+
52
+ /**
53
+ * Remove the every cntent inside some HTML tags including them.
54
+ *
55
+ * @param content A string with the content.
56
+ */
57
+ function prepareHTMLContentForSearch(content: string): string {
58
+ // 1. Remove script, style, and other unwanted block tags and their content.
59
+ // The regex looks for <tag...>...</tag> where tag is one of the specified ones.
60
+ const tagsToRemove = [
61
+ "meta",
62
+ "link",
63
+ "style",
64
+ "script",
65
+ "noscript",
66
+ "nav",
67
+ "header",
68
+ "footer",
69
+ ];
70
+ const removeTagsRegex = new RegExp(
71
+ `<(${tagsToRemove.join("|")})\\b[^>]*>.*?<\\/\\1>`,
72
+ "gis",
73
+ );
74
+ let processedContent = content.replace(removeTagsRegex, "");
75
+
76
+ // 2. Strip all remaining HTML tags.
77
+ processedContent = processedContent.replace(/<[^>]+>/g, " ");
78
+
79
+ // 3. Normalize whitespace: replace multiple spaces/newlines with a single space and trim.
80
+ processedContent = processedContent.replace(/\s+/g, " ").trim();
81
+
82
+ return processedContent;
83
+ }
84
+
85
+ /**
86
+ * Function that search in the `/public` dir the content info of the pages and
87
+ * send it to the search table in the ddbb using the API.
88
+ */
89
+ async function uploadRenderedSearchContentToAPI(
90
+ distDomainPath: string,
91
+ domain: string,
92
+ ) {
93
+ const config = getConfig();
94
+ const { __cache } = config.paths(domain);
95
+
96
+ // Extraemos el path de la carpeta store dentro de un dominio
97
+ const storeFolder = path.join(__cache, "store");
98
+
99
+ // Este caso sería que el dominio existe en la instancia pero no hay sites
100
+ // renderizardos bajo el mismo. Por lo que `store` no existe.
101
+ if (!fs.existsSync(storeFolder)) {
102
+ console.log(
103
+ `Skipping uploading content to the search endpoint for the domain ${domain}, it has not exported sites.`,
104
+ );
105
+ return;
106
+ }
107
+
108
+ // Obtenemos las páginas del store cacheado de un dominio
109
+ const storePages = getBuildPagesFromCachedStore(domain);
110
+
111
+ for await (const store of storePages) {
112
+ const {
113
+ context: { page, openGraph, pageMetadata },
114
+ } = store;
115
+
116
+ const { compose } = page.fullPath;
117
+
118
+ const contextPath = path.resolve(`${distDomainPath}/${compose}/index.html`);
119
+
120
+ const content = fs.readFileSync(contextPath).toString();
121
+
122
+ const pageObject: PostSearchInfoProps = {
123
+ siteId: page.site,
124
+ pageId: page.id,
125
+ // `pageMetadata.title` has already a fallback `metatitle ||
126
+ // pageTitle` so probably `title` never will be take the
127
+ // `openGraph?.title` value. Only when the `metatitle` and
128
+ // `pageTitle` are empty.
129
+ title: pageMetadata?.title || openGraph?.title,
130
+ languageId: page.language,
131
+ url: page.fullUrl,
132
+ template: page.template.templateType || page.templateId,
133
+ description: pageMetadata?.description || openGraph?.description,
134
+ image: openGraph.image,
135
+ content: prepareHTMLContentForSearch(content),
136
+ };
137
+
138
+ await postSearchInfo(pageObject);
139
+ }
140
+ }
141
+
142
+ async function startAIEmbeddings() {
143
+ try {
144
+ await post<AIEmbeddingsResponse>({
145
+ endpoint: endpoints.AI_EMBEDDINGS,
146
+ useApiCacheDir: false,
147
+ });
148
+ } catch (error) {
149
+ console.warn(
150
+ "There was an error with the ai embeddings",
151
+ (error as Error).message,
152
+ );
153
+ }
154
+ }
155
+
156
+ export { postSearchInfo, startAIEmbeddings, uploadRenderedSearchContentToAPI };
@@ -1,35 +1,49 @@
1
1
  import type { Site, SiteData } from "../types/sites";
2
2
 
3
- import fsp from "node:fs/promises";
4
3
  import path from "node:path";
5
4
 
6
- import {
7
- GRIDDO_RENDER_ALL_SITES,
8
- GRIDDO_RENDER_PAGES,
9
- GRIDDO_RENDER_SITE,
10
- } from "../constants/envs";
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";
11
13
  import {
12
14
  endSiteRender,
13
15
  getAllSites,
14
16
  getSiteInfo,
15
17
  getSiteLanguages,
18
+ getSitemap,
16
19
  getSiteSocials,
17
20
  startSiteRender,
18
21
  } from "../services/sites";
19
- import { getRenderPathsFromDB } from "./render";
22
+
23
+ const config = getConfig();
20
24
 
21
25
  /**
22
26
  * Check the instance sites and returns site prepared to be published and unpublished.
23
27
  */
24
28
  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
+
25
34
  // Get all sites. An array of Site
26
35
  const allSites = await getAllSites(domain);
27
36
 
28
37
  // Filter the array of sites to get only the ones to build/render
29
- const validSites = GRIDDO_RENDER_ALL_SITES
30
- ? allSites.filter((site) => !GRIDDO_RENDER_SITE || site.id === GRIDDO_RENDER_SITE)
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
+ )
31
43
  : allSites.filter((site) =>
32
- GRIDDO_RENDER_SITE ? site.id === GRIDDO_RENDER_SITE : !!site.shouldBeUpdated,
44
+ envs.GRIDDO_RENDER_SITE
45
+ ? site.id === envs.GRIDDO_RENDER_SITE
46
+ : !!site.shouldBeUpdated,
33
47
  );
34
48
 
35
49
  // If there are valid sites...
@@ -44,7 +58,8 @@ async function getSitesToRender(domain: string) {
44
58
  site.domains = items
45
59
  .filter(
46
60
  (item) =>
47
- item.domain && (item.domain.slug === domain || item.domain.slug === `/${domain}`),
61
+ item.domain &&
62
+ (item.domain.slug === domain || item.domain.slug === `/${domain}`),
48
63
  )
49
64
  .map((item) => ({ [item.id]: `${item.domain.slug}${item.path}` }));
50
65
  }
@@ -52,11 +67,15 @@ async function getSitesToRender(domain: string) {
52
67
 
53
68
  // Save sites object to publish
54
69
  const sitesToPublish = validSites.filter((site) =>
55
- GRIDDO_RENDER_SITE ? site.id === GRIDDO_RENDER_SITE : !!site.isPublished,
70
+ envs.GRIDDO_RENDER_SITE
71
+ ? site.id === envs.GRIDDO_RENDER_SITE
72
+ : !!site.isPublished,
56
73
  );
57
74
 
58
75
  // Save sites object to unpublish
59
- const sitesToUnpublish = validSites.filter((site) => !site.isPublished && site.shouldBeUpdated);
76
+ const sitesToUnpublish = validSites.filter(
77
+ (site) => !site.isPublished && site.shouldBeUpdated,
78
+ );
60
79
 
61
80
  return {
62
81
  sitesToPublish,
@@ -71,7 +90,7 @@ async function getSitesToRender(domain: string) {
71
90
  * @see https://griddoio.notion.site/Sites-d7bb0b7cb8d24894a5337e1139fc3d09#2019d3255bda4d219c7e19cf28d0c4fe
72
91
  */
73
92
  async function unpublishSites(sites: Array<Site>) {
74
- const { __root } = await getRenderPathsFromDB();
93
+ const { __cx } = config.paths();
75
94
 
76
95
  for (const site of sites) {
77
96
  // API
@@ -88,8 +107,7 @@ async function unpublishSites(sites: Array<Site>) {
88
107
 
89
108
  // STORE
90
109
  // Remove site directory from the Store
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()), {
110
+ fs.rmSync(path.join(__cx, "store", site.id.toString()), {
93
111
  force: true,
94
112
  recursive: true,
95
113
  });
@@ -112,8 +130,8 @@ async function getSiteData(siteID: number) {
112
130
 
113
131
  const { siteHash, unpublishHashes, publishIds } = buildData;
114
132
  const { headers, footers } = siteInfo;
115
- const validPagesIds = GRIDDO_RENDER_PAGES.length
116
- ? GRIDDO_RENDER_PAGES.filter((item) => publishIds.includes(item))
133
+ const validPagesIds = envs.GRIDDO_RENDER_PAGES.length
134
+ ? envs.GRIDDO_RENDER_PAGES.filter((item) => publishIds.includes(item))
117
135
  : publishIds;
118
136
 
119
137
  const siteData: SiteData = {
@@ -131,4 +149,164 @@ async function getSiteData(siteID: number) {
131
149
  return siteData;
132
150
  }
133
151
 
134
- export { getSiteData, getSitesToRender, unpublishSites };
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
+ };