@lownoise-studio/rendershield 1.0.0 → 1.1.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 (54) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +32 -14
  3. package/dist/cli.js +28 -23
  4. package/dist/cli.js.map +1 -1
  5. package/dist/cliArgs.d.ts +8 -0
  6. package/dist/cliArgs.d.ts.map +1 -0
  7. package/dist/cliArgs.js +56 -0
  8. package/dist/cliArgs.js.map +1 -0
  9. package/dist/commands/build.d.ts +2 -1
  10. package/dist/commands/build.d.ts.map +1 -1
  11. package/dist/commands/build.js +2 -2
  12. package/dist/commands/build.js.map +1 -1
  13. package/dist/commands/init.d.ts +2 -1
  14. package/dist/commands/init.d.ts.map +1 -1
  15. package/dist/commands/init.js +8 -7
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/verify.d.ts +22 -8
  18. package/dist/commands/verify.d.ts.map +1 -1
  19. package/dist/commands/verify.js +158 -66
  20. package/dist/commands/verify.js.map +1 -1
  21. package/dist/configPath.d.ts +7 -0
  22. package/dist/configPath.d.ts.map +1 -0
  23. package/dist/configPath.js +8 -0
  24. package/dist/configPath.js.map +1 -0
  25. package/dist/core/generateWorker.js +1 -1
  26. package/dist/core/generateWorker.js.map +1 -1
  27. package/dist/core/listOutputRoutes.d.ts +4 -0
  28. package/dist/core/listOutputRoutes.d.ts.map +1 -0
  29. package/dist/core/listOutputRoutes.js +40 -0
  30. package/dist/core/listOutputRoutes.js.map +1 -0
  31. package/dist/core/loadConfig.d.ts +3 -1
  32. package/dist/core/loadConfig.d.ts.map +1 -1
  33. package/dist/core/loadConfig.js +45 -38
  34. package/dist/core/loadConfig.js.map +1 -1
  35. package/dist/index.d.ts +3 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/types.d.ts +1 -1
  40. package/dist/types.d.ts.map +1 -1
  41. package/docs/CONFIG.md +70 -0
  42. package/package.json +2 -1
  43. package/rendershield.config.schema.json +100 -0
  44. package/src/cli.ts +36 -26
  45. package/src/cliArgs.ts +71 -0
  46. package/src/commands/build.ts +3 -2
  47. package/src/commands/init.ts +8 -8
  48. package/src/commands/verify.ts +264 -79
  49. package/src/configPath.ts +17 -0
  50. package/src/core/generateWorker.ts +1 -1
  51. package/src/core/listOutputRoutes.ts +51 -0
  52. package/src/core/loadConfig.ts +59 -38
  53. package/src/index.ts +4 -1
  54. package/src/types.ts +1 -1
@@ -1,6 +1,7 @@
1
1
  import fs from "fs-extra";
2
2
  import path from "node:path";
3
3
  import { loadConfig } from "../core/loadConfig.js";
4
+ import { listPrerenderIndexFiles, indexHtmlPathToRoute, } from "../core/listOutputRoutes.js";
4
5
  import { checkPrerenderContract, } from "../core/validateOutput.js";
5
6
  import { renderShieldError } from "../errors.js";
6
7
  function joinUrl(base, routePath) {
@@ -8,46 +9,8 @@ function joinUrl(base, routePath) {
8
9
  const p = routePath.startsWith("/") ? routePath : `/${routePath}`;
9
10
  return b + p;
10
11
  }
11
- async function findFirstIndexHtml(outDirAbs) {
12
- const stack = [outDirAbs];
13
- while (stack.length > 0) {
14
- const current = stack.pop();
15
- let entries;
16
- try {
17
- entries = await fs.readdir(current, { withFileTypes: true });
18
- }
19
- catch {
20
- continue;
21
- }
22
- entries.sort((a, b) => a.name.localeCompare(b.name));
23
- for (const entry of entries) {
24
- const full = path.join(current, entry.name);
25
- if (entry.isDirectory()) {
26
- stack.push(full);
27
- continue;
28
- }
29
- if (entry.isFile() && entry.name.toLowerCase() === "index.html") {
30
- // Ignore index.html at the output root; prefer a routed page like
31
- // <section>/<slug>/index.html (or deeper).
32
- const rel = path.relative(outDirAbs, full);
33
- const parts = rel.split(path.sep).filter(Boolean);
34
- if (parts.length >= 2)
35
- return full;
36
- }
37
- }
38
- }
39
- return null;
40
- }
41
- function indexHtmlPathToRoute(outDirAbs, indexPathAbs) {
42
- const rel = path.relative(outDirAbs, indexPathAbs);
43
- // rel: <section>/<slug>/index.html
44
- const noFile = rel.replace(/index\.html$/i, "");
45
- const normalized = noFile.split(path.sep).join("/").replace(/\/+$/, "");
46
- return "/" + normalized.replace(/^\/+/, "");
47
- }
48
12
  const BOT_UA = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
49
13
  const HUMAN_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
50
- /** Heuristic: likely SPA shell if body has almost no visible content and no article. */
51
14
  function looksLikeSpaShell(html) {
52
15
  const bodyMatch = html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
53
16
  const bodyHtml = bodyMatch ? bodyMatch[1] : html;
@@ -68,20 +31,62 @@ function looksLikeSpaShell(html) {
68
31
  }
69
32
  return { likely: false };
70
33
  }
71
- export async function cmdVerify(cwd = process.cwd(), options) {
72
- if (options?.prodUrl) {
73
- return runVerifyProd(options.prodUrl);
34
+ export async function cmdVerify(cwd = process.cwd(), options = {}) {
35
+ if (options.prod || options.prodUrl) {
36
+ return runVerifyProdMode(cwd, options);
74
37
  }
75
- const cfg = await loadConfig(cwd);
38
+ if (options.check) {
39
+ return runLocalCheckMode(cwd, options);
40
+ }
41
+ if (options.all) {
42
+ throw renderShieldError("CLI_INVALID_ARGS", "verify --all requires --check (local) or --prod (production). Example: rendershield verify --all --check");
43
+ }
44
+ return runLocalSmoke(cwd, options);
45
+ }
46
+ async function runVerifyProdMode(cwd, options) {
47
+ const cfg = await loadConfig(cwd, options);
76
48
  const outDirAbs = path.join(cwd, cfg.output.outDir);
77
- const exists = await fs.pathExists(outDirAbs);
78
- if (!exists) {
79
- throw renderShieldError("VERIFY_FAILED", `No prerender output directory found: ${cfg.output.outDir}/. Run: rendershield build`, { outDir: cfg.output.outDir });
49
+ if (options.all) {
50
+ await assertOutputExists(outDirAbs, cfg.output.outDir);
51
+ const indexFiles = await listPrerenderIndexFiles(outDirAbs);
52
+ if (indexFiles.length === 0) {
53
+ throw renderShieldError("VERIFY_FAILED", `No prerendered pages found inside: ${cfg.output.outDir}/. Run: rendershield build`, { outDir: cfg.output.outDir });
54
+ }
55
+ return runVerifyProdAll(cfg, cwd, outDirAbs, indexFiles);
80
56
  }
81
- const firstIndex = await findFirstIndexHtml(outDirAbs);
82
- if (!firstIndex) {
57
+ if (!options.prodUrl) {
58
+ throw renderShieldError("CLI_INVALID_ARGS", "verify --prod requires a URL, or use --prod --all to check every route from build output.");
59
+ }
60
+ const single = await fetchAndVerifyProd(options.prodUrl.startsWith("http") ? options.prodUrl : `https://${options.prodUrl}`);
61
+ return { mode: "prod", ok: true, pages: [single] };
62
+ }
63
+ async function runLocalCheckMode(cwd, options) {
64
+ const cfg = await loadConfig(cwd, options);
65
+ const outDirAbs = path.join(cwd, cfg.output.outDir);
66
+ await assertOutputExists(outDirAbs, cfg.output.outDir);
67
+ const indexFiles = await listPrerenderIndexFiles(outDirAbs);
68
+ if (indexFiles.length === 0) {
83
69
  throw renderShieldError("VERIFY_FAILED", `No prerendered pages found inside: ${cfg.output.outDir}/. Run: rendershield build`, { outDir: cfg.output.outDir });
84
70
  }
71
+ if (options.all) {
72
+ return runLocalCheckAll(cwd, cfg, outDirAbs, indexFiles);
73
+ }
74
+ return runLocalCheckOne(cwd, cfg, outDirAbs, indexFiles[0]);
75
+ }
76
+ async function assertOutputExists(outDirAbs, outDir) {
77
+ if (!(await fs.pathExists(outDirAbs))) {
78
+ throw renderShieldError("VERIFY_FAILED", `No prerender output directory found: ${outDir}/. Run: rendershield build`, { outDir });
79
+ }
80
+ }
81
+ async function runLocalSmoke(cwd, options) {
82
+ const cfg = await loadConfig(cwd, options);
83
+ const outDirAbs = path.join(cwd, cfg.output.outDir);
84
+ await assertOutputExists(outDirAbs, cfg.output.outDir);
85
+ const indexFiles = await listPrerenderIndexFiles(outDirAbs);
86
+ if (indexFiles.length === 0) {
87
+ throw renderShieldError("VERIFY_FAILED", `No prerendered pages found inside: ${cfg.output.outDir}/. Run: rendershield build`, { outDir: cfg.output.outDir });
88
+ }
89
+ const firstIndex = indexFiles[0];
85
90
  const routePath = indexHtmlPathToRoute(outDirAbs, firstIndex);
86
91
  const url = joinUrl(cfg.site.canonicalBase, routePath);
87
92
  const outputFile = path.relative(cwd, firstIndex);
@@ -92,6 +97,7 @@ Using:
92
97
  canonicalBase: ${cfg.site.canonicalBase}
93
98
  routePath: ${routePath}
94
99
  output file: ${outputFile}
100
+ pages in output: ${indexFiles.length} (showing first; use --all --check to validate all)
95
101
 
96
102
  Smoke tests:
97
103
 
@@ -106,17 +112,106 @@ Smoke tests:
106
112
 
107
113
  Expected: x-rendershield: bot-hit (proves Worker served prerender to bot).
108
114
  If debugHeaders enabled: X-Bot-Detected, X-Prerender, X-Final-Path.
115
+
116
+ Tip: rendershield verify --check validates built HTML without fetching production.
109
117
  `);
110
118
  return {
111
119
  mode: "local",
112
120
  canonicalBase: cfg.site.canonicalBase,
121
+ checked: false,
122
+ ok: true,
123
+ pages: [{ routePath, outputFile, url }],
124
+ };
125
+ }
126
+ async function runLocalCheckOne(cwd, cfg, outDirAbs, indexPath) {
127
+ const page = await checkLocalPage(cwd, outDirAbs, indexPath, cfg.site.canonicalBase);
128
+ const ok = page.contract?.ok ?? false;
129
+ console.log(`
130
+ RenderShield verify --check
131
+ Route: ${page.routePath}
132
+ File: ${page.outputFile}
133
+ Contract: ${ok ? "PASS" : "FAIL"}
134
+ ${!ok && page.contract ? page.contract.missing.map((m) => ` - ${m}`).join("\n") : ""}
135
+ `);
136
+ if (!ok) {
137
+ throw renderShieldError("VERIFY_FAILED", `Built HTML failed contract for ${page.routePath}. Missing: ${page.contract?.missing.join("; ")}`, { routePath: page.routePath, missing: page.contract?.missing });
138
+ }
139
+ return {
140
+ mode: "local",
141
+ canonicalBase: cfg.site.canonicalBase,
142
+ checked: true,
143
+ ok: true,
144
+ pages: [page],
145
+ };
146
+ }
147
+ async function runLocalCheckAll(cwd, cfg, outDirAbs, indexFiles) {
148
+ const pages = [];
149
+ const failures = [];
150
+ for (const indexPath of indexFiles) {
151
+ const page = await checkLocalPage(cwd, outDirAbs, indexPath, cfg.site.canonicalBase);
152
+ pages.push(page);
153
+ if (!page.contract?.ok) {
154
+ failures.push(`${page.routePath}: ${page.contract?.missing.join("; ") ?? "contract failed"}`);
155
+ }
156
+ }
157
+ console.log(`
158
+ RenderShield verify --all --check
159
+ Pages: ${pages.length}
160
+ ${pages
161
+ .map((p) => ` ${p.contract?.ok ? "PASS" : "FAIL"} ${p.routePath}`)
162
+ .join("\n")}
163
+ `);
164
+ if (failures.length > 0) {
165
+ throw renderShieldError("VERIFY_FAILED", `Built HTML failed contract on ${failures.length} page(s). ${failures.join(" | ")}`, { failures });
166
+ }
167
+ return {
168
+ mode: "local",
169
+ canonicalBase: cfg.site.canonicalBase,
170
+ checked: true,
171
+ ok: true,
172
+ pages,
173
+ };
174
+ }
175
+ async function checkLocalPage(cwd, outDirAbs, indexPath, canonicalBase) {
176
+ const html = await fs.readFile(indexPath, "utf8");
177
+ const routePath = indexHtmlPathToRoute(outDirAbs, indexPath);
178
+ const outputFile = path.relative(cwd, indexPath);
179
+ const contract = checkPrerenderContract(html, {
180
+ routePath,
181
+ outFile: outputFile,
182
+ });
183
+ return {
113
184
  routePath,
114
185
  outputFile,
115
- url,
186
+ url: joinUrl(canonicalBase, routePath),
187
+ contract,
116
188
  };
117
189
  }
118
- async function runVerifyProd(url) {
119
- const normalizedUrl = url.startsWith("http") ? url : `https://${url}`;
190
+ async function runVerifyProdAll(cfg, _cwd, outDirAbs, indexFiles) {
191
+ const pages = [];
192
+ const failures = [];
193
+ for (const indexPath of indexFiles) {
194
+ const routePath = indexHtmlPathToRoute(outDirAbs, indexPath);
195
+ const prodUrl = joinUrl(cfg.site.canonicalBase, routePath);
196
+ try {
197
+ const result = await fetchAndVerifyProd(prodUrl);
198
+ pages.push(result);
199
+ }
200
+ catch (err) {
201
+ const msg = err instanceof Error ? err.message : String(err);
202
+ failures.push(`${routePath}: ${msg}`);
203
+ }
204
+ }
205
+ console.log(`
206
+ RenderShield verify --prod --all
207
+ Checked ${pages.length} URL(s) from build output.
208
+ `);
209
+ if (failures.length > 0) {
210
+ throw renderShieldError("VERIFY_FAILED", `Production verify failed for ${failures.length} route(s). ${failures.join(" | ")}`, { failures });
211
+ }
212
+ return { mode: "prod", ok: true, pages };
213
+ }
214
+ async function fetchAndVerifyProd(normalizedUrl) {
120
215
  let botHtml;
121
216
  let humanHtml;
122
217
  let botStatus;
@@ -143,45 +238,42 @@ async function runVerifyProd(url) {
143
238
  const msg = err instanceof Error ? err.message : String(err);
144
239
  throw renderShieldError("VERIFY_FAILED", `verify --prod: failed to fetch ${normalizedUrl}. ${msg}`, { url: normalizedUrl });
145
240
  }
146
- // Prove routing: Worker must set x-rendershield: bot-hit for bot requests. No inference.
147
- const routingOk = xRenderShield === "bot-hit";
148
241
  if (xRenderShield === "bot-fallback") {
149
- throw renderShieldError("VERIFY_FAILED", `verify --prod: bot request received x-rendershield: bot-fallback. ` +
150
- `Prerender origin returned non-200; Worker fell back to SPA. Fix deployment or origin so bots get prerendered HTML.`, { url: normalizedUrl, xRenderShield });
242
+ throw renderShieldError("VERIFY_FAILED", `verify --prod: bot request received x-rendershield: bot-fallback for ${normalizedUrl}. ` +
243
+ `Prerender origin returned non-200; Worker fell back to SPA.`, { url: normalizedUrl, xRenderShield });
151
244
  }
152
- if (!routingOk) {
245
+ if (xRenderShield !== "bot-hit") {
153
246
  const hint = xRenderShield == null
154
- ? " If no Worker is deployed, use verify without --prod to check local/build output."
247
+ ? " If no Worker is deployed, use verify --check for local/build output."
155
248
  : "";
156
- throw renderShieldError("VERIFY_FAILED", `verify --prod: expected x-rendershield: bot-hit (proving Worker routed bot to prerender). ` +
157
- `Got: ${xRenderShield ?? "(missing)"}. Ensure the Worker is deployed and bound to this route.${hint}`, { url: normalizedUrl, xRenderShield });
249
+ throw renderShieldError("VERIFY_FAILED", `verify --prod: expected x-rendershield: bot-hit for ${normalizedUrl}. ` +
250
+ `Got: ${xRenderShield ?? "(missing)"}.${hint}`, { url: normalizedUrl, xRenderShield });
158
251
  }
159
252
  const contract = checkPrerenderContract(botHtml, {
160
253
  routePath: normalizedUrl,
161
254
  outFile: normalizedUrl,
162
255
  });
163
256
  const humanSpa = looksLikeSpaShell(humanHtml);
164
- // Report
165
257
  console.log(`
166
258
  RenderShield verify --prod
167
259
  URL: ${normalizedUrl}
168
260
 
169
261
  Fetch:
170
- Bot (Googlebot): ${botStatus} (${botHtml.length} bytes) x-rendershield: ${xRenderShield ?? "(none)"}
262
+ Bot (Googlebot): ${botStatus} (${botHtml.length} bytes) x-rendershield: ${xRenderShield}
171
263
  Human (Chrome): ${humanStatus} (${humanHtml.length} bytes)
172
264
 
173
- Routing: x-rendershield: bot-hit (Worker served prerendered HTML to bot)
265
+ Routing: x-rendershield: bot-hit
174
266
 
175
- Bot contract (title, meta, canonical, OG, JSON-LD, article):
176
- ${contract.ok ? "PASS — all required fields present." : "FAIL — missing or invalid:"}
267
+ Bot contract:
268
+ ${contract.ok ? "PASS" : "FAIL"}
177
269
  ${contract.missing.length > 0 ? contract.missing.map((m) => ` - ${m}`).join("\n") : ""}
178
270
 
179
271
  Human response:
180
- ${humanSpa.likely ? `Likely SPA shell: ${humanSpa.reason ?? "unknown"}` : "Has substantial content (not a minimal SPA shell)."}
272
+ ${humanSpa.likely ? `Likely SPA shell: ${humanSpa.reason ?? "unknown"}` : "Has substantial content."}
181
273
  `);
182
274
  if (!contract.ok) {
183
- throw renderShieldError("VERIFY_FAILED", `Production URL did not satisfy bot contract. Missing: ${contract.missing.join("; ")}`, { url: normalizedUrl, missing: contract.missing });
275
+ throw renderShieldError("VERIFY_FAILED", `Production URL did not satisfy bot contract: ${normalizedUrl}. Missing: ${contract.missing.join("; ")}`, { url: normalizedUrl, missing: contract.missing });
184
276
  }
185
- return { mode: "prod", url: normalizedUrl, contract };
277
+ return { url: normalizedUrl, contract };
186
278
  }
187
279
  //# sourceMappingURL=verify.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const DEFAULT_CONFIG_NAME = "rendershield.config.json";
2
+ export type CommandOptions = {
3
+ /** Relative to cwd, or absolute. Defaults to rendershield.config.json in cwd. */
4
+ configPath?: string;
5
+ };
6
+ export declare function resolveConfigFile(cwd: string, configPath?: string): string;
7
+ //# sourceMappingURL=configPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configPath.d.ts","sourceRoot":"","sources":["../src/configPath.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,6BAA6B,CAAC;AAE9D,MAAM,MAAM,cAAc,GAAG;IAC3B,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,UAAU,SAAsB,GAC/B,MAAM,CAIR"}
@@ -0,0 +1,8 @@
1
+ import path from "node:path";
2
+ export const DEFAULT_CONFIG_NAME = "rendershield.config.json";
3
+ export function resolveConfigFile(cwd, configPath = DEFAULT_CONFIG_NAME) {
4
+ return path.isAbsolute(configPath)
5
+ ? configPath
6
+ : path.join(cwd, configPath);
7
+ }
8
+ //# sourceMappingURL=configPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configPath.js","sourceRoot":"","sources":["../src/configPath.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AAO9D,MAAM,UAAU,iBAAiB,CAC/B,GAAW,EACX,UAAU,GAAG,mBAAmB;IAEhC,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAChC,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AACjC,CAAC"}
@@ -54,7 +54,7 @@ export default {
54
54
  return out;
55
55
  }
56
56
 
57
- const origin = ${JSON.stringify(cfg.worker.lovableOrigin)};
57
+ const origin = ${JSON.stringify(cfg.worker.spaOrigin)};
58
58
  const finalPath = toIndexHtml(url.pathname);
59
59
  const originUrl = origin + finalPath + url.search;
60
60
 
@@ -1 +1 @@
1
- {"version":3,"file":"generateWorker.js","sourceRoot":"","sources":["../../src/core/generateWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,IAAI,OAAO,GAAG,OAAO,CAAC;AACtB,IAAI,CAAC;IACH,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAyB,CAAC;IAClE,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;AACnC,CAAC;AAAC,MAAM,CAAC;IACP,OAAO,GAAG,SAAS,CAAC;AACtB,CAAC;AAED,SAAS,aAAa,CAAC,GAAa;IAClC,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAuB;IACtD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC;IAElD,OAAO;sCAC6B,OAAO;;;;yBAIpB,aAAa,CAAC,QAAQ,CAAC;wBACxB,aAAa,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAkC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;;;;;;;;;;;;;;;UAerD,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;;2DAEuB,CAAC,CAAC,CAAC,EAAE;;;;;;QAMxD,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;;kDAEgB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;CAUtD,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"generateWorker.js","sourceRoot":"","sources":["../../src/core/generateWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,IAAI,OAAO,GAAG,OAAO,CAAC;AACtB,IAAI,CAAC;IACH,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAyB,CAAC;IAClE,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;AACnC,CAAC;AAAC,MAAM,CAAC;IACP,OAAO,GAAG,SAAS,CAAC;AACtB,CAAC;AAED,SAAS,aAAa,CAAC,GAAa;IAClC,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAuB;IACtD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC;IAElD,OAAO;sCAC6B,OAAO;;;;yBAIpB,aAAa,CAAC,QAAQ,CAAC;wBACxB,aAAa,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAkC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;;;;;;;;;;;;;;;UAejD,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;;2DAEuB,CAAC,CAAC,CAAC,EAAE;;;;;;QAMxD,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;;kDAEgB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;CAUtD,CAAC;AACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** All routed index.html files under outDir (excludes bare outDir/index.html). */
2
+ export declare function listPrerenderIndexFiles(outDirAbs: string): Promise<string[]>;
3
+ export declare function indexHtmlPathToRoute(outDirAbs: string, indexPathAbs: string): string;
4
+ //# sourceMappingURL=listOutputRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listOutputRoutes.d.ts","sourceRoot":"","sources":["../../src/core/listOutputRoutes.ts"],"names":[],"mappings":"AAGA,kFAAkF;AAClF,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,EAAE,CAAC,CAkCnB;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,MAAM,CAKR"}
@@ -0,0 +1,40 @@
1
+ import fs from "fs-extra";
2
+ import path from "node:path";
3
+ /** All routed index.html files under outDir (excludes bare outDir/index.html). */
4
+ export async function listPrerenderIndexFiles(outDirAbs) {
5
+ const results = [];
6
+ const stack = [outDirAbs];
7
+ while (stack.length > 0) {
8
+ const current = stack.pop();
9
+ let entries;
10
+ try {
11
+ entries = await fs.readdir(current, { withFileTypes: true });
12
+ }
13
+ catch {
14
+ continue;
15
+ }
16
+ entries.sort((a, b) => a.name.localeCompare(b.name));
17
+ for (const entry of entries) {
18
+ const full = path.join(current, entry.name);
19
+ if (entry.isDirectory()) {
20
+ stack.push(full);
21
+ continue;
22
+ }
23
+ if (entry.isFile() && entry.name.toLowerCase() === "index.html") {
24
+ const rel = path.relative(outDirAbs, full);
25
+ const parts = rel.split(path.sep).filter(Boolean);
26
+ if (parts.length >= 2)
27
+ results.push(full);
28
+ }
29
+ }
30
+ }
31
+ results.sort((a, b) => a.localeCompare(b));
32
+ return results;
33
+ }
34
+ export function indexHtmlPathToRoute(outDirAbs, indexPathAbs) {
35
+ const rel = path.relative(outDirAbs, indexPathAbs);
36
+ const noFile = rel.replace(/index\.html$/i, "");
37
+ const normalized = noFile.split(path.sep).join("/").replace(/\/+$/, "");
38
+ return "/" + normalized.replace(/^\/+/, "");
39
+ }
40
+ //# sourceMappingURL=listOutputRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listOutputRoutes.js","sourceRoot":"","sources":["../../src/core/listOutputRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAiB;IAEjB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAa,CAAC,SAAS,CAAC,CAAC;IAEpC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAY,CAAC;QAEtC,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAErD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,SAAS;YACX,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,YAAY,EAAE,CAAC;gBAChE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,YAAoB;IAEpB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxE,OAAO,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC"}
@@ -1,3 +1,5 @@
1
1
  import { RenderShieldConfig } from "../types.js";
2
- export declare function loadConfig(cwd?: string): Promise<RenderShieldConfig>;
2
+ import { DEFAULT_CONFIG_NAME, type CommandOptions } from "../configPath.js";
3
+ export declare function loadConfig(cwd?: string, options?: CommandOptions): Promise<RenderShieldConfig>;
4
+ export { DEFAULT_CONFIG_NAME };
3
5
  //# sourceMappingURL=loadConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loadConfig.d.ts","sourceRoot":"","sources":["../../src/core/loadConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAiC,MAAM,aAAa,CAAC;AAiHhF,wBAAsB,UAAU,CAC9B,GAAG,SAAgB,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAwF7B"}
1
+ {"version":3,"file":"loadConfig.d.ts","sourceRoot":"","sources":["../../src/core/loadConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAiC,MAAM,aAAa,CAAC;AAEhF,OAAO,EAEL,mBAAmB,EACnB,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAyI1B,wBAAsB,UAAU,CAC9B,GAAG,SAAgB,EACnB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,kBAAkB,CAAC,CA4E7B;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -2,17 +2,15 @@ import fs from "fs-extra";
2
2
  import path from "node:path";
3
3
  import { SCHEMA_TYPES } from "../types.js";
4
4
  import { renderShieldError } from "../errors.js";
5
- const CONFIG_NAME = "rendershield.config.json";
5
+ import { resolveConfigFile, DEFAULT_CONFIG_NAME, } from "../configPath.js";
6
6
  const DEFAULT_SITEMAP_PATH = "/sitemap.xml";
7
7
  const DEFAULT_ROBOTS_PATH = "/robots.txt";
8
8
  function isObject(v) {
9
9
  return typeof v === "object" && v !== null && !Array.isArray(v);
10
10
  }
11
11
  function coerceBoolFlag(parsed, key, defaultEnabled) {
12
- // If missing, provide defaults (keeps older configs from exploding)
13
12
  if (parsed?.[key] == null)
14
13
  return { enabled: defaultEnabled };
15
- // If present, validate shape
16
14
  const v = parsed[key];
17
15
  if (!isObject(v)) {
18
16
  throw renderShieldError("CONFIG_INVALID", `${key} must be an object like { "enabled": true }`);
@@ -23,39 +21,39 @@ function coerceBoolFlag(parsed, key, defaultEnabled) {
23
21
  }
24
22
  return { enabled };
25
23
  }
24
+ function readSpaOrigin(worker) {
25
+ const spa = worker.spaOrigin ?? worker.lovableOrigin;
26
+ return typeof spa === "string" && spa.trim() !== "" ? spa.trim() : undefined;
27
+ }
26
28
  /**
27
- * Worker config policy: strict mode.
28
- * When worker.enabled is true, all of lovableOrigin, rewriteRouteBases, and
29
- * botUserAgentPatterns are required and must be non-empty. No defaults are
30
- * supplied — build fails with a crisp error.
31
- * lovableOrigin: must be http: or https: only (no file:, javascript:, protocol-relative).
32
- * botUserAgentPatterns: substring match only (not regex); empty strings rejected to avoid overmatching.
29
+ * Worker config policy: strict mode when enabled.
30
+ * spaOrigin (or deprecated lovableOrigin) must be http(s).
33
31
  */
34
32
  function validateWorkerWhenEnabled(parsed) {
35
33
  const worker = parsed.worker;
36
- if (!worker?.lovableOrigin || typeof worker.lovableOrigin !== "string") {
37
- throw renderShieldError("CONFIG_INVALID", `worker.lovableOrigin is required when worker.enabled is true. Example: "https://your-site.lovable.app"`);
34
+ const spaOrigin = worker ? readSpaOrigin(worker) : undefined;
35
+ if (!spaOrigin) {
36
+ throw renderShieldError("CONFIG_INVALID", `worker.spaOrigin is required when worker.enabled is true. Example: "https://app.example.com" (lovableOrigin is accepted as a deprecated alias).`);
38
37
  }
39
38
  let url;
40
39
  try {
41
- url = new URL(worker.lovableOrigin);
40
+ url = new URL(spaOrigin);
42
41
  }
43
42
  catch {
44
- throw renderShieldError("CONFIG_INVALID", `worker.lovableOrigin must be a valid URL. Got: "${worker.lovableOrigin}"`);
43
+ throw renderShieldError("CONFIG_INVALID", `worker.spaOrigin must be a valid URL. Got: "${spaOrigin}"`);
45
44
  }
46
45
  const scheme = url.protocol.toLowerCase();
47
46
  if (scheme !== "http:" && scheme !== "https:") {
48
- throw renderShieldError("CONFIG_INVALID", `worker.lovableOrigin must use http or https. Got: "${url.protocol}"`);
47
+ throw renderShieldError("CONFIG_INVALID", `worker.spaOrigin must use http or https. Got: "${url.protocol}"`);
49
48
  }
50
- if (!Array.isArray(worker.rewriteRouteBases) ||
49
+ if (!Array.isArray(worker?.rewriteRouteBases) ||
51
50
  worker.rewriteRouteBases.length === 0) {
52
51
  throw renderShieldError("CONFIG_INVALID", `worker.rewriteRouteBases must be a non-empty array when worker.enabled is true. Example: ["/blog/"]`);
53
52
  }
54
- if (!Array.isArray(worker.botUserAgentPatterns) ||
53
+ if (!Array.isArray(worker?.botUserAgentPatterns) ||
55
54
  worker.botUserAgentPatterns.length === 0) {
56
55
  throw renderShieldError("CONFIG_INVALID", `worker.botUserAgentPatterns must be a non-empty array when worker.enabled is true. Example: ["googlebot", "bingbot"]`);
57
56
  }
58
- // Substring match only; empty string would match every User-Agent
59
57
  for (let i = 0; i < worker.botUserAgentPatterns.length; i++) {
60
58
  const p = worker.botUserAgentPatterns[i];
61
59
  if (typeof p !== "string" || p.trim() === "") {
@@ -63,21 +61,42 @@ function validateWorkerWhenEnabled(parsed) {
63
61
  }
64
62
  }
65
63
  }
66
- export async function loadConfig(cwd = process.cwd()) {
67
- const p = path.join(cwd, CONFIG_NAME);
68
- const exists = await fs.pathExists(p);
64
+ function normalizeWorker(parsed, enabled) {
65
+ if (!enabled) {
66
+ parsed.worker = {
67
+ enabled: false,
68
+ spaOrigin: "",
69
+ rewriteRouteBases: [],
70
+ botUserAgentPatterns: [],
71
+ debugHeaders: false,
72
+ };
73
+ return;
74
+ }
75
+ validateWorkerWhenEnabled(parsed);
76
+ const worker = parsed.worker;
77
+ parsed.worker = {
78
+ enabled: true,
79
+ spaOrigin: readSpaOrigin(worker),
80
+ rewriteRouteBases: worker.rewriteRouteBases,
81
+ botUserAgentPatterns: worker.botUserAgentPatterns,
82
+ debugHeaders: worker.debugHeaders === true,
83
+ };
84
+ }
85
+ export async function loadConfig(cwd = process.cwd(), options) {
86
+ const configFile = resolveConfigFile(cwd, options?.configPath);
87
+ const configName = path.basename(configFile);
88
+ const exists = await fs.pathExists(configFile);
69
89
  if (!exists) {
70
- throw renderShieldError("CONFIG_MISSING", `Missing ${CONFIG_NAME}. Run: rendershield init`);
90
+ throw renderShieldError("CONFIG_MISSING", `Missing ${configName}. Run: rendershield init`);
71
91
  }
72
- const raw = await fs.readFile(p, "utf8");
92
+ const raw = await fs.readFile(configFile, "utf8");
73
93
  let parsed;
74
94
  try {
75
95
  parsed = JSON.parse(raw);
76
96
  }
77
97
  catch {
78
- throw renderShieldError("CONFIG_INVALID", `${CONFIG_NAME} is not valid JSON`);
98
+ throw renderShieldError("CONFIG_INVALID", `${configName} is not valid JSON`);
79
99
  }
80
- // Minimal validation (v0)
81
100
  if (parsed?.version !== 1) {
82
101
  throw renderShieldError("CONFIG_INVALID", "Config version must be 1");
83
102
  }
@@ -104,7 +123,6 @@ export async function loadConfig(cwd = process.cwd()) {
104
123
  throw renderShieldError("CONFIG_INVALID", "output.outDir is required");
105
124
  }
106
125
  parsed.content.markdown.collections = normalizeCollections(parsed.content.markdown.collections);
107
- // Validate + default these optional sections (preserve path so it is not lost)
108
126
  const sitemapFlag = coerceBoolFlag(parsed, "sitemap", true);
109
127
  const sitemapObj = parsed.sitemap;
110
128
  const sitemapPathVal = sitemapObj?.path;
@@ -120,21 +138,10 @@ export async function loadConfig(cwd = process.cwd()) {
120
138
  : DEFAULT_ROBOTS_PATH;
121
139
  parsed.robots = { enabled: robotsFlag.enabled, path: robotsPath };
122
140
  const workerFlag = coerceBoolFlag(parsed, "worker", true);
123
- if (workerFlag.enabled) {
124
- validateWorkerWhenEnabled(parsed);
125
- // Keep parsed.worker as the full object from JSON (already validated)
126
- }
127
- else {
128
- parsed.worker = {
129
- enabled: false,
130
- lovableOrigin: "",
131
- rewriteRouteBases: [],
132
- botUserAgentPatterns: [],
133
- debugHeaders: false,
134
- };
135
- }
141
+ normalizeWorker(parsed, workerFlag.enabled);
136
142
  return parsed;
137
143
  }
144
+ export { DEFAULT_CONFIG_NAME };
138
145
  function normalizeCollections(collections) {
139
146
  return collections.map((raw, index) => {
140
147
  if (!isObject(raw)) {