@bagelink/blox 1.18.6 → 1.18.7

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/dist/index.d.ts CHANGED
@@ -31,7 +31,8 @@ export { defineBloxSite } from './siteConfig';
31
31
  export type { BloxSiteConfig } from './siteConfig';
32
32
  export { defineBlock } from './defineBlock';
33
33
  export type { BlockMeta, BlockModule, BlockDataSource, BlockDataSourceConfig } from './defineBlock';
34
- export type { LocaleStrategy } from './localeStrategy';
34
+ export type { LocaleStrategy, PageSlugMap } from './localeStrategy';
35
+ export { getPageSlugMap, localizePageSlug, setPageSlugMap } from './localeStrategy';
35
36
  export { withLocaleRoutes } from './localeRoutes';
36
37
  export { defineContent, contentRoutes, getContentRoute, getContentRouteByCollection, generateContentRoutes, installContentFallback, provideContentItem, useContentItem, useContentSeo, getItemBySlug, getItemById, ContentHost, ContentDetailView, } from './content';
37
38
  export type { ContentItem, ContentRoute, ContentRouteInput, ContentViewSchema } from './content';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACzL,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAChE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAKlF,YAAY,EACX,cAAc,EACd,KAAK,EAEL,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,cAAc,EACd,QAAQ,EACR,eAAe,EACf,cAAc,EACd,WAAW,GACX,MAAM,aAAa,CAAA;AAIpB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACtD,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAI9E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAK3E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAKjD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,YAAY,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAExE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACjH,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,YAAY,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAK7D,OAAO,EACN,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,WAAW,EACX,cAAc,GACd,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAK5C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACjD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAKxD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAChE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAC5F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACvE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAKlD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAEnG,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAKjD,OAAO,EACN,aAAa,EACb,aAAa,EACb,eAAe,EACf,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,aAAa,EACb,WAAW,EACX,WAAW,EACX,iBAAiB,GACjB,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAEhG,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAK1E,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACjE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAKlE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAI5E,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC/H,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAClG,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -26,7 +26,7 @@ const node_child_process = require("node:child_process");
26
26
  const os = require("node:os");
27
27
  const path = require("node:path");
28
28
  const process = require("node:process");
29
- const llmArtifacts = require("./validate-output-BymMbrA5.cjs");
29
+ const llmArtifacts = require("./validate-output-CbIQrCwa.cjs");
30
30
  const AUTO_SHARD_CAP = Number(process.env.BLOX_SSG_SHARD_CAP) || 6;
31
31
  const PREFETCH_BUDGET = Number(process.env.BLOX_SSG_PREFETCH_BUDGET) || 24;
32
32
  const SEQUENTIAL_SHARDS = process.env.BLOX_SSG_SEQUENTIAL === "1";
@@ -169,7 +169,7 @@ async function runSharded(opts) {
169
169
  }
170
170
  if (process.env.BLOX_SSG_LLM !== "0" && !((_a = website == null ? void 0 : website.seo) == null ? void 0 : _a.noindex)) {
171
171
  try {
172
- const { mergeLlmParts } = await Promise.resolve().then(() => require("./validate-output-BymMbrA5.cjs")).then((n) => n.llmArtifacts);
172
+ const { mergeLlmParts } = await Promise.resolve().then(() => require("./validate-output-CbIQrCwa.cjs")).then((n) => n.llmArtifacts);
173
173
  const mergeWebsite = website;
174
174
  const partFiles = Array.from({ length: total }, (_, i) => path.join(llmPartsDir, `part.${i}.json`));
175
175
  const { pages } = await mergeLlmParts({
@@ -215,6 +215,8 @@ async function runSharded(opts) {
215
215
  await fs.rm(routePartsDir, { recursive: true, force: true });
216
216
  await fs.rm(siteDataFile, { force: true }).catch(() => {
217
217
  });
218
+ await llmArtifacts.validateNoRedirectingLinks(path.resolve("dist"));
219
+ console.log("[blox-ssg] validated internal links (no redirecting URLs)");
218
220
  console.log(`[blox-ssg] sharded run done in ${((Date.now() - start) / 1e3).toFixed(1)}s`);
219
221
  return 0;
220
222
  }
@@ -2,7 +2,7 @@ import { spawn } from "node:child_process";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import process from "node:process";
5
- import { f as fetchCmsSiteData, g as generateSitemapArtifacts } from "./validate-output-yDJYYYzK.js";
5
+ import { f as fetchCmsSiteData, g as generateSitemapArtifacts, d as validateNoRedirectingLinks } from "./validate-output-B8pmE7hf.js";
6
6
  const AUTO_SHARD_CAP = Number(process.env.BLOX_SSG_SHARD_CAP) || 6;
7
7
  const PREFETCH_BUDGET = Number(process.env.BLOX_SSG_PREFETCH_BUDGET) || 24;
8
8
  const SEQUENTIAL_SHARDS = process.env.BLOX_SSG_SEQUENTIAL === "1";
@@ -145,7 +145,7 @@ async function runSharded(opts) {
145
145
  }
146
146
  if (process.env.BLOX_SSG_LLM !== "0" && !((_a = website == null ? void 0 : website.seo) == null ? void 0 : _a.noindex)) {
147
147
  try {
148
- const { mergeLlmParts } = await import("./validate-output-yDJYYYzK.js").then((n) => n.C);
148
+ const { mergeLlmParts } = await import("./validate-output-B8pmE7hf.js").then((n) => n.D);
149
149
  const mergeWebsite = website;
150
150
  const partFiles = Array.from({ length: total }, (_, i) => path.join(llmPartsDir, `part.${i}.json`));
151
151
  const { pages } = await mergeLlmParts({
@@ -191,6 +191,8 @@ async function runSharded(opts) {
191
191
  await fs.rm(routePartsDir, { recursive: true, force: true });
192
192
  await fs.rm(siteDataFile, { force: true }).catch(() => {
193
193
  });
194
+ await validateNoRedirectingLinks(path.resolve("dist"));
195
+ console.log("[blox-ssg] validated internal links (no redirecting URLs)");
194
196
  console.log(`[blox-ssg] sharded run done in ${((Date.now() - start) / 1e3).toFixed(1)}s`);
195
197
  return 0;
196
198
  }
package/dist/ssg/cli.cjs CHANGED
@@ -3,7 +3,7 @@
3
3
  const process = require("node:process");
4
4
  const fs = require("node:fs/promises");
5
5
  const ssg_buildGrant = require("./build-grant.cjs");
6
- const llmArtifacts = require("../validate-output-BymMbrA5.cjs");
6
+ const llmArtifacts = require("../validate-output-CbIQrCwa.cjs");
7
7
  const localeStrategy = require("../localeStrategy-OwRIn35C.cjs");
8
8
  function installFetchTimeout() {
9
9
  const ms = Number(process.env.BLOX_SSG_FETCH_TIMEOUT_MS) || 2e4;
@@ -148,7 +148,7 @@ Environment:
148
148
  if (shardsOpt !== null || routesCmd) {
149
149
  const { apiBase: apiBase2, websiteName: configWebsiteName2 } = await resolveApiBase(mode);
150
150
  const websiteName2 = process.env.WEBSITE_NAME ?? configWebsiteName2 ?? "default";
151
- const { runSharded } = await Promise.resolve().then(() => require("../shard-runner-DF3K3Ze_.cjs"));
151
+ const { runSharded } = await Promise.resolve().then(() => require("../shard-runner-Bz46UqN8.cjs"));
152
152
  const code = await runSharded({
153
153
  shards: shardsOpt ?? "auto",
154
154
  mode,
@@ -295,6 +295,7 @@ ${"=".repeat(60)}`);
295
295
  }
296
296
  if (validateOutput && shardTotal === 1) {
297
297
  await llmArtifacts.validateInternalLinks("dist");
298
+ await llmArtifacts.validateNoRedirectingLinks("dist");
298
299
  console.log("[blox-ssg] validated internal links");
299
300
  }
300
301
  if (productionBuild && shardTotal === 1) {
package/dist/ssg/cli.mjs CHANGED
@@ -2,7 +2,7 @@
2
2
  import process from "node:process";
3
3
  import fs from "node:fs/promises";
4
4
  import { resolveBloxBuildGrant } from "./build-grant.mjs";
5
- import { v as validateSsgOutput, u as uploadBloxManifest, p as polyfillBloxSsgGlobals, f as fetchCmsSiteData, b as buildCollectionResolver, a as prerender, c as validateInternalLinks } from "../validate-output-yDJYYYzK.js";
5
+ import { v as validateSsgOutput, u as uploadBloxManifest, p as polyfillBloxSsgGlobals, f as fetchCmsSiteData, b as buildCollectionResolver, a as prerender, c as validateInternalLinks, d as validateNoRedirectingLinks } from "../validate-output-B8pmE7hf.js";
6
6
  import { s as setPageSlugMap } from "../localeStrategy-hXlNof1E.js";
7
7
  function installFetchTimeout() {
8
8
  const ms = Number(process.env.BLOX_SSG_FETCH_TIMEOUT_MS) || 2e4;
@@ -147,7 +147,7 @@ Environment:
147
147
  if (shardsOpt !== null || routesCmd) {
148
148
  const { apiBase: apiBase2, websiteName: configWebsiteName2 } = await resolveApiBase(mode);
149
149
  const websiteName2 = process.env.WEBSITE_NAME ?? configWebsiteName2 ?? "default";
150
- const { runSharded } = await import("../shard-runner-DFrc8d4O.js");
150
+ const { runSharded } = await import("../shard-runner-CoFcUVGe.js");
151
151
  const code = await runSharded({
152
152
  shards: shardsOpt ?? "auto",
153
153
  mode,
@@ -294,6 +294,7 @@ ${"=".repeat(60)}`);
294
294
  }
295
295
  if (validateOutput && shardTotal === 1) {
296
296
  await validateInternalLinks("dist");
297
+ await validateNoRedirectingLinks("dist");
297
298
  console.log("[blox-ssg] validated internal links");
298
299
  }
299
300
  if (productionBuild && shardTotal === 1) {
@@ -22,7 +22,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
  mod
23
23
  ));
24
24
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
25
- const llmArtifacts = require("../validate-output-BymMbrA5.cjs");
25
+ const llmArtifacts = require("../validate-output-CbIQrCwa.cjs");
26
26
  const ssg_buildGrant = require("./build-grant.cjs");
27
27
  const ssg_client = require("../client-AoDTJJXJ.cjs");
28
28
  const vue = require("vue");
@@ -1,5 +1,5 @@
1
- import { d as buildPageHead, e as primaryContextEntry, h as buildJsonLd, i as extractPageText, B as BloxBuildResponseError, j as bloxBuildJson } from "../validate-output-yDJYYYzK.js";
2
- import { k, l, f, m, n, o, q, g, r, s, t, w, x, y, p, a, z, A, u, c, v } from "../validate-output-yDJYYYzK.js";
1
+ import { e as buildPageHead, h as primaryContextEntry, i as buildJsonLd, j as extractPageText, B as BloxBuildResponseError, k as bloxBuildJson } from "../validate-output-B8pmE7hf.js";
2
+ import { l, m, f, n, o, q, r, g, s, t, w, x, y, z, p, a, A, C, u, c, v } from "../validate-output-B8pmE7hf.js";
3
3
  import { parseBloxBuildGrantBody, resolveBloxBuildGrant } from "./build-grant.mjs";
4
4
  import { a as BLOX_HYDRATION_WINDOW_KEY } from "../client-Ce9fRCGH.js";
5
5
  import { createSSRApp, h, Suspense } from "vue";
@@ -416,34 +416,34 @@ export {
416
416
  BLOX_HYDRATION_WINDOW_KEY,
417
417
  BloxBuildResponseError,
418
418
  bloxBuildJson,
419
- k as bloxBuildRequest,
419
+ l as bloxBuildRequest,
420
420
  buildJsonLd,
421
421
  buildPageHead,
422
- l as buildSiteHead,
422
+ m as buildSiteHead,
423
423
  createBloxSSREntry,
424
424
  extractPageText,
425
425
  f as fetchCmsSiteData,
426
426
  fetchDatastoreSnapshot,
427
- m as generateLlmsFullTxt,
428
- n as generateLlmsTxt,
429
- o as generateNetlifyRedirects,
430
- q as generateRobotsTxt,
427
+ n as generateLlmsFullTxt,
428
+ o as generateLlmsTxt,
429
+ q as generateNetlifyRedirects,
430
+ r as generateRobotsTxt,
431
431
  g as generateSitemapArtifacts,
432
- r as generateSitemapIndexXml,
433
- s as generateSitemapXml,
434
- t as getBloxBuildRequestOptions,
435
- w as getSiteIconFlags,
436
- x as localeSitemapPath,
437
- y as mergeLlmParts,
432
+ s as generateSitemapIndexXml,
433
+ t as generateSitemapXml,
434
+ w as getBloxBuildRequestOptions,
435
+ x as getSiteIconFlags,
436
+ y as localeSitemapPath,
437
+ z as mergeLlmParts,
438
438
  parseBloxBuildGrantBody,
439
439
  p as polyfillBloxSsgGlobals,
440
440
  a as prerender,
441
441
  querySnapshotRows,
442
442
  renderBloxSsgPage,
443
443
  resolveBloxBuildGrant,
444
- z as resolveManifestProvenance,
444
+ A as resolveManifestProvenance,
445
445
  snapshotRows,
446
- A as splitSitemapPathsByLocale,
446
+ C as splitSitemapPathsByLocale,
447
447
  u as uploadBloxManifest,
448
448
  c as validateInternalLinks,
449
449
  v as validateSsgOutput
@@ -46,6 +46,8 @@ export interface RenderContext {
46
46
  website?: WebsiteRead | null;
47
47
  /** Resolved website ID for client embedding. */
48
48
  websiteId?: string;
49
+ /** Canonical localized page paths, embedded in the hydration payload. */
50
+ pageSlugMap?: Record<string, Record<string, string>>;
49
51
  /**
50
52
  * Pre-resolved page data keyed by render URL. When the prerender producer has
51
53
  * already fetched a URL's `/resolve-path` result, the SSR entry reads it from
@@ -1 +1 @@
1
- {"version":3,"file":"prerender.d.ts","sourceRoot":"","sources":["../../src/ssg/prerender.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prerender.d.ts","sourceRoot":"","sources":["../../src/ssg/prerender.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"shard-runner.d.ts","sourceRoot":"","sources":["../../src/ssg/shard-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAI9D,MAAM,WAAW,kBAAkB;IAClC,qDAAqD;IACrD,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAA;IACZ,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAA;IACf,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAA;IACnB,yEAAyE;IACzE,YAAY,CAAC,EAAE,uBAAuB,CAAA;IACtC,iFAAiF;IACjF,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,8FAA8F;IAC9F,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAWD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAQ/E;AAED,wBAAgB,uBAAuB,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EACrE,MAAM,EAAE,CAAC,EAAE,EACX,WAAW,EAAE,OAAO,GAAG,SAAS,GAC9B,CAAC,EAAE,CAIL;AAsED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA0J1E"}
1
+ {"version":3,"file":"shard-runner.d.ts","sourceRoot":"","sources":["../../src/ssg/shard-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAK9D,MAAM,WAAW,kBAAkB;IAClC,qDAAqD;IACrD,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAA;IACZ,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAA;IACf,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAA;IACnB,yEAAyE;IACzE,YAAY,CAAC,EAAE,uBAAuB,CAAA;IACtC,iFAAiF;IACjF,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,8FAA8F;IAC9F,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAWD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAQ/E;AAED,wBAAgB,uBAAuB,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EACrE,MAAM,EAAE,CAAC,EAAE,EACX,WAAW,EAAE,OAAO,GAAG,SAAS,GAC9B,CAAC,EAAE,CAIL;AAsED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgK1E"}
@@ -26,5 +26,14 @@ export interface ValidateSsgOutputOptions {
26
26
  */
27
27
  checkInternalLinks?: boolean;
28
28
  }
29
+ /**
30
+ * Fail when a prerendered page links to a URL that Netlify will redirect.
31
+ *
32
+ * Links must point at canonical URLs: a link to a redirect source (e.g.
33
+ * `/es/get-the-best-offer` → `/es/consigue-la-mejor-oferta`) costs a hop on
34
+ * every click and shows up as an internal redirect chain in crawlers. Redirects
35
+ * remain for external/legacy URLs only.
36
+ */
37
+ export declare function validateNoRedirectingLinks(outDir: string): Promise<void>;
29
38
  export declare function validateSsgOutput(options: ValidateSsgOutputOptions): Promise<void>;
30
39
  //# sourceMappingURL=validate-output.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-output.d.ts","sourceRoot":"","sources":["../../src/ssg/validate-output.ts"],"names":[],"mappings":"AAWA;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzE;AAED,MAAM,WAAW,wBAAwB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC5B;AAgCD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ExF"}
1
+ {"version":3,"file":"validate-output.d.ts","sourceRoot":"","sources":["../../src/ssg/validate-output.ts"],"names":[],"mappings":"AAWA;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzE;AAED,MAAM,WAAW,wBAAwB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB9E;AAqED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ExF"}
@@ -1274,7 +1274,7 @@ ${existing}`,
1274
1274
  totalDiscovered: seen.size
1275
1275
  };
1276
1276
  }
1277
- function normalizePath(p) {
1277
+ function normalizePath$1(p) {
1278
1278
  if (!p) return "/";
1279
1279
  try {
1280
1280
  if (p.startsWith("http://") || p.startsWith("https://")) {
@@ -1291,7 +1291,7 @@ function normalizePath(p) {
1291
1291
  return p || "/";
1292
1292
  }
1293
1293
  function enqueue(p, queue, seen, isExcluded) {
1294
- const np = normalizePath(p);
1294
+ const np = normalizePath$1(p);
1295
1295
  if (seen.has(np)) return;
1296
1296
  if (isExcluded(np)) return;
1297
1297
  seen.add(np);
@@ -1300,7 +1300,7 @@ function enqueue(p, queue, seen, isExcluded) {
1300
1300
  function makeExcludeChecker(excludePaths) {
1301
1301
  const rules = Array.isArray(excludePaths) ? excludePaths : [excludePaths];
1302
1302
  return (p) => {
1303
- const np = normalizePath(p);
1303
+ const np = normalizePath$1(p);
1304
1304
  for (const r of rules) {
1305
1305
  if (typeof r === "string" && r === "") continue;
1306
1306
  if (typeof r === "function") {
@@ -1308,7 +1308,7 @@ function makeExcludeChecker(excludePaths) {
1308
1308
  } else if (r instanceof RegExp) {
1309
1309
  if (r.test(np)) return true;
1310
1310
  } else if (typeof r === "string") {
1311
- const prefix = normalizePath(r);
1311
+ const prefix = normalizePath$1(r);
1312
1312
  if (np === prefix || np.startsWith(`${prefix}/`)) return true;
1313
1313
  }
1314
1314
  }
@@ -1546,6 +1546,60 @@ async function validateInternalLinks(outDir) {
1546
1546
  ${failures.map((item) => ` - ${item}`).join("\n")}`);
1547
1547
  }
1548
1548
  }
1549
+ async function validateNoRedirectingLinks(outDir) {
1550
+ const root = path.resolve(outDir);
1551
+ const redirectSources = await readRedirectSources(root, "301", "302", "307", "308");
1552
+ if (!redirectSources.size) return;
1553
+ const failures = [];
1554
+ for (const file of await collectHtmlFiles(root)) {
1555
+ const name = path.relative(root, file);
1556
+ const html = await fs.readFile(file, "utf8");
1557
+ for (const href of internalHrefs(html)) {
1558
+ const [withoutSuffix] = href.split(/[?#]/);
1559
+ const normalized = normalizePath(withoutSuffix || "/");
1560
+ if (redirectSources.has(normalized)) {
1561
+ failures.push(`${name}: links to redirecting URL "${href}"`);
1562
+ }
1563
+ }
1564
+ }
1565
+ if (failures.length) {
1566
+ throw new Error(
1567
+ `Invalid Blox SSG output:
1568
+ ${failures.slice(0, 25).map((item) => ` - ${item}`).join("\n")}`
1569
+ );
1570
+ }
1571
+ }
1572
+ async function readRedirectSources(root, ...statuses) {
1573
+ const sources = /* @__PURE__ */ new Set();
1574
+ let content = "";
1575
+ try {
1576
+ content = await fs.readFile(path.join(root, "_redirects"), "utf8");
1577
+ } catch {
1578
+ return sources;
1579
+ }
1580
+ for (const line of content.split("\n")) {
1581
+ const trimmed = line.trim();
1582
+ if (!trimmed || trimmed.startsWith("#")) continue;
1583
+ const parts = trimmed.split(/\s+/);
1584
+ if (parts.length < 3) continue;
1585
+ const status = parts[2];
1586
+ if (!statuses.includes(status)) continue;
1587
+ sources.add(normalizePath(parts[0]));
1588
+ }
1589
+ return sources;
1590
+ }
1591
+ function normalizePath(value) {
1592
+ const clean = value.split(/[?#]/)[0] || "/";
1593
+ return clean !== "/" ? clean.replace(/\/+$/, "") : "/";
1594
+ }
1595
+ function* internalHrefs(html) {
1596
+ const attr = /(?:<a\b[^>]*\shref=["']([^"']+)["'])|(?:data-to=["']([^"']+)["'])/gi;
1597
+ let match;
1598
+ while (match = attr.exec(html)) {
1599
+ const value = match[1] ?? match[2] ?? "";
1600
+ if (value.startsWith("/") && !value.startsWith("//")) yield value;
1601
+ }
1602
+ }
1549
1603
  const anchorHref = /<a\b[^>]*\shref=["']([^"']*)["']/gi;
1550
1604
  const ABSOLUTE_OR_SPECIAL = /^(?:[a-z][a-z0-9+.-]*:|\/\/|\/|#|\?|$)/i;
1551
1605
  async function readSiteNoindex(outDir) {
@@ -1686,33 +1740,34 @@ async function validateSitemap(outDir, content) {
1686
1740
  return failures;
1687
1741
  }
1688
1742
  export {
1689
- splitSitemapPathsByLocale as A,
1743
+ resolveManifestProvenance as A,
1690
1744
  BloxBuildResponseError as B,
1691
- llmArtifacts as C,
1745
+ splitSitemapPathsByLocale as C,
1746
+ llmArtifacts as D,
1692
1747
  prerender as a,
1693
1748
  buildCollectionResolver as b,
1694
1749
  validateInternalLinks as c,
1695
- buildPageHead as d,
1696
- primaryContextEntry as e,
1750
+ validateNoRedirectingLinks as d,
1751
+ buildPageHead as e,
1697
1752
  fetchCmsSiteData as f,
1698
1753
  generateSitemapArtifacts as g,
1699
- buildJsonLd as h,
1700
- extractPageText as i,
1701
- bloxBuildJson as j,
1702
- bloxBuildRequest as k,
1703
- buildSiteHead as l,
1704
- generateLlmsFullTxt as m,
1705
- generateLlmsTxt as n,
1706
- generateNetlifyRedirects as o,
1754
+ primaryContextEntry as h,
1755
+ buildJsonLd as i,
1756
+ extractPageText as j,
1757
+ bloxBuildJson as k,
1758
+ bloxBuildRequest as l,
1759
+ buildSiteHead as m,
1760
+ generateLlmsFullTxt as n,
1761
+ generateLlmsTxt as o,
1707
1762
  polyfillBloxSsgGlobals as p,
1708
- generateRobotsTxt as q,
1709
- generateSitemapIndexXml as r,
1710
- generateSitemapXml as s,
1711
- getBloxBuildRequestOptions as t,
1763
+ generateNetlifyRedirects as q,
1764
+ generateRobotsTxt as r,
1765
+ generateSitemapIndexXml as s,
1766
+ generateSitemapXml as t,
1712
1767
  uploadBloxManifest as u,
1713
1768
  validateSsgOutput as v,
1714
- getSiteIconFlags as w,
1715
- localeSitemapPath as x,
1716
- mergeLlmParts as y,
1717
- resolveManifestProvenance as z
1769
+ getBloxBuildRequestOptions as w,
1770
+ getSiteIconFlags as x,
1771
+ localeSitemapPath as y,
1772
+ mergeLlmParts as z
1718
1773
  };
@@ -1297,7 +1297,7 @@ ${existing}`,
1297
1297
  totalDiscovered: seen.size
1298
1298
  };
1299
1299
  }
1300
- function normalizePath(p) {
1300
+ function normalizePath$1(p) {
1301
1301
  if (!p) return "/";
1302
1302
  try {
1303
1303
  if (p.startsWith("http://") || p.startsWith("https://")) {
@@ -1314,7 +1314,7 @@ function normalizePath(p) {
1314
1314
  return p || "/";
1315
1315
  }
1316
1316
  function enqueue(p, queue, seen, isExcluded) {
1317
- const np = normalizePath(p);
1317
+ const np = normalizePath$1(p);
1318
1318
  if (seen.has(np)) return;
1319
1319
  if (isExcluded(np)) return;
1320
1320
  seen.add(np);
@@ -1323,7 +1323,7 @@ function enqueue(p, queue, seen, isExcluded) {
1323
1323
  function makeExcludeChecker(excludePaths) {
1324
1324
  const rules = Array.isArray(excludePaths) ? excludePaths : [excludePaths];
1325
1325
  return (p) => {
1326
- const np = normalizePath(p);
1326
+ const np = normalizePath$1(p);
1327
1327
  for (const r of rules) {
1328
1328
  if (typeof r === "string" && r === "") continue;
1329
1329
  if (typeof r === "function") {
@@ -1331,7 +1331,7 @@ function makeExcludeChecker(excludePaths) {
1331
1331
  } else if (r instanceof RegExp) {
1332
1332
  if (r.test(np)) return true;
1333
1333
  } else if (typeof r === "string") {
1334
- const prefix = normalizePath(r);
1334
+ const prefix = normalizePath$1(r);
1335
1335
  if (np === prefix || np.startsWith(`${prefix}/`)) return true;
1336
1336
  }
1337
1337
  }
@@ -1569,6 +1569,60 @@ async function validateInternalLinks(outDir) {
1569
1569
  ${failures.map((item) => ` - ${item}`).join("\n")}`);
1570
1570
  }
1571
1571
  }
1572
+ async function validateNoRedirectingLinks(outDir) {
1573
+ const root = path.resolve(outDir);
1574
+ const redirectSources = await readRedirectSources(root, "301", "302", "307", "308");
1575
+ if (!redirectSources.size) return;
1576
+ const failures = [];
1577
+ for (const file of await collectHtmlFiles(root)) {
1578
+ const name = path.relative(root, file);
1579
+ const html = await fs.readFile(file, "utf8");
1580
+ for (const href of internalHrefs(html)) {
1581
+ const [withoutSuffix] = href.split(/[?#]/);
1582
+ const normalized = normalizePath(withoutSuffix || "/");
1583
+ if (redirectSources.has(normalized)) {
1584
+ failures.push(`${name}: links to redirecting URL "${href}"`);
1585
+ }
1586
+ }
1587
+ }
1588
+ if (failures.length) {
1589
+ throw new Error(
1590
+ `Invalid Blox SSG output:
1591
+ ${failures.slice(0, 25).map((item) => ` - ${item}`).join("\n")}`
1592
+ );
1593
+ }
1594
+ }
1595
+ async function readRedirectSources(root, ...statuses) {
1596
+ const sources = /* @__PURE__ */ new Set();
1597
+ let content = "";
1598
+ try {
1599
+ content = await fs.readFile(path.join(root, "_redirects"), "utf8");
1600
+ } catch {
1601
+ return sources;
1602
+ }
1603
+ for (const line of content.split("\n")) {
1604
+ const trimmed = line.trim();
1605
+ if (!trimmed || trimmed.startsWith("#")) continue;
1606
+ const parts = trimmed.split(/\s+/);
1607
+ if (parts.length < 3) continue;
1608
+ const status = parts[2];
1609
+ if (!statuses.includes(status)) continue;
1610
+ sources.add(normalizePath(parts[0]));
1611
+ }
1612
+ return sources;
1613
+ }
1614
+ function normalizePath(value) {
1615
+ const clean = value.split(/[?#]/)[0] || "/";
1616
+ return clean !== "/" ? clean.replace(/\/+$/, "") : "/";
1617
+ }
1618
+ function* internalHrefs(html) {
1619
+ const attr = /(?:<a\b[^>]*\shref=["']([^"']+)["'])|(?:data-to=["']([^"']+)["'])/gi;
1620
+ let match;
1621
+ while (match = attr.exec(html)) {
1622
+ const value = match[1] ?? match[2] ?? "";
1623
+ if (value.startsWith("/") && !value.startsWith("//")) yield value;
1624
+ }
1625
+ }
1572
1626
  const anchorHref = /<a\b[^>]*\shref=["']([^"']*)["']/gi;
1573
1627
  const ABSOLUTE_OR_SPECIAL = /^(?:[a-z][a-z0-9+.-]*:|\/\/|\/|#|\?|$)/i;
1574
1628
  async function readSiteNoindex(outDir) {
@@ -1736,4 +1790,5 @@ exports.resolveManifestProvenance = resolveManifestProvenance;
1736
1790
  exports.splitSitemapPathsByLocale = splitSitemapPathsByLocale;
1737
1791
  exports.uploadBloxManifest = uploadBloxManifest;
1738
1792
  exports.validateInternalLinks = validateInternalLinks;
1793
+ exports.validateNoRedirectingLinks = validateNoRedirectingLinks;
1739
1794
  exports.validateSsgOutput = validateSsgOutput;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bagelink/blox",
3
3
  "type": "module",
4
- "version": "1.18.6",
4
+ "version": "1.18.7",
5
5
  "description": "Blox page builder library for drag-and-drop page building and static data management",
6
6
  "author": {
7
7
  "name": "Bagel Studio",