Skip to content

Commit 962c09f

Browse files
authored
docs: fix SSR compatibility by guarding browser APIs (#16)
1 parent bcd6b9a commit 962c09f

4 files changed

Lines changed: 15 additions & 16 deletions

File tree

docs-website/package-lock.json

Lines changed: 0 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs-website/scripts/prerender.mjs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ const routes = [
2828
// Suppress expected SSR errors from client-only code
2929
process.on('uncaughtException', (err) => {
3030
if (err.message?.includes('document is not defined') ||
31-
err.message?.includes('window is not defined')) {
31+
err.message?.includes('window is not defined') ||
32+
err.message?.includes('localStorage is not defined')) {
3233
return
3334
}
3435
console.error('Uncaught exception:', err)

docs-website/src/Layout.res

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,24 @@ external setHtmlAttribute: (string, string) => unit = "setAttribute"
88
@val @scope("window") external addEventListener: (string, 'a) => unit = "addEventListener"
99
@val @scope("window") external removeEventListener: (string, 'a) => unit = "removeEventListener"
1010

11+
// ---- SSR guard ----
12+
let isBrowser: bool = %raw(`typeof window !== "undefined"`)
13+
1114
// ---- Theme management ----
1215
let initialTheme = {
13-
switch getItem("rescript-signals-theme")->Nullable.toOption {
14-
| Some("light") => "light"
15-
| _ => "dark"
16+
if isBrowser {
17+
switch getItem("rescript-signals-theme")->Nullable.toOption {
18+
| Some("light") => "light"
19+
| _ => "dark"
20+
}
21+
} else {
22+
"dark"
1623
}
1724
}
1825

19-
let _ = setHtmlAttribute("data-theme", initialTheme)
26+
let _ = if isBrowser {
27+
setHtmlAttribute("data-theme", initialTheme)
28+
}
2029

2130
let theme = Signal.make(initialTheme)
2231

package-lock.json

Lines changed: 0 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)