@griddo/cx 11.7.6-rc.1 → 11.7.6

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 (300) hide show
  1. package/README.md +228 -25
  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/move-assets.d.ts +1 -0
  6. package/build/commands/prepare-domains-render.d.ts +1 -0
  7. package/build/{exporter/constants → constants}/envs.d.ts +7 -1
  8. package/build/constants/index.d.ts +57 -0
  9. package/build/end-render.js +74 -0
  10. package/build/end-render.js.map +7 -0
  11. package/build/{exporter/constants/errors.d.ts → errors/errors-data.d.ts} +3 -5
  12. package/build/{exporter/utils/errors.d.ts → errors/index.d.ts} +3 -3
  13. package/build/index.d.ts +29 -0
  14. package/build/index.js +73 -0
  15. package/build/index.js.map +7 -0
  16. package/build/prepare-domains-render.js +73 -0
  17. package/build/prepare-domains-render.js.map +7 -0
  18. package/build/react/Favicon/index.d.ts +5 -0
  19. package/build/react/Favicon/utils.d.ts +9 -0
  20. package/build/react/GriddoIntegrations/index.d.ts +20 -0
  21. package/build/react/GriddoIntegrations/utils.d.ts +26 -0
  22. package/{react/index.tsx → build/react/index.d.ts} +0 -1
  23. package/build/react/index.js +3 -0
  24. package/build/registers/api.d.ts +9 -0
  25. package/build/registers/gatsby.d.ts +9 -0
  26. package/build/registers/index.d.ts +3 -0
  27. package/build/reset-render.js +74 -0
  28. package/build/reset-render.js.map +7 -0
  29. package/build/{exporter/services → services}/auth.d.ts +1 -1
  30. package/build/services/domains.d.ts +6 -0
  31. package/build/services/register.d.ts +36 -0
  32. package/build/{exporter/services → services}/robots.d.ts +6 -0
  33. package/build/services/settings.d.ts +4 -0
  34. package/build/{exporter/services → services}/sites.d.ts +2 -5
  35. package/build/services/store.d.ts +6 -0
  36. package/build/start-render.js +100 -0
  37. package/build/start-render.js.map +7 -0
  38. package/build/{exporter/types → types}/api.d.ts +4 -3
  39. package/build/{exporter/types → types}/global.d.ts +6 -6
  40. package/build/{exporter/types → types}/navigation.d.ts +1 -1
  41. package/build/{exporter/types → types}/sites.d.ts +2 -1
  42. package/build/upload-search-content.js +74 -0
  43. package/build/upload-search-content.js.map +7 -0
  44. package/build/utils/alerts.d.ts +3 -0
  45. package/build/{exporter/utils → utils}/cache.d.ts +12 -7
  46. package/build/utils/core-utils.d.ts +107 -0
  47. package/build/utils/create-build-data.d.ts +8 -0
  48. package/build/{exporter/utils → utils}/domains.d.ts +1 -1
  49. package/build/utils/folders.d.ts +53 -0
  50. package/build/{exporter/utils/check-health.d.ts → utils/health-checks.d.ts} +2 -2
  51. package/build/{exporter/utils → utils}/loggin.d.ts +16 -2
  52. package/build/{exporter/utils → utils}/pages.d.ts +2 -2
  53. package/build/utils/render.d.ts +13 -0
  54. package/build/utils/searches.d.ts +15 -0
  55. package/build/{exporter/utils → utils}/sites.d.ts +3 -3
  56. package/build/{exporter/utils → utils}/store.d.ts +38 -10
  57. package/cx.config.d.ts +5 -0
  58. package/cx.config.js +36 -0
  59. package/exporter/adapters/gatsby/index.ts +146 -60
  60. package/exporter/adapters/gatsby/utils.ts +161 -0
  61. package/exporter/artifacts/README.md +34 -0
  62. package/exporter/{utils/artifacts.ts → artifacts/index.ts} +8 -9
  63. package/exporter/build.sh +38 -5
  64. package/exporter/commands/end-render.ts +81 -56
  65. package/exporter/commands/move-assets.ts +11 -0
  66. package/exporter/commands/prepare-domains-render.ts +31 -149
  67. package/exporter/commands/reset-render.ts +3 -12
  68. package/exporter/commands/start-render.ts +47 -18
  69. package/exporter/commands/upload-search-content.ts +21 -206
  70. package/exporter/constants/envs.ts +51 -59
  71. package/exporter/constants/index.ts +129 -0
  72. package/exporter/{constants/errors.ts → errors/errors-data.ts} +15 -24
  73. package/exporter/{utils/errors.ts → errors/index.ts} +9 -10
  74. package/exporter/index.ts +82 -0
  75. package/{react → exporter/react}/Favicon/index.tsx +7 -1
  76. package/{react → exporter/react}/GriddoIntegrations/index.tsx +14 -6
  77. package/{react → exporter/react}/GriddoIntegrations/utils.ts +9 -4
  78. package/exporter/react/index.tsx +11 -0
  79. package/exporter/registers/api.ts +14 -0
  80. package/exporter/registers/gatsby.ts +14 -0
  81. package/exporter/registers/index.ts +4 -0
  82. package/exporter/services/auth.ts +6 -7
  83. package/exporter/services/domains.ts +16 -0
  84. package/exporter/services/navigation.ts +10 -4
  85. package/exporter/services/reference-fields.ts +23 -8
  86. package/exporter/services/register.ts +113 -0
  87. package/exporter/services/robots.ts +15 -8
  88. package/exporter/services/settings.ts +17 -0
  89. package/exporter/services/sites.ts +24 -35
  90. package/exporter/services/store.ts +76 -118
  91. package/exporter/types/api.ts +27 -24
  92. package/exporter/types/global.ts +10 -8
  93. package/exporter/types/navigation.ts +1 -1
  94. package/exporter/types/pages.ts +3 -2
  95. package/exporter/types/sites.ts +2 -1
  96. package/exporter/utils/alerts.ts +29 -0
  97. package/exporter/utils/api.ts +82 -46
  98. package/exporter/utils/cache.ts +59 -34
  99. package/exporter/utils/core-utils.ts +247 -86
  100. package/exporter/utils/create-build-data.ts +17 -0
  101. package/exporter/utils/domains.ts +7 -10
  102. package/exporter/utils/folders.ts +92 -161
  103. package/exporter/utils/health-checks.ts +64 -0
  104. package/exporter/utils/images.ts +6 -1
  105. package/exporter/utils/instance.ts +12 -9
  106. package/exporter/utils/loggin.ts +89 -24
  107. package/exporter/utils/pages.ts +88 -23
  108. package/exporter/utils/render.ts +48 -147
  109. package/exporter/utils/searches.ts +156 -0
  110. package/exporter/utils/sites.ts +77 -67
  111. package/exporter/utils/store.ts +178 -85
  112. package/gatsby-browser.tsx +58 -41
  113. package/gatsby-config.ts +12 -6
  114. package/gatsby-node.ts +77 -15
  115. package/gatsby-ssr.tsx +1 -2
  116. package/package.json +74 -33
  117. package/src/README.md +7 -0
  118. package/src/components/Head.tsx +46 -13
  119. package/src/components/template.tsx +30 -8
  120. package/src/gatsby-node-utils.ts +2 -91
  121. package/src/html.tsx +11 -2
  122. package/src/types.ts +5 -5
  123. package/start-render.js +3 -1
  124. package/tsconfig.json +2 -3
  125. package/build/adapters/gatsby/actions/clean.js +0 -10
  126. package/build/adapters/gatsby/actions/clean.js.map +0 -1
  127. package/build/adapters/gatsby/actions/close.js +0 -12
  128. package/build/adapters/gatsby/actions/close.js.map +0 -1
  129. package/build/adapters/gatsby/actions/data.js +0 -18
  130. package/build/adapters/gatsby/actions/data.js.map +0 -1
  131. package/build/adapters/gatsby/actions/healthCheck.js +0 -10
  132. package/build/adapters/gatsby/actions/healthCheck.js.map +0 -1
  133. package/build/adapters/gatsby/actions/init.js +0 -9
  134. package/build/adapters/gatsby/actions/init.js.map +0 -1
  135. package/build/adapters/gatsby/actions/meta.js +0 -14
  136. package/build/adapters/gatsby/actions/meta.js.map +0 -1
  137. package/build/adapters/gatsby/actions/prepare.js +0 -9
  138. package/build/adapters/gatsby/actions/prepare.js.map +0 -1
  139. package/build/adapters/gatsby/actions/relocation.js +0 -15
  140. package/build/adapters/gatsby/actions/relocation.js.map +0 -1
  141. package/build/adapters/gatsby/actions/restore.js +0 -26
  142. package/build/adapters/gatsby/actions/restore.js.map +0 -1
  143. package/build/adapters/gatsby/actions/ssg.js +0 -9
  144. package/build/adapters/gatsby/actions/ssg.js.map +0 -1
  145. package/build/adapters/gatsby/actions/sync.js +0 -50
  146. package/build/adapters/gatsby/actions/sync.js.map +0 -1
  147. package/build/adapters/gatsby/index.js +0 -74
  148. package/build/adapters/gatsby/index.js.map +0 -1
  149. package/build/adapters/gatsby/shared/context.js +0 -25
  150. package/build/adapters/gatsby/shared/context.js.map +0 -1
  151. package/build/adapters/gatsby/shared/extract-assets.js +0 -58
  152. package/build/adapters/gatsby/shared/extract-assets.js.map +0 -1
  153. package/build/adapters/gatsby/shared/gatsby-build.js +0 -49
  154. package/build/adapters/gatsby/shared/gatsby-build.js.map +0 -1
  155. package/build/adapters/gatsby/shared/sync-render.js +0 -208
  156. package/build/adapters/gatsby/shared/sync-render.js.map +0 -1
  157. package/build/adapters/gatsby/shared/types.js +0 -3
  158. package/build/adapters/gatsby/shared/types.js.map +0 -1
  159. package/build/commands/end-render.js +0 -63
  160. package/build/commands/end-render.js.map +0 -1
  161. package/build/commands/prepare-assets-directory.js +0 -32
  162. package/build/commands/prepare-assets-directory.js.map +0 -1
  163. package/build/commands/prepare-domains-render.js +0 -138
  164. package/build/commands/prepare-domains-render.js.map +0 -1
  165. package/build/commands/reset-render.js +0 -22
  166. package/build/commands/reset-render.js.map +0 -1
  167. package/build/commands/start-render.js +0 -35
  168. package/build/commands/start-render.js.map +0 -1
  169. package/build/commands/upload-search-content.js +0 -189
  170. package/build/commands/upload-search-content.js.map +0 -1
  171. package/build/constants/endpoints.js +0 -42
  172. package/build/constants/endpoints.js.map +0 -1
  173. package/build/constants/envs.js +0 -73
  174. package/build/constants/envs.js.map +0 -1
  175. package/build/constants/errors.js +0 -89
  176. package/build/constants/errors.js.map +0 -1
  177. package/build/exporter/adapters/gatsby/actions/clean.d.ts +0 -3
  178. package/build/exporter/adapters/gatsby/actions/close.d.ts +0 -3
  179. package/build/exporter/adapters/gatsby/actions/data.d.ts +0 -2
  180. package/build/exporter/adapters/gatsby/actions/healthCheck.d.ts +0 -2
  181. package/build/exporter/adapters/gatsby/actions/init.d.ts +0 -2
  182. package/build/exporter/adapters/gatsby/actions/meta.d.ts +0 -2
  183. package/build/exporter/adapters/gatsby/actions/prepare.d.ts +0 -2
  184. package/build/exporter/adapters/gatsby/actions/relocation.d.ts +0 -2
  185. package/build/exporter/adapters/gatsby/actions/restore.d.ts +0 -3
  186. package/build/exporter/adapters/gatsby/actions/ssg.d.ts +0 -3
  187. package/build/exporter/adapters/gatsby/actions/sync.d.ts +0 -3
  188. package/build/exporter/adapters/gatsby/index.d.ts +0 -9
  189. package/build/exporter/adapters/gatsby/shared/context.d.ts +0 -38
  190. package/build/exporter/adapters/gatsby/shared/extract-assets.d.ts +0 -7
  191. package/build/exporter/adapters/gatsby/shared/gatsby-build.d.ts +0 -7
  192. package/build/exporter/adapters/gatsby/shared/sync-render.d.ts +0 -36
  193. package/build/exporter/adapters/gatsby/shared/types.d.ts +0 -34
  194. package/build/exporter/commands/prepare-assets-directory.d.ts +0 -2
  195. package/build/exporter/commands/prepare-domains-render.d.ts +0 -2
  196. package/build/exporter/services/db.d.ts +0 -4
  197. package/build/exporter/services/store.d.ts +0 -15
  198. package/build/exporter/types/render.d.ts +0 -50
  199. package/build/exporter/utils/artifacts.d.ts +0 -6
  200. package/build/exporter/utils/brush.d.ts +0 -18
  201. package/build/exporter/utils/core-utils.d.ts +0 -77
  202. package/build/exporter/utils/folders.d.ts +0 -66
  203. package/build/exporter/utils/render.d.ts +0 -49
  204. package/build/services/auth.js +0 -39
  205. package/build/services/auth.js.map +0 -1
  206. package/build/services/db.js +0 -34
  207. package/build/services/db.js.map +0 -1
  208. package/build/services/navigation.js +0 -93
  209. package/build/services/navigation.js.map +0 -1
  210. package/build/services/reference-fields.js +0 -131
  211. package/build/services/reference-fields.js.map +0 -1
  212. package/build/services/robots.js +0 -58
  213. package/build/services/robots.js.map +0 -1
  214. package/build/services/sites.js +0 -109
  215. package/build/services/sites.js.map +0 -1
  216. package/build/services/store.js +0 -282
  217. package/build/services/store.js.map +0 -1
  218. package/build/types/api.js +0 -3
  219. package/build/types/api.js.map +0 -1
  220. package/build/types/global.js +0 -3
  221. package/build/types/global.js.map +0 -1
  222. package/build/types/navigation.js +0 -3
  223. package/build/types/navigation.js.map +0 -1
  224. package/build/types/pages.js +0 -3
  225. package/build/types/pages.js.map +0 -1
  226. package/build/types/render.js +0 -10
  227. package/build/types/render.js.map +0 -1
  228. package/build/types/sites.js +0 -3
  229. package/build/types/sites.js.map +0 -1
  230. package/build/types/templates.js +0 -3
  231. package/build/types/templates.js.map +0 -1
  232. package/build/utils/api.js +0 -161
  233. package/build/utils/api.js.map +0 -1
  234. package/build/utils/artifacts.js +0 -34
  235. package/build/utils/artifacts.js.map +0 -1
  236. package/build/utils/brush.js +0 -30
  237. package/build/utils/brush.js.map +0 -1
  238. package/build/utils/cache.js +0 -106
  239. package/build/utils/cache.js.map +0 -1
  240. package/build/utils/check-health.js +0 -68
  241. package/build/utils/check-health.js.map +0 -1
  242. package/build/utils/core-utils.js +0 -251
  243. package/build/utils/core-utils.js.map +0 -1
  244. package/build/utils/domains.js +0 -37
  245. package/build/utils/domains.js.map +0 -1
  246. package/build/utils/errors.js +0 -30
  247. package/build/utils/errors.js.map +0 -1
  248. package/build/utils/folders.js +0 -339
  249. package/build/utils/folders.js.map +0 -1
  250. package/build/utils/images.js +0 -45
  251. package/build/utils/images.js.map +0 -1
  252. package/build/utils/instance.js +0 -66
  253. package/build/utils/instance.js.map +0 -1
  254. package/build/utils/loggin.js +0 -102
  255. package/build/utils/loggin.js.map +0 -1
  256. package/build/utils/pages.js +0 -359
  257. package/build/utils/pages.js.map +0 -1
  258. package/build/utils/render.js +0 -144
  259. package/build/utils/render.js.map +0 -1
  260. package/build/utils/sites.js +0 -239
  261. package/build/utils/sites.js.map +0 -1
  262. package/build/utils/store.js +0 -193
  263. package/build/utils/store.js.map +0 -1
  264. package/exporter/adapters/gatsby/actions/clean.ts +0 -14
  265. package/exporter/adapters/gatsby/actions/close.ts +0 -17
  266. package/exporter/adapters/gatsby/actions/data.ts +0 -25
  267. package/exporter/adapters/gatsby/actions/healthCheck.ts +0 -10
  268. package/exporter/adapters/gatsby/actions/init.ts +0 -12
  269. package/exporter/adapters/gatsby/actions/meta.ts +0 -18
  270. package/exporter/adapters/gatsby/actions/prepare.ts +0 -9
  271. package/exporter/adapters/gatsby/actions/relocation.ts +0 -15
  272. package/exporter/adapters/gatsby/actions/restore.ts +0 -36
  273. package/exporter/adapters/gatsby/actions/ssg.ts +0 -12
  274. package/exporter/adapters/gatsby/actions/sync.ts +0 -70
  275. package/exporter/adapters/gatsby/shared/context.ts +0 -50
  276. package/exporter/adapters/gatsby/shared/extract-assets.ts +0 -61
  277. package/exporter/adapters/gatsby/shared/gatsby-build.ts +0 -54
  278. package/exporter/adapters/gatsby/shared/sync-render.ts +0 -294
  279. package/exporter/adapters/gatsby/shared/types.ts +0 -35
  280. package/exporter/build-esbuild.noop +0 -42
  281. package/exporter/commands/prepare-assets-directory.ts +0 -33
  282. package/exporter/services/db.ts +0 -32
  283. package/exporter/types/render.ts +0 -59
  284. package/exporter/utils/brush.ts +0 -34
  285. package/exporter/utils/check-health.ts +0 -79
  286. package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +0 -55
  287. package/plugins/gatsby-plugin-svgr-loader/package.json +0 -8
  288. package/build/{exporter/commands → commands}/end-render.d.ts +0 -0
  289. package/build/{exporter/commands → commands}/reset-render.d.ts +0 -0
  290. package/build/{exporter/commands → commands}/start-render.d.ts +0 -0
  291. package/build/{exporter/commands → commands}/upload-search-content.d.ts +0 -0
  292. package/build/{exporter/constants → constants}/endpoints.d.ts +0 -0
  293. package/build/{exporter/services → services}/navigation.d.ts +0 -0
  294. package/build/{exporter/services → services}/reference-fields.d.ts +0 -0
  295. package/build/{exporter/types → types}/pages.d.ts +1 -1
  296. /package/build/{exporter/types → types}/templates.d.ts +0 -0
  297. /package/build/{exporter/utils → utils}/api.d.ts +0 -0
  298. /package/build/{exporter/utils → utils}/images.d.ts +0 -0
  299. /package/build/{exporter/utils → utils}/instance.d.ts +0 -0
  300. /package/{react → exporter/react}/Favicon/utils.ts +0 -0
@@ -1,76 +1,162 @@
1
- import type { SSG } from "./shared/types";
1
+ import type {
2
+ Artifacts,
3
+ LifeCyclesNames,
4
+ LifeCycleSteps,
5
+ } from "../../types/global";
2
6
 
3
7
  import path from "node:path";
4
8
 
5
- import { GRIDDO_ASSET_PREFIX } from "../../constants/envs";
6
- import { getCxArtifacts } from "../../utils/artifacts";
7
- import { doLifeCycle } from "../../utils/core-utils";
9
+ import {
10
+ createDistFromGatsbyPublic,
11
+ getGatsbyAssetPrefixWithDomain,
12
+ runGatsbyBuildCommand,
13
+ } from "./utils";
14
+ import getCxArtifacts from "../../artifacts";
15
+ import { AuthService } from "../../services/auth";
16
+ import {
17
+ createDomainMetadata,
18
+ doLifeCycle,
19
+ getConfig,
20
+ saveBuildEndLogs,
21
+ } from "../../utils/core-utils";
22
+ import { createDomainRenderData } from "../../utils/create-build-data";
23
+ import {
24
+ copyArtifacts,
25
+ createArtifacts,
26
+ deleteDisposableSiteDirs,
27
+ moveArtifacts,
28
+ removeArtifacts,
29
+ removeVirtualPagesFromStore,
30
+ renameArtifact,
31
+ } from "../../utils/folders";
8
32
  import { infoLog } from "../../utils/loggin";
9
- import { getRenderMetadataFromDB, getRenderMode, getRenderPathsFromDB } from "../../utils/render";
10
- import { cleanAction } from "./actions/clean";
11
- import { closeAction } from "./actions/close";
12
- import { dataAction } from "./actions/data";
13
- import { healthCheckAction } from "./actions/healthCheck";
14
- import { initAction } from "./actions/init";
15
- import { metaAction } from "./actions/meta";
16
- import { prepareAction } from "./actions/prepare";
17
- import { relocationAction } from "./actions/relocation";
18
- import { restoreAction } from "./actions/restore";
19
- import { ssgAction } from "./actions/ssg";
20
- import { syncAction } from "./actions/sync";
21
- import { RenderContext } from "./shared/context";
33
+ import {
34
+ createSentinelRenderFile,
35
+ deleteSentinelRenderFile,
36
+ isValidRender,
37
+ } from "../../utils/render";
22
38
 
23
39
  /**
24
- * Executes a complete Gatsby render process for a given domain.
25
- *
26
- * The render process consists of multiple lifecycle steps that handle cleaning,
27
- * preparing, building and syncing the site. It can run in two modes:
28
- * - FROM_SCRATCH: Performs a complete rebuild of the site
29
- * - INCREMENTAL: Only rebuilds changed pages while preserving the rest
40
+ * Render every instance domain with the Gatsby adapter.
30
41
  */
31
- export async function gatsbyRenderDomain(domain: string) {
32
- const { renderMode, reason } = await getRenderMode(domain);
42
+ export async function renderDomainsWithGatsbyAdapter(domain: string) {
43
+ await AuthService.login();
44
+ const config = getConfig();
33
45
 
34
- if (renderMode === "IDLE") {
35
- return;
36
- }
46
+ infoLog(`Initializing render for the domain ${domain}\n`);
47
+
48
+ const {
49
+ //
50
+ __ssg,
51
+ __exports,
52
+ __cache,
53
+ __cx,
54
+ __components,
55
+ } = config.paths(domain);
37
56
 
38
- const renderReason = reason ? `<${reason}>` : "";
39
- infoLog(`Init render (${renderMode}) ${renderReason} for domain ${domain}\n`);
57
+ // Griddo artifacts
58
+ const cxArtifacts = getCxArtifacts(domain);
40
59
 
41
- const renderMetadata = await getRenderMetadataFromDB();
42
- const paths = await getRenderPathsFromDB({ domain });
43
- const cxArtifacts = await getCxArtifacts(domain);
44
- const domainNeedsAssetPrefix = GRIDDO_ASSET_PREFIX && domain.startsWith(renderMetadata.proDomain);
45
- const assetPrefix = domainNeedsAssetPrefix ? `${GRIDDO_ASSET_PREFIX}/${domain}` : "";
46
- const ssgArtifacts = {
60
+ // Gatsby artifacts
61
+ const gatsbyArtifacts: Pick<Artifacts, "disposables" | "cacheables"> = {
47
62
  disposables: [
48
- path.join(paths.__ssg, "public"),
49
- path.join(paths.__ssg, "static"),
50
- path.join(paths.__ssg, ".cache"),
51
- path.join(paths.__ssg, "domains.json"), // Este disposable es de griddo pero está en la ruta __ssg
63
+ path.join(__ssg, "public"),
64
+ path.join(__ssg, "static"),
65
+ path.join(__ssg, ".cache"),
52
66
  ],
53
67
  cacheables: [".cache"],
54
68
  };
55
69
 
56
- const context = new RenderContext<SSG>({
57
- domain,
58
- renderMode,
59
- paths,
60
- renderMetadata,
61
- cxArtifacts,
62
- ssg: { assetPrefix, ssgArtifacts },
63
- });
64
-
65
- await doLifeCycle("Init", async () => initAction(context));
66
- await doLifeCycle("Clean", async () => cleanAction(context));
67
- await doLifeCycle("Prepare", async () => prepareAction(context));
68
- await doLifeCycle("Restore", async () => restoreAction(context));
69
- await doLifeCycle("Data", async () => dataAction(context));
70
- await doLifeCycle("SSG", async () => ssgAction(context));
71
- await doLifeCycle("Relocation", async () => relocationAction(context));
72
- await doLifeCycle("Meta", async () => metaAction(context));
73
- await doLifeCycle("Sync", async () => syncAction(context));
74
- await doLifeCycle("Close", async () => closeAction(context));
75
- await doLifeCycle("HealthCheck", async () => healthCheckAction(context));
70
+ // These variables are involved in the build for create the dist directory
71
+ // from public and pass to the gatsby-build command via spawnSync.
72
+ const assetPrefix = getGatsbyAssetPrefixWithDomain(domain);
73
+ const needsAssetPrefix = !!assetPrefix && assetPrefix !== "";
74
+
75
+ // Compose artifacts
76
+ const disposableArtifacts = [
77
+ ...cxArtifacts.disposables,
78
+ ...gatsbyArtifacts.disposables,
79
+ ];
80
+
81
+ // LifeCycles
82
+
83
+ const allLifeCycles: Array<{
84
+ name: LifeCyclesNames;
85
+ steps: LifeCycleSteps;
86
+ }> = [
87
+ {
88
+ name: "Init",
89
+ steps: [() => createSentinelRenderFile()],
90
+ },
91
+
92
+ {
93
+ name: "Clean",
94
+ steps: [() => removeArtifacts(disposableArtifacts)],
95
+ },
96
+
97
+ {
98
+ name: "Prepare",
99
+ steps: [() => createArtifacts(cxArtifacts.initials)],
100
+ },
101
+
102
+ {
103
+ name: "Restore",
104
+ steps: [
105
+ () => copyArtifacts(__components, __ssg, ["static"]),
106
+ () => copyArtifacts(__exports, __cx, cxArtifacts.archivables),
107
+ () =>
108
+ renameArtifact(path.join(__cx, "dist"), path.join(__ssg, "public")),
109
+ () => moveArtifacts(__cache, __cx, cxArtifacts.cacheables),
110
+ () => moveArtifacts(__cache, __ssg, gatsbyArtifacts.cacheables),
111
+ ],
112
+ },
113
+
114
+ {
115
+ name: "Data",
116
+ steps: [() => createDomainRenderData(domain)],
117
+ },
118
+
119
+ {
120
+ name: "SSG",
121
+ steps: [() => runGatsbyBuildCommand(assetPrefix)],
122
+ },
123
+
124
+ {
125
+ name: "Relocation",
126
+ steps: [() => createDistFromGatsbyPublic(domain, needsAssetPrefix)],
127
+ },
128
+
129
+ {
130
+ name: "Meta",
131
+ steps: [() => createDomainMetadata(domain), () => saveBuildEndLogs()],
132
+ },
133
+
134
+ {
135
+ name: "Archive",
136
+ steps: [
137
+ () => removeVirtualPagesFromStore(),
138
+ () => deleteDisposableSiteDirs(),
139
+ () =>
140
+ moveArtifacts(__cx, __exports, cxArtifacts.archivables, {
141
+ withBackup: true,
142
+ }),
143
+ () => moveArtifacts(__cx, __cache, cxArtifacts.cacheables),
144
+ () => moveArtifacts(__ssg, __cache, gatsbyArtifacts.cacheables),
145
+ ],
146
+ },
147
+
148
+ {
149
+ name: "Close",
150
+ steps: [() => removeArtifacts(disposableArtifacts)],
151
+ },
152
+
153
+ {
154
+ name: "HealthCheck",
155
+ steps: [() => isValidRender(), () => deleteSentinelRenderFile()],
156
+ },
157
+ ];
158
+
159
+ for (const { name, steps } of allLifeCycles) {
160
+ await doLifeCycle(name, steps);
161
+ }
76
162
  }
@@ -0,0 +1,161 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import path from "node:path";
3
+
4
+ import fsx from "fs-extra";
5
+
6
+ import { envs } from "../../constants";
7
+ import { throwError } from "../../errors";
8
+ import { ErrorInSSGBuildProcess } from "../../errors/errors-data";
9
+ import { getConfig } from "../../utils/core-utils";
10
+ import { verboseLog } from "../../utils/loggin";
11
+
12
+ const config = getConfig();
13
+
14
+ /**
15
+ * Return the assetPrefix with the domain concatenated `assetPrefix/domain` only
16
+ * if the domain is "pro-" **and** there is a env `GRIDDO_ASSET_PREFIX` with any
17
+ * value different from `null`, `undefined` or `empty string`
18
+ *
19
+ * else...
20
+ * - If assetPrefix or domain is falsy, returns ""
21
+ * - If the domain is not "pro-", returns ""
22
+ */
23
+ function getGatsbyAssetPrefixWithDomain(domain: string) {
24
+ const { proDomain } = getConfig();
25
+
26
+ if (!envs.GRIDDO_ASSET_PREFIX || !domain) {
27
+ return "";
28
+ }
29
+
30
+ if (!domain.startsWith(proDomain)) {
31
+ return "";
32
+ }
33
+
34
+ const assetPrefixWithDomain = `${envs.GRIDDO_ASSET_PREFIX}/${domain}`;
35
+
36
+ verboseLog(
37
+ `Reading process.env.GRIDDO_ASSET_PREFIX, ${envs.GRIDDO_ASSET_PREFIX}`,
38
+ );
39
+ verboseLog(
40
+ `Setting the asset prefix with the domain concatenated, ${assetPrefixWithDomain}`,
41
+ );
42
+
43
+ return assetPrefixWithDomain;
44
+ }
45
+
46
+ /**
47
+ * Spawn a new node process `yarn gatsby-build`
48
+ * @note This proccess (`yarn gatsby-build`) can not access to the custom Griddo
49
+ * `process.env` so it needs variables passed to it via the `env` prop.
50
+ */
51
+ function runGatsbyBuildCommand(assetPrefixWithDomain: string) {
52
+ verboseLog(`read assetPrefixWithDomain, ${assetPrefixWithDomain}`);
53
+ verboseLog(
54
+ `using this NODE_OPTIONS in gatsby command: ${process.env.NODE_OPTIONS}`,
55
+ );
56
+
57
+ const { __ssg } = config.paths();
58
+
59
+ // Remove `--openssl-legacy-provider` from NODE_OPTIONS because this value
60
+ // break Gataby render.
61
+ const nodeOptionsWithoutLegacyOpenSSL = process.env.NODE_OPTIONS
62
+ ? process.env.NODE_OPTIONS.replace(
63
+ /--openssl-legacy-provider\s*/g,
64
+ "",
65
+ ).trim()
66
+ : "";
67
+
68
+ const command = spawnSync(
69
+ "yarn",
70
+ ["gatsby-build", envs.GRIDDO_SSG_VERBOSE_LOGS ? "--verbose" : ""],
71
+ {
72
+ cwd: __ssg,
73
+ stdio: ["ignore", "inherit", "ignore"],
74
+ encoding: "utf8",
75
+ shell: true,
76
+ env: Object.assign(process.env, {
77
+ GRIDDO_EXPORTER: "true",
78
+ SPAWN_ASSET_PREFIX_WITH_DOMAIN: assetPrefixWithDomain,
79
+ NODE_OPTIONS: nodeOptionsWithoutLegacyOpenSSL,
80
+ }),
81
+ },
82
+ );
83
+
84
+ if (command.status !== 0) {
85
+ throwError(ErrorInSSGBuildProcess(command));
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Update the Griddo's `/dist` dir with the contents from `public` dir only
91
+ * with files of type: js, json and css.
92
+ */
93
+ async function createDistFromGatsbyPublic(
94
+ domain: string,
95
+ needsAssetPrefix: boolean,
96
+ ) {
97
+ const { __cx, __ssg } = config.paths(domain);
98
+
99
+ const cxDistDir = path.join(__cx, "dist");
100
+ const cxAssetsDir = path.join(__cx, "assets");
101
+ const cxDistDirWithDomain = path.join(__cx, "dist", domain);
102
+ const publicDir = path.join(__ssg, "public");
103
+
104
+ const validFilesFromPublic = fsx
105
+ .readdirSync(publicDir)
106
+ .filter(
107
+ (file) =>
108
+ path.extname(file) === ".js" ||
109
+ path.extname(file) === ".json" ||
110
+ path.extname(file) === ".css",
111
+ );
112
+
113
+ const pageDataSrc = `${publicDir}/page-data`;
114
+ const pageDataDest = `${cxAssetsDir}/page-data`;
115
+
116
+ const projectStaticSrc = path.join(__ssg, "static");
117
+ const projectStaticDest = cxAssetsDir;
118
+
119
+ const gatsbyStaticSrc = `${cxDistDir}/static`;
120
+ const gatsbyStaticDest = `${cxAssetsDir}/static`;
121
+
122
+ try {
123
+ fsx.mkdirSync(cxAssetsDir, { recursive: true });
124
+ fsx.copySync(publicDir, cxDistDir, { preserveTimestamps: true });
125
+
126
+ if (needsAssetPrefix) {
127
+ fsx.copySync(pageDataSrc, pageDataDest, { preserveTimestamps: true });
128
+ if (fsx.existsSync(projectStaticSrc)) {
129
+ fsx.copySync(projectStaticSrc, projectStaticDest, {
130
+ overwrite: false,
131
+ preserveTimestamps: true,
132
+ });
133
+ }
134
+ fsx.copySync(gatsbyStaticSrc, gatsbyStaticDest, {
135
+ overwrite: false,
136
+ preserveTimestamps: true,
137
+ });
138
+ if (fsx.existsSync(projectStaticSrc)) {
139
+ fsx.copySync(projectStaticSrc, cxDistDirWithDomain, {
140
+ overwrite: false,
141
+ preserveTimestamps: true,
142
+ });
143
+ }
144
+
145
+ // Copia el resto de archivos...
146
+ validFilesFromPublic.map((file) => {
147
+ const fileSrc = `${publicDir}/${file}`;
148
+ const fileDest = `${cxAssetsDir}/${file}`;
149
+ fsx.copySync(fileSrc, fileDest, { preserveTimestamps: true });
150
+ });
151
+ }
152
+ } catch (err) {
153
+ console.error(err);
154
+ }
155
+ }
156
+
157
+ export {
158
+ createDistFromGatsbyPublic,
159
+ getGatsbyAssetPrefixWithDomain,
160
+ runGatsbyBuildCommand,
161
+ };
@@ -0,0 +1,34 @@
1
+ # CX Artifacs
2
+
3
+ ## How to add an artifact.
4
+
5
+ An artifact is a **full path** to a file or directory if it has a fixed
6
+ location or only a **name** when it is going to be moved (archived/restored)
7
+ between directories in the rendering process and therefore doesn't have a
8
+ single location.
9
+
10
+ Only the exporter knows where the artifacts are archived and restored, so the
11
+ artifacts don't need to know anything other than their own location or name.
12
+
13
+ Si estás creando un adaptador, sus artefactos deberán ir en un archivo separado (igual que `artifacts/cx.ts`) y exportar una función por defecto que devuelva un `Artifacts`. Todo deberá estar exportado desde `artifacts/index.ts`.
14
+
15
+ **Artifacts have four categories:**
16
+
17
+ - **initials**: Are directories that need to be created for their
18
+ future use.
19
+
20
+ - **archivables**: Are stored in `__exports` which is the one uploaded to the
21
+ server as the final render and restored in `__cx` and `__ssg` to be reused in the
22
+ render. Therefore, they don't have a single location and should be added only
23
+ with the artifact name (directory/file)
24
+
25
+ - **cacheables**: Are stored in `__cache` and restored in `__cx` and `__ssg` to be
26
+ reused in each domain render. Therefore, they don't have a single location.
27
+
28
+ - **disposables**: Are generated alwais in `__cx` and `__ssg` or fixed locations.
29
+ These artifacts are discarded (deleted) in each domain render. They are
30
+ temporary directories and/or files.
31
+
32
+ ## Example
33
+
34
+ Check `cx.ts` inside `./artifacts` directory to see how to add an artifact.
@@ -2,13 +2,14 @@ import type { Artifacts } from "../types/global";
2
2
 
3
3
  import path from "node:path";
4
4
 
5
- import { getRenderPathsFromDB } from "./render";
5
+ import { getConfig } from "../utils/core-utils";
6
6
 
7
7
  /**
8
8
  * Returns the artifacts of CX.
9
9
  */
10
- async function getCxArtifacts(domain: string): Promise<Artifacts> {
11
- const { __cx, __exports, __cache } = await getRenderPathsFromDB({ domain });
10
+ function getCxArtifacts(domain: string): Artifacts {
11
+ const config = getConfig();
12
+ const { __cx, __exports, __cache } = config.paths(domain);
12
13
 
13
14
  return {
14
15
  initials: [
@@ -20,15 +21,13 @@ async function getCxArtifacts(domain: string): Promise<Artifacts> {
20
21
  disposables: [
21
22
  path.join(__cx, "store"),
22
23
  path.join(__cx, "apiCache"),
24
+ path.join(__cx, "render-metadata.json"),
23
25
  path.join(__cx, "dist"),
24
- path.join(__cx, "dist-restored"),
25
26
  path.join(__cx, "debug"),
26
- path.join(__cx, "assets"),
27
27
  ],
28
- cacheables: [],
29
- archivables: ["dist", "debug", "assets"],
30
- restaurable: ["dist", "debug"],
28
+ cacheables: ["apiCache", "store"],
29
+ archivables: ["dist", "assets", "debug"],
31
30
  };
32
31
  }
33
32
 
34
- export { getCxArtifacts };
33
+ export default getCxArtifacts;
package/exporter/build.sh CHANGED
@@ -1,6 +1,39 @@
1
- #!/usr/bin/env bash
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.
2
11
 
3
- echo "📦 Compiling CX..."
4
- rm -rf ./build
5
- tsc --project tsconfig.commands.json
6
- tsc --emitDeclarationOnly --declaration --outDir build --project tsconfig.exporter.json
12
+ # start
13
+ echo "📦 Building ..."
14
+
15
+ # CLI options
16
+ log="--log-level=error"
17
+ production_node_opts="--bundle --platform=node --minify --sourcemap"
18
+ debugging_node_opts="--bundle --platform=node --sourcemap"
19
+ react_opts="--platform=node --external:@griddo-instance --external:react --external:react-dom --bundle --minify"
20
+
21
+ # Manage --minify for debugging
22
+ bundle_node_opts=$production_node_opts
23
+ if [ "$1" = "--debug" ]; then
24
+ bundle_node_opts=$debugging_node_opts
25
+ fi
26
+
27
+ # library
28
+ esbuild ${log} ./exporter/index.ts ${bundle_node_opts} --outfile=./build/index.js
29
+ esbuild ${log} ./exporter/react/index.tsx ${react_opts} --outfile=./build/react/index.js
30
+
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
37
+
38
+ # types
39
+ tsc --emitDeclarationOnly --declaration --outDir build --project tsconfig.exporter.json
@@ -1,80 +1,105 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import type { Report } from "../types/render";
4
-
5
- import fsp from "node:fs/promises";
3
+ import fs from "node:fs";
6
4
  import path from "node:path";
7
5
 
8
- import { ArtifactError } from "../constants/errors";
6
+ import pkgDir from "pkg-dir";
7
+
9
8
  import { AuthService } from "../services/auth";
10
9
  import { endSiteRender } from "../services/sites";
11
- import { doLifeCycle } from "../utils/core-utils";
12
- import { throwError } from "../utils/errors";
13
- import { pathExists } from "../utils/folders";
10
+ import { getConfig } from "../utils/core-utils";
11
+ import { getInstanceDomains } from "../utils/domains";
14
12
  import { infoLog } from "../utils/loggin";
15
- import { getRenderMetadataFromDB, getRenderMode, getRenderPathsFromDB } from "../utils/render";
16
-
17
- async function getRenderReport(options: {
18
- domain: string;
19
- exportsSiteDir: string;
20
- buildReportFileName: string;
21
- }) {
22
- const { buildReportFileName, domain, exportsSiteDir: exportArchiveBasePath } = options;
23
- const buildReportFile = path.resolve(exportArchiveBasePath, domain, "dist", buildReportFileName);
24
-
25
- if (!(await pathExists(buildReportFile))) {
26
- infoLog(`Build report file "${buildReportFile}" not found.`);
27
- throwError(ArtifactError);
28
- }
29
13
 
30
- return JSON.parse(await fsp.readFile(buildReportFile, "utf-8")) as Report;
31
- }
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
+ };
32
38
 
33
- const sendEndSiteRender = async (report: Report) => {
34
- const sites = report.sites;
39
+ function getDomainRenderReport(domain: string) {
40
+ const reports: Array<Report> = [];
41
+ const { buildReportFileName } = getConfig();
35
42
 
36
- for (const site of sites) {
37
- const { siteId, ...body } = site;
38
- infoLog(`Site (${siteId})`);
39
- await endSiteRender(siteId, body);
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.`);
40
52
  }
41
- };
42
53
 
43
- async function endRenderAction() {
44
- const { buildReportFileName } = await getRenderMetadataFromDB();
45
- const { __sites } = await getRenderPathsFromDB();
54
+ const buildReport = JSON.parse(fs.readFileSync(buildReportFile, "utf-8"));
46
55
 
47
- const [domain] = process.argv.slice(2);
48
- const { renderMode } = await getRenderMode(domain);
56
+ reports.push(buildReport);
49
57
 
50
- if (renderMode === "IDLE") {
51
- infoLog(`Skipping build-end for domain ${domain} as it is marked as IDLE.`);
52
- return;
53
- }
58
+ return reports;
59
+ }
54
60
 
55
- await AuthService.login();
61
+ (async () => {
62
+ const sendEndSiteRender = async (reports: Array<Report>) => {
63
+ for (const report of reports) {
64
+ const sites = report.sites;
56
65
 
57
- const report = await getRenderReport({
58
- domain,
59
- exportsSiteDir: __sites,
60
- buildReportFileName,
61
- });
66
+ for (const site of sites) {
67
+ const { siteId, ...body } = site;
62
68
 
63
- infoLog(`Sending ending call to ${domain} sites`);
69
+ console.info(`Site (${siteId})`);
64
70
 
65
- for (const site of report.sites) {
66
- site.publishHashes = [...new Set(site.publishHashes)];
67
- site.unpublishHashes = [...new Set(site.unpublishHashes)];
68
- }
71
+ await endSiteRender(siteId, body);
72
+ }
73
+ }
74
+ };
69
75
 
70
- await sendEndSiteRender(report);
71
- }
76
+ if (RENDER_BY_DOMAIN) {
77
+ await AuthService.login();
78
+ const domain = process.argv.splice(2)[0];
79
+ const reports = getDomainRenderReport(domain);
72
80
 
73
- async function main() {
74
- await doLifeCycle("EndRender", endRenderAction);
75
- }
81
+ infoLog(`Sending ending call to ${domain} sites`);
82
+
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
+ }
88
+ }
89
+
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);
76
96
 
77
- main().catch((err) => {
97
+ infoLog(`Sending ending call to ${domain} sites`);
98
+
99
+ await sendEndSiteRender(reports);
100
+ }
101
+ }
102
+ })().catch((err) => {
78
103
  console.error("Error", err?.stdout?.toString() || err);
79
104
  process.exit(1);
80
105
  });
@@ -0,0 +1,11 @@
1
+ import { execSync } from "node:child_process";
2
+ import path from "node:path";
3
+
4
+ const domainName = "pro-griddo";
5
+ const domainPath = path.resolve(
6
+ __dirname,
7
+ `../../../exports/sites/${domainName}`,
8
+ );
9
+
10
+ execSync(`mkdir -p ${domainPath}/assets/${domainName}`);
11
+ execSync(`cp -R ${domainPath}/assets/* ${domainPath}/assets/${domainName}`);