@griddo/cx 11.9.8-rc.1 → 11.9.8-rc.2

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 (222) hide show
  1. package/README.md +193 -78
  2. package/build/adapters/gatsby/index.d.ts +4 -0
  3. package/build/adapters/gatsby/utils.d.ts +22 -0
  4. package/build/artifacts/index.d.ts +6 -0
  5. package/build/commands/end-render.d.ts +2 -0
  6. package/build/commands/move-assets.d.ts +1 -0
  7. package/build/commands/prepare-domains-render.d.ts +1 -0
  8. package/build/commands/reset-render.d.ts +2 -0
  9. package/build/commands/start-render.d.ts +2 -0
  10. package/build/commands/upload-search-content.d.ts +2 -0
  11. package/build/constants/envs.d.ts +37 -0
  12. package/build/constants/index.d.ts +57 -0
  13. package/build/end-render.js +74 -0
  14. package/build/end-render.js.map +7 -0
  15. package/build/{shared/errors.d.ts → errors/errors-data.d.ts} +3 -5
  16. package/build/{core/errors.d.ts → errors/index.d.ts} +4 -5
  17. package/build/index.d.ts +29 -10
  18. package/build/index.js +73 -406
  19. package/build/index.js.map +7 -0
  20. package/build/prepare-domains-render.js +73 -0
  21. package/build/prepare-domains-render.js.map +7 -0
  22. package/build/react/Favicon/index.d.ts +5 -0
  23. package/build/react/Favicon/utils.d.ts +9 -0
  24. package/build/react/GriddoIntegrations/index.d.ts +20 -0
  25. package/build/react/GriddoIntegrations/utils.d.ts +26 -0
  26. package/build/react/index.d.ts +3 -0
  27. package/build/react/index.js +3 -0
  28. package/build/registers/api.d.ts +9 -0
  29. package/build/registers/gatsby.d.ts +9 -0
  30. package/build/registers/index.d.ts +3 -0
  31. package/build/reset-render.js +74 -0
  32. package/build/reset-render.js.map +7 -0
  33. package/build/services/auth.d.ts +5 -2
  34. package/build/services/domains.d.ts +6 -0
  35. package/build/services/navigation.d.ts +50 -0
  36. package/build/services/reference-fields.d.ts +20 -0
  37. package/build/services/register.d.ts +36 -0
  38. package/build/services/robots.d.ts +19 -0
  39. package/build/services/settings.d.ts +4 -0
  40. package/build/services/sites.d.ts +29 -0
  41. package/build/services/store.d.ts +6 -0
  42. package/build/start-render.js +100 -0
  43. package/build/start-render.js.map +7 -0
  44. package/build/{shared/types → types}/api.d.ts +18 -18
  45. package/build/{shared/types → types}/global.d.ts +16 -15
  46. package/build/{shared/types → types}/navigation.d.ts +5 -5
  47. package/build/{shared/types → types}/pages.d.ts +9 -9
  48. package/build/{shared/types → types}/sites.d.ts +19 -18
  49. package/build/types/templates.d.ts +8 -0
  50. package/build/upload-search-content.js +74 -0
  51. package/build/upload-search-content.js.map +7 -0
  52. package/build/utils/alerts.d.ts +3 -0
  53. package/build/utils/api.d.ts +23 -0
  54. package/build/utils/cache.d.ts +35 -0
  55. package/build/utils/core-utils.d.ts +107 -0
  56. package/build/utils/create-build-data.d.ts +8 -0
  57. package/build/utils/domains.d.ts +13 -0
  58. package/build/utils/folders.d.ts +53 -0
  59. package/build/utils/health-checks.d.ts +7 -0
  60. package/build/utils/images.d.ts +16 -0
  61. package/build/utils/loggin.d.ts +51 -0
  62. package/build/utils/pages.d.ts +34 -0
  63. package/build/utils/render.d.ts +13 -0
  64. package/build/utils/searches.d.ts +15 -0
  65. package/build/utils/sites.d.ts +31 -0
  66. package/build/utils/store.d.ts +81 -0
  67. package/cx.config.d.ts +5 -0
  68. package/cx.config.js +36 -0
  69. package/exporter/adapters/gatsby/index.ts +162 -0
  70. package/exporter/adapters/gatsby/utils.ts +161 -0
  71. package/exporter/artifacts/README.md +34 -0
  72. package/exporter/artifacts/index.ts +33 -0
  73. package/exporter/build.sh +28 -17
  74. package/exporter/commands/end-render.ts +86 -65
  75. package/exporter/commands/move-assets.ts +11 -0
  76. package/exporter/commands/prepare-domains-render.ts +35 -143
  77. package/exporter/commands/reset-render.ts +7 -12
  78. package/exporter/commands/start-render.ts +64 -26
  79. package/exporter/commands/upload-search-content.ts +26 -201
  80. package/exporter/{shared → constants}/endpoints.ts +11 -12
  81. package/exporter/constants/envs.ts +94 -0
  82. package/exporter/constants/index.ts +129 -0
  83. package/exporter/{shared/errors.ts → errors/errors-data.ts} +14 -24
  84. package/exporter/errors/index.ts +40 -0
  85. package/exporter/index.ts +56 -14
  86. package/{react/GriddoFavicon → exporter/react/Favicon}/index.tsx +9 -3
  87. package/{react → exporter/react}/GriddoIntegrations/index.tsx +23 -17
  88. package/{react → exporter/react}/GriddoIntegrations/utils.ts +12 -24
  89. package/exporter/react/index.tsx +11 -0
  90. package/exporter/registers/api.ts +14 -0
  91. package/exporter/registers/gatsby.ts +14 -0
  92. package/exporter/registers/index.ts +4 -0
  93. package/exporter/services/auth.ts +10 -8
  94. package/exporter/services/domains.ts +8 -23
  95. package/exporter/services/navigation.ts +18 -12
  96. package/exporter/services/reference-fields.ts +32 -14
  97. package/exporter/services/register.ts +113 -0
  98. package/exporter/services/robots.ts +61 -33
  99. package/exporter/services/settings.ts +17 -0
  100. package/exporter/services/sites.ts +28 -40
  101. package/exporter/services/store.ts +319 -386
  102. package/exporter/{shared/types → types}/api.ts +41 -40
  103. package/exporter/{shared/types → types}/global.ts +21 -17
  104. package/exporter/{shared/types → types}/navigation.ts +3 -3
  105. package/exporter/{shared/types → types}/pages.ts +11 -10
  106. package/exporter/{shared/types → types}/sites.ts +19 -18
  107. package/exporter/utils/alerts.ts +29 -0
  108. package/exporter/utils/api.ts +243 -0
  109. package/exporter/utils/cache.ts +142 -0
  110. package/exporter/utils/core-utils.ts +458 -0
  111. package/exporter/utils/create-build-data.ts +17 -0
  112. package/exporter/utils/domains.ts +39 -0
  113. package/exporter/utils/folders.ts +320 -0
  114. package/exporter/utils/health-checks.ts +64 -0
  115. package/exporter/{core → utils}/images.ts +6 -1
  116. package/exporter/{core → utils}/instance.ts +13 -9
  117. package/exporter/utils/loggin.ts +184 -0
  118. package/exporter/{services → utils}/pages.ts +92 -27
  119. package/exporter/utils/render.ts +71 -0
  120. package/exporter/utils/searches.ts +156 -0
  121. package/exporter/utils/sites.ts +312 -0
  122. package/exporter/utils/store.ts +314 -0
  123. package/gatsby-browser.tsx +58 -41
  124. package/gatsby-config.ts +17 -10
  125. package/gatsby-node.ts +80 -20
  126. package/gatsby-ssr.tsx +1 -2
  127. package/package.json +92 -41
  128. package/src/README.md +7 -0
  129. package/src/components/Head.tsx +73 -30
  130. package/src/components/template.tsx +30 -8
  131. package/src/gatsby-node-utils.ts +2 -76
  132. package/src/html.tsx +11 -2
  133. package/src/types.ts +5 -5
  134. package/start-render.js +7 -0
  135. package/tsconfig.json +3 -5
  136. package/build/commands/end-render.js +0 -31
  137. package/build/commands/end-render.js.map +0 -7
  138. package/build/commands/prepare-assets-directory.js +0 -9
  139. package/build/commands/prepare-assets-directory.js.map +0 -7
  140. package/build/commands/prepare-domains-render.js +0 -38
  141. package/build/commands/prepare-domains-render.js.map +0 -7
  142. package/build/commands/reset-render.js +0 -31
  143. package/build/commands/reset-render.js.map +0 -7
  144. package/build/commands/start-embeddings.js +0 -31
  145. package/build/commands/start-embeddings.js.map +0 -7
  146. package/build/commands/start-render.js +0 -66
  147. package/build/commands/start-render.js.map +0 -7
  148. package/build/commands/upload-search-content.js +0 -31
  149. package/build/commands/upload-search-content.js.map +0 -7
  150. package/build/core/GriddoLog.d.ts +0 -16
  151. package/build/core/db.d.ts +0 -4
  152. package/build/core/dist-rollback.d.ts +0 -2
  153. package/build/core/fs.d.ts +0 -69
  154. package/build/core/logger.d.ts +0 -18
  155. package/build/services/manage-store.d.ts +0 -48
  156. package/build/services/render.d.ts +0 -70
  157. package/build/shared/envs.d.ts +0 -19
  158. package/build/shared/npm-modules/brush.d.ts +0 -18
  159. package/build/shared/npm-modules/find-up-simple.d.ts +0 -34
  160. package/build/shared/npm-modules/pkg-dir.d.ts +0 -7
  161. package/build/shared/types/render.d.ts +0 -54
  162. package/cli.mjs +0 -239
  163. package/exporter/build-esbuild.noop +0 -42
  164. package/exporter/commands/README.md +0 -151
  165. package/exporter/commands/prepare-assets-directory.ts +0 -34
  166. package/exporter/commands/single-domain-upload-search-content.noop +0 -206
  167. package/exporter/commands/start-embeddings.ts +0 -29
  168. package/exporter/core/GriddoLog.ts +0 -45
  169. package/exporter/core/check-env-health.ts +0 -200
  170. package/exporter/core/db-class.ts +0 -54
  171. package/exporter/core/db.ts +0 -33
  172. package/exporter/core/dist-rollback.ts +0 -40
  173. package/exporter/core/errors.ts +0 -82
  174. package/exporter/core/fs.ts +0 -385
  175. package/exporter/core/life-cycle.ts +0 -73
  176. package/exporter/core/logger.ts +0 -141
  177. package/exporter/core/objects.ts +0 -37
  178. package/exporter/core/print-logos.ts +0 -21
  179. package/exporter/services/api.ts +0 -306
  180. package/exporter/services/manage-sites.ts +0 -116
  181. package/exporter/services/manage-store.ts +0 -235
  182. package/exporter/services/render-artifacts.ts +0 -44
  183. package/exporter/services/render.ts +0 -229
  184. package/exporter/services/sitemaps.ts +0 -129
  185. package/exporter/shared/context.ts +0 -49
  186. package/exporter/shared/envs.ts +0 -62
  187. package/exporter/shared/npm-modules/README.md +0 -36
  188. package/exporter/shared/npm-modules/brush.ts +0 -34
  189. package/exporter/shared/npm-modules/find-up-simple.ts +0 -100
  190. package/exporter/shared/npm-modules/pkg-dir.ts +0 -17
  191. package/exporter/shared/npm-modules/xml-parser.ts +0 -57
  192. package/exporter/shared/types/render.ts +0 -63
  193. package/exporter/ssg-adapters/gatsby/actions/clean.ts +0 -26
  194. package/exporter/ssg-adapters/gatsby/actions/close.ts +0 -17
  195. package/exporter/ssg-adapters/gatsby/actions/data.ts +0 -22
  196. package/exporter/ssg-adapters/gatsby/actions/healthCheck.ts +0 -10
  197. package/exporter/ssg-adapters/gatsby/actions/init.ts +0 -12
  198. package/exporter/ssg-adapters/gatsby/actions/logs.ts +0 -10
  199. package/exporter/ssg-adapters/gatsby/actions/meta.ts +0 -13
  200. package/exporter/ssg-adapters/gatsby/actions/prepare.ts +0 -9
  201. package/exporter/ssg-adapters/gatsby/actions/relocation.ts +0 -15
  202. package/exporter/ssg-adapters/gatsby/actions/restore.ts +0 -21
  203. package/exporter/ssg-adapters/gatsby/actions/ssg.ts +0 -12
  204. package/exporter/ssg-adapters/gatsby/actions/sync.ts +0 -65
  205. package/exporter/ssg-adapters/gatsby/index.ts +0 -114
  206. package/exporter/ssg-adapters/gatsby/shared/artifacts.ts +0 -16
  207. package/exporter/ssg-adapters/gatsby/shared/diff-assets.ts +0 -128
  208. package/exporter/ssg-adapters/gatsby/shared/extract-assets.ts +0 -75
  209. package/exporter/ssg-adapters/gatsby/shared/gatsby-build.ts +0 -58
  210. package/exporter/ssg-adapters/gatsby/shared/sync-render.ts +0 -300
  211. package/exporter/ssg-adapters/gatsby/shared/types.ts +0 -35
  212. package/exporter/ssg-adapters/gatsby/shared/utils.ts +0 -33
  213. package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +0 -55
  214. package/plugins/gatsby-plugin-svgr-loader/package.json +0 -8
  215. package/react/DynamicScript/index.tsx +0 -33
  216. package/react/GriddoOpenGraph/index.tsx +0 -39
  217. package/tsconfig.commands.json +0 -36
  218. package/tsconfig.exporter.json +0 -20
  219. /package/build/{shared → constants}/endpoints.d.ts +0 -0
  220. /package/build/{core → utils}/instance.d.ts +0 -0
  221. /package/{react/GriddoFavicon → exporter/react/Favicon}/utils.ts +0 -0
  222. /package/exporter/{shared/types → types}/templates.ts +0 -0
@@ -1,154 +1,46 @@
1
- import type { RenderDB } from "../shared/types/render";
2
-
3
- import fsp from "node:fs/promises";
1
+ import fs from "node:fs";
4
2
  import path from "node:path";
5
3
 
6
- import { version as griddoVersion } from "../../package.json";
7
- import { checkEnvironmentHealth } from "../core/check-env-health";
8
- import { readDB, writeDB } from "../core/db";
9
- import { withErrorHandler } from "../core/errors";
10
- import { pathExists, rmDirs } from "../core/fs";
11
- import { GriddoLog } from "../core/GriddoLog";
12
- import { resolveComponentsPath } from "../core/instance";
13
- import { AuthService } from "../services/auth";
14
- import { getInstanceDomains } from "../services/domains";
15
- import { getSitesToRender } from "../services/manage-sites";
16
- import { resolveDomainRenderMode } from "../services/render";
17
- import { pkgDir } from "../shared/npm-modules/pkg-dir";
18
-
19
- async function getDomainsWithNumberOfPages(domains: string[]) {
20
- const results = await Promise.all(
21
- domains.map(async (domain) => {
22
- // Get the sites to render for the domain
23
- const { sitesToPublish, sitesToUnpublish } = await getSitesToRender(domain);
24
-
25
- // Only count pages (offlinePending && publishPending) if sitesToPublish
26
- // is not empty. Otherwise we set the domain has having 0 pages.
27
- const pages: number[] = [];
28
-
29
- if (sitesToPublish.length > 0) {
30
- for (const site of sitesToPublish) {
31
- // el site ya está publicado
32
- if (site.isPublished && !site.shouldBeUpdated) {
33
- const { pagesStatus } = site;
34
- const { offlinePending, uploadPending } = pagesStatus;
35
- const total = offlinePending.length + uploadPending.length;
36
- pages.push(total);
37
- }
38
- // el site esta pendiente de publicar
39
- if (site.isPublished && site.shouldBeUpdated) {
40
- const { pagesStatus } = site;
41
- const { offlinePending, uploadPending, active } = pagesStatus;
42
- const total = offlinePending.length + uploadPending.length + active.length;
43
- pages.push(total);
44
- }
45
- }
46
- } else if (sitesToUnpublish.length > 0) {
47
- // si tiene sites para despublicar marcamos el dominio como que tiene 1 página
48
- pages.push(1);
49
- } else {
50
- // si eldominio no tiene nada ni para publicar ni despublicar lomarcamos como 0
51
- pages.push(0);
52
- }
53
-
54
- const totalPages = pages.reduce((a, b) => a + b);
4
+ import { getConfig } from "../utils/core-utils";
5
+ import { getInstanceDomains } from "../utils/domains";
6
+ import { infoLog, successLog } from "../utils/loggin";
7
+ import { getSitesToRender } from "../utils/sites";
55
8
 
56
- return { domain, totalPages };
57
- }),
58
- );
9
+ (async () => {
10
+ infoLog("Checking domains size");
59
11
 
60
- return results;
61
- }
12
+ const { __cx } = getConfig().paths();
62
13
 
63
- function getDomainsSortedByNumberOfPages(domainsInfo: { domain: string; totalPages: number }[]) {
64
- domainsInfo.sort((a, b) => a.totalPages - b.totalPages);
65
-
66
- return domainsInfo.map(({ domain }) => domain);
67
- }
68
-
69
- async function initRender() {
70
- const root = (await pkgDir({ cwd: path.resolve(__dirname, "../../..") })) || "";
71
- const cx = root;
72
- const ssg = path.resolve((await pkgDir({ cwd: __dirname })) || "");
73
- const cxCache = path.resolve(root, ".griddo/cache");
74
- const components = resolveComponentsPath();
75
- const exportsDir = path.join(root, "exports/sites");
76
- const exportsDirBackup = path.join(root, "exports-backup/sites");
77
-
78
- const data: RenderDB = {
79
- griddoVersion,
80
- buildReportFileName: "build-report.json",
81
- sortedDomains: [],
82
- needsRollbackOnError: false,
83
- domains: {},
84
- currentRenderingDomain: null,
85
- paths: {
86
- components,
87
- cx,
88
- cxCache,
89
- exportsDir,
90
- root,
91
- ssg,
92
- exportsDirBackup,
93
- },
94
- };
95
-
96
- // create the main cache folder for cx if it doesn't exist.
97
- if (!(await pathExists(cxCache))) {
98
- await fsp.mkdir(cxCache, { recursive: true });
99
- }
100
-
101
- await writeDB(data);
102
- }
103
-
104
- async function prepareDomains() {
105
- await AuthService.login();
106
-
107
- const db = await readDB();
108
-
109
- const __ssg = db.paths.ssg;
110
14
  const domains = await getInstanceDomains();
111
- const domainsWithNumberOfPages = await getDomainsWithNumberOfPages(domains);
112
- const domainSorted = getDomainsSortedByNumberOfPages(domainsWithNumberOfPages);
113
-
114
- // @deprecated use db.json (only for infra)
115
- await fsp.writeFile(path.join(__ssg, "domains.json"), JSON.stringify(domainSorted));
116
-
117
- db.sortedDomains = domainSorted;
118
- db.domains = {};
119
-
120
- for (const { domain, totalPages } of domainsWithNumberOfPages) {
121
- const shouldBeRendered = totalPages > 0;
122
- const { renderMode, reason } = await resolveDomainRenderMode({
123
- domain,
124
- shouldBeRendered,
125
- });
126
-
127
- // Log RenderModes/Reason
128
- GriddoLog.info(
129
- `(From Initial Render) [${domain}]: Marked as ${renderMode} with the reason: ${reason}`,
130
- );
15
+ const domainsInfo = [];
16
+ const domainsFilePath = path.join(__cx, "domains.json");
17
+
18
+ for (const domain of domains) {
19
+ const { sitesToPublish } = await getSitesToRender(domain);
20
+
21
+ // Only count pages (changedPages) if sitesToPublish is not empty.
22
+ // Otherwise we set the domain has having 0 pages.
23
+ const pages = [];
24
+ if (sitesToPublish.length > 0) {
25
+ for (const site of sitesToPublish) {
26
+ pages.push(site.changedPages.length);
27
+ }
28
+ } else {
29
+ pages.push(0);
30
+ }
131
31
 
132
- db.domains[domain] = db.domains[domain] || {};
133
- db.domains[domain].renderMode = renderMode;
134
- db.domains[domain].shouldBeRendered = shouldBeRendered;
135
- db.domains[domain].renderModeReason = reason;
32
+ const totalPages = pages.reduce((a, b) => a + b);
33
+ domainsInfo.push({ domain, totalPages });
136
34
  }
137
35
 
138
- await writeDB(db);
139
- }
140
-
141
- async function clean() {
142
- const db = await readDB();
143
- const { root } = db.paths;
144
- await rmDirs([path.join(root, "apiCache")]);
145
- }
36
+ // sort domains, smaller first
37
+ domainsInfo.sort((a, b) => a.totalPages - b.totalPages);
38
+ const domainSorted = domainsInfo.map(({ domain }) => domain);
146
39
 
147
- async function main() {
148
- checkEnvironmentHealth();
149
- await initRender();
150
- await prepareDomains();
151
- await clean();
152
- }
40
+ fs.writeFileSync(domainsFilePath, JSON.stringify(domainSorted));
153
41
 
154
- withErrorHandler(main);
42
+ successLog(`Checking domains size`);
43
+ })().catch((err) => {
44
+ console.error(err);
45
+ process.exit(1);
46
+ });
@@ -1,19 +1,14 @@
1
- import { GriddoLog } from "../core/GriddoLog";
2
- import { post } from "../services/api";
3
- import { AuthService } from "../services/auth";
4
- import { RESET_RENDER } from "../shared/endpoints";
1
+ #!/usr/bin/env node
5
2
 
6
- async function resetRender() {
7
- await post({
8
- endpoint: RESET_RENDER,
9
- useApiCacheDir: false,
10
- });
11
- }
3
+ import { AuthService } from "../services/auth";
4
+ import { resetRender } from "../services/settings";
12
5
 
13
6
  async function main() {
14
7
  await AuthService.login();
15
8
  await resetRender();
16
- GriddoLog.info("The render status has been reset.");
17
9
  }
18
10
 
19
- main().catch(console.error);
11
+ main().catch((err) => {
12
+ console.error("Error", err?.stdout?.toString() || err);
13
+ process.exit(1);
14
+ });
@@ -1,30 +1,68 @@
1
- import { withErrorHandler } from "../core/errors";
2
- import { GriddoLog } from "../core/GriddoLog";
3
- import { showExporterVersion } from "../core/print-logos";
4
- import { AuthService } from "../services/auth";
5
- import { getInstanceDomains } from "../services/domains";
6
- import { GRIDDO_RENDER_BY_DOMAINS } from "../shared/envs";
7
- import { gatsbyRenderDomain } from "../ssg-adapters/gatsby";
8
-
9
- async function legacyRender() {
10
- GriddoLog.warn("Legacy Render Mode");
11
- const domains = await getInstanceDomains();
12
- for (const domain of domains) {
13
- await gatsbyRenderDomain(domain);
14
- }
15
- }
1
+ #!/usr/bin/env node
2
+ import { renderDomainsWithGatsbyAdapter } from "../adapters/gatsby";
3
+ import { RenderError } from "../errors";
4
+ import { getInstanceDomains } from "../utils/domains";
5
+ import { errorLabelLog, showExporterVersion } from "../utils/loggin";
6
+ import { sendGriddoDefaultAlerts } from "../utils/render";
16
7
 
17
- async function render() {
18
- const [domain] = process.argv.slice(2);
19
- await gatsbyRenderDomain(domain);
20
- }
8
+ const GRIDDO_RENDER_DOMAINS = process.env.GRIDDO_RENDER_DOMAINS || "";
9
+ const RENDER_BY_DOMAIN = process.env.GRIDDO_RENDER_BY_DOMAINS || "";
10
+
11
+ async function startRender() {
12
+ try {
13
+ // DOMAINS
14
+ // This block is just for the local instance renders.
15
+ if (GRIDDO_RENDER_DOMAINS) {
16
+ console.log("USANDO EL .ENV");
17
+ showExporterVersion();
18
+ for (const domain of GRIDDO_RENDER_DOMAINS.split(",")) {
19
+ await renderDomainsWithGatsbyAdapter(domain);
20
+ }
21
+ await sendGriddoDefaultAlerts();
22
+ process.exit(0);
23
+ }
24
+
25
+ // This will render every domain opposed to the new logic of render each
26
+ // domain separately.
27
+ if (RENDER_BY_DOMAIN) {
28
+ const domain = process.argv.splice(2)[0];
29
+
30
+ if (!domain) {
31
+ console.log("Needs the domain name argument");
32
+ throw new RenderError();
33
+ }
21
34
 
22
- async function main() {
23
- await showExporterVersion();
24
- await AuthService.login();
25
- GRIDDO_RENDER_BY_DOMAINS // This is a legacy flag, we should remove it in the future
26
- ? await render()
27
- : await legacyRender();
35
+ showExporterVersion();
36
+ await renderDomainsWithGatsbyAdapter(domain);
37
+ await sendGriddoDefaultAlerts();
38
+
39
+ process.exit(0);
40
+ } else {
41
+ showExporterVersion();
42
+
43
+ console.log("( Legacy Render Mode )\n");
44
+
45
+ const domains = await getInstanceDomains();
46
+
47
+ for (const domain of domains) {
48
+ await renderDomainsWithGatsbyAdapter(domain);
49
+ await sendGriddoDefaultAlerts();
50
+ }
51
+ process.exit(0);
52
+ }
53
+ } catch (error) {
54
+ if (error instanceof RenderError) {
55
+ errorLabelLog("GRIDDO_ERROR InternalCXError");
56
+ process.exit(1);
57
+ }
58
+
59
+ errorLabelLog("GRIDDO_ERROR UnknownError");
60
+ console.error(error);
61
+ process.exit(1);
62
+ }
28
63
  }
29
64
 
30
- withErrorHandler(main);
65
+ startRender().catch((err) => {
66
+ console.error("Error", err?.stdout?.toString() || err);
67
+ process.exit(1);
68
+ });
@@ -1,214 +1,39 @@
1
- import type { PostSearchInfoResponse } from "../shared/types/api";
2
- import type { AIEmbeddingsResponse, PostSearchInfoProps } from "../shared/types/global";
3
- import type { GatsbyPageData } from "../ssg-adapters/gatsby/shared/types";
1
+ #!/usr/bin/env node
4
2
 
5
- import fsp from "node:fs/promises";
6
- import path from "node:path";
3
+ import fs from "node:fs";
7
4
 
8
- import { throwError, withErrorHandler } from "../core/errors";
9
- import { pathExists } from "../core/fs";
10
- import { GriddoLog } from "../core/GriddoLog";
11
- import { post } from "../services/api";
12
- import { AuthService } from "../services/auth";
13
- import { getInstanceDomains } from "../services/domains";
14
- import { getRenderPathsHydratedWithDomainFromDB } from "../services/render";
15
- import { AI_EMBEDDINGS, SEARCH } from "../shared/endpoints";
16
- import { GRIDDO_AI_EMBEDDINGS, GRIDDO_SEARCH_FEATURE } from "../shared/envs";
17
- import { ReadFromStoreError, UploadSearchError } from "../shared/errors";
18
-
19
- /**
20
- * Save in the BBDD the content of a page parsed without HTML tags.
21
- *
22
- * @param props Object with parts of the final page object to be saved in the BBDD.
23
- */
24
- async function postSearchInfo(props: PostSearchInfoProps) {
25
- const { title, description, image, pageId, languageId, siteId, url, content, template } = props;
26
-
27
- const response = await post<PostSearchInfoResponse>({
28
- endpoint: SEARCH,
29
- body: {
30
- title,
31
- description,
32
- image,
33
- pageId,
34
- languageId,
35
- siteId,
36
- url,
37
- template,
38
- content,
39
- },
40
- useApiCacheDir: false,
41
- logToFile: false,
42
- });
43
-
44
- return response;
45
- }
46
-
47
- function prepareHTMLContentForSearch(content: string): string {
48
- // 1. Remove script, style, and other unwanted block tags and their content.
49
- // The regex looks for <tag...>...</tag> where tag is one of the specified ones.
50
- const tagsToRemove = ["meta", "link", "style", "script", "noscript", "nav", "header", "footer"];
51
- const removeTagsRegex = new RegExp(`<(${tagsToRemove.join("|")})\\b[^>]*>.*?<\\/\\1>`, "gis");
52
- let processedContent = content.replace(removeTagsRegex, "");
53
-
54
- // 2. Strip all remaining HTML tags.
55
- processedContent = processedContent.replace(/<[^>]+>/g, " ");
56
-
57
- // 3. Normalize whitespace: replace multiple spaces/newlines with a single space and trim.
58
- processedContent = processedContent.replace(/\s+/g, " ").trim();
59
-
60
- return processedContent;
61
- }
62
-
63
- /**
64
- * Function that search in the `/public` dir the content info of the pages and
65
- * send it to the search table in the ddbb using the API.
66
- * @todo Utilizar la carpeta page-data en lugar de la carpeta store puesto que
67
- * esta ya no es persistente.
68
- */
69
- async function uploadRenderedSearchContentToAPI(options: {
70
- htmlContentDir: string;
71
- jsonContentDir: string;
72
- }) {
73
- const { htmlContentDir, jsonContentDir } = options;
74
-
75
- if (!(await pathExists(jsonContentDir)) || !(await pathExists(htmlContentDir))) {
76
- GriddoLog.info(
77
- `Skipping uploading content to the search endpoint because it has not exported sites.`,
78
- );
5
+ import { envs } from "../constants";
6
+ import { getConfig } from "../utils/core-utils";
7
+ import { getInstanceDomains } from "../utils/domains";
8
+ import {
9
+ startAIEmbeddings,
10
+ uploadRenderedSearchContentToAPI,
11
+ } from "../utils/searches";
79
12
 
13
+ async function main() {
14
+ if (!envs.GRIDDO_SEARCH_FEATURE) {
80
15
  return;
81
16
  }
82
17
 
83
- // Get pages from gatsby page-data dir
84
- const gatsbyPageDataPages = getPageDataPagesFromExports(jsonContentDir);
85
-
86
- for await (const pageData of gatsbyPageDataPages) {
87
- const { result } = pageData;
88
- const { pageContext } = result;
89
- const { page, openGraph, pageMetadata } = pageContext;
90
-
91
- const { compose } = page.fullPath;
92
-
93
- const htmlPath = path.resolve(`${htmlContentDir}/${compose}/index.html`);
94
- const htmlContent = await fsp.readFile(htmlPath, "utf-8");
18
+ const domains = await getInstanceDomains();
19
+ const config = getConfig();
20
+ for (const domain of domains) {
21
+ const { __exports_dist } = config.paths(domain);
95
22
 
96
- const pageObject: PostSearchInfoProps = {
97
- siteId: page.site,
98
- pageId: page.id,
99
- // `pageMetadata.title` has already a fallback `metatitle ||
100
- // pageTitle` so probably `title` never will be take the
101
- // `openGraph?.title` value. Only when the `metatitle` and
102
- // `pageTitle` are empty.
103
- title: pageMetadata?.title || openGraph?.title,
104
- languageId: page.language,
105
- url: page.fullUrl,
106
- template: page.template.templateType || page.templateId,
107
- description: pageMetadata?.description || openGraph?.description,
108
- image: openGraph.image,
109
- // _content: prepareHTMLContentForSearch(htmlContent),
110
- content: prepareHTMLContentForSearch(htmlContent),
111
- };
112
-
113
- try {
114
- await postSearchInfo(pageObject);
115
- } catch (error) {
116
- throwError(UploadSearchError, error);
23
+ // If __exports_dist has not exported sites (directories), it does not
24
+ // upload search content.
25
+ if (fs.existsSync(__exports_dist)) {
26
+ await uploadRenderedSearchContentToAPI(__exports_dist, domain);
117
27
  }
118
28
  }
119
- }
120
-
121
- /**
122
- * Walk recursively in a basePath and return an array of pages with json
123
- * extension with the full absolute path and the path includes "page-data".
124
- *
125
- * @param basePath The path to walk recursively.
126
- * @returns An array of pages with json extension with the full absolute path
127
- * and the path includes "page-data".
128
- */
129
- async function* walkRecursively(basePath: string): AsyncGenerator<string> {
130
- const filesHandle = await fsp.opendir(basePath);
131
29
 
132
- for await (const fileDirent of filesHandle) {
133
- if (fileDirent.isDirectory()) {
134
- yield* walkRecursively(path.join(basePath, fileDirent.name));
135
- } else if (
136
- fileDirent.isFile() &&
137
- path.extname(fileDirent.name) === ".json" &&
138
- fileDirent.name.includes("page-data")
139
- ) {
140
- yield path.join(basePath, fileDirent.name);
141
- }
30
+ // Solo una vez en cada render de todos los dominios...
31
+ if (envs.GRIDDO_AI_EMBEDDINGS) {
32
+ await startAIEmbeddings();
142
33
  }
143
34
  }
144
35
 
145
- /**
146
- * Walk recursively in a basePath and return an array of pages with json
147
- * extension with the full absolute path and the path includes "page-data".
148
- *
149
- * @param basePath The path to walk recursively.
150
- * @returns An array of pages with json extension with the full absolute path
151
- * and the path includes "page-data".
152
- */
153
- async function* getPageDataPagesFromExports<PageType extends GatsbyPageData>(
154
- basePath: string,
155
- ): AsyncGenerator<PageType> {
156
- const jsonFiles = walkRecursively(basePath);
157
-
158
- for await (const filePath of jsonFiles) {
159
- try {
160
- const fileContent = await fsp.readFile(filePath, "utf8");
161
- const page = JSON.parse(fileContent) as PageType;
162
-
163
- if (page.path) {
164
- yield page;
165
- }
166
- } catch (error) {
167
- throwError(ReadFromStoreError, error);
168
- }
169
- }
170
- }
171
-
172
- async function getContentDirectories(domain: string) {
173
- const { __exports } = await getRenderPathsHydratedWithDomainFromDB({ domain });
174
-
175
- return {
176
- htmlContentDir: path.join(__exports, "dist"),
177
- jsonContentDir: path.join(__exports, "dist", "page-data"),
178
- };
179
- }
180
-
181
- async function uploadSearchContent() {
182
- if (GRIDDO_SEARCH_FEATURE) {
183
- const domains = await getInstanceDomains();
184
- for (const domain of domains) {
185
- const { htmlContentDir, jsonContentDir } = await getContentDirectories(domain);
186
-
187
- GriddoLog.info(
188
- `Uploading search content for ${domain}: processing content for ${htmlContentDir.length} pages...`,
189
- );
190
- await uploadRenderedSearchContentToAPI({
191
- htmlContentDir,
192
- jsonContentDir,
193
- });
194
- }
195
- }
196
- }
197
-
198
- async function aiEmbeddings() {
199
- if (GRIDDO_SEARCH_FEATURE && GRIDDO_AI_EMBEDDINGS) {
200
- GriddoLog.info(`Triggering AI embeddings...`);
201
- await post<AIEmbeddingsResponse>({
202
- endpoint: AI_EMBEDDINGS,
203
- useApiCacheDir: false,
204
- });
205
- }
206
- }
207
-
208
- async function main() {
209
- await AuthService.login();
210
- await uploadSearchContent();
211
- await aiEmbeddings();
212
- }
213
-
214
- withErrorHandler(main);
36
+ main().catch((err) => {
37
+ console.error("Error", err?.stdout?.toString() || err);
38
+ process.exit(1);
39
+ });
@@ -1,5 +1,6 @@
1
- const GRIDDO_API_URL = process.env.GRIDDO_API_URL;
2
- const GRIDDO_PUBLIC_API_URL = process.env.GRIDDO_PUBLIC_API_URL;
1
+ import { GRIDDO_API_URL, GRIDDO_PUBLIC_API_URL } from "./envs";
2
+
3
+ const WITH_URI = `${GRIDDO_API_URL}/site/`;
3
4
 
4
5
  const AI_EMBEDDINGS = `${GRIDDO_API_URL}/ai/embeddings`;
5
6
  const ALERT = `${GRIDDO_PUBLIC_API_URL}/alert`;
@@ -12,16 +13,14 @@ const ROBOTS = `${GRIDDO_API_URL}/domains/robots`;
12
13
  const SEARCH = `${GRIDDO_API_URL}/search`;
13
14
  const SETTINGS = `${GRIDDO_API_URL}/settings`;
14
15
 
15
- // Site
16
- const SITE_URI = `${GRIDDO_API_URL}/site/`;
17
- const BUILD_END = [SITE_URI, "/build/end"];
18
- const BUILD_START = [SITE_URI, "/build/start"];
19
- const GET_PAGES = [SITE_URI, "/pages?pagination=false"];
20
- const GET_REFERENCE_FIELD_DATA = [SITE_URI, "/distributor"];
21
- const GET_SITEMAP = [SITE_URI, "/sitemap"];
22
- const INFO = [SITE_URI, "/all"];
23
- const LANGUAGES = [SITE_URI, "/languages"];
24
- const SOCIALS = [SITE_URI, "/socials"];
16
+ const BUILD_END = [WITH_URI, "/build/end"];
17
+ const BUILD_START = [WITH_URI, "/build/start"];
18
+ const GET_PAGES = [WITH_URI, "/pages?pagination=false"];
19
+ const GET_REFERENCE_FIELD_DATA = [WITH_URI, "/distributor"];
20
+ const GET_SITEMAP = [WITH_URI, "/sitemap"];
21
+ const INFO = [WITH_URI, "/all"];
22
+ const LANGUAGES = [WITH_URI, "/languages"];
23
+ const SOCIALS = [WITH_URI, "/socials"];
25
24
 
26
25
  export {
27
26
  AI_EMBEDDINGS,