@griddo/cx 11.7.5 → 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,14 +1,16 @@
1
1
  import type { Site, SiteData } from "../types/sites";
2
2
 
3
+ import fsp from "node:fs/promises";
3
4
  import path from "node:path";
4
5
 
5
- import fs from "fs-extra";
6
6
  import { parse } from "js2xmlparser";
7
7
 
8
- import { envs } from "../constants";
9
- import { getConfig } from "./core-utils";
10
- import { buildLog, verboseLog } from "./loggin";
11
- import { getBuildMetadata } from "./store";
8
+ import {
9
+ GRIDDO_API_URL,
10
+ GRIDDO_RENDER_ALL_SITES,
11
+ GRIDDO_RENDER_PAGES,
12
+ GRIDDO_RENDER_SITE,
13
+ } from "../constants/envs";
12
14
  import { AuthService } from "../services/auth";
13
15
  import {
14
16
  endSiteRender,
@@ -19,31 +21,28 @@ import {
19
21
  getSiteSocials,
20
22
  startSiteRender,
21
23
  } from "../services/sites";
22
-
23
- const config = getConfig();
24
+ import { pathExists } from "./folders";
25
+ import { verboseLog } from "./loggin";
26
+ import { getRenderMetadataFromDB, getRenderPathsFromDB } from "./render";
27
+ import { getBuildMetadata } from "./store";
24
28
 
25
29
  /**
26
30
  * Check the instance sites and returns site prepared to be published and unpublished.
27
31
  */
28
32
  async function getSitesToRender(domain: string) {
29
- console.info(`API URL ${envs.GRIDDO_API_URL as string}`);
33
+ console.info(`API URL ${GRIDDO_API_URL as string}`);
30
34
 
31
35
  // Login to API
32
- await AuthService.login();
36
+ // await AuthService.login();
33
37
 
34
38
  // Get all sites. An array of Site
35
39
  const allSites = await getAllSites(domain);
36
40
 
37
41
  // Filter the array of sites to get only the ones to build/render
38
- const validSites = envs.GRIDDO_RENDER_ALL_SITES
39
- ? allSites.filter(
40
- (site) =>
41
- !envs.GRIDDO_RENDER_SITE || site.id === envs.GRIDDO_RENDER_SITE,
42
- )
42
+ const validSites = GRIDDO_RENDER_ALL_SITES
43
+ ? allSites.filter((site) => !GRIDDO_RENDER_SITE || site.id === GRIDDO_RENDER_SITE)
43
44
  : allSites.filter((site) =>
44
- envs.GRIDDO_RENDER_SITE
45
- ? site.id === envs.GRIDDO_RENDER_SITE
46
- : !!site.shouldBeUpdated,
45
+ GRIDDO_RENDER_SITE ? site.id === GRIDDO_RENDER_SITE : !!site.shouldBeUpdated,
47
46
  );
48
47
 
49
48
  // If there are valid sites...
@@ -58,8 +57,7 @@ async function getSitesToRender(domain: string) {
58
57
  site.domains = items
59
58
  .filter(
60
59
  (item) =>
61
- item.domain &&
62
- (item.domain.slug === domain || item.domain.slug === `/${domain}`),
60
+ item.domain && (item.domain.slug === domain || item.domain.slug === `/${domain}`),
63
61
  )
64
62
  .map((item) => ({ [item.id]: `${item.domain.slug}${item.path}` }));
65
63
  }
@@ -67,15 +65,11 @@ async function getSitesToRender(domain: string) {
67
65
 
68
66
  // Save sites object to publish
69
67
  const sitesToPublish = validSites.filter((site) =>
70
- envs.GRIDDO_RENDER_SITE
71
- ? site.id === envs.GRIDDO_RENDER_SITE
72
- : !!site.isPublished,
68
+ GRIDDO_RENDER_SITE ? site.id === GRIDDO_RENDER_SITE : !!site.isPublished,
73
69
  );
74
70
 
75
71
  // Save sites object to unpublish
76
- const sitesToUnpublish = validSites.filter(
77
- (site) => !site.isPublished && site.shouldBeUpdated,
78
- );
72
+ const sitesToUnpublish = validSites.filter((site) => !site.isPublished && site.shouldBeUpdated);
79
73
 
80
74
  return {
81
75
  sitesToPublish,
@@ -90,7 +84,7 @@ async function getSitesToRender(domain: string) {
90
84
  * @see https://griddoio.notion.site/Sites-d7bb0b7cb8d24894a5337e1139fc3d09#2019d3255bda4d219c7e19cf28d0c4fe
91
85
  */
92
86
  async function unpublishSites(sites: Array<Site>) {
93
- const { __cx } = config.paths();
87
+ const { __cx } = await getRenderPathsFromDB();
94
88
 
95
89
  for (const site of sites) {
96
90
  // API
@@ -107,7 +101,8 @@ async function unpublishSites(sites: Array<Site>) {
107
101
 
108
102
  // STORE
109
103
  // Remove site directory from the Store
110
- fs.rmSync(path.join(__cx, "store", site.id.toString()), {
104
+ // @todo: quitar. Como ya no hay persistenci de store, esto debería eliminarse de forma segura.
105
+ await fsp.rm(path.join(__cx, "store", site.id.toString()), {
111
106
  force: true,
112
107
  recursive: true,
113
108
  });
@@ -130,8 +125,8 @@ async function getSiteData(siteID: number) {
130
125
 
131
126
  const { siteHash, unpublishHashes, publishIds } = buildData;
132
127
  const { headers, footers } = siteInfo;
133
- const validPagesIds = envs.GRIDDO_RENDER_PAGES.length
134
- ? envs.GRIDDO_RENDER_PAGES.filter((item) => publishIds.includes(item))
128
+ const validPagesIds = GRIDDO_RENDER_PAGES.length
129
+ ? GRIDDO_RENDER_PAGES.filter((item) => publishIds.includes(item))
135
130
  : publishIds;
136
131
 
137
132
  const siteData: SiteData = {
@@ -152,15 +147,13 @@ async function getSiteData(siteID: number) {
152
147
  /**
153
148
  * Save a file with the end of build process to use as `build-end` signal.
154
149
  */
155
- async function generateBuildReport() {
156
- const { __cx } = config.paths();
157
- const { buildReportFileName } = config;
158
-
159
- const { buildProcessData } = await getBuildMetadata();
160
-
161
- // Get the token
150
+ async function generateBuildReport(domain: string) {
162
151
  const authControl = await AuthService.login();
163
152
 
153
+ const { __cx } = await getRenderPathsFromDB();
154
+ const { buildReportFileName } = await getRenderMetadataFromDB();
155
+ const { buildProcessData } = await getBuildMetadata(domain);
156
+
164
157
  const buildSitesInfo = Object.keys(buildProcessData).map((siteID) => ({
165
158
  ...buildProcessData[siteID],
166
159
  siteId: Number.parseInt(siteID),
@@ -172,51 +165,54 @@ async function generateBuildReport() {
172
165
  };
173
166
 
174
167
  const reportFilePath = path.join(__cx, "dist", buildReportFileName);
175
- fs.writeFileSync(reportFilePath, JSON.stringify(report));
176
168
 
177
- verboseLog(`build report saved in ${reportFilePath}`);
169
+ await fsp.writeFile(reportFilePath, JSON.stringify(report));
178
170
 
179
- buildLog(`Build report saved for ${buildSitesInfo.length} site(s)`);
171
+ verboseLog(`build report saved in ${reportFilePath}`);
180
172
  }
181
173
 
182
174
  /**
183
175
  * Generate sitemaps and save them into file system.
184
176
  */
185
- async function generateSitemaps() {
186
- const { sitesToPublish } = await getBuildMetadata();
187
- const { __cx } = config.paths();
177
+ async function generateSitemaps(domain: string) {
178
+ const { __cx } = await getRenderPathsFromDB();
179
+ const { sitesToPublish } = await getBuildMetadata(domain);
188
180
  const distDir = path.join(__cx, "dist");
189
-
190
181
  const templateSitemapPrefix = "sitemap-";
191
182
 
192
183
  const isGriddoSitemapFile = (file: string) =>
193
- file === "sitemap.xml" ||
194
- (file.startsWith(templateSitemapPrefix) && file.endsWith(".xml"));
184
+ file === "sitemap.xml" || (file.startsWith(templateSitemapPrefix) && file.endsWith(".xml"));
195
185
 
196
186
  for (const site of sitesToPublish) {
197
187
  const { id, languages } = site;
198
188
 
199
189
  for (const lang of languages) {
200
- if (AuthService.headers) {
201
- AuthService.headers.lang = lang.id.toString();
202
- }
190
+ // Local copy of headers to avoid mutating the shared object
191
+ const localHeaders: Record<string, string> = AuthService.headers
192
+ ? { ...AuthService.headers }
193
+ : {};
194
+ localHeaders.lang = lang.id.toString();
203
195
 
204
- const response = await getSitemap(id);
196
+ const response = await getSitemap({ siteId: id, headers: localHeaders });
205
197
 
206
- if (!response) continue;
198
+ if (!response) {
199
+ continue;
200
+ }
207
201
 
208
- const {
209
- items: sitemapPagesGroup,
210
- url: { home, domain },
211
- } = response;
202
+ const { items: sitemapPagesGroup, url } = response;
203
+ const { home, domain } = url;
212
204
 
213
- if (!home) continue;
205
+ if (!home) {
206
+ continue;
207
+ }
214
208
 
215
209
  const domainLanguage = site.domains.find(
216
210
  (domain) => Object.keys(domain)[0] === lang.id.toString(),
217
211
  );
218
212
 
219
- if (!domainLanguage) continue;
213
+ if (!domainLanguage) {
214
+ continue;
215
+ }
220
216
 
221
217
  const slug = Object.values(domainLanguage)[0];
222
218
  const sitemaps: Array<string> = [];
@@ -224,16 +220,16 @@ async function generateSitemaps() {
224
220
  const sitemapBasePath = path.join(distDir, slug.replace(domain, ""));
225
221
 
226
222
  /** delete every griddo sitemap file before create the new ones */
227
- if (fs.existsSync(sitemapBasePath)) {
223
+ if (await pathExists(sitemapBasePath)) {
228
224
  try {
229
- const files = fs.readdirSync(sitemapBasePath);
225
+ const files = await fsp.readdir(sitemapBasePath);
230
226
  for (const file of files) {
231
227
  if (isGriddoSitemapFile(file)) {
232
228
  const filePath = path.join(sitemapBasePath, file);
233
229
  try {
234
- fs.unlinkSync(filePath);
230
+ await fsp.rm(filePath);
235
231
  } catch (err) {
236
- console.error(`Error removing ${filePath}:`, err);
232
+ console.error(`Error deleting file ${filePath}:`, err);
237
233
  }
238
234
  }
239
235
  }
@@ -245,7 +241,9 @@ async function generateSitemaps() {
245
241
  for (const templateId of sitemapPageGroupKeys) {
246
242
  const sitemapPages = sitemapPagesGroup[templateId];
247
243
 
248
- if (!sitemapPages.length) continue;
244
+ if (!sitemapPages.length) {
245
+ continue;
246
+ }
249
247
 
250
248
  const siteMap = parse("urlset", {
251
249
  "@": {
@@ -260,11 +258,9 @@ async function generateSitemaps() {
260
258
  const sitemapName = `/${templateSitemapPrefix}${templateId.toLowerCase()}.xml`;
261
259
  const exactPath = path.join(sitemapBasePath, sitemapName);
262
260
 
263
- saveFile(exactPath, siteMap);
261
+ await saveFile(exactPath, siteMap);
264
262
 
265
- sitemaps.push(
266
- `${home.endsWith("/") ? home.slice(0, -1) : home}${sitemapName}`,
267
- );
263
+ sitemaps.push(`${home.endsWith("/") ? home.slice(0, -1) : home}${sitemapName}`);
268
264
  }
269
265
 
270
266
  if (!sitemaps.length) {
@@ -278,7 +274,7 @@ async function generateSitemaps() {
278
274
 
279
275
  const exactPath = path.join(sitemapBasePath, "sitemap.xml");
280
276
 
281
- saveFile(exactPath, siteMap);
277
+ await saveFile(exactPath, siteMap);
282
278
  verboseLog(`sitemap generated in ${exactPath}`);
283
279
  }
284
280
  }
@@ -290,23 +286,17 @@ async function generateSitemaps() {
290
286
  * @param filePath The path of the file to save the content to.
291
287
  * @param content The content to save to the file.
292
288
  */
293
- function saveFile(filePath: string, content: string) {
289
+ async function saveFile(filePath: string, content: string) {
294
290
  try {
295
291
  const pathName = path.dirname(filePath);
296
- if (!fs.existsSync(pathName)) {
297
- fs.mkdirSync(pathName, { recursive: true });
292
+ if (!(await pathExists(pathName))) {
293
+ await fsp.mkdir(pathName, { recursive: true });
298
294
  }
299
- fs.writeFileSync(filePath, content);
295
+ await fsp.writeFile(filePath, content);
300
296
  } catch (error) {
301
297
  console.log(error);
302
298
  throw new Error(`Error saving a file`);
303
299
  }
304
300
  }
305
301
 
306
- export {
307
- generateBuildReport,
308
- generateSitemaps,
309
- getSiteData,
310
- getSitesToRender,
311
- unpublishSites,
312
- };
302
+ export { generateBuildReport, generateSitemaps, getSiteData, getSitesToRender, unpublishSites };
@@ -3,99 +3,27 @@ import type { RenderInfo } from "../types/global";
3
3
  import type { GriddoPageObject } from "../types/pages";
4
4
  import type { Site } from "../types/sites";
5
5
 
6
- import fs from "node:fs";
6
+ import fsp from "node:fs/promises";
7
7
  import path from "node:path";
8
8
 
9
- import fsx from "fs-extra";
10
-
11
- import { throwError } from "../errors";
12
- import { getConfig, removeProperties, walk, walkStore } from "./core-utils";
9
+ import { WriteToStoreError } from "../constants/errors";
10
+ import { readDB, writeDB } from "../services/db";
11
+ import { removeProperties } from "./core-utils";
12
+ import { throwError } from "./errors";
13
+ import { pathExists } from "./folders";
13
14
  import { verboseLog } from "./loggin";
14
- import { ReadFromStoreError, WriteToStoreError } from "../errors/errors-data";
15
-
16
- const config = getConfig();
17
-
18
- /**
19
- * Read all path pages stored in the `store` Griddo directory and returns the
20
- * absolute file path.
21
- *
22
- * @param domain - The domain to get the pages from.
23
- */
24
- function getBuildPagesFromCachedStore<PageType extends GriddoPageObject>(
25
- domain: string,
26
- ) {
27
- const { __cache } = config.paths(domain);
28
- return getBuildPagesFromStore<PageType>({
29
- basePath: path.join(__cache, "store"),
30
- withSizeProp: false,
31
- });
32
- }
15
+ import { getRenderPathsFromDB } from "./render";
33
16
 
34
17
  /**
35
- * Read all pages stored in the `store` Griddo directory and returns one by one
36
- * with a generator.
37
- *
38
- * @param basePath - Base directory to get pages from.
39
- * @param options.withSizeProp - Add size prop to the page object.
40
- * @todo throw error if the basePath is not an store folder
18
+ * Get the build metadata from the Store.
41
19
  */
42
- function* getBuildPagesFromStore<PageType extends GriddoPageObject>(args?: {
43
- basePath?: string;
44
- withSizeProp?: boolean;
45
- }) {
46
- const { basePath, withSizeProp } = args || {};
47
- const { __cx } = config.paths();
48
- const pagesDirPath = basePath || path.join(__cx, "store");
49
-
50
- const jsonFilePaths = walkStore(pagesDirPath).filter(
51
- (file) => path.extname(file) === ".json",
52
- );
53
-
54
- for (const filePath of jsonFilePaths) {
55
- try {
56
- const page = fsx.readJsonSync(filePath, {
57
- encoding: "utf-8",
58
- }) as PageType;
59
-
60
- if (withSizeProp) {
61
- const fileStats = fs.statSync(filePath);
62
- page.size = fileStats.size / 1024;
63
- }
20
+ async function getBuildMetadata(domain: string): Promise<BuildMetaData> {
21
+ const db = await readDB();
22
+ const { sitesToPublish, createdPages, buildProcessData } = db.domains[domain].renderInfo || {};
64
23
 
65
- // SECURITY: Only returns valid page objects
66
- if (page.path) {
67
- yield page;
68
- }
69
- } catch (error) {
70
- throwError(ReadFromStoreError, error);
71
- }
24
+ if (!sitesToPublish || !createdPages || !buildProcessData) {
25
+ throw new Error("Build metadata not found");
72
26
  }
73
- }
74
-
75
- /**
76
- * Read all pages stored in `store` Griddo directory and return the absolute
77
- * path.
78
- */
79
- function getBuildPagesPath() {
80
- const config = getConfig();
81
- const { __cx } = config.paths();
82
-
83
- const PAGES_DIR = path.join(__cx, "store");
84
- const PAGE_FILES = walk(PAGES_DIR).filter(
85
- (file) => path.extname(file) === ".json",
86
- );
87
-
88
- return PAGE_FILES;
89
- }
90
-
91
- /**
92
- * Get the build metadata from the Store.
93
- */
94
- async function getBuildMetadata(): Promise<BuildMetaData> {
95
- const { __cx } = config.paths();
96
- const { sitesToPublish, createdPages, buildProcessData } = fsx.readJSONSync(
97
- path.join(__cx, "render-metadata.json"),
98
- );
99
27
 
100
28
  return {
101
29
  buildProcessData,
@@ -108,13 +36,11 @@ async function getBuildMetadata(): Promise<BuildMetaData> {
108
36
  * Write render info into a file.
109
37
  * @param renderInfo - Data that will be saved related to the render process.
110
38
  */
111
- function saveRenderInfoInStore(renderInfo: RenderInfo) {
112
- const { __cx } = config.paths();
113
-
114
- fs.writeFileSync(
115
- path.join(__cx, "render-metadata.json"),
116
- JSON.stringify(renderInfo),
117
- );
39
+ async function saveRenderInfoInStore(renderInfo: RenderInfo, domain: string) {
40
+ const db = await readDB();
41
+ db.domains[domain] = db.domains[domain] || {};
42
+ db.domains[domain].renderInfo = renderInfo;
43
+ await writeDB(db);
118
44
  }
119
45
 
120
46
  /**
@@ -133,59 +59,49 @@ function saveRenderInfoInStore(renderInfo: RenderInfo) {
133
59
  // }
134
60
 
135
61
  /**
136
- * Return an array of ids only from `.json` files (no dirs) in the `basePath` dir based in the file name.
62
+ * Return an array of paths only from `.json` files (no dirs) in the `basePath` dir based in the file name.
137
63
  * @param basePath - Absolute path of the dir from which files will be read.
138
64
  * @returns A Array<number> of pages ids in `basePath` dir.
139
65
  */
140
- function getPageInStoreDir(basePath: string): Array<number> {
141
- const filesInStore = fs.readdirSync(basePath);
66
+ async function getPageInStoreDir(basePath: string) {
67
+ const filesInStore = await fsp.readdir(basePath);
68
+
69
+ return filesInStore
70
+ .filter(async (file) => {
71
+ const fullPathFile = `${basePath}/${file}`;
72
+ const stat = await fsp.stat(fullPathFile);
73
+ // Si es un directorio, no lo incluimos.
74
+ if (stat?.isDirectory()) {
75
+ return false;
76
+ }
142
77
 
143
- return (
144
- filesInStore
145
- .filter((file) => {
146
- const fullPathFile = `${basePath}/${file}`;
147
- const stat = fs.statSync(fullPathFile);
148
- // Si es un directorio, no lo incluimos.
149
- if (stat?.isDirectory()) {
150
- return false;
151
- }
152
- // Si es un archivo pero no tiene la extensión `.json`, no lo incluimos
153
- if (path.extname(file) !== ".json") {
154
- return false;
155
- }
156
- // Si es un archivo con el nombre NO pasable a número (NaN), no lo incluimos.
157
- const baseFilename = path.basename(file, path.extname(file));
158
- if (Number.isNaN(Number.parseInt(baseFilename))) {
159
- return false;
160
- }
78
+ // Si es un archivo pero no tiene la extensión `.json`, no lo incluimos
79
+ if (path.extname(file) !== ".json") {
80
+ return false;
81
+ }
161
82
 
162
- // no es dir, es json y con nombre pasable a número, ok :)
163
- return true;
164
- })
165
- // Tenemos solo jsons donde el nombre es un "número": "21345.json"
166
- .map((page) => {
167
- const filename = path.basename(page, path.extname(page));
168
- return Number.parseInt(filename);
169
- })
170
- );
83
+ // no es dir, es json.
84
+ return true;
85
+ })
86
+ .map((page) => {
87
+ return path.join(basePath, page);
88
+ });
171
89
  }
172
90
 
173
91
  /**
174
92
  * Save the pages into the file system.
175
93
  * @param pages - An array of Griddo page objects to be saved.
176
94
  */
177
- function saveSitePagesInStore(
178
- siteDirName: string,
179
- pages: Array<GriddoPageObject>,
180
- ) {
181
- const { __cx } = config.paths();
95
+ async function saveSitePagesInStore(siteDirName: string, pages: Array<GriddoPageObject>) {
96
+ const { __cx } = await getRenderPathsFromDB();
182
97
 
183
98
  try {
184
99
  for (const page of pages) {
185
100
  removeProperties(page, ["editorID", "parentEditorID"]);
186
101
  const filename = `${page.context.page.id}.json`;
187
102
  const filePath = path.join(__cx, "store", siteDirName, filename);
188
- fsx.writeJSONSync(filePath, page);
103
+ // En los listados estáticos y multipage los ids de las páginas son iguales
104
+ await writeUniqueFileSync(filePath, JSON.stringify(page));
189
105
  }
190
106
  } catch (error) {
191
107
  throwError(WriteToStoreError, error);
@@ -203,23 +119,15 @@ function saveSitePagesInStore(
203
119
  * @param siteDirName - The name of the site directory containing the pages.
204
120
  * @param pageIdsArray - A two-dimensional array where each inner array contains numbers representing page files to be removed.
205
121
  */
206
- function removeSitePagesFromStore(
207
- siteDirName: string,
208
- pageIdsArray: Array<Array<number>>,
209
- ) {
210
- const { __cx } = config.paths();
122
+ async function removeSitePagesFromStore(siteDirName: string, pageIdsArray: Array<Array<number>>) {
123
+ const { __cx } = await getRenderPathsFromDB();
211
124
 
212
- const processPageIdsArray = (pageIds: Array<number>) => {
125
+ const processPageIdsArray = async (pageIds: Array<number>) => {
213
126
  for (const filename of pageIds) {
214
- const filePath = path.join(
215
- __cx,
216
- "store",
217
- siteDirName,
218
- `${filename}.json`,
219
- );
127
+ const filePath = path.join(__cx, "store", siteDirName, `${filename}.json`);
220
128
  try {
221
- if (fs.existsSync(filePath)) {
222
- fs.unlinkSync(filePath);
129
+ if (await pathExists(filePath)) {
130
+ await fsp.unlink(filePath);
223
131
  verboseLog(`Removed file: ${filePath}`);
224
132
  }
225
133
  } catch (error) {
@@ -230,7 +138,7 @@ function removeSitePagesFromStore(
230
138
  };
231
139
 
232
140
  for (const pageIds of pageIdsArray) {
233
- processPageIdsArray(pageIds);
141
+ await processPageIdsArray(pageIds);
234
142
  }
235
143
  }
236
144
 
@@ -239,48 +147,33 @@ function removeSitePagesFromStore(
239
147
  * the domain has been changed. This is necessary because those sites will not
240
148
  * be marked as `sitesToUnpublish` so they must be removed manually.
241
149
  */
242
- function removeOrphanSites(sitesToPublish: Array<Site>, domain: string) {
243
- const { __cx } = getConfig().paths(domain);
244
- const currentSitesInStore = fs.readdirSync(path.join(__cx, "store"));
150
+ async function removeOrphanSites(sitesToPublish: Array<Site>, domain: string) {
151
+ const { __cx } = await getRenderPathsFromDB({ domain });
152
+ const storePath = path.join(__cx, "store");
153
+
154
+ if (!(await pathExists(storePath))) {
155
+ return;
156
+ }
157
+
158
+ const currentSitesInStore = await fsp.readdir(storePath);
245
159
  const sitesFromAPI = sitesToPublish.map(({ id }) => `${id}`);
246
- const sitesToDelete = currentSitesInStore.filter(
247
- (site) => !sitesFromAPI.includes(site),
248
- );
160
+ const sitesToDelete = currentSitesInStore.filter((site) => !sitesFromAPI.includes(site));
249
161
 
250
162
  for (const site of sitesToDelete) {
251
- fs.rmSync(path.join(__cx, "store", site), { recursive: true, force: true });
163
+ await fsp.rm(path.join(storePath, site), { recursive: true, force: true });
252
164
  verboseLog(`Removed orphan site id: ${site}`);
253
165
  }
254
166
  }
255
167
 
256
- /**
257
- * Returns the list of `activePages` pages that do not currently exist in a
258
- * site's store (probably due to a failed render).
259
- */
260
- function getMissingPublishedPagesInStore(
261
- siteName: string,
262
- activePages: Array<number>,
263
- ) {
264
- const { __cx } = config.paths();
265
- const pagesInStore = getPageInStoreDir(path.join(__cx, "store", siteName));
266
- const missingActivePages: Array<number> = [];
267
- for (const activePage of activePages) {
268
- if (!pagesInStore.includes(activePage)) {
269
- missingActivePages.push(activePage);
270
- }
271
- }
272
- return missingActivePages;
273
- }
274
-
275
168
  /**
276
169
  * Get pages that are not active anymore but are in the store.
277
170
  */
278
- function getZombiePagesInStore(siteDir: string, activePages: Array<number>) {
279
- const { __cx } = getConfig().paths();
171
+ async function getZombiePagesInStore(siteDir: string, activePages: Array<number>) {
172
+ const { __cx } = await getRenderPathsFromDB();
280
173
  const storeDir = path.join(__cx, "store", siteDir);
281
- const sitePages = fs.readdirSync(storeDir);
174
+ const sitePages = await fsp.readdir(storeDir);
282
175
 
283
- let zombiePages: Array<number> = [];
176
+ const zombiePages: Array<number> = [];
284
177
  for (const pageFileName of sitePages) {
285
178
  const pageFileNameWithoutExtension = pageFileName.split(".")[0];
286
179
  const pageInStore = Number.parseInt(pageFileNameWithoutExtension);
@@ -299,16 +192,30 @@ function getZombiePagesInStore(siteDir: string, activePages: Array<number>) {
299
192
  return zombiePages;
300
193
  }
301
194
 
195
+ async function writeUniqueFileSync(filePath: string, content: string) {
196
+ const dir = path.dirname(filePath);
197
+ const ext = path.extname(filePath);
198
+ const base = path.basename(filePath, ext);
199
+
200
+ let uniquePath = filePath;
201
+ let counter = 1;
202
+
203
+ while (await pathExists(uniquePath)) {
204
+ const newName = `${base}-${counter}${ext}`;
205
+ uniquePath = path.join(dir, newName);
206
+ counter++;
207
+ }
208
+
209
+ await fsp.writeFile(uniquePath, content);
210
+ }
211
+
302
212
  export {
303
213
  getBuildMetadata,
304
- getBuildPagesFromCachedStore,
305
- getBuildPagesFromStore,
306
- getBuildPagesPath,
307
- getMissingPublishedPagesInStore,
308
214
  getPageInStoreDir,
309
215
  getZombiePagesInStore,
310
216
  removeOrphanSites,
311
217
  removeSitePagesFromStore,
312
- saveSitePagesInStore,
313
218
  saveRenderInfoInStore,
219
+ saveSitePagesInStore,
220
+ writeUniqueFileSync,
314
221
  };