@griddo/cx 11.9.17 → 11.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/README.md +13 -240
  2. package/build/commands/end-render.d.ts +0 -1
  3. package/build/commands/end-render.js +31 -0
  4. package/build/commands/end-render.js.map +7 -0
  5. package/build/commands/prepare-assets-directory.js +9 -0
  6. package/build/commands/prepare-assets-directory.js.map +7 -0
  7. package/build/commands/prepare-domains-render.js +40 -0
  8. package/build/commands/prepare-domains-render.js.map +7 -0
  9. package/build/commands/reset-render.d.ts +0 -1
  10. package/build/commands/reset-render.js +31 -0
  11. package/build/commands/reset-render.js.map +7 -0
  12. package/build/commands/single-domain-upload-search-content.d.ts +1 -0
  13. package/build/commands/start-render.d.ts +0 -1
  14. package/build/commands/start-render.js +66 -0
  15. package/build/commands/start-render.js.map +7 -0
  16. package/build/commands/upload-search-content.d.ts +0 -1
  17. package/build/commands/upload-search-content.js +32 -0
  18. package/build/commands/upload-search-content.js.map +7 -0
  19. package/build/core/GriddoLog.d.ts +16 -0
  20. package/build/{utils/health-checks.d.ts → core/check-env-health.d.ts} +4 -2
  21. package/build/core/db-class.d.ts +11 -0
  22. package/build/core/db.d.ts +4 -0
  23. package/build/core/dist-rollback.d.ts +11 -0
  24. package/build/core/errors.d.ts +26 -0
  25. package/build/core/fs.d.ts +69 -0
  26. package/build/core/life-cycle.d.ts +26 -0
  27. package/build/core/logger.d.ts +18 -0
  28. package/build/core/objects.d.ts +11 -0
  29. package/build/core/print-logos.d.ts +5 -0
  30. package/build/index.d.ts +10 -29
  31. package/build/index.js +404 -73
  32. package/build/react/DynamicScript/index.d.ts +4 -0
  33. package/build/react/GriddoFavicon/index.d.ts +4 -0
  34. package/build/react/GriddoIntegrations/index.d.ts +3 -4
  35. package/build/react/GriddoIntegrations/utils.d.ts +7 -6
  36. package/build/react/GriddoOpenGraph/index.d.ts +10 -0
  37. package/build/react/index.d.ts +3 -2
  38. package/build/react/index.js +1 -3
  39. package/build/{utils → services}/api.d.ts +1 -1
  40. package/build/services/auth.d.ts +2 -5
  41. package/build/services/domains.d.ts +3 -4
  42. package/build/services/manage-sites.d.ts +22 -0
  43. package/build/services/manage-store.d.ts +32 -0
  44. package/build/services/navigation.d.ts +16 -16
  45. package/build/{utils → services}/pages.d.ts +3 -3
  46. package/build/services/reference-fields.d.ts +3 -3
  47. package/build/services/render-artifacts.d.ts +6 -0
  48. package/build/services/render.d.ts +70 -0
  49. package/build/services/robots.d.ts +2 -19
  50. package/build/services/sitemaps.d.ts +5 -0
  51. package/build/services/sites.d.ts +8 -5
  52. package/build/services/store.d.ts +10 -1
  53. package/build/shared/context.d.ts +36 -0
  54. package/build/shared/envs.d.ts +17 -0
  55. package/build/{errors/errors-data.d.ts → shared/errors.d.ts} +5 -3
  56. package/build/shared/npm-modules/brush.d.ts +18 -0
  57. package/build/shared/npm-modules/find-up-simple.d.ts +34 -0
  58. package/build/shared/npm-modules/pkg-dir.d.ts +7 -0
  59. package/build/shared/npm-modules/xml-parser.d.ts +4 -0
  60. package/build/{types → shared/types}/api.d.ts +18 -18
  61. package/build/{types → shared/types}/global.d.ts +15 -16
  62. package/build/{types → shared/types}/navigation.d.ts +5 -5
  63. package/build/{types → shared/types}/pages.d.ts +9 -9
  64. package/build/shared/types/render.d.ts +56 -0
  65. package/build/{types → shared/types}/sites.d.ts +18 -19
  66. package/build/shared/types.d.ts +15 -0
  67. package/build/ssg-adapters/gatsby/actions/clean.d.ts +3 -0
  68. package/build/ssg-adapters/gatsby/actions/close.d.ts +3 -0
  69. package/build/ssg-adapters/gatsby/actions/data.d.ts +2 -0
  70. package/build/ssg-adapters/gatsby/actions/healthCheck.d.ts +2 -0
  71. package/build/ssg-adapters/gatsby/actions/init.d.ts +2 -0
  72. package/build/ssg-adapters/gatsby/actions/logs.d.ts +3 -0
  73. package/build/ssg-adapters/gatsby/actions/meta.d.ts +2 -0
  74. package/build/ssg-adapters/gatsby/actions/prepare.d.ts +2 -0
  75. package/build/ssg-adapters/gatsby/actions/relocation.d.ts +2 -0
  76. package/build/ssg-adapters/gatsby/actions/restore.d.ts +3 -0
  77. package/build/ssg-adapters/gatsby/actions/ssg.d.ts +3 -0
  78. package/build/ssg-adapters/gatsby/actions/sync.d.ts +3 -0
  79. package/build/ssg-adapters/gatsby/index.d.ts +9 -0
  80. package/build/ssg-adapters/gatsby/shared/artifacts.d.ts +4 -0
  81. package/build/ssg-adapters/gatsby/shared/diff-assets.d.ts +15 -0
  82. package/build/ssg-adapters/gatsby/shared/extract-assets.d.ts +7 -0
  83. package/build/ssg-adapters/gatsby/shared/gatsby-build.d.ts +7 -0
  84. package/build/ssg-adapters/gatsby/shared/render-rollback.d.ts +18 -0
  85. package/build/ssg-adapters/gatsby/shared/sync-render.d.ts +26 -0
  86. package/build/ssg-adapters/gatsby/shared/types.d.ts +34 -0
  87. package/cli.mjs +231 -0
  88. package/exporter/build-esbuild.noop +42 -0
  89. package/exporter/build.sh +16 -24
  90. package/exporter/commands/README.md +142 -0
  91. package/exporter/commands/end-render.ts +53 -87
  92. package/exporter/commands/prepare-assets-directory.ts +35 -0
  93. package/exporter/commands/prepare-domains-render.ts +150 -33
  94. package/exporter/commands/reset-render.ts +13 -8
  95. package/exporter/commands/single-domain-upload-search-content.ts +206 -0
  96. package/exporter/commands/start-render.ts +14 -65
  97. package/exporter/commands/upload-search-content.ts +204 -26
  98. package/exporter/core/GriddoLog.ts +45 -0
  99. package/exporter/core/check-env-health.ts +203 -0
  100. package/exporter/core/db-class.ts +54 -0
  101. package/exporter/core/db.ts +33 -0
  102. package/exporter/core/dist-rollback.ts +49 -0
  103. package/exporter/core/errors.ts +93 -0
  104. package/exporter/core/fs.ts +385 -0
  105. package/exporter/{utils → core}/images.ts +1 -6
  106. package/exporter/{utils → core}/instance.ts +9 -13
  107. package/exporter/core/life-cycle.ts +73 -0
  108. package/exporter/core/logger.ts +137 -0
  109. package/exporter/core/objects.ts +37 -0
  110. package/exporter/core/print-logos.ts +21 -0
  111. package/exporter/index.ts +14 -56
  112. package/exporter/react/DynamicScript/index.tsx +33 -0
  113. package/exporter/react/{Favicon → GriddoFavicon}/index.tsx +3 -9
  114. package/exporter/react/GriddoIntegrations/index.tsx +17 -23
  115. package/exporter/react/GriddoIntegrations/utils.ts +24 -12
  116. package/exporter/react/GriddoOpenGraph/index.tsx +39 -0
  117. package/exporter/react/index.tsx +3 -9
  118. package/exporter/services/api.ts +306 -0
  119. package/exporter/services/auth.ts +8 -10
  120. package/exporter/services/domains.ts +23 -8
  121. package/exporter/services/manage-sites.ts +116 -0
  122. package/exporter/services/manage-store.ts +173 -0
  123. package/exporter/services/navigation.ts +12 -18
  124. package/exporter/{utils → services}/pages.ts +27 -92
  125. package/exporter/services/reference-fields.ts +14 -32
  126. package/exporter/services/render-artifacts.ts +44 -0
  127. package/exporter/services/render.ts +229 -0
  128. package/exporter/services/robots.ts +33 -61
  129. package/exporter/services/sitemaps.ts +129 -0
  130. package/exporter/services/sites.ts +40 -28
  131. package/exporter/services/store.ts +354 -321
  132. package/exporter/shared/context.ts +49 -0
  133. package/exporter/{constants → shared}/endpoints.ts +12 -11
  134. package/exporter/shared/envs.ts +58 -0
  135. package/exporter/{errors/errors-data.ts → shared/errors.ts} +24 -14
  136. package/exporter/shared/npm-modules/README.md +36 -0
  137. package/exporter/shared/npm-modules/brush.ts +34 -0
  138. package/exporter/shared/npm-modules/find-up-simple.ts +100 -0
  139. package/exporter/shared/npm-modules/pkg-dir.ts +17 -0
  140. package/exporter/shared/npm-modules/xml-parser.ts +57 -0
  141. package/exporter/{types → shared/types}/api.ts +40 -41
  142. package/exporter/{types → shared/types}/global.ts +17 -21
  143. package/exporter/{types → shared/types}/navigation.ts +3 -3
  144. package/exporter/{types → shared/types}/pages.ts +10 -11
  145. package/exporter/shared/types/render.ts +65 -0
  146. package/exporter/{types → shared/types}/sites.ts +18 -19
  147. package/exporter/shared/types.ts +15 -0
  148. package/exporter/ssg-adapters/gatsby/actions/clean.ts +26 -0
  149. package/exporter/ssg-adapters/gatsby/actions/close.ts +17 -0
  150. package/exporter/ssg-adapters/gatsby/actions/data.ts +22 -0
  151. package/exporter/ssg-adapters/gatsby/actions/healthCheck.ts +10 -0
  152. package/exporter/ssg-adapters/gatsby/actions/init.ts +12 -0
  153. package/exporter/ssg-adapters/gatsby/actions/logs.ts +10 -0
  154. package/exporter/ssg-adapters/gatsby/actions/meta.ts +13 -0
  155. package/exporter/ssg-adapters/gatsby/actions/prepare.ts +9 -0
  156. package/exporter/ssg-adapters/gatsby/actions/relocation.ts +15 -0
  157. package/exporter/ssg-adapters/gatsby/actions/restore.ts +21 -0
  158. package/exporter/ssg-adapters/gatsby/actions/ssg.ts +12 -0
  159. package/exporter/ssg-adapters/gatsby/actions/sync.ts +65 -0
  160. package/exporter/ssg-adapters/gatsby/index.ts +117 -0
  161. package/exporter/ssg-adapters/gatsby/shared/artifacts.ts +17 -0
  162. package/exporter/ssg-adapters/gatsby/shared/diff-assets.ts +128 -0
  163. package/exporter/ssg-adapters/gatsby/shared/extract-assets.ts +75 -0
  164. package/exporter/ssg-adapters/gatsby/shared/gatsby-build.ts +58 -0
  165. package/exporter/ssg-adapters/gatsby/shared/render-rollback.ts +33 -0
  166. package/exporter/ssg-adapters/gatsby/shared/sync-render.ts +298 -0
  167. package/exporter/ssg-adapters/gatsby/shared/types.ts +35 -0
  168. package/gatsby-browser.tsx +41 -58
  169. package/gatsby-config.ts +10 -17
  170. package/gatsby-node.ts +20 -79
  171. package/gatsby-ssr.tsx +2 -1
  172. package/package.json +41 -78
  173. package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +55 -0
  174. package/plugins/gatsby-plugin-svgr-loader/package.json +8 -0
  175. package/src/components/Head.tsx +28 -73
  176. package/src/components/template.tsx +6 -29
  177. package/src/gatsby-node-utils.ts +81 -2
  178. package/src/html.tsx +2 -11
  179. package/src/types.ts +3 -3
  180. package/tsconfig.commands.json +36 -0
  181. package/tsconfig.exporter.json +21 -0
  182. package/tsconfig.json +5 -3
  183. package/build/adapters/gatsby/index.d.ts +0 -4
  184. package/build/adapters/gatsby/utils.d.ts +0 -26
  185. package/build/artifacts/index.d.ts +0 -6
  186. package/build/constants/envs.d.ts +0 -37
  187. package/build/constants/index.d.ts +0 -57
  188. package/build/end-render.js +0 -74
  189. package/build/end-render.js.map +0 -7
  190. package/build/errors/index.d.ts +0 -15
  191. package/build/index.js.map +0 -7
  192. package/build/prepare-domains-render.js +0 -73
  193. package/build/prepare-domains-render.js.map +0 -7
  194. package/build/react/Favicon/index.d.ts +0 -5
  195. package/build/registers/api.d.ts +0 -9
  196. package/build/registers/gatsby.d.ts +0 -9
  197. package/build/registers/index.d.ts +0 -3
  198. package/build/reset-render.js +0 -74
  199. package/build/reset-render.js.map +0 -7
  200. package/build/services/register.d.ts +0 -36
  201. package/build/services/settings.d.ts +0 -4
  202. package/build/start-render.js +0 -100
  203. package/build/start-render.js.map +0 -7
  204. package/build/upload-search-content.js +0 -74
  205. package/build/upload-search-content.js.map +0 -7
  206. package/build/utils/alerts.d.ts +0 -3
  207. package/build/utils/cache.d.ts +0 -35
  208. package/build/utils/core-utils.d.ts +0 -107
  209. package/build/utils/create-build-data.d.ts +0 -8
  210. package/build/utils/domains.d.ts +0 -13
  211. package/build/utils/folders.d.ts +0 -53
  212. package/build/utils/loggin.d.ts +0 -51
  213. package/build/utils/render.d.ts +0 -13
  214. package/build/utils/searches.d.ts +0 -15
  215. package/build/utils/sites.d.ts +0 -31
  216. package/build/utils/store.d.ts +0 -81
  217. package/cx.config.d.ts +0 -5
  218. package/cx.config.js +0 -36
  219. package/exporter/adapters/gatsby/index.ts +0 -182
  220. package/exporter/adapters/gatsby/utils.ts +0 -186
  221. package/exporter/artifacts/README.md +0 -34
  222. package/exporter/artifacts/index.ts +0 -33
  223. package/exporter/commands/move-assets.ts +0 -11
  224. package/exporter/constants/envs.ts +0 -94
  225. package/exporter/constants/index.ts +0 -129
  226. package/exporter/errors/index.ts +0 -40
  227. package/exporter/registers/api.ts +0 -14
  228. package/exporter/registers/gatsby.ts +0 -14
  229. package/exporter/registers/index.ts +0 -4
  230. package/exporter/services/register.ts +0 -113
  231. package/exporter/services/settings.ts +0 -17
  232. package/exporter/utils/alerts.ts +0 -29
  233. package/exporter/utils/api.ts +0 -243
  234. package/exporter/utils/cache.ts +0 -142
  235. package/exporter/utils/core-utils.ts +0 -458
  236. package/exporter/utils/create-build-data.ts +0 -17
  237. package/exporter/utils/domains.ts +0 -39
  238. package/exporter/utils/folders.ts +0 -320
  239. package/exporter/utils/health-checks.ts +0 -64
  240. package/exporter/utils/loggin.ts +0 -184
  241. package/exporter/utils/render.ts +0 -71
  242. package/exporter/utils/searches.ts +0 -156
  243. package/exporter/utils/sites.ts +0 -312
  244. package/exporter/utils/store.ts +0 -314
  245. package/src/README.md +0 -7
  246. package/start-render.js +0 -7
  247. /package/build/commands/{move-assets.d.ts → prepare-assets-directory.d.ts} +0 -0
  248. /package/build/{utils → core}/images.d.ts +0 -0
  249. /package/build/{utils → core}/instance.d.ts +0 -0
  250. /package/build/react/{Favicon → GriddoFavicon}/utils.d.ts +0 -0
  251. /package/build/{constants → shared}/endpoints.d.ts +0 -0
  252. /package/build/{types → shared/types}/templates.d.ts +0 -0
  253. /package/exporter/react/{Favicon → GriddoFavicon}/utils.ts +0 -0
  254. /package/exporter/{types → shared/types}/templates.ts +0 -0
@@ -0,0 +1,137 @@
1
+ import type { RenderDB } from "../shared/types/render";
2
+
3
+ import fsp from "node:fs/promises";
4
+ import path from "node:path";
5
+
6
+ import { GRIDDO_BUILD_LOGS, GRIDDO_BUILD_LOGS_BUFFER_SIZE } from "../shared/envs";
7
+ import { readDB } from "./db";
8
+ import { GriddoLog } from "./GriddoLog";
9
+
10
+ const logBuffer: string[] = [];
11
+ let logFilePath: string | null = null;
12
+ let flushPromise: Promise<void> | null = null;
13
+ const LOG_BUFFER_FLUSH_THRESHOLD = GRIDDO_BUILD_LOGS_BUFFER_SIZE;
14
+ const LOG_FILENAME = "render-detail-log.txt";
15
+ const LOG_TO_FILE_IS_DISABLED = !GRIDDO_BUILD_LOGS;
16
+
17
+ let dbData: RenderDB | null = null;
18
+
19
+ // Universal data cache for this module...
20
+ async function getDBData() {
21
+ if (!dbData) {
22
+ dbData = await readDB();
23
+ }
24
+ return dbData;
25
+ }
26
+
27
+ async function initializeLogFile() {
28
+ if (LOG_TO_FILE_IS_DISABLED) {
29
+ return;
30
+ }
31
+
32
+ const data = await getDBData();
33
+ logFilePath = path.join(data.paths.root, LOG_FILENAME);
34
+
35
+ await fsp.rm(logFilePath, { force: true });
36
+ }
37
+
38
+ function addLogToBuffer(lineContent: string) {
39
+ if (LOG_TO_FILE_IS_DISABLED) {
40
+ return;
41
+ }
42
+
43
+ logBuffer.push(lineContent.toString());
44
+
45
+ if (logBuffer.length >= LOG_BUFFER_FLUSH_THRESHOLD) {
46
+ // Fire-and-forget flush to avoid blocking the main thread.
47
+ flushLogsToFile().catch((error) => {
48
+ GriddoLog.error("Background log flush failed:", error);
49
+ });
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Vuelca el contenido del buffer de logs al archivo de logs en disco.
55
+ * Si el buffer está vacío, ya se está volcando, o no hay ruta de archivo, no hace nada.
56
+ * Si ocurre un error al escribir, los logs se reinsertan al buffer para reintentar en el siguiente flush.
57
+ */
58
+ async function flushLogsToFile() {
59
+ // Si ya hay un volcado en curso, espera a que termine.
60
+ if (flushPromise) {
61
+ await flushPromise;
62
+ }
63
+
64
+ if (logBuffer.length === 0 || !logFilePath) {
65
+ return;
66
+ }
67
+
68
+ const performFlush = async () => {
69
+ const logsToFlush = [...logBuffer];
70
+ logBuffer.length = 0;
71
+
72
+ try {
73
+ await fsp.appendFile(logFilePath!, `${logsToFlush.join("\n")}\n`);
74
+ } catch (error) {
75
+ logBuffer.unshift(...logsToFlush);
76
+ GriddoLog.error("Error flushing logs:", error);
77
+ // No relanzamos el error para no detener el "fire-and-forget"
78
+ }
79
+ };
80
+
81
+ flushPromise = performFlush();
82
+
83
+ try {
84
+ await flushPromise;
85
+ } finally {
86
+ flushPromise = null;
87
+ }
88
+ }
89
+
90
+ /**
91
+ * Copia el archivo de log detallado de renderizado ("render-detail-log.txt")
92
+ * desde el directorio raíz del proyecto al directorio de logs del dominio en exports,
93
+ * usando una marca de tiempo en el nombre de destino.
94
+ * Si el archivo no existe, ignora el error salvo que sea distinto de ENOENT.
95
+ *
96
+ * @param domain - Nombre del dominio para el que se guarda el log.
97
+ */
98
+ async function saveDetailRenderLog(domain: string) {
99
+ await flushLogsToFile();
100
+
101
+ const data = await getDBData();
102
+
103
+ const dateString = getFormattedDateTime();
104
+ const debugDir = path.join(data.paths.exportsDir, domain, "logs");
105
+
106
+ await fsp.mkdir(debugDir, { recursive: true });
107
+
108
+ const src = path.join(data.paths.root, LOG_FILENAME);
109
+ const dst = path.join(debugDir, `${dateString}-${LOG_FILENAME}`);
110
+
111
+ // Move log to exports
112
+ try {
113
+ await fsp.cp(src, dst);
114
+ } catch (error) {
115
+ // It's possible the file doesn't exist if GRIDDO_BUILD_LOGS is false
116
+ // or if no logs were ever added.
117
+ if (error instanceof Error && "code" in error && error.code !== "ENOENT") {
118
+ throw error;
119
+ }
120
+ }
121
+ }
122
+
123
+ function getFormattedDateTime() {
124
+ const now = new Date();
125
+ const year = now.getFullYear();
126
+ const month = String(now.getMonth() + 1).padStart(2, "0");
127
+ const day = String(now.getDate()).padStart(2, "0");
128
+
129
+ const hours = String(now.getHours()).padStart(2, "0");
130
+ const minutes = String(now.getMinutes()).padStart(2, "0");
131
+ const seconds = String(now.getSeconds()).padStart(2, "0");
132
+
133
+ // Formato recomendado para ordenación de archivos: YYYY-MM-DD_HH-mm-ss
134
+ return `${year}-${month}-${day}_${hours}-${minutes}-${seconds}`;
135
+ }
136
+
137
+ export { addLogToBuffer, flushLogsToFile, initializeLogFile, saveDetailRenderLog };
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Busca de forma recursiva si ALGUNA de las claves de un array existe como propiedad propia
3
+ * en un objeto anidado. La búsqueda se detiene en cuanto se encuentra la primera coincidencia.
4
+ *
5
+ * @param obj El objeto a inspeccionar.
6
+ * @param keysToFind Un array de claves que se buscan.
7
+ * @param visited Un WeakSet para evitar ciclos de referencia.
8
+ * @returns Retorna `true` si al menos una de las claves se encuentra, de lo contrario `false`.
9
+ */
10
+ function hasAnyKeyDeep<T extends object>(
11
+ obj: T,
12
+ keysToFind: string[],
13
+ visited = new WeakSet<object>(),
14
+ ): boolean {
15
+ // 1. Casos base: no procesar no-objetos, si ya lo visitamos, o si el array de claves está vacío.
16
+ if (typeof obj !== "object" || obj === null || visited.has(obj)) {
17
+ return false;
18
+ }
19
+ if (keysToFind.length === 0) {
20
+ return false;
21
+ }
22
+ visited.add(obj);
23
+
24
+ // 2. Comprobar si ALGUNA de las claves buscadas es una propiedad propia del objeto actual.
25
+ // Usamos .some() porque se detiene en la primera coincidencia (eficiencia).
26
+ const foundKey = keysToFind.some((key) => Object.hasOwn(obj, key));
27
+ if (foundKey) {
28
+ return true;
29
+ }
30
+
31
+ // 3. Si no se encontró ninguna clave en este nivel, recorrer los valores y buscar recursivamente.
32
+ return Object.values(obj).some(
33
+ (value) => typeof value === "object" && hasAnyKeyDeep(value, keysToFind, visited),
34
+ );
35
+ }
36
+
37
+ export { hasAnyKeyDeep };
@@ -0,0 +1,21 @@
1
+ import fsp from "node:fs/promises";
2
+ import path from "node:path";
3
+
4
+ import { brush } from "../shared/npm-modules/brush";
5
+ import { GriddoLog } from "./GriddoLog";
6
+
7
+ /**
8
+ * Console log the Griddo exporter version.
9
+ */
10
+ async function showExporterVersion() {
11
+ // console.clear();
12
+ const { version } = JSON.parse(
13
+ await fsp.readFile(path.resolve(__dirname, "../..", "package.json"), "utf-8"),
14
+ ) as { version: string };
15
+ const logo = `\n${brush.yellow(`Griddo Exporter ${version}`)}
16
+ ${brush.dim(`Node ${process.version.slice(1)}`)}\n`;
17
+
18
+ GriddoLog.log(logo);
19
+ }
20
+
21
+ export { showExporterVersion };
package/exporter/index.ts CHANGED
@@ -1,22 +1,4 @@
1
- /**
2
- *
3
- * Griddo CX library main export file.
4
- *
5
- * This file exports functions to use in both: adapters and SSG's frameworks.
6
- * Turning CX basically in a javascript library.
7
- *
8
- * # React
9
- * There is another export in the `/react` directory to use exclusivelly in
10
- * the browser context where nodejs (path, fs, etc..) is not available.
11
- *
12
- * # Separate scripts.
13
- * There are some separate .ts files as end-render.ts or reset-render.ts
14
- * that are intended to be used by infra via npm script like `npm run
15
- * end-render`
16
- *
17
- */
18
-
19
- import type { SocialsResponse } from "./types/api";
1
+ import type { SocialsResponse } from "./shared/types/api";
20
2
  import type {
21
3
  AdditionalInfo,
22
4
  Dimensions,
@@ -24,53 +6,29 @@ import type {
24
6
  GriddoMultiPage,
25
7
  GriddoPageObject,
26
8
  GriddoSinglePage,
27
- } from "./types/pages";
28
- import type { Site } from "./types/sites";
9
+ } from "./shared/types/pages";
10
+ import type { Site } from "./shared/types/sites";
29
11
 
30
- import { endpoints, envs } from "./constants";
31
- import { apiRegister } from "./registers/index";
32
- import { FileRegister, MemoryRegister, Register } from "./services/register";
33
- import { insertAlert } from "./utils/alerts";
34
- import { getConfig, walk } from "./utils/core-utils";
12
+ import { throwError } from "./core/errors";
13
+ import { walkStore } from "./core/fs";
35
14
  import {
36
15
  componentLibraryPathAlias,
37
16
  isComponentLibrary,
38
17
  resolveComponentsPath,
39
- } from "./utils/instance";
40
- import {
41
- buildLog,
42
- debugLog,
43
- infoLog,
44
- pageSizeLog,
45
- verboseLog,
46
- } from "./utils/loggin";
47
- import {
48
- getBuildPagesFromCachedStore,
49
- getBuildPagesFromStore,
50
- getBuildPagesPath,
51
- } from "./utils/store";
18
+ } from "./core/instance";
19
+ import { addLogToBuffer } from "./core/logger";
20
+ import { getRenderPathsHydratedWithDomainFromDB } from "./services/render";
21
+ import { ReadFromStoreError } from "./shared/errors";
52
22
 
53
23
  export {
54
- apiRegister,
55
- buildLog,
24
+ addLogToBuffer,
56
25
  componentLibraryPathAlias,
57
- debugLog,
58
- endpoints,
59
- envs,
60
- FileRegister,
61
- getBuildPagesFromCachedStore,
62
- getBuildPagesFromStore,
63
- getBuildPagesPath,
64
- getConfig,
65
- infoLog,
66
- insertAlert,
26
+ getRenderPathsHydratedWithDomainFromDB,
67
27
  isComponentLibrary,
68
- MemoryRegister,
69
- pageSizeLog,
70
- Register,
28
+ ReadFromStoreError,
71
29
  resolveComponentsPath,
72
- verboseLog,
73
- walk,
30
+ throwError,
31
+ walkStore,
74
32
  type AdditionalInfo,
75
33
  type Dimensions,
76
34
  type GriddoListPage,
@@ -0,0 +1,33 @@
1
+ import { useEffect } from "react";
2
+
3
+ const DynamicScript = (props: { scriptContent: string }) => {
4
+ const { scriptContent } = props;
5
+
6
+ useEffect(() => {
7
+ if (!scriptContent) {
8
+ return;
9
+ }
10
+
11
+ const scriptText = scriptContent.replace(/<script>|<\/script>/g, "");
12
+ if (!scriptText.trim()) {
13
+ return;
14
+ }
15
+
16
+ const script = document.createElement("script");
17
+ script.innerHTML = scriptText;
18
+ script.async = true;
19
+
20
+ document.body.appendChild(script);
21
+
22
+ return () => {
23
+ // Hacemos un chequeo por si el script ya fue removido por otro proceso.
24
+ if (document.body.contains(script)) {
25
+ document.body.removeChild(script);
26
+ }
27
+ };
28
+ }, [scriptContent]);
29
+
30
+ return null;
31
+ };
32
+
33
+ export { DynamicScript };
@@ -1,8 +1,6 @@
1
- import * as React from "react";
2
-
3
1
  import { formatImage } from "./utils";
4
2
 
5
- function Favicon({ url }: { url: string | undefined }) {
3
+ function GriddoFavicon({ url }: { url: string | undefined }) {
6
4
  if (!url) {
7
5
  return null;
8
6
  }
@@ -26,13 +24,9 @@ function Favicon({ url }: { url: string | undefined }) {
26
24
  sizes="180x180"
27
25
  href={formatImage(url, { width: 180, height: 180, format: "png" })}
28
26
  />
29
- <link
30
- rel="icon"
31
- type="image/svg+xml"
32
- href={formatImage(url, { format: "svg" })}
33
- />
27
+ <link rel="icon" type="image/svg+xml" href={formatImage(url, { format: "svg" })} />
34
28
  </>
35
29
  );
36
30
  }
37
31
 
38
- export { Favicon };
32
+ export { GriddoFavicon };
@@ -1,18 +1,19 @@
1
- import type { Dimensions } from "../../types/pages";
2
1
  import type { Core } from "@griddo/core";
2
+ import type { Dimensions } from "../../shared/types/pages";
3
3
 
4
- import { generateAutomaticDimensions } from "@griddo-instance";
5
- import parse from "html-react-parser";
6
4
  import * as React from "react";
7
5
 
6
+ import { generateAutomaticDimensions } from "@griddo-instance";
7
+
8
8
  import {
9
9
  composeAnalytics,
10
+ extractScriptContent,
10
11
  filterBodyIntegrationFromPosition,
11
12
  filterHeadIntegrations,
12
13
  } from "./utils";
13
14
 
14
15
  export interface GriddoIntegrationsProps {
15
- integrations?: Array<Core.PageIntegration>;
16
+ integrations?: Core.PageIntegration[];
16
17
  location: "head" | "start-body" | "end-body";
17
18
  id?: string;
18
19
  analyticScript?: string;
@@ -56,12 +57,7 @@ function GriddoIntegrations(props: GriddoIntegrationsProps) {
56
57
  // @shame!
57
58
  // El fix sería llamar a `composeAnalytics()` solo si `pageInfo` existe.
58
59
  const { analyticsScript, analyticsDimensions } = pageInfo
59
- ? composeAnalytics(
60
- siteScript,
61
- dimensions,
62
- pageInfo,
63
- generateAutomaticDimensions,
64
- )
60
+ ? composeAnalytics(siteScript, dimensions, pageInfo, generateAutomaticDimensions)
65
61
  : { analyticsDimensions: null, analyticsScript: null };
66
62
 
67
63
  // GTAG WITH UA
@@ -70,9 +66,13 @@ function GriddoIntegrations(props: GriddoIntegrationsProps) {
70
66
  `https://www.googletagmanager.com/gtag/js?id=${analyticsScript}`) ||
71
67
  null;
72
68
 
69
+ const siteScriptContent = extractScriptContent(siteScript);
70
+
73
71
  return (
74
72
  <>
75
73
  {integrationsOrdered?.map((integration, key) => {
74
+ const integrationScriptContent = extractScriptContent(integration.content);
75
+
76
76
  /* Data Layer */
77
77
  if (integration.type === "datalayer") {
78
78
  return (
@@ -88,25 +88,19 @@ function GriddoIntegrations(props: GriddoIntegrationsProps) {
88
88
  if (integration.type === "analytics") {
89
89
  // If UA- is provided
90
90
  if (analyticsWithUA) {
91
- return (
92
- <script key={key} src={analyticsWithUA} data-griddo-id={id} />
93
- );
91
+ return <script key={key} src={analyticsWithUA} data-griddo-id={id} />;
94
92
  }
95
93
 
96
- return (
97
- <React.Fragment key={key}>
98
- {siteScript && parse(siteScript, { trim: true })}
99
- </React.Fragment>
100
- );
94
+ return siteScriptContent ? (
95
+ <script key={key} dangerouslySetInnerHTML={{ __html: siteScriptContent }} />
96
+ ) : null;
101
97
  }
102
98
 
103
99
  /* Integration integration.type === "addon" */
104
100
  if (integration.type === "addon") {
105
- return (
106
- <React.Fragment key={key}>
107
- {parse(integration.content, { trim: true })}
108
- </React.Fragment>
109
- );
101
+ return integrationScriptContent ? (
102
+ <script key={key} dangerouslySetInnerHTML={{ __html: integrationScriptContent }} />
103
+ ) : null;
110
104
  }
111
105
 
112
106
  return null;
@@ -1,5 +1,5 @@
1
- import type { Dimensions } from "../../types/pages";
2
1
  import type { Core } from "@griddo/core";
2
+ import type { Dimensions } from "../../shared/types/pages";
3
3
 
4
4
  /**
5
5
  * Return true if the argument is an object (not null)
@@ -9,7 +9,7 @@ function isObject(value: unknown) {
9
9
  }
10
10
 
11
11
  function filterBodyIntegrationFromPosition(
12
- integrations: Array<Core.PageIntegration>,
12
+ integrations: Core.PageIntegration[],
13
13
  position: "start" | "end",
14
14
  ) {
15
15
  return (
@@ -26,7 +26,7 @@ function filterBodyIntegrationFromPosition(
26
26
  );
27
27
  }
28
28
 
29
- function filterHeadIntegrations(integrations: Array<Core.PageIntegration>) {
29
+ function filterHeadIntegrations(integrations: Core.PageIntegration[]) {
30
30
  // A la hora de filtrar las integraciones, los addons si que tienen
31
31
  // contenido en head pero en el caso de analytics y datalayer el contenido
32
32
  // llega a null, pero deben ir en el <head>
@@ -48,7 +48,7 @@ function filterHeadIntegrations(integrations: Array<Core.PageIntegration>) {
48
48
  }
49
49
 
50
50
  const filterPositionIntegrations = (
51
- integrations: Array<Core.PageIntegration>,
51
+ integrations: Core.PageIntegration[],
52
52
  position: "head" | "start" | "end",
53
53
  ) => {
54
54
  switch (position) {
@@ -70,16 +70,13 @@ function composeAnalytics(
70
70
  };
71
71
  };
72
72
  },
73
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
74
- generateAutomaticDimensions = (page: Record<string, unknown>) => null,
73
+ generateAutomaticDimensions = (_page: Record<string, unknown>) => null,
75
74
  ) {
76
75
  const analyticsScript = siteScriptRaw ? siteScriptRaw.trim() : "";
77
76
 
78
77
  // Las dimensiones o DataLayer
79
78
  const dynamicValuePrefix = "__SCRIPT:";
80
- const dimensionValues = isObject(dimensions?.values)
81
- ? dimensions?.values
82
- : {};
79
+ const dimensionValues = isObject(dimensions?.values) ? dimensions?.values : {};
83
80
  const automaticDimensionValues = generateAutomaticDimensions
84
81
  ? generateAutomaticDimensions(page || {})
85
82
  : {};
@@ -104,9 +101,7 @@ function composeAnalytics(
104
101
  );
105
102
  }
106
103
 
107
- const analyticsDimensions = allDimensions.length
108
- ? `{${allDimensions.join(",")}}`
109
- : null;
104
+ const analyticsDimensions = allDimensions.length ? `{${allDimensions.join(",")}}` : null;
110
105
 
111
106
  return {
112
107
  analyticsScript,
@@ -114,8 +109,25 @@ function composeAnalytics(
114
109
  };
115
110
  }
116
111
 
112
+ function extractScriptContent(rawInput?: unknown) {
113
+ if (typeof rawInput !== "string" || !rawInput) {
114
+ return null;
115
+ }
116
+
117
+ const trimmedInput = rawInput.trim();
118
+
119
+ if (!trimmedInput.startsWith("<script>") || !trimmedInput.endsWith("</script>")) {
120
+ return null;
121
+ }
122
+
123
+ const content = trimmedInput.replace(/<script>|<\/script>/g, "").trim();
124
+
125
+ return content || null;
126
+ }
127
+
117
128
  export {
118
129
  composeAnalytics,
130
+ extractScriptContent,
119
131
  filterBodyIntegrationFromPosition,
120
132
  filterHeadIntegrations,
121
133
  filterPositionIntegrations,
@@ -0,0 +1,39 @@
1
+ import type { CustomHeadProps } from "../../shared/types";
2
+
3
+ interface GriddoOpenGraphProps {
4
+ openGraph?: CustomHeadProps["pageContext"]["openGraph"];
5
+ pageMetadata?: CustomHeadProps["pageContext"]["pageMetadata"];
6
+ siteMetadata?: CustomHeadProps["pageContext"]["siteMetadata"];
7
+ locale?: string;
8
+ fullUrl?: string;
9
+ }
10
+
11
+ const GriddoOpenGraph = (props: GriddoOpenGraphProps) => {
12
+ const { openGraph, pageMetadata, siteMetadata, locale, fullUrl } = props;
13
+
14
+ // La lógica de fallback se encapsula aquí
15
+ const ogTitle = openGraph?.title || pageMetadata?.title;
16
+ const ogDescription = openGraph?.description || pageMetadata?.description;
17
+ const ogUrl = pageMetadata?.canonical || fullUrl || "";
18
+
19
+ return (
20
+ <>
21
+ {/* Open Graph */}
22
+ {!!siteMetadata?.title && <meta property="og:site_name" content={siteMetadata.title} />}
23
+ {!!locale && <meta property="og:locale" content={locale} />}
24
+ {!!ogTitle && <meta property="og:title" content={ogTitle} />}
25
+ <meta property="og:type" content={openGraph?.type || "website"} />
26
+ {!!ogDescription && <meta property="og:description" content={ogDescription} />}
27
+ {!!openGraph?.image && <meta property="og:image" content={openGraph.image} />}
28
+ <meta property="og:url" content={ogUrl} />
29
+
30
+ {/* Twitter */}
31
+ <meta property="twitter:card" content="summary_large_image" />
32
+ {!!openGraph?.twitterImage && (
33
+ <meta property="twitter:image" content={openGraph.twitterImage} />
34
+ )}
35
+ </>
36
+ );
37
+ };
38
+
39
+ export { GriddoOpenGraph };
@@ -1,11 +1,5 @@
1
- //
2
- // Griddo CX library react export file.
3
- // This file exports functions to use in the SSG's frameworks.
4
- //
5
- // import { ... } from "@griddo/cx/react";
6
- //
7
-
8
- import { Favicon } from "./Favicon";
1
+ import { GriddoFavicon } from "./GriddoFavicon";
9
2
  import { GriddoIntegrations } from "./GriddoIntegrations";
3
+ import { GriddoOpenGraph } from "./GriddoOpenGraph";
10
4
 
11
- export { Favicon, GriddoIntegrations };
5
+ export { GriddoFavicon, GriddoIntegrations, GriddoOpenGraph };