@griddo/cx 11.2.4 → 11.2.5-rc.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 (64) hide show
  1. package/build/adapters/gatsby/index.d.ts +1 -1
  2. package/build/commands/prepare-domains-render.d.ts +1 -0
  3. package/build/commands/upload-search-content.d.ts +2 -0
  4. package/build/constants/envs.d.ts +2 -1
  5. package/build/end-render.js +25 -25
  6. package/build/end-render.js.map +4 -4
  7. package/build/index.d.ts +1 -2
  8. package/build/index.js +28 -51
  9. package/build/index.js.map +4 -4
  10. package/build/prepare-domains-render.js +73 -0
  11. package/build/prepare-domains-render.js.map +7 -0
  12. package/build/reset-render.js +21 -21
  13. package/build/reset-render.js.map +4 -4
  14. package/build/services/sites.d.ts +5 -1
  15. package/build/start-render.js +41 -38
  16. package/build/start-render.js.map +4 -4
  17. package/build/types/global.d.ts +5 -4
  18. package/build/types/sites.d.ts +7 -0
  19. package/build/upload-search-content.js +18 -18
  20. package/build/upload-search-content.js.map +4 -4
  21. package/build/utils/core-utils.d.ts +4 -8
  22. package/build/utils/create-build-data.d.ts +2 -2
  23. package/build/utils/domains.d.ts +9 -1
  24. package/build/utils/publish.d.ts +7 -0
  25. package/build/utils/render.d.ts +1 -1
  26. package/build/utils/sites.d.ts +2 -2
  27. package/build/utils/store.d.ts +28 -3
  28. package/exporter/adapters/gatsby/index.ts +124 -126
  29. package/exporter/build.sh +5 -5
  30. package/exporter/commands/end-render.ts +107 -0
  31. package/exporter/commands/prepare-domains-render.ts +89 -0
  32. package/exporter/commands/start-render.ts +68 -0
  33. package/exporter/{scripts → commands}/upload-search-content.ts +1 -1
  34. package/exporter/constants/envs.ts +4 -2
  35. package/exporter/constants/index.ts +1 -0
  36. package/exporter/index.ts +0 -2
  37. package/exporter/services/sites.ts +26 -0
  38. package/exporter/services/store.ts +33 -81
  39. package/exporter/types/global.ts +6 -2
  40. package/exporter/types/sites.ts +7 -0
  41. package/exporter/utils/core-utils.ts +5 -21
  42. package/exporter/utils/create-build-data.ts +2 -2
  43. package/exporter/utils/domains.ts +1 -1
  44. package/exporter/utils/folders.ts +2 -1
  45. package/exporter/utils/loggin.ts +7 -4
  46. package/exporter/utils/publish.ts +29 -0
  47. package/exporter/utils/render.ts +2 -1
  48. package/exporter/utils/sites.ts +12 -52
  49. package/exporter/utils/store.ts +88 -42
  50. package/package.json +7 -4
  51. package/start-render.js +1 -1
  52. package/build/run-start-render.js +0 -97
  53. package/build/run-start-render.js.map +0 -7
  54. package/build/scripts/end-render.d.ts +0 -20
  55. package/build/scripts/start-render.d.ts +0 -3
  56. package/exporter/scripts/end-render.ts +0 -102
  57. package/exporter/scripts/run-start-render.ts +0 -5
  58. package/exporter/scripts/start-render.ts +0 -25
  59. /package/build/{scripts/reset-render.d.ts → commands/end-render.d.ts} +0 -0
  60. /package/build/{scripts → commands}/move-assets.d.ts +0 -0
  61. /package/build/{scripts/run-start-render.d.ts → commands/reset-render.d.ts} +0 -0
  62. /package/build/{scripts/upload-search-content.d.ts → commands/start-render.d.ts} +0 -0
  63. /package/exporter/{scripts → commands}/move-assets.ts +0 -0
  64. /package/exporter/{scripts → commands}/reset-render.ts +0 -0
@@ -5,14 +5,14 @@ import path from "node:path";
5
5
  import fs from "fs-extra";
6
6
  import { parse } from "js2xmlparser";
7
7
 
8
+ import { envs } from "../constants";
8
9
  import { getConfig } from "./core-utils";
9
10
  import { buildLog, verboseLog } from "./loggin";
10
11
  import { getBuildMetadata } from "./store";
11
- import { envs } from "../constants";
12
12
  import { AuthService } from "../services/auth";
13
13
  import {
14
14
  endSiteRender,
15
- getAllSites,
15
+ getAllSitesFromDomain,
16
16
  getSiteInfo,
17
17
  getSiteLanguages,
18
18
  getSitemap,
@@ -25,60 +25,20 @@ const config = getConfig();
25
25
  /**
26
26
  * Check the instance sites and returns site prepared to be published and unpublished.
27
27
  */
28
- async function checkSites(domain: string) {
29
- console.info(`API URL ${envs.GRIDDO_API_URL as string}`);
30
-
31
- // Login to API
32
- await AuthService.login();
33
-
34
- // Get all sites. An array of Site
35
- const allSites = await getAllSites();
36
-
37
- // Filter the array of sites to get only the ones to build/render
38
- const validSites = envs.GRIDDO_RENDER_ALL_SITES
39
- ? allSites.filter(
40
- (site) =>
41
- !envs.GRIDDO_RENDER_SITE || site.id === envs.GRIDDO_RENDER_SITE,
42
- )
43
- : allSites.filter((site) =>
44
- envs.GRIDDO_RENDER_SITE
45
- ? site.id === envs.GRIDDO_RENDER_SITE
46
- : !!site.shouldBeUpdated,
47
- );
48
-
49
- // If there are valid sites...
50
- if (validSites.length) {
51
- for (const site of validSites) {
52
- const { items } = await getSiteLanguages(site.id);
53
-
54
- // Añadimos la prop domains con el dominio "cocinado" con los idiomas y teniendo en cuenta solo el dominio actual
55
- site.domains = items
56
- .filter(
57
- (item) =>
58
- item.domain &&
59
- (item.domain.slug === domain || item.domain.slug === `/${domain}`),
60
- )
61
- .map((item) => ({ [item.id]: `${item.domain.slug}${item.path}` }));
62
- }
63
- }
64
-
65
- // Sites with domains as empty arrays are sites that are not from the
66
- // current domain.
67
- const validSitesFromCurrentDomain = validSites.filter(
68
- (site) => site.domains.length > 0,
69
- );
28
+ async function getSitesToRender(domain: string) {
29
+ const allSites = await getAllSitesFromDomain(domain);
70
30
 
71
31
  // Save sites object to publish
72
- const sitesToPublish = validSitesFromCurrentDomain.filter((site) =>
73
- envs.GRIDDO_RENDER_SITE
32
+ const sitesToPublish = allSites.filter((site) => {
33
+ return envs.GRIDDO_RENDER_SITE
74
34
  ? site.id === envs.GRIDDO_RENDER_SITE
75
- : !!site.isPublished,
76
- );
35
+ : !!site.isPublished;
36
+ });
77
37
 
78
38
  // Save sites object to unpublish
79
- const sitesToUnpublish = validSitesFromCurrentDomain.filter(
80
- (site) => !site.isPublished && site.shouldBeUpdated,
81
- );
39
+ const sitesToUnpublish = allSites.filter((site) => {
40
+ return !site.isPublished && site.shouldBeUpdated;
41
+ });
82
42
 
83
43
  return {
84
44
  sitesToPublish,
@@ -301,9 +261,9 @@ function saveFile(filePath: string, content: string) {
301
261
  }
302
262
 
303
263
  export {
304
- checkSites,
305
264
  generateBuildReport,
306
265
  generateSitemaps,
307
266
  getSiteData,
267
+ getSitesToRender,
308
268
  unpublishSites,
309
269
  };
@@ -21,9 +21,7 @@ const config = getConfig();
21
21
  *
22
22
  * @param domain - The domain to get the pages from.
23
23
  */
24
- function getBuildPagesFromCachedStore<PageType extends GriddoPageObject>(
25
- domain: string,
26
- ) {
24
+ function getBuildPagesFromCachedStore<PageType extends GriddoPageObject>(domain: string) {
27
25
  const { __cache } = config.paths(domain);
28
26
  return getBuildPagesFromStore<PageType>({
29
27
  basePath: path.join(__cache, "store"),
@@ -47,9 +45,7 @@ function* getBuildPagesFromStore<PageType extends GriddoPageObject>(args?: {
47
45
  const { __cx } = config.paths();
48
46
  const pagesDirPath = basePath || path.join(__cx, "store");
49
47
 
50
- const jsonFilePaths = walkStore(pagesDirPath).filter(
51
- (file) => path.extname(file) === ".json",
52
- );
48
+ const jsonFilePaths = walkStore(pagesDirPath).filter((file) => path.extname(file) === ".json");
53
49
 
54
50
  for (const filePath of jsonFilePaths) {
55
51
  try {
@@ -81,9 +77,7 @@ function getBuildPagesPath() {
81
77
  const { __cx } = config.paths();
82
78
 
83
79
  const PAGES_DIR = path.join(__cx, "store");
84
- const PAGE_FILES = walk(PAGES_DIR).filter(
85
- (file) => path.extname(file) === ".json",
86
- );
80
+ const PAGE_FILES = walk(PAGES_DIR).filter((file) => path.extname(file) === ".json");
87
81
 
88
82
  return PAGE_FILES;
89
83
  }
@@ -126,10 +120,7 @@ function createStoreDir() {
126
120
  function saveRenderInfoInStore(renderInfo: RenderInfo) {
127
121
  const { __cx } = config.paths();
128
122
 
129
- fs.writeFileSync(
130
- path.join(__cx, "render-metadata.json"),
131
- JSON.stringify(renderInfo),
132
- );
123
+ fs.writeFileSync(path.join(__cx, "render-metadata.json"), JSON.stringify(renderInfo));
133
124
  }
134
125
 
135
126
  /**
@@ -189,10 +180,7 @@ function getPageInStoreDir(basePath: string): Array<number> {
189
180
  * Save the pages into the file system.
190
181
  * @param pages - An array of Griddo page objects to be saved.
191
182
  */
192
- function savePagesInStore(
193
- siteFolderName: string,
194
- pages: Array<GriddoPageObject>,
195
- ) {
183
+ function savePagesInStore(siteFolderName: string, pages: Array<GriddoPageObject>) {
196
184
  const { __cx } = config.paths();
197
185
 
198
186
  try {
@@ -211,7 +199,7 @@ function savePagesInStore(
211
199
  * Remove files from dir.
212
200
  * @param filenames - An array of ids representing file page names.
213
201
  */
214
- function removePagesFromStore(siteDirName: string, filenames: Array<number>) {
202
+ function removeSitePagesFromStore(siteDirName: string, filenames: Array<number>) {
215
203
  const { __cx } = config.paths();
216
204
 
217
205
  if (filenames.length === 0) {
@@ -238,7 +226,7 @@ function removePagesFromStore(siteDirName: string, filenames: Array<number>) {
238
226
  * @param props.changedPages - Array of pages that have been modified in the site.
239
227
  * @returns - An object containing the pages to be created and deleted in the site.
240
228
  */
241
- async function getPagesToCreateOrDelete(sitePages: {
229
+ async function getSitePagesToCreateOrDelete(sitePages: {
242
230
  sitesToPublish: Array<Site>;
243
231
  validPagesIds: Array<number>;
244
232
  changedPages: Array<number>;
@@ -255,9 +243,7 @@ async function getPagesToCreateOrDelete(sitePages: {
255
243
 
256
244
  // Array<ids> que están el `validPagesIds` pero no están por algún
257
245
  // motivo en el store. Se incluyen porque deben ser creadas.
258
- const pagesMissingInStore = validPagesIds.filter(
259
- (page) => !pagesInStore.includes(page),
260
- );
246
+ const pagesMissingInStore = validPagesIds.filter((page) => !pagesInStore.includes(page));
261
247
 
262
248
  // Array<ids> para enviar al store, que son las que han cambiado y
263
249
  // las missings.
@@ -276,21 +262,63 @@ async function getPagesToCreateOrDelete(sitePages: {
276
262
  (page) => !pagesToDeleteFromStore.includes(page),
277
263
  );
278
264
 
279
- // 1 - Leer el store
280
- // 2 - eliminar las páginas que tengan como site uno despublicado o borrado
281
- // const allPagesInStore = getBuildPagesFromStore();
282
-
283
- // const pagesFromInvalidSites: Array<number> = [];
284
- // for await (const page of allPagesInStore) {
285
- // const pageSite = page.context.page.site;
286
- // const pageId = page.context.page.id!;
287
- // // Si el `site.id` de la página no es ninguno de los `sitesToPublish`
288
- // // añadimos la página a `pagesFromIvalidSites` para borrarla
289
- // // posteriormente.
290
- // if (!sitesToPublish.map((site) => site.id).includes(pageSite)) {
291
- // pagesFromInvalidSites.push(pageId);
292
- // }
293
- // }
265
+ return {
266
+ pagesInStore,
267
+ pagesMissingInStore,
268
+ pagesToDeleteFromStore: [
269
+ ...pagesToDeleteFromStore,
270
+ // ...pagesFromInvalidSites,
271
+ ],
272
+ pagesToWriteToStore,
273
+ };
274
+ }
275
+
276
+ /**
277
+ * Returns pages that need to be created or deleted for a site in the store based on the provided arguments.
278
+ * @param sitePages - Properties for page retrieval.
279
+ * @param props.storeDir - Absolute path of the Griddo store.
280
+ * @param props.pages - Exhaustive array of all pages in the site.
281
+ * @param props.validPagesIds - Array of valid pages in the site.
282
+ * @param props.changedPages - Array of pages that have been modified in the site.
283
+ * @returns - An object containing the pages to be created and deleted in the site.
284
+ */
285
+ async function getSitePagesToCreateOrDeleteCached(sitePages: {
286
+ sitesToPublish: Array<Site>;
287
+ validPagesIds: Array<number>;
288
+ changedPages: Array<number>;
289
+ siteDirName: string;
290
+ domain: string;
291
+ }) {
292
+ const { changedPages, validPagesIds, siteDirName, domain } = sitePages;
293
+
294
+ const { __cache } = config.paths(domain);
295
+ const storeDir = path.join(__cache, "store");
296
+
297
+ // Array<ids> de las páginas que están físicamente en el store en el
298
+ // site actual del bucle.
299
+ const siteDirStorePath = path.join(storeDir, siteDirName);
300
+ const pagesInStore = getPageInStoreDir(siteDirStorePath);
301
+
302
+ // Array<ids> que están el `validPagesIds` pero no están por algún
303
+ // motivo en el store. Se incluyen porque deben ser creadas.
304
+ const pagesMissingInStore = validPagesIds.filter((page) => !pagesInStore.includes(page));
305
+
306
+ // Array<ids> para enviar al store, que son las que han cambiado y
307
+ // las missings.
308
+ const pagesToStore = pagesMissingInStore.concat(changedPages);
309
+
310
+ // Array<ids> de las páginas que han sido eliminadas para quitarlas
311
+ // físicamente de la carpeta store.
312
+ const pagesToDeleteFromStore = pagesInStore.filter((page) => {
313
+ // Las que no estén en validPages
314
+ return !validPagesIds.includes(page);
315
+ });
316
+
317
+ // 1 - Elimina del array final las páginas borradas.
318
+ // 2 - Elimina las posibles páginas (ids) duplicadas. (new Set)
319
+ const pagesToWriteToStore = Array.from(new Set(pagesToStore)).filter(
320
+ (page) => !pagesToDeleteFromStore.includes(page),
321
+ );
294
322
 
295
323
  return {
296
324
  pagesInStore,
@@ -303,6 +331,24 @@ async function getPagesToCreateOrDelete(sitePages: {
303
331
  };
304
332
  }
305
333
 
334
+ /**
335
+ * Removes sites from store that are not in `sitesToPublish` array.
336
+ */
337
+ function deleteZombieSitesFoldersFromStore(sitesToPublish: Array<Site>) {
338
+ const { __cx } = getConfig().paths();
339
+ const storeDir = path.join(__cx, "store");
340
+ const siteDirs = fs.readdirSync(storeDir, { withFileTypes: true });
341
+ const siteIds = sitesToPublish.map((site) => `${site.id}`);
342
+ for (const dir of siteDirs) {
343
+ if (dir.isDirectory() && !siteIds.includes(dir.name)) {
344
+ fs.rmSync(path.join(storeDir, dir.name), {
345
+ force: true,
346
+ recursive: true,
347
+ });
348
+ }
349
+ }
350
+ }
351
+
306
352
  /**
307
353
  * Removes sites that exist in the store that should no longer be there because
308
354
  * the domain has been changed. This is necessary because those sites will not
@@ -312,9 +358,7 @@ function removeOrphanSites(sitesToPublish: Array<Site>, domain: string) {
312
358
  const { __cx } = getConfig().paths(domain);
313
359
  const currentSitesInStore = fs.readdirSync(path.join(__cx, "store"));
314
360
  const sitesFromAPI = sitesToPublish.map(({ id }) => `${id}`);
315
- const sitesToDelete = currentSitesInStore.filter(
316
- (site) => !sitesFromAPI.includes(site),
317
- );
361
+ const sitesToDelete = currentSitesInStore.filter((site) => !sitesFromAPI.includes(site));
318
362
 
319
363
  for (const site of sitesToDelete) {
320
364
  fs.rmSync(path.join(__cx, "store", site), { recursive: true, force: true });
@@ -324,14 +368,16 @@ function removeOrphanSites(sitesToPublish: Array<Site>, domain: string) {
324
368
 
325
369
  export {
326
370
  createStoreDir,
371
+ deleteZombieSitesFoldersFromStore,
327
372
  getBuildMetadata,
328
373
  getBuildPagesFromCachedStore,
329
374
  getBuildPagesFromStore,
330
375
  getBuildPagesPath,
331
376
  getPageInStoreDir,
332
- getPagesToCreateOrDelete,
377
+ getSitePagesToCreateOrDelete,
378
+ getSitePagesToCreateOrDeleteCached,
333
379
  removeOrphanSites,
334
- removePagesFromStore,
380
+ removeSitePagesFromStore,
335
381
  savePagesInStore,
336
382
  saveRenderInfoInStore,
337
383
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@griddo/cx",
3
3
  "description": "Griddo SSG based on Gatsby",
4
- "version": "11.2.4",
4
+ "version": "11.2.5-rc.1",
5
5
  "authors": [
6
6
  "Álvaro Sánchez' <alvaro.sanches@secuoyas.com>",
7
7
  "Diego M. Béjar <diego.bejar@secuoyas.com>",
@@ -16,7 +16,8 @@
16
16
  "url": "https://github.com/griddo/griddo"
17
17
  },
18
18
  "bin": {
19
- "griddo-cx": "./start-render.js"
19
+ "griddo-cx": "./start-render.js",
20
+ "griddo-start-render": "./start-render.js"
20
21
  },
21
22
  "exports": {
22
23
  ".": {
@@ -44,7 +45,9 @@
44
45
  "upload-search-content": "node ./build/upload-search-content.js",
45
46
  "complete-render": "node ./build/end-render.js",
46
47
  "end-render": "node ./build/end-render.js",
48
+ "start-render": "node ./build/start-render.js",
47
49
  "reset-render": "node ./build/reset-render.js",
50
+ "prepare-domains-render": "node ./build/prepare-domains-render.js",
48
51
  "// SSG": "",
49
52
  "clean": "gatsby clean; rm -rf assets .cx-cache caches store apiCache build .render-sentinel",
50
53
  "gatsby-build": "gatsby telemetry --disable && gatsby build --prefix-paths",
@@ -60,7 +63,7 @@
60
63
  "@babel/preset-env": "7.26.0",
61
64
  "@babel/preset-react": "7.26.3",
62
65
  "@babel/preset-typescript": "7.26.0",
63
- "@griddo/core": "11.2.4",
66
+ "@griddo/core": "11.2.5-rc.1",
64
67
  "@svgr/webpack": "5.5.0",
65
68
  "axios": "1.7.9",
66
69
  "babel-loader": "9.2.1",
@@ -128,5 +131,5 @@
128
131
  "publishConfig": {
129
132
  "access": "public"
130
133
  },
131
- "gitHead": "2e9f58f7f0ef82f9dfe46960132b879b4819332e"
134
+ "gitHead": "ab766204bc991ccef66621f969cb492ba012464d"
132
135
  }
package/start-render.js CHANGED
@@ -4,4 +4,4 @@
4
4
 
5
5
  // This is the "bin" for the griddo-cx package used by "infra" to trigger a
6
6
  // render running `npm run griddo-cx`.
7
- require("./build/run-start-render.js");
7
+ require("./build/start-render.js");