@griddo/cx 11.9.9-rc.0 → 11.9.9-rc.2
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 +240 -13
- 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 +1 -0
- package/build/commands/reset-render.d.ts +1 -0
- package/build/commands/start-render.d.ts +1 -0
- package/build/commands/upload-search-content.d.ts +1 -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/{shared/errors.d.ts → errors/errors-data.d.ts} +3 -5
- package/build/errors/index.d.ts +15 -0
- package/build/index.d.ts +29 -10
- package/build/index.js +73 -406
- 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/GriddoIntegrations/index.d.ts +4 -3
- package/build/react/GriddoIntegrations/utils.d.ts +6 -7
- package/build/react/index.d.ts +2 -3
- package/build/react/index.js +3 -1
- 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 +5 -2
- package/build/services/domains.d.ts +4 -3
- package/build/services/navigation.d.ts +16 -16
- package/build/services/reference-fields.d.ts +3 -3
- package/build/services/register.d.ts +36 -0
- package/build/services/robots.d.ts +19 -2
- package/build/services/settings.d.ts +4 -0
- package/build/services/sites.d.ts +5 -8
- package/build/services/store.d.ts +1 -10
- package/build/start-render.js +100 -0
- package/build/start-render.js.map +7 -0
- package/build/{shared/types → types}/api.d.ts +18 -18
- package/build/{shared/types → types}/global.d.ts +16 -15
- package/build/{shared/types → types}/navigation.d.ts +5 -5
- package/build/{shared/types → types}/pages.d.ts +9 -9
- package/build/{shared/types → types}/sites.d.ts +19 -18
- 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/{services → utils}/api.d.ts +1 -1
- 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/{core/check-env-health.d.ts → utils/health-checks.d.ts} +2 -4
- package/build/utils/loggin.d.ts +51 -0
- package/build/{services → utils}/pages.d.ts +3 -3
- 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 +162 -0
- 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 +24 -16
- package/exporter/commands/end-render.ts +86 -65
- package/exporter/commands/move-assets.ts +11 -0
- package/exporter/commands/prepare-domains-render.ts +35 -147
- package/exporter/commands/reset-render.ts +8 -13
- package/exporter/commands/start-render.ts +64 -26
- package/exporter/commands/upload-search-content.ts +26 -201
- package/exporter/{shared → constants}/endpoints.ts +11 -12
- package/exporter/constants/envs.ts +94 -0
- package/exporter/constants/index.ts +129 -0
- package/exporter/{shared/errors.ts → errors/errors-data.ts} +14 -24
- package/exporter/errors/index.ts +40 -0
- package/exporter/index.ts +56 -14
- package/exporter/react/{GriddoFavicon → Favicon}/index.tsx +9 -3
- package/exporter/react/GriddoIntegrations/index.tsx +23 -17
- package/exporter/react/GriddoIntegrations/utils.ts +12 -24
- package/exporter/react/index.tsx +9 -3
- 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 +10 -8
- package/exporter/services/domains.ts +8 -23
- package/exporter/services/navigation.ts +18 -12
- package/exporter/services/reference-fields.ts +32 -14
- package/exporter/services/register.ts +113 -0
- package/exporter/services/robots.ts +61 -33
- package/exporter/services/settings.ts +17 -0
- package/exporter/services/sites.ts +28 -40
- package/exporter/services/store.ts +321 -354
- package/exporter/{shared/types → types}/api.ts +41 -40
- package/exporter/{shared/types → types}/global.ts +21 -17
- package/exporter/{shared/types → types}/navigation.ts +3 -3
- package/exporter/{shared/types → types}/pages.ts +11 -10
- package/exporter/{shared/types → types}/sites.ts +19 -18
- package/exporter/utils/alerts.ts +29 -0
- package/exporter/utils/api.ts +243 -0
- package/exporter/utils/cache.ts +142 -0
- package/exporter/utils/core-utils.ts +458 -0
- package/exporter/utils/create-build-data.ts +17 -0
- package/exporter/utils/domains.ts +39 -0
- package/exporter/utils/folders.ts +320 -0
- package/exporter/utils/health-checks.ts +64 -0
- package/exporter/{core → utils}/images.ts +6 -1
- package/exporter/{core → utils}/instance.ts +13 -9
- package/exporter/utils/loggin.ts +184 -0
- package/exporter/{services → utils}/pages.ts +92 -27
- package/exporter/utils/render.ts +71 -0
- package/exporter/utils/searches.ts +156 -0
- package/exporter/utils/sites.ts +312 -0
- package/exporter/utils/store.ts +314 -0
- package/gatsby-browser.tsx +58 -41
- package/gatsby-config.ts +17 -10
- package/gatsby-node.ts +79 -20
- package/gatsby-ssr.tsx +1 -2
- package/package.json +80 -41
- package/src/README.md +7 -0
- package/src/components/Head.tsx +73 -28
- package/src/components/template.tsx +29 -6
- package/src/gatsby-node-utils.ts +2 -76
- package/src/html.tsx +11 -2
- package/src/types.ts +3 -3
- package/start-render.js +7 -0
- package/tsconfig.json +3 -5
- package/build/commands/end-render.js +0 -31
- package/build/commands/end-render.js.map +0 -7
- package/build/commands/prepare-assets-directory.js +0 -9
- package/build/commands/prepare-assets-directory.js.map +0 -7
- package/build/commands/prepare-domains-render.js +0 -38
- package/build/commands/prepare-domains-render.js.map +0 -7
- package/build/commands/reset-render.js +0 -31
- package/build/commands/reset-render.js.map +0 -7
- package/build/commands/single-domain-upload-search-content.d.ts +0 -1
- package/build/commands/start-render.js +0 -66
- package/build/commands/start-render.js.map +0 -7
- package/build/commands/upload-search-content.js +0 -31
- package/build/commands/upload-search-content.js.map +0 -7
- package/build/core/GriddoLog.d.ts +0 -16
- package/build/core/db-class.d.ts +0 -11
- package/build/core/db.d.ts +0 -4
- package/build/core/dist-rollback.d.ts +0 -11
- package/build/core/errors.d.ts +0 -26
- package/build/core/fs.d.ts +0 -69
- package/build/core/life-cycle.d.ts +0 -26
- package/build/core/logger.d.ts +0 -18
- package/build/core/objects.d.ts +0 -11
- package/build/core/print-logos.d.ts +0 -5
- package/build/react/DynamicScript/index.d.ts +0 -4
- package/build/react/GriddoFavicon/index.d.ts +0 -4
- package/build/react/GriddoOpenGraph/index.d.ts +0 -10
- package/build/services/manage-sites.d.ts +0 -22
- package/build/services/manage-store.d.ts +0 -32
- package/build/services/render-artifacts.d.ts +0 -6
- package/build/services/render.d.ts +0 -70
- package/build/services/sitemaps.d.ts +0 -5
- package/build/shared/context.d.ts +0 -36
- package/build/shared/envs.d.ts +0 -19
- package/build/shared/npm-modules/brush.d.ts +0 -18
- package/build/shared/npm-modules/find-up-simple.d.ts +0 -34
- package/build/shared/npm-modules/pkg-dir.d.ts +0 -7
- package/build/shared/npm-modules/xml-parser.d.ts +0 -4
- package/build/shared/types/render.d.ts +0 -54
- package/build/shared/types.d.ts +0 -15
- package/build/ssg-adapters/gatsby/actions/clean.d.ts +0 -3
- package/build/ssg-adapters/gatsby/actions/close.d.ts +0 -3
- package/build/ssg-adapters/gatsby/actions/data.d.ts +0 -2
- package/build/ssg-adapters/gatsby/actions/healthCheck.d.ts +0 -2
- package/build/ssg-adapters/gatsby/actions/init.d.ts +0 -2
- package/build/ssg-adapters/gatsby/actions/logs.d.ts +0 -3
- package/build/ssg-adapters/gatsby/actions/meta.d.ts +0 -2
- package/build/ssg-adapters/gatsby/actions/prepare.d.ts +0 -2
- package/build/ssg-adapters/gatsby/actions/relocation.d.ts +0 -2
- package/build/ssg-adapters/gatsby/actions/restore.d.ts +0 -3
- package/build/ssg-adapters/gatsby/actions/ssg.d.ts +0 -3
- package/build/ssg-adapters/gatsby/actions/sync.d.ts +0 -3
- package/build/ssg-adapters/gatsby/index.d.ts +0 -9
- package/build/ssg-adapters/gatsby/shared/artifacts.d.ts +0 -4
- package/build/ssg-adapters/gatsby/shared/diff-assets.d.ts +0 -15
- package/build/ssg-adapters/gatsby/shared/extract-assets.d.ts +0 -7
- package/build/ssg-adapters/gatsby/shared/gatsby-build.d.ts +0 -7
- package/build/ssg-adapters/gatsby/shared/render-rollback.d.ts +0 -18
- package/build/ssg-adapters/gatsby/shared/sync-render.d.ts +0 -26
- package/build/ssg-adapters/gatsby/shared/types.d.ts +0 -34
- package/cli.mjs +0 -231
- package/exporter/build-esbuild.noop +0 -42
- package/exporter/commands/README.md +0 -151
- package/exporter/commands/prepare-assets-directory.ts +0 -34
- package/exporter/commands/single-domain-upload-search-content.ts +0 -206
- package/exporter/core/GriddoLog.ts +0 -45
- package/exporter/core/check-env-health.ts +0 -204
- package/exporter/core/db-class.ts +0 -54
- package/exporter/core/db.ts +0 -33
- package/exporter/core/dist-rollback.ts +0 -49
- package/exporter/core/errors.ts +0 -92
- package/exporter/core/fs.ts +0 -385
- package/exporter/core/life-cycle.ts +0 -73
- package/exporter/core/logger.ts +0 -141
- package/exporter/core/objects.ts +0 -37
- package/exporter/core/print-logos.ts +0 -21
- package/exporter/react/DynamicScript/index.tsx +0 -33
- package/exporter/react/GriddoOpenGraph/index.tsx +0 -39
- package/exporter/services/api.ts +0 -306
- package/exporter/services/manage-sites.ts +0 -116
- package/exporter/services/manage-store.ts +0 -173
- package/exporter/services/render-artifacts.ts +0 -44
- package/exporter/services/render.ts +0 -229
- package/exporter/services/sitemaps.ts +0 -129
- package/exporter/shared/context.ts +0 -49
- package/exporter/shared/envs.ts +0 -62
- package/exporter/shared/npm-modules/README.md +0 -36
- package/exporter/shared/npm-modules/brush.ts +0 -34
- package/exporter/shared/npm-modules/find-up-simple.ts +0 -100
- package/exporter/shared/npm-modules/pkg-dir.ts +0 -17
- package/exporter/shared/npm-modules/xml-parser.ts +0 -57
- package/exporter/shared/types/render.ts +0 -63
- package/exporter/shared/types.ts +0 -15
- package/exporter/ssg-adapters/gatsby/actions/clean.ts +0 -26
- package/exporter/ssg-adapters/gatsby/actions/close.ts +0 -17
- package/exporter/ssg-adapters/gatsby/actions/data.ts +0 -22
- package/exporter/ssg-adapters/gatsby/actions/healthCheck.ts +0 -10
- package/exporter/ssg-adapters/gatsby/actions/init.ts +0 -12
- package/exporter/ssg-adapters/gatsby/actions/logs.ts +0 -10
- package/exporter/ssg-adapters/gatsby/actions/meta.ts +0 -13
- package/exporter/ssg-adapters/gatsby/actions/prepare.ts +0 -9
- package/exporter/ssg-adapters/gatsby/actions/relocation.ts +0 -15
- package/exporter/ssg-adapters/gatsby/actions/restore.ts +0 -21
- package/exporter/ssg-adapters/gatsby/actions/ssg.ts +0 -12
- package/exporter/ssg-adapters/gatsby/actions/sync.ts +0 -65
- package/exporter/ssg-adapters/gatsby/index.ts +0 -114
- package/exporter/ssg-adapters/gatsby/shared/artifacts.ts +0 -17
- package/exporter/ssg-adapters/gatsby/shared/diff-assets.ts +0 -128
- package/exporter/ssg-adapters/gatsby/shared/extract-assets.ts +0 -75
- package/exporter/ssg-adapters/gatsby/shared/gatsby-build.ts +0 -58
- package/exporter/ssg-adapters/gatsby/shared/render-rollback.ts +0 -33
- package/exporter/ssg-adapters/gatsby/shared/sync-render.ts +0 -298
- package/exporter/ssg-adapters/gatsby/shared/types.ts +0 -35
- package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +0 -55
- package/plugins/gatsby-plugin-svgr-loader/package.json +0 -8
- package/tsconfig.commands.json +0 -36
- package/tsconfig.exporter.json +0 -21
- /package/build/commands/{prepare-assets-directory.d.ts → move-assets.d.ts} +0 -0
- /package/build/{shared → constants}/endpoints.d.ts +0 -0
- /package/build/react/{GriddoFavicon → Favicon}/utils.d.ts +0 -0
- /package/build/{shared/types → types}/templates.d.ts +0 -0
- /package/build/{core → utils}/images.d.ts +0 -0
- /package/build/{core → utils}/instance.d.ts +0 -0
- /package/exporter/react/{GriddoFavicon → Favicon}/utils.ts +0 -0
- /package/exporter/{shared/types → types}/templates.ts +0 -0
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
import type { RenderModeTuple } from "../shared/types/render";
|
|
2
|
-
|
|
3
|
-
import { execSync } from "node:child_process";
|
|
4
|
-
import fsp from "node:fs/promises";
|
|
5
|
-
import path from "node:path";
|
|
6
|
-
|
|
7
|
-
import { readDB, writeDB } from "../core/db";
|
|
8
|
-
import { throwError } from "../core/errors";
|
|
9
|
-
import { pathExists } from "../core/fs";
|
|
10
|
-
import { GriddoLog } from "../core/GriddoLog";
|
|
11
|
-
import { RenderUUIDError } from "../shared/errors";
|
|
12
|
-
import { brush } from "../shared/npm-modules/brush";
|
|
13
|
-
import { RENDER_MODE } from "../shared/types/render";
|
|
14
|
-
import { AuthService } from "./auth";
|
|
15
|
-
import { getBuildMetadata } from "./manage-store";
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Creates a sentinel file with the current date and time.
|
|
19
|
-
* This file is used to track later if node_modules/@griddo/cx was cleaned by a
|
|
20
|
-
* npm install coming from a deploy.
|
|
21
|
-
*/
|
|
22
|
-
async function markRenderAsStarted(options: { domain: string; basePath: string }) {
|
|
23
|
-
const { domain } = options;
|
|
24
|
-
|
|
25
|
-
const db = await readDB();
|
|
26
|
-
db.domains[domain].isRendering = true;
|
|
27
|
-
await writeDB(db);
|
|
28
|
-
|
|
29
|
-
// Creamos un archivo centinela, si al terminar el render este archivo no
|
|
30
|
-
// existe es que ha habido un deploy por medio y hay que invalidar el render
|
|
31
|
-
const { __ssg } = await getRenderPathsHydratedWithDomainFromDB();
|
|
32
|
-
|
|
33
|
-
const renderSentinelFile = path.join(__ssg, `.render-sentinel-${domain}`);
|
|
34
|
-
await fsp.writeFile(renderSentinelFile, new Date().toISOString());
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
async function markRenderAsCompleted(domain: string) {
|
|
38
|
-
const db = await readDB();
|
|
39
|
-
db.domains[domain].isRendering = false;
|
|
40
|
-
db.currentRenderingDomain = null;
|
|
41
|
-
db.domains[domain].renderMode = "COMPLETED";
|
|
42
|
-
// db.domains[domain].shouldBeRendered = false;
|
|
43
|
-
await writeDB(db);
|
|
44
|
-
|
|
45
|
-
// Borramos finalmente el archivo centinela
|
|
46
|
-
const { __ssg } = await getRenderPathsHydratedWithDomainFromDB();
|
|
47
|
-
const renderSentinelFile = path.join(__ssg, `.render-sentinel-${domain}`);
|
|
48
|
-
await fsp.unlink(renderSentinelFile);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async function assertRenderIsValid(domain: string) {
|
|
52
|
-
// Comprobamos que .render-sentinel exista, si no es que un deploy lo borro
|
|
53
|
-
// y hay que invalidar el render.
|
|
54
|
-
const { __ssg } = await getRenderPathsHydratedWithDomainFromDB();
|
|
55
|
-
const renderSentinelFile = path.join(__ssg, `.render-sentinel-${domain}`);
|
|
56
|
-
if (!(await pathExists(renderSentinelFile))) {
|
|
57
|
-
throwError(RenderUUIDError);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Determines the appropriate render mode for a given domain based on its current state,
|
|
63
|
-
* previous render errors, deployment status, and whether rendering is required.
|
|
64
|
-
*
|
|
65
|
-
* @param options - An object containing:
|
|
66
|
-
* - `domain`: The domain name to resolve the render mode for.
|
|
67
|
-
* - `shouldBeRendered`: A boolean indicating if the domain should be rendered.
|
|
68
|
-
* @returns An object with:
|
|
69
|
-
* - `renderMode`: The resolved render mode (`FROM_SCRATCH`, `INCREMENTAL`, or `IDLE`).
|
|
70
|
-
* - `reason`: A string describing the reason for the chosen render mode.
|
|
71
|
-
*
|
|
72
|
-
* @remarks
|
|
73
|
-
* The function checks for missing exports, previous render errors, new deployments,
|
|
74
|
-
* and whether rendering is necessary to decide the render mode.
|
|
75
|
-
*
|
|
76
|
-
* @todo
|
|
77
|
-
* Improve ifs and reason concatenations...
|
|
78
|
-
*/
|
|
79
|
-
async function resolveDomainRenderMode(options: { domain: string; shouldBeRendered: boolean }) {
|
|
80
|
-
const { domain, shouldBeRendered } = options;
|
|
81
|
-
|
|
82
|
-
const db = await readDB();
|
|
83
|
-
|
|
84
|
-
const { __cache, __exports } = await getRenderPathsHydratedWithDomainFromDB({ domain });
|
|
85
|
-
const exportsAreMissing = !(await pathExists(path.join(__exports)));
|
|
86
|
-
const previousRenderFailed = db.domains[domain]?.isRendering;
|
|
87
|
-
const newDeployDetected = await hasNewCommit(__cache);
|
|
88
|
-
|
|
89
|
-
if (exportsAreMissing) {
|
|
90
|
-
return {
|
|
91
|
-
renderMode: RENDER_MODE.FROM_SCRATCH,
|
|
92
|
-
reason: "missing exports directory",
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (previousRenderFailed) {
|
|
97
|
-
return {
|
|
98
|
-
renderMode: RENDER_MODE.FROM_SCRATCH,
|
|
99
|
-
reason: "error in previous render",
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (newDeployDetected) {
|
|
104
|
-
return {
|
|
105
|
-
renderMode: RENDER_MODE.FROM_SCRATCH,
|
|
106
|
-
reason: "new commit hash",
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
if (!shouldBeRendered) {
|
|
111
|
-
return {
|
|
112
|
-
renderMode: RENDER_MODE.IDLE,
|
|
113
|
-
reason: "no activity",
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return {
|
|
118
|
-
renderMode: RENDER_MODE.INCREMENTAL,
|
|
119
|
-
reason: "has changes",
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
async function hasNewCommit(basePath: string): Promise<boolean> {
|
|
124
|
-
const commitFile = path.join(basePath, "commit");
|
|
125
|
-
const currentCommit = execSync("git rev-parse HEAD").toString().trim();
|
|
126
|
-
|
|
127
|
-
if (await pathExists(commitFile)) {
|
|
128
|
-
const savedCommit = (await fsp.readFile(commitFile, "utf-8")).trim();
|
|
129
|
-
if (savedCommit === currentCommit) {
|
|
130
|
-
return false; // No hay nuevo commit
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return true;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return true;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
async function updateCommitFile(options: { basePath: string }) {
|
|
140
|
-
const { basePath } = options;
|
|
141
|
-
const currentCommit = execSync("git rev-parse HEAD").toString().trim();
|
|
142
|
-
await fsp.writeFile(path.join(basePath, "commit"), currentCommit);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
async function getRenderModeFromDB(domain: string): Promise<RenderModeTuple> {
|
|
146
|
-
const db = await readDB();
|
|
147
|
-
|
|
148
|
-
if (!db.domains[domain]) {
|
|
149
|
-
throw new Error(brush.red(`[!] Error: Domain ${domain} not found in DB`));
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
if (!db.domains[domain].renderMode) {
|
|
153
|
-
throw new Error(brush.red(`[!] Error: Render mode not found for domain ${domain}`));
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
return {
|
|
157
|
-
renderMode: db.domains[domain].renderMode,
|
|
158
|
-
reason: db.domains[domain].renderModeReason,
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
async function getRenderPathsHydratedWithDomainFromDB(options?: {
|
|
163
|
-
domain?: string;
|
|
164
|
-
dbFilePath?: string;
|
|
165
|
-
}) {
|
|
166
|
-
const { domain, dbFilePath } = options || {};
|
|
167
|
-
|
|
168
|
-
const db = await readDB(dbFilePath);
|
|
169
|
-
const paths = db.paths;
|
|
170
|
-
|
|
171
|
-
return {
|
|
172
|
-
__root: paths.root,
|
|
173
|
-
__cache: path.join(paths.cxCache, domain || ""),
|
|
174
|
-
__components: paths.components,
|
|
175
|
-
__cx: paths.cx,
|
|
176
|
-
__sites: paths.exportsDir,
|
|
177
|
-
__exports: path.join(paths.exportsDir, domain || ""),
|
|
178
|
-
__exports_backup: path.join(paths.exportsDirBackup, domain || ""),
|
|
179
|
-
__ssg: paths.ssg,
|
|
180
|
-
__exports_dist: path.join(paths.exportsDir, domain || "", "dist"),
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
async function getRenderMetadataFromDB() {
|
|
185
|
-
const db = await readDB();
|
|
186
|
-
return {
|
|
187
|
-
griddoVersion: db.griddoVersion,
|
|
188
|
-
buildReportFileName: db.buildReportFileName,
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Save a file with the end of build process to use as `end-render` signal.
|
|
194
|
-
*/
|
|
195
|
-
async function generateBuildReport(domain: string) {
|
|
196
|
-
const authControl = await AuthService.login();
|
|
197
|
-
|
|
198
|
-
const { __root } = await getRenderPathsHydratedWithDomainFromDB();
|
|
199
|
-
const { buildReportFileName } = await getRenderMetadataFromDB();
|
|
200
|
-
const { buildProcessData } = await getBuildMetadata(domain);
|
|
201
|
-
|
|
202
|
-
const buildSitesInfo = Object.keys(buildProcessData).map((siteID) => ({
|
|
203
|
-
...buildProcessData[siteID],
|
|
204
|
-
siteId: Number.parseInt(siteID),
|
|
205
|
-
}));
|
|
206
|
-
|
|
207
|
-
const report = {
|
|
208
|
-
authControl,
|
|
209
|
-
sites: buildSitesInfo,
|
|
210
|
-
};
|
|
211
|
-
|
|
212
|
-
const reportFilePath = path.join(__root, "current-dist", buildReportFileName);
|
|
213
|
-
|
|
214
|
-
await fsp.writeFile(reportFilePath, JSON.stringify(report));
|
|
215
|
-
|
|
216
|
-
GriddoLog.verbose(`build report saved in ${reportFilePath}`);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
export {
|
|
220
|
-
assertRenderIsValid,
|
|
221
|
-
generateBuildReport,
|
|
222
|
-
getRenderMetadataFromDB,
|
|
223
|
-
getRenderModeFromDB,
|
|
224
|
-
getRenderPathsHydratedWithDomainFromDB,
|
|
225
|
-
markRenderAsCompleted,
|
|
226
|
-
markRenderAsStarted,
|
|
227
|
-
resolveDomainRenderMode,
|
|
228
|
-
updateCommitFile,
|
|
229
|
-
};
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import fsp from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
|
|
4
|
-
import { pathExists } from "../core/fs";
|
|
5
|
-
import { GriddoLog } from "../core/GriddoLog";
|
|
6
|
-
import { generateSitemapIndexXml, generateUrlsetXml } from "../shared/npm-modules/xml-parser";
|
|
7
|
-
import { AuthService } from "./auth";
|
|
8
|
-
import { getBuildMetadata } from "./manage-store";
|
|
9
|
-
import { getRenderPathsHydratedWithDomainFromDB } from "./render";
|
|
10
|
-
import { getSitemap } from "./sites";
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Generate sitemaps and save them into file system.
|
|
14
|
-
*/
|
|
15
|
-
async function generateSitemaps(domain: string) {
|
|
16
|
-
const { __root } = await getRenderPathsHydratedWithDomainFromDB();
|
|
17
|
-
const { sitesToPublish } = await getBuildMetadata(domain);
|
|
18
|
-
const distDir = path.join(__root, "current-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: 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
|
-
GriddoLog.error(`Error deleting file ${filePath}:`, err);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
} catch (err) {
|
|
75
|
-
GriddoLog.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
|
-
GriddoLog.verbose(`sitemap generated in ${exactPath}`);
|
|
93
|
-
|
|
94
|
-
sitemaps.push(`${home.endsWith("/") ? home.slice(0, -1) : home}${sitemapName}`);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (!sitemaps.length) {
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const siteMap = generateSitemapIndexXml(sitemaps);
|
|
102
|
-
|
|
103
|
-
const exactPath = path.join(sitemapBasePath, "sitemap.xml");
|
|
104
|
-
|
|
105
|
-
await saveFile(exactPath, siteMap);
|
|
106
|
-
GriddoLog.verbose(`sitemap generated in ${exactPath}`);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Saves the content to a file specified by its path. If the file exists, it will be overwritten.
|
|
113
|
-
*
|
|
114
|
-
* @param filePath The path of the file to save the content to.
|
|
115
|
-
* @param content The content to save to the file.
|
|
116
|
-
*/
|
|
117
|
-
async function saveFile(filePath: string, content: string) {
|
|
118
|
-
try {
|
|
119
|
-
const pathName = path.dirname(filePath);
|
|
120
|
-
if (!(await pathExists(pathName))) {
|
|
121
|
-
await fsp.mkdir(pathName, { recursive: true });
|
|
122
|
-
}
|
|
123
|
-
await fsp.writeFile(filePath, content);
|
|
124
|
-
} catch (_error) {
|
|
125
|
-
throw new Error(`Error saving a file`);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export { generateSitemaps };
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import type { PlaceholderPath, RenderArtifacts } from "./types/global";
|
|
2
|
-
import type { RenderMode } from "./types/render";
|
|
3
|
-
|
|
4
|
-
interface RenderContextProps<T> {
|
|
5
|
-
domain: string;
|
|
6
|
-
renderMode: RenderMode;
|
|
7
|
-
pathsHydratedWithDomain: Record<string, string>;
|
|
8
|
-
ssg: T;
|
|
9
|
-
renderMetadata: {
|
|
10
|
-
griddoVersion: string;
|
|
11
|
-
buildReportFileName: string;
|
|
12
|
-
};
|
|
13
|
-
renderArtifacts: RenderArtifacts;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Encapsulates the state, configuration, and artifacts for a single SSG
|
|
18
|
-
* render process.
|
|
19
|
-
*
|
|
20
|
-
* This class is instantiated at the beginning of a render and passed through
|
|
21
|
-
* each lifecycle step, providing a centralized and consistent context for all
|
|
22
|
-
* operations. It is agnostic to the specific SSG being used.
|
|
23
|
-
*/
|
|
24
|
-
export class RenderContext<T = unknown> {
|
|
25
|
-
readonly domain: string;
|
|
26
|
-
readonly renderMode: RenderMode;
|
|
27
|
-
readonly pathsHydratedWithDomain: Record<PlaceholderPath, string>;
|
|
28
|
-
pagesToCreate: number[] = [];
|
|
29
|
-
pagesToDelete: number[] = [];
|
|
30
|
-
ssg: T;
|
|
31
|
-
renderMetadata: { griddoVersion: string; buildReportFileName: string };
|
|
32
|
-
renderArtifacts: RenderArtifacts;
|
|
33
|
-
|
|
34
|
-
constructor({
|
|
35
|
-
domain,
|
|
36
|
-
renderMode,
|
|
37
|
-
ssg,
|
|
38
|
-
pathsHydratedWithDomain,
|
|
39
|
-
renderMetadata,
|
|
40
|
-
renderArtifacts,
|
|
41
|
-
}: RenderContextProps<T>) {
|
|
42
|
-
this.domain = domain;
|
|
43
|
-
this.renderMode = renderMode;
|
|
44
|
-
this.pathsHydratedWithDomain = pathsHydratedWithDomain;
|
|
45
|
-
this.renderMetadata = renderMetadata;
|
|
46
|
-
this.renderArtifacts = renderArtifacts;
|
|
47
|
-
this.ssg = ssg;
|
|
48
|
-
}
|
|
49
|
-
}
|
package/exporter/shared/envs.ts
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
const { env } = process;
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Returns true/false from string
|
|
5
|
-
*/
|
|
6
|
-
function envIsTruthy(value?: string): boolean {
|
|
7
|
-
if (!value) return false;
|
|
8
|
-
|
|
9
|
-
switch (value.trim().toLowerCase()) {
|
|
10
|
-
case "1":
|
|
11
|
-
case "true":
|
|
12
|
-
case "yes":
|
|
13
|
-
case "y":
|
|
14
|
-
case "on":
|
|
15
|
-
return true;
|
|
16
|
-
default:
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Credentials
|
|
22
|
-
const GRIDDO_API_URL = env.GRIDDO_API_URL || env.API_URL;
|
|
23
|
-
const GRIDDO_PUBLIC_API_URL = env.GRIDDO_PUBLIC_API_URL || env.PUBLIC_API_URL;
|
|
24
|
-
const GRIDDO_BOT_USER = env.botEmail || env.GRIDDO_BOT_USER;
|
|
25
|
-
const GRIDDO_BOT_PASSWORD = env.botPassword || env.GRIDDO_BOT_PASSWORD;
|
|
26
|
-
|
|
27
|
-
// Rendering
|
|
28
|
-
const GRIDDO_API_CONCURRENCY_COUNT = Number.parseInt(env.GRIDDO_API_CONCURRENCY_COUNT || "10");
|
|
29
|
-
const GRIDDO_SKIP_BUILD_CHECKS = envIsTruthy(env.GRIDDO_SKIP_BUILD_CHECKS);
|
|
30
|
-
const GRIDDO_RENDER_BY_DOMAINS = envIsTruthy(env.GRIDDO_RENDER_BY_DOMAINS);
|
|
31
|
-
const GRIDDO_BUILD_LOGS = envIsTruthy(env.GRIDDO_BUILD_LOGS);
|
|
32
|
-
const GRIDDO_BUILD_LOGS_TO_FILE = envIsTruthy(env.GRIDDO_BUILD_LOGS_TO_FILE);
|
|
33
|
-
const GRIDDO_BUILD_LOGS_BUFFER_SIZE = Number.parseInt(env.GRIDDO_BUILD_LOGS_BUFFER_SIZE || "500");
|
|
34
|
-
const GRIDDO_SSG_VERBOSE_LOGS = envIsTruthy(env.GRIDDO_SSG_VERBOSE_LOGS);
|
|
35
|
-
const GRIDDO_SEARCH_FEATURE = envIsTruthy(env.GRIDDO_SEARCH_FEATURE);
|
|
36
|
-
const GRIDDO_ASSET_PREFIX = env.GRIDDO_ASSET_PREFIX || env.ASSET_PREFIX;
|
|
37
|
-
const GRIDDO_REACT_APP_INSTANCE = env.GRIDDO_REACT_APP_INSTANCE || env.REACT_APP_INSTANCE;
|
|
38
|
-
const GRIDDO_AI_EMBEDDINGS = envIsTruthy(env.GRIDDO_AI_EMBEDDINGS);
|
|
39
|
-
const GRIDDO_VERBOSE_LOGS = envIsTruthy(env.GRIDDO_VERBOSE_LOGS);
|
|
40
|
-
const GRIDDO_USE_DIST_BACKUP = envIsTruthy(env.GRIDDO_USE_DIST_BACKUP);
|
|
41
|
-
const GRIDDO_SSG_BUNDLE_ANALYZER = envIsTruthy(env.GRIDDO_SSG_BUNDLE_ANALYZER);
|
|
42
|
-
|
|
43
|
-
export {
|
|
44
|
-
GRIDDO_AI_EMBEDDINGS,
|
|
45
|
-
GRIDDO_API_CONCURRENCY_COUNT,
|
|
46
|
-
GRIDDO_API_URL,
|
|
47
|
-
GRIDDO_ASSET_PREFIX,
|
|
48
|
-
GRIDDO_BOT_PASSWORD,
|
|
49
|
-
GRIDDO_BOT_USER,
|
|
50
|
-
GRIDDO_BUILD_LOGS,
|
|
51
|
-
GRIDDO_BUILD_LOGS_BUFFER_SIZE,
|
|
52
|
-
GRIDDO_BUILD_LOGS_TO_FILE,
|
|
53
|
-
GRIDDO_PUBLIC_API_URL,
|
|
54
|
-
GRIDDO_REACT_APP_INSTANCE,
|
|
55
|
-
GRIDDO_RENDER_BY_DOMAINS,
|
|
56
|
-
GRIDDO_SEARCH_FEATURE,
|
|
57
|
-
GRIDDO_SKIP_BUILD_CHECKS,
|
|
58
|
-
GRIDDO_SSG_BUNDLE_ANALYZER,
|
|
59
|
-
GRIDDO_SSG_VERBOSE_LOGS,
|
|
60
|
-
GRIDDO_USE_DIST_BACKUP,
|
|
61
|
-
GRIDDO_VERBOSE_LOGS,
|
|
62
|
-
};
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# Dependencias Externas Incluidas
|
|
2
|
-
|
|
3
|
-
Esta carpeta contiene dependencias externas que han sido incluidas directamente en el repositorio para evitar tener que fetchearlas desde npm en cada instalación del software.
|
|
4
|
-
|
|
5
|
-
## Razón
|
|
6
|
-
|
|
7
|
-
Este software se instala frecuentemente y estas dependencias pequeñas se incluyen directamente para:
|
|
8
|
-
- Reducir el tiempo de instalación
|
|
9
|
-
- Evitar dependencias de red durante el setup
|
|
10
|
-
- Mantener versiones específicas y estables
|
|
11
|
-
|
|
12
|
-
## Archivos incluidos
|
|
13
|
-
|
|
14
|
-
- **`find-up-simple.ts`** - Versión simplificada de `find-up` para buscar archivos hacia arriba en el árbol de directorios
|
|
15
|
-
- **`pkg-dir.ts`** - Encuentra el directorio raíz del paquete (que contiene `package.json`)
|
|
16
|
-
- **`xml-parser.ts`** - Parser simple de XML para sitemaps (Desarrollado por Griddo)
|
|
17
|
-
- **`brush.ts`** - Version ultra-reducida de utilidad para añadir colores a texto parecido a chalk o kleur. (Desarrollado por Griddo)
|
|
18
|
-
|
|
19
|
-
## Nota importante
|
|
20
|
-
|
|
21
|
-
**Este no es código desarrollado por nosotros.** Son adaptaciones o versiones simplificadas de librerías existentes en npm.
|
|
22
|
-
|
|
23
|
-
## Enlaces para futuras actualizaciones
|
|
24
|
-
|
|
25
|
-
Si en el futuro se decide usar estas dependencias como paquetes npm oficiales:
|
|
26
|
-
|
|
27
|
-
- `find-up-simple`: Basado en [find-up](https://www.npmjs.com/package/find-up)
|
|
28
|
-
- `pkg-dir`: Basado en [pkg-dir](https://www.npmjs.com/package/pkg-dir)
|
|
29
|
-
- `xml-parser`: Parser XML simple (posiblemente reemplazable por [fast-xml-parser](https://www.npmjs.com/package/fast-xml-parser))
|
|
30
|
-
|
|
31
|
-
## Mantenimiento
|
|
32
|
-
|
|
33
|
-
Estos archivos no requieren actualizaciones frecuentes ya que implementan funcionalidades básicas y estables. Solo actualizar en caso de:
|
|
34
|
-
- Cambios en las APIs de Node.js que los afecten
|
|
35
|
-
- Bugs de seguridad críticos
|
|
36
|
-
- Mejoras de rendimiento significativas
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Brush adds color to a string|number, it does not print it!
|
|
3
|
-
// Its simple, no log, no chains, just color in a string|number
|
|
4
|
-
// usage:
|
|
5
|
-
// console.log(brush.green("sucess!"))
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
const RESET = "\x1b[0m";
|
|
9
|
-
const CODES = {
|
|
10
|
-
black: "\x1b[30m",
|
|
11
|
-
red: "\x1b[31m",
|
|
12
|
-
green: "\x1b[32m",
|
|
13
|
-
yellow: "\x1b[33m",
|
|
14
|
-
blue: "\x1b[34m",
|
|
15
|
-
magenta: "\x1b[35m",
|
|
16
|
-
cyan: "\x1b[36m",
|
|
17
|
-
white: "\x1b[37m",
|
|
18
|
-
gray: "\x1b[90m",
|
|
19
|
-
bold: "\x1b[1m",
|
|
20
|
-
dim: "\x1b[2m",
|
|
21
|
-
} as const;
|
|
22
|
-
|
|
23
|
-
type ColorFunction = (text: string | number) => string;
|
|
24
|
-
type ColorName = keyof typeof CODES;
|
|
25
|
-
type Brush = Record<ColorName, ColorFunction>;
|
|
26
|
-
|
|
27
|
-
const brush = {} as Brush;
|
|
28
|
-
|
|
29
|
-
for (const color in CODES) {
|
|
30
|
-
const key = color as ColorName;
|
|
31
|
-
brush[key] = (text: string | number) => `${CODES[key]}${text}${RESET}`;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export { brush };
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import fsPromises from "node:fs/promises";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import process from "node:process";
|
|
5
|
-
import { fileURLToPath } from "node:url";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Opciones para controlar el comportamiento de la búsqueda.
|
|
9
|
-
*/
|
|
10
|
-
export type Options = {
|
|
11
|
-
/**
|
|
12
|
-
El directorio desde donde empezar a buscar.
|
|
13
|
-
@default process.cwd()
|
|
14
|
-
*/
|
|
15
|
-
readonly cwd?: URL | string;
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
El tipo de ruta a buscar.
|
|
19
|
-
@default 'file'
|
|
20
|
-
*/
|
|
21
|
-
readonly type?: "file" | "directory";
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
Un directorio en el que la búsqueda se detiene si no se encuentran coincidencias.
|
|
25
|
-
@default El directorio raíz del sistema
|
|
26
|
-
*/
|
|
27
|
-
readonly stopAt?: URL | string;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// Función auxiliar para convertir una URL en una ruta de archivo de tipo string.
|
|
31
|
-
const toPath = (urlOrPath: URL | string | undefined): string | undefined =>
|
|
32
|
-
urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Encuentra un archivo o directorio de forma asíncrona subiendo por los directorios padre.
|
|
36
|
-
* @param name - El nombre del archivo o directorio a buscar.
|
|
37
|
-
* @param options - Opciones de búsqueda.
|
|
38
|
-
* @returns La ruta encontrada o `undefined` si no se pudo encontrar.
|
|
39
|
-
*/
|
|
40
|
-
export async function findUp(name: string, options: Options = {}): Promise<string | undefined> {
|
|
41
|
-
const { cwd = process.cwd(), type = "file", stopAt: stopAtOption } = options;
|
|
42
|
-
|
|
43
|
-
let directory = path.resolve(toPath(cwd) ?? "");
|
|
44
|
-
const { root } = path.parse(directory);
|
|
45
|
-
const stopAt = stopAtOption ? path.resolve(directory, toPath(stopAtOption)!) : root;
|
|
46
|
-
const isAbsoluteName = path.isAbsolute(name);
|
|
47
|
-
|
|
48
|
-
while (true) {
|
|
49
|
-
const filePath = isAbsoluteName ? name : path.join(directory, name);
|
|
50
|
-
try {
|
|
51
|
-
// eslint-disable-next-line no-await-in-loop
|
|
52
|
-
const stats = await fsPromises.stat(filePath);
|
|
53
|
-
if ((type === "file" && stats.isFile()) || (type === "directory" && stats.isDirectory())) {
|
|
54
|
-
return filePath;
|
|
55
|
-
}
|
|
56
|
-
} catch {
|
|
57
|
-
// Ignora errores (ej. el archivo no existe) y continúa la búsqueda.
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (directory === stopAt || directory === root) {
|
|
61
|
-
break;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
directory = path.dirname(directory);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Encuentra un archivo o directorio de forma síncrona subiendo por los directorios padre.
|
|
70
|
-
* @param name - El nombre del archivo o directorio a buscar.
|
|
71
|
-
* @param options - Opciones de búsqueda.
|
|
72
|
-
* @returns La ruta encontrada o `undefined` si no se pudo encontrar.
|
|
73
|
-
*/
|
|
74
|
-
export function findUpSync(name: string, options: Options = {}): string | undefined {
|
|
75
|
-
const { cwd = process.cwd(), type = "file", stopAt: stopAtOption } = options;
|
|
76
|
-
|
|
77
|
-
let directory = path.resolve(toPath(cwd) ?? "");
|
|
78
|
-
const { root } = path.parse(directory);
|
|
79
|
-
const stopAt = stopAtOption ? path.resolve(directory, toPath(stopAtOption)!) : root;
|
|
80
|
-
const isAbsoluteName = path.isAbsolute(name);
|
|
81
|
-
|
|
82
|
-
while (true) {
|
|
83
|
-
const filePath = isAbsoluteName ? name : path.join(directory, name);
|
|
84
|
-
try {
|
|
85
|
-
const stats = fs.statSync(filePath, { throwIfNoEntry: false });
|
|
86
|
-
if ((type === "file" && stats?.isFile()) || (type === "directory" && stats?.isDirectory())) {
|
|
87
|
-
return filePath;
|
|
88
|
-
}
|
|
89
|
-
} catch {
|
|
90
|
-
// En teoría, statSync con `throwIfNoEntry: false` no debería lanzar un error,
|
|
91
|
-
// pero se mantiene por seguridad.
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if (directory === stopAt || directory === root) {
|
|
95
|
-
break;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
directory = path.dirname(directory);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
|
|
3
|
-
import { findUp, findUpSync } from "./find-up-simple";
|
|
4
|
-
|
|
5
|
-
async function pkgDir(options?: { readonly cwd?: string }) {
|
|
6
|
-
const { cwd } = options || {};
|
|
7
|
-
const filePath = await findUp("package.json", { cwd });
|
|
8
|
-
return filePath && path.dirname(filePath);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function pkgDirSync(options?: { readonly cwd?: string }) {
|
|
12
|
-
const { cwd } = options || {};
|
|
13
|
-
const filePath = findUpSync("package.json", { cwd });
|
|
14
|
-
return filePath && path.dirname(filePath);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export { pkgDir, pkgDirSync };
|