@griddo/cx 11.7.12-rc.3 → 11.7.12
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 +226 -27
- package/build/adapters/gatsby/index.d.ts +4 -0
- package/build/adapters/gatsby/utils.d.ts +22 -0
- package/build/artifacts/index.d.ts +6 -0
- package/build/commands/end-render.d.ts +2 -0
- package/build/commands/move-assets.d.ts +1 -0
- package/build/commands/prepare-domains-render.d.ts +1 -0
- package/build/commands/reset-render.d.ts +2 -0
- package/build/commands/start-render.d.ts +2 -0
- package/build/commands/upload-search-content.d.ts +2 -0
- package/build/constants/endpoints.d.ts +19 -0
- package/build/constants/envs.d.ts +37 -0
- package/build/constants/index.d.ts +57 -0
- package/build/end-render.js +74 -0
- package/build/end-render.js.map +7 -0
- package/build/errors/errors-data.d.ts +22 -0
- package/build/errors/index.d.ts +15 -0
- package/build/index.d.ts +29 -0
- package/build/index.js +73 -0
- package/build/index.js.map +7 -0
- package/build/prepare-domains-render.js +73 -0
- package/build/prepare-domains-render.js.map +7 -0
- package/build/react/Favicon/index.d.ts +5 -0
- package/build/react/Favicon/utils.d.ts +9 -0
- package/build/react/GriddoIntegrations/index.d.ts +20 -0
- package/build/react/GriddoIntegrations/utils.d.ts +26 -0
- package/{react/index.tsx → build/react/index.d.ts} +0 -1
- package/build/react/index.js +3 -0
- package/build/registers/api.d.ts +9 -0
- package/build/registers/gatsby.d.ts +9 -0
- package/build/registers/index.d.ts +3 -0
- package/build/reset-render.js +74 -0
- package/build/reset-render.js.map +7 -0
- package/build/services/auth.d.ts +10 -0
- package/build/services/domains.d.ts +6 -0
- package/build/services/navigation.d.ts +50 -0
- package/build/services/reference-fields.d.ts +20 -0
- package/build/services/register.d.ts +36 -0
- package/build/services/robots.d.ts +19 -0
- package/build/services/settings.d.ts +4 -0
- package/build/services/sites.d.ts +29 -0
- package/build/services/store.d.ts +6 -0
- package/build/start-render.js +100 -0
- package/build/start-render.js.map +7 -0
- package/build/types/api.d.ts +142 -0
- package/build/types/global.d.ts +84 -0
- package/build/types/navigation.d.ts +28 -0
- package/build/types/pages.d.ts +144 -0
- package/build/types/sites.d.ts +57 -0
- package/build/types/templates.d.ts +8 -0
- package/build/upload-search-content.js +74 -0
- package/build/upload-search-content.js.map +7 -0
- package/build/utils/alerts.d.ts +3 -0
- package/build/utils/api.d.ts +23 -0
- package/build/utils/cache.d.ts +35 -0
- package/build/utils/core-utils.d.ts +107 -0
- package/build/utils/create-build-data.d.ts +8 -0
- package/build/utils/domains.d.ts +13 -0
- package/build/utils/folders.d.ts +53 -0
- package/build/utils/health-checks.d.ts +7 -0
- package/build/utils/images.d.ts +16 -0
- package/build/utils/instance.d.ts +21 -0
- package/build/utils/loggin.d.ts +51 -0
- package/build/utils/pages.d.ts +34 -0
- package/build/utils/render.d.ts +13 -0
- package/build/utils/searches.d.ts +15 -0
- package/build/utils/sites.d.ts +31 -0
- package/build/utils/store.d.ts +81 -0
- package/cx.config.d.ts +5 -0
- package/cx.config.js +36 -0
- package/exporter/adapters/gatsby/index.ts +153 -73
- package/exporter/adapters/gatsby/utils.ts +161 -0
- package/exporter/artifacts/README.md +34 -0
- package/exporter/artifacts/index.ts +33 -0
- package/exporter/build.sh +38 -4
- package/exporter/commands/end-render.ts +70 -72
- package/exporter/commands/move-assets.ts +11 -0
- package/exporter/commands/prepare-domains-render.ts +31 -143
- package/exporter/commands/reset-render.ts +3 -10
- package/exporter/commands/start-render.ts +45 -22
- package/exporter/commands/upload-search-content.ts +21 -194
- package/exporter/constants/endpoints.ts +1 -2
- package/exporter/constants/envs.ts +55 -57
- package/exporter/constants/index.ts +129 -0
- package/exporter/{constants/errors.ts → errors/errors-data.ts} +14 -24
- package/exporter/{utils/errors.ts → errors/index.ts} +9 -10
- package/exporter/index.ts +82 -0
- package/{react → exporter/react}/Favicon/index.tsx +7 -1
- package/{react → exporter/react}/GriddoIntegrations/index.tsx +22 -16
- package/{react → exporter/react}/GriddoIntegrations/utils.ts +9 -21
- package/exporter/react/index.tsx +11 -0
- package/exporter/registers/api.ts +14 -0
- package/exporter/registers/gatsby.ts +14 -0
- package/exporter/registers/index.ts +4 -0
- package/exporter/services/auth.ts +6 -7
- package/exporter/services/domains.ts +16 -0
- package/exporter/services/navigation.ts +10 -4
- package/exporter/services/reference-fields.ts +24 -9
- package/exporter/services/register.ts +113 -0
- package/exporter/services/robots.ts +16 -9
- package/exporter/services/settings.ts +17 -0
- package/exporter/services/sites.ts +24 -36
- package/exporter/services/store.ts +96 -107
- package/exporter/types/api.ts +28 -27
- package/exporter/types/global.ts +11 -8
- package/exporter/types/navigation.ts +1 -1
- package/exporter/types/pages.ts +3 -2
- package/exporter/types/sites.ts +2 -1
- package/exporter/utils/alerts.ts +29 -0
- package/exporter/utils/api.ts +75 -55
- package/exporter/utils/cache.ts +62 -37
- package/exporter/utils/core-utils.ts +272 -133
- package/exporter/utils/create-build-data.ts +17 -0
- package/exporter/utils/domains.ts +7 -10
- package/exporter/utils/folders.ts +98 -163
- package/exporter/utils/health-checks.ts +64 -0
- package/exporter/utils/images.ts +6 -1
- package/exporter/utils/instance.ts +13 -9
- package/exporter/utils/loggin.ts +91 -44
- package/exporter/utils/pages.ts +88 -23
- package/exporter/utils/render.ts +48 -180
- package/exporter/utils/searches.ts +156 -0
- package/exporter/utils/sites.ts +197 -19
- package/exporter/utils/store.ts +180 -87
- package/gatsby-browser.tsx +58 -41
- package/gatsby-config.ts +17 -10
- package/gatsby-node.ts +78 -17
- package/gatsby-ssr.tsx +1 -2
- package/package.json +86 -36
- package/src/README.md +7 -0
- package/src/components/Head.tsx +46 -13
- package/src/components/template.tsx +30 -8
- package/src/gatsby-node-utils.ts +2 -73
- package/src/html.tsx +11 -2
- package/src/types.ts +5 -5
- package/start-render.js +7 -0
- package/tsconfig.json +3 -5
- package/build/adapters/gatsby/actions/clean.js +0 -10
- package/build/adapters/gatsby/actions/clean.js.map +0 -1
- package/build/adapters/gatsby/actions/close.js +0 -12
- package/build/adapters/gatsby/actions/close.js.map +0 -1
- package/build/adapters/gatsby/actions/data.js +0 -18
- package/build/adapters/gatsby/actions/data.js.map +0 -1
- package/build/adapters/gatsby/actions/healthCheck.js +0 -10
- package/build/adapters/gatsby/actions/healthCheck.js.map +0 -1
- package/build/adapters/gatsby/actions/init.js +0 -22
- package/build/adapters/gatsby/actions/init.js.map +0 -1
- package/build/adapters/gatsby/actions/logs.js +0 -11
- package/build/adapters/gatsby/actions/logs.js.map +0 -1
- package/build/adapters/gatsby/actions/meta.js +0 -13
- package/build/adapters/gatsby/actions/meta.js.map +0 -1
- package/build/adapters/gatsby/actions/prepare.js +0 -9
- package/build/adapters/gatsby/actions/prepare.js.map +0 -1
- package/build/adapters/gatsby/actions/relocation.js +0 -15
- package/build/adapters/gatsby/actions/relocation.js.map +0 -1
- package/build/adapters/gatsby/actions/restore.js +0 -26
- package/build/adapters/gatsby/actions/restore.js.map +0 -1
- package/build/adapters/gatsby/actions/ssg.js +0 -9
- package/build/adapters/gatsby/actions/ssg.js.map +0 -1
- package/build/adapters/gatsby/actions/sync.js +0 -51
- package/build/adapters/gatsby/actions/sync.js.map +0 -1
- package/build/adapters/gatsby/index.js +0 -78
- package/build/adapters/gatsby/index.js.map +0 -1
- package/build/adapters/gatsby/shared/artifacts.js +0 -20
- package/build/adapters/gatsby/shared/artifacts.js.map +0 -1
- package/build/adapters/gatsby/shared/context.js +0 -31
- package/build/adapters/gatsby/shared/context.js.map +0 -1
- package/build/adapters/gatsby/shared/diff-assets.js +0 -101
- package/build/adapters/gatsby/shared/diff-assets.js.map +0 -1
- package/build/adapters/gatsby/shared/extract-assets.js +0 -58
- package/build/adapters/gatsby/shared/extract-assets.js.map +0 -1
- package/build/adapters/gatsby/shared/gatsby-build.js +0 -55
- package/build/adapters/gatsby/shared/gatsby-build.js.map +0 -1
- package/build/adapters/gatsby/shared/sync-render.js +0 -210
- package/build/adapters/gatsby/shared/sync-render.js.map +0 -1
- package/build/adapters/gatsby/shared/types.js +0 -3
- package/build/adapters/gatsby/shared/types.js.map +0 -1
- package/build/commands/end-render.js +0 -87
- package/build/commands/end-render.js.map +0 -1
- package/build/commands/prepare-assets-directory.js +0 -30
- package/build/commands/prepare-assets-directory.js.map +0 -1
- package/build/commands/prepare-domains-render.js +0 -133
- package/build/commands/prepare-domains-render.js.map +0 -1
- package/build/commands/reset-render.js +0 -21
- package/build/commands/reset-render.js.map +0 -1
- package/build/commands/start-render.js +0 -44
- package/build/commands/start-render.js.map +0 -1
- package/build/commands/upload-search-content.js +0 -180
- package/build/commands/upload-search-content.js.map +0 -1
- package/build/constants/endpoints.js +0 -43
- package/build/constants/endpoints.js.map +0 -1
- package/build/constants/envs.js +0 -68
- package/build/constants/envs.js.map +0 -1
- package/build/constants/errors.js +0 -81
- package/build/constants/errors.js.map +0 -1
- package/build/services/auth.js +0 -40
- package/build/services/auth.js.map +0 -1
- package/build/services/db-class.js +0 -49
- package/build/services/db-class.js.map +0 -1
- package/build/services/db.js +0 -34
- package/build/services/db.js.map +0 -1
- package/build/services/navigation.js +0 -96
- package/build/services/navigation.js.map +0 -1
- package/build/services/reference-fields.js +0 -131
- package/build/services/reference-fields.js.map +0 -1
- package/build/services/robots.js +0 -60
- package/build/services/robots.js.map +0 -1
- package/build/services/sites.js +0 -110
- package/build/services/sites.js.map +0 -1
- package/build/services/store.js +0 -257
- package/build/services/store.js.map +0 -1
- package/build/types/api.js +0 -3
- package/build/types/api.js.map +0 -1
- package/build/types/global.js +0 -3
- package/build/types/global.js.map +0 -1
- package/build/types/navigation.js +0 -3
- package/build/types/navigation.js.map +0 -1
- package/build/types/pages.js +0 -3
- package/build/types/pages.js.map +0 -1
- package/build/types/render.js +0 -10
- package/build/types/render.js.map +0 -1
- package/build/types/sites.js +0 -3
- package/build/types/sites.js.map +0 -1
- package/build/types/templates.js +0 -3
- package/build/types/templates.js.map +0 -1
- package/build/utils/api.js +0 -165
- package/build/utils/api.js.map +0 -1
- package/build/utils/artifacts.js +0 -38
- package/build/utils/artifacts.js.map +0 -1
- package/build/utils/brush.js +0 -30
- package/build/utils/brush.js.map +0 -1
- package/build/utils/cache.js +0 -106
- package/build/utils/cache.js.map +0 -1
- package/build/utils/check-environment-health.js +0 -73
- package/build/utils/check-environment-health.js.map +0 -1
- package/build/utils/core-utils.js +0 -270
- package/build/utils/core-utils.js.map +0 -1
- package/build/utils/domains.js +0 -37
- package/build/utils/domains.js.map +0 -1
- package/build/utils/errors.js +0 -30
- package/build/utils/errors.js.map +0 -1
- package/build/utils/folders.js +0 -341
- package/build/utils/folders.js.map +0 -1
- package/build/utils/images.js +0 -45
- package/build/utils/images.js.map +0 -1
- package/build/utils/instance.js +0 -66
- package/build/utils/instance.js.map +0 -1
- package/build/utils/loggin.js +0 -119
- package/build/utils/loggin.js.map +0 -1
- package/build/utils/npm-deps/find-up-simple.js +0 -75
- package/build/utils/npm-deps/find-up-simple.js.map +0 -1
- package/build/utils/npm-deps/pkg-dir.js +0 -20
- package/build/utils/npm-deps/pkg-dir.js.map +0 -1
- package/build/utils/npm-deps/xml-parser.js +0 -49
- package/build/utils/npm-deps/xml-parser.js.map +0 -1
- package/build/utils/pages.js +0 -359
- package/build/utils/pages.js.map +0 -1
- package/build/utils/render.js +0 -168
- package/build/utils/render.js.map +0 -1
- package/build/utils/sitemaps.js +0 -110
- package/build/utils/sitemaps.js.map +0 -1
- package/build/utils/sites.js +0 -105
- package/build/utils/sites.js.map +0 -1
- package/build/utils/store.js +0 -193
- package/build/utils/store.js.map +0 -1
- package/cli.mjs +0 -136
- package/exporter/adapters/gatsby/actions/clean.ts +0 -14
- package/exporter/adapters/gatsby/actions/close.ts +0 -17
- package/exporter/adapters/gatsby/actions/data.ts +0 -25
- package/exporter/adapters/gatsby/actions/healthCheck.ts +0 -10
- package/exporter/adapters/gatsby/actions/init.ts +0 -26
- package/exporter/adapters/gatsby/actions/logs.ts +0 -12
- package/exporter/adapters/gatsby/actions/meta.ts +0 -16
- package/exporter/adapters/gatsby/actions/prepare.ts +0 -9
- package/exporter/adapters/gatsby/actions/relocation.ts +0 -15
- package/exporter/adapters/gatsby/actions/restore.ts +0 -36
- package/exporter/adapters/gatsby/actions/ssg.ts +0 -12
- package/exporter/adapters/gatsby/actions/sync.ts +0 -71
- package/exporter/adapters/gatsby/shared/artifacts.ts +0 -16
- package/exporter/adapters/gatsby/shared/context.ts +0 -50
- package/exporter/adapters/gatsby/shared/diff-assets.ts +0 -113
- package/exporter/adapters/gatsby/shared/extract-assets.ts +0 -61
- package/exporter/adapters/gatsby/shared/gatsby-build.ts +0 -58
- package/exporter/adapters/gatsby/shared/sync-render.ts +0 -276
- package/exporter/adapters/gatsby/shared/types.ts +0 -35
- package/exporter/build-esbuild.noop +0 -42
- package/exporter/commands/prepare-assets-directory.ts +0 -30
- package/exporter/services/db-class.ts +0 -54
- package/exporter/services/db.ts +0 -32
- package/exporter/types/render.ts +0 -59
- package/exporter/utils/artifacts.ts +0 -38
- package/exporter/utils/brush.ts +0 -34
- package/exporter/utils/check-environment-health.ts +0 -84
- package/exporter/utils/npm-deps/find-up-simple.ts +0 -100
- package/exporter/utils/npm-deps/pkg-dir.ts +0 -17
- package/exporter/utils/npm-deps/xml-parser.ts +0 -57
- package/exporter/utils/sitemaps.ts +0 -129
- package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +0 -55
- package/plugins/gatsby-plugin-svgr-loader/package.json +0 -8
- package/react/DynamicScript/index.tsx +0 -33
- package/tsconfig.commands.json +0 -36
- package/tsconfig.exporter.json +0 -19
- /package/{react → exporter/react}/Favicon/utils.ts +0 -0
package/exporter/utils/render.ts
CHANGED
|
@@ -1,203 +1,71 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
import { execSync } from "node:child_process";
|
|
4
|
-
import fsp from "node:fs/promises";
|
|
1
|
+
import fs from "node:fs";
|
|
5
2
|
import path from "node:path";
|
|
6
3
|
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
|
|
4
|
+
import { envs } from "../constants";
|
|
5
|
+
import { throwError } from "../errors";
|
|
6
|
+
import { RenderUUIDError } from "../errors/errors-data";
|
|
7
|
+
import { apiRegister } from "../registers";
|
|
8
|
+
import { insertAlert } from "./alerts";
|
|
9
|
+
import { getConfig } from "./core-utils";
|
|
10
|
+
import { debugLog } from "./loggin";
|
|
11
|
+
|
|
12
|
+
const config = getConfig();
|
|
15
13
|
|
|
16
14
|
/**
|
|
17
15
|
* Creates a sentinel file with the current date and time.
|
|
18
16
|
* This file is used to track later if node_modules/@griddo/cx was cleaned by a
|
|
19
|
-
* npm install
|
|
17
|
+
* npm install from a deploy.
|
|
20
18
|
*/
|
|
21
|
-
|
|
22
|
-
const {
|
|
23
|
-
|
|
24
|
-
|
|
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());
|
|
19
|
+
function createSentinelRenderFile() {
|
|
20
|
+
const { __cx } = config.paths();
|
|
21
|
+
const renderSentinelFile = path.join(__cx, ".render-sentinel");
|
|
22
|
+
fs.writeFileSync(renderSentinelFile, new Date().toISOString());
|
|
34
23
|
}
|
|
35
24
|
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
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);
|
|
25
|
+
function deleteSentinelRenderFile() {
|
|
26
|
+
const { __cx } = config.paths();
|
|
27
|
+
const renderSentinelFile = path.join(__cx, ".render-sentinel");
|
|
28
|
+
fs.unlinkSync(renderSentinelFile);
|
|
47
29
|
}
|
|
48
30
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const renderSentinelFile = path.join(__ssg, `.render-sentinel-${domain}`);
|
|
54
|
-
if (!(await pathExists(renderSentinelFile))) {
|
|
31
|
+
function isValidRender() {
|
|
32
|
+
const { __cx } = config.paths();
|
|
33
|
+
const renderSentinelFile = path.join(__cx, ".render-sentinel");
|
|
34
|
+
if (!fs.existsSync(renderSentinelFile)) {
|
|
55
35
|
throwError(RenderUUIDError);
|
|
56
36
|
}
|
|
57
37
|
}
|
|
58
38
|
|
|
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
|
-
}
|
|
79
|
-
|
|
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
|
|
112
|
-
}
|
|
113
|
-
|
|
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}`);
|
|
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
39
|
/**
|
|
167
|
-
*
|
|
40
|
+
* Send the default registers through Griddo alerts.
|
|
168
41
|
*/
|
|
169
|
-
async function
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
const { __root } = await getRenderPathsFromDB();
|
|
173
|
-
const { buildReportFileName } = await getRenderMetadataFromDB();
|
|
174
|
-
const { buildProcessData } = await getBuildMetadata(domain);
|
|
42
|
+
async function sendGriddoDefaultAlerts() {
|
|
43
|
+
if (envs.GRIDDO_ALERT_FEATURE) {
|
|
44
|
+
const registerContent = apiRegister.get("API_RESPONSE_TOO_BIG");
|
|
175
45
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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));
|
|
46
|
+
if (registerContent.entries.length < 1) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
189
49
|
|
|
190
|
-
|
|
50
|
+
debugLog("\nRender register report\n");
|
|
51
|
+
debugLog(registerContent);
|
|
52
|
+
debugLog();
|
|
53
|
+
|
|
54
|
+
await insertAlert({
|
|
55
|
+
description: `API response size is too large (${envs.GRIDDO_API_MAX_RESPONSE_SIZE}KB).`,
|
|
56
|
+
area: "Griddo",
|
|
57
|
+
level: "W",
|
|
58
|
+
fullData: {
|
|
59
|
+
output: registerContent,
|
|
60
|
+
date: new Date().toISOString(),
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
191
64
|
}
|
|
192
65
|
|
|
193
66
|
export {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
getRenderPathsFromDB,
|
|
199
|
-
markRenderAsCompleted,
|
|
200
|
-
markRenderAsStarted,
|
|
201
|
-
resolveDomainRenderMode,
|
|
202
|
-
updateCommitFile,
|
|
67
|
+
createSentinelRenderFile,
|
|
68
|
+
deleteSentinelRenderFile,
|
|
69
|
+
isValidRender,
|
|
70
|
+
sendGriddoDefaultAlerts,
|
|
203
71
|
};
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import type { PostSearchInfoResponse } from "../types/api";
|
|
2
|
+
import type {
|
|
3
|
+
AIEmbeddingsResponse,
|
|
4
|
+
PostSearchInfoProps,
|
|
5
|
+
} from "../types/global";
|
|
6
|
+
|
|
7
|
+
import fs from "node:fs";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
|
|
10
|
+
import { post } from "./api";
|
|
11
|
+
import { getConfig } from "./core-utils";
|
|
12
|
+
import { getBuildPagesFromCachedStore } from "./store";
|
|
13
|
+
import { endpoints } from "../constants";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Save in the BBDD the content of a page parsed without HTML tags.
|
|
17
|
+
*
|
|
18
|
+
* @param props Object with parts of the final page object to be saved in the BBDD.
|
|
19
|
+
*/
|
|
20
|
+
async function postSearchInfo(props: PostSearchInfoProps) {
|
|
21
|
+
const {
|
|
22
|
+
title,
|
|
23
|
+
description,
|
|
24
|
+
image,
|
|
25
|
+
pageId,
|
|
26
|
+
languageId,
|
|
27
|
+
siteId,
|
|
28
|
+
url,
|
|
29
|
+
content,
|
|
30
|
+
template,
|
|
31
|
+
} = props;
|
|
32
|
+
|
|
33
|
+
const response = await post<PostSearchInfoResponse>({
|
|
34
|
+
endpoint: endpoints.SEARCH,
|
|
35
|
+
body: {
|
|
36
|
+
title,
|
|
37
|
+
description,
|
|
38
|
+
image,
|
|
39
|
+
pageId,
|
|
40
|
+
languageId,
|
|
41
|
+
siteId,
|
|
42
|
+
url,
|
|
43
|
+
template,
|
|
44
|
+
content,
|
|
45
|
+
},
|
|
46
|
+
useApiCacheDir: false,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
return response;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Remove the every cntent inside some HTML tags including them.
|
|
54
|
+
*
|
|
55
|
+
* @param content A string with the content.
|
|
56
|
+
*/
|
|
57
|
+
function prepareHTMLContentForSearch(content: string): string {
|
|
58
|
+
// 1. Remove script, style, and other unwanted block tags and their content.
|
|
59
|
+
// The regex looks for <tag...>...</tag> where tag is one of the specified ones.
|
|
60
|
+
const tagsToRemove = [
|
|
61
|
+
"meta",
|
|
62
|
+
"link",
|
|
63
|
+
"style",
|
|
64
|
+
"script",
|
|
65
|
+
"noscript",
|
|
66
|
+
"nav",
|
|
67
|
+
"header",
|
|
68
|
+
"footer",
|
|
69
|
+
];
|
|
70
|
+
const removeTagsRegex = new RegExp(
|
|
71
|
+
`<(${tagsToRemove.join("|")})\\b[^>]*>.*?<\\/\\1>`,
|
|
72
|
+
"gis",
|
|
73
|
+
);
|
|
74
|
+
let processedContent = content.replace(removeTagsRegex, "");
|
|
75
|
+
|
|
76
|
+
// 2. Strip all remaining HTML tags.
|
|
77
|
+
processedContent = processedContent.replace(/<[^>]+>/g, " ");
|
|
78
|
+
|
|
79
|
+
// 3. Normalize whitespace: replace multiple spaces/newlines with a single space and trim.
|
|
80
|
+
processedContent = processedContent.replace(/\s+/g, " ").trim();
|
|
81
|
+
|
|
82
|
+
return processedContent;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Function that search in the `/public` dir the content info of the pages and
|
|
87
|
+
* send it to the search table in the ddbb using the API.
|
|
88
|
+
*/
|
|
89
|
+
async function uploadRenderedSearchContentToAPI(
|
|
90
|
+
distDomainPath: string,
|
|
91
|
+
domain: string,
|
|
92
|
+
) {
|
|
93
|
+
const config = getConfig();
|
|
94
|
+
const { __cache } = config.paths(domain);
|
|
95
|
+
|
|
96
|
+
// Extraemos el path de la carpeta store dentro de un dominio
|
|
97
|
+
const storeFolder = path.join(__cache, "store");
|
|
98
|
+
|
|
99
|
+
// Este caso sería que el dominio existe en la instancia pero no hay sites
|
|
100
|
+
// renderizardos bajo el mismo. Por lo que `store` no existe.
|
|
101
|
+
if (!fs.existsSync(storeFolder)) {
|
|
102
|
+
console.log(
|
|
103
|
+
`Skipping uploading content to the search endpoint for the domain ${domain}, it has not exported sites.`,
|
|
104
|
+
);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Obtenemos las páginas del store cacheado de un dominio
|
|
109
|
+
const storePages = getBuildPagesFromCachedStore(domain);
|
|
110
|
+
|
|
111
|
+
for await (const store of storePages) {
|
|
112
|
+
const {
|
|
113
|
+
context: { page, openGraph, pageMetadata },
|
|
114
|
+
} = store;
|
|
115
|
+
|
|
116
|
+
const { compose } = page.fullPath;
|
|
117
|
+
|
|
118
|
+
const contextPath = path.resolve(`${distDomainPath}/${compose}/index.html`);
|
|
119
|
+
|
|
120
|
+
const content = fs.readFileSync(contextPath).toString();
|
|
121
|
+
|
|
122
|
+
const pageObject: PostSearchInfoProps = {
|
|
123
|
+
siteId: page.site,
|
|
124
|
+
pageId: page.id,
|
|
125
|
+
// `pageMetadata.title` has already a fallback `metatitle ||
|
|
126
|
+
// pageTitle` so probably `title` never will be take the
|
|
127
|
+
// `openGraph?.title` value. Only when the `metatitle` and
|
|
128
|
+
// `pageTitle` are empty.
|
|
129
|
+
title: pageMetadata?.title || openGraph?.title,
|
|
130
|
+
languageId: page.language,
|
|
131
|
+
url: page.fullUrl,
|
|
132
|
+
template: page.template.templateType || page.templateId,
|
|
133
|
+
description: pageMetadata?.description || openGraph?.description,
|
|
134
|
+
image: openGraph.image,
|
|
135
|
+
content: prepareHTMLContentForSearch(content),
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
await postSearchInfo(pageObject);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function startAIEmbeddings() {
|
|
143
|
+
try {
|
|
144
|
+
await post<AIEmbeddingsResponse>({
|
|
145
|
+
endpoint: endpoints.AI_EMBEDDINGS,
|
|
146
|
+
useApiCacheDir: false,
|
|
147
|
+
});
|
|
148
|
+
} catch (error) {
|
|
149
|
+
console.warn(
|
|
150
|
+
"There was an error with the ai embeddings",
|
|
151
|
+
(error as Error).message,
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export { postSearchInfo, startAIEmbeddings, uploadRenderedSearchContentToAPI };
|
package/exporter/utils/sites.ts
CHANGED
|
@@ -1,35 +1,49 @@
|
|
|
1
1
|
import type { Site, SiteData } from "../types/sites";
|
|
2
2
|
|
|
3
|
-
import fsp from "node:fs/promises";
|
|
4
3
|
import path from "node:path";
|
|
5
4
|
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
} from "
|
|
5
|
+
import fs from "fs-extra";
|
|
6
|
+
import { parse } from "js2xmlparser";
|
|
7
|
+
|
|
8
|
+
import { envs } from "../constants";
|
|
9
|
+
import { getConfig } from "./core-utils";
|
|
10
|
+
import { buildLog, verboseLog } from "./loggin";
|
|
11
|
+
import { getBuildMetadata } from "./store";
|
|
12
|
+
import { AuthService } from "../services/auth";
|
|
11
13
|
import {
|
|
12
14
|
endSiteRender,
|
|
13
15
|
getAllSites,
|
|
14
16
|
getSiteInfo,
|
|
15
17
|
getSiteLanguages,
|
|
18
|
+
getSitemap,
|
|
16
19
|
getSiteSocials,
|
|
17
20
|
startSiteRender,
|
|
18
21
|
} from "../services/sites";
|
|
19
|
-
|
|
22
|
+
|
|
23
|
+
const config = getConfig();
|
|
20
24
|
|
|
21
25
|
/**
|
|
22
26
|
* Check the instance sites and returns site prepared to be published and unpublished.
|
|
23
27
|
*/
|
|
24
28
|
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
|
+
|
|
25
34
|
// Get all sites. An array of Site
|
|
26
35
|
const allSites = await getAllSites(domain);
|
|
27
36
|
|
|
28
37
|
// Filter the array of sites to get only the ones to build/render
|
|
29
|
-
const validSites = GRIDDO_RENDER_ALL_SITES
|
|
30
|
-
? allSites.filter(
|
|
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
|
+
)
|
|
31
43
|
: allSites.filter((site) =>
|
|
32
|
-
|
|
44
|
+
envs.GRIDDO_RENDER_SITE
|
|
45
|
+
? site.id === envs.GRIDDO_RENDER_SITE
|
|
46
|
+
: !!site.shouldBeUpdated,
|
|
33
47
|
);
|
|
34
48
|
|
|
35
49
|
// If there are valid sites...
|
|
@@ -44,7 +58,8 @@ async function getSitesToRender(domain: string) {
|
|
|
44
58
|
site.domains = items
|
|
45
59
|
.filter(
|
|
46
60
|
(item) =>
|
|
47
|
-
item.domain &&
|
|
61
|
+
item.domain &&
|
|
62
|
+
(item.domain.slug === domain || item.domain.slug === `/${domain}`),
|
|
48
63
|
)
|
|
49
64
|
.map((item) => ({ [item.id]: `${item.domain.slug}${item.path}` }));
|
|
50
65
|
}
|
|
@@ -52,11 +67,15 @@ async function getSitesToRender(domain: string) {
|
|
|
52
67
|
|
|
53
68
|
// Save sites object to publish
|
|
54
69
|
const sitesToPublish = validSites.filter((site) =>
|
|
55
|
-
|
|
70
|
+
envs.GRIDDO_RENDER_SITE
|
|
71
|
+
? site.id === envs.GRIDDO_RENDER_SITE
|
|
72
|
+
: !!site.isPublished,
|
|
56
73
|
);
|
|
57
74
|
|
|
58
75
|
// Save sites object to unpublish
|
|
59
|
-
const sitesToUnpublish = validSites.filter(
|
|
76
|
+
const sitesToUnpublish = validSites.filter(
|
|
77
|
+
(site) => !site.isPublished && site.shouldBeUpdated,
|
|
78
|
+
);
|
|
60
79
|
|
|
61
80
|
return {
|
|
62
81
|
sitesToPublish,
|
|
@@ -71,7 +90,7 @@ async function getSitesToRender(domain: string) {
|
|
|
71
90
|
* @see https://griddoio.notion.site/Sites-d7bb0b7cb8d24894a5337e1139fc3d09#2019d3255bda4d219c7e19cf28d0c4fe
|
|
72
91
|
*/
|
|
73
92
|
async function unpublishSites(sites: Array<Site>) {
|
|
74
|
-
const {
|
|
93
|
+
const { __cx } = config.paths();
|
|
75
94
|
|
|
76
95
|
for (const site of sites) {
|
|
77
96
|
// API
|
|
@@ -88,8 +107,7 @@ async function unpublishSites(sites: Array<Site>) {
|
|
|
88
107
|
|
|
89
108
|
// STORE
|
|
90
109
|
// Remove site directory from the Store
|
|
91
|
-
|
|
92
|
-
await fsp.rm(path.join(__root, "store", site.id.toString()), {
|
|
110
|
+
fs.rmSync(path.join(__cx, "store", site.id.toString()), {
|
|
93
111
|
force: true,
|
|
94
112
|
recursive: true,
|
|
95
113
|
});
|
|
@@ -112,8 +130,8 @@ async function getSiteData(siteID: number) {
|
|
|
112
130
|
|
|
113
131
|
const { siteHash, unpublishHashes, publishIds } = buildData;
|
|
114
132
|
const { headers, footers } = siteInfo;
|
|
115
|
-
const validPagesIds = GRIDDO_RENDER_PAGES.length
|
|
116
|
-
? GRIDDO_RENDER_PAGES.filter((item) => publishIds.includes(item))
|
|
133
|
+
const validPagesIds = envs.GRIDDO_RENDER_PAGES.length
|
|
134
|
+
? envs.GRIDDO_RENDER_PAGES.filter((item) => publishIds.includes(item))
|
|
117
135
|
: publishIds;
|
|
118
136
|
|
|
119
137
|
const siteData: SiteData = {
|
|
@@ -131,4 +149,164 @@ async function getSiteData(siteID: number) {
|
|
|
131
149
|
return siteData;
|
|
132
150
|
}
|
|
133
151
|
|
|
134
|
-
|
|
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
|
+
};
|