@griddo/cx 11.9.12-rc.0 → 11.9.13

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 (254) hide show
  1. package/README.md +240 -13
  2. package/build/adapters/gatsby/index.d.ts +4 -0
  3. package/build/adapters/gatsby/utils.d.ts +26 -0
  4. package/build/artifacts/index.d.ts +6 -0
  5. package/build/commands/end-render.d.ts +1 -0
  6. package/build/commands/reset-render.d.ts +1 -0
  7. package/build/commands/start-render.d.ts +1 -0
  8. package/build/commands/upload-search-content.d.ts +1 -0
  9. package/build/constants/envs.d.ts +37 -0
  10. package/build/constants/index.d.ts +57 -0
  11. package/build/end-render.js +74 -0
  12. package/build/end-render.js.map +7 -0
  13. package/build/{shared/errors.d.ts → errors/errors-data.d.ts} +3 -5
  14. package/build/errors/index.d.ts +15 -0
  15. package/build/index.d.ts +29 -10
  16. package/build/index.js +73 -406
  17. package/build/index.js.map +7 -0
  18. package/build/prepare-domains-render.js +73 -0
  19. package/build/prepare-domains-render.js.map +7 -0
  20. package/build/react/Favicon/index.d.ts +5 -0
  21. package/build/react/GriddoIntegrations/index.d.ts +4 -3
  22. package/build/react/GriddoIntegrations/utils.d.ts +6 -7
  23. package/build/react/index.d.ts +2 -3
  24. package/build/react/index.js +3 -1
  25. package/build/registers/api.d.ts +9 -0
  26. package/build/registers/gatsby.d.ts +9 -0
  27. package/build/registers/index.d.ts +3 -0
  28. package/build/reset-render.js +74 -0
  29. package/build/reset-render.js.map +7 -0
  30. package/build/services/auth.d.ts +5 -2
  31. package/build/services/domains.d.ts +4 -3
  32. package/build/services/navigation.d.ts +16 -16
  33. package/build/services/reference-fields.d.ts +3 -3
  34. package/build/services/register.d.ts +36 -0
  35. package/build/services/robots.d.ts +19 -2
  36. package/build/services/settings.d.ts +4 -0
  37. package/build/services/sites.d.ts +5 -8
  38. package/build/services/store.d.ts +1 -10
  39. package/build/start-render.js +100 -0
  40. package/build/start-render.js.map +7 -0
  41. package/build/{shared/types → types}/api.d.ts +18 -18
  42. package/build/{shared/types → types}/global.d.ts +16 -15
  43. package/build/{shared/types → types}/navigation.d.ts +5 -5
  44. package/build/{shared/types → types}/pages.d.ts +9 -9
  45. package/build/{shared/types → types}/sites.d.ts +19 -18
  46. package/build/upload-search-content.js +74 -0
  47. package/build/upload-search-content.js.map +7 -0
  48. package/build/utils/alerts.d.ts +3 -0
  49. package/build/{services → utils}/api.d.ts +1 -1
  50. package/build/utils/cache.d.ts +35 -0
  51. package/build/utils/core-utils.d.ts +107 -0
  52. package/build/utils/create-build-data.d.ts +8 -0
  53. package/build/utils/domains.d.ts +13 -0
  54. package/build/utils/folders.d.ts +53 -0
  55. package/build/{core/check-env-health.d.ts → utils/health-checks.d.ts} +2 -4
  56. package/build/utils/loggin.d.ts +51 -0
  57. package/build/{services → utils}/pages.d.ts +3 -3
  58. package/build/utils/render.d.ts +13 -0
  59. package/build/utils/searches.d.ts +15 -0
  60. package/build/utils/sites.d.ts +31 -0
  61. package/build/utils/store.d.ts +81 -0
  62. package/cx.config.d.ts +5 -0
  63. package/cx.config.js +36 -0
  64. package/exporter/adapters/gatsby/index.ts +182 -0
  65. package/exporter/adapters/gatsby/utils.ts +186 -0
  66. package/exporter/artifacts/README.md +34 -0
  67. package/exporter/artifacts/index.ts +33 -0
  68. package/exporter/build.sh +24 -16
  69. package/exporter/commands/end-render.ts +86 -65
  70. package/exporter/commands/move-assets.ts +11 -0
  71. package/exporter/commands/prepare-domains-render.ts +35 -132
  72. package/exporter/commands/reset-render.ts +8 -13
  73. package/exporter/commands/start-render.ts +64 -26
  74. package/exporter/commands/upload-search-content.ts +26 -204
  75. package/exporter/{shared → constants}/endpoints.ts +11 -12
  76. package/exporter/constants/envs.ts +94 -0
  77. package/exporter/constants/index.ts +129 -0
  78. package/exporter/{shared/errors.ts → errors/errors-data.ts} +14 -24
  79. package/exporter/errors/index.ts +40 -0
  80. package/exporter/index.ts +56 -14
  81. package/exporter/react/{GriddoFavicon → Favicon}/index.tsx +9 -3
  82. package/exporter/react/GriddoIntegrations/index.tsx +23 -17
  83. package/exporter/react/GriddoIntegrations/utils.ts +12 -24
  84. package/exporter/react/index.tsx +9 -3
  85. package/exporter/registers/api.ts +14 -0
  86. package/exporter/registers/gatsby.ts +14 -0
  87. package/exporter/registers/index.ts +4 -0
  88. package/exporter/services/auth.ts +10 -8
  89. package/exporter/services/domains.ts +8 -23
  90. package/exporter/services/navigation.ts +18 -12
  91. package/exporter/services/reference-fields.ts +32 -14
  92. package/exporter/services/register.ts +113 -0
  93. package/exporter/services/robots.ts +61 -33
  94. package/exporter/services/settings.ts +17 -0
  95. package/exporter/services/sites.ts +28 -40
  96. package/exporter/services/store.ts +321 -354
  97. package/exporter/{shared/types → types}/api.ts +41 -40
  98. package/exporter/{shared/types → types}/global.ts +21 -17
  99. package/exporter/{shared/types → types}/navigation.ts +3 -3
  100. package/exporter/{shared/types → types}/pages.ts +11 -10
  101. package/exporter/{shared/types → types}/sites.ts +19 -18
  102. package/exporter/utils/alerts.ts +29 -0
  103. package/exporter/utils/api.ts +243 -0
  104. package/exporter/utils/cache.ts +142 -0
  105. package/exporter/utils/core-utils.ts +458 -0
  106. package/exporter/utils/create-build-data.ts +17 -0
  107. package/exporter/utils/domains.ts +39 -0
  108. package/exporter/utils/folders.ts +320 -0
  109. package/exporter/utils/health-checks.ts +64 -0
  110. package/exporter/{core → utils}/images.ts +6 -1
  111. package/exporter/{core → utils}/instance.ts +13 -9
  112. package/exporter/utils/loggin.ts +184 -0
  113. package/exporter/{services → utils}/pages.ts +92 -27
  114. package/exporter/utils/render.ts +71 -0
  115. package/exporter/utils/searches.ts +156 -0
  116. package/exporter/utils/sites.ts +312 -0
  117. package/exporter/utils/store.ts +314 -0
  118. package/gatsby-browser.tsx +58 -41
  119. package/gatsby-config.ts +17 -10
  120. package/gatsby-node.ts +79 -20
  121. package/gatsby-ssr.tsx +1 -2
  122. package/package.json +80 -41
  123. package/src/README.md +7 -0
  124. package/src/components/Head.tsx +73 -28
  125. package/src/components/template.tsx +29 -6
  126. package/src/gatsby-node-utils.ts +2 -76
  127. package/src/html.tsx +11 -2
  128. package/src/types.ts +3 -3
  129. package/start-render.js +7 -0
  130. package/tsconfig.json +3 -5
  131. package/build/commands/end-render.js +0 -31
  132. package/build/commands/end-render.js.map +0 -7
  133. package/build/commands/prepare-assets-directory.js +0 -9
  134. package/build/commands/prepare-assets-directory.js.map +0 -7
  135. package/build/commands/prepare-domains-render.js +0 -38
  136. package/build/commands/prepare-domains-render.js.map +0 -7
  137. package/build/commands/reset-render.js +0 -31
  138. package/build/commands/reset-render.js.map +0 -7
  139. package/build/commands/single-domain-upload-search-content.d.ts +0 -1
  140. package/build/commands/start-render.js +0 -66
  141. package/build/commands/start-render.js.map +0 -7
  142. package/build/commands/upload-search-content.js +0 -32
  143. package/build/commands/upload-search-content.js.map +0 -7
  144. package/build/core/GriddoLog.d.ts +0 -16
  145. package/build/core/db-class.d.ts +0 -11
  146. package/build/core/db.d.ts +0 -4
  147. package/build/core/dist-rollback.d.ts +0 -11
  148. package/build/core/errors.d.ts +0 -26
  149. package/build/core/fs.d.ts +0 -69
  150. package/build/core/life-cycle.d.ts +0 -26
  151. package/build/core/logger.d.ts +0 -18
  152. package/build/core/objects.d.ts +0 -11
  153. package/build/core/print-logos.d.ts +0 -5
  154. package/build/react/DynamicScript/index.d.ts +0 -4
  155. package/build/react/GriddoFavicon/index.d.ts +0 -4
  156. package/build/react/GriddoOpenGraph/index.d.ts +0 -10
  157. package/build/services/manage-sites.d.ts +0 -22
  158. package/build/services/manage-store.d.ts +0 -32
  159. package/build/services/render-artifacts.d.ts +0 -6
  160. package/build/services/render.d.ts +0 -70
  161. package/build/services/sitemaps.d.ts +0 -5
  162. package/build/shared/context.d.ts +0 -36
  163. package/build/shared/envs.d.ts +0 -19
  164. package/build/shared/npm-modules/brush.d.ts +0 -18
  165. package/build/shared/npm-modules/find-up-simple.d.ts +0 -34
  166. package/build/shared/npm-modules/pkg-dir.d.ts +0 -7
  167. package/build/shared/npm-modules/xml-parser.d.ts +0 -4
  168. package/build/shared/types/render.d.ts +0 -54
  169. package/build/shared/types.d.ts +0 -15
  170. package/build/ssg-adapters/gatsby/actions/clean.d.ts +0 -3
  171. package/build/ssg-adapters/gatsby/actions/close.d.ts +0 -3
  172. package/build/ssg-adapters/gatsby/actions/data.d.ts +0 -2
  173. package/build/ssg-adapters/gatsby/actions/healthCheck.d.ts +0 -2
  174. package/build/ssg-adapters/gatsby/actions/init.d.ts +0 -2
  175. package/build/ssg-adapters/gatsby/actions/logs.d.ts +0 -3
  176. package/build/ssg-adapters/gatsby/actions/meta.d.ts +0 -2
  177. package/build/ssg-adapters/gatsby/actions/prepare.d.ts +0 -2
  178. package/build/ssg-adapters/gatsby/actions/relocation.d.ts +0 -2
  179. package/build/ssg-adapters/gatsby/actions/restore.d.ts +0 -3
  180. package/build/ssg-adapters/gatsby/actions/ssg.d.ts +0 -3
  181. package/build/ssg-adapters/gatsby/actions/sync.d.ts +0 -3
  182. package/build/ssg-adapters/gatsby/index.d.ts +0 -9
  183. package/build/ssg-adapters/gatsby/shared/artifacts.d.ts +0 -4
  184. package/build/ssg-adapters/gatsby/shared/diff-assets.d.ts +0 -15
  185. package/build/ssg-adapters/gatsby/shared/extract-assets.d.ts +0 -7
  186. package/build/ssg-adapters/gatsby/shared/gatsby-build.d.ts +0 -7
  187. package/build/ssg-adapters/gatsby/shared/render-rollback.d.ts +0 -18
  188. package/build/ssg-adapters/gatsby/shared/sync-render.d.ts +0 -26
  189. package/build/ssg-adapters/gatsby/shared/types.d.ts +0 -34
  190. package/cli.mjs +0 -231
  191. package/exporter/build-esbuild.noop +0 -42
  192. package/exporter/commands/README.md +0 -151
  193. package/exporter/commands/prepare-assets-directory.ts +0 -35
  194. package/exporter/commands/single-domain-upload-search-content.ts +0 -206
  195. package/exporter/core/GriddoLog.ts +0 -45
  196. package/exporter/core/check-env-health.ts +0 -204
  197. package/exporter/core/db-class.ts +0 -54
  198. package/exporter/core/db.ts +0 -33
  199. package/exporter/core/dist-rollback.ts +0 -49
  200. package/exporter/core/errors.ts +0 -93
  201. package/exporter/core/fs.ts +0 -385
  202. package/exporter/core/life-cycle.ts +0 -73
  203. package/exporter/core/logger.ts +0 -141
  204. package/exporter/core/objects.ts +0 -37
  205. package/exporter/core/print-logos.ts +0 -21
  206. package/exporter/react/DynamicScript/index.tsx +0 -33
  207. package/exporter/react/GriddoOpenGraph/index.tsx +0 -39
  208. package/exporter/services/api.ts +0 -306
  209. package/exporter/services/manage-sites.ts +0 -116
  210. package/exporter/services/manage-store.ts +0 -173
  211. package/exporter/services/render-artifacts.ts +0 -44
  212. package/exporter/services/render.ts +0 -229
  213. package/exporter/services/sitemaps.ts +0 -129
  214. package/exporter/shared/context.ts +0 -49
  215. package/exporter/shared/envs.ts +0 -62
  216. package/exporter/shared/npm-modules/README.md +0 -36
  217. package/exporter/shared/npm-modules/brush.ts +0 -34
  218. package/exporter/shared/npm-modules/find-up-simple.ts +0 -100
  219. package/exporter/shared/npm-modules/pkg-dir.ts +0 -17
  220. package/exporter/shared/npm-modules/xml-parser.ts +0 -57
  221. package/exporter/shared/types/render.ts +0 -63
  222. package/exporter/shared/types.ts +0 -15
  223. package/exporter/ssg-adapters/gatsby/actions/clean.ts +0 -26
  224. package/exporter/ssg-adapters/gatsby/actions/close.ts +0 -17
  225. package/exporter/ssg-adapters/gatsby/actions/data.ts +0 -22
  226. package/exporter/ssg-adapters/gatsby/actions/healthCheck.ts +0 -10
  227. package/exporter/ssg-adapters/gatsby/actions/init.ts +0 -12
  228. package/exporter/ssg-adapters/gatsby/actions/logs.ts +0 -10
  229. package/exporter/ssg-adapters/gatsby/actions/meta.ts +0 -13
  230. package/exporter/ssg-adapters/gatsby/actions/prepare.ts +0 -9
  231. package/exporter/ssg-adapters/gatsby/actions/relocation.ts +0 -15
  232. package/exporter/ssg-adapters/gatsby/actions/restore.ts +0 -21
  233. package/exporter/ssg-adapters/gatsby/actions/ssg.ts +0 -12
  234. package/exporter/ssg-adapters/gatsby/actions/sync.ts +0 -65
  235. package/exporter/ssg-adapters/gatsby/index.ts +0 -114
  236. package/exporter/ssg-adapters/gatsby/shared/artifacts.ts +0 -17
  237. package/exporter/ssg-adapters/gatsby/shared/diff-assets.ts +0 -128
  238. package/exporter/ssg-adapters/gatsby/shared/extract-assets.ts +0 -75
  239. package/exporter/ssg-adapters/gatsby/shared/gatsby-build.ts +0 -58
  240. package/exporter/ssg-adapters/gatsby/shared/render-rollback.ts +0 -33
  241. package/exporter/ssg-adapters/gatsby/shared/sync-render.ts +0 -298
  242. package/exporter/ssg-adapters/gatsby/shared/types.ts +0 -35
  243. package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +0 -55
  244. package/plugins/gatsby-plugin-svgr-loader/package.json +0 -8
  245. package/tsconfig.commands.json +0 -36
  246. package/tsconfig.exporter.json +0 -21
  247. /package/build/commands/{prepare-assets-directory.d.ts → move-assets.d.ts} +0 -0
  248. /package/build/{shared → constants}/endpoints.d.ts +0 -0
  249. /package/build/react/{GriddoFavicon → Favicon}/utils.d.ts +0 -0
  250. /package/build/{shared/types → types}/templates.d.ts +0 -0
  251. /package/build/{core → utils}/images.d.ts +0 -0
  252. /package/build/{core → utils}/instance.d.ts +0 -0
  253. /package/exporter/react/{GriddoFavicon → Favicon}/utils.ts +0 -0
  254. /package/exporter/{shared/types → types}/templates.ts +0 -0
@@ -1,75 +0,0 @@
1
- import fsp from "node:fs/promises";
2
- import path from "node:path";
3
-
4
- import { pathExists } from "../../../core/fs";
5
- import { getRenderPathsHydratedWithDomainFromDB } from "../../../services/render";
6
-
7
- /**
8
- * Update the Griddo's `/dist` dir with the contents from `public` dir only
9
- * with files of type: js, json and css.
10
- * TODO: Explicar que el static se copia a assets porque el js va en el subdominio de assets.
11
- */
12
- async function extractAssetsFromDist(domain: string) {
13
- const { __root, __exports } = await getRenderPathsHydratedWithDomainFromDB({ domain });
14
-
15
- // Archivos (no carpetas) válidos de public
16
- const filesFromDist = (await fsp.readdir(path.join(__exports, "dist"))).filter(
17
- (file) =>
18
- path.extname(file) === ".js" ||
19
- path.extname(file) === ".json" ||
20
- path.extname(file) === ".css",
21
- );
22
-
23
- // Creamos assets si es necesario (needsAssetPrefix)
24
- await fsp.mkdir(path.join(__root, "assets"), { recursive: true });
25
- // page-data folder
26
- await fsp.cp(
27
- path.join(__exports, "dist", "page-data"),
28
- path.join(__root, "assets", "page-data"),
29
- {
30
- preserveTimestamps: true,
31
- recursive: true,
32
- },
33
- );
34
- // static folder si existe
35
- if (await pathExists(path.join(__root, "static"))) {
36
- await fsp.cp(path.join(__root, "static"), path.join(__root, "assets"), {
37
- force: false,
38
- preserveTimestamps: true,
39
- recursive: true,
40
- });
41
- }
42
- // dist/static -> assets/static
43
- if (await pathExists(path.join(__exports, "dist", "static"))) {
44
- await fsp.cp(path.join(__exports, "dist", "static"), path.join(__root, "assets", "static"), {
45
- force: false,
46
- preserveTimestamps: true,
47
- recursive: true,
48
- });
49
- }
50
- // otro static...
51
- if (await pathExists(path.join(__root, "static"))) {
52
- await fsp.cp(path.join(__root, "static"), path.join(__exports, "dist", domain), {
53
- preserveTimestamps: true,
54
- recursive: true,
55
- force: false,
56
- });
57
- }
58
-
59
- // Copia el resto de archivos...
60
- // for (const file of filesFromDist) {
61
- // const fileSrc = path.join(__exports, "dist", file);
62
- // const fileDest = path.join(__root, "assets", file);
63
- // await fsp.cp(fileSrc, fileDest, { preserveTimestamps: true, recursive: true });
64
- // }
65
-
66
- const arraysOfPromises: Promise<void>[] = filesFromDist.map((file) => {
67
- const fileSrc = path.join(__exports, "dist", file);
68
- const fileDest = path.join(__root, "assets", file);
69
- return fsp.cp(fileSrc, fileDest, { preserveTimestamps: true, recursive: true });
70
- });
71
-
72
- await Promise.all(arraysOfPromises);
73
- }
74
-
75
- export { extractAssetsFromDist };
@@ -1,58 +0,0 @@
1
- import { spawn } from "node:child_process";
2
- import path from "node:path";
3
-
4
- import { GriddoLog } from "../../../core/GriddoLog";
5
- import { getRenderPathsHydratedWithDomainFromDB } from "../../../services/render";
6
- import { GRIDDO_SSG_VERBOSE_LOGS } from "../../../shared/envs";
7
-
8
- /**
9
- * Spawn a new node process `gatsby build`
10
- * @note This proccess can not access to the custom Griddo `process.env` so it
11
- * needs variables passed to it via the `env` prop.
12
- */
13
- async function gatsbyBuild(assetPrefixWithDomain: string): Promise<void> {
14
- GriddoLog.verbose(`read assetPrefixWithDomain, ${assetPrefixWithDomain}`);
15
- GriddoLog.verbose(`using this NODE_OPTIONS in gatsby command: ${process.env.NODE_OPTIONS}`);
16
-
17
- const { __ssg } = await getRenderPathsHydratedWithDomainFromDB();
18
-
19
- // Remove `--openssl-legacy-provider` from NODE_OPTIONS because this value
20
- // break Gatsby render.
21
- const nodeOptionsWithoutLegacyOpenSSL = process.env.NODE_OPTIONS
22
- ? process.env.NODE_OPTIONS.replace(/--openssl-legacy-provider\s*/g, "").trim()
23
- : "";
24
-
25
- // Ruta al ejecutable de Gatsby
26
- const gatsbyExecutable = path.join(__ssg, "node_modules", ".bin", "gatsby");
27
-
28
- const args = ["build", "--prefix-paths"];
29
- if (GRIDDO_SSG_VERBOSE_LOGS) {
30
- args.push("--verbose");
31
- }
32
-
33
- return new Promise((resolve, reject) => {
34
- const child = spawn(gatsbyExecutable, args, {
35
- cwd: __ssg,
36
- stdio: ["ignore", "inherit", "inherit"],
37
- env: {
38
- ...process.env,
39
- SPAWN_ASSET_PREFIX_WITH_DOMAIN: assetPrefixWithDomain,
40
- NODE_OPTIONS: nodeOptionsWithoutLegacyOpenSSL,
41
- },
42
- });
43
-
44
- child.on("close", (code) => {
45
- if (code === 0) {
46
- resolve();
47
- } else {
48
- reject(new Error(`Gatsby build failed with exit code ${code}`));
49
- }
50
- });
51
-
52
- child.on("error", (error) => {
53
- reject(new Error(`Failed to start Gatsby build process: ${error.message}`));
54
- });
55
- });
56
- }
57
-
58
- export { gatsbyBuild };
@@ -1,33 +0,0 @@
1
- import { readDB, writeDB } from "../../../core/db";
2
- import { GriddoLog } from "../../../core/GriddoLog";
3
-
4
- /**
5
- * Enables the rollback-on-error feature for subsequent render lifecycles.
6
- * When this feature is active, if an error occurs during a render process,
7
- * the application will automatically restore the 'exports' directory to its
8
- * state before the render began. This function updates the configuration
9
- * in the database to reflect this change.
10
- * @async
11
- */
12
- async function enableRollbackOnError() {
13
- const data = await readDB();
14
- data.needsRollbackOnError = true;
15
- await writeDB(data);
16
- GriddoLog.info("Render lifecycles that follow will restore the exports dir on error if needed\n");
17
- }
18
-
19
- /**
20
- * Disables the rollback-on-error feature for subsequent render lifecycles.
21
- * When this feature is inactive, the application will not restore the
22
- * 'exports' directory if a render process fails. This is the default behavior.
23
- * This function updates the configuration in the database.
24
- * @async
25
- */
26
- async function disableRollbackOnError() {
27
- const data = await readDB();
28
- data.needsRollbackOnError = false;
29
- await writeDB(data);
30
- GriddoLog.info("Render lifecycles that follow will not restore the exports dir on error\n");
31
- }
32
-
33
- export { disableRollbackOnError, enableRollbackOnError };
@@ -1,298 +0,0 @@
1
- import fsp from "node:fs/promises";
2
- import path from "node:path";
3
-
4
- import pLimit from "p-limit";
5
-
6
- import { findFilesBySuffix } from "../../../core/fs";
7
- import { GriddoLog } from "../../../core/GriddoLog";
8
- import { GRIDDO_SSG_BUNDLE_ANALYZER } from "../../../shared/envs";
9
- import { getAssetsDiffBetweenRenders, patchHtmlFile } from "./diff-assets";
10
-
11
- interface SyncRenderConfig {
12
- src: string;
13
- dst: string;
14
- pagesToCreate: number[];
15
- pagesToDelete: number[];
16
- artifactsToCopyToExports: string[];
17
- }
18
- interface CopyFilePath {
19
- from: string;
20
- to: string;
21
- }
22
- interface SyncState {
23
- htmlToAdd: CopyFilePath[];
24
- jsonToAdd: CopyFilePath[];
25
- htmlToDelete: string[];
26
- jsonToDelete: string[];
27
- }
28
- interface PageInfo {
29
- id: number;
30
- composePath: string; // p.ej. '/about-us' o '/'
31
- htmlPath: string; // p.ej. '/path/to/public/about-us/index.html'
32
- jsonPath: string; // p.ej. '/path/to/public/page-data/about-us/page-data.json'
33
- }
34
- interface GatsbyPageData {
35
- result: {
36
- pageContext: {
37
- id: number;
38
- fullPath: {
39
- site: string;
40
- domain: string;
41
- domainUrl: string;
42
- language: string;
43
- page: string;
44
- compose: string;
45
- };
46
- };
47
- };
48
- }
49
-
50
- class SyncRender {
51
- private bundleDir: string;
52
- private currentRenderDir: string;
53
- private pagesToCreate: number[];
54
- private pagesToDelete: number[];
55
- private assetArtifacts: string[];
56
-
57
- private state: SyncState = {
58
- htmlToAdd: [],
59
- jsonToAdd: [],
60
- htmlToDelete: [],
61
- jsonToDelete: [],
62
- };
63
-
64
- constructor(config: SyncRenderConfig) {
65
- this.bundleDir = config.dst;
66
- this.currentRenderDir = config.src;
67
- this.pagesToCreate = config.pagesToCreate;
68
- this.pagesToDelete = config.pagesToDelete;
69
- this.assetArtifacts = config.artifactsToCopyToExports;
70
- }
71
-
72
- public async execute() {
73
- await this.setPagesToDelete();
74
- await this.setPagesToAdd();
75
- await this.sync();
76
- if (GRIDDO_SSG_BUNDLE_ANALYZER) {
77
- await this.assertAssetsAreValid();
78
- }
79
- }
80
-
81
- private async assertAssetsAreValid() {
82
- const isDifferent = await getAssetsDiffBetweenRenders(this.currentRenderDir, this.bundleDir);
83
- if (isDifferent) {
84
- GriddoLog.info(
85
- "Warning: JavaScript and CSS bundles must have the same files and content. You can ignore this warning if the rendering process only has pages to unpublish.",
86
- );
87
- } else {
88
- GriddoLog.info("Previous and current JavaScript and CSS packages successfully matched");
89
- }
90
- }
91
-
92
- private async setPagesToDelete() {
93
- // INCLUIMOS LAS PÁGINAS A CREAR EN LAS CANDIDATAS A BORRAR
94
- // =======================================================
95
- // El set de ids incluye tanto las páginas a borrar como las que se van
96
- // a crear para manejar correctamente los cambios de slug.
97
- //
98
- // Ejemplo: Si la página `id=3` tiene slug `about` y después viene con
99
- // `slug=about-us`, necesitamos borrar la página `id=3` del render previo
100
- // y volver a crearla con la nueva ruta.
101
- //
102
- // ¿Por qué? Porque el slug determina dónde se guarda la página:
103
- // - /about/index.html -> /about-us/index.html
104
- //
105
- // Si no la borrásemos previamente, tendríamos ambas páginas:
106
- // `/about/index.html` y `/about-us/index.html`
107
- const candidateIdsToDelete = new Set<number>([...this.pagesToDelete, ...this.pagesToCreate]);
108
- const existingPreviousPages = await this.scanPages(this.bundleDir);
109
-
110
- for (const page of existingPreviousPages) {
111
- if (candidateIdsToDelete.has(page.id)) {
112
- this.state.htmlToDelete.push(page.htmlPath);
113
- this.state.jsonToDelete.push(page.jsonPath);
114
- }
115
- }
116
-
117
- GriddoLog.verbose(`${this.state.htmlToDelete.length} pages HTML to delete`);
118
- GriddoLog.verbose(`${this.state.jsonToDelete.length} pages JSON to delete`);
119
- }
120
-
121
- private async setPagesToAdd() {
122
- const candidateIdsToCreate = new Set<number>(this.pagesToCreate);
123
- const newPages = await this.scanPages(this.currentRenderDir);
124
-
125
- for (const page of newPages) {
126
- if (candidateIdsToCreate.has(page.id)) {
127
- const htmlTo = path.join(this.bundleDir, page.composePath, "index.html");
128
- const normalizedCompose = page.composePath === "/" ? "index" : page.composePath;
129
- const jsonTo = path.join(this.bundleDir, "page-data", normalizedCompose, "page-data.json");
130
-
131
- this.state.htmlToAdd.push({ from: page.htmlPath, to: htmlTo });
132
- this.state.jsonToAdd.push({ from: page.jsonPath, to: jsonTo });
133
- }
134
- }
135
-
136
- GriddoLog.verbose(`${this.state.htmlToAdd.length} pages HTML to create`);
137
- GriddoLog.verbose(`${this.state.jsonToAdd.length} pages JSON to create`);
138
- }
139
-
140
- private async sync() {
141
- // Delete...
142
- const allFilesToDelete = [...this.state.htmlToDelete, ...this.state.jsonToDelete];
143
- for (const file of allFilesToDelete) {
144
- try {
145
- // Usar `force: true` para no fallar si el archivo ya no existe.
146
- await fsp.rm(file, { force: true });
147
- GriddoLog.verbose(`Sync (remove) : ${file}`);
148
- } catch (e) {
149
- // El error solo se registraría si es un problema de permisos, etc.
150
- GriddoLog.error(`Failed to remove ${file}:`, e);
151
- }
152
- }
153
-
154
- await this.restoreWebpackCompilationHash();
155
-
156
- // Copy...
157
- const allFilesToAdd = [...this.state.htmlToAdd, ...this.state.jsonToAdd];
158
- for (const file of allFilesToAdd) {
159
- try {
160
- await fsp.mkdir(path.dirname(file.to), { recursive: true });
161
- await fsp.copyFile(file.from, file.to);
162
- GriddoLog.verbose(`Sync (copy) : ${file.from} -> ${file.to}`);
163
- } catch (e) {
164
- GriddoLog.error(`Failed to copy ${file.from} to ${file.to}:`, e);
165
- }
166
- }
167
-
168
- // AVOID TO RESTORE webpackCompilationHash
169
- // await this.copyAppDataJsonFile();
170
- await this.copyAssetArtifacts();
171
- await this.copySitemaps();
172
- }
173
-
174
- // TODO: Optimizar esto a lo bestia...
175
- private async restoreWebpackCompilationHash() {
176
- const appDataJsonFile = path.join(this.bundleDir, "page-data", "app-data.json");
177
- const webpackCompilationHash = JSON.parse(
178
- await fsp.readFile(appDataJsonFile, "utf8"),
179
- ).webpackCompilationHash;
180
- GriddoLog.build(
181
- `Reading webpackCompilationHash from ${appDataJsonFile} = ${webpackCompilationHash}`,
182
- );
183
-
184
- const changedHtmlFilePaths = this.state.htmlToAdd.map(({ from }) => from);
185
-
186
- for (const htmlFilePath of changedHtmlFilePaths) {
187
- GriddoLog.build(`Patching HTML file ${htmlFilePath} with the new webpackCompilationHash`);
188
- await patchHtmlFile(htmlFilePath, webpackCompilationHash);
189
- }
190
- }
191
-
192
- // private async copyAppDataJsonFile() {
193
- // try {
194
- // const src = path.join(this.currentRenderDir, "page-data", "app-data.json");
195
- // const dst = path.join(this.bundleDir, "page-data", "app-data.json");
196
- // await fsp.copyFile(src, dst);
197
- // GriddoLog.verbose("Copied app-data.json");
198
- // } catch (e) {
199
- // GriddoLog.error("Failed to copy app-data.json:", e);
200
- // }
201
- // }
202
-
203
- private async copyAssetArtifacts() {
204
- for (const assetArtifact of this.assetArtifacts) {
205
- const src = path.join(this.currentRenderDir, assetArtifact);
206
- const dst = path.join(this.bundleDir, assetArtifact);
207
- try {
208
- await fsp.mkdir(path.dirname(dst), { recursive: true });
209
- await fsp.copyFile(src, dst);
210
- GriddoLog.verbose(`Copied artifact: ${assetArtifact}`);
211
- } catch (e) {
212
- GriddoLog.error(`Failed to copy artifact ${src} to ${dst}:`, e);
213
- }
214
- }
215
- }
216
-
217
- private async copySitemaps() {
218
- const renderSrc = path.resolve(this.currentRenderDir);
219
- const renderDst = path.resolve(this.bundleDir);
220
-
221
- // Primero, elimina los sitemaps existentes en el destino
222
- const xmlFilesInDst = findFilesBySuffix(renderDst, ".xml");
223
- for await (const xmlFile of xmlFilesInDst) {
224
- const basename = path.basename(xmlFile);
225
- if (basename.startsWith("sitemap-") || basename === "sitemap.xml") {
226
- await fsp.rm(xmlFile, { force: true });
227
- }
228
- }
229
-
230
- // Segundo, copia los nuevos sitemaps desde el origen
231
- const xmlFilesInSrc = findFilesBySuffix(renderSrc, ".xml");
232
- for await (const src of xmlFilesInSrc) {
233
- // Reconstruye la ruta de destino de forma más robusta
234
- const relativePath = path.relative(renderSrc, src);
235
- const dst = path.join(renderDst, relativePath);
236
-
237
- try {
238
- await fsp.mkdir(path.dirname(dst), { recursive: true });
239
- await fsp.copyFile(src, dst);
240
- } catch (e) {
241
- GriddoLog.error(`Failed to copy sitemap ${src} to ${dst}:`, e);
242
- }
243
- }
244
-
245
- GriddoLog.verbose(`Copied sitemap files.`);
246
- }
247
-
248
- /**
249
- * Escanea un directorio de build de Gatsby y extrae la información esencial
250
- * (PageInfo[]) de cada página.
251
- * @param dir Directorio a escanear (src o dst).
252
- * @returns Un array con la información de cada página encontrada.
253
- */
254
- private async scanPages(dir: string): Promise<PageInfo[]> {
255
- // 1. Crea una instancia de p-limit con 128 lecturas a la vez...
256
- // Como ejemplo: macOS tiene un límite que suele empezar en 256.
257
- // De todas maneras libuv tiene un límite de 4 hilos en node
258
- const limit = pLimit(32);
259
-
260
- // 2. Recolecta todos los paths de los archivos.
261
- const gatsbyPageDataGenerator = findFilesBySuffix(
262
- path.join(dir, "page-data"),
263
- "page-data.json",
264
- );
265
- const processingPromises: Promise<PageInfo | null>[] = [];
266
- for await (const file of gatsbyPageDataGenerator) {
267
- processingPromises.push(
268
- limit(async (): Promise<PageInfo | null> => {
269
- try {
270
- const fileContent = await fsp.readFile(file, "utf-8");
271
- const content = JSON.parse(fileContent) as GatsbyPageData;
272
-
273
- const id = content.result.pageContext.id;
274
- const composePath = content.result.pageContext.fullPath.compose;
275
-
276
- return {
277
- id,
278
- composePath,
279
- htmlPath: path.join(dir, composePath, "index.html"),
280
- jsonPath: file,
281
- };
282
- } catch (e) {
283
- GriddoLog.error(`Error reading or parsing page data from ${file}:`, e);
284
- return null;
285
- }
286
- }),
287
- );
288
- }
289
-
290
- // 4. Go :)
291
- const pagesFoundOrNull = await Promise.all(processingPromises);
292
-
293
- // 5. Filtra los nulos y devuelve solo las páginas válidas.
294
- return pagesFoundOrNull.filter((page): page is PageInfo => page !== null);
295
- }
296
- }
297
-
298
- export { SyncRender };
@@ -1,35 +0,0 @@
1
- interface SSG {
2
- assetPrefix: string;
3
- ssgArtifacts: {
4
- disposables: string[];
5
- cacheables: string[];
6
- };
7
- }
8
-
9
- // Minimal representation of the page structure
10
- interface GatsbyPageData {
11
- path: string;
12
- result: {
13
- pageContext: {
14
- id: number;
15
- title: string;
16
- path: string;
17
- openGraph: any;
18
- pageMetadata: any;
19
- page: {
20
- site: number;
21
- id: number;
22
- fullPath: { compose: string };
23
- language: number;
24
- title: string;
25
- fullUrl: string;
26
- templateId: string;
27
- template: {
28
- templateType: string;
29
- };
30
- };
31
- };
32
- };
33
- }
34
-
35
- export type { GatsbyPageData, SSG };
@@ -1,55 +0,0 @@
1
- exports.onCreateWebpackConfig = (
2
- { stage, actions, getConfig, rules },
3
- { rule: ruleProps = {} },
4
- ) => {
5
- const { include, exclude, options, ...otherProps } = ruleProps;
6
-
7
- if (["develop", "develop-html", "build-html", "build-javascript"].includes(stage)) {
8
- // Add the react-svg-loader rule
9
- actions.setWebpackConfig({
10
- module: {
11
- rules: [
12
- {
13
- test: /\.svg$/,
14
- include,
15
- exclude,
16
- ...otherProps,
17
- use: [
18
- {
19
- loader: "@svgr/webpack",
20
- options,
21
- },
22
- ],
23
- },
24
- ],
25
- },
26
- });
27
- const cfg = getConfig();
28
- const imgsRule = rules.images();
29
-
30
- const newUrlLoaderRule =
31
- include || exclude
32
- ? {
33
- ...imgsRule,
34
- include: exclude,
35
- exclude: include,
36
- }
37
- : {
38
- ...imgsRule,
39
- test: new RegExp(imgsRule.test.toString().replace("svg|", "").slice(1, -1)),
40
- };
41
-
42
- cfg.module.rules = [
43
- // Remove the base url-loader images rule entirely
44
- ...cfg.module.rules.filter((rule) => {
45
- if (rule.test) {
46
- return rule.test.toString() !== imgsRule.test.toString();
47
- }
48
- return true;
49
- }),
50
- // Put it back without SVG loading
51
- newUrlLoaderRule,
52
- ];
53
- actions.replaceWebpackConfig(cfg);
54
- }
55
- };
@@ -1,8 +0,0 @@
1
- {
2
- "name": "gatsby-plugin-svgr-loader",
3
- "version": "0.1.0",
4
- "main": "gatsby-node.js",
5
- "dependencies": {
6
- "@svgr/webpack": "^4.3.2"
7
- }
8
- }
@@ -1,36 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- /* Opciones del Proyecto */
4
- "target": "es2022", // Genera JavaScript compatible con versiones modernas de Node.js
5
- "module": "commonjs", // El formato de módulo que usará Node.js para ejecutar los scripts
6
- "outDir": "./build", // Directorio de salida para los archivos .js compilados
7
- "rootDir": "./exporter", // Directorio raíz de los fuentes, para mantener la estructura en 'outDir'
8
-
9
- /* Módulos */
10
- "moduleResolution": "node", // Cómo se resuelven los módulos (estándar para Node)
11
- "esModuleInterop": true, // Permite una mejor interoperabilidad entre CommonJS y ES Modules
12
-
13
- // AÑADIDO: Permitir la importación de archivos .json como módulos.
14
- // Esto soluciona el error con `import ... from "../../package.json"`.
15
- "resolveJsonModule": true,
16
-
17
- /* Opciones de Emisión */
18
- "sourceMap": true, // Genera sourcemaps para facilitar el debugging
19
-
20
- /* Chequeo de Tipos Estricto */
21
- "strict": true, // Habilita todas las opciones de chequeo de tipos estrictas
22
- "skipLibCheck": true, // Evita el chequeo de tipos en los archivos de declaración (.d.ts) de las dependencias
23
-
24
- /* Opciones Adicionales */
25
- "forceConsistentCasingInFileNames": true, // Asegura que las mayúsculas y minúsculas en los nombres de archivo sean consistentes
26
- "types": ["node"]
27
- },
28
- "include": [
29
- "exporter/**/*.ts", // Incluye todos los archivos .ts dentro de la carpeta exporter
30
- "exporter/**/*.tsx"
31
- ],
32
- "exclude": [
33
- "node_modules", // Excluye las dependencias
34
- "**/*.test.ts" // Excluye los archivos de test
35
- ]
36
- }
@@ -1,21 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "es2022",
4
- "lib": ["dom", "esnext"],
5
- "jsx": "react-jsx",
6
- "module": "esnext",
7
- "moduleResolution": "node",
8
- "esModuleInterop": true,
9
- "forceConsistentCasingInFileNames": true,
10
- "strict": true,
11
- "skipLibCheck": true,
12
- "resolveJsonModule": true,
13
- "outDir": "./build",
14
- "sourceMap": true,
15
- "inlineSourceMap": false,
16
- "types": ["node"],
17
- "rootDir": "./exporter"
18
- },
19
- "include": ["./exporter/**/*.ts", "./exporter/**/*.tsx", "global.d.ts"],
20
- "exclude": ["./src/**/*"]
21
- }
File without changes
File without changes
File without changes
File without changes
File without changes