@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,16 +1,50 @@
1
1
  import type { APIResponses } from "../types/api";
2
- import type { LifeCycleAction, LifeCyclesNames } from "../types/global";
3
-
4
- import fsp from "node:fs/promises";
2
+ import type {
3
+ CXConfig,
4
+ LifeCyclesNames,
5
+ LifeCycleSteps,
6
+ } from "../types/global";
7
+ import type { APIPageObject } from "../types/pages";
8
+
9
+ import fs from "node:fs";
5
10
  import path from "node:path";
6
11
 
7
- import { LifecycleExecutionError } from "../constants/errors";
8
- import { readDB } from "../services/db";
9
- import { brush } from "./brush";
10
- import { throwError } from "./errors";
11
- import { pathExists } from "./folders";
12
- import { infoLog, successLog } from "./loggin";
13
- import { getRenderPathsFromDB } from "./render";
12
+ import fsx from "fs-extra";
13
+ import kleur from "kleur";
14
+ import { bgRed, black } from "kleur/colors";
15
+ import pkgDir from "pkg-dir";
16
+
17
+ import { envs } from "../constants";
18
+ import { throwError } from "../errors";
19
+ import { prependFileSync } from "./folders";
20
+ import { boxLog, infoLog, successLog } from "./loggin";
21
+ import { generateBuildReport, generateSitemaps } from "./sites";
22
+ import { LifecycleExecutionError } from "../errors/errors-data";
23
+ import { RobotsService } from "../services/robots";
24
+
25
+ const config = getConfig();
26
+
27
+ const instanceRootDir = pkgDir.sync()!; // instance root dir
28
+
29
+ /**
30
+ * Returns the configuration file content.
31
+ *
32
+ * @example
33
+ * const config = getConfig()
34
+ * const { __cx } = config.paths()
35
+ * const { griddoVersion, proDomain } = config
36
+ */
37
+ function getConfig(): CXConfig {
38
+ try {
39
+ const configModule = require("../../cx.config.js");
40
+ const config = configModule.default;
41
+
42
+ return config;
43
+ } catch (error) {
44
+ console.log(error);
45
+ throw new Error("Error while reading configuration file");
46
+ }
47
+ }
14
48
 
15
49
  /**
16
50
  * Returns true for "true", "on", true and positive numbers.
@@ -56,25 +90,53 @@ function isTruthy(value: any): boolean {
56
90
  return false;
57
91
  }
58
92
 
93
+ /**
94
+ * Walk a directory and returns the file pathts.
95
+ *
96
+ * @param dir A directory path.
97
+ */
98
+ function walk(dir: string) {
99
+ const results: Array<string> = [];
100
+ const list = fs.readdirSync(dir);
101
+ for (const file of list) {
102
+ results.push(path.join(dir, file));
103
+ }
104
+
105
+ return results;
106
+ }
107
+
59
108
  /**
60
109
  * Walk a directory and returns the JSON file absolute paths with one level of depth.
110
+ * Bypass the `metadata` folder.
61
111
  * /abs/.../sotre/<siteId>/jsonfile.json
62
112
  * /abs/.../sotre/<siteId>/jsonfile.json
63
113
  * /abs/.../sotre/<siteId>/jsonfile.json
64
114
  * /abs/.../sotre/<siteId>/jsonfile.json
65
115
  */
66
- async function* walkStore(storeDir: string): AsyncGenerator<string> {
67
- const rootDirHandle = await fsp.opendir(storeDir);
68
- for await (const siteDirent of rootDirHandle) {
69
- if (siteDirent.isDirectory()) {
70
- const siteDirPath = path.join(storeDir, siteDirent.name);
71
- const siteDirHandle = await fsp.opendir(siteDirPath);
72
- for await (const jsonFileDirent of siteDirHandle) {
73
- const jsonFilePath = path.join(siteDirPath, jsonFileDirent.name);
74
- yield jsonFilePath;
75
- }
116
+ function walkStore(dir: string): Array<string> {
117
+ const results: Array<string> = [];
118
+
119
+ // Listamos todas las subcarpetas y evitamos entrar en 'metadata'
120
+ const subdirs = fs.readdirSync(dir).filter((file) => {
121
+ const fullPath = path.join(dir, file);
122
+ return fs.statSync(fullPath).isDirectory() && file !== "metadata";
123
+ });
124
+
125
+ // Iteramos sobre las subcarpetas
126
+ for (const subdir of subdirs) {
127
+ const subdirPath = path.join(dir, subdir);
128
+
129
+ // Listamos los archivos en cada subcarpeta y filtramos los .json
130
+ const files = fs
131
+ .readdirSync(subdirPath)
132
+ .filter((file) => file.endsWith(".json"));
133
+
134
+ for (const file of files) {
135
+ results.push(path.join(subdirPath, file));
76
136
  }
77
137
  }
138
+
139
+ return results;
78
140
  }
79
141
 
80
142
  /**
@@ -125,6 +187,70 @@ function removeProperties(obj: Record<string, unknown>, props: Array<string>) {
125
187
  }
126
188
  }
127
189
 
190
+ /**
191
+ * Remove unused files (old) inside the `apiCache` dir
192
+ *
193
+ * @todo remove other file types: sites, socials, etc..
194
+ */
195
+ function sanitizeAPICacheDir() {
196
+ const { __cx } = config.paths();
197
+ const dirPath = path.join(__cx, "apiCache");
198
+ const allCachedFiles = fs.readdirSync(dirPath);
199
+
200
+ // Object to store the the more rencent file names
201
+ // Record<string, string> = { "234856872634", "3268746238747238.json"};
202
+ const filesByIdMap: Record<string, string> = {};
203
+ // ^id ^path
204
+
205
+ // Page files.
206
+ // We only need files that describes a page object.
207
+ const pageFilePaths = allCachedFiles.filter((fileName) => {
208
+ const filePath = `${dirPath}/${fileName}`;
209
+ const fileObject = fsx.readJSONSync(filePath, "utf-8") as APIPageObject;
210
+ const { id, entity, fullUrl } = fileObject;
211
+
212
+ // Is a page file if has id, entity and fullUrl
213
+ return !!(id && entity && fullUrl);
214
+ });
215
+
216
+ // Fill the filesById object
217
+ for (const fileName of pageFilePaths) {
218
+ const filePath = `${dirPath}/${fileName}`;
219
+ const fileObject = fsx.readJSONSync(filePath, "utf-8") as APIPageObject;
220
+ const fileCreationDate = fs.statSync(filePath).mtimeMs;
221
+
222
+ const { id } = fileObject;
223
+
224
+ // Is a valid page if doesn't exists in the store object or is newer
225
+ // that the stored one.
226
+ const validPageFile =
227
+ !filesByIdMap[id] ||
228
+ fileCreationDate > fs.statSync(`${dirPath}/${filesByIdMap[id]}`).mtimeMs;
229
+
230
+ if (validPageFile) {
231
+ filesByIdMap[id] = fileName;
232
+ }
233
+ }
234
+
235
+ let counter = 0;
236
+
237
+ // Delete files using the store object filesById as reference map.
238
+ for (const fileName of pageFilePaths) {
239
+ const filePath = `${dirPath}/${fileName}`;
240
+ const fileObject = fsx.readJSONSync(filePath, "utf-8") as APIPageObject;
241
+
242
+ const { id } = fileObject;
243
+
244
+ // If the filename is not present in the map, remove it!
245
+ if (fileName !== filesByIdMap[id]) {
246
+ fs.unlinkSync(filePath);
247
+ counter++;
248
+ }
249
+ }
250
+
251
+ console.log(`Sanitize apiCache dir for ${counter} files`);
252
+ }
253
+
128
254
  /**
129
255
  * Measures the execution time of a series of sync or async functions.
130
256
  *
@@ -132,64 +258,84 @@ function removeProperties(obj: Record<string, unknown>, props: Array<string>) {
132
258
  * @param functions - Functions to be executed to measure their execution time.
133
259
  * @returns A promise that resolves with the total execution time in seconds.
134
260
  */
135
- async function executeAndReturnExecutionTime<T>(func: () => T | Promise<T>) {
136
- const start = process.hrtime.bigint();
137
- await Promise.resolve(func());
138
- const end = process.hrtime.bigint();
139
- return Number((Number(end - start) / 1e9).toFixed(3));
261
+ async function measureExecutionTime(
262
+ functions: Array<(...args: Array<unknown>) => unknown | Promise<unknown>>,
263
+ ) {
264
+ const start = process.hrtime();
265
+
266
+ for (const func of functions) {
267
+ await func();
268
+ }
269
+
270
+ const [seconds, miliseconds] = process.hrtime(start);
271
+ const timeInSeconds = seconds + miliseconds / 1e9;
272
+
273
+ return +timeInSeconds.toFixed(3);
140
274
  }
141
275
 
142
276
  /**
143
- * Executes a life cycle process, which involves executing a callback
144
- * function, printing to the console, and handling errors with optional retries.
277
+ * Pause the process until a key is pressed.
145
278
  *
146
- * @async
147
- * @param name - The name of the life cycle.
148
- * @param action - A callback function to execute.
149
- * @param options - Optional configuration for the life cycle process.
150
- * @param options.maxRetrys - The maximum number of retries for the life cycle.
151
- * @param options.enabled - Whether the life cycle process should be executed.
152
- * @returns - A promise that resolves when the life cycle process is completed.
279
+ * @param title
280
+ * @returns
153
281
  */
154
- async function doLifeCycle(
155
- name: string,
156
- action: LifeCycleAction,
157
- options?: {
158
- maxRetrys?: number;
159
- spinner?: boolean;
160
- skip?: undefined | false | string;
161
- },
162
- ) {
163
- const { maxRetrys = 3, skip } = options || {};
282
+ function pause(title: string) {
283
+ const isPauseEnabled = !!envs.GRIDDO_RENDER_BREAKPOINTS_FEATURE;
164
284
 
165
- if (skip) {
166
- console.log(`Skiping life-cycle. Reason: ${skip}`);
285
+ if (!isPauseEnabled) {
167
286
  return;
168
287
  }
169
288
 
289
+ return new Promise<void>((resolve) => {
290
+ console.log("\n");
291
+ boxLog(`⌛️ ${title}`, "", 1, 0);
292
+ process.stdin.once("data", () => {
293
+ resolve();
294
+ });
295
+ });
296
+ }
297
+
298
+ /**
299
+ * Executes a life cycle process, which involves executing an array of
300
+ * functions, printing to the console, and handling errors with optional
301
+ * retries.
302
+ *
303
+ * @async
304
+ * @param name - The name of the life cycle.
305
+ * @param options - The arguments object.
306
+ * @param options.steps - An array of functions to execute.
307
+ * @returns - A promise that resolves when the life cycle process is completed.
308
+ */
309
+ async function doLifeCycle(name: LifeCyclesNames, steps: LifeCycleSteps) {
310
+ const attemptsByLifeCycleName: Record<LifeCyclesNames, number> = {
311
+ Init: envs.GRIDDO_ARCHIVE_LIFECYCLE_MAX_ATTEMPTS,
312
+ Archive: envs.GRIDDO_ARCHIVE_LIFECYCLE_MAX_ATTEMPTS,
313
+ Data: envs.GRIDDO_DATA_LIFECYCLE_MAX_ATTEMPTS,
314
+ Meta: envs.GRIDDO_META_LIFECYCLE_MAX_ATTEMPTS,
315
+ Relocation: envs.GRIDDO_RELOCATION_LIFECYCLE_MAX_ATTEMPTS,
316
+ Clean: envs.GRIDDO_CLEAN_LIFECYCLE_MAX_ATTEMPTS,
317
+ Restore: envs.GRIDDO_RESTORE_LIFECYCLE_MAX_ATTEMPTS,
318
+ Prepare: envs.GRIDDO_PREPARE_LIFECYCLE_MAX_ATTEMPTS,
319
+ Close: envs.GRIDDO_CLOSE_LIFECYCLE_MAX_ATTEMPTS,
320
+ SSG: envs.GRIDDO_SSG_LIFECYCLE_MAX_ATTEMPTS,
321
+ HealthCheck: 1,
322
+ __DEBUG__: 1,
323
+ };
324
+
170
325
  let trysCount = 0;
326
+ const maxTrysAccepted = attemptsByLifeCycleName[name] || 1;
171
327
 
172
- while (trysCount < maxRetrys) {
328
+ while (trysCount < maxTrysAccepted) {
173
329
  try {
174
330
  infoLog(`start ${name} life-cycle`);
175
-
176
- // let counter = 0;
177
- // process.stdout.write("\x1B[?25l");
178
- // const spinnerChars = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
179
- // const interval = setInterval(() => {
180
- // const spinner = spinnerChars[counter % spinnerChars.length];
181
- // process.stdout.write(`\r${spinner} ${name} life-cycle...`);
182
- // counter++;
183
- // }, 60);
184
-
185
- const exeTime = await executeAndReturnExecutionTime(action);
186
- // clearInterval(interval);
187
- // process.stdout.write("\x1B[?25h");
331
+ const exeTime = await measureExecutionTime(steps);
188
332
  successLog(`${name} - ${exeTime}s\n`);
333
+ // if no errors, print and go out
334
+ await pause(`${name} LifeCycle`);
189
335
  break;
190
336
  } catch (error) {
191
- const errorString = brush.red(` Error in ${name} LifeCycle `);
192
- const attemptsString = brush.yellow(`Attempt (${trysCount + 1})`);
337
+ const errorString = bgRed(black(` Error in ${name} LifeCycle `));
338
+ const attemptsString = kleur.yellow(`Attempt (${trysCount + 1})`);
193
339
  console.log(`\n${errorString} ${attemptsString}\n`);
194
340
  console.log(error);
195
341
  console.log();
@@ -198,23 +344,38 @@ async function doLifeCycle(
198
344
  }
199
345
  }
200
346
 
201
- if (trysCount === maxRetrys) {
202
- throwError(LifecycleExecutionError(maxRetrys, name));
347
+ if (trysCount === maxTrysAccepted) {
348
+ throwError(LifecycleExecutionError(maxTrysAccepted, name));
203
349
  }
204
350
  }
205
351
 
206
- async function removeAllSiteDirsFromStore() {
207
- const { __root } = await getRenderPathsFromDB();
208
- const storeDir = path.join(__root, "store");
209
- const allDirs = await fsp.readdir(storeDir);
352
+ /**
353
+ * Creates additional files after the render: sitemaps, robots and a report of
354
+ * the finished render.
355
+ *
356
+ * @async
357
+ * @param domain
358
+ */
359
+ async function createDomainMetadata(domain: string) {
360
+ await generateBuildReport();
361
+ await generateSitemaps();
362
+ await RobotsService.writeFiles(domain);
363
+ }
364
+
365
+ function removeAllSiteDirsFromStore() {
366
+ const { __cx } = config.paths();
367
+ const storeDir = path.join(__cx, "store");
368
+ const allDirs = fs.readdirSync(storeDir);
210
369
 
211
370
  const allSiteDirs = allDirs.filter((dirname) => dirname !== "metadata");
212
371
 
213
- const allSiteDirsFullPath = allSiteDirs.map((name) => path.join(storeDir, name));
372
+ const allSiteDirsFullPath = allSiteDirs.map((name) =>
373
+ path.join(storeDir, name),
374
+ );
214
375
 
215
376
  // Remove all site directories except "metadata" directory.
216
377
  for (const site of allSiteDirsFullPath) {
217
- await fsp.rm(site, { recursive: true, force: true });
378
+ fs.rmSync(site, { recursive: true, force: true });
218
379
  }
219
380
  }
220
381
 
@@ -235,85 +396,63 @@ function getFormattedDateTime() {
235
396
  return `${date}_${time}`;
236
397
  }
237
398
 
238
- async function saveDetailRenderLog(domain: string) {
239
- const data = await readDB();
240
-
241
- const dateString = getFormattedDateTime();
242
- const debugDir = path.join(data.paths.exportsDir, domain, "logs");
243
-
244
- if (!(await pathExists(debugDir))) {
245
- await fsp.mkdir(debugDir);
246
- }
247
-
248
- const src = path.join(data.paths.root, "render-detail-log.txt");
249
- const dst = path.join(debugDir, `${dateString}-render-detail-log.txt`);
250
-
251
- // Move log to exports
252
- await fsp.cp(src, dst);
253
- }
254
-
255
- const lifeCycleNames: Record<LifeCyclesNames, LifeCyclesNames> = {
256
- Sync: "Sync",
257
- Clean: "Clean",
258
- Close: "Close",
259
- Data: "Data",
260
- HealthCheck: "HealthCheck",
261
- Init: "Init",
262
- Meta: "Meta",
263
- Prepare: "Prepare",
264
- Relocation: "Relocation",
265
- Restore: "Restore",
266
- SSG: "SSG",
267
- } as const;
268
-
269
399
  /**
270
- * Busca de forma recursiva si ALGUNA de las claves de un array existe como propiedad propia
271
- * en un objeto anidado. La búsqueda se detiene en cuanto se encuentra la primera coincidencia.
400
+ * Save render information to a file to use as debug log.
272
401
  *
273
- * @param obj El objeto a inspeccionar.
274
- * @param keysToFind Un array de claves que se buscan.
275
- * @param visited Un WeakSet para evitar ciclos de referencia.
276
- * @returns Retorna `true` si al menos una de las claves se encuentra, de lo contrario `false`.
402
+ * This information will **not** be sent to any API.
277
403
  */
278
- function hasAnyKeyDeep<T extends object>(
279
- obj: T,
280
- keysToFind: string[],
281
- visited = new WeakSet<object>(),
282
- ): boolean {
283
- // 1. Casos base: no procesar no-objetos, si ya lo visitamos, o si el array de claves está vacío.
284
- if (typeof obj !== "object" || obj === null || visited.has(obj)) {
285
- return false;
286
- }
287
- if (keysToFind.length === 0) {
288
- return false;
289
- }
290
- visited.add(obj);
404
+ function saveBuildEndLogs() {
405
+ const { __cx } = config.paths();
406
+ const { sitesToPublish, createdPages, buildProcessData } = fsx.readJSONSync(
407
+ path.join(__cx, "render-metadata.json"),
408
+ );
291
409
 
292
- // 2. Comprobar si ALGUNA de las claves buscadas es una propiedad propia del objeto actual.
293
- // Usamos .some() porque se detiene en la primera coincidencia (eficiencia).
294
- const foundKey = keysToFind.some((key) => Object.hasOwn(obj, key));
295
- if (foundKey) {
296
- return true;
410
+ const dateString = getFormattedDateTime();
411
+ const buildEndLogsDir = path.join(__cx, "debug", "build-end");
412
+
413
+ if (!fs.existsSync(buildEndLogsDir)) {
414
+ fs.mkdirSync(buildEndLogsDir, { recursive: true });
297
415
  }
298
416
 
299
- // 3. Si no se encontró ninguna clave en este nivel, recorrer los valores y buscar recursivamente.
300
- return Object.values(obj).some(
301
- (value) => typeof value === "object" && hasAnyKeyDeep(value, keysToFind, visited),
417
+ // Log
418
+ fs.writeFileSync(
419
+ path.join(buildEndLogsDir, `${dateString}.json`),
420
+ JSON.stringify(
421
+ {
422
+ date: new Date().toLocaleString(),
423
+ log: {
424
+ sitesToPublish,
425
+ createdPages,
426
+ buildProcessData,
427
+ },
428
+ },
429
+ null,
430
+ 2,
431
+ ),
432
+ );
433
+
434
+ // Update index
435
+ prependFileSync(
436
+ path.join(buildEndLogsDir, "index.html"),
437
+ `<pre><a href="${dateString}.json">${dateString}</a></pre>\n`,
302
438
  );
303
439
  }
304
440
 
305
441
  export {
442
+ createDomainMetadata,
306
443
  delay,
307
444
  doLifeCycle,
308
- executeAndReturnExecutionTime,
309
- getFormattedDateTime,
445
+ getConfig,
310
446
  getSafeSiteId,
311
- hasAnyKeyDeep,
447
+ instanceRootDir,
312
448
  isTruthy,
313
- lifeCycleNames,
449
+ measureExecutionTime,
314
450
  msToSec,
451
+ pause,
315
452
  removeAllSiteDirsFromStore,
316
453
  removeProperties,
317
- saveDetailRenderLog,
454
+ sanitizeAPICacheDir,
455
+ saveBuildEndLogs,
456
+ walk,
318
457
  walkStore,
319
458
  };
@@ -0,0 +1,17 @@
1
+ import { createAPICacheDir } from "./cache";
2
+ import { sanitizeAPICacheDir } from "./core-utils";
3
+ import { createStore } from "../services/store";
4
+
5
+ /**
6
+ * Download all data: sites, pages etc.. from the instance private Griddo API.
7
+ * Then you can use the generator funcion `getBuildPagesFromStore()` to get the pages and
8
+ * `getBuildMetadata()` to get build and sites metadata as objects. Both from
9
+ * exporter utils sites dir.
10
+ */
11
+ async function createDomainRenderData(domain: string) {
12
+ createAPICacheDir();
13
+ await createStore(domain);
14
+ sanitizeAPICacheDir();
15
+ }
16
+
17
+ export { createDomainRenderData };
@@ -1,20 +1,17 @@
1
1
  import type { Domains } from "../types/global";
2
2
 
3
- import { DOMAINS } from "../constants/endpoints";
4
- import { NoDomainsFoundError } from "../constants/errors";
5
- import { get } from "./api";
6
- import { throwError } from "./errors";
7
3
  import { verboseLog } from "./loggin";
4
+ import { throwError } from "../errors";
5
+ import { NoDomainsFoundError } from "../errors/errors-data";
6
+ import { AuthService } from "../services/auth";
7
+ import { getAllDomains } from "../services/domains";
8
8
 
9
9
  /**
10
10
  * Return an array of domains name (string) of the current instance.
11
11
  */
12
12
  async function getInstanceDomains() {
13
- // await AuthService.login();
14
- const domains = await get<Domains>({
15
- endpoint: DOMAINS,
16
- useApiCacheDir: false,
17
- });
13
+ await AuthService.login();
14
+ const domains = await getAllDomains();
18
15
 
19
16
  if (!domains.length) {
20
17
  throwError(NoDomainsFoundError);
@@ -39,4 +36,4 @@ function getDomainSlugs(domains: Domains) {
39
36
  return [...new Set(filteredDomains)];
40
37
  }
41
38
 
42
- export { getDomainSlugs, getInstanceDomains };
39
+ export { getInstanceDomains, getDomainSlugs };