@griddo/cx 11.9.11-rc.9 → 11.9.12-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +38 -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 +406 -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 +19 -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 +54 -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 +151 -0
  91. package/exporter/commands/end-render.ts +65 -86
  92. package/exporter/commands/prepare-assets-directory.ts +35 -0
  93. package/exporter/commands/prepare-domains-render.ts +132 -35
  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 +26 -64
  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 +204 -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 +141 -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 +62 -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 +63 -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 +114 -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 -80
  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 +76 -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 -22
  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 -162
  220. package/exporter/adapters/gatsby/utils.ts +0 -161
  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
package/cli.mjs ADDED
@@ -0,0 +1,231 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { execSync } from "node:child_process";
4
+ import fs from "node:fs";
5
+ import path from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ import { parseArgs } from "node:util";
8
+
9
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
+
11
+ function getRoot(rootFlag) {
12
+ if (rootFlag) {
13
+ return path.resolve(rootFlag);
14
+ }
15
+ return path.resolve(__dirname, "../../");
16
+ }
17
+
18
+ function getDBPath(rootFlag) {
19
+ return path.join(getRoot(rootFlag), ".griddo/cache/db.json");
20
+ }
21
+
22
+ const COMMANDS_PATH = path.join(__dirname, "build/commands");
23
+
24
+ export const AVAILABLE_COMMANDS = [
25
+ {
26
+ name: "render",
27
+ description: "Render the instance",
28
+ domainArgument: "optional",
29
+ rootArgument: false,
30
+ script: "render-full-instance",
31
+ isCommandPack: true,
32
+ commandPack: renderCommandPack,
33
+ },
34
+ {
35
+ name: "prepare-assets-directory",
36
+ description: "Prepare assets directory (internal local only)",
37
+ domainArgument: true,
38
+ script: "prepare-assets-directory",
39
+ rootArgument: true,
40
+ isCommandPack: false,
41
+ },
42
+ {
43
+ name: "prepare-domains-render",
44
+ description: "Prepare domains",
45
+ domainArgument: false,
46
+ script: "prepare-domains-render",
47
+ rootArgument: true,
48
+ isCommandPack: false,
49
+ },
50
+ {
51
+ name: "start-render",
52
+ description: "Start rendering for a domain",
53
+ domainArgument: true,
54
+ script: "start-render",
55
+ rootArgument: false,
56
+ isCommandPack: false,
57
+ },
58
+ {
59
+ name: "end-render",
60
+ description: "End rendering for a domain",
61
+ domainArgument: true,
62
+ script: "end-render",
63
+ isCommandPack: false,
64
+ rootArgument: true,
65
+ },
66
+ {
67
+ name: "upload-search-content",
68
+ description: "Upload search content for a domain",
69
+ domainArgument: false,
70
+ script: "upload-search-content",
71
+ isCommandPack: false,
72
+ rootArgument: true,
73
+ },
74
+ {
75
+ name: "reset-render",
76
+ description: "Reset render state",
77
+ domainArgument: false,
78
+ script: "reset-render",
79
+ isCommandPack: false,
80
+ rootArgument: false,
81
+ },
82
+ ];
83
+
84
+ function showHelp() {
85
+ console.log("Griddo CX CLI - Available commands:\n");
86
+
87
+ AVAILABLE_COMMANDS.forEach((cmd) => {
88
+ const domainArg = cmd.domainArgument ? " --domain=<domain>" : "";
89
+ console.log(` ${cmd.name}${domainArg} --root=<path> - ${cmd.description}`);
90
+ });
91
+
92
+ console.log("\nUsage:");
93
+ console.log(" node cli.mjs <command> --root=<path> [--domain=<domain>]");
94
+ console.log(" node cli.mjs --help");
95
+ console.log("\nExamples:");
96
+ console.log(" node cli.mjs render --domain=pro-pikachu --root=. ");
97
+ console.log(" node cli.mjs start-render --domain=mydomain.com --root=some-path");
98
+ console.log(" node cli.mjs prepare-domains-render --root=. ");
99
+ console.log(" node cli.mjs --help");
100
+ }
101
+
102
+ function findCommand(commandName) {
103
+ return AVAILABLE_COMMANDS.find((cmd) => cmd.name === commandName);
104
+ }
105
+
106
+ function validateCommand(commandName, config) {
107
+ const command = findCommand(commandName);
108
+
109
+ if (!command) {
110
+ console.error(`Error: Unknown command '${commandName}'`);
111
+ console.error("Use 'node cli.mjs --help' to see available commands");
112
+ process.exit(1);
113
+ }
114
+
115
+ if (!config.root && command.rootArgument) {
116
+ console.error(`Error: --root flag is required`);
117
+ console.error(`Usage: node cli.mjs ${commandName} --root=<path>`);
118
+ process.exit(1);
119
+ }
120
+
121
+ if (command.domainArgument === true && !config.domain) {
122
+ console.error(`Error: Command '${commandName}' requires a --domain argument`);
123
+ console.error(`Usage: node cli.mjs ${commandName} --domain=<domain> --root=<path>`);
124
+ process.exit(1);
125
+ }
126
+
127
+ if (command.domainArgument === false && config.domain) {
128
+ console.warn(
129
+ `Warning: Command '${commandName}' doesn't require a domain, ignoring '${config.domain}'`,
130
+ );
131
+ }
132
+
133
+ // Creamos un nuevo config validado para asegurar que el dominio se pasa solo cuando es necesario
134
+ const validatedConfig = {
135
+ ...config,
136
+ domain: command.domainArgument ? config.domain : undefined,
137
+ };
138
+
139
+ return { command, config: validatedConfig };
140
+ }
141
+
142
+ function executeCommand(command, config) {
143
+ try {
144
+ const env = { ...process.env };
145
+ const scriptPath = path.join(COMMANDS_PATH, command.script);
146
+
147
+ if (command.isCommandPack) {
148
+ command.commandPack(config);
149
+ return;
150
+ }
151
+
152
+ const commandToRun = `node ${scriptPath}${config.domain ? ` ${config.domain}` : ""}`;
153
+
154
+ execSync(commandToRun, {
155
+ stdio: "inherit",
156
+ env,
157
+ cwd: process.cwd(),
158
+ });
159
+ } catch (error) {
160
+ console.error(`Error executing command ${command.name}`);
161
+ throw error;
162
+ }
163
+ }
164
+
165
+ function renderCommandPack(config) {
166
+ // Pequeño helper para no repetir la lógica de búsqueda y ejecución
167
+ const run = (commandName, domainOverride) => {
168
+ const commandToRun = findCommand(commandName);
169
+ // Pasamos una copia del config con el dominio que necesite este comando en particular
170
+ const runConfig = { ...config, domain: domainOverride ?? config.domain };
171
+ if (commandToRun) {
172
+ executeCommand(commandToRun, runConfig);
173
+ }
174
+ };
175
+
176
+ try {
177
+ run("prepare-domains-render", null);
178
+
179
+ let domainsToProcess = [];
180
+ if (config.domain) {
181
+ domainsToProcess = [config.domain];
182
+ } else {
183
+ const { sortedDomains } = JSON.parse(fs.readFileSync(getDBPath(config.root), "utf-8"));
184
+ domainsToProcess = sortedDomains;
185
+ }
186
+
187
+ for (const domain of domainsToProcess) {
188
+ run("start-render", domain);
189
+ run("prepare-assets-directory", domain);
190
+ run("end-render", domain);
191
+ }
192
+
193
+ // All domains
194
+ run("upload-search-content");
195
+ } catch (error) {
196
+ console.error("An error occurred during the render process:", error);
197
+ run("reset-render", null);
198
+ }
199
+ }
200
+
201
+ function main() {
202
+ const options = {
203
+ help: { type: "boolean", short: "h" },
204
+ domain: { type: "string" },
205
+ root: { type: "string" },
206
+ };
207
+
208
+ const { values, positionals } = parseArgs({
209
+ args: process.argv.slice(2),
210
+ options,
211
+ allowPositionals: true,
212
+ });
213
+
214
+ const commandName = positionals[0];
215
+
216
+ if (!commandName || values.help) {
217
+ showHelp();
218
+ return;
219
+ }
220
+
221
+ const initialConfig = {
222
+ domain: values.domain,
223
+ root: values.root,
224
+ };
225
+
226
+ const { command, config } = validateCommand(commandName, initialConfig);
227
+
228
+ executeCommand(command, config);
229
+ }
230
+
231
+ main();
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Build CX script file
4
+ #
5
+ # This file generates the necessary builds for CX.
6
+ # - Setup, to generate necessary elements (tsconfig, etc..)
7
+ # - Library, CX library that will be used by the SSG framework.
8
+ # - Scripts, CX scripts that will be used by infra during the render process.
9
+ #
10
+ # @todo:
11
+ # In the future, we will try to eliminate the bundling processes and use
12
+ # TypeScript or ESModules directly.
13
+
14
+ # start
15
+ echo "📦 Building ..."
16
+
17
+ # CLI options
18
+ log="--log-level=error"
19
+ production_node_opts="--bundle --platform=node --minify --sourcemap"
20
+ debugging_node_opts="--bundle --platform=node --sourcemap"
21
+ # react_opts="--platform=node --external:@griddo-instance --external:react --external:react-dom --bundle --minify"
22
+
23
+ # Manage --minify for debugging
24
+ bundle_node_opts=$production_node_opts
25
+ if [ "$1" = "--debug" ]; then
26
+ bundle_node_opts=$debugging_node_opts
27
+ fi
28
+
29
+ # library
30
+ # esbuild ${log} ./exporter/index.ts ${bundle_node_opts} --outfile=./build/index.js
31
+ # esbuild ${log} ./exporter/react/index.tsx ${react_opts} --outfile=./build/react/index.js
32
+
33
+ # scripts
34
+ esbuild ${log} ./exporter/commands/end-render.ts ${bundle_node_opts} --outfile=./build/end-render.js
35
+ esbuild ${log} ./exporter/commands/upload-search-content.ts ${bundle_node_opts} --outfile=./build/upload-search-content.js
36
+ esbuild ${log} ./exporter/commands/reset-render.ts ${bundle_node_opts} --outfile=./build/reset-render.js
37
+ esbuild ${log} ./exporter/commands/start-render.ts ${bundle_node_opts} --outfile=./build/start-render.js
38
+ esbuild ${log} ./exporter/commands/prepare-domains-render.ts ${bundle_node_opts} --outfile=./build/prepare-domains-render.js
39
+ esbuild ${log} ./exporter/commands/prepare-assets-directory.ts ${bundle_node_opts} --outfile=./build/prepare-assets-directory.js
40
+
41
+ # types
42
+ tsc --emitDeclarationOnly --declaration --outDir build --project tsconfig.exporter.json
package/exporter/build.sh CHANGED
@@ -1,21 +1,10 @@
1
- # Build CX script file
2
- #
3
- # This file generates the necessary builds for CX.
4
- # - Setup, to generate necessary elements (tsconfig, etc..)
5
- # - Library, CX library that will be used by the SSG framework.
6
- # - Scripts, CX scripts that will be used by infra during the render process.
7
- #
8
- # @todo:
9
- # In the future, we will try to eliminate the bundling processes and use
10
- # TypeScript or ESModules directly.
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC2086
11
3
 
12
- # start
13
- echo "📦 Building ..."
14
-
15
- # CLI options
4
+ # CLI options for esbuild
16
5
  log="--log-level=error"
17
- production_node_opts="--bundle --platform=node --minify --sourcemap"
18
- debugging_node_opts="--bundle --platform=node --sourcemap"
6
+ production_node_opts="--bundle --platform=node --minify --sourcemap --outfile=./build/commands/"
7
+ debugging_node_opts="--bundle --platform=node --sourcemap --outfile=./build/commands/"
19
8
  react_opts="--platform=node --external:@griddo-instance --external:react --external:react-dom --bundle --minify"
20
9
 
21
10
  # Manage --minify for debugging
@@ -25,15 +14,18 @@ if [ "$1" = "--debug" ]; then
25
14
  fi
26
15
 
27
16
  # library
28
- esbuild ${log} ./exporter/index.ts ${bundle_node_opts} --outfile=./build/index.js
17
+ esbuild ${log} ./exporter/index.ts --bundle --platform=node --outfile=./build/index.js
29
18
  esbuild ${log} ./exporter/react/index.tsx ${react_opts} --outfile=./build/react/index.js
30
19
 
31
- # scripts
32
- esbuild ${log} ./exporter/commands/end-render.ts ${bundle_node_opts} --outfile=./build/end-render.js
33
- esbuild ${log} ./exporter/commands/upload-search-content.ts ${bundle_node_opts} --outfile=./build/upload-search-content.js
34
- esbuild ${log} ./exporter/commands/reset-render.ts ${bundle_node_opts} --outfile=./build/reset-render.js
35
- esbuild ${log} ./exporter/commands/start-render.ts ${bundle_node_opts} --outfile=./build/start-render.js
36
- esbuild ${log} ./exporter/commands/prepare-domains-render.ts ${bundle_node_opts} --outfile=./build/prepare-domains-render.js
20
+ # This .sh needs to be run from a npm script, so esbuild dependency is available
21
+ esbuild ${log} ./exporter/commands/end-render.ts ${bundle_node_opts}end-render.js
22
+ esbuild ${log} ./exporter/commands/upload-search-content.ts ${bundle_node_opts}upload-search-content.js
23
+ esbuild ${log} ./exporter/commands/reset-render.ts ${bundle_node_opts}reset-render.js
24
+ esbuild ${log} ./exporter/commands/start-render.ts ${bundle_node_opts}start-render.js
25
+ esbuild ${log} ./exporter/commands/prepare-domains-render.ts ${bundle_node_opts}prepare-domains-render.js
26
+ esbuild ${log} ./exporter/commands/prepare-assets-directory.ts ${bundle_node_opts}prepare-assets-directory.js
37
27
 
38
28
  # types
39
- tsc --emitDeclarationOnly --declaration --outDir build --project tsconfig.exporter.json
29
+ tsgo --emitDeclarationOnly --declaration --outDir build --project tsconfig.exporter.json
30
+
31
+ echo "Build completed successfully!"
@@ -0,0 +1,151 @@
1
+ # Comandos del Orquestador Griddo CX
2
+
3
+ Este directorio contiene los comandos principales de Griddo Exporter (CX). Estos comandos forman parte del ciclo de vida completo del proceso de render de una instancia.
4
+
5
+ La recomendación es llamarlos mediante el cli `node cli.mjs <comand-name> [options]`
6
+
7
+ ## Listado de comandos.
8
+
9
+ ### 1. `prepare-domains-render.ts`
10
+
11
+ **Propósito**: Prepara los dominios para el proceso de renderizado.
12
+
13
+ **Funcionalidades principales**:
14
+ - Inicializa el entorno de renderizado creando la estructura de base de datos local (db.json)
15
+ - Obtiene la lista de dominios disponibles desde la API
16
+ - Calcula el número de páginas por dominio analizando sitios para publicar/despublicar
17
+ - Determina el modo de renderizado para cada dominio (basado en si tiene contenido pendiente)
18
+ - Ordena los dominios por número de páginas para optimizar el procesamiento
19
+ - Crea archivos de configuración (`domains.json`) para uso de infraestructura (A deprecar: infra deberá leer db.json para obtener esa información)
20
+
21
+ **Uso típico**: Se ejecuta antes de cualquier proceso de renderizado para preparar el estado inicial.
22
+
23
+ **Características técnicas**:
24
+ - No requiere argumentos (proceso global)
25
+ - Crea la carpeta `.griddo` si no existe donde le indiquemos cuando le pasemos `--root` desde el cli.
26
+
27
+
28
+ ### 2. `start-render.ts`
29
+
30
+ **Propósito**: Ejecuta el ciclo completo de renderizado para uno o múltiples dominios.
31
+
32
+ **Funcionalidades principales**:
33
+ - Autenticación con la API de Griddo
34
+ - Verificación del estado de salud del entorno
35
+ - Ejecución del proceso Gatsby para generar sitios estáticos
36
+ - Soporte para modo legacy (múltiples dominios) y modo moderno (dominio específico)
37
+
38
+ **Uso**:
39
+ ```bash
40
+ # Modo moderno (recomendado)
41
+ start-render <dominio>
42
+
43
+ # Modo legacy (múltiples dominios)
44
+ start-render
45
+ ```
46
+
47
+ **Características técnicas**:
48
+ - Puede procesar un dominio específico o todos los dominios disponibles
49
+ - Utiliza el adaptador Gatsby para la generación de sitios
50
+ - Requiere autenticación previa con la API
51
+
52
+ ### 3. `end-render.ts`
53
+
54
+ **Propósito**: Finaliza el ciclo de renderizado notificando a la API sobre los cambios realizados.
55
+
56
+ **Funcionalidades principales**:
57
+ - Lee el reporte de construcción generado por Gatsby
58
+ - Procesa cada sitio del dominio indicando qué se publicó/despublicó
59
+ - Envía llamadas de finalización a la API para cada sitio
60
+ - Maneja modos IDLE para sitios sin cambios
61
+
62
+ **Uso**:
63
+ ```bash
64
+ # Modo moderno
65
+ end-render <dominio>
66
+
67
+ # Modo legacy
68
+ end-render
69
+ ```
70
+
71
+ **Características técnicas**:
72
+ - Lee `build-report.json` generado durante el proceso de construcción
73
+ - Elimina hashes duplicados antes del envío
74
+ - Puede saltar dominios marcados como IDLE
75
+
76
+ ### 4. `upload-search-content.ts`
77
+
78
+ **Propósito**: Sube el contenido de las páginas generadas para el uso posterior en los buscadores de Griddo.
79
+
80
+ **Funcionalidades principales**:
81
+ - Extrae contenido de las páginas HTML generadas
82
+ - Limpia el contenido HTML removiendo etiquetas, scripts y elementos no deseados
83
+ - Procesa archivos `page-data.json` de Gatsby para obtener metadatos
84
+ - Envía el contenido indexable a la API de búsqueda
85
+ - Soporte opcional para embeddings de IA
86
+
87
+ **Características técnicas**:
88
+ - Solo se ejecuta si `GRIDDO_SEARCH_FEATURE` está habilitado
89
+ - Procesa recursivamente directorios `page-data` y `public`
90
+ - Normaliza el contenido eliminando múltiples espacios y saltos de línea
91
+ - Envía datos estructurados: título, descripción, imagen, URL, contenido, template
92
+
93
+ **Configuración**:
94
+ - Activado por `GRIDDO_SEARCH_FEATURE=true`
95
+ - Embeddings de IA con `GRIDDO_AI_EMBEDDINGS=true`
96
+
97
+ ### 5. `reset-render.ts`
98
+
99
+ **Propósito**: Resetea el estado de renderizado en el sistema remoto.
100
+
101
+ **Funcionalidades principales**:
102
+ - Envía una llamada a la API para resetear el estado de renderizado
103
+ - Útil para limpiar estados inconsistentes o errores de procesamiento
104
+
105
+ **Uso típico**: Se utiliza cuando hay problemas con el estado del renderizado que requieren un reinicio limpio.
106
+
107
+ **Características técnicas**:
108
+ - No requiere argumentos
109
+ - Comunicación directa con el endpoint `RESET_RENDER`
110
+ - Operación atómica que afecta el estado global
111
+
112
+ ### 6. `prepare-assets-directory.ts` (USO SOLO EN DESARROLLO LOCAL)
113
+
114
+ **Propósito**: Prepara el directorio de assets para un dominio específico.
115
+
116
+ **Funcionalidades principales**:
117
+ - Reorganiza la estructura de directorios de assets
118
+ - Mueve assets desde ubicación compartida a ubicación específica del dominio
119
+
120
+ **Uso**:
121
+ ```bash
122
+ prepare-assets-directory <dominio>
123
+ ```
124
+
125
+ **Características técnicas**:
126
+ - Mueve el directorio `assets` compartido al directorio específico del dominio
127
+ - Operación de bajo nivel para organización de archivos estáticos
128
+ - Elimina y recrea la estructura según sea necesario
129
+
130
+ ## Flujo de Uso Típico
131
+
132
+ 1. **`prepare-domains-render`** - Preparar el entorno y obtener dominios
133
+ 2. **`start-render`** - Ejecutar la generación de sitios para un dominio
134
+ 3. **`end-render`** - Notificar finalización y cambios a la API
135
+ 4. **`upload-search-content`** - Subir contenido para búsqueda (si está habilitado)
136
+ 5. **`prepare-assets-directory`** - Organizar assets (si es necesario)
137
+
138
+ ## Variables de Entorno Relevantes
139
+
140
+ - `GRIDDO_RENDER_BY_DOMAINS`: Habilita modo legacy para múltiples dominios
141
+ - `GRIDDO_SEARCH_FEATURE`: Habilita subida de contenido para búsqueda
142
+ - `GRIDDO_AI_EMBEDDINGS`: Habilita generación de embeddings de IA
143
+ - `GRIDDO_API_URL`: URL base de la API de Griddo
144
+ - `GRIDDO_BOT_USER` / `GRIDDO_BOT_PASSWORD`: Credenciales de autenticación
145
+
146
+ ## Notas de Desarrollo
147
+
148
+ - Todos los comandos utilizan manejo de errores consistente a través de `withErrorHandler`
149
+ - La mayoría requiere autenticación previa con `AuthService.login()`
150
+ - Los comandos modernos esperan un argumento de dominio específico
151
+ - El modo legacy permite procesamiento masivo pero está deprecated
@@ -1,105 +1,84 @@
1
- #!/usr/bin/env node
2
-
3
- import fs from "node:fs";
1
+ import fsp from "node:fs/promises";
4
2
  import path from "node:path";
5
3
 
6
- import pkgDir from "pkg-dir";
7
-
4
+ import { throwError, withErrorHandler } from "../core/errors";
5
+ import { pathExists } from "../core/fs";
6
+ import { GriddoLog } from "../core/GriddoLog";
8
7
  import { AuthService } from "../services/auth";
8
+ import { getInstanceDomains } from "../services/domains";
9
+ import {
10
+ getRenderMetadataFromDB,
11
+ getRenderModeFromDB,
12
+ getRenderPathsHydratedWithDomainFromDB,
13
+ } from "../services/render";
9
14
  import { endSiteRender } from "../services/sites";
10
- import { getConfig } from "../utils/core-utils";
11
- import { getInstanceDomains } from "../utils/domains";
12
- import { infoLog } from "../utils/loggin";
13
-
14
- const RENDER_BY_DOMAIN = process.env.GRIDDO_RENDER_BY_DOMAINS || "";
15
-
16
- // Where we are going to find export dirs
17
- const execBasePath = pkgDir.sync(path.resolve(__dirname, "../.."))!;
18
-
19
- // Where we are going to find archived exports
20
- const exportArchiveBasePath = path.resolve(execBasePath, "exports/sites");
21
-
22
- type Report = {
23
- authControl:
24
- | {
25
- Authorization: string;
26
- "Cache-Control": string;
27
- lang?: string | undefined;
28
- }
29
- | undefined;
30
- sites: Array<{
31
- siteId: number;
32
- publishHashes: Array<string>;
33
- siteHash: string | null;
34
- unpublishHashes: Array<string>;
35
- publishPagesIds: Array<number>;
36
- }>;
37
- };
38
-
39
- function getDomainRenderReport(domain: string) {
40
- const reports: Array<Report> = [];
41
- const { buildReportFileName } = getConfig();
42
-
43
- const buildReportFile = path.resolve(
44
- exportArchiveBasePath,
45
- domain,
46
- "dist",
47
- buildReportFileName,
48
- );
49
-
50
- if (!fs.existsSync(buildReportFile)) {
51
- console.info(`Build report file "${buildReportFile}" not found.`);
15
+ import { GRIDDO_RENDER_BY_DOMAINS } from "../shared/envs";
16
+ import { ArtifactError } from "../shared/errors";
17
+ import { RENDER_MODE, type Report } from "../shared/types/render";
18
+
19
+ async function getRenderReport(options: {
20
+ domain: string;
21
+ exportsSiteDir: string;
22
+ buildReportFileName: string;
23
+ }) {
24
+ const { buildReportFileName, domain, exportsSiteDir } = options;
25
+ const buildReportFile = path.resolve(exportsSiteDir, domain, "dist", buildReportFileName);
26
+
27
+ if (!(await pathExists(buildReportFile))) {
28
+ GriddoLog.info(`Build report file "${buildReportFile}" not found.`);
29
+ throwError(ArtifactError);
52
30
  }
53
31
 
54
- const buildReport = JSON.parse(fs.readFileSync(buildReportFile, "utf-8"));
55
-
56
- reports.push(buildReport);
57
-
58
- return reports;
32
+ return JSON.parse(await fsp.readFile(buildReportFile, "utf-8")) as Report;
59
33
  }
60
34
 
61
- (async () => {
62
- const sendEndSiteRender = async (reports: Array<Report>) => {
63
- for (const report of reports) {
64
- const sites = report.sites;
35
+ async function endRender() {
36
+ const { buildReportFileName } = await getRenderMetadataFromDB();
37
+ const { __sites } = await getRenderPathsHydratedWithDomainFromDB();
65
38
 
66
- for (const site of sites) {
67
- const { siteId, ...body } = site;
39
+ await AuthService.login();
68
40
 
69
- console.info(`Site (${siteId})`);
41
+ let domains = [];
70
42
 
71
- await endSiteRender(siteId, body);
72
- }
73
- }
74
- };
75
-
76
- if (RENDER_BY_DOMAIN) {
77
- await AuthService.login();
78
- const domain = process.argv.splice(2)[0];
79
- const reports = getDomainRenderReport(domain);
43
+ if (GRIDDO_RENDER_BY_DOMAINS) {
44
+ const [domainName] = process.argv.slice(2);
45
+ domains.push(domainName);
46
+ } else {
47
+ GriddoLog.warn("Legacy Render Mode");
48
+ domains = await getInstanceDomains();
49
+ }
80
50
 
81
- infoLog(`Sending ending call to ${domain} sites`);
51
+ for (const domain of domains) {
52
+ const { renderMode, reason } = await getRenderModeFromDB(domain);
82
53
 
83
- for (const report of reports) {
84
- for (const site of report.sites) {
85
- site.publishHashes = [...new Set(site.publishHashes)];
86
- site.unpublishHashes = [...new Set(site.unpublishHashes)];
87
- }
54
+ if (renderMode === RENDER_MODE.IDLE) {
55
+ GriddoLog.info(
56
+ `(From Current Render) [${domain}]: Skipping end-render as it is marked as IDLE with the reason ${reason}.`,
57
+ );
58
+ continue;
88
59
  }
89
60
 
90
- await sendEndSiteRender(reports);
91
- } else {
92
- // Legacy render
93
- const domains = await getInstanceDomains();
94
- for (const domain of domains) {
95
- const reports = getDomainRenderReport(domain);
61
+ const report = await getRenderReport({
62
+ domain,
63
+ exportsSiteDir: __sites,
64
+ buildReportFileName,
65
+ });
96
66
 
97
- infoLog(`Sending ending call to ${domain} sites`);
67
+ GriddoLog.info(`Sending ending call to ${domain} sites`);
98
68
 
99
- await sendEndSiteRender(reports);
69
+ for (const site of report.sites) {
70
+ site.publishHashes = [...new Set(site.publishHashes)];
71
+ site.unpublishHashes = [...new Set(site.unpublishHashes)];
72
+
73
+ const { siteId, ...body } = site;
74
+ GriddoLog.info(`Site (${siteId})`);
75
+ await endSiteRender(siteId, body);
100
76
  }
101
77
  }
102
- })().catch((err) => {
103
- console.error("Error", err?.stdout?.toString() || err);
104
- process.exit(1);
105
- });
78
+ }
79
+
80
+ async function main() {
81
+ await endRender();
82
+ }
83
+
84
+ withErrorHandler(main);
@@ -0,0 +1,35 @@
1
+ import fsp from "node:fs/promises";
2
+ import path from "node:path";
3
+
4
+ import { withErrorHandler } from "../core/errors";
5
+ import { pathExists } from "../core/fs";
6
+ import { GriddoLog } from "../core/GriddoLog";
7
+ import { getRenderModeFromDB, getRenderPathsHydratedWithDomainFromDB } from "../services/render";
8
+ import { RENDER_MODE } from "../shared/types/render";
9
+
10
+ async function prepareAssetsDir() {
11
+ const [domain] = process.argv.slice(2);
12
+
13
+ const { renderMode } = await getRenderModeFromDB(domain);
14
+
15
+ if (renderMode === RENDER_MODE.IDLE) {
16
+ return;
17
+ }
18
+
19
+ const { __exports } = await getRenderPathsHydratedWithDomainFromDB({ domain });
20
+ const assetsDir = path.join(__exports, "assets");
21
+ const domainAssetsDir = path.join(__exports, domain);
22
+
23
+ if (await pathExists(assetsDir)) {
24
+ await fsp.rm(domainAssetsDir, { force: true, recursive: true });
25
+ await fsp.rename(assetsDir, domainAssetsDir);
26
+ } else {
27
+ GriddoLog.warn("Assets directory not found");
28
+ }
29
+ }
30
+
31
+ async function main() {
32
+ await prepareAssetsDir();
33
+ }
34
+
35
+ withErrorHandler(main);