Skip to content

Commit fbd2497

Browse files
committed
🐛 fix ssg
1 parent 403c064 commit fbd2497

File tree

5 files changed

+13
-4
lines changed

5 files changed

+13
-4
lines changed

builders/ssg.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ module.exports = async function ssg({ output, cache, environment }) {
3939
.find((line) => line.indexOf(stateLookup) > -1)
4040
.split(stateLookup)[1]
4141
.slice(0, -2)
42-
const { instances, page } = JSON.parse(decodeURIComponent(state).replace(/<\\/g, '<'))
42+
const { instances, page } = JSON.parse(decodeURIComponent(state))
4343

4444
if (url !== `/nullstack/${application.environment.key}/offline` && url !== '/404') {
4545
pages[url] = page

client/render.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { sanitizeInnerHtml } from '../shared/sanitizeString'
12
import generateTruthyString from '../shared/generateTruthyString'
23
import { isFalse, isText } from '../shared/nodes'
34
import { anchorableElement } from './anchorableNode'
@@ -28,7 +29,7 @@ export default function render(node, options) {
2829
for (const name in node.attributes) {
2930
if (name === 'debounce') continue
3031
if (name === 'html') {
31-
node.element.innerHTML = node.attributes[name]
32+
node.element.innerHTML = sanitizeInnerHtml(node.attributes[name])
3233
node.head || anchorableElement(node.element)
3334
} else if (name.startsWith('on')) {
3435
if (node.attributes[name] !== undefined) {

client/rerender.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { sanitizeInnerHtml } from '../shared/sanitizeString'
12
import generateTruthyString from '../shared/generateTruthyString'
23
import { isFalse, isText, isUndefined } from '../shared/nodes'
34
import { anchorableElement } from './anchorableNode'
@@ -14,7 +15,7 @@ function updateAttributes(selector, currentAttributes, nextAttributes) {
1415
reref(nextAttributes, selector)
1516
} else if (name === 'html') {
1617
if (nextAttributes[name] !== currentAttributes[name]) {
17-
selector.innerHTML = nextAttributes[name]
18+
selector.innerHTML = sanitizeInnerHtml(nextAttributes[name])
1819
anchorableElement(selector)
1920
}
2021
} else if (name === 'checked' || name === 'value') {

client/router.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { updateParams } from './params'
66
import segments from './segments'
77
import windowEvent from './windowEvent'
88
import worker from './worker'
9+
import deserialize from '../shared/deserialize'
910

1011
let redirectTimer = null
1112

@@ -40,7 +41,8 @@ class Router {
4041
const endpoint = path === '/' ? api : path + api
4142
try {
4243
const response = await fetch(endpoint)
43-
const payload = await response.json(url)
44+
const meta = await response.text()
45+
const payload = deserialize(meta)
4446
client.memory = payload.instances
4547
for (const key in payload.page) {
4648
page[key] = payload.page[key]

shared/sanitizeString.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,8 @@ export function sanitizeHtml(unsafe) {
66
export function sanitizeString(unsafe) {
77
return unsafe.replace(/<\//g, `<\\\/`)
88
}
9+
10+
export function sanitizeInnerHtml(unsafe) {
11+
if (unsafe === undefined || typeof(unsafe) !== 'string') return ''
12+
return unsafe.replaceAll('<\\', '<')
13+
}

0 commit comments

Comments
 (0)