@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
@@ -1,46 +1,163 @@
1
- import fs from "node:fs";
1
+ import type { RenderDB } from "../shared/types/render";
2
+
3
+ import { execSync } from "node:child_process";
4
+ import fsp from "node:fs/promises";
2
5
  import path from "node:path";
3
6
 
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";
7
+ import { version as griddoVersion } from "../../package.json";
8
+ import { checkEnvironmentHealth } from "../core/check-env-health";
9
+ import { readDB, writeDB } from "../core/db";
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 { GRIDDO_SKIP_BUILD_CHECKS } from "../shared/envs";
18
+ import { pkgDir } from "../shared/npm-modules/pkg-dir";
19
+
20
+ async function getDomainsWithNumberOfPagesWithActivity(domains: string[]) {
21
+ const results = await Promise.all(
22
+ domains.map(async (domain) => {
23
+ const { sitesToPublish, sitesToUnpublish } = await getSitesToRender(domain);
24
+ const allSites = [...sitesToPublish, ...sitesToUnpublish];
8
25
 
9
- (async () => {
10
- infoLog("Checking domains size");
26
+ if (allSites.length < 1) {
27
+ GriddoLog.warn(`No sites to publish or unpublish for domain: ${domain}`);
28
+ return { domain, totalPendingPages: 0 };
29
+ }
11
30
 
12
- const { __cx } = getConfig().paths();
31
+ const pages: number[] = [];
32
+ for (const site of allSites) {
33
+ const { offlinePending, uploadPending, active } = site.pagesStatus;
13
34
 
14
- const domains = await getInstanceDomains();
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);
35
+ // HACK/SHAME
36
+ // Si un site no tiene páginas (está totalmente vacío) pero está
37
+ // pendiente de ser publicado/despublicado
38
+ // `shouldBeUpdated=true`, marcamos como que tiene 1 página.
39
+ // Esto es solo para indicarle a CX que tenga en cuenta el site
40
+ // para el incremental render.
41
+ // HACK/SHAME
42
+ const siteHasNoPagesToRender =
43
+ offlinePending.length === 0 && uploadPending.length === 0 && active.length === 0;
44
+ const ghostPage = site.shouldBeUpdated && siteHasNoPagesToRender ? 1 : 0;
45
+ const pagesWithPendingActivity = offlinePending.length + uploadPending.length + ghostPage;
46
+ pages.push(pagesWithPendingActivity);
27
47
  }
28
- } else {
29
- pages.push(0);
30
- }
31
48
 
32
- const totalPages = pages.reduce((a, b) => a + b);
33
- domainsInfo.push({ domain, totalPages });
49
+ const totalPendingPages = pages.reduce((a, b) => a + b, 0);
50
+
51
+ return { domain, totalPendingPages };
52
+ }),
53
+ );
54
+
55
+ return results;
56
+ }
57
+
58
+ function getDomainsSortedByNumberOfPages(
59
+ domainsInfo: { domain: string; totalPendingPages: number }[],
60
+ ) {
61
+ domainsInfo.sort((a, b) => a.totalPendingPages - b.totalPendingPages);
62
+
63
+ return domainsInfo.map(({ domain }) => domain);
64
+ }
65
+
66
+ async function initRender() {
67
+ const root = (await pkgDir({ cwd: path.resolve(__dirname, "../../..") })) || "";
68
+ const cx = root;
69
+ const ssg = path.resolve((await pkgDir({ cwd: __dirname })) || "");
70
+ const cxCache = path.resolve(root, ".griddo/cache");
71
+ const components = resolveComponentsPath();
72
+ const exportsDir = path.join(root, "exports/sites");
73
+ const exportsDirBackup = path.join(root, "exports-backup/sites");
74
+
75
+ const data: RenderDB = {
76
+ griddoVersion,
77
+ buildReportFileName: "build-report.json",
78
+ sortedDomains: [],
79
+ needsRollbackOnError: false,
80
+ domains: {},
81
+ currentRenderingDomain: null,
82
+ commitHash: execSync("git rev-parse HEAD").toString().trim(),
83
+ commitMessage: execSync("git log -1 --pretty=%B").toString().trim(),
84
+ paths: {
85
+ components,
86
+ cx,
87
+ cxCache,
88
+ exportsDir,
89
+ root,
90
+ ssg,
91
+ exportsDirBackup,
92
+ },
93
+ };
94
+
95
+ // create the main cache folder for cx if it doesn't exist.
96
+ if (!(await pathExists(cxCache))) {
97
+ await fsp.mkdir(cxCache, { recursive: true });
34
98
  }
35
99
 
36
- // sort domains, smaller first
37
- domainsInfo.sort((a, b) => a.totalPages - b.totalPages);
38
- const domainSorted = domainsInfo.map(({ domain }) => domain);
100
+ await writeDB(data);
101
+ }
102
+
103
+ async function prepareDomains() {
104
+ await AuthService.login();
39
105
 
40
- fs.writeFileSync(domainsFilePath, JSON.stringify(domainSorted));
106
+ const db = await readDB();
41
107
 
42
- successLog(`Checking domains size`);
43
- })().catch((err) => {
44
- console.error(err);
108
+ const __ssg = db.paths.ssg;
109
+ const domains = await getInstanceDomains();
110
+ const domainsWithNumberOfPendingPages = await getDomainsWithNumberOfPagesWithActivity(domains);
111
+ const domainSorted = getDomainsSortedByNumberOfPages(domainsWithNumberOfPendingPages);
112
+
113
+ // @deprecated use db.json (only for infra)
114
+ await fsp.writeFile(path.join(__ssg, "domains.json"), JSON.stringify(domainSorted));
115
+
116
+ db.sortedDomains = domainSorted;
117
+ db.domains = {};
118
+
119
+ for (const { domain, totalPendingPages } of domainsWithNumberOfPendingPages) {
120
+ const shouldBeRendered = totalPendingPages > 0;
121
+ const { renderMode, reason } = await resolveDomainRenderMode({
122
+ domain,
123
+ shouldBeRendered,
124
+ });
125
+
126
+ // Log RenderModes/Reason
127
+ GriddoLog.info(
128
+ `(From Initial Render) [${domain}]: Marked as ${renderMode} with the reason: ${reason}`,
129
+ );
130
+
131
+ db.domains[domain] = db.domains[domain] || {};
132
+ db.domains[domain].renderMode = renderMode;
133
+ db.domains[domain].shouldBeRendered = shouldBeRendered;
134
+ db.domains[domain].renderModeReason = reason;
135
+ }
136
+
137
+ await writeDB(db);
138
+ }
139
+
140
+ async function clean() {
141
+ const db = await readDB();
142
+ const { root } = db.paths;
143
+ await rmDirs([path.join(root, "apiCache")]);
144
+ }
145
+
146
+ async function main() {
147
+ GRIDDO_SKIP_BUILD_CHECKS
148
+ ? GriddoLog.info("Build health check bypassed")
149
+ : checkEnvironmentHealth();
150
+
151
+ await initRender();
152
+ await prepareDomains();
153
+ await clean();
154
+ }
155
+
156
+ main().catch((error) => {
157
+ if (error instanceof Error) {
158
+ GriddoLog.error(error.message);
159
+ } else {
160
+ GriddoLog.error(`An unexpected error occurred ${error}`);
161
+ }
45
162
  process.exit(1);
46
163
  });
@@ -1,14 +1,19 @@
1
- #!/usr/bin/env node
2
-
1
+ import { GriddoLog } from "../core/GriddoLog";
2
+ import { post } from "../services/api";
3
3
  import { AuthService } from "../services/auth";
4
- import { resetRender } from "../services/settings";
4
+ import { RESET_RENDER } from "../shared/endpoints";
5
5
 
6
- async function main() {
6
+ async function resetRender() {
7
7
  await AuthService.login();
8
+ await post({
9
+ endpoint: RESET_RENDER,
10
+ useApiCacheDir: false,
11
+ });
12
+ GriddoLog.info("The render status of all domains has been restored.");
13
+ }
14
+
15
+ async function main() {
8
16
  await resetRender();
9
17
  }
10
18
 
11
- main().catch((err) => {
12
- console.error("Error", err?.stdout?.toString() || err);
13
- process.exit(1);
14
- });
19
+ main().catch(console.error);
@@ -0,0 +1,206 @@
1
+ import type { PostSearchInfoResponse } from "../shared/types/api";
2
+ import type { PostSearchInfoProps } from "../shared/types/global";
3
+ import type { GatsbyPageData } from "../ssg-adapters/gatsby/shared/types";
4
+
5
+ import fsp from "node:fs/promises";
6
+ import path from "node:path";
7
+
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 { getRenderModeFromDB, getRenderPathsHydratedWithDomainFromDB } from "../services/render";
14
+ import { SEARCH } from "../shared/endpoints";
15
+ import { GRIDDO_SEARCH_FEATURE } from "../shared/envs";
16
+ import { ReadFromStoreError, UploadSearchError } from "../shared/errors";
17
+ import { RENDER_MODE } from "../shared/types/render";
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
+ async function getContentDirectories(domain: string) {
64
+ const { __exports } = await getRenderPathsHydratedWithDomainFromDB({ domain });
65
+
66
+ return {
67
+ htmlContentDir: path.join(__exports, "dist"),
68
+ jsonContentDir: path.join(__exports, "dist", "page-data"),
69
+ };
70
+ }
71
+
72
+ /**
73
+ * Walk recursively in a basePath and return an array of pages with json
74
+ * extension with the full absolute path and the path includes "page-data".
75
+ *
76
+ * @param basePath The path to walk recursively.
77
+ * @returns An array of pages with json extension with the full absolute path
78
+ * and the path includes "page-data".
79
+ */
80
+ async function* walkRecursively(basePath: string): AsyncGenerator<string> {
81
+ const filesHandle = await fsp.opendir(basePath);
82
+
83
+ for await (const fileDirent of filesHandle) {
84
+ if (fileDirent.isDirectory()) {
85
+ yield* walkRecursively(path.join(basePath, fileDirent.name));
86
+ } else if (
87
+ fileDirent.isFile() &&
88
+ path.extname(fileDirent.name) === ".json" &&
89
+ fileDirent.name.includes("page-data")
90
+ ) {
91
+ yield path.join(basePath, fileDirent.name);
92
+ }
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Walk recursively in a basePath and return an array of pages with json
98
+ * extension with the full absolute path and the path includes "page-data".
99
+ *
100
+ * @param basePath The path to walk recursively.
101
+ * @returns An array of pages with json extension with the full absolute path
102
+ * and the path includes "page-data".
103
+ */
104
+ async function* getPageDataPagesFromExports<PageType extends GatsbyPageData>(
105
+ basePath: string,
106
+ ): AsyncGenerator<PageType> {
107
+ const jsonFiles = walkRecursively(basePath);
108
+
109
+ for await (const filePath of jsonFiles) {
110
+ try {
111
+ const fileContent = await fsp.readFile(filePath, "utf8");
112
+ const page = JSON.parse(fileContent) as PageType;
113
+
114
+ if (page.path) {
115
+ yield page;
116
+ }
117
+ } catch (error) {
118
+ throwError(ReadFromStoreError, error);
119
+ }
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Function that search in the `/public` dir the content info of the pages and
125
+ * send it to the search table in the ddbb using the API.
126
+ * @todo Utilizar la carpeta page-data en lugar de la carpeta store puesto que
127
+ * esta ya no es persistente.
128
+ */
129
+ async function uploadRenderedSearchContentToAPI(options: {
130
+ htmlContentDir: string;
131
+ jsonContentDir: string;
132
+ }) {
133
+ const { htmlContentDir, jsonContentDir } = options;
134
+
135
+ if (!(await pathExists(jsonContentDir)) || !(await pathExists(htmlContentDir))) {
136
+ GriddoLog.info(
137
+ `(From Current Render) Skipping uploading content to the search endpoint because it has not exported sites.`,
138
+ );
139
+
140
+ return;
141
+ }
142
+
143
+ // Get pages from gatsby page-data dir
144
+ const gatsbyPageDataPages = getPageDataPagesFromExports(jsonContentDir);
145
+
146
+ for await (const pageData of gatsbyPageDataPages) {
147
+ const { result } = pageData;
148
+ const { pageContext } = result;
149
+ const { page, openGraph, pageMetadata } = pageContext;
150
+
151
+ const { compose } = page.fullPath;
152
+
153
+ const htmlPath = path.resolve(`${htmlContentDir}/${compose}/index.html`);
154
+ const htmlContent = await fsp.readFile(htmlPath, "utf-8");
155
+
156
+ const pageObject: PostSearchInfoProps = {
157
+ siteId: page.site,
158
+ pageId: page.id,
159
+ // `pageMetadata.title` has already a fallback `metatitle ||
160
+ // pageTitle` so probably `title` never will be take the
161
+ // `openGraph?.title` value. Only when the `metatitle` and
162
+ // `pageTitle` are empty.
163
+ title: pageMetadata?.title || openGraph?.title,
164
+ languageId: page.language,
165
+ url: page.fullUrl,
166
+ template: page.template.templateType || page.templateId,
167
+ description: pageMetadata?.description || openGraph?.description,
168
+ image: openGraph.image,
169
+ // _content: prepareHTMLContentForSearch(htmlContent),
170
+ content: prepareHTMLContentForSearch(htmlContent),
171
+ };
172
+
173
+ try {
174
+ await postSearchInfo(pageObject);
175
+ } catch (error) {
176
+ throwError(UploadSearchError, error);
177
+ }
178
+ }
179
+ }
180
+
181
+ async function uploadSearchContent() {
182
+ const [domain] = process.argv.slice(2);
183
+ const { renderMode, reason } = await getRenderModeFromDB(domain);
184
+
185
+ if (renderMode === RENDER_MODE.IDLE) {
186
+ GriddoLog.info(
187
+ `(From Current Render) [${domain}]: Skipping upload-search-content as it is marked as IDLE with the reason ${reason}.`,
188
+ );
189
+ return;
190
+ }
191
+
192
+ const { htmlContentDir, jsonContentDir } = await getContentDirectories(domain);
193
+ await uploadRenderedSearchContentToAPI({
194
+ htmlContentDir,
195
+ jsonContentDir,
196
+ });
197
+ }
198
+
199
+ async function main() {
200
+ if (GRIDDO_SEARCH_FEATURE) {
201
+ await AuthService.login();
202
+ await uploadSearchContent();
203
+ }
204
+ }
205
+
206
+ withErrorHandler(main);
@@ -1,68 +1,17 @@
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";
7
-
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
- }
34
-
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
- }
1
+ import { withErrorHandler } from "../core/errors";
2
+ import { showExporterVersion } from "../core/print-logos";
3
+ import { AuthService } from "../services/auth";
4
+ import { gatsbyRenderDomain } from "../ssg-adapters/gatsby";
5
+
6
+ async function render() {
7
+ await AuthService.login();
8
+ const [domain] = process.argv.slice(2);
9
+ await gatsbyRenderDomain(domain);
10
+ }
58
11
 
59
- errorLabelLog("GRIDDO_ERROR UnknownError");
60
- console.error(error);
61
- process.exit(1);
62
- }
12
+ async function main() {
13
+ await showExporterVersion();
14
+ await render();
63
15
  }
64
16
 
65
- startRender().catch((err) => {
66
- console.error("Error", err?.stdout?.toString() || err);
67
- process.exit(1);
68
- });
17
+ withErrorHandler(main);