@griddo/cx 11.7.11 → 11.7.12-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.
- package/README.md +27 -226
- package/build/adapters/gatsby/actions/clean.js +10 -0
- package/build/adapters/gatsby/actions/clean.js.map +1 -0
- package/build/adapters/gatsby/actions/close.js +14 -0
- package/build/adapters/gatsby/actions/close.js.map +1 -0
- package/build/adapters/gatsby/actions/data.js +18 -0
- package/build/adapters/gatsby/actions/data.js.map +1 -0
- package/build/adapters/gatsby/actions/healthCheck.js +10 -0
- package/build/adapters/gatsby/actions/healthCheck.js.map +1 -0
- package/build/adapters/gatsby/actions/init.js +22 -0
- package/build/adapters/gatsby/actions/init.js.map +1 -0
- package/build/adapters/gatsby/actions/logs.js +9 -0
- package/build/adapters/gatsby/actions/logs.js.map +1 -0
- package/build/adapters/gatsby/actions/meta.js +13 -0
- package/build/adapters/gatsby/actions/meta.js.map +1 -0
- package/build/adapters/gatsby/actions/prepare.js +9 -0
- package/build/adapters/gatsby/actions/prepare.js.map +1 -0
- package/build/adapters/gatsby/actions/relocation.js +15 -0
- package/build/adapters/gatsby/actions/relocation.js.map +1 -0
- package/build/adapters/gatsby/actions/restore.js +26 -0
- package/build/adapters/gatsby/actions/restore.js.map +1 -0
- package/build/adapters/gatsby/actions/ssg.js +9 -0
- package/build/adapters/gatsby/actions/ssg.js.map +1 -0
- package/build/adapters/gatsby/actions/sync.js +51 -0
- package/build/adapters/gatsby/actions/sync.js.map +1 -0
- package/build/adapters/gatsby/index.js +78 -0
- package/build/adapters/gatsby/index.js.map +1 -0
- package/build/adapters/gatsby/shared/artifacts.js +20 -0
- package/build/adapters/gatsby/shared/artifacts.js.map +1 -0
- package/build/adapters/gatsby/shared/context.js +31 -0
- package/build/adapters/gatsby/shared/context.js.map +1 -0
- package/build/adapters/gatsby/shared/diff-assets.js +101 -0
- package/build/adapters/gatsby/shared/diff-assets.js.map +1 -0
- package/build/adapters/gatsby/shared/extract-assets.js +58 -0
- package/build/adapters/gatsby/shared/extract-assets.js.map +1 -0
- package/build/adapters/gatsby/shared/gatsby-build.js +55 -0
- package/build/adapters/gatsby/shared/gatsby-build.js.map +1 -0
- package/build/adapters/gatsby/shared/sync-render.js +210 -0
- package/build/adapters/gatsby/shared/sync-render.js.map +1 -0
- package/build/adapters/gatsby/shared/types.js +3 -0
- package/build/adapters/gatsby/shared/types.js.map +1 -0
- package/build/commands/end-render.js +87 -0
- package/build/commands/end-render.js.map +1 -0
- package/build/commands/prepare-assets-directory.js +30 -0
- package/build/commands/prepare-assets-directory.js.map +1 -0
- package/build/commands/prepare-domains-render.js +133 -0
- package/build/commands/prepare-domains-render.js.map +1 -0
- package/build/commands/reset-render.js +21 -0
- package/build/commands/reset-render.js.map +1 -0
- package/build/commands/start-render.js +44 -0
- package/build/commands/start-render.js.map +1 -0
- package/build/commands/upload-search-content.js +180 -0
- package/build/commands/upload-search-content.js.map +1 -0
- package/build/constants/endpoints.js +43 -0
- package/build/constants/endpoints.js.map +1 -0
- package/build/constants/envs.js +68 -0
- package/build/constants/envs.js.map +1 -0
- package/build/constants/errors.js +81 -0
- package/build/constants/errors.js.map +1 -0
- package/build/services/auth.js +40 -0
- package/build/services/auth.js.map +1 -0
- package/build/services/db-class.js +49 -0
- package/build/services/db-class.js.map +1 -0
- package/build/services/db.js +34 -0
- package/build/services/db.js.map +1 -0
- package/build/services/navigation.js +96 -0
- package/build/services/navigation.js.map +1 -0
- package/build/services/reference-fields.js +131 -0
- package/build/services/reference-fields.js.map +1 -0
- package/build/services/robots.js +60 -0
- package/build/services/robots.js.map +1 -0
- package/build/services/sites.js +110 -0
- package/build/services/sites.js.map +1 -0
- package/build/services/store.js +257 -0
- package/build/services/store.js.map +1 -0
- package/build/types/api.js +3 -0
- package/build/types/api.js.map +1 -0
- package/build/types/global.js +3 -0
- package/build/types/global.js.map +1 -0
- package/build/types/navigation.js +3 -0
- package/build/types/navigation.js.map +1 -0
- package/build/types/pages.js +3 -0
- package/build/types/pages.js.map +1 -0
- package/build/types/render.js +10 -0
- package/build/types/render.js.map +1 -0
- package/build/types/sites.js +3 -0
- package/build/types/sites.js.map +1 -0
- package/build/types/templates.js +3 -0
- package/build/types/templates.js.map +1 -0
- package/build/utils/api.js +165 -0
- package/build/utils/api.js.map +1 -0
- package/build/utils/artifacts.js +38 -0
- package/build/utils/artifacts.js.map +1 -0
- package/build/utils/brush.js +30 -0
- package/build/utils/brush.js.map +1 -0
- package/build/utils/cache.js +106 -0
- package/build/utils/cache.js.map +1 -0
- package/build/utils/check-environment-health.js +69 -0
- package/build/utils/check-environment-health.js.map +1 -0
- package/build/utils/core-utils.js +270 -0
- package/build/utils/core-utils.js.map +1 -0
- package/build/utils/domains.js +37 -0
- package/build/utils/domains.js.map +1 -0
- package/build/utils/errors.js +30 -0
- package/build/utils/errors.js.map +1 -0
- package/build/utils/folders.js +341 -0
- package/build/utils/folders.js.map +1 -0
- package/build/utils/images.js +45 -0
- package/build/utils/images.js.map +1 -0
- package/build/utils/instance.js +66 -0
- package/build/utils/instance.js.map +1 -0
- package/build/utils/loggin.js +119 -0
- package/build/utils/loggin.js.map +1 -0
- package/build/utils/npm-deps/find-up-simple.js +75 -0
- package/build/utils/npm-deps/find-up-simple.js.map +1 -0
- package/build/utils/npm-deps/pkg-dir.js +20 -0
- package/build/utils/npm-deps/pkg-dir.js.map +1 -0
- package/build/utils/npm-deps/xml-parser.js +49 -0
- package/build/utils/npm-deps/xml-parser.js.map +1 -0
- package/build/utils/pages.js +359 -0
- package/build/utils/pages.js.map +1 -0
- package/build/utils/render.js +168 -0
- package/build/utils/render.js.map +1 -0
- package/build/utils/sitemaps.js +110 -0
- package/build/utils/sitemaps.js.map +1 -0
- package/build/utils/sites.js +105 -0
- package/build/utils/sites.js.map +1 -0
- package/build/utils/store.js +193 -0
- package/build/utils/store.js.map +1 -0
- package/exporter/adapters/gatsby/actions/clean.ts +14 -0
- package/exporter/adapters/gatsby/actions/close.ts +20 -0
- package/exporter/adapters/gatsby/actions/data.ts +25 -0
- package/exporter/adapters/gatsby/actions/healthCheck.ts +10 -0
- package/exporter/adapters/gatsby/actions/init.ts +26 -0
- package/exporter/adapters/gatsby/actions/logs.ts +10 -0
- package/exporter/adapters/gatsby/actions/meta.ts +16 -0
- package/exporter/adapters/gatsby/actions/prepare.ts +9 -0
- package/exporter/adapters/gatsby/actions/relocation.ts +15 -0
- package/exporter/adapters/gatsby/actions/restore.ts +36 -0
- package/exporter/adapters/gatsby/actions/ssg.ts +12 -0
- package/exporter/adapters/gatsby/actions/sync.ts +71 -0
- package/exporter/adapters/gatsby/index.ts +73 -153
- package/exporter/adapters/gatsby/shared/artifacts.ts +16 -0
- package/exporter/adapters/gatsby/shared/context.ts +50 -0
- package/exporter/adapters/gatsby/shared/diff-assets.ts +113 -0
- package/exporter/adapters/gatsby/shared/extract-assets.ts +61 -0
- package/exporter/adapters/gatsby/shared/gatsby-build.ts +58 -0
- package/exporter/adapters/gatsby/shared/sync-render.ts +276 -0
- package/exporter/adapters/gatsby/shared/types.ts +35 -0
- package/exporter/build-esbuild.noop +42 -0
- package/exporter/build.sh +4 -38
- package/exporter/commands/end-render.ts +72 -70
- package/exporter/commands/prepare-assets-directory.ts +30 -0
- package/exporter/commands/prepare-domains-render.ts +143 -31
- package/exporter/commands/reset-render.ts +10 -3
- package/exporter/commands/start-render.ts +22 -45
- package/exporter/commands/upload-search-content.ts +194 -21
- package/exporter/constants/endpoints.ts +2 -1
- package/exporter/constants/envs.ts +57 -55
- package/exporter/{errors/errors-data.ts → constants/errors.ts} +24 -14
- package/exporter/services/auth.ts +7 -6
- package/exporter/services/db-class.ts +54 -0
- package/exporter/services/db.ts +32 -0
- package/exporter/services/navigation.ts +4 -10
- package/exporter/services/reference-fields.ts +9 -24
- package/exporter/services/robots.ts +9 -16
- package/exporter/services/sites.ts +36 -24
- package/exporter/services/store.ts +107 -96
- package/exporter/types/api.ts +27 -28
- package/exporter/types/global.ts +8 -11
- package/exporter/types/navigation.ts +1 -1
- package/exporter/types/pages.ts +2 -3
- package/exporter/types/render.ts +59 -0
- package/exporter/types/sites.ts +1 -2
- package/exporter/utils/api.ts +55 -75
- package/exporter/utils/artifacts.ts +38 -0
- package/exporter/utils/brush.ts +34 -0
- package/exporter/utils/cache.ts +37 -62
- package/exporter/utils/check-environment-health.ts +80 -0
- package/exporter/utils/core-utils.ts +133 -272
- package/exporter/utils/domains.ts +10 -7
- package/exporter/{errors/index.ts → utils/errors.ts} +10 -9
- package/exporter/utils/folders.ts +163 -98
- package/exporter/utils/images.ts +1 -6
- package/exporter/utils/instance.ts +9 -13
- package/exporter/utils/loggin.ts +44 -91
- package/exporter/utils/npm-deps/find-up-simple.ts +100 -0
- package/exporter/utils/npm-deps/pkg-dir.ts +17 -0
- package/exporter/utils/npm-deps/xml-parser.ts +57 -0
- package/exporter/utils/pages.ts +23 -88
- package/exporter/utils/render.ts +180 -48
- package/exporter/utils/sitemaps.ts +129 -0
- package/exporter/utils/sites.ts +19 -197
- package/exporter/utils/store.ts +87 -180
- package/gatsby-browser.tsx +41 -58
- package/gatsby-config.ts +10 -17
- package/gatsby-node.ts +17 -78
- package/gatsby-ssr.tsx +2 -1
- package/package.json +35 -86
- package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +55 -0
- package/plugins/gatsby-plugin-svgr-loader/package.json +8 -0
- package/react/DynamicScript/index.tsx +33 -0
- package/{exporter/react → react}/Favicon/index.tsx +1 -7
- package/{exporter/react → react}/GriddoIntegrations/index.tsx +16 -22
- package/{exporter/react → react}/GriddoIntegrations/utils.ts +21 -9
- package/{build/react/index.d.ts → react/index.tsx} +1 -0
- package/src/components/Head.tsx +13 -46
- package/src/components/template.tsx +8 -30
- package/src/gatsby-node-utils.ts +73 -2
- package/src/html.tsx +2 -11
- package/src/types.ts +5 -5
- package/tsconfig.commands.json +36 -0
- package/tsconfig.exporter.json +19 -0
- package/tsconfig.json +5 -3
- package/build/adapters/gatsby/index.d.ts +0 -4
- package/build/adapters/gatsby/utils.d.ts +0 -22
- package/build/artifacts/index.d.ts +0 -6
- package/build/commands/end-render.d.ts +0 -2
- package/build/commands/move-assets.d.ts +0 -1
- package/build/commands/prepare-domains-render.d.ts +0 -1
- package/build/commands/reset-render.d.ts +0 -2
- package/build/commands/start-render.d.ts +0 -2
- package/build/commands/upload-search-content.d.ts +0 -2
- package/build/constants/endpoints.d.ts +0 -19
- package/build/constants/envs.d.ts +0 -37
- package/build/constants/index.d.ts +0 -57
- package/build/end-render.js +0 -74
- package/build/end-render.js.map +0 -7
- package/build/errors/errors-data.d.ts +0 -22
- package/build/errors/index.d.ts +0 -15
- package/build/index.d.ts +0 -29
- package/build/index.js +0 -73
- package/build/index.js.map +0 -7
- package/build/prepare-domains-render.js +0 -73
- package/build/prepare-domains-render.js.map +0 -7
- package/build/react/Favicon/index.d.ts +0 -5
- package/build/react/Favicon/utils.d.ts +0 -9
- package/build/react/GriddoIntegrations/index.d.ts +0 -20
- package/build/react/GriddoIntegrations/utils.d.ts +0 -26
- package/build/react/index.js +0 -3
- package/build/registers/api.d.ts +0 -9
- package/build/registers/gatsby.d.ts +0 -9
- package/build/registers/index.d.ts +0 -3
- package/build/reset-render.js +0 -74
- package/build/reset-render.js.map +0 -7
- package/build/services/auth.d.ts +0 -10
- package/build/services/domains.d.ts +0 -6
- package/build/services/navigation.d.ts +0 -50
- package/build/services/reference-fields.d.ts +0 -20
- package/build/services/register.d.ts +0 -36
- package/build/services/robots.d.ts +0 -19
- package/build/services/settings.d.ts +0 -4
- package/build/services/sites.d.ts +0 -29
- package/build/services/store.d.ts +0 -6
- package/build/start-render.js +0 -100
- package/build/start-render.js.map +0 -7
- package/build/types/api.d.ts +0 -142
- package/build/types/global.d.ts +0 -84
- package/build/types/navigation.d.ts +0 -28
- package/build/types/pages.d.ts +0 -144
- package/build/types/sites.d.ts +0 -57
- package/build/types/templates.d.ts +0 -8
- package/build/upload-search-content.js +0 -74
- package/build/upload-search-content.js.map +0 -7
- package/build/utils/alerts.d.ts +0 -3
- package/build/utils/api.d.ts +0 -23
- package/build/utils/cache.d.ts +0 -35
- package/build/utils/core-utils.d.ts +0 -107
- package/build/utils/create-build-data.d.ts +0 -8
- package/build/utils/domains.d.ts +0 -13
- package/build/utils/folders.d.ts +0 -53
- package/build/utils/health-checks.d.ts +0 -7
- package/build/utils/images.d.ts +0 -16
- package/build/utils/instance.d.ts +0 -21
- package/build/utils/loggin.d.ts +0 -51
- package/build/utils/pages.d.ts +0 -34
- package/build/utils/render.d.ts +0 -13
- package/build/utils/searches.d.ts +0 -15
- package/build/utils/sites.d.ts +0 -31
- package/build/utils/store.d.ts +0 -81
- package/cx.config.d.ts +0 -5
- package/cx.config.js +0 -36
- package/exporter/adapters/gatsby/utils.ts +0 -161
- package/exporter/artifacts/README.md +0 -34
- package/exporter/artifacts/index.ts +0 -33
- package/exporter/commands/move-assets.ts +0 -11
- package/exporter/constants/index.ts +0 -129
- package/exporter/index.ts +0 -82
- package/exporter/react/index.tsx +0 -11
- package/exporter/registers/api.ts +0 -14
- package/exporter/registers/gatsby.ts +0 -14
- package/exporter/registers/index.ts +0 -4
- package/exporter/services/domains.ts +0 -16
- package/exporter/services/register.ts +0 -113
- package/exporter/services/settings.ts +0 -17
- package/exporter/utils/alerts.ts +0 -29
- package/exporter/utils/create-build-data.ts +0 -17
- package/exporter/utils/health-checks.ts +0 -64
- package/exporter/utils/searches.ts +0 -156
- package/src/README.md +0 -7
- package/start-render.js +0 -7
- /package/{exporter/react → react}/Favicon/utils.ts +0 -0
package/exporter/utils/render.ts
CHANGED
|
@@ -1,71 +1,203 @@
|
|
|
1
|
-
import
|
|
2
|
-
import path from "node:path";
|
|
1
|
+
import type { RenderModeTuple } from "../types/render";
|
|
3
2
|
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import { apiRegister } from "../registers";
|
|
8
|
-
import { insertAlert } from "./alerts";
|
|
9
|
-
import { getConfig } from "./core-utils";
|
|
10
|
-
import { debugLog } from "./loggin";
|
|
3
|
+
import { execSync } from "node:child_process";
|
|
4
|
+
import fsp from "node:fs/promises";
|
|
5
|
+
import path from "node:path";
|
|
11
6
|
|
|
12
|
-
|
|
7
|
+
import { RenderUUIDError } from "../constants/errors";
|
|
8
|
+
import { AuthService } from "../services/auth";
|
|
9
|
+
import { readDB, writeDB } from "../services/db";
|
|
10
|
+
import { RENDER_MODE } from "../types/render";
|
|
11
|
+
import { throwError } from "./errors";
|
|
12
|
+
import { pathExists } from "./folders";
|
|
13
|
+
import { infoLog, verboseLog } from "./loggin";
|
|
14
|
+
import { getBuildMetadata } from "./store";
|
|
13
15
|
|
|
14
16
|
/**
|
|
15
17
|
* Creates a sentinel file with the current date and time.
|
|
16
18
|
* This file is used to track later if node_modules/@griddo/cx was cleaned by a
|
|
17
|
-
* npm install from a deploy.
|
|
19
|
+
* npm install coming from a deploy.
|
|
18
20
|
*/
|
|
19
|
-
function
|
|
20
|
-
const {
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
async function markRenderAsStarted(options: { domain: string; basePath: string }) {
|
|
22
|
+
const { domain } = options;
|
|
23
|
+
|
|
24
|
+
const db = await readDB();
|
|
25
|
+
db.domains[domain].isRendering = true;
|
|
26
|
+
await writeDB(db);
|
|
27
|
+
|
|
28
|
+
// Creamos un archivo centinela, si al terminar el render este archivo no
|
|
29
|
+
// existe es que ha habido un deploy por medio y hay que invalidar el render
|
|
30
|
+
const { __ssg } = await getRenderPathsFromDB();
|
|
31
|
+
|
|
32
|
+
const renderSentinelFile = path.join(__ssg, `.render-sentinel-${domain}`);
|
|
33
|
+
await fsp.writeFile(renderSentinelFile, new Date().toISOString());
|
|
23
34
|
}
|
|
24
35
|
|
|
25
|
-
function
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
36
|
+
async function markRenderAsCompleted(domain: string) {
|
|
37
|
+
const db = await readDB();
|
|
38
|
+
db.domains[domain].isRendering = false;
|
|
39
|
+
// db.domains[domain].renderMode = undefined;
|
|
40
|
+
// db.domains[domain].shouldBeRendered = false;
|
|
41
|
+
await writeDB(db);
|
|
42
|
+
|
|
43
|
+
// Borramos finalmente el archivo centinela
|
|
44
|
+
const { __ssg } = await getRenderPathsFromDB();
|
|
45
|
+
const renderSentinelFile = path.join(__ssg, `.render-sentinel-${domain}`);
|
|
46
|
+
await fsp.unlink(renderSentinelFile);
|
|
29
47
|
}
|
|
30
48
|
|
|
31
|
-
function
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
49
|
+
async function assertRenderIsValid(domain: string) {
|
|
50
|
+
// Comprobamos que .render-sentinel exista, si no es que un deploy lo borro
|
|
51
|
+
// y hay que invalidar el render.
|
|
52
|
+
const { __ssg } = await getRenderPathsFromDB();
|
|
53
|
+
const renderSentinelFile = path.join(__ssg, `.render-sentinel-${domain}`);
|
|
54
|
+
if (!(await pathExists(renderSentinelFile))) {
|
|
35
55
|
throwError(RenderUUIDError);
|
|
36
56
|
}
|
|
37
57
|
}
|
|
38
58
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
59
|
+
// @todo add more messages...
|
|
60
|
+
async function resolveDomainRenderMode(options: { domain: string; shouldBeRendered: boolean }) {
|
|
61
|
+
const { domain, shouldBeRendered } = options;
|
|
62
|
+
const { __cache, __exports } = await getRenderPathsFromDB({ domain });
|
|
63
|
+
|
|
64
|
+
// missing exports
|
|
65
|
+
const missingExports = !(await pathExists(path.join(__exports)));
|
|
66
|
+
// render with errors
|
|
67
|
+
const db = await readDB();
|
|
68
|
+
const wasRenderWithError = db.domains[domain]?.isRendering;
|
|
69
|
+
// new deploy or machine
|
|
70
|
+
const isNewDeploy = await hasNewCommit(__cache);
|
|
71
|
+
|
|
72
|
+
if (missingExports) {
|
|
73
|
+
infoLog(`[${domain}]: Render from Scratch due to missing exports (first render)`);
|
|
74
|
+
return {
|
|
75
|
+
renderMode: RENDER_MODE.FROM_SCRATCH,
|
|
76
|
+
reason: "Missing exports directory",
|
|
77
|
+
};
|
|
78
|
+
}
|
|
45
79
|
|
|
46
|
-
|
|
47
|
-
|
|
80
|
+
if (wasRenderWithError) {
|
|
81
|
+
infoLog(`[${domain}]: Render from Scratch due to a previous render error`);
|
|
82
|
+
return {
|
|
83
|
+
renderMode: RENDER_MODE.FROM_SCRATCH,
|
|
84
|
+
reason: "error in previous render",
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (isNewDeploy) {
|
|
89
|
+
infoLog(`[${domain}]: Render from Scratch due to a changes in the repo (commit hash)`);
|
|
90
|
+
return { renderMode: RENDER_MODE.FROM_SCRATCH, reason: "new commit hash" };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (!shouldBeRendered) {
|
|
94
|
+
infoLog(`[${domain}]: Skipping render as it is not marked for rendering (IDLE).`);
|
|
95
|
+
return { renderMode: RENDER_MODE.IDLE, reason: "" };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
console.log(
|
|
99
|
+
`[${domain}]: {DEBUG} Render INCREMENTAL porque no se cumplen: missingExports (FROM_SCRATCH), wasRenderWithError (FROM_SCRATCH), isNewDeploy (FROM_SCRATCH) o !shouldBeRendered (IDLE)`,
|
|
100
|
+
);
|
|
101
|
+
return { renderMode: RENDER_MODE.INCREMENTAL, reason: "" };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function hasNewCommit(basePath: string): Promise<boolean> {
|
|
105
|
+
const commitFile = path.join(basePath, "commit");
|
|
106
|
+
const currentCommit = execSync("git rev-parse HEAD").toString().trim();
|
|
107
|
+
|
|
108
|
+
if (await pathExists(commitFile)) {
|
|
109
|
+
const savedCommit = (await fsp.readFile(commitFile, "utf-8")).trim();
|
|
110
|
+
if (savedCommit === currentCommit) {
|
|
111
|
+
return false; // No hay nuevo commit
|
|
48
112
|
}
|
|
49
113
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async function updateCommitFile(options: { basePath: string }) {
|
|
121
|
+
const { basePath } = options;
|
|
122
|
+
const currentCommit = execSync("git rev-parse HEAD").toString().trim();
|
|
123
|
+
await fsp.writeFile(path.join(basePath, "commit"), currentCommit);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async function getRenderMode(domain: string): Promise<RenderModeTuple> {
|
|
127
|
+
const db = await readDB();
|
|
128
|
+
|
|
129
|
+
if (!db.domains[domain].renderMode) {
|
|
130
|
+
throw new Error(`Render mode not found for domain ${domain}`);
|
|
63
131
|
}
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
renderMode: db.domains[domain].renderMode,
|
|
135
|
+
reason: db.domains[domain].renderModeReason,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async function getRenderPathsFromDB(options?: { domain?: string; dbFilePath?: string }) {
|
|
140
|
+
const { domain, dbFilePath } = options || {};
|
|
141
|
+
|
|
142
|
+
const db = await readDB(dbFilePath);
|
|
143
|
+
const paths = db.paths;
|
|
144
|
+
|
|
145
|
+
return {
|
|
146
|
+
__root: paths.root,
|
|
147
|
+
__cache: path.join(paths.cxCache, domain || ""),
|
|
148
|
+
__components: paths.components,
|
|
149
|
+
__cx: paths.cx,
|
|
150
|
+
__sites: paths.exportsDir,
|
|
151
|
+
__exports: path.join(paths.exportsDir, domain || ""),
|
|
152
|
+
__ssg: paths.ssg,
|
|
153
|
+
__exports_dist: path.join(paths.exportsDir, domain || "", "dist"),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async function getRenderMetadataFromDB() {
|
|
158
|
+
const db = await readDB();
|
|
159
|
+
return {
|
|
160
|
+
proDomainPrefix: db.proDomainPrefix,
|
|
161
|
+
griddoVersion: db.griddoVersion,
|
|
162
|
+
buildReportFileName: db.buildReportFileName,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Save a file with the end of build process to use as `build-end` signal.
|
|
168
|
+
*/
|
|
169
|
+
async function generateBuildReport(domain: string) {
|
|
170
|
+
const authControl = await AuthService.login();
|
|
171
|
+
|
|
172
|
+
const { __root } = await getRenderPathsFromDB();
|
|
173
|
+
const { buildReportFileName } = await getRenderMetadataFromDB();
|
|
174
|
+
const { buildProcessData } = await getBuildMetadata(domain);
|
|
175
|
+
|
|
176
|
+
const buildSitesInfo = Object.keys(buildProcessData).map((siteID) => ({
|
|
177
|
+
...buildProcessData[siteID],
|
|
178
|
+
siteId: Number.parseInt(siteID),
|
|
179
|
+
}));
|
|
180
|
+
|
|
181
|
+
const report = {
|
|
182
|
+
authControl,
|
|
183
|
+
sites: buildSitesInfo,
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
const reportFilePath = path.join(__root, "dist", buildReportFileName);
|
|
187
|
+
|
|
188
|
+
await fsp.writeFile(reportFilePath, JSON.stringify(report));
|
|
189
|
+
|
|
190
|
+
verboseLog(`build report saved in ${reportFilePath}`);
|
|
64
191
|
}
|
|
65
192
|
|
|
66
193
|
export {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
194
|
+
assertRenderIsValid,
|
|
195
|
+
generateBuildReport,
|
|
196
|
+
getRenderMetadataFromDB,
|
|
197
|
+
getRenderMode,
|
|
198
|
+
getRenderPathsFromDB,
|
|
199
|
+
markRenderAsCompleted,
|
|
200
|
+
markRenderAsStarted,
|
|
201
|
+
resolveDomainRenderMode,
|
|
202
|
+
updateCommitFile,
|
|
71
203
|
};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import fsp from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
import { AuthService } from "../services/auth";
|
|
5
|
+
import { getSitemap } from "../services/sites";
|
|
6
|
+
import { pathExists } from "./folders";
|
|
7
|
+
import { verboseLog } from "./loggin";
|
|
8
|
+
import { generateSitemapIndexXml, generateUrlsetXml } from "./npm-deps/xml-parser";
|
|
9
|
+
import { getRenderPathsFromDB } from "./render";
|
|
10
|
+
import { getBuildMetadata } from "./store";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Generate sitemaps and save them into file system.
|
|
14
|
+
*/
|
|
15
|
+
async function generateSitemaps(domain: string) {
|
|
16
|
+
const { __root } = await getRenderPathsFromDB();
|
|
17
|
+
const { sitesToPublish } = await getBuildMetadata(domain);
|
|
18
|
+
const distDir = path.join(__root, "dist");
|
|
19
|
+
const templateSitemapPrefix = "sitemap-";
|
|
20
|
+
|
|
21
|
+
const isGriddoSitemapFile = (file: string) =>
|
|
22
|
+
file === "sitemap.xml" || (file.startsWith(templateSitemapPrefix) && file.endsWith(".xml"));
|
|
23
|
+
|
|
24
|
+
for (const site of sitesToPublish) {
|
|
25
|
+
const { id, languages } = site;
|
|
26
|
+
|
|
27
|
+
for (const lang of languages) {
|
|
28
|
+
// Local copy of headers to avoid mutating the shared object
|
|
29
|
+
const localHeaders: Record<string, string> = AuthService.headers
|
|
30
|
+
? { ...AuthService.headers }
|
|
31
|
+
: {};
|
|
32
|
+
localHeaders.lang = lang.id.toString();
|
|
33
|
+
|
|
34
|
+
const response = await getSitemap({ siteId: id, headers: localHeaders });
|
|
35
|
+
|
|
36
|
+
if (!response) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const { items: sitemapPagesGroup, url } = response;
|
|
41
|
+
const { home, domain } = url;
|
|
42
|
+
|
|
43
|
+
if (!home) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const domainLanguage = site.domains.find(
|
|
48
|
+
(domain) => Object.keys(domain)[0] === lang.id.toString(),
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
if (!domainLanguage) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const slug = Object.values(domainLanguage)[0];
|
|
56
|
+
const sitemaps: Array<string> = [];
|
|
57
|
+
const sitemapPageGroupKeys = Object.keys(sitemapPagesGroup);
|
|
58
|
+
const sitemapBasePath = path.join(distDir, slug.replace(domain, ""));
|
|
59
|
+
|
|
60
|
+
/** delete every griddo sitemap file before create the new ones */
|
|
61
|
+
if (await pathExists(sitemapBasePath)) {
|
|
62
|
+
try {
|
|
63
|
+
const files = await fsp.readdir(sitemapBasePath);
|
|
64
|
+
for (const file of files) {
|
|
65
|
+
if (isGriddoSitemapFile(file)) {
|
|
66
|
+
const filePath = path.join(sitemapBasePath, file);
|
|
67
|
+
try {
|
|
68
|
+
await fsp.rm(filePath);
|
|
69
|
+
} catch (err) {
|
|
70
|
+
console.error(`Error deleting file ${filePath}:`, err);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
} catch (err) {
|
|
75
|
+
console.error(`Error reading ${sitemapBasePath}:`, err);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
for (const templateId of sitemapPageGroupKeys) {
|
|
80
|
+
const sitemapPages = sitemapPagesGroup[templateId];
|
|
81
|
+
|
|
82
|
+
if (!sitemapPages.length) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const siteMap = generateUrlsetXml(sitemapPages);
|
|
87
|
+
|
|
88
|
+
const sitemapName = `/${templateSitemapPrefix}${templateId.toLowerCase()}.xml`;
|
|
89
|
+
const exactPath = path.join(sitemapBasePath, sitemapName);
|
|
90
|
+
|
|
91
|
+
await saveFile(exactPath, siteMap);
|
|
92
|
+
|
|
93
|
+
sitemaps.push(`${home.endsWith("/") ? home.slice(0, -1) : home}${sitemapName}`);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (!sitemaps.length) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const siteMap = generateSitemapIndexXml(sitemaps);
|
|
101
|
+
|
|
102
|
+
const exactPath = path.join(sitemapBasePath, "sitemap.xml");
|
|
103
|
+
|
|
104
|
+
await saveFile(exactPath, siteMap);
|
|
105
|
+
verboseLog(`sitemap generated in ${exactPath}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Saves the content to a file specified by its path. If the file exists, it will be overwritten.
|
|
112
|
+
*
|
|
113
|
+
* @param filePath The path of the file to save the content to.
|
|
114
|
+
* @param content The content to save to the file.
|
|
115
|
+
*/
|
|
116
|
+
async function saveFile(filePath: string, content: string) {
|
|
117
|
+
try {
|
|
118
|
+
const pathName = path.dirname(filePath);
|
|
119
|
+
if (!(await pathExists(pathName))) {
|
|
120
|
+
await fsp.mkdir(pathName, { recursive: true });
|
|
121
|
+
}
|
|
122
|
+
await fsp.writeFile(filePath, content);
|
|
123
|
+
} catch (error) {
|
|
124
|
+
console.log(error);
|
|
125
|
+
throw new Error(`Error saving a file`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export { generateSitemaps };
|
package/exporter/utils/sites.ts
CHANGED
|
@@ -1,49 +1,35 @@
|
|
|
1
1
|
import type { Site, SiteData } from "../types/sites";
|
|
2
2
|
|
|
3
|
+
import fsp from "node:fs/promises";
|
|
3
4
|
import path from "node:path";
|
|
4
5
|
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
import { buildLog, verboseLog } from "./loggin";
|
|
11
|
-
import { getBuildMetadata } from "./store";
|
|
12
|
-
import { AuthService } from "../services/auth";
|
|
6
|
+
import {
|
|
7
|
+
GRIDDO_RENDER_ALL_SITES,
|
|
8
|
+
GRIDDO_RENDER_PAGES,
|
|
9
|
+
GRIDDO_RENDER_SITE,
|
|
10
|
+
} from "../constants/envs";
|
|
13
11
|
import {
|
|
14
12
|
endSiteRender,
|
|
15
13
|
getAllSites,
|
|
16
14
|
getSiteInfo,
|
|
17
15
|
getSiteLanguages,
|
|
18
|
-
getSitemap,
|
|
19
16
|
getSiteSocials,
|
|
20
17
|
startSiteRender,
|
|
21
18
|
} from "../services/sites";
|
|
22
|
-
|
|
23
|
-
const config = getConfig();
|
|
19
|
+
import { getRenderPathsFromDB } from "./render";
|
|
24
20
|
|
|
25
21
|
/**
|
|
26
22
|
* Check the instance sites and returns site prepared to be published and unpublished.
|
|
27
23
|
*/
|
|
28
24
|
async function getSitesToRender(domain: string) {
|
|
29
|
-
console.info(`API URL ${envs.GRIDDO_API_URL as string}`);
|
|
30
|
-
|
|
31
|
-
// Login to API
|
|
32
|
-
await AuthService.login();
|
|
33
|
-
|
|
34
25
|
// Get all sites. An array of Site
|
|
35
26
|
const allSites = await getAllSites(domain);
|
|
36
27
|
|
|
37
28
|
// Filter the array of sites to get only the ones to build/render
|
|
38
|
-
const validSites =
|
|
39
|
-
? allSites.filter(
|
|
40
|
-
(site) =>
|
|
41
|
-
!envs.GRIDDO_RENDER_SITE || site.id === envs.GRIDDO_RENDER_SITE,
|
|
42
|
-
)
|
|
29
|
+
const validSites = GRIDDO_RENDER_ALL_SITES
|
|
30
|
+
? allSites.filter((site) => !GRIDDO_RENDER_SITE || site.id === GRIDDO_RENDER_SITE)
|
|
43
31
|
: allSites.filter((site) =>
|
|
44
|
-
|
|
45
|
-
? site.id === envs.GRIDDO_RENDER_SITE
|
|
46
|
-
: !!site.shouldBeUpdated,
|
|
32
|
+
GRIDDO_RENDER_SITE ? site.id === GRIDDO_RENDER_SITE : !!site.shouldBeUpdated,
|
|
47
33
|
);
|
|
48
34
|
|
|
49
35
|
// If there are valid sites...
|
|
@@ -58,8 +44,7 @@ async function getSitesToRender(domain: string) {
|
|
|
58
44
|
site.domains = items
|
|
59
45
|
.filter(
|
|
60
46
|
(item) =>
|
|
61
|
-
item.domain &&
|
|
62
|
-
(item.domain.slug === domain || item.domain.slug === `/${domain}`),
|
|
47
|
+
item.domain && (item.domain.slug === domain || item.domain.slug === `/${domain}`),
|
|
63
48
|
)
|
|
64
49
|
.map((item) => ({ [item.id]: `${item.domain.slug}${item.path}` }));
|
|
65
50
|
}
|
|
@@ -67,15 +52,11 @@ async function getSitesToRender(domain: string) {
|
|
|
67
52
|
|
|
68
53
|
// Save sites object to publish
|
|
69
54
|
const sitesToPublish = validSites.filter((site) =>
|
|
70
|
-
|
|
71
|
-
? site.id === envs.GRIDDO_RENDER_SITE
|
|
72
|
-
: !!site.isPublished,
|
|
55
|
+
GRIDDO_RENDER_SITE ? site.id === GRIDDO_RENDER_SITE : !!site.isPublished,
|
|
73
56
|
);
|
|
74
57
|
|
|
75
58
|
// Save sites object to unpublish
|
|
76
|
-
const sitesToUnpublish = validSites.filter(
|
|
77
|
-
(site) => !site.isPublished && site.shouldBeUpdated,
|
|
78
|
-
);
|
|
59
|
+
const sitesToUnpublish = validSites.filter((site) => !site.isPublished && site.shouldBeUpdated);
|
|
79
60
|
|
|
80
61
|
return {
|
|
81
62
|
sitesToPublish,
|
|
@@ -90,7 +71,7 @@ async function getSitesToRender(domain: string) {
|
|
|
90
71
|
* @see https://griddoio.notion.site/Sites-d7bb0b7cb8d24894a5337e1139fc3d09#2019d3255bda4d219c7e19cf28d0c4fe
|
|
91
72
|
*/
|
|
92
73
|
async function unpublishSites(sites: Array<Site>) {
|
|
93
|
-
const {
|
|
74
|
+
const { __root } = await getRenderPathsFromDB();
|
|
94
75
|
|
|
95
76
|
for (const site of sites) {
|
|
96
77
|
// API
|
|
@@ -107,7 +88,8 @@ async function unpublishSites(sites: Array<Site>) {
|
|
|
107
88
|
|
|
108
89
|
// STORE
|
|
109
90
|
// Remove site directory from the Store
|
|
110
|
-
|
|
91
|
+
// @todo: quitar. Como ya no hay persistenci de store, esto debería eliminarse de forma segura.
|
|
92
|
+
await fsp.rm(path.join(__root, "store", site.id.toString()), {
|
|
111
93
|
force: true,
|
|
112
94
|
recursive: true,
|
|
113
95
|
});
|
|
@@ -130,8 +112,8 @@ async function getSiteData(siteID: number) {
|
|
|
130
112
|
|
|
131
113
|
const { siteHash, unpublishHashes, publishIds } = buildData;
|
|
132
114
|
const { headers, footers } = siteInfo;
|
|
133
|
-
const validPagesIds =
|
|
134
|
-
?
|
|
115
|
+
const validPagesIds = GRIDDO_RENDER_PAGES.length
|
|
116
|
+
? GRIDDO_RENDER_PAGES.filter((item) => publishIds.includes(item))
|
|
135
117
|
: publishIds;
|
|
136
118
|
|
|
137
119
|
const siteData: SiteData = {
|
|
@@ -149,164 +131,4 @@ async function getSiteData(siteID: number) {
|
|
|
149
131
|
return siteData;
|
|
150
132
|
}
|
|
151
133
|
|
|
152
|
-
|
|
153
|
-
* Save a file with the end of build process to use as `build-end` signal.
|
|
154
|
-
*/
|
|
155
|
-
async function generateBuildReport() {
|
|
156
|
-
const { __cx } = config.paths();
|
|
157
|
-
const { buildReportFileName } = config;
|
|
158
|
-
|
|
159
|
-
const { buildProcessData } = await getBuildMetadata();
|
|
160
|
-
|
|
161
|
-
// Get the token
|
|
162
|
-
const authControl = await AuthService.login();
|
|
163
|
-
|
|
164
|
-
const buildSitesInfo = Object.keys(buildProcessData).map((siteID) => ({
|
|
165
|
-
...buildProcessData[siteID],
|
|
166
|
-
siteId: Number.parseInt(siteID),
|
|
167
|
-
}));
|
|
168
|
-
|
|
169
|
-
const report = {
|
|
170
|
-
authControl,
|
|
171
|
-
sites: buildSitesInfo,
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
const reportFilePath = path.join(__cx, "dist", buildReportFileName);
|
|
175
|
-
fs.writeFileSync(reportFilePath, JSON.stringify(report));
|
|
176
|
-
|
|
177
|
-
verboseLog(`build report saved in ${reportFilePath}`);
|
|
178
|
-
|
|
179
|
-
buildLog(`Build report saved for ${buildSitesInfo.length} site(s)`);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Generate sitemaps and save them into file system.
|
|
184
|
-
*/
|
|
185
|
-
async function generateSitemaps() {
|
|
186
|
-
const { sitesToPublish } = await getBuildMetadata();
|
|
187
|
-
const { __cx } = config.paths();
|
|
188
|
-
const distDir = path.join(__cx, "dist");
|
|
189
|
-
|
|
190
|
-
const templateSitemapPrefix = "sitemap-";
|
|
191
|
-
|
|
192
|
-
const isGriddoSitemapFile = (file: string) =>
|
|
193
|
-
file === "sitemap.xml" ||
|
|
194
|
-
(file.startsWith(templateSitemapPrefix) && file.endsWith(".xml"));
|
|
195
|
-
|
|
196
|
-
for (const site of sitesToPublish) {
|
|
197
|
-
const { id, languages } = site;
|
|
198
|
-
|
|
199
|
-
for (const lang of languages) {
|
|
200
|
-
if (AuthService.headers) {
|
|
201
|
-
AuthService.headers.lang = lang.id.toString();
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
const response = await getSitemap(id);
|
|
205
|
-
|
|
206
|
-
if (!response) continue;
|
|
207
|
-
|
|
208
|
-
const {
|
|
209
|
-
items: sitemapPagesGroup,
|
|
210
|
-
url: { home, domain },
|
|
211
|
-
} = response;
|
|
212
|
-
|
|
213
|
-
if (!home) continue;
|
|
214
|
-
|
|
215
|
-
const domainLanguage = site.domains.find(
|
|
216
|
-
(domain) => Object.keys(domain)[0] === lang.id.toString(),
|
|
217
|
-
);
|
|
218
|
-
|
|
219
|
-
if (!domainLanguage) continue;
|
|
220
|
-
|
|
221
|
-
const slug = Object.values(domainLanguage)[0];
|
|
222
|
-
const sitemaps: Array<string> = [];
|
|
223
|
-
const sitemapPageGroupKeys = Object.keys(sitemapPagesGroup);
|
|
224
|
-
const sitemapBasePath = path.join(distDir, slug.replace(domain, ""));
|
|
225
|
-
|
|
226
|
-
/** delete every griddo sitemap file before create the new ones */
|
|
227
|
-
if (fs.existsSync(sitemapBasePath)) {
|
|
228
|
-
try {
|
|
229
|
-
const files = fs.readdirSync(sitemapBasePath);
|
|
230
|
-
for (const file of files) {
|
|
231
|
-
if (isGriddoSitemapFile(file)) {
|
|
232
|
-
const filePath = path.join(sitemapBasePath, file);
|
|
233
|
-
try {
|
|
234
|
-
fs.unlinkSync(filePath);
|
|
235
|
-
} catch (err) {
|
|
236
|
-
console.error(`Error removing ${filePath}:`, err);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
} catch (err) {
|
|
241
|
-
console.error(`Error reading ${sitemapBasePath}:`, err);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
for (const templateId of sitemapPageGroupKeys) {
|
|
246
|
-
const sitemapPages = sitemapPagesGroup[templateId];
|
|
247
|
-
|
|
248
|
-
if (!sitemapPages.length) continue;
|
|
249
|
-
|
|
250
|
-
const siteMap = parse("urlset", {
|
|
251
|
-
"@": {
|
|
252
|
-
xmlns: "http://www.sitemaps.org/schemas/sitemap/0.9",
|
|
253
|
-
"xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
|
|
254
|
-
"xsi:schemaLocation":
|
|
255
|
-
"http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd",
|
|
256
|
-
},
|
|
257
|
-
url: sitemapPages,
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
const sitemapName = `/${templateSitemapPrefix}${templateId.toLowerCase()}.xml`;
|
|
261
|
-
const exactPath = path.join(sitemapBasePath, sitemapName);
|
|
262
|
-
|
|
263
|
-
saveFile(exactPath, siteMap);
|
|
264
|
-
|
|
265
|
-
sitemaps.push(
|
|
266
|
-
`${home.endsWith("/") ? home.slice(0, -1) : home}${sitemapName}`,
|
|
267
|
-
);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
if (!sitemaps.length) {
|
|
271
|
-
continue;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
const siteMap = parse("sitemapindex", {
|
|
275
|
-
"@": { xmlns: "http://www.sitemaps.org/schemas/sitemap/0.9" },
|
|
276
|
-
sitemap: sitemaps.map((loc) => ({ loc })),
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
const exactPath = path.join(sitemapBasePath, "sitemap.xml");
|
|
280
|
-
|
|
281
|
-
saveFile(exactPath, siteMap);
|
|
282
|
-
verboseLog(`sitemap generated in ${exactPath}`);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* Saves the content to a file specified by its path. If the file exists, it will be overwritten.
|
|
289
|
-
*
|
|
290
|
-
* @param filePath The path of the file to save the content to.
|
|
291
|
-
* @param content The content to save to the file.
|
|
292
|
-
*/
|
|
293
|
-
function saveFile(filePath: string, content: string) {
|
|
294
|
-
try {
|
|
295
|
-
const pathName = path.dirname(filePath);
|
|
296
|
-
if (!fs.existsSync(pathName)) {
|
|
297
|
-
fs.mkdirSync(pathName, { recursive: true });
|
|
298
|
-
}
|
|
299
|
-
fs.writeFileSync(filePath, content);
|
|
300
|
-
} catch (error) {
|
|
301
|
-
console.log(error);
|
|
302
|
-
throw new Error(`Error saving a file`);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
export {
|
|
307
|
-
generateBuildReport,
|
|
308
|
-
generateSitemaps,
|
|
309
|
-
getSiteData,
|
|
310
|
-
getSitesToRender,
|
|
311
|
-
unpublishSites,
|
|
312
|
-
};
|
|
134
|
+
export { getSiteData, getSitesToRender, unpublishSites };
|