diff --git a/.changeset/sweet-masks-leave.md b/.changeset/sweet-masks-leave.md
new file mode 100644
index 000000000000..a21069748be9
--- /dev/null
+++ b/.changeset/sweet-masks-leave.md
@@ -0,0 +1,5 @@
+---
+'@sveltejs/kit': patch
+---
+
+Added template transform api, requested in the sapper repo #1695 #1642
diff --git a/documentation/docs/04-setup.md b/documentation/docs/04-setup.md
index e7ea17c8f44a..c14889a4e683 100644
--- a/documentation/docs/04-setup.md
+++ b/documentation/docs/04-setup.md
@@ -2,9 +2,9 @@
title: Setup
---
-An optional `src/setup.js` (or `src/setup.ts`, or `src/setup/index.js`) file exports two functions that run on the server — **prepare** and **getSession**.
+An optional `src/setup.js` (or `src/setup.ts`, or `src/setup/index.js`) file exports three functions that run on the server — **prepare**, **transformTemplate** and **getSession**.
-Both functions, if provided, run for every page or endpoint request SvelteKit receives.
+These functions, if provided, run for every page or endpoint request SvelteKit receives.
> The location of this file can be [configured](#configuration) as `config.kit.files.setup`
@@ -65,17 +65,19 @@ export async function prepare(incoming) {
headers['set-cookie'] = `session_id=${uuid()}; HttpOnly`;
}
+ const darkMode = cookies.darkMode || false;
+
return {
- headers
+ headers,
+ context: {
-+ user: await db.get_user(cookies.session_id)
++ user: await db.get_user(cookies.session_id),
++ darkMode,
+ }
};
}
```
-
### getSession
This function takes the `context` returned from `prepare` and returns a `session` object that is safe to expose to the browser.
@@ -101,4 +103,42 @@ export function getSession({ context }) {
}
```
-> `session` must be serializable, which means it must not contain things like functions or custom classes, just built-in JavaScript data types
\ No newline at end of file
+> `session` must be serializable, which means it must not contain things like functions or custom classes, just built-in JavaScript data types
+
+### transformTemplate
+
+This function takes the `src/app.html template` and the `context` returned from `prepare`. It should return the template after transforming it.
+
+```js
+/**
+ * @param {{
+ * template: string
+ * context: any
+ * }} options
+ * @returns {string}
+ */
+export function transformTemplate({ context, template }) {
+ if (!context.darkMode) {
+ return template;
+ }
+
+ return template.replace('%My.HtmlClass%', 'dark');
+}
+```
+
+> The corresponding `src/app.html` file would look like this:
+
+```html
+
+
+