@griddo/cx 11.10.46 → 11.10.47-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/build/commands/end-render.js +4 -4
  2. package/build/commands/end-render.js.map +2 -2
  3. package/build/commands/prepare-assets-directory.js +1 -1
  4. package/build/commands/prepare-assets-directory.js.map +2 -2
  5. package/build/commands/prepare-domains-render.js +22 -22
  6. package/build/commands/prepare-domains-render.js.map +3 -3
  7. package/build/commands/reset-render.js +3 -3
  8. package/build/commands/reset-render.js.map +2 -2
  9. package/build/commands/start-render.js +33 -33
  10. package/build/commands/start-render.js.map +4 -4
  11. package/build/commands/upload-search-content.js +4 -4
  12. package/build/commands/upload-search-content.js.map +3 -3
  13. package/build/index.js +3 -3
  14. package/build/services/domains.d.ts +1 -0
  15. package/build/shared/context.d.ts +5 -1
  16. package/build/shared/types/global.d.ts +1 -0
  17. package/build/shared/types/render.d.ts +1 -0
  18. package/build/ssg-adapters/gatsby/actions/dry-render-sync.d.ts +3 -0
  19. package/build/ssg-adapters/gatsby/actions/index.d.ts +41 -0
  20. package/build/ssg-adapters/gatsby/actions/report.d.ts +2 -0
  21. package/cli.mjs +12 -3
  22. package/exporter/commands/prepare-domains-render.ts +3 -0
  23. package/exporter/commands/upload-search-content.ts +10 -3
  24. package/exporter/services/render.ts +9 -0
  25. package/exporter/shared/context.ts +8 -0
  26. package/exporter/shared/types/global.ts +1 -0
  27. package/exporter/shared/types/render.ts +1 -0
  28. package/exporter/ssg-adapters/gatsby/actions/clean.ts +1 -1
  29. package/exporter/ssg-adapters/gatsby/actions/dry-render-sync.ts +21 -0
  30. package/exporter/ssg-adapters/gatsby/actions/index.ts +44 -0
  31. package/exporter/ssg-adapters/gatsby/actions/meta.ts +0 -2
  32. package/exporter/ssg-adapters/gatsby/actions/report.ts +9 -0
  33. package/exporter/ssg-adapters/gatsby/index.ts +40 -29
  34. package/package.json +3 -3
@@ -4,6 +4,7 @@
4
4
  declare function getInstanceDomains(): Promise<{
5
5
  id: number;
6
6
  url: string;
7
+ dryRun: boolean;
7
8
  slug: string;
8
9
  }[]>;
9
10
  export { getInstanceDomains };
@@ -10,6 +10,8 @@ interface RenderContextProps<T> {
10
10
  buildReportFileName: string;
11
11
  };
12
12
  renderArtifacts: RenderArtifacts;
13
+ dryRun: boolean;
14
+ buildReportFileName: string;
13
15
  }
14
16
  /**
15
17
  * Encapsulates the state, configuration, and artifacts for a single SSG
@@ -22,6 +24,8 @@ interface RenderContextProps<T> {
22
24
  export declare class RenderContext<T = unknown> {
23
25
  readonly domain: string;
24
26
  readonly renderMode: RenderMode;
27
+ readonly dryRun: boolean;
28
+ readonly buildReportFileName: string;
25
29
  readonly pathsHydratedWithDomain: Record<PlaceholderPath, string>;
26
30
  pagesToCreate: number[];
27
31
  pagesToDelete: number[];
@@ -31,6 +35,6 @@ export declare class RenderContext<T = unknown> {
31
35
  buildReportFileName: string;
32
36
  };
33
37
  renderArtifacts: RenderArtifacts;
34
- constructor({ domain, renderMode, ssg, pathsHydratedWithDomain, renderMetadata, renderArtifacts }: RenderContextProps<T>);
38
+ constructor({ domain, renderMode, ssg, pathsHydratedWithDomain, renderMetadata, renderArtifacts, dryRun, buildReportFileName }: RenderContextProps<T>);
35
39
  }
36
40
  export {};
@@ -48,6 +48,7 @@ type Domain = {
48
48
  id: number;
49
49
  slug: string;
50
50
  url: string;
51
+ dryRun: boolean;
51
52
  };
52
53
  type Domains = Domain[];
53
54
  /** Describes the type of build process data object. */
@@ -37,6 +37,7 @@ type RenderDB = {
37
37
  isRendering?: boolean;
38
38
  renderInfo?: RenderInfo;
39
39
  renderModeReason?: string;
40
+ dryRun?: boolean;
40
41
  };
41
42
  };
42
43
  };
@@ -0,0 +1,3 @@
1
+ import type { RenderContext } from "../../../shared/context";
2
+ import type { SSG } from "../shared/types";
3
+ export declare function dryRenderSyncAction(context: RenderContext<SSG>): Promise<void>;
@@ -0,0 +1,41 @@
1
+ import type { RenderContext } from "../../../shared/context";
2
+ import { cleanAction } from "./clean";
3
+ import { closeAction } from "./close";
4
+ import { dataAction } from "./data";
5
+ import { dryRenderSyncAction } from "./dry-render-sync";
6
+ import { healthCheckAction } from "./healthCheck";
7
+ import { initAction } from "./init";
8
+ import { logsAction } from "./logs";
9
+ import { metaAction } from "./meta";
10
+ import { prepareAction } from "./prepare";
11
+ import { relocationAction } from "./relocation";
12
+ import { reportAction } from "./report";
13
+ import { restoreAction } from "./restore";
14
+ import { ssgAction } from "./ssg";
15
+ import { syncAction } from "./sync";
16
+ /**
17
+ * Defines the signature of a Gatsby action.
18
+ * An action is a function that receives a RenderContext and performs
19
+ * a specific step in the render lifecycle.
20
+ */
21
+ export type Action<T = any> = (context: RenderContext<T>) => Promise<void>;
22
+ /**
23
+ * All available Gatsby actions grouped in a single namespace.
24
+ * Each action performs a specific step in the render process.
25
+ */
26
+ export declare const actions: {
27
+ clean: typeof cleanAction;
28
+ close: typeof closeAction;
29
+ data: typeof dataAction;
30
+ dryRenderSync: typeof dryRenderSyncAction;
31
+ healthCheck: typeof healthCheckAction;
32
+ init: typeof initAction;
33
+ logs: typeof logsAction;
34
+ meta: typeof metaAction;
35
+ prepare: typeof prepareAction;
36
+ relocation: typeof relocationAction;
37
+ report: typeof reportAction;
38
+ restore: typeof restoreAction;
39
+ ssg: typeof ssgAction;
40
+ sync: typeof syncAction;
41
+ };
@@ -0,0 +1,2 @@
1
+ import type { RenderContext } from "@shared/context";
2
+ export declare function reportAction(context: RenderContext): Promise<void>;
package/cli.mjs CHANGED
@@ -26,10 +26,11 @@ export const AVAILABLE_COMMANDS = [
26
26
  name: "render",
27
27
  description: "Render the instance",
28
28
  domainArgument: "optional",
29
- rootArgument: true,
29
+ rootArgument: false,
30
30
  script: "render-full-instance",
31
31
  isCommandPack: true,
32
32
  commandPack: renderCommandPack,
33
+ noStaticFiles: "optional",
33
34
  },
34
35
  {
35
36
  name: "prepare-assets-directory",
@@ -38,14 +39,16 @@ export const AVAILABLE_COMMANDS = [
38
39
  script: "prepare-assets-directory",
39
40
  rootArgument: true,
40
41
  isCommandPack: false,
42
+ noStaticFiles: false,
41
43
  },
42
44
  {
43
45
  name: "prepare-domains-render",
44
46
  description: "Prepare domains",
45
47
  domainArgument: false,
46
48
  script: "prepare-domains-render",
47
- rootArgument: true,
49
+ rootArgument: false,
48
50
  isCommandPack: false,
51
+ noStaticFiles: "optional",
49
52
  },
50
53
  {
51
54
  name: "start-render",
@@ -54,6 +57,7 @@ export const AVAILABLE_COMMANDS = [
54
57
  script: "start-render",
55
58
  rootArgument: false,
56
59
  isCommandPack: false,
60
+ noStaticFiles: false,
57
61
  },
58
62
  {
59
63
  name: "end-render",
@@ -62,6 +66,7 @@ export const AVAILABLE_COMMANDS = [
62
66
  script: "end-render",
63
67
  isCommandPack: false,
64
68
  rootArgument: true,
69
+ noStaticFiles: false,
65
70
  },
66
71
  {
67
72
  name: "upload-search-content",
@@ -70,6 +75,7 @@ export const AVAILABLE_COMMANDS = [
70
75
  script: "upload-search-content",
71
76
  isCommandPack: false,
72
77
  rootArgument: true,
78
+ noStaticFiles: false,
73
79
  },
74
80
  {
75
81
  name: "reset-render",
@@ -78,6 +84,7 @@ export const AVAILABLE_COMMANDS = [
78
84
  script: "reset-render",
79
85
  isCommandPack: false,
80
86
  rootArgument: false,
87
+ noStaticFiles: false,
81
88
  },
82
89
  ];
83
90
 
@@ -149,7 +156,7 @@ function executeCommand(command, config) {
149
156
  return;
150
157
  }
151
158
 
152
- const commandToRun = `node ${scriptPath}${config.domain ? ` ${config.domain}` : ""}`;
159
+ const commandToRun = `node ${scriptPath}${config.domain ? ` ${config.domain}` : ""}${config.noStaticFiles ? " --dry-render" : ""}`;
153
160
 
154
161
  execSync(commandToRun, {
155
162
  stdio: "inherit",
@@ -203,6 +210,7 @@ function main() {
203
210
  help: { type: "boolean", short: "h" },
204
211
  domain: { type: "string" },
205
212
  root: { type: "string" },
213
+ "dry-render": { type: "boolean" },
206
214
  };
207
215
 
208
216
  const { values, positionals } = parseArgs({
@@ -221,6 +229,7 @@ function main() {
221
229
  const initialConfig = {
222
230
  domain: values.domain,
223
231
  root: values.root,
232
+ noStaticFiles: values["dry-render"],
224
233
  };
225
234
 
226
235
  const { command, config } = validateCommand(commandName, initialConfig);
@@ -102,6 +102,8 @@ async function initRender() {
102
102
  }
103
103
 
104
104
  async function prepareDomains() {
105
+ const [dryRender] = process.argv.slice(2);
106
+
105
107
  await AuthService.login();
106
108
 
107
109
  const db = await readDB();
@@ -138,6 +140,7 @@ async function prepareDomains() {
138
140
  db.domains[domainSlug].renderMode = renderMode;
139
141
  db.domains[domainSlug].shouldBeRendered = shouldBeRendered;
140
142
  db.domains[domainSlug].renderModeReason = reason;
143
+ db.domains[domainSlug].dryRun = domain.dryRun || !!dryRender;
141
144
  }
142
145
 
143
146
  await writeDB(db);
@@ -185,11 +185,18 @@ async function getContentDirectories(domain: string) {
185
185
 
186
186
  async function uploadSearchContent() {
187
187
  if (GRIDDO_SEARCH_FEATURE) {
188
- const domains = (await getInstanceDomains()).map(({ slug }) => slug);
188
+ const domains = (await getInstanceDomains()).map(({ slug, dryRun }) => ({ slug, dryRun }));
189
+
189
190
  for (const domain of domains) {
190
- const { htmlContentDir, jsonContentDir } = await getContentDirectories(domain);
191
+ const { dryRun, slug } = domain;
192
+ if (dryRun) {
193
+ GriddoLog.verbose(`Domain ${slug} ignored by dry-render`);
194
+ continue;
195
+ }
196
+
197
+ const { htmlContentDir, jsonContentDir } = await getContentDirectories(slug);
191
198
 
192
- GriddoLog.info(`Uploading search content for ${domain}`);
199
+ GriddoLog.info(`Uploading search content for ${slug}`);
193
200
  await uploadRenderedSearchContentToAPI({
194
201
  htmlContentDir,
195
202
  jsonContentDir,
@@ -215,6 +215,15 @@ async function generateBuildReport(domain: string) {
215
215
 
216
216
  const reportFilePath = path.join(__root, "current-dist", buildReportFileName);
217
217
 
218
+ // Asegurarse que exite la carpeta destino
219
+ // Normalmente existirá salvo en los renders dry-render que puede no existir.
220
+ const rootCurrentDist = path.join(__root, "current-dist");
221
+ try {
222
+ await fsp.mkdir(rootCurrentDist, { recursive: true });
223
+ } catch (_e) {
224
+ GriddoLog.verbose(`directory: ${rootCurrentDist} already exists, creation skipped.`);
225
+ }
226
+
218
227
  await fsp.writeFile(reportFilePath, JSON.stringify(report));
219
228
 
220
229
  GriddoLog.verbose(`build report saved in ${reportFilePath}`);
@@ -11,6 +11,8 @@ interface RenderContextProps<T> {
11
11
  buildReportFileName: string;
12
12
  };
13
13
  renderArtifacts: RenderArtifacts;
14
+ dryRun: boolean;
15
+ buildReportFileName: string;
14
16
  }
15
17
 
16
18
  /**
@@ -24,6 +26,8 @@ interface RenderContextProps<T> {
24
26
  export class RenderContext<T = unknown> {
25
27
  readonly domain: string;
26
28
  readonly renderMode: RenderMode;
29
+ readonly dryRun: boolean;
30
+ readonly buildReportFileName: string;
27
31
  readonly pathsHydratedWithDomain: Record<PlaceholderPath, string>;
28
32
  pagesToCreate: number[] = [];
29
33
  pagesToDelete: number[] = [];
@@ -38,6 +42,8 @@ export class RenderContext<T = unknown> {
38
42
  pathsHydratedWithDomain,
39
43
  renderMetadata,
40
44
  renderArtifacts,
45
+ dryRun,
46
+ buildReportFileName,
41
47
  }: RenderContextProps<T>) {
42
48
  this.domain = domain;
43
49
  this.renderMode = renderMode;
@@ -45,5 +51,7 @@ export class RenderContext<T = unknown> {
45
51
  this.renderMetadata = renderMetadata;
46
52
  this.renderArtifacts = renderArtifacts;
47
53
  this.ssg = ssg;
54
+ this.dryRun = dryRun;
55
+ this.buildReportFileName = buildReportFileName;
48
56
  }
49
57
  }
@@ -53,6 +53,7 @@ type Domain = {
53
53
  id: number;
54
54
  slug: string;
55
55
  url: string;
56
+ dryRun: boolean;
56
57
  };
57
58
 
58
59
  type Domains = Domain[];
@@ -42,6 +42,7 @@ type RenderDB = {
42
42
  isRendering?: boolean;
43
43
  renderInfo?: RenderInfo;
44
44
  renderModeReason?: string;
45
+ dryRun?: boolean;
45
46
  };
46
47
  };
47
48
  };
@@ -15,7 +15,7 @@ export async function cleanAction(context: RenderContext<SSG>) {
15
15
  renderMode,
16
16
  } = context;
17
17
 
18
- if (renderMode === RENDER_MODE.FROM_SCRATCH) {
18
+ if (renderMode === RENDER_MODE.FROM_SCRATCH && !context.dryRun) {
19
19
  await fsp.rm(path.join(__cache, ".cache"), { recursive: true, force: true });
20
20
  await fsp.rm(path.join(__exports, "dist"), { recursive: true, force: true });
21
21
  await fsp.rm(path.join(__exports, "assets"), { recursive: true, force: true });
@@ -0,0 +1,21 @@
1
+ import type { RenderContext } from "../../../shared/context";
2
+ import type { SSG } from "../shared/types";
3
+
4
+ import fsp from "node:fs/promises";
5
+ import path from "node:path";
6
+
7
+ export async function dryRenderSyncAction(context: RenderContext<SSG>) {
8
+ const {
9
+ buildReportFileName,
10
+ pathsHydratedWithDomain: { __root, __exports },
11
+ } = context;
12
+
13
+ try {
14
+ await fsp.mkdir(path.join(__exports, "dist"));
15
+ } catch (_e) {}
16
+
17
+ await fsp.cp(
18
+ path.join(__root, "current-dist", buildReportFileName),
19
+ path.join(__exports, "dist", buildReportFileName),
20
+ );
21
+ }
@@ -0,0 +1,44 @@
1
+ import type { RenderContext } from "../../../shared/context";
2
+
3
+ import { cleanAction } from "./clean";
4
+ import { closeAction } from "./close";
5
+ import { dataAction } from "./data";
6
+ import { dryRenderSyncAction } from "./dry-render-sync";
7
+ import { healthCheckAction } from "./healthCheck";
8
+ import { initAction } from "./init";
9
+ import { logsAction } from "./logs";
10
+ import { metaAction } from "./meta";
11
+ import { prepareAction } from "./prepare";
12
+ import { relocationAction } from "./relocation";
13
+ import { reportAction } from "./report";
14
+ import { restoreAction } from "./restore";
15
+ import { ssgAction } from "./ssg";
16
+ import { syncAction } from "./sync";
17
+
18
+ /**
19
+ * Defines the signature of a Gatsby action.
20
+ * An action is a function that receives a RenderContext and performs
21
+ * a specific step in the render lifecycle.
22
+ */
23
+ export type Action<T = any> = (context: RenderContext<T>) => Promise<void>;
24
+
25
+ /**
26
+ * All available Gatsby actions grouped in a single namespace.
27
+ * Each action performs a specific step in the render process.
28
+ */
29
+ export const actions = {
30
+ clean: cleanAction,
31
+ close: closeAction,
32
+ data: dataAction,
33
+ dryRenderSync: dryRenderSyncAction,
34
+ healthCheck: healthCheckAction,
35
+ init: initAction,
36
+ logs: logsAction,
37
+ meta: metaAction,
38
+ prepare: prepareAction,
39
+ relocation: relocationAction,
40
+ report: reportAction,
41
+ restore: restoreAction,
42
+ ssg: ssgAction,
43
+ sync: syncAction,
44
+ } satisfies Record<string, Action>;
@@ -1,14 +1,12 @@
1
1
  import type { RenderContext } from "@shared/context";
2
2
 
3
3
  import { generateLLMs } from "@services/llms";
4
- import { generateBuildReport } from "@services/render";
5
4
  import { generateRobots } from "@services/robots";
6
5
  import { generateSitemaps } from "@services/sitemaps";
7
6
 
8
7
  export async function metaAction(context: RenderContext) {
9
8
  const { domain } = context;
10
9
 
11
- await generateBuildReport(domain);
12
10
  await generateSitemaps(domain);
13
11
  await generateRobots(domain);
14
12
  await generateLLMs(domain);
@@ -0,0 +1,9 @@
1
+ import type { RenderContext } from "@shared/context";
2
+
3
+ import { generateBuildReport } from "@services/render";
4
+
5
+ export async function reportAction(context: RenderContext) {
6
+ const { domain } = context;
7
+
8
+ await generateBuildReport(domain);
9
+ }
@@ -16,18 +16,7 @@ import { getRenderArtifacts } from "../../services/render-artifacts";
16
16
  import { RenderContext } from "../../shared/context";
17
17
  import { GRIDDO_ASSET_PREFIX, GRIDDO_BUILD_LOGS } from "../../shared/envs";
18
18
  import { RENDER_MODE } from "../../shared/types/render";
19
- import { cleanAction } from "./actions/clean";
20
- import { closeAction } from "./actions/close";
21
- import { dataAction } from "./actions/data";
22
- import { healthCheckAction } from "./actions/healthCheck";
23
- import { initAction } from "./actions/init";
24
- import { logsAction } from "./actions/logs";
25
- import { metaAction } from "./actions/meta";
26
- import { prepareAction } from "./actions/prepare";
27
- import { relocationAction } from "./actions/relocation";
28
- import { restoreAction } from "./actions/restore";
29
- import { ssgAction } from "./actions/ssg";
30
- import { syncAction } from "./actions/sync";
19
+ import { actions } from "./actions";
31
20
  import { getGatsbyArtifacts } from "./shared/artifacts";
32
21
  import { disableRollbackOnError, enableRollbackOnError } from "./shared/render-rollback";
33
22
 
@@ -89,29 +78,51 @@ export async function gatsbyRenderDomain(domain: string) {
89
78
  renderMetadata,
90
79
  renderMode: derivedRenderMode,
91
80
  ssg: { assetPrefix, ssgArtifacts },
81
+ dryRun: !!data.domains[domain].dryRun,
82
+ buildReportFileName: data.buildReportFileName,
92
83
  });
93
84
 
94
- // A las actions se les pasa siempre `context` y cada action ya utiliza lo que necesita.
95
- // Si una action necesita devolver algo para otra, se guarda en el context.
96
- // Ejemplo: el dataAction obtiene los ids de páginas para renderizar y
97
- // borrar y los guarda en context.pathsToRender y context.pathsToDelete.
98
- await doLifeCycle("Init", async () => initAction(context));
99
- await doLifeCycle("Clean", async () => cleanAction(context));
100
- await doLifeCycle("Prepare", async () => prepareAction(context));
101
- await doLifeCycle("Restore", async () => restoreAction(context));
85
+ // Lifecycles disabled rules
86
+ const skipByDryRender = context.dryRun ? "dry-render is enabled" : false;
87
+ const skipByWetRender = context.dryRun ? false : "dry-render is disabled";
88
+ const isDisabledLogs = !GRIDDO_BUILD_LOGS ? "Build logs to file are disabled" : false;
89
+
90
+ // FROM_SCRATCH force to disable dry-renders and enable wetRenders
91
+ const isDryRender = derivedRenderMode === "FROM_SCRATCH" ? false : skipByDryRender;
92
+ const isWetRender =
93
+ derivedRenderMode === "FROM_SCRATCH" && context.dryRun
94
+ ? "wet-render is forced enabled by FROM_SCRATCH render mode"
95
+ : skipByWetRender;
96
+
97
+ // Actions are always passed the `context`, and each action uses what it
98
+ // needs. If an action needs to return something for another one, it is
99
+ // stored in the context.
100
+ // Example: dataAction gets the page IDs to render and delete and stores
101
+ // them in `context.pathsToRender` and `context.pathsToDelete`.
102
+
103
+ await doLifeCycle("Init", async () => actions.init(context));
104
+ await doLifeCycle("Clean", async () => actions.clean(context));
105
+ await doLifeCycle("Prepare", async () => actions.prepare(context));
106
+ await doLifeCycle("Restore", async () => actions.restore(context));
102
107
 
103
108
  await enableRollbackOnError();
104
109
 
105
- await doLifeCycle("Data", async () => dataAction(context));
106
- await doLifeCycle("SSG", async () => ssgAction(context));
107
- await doLifeCycle("Relocation", async () => relocationAction(context));
108
- await doLifeCycle("Meta", async () => metaAction(context));
109
- await doLifeCycle("Sync", async () => syncAction(context));
110
- await doLifeCycle("HealthCheck", async () => healthCheckAction(context));
111
- await doLifeCycle("Logs", async () => logsAction(context), {
112
- skip: !GRIDDO_BUILD_LOGS ? "Build logs to file are disabled" : false,
110
+ await doLifeCycle("Data", async () => actions.data(context));
111
+ await doLifeCycle("SSG", async () => actions.ssg(context), { skip: isDryRender });
112
+ await doLifeCycle("Relocation", async () => actions.relocation(context), {
113
+ skip: isDryRender,
113
114
  });
114
- await doLifeCycle("Close", async () => closeAction(context));
115
+ await doLifeCycle("Meta", async () => actions.meta(context), { skip: isDryRender });
116
+ await doLifeCycle("Report", async () => actions.report(context));
117
+ await doLifeCycle("DryRunSync", async () => actions.dryRenderSync(context), {
118
+ skip: isWetRender,
119
+ });
120
+ await doLifeCycle("Sync", async () => actions.sync(context), { skip: isDryRender });
121
+ await doLifeCycle("HealthCheck", async () => actions.healthCheck(context));
122
+ await doLifeCycle("Logs", async () => actions.logs(context), {
123
+ skip: isDryRender || isDisabledLogs,
124
+ });
125
+ await doLifeCycle("Close", async () => actions.close(context));
115
126
 
116
127
  await disableRollbackOnError();
117
128
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@griddo/cx",
3
3
  "description": "Griddo SSG based on Gatsby",
4
- "version": "11.10.46",
4
+ "version": "11.10.47-rc.0",
5
5
  "authors": [
6
6
  "Hisco <francis.vega@griddo.io>"
7
7
  ],
@@ -61,7 +61,7 @@
61
61
  },
62
62
  "devDependencies": {
63
63
  "@biomejs/biome": "2.3.4",
64
- "@griddo/core": "11.10.46",
64
+ "@griddo/core": "11.10.47-rc.0",
65
65
  "@types/node": "20.19.4",
66
66
  "@typescript/native-preview": "7.0.0-dev.20260108.1",
67
67
  "cheerio": "1.1.2",
@@ -94,5 +94,5 @@
94
94
  "publishConfig": {
95
95
  "access": "public"
96
96
  },
97
- "gitHead": "fd83d3991eb31335881dc050377bdb915b6c5bb2"
97
+ "gitHead": "486216826a26ab0ebe02a4a676748e7208de906c"
98
98
  }