@griddo/cx 11.7.4 → 11.7.6-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/README.md +25 -228
  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 +12 -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 +9 -0
  11. package/build/adapters/gatsby/actions/init.js.map +1 -0
  12. package/build/adapters/gatsby/actions/meta.js +14 -0
  13. package/build/adapters/gatsby/actions/meta.js.map +1 -0
  14. package/build/adapters/gatsby/actions/prepare.js +9 -0
  15. package/build/adapters/gatsby/actions/prepare.js.map +1 -0
  16. package/build/adapters/gatsby/actions/relocation.js +15 -0
  17. package/build/adapters/gatsby/actions/relocation.js.map +1 -0
  18. package/build/adapters/gatsby/actions/restore.js +26 -0
  19. package/build/adapters/gatsby/actions/restore.js.map +1 -0
  20. package/build/adapters/gatsby/actions/ssg.js +9 -0
  21. package/build/adapters/gatsby/actions/ssg.js.map +1 -0
  22. package/build/adapters/gatsby/actions/sync.js +50 -0
  23. package/build/adapters/gatsby/actions/sync.js.map +1 -0
  24. package/build/adapters/gatsby/index.js +74 -0
  25. package/build/adapters/gatsby/index.js.map +1 -0
  26. package/build/adapters/gatsby/shared/context.js +25 -0
  27. package/build/adapters/gatsby/shared/context.js.map +1 -0
  28. package/build/adapters/gatsby/shared/extract-assets.js +58 -0
  29. package/build/adapters/gatsby/shared/extract-assets.js.map +1 -0
  30. package/build/adapters/gatsby/shared/gatsby-build.js +49 -0
  31. package/build/adapters/gatsby/shared/gatsby-build.js.map +1 -0
  32. package/build/adapters/gatsby/shared/sync-render.js +208 -0
  33. package/build/adapters/gatsby/shared/sync-render.js.map +1 -0
  34. package/build/adapters/gatsby/shared/types.js +3 -0
  35. package/build/adapters/gatsby/shared/types.js.map +1 -0
  36. package/build/commands/end-render.js +63 -0
  37. package/build/commands/end-render.js.map +1 -0
  38. package/build/commands/prepare-assets-directory.js +32 -0
  39. package/build/commands/prepare-assets-directory.js.map +1 -0
  40. package/build/commands/prepare-domains-render.js +138 -0
  41. package/build/commands/prepare-domains-render.js.map +1 -0
  42. package/build/commands/reset-render.js +22 -0
  43. package/build/commands/reset-render.js.map +1 -0
  44. package/build/commands/start-render.js +35 -0
  45. package/build/commands/start-render.js.map +1 -0
  46. package/build/commands/upload-search-content.js +189 -0
  47. package/build/commands/upload-search-content.js.map +1 -0
  48. package/build/constants/endpoints.js +42 -0
  49. package/build/constants/endpoints.js.map +1 -0
  50. package/build/constants/envs.js +73 -0
  51. package/build/constants/envs.js.map +1 -0
  52. package/build/constants/errors.js +89 -0
  53. package/build/constants/errors.js.map +1 -0
  54. package/build/exporter/adapters/gatsby/actions/clean.d.ts +3 -0
  55. package/build/exporter/adapters/gatsby/actions/close.d.ts +3 -0
  56. package/build/exporter/adapters/gatsby/actions/data.d.ts +2 -0
  57. package/build/exporter/adapters/gatsby/actions/healthCheck.d.ts +2 -0
  58. package/build/exporter/adapters/gatsby/actions/init.d.ts +2 -0
  59. package/build/exporter/adapters/gatsby/actions/meta.d.ts +2 -0
  60. package/build/exporter/adapters/gatsby/actions/prepare.d.ts +2 -0
  61. package/build/exporter/adapters/gatsby/actions/relocation.d.ts +2 -0
  62. package/build/exporter/adapters/gatsby/actions/restore.d.ts +3 -0
  63. package/build/exporter/adapters/gatsby/actions/ssg.d.ts +3 -0
  64. package/build/exporter/adapters/gatsby/actions/sync.d.ts +3 -0
  65. package/build/exporter/adapters/gatsby/index.d.ts +9 -0
  66. package/build/exporter/adapters/gatsby/shared/context.d.ts +38 -0
  67. package/build/exporter/adapters/gatsby/shared/extract-assets.d.ts +7 -0
  68. package/build/exporter/adapters/gatsby/shared/gatsby-build.d.ts +7 -0
  69. package/build/exporter/adapters/gatsby/shared/sync-render.d.ts +36 -0
  70. package/build/exporter/adapters/gatsby/shared/types.d.ts +34 -0
  71. package/build/exporter/commands/start-render.d.ts +2 -0
  72. package/build/exporter/commands/upload-search-content.d.ts +2 -0
  73. package/build/{constants → exporter/constants}/envs.d.ts +1 -7
  74. package/build/{errors/errors-data.d.ts → exporter/constants/errors.d.ts} +5 -3
  75. package/build/{services → exporter/services}/auth.d.ts +1 -1
  76. package/build/exporter/services/db.d.ts +4 -0
  77. package/build/{services → exporter/services}/robots.d.ts +0 -6
  78. package/build/{services → exporter/services}/sites.d.ts +5 -2
  79. package/build/exporter/services/store.d.ts +15 -0
  80. package/build/{types → exporter/types}/api.d.ts +3 -4
  81. package/build/{types → exporter/types}/global.d.ts +6 -6
  82. package/build/{types → exporter/types}/navigation.d.ts +1 -1
  83. package/build/exporter/types/render.d.ts +50 -0
  84. package/build/{types → exporter/types}/sites.d.ts +1 -2
  85. package/build/exporter/utils/artifacts.d.ts +6 -0
  86. package/build/exporter/utils/brush.d.ts +18 -0
  87. package/build/{utils → exporter/utils}/cache.d.ts +7 -12
  88. package/build/{utils/health-checks.d.ts → exporter/utils/check-health.d.ts} +2 -2
  89. package/build/exporter/utils/core-utils.d.ts +77 -0
  90. package/build/{utils → exporter/utils}/domains.d.ts +1 -1
  91. package/build/{errors/index.d.ts → exporter/utils/errors.d.ts} +3 -3
  92. package/build/exporter/utils/folders.d.ts +66 -0
  93. package/build/{utils → exporter/utils}/loggin.d.ts +2 -16
  94. package/build/{utils → exporter/utils}/pages.d.ts +2 -2
  95. package/build/exporter/utils/render.d.ts +49 -0
  96. package/build/{utils → exporter/utils}/sites.d.ts +3 -3
  97. package/build/{utils → exporter/utils}/store.d.ts +10 -38
  98. package/build/services/auth.js +39 -0
  99. package/build/services/auth.js.map +1 -0
  100. package/build/services/db.js +34 -0
  101. package/build/services/db.js.map +1 -0
  102. package/build/services/navigation.js +93 -0
  103. package/build/services/navigation.js.map +1 -0
  104. package/build/services/reference-fields.js +131 -0
  105. package/build/services/reference-fields.js.map +1 -0
  106. package/build/services/robots.js +58 -0
  107. package/build/services/robots.js.map +1 -0
  108. package/build/services/sites.js +109 -0
  109. package/build/services/sites.js.map +1 -0
  110. package/build/services/store.js +282 -0
  111. package/build/services/store.js.map +1 -0
  112. package/build/types/api.js +3 -0
  113. package/build/types/api.js.map +1 -0
  114. package/build/types/global.js +3 -0
  115. package/build/types/global.js.map +1 -0
  116. package/build/types/navigation.js +3 -0
  117. package/build/types/navigation.js.map +1 -0
  118. package/build/types/pages.js +3 -0
  119. package/build/types/pages.js.map +1 -0
  120. package/build/types/render.js +10 -0
  121. package/build/types/render.js.map +1 -0
  122. package/build/types/sites.js +3 -0
  123. package/build/types/sites.js.map +1 -0
  124. package/build/types/templates.js +3 -0
  125. package/build/types/templates.js.map +1 -0
  126. package/build/utils/api.js +161 -0
  127. package/build/utils/api.js.map +1 -0
  128. package/build/utils/artifacts.js +34 -0
  129. package/build/utils/artifacts.js.map +1 -0
  130. package/build/utils/brush.js +30 -0
  131. package/build/utils/brush.js.map +1 -0
  132. package/build/utils/cache.js +106 -0
  133. package/build/utils/cache.js.map +1 -0
  134. package/build/utils/check-health.js +68 -0
  135. package/build/utils/check-health.js.map +1 -0
  136. package/build/utils/core-utils.js +251 -0
  137. package/build/utils/core-utils.js.map +1 -0
  138. package/build/utils/domains.js +37 -0
  139. package/build/utils/domains.js.map +1 -0
  140. package/build/utils/errors.js +30 -0
  141. package/build/utils/errors.js.map +1 -0
  142. package/build/utils/folders.js +339 -0
  143. package/build/utils/folders.js.map +1 -0
  144. package/build/utils/images.js +45 -0
  145. package/build/utils/images.js.map +1 -0
  146. package/build/utils/instance.js +66 -0
  147. package/build/utils/instance.js.map +1 -0
  148. package/build/utils/loggin.js +102 -0
  149. package/build/utils/loggin.js.map +1 -0
  150. package/build/utils/pages.js +359 -0
  151. package/build/utils/pages.js.map +1 -0
  152. package/build/utils/render.js +144 -0
  153. package/build/utils/render.js.map +1 -0
  154. package/build/utils/sites.js +239 -0
  155. package/build/utils/sites.js.map +1 -0
  156. package/build/utils/store.js +193 -0
  157. package/build/utils/store.js.map +1 -0
  158. package/exporter/adapters/gatsby/actions/clean.ts +14 -0
  159. package/exporter/adapters/gatsby/actions/close.ts +17 -0
  160. package/exporter/adapters/gatsby/actions/data.ts +25 -0
  161. package/exporter/adapters/gatsby/actions/healthCheck.ts +10 -0
  162. package/exporter/adapters/gatsby/actions/init.ts +12 -0
  163. package/exporter/adapters/gatsby/actions/meta.ts +18 -0
  164. package/exporter/adapters/gatsby/actions/prepare.ts +9 -0
  165. package/exporter/adapters/gatsby/actions/relocation.ts +15 -0
  166. package/exporter/adapters/gatsby/actions/restore.ts +36 -0
  167. package/exporter/adapters/gatsby/actions/ssg.ts +12 -0
  168. package/exporter/adapters/gatsby/actions/sync.ts +70 -0
  169. package/exporter/adapters/gatsby/index.ts +60 -146
  170. package/exporter/adapters/gatsby/shared/context.ts +50 -0
  171. package/exporter/adapters/gatsby/shared/extract-assets.ts +61 -0
  172. package/exporter/adapters/gatsby/shared/gatsby-build.ts +54 -0
  173. package/exporter/adapters/gatsby/shared/sync-render.ts +294 -0
  174. package/exporter/adapters/gatsby/shared/types.ts +35 -0
  175. package/exporter/build-esbuild.noop +42 -0
  176. package/exporter/build.sh +5 -38
  177. package/exporter/commands/end-render.ts +56 -81
  178. package/exporter/commands/prepare-assets-directory.ts +33 -0
  179. package/exporter/commands/prepare-domains-render.ts +149 -31
  180. package/exporter/commands/reset-render.ts +12 -3
  181. package/exporter/commands/start-render.ts +18 -47
  182. package/exporter/commands/upload-search-content.ts +206 -21
  183. package/exporter/constants/envs.ts +59 -51
  184. package/exporter/{errors/errors-data.ts → constants/errors.ts} +24 -15
  185. package/exporter/services/auth.ts +7 -6
  186. package/exporter/services/db.ts +32 -0
  187. package/exporter/services/navigation.ts +4 -10
  188. package/exporter/services/reference-fields.ts +8 -23
  189. package/exporter/services/robots.ts +8 -15
  190. package/exporter/services/sites.ts +35 -24
  191. package/exporter/services/store.ts +118 -76
  192. package/exporter/types/api.ts +24 -27
  193. package/exporter/types/global.ts +8 -10
  194. package/exporter/types/navigation.ts +1 -1
  195. package/exporter/types/pages.ts +2 -3
  196. package/exporter/types/render.ts +59 -0
  197. package/exporter/types/sites.ts +1 -2
  198. package/exporter/utils/api.ts +46 -82
  199. package/exporter/{artifacts/index.ts → utils/artifacts.ts} +9 -8
  200. package/exporter/utils/brush.ts +34 -0
  201. package/exporter/utils/cache.ts +34 -59
  202. package/exporter/utils/check-health.ts +79 -0
  203. package/exporter/utils/core-utils.ts +86 -247
  204. package/exporter/utils/domains.ts +10 -7
  205. package/exporter/{errors/index.ts → utils/errors.ts} +10 -9
  206. package/exporter/utils/folders.ts +161 -92
  207. package/exporter/utils/images.ts +1 -6
  208. package/exporter/utils/instance.ts +9 -12
  209. package/exporter/utils/loggin.ts +24 -89
  210. package/exporter/utils/pages.ts +23 -88
  211. package/exporter/utils/render.ts +147 -48
  212. package/exporter/utils/sites.ts +67 -77
  213. package/exporter/utils/store.ts +85 -178
  214. package/gatsby-browser.tsx +41 -58
  215. package/gatsby-config.ts +6 -12
  216. package/gatsby-node.ts +30 -89
  217. package/gatsby-ssr.tsx +2 -1
  218. package/package.json +32 -73
  219. package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +55 -0
  220. package/plugins/gatsby-plugin-svgr-loader/package.json +8 -0
  221. package/{exporter/react → react}/Favicon/index.tsx +1 -7
  222. package/{exporter/react → react}/GriddoIntegrations/index.tsx +6 -14
  223. package/{exporter/react → react}/GriddoIntegrations/utils.ts +4 -9
  224. package/{build/react/index.d.ts → react/index.tsx} +1 -0
  225. package/src/components/Head.tsx +13 -46
  226. package/src/components/template.tsx +8 -30
  227. package/src/gatsby-node-utils.ts +91 -2
  228. package/src/html.tsx +2 -11
  229. package/src/types.ts +5 -5
  230. package/start-render.js +1 -3
  231. package/tsconfig.json +3 -2
  232. package/build/adapters/gatsby/index.d.ts +0 -4
  233. package/build/adapters/gatsby/utils.d.ts +0 -22
  234. package/build/artifacts/index.d.ts +0 -6
  235. package/build/commands/move-assets.d.ts +0 -1
  236. package/build/commands/prepare-domains-render.d.ts +0 -1
  237. package/build/constants/index.d.ts +0 -57
  238. package/build/end-render.js +0 -74
  239. package/build/end-render.js.map +0 -7
  240. package/build/index.d.ts +0 -29
  241. package/build/index.js +0 -73
  242. package/build/index.js.map +0 -7
  243. package/build/prepare-domains-render.js +0 -73
  244. package/build/prepare-domains-render.js.map +0 -7
  245. package/build/react/Favicon/index.d.ts +0 -5
  246. package/build/react/Favicon/utils.d.ts +0 -9
  247. package/build/react/GriddoIntegrations/index.d.ts +0 -20
  248. package/build/react/GriddoIntegrations/utils.d.ts +0 -26
  249. package/build/react/index.js +0 -3
  250. package/build/registers/api.d.ts +0 -9
  251. package/build/registers/gatsby.d.ts +0 -9
  252. package/build/registers/index.d.ts +0 -3
  253. package/build/reset-render.js +0 -74
  254. package/build/reset-render.js.map +0 -7
  255. package/build/services/domains.d.ts +0 -6
  256. package/build/services/register.d.ts +0 -36
  257. package/build/services/settings.d.ts +0 -4
  258. package/build/services/store.d.ts +0 -6
  259. package/build/start-render.js +0 -100
  260. package/build/start-render.js.map +0 -7
  261. package/build/upload-search-content.js +0 -74
  262. package/build/upload-search-content.js.map +0 -7
  263. package/build/utils/alerts.d.ts +0 -3
  264. package/build/utils/core-utils.d.ts +0 -107
  265. package/build/utils/create-build-data.d.ts +0 -8
  266. package/build/utils/folders.d.ts +0 -53
  267. package/build/utils/render.d.ts +0 -13
  268. package/build/utils/searches.d.ts +0 -15
  269. package/cx.config.d.ts +0 -5
  270. package/cx.config.js +0 -36
  271. package/exporter/adapters/gatsby/utils.ts +0 -161
  272. package/exporter/artifacts/README.md +0 -34
  273. package/exporter/commands/move-assets.ts +0 -11
  274. package/exporter/constants/index.ts +0 -129
  275. package/exporter/index.ts +0 -82
  276. package/exporter/react/index.tsx +0 -11
  277. package/exporter/registers/api.ts +0 -14
  278. package/exporter/registers/gatsby.ts +0 -14
  279. package/exporter/registers/index.ts +0 -4
  280. package/exporter/services/domains.ts +0 -16
  281. package/exporter/services/register.ts +0 -113
  282. package/exporter/services/settings.ts +0 -17
  283. package/exporter/utils/alerts.ts +0 -29
  284. package/exporter/utils/create-build-data.ts +0 -17
  285. package/exporter/utils/health-checks.ts +0 -64
  286. package/exporter/utils/searches.ts +0 -179
  287. package/src/README.md +0 -7
  288. package/build/{commands → exporter/commands}/end-render.d.ts +0 -0
  289. package/build/{commands/reset-render.d.ts → exporter/commands/prepare-assets-directory.d.ts} +0 -0
  290. package/build/{commands/start-render.d.ts → exporter/commands/prepare-domains-render.d.ts} +0 -0
  291. package/build/{commands/upload-search-content.d.ts → exporter/commands/reset-render.d.ts} +0 -0
  292. package/build/{constants → exporter/constants}/endpoints.d.ts +0 -0
  293. package/build/{services → exporter/services}/navigation.d.ts +0 -0
  294. package/build/{services → exporter/services}/reference-fields.d.ts +0 -0
  295. package/build/{types → exporter/types}/pages.d.ts +1 -1
  296. /package/build/{types → exporter/types}/templates.d.ts +0 -0
  297. /package/build/{utils → exporter/utils}/api.d.ts +0 -0
  298. /package/build/{utils → exporter/utils}/images.d.ts +0 -0
  299. /package/build/{utils → exporter/utils}/instance.d.ts +0 -0
  300. /package/{exporter/react → react}/Favicon/utils.ts +0 -0
@@ -1,52 +1,38 @@
1
1
  import type { Site } from "../types/sites";
2
2
 
3
- import kleur from "kleur";
3
+ import fsp from "node:fs/promises";
4
+ import path from "node:path";
4
5
 
5
- import { envs } from "../constants";
6
- import { getConfig } from "./core-utils";
6
+ import { GRIDDO_BUILD_LOGS, GRIDDO_VERBOSE_LOGS } from "../constants/envs";
7
+ import { brush } from "./brush";
7
8
 
8
9
  /**
9
10
  * Custom basic logging function controlled by a environment variable.
10
- *
11
11
  * @param str The string to be logged.
12
12
  */
13
13
  function verboseLog(str: string) {
14
- if (envs.GRIDDO_VERBOSE_LOGS) {
15
- console.log(
16
- kleur.yellow("verbose"),
17
- kleur.dim(str.replace(/(\s)\s+/g, "$1").trim()),
18
- );
14
+ if (GRIDDO_VERBOSE_LOGS) {
15
+ console.log(brush.yellow("verbose"), brush.dim(str.replace(/(\s)\s+/g, "$1").trim()));
19
16
  }
20
17
  }
21
18
 
22
19
  /**
23
20
  * Custom log inside a line-box.
24
- *
25
21
  * @param stringValue The string to be logged.
26
22
  * @param paddingInline The number of white spaces inside the box at left and right.
27
23
  * @param paddingBlock The number of white spaces inside the box at top and bottom.
28
24
  */
29
- function boxLog(
30
- stringValue: string,
31
- title = "",
32
- paddingInline = 1,
33
- paddingBlock = 1,
34
- ) {
25
+ function boxLog(stringValue: string, title = "", paddingInline = 1, paddingBlock = 1) {
35
26
  const lines = stringValue
36
27
  .split("\n") // lines
37
28
  .map((line) => line.trim()); // remove extra spaces
38
29
  const windowTitle = title ? ` ${title} ` : "";
39
30
  const windowTitleLength = title ? windowTitle.length : 0;
40
- const longerContent =
41
- Math.max(...lines.map((l) => l.length)) + paddingInline * 2;
31
+ const longerContent = Math.max(...lines.map((l) => l.length)) + paddingInline * 2;
42
32
  const longerLine = Math.max(longerContent, windowTitleLength);
43
- const paddingBlockString = `│${" ".repeat(longerLine)}│\n`.repeat(
44
- paddingBlock,
45
- );
33
+ const paddingBlockString = `│${" ".repeat(longerLine)}│\n`.repeat(paddingBlock);
46
34
  const minWidth = longerLine;
47
- const borderTop = `╭${windowTitle}${"─".repeat(
48
- minWidth - windowTitleLength,
49
- )}╮\n`;
35
+ const borderTop = `╭${windowTitle}${"─".repeat(minWidth - windowTitleLength)}╮\n`;
50
36
  const borderBottom = `╰${"─".repeat(minWidth)}╯`;
51
37
  const content = lines
52
38
  .map((l) => {
@@ -55,9 +41,7 @@ function boxLog(
55
41
  })
56
42
  .join("");
57
43
 
58
- console.log(
59
- `${borderTop}${paddingBlockString}${content}${paddingBlockString}${borderBottom}`,
60
- );
44
+ console.log(`${borderTop}${paddingBlockString}${content}${paddingBlockString}${borderBottom}`);
61
45
  }
62
46
 
63
47
  /**
@@ -67,7 +51,7 @@ function boxLog(
67
51
  * @param str The string to be logged.
68
52
  */
69
53
  function buildLog(str: string) {
70
- if (envs.GRIDDO_BUILD_LOGS) {
54
+ if (GRIDDO_BUILD_LOGS) {
71
55
  console.log(str.replace(/(\s)\s+/g, "$1").trim());
72
56
  }
73
57
  }
@@ -77,7 +61,7 @@ function buildLog(str: string) {
77
61
  * @param str The string to be logged.
78
62
  */
79
63
  function infoLog(str: string) {
80
- console.log(`${kleur.blue("info")} ${str}`);
64
+ console.log(`${brush.blue("info")} ${str}`);
81
65
  }
82
66
 
83
67
  /**
@@ -85,99 +69,50 @@ function infoLog(str: string) {
85
69
  * @param str The string to be logged.
86
70
  */
87
71
  function successLog(str: string) {
88
- console.log(`${kleur.green("success")} ${str}`);
89
- }
90
-
91
- /**
92
- * Internal log
93
- * @param values The values to be logged.
94
- */
95
- function debugLog(...values: Array<unknown>) {
96
- if (!envs.GRIDDO_DEBUG_LOGS) {
97
- return;
98
- }
99
- console.log(...values);
100
- }
101
-
102
- /**
103
- * Return a scale size colors with a number and a measure string (KB by default).
104
- *
105
- * @param size The page size in KB.
106
- * @param measure The measure string to be added in the log.
107
- */
108
- function pageSizeLog(size: number, measure = "KB") {
109
- const sizeScale = {
110
- low: 50,
111
- mid: 80,
112
- large: 130,
113
- extraLarge: 210,
114
- };
115
-
116
- // Ternary pawa!
117
- const color =
118
- size > sizeScale.large
119
- ? "red"
120
- : size > sizeScale.mid
121
- ? "magenta"
122
- : size > sizeScale.low
123
- ? "blue"
124
- : "green";
125
-
126
- return kleur[color](kleur.bold(`${size}${measure}`));
72
+ console.log(`${brush.green("success")} ${str}`);
127
73
  }
128
74
 
129
75
  /**
130
76
  * Console log the Griddo exporter version.
131
77
  */
132
- function showExporterVersion() {
78
+ async function showExporterVersion() {
133
79
  console.clear();
134
- const config = getConfig();
135
- const { griddoVersion } = config;
136
- const logo = `\n${kleur
137
- .bgYellow()
138
- .black()
139
- .bold(" Griddo Exporter " + griddoVersion + " ")}\n`;
80
+ const { version } = JSON.parse(
81
+ await fsp.readFile(path.resolve(__dirname, "../..", "package.json"), "utf-8"),
82
+ ) as { version: string };
83
+ const logo = `\n${brush.yellow(`Griddo Exporter ${version}`)}\n`;
140
84
 
141
85
  console.log(logo);
142
86
  }
143
87
 
144
88
  function listSitesLog(title: string, sites: Array<Site>) {
145
89
  const maxline = Math.max(
146
- ...sites.map(
147
- (s) =>
148
- s.name.length + (s.shouldBeUpdated ? 1 : 0) + s.id.toString().length,
149
- ),
90
+ ...sites.map((s) => s.name.length + (s.shouldBeUpdated ? 1 : 0) + s.id.toString().length),
150
91
  );
151
92
 
152
93
  const sitesStr = sites.map((s) => {
153
94
  const shouldBeUpdated = s.shouldBeUpdated ? "*" : "";
154
- const lineLen =
155
- s.name.length + shouldBeUpdated.length + s.id.toString().length;
95
+ const lineLen = s.name.length + shouldBeUpdated.length + s.id.toString().length;
156
96
  const padding = " ".repeat(maxline - lineLen);
157
- return `${kleur.bold(s.name)} ${kleur.dim("(" + s.id + ")")} ${shouldBeUpdated} ${padding}${kleur.dim("-")} ${kleur.dim(s.slug)}`;
97
+ return `${brush.bold(s.name)} ${brush.dim(`(${s.id})`)} ${shouldBeUpdated} ${padding}${brush.dim("-")} ${brush.dim(s.slug)}`;
158
98
  });
159
99
 
160
- const sitesOutput =
161
- sitesStr.length > 0
162
- ? "\n\n" + sitesStr.join("\n")
163
- : kleur.dim("--none--\n");
100
+ const sitesOutput = sitesStr.length > 0 ? `\n\n${sitesStr.join("\n")}` : brush.dim("--none--\n");
164
101
 
165
102
  console.log(`
166
103
  ${title} ${sitesOutput}`);
167
104
  }
168
105
 
169
106
  function errorLabelLog(msg: string) {
170
- console.error("\n" + kleur.black().bgRed(" " + msg + " ") + "\n");
107
+ console.error(`\n${brush.black(` ${msg} `)}\n`);
171
108
  }
172
109
 
173
110
  export {
174
111
  boxLog,
175
112
  buildLog,
176
- debugLog,
177
113
  errorLabelLog,
178
114
  infoLog,
179
115
  listSitesLog,
180
- pageSizeLog,
181
116
  showExporterVersion,
182
117
  successLog,
183
118
  verboseLog,
@@ -1,3 +1,4 @@
1
+ import type { Core, Fields } from "@griddo/core";
1
2
  import type {
2
3
  APIPageObject,
3
4
  GriddoListPage,
@@ -9,14 +10,9 @@ import type {
9
10
  PageAdditionalInfo,
10
11
  } from "../types/pages";
11
12
  import type { TemplateWithReferenceField } from "../types/templates";
12
- import type { Core, Fields } from "@griddo/core";
13
-
14
- import dotenv from "dotenv";
15
13
 
16
14
  import { formatImage } from "./images";
17
15
 
18
- dotenv.config();
19
-
20
16
  // Consts
21
17
  const DEFAULT_ITEMS_PER_PAGE_FOR_LIST_TEMPLATES = 25;
22
18
 
@@ -31,10 +27,7 @@ function getOpenGraph({
31
27
  socialTitle,
32
28
  socialDescription,
33
29
  socialImage,
34
- }: Pick<
35
- Core.Page,
36
- "socialTitle" | "socialDescription" | "socialImage"
37
- >): Core.Page["openGraph"] {
30
+ }: Pick<Core.Page, "socialTitle" | "socialDescription" | "socialImage">): Core.Page["openGraph"] {
38
31
  return {
39
32
  type: "website",
40
33
  title: socialTitle,
@@ -49,9 +42,7 @@ function getOpenGraph({
49
42
  *
50
43
  * @param params A Page object
51
44
  */
52
- function getPageMetadata(
53
- params: Core.Page,
54
- ): GriddoPageObject["context"]["pageMetadata"] {
45
+ function getPageMetadata(params: Core.Page): GriddoPageObject["context"]["pageMetadata"] {
55
46
  const {
56
47
  title,
57
48
  metaTitle,
@@ -87,9 +78,7 @@ function getPageMetadata(
87
78
  index: isIndexed ? "index" : "noindex",
88
79
  follow: follow ? "follow" : "nofollow",
89
80
  translate: metasAdvancedList.includes("notranslate") ? "notranslate" : "",
90
- metasAdvanced: metasAdvancedList
91
- .filter((item) => item !== "notranslate")
92
- .join(),
81
+ metasAdvanced: metasAdvancedList.filter((item) => item !== "notranslate").join(),
93
82
  pageLanguages,
94
83
  metaKeywords: metaKeywords
95
84
  ?.filter(Boolean)
@@ -133,8 +122,9 @@ async function createGriddoPageObject(
133
122
  siteSlug,
134
123
  socials,
135
124
  theme,
136
- navigations: { header, footer },
125
+ navigations,
137
126
  } = additionalInfo;
127
+ const { header, footer } = navigations;
138
128
 
139
129
  // Update page object
140
130
  page.breadcrumb = breadcrumb;
@@ -207,10 +197,7 @@ async function createGriddoPageObject(
207
197
  * @param page A Griddo single page object.
208
198
  * @param additionalInfo Additional page info.
209
199
  */
210
- async function createGriddoSinglePage(
211
- page: GriddoSinglePage,
212
- additionalInfo: PageAdditionalInfo,
213
- ) {
200
+ async function createGriddoSinglePage(page: GriddoSinglePage, additionalInfo: PageAdditionalInfo) {
214
201
  return createGriddoPageObject(page, additionalInfo);
215
202
  }
216
203
 
@@ -218,14 +205,7 @@ async function createGriddoSinglePage(
218
205
  * Create multiples pages from one page as list paginated pages
219
206
  */
220
207
  async function createGriddoListPages(
221
- {
222
- page,
223
- pages,
224
- isRoot = false,
225
- defaultLang,
226
- template,
227
- totalQueriedItems,
228
- }: GriddoListPage,
208
+ { page, pages, isRoot = false, defaultLang, template, totalQueriedItems }: GriddoListPage,
229
209
  additionalInfo: PageAdditionalInfo,
230
210
  ) {
231
211
  const allPages = pages.map(async (dataInPage, idx) => {
@@ -233,19 +213,8 @@ async function createGriddoListPages(
233
213
  const pageNumber = idx + 1;
234
214
  const { domainUrl, compose } = page.fullPath;
235
215
 
236
- // Crea un id como número negativo y añadiendo un sufijo para los
237
- // listados estáticos. Esto es así para marcarlas y posteriormente
238
- // borrarlas siempre en cada nuevo render desde el Adapter.
239
- //
240
- // id de página con mode:"list": 1546
241
- // ids de las "sub-páginas": -15460, -15461, -1546n, (-)id(idx)
242
- //
243
- // @todo eliminar el concepto multipage de CX, debería ser algo core de
244
- // Griddo itself: API/AX, que fuesen páginas con sus ids, etc..
245
-
246
216
  const paginatedPage = {
247
217
  ...page,
248
- id: Number.parseInt(`-${page.id}${idx}`),
249
218
  fullPath: {
250
219
  ...page.fullPath,
251
220
  // Add a page number (tailPageNumber) from page 2 onwards
@@ -287,16 +256,11 @@ async function createGriddoListPages(
287
256
  * @param page A Griddo Multipage object.
288
257
  * @param additionalInfo Additional page info.
289
258
  */
290
- function createGriddoMultiPages(
291
- page: GriddoMultiPage,
292
- additionalInfo: PageAdditionalInfo,
293
- ) {
259
+ function createGriddoMultiPages(page: GriddoMultiPage, additionalInfo: PageAdditionalInfo) {
294
260
  const { multiPageElements: multiPageElementsBulk, ...cleanPage } = page;
295
261
  // TODO: Use structuredClone() when node 18 is available.
296
262
  // WARN!! Se ha probado que parse(stringify()) está tan optimizado que puede ser más rápido que structuredClone...
297
- const multiPageElements: MultiPageElements = JSON.parse(
298
- JSON.stringify(multiPageElementsBulk),
299
- );
263
+ const multiPageElements: MultiPageElements = JSON.parse(JSON.stringify(multiPageElementsBulk));
300
264
 
301
265
  // Si no hay un elemento sin slug, como mínimo hay que dibujar una página
302
266
  // principal para el conjunto de páginas.
@@ -305,7 +269,7 @@ function createGriddoMultiPages(
305
269
  }
306
270
 
307
271
  // Creates each page based on `multiPageElements` from the schema.
308
- const allPages = multiPageElements.map(async (pageElement, idx) => {
272
+ const allPages = multiPageElements.map(async (pageElement) => {
309
273
  // TODO: Use structuredClone() when node 18 is available.
310
274
  // WARN!! Se ha probado que parse(stringify()) está tan optimizado que puede ser más rápido que structuredClone...
311
275
  const paginatedPage: APIPageObject = JSON.parse(JSON.stringify(cleanPage));
@@ -323,9 +287,7 @@ function createGriddoMultiPages(
323
287
 
324
288
  const cleanSectionSlug = sectionSlug?.replace(/\//g, "");
325
289
  const isRootSlug = sectionSlug === "/";
326
- const rightSectionSlug = isRootSlug
327
- ? cleanSectionSlug
328
- : `${cleanSectionSlug}/`;
290
+ const rightSectionSlug = isRootSlug ? cleanSectionSlug : `${cleanSectionSlug}/`;
329
291
 
330
292
  const slash = compose.endsWith("/") ? "" : "/";
331
293
  const newCompose = `${compose}${slash}${rightSectionSlug}`;
@@ -338,24 +300,12 @@ function createGriddoMultiPages(
338
300
  paginatedPage.metaDescription = metaDescription;
339
301
  }
340
302
 
341
- // Crea un id como número negativo y añadiendo un sufijo para las multipages.
342
- // Esto es así para marcarlas y posteriormente borrarlas siempre en cada
343
- // nuevo render desde el Adapter.
344
- //
345
- // id de página con hasMultipageTrue: 1546
346
- // ids de las "sub-páginas": -15460, -15461, -1546n, (-)id(idx)
347
- //
348
- // @todo eliminar el concepto multipage de CX, debería ser algo core de
349
- // Griddo itself: API/AX, que fuesen páginas con sus ids, etc..
350
- paginatedPage.id = Number.parseInt(`-${paginatedPage.id}${idx}`);
351
-
352
303
  paginatedPage.fullUrl = `${fullUrl}/${rightSectionSlug}`;
353
304
  paginatedPage.fullPath.compose = newCompose;
354
305
  paginatedPage.slug = newCompose;
355
306
  paginatedPage.template.activeSectionSlug = sectionSlug;
356
307
  paginatedPage.template.activeSectionBase = fullUrl;
357
- paginatedPage.metaTitle =
358
- metaTitle.trim() || title.trim() || paginatedPage.metaTitle;
308
+ paginatedPage.metaTitle = metaTitle.trim() || title.trim() || paginatedPage.metaTitle;
359
309
 
360
310
  return createGriddoPageObject(paginatedPage, additionalInfo);
361
311
  });
@@ -368,9 +318,7 @@ function createGriddoMultiPages(
368
318
  *
369
319
  * @param page The page to get the multipage parts.
370
320
  */
371
- function getMultiPageElements(
372
- page: TemplateWithReferenceField,
373
- ): Promise<MultiPageElements> | null {
321
+ function getMultiPageElements(page: TemplateWithReferenceField): Promise<MultiPageElements> | null {
374
322
  const multiPageElements = new Promise((resolve) => {
375
323
  // Recursive
376
324
  const getMultiPageComponent = (
@@ -391,11 +339,10 @@ function getMultiPageElements(
391
339
  hasGriddoMultiPage: boolean;
392
340
  elements: Array<Record<string, unknown>>;
393
341
  };
394
- const isValidComponent =
395
- currentComponent || typeof currentComponent === "object";
396
- const hasGriddoMultiPageProp = JSON.stringify(
397
- currentComponent,
398
- ).includes('"hasGriddoMultiPage":true');
342
+ const isValidComponent = currentComponent || typeof currentComponent === "object";
343
+ const hasGriddoMultiPageProp = JSON.stringify(currentComponent).includes(
344
+ '"hasGriddoMultiPage":true',
345
+ );
399
346
 
400
347
  if (!isValidComponent) {
401
348
  continue;
@@ -445,11 +392,7 @@ function getMultiPageElements(
445
392
  * getPage(3, ["a", "b", "c", "d", "e", "f", "g", "h"], 2)
446
393
  * // -> ["d", "e", "f"]
447
394
  */
448
- function getPage(
449
- itemsPerPage: number,
450
- items: Array<Fields.QueriedDataItem>,
451
- page: number,
452
- ) {
395
+ function getPage(itemsPerPage: number, items: Array<Fields.QueriedDataItem>, page: number) {
453
396
  return items?.slice(itemsPerPage * (page - 1), itemsPerPage * page);
454
397
  }
455
398
 
@@ -463,16 +406,11 @@ function getPage(
463
406
  * getPageCluster(3, ["a", "b", "c", "d", "e", "f", "g", "h"])
464
407
  * // -> [["a", "b", "c"], ["d", "e", "f"], ["g", "h"]]
465
408
  */
466
- function getPageCluster(
467
- itemsPerPage: number,
468
- items: Array<Fields.QueriedDataItem>,
469
- ) {
409
+ function getPageCluster(itemsPerPage: number, items: Array<Fields.QueriedDataItem>) {
470
410
  const totalPagesCount = Math.ceil(items.length / itemsPerPage) || 1;
471
411
  const pageNumbers = Array.from({ length: totalPagesCount }, (_, i) => i + 1);
472
412
 
473
- return pageNumbers?.map((pageNumber) =>
474
- getPage(itemsPerPage, items, pageNumber),
475
- );
413
+ return pageNumbers?.map((pageNumber) => getPage(itemsPerPage, items, pageNumber));
476
414
  }
477
415
 
478
416
  /**
@@ -482,8 +420,7 @@ function getPageCluster(
482
420
  */
483
421
  function getPaginatedPages(listTemplate: TemplateWithReferenceField) {
484
422
  const items = listTemplate.queriedItems || [];
485
- const itemsPerPage =
486
- listTemplate?.itemsPerPage || DEFAULT_ITEMS_PER_PAGE_FOR_LIST_TEMPLATES;
423
+ const itemsPerPage = listTemplate?.itemsPerPage || DEFAULT_ITEMS_PER_PAGE_FOR_LIST_TEMPLATES;
487
424
  const pageClusters = getPageCluster(itemsPerPage, items);
488
425
 
489
426
  return pageClusters;
@@ -524,9 +461,7 @@ function addPageNumberToUrl(
524
461
  return removeDuplicateTrailing(`${url}${endingSlash}`);
525
462
  }
526
463
 
527
- return removeDuplicateTrailing(
528
- `${url}${trailingSlash}${pageNumber}${endingSlash}`,
529
- );
464
+ return removeDuplicateTrailing(`${url}${trailingSlash}${pageNumber}${endingSlash}`);
530
465
  }
531
466
 
532
467
  /**
@@ -1,71 +1,170 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
1
+ import type { RenderModeTuple } from "../types/render";
3
2
 
4
- import { envs } from "../constants";
5
- import { throwError } from "../errors";
6
- import { RenderUUIDError } from "../errors/errors-data";
7
- import { apiRegister } from "../registers";
8
- import { insertAlert } from "./alerts";
9
- import { getConfig } from "./core-utils";
10
- import { debugLog } from "./loggin";
3
+ import { execSync } from "node:child_process";
4
+ import fsp from "node:fs/promises";
5
+ import path from "node:path";
11
6
 
12
- const config = getConfig();
7
+ import { RenderUUIDError } from "../constants/errors";
8
+ import { readDB, writeDB } from "../services/db";
9
+ import { RENDER_MODE } from "../types/render";
10
+ import { throwError } from "./errors";
11
+ import { pathExists } from "./folders";
13
12
 
14
13
  /**
15
14
  * Creates a sentinel file with the current date and time.
16
15
  * This file is used to track later if node_modules/@griddo/cx was cleaned by a
17
- * npm install from a deploy.
16
+ * npm install coming from a deploy.
18
17
  */
19
- function createSentinelRenderFile() {
20
- const { __cx } = config.paths();
21
- const renderSentinelFile = path.join(__cx, ".render-sentinel");
22
- fs.writeFileSync(renderSentinelFile, new Date().toISOString());
18
+ async function markRenderAsStarted(options: { domain: string; basePath: string }) {
19
+ const { domain } = options;
20
+
21
+ const db = await readDB();
22
+ db.domains[domain].isRendering = true;
23
+ await writeDB(db);
24
+
25
+ // Creamos un archivo centinela, si al terminar el render este archivo no
26
+ // existe es que ha habido un deploy por medio y hay que invalidar el render
27
+ const { __ssg } = await getRenderPathsFromDB();
28
+
29
+ const renderSentinelFile = path.join(__ssg, ".render-sentinel");
30
+ await fsp.writeFile(renderSentinelFile, new Date().toISOString());
23
31
  }
24
32
 
25
- function deleteSentinelRenderFile() {
26
- const { __cx } = config.paths();
27
- const renderSentinelFile = path.join(__cx, ".render-sentinel");
28
- fs.unlinkSync(renderSentinelFile);
33
+ async function markRenderAsCompleted(domain: string) {
34
+ const db = await readDB();
35
+ db.domains[domain].isRendering = false;
36
+ // db.domains[domain].renderMode = undefined;
37
+ // db.domains[domain].shouldBeRendered = false;
38
+ await writeDB(db);
39
+
40
+ // Borramos finalmente el archivo centinela
41
+ const { __ssg } = await getRenderPathsFromDB();
42
+ const renderSentinelFile = path.join(__ssg, ".render-sentinel");
43
+ await fsp.unlink(renderSentinelFile);
29
44
  }
30
45
 
31
- function isValidRender() {
32
- const { __cx } = config.paths();
33
- const renderSentinelFile = path.join(__cx, ".render-sentinel");
34
- if (!fs.existsSync(renderSentinelFile)) {
46
+ async function assertRenderIsValid() {
47
+ // Comprobamos que .render-sentinel exista, si no es que un deploy lo borro
48
+ // y hay que invalidar el render.
49
+ const { __ssg } = await getRenderPathsFromDB();
50
+ const renderSentinelFile = path.join(__ssg, ".render-sentinel");
51
+ if (!(await pathExists(renderSentinelFile))) {
35
52
  throwError(RenderUUIDError);
36
53
  }
37
54
  }
38
55
 
39
- /**
40
- * Send the default registers through Griddo alerts.
41
- */
42
- async function sendGriddoDefaultAlerts() {
43
- if (envs.GRIDDO_ALERT_FEATURE) {
44
- const registerContent = apiRegister.get("API_RESPONSE_TOO_BIG");
56
+ // @todo add more messages...
57
+ async function resolveDomainRenderMode(options: { domain: string; shouldBeRendered: boolean }) {
58
+ const { domain, shouldBeRendered } = options;
59
+ const { __cache, __exports } = await getRenderPathsFromDB({ domain });
60
+
61
+ // missing exports
62
+ const missingExports = !(await pathExists(path.join(__exports)));
63
+ // render with errors
64
+ const db = await readDB();
65
+ const wasRenderWithError = db.domains[domain]?.isRendering;
66
+ // new deploy or machine
67
+ const isNewDeploy = await hasNewCommit(__cache);
68
+
69
+ if (missingExports) {
70
+ console.log("[!] From Scratch due to missing exports (first render)");
71
+ return {
72
+ renderMode: RENDER_MODE.FROM_SCRATCH,
73
+ reason: "Missing exports directory",
74
+ };
75
+ }
76
+
77
+ if (wasRenderWithError) {
78
+ console.log("[!] From Scratch due to a previous render error");
79
+ return {
80
+ renderMode: RENDER_MODE.FROM_SCRATCH,
81
+ reason: "error in previous render",
82
+ };
83
+ }
84
+
85
+ if (isNewDeploy) {
86
+ console.log("[!] From Scratch due to a changes in the repo (commit hash)");
87
+ return { renderMode: RENDER_MODE.FROM_SCRATCH, reason: "new commit hash" };
88
+ }
89
+
90
+ if (!shouldBeRendered) {
91
+ console.log(`Skipping render for domain ${domain} as it is not marked for rendering (IDLE).`);
92
+ return { renderMode: RENDER_MODE.IDLE, reason: "" };
93
+ }
45
94
 
46
- if (registerContent.entries.length < 1) {
47
- return;
95
+ return { renderMode: RENDER_MODE.INCREMENTAL, reason: "" };
96
+ }
97
+
98
+ async function hasNewCommit(basePath: string): Promise<boolean> {
99
+ const commitFile = path.join(basePath, "commit");
100
+ const currentCommit = execSync("git rev-parse HEAD").toString().trim();
101
+
102
+ if (await pathExists(commitFile)) {
103
+ const savedCommit = (await fsp.readFile(commitFile, "utf-8")).trim();
104
+ if (savedCommit === currentCommit) {
105
+ return false; // No hay nuevo commit
48
106
  }
49
107
 
50
- debugLog("\nRender register report\n");
51
- debugLog(registerContent);
52
- debugLog();
53
-
54
- await insertAlert({
55
- description: `API response size is too large (${envs.GRIDDO_API_MAX_RESPONSE_SIZE}KB).`,
56
- area: "Griddo",
57
- level: "W",
58
- fullData: {
59
- output: registerContent,
60
- date: new Date().toISOString(),
61
- },
62
- });
108
+ return true;
63
109
  }
110
+
111
+ return true;
112
+ }
113
+
114
+ async function updateCommitFile(options: { basePath: string }) {
115
+ const { basePath } = options;
116
+ const currentCommit = execSync("git rev-parse HEAD").toString().trim();
117
+ await fsp.writeFile(path.join(basePath, "commit"), currentCommit);
118
+ }
119
+
120
+ async function getRenderMode(domain: string): Promise<RenderModeTuple> {
121
+ const db = await readDB();
122
+
123
+ if (!db.domains[domain].renderMode) {
124
+ throw new Error(`Render mode not found for domain ${domain}`);
125
+ }
126
+
127
+ return {
128
+ renderMode: db.domains[domain].renderMode,
129
+ reason: db.domains[domain].renderModeReason,
130
+ };
131
+ }
132
+
133
+ async function getRenderPathsFromDB(options?: { domain?: string; dbFilePath?: string }) {
134
+ const { domain, dbFilePath } = options || {};
135
+
136
+ const db = await readDB(dbFilePath);
137
+ const paths = db.paths;
138
+
139
+ return {
140
+ __root: paths.root,
141
+ __cache: path.join(paths.cxCache, domain || ""),
142
+ __components: paths.components,
143
+ __cx: paths.cx,
144
+ __sites: paths.exportsDir,
145
+ __exports: path.join(paths.exportsDir, domain || ""),
146
+ __ssg: paths.ssg,
147
+ __exports_dist: path.join(paths.exportsDir, domain || "", "dist"),
148
+ __cx_dist: path.join(paths.cx, "dist"),
149
+ };
150
+ }
151
+
152
+ async function getRenderMetadataFromDB() {
153
+ const db = await readDB();
154
+ return {
155
+ proDomain: db.proDomain,
156
+ griddoVersion: db.griddoVersion,
157
+ buildReportFileName: db.buildReportFileName,
158
+ };
64
159
  }
65
160
 
66
161
  export {
67
- createSentinelRenderFile,
68
- deleteSentinelRenderFile,
69
- isValidRender,
70
- sendGriddoDefaultAlerts,
162
+ assertRenderIsValid,
163
+ getRenderMetadataFromDB,
164
+ getRenderMode,
165
+ getRenderPathsFromDB,
166
+ markRenderAsCompleted,
167
+ markRenderAsStarted,
168
+ resolveDomainRenderMode,
169
+ updateCommitFile,
71
170
  };