@griddo/cx 11.7.6-rc.1 → 11.7.6

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 (300) hide show
  1. package/README.md +228 -25
  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/move-assets.d.ts +1 -0
  6. package/build/commands/prepare-domains-render.d.ts +1 -0
  7. package/build/{exporter/constants → constants}/envs.d.ts +7 -1
  8. package/build/constants/index.d.ts +57 -0
  9. package/build/end-render.js +74 -0
  10. package/build/end-render.js.map +7 -0
  11. package/build/{exporter/constants/errors.d.ts → errors/errors-data.d.ts} +3 -5
  12. package/build/{exporter/utils/errors.d.ts → errors/index.d.ts} +3 -3
  13. package/build/index.d.ts +29 -0
  14. package/build/index.js +73 -0
  15. package/build/index.js.map +7 -0
  16. package/build/prepare-domains-render.js +73 -0
  17. package/build/prepare-domains-render.js.map +7 -0
  18. package/build/react/Favicon/index.d.ts +5 -0
  19. package/build/react/Favicon/utils.d.ts +9 -0
  20. package/build/react/GriddoIntegrations/index.d.ts +20 -0
  21. package/build/react/GriddoIntegrations/utils.d.ts +26 -0
  22. package/{react/index.tsx → build/react/index.d.ts} +0 -1
  23. package/build/react/index.js +3 -0
  24. package/build/registers/api.d.ts +9 -0
  25. package/build/registers/gatsby.d.ts +9 -0
  26. package/build/registers/index.d.ts +3 -0
  27. package/build/reset-render.js +74 -0
  28. package/build/reset-render.js.map +7 -0
  29. package/build/{exporter/services → services}/auth.d.ts +1 -1
  30. package/build/services/domains.d.ts +6 -0
  31. package/build/services/register.d.ts +36 -0
  32. package/build/{exporter/services → services}/robots.d.ts +6 -0
  33. package/build/services/settings.d.ts +4 -0
  34. package/build/{exporter/services → services}/sites.d.ts +2 -5
  35. package/build/services/store.d.ts +6 -0
  36. package/build/start-render.js +100 -0
  37. package/build/start-render.js.map +7 -0
  38. package/build/{exporter/types → types}/api.d.ts +4 -3
  39. package/build/{exporter/types → types}/global.d.ts +6 -6
  40. package/build/{exporter/types → types}/navigation.d.ts +1 -1
  41. package/build/{exporter/types → types}/sites.d.ts +2 -1
  42. package/build/upload-search-content.js +74 -0
  43. package/build/upload-search-content.js.map +7 -0
  44. package/build/utils/alerts.d.ts +3 -0
  45. package/build/{exporter/utils → utils}/cache.d.ts +12 -7
  46. package/build/utils/core-utils.d.ts +107 -0
  47. package/build/utils/create-build-data.d.ts +8 -0
  48. package/build/{exporter/utils → utils}/domains.d.ts +1 -1
  49. package/build/utils/folders.d.ts +53 -0
  50. package/build/{exporter/utils/check-health.d.ts → utils/health-checks.d.ts} +2 -2
  51. package/build/{exporter/utils → utils}/loggin.d.ts +16 -2
  52. package/build/{exporter/utils → utils}/pages.d.ts +2 -2
  53. package/build/utils/render.d.ts +13 -0
  54. package/build/utils/searches.d.ts +15 -0
  55. package/build/{exporter/utils → utils}/sites.d.ts +3 -3
  56. package/build/{exporter/utils → utils}/store.d.ts +38 -10
  57. package/cx.config.d.ts +5 -0
  58. package/cx.config.js +36 -0
  59. package/exporter/adapters/gatsby/index.ts +146 -60
  60. package/exporter/adapters/gatsby/utils.ts +161 -0
  61. package/exporter/artifacts/README.md +34 -0
  62. package/exporter/{utils/artifacts.ts → artifacts/index.ts} +8 -9
  63. package/exporter/build.sh +38 -5
  64. package/exporter/commands/end-render.ts +81 -56
  65. package/exporter/commands/move-assets.ts +11 -0
  66. package/exporter/commands/prepare-domains-render.ts +31 -149
  67. package/exporter/commands/reset-render.ts +3 -12
  68. package/exporter/commands/start-render.ts +47 -18
  69. package/exporter/commands/upload-search-content.ts +21 -206
  70. package/exporter/constants/envs.ts +51 -59
  71. package/exporter/constants/index.ts +129 -0
  72. package/exporter/{constants/errors.ts → errors/errors-data.ts} +15 -24
  73. package/exporter/{utils/errors.ts → errors/index.ts} +9 -10
  74. package/exporter/index.ts +82 -0
  75. package/{react → exporter/react}/Favicon/index.tsx +7 -1
  76. package/{react → exporter/react}/GriddoIntegrations/index.tsx +14 -6
  77. package/{react → exporter/react}/GriddoIntegrations/utils.ts +9 -4
  78. package/exporter/react/index.tsx +11 -0
  79. package/exporter/registers/api.ts +14 -0
  80. package/exporter/registers/gatsby.ts +14 -0
  81. package/exporter/registers/index.ts +4 -0
  82. package/exporter/services/auth.ts +6 -7
  83. package/exporter/services/domains.ts +16 -0
  84. package/exporter/services/navigation.ts +10 -4
  85. package/exporter/services/reference-fields.ts +23 -8
  86. package/exporter/services/register.ts +113 -0
  87. package/exporter/services/robots.ts +15 -8
  88. package/exporter/services/settings.ts +17 -0
  89. package/exporter/services/sites.ts +24 -35
  90. package/exporter/services/store.ts +76 -118
  91. package/exporter/types/api.ts +27 -24
  92. package/exporter/types/global.ts +10 -8
  93. package/exporter/types/navigation.ts +1 -1
  94. package/exporter/types/pages.ts +3 -2
  95. package/exporter/types/sites.ts +2 -1
  96. package/exporter/utils/alerts.ts +29 -0
  97. package/exporter/utils/api.ts +82 -46
  98. package/exporter/utils/cache.ts +59 -34
  99. package/exporter/utils/core-utils.ts +247 -86
  100. package/exporter/utils/create-build-data.ts +17 -0
  101. package/exporter/utils/domains.ts +7 -10
  102. package/exporter/utils/folders.ts +92 -161
  103. package/exporter/utils/health-checks.ts +64 -0
  104. package/exporter/utils/images.ts +6 -1
  105. package/exporter/utils/instance.ts +12 -9
  106. package/exporter/utils/loggin.ts +89 -24
  107. package/exporter/utils/pages.ts +88 -23
  108. package/exporter/utils/render.ts +48 -147
  109. package/exporter/utils/searches.ts +156 -0
  110. package/exporter/utils/sites.ts +77 -67
  111. package/exporter/utils/store.ts +178 -85
  112. package/gatsby-browser.tsx +58 -41
  113. package/gatsby-config.ts +12 -6
  114. package/gatsby-node.ts +77 -15
  115. package/gatsby-ssr.tsx +1 -2
  116. package/package.json +74 -33
  117. package/src/README.md +7 -0
  118. package/src/components/Head.tsx +46 -13
  119. package/src/components/template.tsx +30 -8
  120. package/src/gatsby-node-utils.ts +2 -91
  121. package/src/html.tsx +11 -2
  122. package/src/types.ts +5 -5
  123. package/start-render.js +3 -1
  124. package/tsconfig.json +2 -3
  125. package/build/adapters/gatsby/actions/clean.js +0 -10
  126. package/build/adapters/gatsby/actions/clean.js.map +0 -1
  127. package/build/adapters/gatsby/actions/close.js +0 -12
  128. package/build/adapters/gatsby/actions/close.js.map +0 -1
  129. package/build/adapters/gatsby/actions/data.js +0 -18
  130. package/build/adapters/gatsby/actions/data.js.map +0 -1
  131. package/build/adapters/gatsby/actions/healthCheck.js +0 -10
  132. package/build/adapters/gatsby/actions/healthCheck.js.map +0 -1
  133. package/build/adapters/gatsby/actions/init.js +0 -9
  134. package/build/adapters/gatsby/actions/init.js.map +0 -1
  135. package/build/adapters/gatsby/actions/meta.js +0 -14
  136. package/build/adapters/gatsby/actions/meta.js.map +0 -1
  137. package/build/adapters/gatsby/actions/prepare.js +0 -9
  138. package/build/adapters/gatsby/actions/prepare.js.map +0 -1
  139. package/build/adapters/gatsby/actions/relocation.js +0 -15
  140. package/build/adapters/gatsby/actions/relocation.js.map +0 -1
  141. package/build/adapters/gatsby/actions/restore.js +0 -26
  142. package/build/adapters/gatsby/actions/restore.js.map +0 -1
  143. package/build/adapters/gatsby/actions/ssg.js +0 -9
  144. package/build/adapters/gatsby/actions/ssg.js.map +0 -1
  145. package/build/adapters/gatsby/actions/sync.js +0 -50
  146. package/build/adapters/gatsby/actions/sync.js.map +0 -1
  147. package/build/adapters/gatsby/index.js +0 -74
  148. package/build/adapters/gatsby/index.js.map +0 -1
  149. package/build/adapters/gatsby/shared/context.js +0 -25
  150. package/build/adapters/gatsby/shared/context.js.map +0 -1
  151. package/build/adapters/gatsby/shared/extract-assets.js +0 -58
  152. package/build/adapters/gatsby/shared/extract-assets.js.map +0 -1
  153. package/build/adapters/gatsby/shared/gatsby-build.js +0 -49
  154. package/build/adapters/gatsby/shared/gatsby-build.js.map +0 -1
  155. package/build/adapters/gatsby/shared/sync-render.js +0 -208
  156. package/build/adapters/gatsby/shared/sync-render.js.map +0 -1
  157. package/build/adapters/gatsby/shared/types.js +0 -3
  158. package/build/adapters/gatsby/shared/types.js.map +0 -1
  159. package/build/commands/end-render.js +0 -63
  160. package/build/commands/end-render.js.map +0 -1
  161. package/build/commands/prepare-assets-directory.js +0 -32
  162. package/build/commands/prepare-assets-directory.js.map +0 -1
  163. package/build/commands/prepare-domains-render.js +0 -138
  164. package/build/commands/prepare-domains-render.js.map +0 -1
  165. package/build/commands/reset-render.js +0 -22
  166. package/build/commands/reset-render.js.map +0 -1
  167. package/build/commands/start-render.js +0 -35
  168. package/build/commands/start-render.js.map +0 -1
  169. package/build/commands/upload-search-content.js +0 -189
  170. package/build/commands/upload-search-content.js.map +0 -1
  171. package/build/constants/endpoints.js +0 -42
  172. package/build/constants/endpoints.js.map +0 -1
  173. package/build/constants/envs.js +0 -73
  174. package/build/constants/envs.js.map +0 -1
  175. package/build/constants/errors.js +0 -89
  176. package/build/constants/errors.js.map +0 -1
  177. package/build/exporter/adapters/gatsby/actions/clean.d.ts +0 -3
  178. package/build/exporter/adapters/gatsby/actions/close.d.ts +0 -3
  179. package/build/exporter/adapters/gatsby/actions/data.d.ts +0 -2
  180. package/build/exporter/adapters/gatsby/actions/healthCheck.d.ts +0 -2
  181. package/build/exporter/adapters/gatsby/actions/init.d.ts +0 -2
  182. package/build/exporter/adapters/gatsby/actions/meta.d.ts +0 -2
  183. package/build/exporter/adapters/gatsby/actions/prepare.d.ts +0 -2
  184. package/build/exporter/adapters/gatsby/actions/relocation.d.ts +0 -2
  185. package/build/exporter/adapters/gatsby/actions/restore.d.ts +0 -3
  186. package/build/exporter/adapters/gatsby/actions/ssg.d.ts +0 -3
  187. package/build/exporter/adapters/gatsby/actions/sync.d.ts +0 -3
  188. package/build/exporter/adapters/gatsby/index.d.ts +0 -9
  189. package/build/exporter/adapters/gatsby/shared/context.d.ts +0 -38
  190. package/build/exporter/adapters/gatsby/shared/extract-assets.d.ts +0 -7
  191. package/build/exporter/adapters/gatsby/shared/gatsby-build.d.ts +0 -7
  192. package/build/exporter/adapters/gatsby/shared/sync-render.d.ts +0 -36
  193. package/build/exporter/adapters/gatsby/shared/types.d.ts +0 -34
  194. package/build/exporter/commands/prepare-assets-directory.d.ts +0 -2
  195. package/build/exporter/commands/prepare-domains-render.d.ts +0 -2
  196. package/build/exporter/services/db.d.ts +0 -4
  197. package/build/exporter/services/store.d.ts +0 -15
  198. package/build/exporter/types/render.d.ts +0 -50
  199. package/build/exporter/utils/artifacts.d.ts +0 -6
  200. package/build/exporter/utils/brush.d.ts +0 -18
  201. package/build/exporter/utils/core-utils.d.ts +0 -77
  202. package/build/exporter/utils/folders.d.ts +0 -66
  203. package/build/exporter/utils/render.d.ts +0 -49
  204. package/build/services/auth.js +0 -39
  205. package/build/services/auth.js.map +0 -1
  206. package/build/services/db.js +0 -34
  207. package/build/services/db.js.map +0 -1
  208. package/build/services/navigation.js +0 -93
  209. package/build/services/navigation.js.map +0 -1
  210. package/build/services/reference-fields.js +0 -131
  211. package/build/services/reference-fields.js.map +0 -1
  212. package/build/services/robots.js +0 -58
  213. package/build/services/robots.js.map +0 -1
  214. package/build/services/sites.js +0 -109
  215. package/build/services/sites.js.map +0 -1
  216. package/build/services/store.js +0 -282
  217. package/build/services/store.js.map +0 -1
  218. package/build/types/api.js +0 -3
  219. package/build/types/api.js.map +0 -1
  220. package/build/types/global.js +0 -3
  221. package/build/types/global.js.map +0 -1
  222. package/build/types/navigation.js +0 -3
  223. package/build/types/navigation.js.map +0 -1
  224. package/build/types/pages.js +0 -3
  225. package/build/types/pages.js.map +0 -1
  226. package/build/types/render.js +0 -10
  227. package/build/types/render.js.map +0 -1
  228. package/build/types/sites.js +0 -3
  229. package/build/types/sites.js.map +0 -1
  230. package/build/types/templates.js +0 -3
  231. package/build/types/templates.js.map +0 -1
  232. package/build/utils/api.js +0 -161
  233. package/build/utils/api.js.map +0 -1
  234. package/build/utils/artifacts.js +0 -34
  235. package/build/utils/artifacts.js.map +0 -1
  236. package/build/utils/brush.js +0 -30
  237. package/build/utils/brush.js.map +0 -1
  238. package/build/utils/cache.js +0 -106
  239. package/build/utils/cache.js.map +0 -1
  240. package/build/utils/check-health.js +0 -68
  241. package/build/utils/check-health.js.map +0 -1
  242. package/build/utils/core-utils.js +0 -251
  243. package/build/utils/core-utils.js.map +0 -1
  244. package/build/utils/domains.js +0 -37
  245. package/build/utils/domains.js.map +0 -1
  246. package/build/utils/errors.js +0 -30
  247. package/build/utils/errors.js.map +0 -1
  248. package/build/utils/folders.js +0 -339
  249. package/build/utils/folders.js.map +0 -1
  250. package/build/utils/images.js +0 -45
  251. package/build/utils/images.js.map +0 -1
  252. package/build/utils/instance.js +0 -66
  253. package/build/utils/instance.js.map +0 -1
  254. package/build/utils/loggin.js +0 -102
  255. package/build/utils/loggin.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 -144
  259. package/build/utils/render.js.map +0 -1
  260. package/build/utils/sites.js +0 -239
  261. package/build/utils/sites.js.map +0 -1
  262. package/build/utils/store.js +0 -193
  263. package/build/utils/store.js.map +0 -1
  264. package/exporter/adapters/gatsby/actions/clean.ts +0 -14
  265. package/exporter/adapters/gatsby/actions/close.ts +0 -17
  266. package/exporter/adapters/gatsby/actions/data.ts +0 -25
  267. package/exporter/adapters/gatsby/actions/healthCheck.ts +0 -10
  268. package/exporter/adapters/gatsby/actions/init.ts +0 -12
  269. package/exporter/adapters/gatsby/actions/meta.ts +0 -18
  270. package/exporter/adapters/gatsby/actions/prepare.ts +0 -9
  271. package/exporter/adapters/gatsby/actions/relocation.ts +0 -15
  272. package/exporter/adapters/gatsby/actions/restore.ts +0 -36
  273. package/exporter/adapters/gatsby/actions/ssg.ts +0 -12
  274. package/exporter/adapters/gatsby/actions/sync.ts +0 -70
  275. package/exporter/adapters/gatsby/shared/context.ts +0 -50
  276. package/exporter/adapters/gatsby/shared/extract-assets.ts +0 -61
  277. package/exporter/adapters/gatsby/shared/gatsby-build.ts +0 -54
  278. package/exporter/adapters/gatsby/shared/sync-render.ts +0 -294
  279. package/exporter/adapters/gatsby/shared/types.ts +0 -35
  280. package/exporter/build-esbuild.noop +0 -42
  281. package/exporter/commands/prepare-assets-directory.ts +0 -33
  282. package/exporter/services/db.ts +0 -32
  283. package/exporter/types/render.ts +0 -59
  284. package/exporter/utils/brush.ts +0 -34
  285. package/exporter/utils/check-health.ts +0 -79
  286. package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +0 -55
  287. package/plugins/gatsby-plugin-svgr-loader/package.json +0 -8
  288. package/build/{exporter/commands → commands}/end-render.d.ts +0 -0
  289. package/build/{exporter/commands → commands}/reset-render.d.ts +0 -0
  290. package/build/{exporter/commands → commands}/start-render.d.ts +0 -0
  291. package/build/{exporter/commands → commands}/upload-search-content.d.ts +0 -0
  292. package/build/{exporter/constants → constants}/endpoints.d.ts +0 -0
  293. package/build/{exporter/services → services}/navigation.d.ts +0 -0
  294. package/build/{exporter/services → services}/reference-fields.d.ts +0 -0
  295. package/build/{exporter/types → types}/pages.d.ts +1 -1
  296. /package/build/{exporter/types → types}/templates.d.ts +0 -0
  297. /package/build/{exporter/utils → utils}/api.d.ts +0 -0
  298. /package/build/{exporter/utils → utils}/images.d.ts +0 -0
  299. /package/build/{exporter/utils → utils}/instance.d.ts +0 -0
  300. /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, prependFileSync } 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,55 +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);
274
+ }
275
+
276
+ /**
277
+ * Pause the process until a key is pressed.
278
+ *
279
+ * @param title
280
+ * @returns
281
+ */
282
+ function pause(title: string) {
283
+ const isPauseEnabled = !!envs.GRIDDO_RENDER_BREAKPOINTS_FEATURE;
284
+
285
+ if (!isPauseEnabled) {
286
+ return;
287
+ }
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
+ });
140
296
  }
141
297
 
142
298
  /**
143
- * Executes a life cycle process, which involves executing a callback
144
- * function, printing to the console, and handling errors with optional retries.
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.
145
302
  *
146
303
  * @async
147
304
  * @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.
305
+ * @param options - The arguments object.
306
+ * @param options.steps - An array of functions to execute.
152
307
  * @returns - A promise that resolves when the life cycle process is completed.
153
308
  */
154
- async function doLifeCycle(
155
- name: string,
156
- action: LifeCycleAction,
157
- options?: { maxRetrys?: number; spinner?: boolean },
158
- ) {
159
- const { maxRetrys = 3 } = options || {};
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
+ };
160
324
 
161
325
  let trysCount = 0;
326
+ const maxTrysAccepted = attemptsByLifeCycleName[name] || 1;
162
327
 
163
- while (trysCount < maxRetrys) {
328
+ while (trysCount < maxTrysAccepted) {
164
329
  try {
165
330
  infoLog(`start ${name} life-cycle`);
166
-
167
- // let counter = 0;
168
- // process.stdout.write("\x1B[?25l");
169
- // const spinnerChars = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
170
- // const interval = setInterval(() => {
171
- // const spinner = spinnerChars[counter % spinnerChars.length];
172
- // process.stdout.write(`\r${spinner} ${name} life-cycle...`);
173
- // counter++;
174
- // }, 60);
175
-
176
- const exeTime = await executeAndReturnExecutionTime(action);
177
- // clearInterval(interval);
178
- // process.stdout.write("\x1B[?25h");
331
+ const exeTime = await measureExecutionTime(steps);
179
332
  successLog(`${name} - ${exeTime}s\n`);
333
+ // if no errors, print and go out
334
+ await pause(`${name} LifeCycle`);
180
335
  break;
181
336
  } catch (error) {
182
- const errorString = brush.red(` Error in ${name} LifeCycle `);
183
- const attemptsString = brush.yellow(`Attempt (${trysCount + 1})`);
337
+ const errorString = bgRed(black(` Error in ${name} LifeCycle `));
338
+ const attemptsString = kleur.yellow(`Attempt (${trysCount + 1})`);
184
339
  console.log(`\n${errorString} ${attemptsString}\n`);
185
340
  console.log(error);
186
341
  console.log();
@@ -189,23 +344,38 @@ async function doLifeCycle(
189
344
  }
190
345
  }
191
346
 
192
- if (trysCount === maxRetrys) {
193
- throwError(LifecycleExecutionError(maxRetrys, name));
347
+ if (trysCount === maxTrysAccepted) {
348
+ throwError(LifecycleExecutionError(maxTrysAccepted, name));
194
349
  }
195
350
  }
196
351
 
197
- async function removeAllSiteDirsFromStore() {
198
- const { __cx } = await getRenderPathsFromDB();
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();
199
367
  const storeDir = path.join(__cx, "store");
200
- const allDirs = await fsp.readdir(storeDir);
368
+ const allDirs = fs.readdirSync(storeDir);
201
369
 
202
370
  const allSiteDirs = allDirs.filter((dirname) => dirname !== "metadata");
203
371
 
204
- const allSiteDirsFullPath = allSiteDirs.map((name) => path.join(storeDir, name));
372
+ const allSiteDirsFullPath = allSiteDirs.map((name) =>
373
+ path.join(storeDir, name),
374
+ );
205
375
 
206
376
  // Remove all site directories except "metadata" directory.
207
377
  for (const site of allSiteDirsFullPath) {
208
- await fsp.rm(site, { recursive: true, force: true });
378
+ fs.rmSync(site, { recursive: true, force: true });
209
379
  }
210
380
  }
211
381
 
@@ -231,21 +401,21 @@ function getFormattedDateTime() {
231
401
  *
232
402
  * This information will **not** be sent to any API.
233
403
  */
234
- async function saveBuildEndLogs(options: { basePath: string; domain: string }) {
235
- const { basePath, domain } = options;
236
-
237
- const db = await readDB();
238
- const { sitesToPublish, createdPages, buildProcessData } = db.domains[domain].renderInfo || {};
404
+ function saveBuildEndLogs() {
405
+ const { __cx } = config.paths();
406
+ const { sitesToPublish, createdPages, buildProcessData } = fsx.readJSONSync(
407
+ path.join(__cx, "render-metadata.json"),
408
+ );
239
409
 
240
410
  const dateString = getFormattedDateTime();
241
- const buildEndLogsDir = path.join(basePath, "debug", "build-end");
411
+ const buildEndLogsDir = path.join(__cx, "debug", "build-end");
242
412
 
243
- if (!(await pathExists(buildEndLogsDir))) {
244
- await fsp.mkdir(buildEndLogsDir, { recursive: true });
413
+ if (!fs.existsSync(buildEndLogsDir)) {
414
+ fs.mkdirSync(buildEndLogsDir, { recursive: true });
245
415
  }
246
416
 
247
417
  // Log
248
- await fsp.writeFile(
418
+ fs.writeFileSync(
249
419
  path.join(buildEndLogsDir, `${dateString}.json`),
250
420
  JSON.stringify(
251
421
  {
@@ -262,36 +432,27 @@ async function saveBuildEndLogs(options: { basePath: string; domain: string }) {
262
432
  );
263
433
 
264
434
  // Update index
265
- await prependFileSync(
435
+ prependFileSync(
266
436
  path.join(buildEndLogsDir, "index.html"),
267
437
  `<pre><a href="${dateString}.json">${dateString}</a></pre>\n`,
268
438
  );
269
439
  }
270
440
 
271
- const lifeCycleNames: Record<LifeCyclesNames, LifeCyclesNames> = {
272
- Sync: "Sync",
273
- Clean: "Clean",
274
- Close: "Close",
275
- Data: "Data",
276
- HealthCheck: "HealthCheck",
277
- Init: "Init",
278
- Meta: "Meta",
279
- Prepare: "Prepare",
280
- Relocation: "Relocation",
281
- Restore: "Restore",
282
- SSG: "SSG",
283
- } as const;
284
-
285
441
  export {
442
+ createDomainMetadata,
286
443
  delay,
287
444
  doLifeCycle,
288
- executeAndReturnExecutionTime,
445
+ getConfig,
289
446
  getSafeSiteId,
447
+ instanceRootDir,
290
448
  isTruthy,
291
- lifeCycleNames,
449
+ measureExecutionTime,
292
450
  msToSec,
451
+ pause,
293
452
  removeAllSiteDirsFromStore,
294
453
  removeProperties,
454
+ sanitizeAPICacheDir,
295
455
  saveBuildEndLogs,
456
+ walk,
296
457
  walkStore,
297
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 };