@griddo/cx 11.7.6-rc.2 → 11.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 -66
  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 -31
  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 -78
  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 -212
  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 -87
  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 -277
  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
@@ -3,27 +3,99 @@ 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 fsp from "node:fs/promises";
6
+ import fs from "node:fs";
7
7
  import path from "node:path";
8
8
 
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";
9
+ import fsx from "fs-extra";
10
+
11
+ import { throwError } from "../errors";
12
+ import { getConfig, removeProperties, walk, walkStore } from "./core-utils";
14
13
  import { verboseLog } from "./loggin";
15
- import { getRenderPathsFromDB } from "./render";
14
+ import { ReadFromStoreError, WriteToStoreError } from "../errors/errors-data";
15
+
16
+ const config = getConfig();
16
17
 
17
18
  /**
18
- * Get the build metadata from the Store.
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.
19
23
  */
20
- async function getBuildMetadata(domain: string): Promise<BuildMetaData> {
21
- const db = await readDB();
22
- const { sitesToPublish, createdPages, buildProcessData } = db.domains[domain].renderInfo || {};
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
+ }
33
+
34
+ /**
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
41
+ */
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
+ }
23
64
 
24
- if (!sitesToPublish || !createdPages || !buildProcessData) {
25
- throw new Error("Build metadata not found");
65
+ // SECURITY: Only returns valid page objects
66
+ if (page.path) {
67
+ yield page;
68
+ }
69
+ } catch (error) {
70
+ throwError(ReadFromStoreError, error);
71
+ }
26
72
  }
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
+ );
27
99
 
28
100
  return {
29
101
  buildProcessData,
@@ -36,11 +108,13 @@ async function getBuildMetadata(domain: string): Promise<BuildMetaData> {
36
108
  * Write render info into a file.
37
109
  * @param renderInfo - Data that will be saved related to the render process.
38
110
  */
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);
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
+ );
44
118
  }
45
119
 
46
120
  /**
@@ -59,49 +133,59 @@ async function saveRenderInfoInStore(renderInfo: RenderInfo, domain: string) {
59
133
  // }
60
134
 
61
135
  /**
62
- * Return an array of paths only from `.json` files (no dirs) in the `basePath` dir based in the file name.
136
+ * Return an array of ids only from `.json` files (no dirs) in the `basePath` dir based in the file name.
63
137
  * @param basePath - Absolute path of the dir from which files will be read.
64
138
  * @returns A Array<number> of pages ids in `basePath` dir.
65
139
  */
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
- }
140
+ function getPageInStoreDir(basePath: string): Array<number> {
141
+ const filesInStore = fs.readdirSync(basePath);
77
142
 
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
- }
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
+ }
82
161
 
83
- // no es dir, es json.
84
- return true;
85
- })
86
- .map((page) => {
87
- return path.join(basePath, page);
88
- });
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
+ );
89
171
  }
90
172
 
91
173
  /**
92
174
  * Save the pages into the file system.
93
175
  * @param pages - An array of Griddo page objects to be saved.
94
176
  */
95
- async function saveSitePagesInStore(siteDirName: string, pages: Array<GriddoPageObject>) {
96
- const { __root } = await getRenderPathsFromDB();
177
+ function saveSitePagesInStore(
178
+ siteDirName: string,
179
+ pages: Array<GriddoPageObject>,
180
+ ) {
181
+ const { __cx } = config.paths();
97
182
 
98
183
  try {
99
184
  for (const page of pages) {
100
185
  removeProperties(page, ["editorID", "parentEditorID"]);
101
186
  const filename = `${page.context.page.id}.json`;
102
- const filePath = path.join(__root, "store", siteDirName, filename);
103
- // En los listados estáticos y multipage los ids de las páginas son iguales
104
- await writeUniqueFileSync(filePath, JSON.stringify(page));
187
+ const filePath = path.join(__cx, "store", siteDirName, filename);
188
+ fsx.writeJSONSync(filePath, page);
105
189
  }
106
190
  } catch (error) {
107
191
  throwError(WriteToStoreError, error);
@@ -119,15 +203,23 @@ async function saveSitePagesInStore(siteDirName: string, pages: Array<GriddoPage
119
203
  * @param siteDirName - The name of the site directory containing the pages.
120
204
  * @param pageIdsArray - A two-dimensional array where each inner array contains numbers representing page files to be removed.
121
205
  */
122
- async function removeSitePagesFromStore(siteDirName: string, pageIdsArray: Array<Array<number>>) {
123
- const { __root } = await getRenderPathsFromDB();
206
+ function removeSitePagesFromStore(
207
+ siteDirName: string,
208
+ pageIdsArray: Array<Array<number>>,
209
+ ) {
210
+ const { __cx } = config.paths();
124
211
 
125
- const processPageIdsArray = async (pageIds: Array<number>) => {
212
+ const processPageIdsArray = (pageIds: Array<number>) => {
126
213
  for (const filename of pageIds) {
127
- const filePath = path.join(__root, "store", siteDirName, `${filename}.json`);
214
+ const filePath = path.join(
215
+ __cx,
216
+ "store",
217
+ siteDirName,
218
+ `${filename}.json`,
219
+ );
128
220
  try {
129
- if (await pathExists(filePath)) {
130
- await fsp.unlink(filePath);
221
+ if (fs.existsSync(filePath)) {
222
+ fs.unlinkSync(filePath);
131
223
  verboseLog(`Removed file: ${filePath}`);
132
224
  }
133
225
  } catch (error) {
@@ -138,7 +230,7 @@ async function removeSitePagesFromStore(siteDirName: string, pageIdsArray: Array
138
230
  };
139
231
 
140
232
  for (const pageIds of pageIdsArray) {
141
- await processPageIdsArray(pageIds);
233
+ processPageIdsArray(pageIds);
142
234
  }
143
235
  }
144
236
 
@@ -147,33 +239,48 @@ async function removeSitePagesFromStore(siteDirName: string, pageIdsArray: Array
147
239
  * the domain has been changed. This is necessary because those sites will not
148
240
  * be marked as `sitesToUnpublish` so they must be removed manually.
149
241
  */
150
- async function removeOrphanSites(sitesToPublish: Array<Site>, domain: string) {
151
- const { __root } = await getRenderPathsFromDB({ domain });
152
- const storePath = path.join(__root, "store");
153
-
154
- if (!(await pathExists(storePath))) {
155
- return;
156
- }
157
-
158
- const currentSitesInStore = await fsp.readdir(storePath);
242
+ function removeOrphanSites(sitesToPublish: Array<Site>, domain: string) {
243
+ const { __cx } = getConfig().paths(domain);
244
+ const currentSitesInStore = fs.readdirSync(path.join(__cx, "store"));
159
245
  const sitesFromAPI = sitesToPublish.map(({ id }) => `${id}`);
160
- const sitesToDelete = currentSitesInStore.filter((site) => !sitesFromAPI.includes(site));
246
+ const sitesToDelete = currentSitesInStore.filter(
247
+ (site) => !sitesFromAPI.includes(site),
248
+ );
161
249
 
162
250
  for (const site of sitesToDelete) {
163
- await fsp.rm(path.join(storePath, site), { recursive: true, force: true });
251
+ fs.rmSync(path.join(__cx, "store", site), { recursive: true, force: true });
164
252
  verboseLog(`Removed orphan site id: ${site}`);
165
253
  }
166
254
  }
167
255
 
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
+
168
275
  /**
169
276
  * Get pages that are not active anymore but are in the store.
170
277
  */
171
- async function getZombiePagesInStore(siteDir: string, activePages: Array<number>) {
172
- const { __root } = await getRenderPathsFromDB();
173
- const storeDir = path.join(__root, "store", siteDir);
174
- const sitePages = await fsp.readdir(storeDir);
278
+ function getZombiePagesInStore(siteDir: string, activePages: Array<number>) {
279
+ const { __cx } = getConfig().paths();
280
+ const storeDir = path.join(__cx, "store", siteDir);
281
+ const sitePages = fs.readdirSync(storeDir);
175
282
 
176
- const zombiePages: Array<number> = [];
283
+ let zombiePages: Array<number> = [];
177
284
  for (const pageFileName of sitePages) {
178
285
  const pageFileNameWithoutExtension = pageFileName.split(".")[0];
179
286
  const pageInStore = Number.parseInt(pageFileNameWithoutExtension);
@@ -192,30 +299,16 @@ async function getZombiePagesInStore(siteDir: string, activePages: Array<number>
192
299
  return zombiePages;
193
300
  }
194
301
 
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
-
212
302
  export {
213
303
  getBuildMetadata,
304
+ getBuildPagesFromCachedStore,
305
+ getBuildPagesFromStore,
306
+ getBuildPagesPath,
307
+ getMissingPublishedPagesInStore,
214
308
  getPageInStoreDir,
215
309
  getZombiePagesInStore,
216
310
  removeOrphanSites,
217
311
  removeSitePagesFromStore,
218
- saveRenderInfoInStore,
219
312
  saveSitePagesInStore,
220
- writeUniqueFileSync,
313
+ saveRenderInfoInStore,
221
314
  };
@@ -2,6 +2,7 @@ import type { GatsbyBrowser } from "gatsby";
2
2
 
3
3
  import { SessionProvider } from "@griddo/core";
4
4
  import { browser } from "@griddo-instance";
5
+ import * as React from "react";
5
6
 
6
7
  export const disableCorePrefetching = () => {
7
8
  if (browser.disableCorePrefetching) {
@@ -21,7 +22,9 @@ export const onInitialClientRender = () => {
21
22
  }
22
23
  };
23
24
 
24
- export const onPostPrefetchPathname: GatsbyBrowser["onPostPrefetchPathname"] = (props) => {
25
+ export const onPostPrefetchPathname: GatsbyBrowser["onPostPrefetchPathname"] = (
26
+ props,
27
+ ) => {
25
28
  if (browser.onPostPrefetchPathname) {
26
29
  browser.onPostPrefetchPathname(props);
27
30
  }
@@ -33,61 +36,75 @@ export const onPreRouteUpdate: GatsbyBrowser["onPreRouteUpdate"] = (props) => {
33
36
  }
34
37
  };
35
38
 
36
- export const onPrefetchPathname: GatsbyBrowser["onPrefetchPathname"] = (props) => {
39
+ export const onPrefetchPathname: GatsbyBrowser["onPrefetchPathname"] = (
40
+ props,
41
+ ) => {
37
42
  if (browser.onPrefetchPathname) {
38
43
  browser.onPrefetchPathname(props);
39
44
  }
40
45
  };
41
46
 
42
- export const onRouteUpdateDelayed: GatsbyBrowser["onRouteUpdateDelayed"] = (props) => {
47
+ export const onRouteUpdateDelayed: GatsbyBrowser["onRouteUpdateDelayed"] = (
48
+ props,
49
+ ) => {
43
50
  if (browser.onServiceWorkerActive) {
44
51
  browser.onRouteUpdateDelayed(props);
45
52
  }
46
53
  };
47
54
 
48
- export const onServiceWorkerActive: GatsbyBrowser["onServiceWorkerActive"] = (props) => {
55
+ export const onServiceWorkerActive: GatsbyBrowser["onServiceWorkerActive"] = (
56
+ props,
57
+ ) => {
49
58
  if (browser.onServiceWorkerActive) {
50
59
  browser.onServiceWorkerActive(props);
51
60
  }
52
61
  };
53
62
 
54
- export const onServiceWorkerInstalled: GatsbyBrowser["onServiceWorkerInstalled"] = (props) => {
55
- if (browser.onServiceWorkerInstalled) {
56
- browser.onServiceWorkerInstalled(props);
57
- }
58
- };
59
-
60
- export const onServiceWorkerRedundant: GatsbyBrowser["onServiceWorkerRedundant"] = (props) => {
61
- if (browser.onServiceWorkerRedundant) {
62
- browser.onServiceWorkerRedundant(props);
63
- }
64
- };
65
-
66
- export const onServiceWorkerUpdateFound: GatsbyBrowser["onServiceWorkerUpdateFound"] = (props) => {
67
- if (browser.onServiceWorkerUpdateFound) {
68
- browser.onServiceWorkerUpdateFound(props);
69
- }
70
- };
71
-
72
- export const onServiceWorkerUpdateReady: GatsbyBrowser["onServiceWorkerUpdateReady"] = (props) => {
73
- if (browser.onServiceWorkerUpdateReady) {
74
- browser.onServiceWorkerUpdateReady(props);
75
- }
76
- };
77
-
78
- export const registerServiceWorker: GatsbyBrowser["registerServiceWorker"] = () => {
79
- if (browser.registerServiceWorker) {
80
- return browser.registerServiceWorker();
81
- }
82
- };
83
-
84
- export const replaceHydrateFunction: GatsbyBrowser["replaceHydrateFunction"] = () => {
85
- if (browser.replaceHydrateFunction) {
86
- return browser.replaceHydrateFunction();
87
- }
88
- };
89
-
90
- export const shouldUpdateScroll: GatsbyBrowser["shouldUpdateScroll"] = (props) => {
63
+ export const onServiceWorkerInstalled: GatsbyBrowser["onServiceWorkerInstalled"] =
64
+ (props) => {
65
+ if (browser.onServiceWorkerInstalled) {
66
+ browser.onServiceWorkerInstalled(props);
67
+ }
68
+ };
69
+
70
+ export const onServiceWorkerRedundant: GatsbyBrowser["onServiceWorkerRedundant"] =
71
+ (props) => {
72
+ if (browser.onServiceWorkerRedundant) {
73
+ browser.onServiceWorkerRedundant(props);
74
+ }
75
+ };
76
+
77
+ export const onServiceWorkerUpdateFound: GatsbyBrowser["onServiceWorkerUpdateFound"] =
78
+ (props) => {
79
+ if (browser.onServiceWorkerUpdateFound) {
80
+ browser.onServiceWorkerUpdateFound(props);
81
+ }
82
+ };
83
+
84
+ export const onServiceWorkerUpdateReady: GatsbyBrowser["onServiceWorkerUpdateReady"] =
85
+ (props) => {
86
+ if (browser.onServiceWorkerUpdateReady) {
87
+ browser.onServiceWorkerUpdateReady(props);
88
+ }
89
+ };
90
+
91
+ export const registerServiceWorker: GatsbyBrowser["registerServiceWorker"] =
92
+ () => {
93
+ if (browser.registerServiceWorker) {
94
+ return browser.registerServiceWorker();
95
+ }
96
+ };
97
+
98
+ export const replaceHydrateFunction: GatsbyBrowser["replaceHydrateFunction"] =
99
+ () => {
100
+ if (browser.replaceHydrateFunction) {
101
+ return browser.replaceHydrateFunction();
102
+ }
103
+ };
104
+
105
+ export const shouldUpdateScroll: GatsbyBrowser["shouldUpdateScroll"] = (
106
+ props,
107
+ ) => {
91
108
  if (browser.shouldUpdateScroll) {
92
109
  return browser.shouldUpdateScroll(props);
93
110
  }
package/gatsby-config.ts CHANGED
@@ -1,10 +1,13 @@
1
1
  import type { GatsbyConfig } from "gatsby";
2
2
 
3
- import { resolveComponentsPath } from "./exporter/utils/instance";
3
+ import { resolveComponentsPath, verboseLog } from "@griddo/cx";
4
+ import dotenv from "dotenv";
5
+
6
+ dotenv.config();
4
7
 
5
8
  /**
6
9
  * Este process.env.SPAWN_ASSET_PREFIX_WITH_DOMAIN se lee porque
7
- * se ha introducido en el spawnSync del la función gatsbyBuild.
10
+ * se ha introducido en el spawnSync del la función runGatsbyBuildCommand.
8
11
  *
9
12
  * ...
10
13
  * env: Object.assign(process.env, {
@@ -13,15 +16,18 @@ import { resolveComponentsPath } from "./exporter/utils/instance";
13
16
  * NODE_OPTIONS: undefined,
14
17
  * }),
15
18
  *
16
- * @see gatsbyBuild()
19
+ * @see runGatsbyBuildCommand()
17
20
  * @todo quiar el `... || undefined`
18
21
  */
19
- const griddoAssetPrefixWithDomain = process.env.SPAWN_ASSET_PREFIX_WITH_DOMAIN || undefined;
22
+ const griddoAssetPrefixWithDomain =
23
+ process.env.SPAWN_ASSET_PREFIX_WITH_DOMAIN || undefined;
20
24
 
21
- console.log(`set config.assetPrefix=${griddoAssetPrefixWithDomain}`);
25
+ verboseLog(`set config.assetPrefix=${griddoAssetPrefixWithDomain}`);
22
26
 
23
27
  // Gatsby configuration file from client
24
- const { plugins, ...gatsbyConfig } = require(resolveComponentsPath("builder.config.js"));
28
+ const { plugins, ...gatsbyConfig } = require(
29
+ resolveComponentsPath("builder.config.js"),
30
+ );
25
31
 
26
32
  const config: GatsbyConfig = {
27
33
  // Client config
package/gatsby-node.ts CHANGED
@@ -1,38 +1,63 @@
1
- import type { GatsbyNode } from "gatsby";
2
1
  import type { GatsbyPageObject } from "./src/types";
2
+ import type { GatsbyNode } from "gatsby";
3
3
 
4
4
  import path from "node:path";
5
5
 
6
- import { isComponentLibrary } from "./exporter/utils/instance";
7
- import { getBuildPagesFromStore, pageSizeLog } from "./src/gatsby-node-utils";
6
+ import {
7
+ buildLog,
8
+ debugLog,
9
+ envs,
10
+ getBuildPagesFromStore,
11
+ getConfig,
12
+ pageSizeLog,
13
+ verboseLog,
14
+ } from "@griddo/cx";
15
+
16
+ import { gatsbyRegister } from "./exporter/registers";
17
+ import { insertAlert } from "./exporter/utils/alerts";
18
+
19
+ const showGriddoBuildLogs = envs.GRIDDO_BUILD_LOGS;
8
20
 
9
21
  // process.env available through gatsbyBuildCommand.
10
- const showGriddoBuildLogs = JSON.parse(process.env.GRIDDO_BUILD_LOGS || "false");
11
22
  const assetPrefixWithDomain = process.env.SPAWN_ASSET_PREFIX_WITH_DOMAIN;
12
- const needsAssetDomainPrefix = !!assetPrefixWithDomain && assetPrefixWithDomain !== "";
13
- const nodeOptions = process.env.NODE_OPTIONS;
23
+ const sendAlertActive = JSON.parse(process.env.GRIDDO_ALERT_FEATURE || "false");
24
+ const avoidMatchPath = JSON.parse(
25
+ process.env.GRIDDO_EXPERIMENTAL_DO_NOT_USE_MATCH_PATH || "false",
26
+ );
27
+ const useMatchPaths = !avoidMatchPath;
28
+ const needsAssetDomainPrefix =
29
+ !!assetPrefixWithDomain && assetPrefixWithDomain !== "";
14
30
 
15
- const template = path.resolve("./src/components/template.tsx");
16
- const dbFilePath = isComponentLibrary
17
- ? path.resolve(__dirname, "../../..", ".cx-cache", "db.json")
18
- : path.resolve(__dirname, "../..", ".cx-cache", "db.json");
31
+ const { __ssg } = getConfig().paths();
32
+ const template = path.join(__ssg, "src/components/template.tsx");
19
33
 
20
34
  const pages = getBuildPagesFromStore<GatsbyPageObject>({
21
35
  withSizeProp: showGriddoBuildLogs,
22
- dbFilePath,
23
36
  });
24
37
 
25
38
  const createPages: GatsbyNode["createPages"] = async ({ actions }) => {
26
- console.log(`read assetPrefixWithDomain=${assetPrefixWithDomain}`);
27
- console.log(`set needsAssetDomainPrefix=${needsAssetDomainPrefix}`);
28
- console.log(`using NODE_OPTIONS in gatsby-node.ts: ${nodeOptions}`);
39
+ verboseLog(`read assetPrefixWithDomain=${assetPrefixWithDomain}`);
40
+ verboseLog(`set needsAssetDomainPrefix=${needsAssetDomainPrefix}`);
41
+ console.log(
42
+ `using this NODE_OPTIONS in gatsby-node.ts: ${process.env.NODE_OPTIONS}`,
43
+ );
44
+
45
+ if (avoidMatchPath) {
46
+ console.log(`[!] GRIDDO EXPERIMENTAL: Avoiding use of matchPath`);
47
+ }
29
48
 
30
49
  for await (const page of pages) {
31
50
  if (!page) {
32
51
  return;
33
52
  }
34
53
 
54
+ const matchPath =
55
+ needsAssetDomainPrefix && useMatchPaths
56
+ ? page.context.fullPath.compose
57
+ : "";
58
+
35
59
  page.component = template;
60
+ page.matchPath = matchPath;
36
61
 
37
62
  actions.createPage(page);
38
63
 
@@ -40,9 +65,46 @@ const createPages: GatsbyNode["createPages"] = async ({ actions }) => {
40
65
  const id = page.context.id;
41
66
  const size = pageSizeLog(Math.round(page.size || 0));
42
67
 
68
+ if (sendAlertActive && page.size) {
69
+ const pageMaxSizeReached =
70
+ page.size >
71
+ Number.parseInt(process.env.GRIDDO_SSG_MAX_PAGE_SIZE || "524288") /
72
+ 1024;
73
+
74
+ if (pageMaxSizeReached) {
75
+ gatsbyRegister.insert("GATSBY_PAGE_SIZE_TOO_BIG", {
76
+ path: page.path,
77
+ size: `${Math.round(page.size)}KB`,
78
+ });
79
+ }
80
+ }
81
+
43
82
  if (showGriddoBuildLogs) {
44
- console.log(`Creating page ${path} - ${id} - ${size}`);
83
+ buildLog(`Creating page ${path} - ${id} - ${size}`);
84
+ }
85
+ }
86
+
87
+ if (sendAlertActive) {
88
+ const registerContent = gatsbyRegister.get("GATSBY_PAGE_SIZE_TOO_BIG");
89
+
90
+ if (registerContent.entries.length < 1) {
91
+ return;
45
92
  }
93
+
94
+ debugLog("\nRender register report\n");
95
+ debugLog(registerContent);
96
+ debugLog();
97
+
98
+ await insertAlert({
99
+ description: "Render register report",
100
+ area: "Griddo",
101
+ level: "W",
102
+ fullData: {
103
+ output: registerContent,
104
+ date: new Date().toISOString(),
105
+ },
106
+ instantNotification: false,
107
+ });
46
108
  }
47
109
  };
48
110
 
package/gatsby-ssr.tsx CHANGED
@@ -1,9 +1,8 @@
1
1
  import type { GatsbySSR } from "gatsby";
2
2
 
3
- import * as React from "react";
4
-
5
3
  import { SessionProvider } from "@griddo/core";
6
4
  import { ssr } from "@griddo-instance";
5
+ import * as React from "react";
7
6
 
8
7
  export const wrapPageElement: GatsbySSR["wrapPageElement"] = (props) => {
9
8
  if (ssr.wrapPageElement) {