Skip to content

Commit b3d42c3

Browse files
committed
Revert "Revert "Fix sveltejs#1579""
This reverts commit f2cb6f4.
1 parent f2cb6f4 commit b3d42c3

File tree

11 files changed

+266
-0
lines changed

11 files changed

+266
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import resolve from '@rollup/plugin-node-resolve';
2+
import replace from '@rollup/plugin-replace';
3+
import svelte from 'rollup-plugin-svelte';
4+
5+
const mode = process.env.NODE_ENV;
6+
const dev = mode === 'development';
7+
8+
const config = require('../../../config/rollup.js');
9+
10+
export default {
11+
client: {
12+
input: config.client.input(),
13+
output: config.client.output(),
14+
plugins: [
15+
replace({
16+
'process.browser': true,
17+
'process.env.NODE_ENV': JSON.stringify(mode)
18+
}),
19+
svelte({
20+
dev,
21+
hydratable: true,
22+
emitCss: true
23+
}),
24+
resolve()
25+
],
26+
preserveEntrySignatures: false
27+
},
28+
29+
server: {
30+
input: config.server.input(),
31+
output: config.server.output(),
32+
plugins: [
33+
replace({
34+
'process.browser': false,
35+
'process.env.NODE_ENV': JSON.stringify(mode)
36+
}),
37+
svelte({
38+
generate: 'ssr',
39+
dev
40+
}),
41+
resolve({
42+
preferBuiltins: true
43+
})
44+
],
45+
external: ['sirv', 'polka'],
46+
preserveEntrySignatures: 'strict'
47+
},
48+
49+
serviceworker: {
50+
input: config.serviceworker.input(),
51+
output: config.serviceworker.output(),
52+
plugins: [
53+
resolve(),
54+
replace({
55+
'process.browser': true,
56+
'process.env.NODE_ENV': JSON.stringify(mode)
57+
})
58+
],
59+
preserveEntrySignatures: false
60+
}
61+
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import * as sapper from '@sapper/app';
2+
3+
window.start = () => sapper.start({
4+
target: document.querySelector('#sapper')
5+
});
6+
7+
window.prefetchRoutes = () => sapper.prefetchRoutes();
8+
window.prefetch = href => sapper.prefetch(href);
9+
window.goto = href => sapper.goto(href);
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<h3>This is content defined in a component imported by a layout in a nested routes.</h3>
2+
3+
<style>
4+
h3 {
5+
background-color: rgb(255, 0, 0);
6+
color: #fff;
7+
}
8+
</style>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<script>
2+
export let status;
3+
export let error;
4+
</script>
5+
6+
<style>
7+
h1 {
8+
color: purple;
9+
}
10+
</style>
11+
12+
<h1>This is an error page</h1>
13+
14+
<h2>{status}</h2>
15+
16+
<p>{error.message}</p>
17+
18+
<pre>{error.stack}</pre>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<h1>Great success!</h1>
2+
3+
<style>
4+
h1 {
5+
color: red;
6+
}
7+
</style>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<script>
2+
import Test from '../_components/Test.svelte';
3+
</script>
4+
5+
<h2>This is content defined in a layout in a nested route. It should have a green background.</h2>
6+
7+
<Test/>
8+
9+
<slot></slot>
10+
11+
<style>
12+
h2 {
13+
background-color: rgb(0, 128, 0);
14+
color: #fff;
15+
margin-bottom: 2rem;
16+
}
17+
</style>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<p>This is slotted page content in a nested routes.</p>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import polka from 'polka';
2+
import * as sapper from '@sapper/server';
3+
4+
import { start } from '../../common.js';
5+
6+
const app = polka()
7+
.use(sapper.middleware());
8+
9+
start(app);
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import * as sapper from '@sapper/service-worker';
2+
3+
const ASSETS = `cache${sapper.timestamp}`;
4+
5+
// `shell` is an array of all the files generated by webpack,
6+
// `files` is an array of everything in the `static` directory
7+
const to_cache = sapper.shell.concat(sapper.files);
8+
const cached = new Set(to_cache);
9+
10+
self.addEventListener('install', event => {
11+
event.waitUntil(
12+
caches
13+
.open(ASSETS)
14+
.then(cache => cache.addAll(to_cache))
15+
.then(() => {
16+
self.skipWaiting();
17+
})
18+
);
19+
});
20+
21+
self.addEventListener('activate', event => {
22+
event.waitUntil(
23+
caches.keys().then(async keys => {
24+
// delete old caches
25+
for (const key of keys) {
26+
if (key !== ASSETS) await caches.delete(key);
27+
}
28+
29+
self.clients.claim();
30+
})
31+
);
32+
});
33+
34+
self.addEventListener('fetch', event => {
35+
if (event.request.method !== 'GET') return;
36+
37+
const url = new URL(event.request.url);
38+
39+
// don't try to handle e.g. data: URIs
40+
if (!url.protocol.startsWith('http')) return;
41+
42+
// ignore dev server requests
43+
if (url.hostname === self.location.hostname && url.port !== self.location.port) return;
44+
45+
// always serve assets and webpack-generated files from cache
46+
if (url.host === self.location.host && cached.has(url.pathname)) {
47+
event.respondWith(caches.match(event.request));
48+
return;
49+
}
50+
51+
// for pages, you might want to serve a shell `index.html` file,
52+
// which Sapper has generated for you. It's not right for every
53+
// app, but if it's right for yours then uncomment this section
54+
/*
55+
if (url.origin === self.origin && routes.find(route => route.pattern.test(url.pathname))) {
56+
event.respondWith(caches.match('/index.html'));
57+
return;
58+
}
59+
*/
60+
61+
if (event.request.cache === 'only-if-cached') return;
62+
63+
// for everything else, try the network first, falling back to
64+
// cache if the user is offline. (If the pages never change, you
65+
// might prefer a cache-first approach to a network-first one.)
66+
event.respondWith(
67+
caches
68+
.open(`offline${sapper.timestamp}`)
69+
.then(async cache => {
70+
try {
71+
const response = await fetch(event.request);
72+
cache.put(event.request, response.clone());
73+
return response;
74+
} catch (err) {
75+
const response = await cache.match(event.request);
76+
if (response) return response;
77+
78+
throw err;
79+
}
80+
})
81+
);
82+
});
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset='utf-8'>
5+
6+
%sapper.base%
7+
%sapper.styles%
8+
%sapper.head%
9+
%sapper.scripts%
10+
</head>
11+
<body>
12+
<div id='sapper'>%sapper.html%</div>
13+
</body>
14+
</html>

test/apps/css-nested-layout/test.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import * as assert from 'assert';
2+
import { build } from '../../../api';
3+
import { AppRunner } from '../AppRunner';
4+
5+
describe('css-nested-layout', function() {
6+
this.timeout(10000);
7+
8+
let r: AppRunner;
9+
10+
// hooks
11+
before('build app', () => build({ cwd: __dirname }));
12+
before('start runner', async () => {
13+
r = await new AppRunner().start(__dirname);
14+
});
15+
16+
after(() => r && r.end());
17+
18+
// tests
19+
it('includes CSS defined in nested layout with server render', async () => {
20+
await r.load('/nested');
21+
22+
assert.strictEqual(
23+
await r.page.$eval('h2', node => getComputedStyle(node).backgroundColor),
24+
'rgb(0, 128, 0)'
25+
);
26+
});
27+
28+
it('includes CSS defined in component imported by nested layout with server render', async () => {
29+
await r.load('/nested');
30+
31+
assert.strictEqual(
32+
await r.page.$eval('h3', node => getComputedStyle(node).backgroundColor),
33+
'rgb(255, 0, 0)'
34+
);
35+
});
36+
37+
it('survives the tests with no server errors', () => {
38+
assert.deepStrictEqual(r.errors, []);
39+
});
40+
});

0 commit comments

Comments
 (0)