diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0403ed4..55d2819 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
# sapper changelog
+## 0.14.2
+
+* Prevent unsafe replacements ([#307](https://github.com/sveltejs/sapper/pull/307))
+
## 0.14.1
* Route parameters can be qualified with regex characters ([#283](https://github.com/sveltejs/sapper/pull/283))
diff --git a/package.json b/package.json
index f23a3c3..8a8b7a6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "sapper",
- "version": "0.14.1",
+ "version": "0.14.2",
"description": "Military-grade apps, engineered by Svelte",
"main": "dist/middleware.ts.js",
"bin": {
diff --git a/src/middleware.ts b/src/middleware.ts
index 4f23e17..dd589a8 100644
--- a/src/middleware.ts
+++ b/src/middleware.ts
@@ -355,11 +355,11 @@ function get_page_handler(routes: RouteObject[], store_getter: (req: Req) => Sto
}
const page = template()
- .replace('%sapper.base%', ``)
- .replace('%sapper.scripts%', `${scripts}`)
- .replace('%sapper.html%', html)
- .replace('%sapper.head%', `${head}`)
- .replace('%sapper.styles%', (css && css.code ? `` : ''));
+ .replace('%sapper.base%', () => ``)
+ .replace('%sapper.scripts%', () => `${scripts}`)
+ .replace('%sapper.html%', () => html)
+ .replace('%sapper.head%', () => `${head}`)
+ .replace('%sapper.styles%', () => (css && css.code ? `` : ''));
res.statusCode = status;
res.end(page);
diff --git a/test/app/routes/unsafe-replacement.html b/test/app/routes/unsafe-replacement.html
new file mode 100644
index 0000000..98c654f
--- /dev/null
+++ b/test/app/routes/unsafe-replacement.html
@@ -0,0 +1,9 @@
+$&
+
+
\ No newline at end of file
diff --git a/test/common/test.js b/test/common/test.js
index 79751e7..84fb55e 100644
--- a/test/common/test.js
+++ b/test/common/test.js
@@ -619,6 +619,16 @@ function run({ mode, basepath = '' }) {
assert.equal(name, 'BODY');
});
});
+
+ it('replaces %sapper.xxx% tags safely', () => {
+ return nightmare
+ .goto(`${base}/unsafe-replacement`)
+ .init()
+ .page.html()
+ .then(html => {
+ assert.equal(html.indexOf('%sapper'), -1);
+ });
+ });
});
describe('headers', () => {