@lownoise-studio/rendershield 0.3.1 → 1.0.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 (66) hide show
  1. package/CHANGELOG.md +58 -32
  2. package/CONTRIBUTING.md +41 -0
  3. package/README.md +209 -144
  4. package/SECURITY.md +25 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +27 -19
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands/build.d.ts +2 -0
  10. package/dist/commands/build.d.ts.map +1 -0
  11. package/dist/commands/build.js +10 -9
  12. package/dist/commands/build.js.map +1 -1
  13. package/dist/commands/init.d.ts +2 -0
  14. package/dist/commands/init.d.ts.map +1 -0
  15. package/dist/commands/verify.d.ts +19 -0
  16. package/dist/commands/verify.d.ts.map +1 -0
  17. package/dist/commands/verify.js +57 -64
  18. package/dist/commands/verify.js.map +1 -1
  19. package/dist/core/generateRobots.d.ts +3 -0
  20. package/dist/core/generateRobots.d.ts.map +1 -0
  21. package/dist/core/generateSitemap.d.ts +3 -0
  22. package/dist/core/generateSitemap.d.ts.map +1 -0
  23. package/dist/core/generateWorker.d.ts +3 -0
  24. package/dist/core/generateWorker.d.ts.map +1 -0
  25. package/dist/core/generateWorker.js +75 -75
  26. package/dist/core/loadConfig.d.ts +3 -0
  27. package/dist/core/loadConfig.d.ts.map +1 -0
  28. package/dist/core/loadConfig.js +68 -25
  29. package/dist/core/loadConfig.js.map +1 -1
  30. package/dist/core/loadMarkdown.d.ts +3 -0
  31. package/dist/core/loadMarkdown.d.ts.map +1 -0
  32. package/dist/core/loadMarkdown.js +4 -3
  33. package/dist/core/loadMarkdown.js.map +1 -1
  34. package/dist/core/renderHtml.d.ts +3 -0
  35. package/dist/core/renderHtml.d.ts.map +1 -0
  36. package/dist/core/renderHtml.js +25 -10
  37. package/dist/core/renderHtml.js.map +1 -1
  38. package/dist/core/validateOutput.d.ts +28 -0
  39. package/dist/core/validateOutput.d.ts.map +1 -0
  40. package/dist/core/validateOutput.js +7 -1
  41. package/dist/core/validateOutput.js.map +1 -1
  42. package/dist/errors.d.ts +14 -0
  43. package/dist/errors.d.ts.map +1 -0
  44. package/dist/errors.js +24 -0
  45. package/dist/errors.js.map +1 -0
  46. package/dist/index.d.ts +20 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +19 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/types.d.ts +53 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +1 -1
  53. package/dist/types.js.map +1 -1
  54. package/docs/deploy-cloudflare.md +40 -14
  55. package/package.json +24 -2
  56. package/src/cli.ts +86 -75
  57. package/src/commands/build.ts +199 -185
  58. package/src/commands/verify.ts +266 -236
  59. package/src/core/generateWorker.ts +97 -97
  60. package/src/core/loadConfig.ts +261 -173
  61. package/src/core/loadMarkdown.ts +9 -3
  62. package/src/core/renderHtml.ts +36 -12
  63. package/src/core/validateOutput.ts +335 -328
  64. package/src/errors.ts +48 -0
  65. package/src/index.ts +40 -0
  66. package/src/types.ts +4 -1
@@ -7,6 +7,7 @@ import { generateSitemapXml } from "../core/generateSitemap.js";
7
7
  import { generateRobotsTxt } from "../core/generateRobots.js";
8
8
  import { generateWorkerJs } from "../core/generateWorker.js";
9
9
  import { validatePrerenderHtml } from "../core/validateOutput.js";
10
+ import { renderShieldError } from "../errors.js";
10
11
  function routeToOutDir(outDirAbs, routePath) {
11
12
  // /blog/slug -> outDir/blog/slug/index.html
12
13
  const clean = routePath.replace(/^\//, "");
@@ -27,7 +28,7 @@ async function validateOutputPath(outDir, cwd) {
27
28
  }
28
29
  catch (err) {
29
30
  const msg = err instanceof Error ? err.message : String(err);
30
- throw new Error(`Cannot resolve project root: ${cwdAbs}. ${msg}`);
31
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Cannot resolve project root: ${cwdAbs}. ${msg}`);
31
32
  }
32
33
  const outDirAbs = path.resolve(cwdAbs, outDir);
33
34
  // Order: realpath → normalize → then case-fold for comparisons
@@ -37,18 +38,18 @@ async function validateOutputPath(outDir, cwd) {
37
38
  // rarely returns absolute on Windows; startsWith("..") and path.isAbsolute(rel) cover escapes.
38
39
  const relative = path.relative(normalizedCwd, normalizedOut);
39
40
  if (relative.startsWith("..") || relative === ".." || path.isAbsolute(relative)) {
40
- throw new Error(`Output directory "${outDir}" resolves outside project root. Use a relative path within the project.`);
41
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Output directory "${outDir}" resolves outside project root. Use a relative path within the project.`);
41
42
  }
42
43
  // Reject: root filesystem (/, C:\, C:/) — early reject; real safety is "inside root" above
43
44
  const rootPaths = ["/", "c:\\", "c:/"];
44
45
  const outLower = normalizedOut.toLowerCase();
45
46
  if (rootPaths.includes(outLower)) {
46
- throw new Error(`Output directory "${outDir}" resolves to root filesystem. This is not allowed for safety.`);
47
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Output directory "${outDir}" resolves to root filesystem. This is not allowed for safety.`);
47
48
  }
48
49
  // Reject: output dir equals project root (would delete entire project). Case-fold after normalize.
49
50
  const cwdLower = normalizedCwd.toLowerCase();
50
51
  if (outLower === cwdLower) {
51
- throw new Error(`Output directory "${outDir}" cannot be the project root. Use a subdirectory (e.g. dist-prerender).`);
52
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Output directory "${outDir}" cannot be the project root. Use a subdirectory (e.g. dist-prerender).`);
52
53
  }
53
54
  if (await fs.pathExists(outDirAbs)) {
54
55
  // Path exists: resolve symlinks and ensure real path is inside root
@@ -62,7 +63,7 @@ async function validateOutputPath(outDir, cwd) {
62
63
  const outDirRealNorm = path.normalize(outDirReal);
63
64
  const relativeReal = path.relative(normalizedCwd, outDirRealNorm);
64
65
  if (relativeReal.startsWith("..") || relativeReal === ".." || path.isAbsolute(relativeReal)) {
65
- throw new Error(`Output directory "${outDir}" resolves (via symlink) outside project root. Use a path that does not escape the project.`);
66
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Output directory "${outDir}" resolves (via symlink) outside project root. Use a path that does not escape the project.`);
66
67
  }
67
68
  }
68
69
  else {
@@ -85,11 +86,11 @@ async function validateOutputPath(outDir, cwd) {
85
86
  // Nearest existing parent is filesystem root → outside project, reject
86
87
  const parentLower = parentRealNorm.toLowerCase();
87
88
  if (rootPaths.includes(parentLower)) {
88
- throw new Error(`Output directory "${outDir}" has a parent that resolves to filesystem root. Use a path inside the project.`);
89
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Output directory "${outDir}" has a parent that resolves to filesystem root. Use a path inside the project.`);
89
90
  }
90
91
  const relParent = path.relative(normalizedCwd, parentRealNorm);
91
92
  if (relParent.startsWith("..") || relParent === ".." || path.isAbsolute(relParent)) {
92
- throw new Error(`Output directory "${outDir}" has a parent that resolves (via symlink) outside project root. Use a path that does not escape the project.`);
93
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Output directory "${outDir}" has a parent that resolves (via symlink) outside project root. Use a path that does not escape the project.`);
93
94
  }
94
95
  foundParentInsideRoot = true;
95
96
  break;
@@ -101,7 +102,7 @@ async function validateOutputPath(outDir, cwd) {
101
102
  }
102
103
  if (!foundParentInsideRoot) {
103
104
  // No existing parent found before hitting dirname loop stop (shouldn't happen on a normal FS)
104
- throw new Error(`Output directory "${outDir}" could not be validated: no existing parent path found. Use a path inside the project.`);
105
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Output directory "${outDir}" could not be validated: no existing parent path found. Use a path inside the project.`);
105
106
  }
106
107
  }
107
108
  }
@@ -115,7 +116,7 @@ export async function cmdBuild(cwd = process.cwd()) {
115
116
  await fs.ensureDir(outDirAbs);
116
117
  const docs = await loadAllMarkdownDocs(cfg, cwd);
117
118
  if (docs.length === 0) {
118
- throw new Error("No markdown documents found. Check content paths/patterns.");
119
+ throw renderShieldError("BUILD_FAILED", "No markdown documents found. Check content paths/patterns.");
119
120
  }
120
121
  // Generate pages (validate BEFORE writing)
121
122
  for (const doc of docs) {
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdInit(cwd?: string): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA8EA,wBAAsB,OAAO,CAAC,GAAG,SAAgB,iBAiChD"}
@@ -0,0 +1,19 @@
1
+ import { type ContractCheckResult } from "../core/validateOutput.js";
2
+ export type VerifyProdOptions = {
3
+ prodUrl: string;
4
+ };
5
+ export type VerifyLocalResult = {
6
+ mode: "local";
7
+ canonicalBase: string;
8
+ routePath: string;
9
+ outputFile: string;
10
+ url: string;
11
+ };
12
+ export type VerifyProdResult = {
13
+ mode: "prod";
14
+ url: string;
15
+ contract: ContractCheckResult;
16
+ };
17
+ export type VerifyResult = VerifyLocalResult | VerifyProdResult;
18
+ export declare function cmdVerify(cwd?: string, options?: VerifyProdOptions): Promise<VerifyResult>;
19
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,2BAA2B,CAAC;AAkFnC,MAAM,MAAM,iBAAiB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,mBAAmB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAEhE,wBAAsB,SAAS,CAC7B,GAAG,SAAgB,EACnB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,YAAY,CAAC,CA8DvB"}
@@ -1,7 +1,8 @@
1
1
  import fs from "fs-extra";
2
2
  import path from "node:path";
3
3
  import { loadConfig } from "../core/loadConfig.js";
4
- import { checkPrerenderContract } from "../core/validateOutput.js";
4
+ import { checkPrerenderContract, } from "../core/validateOutput.js";
5
+ import { renderShieldError } from "../errors.js";
5
6
  function joinUrl(base, routePath) {
6
7
  const b = base.endsWith("/") ? base.slice(0, -1) : base;
7
8
  const p = routePath.startsWith("/") ? routePath : `/${routePath}`;
@@ -69,59 +70,50 @@ function looksLikeSpaShell(html) {
69
70
  }
70
71
  export async function cmdVerify(cwd = process.cwd(), options) {
71
72
  if (options?.prodUrl) {
72
- await runVerifyProd(options.prodUrl);
73
- return;
73
+ return runVerifyProd(options.prodUrl);
74
74
  }
75
75
  const cfg = await loadConfig(cwd);
76
76
  const outDirAbs = path.join(cwd, cfg.output.outDir);
77
77
  const exists = await fs.pathExists(outDirAbs);
78
78
  if (!exists) {
79
- console.log(`
80
- RenderShield verify
81
-
82
- No prerender output directory found: ${cfg.output.outDir}/
83
-
84
- Run:
85
- node dist/cli.js build
86
- `);
87
- return;
79
+ throw renderShieldError("VERIFY_FAILED", `No prerender output directory found: ${cfg.output.outDir}/. Run: rendershield build`, { outDir: cfg.output.outDir });
88
80
  }
89
81
  const firstIndex = await findFirstIndexHtml(outDirAbs);
90
82
  if (!firstIndex) {
91
- console.log(`
92
- RenderShield verify
93
-
94
- No prerendered pages found inside: ${cfg.output.outDir}/
95
-
96
- Run:
97
- node dist/cli.js build
98
- `);
99
- return;
83
+ throw renderShieldError("VERIFY_FAILED", `No prerendered pages found inside: ${cfg.output.outDir}/. Run: rendershield build`, { outDir: cfg.output.outDir });
100
84
  }
101
85
  const routePath = indexHtmlPathToRoute(outDirAbs, firstIndex);
102
86
  const url = joinUrl(cfg.site.canonicalBase, routePath);
103
- console.log(`
104
- RenderShield verify
105
-
106
- Using:
107
- canonicalBase: ${cfg.site.canonicalBase}
108
- routePath: ${routePath}
109
- output file: ${path.relative(cwd, firstIndex)}
110
-
111
- Smoke tests:
112
-
113
- 1) Human (usually SPA shell):
114
- curl -s ${url} | grep -i "<title>"
115
-
116
- 2) Bot (should see prerendered, route-specific title):
117
- curl -s -H "User-Agent: Googlebot" ${url} | grep -i "<title>"
118
-
119
- 3) Debug headers (Worker must be routed + proxy ON):
120
- curl -I -H "User-Agent: GPTBot" ${url}
121
-
122
- Expected: x-rendershield: bot-hit (proves Worker served prerender to bot).
123
- If debugHeaders enabled: X-Bot-Detected, X-Prerender, X-Final-Path.
87
+ const outputFile = path.relative(cwd, firstIndex);
88
+ console.log(`
89
+ RenderShield verify
90
+
91
+ Using:
92
+ canonicalBase: ${cfg.site.canonicalBase}
93
+ routePath: ${routePath}
94
+ output file: ${outputFile}
95
+
96
+ Smoke tests:
97
+
98
+ 1) Human (usually SPA shell):
99
+ curl -s ${url} | grep -i "<title>"
100
+
101
+ 2) Bot (should see prerendered, route-specific title):
102
+ curl -s -H "User-Agent: Googlebot" ${url} | grep -i "<title>"
103
+
104
+ 3) Debug headers (Worker must be routed + proxy ON):
105
+ curl -I -H "User-Agent: GPTBot" ${url}
106
+
107
+ Expected: x-rendershield: bot-hit (proves Worker served prerender to bot).
108
+ If debugHeaders enabled: X-Bot-Detected, X-Prerender, X-Final-Path.
124
109
  `);
110
+ return {
111
+ mode: "local",
112
+ canonicalBase: cfg.site.canonicalBase,
113
+ routePath,
114
+ outputFile,
115
+ url,
116
+ };
125
117
  }
126
118
  async function runVerifyProd(url) {
127
119
  const normalizedUrl = url.startsWith("http") ? url : `https://${url}`;
@@ -149,20 +141,20 @@ async function runVerifyProd(url) {
149
141
  }
150
142
  catch (err) {
151
143
  const msg = err instanceof Error ? err.message : String(err);
152
- throw new Error(`RenderShield verify --prod: failed to fetch ${normalizedUrl}. ${msg}`);
144
+ throw renderShieldError("VERIFY_FAILED", `verify --prod: failed to fetch ${normalizedUrl}. ${msg}`, { url: normalizedUrl });
153
145
  }
154
146
  // Prove routing: Worker must set x-rendershield: bot-hit for bot requests. No inference.
155
147
  const routingOk = xRenderShield === "bot-hit";
156
148
  if (xRenderShield === "bot-fallback") {
157
- throw new Error(`RenderShield verify --prod: bot request received x-rendershield: bot-fallback. ` +
158
- `Prerender origin returned non-200; Worker fell back to SPA. Fix deployment or origin so bots get prerendered HTML.`);
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 });
159
151
  }
160
152
  if (!routingOk) {
161
153
  const hint = xRenderShield == null
162
154
  ? " If no Worker is deployed, use verify without --prod to check local/build output."
163
155
  : "";
164
- throw new Error(`RenderShield verify --prod: expected x-rendershield: bot-hit (proving Worker routed bot to prerender). ` +
165
- `Got: ${xRenderShield ?? "(missing)"}. Ensure the Worker is deployed and bound to this route.${hint}`);
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 });
166
158
  }
167
159
  const contract = checkPrerenderContract(botHtml, {
168
160
  routePath: normalizedUrl,
@@ -170,25 +162,26 @@ async function runVerifyProd(url) {
170
162
  });
171
163
  const humanSpa = looksLikeSpaShell(humanHtml);
172
164
  // Report
173
- console.log(`
174
- RenderShield verify --prod
175
- URL: ${normalizedUrl}
176
-
177
- Fetch:
178
- Bot (Googlebot): ${botStatus} (${botHtml.length} bytes) x-rendershield: ${xRenderShield ?? "(none)"}
179
- Human (Chrome): ${humanStatus} (${humanHtml.length} bytes)
180
-
181
- Routing: x-rendershield: bot-hit (Worker served prerendered HTML to bot)
182
-
183
- Bot contract (title, meta, canonical, OG, JSON-LD, article):
184
- ${contract.ok ? "PASS — all required fields present." : "FAIL — missing or invalid:"}
185
- ${contract.missing.length > 0 ? contract.missing.map((m) => ` - ${m}`).join("\n") : ""}
186
-
187
- Human response:
188
- ${humanSpa.likely ? `Likely SPA shell: ${humanSpa.reason ?? "unknown"}` : "Has substantial content (not a minimal SPA shell)."}
165
+ console.log(`
166
+ RenderShield verify --prod
167
+ URL: ${normalizedUrl}
168
+
169
+ Fetch:
170
+ Bot (Googlebot): ${botStatus} (${botHtml.length} bytes) x-rendershield: ${xRenderShield ?? "(none)"}
171
+ Human (Chrome): ${humanStatus} (${humanHtml.length} bytes)
172
+
173
+ Routing: x-rendershield: bot-hit (Worker served prerendered HTML to bot)
174
+
175
+ Bot contract (title, meta, canonical, OG, JSON-LD, article):
176
+ ${contract.ok ? "PASS — all required fields present." : "FAIL — missing or invalid:"}
177
+ ${contract.missing.length > 0 ? contract.missing.map((m) => ` - ${m}`).join("\n") : ""}
178
+
179
+ Human response:
180
+ ${humanSpa.likely ? `Likely SPA shell: ${humanSpa.reason ?? "unknown"}` : "Has substantial content (not a minimal SPA shell)."}
189
181
  `);
190
182
  if (!contract.ok) {
191
- throw new Error(`Production URL did not satisfy bot contract. Missing: ${contract.missing.join("; ")}`);
183
+ throw renderShieldError("VERIFY_FAILED", `Production URL did not satisfy bot contract. Missing: ${contract.missing.join("; ")}`, { url: normalizedUrl, missing: contract.missing });
192
184
  }
185
+ return { mode: "prod", url: normalizedUrl, contract };
193
186
  }
194
187
  //# 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,3 @@
1
+ import { RenderShieldConfig } from "../types.js";
2
+ export declare function generateRobotsTxt(cfg: RenderShieldConfig): string;
3
+ //# sourceMappingURL=generateRobots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateRobots.d.ts","sourceRoot":"","sources":["../../src/core/generateRobots.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAejE"}
@@ -0,0 +1,3 @@
1
+ import { MarkdownDoc, RenderShieldConfig } from "../types.js";
2
+ export declare function generateSitemapXml(cfg: RenderShieldConfig, docs: MarkdownDoc[]): string;
3
+ //# sourceMappingURL=generateSitemap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateSitemap.d.ts","sourceRoot":"","sources":["../../src/core/generateSitemap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAiB9D,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,CAoBvF"}
@@ -0,0 +1,3 @@
1
+ import { RenderShieldConfig } from "../types.js";
2
+ export declare function generateWorkerJs(cfg: RenderShieldConfig): string;
3
+ //# sourceMappingURL=generateWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateWorker.d.ts","sourceRoot":"","sources":["../../src/core/generateWorker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAejD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAgFhE"}
@@ -14,81 +14,81 @@ function jsStringArray(arr) {
14
14
  export function generateWorkerJs(cfg) {
15
15
  const patterns = cfg.worker.botUserAgentPatterns.map((p) => p.toLowerCase());
16
16
  const rewriteBases = cfg.worker.rewriteRouteBases;
17
- return `/**
18
- * RenderShield Worker (generated) v${VERSION}
19
- * Serves prerendered /index.html to bots on selected route bases.
20
- */
21
-
22
- const BOT_SUBSTRINGS = ${jsStringArray(patterns)};
23
- const REWRITE_BASES = ${jsStringArray(rewriteBases)};
24
-
25
- function isBot(ua) {
26
- const s = (ua || "").toLowerCase();
27
- return BOT_SUBSTRINGS.some((sub) => s.includes(sub));
28
- }
29
-
30
- function shouldRewrite(pathname) {
31
- return REWRITE_BASES.some((base) => pathname.startsWith(base));
32
- }
33
-
34
- function toIndexHtml(pathname) {
35
- let p = pathname;
36
- if (!p.endsWith("/")) p += "/";
37
- return p + "index.html";
38
- }
39
-
40
- export default {
41
- async fetch(request, env, ctx) {
42
- const url = new URL(request.url);
43
- const ua = request.headers.get("User-Agent") || "";
44
- const bot = isBot(ua);
45
-
46
- const isGetLike = request.method === "GET" || request.method === "HEAD";
47
- const rewrite = bot && isGetLike && shouldRewrite(url.pathname);
48
-
49
- try {
50
- if (!rewrite) {
51
- const passResp = await fetch(request);
52
- const out = new Response(passResp.body, passResp);
53
- out.headers.set("x-rendershield", "pass-through");
54
- return out;
55
- }
56
-
57
- const origin = ${JSON.stringify(cfg.worker.lovableOrigin)};
58
- const finalPath = toIndexHtml(url.pathname);
59
- const originUrl = origin + finalPath + url.search;
60
-
61
- const headers = new Headers();
62
- headers.set("Accept", "text/html");
63
- headers.set("User-Agent", ua);
64
-
65
- const resp = await fetch(originUrl, { method: "GET", headers });
66
-
67
- if (!resp.ok) {
68
- const fallbackUrl = origin + url.pathname + url.search;
69
- const fb = await fetch(fallbackUrl, { method: "GET", headers });
70
- const out = new Response(fb.body, fb);
71
- out.headers.set("x-rendershield", "bot-fallback");
72
- ${cfg.worker.debugHeaders ? `out.headers.set("X-Bot-Detected", "true");
73
- out.headers.set("X-Prerender-Fallback", "true");
74
- out.headers.set("X-Requested-Path", url.pathname);` : ""}
75
- return out;
76
- }
77
-
78
- const out = new Response(resp.body, resp);
79
- out.headers.set("x-rendershield", "bot-hit");
80
- ${cfg.worker.debugHeaders ? `out.headers.set("X-Bot-Detected", "true");
81
- out.headers.set("X-Prerender", "true");
82
- out.headers.set("X-Final-Path", finalPath);` : ""}
83
- return out;
84
- } catch (err) {
85
- return new Response("Service temporarily unavailable.", {
86
- status: 500,
87
- headers: { "Content-Type": "text/plain; charset=utf-8" }
88
- });
89
- }
90
- }
91
- };
17
+ return `/**
18
+ * RenderShield Worker (generated) v${VERSION}
19
+ * Serves prerendered /index.html to bots on selected route bases.
20
+ */
21
+
22
+ const BOT_SUBSTRINGS = ${jsStringArray(patterns)};
23
+ const REWRITE_BASES = ${jsStringArray(rewriteBases)};
24
+
25
+ function isBot(ua) {
26
+ const s = (ua || "").toLowerCase();
27
+ return BOT_SUBSTRINGS.some((sub) => s.includes(sub));
28
+ }
29
+
30
+ function shouldRewrite(pathname) {
31
+ return REWRITE_BASES.some((base) => pathname.startsWith(base));
32
+ }
33
+
34
+ function toIndexHtml(pathname) {
35
+ let p = pathname;
36
+ if (!p.endsWith("/")) p += "/";
37
+ return p + "index.html";
38
+ }
39
+
40
+ export default {
41
+ async fetch(request, env, ctx) {
42
+ const url = new URL(request.url);
43
+ const ua = request.headers.get("User-Agent") || "";
44
+ const bot = isBot(ua);
45
+
46
+ const isGetLike = request.method === "GET" || request.method === "HEAD";
47
+ const rewrite = bot && isGetLike && shouldRewrite(url.pathname);
48
+
49
+ try {
50
+ if (!rewrite) {
51
+ const passResp = await fetch(request);
52
+ const out = new Response(passResp.body, passResp);
53
+ out.headers.set("x-rendershield", "pass-through");
54
+ return out;
55
+ }
56
+
57
+ const origin = ${JSON.stringify(cfg.worker.lovableOrigin)};
58
+ const finalPath = toIndexHtml(url.pathname);
59
+ const originUrl = origin + finalPath + url.search;
60
+
61
+ const headers = new Headers();
62
+ headers.set("Accept", "text/html");
63
+ headers.set("User-Agent", ua);
64
+
65
+ const resp = await fetch(originUrl, { method: "GET", headers });
66
+
67
+ if (!resp.ok) {
68
+ const fallbackUrl = origin + url.pathname + url.search;
69
+ const fb = await fetch(fallbackUrl, { method: "GET", headers });
70
+ const out = new Response(fb.body, fb);
71
+ out.headers.set("x-rendershield", "bot-fallback");
72
+ ${cfg.worker.debugHeaders ? `out.headers.set("X-Bot-Detected", "true");
73
+ out.headers.set("X-Prerender-Fallback", "true");
74
+ out.headers.set("X-Requested-Path", url.pathname);` : ""}
75
+ return out;
76
+ }
77
+
78
+ const out = new Response(resp.body, resp);
79
+ out.headers.set("x-rendershield", "bot-hit");
80
+ ${cfg.worker.debugHeaders ? `out.headers.set("X-Bot-Detected", "true");
81
+ out.headers.set("X-Prerender", "true");
82
+ out.headers.set("X-Final-Path", finalPath);` : ""}
83
+ return out;
84
+ } catch (err) {
85
+ return new Response("Service temporarily unavailable.", {
86
+ status: 500,
87
+ headers: { "Content-Type": "text/plain; charset=utf-8" }
88
+ });
89
+ }
90
+ }
91
+ };
92
92
  `;
93
93
  }
94
94
  //# sourceMappingURL=generateWorker.js.map
@@ -0,0 +1,3 @@
1
+ import { RenderShieldConfig } from "../types.js";
2
+ export declare function loadConfig(cwd?: string): Promise<RenderShieldConfig>;
3
+ //# sourceMappingURL=loadConfig.d.ts.map
@@ -0,0 +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"}