@griddo/cx 11.7.11 → 11.7.12-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/README.md +27 -226
  2. package/build/adapters/gatsby/actions/clean.js +10 -0
  3. package/build/adapters/gatsby/actions/clean.js.map +1 -0
  4. package/build/adapters/gatsby/actions/close.js +14 -0
  5. package/build/adapters/gatsby/actions/close.js.map +1 -0
  6. package/build/adapters/gatsby/actions/data.js +18 -0
  7. package/build/adapters/gatsby/actions/data.js.map +1 -0
  8. package/build/adapters/gatsby/actions/healthCheck.js +10 -0
  9. package/build/adapters/gatsby/actions/healthCheck.js.map +1 -0
  10. package/build/adapters/gatsby/actions/init.js +22 -0
  11. package/build/adapters/gatsby/actions/init.js.map +1 -0
  12. package/build/adapters/gatsby/actions/logs.js +9 -0
  13. package/build/adapters/gatsby/actions/logs.js.map +1 -0
  14. package/build/adapters/gatsby/actions/meta.js +13 -0
  15. package/build/adapters/gatsby/actions/meta.js.map +1 -0
  16. package/build/adapters/gatsby/actions/prepare.js +9 -0
  17. package/build/adapters/gatsby/actions/prepare.js.map +1 -0
  18. package/build/adapters/gatsby/actions/relocation.js +15 -0
  19. package/build/adapters/gatsby/actions/relocation.js.map +1 -0
  20. package/build/adapters/gatsby/actions/restore.js +26 -0
  21. package/build/adapters/gatsby/actions/restore.js.map +1 -0
  22. package/build/adapters/gatsby/actions/ssg.js +9 -0
  23. package/build/adapters/gatsby/actions/ssg.js.map +1 -0
  24. package/build/adapters/gatsby/actions/sync.js +51 -0
  25. package/build/adapters/gatsby/actions/sync.js.map +1 -0
  26. package/build/adapters/gatsby/index.js +78 -0
  27. package/build/adapters/gatsby/index.js.map +1 -0
  28. package/build/adapters/gatsby/shared/artifacts.js +20 -0
  29. package/build/adapters/gatsby/shared/artifacts.js.map +1 -0
  30. package/build/adapters/gatsby/shared/context.js +31 -0
  31. package/build/adapters/gatsby/shared/context.js.map +1 -0
  32. package/build/adapters/gatsby/shared/diff-assets.js +101 -0
  33. package/build/adapters/gatsby/shared/diff-assets.js.map +1 -0
  34. package/build/adapters/gatsby/shared/extract-assets.js +58 -0
  35. package/build/adapters/gatsby/shared/extract-assets.js.map +1 -0
  36. package/build/adapters/gatsby/shared/gatsby-build.js +55 -0
  37. package/build/adapters/gatsby/shared/gatsby-build.js.map +1 -0
  38. package/build/adapters/gatsby/shared/sync-render.js +210 -0
  39. package/build/adapters/gatsby/shared/sync-render.js.map +1 -0
  40. package/build/adapters/gatsby/shared/types.js +3 -0
  41. package/build/adapters/gatsby/shared/types.js.map +1 -0
  42. package/build/commands/end-render.js +87 -0
  43. package/build/commands/end-render.js.map +1 -0
  44. package/build/commands/prepare-assets-directory.js +30 -0
  45. package/build/commands/prepare-assets-directory.js.map +1 -0
  46. package/build/commands/prepare-domains-render.js +133 -0
  47. package/build/commands/prepare-domains-render.js.map +1 -0
  48. package/build/commands/reset-render.js +21 -0
  49. package/build/commands/reset-render.js.map +1 -0
  50. package/build/commands/start-render.js +44 -0
  51. package/build/commands/start-render.js.map +1 -0
  52. package/build/commands/upload-search-content.js +180 -0
  53. package/build/commands/upload-search-content.js.map +1 -0
  54. package/build/constants/endpoints.js +43 -0
  55. package/build/constants/endpoints.js.map +1 -0
  56. package/build/constants/envs.js +68 -0
  57. package/build/constants/envs.js.map +1 -0
  58. package/build/constants/errors.js +81 -0
  59. package/build/constants/errors.js.map +1 -0
  60. package/build/services/auth.js +40 -0
  61. package/build/services/auth.js.map +1 -0
  62. package/build/services/db-class.js +49 -0
  63. package/build/services/db-class.js.map +1 -0
  64. package/build/services/db.js +34 -0
  65. package/build/services/db.js.map +1 -0
  66. package/build/services/navigation.js +96 -0
  67. package/build/services/navigation.js.map +1 -0
  68. package/build/services/reference-fields.js +131 -0
  69. package/build/services/reference-fields.js.map +1 -0
  70. package/build/services/robots.js +60 -0
  71. package/build/services/robots.js.map +1 -0
  72. package/build/services/sites.js +110 -0
  73. package/build/services/sites.js.map +1 -0
  74. package/build/services/store.js +257 -0
  75. package/build/services/store.js.map +1 -0
  76. package/build/types/api.js +3 -0
  77. package/build/types/api.js.map +1 -0
  78. package/build/types/global.js +3 -0
  79. package/build/types/global.js.map +1 -0
  80. package/build/types/navigation.js +3 -0
  81. package/build/types/navigation.js.map +1 -0
  82. package/build/types/pages.js +3 -0
  83. package/build/types/pages.js.map +1 -0
  84. package/build/types/render.js +10 -0
  85. package/build/types/render.js.map +1 -0
  86. package/build/types/sites.js +3 -0
  87. package/build/types/sites.js.map +1 -0
  88. package/build/types/templates.js +3 -0
  89. package/build/types/templates.js.map +1 -0
  90. package/build/utils/api.js +165 -0
  91. package/build/utils/api.js.map +1 -0
  92. package/build/utils/artifacts.js +38 -0
  93. package/build/utils/artifacts.js.map +1 -0
  94. package/build/utils/brush.js +30 -0
  95. package/build/utils/brush.js.map +1 -0
  96. package/build/utils/cache.js +106 -0
  97. package/build/utils/cache.js.map +1 -0
  98. package/build/utils/check-environment-health.js +69 -0
  99. package/build/utils/check-environment-health.js.map +1 -0
  100. package/build/utils/core-utils.js +270 -0
  101. package/build/utils/core-utils.js.map +1 -0
  102. package/build/utils/domains.js +37 -0
  103. package/build/utils/domains.js.map +1 -0
  104. package/build/utils/errors.js +30 -0
  105. package/build/utils/errors.js.map +1 -0
  106. package/build/utils/folders.js +341 -0
  107. package/build/utils/folders.js.map +1 -0
  108. package/build/utils/images.js +45 -0
  109. package/build/utils/images.js.map +1 -0
  110. package/build/utils/instance.js +66 -0
  111. package/build/utils/instance.js.map +1 -0
  112. package/build/utils/loggin.js +119 -0
  113. package/build/utils/loggin.js.map +1 -0
  114. package/build/utils/npm-deps/find-up-simple.js +75 -0
  115. package/build/utils/npm-deps/find-up-simple.js.map +1 -0
  116. package/build/utils/npm-deps/pkg-dir.js +20 -0
  117. package/build/utils/npm-deps/pkg-dir.js.map +1 -0
  118. package/build/utils/npm-deps/xml-parser.js +49 -0
  119. package/build/utils/npm-deps/xml-parser.js.map +1 -0
  120. package/build/utils/pages.js +359 -0
  121. package/build/utils/pages.js.map +1 -0
  122. package/build/utils/render.js +168 -0
  123. package/build/utils/render.js.map +1 -0
  124. package/build/utils/sitemaps.js +110 -0
  125. package/build/utils/sitemaps.js.map +1 -0
  126. package/build/utils/sites.js +105 -0
  127. package/build/utils/sites.js.map +1 -0
  128. package/build/utils/store.js +193 -0
  129. package/build/utils/store.js.map +1 -0
  130. package/exporter/adapters/gatsby/actions/clean.ts +14 -0
  131. package/exporter/adapters/gatsby/actions/close.ts +20 -0
  132. package/exporter/adapters/gatsby/actions/data.ts +25 -0
  133. package/exporter/adapters/gatsby/actions/healthCheck.ts +10 -0
  134. package/exporter/adapters/gatsby/actions/init.ts +26 -0
  135. package/exporter/adapters/gatsby/actions/logs.ts +10 -0
  136. package/exporter/adapters/gatsby/actions/meta.ts +16 -0
  137. package/exporter/adapters/gatsby/actions/prepare.ts +9 -0
  138. package/exporter/adapters/gatsby/actions/relocation.ts +15 -0
  139. package/exporter/adapters/gatsby/actions/restore.ts +36 -0
  140. package/exporter/adapters/gatsby/actions/ssg.ts +12 -0
  141. package/exporter/adapters/gatsby/actions/sync.ts +71 -0
  142. package/exporter/adapters/gatsby/index.ts +73 -153
  143. package/exporter/adapters/gatsby/shared/artifacts.ts +16 -0
  144. package/exporter/adapters/gatsby/shared/context.ts +50 -0
  145. package/exporter/adapters/gatsby/shared/diff-assets.ts +113 -0
  146. package/exporter/adapters/gatsby/shared/extract-assets.ts +61 -0
  147. package/exporter/adapters/gatsby/shared/gatsby-build.ts +58 -0
  148. package/exporter/adapters/gatsby/shared/sync-render.ts +276 -0
  149. package/exporter/adapters/gatsby/shared/types.ts +35 -0
  150. package/exporter/build-esbuild.noop +42 -0
  151. package/exporter/build.sh +4 -38
  152. package/exporter/commands/end-render.ts +72 -70
  153. package/exporter/commands/prepare-assets-directory.ts +30 -0
  154. package/exporter/commands/prepare-domains-render.ts +143 -31
  155. package/exporter/commands/reset-render.ts +10 -3
  156. package/exporter/commands/start-render.ts +22 -45
  157. package/exporter/commands/upload-search-content.ts +194 -21
  158. package/exporter/constants/endpoints.ts +2 -1
  159. package/exporter/constants/envs.ts +57 -55
  160. package/exporter/{errors/errors-data.ts → constants/errors.ts} +24 -14
  161. package/exporter/services/auth.ts +7 -6
  162. package/exporter/services/db-class.ts +54 -0
  163. package/exporter/services/db.ts +32 -0
  164. package/exporter/services/navigation.ts +4 -10
  165. package/exporter/services/reference-fields.ts +9 -24
  166. package/exporter/services/robots.ts +9 -16
  167. package/exporter/services/sites.ts +36 -24
  168. package/exporter/services/store.ts +107 -96
  169. package/exporter/types/api.ts +27 -28
  170. package/exporter/types/global.ts +8 -11
  171. package/exporter/types/navigation.ts +1 -1
  172. package/exporter/types/pages.ts +2 -3
  173. package/exporter/types/render.ts +59 -0
  174. package/exporter/types/sites.ts +1 -2
  175. package/exporter/utils/api.ts +55 -75
  176. package/exporter/utils/artifacts.ts +38 -0
  177. package/exporter/utils/brush.ts +34 -0
  178. package/exporter/utils/cache.ts +37 -62
  179. package/exporter/utils/check-environment-health.ts +80 -0
  180. package/exporter/utils/core-utils.ts +133 -272
  181. package/exporter/utils/domains.ts +10 -7
  182. package/exporter/{errors/index.ts → utils/errors.ts} +10 -9
  183. package/exporter/utils/folders.ts +163 -98
  184. package/exporter/utils/images.ts +1 -6
  185. package/exporter/utils/instance.ts +9 -13
  186. package/exporter/utils/loggin.ts +44 -91
  187. package/exporter/utils/npm-deps/find-up-simple.ts +100 -0
  188. package/exporter/utils/npm-deps/pkg-dir.ts +17 -0
  189. package/exporter/utils/npm-deps/xml-parser.ts +57 -0
  190. package/exporter/utils/pages.ts +23 -88
  191. package/exporter/utils/render.ts +180 -48
  192. package/exporter/utils/sitemaps.ts +129 -0
  193. package/exporter/utils/sites.ts +19 -197
  194. package/exporter/utils/store.ts +87 -180
  195. package/gatsby-browser.tsx +41 -58
  196. package/gatsby-config.ts +10 -17
  197. package/gatsby-node.ts +17 -78
  198. package/gatsby-ssr.tsx +2 -1
  199. package/package.json +35 -86
  200. package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +55 -0
  201. package/plugins/gatsby-plugin-svgr-loader/package.json +8 -0
  202. package/react/DynamicScript/index.tsx +33 -0
  203. package/{exporter/react → react}/Favicon/index.tsx +1 -7
  204. package/{exporter/react → react}/GriddoIntegrations/index.tsx +16 -22
  205. package/{exporter/react → react}/GriddoIntegrations/utils.ts +21 -9
  206. package/{build/react/index.d.ts → react/index.tsx} +1 -0
  207. package/src/components/Head.tsx +13 -46
  208. package/src/components/template.tsx +8 -30
  209. package/src/gatsby-node-utils.ts +73 -2
  210. package/src/html.tsx +2 -11
  211. package/src/types.ts +5 -5
  212. package/tsconfig.commands.json +36 -0
  213. package/tsconfig.exporter.json +19 -0
  214. package/tsconfig.json +5 -3
  215. package/build/adapters/gatsby/index.d.ts +0 -4
  216. package/build/adapters/gatsby/utils.d.ts +0 -22
  217. package/build/artifacts/index.d.ts +0 -6
  218. package/build/commands/end-render.d.ts +0 -2
  219. package/build/commands/move-assets.d.ts +0 -1
  220. package/build/commands/prepare-domains-render.d.ts +0 -1
  221. package/build/commands/reset-render.d.ts +0 -2
  222. package/build/commands/start-render.d.ts +0 -2
  223. package/build/commands/upload-search-content.d.ts +0 -2
  224. package/build/constants/endpoints.d.ts +0 -19
  225. package/build/constants/envs.d.ts +0 -37
  226. package/build/constants/index.d.ts +0 -57
  227. package/build/end-render.js +0 -74
  228. package/build/end-render.js.map +0 -7
  229. package/build/errors/errors-data.d.ts +0 -22
  230. package/build/errors/index.d.ts +0 -15
  231. package/build/index.d.ts +0 -29
  232. package/build/index.js +0 -73
  233. package/build/index.js.map +0 -7
  234. package/build/prepare-domains-render.js +0 -73
  235. package/build/prepare-domains-render.js.map +0 -7
  236. package/build/react/Favicon/index.d.ts +0 -5
  237. package/build/react/Favicon/utils.d.ts +0 -9
  238. package/build/react/GriddoIntegrations/index.d.ts +0 -20
  239. package/build/react/GriddoIntegrations/utils.d.ts +0 -26
  240. package/build/react/index.js +0 -3
  241. package/build/registers/api.d.ts +0 -9
  242. package/build/registers/gatsby.d.ts +0 -9
  243. package/build/registers/index.d.ts +0 -3
  244. package/build/reset-render.js +0 -74
  245. package/build/reset-render.js.map +0 -7
  246. package/build/services/auth.d.ts +0 -10
  247. package/build/services/domains.d.ts +0 -6
  248. package/build/services/navigation.d.ts +0 -50
  249. package/build/services/reference-fields.d.ts +0 -20
  250. package/build/services/register.d.ts +0 -36
  251. package/build/services/robots.d.ts +0 -19
  252. package/build/services/settings.d.ts +0 -4
  253. package/build/services/sites.d.ts +0 -29
  254. package/build/services/store.d.ts +0 -6
  255. package/build/start-render.js +0 -100
  256. package/build/start-render.js.map +0 -7
  257. package/build/types/api.d.ts +0 -142
  258. package/build/types/global.d.ts +0 -84
  259. package/build/types/navigation.d.ts +0 -28
  260. package/build/types/pages.d.ts +0 -144
  261. package/build/types/sites.d.ts +0 -57
  262. package/build/types/templates.d.ts +0 -8
  263. package/build/upload-search-content.js +0 -74
  264. package/build/upload-search-content.js.map +0 -7
  265. package/build/utils/alerts.d.ts +0 -3
  266. package/build/utils/api.d.ts +0 -23
  267. package/build/utils/cache.d.ts +0 -35
  268. package/build/utils/core-utils.d.ts +0 -107
  269. package/build/utils/create-build-data.d.ts +0 -8
  270. package/build/utils/domains.d.ts +0 -13
  271. package/build/utils/folders.d.ts +0 -53
  272. package/build/utils/health-checks.d.ts +0 -7
  273. package/build/utils/images.d.ts +0 -16
  274. package/build/utils/instance.d.ts +0 -21
  275. package/build/utils/loggin.d.ts +0 -51
  276. package/build/utils/pages.d.ts +0 -34
  277. package/build/utils/render.d.ts +0 -13
  278. package/build/utils/searches.d.ts +0 -15
  279. package/build/utils/sites.d.ts +0 -31
  280. package/build/utils/store.d.ts +0 -81
  281. package/cx.config.d.ts +0 -5
  282. package/cx.config.js +0 -36
  283. package/exporter/adapters/gatsby/utils.ts +0 -161
  284. package/exporter/artifacts/README.md +0 -34
  285. package/exporter/artifacts/index.ts +0 -33
  286. package/exporter/commands/move-assets.ts +0 -11
  287. package/exporter/constants/index.ts +0 -129
  288. package/exporter/index.ts +0 -82
  289. package/exporter/react/index.tsx +0 -11
  290. package/exporter/registers/api.ts +0 -14
  291. package/exporter/registers/gatsby.ts +0 -14
  292. package/exporter/registers/index.ts +0 -4
  293. package/exporter/services/domains.ts +0 -16
  294. package/exporter/services/register.ts +0 -113
  295. package/exporter/services/settings.ts +0 -17
  296. package/exporter/utils/alerts.ts +0 -29
  297. package/exporter/utils/create-build-data.ts +0 -17
  298. package/exporter/utils/health-checks.ts +0 -64
  299. package/exporter/utils/searches.ts +0 -156
  300. package/src/README.md +0 -7
  301. package/start-render.js +0 -7
  302. /package/{exporter/react → react}/Favicon/utils.ts +0 -0
@@ -1,50 +1,16 @@
1
1
  import type { APIResponses } from "../types/api";
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";
10
- import path from "node:path";
11
-
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";
2
+ import type { LifeCycleAction, LifeCyclesNames } from "../types/global";
24
3
 
25
- const config = getConfig();
26
-
27
- const instanceRootDir = pkgDir.sync()!; // instance root dir
4
+ import fsp from "node:fs/promises";
5
+ import path from "node:path";
28
6
 
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
- }
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";
48
14
 
49
15
  /**
50
16
  * Returns true for "true", "on", true and positive numbers.
@@ -90,53 +56,25 @@ function isTruthy(value: any): boolean {
90
56
  return false;
91
57
  }
92
58
 
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
-
108
59
  /**
109
60
  * Walk a directory and returns the JSON file absolute paths with one level of depth.
110
- * Bypass the `metadata` folder.
111
61
  * /abs/.../sotre/<siteId>/jsonfile.json
112
62
  * /abs/.../sotre/<siteId>/jsonfile.json
113
63
  * /abs/.../sotre/<siteId>/jsonfile.json
114
64
  * /abs/.../sotre/<siteId>/jsonfile.json
115
65
  */
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));
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
+ }
136
76
  }
137
77
  }
138
-
139
- return results;
140
78
  }
141
79
 
142
80
  /**
@@ -187,70 +125,6 @@ function removeProperties(obj: Record<string, unknown>, props: Array<string>) {
187
125
  }
188
126
  }
189
127
 
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
-
254
128
  /**
255
129
  * Measures the execution time of a series of sync or async functions.
256
130
  *
@@ -258,84 +132,64 @@ function sanitizeAPICacheDir() {
258
132
  * @param functions - Functions to be executed to measure their execution time.
259
133
  * @returns A promise that resolves with the total execution time in seconds.
260
134
  */
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);
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));
274
140
  }
275
141
 
276
142
  /**
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
- });
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.
143
+ * Executes a life cycle process, which involves executing a callback
144
+ * function, printing to the console, and handling errors with optional retries.
302
145
  *
303
146
  * @async
304
147
  * @param name - The name of the life cycle.
305
- * @param options - The arguments object.
306
- * @param options.steps - An array of functions to execute.
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.
307
152
  * @returns - A promise that resolves when the life cycle process is completed.
308
153
  */
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
- };
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 || {};
164
+
165
+ if (skip) {
166
+ console.log(`Skiping life-cycle. Reason: ${skip}`);
167
+ return;
168
+ }
324
169
 
325
170
  let trysCount = 0;
326
- const maxTrysAccepted = attemptsByLifeCycleName[name] || 1;
327
171
 
328
- while (trysCount < maxTrysAccepted) {
172
+ while (trysCount < maxRetrys) {
329
173
  try {
330
174
  infoLog(`start ${name} life-cycle`);
331
- const exeTime = await measureExecutionTime(steps);
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");
332
188
  successLog(`${name} - ${exeTime}s\n`);
333
- // if no errors, print and go out
334
- await pause(`${name} LifeCycle`);
335
189
  break;
336
190
  } catch (error) {
337
- const errorString = bgRed(black(` Error in ${name} LifeCycle `));
338
- const attemptsString = kleur.yellow(`Attempt (${trysCount + 1})`);
191
+ const errorString = brush.red(` Error in ${name} LifeCycle `);
192
+ const attemptsString = brush.yellow(`Attempt (${trysCount + 1})`);
339
193
  console.log(`\n${errorString} ${attemptsString}\n`);
340
194
  console.log(error);
341
195
  console.log();
@@ -344,38 +198,23 @@ async function doLifeCycle(name: LifeCyclesNames, steps: LifeCycleSteps) {
344
198
  }
345
199
  }
346
200
 
347
- if (trysCount === maxTrysAccepted) {
348
- throwError(LifecycleExecutionError(maxTrysAccepted, name));
201
+ if (trysCount === maxRetrys) {
202
+ throwError(LifecycleExecutionError(maxRetrys, name));
349
203
  }
350
204
  }
351
205
 
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);
206
+ async function removeAllSiteDirsFromStore() {
207
+ const { __root } = await getRenderPathsFromDB();
208
+ const storeDir = path.join(__root, "store");
209
+ const allDirs = await fsp.readdir(storeDir);
369
210
 
370
211
  const allSiteDirs = allDirs.filter((dirname) => dirname !== "metadata");
371
212
 
372
- const allSiteDirsFullPath = allSiteDirs.map((name) =>
373
- path.join(storeDir, name),
374
- );
213
+ const allSiteDirsFullPath = allSiteDirs.map((name) => path.join(storeDir, name));
375
214
 
376
215
  // Remove all site directories except "metadata" directory.
377
216
  for (const site of allSiteDirsFullPath) {
378
- fs.rmSync(site, { recursive: true, force: true });
217
+ await fsp.rm(site, { recursive: true, force: true });
379
218
  }
380
219
  }
381
220
 
@@ -396,63 +235,85 @@ function getFormattedDateTime() {
396
235
  return `${date}_${time}`;
397
236
  }
398
237
 
399
- /**
400
- * Save render information to a file to use as debug log.
401
- *
402
- * This information will **not** be sent to any API.
403
- */
404
- function saveBuildEndLogs() {
405
- const { __cx } = config.paths();
406
- const { sitesToPublish, createdPages, buildProcessData } = fsx.readJSONSync(
407
- path.join(__cx, "render-metadata.json"),
408
- );
238
+ async function saveDetailRenderLog(domain: string) {
239
+ const data = await readDB();
409
240
 
410
241
  const dateString = getFormattedDateTime();
411
- const buildEndLogsDir = path.join(__cx, "debug", "build-end");
242
+ const debugDir = path.join(data.paths.exportsDir, domain, "logs");
412
243
 
413
- if (!fs.existsSync(buildEndLogsDir)) {
414
- fs.mkdirSync(buildEndLogsDir, { recursive: true });
244
+ if (!(await pathExists(debugDir))) {
245
+ await fsp.mkdir(debugDir);
415
246
  }
416
247
 
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
- );
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
+ /**
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.
272
+ *
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`.
277
+ */
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);
291
+
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;
297
+ }
433
298
 
434
- // Update index
435
- prependFileSync(
436
- path.join(buildEndLogsDir, "index.html"),
437
- `<pre><a href="${dateString}.json">${dateString}</a></pre>\n`,
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),
438
302
  );
439
303
  }
440
304
 
441
305
  export {
442
- createDomainMetadata,
443
306
  delay,
444
307
  doLifeCycle,
445
- getConfig,
308
+ executeAndReturnExecutionTime,
309
+ getFormattedDateTime,
446
310
  getSafeSiteId,
447
- instanceRootDir,
311
+ hasAnyKeyDeep,
448
312
  isTruthy,
449
- measureExecutionTime,
313
+ lifeCycleNames,
450
314
  msToSec,
451
- pause,
452
315
  removeAllSiteDirsFromStore,
453
316
  removeProperties,
454
- sanitizeAPICacheDir,
455
- saveBuildEndLogs,
456
- walk,
317
+ saveDetailRenderLog,
457
318
  walkStore,
458
319
  };
@@ -1,17 +1,20 @@
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";
3
7
  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 getAllDomains();
13
+ // await AuthService.login();
14
+ const domains = await get<Domains>({
15
+ endpoint: DOMAINS,
16
+ useApiCacheDir: false,
17
+ });
15
18
 
16
19
  if (!domains.length) {
17
20
  throwError(NoDomainsFoundError);
@@ -36,4 +39,4 @@ function getDomainSlugs(domains: Domains) {
36
39
  return [...new Set(filteredDomains)];
37
40
  }
38
41
 
39
- export { getInstanceDomains, getDomainSlugs };
42
+ export { getDomainSlugs, getInstanceDomains };
@@ -1,6 +1,6 @@
1
- import type { ErrorsType } from "./errors-data";
1
+ import type { ErrorsType } from "../constants/errors";
2
2
 
3
- import kleur from "kleur";
3
+ import { brush } from "./brush";
4
4
 
5
5
  export type ErrorData = {
6
6
  error: ErrorsType;
@@ -10,20 +10,21 @@ export type ErrorData = {
10
10
  };
11
11
 
12
12
  export class RenderError extends Error {
13
- constructor() {
14
- super();
13
+ constructor(originalError?: unknown) {
14
+ super(originalError instanceof Error ? originalError.message : String(originalError));
15
+
15
16
  this.name = "InternalCXError";
16
- this.stack = "";
17
+ this.stack = originalError instanceof Error ? originalError.stack : "";
17
18
  }
18
19
  }
19
20
 
20
21
  /**
21
22
  * Throws an error with the provided error message, expected value, and hint.
22
23
  */
23
- function throwError(options: ErrorData, stack?: unknown) {
24
+ function throwError(options: ErrorData, stack?: unknown): never {
24
25
  const { error, message, expected, hint } = options;
25
26
 
26
- const errorColor = kleur.red("[ " + error + " ]");
27
+ const errorColor = console.log(brush.red(`[ ${error} ]`));
27
28
  const extraText = [expected, hint].filter(Boolean).join("\n");
28
29
 
29
30
  console.log(`
@@ -31,10 +32,10 @@ ${errorColor}
31
32
  ${message}
32
33
  ${extraText}
33
34
 
34
- ${kleur.red("stack")}
35
+ ${brush.red("stack")}
35
36
  ${JSON.stringify(stack, null, 2)}`);
36
37
 
37
- throw new RenderError();
38
+ throw new RenderError(stack);
38
39
  }
39
40
 
40
41
  export { throwError };