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