@lownoise-studio/rendershield 0.3.0 → 0.3.1
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/CHANGELOG.md +32 -0
- package/README.md +6 -0
- package/dist/cli.js +20 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.js +7 -7
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/verify.js +4 -1
- package/dist/commands/verify.js.map +1 -1
- package/dist/core/generateWorker.js +12 -2
- package/dist/core/generateWorker.js.map +1 -1
- package/dist/core/loadConfig.js +32 -16
- package/dist/core/loadConfig.js.map +1 -1
- package/dist/core/loadMarkdown.js.map +1 -1
- package/dist/core/renderHtml.js +5 -1
- package/dist/core/renderHtml.js.map +1 -1
- package/dist/core/validateOutput.js +2 -2
- package/dist/core/validateOutput.js.map +1 -1
- package/package.json +7 -3
- package/src/cli.ts +22 -7
- package/src/commands/init.ts +7 -7
- package/src/commands/verify.ts +4 -1
- package/src/core/generateWorker.ts +12 -2
- package/src/core/loadConfig.ts +52 -21
- package/src/core/loadMarkdown.ts +2 -2
- package/src/core/renderHtml.ts +5 -1
- package/src/core/validateOutput.ts +9 -6
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `verify --prod <url>`: production check that asserts `x-rendershield: bot-hit` and runs the same HTML contract validation as build.
|
|
13
|
+
- Worker response header `x-rendershield`: `bot-hit` | `bot-fallback` | `pass-through` so routing is observable without inferring from HTML.
|
|
14
|
+
- CLI `--version` / `-V`: prints version from package.json.
|
|
15
|
+
- Vitest test suite: contract validation, loadConfig (including sitemap/robots path preservation and worker validation), path safety, and integration build.
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- Config: sitemap and robots `path` are preserved and defaulted when only `enabled` is set; no longer lost when using boolean flags.
|
|
20
|
+
- Config: when `worker.enabled` is true, full worker object is kept (lovableOrigin, rewriteRouteBases, etc.) instead of being replaced by the flag.
|
|
21
|
+
- Worker: 500 error response body is generic ("Service temporarily unavailable.") to avoid leaking internals.
|
|
22
|
+
- JSON-LD in generated HTML: script body is no longer HTML-escaped so contract validation and crawlers can parse it.
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- Help text shows version and documents that `verify --prod` requires `x-rendershield: bot-hit`.
|
|
27
|
+
- TypeScript: reduced `any`; use `unknown` and typed interfaces in CLI, loadConfig, validateOutput, loadMarkdown.
|
|
28
|
+
- README: added "Production check" for `verify --prod`.
|
|
29
|
+
|
|
30
|
+
## [0.3.0] - 2025-02-18
|
|
31
|
+
|
|
32
|
+
- Initial npm release with init, build, verify, optional Cloudflare Worker, and HTML contract validation.
|
package/README.md
CHANGED
|
@@ -108,6 +108,12 @@ node dist/cli.js verify
|
|
|
108
108
|
|
|
109
109
|
This prints curl commands you can use to confirm crawler behavior.
|
|
110
110
|
|
|
111
|
+
**Production check:** After deploying the Worker, run:
|
|
112
|
+
|
|
113
|
+
`rendershield verify --prod https://your-domain.com`
|
|
114
|
+
|
|
115
|
+
This fetches the URL as a bot and asserts the response has `x-rendershield: bot-hit` (proving the Worker served prerendered HTML). If the header is missing or `bot-fallback`, the command fails.
|
|
116
|
+
|
|
111
117
|
---
|
|
112
118
|
|
|
113
119
|
## Deployment
|
package/dist/cli.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from "node:module";
|
|
2
3
|
import { cmdInit } from "./commands/init.js";
|
|
3
4
|
import { cmdBuild } from "./commands/build.js";
|
|
4
5
|
import { cmdVerify } from "./commands/verify.js";
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
const pkg = require("../package.json");
|
|
8
|
+
const VERSION = pkg.version ?? "0.0.0";
|
|
5
9
|
function printHelp() {
|
|
6
10
|
console.log(`
|
|
7
|
-
RenderShield
|
|
11
|
+
RenderShield v${VERSION} — boring bot-aware prerendering.
|
|
8
12
|
|
|
9
13
|
Usage:
|
|
10
14
|
rendershield init
|
|
@@ -13,6 +17,7 @@ Usage:
|
|
|
13
17
|
|
|
14
18
|
verify Print curl commands for local/build output.
|
|
15
19
|
verify --prod Fetch URL as bot and human; verify bot sees full HTML and contract fields.
|
|
20
|
+
Requires x-rendershield: bot-hit from the Worker.
|
|
16
21
|
|
|
17
22
|
Notes:
|
|
18
23
|
- Config file: rendershield.config.json
|
|
@@ -21,11 +26,16 @@ Notes:
|
|
|
21
26
|
`);
|
|
22
27
|
}
|
|
23
28
|
async function main() {
|
|
24
|
-
const
|
|
29
|
+
const args = process.argv.slice(2);
|
|
30
|
+
const cmd = args[0]?.trim();
|
|
25
31
|
if (!cmd || cmd === "-h" || cmd === "--help") {
|
|
26
32
|
printHelp();
|
|
27
33
|
process.exit(0);
|
|
28
34
|
}
|
|
35
|
+
if (cmd === "-V" || cmd === "--version") {
|
|
36
|
+
console.log(VERSION);
|
|
37
|
+
process.exit(0);
|
|
38
|
+
}
|
|
29
39
|
try {
|
|
30
40
|
if (cmd === "init") {
|
|
31
41
|
await cmdInit();
|
|
@@ -36,9 +46,13 @@ async function main() {
|
|
|
36
46
|
return;
|
|
37
47
|
}
|
|
38
48
|
if (cmd === "verify") {
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
49
|
+
const verifyArgs = args.slice(1);
|
|
50
|
+
if (verifyArgs.includes("-h") || verifyArgs.includes("--help")) {
|
|
51
|
+
printHelp();
|
|
52
|
+
process.exit(0);
|
|
53
|
+
}
|
|
54
|
+
const prodIdx = verifyArgs.indexOf("--prod");
|
|
55
|
+
const prodUrl = prodIdx >= 0 && verifyArgs[prodIdx + 1] ? verifyArgs[prodIdx + 1].trim() : undefined;
|
|
42
56
|
await cmdVerify(undefined, prodUrl ? { prodUrl } : undefined);
|
|
43
57
|
return;
|
|
44
58
|
}
|
|
@@ -47,7 +61,7 @@ async function main() {
|
|
|
47
61
|
process.exit(1);
|
|
48
62
|
}
|
|
49
63
|
catch (err) {
|
|
50
|
-
const msg = err
|
|
64
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
51
65
|
console.error(`\nRenderShield error: ${msg}\n`);
|
|
52
66
|
process.exit(1);
|
|
53
67
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -14,9 +14,9 @@ const DEFAULT_CONFIG = {
|
|
|
14
14
|
baseDir: "content",
|
|
15
15
|
collections: [
|
|
16
16
|
{
|
|
17
|
-
name: "
|
|
18
|
-
pattern: "
|
|
19
|
-
routeBase: "/
|
|
17
|
+
name: "blog",
|
|
18
|
+
pattern: "blog/**/*.md",
|
|
19
|
+
routeBase: "/blog",
|
|
20
20
|
schemaType: "Article"
|
|
21
21
|
}
|
|
22
22
|
]
|
|
@@ -37,7 +37,7 @@ const DEFAULT_CONFIG = {
|
|
|
37
37
|
worker: {
|
|
38
38
|
enabled: true,
|
|
39
39
|
lovableOrigin: "https://YOUR_SITE.lovable.app",
|
|
40
|
-
rewriteRouteBases: ["/
|
|
40
|
+
rewriteRouteBases: ["/blog/"],
|
|
41
41
|
botUserAgentPatterns: [
|
|
42
42
|
"googlebot",
|
|
43
43
|
"bingbot",
|
|
@@ -73,7 +73,7 @@ That's the whole trick.
|
|
|
73
73
|
`;
|
|
74
74
|
export async function cmdInit(cwd = process.cwd()) {
|
|
75
75
|
const configPath = path.join(cwd, CONFIG_NAME);
|
|
76
|
-
const contentDir = path.join(cwd, "content", "
|
|
76
|
+
const contentDir = path.join(cwd, "content", "blog");
|
|
77
77
|
const samplePath = path.join(contentDir, "hello-world.md");
|
|
78
78
|
const configExists = await fs.pathExists(configPath);
|
|
79
79
|
if (!configExists) {
|
|
@@ -87,7 +87,7 @@ export async function cmdInit(cwd = process.cwd()) {
|
|
|
87
87
|
const sampleExists = await fs.pathExists(samplePath);
|
|
88
88
|
if (!sampleExists) {
|
|
89
89
|
await fs.writeFile(samplePath, SAMPLE_POST, "utf8");
|
|
90
|
-
console.log(`Created sample content: content/
|
|
90
|
+
console.log(`Created sample content: content/blog/hello-world.md`);
|
|
91
91
|
}
|
|
92
92
|
else {
|
|
93
93
|
console.log(`Sample content already exists (leaving it alone)`);
|
|
@@ -95,7 +95,7 @@ export async function cmdInit(cwd = process.cwd()) {
|
|
|
95
95
|
console.log(`
|
|
96
96
|
Next:
|
|
97
97
|
1) Edit rendershield.config.json
|
|
98
|
-
2) Add content under content/
|
|
98
|
+
2) Add content under content/blog/
|
|
99
99
|
3) Run: rendershield build
|
|
100
100
|
`);
|
|
101
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAE/C,MAAM,cAAc,GAAG;IACrB,OAAO,EAAE,CAAC;IACV,IAAI,EAAE;QACJ,aAAa,EAAE,qBAAqB;QACpC,QAAQ,EAAE,cAAc;QACxB,cAAc,EAAE,oCAAoC;QACpD,UAAU,EAAE,WAAW;KACxB;IACD,OAAO,EAAE;QACP,QAAQ,EAAE;YACR,OAAO,EAAE,SAAS;YAClB,WAAW,EAAE;gBACX;oBACE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/verify.js
CHANGED
|
@@ -158,8 +158,11 @@ async function runVerifyProd(url) {
|
|
|
158
158
|
`Prerender origin returned non-200; Worker fell back to SPA. Fix deployment or origin so bots get prerendered HTML.`);
|
|
159
159
|
}
|
|
160
160
|
if (!routingOk) {
|
|
161
|
+
const hint = xRenderShield == null
|
|
162
|
+
? " If no Worker is deployed, use verify without --prod to check local/build output."
|
|
163
|
+
: "";
|
|
161
164
|
throw new Error(`RenderShield verify --prod: expected x-rendershield: bot-hit (proving Worker routed bot to prerender). ` +
|
|
162
|
-
`Got: ${xRenderShield ?? "(missing)"}. Ensure the Worker is deployed and bound to this route
|
|
165
|
+
`Got: ${xRenderShield ?? "(missing)"}. Ensure the Worker is deployed and bound to this route.${hint}`);
|
|
163
166
|
}
|
|
164
167
|
const contract = checkPrerenderContract(botHtml, {
|
|
165
168
|
routePath: normalizedUrl,
|
|
@@ -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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"}
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
const require = createRequire(import.meta.url);
|
|
3
|
+
let VERSION = "0.0.0";
|
|
4
|
+
try {
|
|
5
|
+
const pkg = require("../../package.json");
|
|
6
|
+
VERSION = pkg.version ?? "0.0.0";
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
VERSION = "unknown";
|
|
10
|
+
}
|
|
1
11
|
function jsStringArray(arr) {
|
|
2
12
|
return `[${arr.map((s) => JSON.stringify(s)).join(", ")}]`;
|
|
3
13
|
}
|
|
@@ -5,7 +15,7 @@ export function generateWorkerJs(cfg) {
|
|
|
5
15
|
const patterns = cfg.worker.botUserAgentPatterns.map((p) => p.toLowerCase());
|
|
6
16
|
const rewriteBases = cfg.worker.rewriteRouteBases;
|
|
7
17
|
return `/**
|
|
8
|
-
* RenderShield Worker (generated)
|
|
18
|
+
* RenderShield Worker (generated) v${VERSION}
|
|
9
19
|
* Serves prerendered /index.html to bots on selected route bases.
|
|
10
20
|
*/
|
|
11
21
|
|
|
@@ -72,7 +82,7 @@ export default {
|
|
|
72
82
|
out.headers.set("X-Final-Path", finalPath);` : ""}
|
|
73
83
|
return out;
|
|
74
84
|
} catch (err) {
|
|
75
|
-
return new Response("
|
|
85
|
+
return new Response("Service temporarily unavailable.", {
|
|
76
86
|
status: 500,
|
|
77
87
|
headers: { "Content-Type": "text/plain; charset=utf-8" }
|
|
78
88
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateWorker.js","sourceRoot":"","sources":["../../src/core/generateWorker.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/core/loadConfig.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import fs from "fs-extra";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
const CONFIG_NAME = "rendershield.config.json";
|
|
4
|
+
const DEFAULT_SITEMAP_PATH = "/sitemap.xml";
|
|
5
|
+
const DEFAULT_ROBOTS_PATH = "/robots.txt";
|
|
4
6
|
function isObject(v) {
|
|
5
7
|
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
6
8
|
}
|
|
@@ -13,10 +15,11 @@ function coerceBoolFlag(parsed, key, defaultEnabled) {
|
|
|
13
15
|
if (!isObject(v)) {
|
|
14
16
|
throw new Error(`${key} must be an object like { "enabled": true }`);
|
|
15
17
|
}
|
|
16
|
-
|
|
18
|
+
const enabled = v.enabled;
|
|
19
|
+
if (typeof enabled !== "boolean") {
|
|
17
20
|
throw new Error(`${key}.enabled must be a boolean`);
|
|
18
21
|
}
|
|
19
|
-
return { enabled
|
|
22
|
+
return { enabled };
|
|
20
23
|
}
|
|
21
24
|
/**
|
|
22
25
|
* Worker config policy: strict mode.
|
|
@@ -27,31 +30,32 @@ function coerceBoolFlag(parsed, key, defaultEnabled) {
|
|
|
27
30
|
* botUserAgentPatterns: substring match only (not regex); empty strings rejected to avoid overmatching.
|
|
28
31
|
*/
|
|
29
32
|
function validateWorkerWhenEnabled(parsed) {
|
|
30
|
-
|
|
33
|
+
const worker = parsed.worker;
|
|
34
|
+
if (!worker?.lovableOrigin || typeof worker.lovableOrigin !== "string") {
|
|
31
35
|
throw new Error(`worker.lovableOrigin is required when worker.enabled is true. Example: "https://your-site.lovable.app"`);
|
|
32
36
|
}
|
|
33
37
|
let url;
|
|
34
38
|
try {
|
|
35
|
-
url = new URL(
|
|
39
|
+
url = new URL(worker.lovableOrigin);
|
|
36
40
|
}
|
|
37
41
|
catch {
|
|
38
|
-
throw new Error(`worker.lovableOrigin must be a valid URL. Got: "${
|
|
42
|
+
throw new Error(`worker.lovableOrigin must be a valid URL. Got: "${worker.lovableOrigin}"`);
|
|
39
43
|
}
|
|
40
44
|
const scheme = url.protocol.toLowerCase();
|
|
41
45
|
if (scheme !== "http:" && scheme !== "https:") {
|
|
42
46
|
throw new Error(`worker.lovableOrigin must use http or https. Got: "${url.protocol}"`);
|
|
43
47
|
}
|
|
44
|
-
if (!Array.isArray(
|
|
45
|
-
|
|
48
|
+
if (!Array.isArray(worker.rewriteRouteBases) ||
|
|
49
|
+
worker.rewriteRouteBases.length === 0) {
|
|
46
50
|
throw new Error(`worker.rewriteRouteBases must be a non-empty array when worker.enabled is true. Example: ["/blog/"]`);
|
|
47
51
|
}
|
|
48
|
-
if (!Array.isArray(
|
|
49
|
-
|
|
52
|
+
if (!Array.isArray(worker.botUserAgentPatterns) ||
|
|
53
|
+
worker.botUserAgentPatterns.length === 0) {
|
|
50
54
|
throw new Error(`worker.botUserAgentPatterns must be a non-empty array when worker.enabled is true. Example: ["googlebot", "bingbot"]`);
|
|
51
55
|
}
|
|
52
56
|
// Substring match only; empty string would match every User-Agent
|
|
53
|
-
for (let i = 0; i <
|
|
54
|
-
const p =
|
|
57
|
+
for (let i = 0; i < worker.botUserAgentPatterns.length; i++) {
|
|
58
|
+
const p = worker.botUserAgentPatterns[i];
|
|
55
59
|
if (typeof p !== "string" || p.trim() === "") {
|
|
56
60
|
throw new Error(`worker.botUserAgentPatterns[${i}] must be a non-empty string (substring match). Empty or invalid entry would overmatch.`);
|
|
57
61
|
}
|
|
@@ -90,13 +94,25 @@ export async function loadConfig(cwd = process.cwd()) {
|
|
|
90
94
|
}
|
|
91
95
|
if (!parsed?.output?.outDir)
|
|
92
96
|
throw new Error(`output.outDir is required`);
|
|
93
|
-
// Validate + default these optional sections
|
|
94
|
-
|
|
95
|
-
|
|
97
|
+
// Validate + default these optional sections (preserve path so it is not lost)
|
|
98
|
+
const sitemapFlag = coerceBoolFlag(parsed, "sitemap", true);
|
|
99
|
+
const sitemapObj = parsed.sitemap;
|
|
100
|
+
const sitemapPathVal = sitemapObj?.path;
|
|
101
|
+
const sitemapPath = typeof sitemapPathVal === "string" && sitemapPathVal.trim().startsWith("/")
|
|
102
|
+
? sitemapPathVal.trim()
|
|
103
|
+
: DEFAULT_SITEMAP_PATH;
|
|
104
|
+
parsed.sitemap = { enabled: sitemapFlag.enabled, path: sitemapPath };
|
|
105
|
+
const robotsFlag = coerceBoolFlag(parsed, "robots", true);
|
|
106
|
+
const robotsObj = parsed.robots;
|
|
107
|
+
const robotsPathVal = robotsObj?.path;
|
|
108
|
+
const robotsPath = typeof robotsPathVal === "string" && robotsPathVal.trim().startsWith("/")
|
|
109
|
+
? robotsPathVal.trim()
|
|
110
|
+
: DEFAULT_ROBOTS_PATH;
|
|
111
|
+
parsed.robots = { enabled: robotsFlag.enabled, path: robotsPath };
|
|
96
112
|
const workerFlag = coerceBoolFlag(parsed, "worker", true);
|
|
97
|
-
|
|
98
|
-
if (parsed.worker.enabled) {
|
|
113
|
+
if (workerFlag.enabled) {
|
|
99
114
|
validateWorkerWhenEnabled(parsed);
|
|
115
|
+
// Keep parsed.worker as the full object from JSON (already validated)
|
|
100
116
|
}
|
|
101
117
|
else {
|
|
102
118
|
parsed.worker = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/core/loadConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,WAAW,GAAG,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/core/loadConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadMarkdown.js","sourceRoot":"","sources":["../../src/core/loadMarkdown.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,UAAU,MAAM,aAAa,CAAC;AAGrC,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;AAE7E,MAAM,eAAe,GAAG,iDAAiD,CAAC;AAE1E,SAAS,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"loadMarkdown.js","sourceRoot":"","sources":["../../src/core/loadMarkdown.ts"],"names":[],"mappings":"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"}
|
package/dist/core/renderHtml.js
CHANGED
|
@@ -50,7 +50,11 @@ export function renderPageHtml(cfg, doc) {
|
|
|
50
50
|
<meta name="twitter:description" content="${escapeHtml(description)}">
|
|
51
51
|
<meta name="twitter:image" content="${escapeHtml(ogImageUrl)}">
|
|
52
52
|
|
|
53
|
-
<script type="application/ld+json">${
|
|
53
|
+
<script type="application/ld+json">${(() => {
|
|
54
|
+
const raw = JSON.stringify(jsonLd);
|
|
55
|
+
// Case-insensitive: </script> and </SCRIPT> etc. must not break out of the tag
|
|
56
|
+
return raw.replace(/<\/script>/gi, "<\\/script>");
|
|
57
|
+
})()}</script>
|
|
54
58
|
</head>
|
|
55
59
|
<body>
|
|
56
60
|
<main>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderHtml.js","sourceRoot":"","sources":["../../src/core/renderHtml.ts"],"names":[],"mappings":"AAEA,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,QAAgB;IAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,MAAM,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAuB,EAAE,GAAgB;IACtE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC;QAClD,CAAC,CAAC,GAAG,CAAC,UAAU;QAChB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IAEpD,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC;IAEhC,MAAM,MAAM,GAAG;QACb,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,GAAG,CAAC,KAAK;QACnB,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE;QACxD,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,KAAK,EAAE,UAAU;QACjB,gBAAgB,EAAE,YAAY;KAC/B,CAAC;IAEF,0DAA0D;IAC1D,wFAAwF;IACxF,MAAM,IAAI,GAAG;;;;;;WAMJ,UAAU,CAAC,KAAK,CAAC;sCACU,UAAU,CAAC,WAAW,CAAC;gCAC7B,UAAU,CAAC,YAAY,CAAC;;;uCAGjB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;6CACf,UAAU,CAAC,WAAW,CAAC;uCAC7B,UAAU,CAAC,UAAU,CAAC;qCACxB,UAAU,CAAC,YAAY,CAAC;;;wCAGrB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;8CACf,UAAU,CAAC,WAAW,CAAC;wCAC7B,UAAU,CAAC,UAAU,CAAC;;uCAEvB,
|
|
1
|
+
{"version":3,"file":"renderHtml.js","sourceRoot":"","sources":["../../src/core/renderHtml.ts"],"names":[],"mappings":"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"}
|
|
@@ -65,7 +65,7 @@ function validateJsonLdNode(node, location, allowedTypes) {
|
|
|
65
65
|
const allowedSet = new Set(allowedTypes.map((t) => t.toLowerCase()));
|
|
66
66
|
const hasAllowedType = types.some((t) => allowedSet.has(t));
|
|
67
67
|
if (!hasAllowedType) {
|
|
68
|
-
throw new Error(`Invalid JSON-LD at ${location}: @type "${node["@type"]}" is not in allowed list [${allowedTypes.join(", ")}]. Add it to allowedJsonLdTypes if your page uses this type.`);
|
|
68
|
+
throw new Error(`Invalid JSON-LD at ${location}: @type "${String(node["@type"])}" is not in allowed list [${allowedTypes.join(", ")}]. Add it to allowedJsonLdTypes if your page uses this type.`);
|
|
69
69
|
}
|
|
70
70
|
const primaryType = types[0];
|
|
71
71
|
const missing = [];
|
|
@@ -101,7 +101,7 @@ function validateJsonLdSchema(jsonLd, context, allowedTypes) {
|
|
|
101
101
|
try {
|
|
102
102
|
parsed = JSON.parse(jsonLd);
|
|
103
103
|
}
|
|
104
|
-
catch
|
|
104
|
+
catch {
|
|
105
105
|
const preview = jsonLd.length > 200 ? jsonLd.slice(0, 200) + "…" : jsonLd;
|
|
106
106
|
throw new Error(`Invalid JSON-LD at ${location}: JSON parse error. Ensure the script tag contains valid JSON. Preview: ${preview}`);
|
|
107
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateOutput.js","sourceRoot":"","sources":["../../src/core/validateOutput.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"validateOutput.js","sourceRoot":"","sources":["../../src/core/validateOutput.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lownoise-studio/rendershield",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Boring bot-aware prerendering: real HTML for bots, SPA for humans.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
"build": "tsc -p tsconfig.json",
|
|
12
12
|
"dev": "node --enable-source-maps dist/cli.js",
|
|
13
13
|
"start": "node dist/cli.js",
|
|
14
|
-
"prepack": "npm run build"
|
|
14
|
+
"prepack": "npm run build",
|
|
15
|
+
"test": "vitest run",
|
|
16
|
+
"pretest": "npm run build"
|
|
15
17
|
},
|
|
16
18
|
"files": [
|
|
17
19
|
"dist/**",
|
|
@@ -20,6 +22,7 @@
|
|
|
20
22
|
"content/**",
|
|
21
23
|
"DEPLOY.md",
|
|
22
24
|
"README.md",
|
|
25
|
+
"CHANGELOG.md",
|
|
23
26
|
"LICENSE"
|
|
24
27
|
],
|
|
25
28
|
"repository": {
|
|
@@ -38,6 +41,7 @@
|
|
|
38
41
|
},
|
|
39
42
|
"devDependencies": {
|
|
40
43
|
"@types/fs-extra": "^11.0.4",
|
|
41
|
-
"typescript": "^5.5.4"
|
|
44
|
+
"typescript": "^5.5.4",
|
|
45
|
+
"vitest": "^2.1.0"
|
|
42
46
|
}
|
|
43
47
|
}
|
package/src/cli.ts
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from "node:module";
|
|
2
3
|
import { cmdInit } from "./commands/init.js";
|
|
3
4
|
import { cmdBuild } from "./commands/build.js";
|
|
4
5
|
import { cmdVerify } from "./commands/verify.js";
|
|
5
6
|
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
const pkg = require("../package.json") as { version?: string };
|
|
9
|
+
const VERSION = pkg.version ?? "0.0.0";
|
|
10
|
+
|
|
6
11
|
function printHelp() {
|
|
7
12
|
console.log(`
|
|
8
|
-
RenderShield
|
|
13
|
+
RenderShield v${VERSION} — boring bot-aware prerendering.
|
|
9
14
|
|
|
10
15
|
Usage:
|
|
11
16
|
rendershield init
|
|
@@ -14,6 +19,7 @@ Usage:
|
|
|
14
19
|
|
|
15
20
|
verify Print curl commands for local/build output.
|
|
16
21
|
verify --prod Fetch URL as bot and human; verify bot sees full HTML and contract fields.
|
|
22
|
+
Requires x-rendershield: bot-hit from the Worker.
|
|
17
23
|
|
|
18
24
|
Notes:
|
|
19
25
|
- Config file: rendershield.config.json
|
|
@@ -23,12 +29,17 @@ Notes:
|
|
|
23
29
|
}
|
|
24
30
|
|
|
25
31
|
async function main() {
|
|
26
|
-
const
|
|
32
|
+
const args = process.argv.slice(2);
|
|
33
|
+
const cmd = args[0]?.trim();
|
|
27
34
|
|
|
28
35
|
if (!cmd || cmd === "-h" || cmd === "--help") {
|
|
29
36
|
printHelp();
|
|
30
37
|
process.exit(0);
|
|
31
38
|
}
|
|
39
|
+
if (cmd === "-V" || cmd === "--version") {
|
|
40
|
+
console.log(VERSION);
|
|
41
|
+
process.exit(0);
|
|
42
|
+
}
|
|
32
43
|
|
|
33
44
|
try {
|
|
34
45
|
if (cmd === "init") {
|
|
@@ -40,9 +51,13 @@ async function main() {
|
|
|
40
51
|
return;
|
|
41
52
|
}
|
|
42
53
|
if (cmd === "verify") {
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
54
|
+
const verifyArgs = args.slice(1);
|
|
55
|
+
if (verifyArgs.includes("-h") || verifyArgs.includes("--help")) {
|
|
56
|
+
printHelp();
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
const prodIdx = verifyArgs.indexOf("--prod");
|
|
60
|
+
const prodUrl = prodIdx >= 0 && verifyArgs[prodIdx + 1] ? verifyArgs[prodIdx + 1].trim() : undefined;
|
|
46
61
|
await cmdVerify(undefined, prodUrl ? { prodUrl } : undefined);
|
|
47
62
|
return;
|
|
48
63
|
}
|
|
@@ -50,8 +65,8 @@ async function main() {
|
|
|
50
65
|
console.error(`Unknown command: ${cmd}\n`);
|
|
51
66
|
printHelp();
|
|
52
67
|
process.exit(1);
|
|
53
|
-
} catch (err:
|
|
54
|
-
const msg = err
|
|
68
|
+
} catch (err: unknown) {
|
|
69
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
55
70
|
console.error(`\nRenderShield error: ${msg}\n`);
|
|
56
71
|
process.exit(1);
|
|
57
72
|
}
|
package/src/commands/init.ts
CHANGED
|
@@ -16,9 +16,9 @@ const DEFAULT_CONFIG = {
|
|
|
16
16
|
baseDir: "content",
|
|
17
17
|
collections: [
|
|
18
18
|
{
|
|
19
|
-
name: "
|
|
20
|
-
pattern: "
|
|
21
|
-
routeBase: "/
|
|
19
|
+
name: "blog",
|
|
20
|
+
pattern: "blog/**/*.md",
|
|
21
|
+
routeBase: "/blog",
|
|
22
22
|
schemaType: "Article"
|
|
23
23
|
}
|
|
24
24
|
]
|
|
@@ -39,7 +39,7 @@ const DEFAULT_CONFIG = {
|
|
|
39
39
|
worker: {
|
|
40
40
|
enabled: true,
|
|
41
41
|
lovableOrigin: "https://YOUR_SITE.lovable.app",
|
|
42
|
-
rewriteRouteBases: ["/
|
|
42
|
+
rewriteRouteBases: ["/blog/"],
|
|
43
43
|
botUserAgentPatterns: [
|
|
44
44
|
"googlebot",
|
|
45
45
|
"bingbot",
|
|
@@ -78,7 +78,7 @@ That's the whole trick.
|
|
|
78
78
|
|
|
79
79
|
export async function cmdInit(cwd = process.cwd()) {
|
|
80
80
|
const configPath = path.join(cwd, CONFIG_NAME);
|
|
81
|
-
const contentDir = path.join(cwd, "content", "
|
|
81
|
+
const contentDir = path.join(cwd, "content", "blog");
|
|
82
82
|
const samplePath = path.join(contentDir, "hello-world.md");
|
|
83
83
|
|
|
84
84
|
const configExists = await fs.pathExists(configPath);
|
|
@@ -98,7 +98,7 @@ export async function cmdInit(cwd = process.cwd()) {
|
|
|
98
98
|
const sampleExists = await fs.pathExists(samplePath);
|
|
99
99
|
if (!sampleExists) {
|
|
100
100
|
await fs.writeFile(samplePath, SAMPLE_POST, "utf8");
|
|
101
|
-
console.log(`Created sample content: content/
|
|
101
|
+
console.log(`Created sample content: content/blog/hello-world.md`);
|
|
102
102
|
} else {
|
|
103
103
|
console.log(`Sample content already exists (leaving it alone)`);
|
|
104
104
|
}
|
|
@@ -106,7 +106,7 @@ export async function cmdInit(cwd = process.cwd()) {
|
|
|
106
106
|
console.log(`
|
|
107
107
|
Next:
|
|
108
108
|
1) Edit rendershield.config.json
|
|
109
|
-
2) Add content under content/
|
|
109
|
+
2) Add content under content/blog/
|
|
110
110
|
3) Run: rendershield build
|
|
111
111
|
`);
|
|
112
112
|
}
|
package/src/commands/verify.ts
CHANGED
|
@@ -193,9 +193,12 @@ async function runVerifyProd(url: string): Promise<void> {
|
|
|
193
193
|
);
|
|
194
194
|
}
|
|
195
195
|
if (!routingOk) {
|
|
196
|
+
const hint = xRenderShield == null
|
|
197
|
+
? " If no Worker is deployed, use verify without --prod to check local/build output."
|
|
198
|
+
: "";
|
|
196
199
|
throw new Error(
|
|
197
200
|
`RenderShield verify --prod: expected x-rendershield: bot-hit (proving Worker routed bot to prerender). ` +
|
|
198
|
-
`Got: ${xRenderShield ?? "(missing)"}. Ensure the Worker is deployed and bound to this route
|
|
201
|
+
`Got: ${xRenderShield ?? "(missing)"}. Ensure the Worker is deployed and bound to this route.${hint}`
|
|
199
202
|
);
|
|
200
203
|
}
|
|
201
204
|
|
|
@@ -1,5 +1,15 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
1
2
|
import { RenderShieldConfig } from "../types.js";
|
|
2
3
|
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
let VERSION = "0.0.0";
|
|
6
|
+
try {
|
|
7
|
+
const pkg = require("../../package.json") as { version?: string };
|
|
8
|
+
VERSION = pkg.version ?? "0.0.0";
|
|
9
|
+
} catch {
|
|
10
|
+
VERSION = "unknown";
|
|
11
|
+
}
|
|
12
|
+
|
|
3
13
|
function jsStringArray(arr: string[]): string {
|
|
4
14
|
return `[${arr.map((s) => JSON.stringify(s)).join(", ")}]`;
|
|
5
15
|
}
|
|
@@ -9,7 +19,7 @@ export function generateWorkerJs(cfg: RenderShieldConfig): string {
|
|
|
9
19
|
const rewriteBases = cfg.worker.rewriteRouteBases;
|
|
10
20
|
|
|
11
21
|
return `/**
|
|
12
|
-
* RenderShield Worker (generated)
|
|
22
|
+
* RenderShield Worker (generated) v${VERSION}
|
|
13
23
|
* Serves prerendered /index.html to bots on selected route bases.
|
|
14
24
|
*/
|
|
15
25
|
|
|
@@ -76,7 +86,7 @@ export default {
|
|
|
76
86
|
out.headers.set("X-Final-Path", finalPath);` : ""}
|
|
77
87
|
return out;
|
|
78
88
|
} catch (err) {
|
|
79
|
-
return new Response("
|
|
89
|
+
return new Response("Service temporarily unavailable.", {
|
|
80
90
|
status: 500,
|
|
81
91
|
headers: { "Content-Type": "text/plain; charset=utf-8" }
|
|
82
92
|
});
|
package/src/core/loadConfig.ts
CHANGED
|
@@ -4,14 +4,28 @@ import { RenderShieldConfig } from "../types.js";
|
|
|
4
4
|
|
|
5
5
|
const CONFIG_NAME = "rendershield.config.json";
|
|
6
6
|
|
|
7
|
+
const DEFAULT_SITEMAP_PATH = "/sitemap.xml";
|
|
8
|
+
const DEFAULT_ROBOTS_PATH = "/robots.txt";
|
|
9
|
+
|
|
7
10
|
type BoolFlag = { enabled: boolean };
|
|
8
11
|
|
|
12
|
+
/** Shape of config as read from JSON (before normalization). Used for validation only. */
|
|
13
|
+
interface ParsedInput {
|
|
14
|
+
version?: unknown;
|
|
15
|
+
site?: { canonicalBase?: unknown; siteName?: unknown; defaultOgImage?: unknown; authorName?: unknown };
|
|
16
|
+
content?: { markdown?: { baseDir?: unknown; collections?: unknown[] } };
|
|
17
|
+
output?: { outDir?: unknown };
|
|
18
|
+
sitemap?: Record<string, unknown>;
|
|
19
|
+
robots?: Record<string, unknown>;
|
|
20
|
+
worker?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
|
|
9
23
|
function isObject(v: unknown): v is Record<string, unknown> {
|
|
10
24
|
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
11
25
|
}
|
|
12
26
|
|
|
13
27
|
function coerceBoolFlag(
|
|
14
|
-
parsed:
|
|
28
|
+
parsed: Record<string, unknown>,
|
|
15
29
|
key: "sitemap" | "robots" | "worker",
|
|
16
30
|
defaultEnabled: boolean
|
|
17
31
|
): BoolFlag {
|
|
@@ -23,10 +37,11 @@ function coerceBoolFlag(
|
|
|
23
37
|
if (!isObject(v)) {
|
|
24
38
|
throw new Error(`${key} must be an object like { "enabled": true }`);
|
|
25
39
|
}
|
|
26
|
-
|
|
40
|
+
const enabled = (v as Record<string, unknown>).enabled;
|
|
41
|
+
if (typeof enabled !== "boolean") {
|
|
27
42
|
throw new Error(`${key}.enabled must be a boolean`);
|
|
28
43
|
}
|
|
29
|
-
return { enabled
|
|
44
|
+
return { enabled };
|
|
30
45
|
}
|
|
31
46
|
|
|
32
47
|
/**
|
|
@@ -37,18 +52,19 @@ function coerceBoolFlag(
|
|
|
37
52
|
* lovableOrigin: must be http: or https: only (no file:, javascript:, protocol-relative).
|
|
38
53
|
* botUserAgentPatterns: substring match only (not regex); empty strings rejected to avoid overmatching.
|
|
39
54
|
*/
|
|
40
|
-
function validateWorkerWhenEnabled(parsed:
|
|
41
|
-
|
|
55
|
+
function validateWorkerWhenEnabled(parsed: Record<string, unknown>): void {
|
|
56
|
+
const worker = parsed.worker as Record<string, unknown> | undefined;
|
|
57
|
+
if (!worker?.lovableOrigin || typeof worker.lovableOrigin !== "string") {
|
|
42
58
|
throw new Error(
|
|
43
59
|
`worker.lovableOrigin is required when worker.enabled is true. Example: "https://your-site.lovable.app"`
|
|
44
60
|
);
|
|
45
61
|
}
|
|
46
62
|
let url: URL;
|
|
47
63
|
try {
|
|
48
|
-
url = new URL(
|
|
64
|
+
url = new URL(worker.lovableOrigin);
|
|
49
65
|
} catch {
|
|
50
66
|
throw new Error(
|
|
51
|
-
`worker.lovableOrigin must be a valid URL. Got: "${
|
|
67
|
+
`worker.lovableOrigin must be a valid URL. Got: "${worker.lovableOrigin}"`
|
|
52
68
|
);
|
|
53
69
|
}
|
|
54
70
|
const scheme = url.protocol.toLowerCase();
|
|
@@ -58,24 +74,24 @@ function validateWorkerWhenEnabled(parsed: any): void {
|
|
|
58
74
|
);
|
|
59
75
|
}
|
|
60
76
|
if (
|
|
61
|
-
!Array.isArray(
|
|
62
|
-
|
|
77
|
+
!Array.isArray(worker.rewriteRouteBases) ||
|
|
78
|
+
worker.rewriteRouteBases.length === 0
|
|
63
79
|
) {
|
|
64
80
|
throw new Error(
|
|
65
81
|
`worker.rewriteRouteBases must be a non-empty array when worker.enabled is true. Example: ["/blog/"]`
|
|
66
82
|
);
|
|
67
83
|
}
|
|
68
84
|
if (
|
|
69
|
-
!Array.isArray(
|
|
70
|
-
|
|
85
|
+
!Array.isArray(worker.botUserAgentPatterns) ||
|
|
86
|
+
worker.botUserAgentPatterns.length === 0
|
|
71
87
|
) {
|
|
72
88
|
throw new Error(
|
|
73
89
|
`worker.botUserAgentPatterns must be a non-empty array when worker.enabled is true. Example: ["googlebot", "bingbot"]`
|
|
74
90
|
);
|
|
75
91
|
}
|
|
76
92
|
// Substring match only; empty string would match every User-Agent
|
|
77
|
-
for (let i = 0; i <
|
|
78
|
-
const p =
|
|
93
|
+
for (let i = 0; i < worker.botUserAgentPatterns.length; i++) {
|
|
94
|
+
const p = worker.botUserAgentPatterns[i];
|
|
79
95
|
if (typeof p !== "string" || p.trim() === "") {
|
|
80
96
|
throw new Error(
|
|
81
97
|
`worker.botUserAgentPatterns[${i}] must be a non-empty string (substring match). Empty or invalid entry would overmatch.`
|
|
@@ -94,9 +110,9 @@ export async function loadConfig(
|
|
|
94
110
|
}
|
|
95
111
|
|
|
96
112
|
const raw = await fs.readFile(p, "utf8");
|
|
97
|
-
let parsed:
|
|
113
|
+
let parsed: ParsedInput & Record<string, unknown>;
|
|
98
114
|
try {
|
|
99
|
-
parsed = JSON.parse(raw)
|
|
115
|
+
parsed = JSON.parse(raw) as ParsedInput & Record<string, unknown>;
|
|
100
116
|
} catch {
|
|
101
117
|
throw new Error(`${CONFIG_NAME} is not valid JSON`);
|
|
102
118
|
}
|
|
@@ -120,14 +136,29 @@ export async function loadConfig(
|
|
|
120
136
|
}
|
|
121
137
|
if (!parsed?.output?.outDir) throw new Error(`output.outDir is required`);
|
|
122
138
|
|
|
123
|
-
// Validate + default these optional sections
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
const
|
|
127
|
-
|
|
139
|
+
// Validate + default these optional sections (preserve path so it is not lost)
|
|
140
|
+
const sitemapFlag = coerceBoolFlag(parsed, "sitemap", true);
|
|
141
|
+
const sitemapObj = parsed.sitemap as Record<string, unknown> | undefined;
|
|
142
|
+
const sitemapPathVal = sitemapObj?.path;
|
|
143
|
+
const sitemapPath =
|
|
144
|
+
typeof sitemapPathVal === "string" && sitemapPathVal.trim().startsWith("/")
|
|
145
|
+
? sitemapPathVal.trim()
|
|
146
|
+
: DEFAULT_SITEMAP_PATH;
|
|
147
|
+
parsed.sitemap = { enabled: sitemapFlag.enabled, path: sitemapPath };
|
|
148
|
+
|
|
149
|
+
const robotsFlag = coerceBoolFlag(parsed, "robots", true);
|
|
150
|
+
const robotsObj = parsed.robots as Record<string, unknown> | undefined;
|
|
151
|
+
const robotsPathVal = robotsObj?.path;
|
|
152
|
+
const robotsPath =
|
|
153
|
+
typeof robotsPathVal === "string" && robotsPathVal.trim().startsWith("/")
|
|
154
|
+
? robotsPathVal.trim()
|
|
155
|
+
: DEFAULT_ROBOTS_PATH;
|
|
156
|
+
parsed.robots = { enabled: robotsFlag.enabled, path: robotsPath };
|
|
128
157
|
|
|
129
|
-
|
|
158
|
+
const workerFlag = coerceBoolFlag(parsed, "worker", true);
|
|
159
|
+
if (workerFlag.enabled) {
|
|
130
160
|
validateWorkerWhenEnabled(parsed);
|
|
161
|
+
// Keep parsed.worker as the full object from JSON (already validated)
|
|
131
162
|
} else {
|
|
132
163
|
parsed.worker = {
|
|
133
164
|
enabled: false,
|
package/src/core/loadMarkdown.ts
CHANGED
|
@@ -9,7 +9,7 @@ const md = new MarkdownIt({ html: false, linkify: true, typographer: true });
|
|
|
9
9
|
|
|
10
10
|
const REQUIRED_FIELDS = "title, excerpt, datePublished, coverImage, slug";
|
|
11
11
|
|
|
12
|
-
function requireString(value:
|
|
12
|
+
function requireString(value: unknown, field: string, file: string): string {
|
|
13
13
|
if (typeof value !== "string" || value.trim().length === 0) {
|
|
14
14
|
throw new Error(
|
|
15
15
|
`Missing required frontmatter field "${field}" in ${file}. Required fields: ${REQUIRED_FIELDS}`
|
|
@@ -18,7 +18,7 @@ function requireString(value: any, field: string, file: string): string {
|
|
|
18
18
|
return value.trim();
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
function normalizeDate(value:
|
|
21
|
+
function normalizeDate(value: unknown, file: string): string {
|
|
22
22
|
if (typeof value === "string" && /^\d{4}-\d{2}-\d{2}$/.test(value)) {
|
|
23
23
|
return value;
|
|
24
24
|
}
|
package/src/core/renderHtml.ts
CHANGED
|
@@ -57,7 +57,11 @@ export function renderPageHtml(cfg: RenderShieldConfig, doc: MarkdownDoc): strin
|
|
|
57
57
|
<meta name="twitter:description" content="${escapeHtml(description)}">
|
|
58
58
|
<meta name="twitter:image" content="${escapeHtml(ogImageUrl)}">
|
|
59
59
|
|
|
60
|
-
<script type="application/ld+json">${
|
|
60
|
+
<script type="application/ld+json">${((): string => {
|
|
61
|
+
const raw = JSON.stringify(jsonLd);
|
|
62
|
+
// Case-insensitive: </script> and </SCRIPT> etc. must not break out of the tag
|
|
63
|
+
return raw.replace(/<\/script>/gi, "<\\/script>");
|
|
64
|
+
})()}</script>
|
|
61
65
|
</head>
|
|
62
66
|
<body>
|
|
63
67
|
<main>
|
|
@@ -81,9 +81,12 @@ function normalizeJsonLdTypes(typeValue: unknown): string[] {
|
|
|
81
81
|
return [];
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
+
/** Minimal shape for a JSON-LD node we validate (schema.org Article, BlogPosting, WebPage, etc.). */
|
|
85
|
+
type JsonLdNode = Record<string, unknown>;
|
|
86
|
+
|
|
84
87
|
/** Validate a single JSON-LD node (object). Returns true if it satisfies the contract. */
|
|
85
88
|
function validateJsonLdNode(
|
|
86
|
-
node:
|
|
89
|
+
node: JsonLdNode,
|
|
87
90
|
location: string,
|
|
88
91
|
allowedTypes: string[]
|
|
89
92
|
): void {
|
|
@@ -98,7 +101,7 @@ function validateJsonLdNode(
|
|
|
98
101
|
const hasAllowedType = types.some((t) => allowedSet.has(t));
|
|
99
102
|
if (!hasAllowedType) {
|
|
100
103
|
throw new Error(
|
|
101
|
-
`Invalid JSON-LD at ${location}: @type "${node["@type"]}" is not in allowed list [${allowedTypes.join(", ")}]. Add it to allowedJsonLdTypes if your page uses this type.`
|
|
104
|
+
`Invalid JSON-LD at ${location}: @type "${String(node["@type"])}" is not in allowed list [${allowedTypes.join(", ")}]. Add it to allowedJsonLdTypes if your page uses this type.`
|
|
102
105
|
);
|
|
103
106
|
}
|
|
104
107
|
|
|
@@ -141,17 +144,17 @@ function validateJsonLdSchema(
|
|
|
141
144
|
const { routePath, sourcePath } = context;
|
|
142
145
|
const location = sourcePath ? `route ${routePath} (source: ${sourcePath})` : `route ${routePath}`;
|
|
143
146
|
|
|
144
|
-
let parsed:
|
|
147
|
+
let parsed: unknown;
|
|
145
148
|
try {
|
|
146
149
|
parsed = JSON.parse(jsonLd);
|
|
147
|
-
} catch
|
|
150
|
+
} catch {
|
|
148
151
|
const preview = jsonLd.length > 200 ? jsonLd.slice(0, 200) + "…" : jsonLd;
|
|
149
152
|
throw new Error(
|
|
150
153
|
`Invalid JSON-LD at ${location}: JSON parse error. Ensure the script tag contains valid JSON. Preview: ${preview}`
|
|
151
154
|
);
|
|
152
155
|
}
|
|
153
156
|
|
|
154
|
-
const items:
|
|
157
|
+
const items: unknown[] = Array.isArray(parsed) ? parsed : [parsed];
|
|
155
158
|
if (items.length === 0) {
|
|
156
159
|
throw new Error(
|
|
157
160
|
`Invalid JSON-LD at ${location}: empty array or missing object.`
|
|
@@ -163,7 +166,7 @@ function validateJsonLdSchema(
|
|
|
163
166
|
const item = items[i];
|
|
164
167
|
if (typeof item !== "object" || item === null || Array.isArray(item)) continue;
|
|
165
168
|
try {
|
|
166
|
-
validateJsonLdNode(item, location, allowedTypes);
|
|
169
|
+
validateJsonLdNode(item as JsonLdNode, location, allowedTypes);
|
|
167
170
|
return;
|
|
168
171
|
} catch (e) {
|
|
169
172
|
lastErr = e instanceof Error ? e : new Error(String(e));
|