Compare commits

..

1062 Commits

Author SHA1 Message Date
Richard Harris
a86b613e12 -> v0.27.1 2019-05-21 00:17:22 -04:00
Rich Harris
fcd66fb736 Merge pull request #704 from sveltejs/gh-701
always re-run preload functions when query string changes
2019-05-21 00:12:09 -04:00
Richard Harris
b6e2736eb0 always re-run preload functions when query string changes - fixes #701 2019-05-20 23:45:39 -04:00
Richard Harris
aa31e3ca6a refactor slightly 2019-05-20 23:11:50 -04:00
Richard Harris
8b310dd458 Merge branch 'issues/688' of https://github.com/btakita/sapper into btakita-issues/688 2019-05-20 23:08:58 -04:00
Brian Takita
5460896228 Checking the current_branch[i] route match against the current request's route match.
current_branch[i].match.slice(1, i+2) compared to match.slice(1, i+2)

Fixes https://github.com/sveltejs/sapper/issues/688
2019-05-20 23:03:08 -04:00
Rich Harris
bcf6ac3a6f Merge pull request #692 from sveltejs/gh-331
leave anchor scrolling on initial load to browser
2019-05-20 22:37:26 -04:00
Rich Harris
b8d99aaa90 Merge pull request #632 from pngwn/master
Add support for custom route file extensions.
2019-05-20 22:33:56 -04:00
Rich Harris
2bb173f140 Merge pull request #683 from cristianl/pr-make-live-optional
Allow disabling live reload
2019-05-20 22:24:06 -04:00
Rich Harris
594cb0a356 Merge pull request #694 from jarrodldavis/fix/restart-server
Fix restarting server in dev
2019-05-20 22:23:29 -04:00
Rich Harris
9ff87af23b Merge pull request #698 from mrkishi/gh-689
Fix export queue
2019-05-20 22:20:59 -04:00
Conduitry
75afc691f4 site: fix doc hash link destinations (#696) 2019-05-18 15:41:59 -04:00
mrkishi
9dd63ab760 fix export queue 2019-05-17 16:50:08 -03:00
pngwn
e7b1aa373a Add support for custom route file extensions. 2019-05-17 19:19:04 +01:00
Antony Jones
ce50c2ff98 License is MIT, not LIL 2019-05-16 11:42:20 -04:00
Jarrod Davis
6add2518aa Fix restarting server in dev
Wait for the server process to exit before starting a new one, so that
the server debugger port is free when the new process begins.
2019-05-15 02:28:41 -06:00
Conduitry
ab939b8cb5 site: update links to Discord chat 2019-05-15 00:34:48 -04:00
Conduitry
b59d9003f9 leave anchor scrolling on initial load to browser (#331) 2019-05-13 08:56:21 -04:00
Cristian Lorsson
1fc169e7b8 Reload only when live reload is enabled 2019-05-10 15:08:32 -03:00
Rich Harris
7aa3e90f87 Merge pull request #677 from mrkishi/infinite-loop
Abort infinite loop for preload errors
2019-05-10 09:45:11 -04:00
Rich Harris
b27c9ecd59 Merge pull request #681 from Troush/patch-1
Typo fix for proper routing link
2019-05-10 09:13:56 -04:00
Alex
8653a799eb Typo fix for proper routing link 2019-05-10 14:50:42 +03:00
mrkishi
62969d59f6 Abort infinite loop for preload errors 2019-05-09 10:40:23 -03:00
Richard Harris
5c07080207 -> v0.27.0 2019-05-09 09:38:21 -04:00
Richard Harris
c2ed73f103 -> v0.27.0 2019-05-09 09:30:45 -04:00
Richard Harris
133ac07ed2 remove some unused imports 2019-05-09 09:26:49 -04:00
Richard Harris
7417de101e Merge branch 'master' of github.com:sveltejs/sapper 2019-05-09 09:26:13 -04:00
Rich Harris
2792b7c5d1 Merge pull request #676 from mrkishi/server-indexes
Consolidate index handling for page and server routes
2019-05-09 09:18:26 -04:00
Rich Harris
cf8d5ee717 Merge pull request #670 from cristianl/pr-rollup-output-naming
Build rollup config: Don't add hashes to files in dist
2019-05-09 09:15:04 -04:00
Rich Harris
8e4517a1ad Merge pull request #673 from mrkishi/testing-issue
Harden tests (...a bit)
2019-05-09 08:57:18 -04:00
Rich Harris
91894722ee Merge pull request #652 from sveltejs/relicense
switch license to MIT
2019-05-09 08:44:32 -04:00
Rich Harris
933b3b76a6 Merge pull request #665 from mrkishi/node-stable
Switch to node stable
2019-05-09 08:42:07 -04:00
Richard Harris
3ed4d1d887 update deps 2019-05-09 08:39:58 -04:00
Richard Harris
dda936e53b fix theme color 2019-05-09 08:34:41 -04:00
Rich Harris
ac4eb84f3d Merge pull request #662 from thollander/feat/fix-mobile-viewport
Fix mobile viewport KO
2019-05-09 08:32:57 -04:00
Rich Harris
9e70e68c0c Merge pull request #664 from mrkishi/refactor
Tidy a few things up
2019-05-09 08:28:57 -04:00
Rich Harris
22389eab99 Merge pull request #678 from mrkishi/generated-app-quoted-attributes
Add attribute quotes to generated `App.svelte`
2019-05-09 08:24:02 -04:00
mrkishi
fe6b7976ef Add attribute quotes to generated App.svelte 2019-05-08 22:44:07 -03:00
mrkishi
54e92c3b99 Regularize page and server routes
Treats both page and server routes similarly in regards to indexes.

It's a (somewhat) breaking change: server routes will accept trailing
slashes to match page routes behavior, but only if there's no extension.

We still need a stronger support for dealing with different clean urls
rules.
2019-05-08 12:24:45 -03:00
mrkishi
e6c1a54164 Harden tests (...a bit) 2019-05-08 00:57:59 -03:00
Cristian Lorsson
629b5601c8 Don't add hashes to dist output
Default is '[name].[hash].js'
2019-05-06 20:46:32 -03:00
Conduitry
8bdd363a19 site: remove chokidar 2019-05-06 12:50:31 -04:00
mrkishi
8fcc27d44f Update svelte to released v3 2019-05-05 23:19:00 -03:00
mrkishi
f6e72a0432 Update dependencies 2019-05-05 21:25:00 -03:00
mrkishi
f886a12bd7 Group route filters 2019-05-05 14:51:23 -03:00
mrkishi
6c03cfd46a Extract layout file search 2019-05-05 14:51:22 -03:00
mrkishi
78480fe5e8 Fix typo 2019-05-05 14:51:22 -03:00
mrkishi
5cba40b7e0 Refactor compose_handlers and ignore 2019-05-05 14:51:22 -03:00
Richard Harris
c99b787632 -> v0.26.1 2019-05-05 11:44:53 -04:00
Rich Harris
99a25308fc Merge pull request #663 from sveltejs/skipped-segments
Handle skipped segments
2019-05-05 11:44:08 -04:00
Richard Harris
c0ada5c52f handle skipped segments 2019-05-05 11:36:02 -04:00
Richard Harris
d51e1a0af8 failing test for skipped segments 2019-05-05 10:49:38 -04:00
thollander
5e5a8c4c69 Fix mobile viewport KO
- Changed `;` to `,` which causes the bug
2019-05-05 12:17:41 +02:00
Rich Harris
49f8b2c4bd Update 10-exporting.md 2019-05-04 10:58:26 -04:00
Rich Harris
2754ba0ee4 Merge pull request #655 from zigomir/patch-1
Fix template
2019-05-04 10:34:10 -04:00
ziga
1ad27573c6 Need to use branch
- fix port
2019-05-02 20:41:11 -04:00
ziga
f10b941c4e Fix template 2019-05-02 20:37:11 -04:00
Conduitry
6ca869a3b1 update links in readme 2019-05-02 10:11:24 -04:00
Richard Harris
f44e900d61 -> v0.26.0 2019-05-02 09:10:48 -04:00
Rich Harris
69baa99a79 Merge pull request #638 from sveltejs/site
start adding site to main repo
2019-05-02 08:49:09 -04:00
Rich Harris
ff6eb3d915 Merge pull request #651 from sveltejs/shimport
always use latest shimport
2019-05-02 08:36:21 -04:00
Richard Harris
a2204a9d2e switch license to MIT 2019-05-02 08:32:40 -04:00
Richard Harris
011e20519f use shimport ^1.0.0 2019-05-02 08:30:51 -04:00
Richard Harris
4589ffe759 add deploy script 2019-05-02 08:25:57 -04:00
Richard Harris
e2502edc08 fix broken links 2019-05-02 08:23:04 -04:00
Richard Harris
c55fe8fcf8 always use latest shimport 2019-05-01 09:22:26 -04:00
Richard Harris
5d6e4c2287 add netlify config 2019-05-01 09:17:05 -04:00
Richard Harris
b0a8534de5 Merge branch 'master' into site 2019-05-01 09:01:39 -04:00
Rich Harris
1a36fb53cd Merge pull request #642 from sveltejs/context-stores
give each app its own page, preloading and session stores, using context
2019-05-01 09:01:25 -04:00
Richard Harris
f84318b21d clarify a couple of points 2019-05-01 08:56:59 -04:00
Rich Harris
316c9d7baa lol 2019-04-30 13:28:52 -04:00
Rich Harris
52ed1cb2c6 update site-kit version 2019-04-30 13:25:17 -04:00
Rich Harris
dc73973d44 update docs 2019-04-30 12:10:53 -04:00
Richard Harris
bca88831da add 0.26 migration guide 2019-04-30 09:25:40 -04:00
Rich Harris
afeedf6bb2 give each app its own page, preloading and session stores, using context 2019-04-29 14:52:19 -04:00
Rich Harris
9c48e32a45 Merge pull request #641 from sveltejs/gh-604-redux
prevent hanging with large numbers of links
2019-04-29 13:43:55 -04:00
Rich Harris
bc8e5501cd prevent hanging with large numbers of links (#604) 2019-04-29 13:10:15 -04:00
Rich Harris
1707fe8e9d wait inside handle function when exporting 2019-04-29 11:55:03 -04:00
Rich Harris
ff60a7b389 Merge branch 'gh-604-alpha' of https://github.com/bwbroersma/sapper into bwbroersma-gh-604-alpha 2019-04-29 11:50:08 -04:00
Rich Harris
1bc7096a9e Merge pull request #591 from thgh/redirect-basepath
Fix redirect with basepath
2019-04-29 11:43:51 -04:00
Rich Harris
497ae89279 add a test for #618 2019-04-29 11:23:42 -04:00
Rich Harris
02e0aeb8a2 merge master -> artemjackson-patch-3 2019-04-29 11:22:21 -04:00
Rich Harris
15924d9768 shuffle things around 2019-04-29 11:04:40 -04:00
Rich Harris
e07c27adba Merge pull request #607 from cudr/spread_routes
[...spread] routes
2019-04-29 10:39:21 -04:00
Richard Harris
54abed7d6e hack 2019-04-29 09:09:45 -04:00
Richard Harris
d3782dac28 reverse migration order 2019-04-29 09:04:18 -04:00
Richard Harris
26bdd54484 move more stuff into site-kit 2019-04-28 22:52:56 -04:00
Richard Harris
63251c6733 fix some styles 2019-04-28 22:06:02 -04:00
Richard Harris
381af86f04 move old docs over 2019-04-28 21:44:34 -04:00
Richard Harris
36f91d4e9a start adding site to main repo 2019-04-28 14:37:02 -04:00
cudr
54efe7235a fix comparator sort && add more tests 2019-04-28 00:14:27 +03:00
Rich Harris
8c7ce2c6bb Merge branch 'master' into spread_routes 2019-04-27 13:09:54 -04:00
Richard Harris
01dd08849a Merge branch 'master' of github.com:sveltejs/sapper 2019-04-27 13:05:28 -04:00
Richard Harris
534a96214e pin node version to 11, for now 2019-04-27 13:05:22 -04:00
Rich Harris
9725767fe2 Merge pull request #593 from thgh/patch-4
Provide session in layout preload
2019-04-27 12:19:58 -04:00
Rich Harris
90ec61f14d Merge pull request #603 from sveltejs/gh-602
fix handling of empty hrefs during export
2019-04-27 12:18:45 -04:00
Rich Harris
4f9919e95c Merge pull request #610 from cudr/navigate_fix
Navigate from /a/[id] to /b/[id] fix
2019-04-27 11:56:03 -04:00
Rich Harris
83e427178e Merge branch 'master' into spread_routes 2019-04-27 11:16:18 -04:00
Rich Harris
b089ca42ff Merge pull request #608 from cudr/preload_return_fix
Don't crash if preload return empty
2019-04-27 11:15:14 -04:00
Rich Harris
6cb4030b2b Merge branch 'master' into navigate_fix 2019-04-27 11:11:27 -04:00
Rich Harris
a89f7b01bb Merge pull request #616 from Seb35/fix-swindex-base-path
Fix base-path with service-worker-index.html - fixes #579
2019-04-27 11:07:36 -04:00
Rich Harris
96a068245b Merge pull request #620 from cudr/error_page_hooks
Error page lifecycle
2019-04-27 11:06:28 -04:00
Richard Harris
0862d0e2c8 add a test for server-route-as-middleware 2019-04-27 10:55:22 -04:00
Richard Harris
a26f8600c1 Merge branch 'html' of https://github.com/akihikodaki/sapper into akihikodaki-html 2019-04-27 10:47:49 -04:00
Rich Harris
f9d1dc5d3f Merge pull request #622 from artemjackson/patch-2
Fixed %sapper.styles% injection for webpack apps
2019-04-21 13:42:21 -04:00
Rich Harris
52c4106d2c in this house we use tabs 2019-04-21 13:41:52 -04:00
Akihiko Odaki
0fd332135e Allow to have middleware for the path same with a HTML page
The feature was introduced with 9e2d0a7fbc,
but regressed with commit 8dc52a04e4.
2019-04-13 19:42:19 +09:00
Artyom Stepanishchev
06eee32ee5 Fix for #618
`query-string` is used as example

see https://github.com/sindresorhus/query-string/blob/master/index.js#L186
2019-04-08 22:56:35 +03:00
cudr
9bb8bfa884 receive preloaded root_data 2019-04-08 20:07:42 +03:00
Artyom Stepanishchev
01c0097acb Fixed %sapper.styles% injection for webpack builds 2019-04-08 18:51:35 +03:00
cudr
dcf726a89b add missed semicolon 2019-04-06 02:51:05 +03:00
cudr
9e60a71cf5 clean up 2019-04-06 02:50:00 +03:00
cudr
3a9d457389 execute error page hooks 2019-04-06 02:32:11 +03:00
Seb35
1e9cd84854 Fix base-path with service-worker-index.html - fixes #579 2019-03-25 20:33:43 +01:00
Benjamin W. Broersma
bf50392df5 Fixes #604 - using single queue for export. 2019-03-22 00:43:08 +01:00
cudr
d2cda4b6c0 add test 2019-03-15 05:13:18 +03:00
cudr
0dd2d2eb4a complete fix 2019-03-15 04:57:10 +03:00
cudr
6bf3dd04dd fix empty preload 2019-03-13 15:18:23 +03:00
cudr
81f80e6215 spread routes 2019-03-13 15:14:06 +03:00
Conduitry
6d5aa9a35d fix handling of empty hrefs during export (#602) 2019-03-11 10:39:35 -04:00
Richard Harris
7be7e1eb9f bump alpha version 2019-03-08 09:25:54 -05:00
Richard Harris
ca7973465b Merge branch 'master' of github.com:sveltejs/sapper 2019-03-08 08:37:08 -05:00
Rich Harris
f7c88df3be Merge pull request #596 from sveltejs/recover-alpha-10
various lost changes and fixes from 0.26.0-alpha.10
2019-03-08 08:35:47 -05:00
Conduitry
74c66b784f Server-side preload check fixes (fixes #575, #594, #598) 2019-03-08 08:34:36 -05:00
Conduitry
9e9bd10333 various lost changes and fixes from 0.26.0-alpha.10 2019-03-07 13:18:40 -05:00
Thomas Ghysels
8858301fed Provide session in layout preload 2019-03-05 15:22:40 +01:00
Rich Harris
9540383796 bump alpha version 2019-03-04 19:44:22 -05:00
halfnelson
b5edf0edd5 Fix export race condition (#585)
* Await all items in the export queue before killing server
2019-03-04 05:21:30 -05:00
Thomas Ghysels
13b64cd1bb Fix redirect with basepath
Fix #589
2019-03-03 10:40:49 +01:00
Thomas Ghysels
9522cb4539 Add failing test for #589 2019-03-02 18:35:16 +01:00
Richard Harris
6dad750942 Merge branch 'better-errors' 2019-02-24 20:56:20 -05:00
Richard Harris
eee9d21900 tidy up 2019-02-24 20:56:16 -05:00
Richard Harris
55505571f8 extract entry css correctly 2019-02-24 20:44:19 -05:00
Richard Harris
4fe3c96c2d print file/location/frame when encountering an initial error in dev 2019-02-22 09:28:08 -05:00
Rich Harris
411e2594af bump alpha version 2019-02-21 17:05:06 -05:00
Rich Harris
e0de230e13 Slot-based routing (#573) 2019-02-21 16:34:07 -05:00
Tamas Ridly
c637687922 Fixed README - Get started section 2019-02-18 08:01:09 -05:00
Richard Harris
57fe5bdfa2 bump alpha version 2019-02-17 10:10:02 -05:00
Rich Harris
b2b476abb1 Merge pull request #568 from nolanlawson/nolan/preload-in-export
fix: add link rel=preload for exported sites
2019-02-17 09:55:08 -04:00
Rich Harris
ad0ebb8a69 Merge branch 'master' into nolan/preload-in-export 2019-02-17 09:51:03 -04:00
Rich Harris
130eafbd0a Merge pull request #566 from nolanlawson/nolan/issue-565
fix: fix "sapper export" with a custom PORT
2019-02-17 09:48:02 -04:00
Rich Harris
9d2ce6d852 Merge pull request #563 from nolanlawson/patch-2
Remove unnecessary index.html file serve
2019-02-17 09:46:55 -04:00
Rich Harris
a476d21c9b Merge pull request #561 from thgh/patch-3
Use getElementById to avoid querySelector error
2019-02-17 09:45:57 -04:00
Rich Harris
30b4b6660b Merge pull request #569 from sveltejs/update-rollup
update Rollup, remove some superfluous deps
2019-02-17 09:45:02 -04:00
Richard Harris
cfd10c6f61 remove some more unused deps 2019-02-17 08:32:02 -05:00
Richard Harris
82a4973943 remove node 6 from ci matrix 2019-02-17 08:31:48 -05:00
Richard Harris
0609a92f3a update Rollup, remove some superfluous deps 2019-02-17 08:23:30 -05:00
Nolan Lawson
37780656fd fix incorrect test 2019-02-16 00:13:27 -08:00
Nolan Lawson
351ab13d29 fix: add link rel=preload for exported sites 2019-02-16 00:07:06 -08:00
Nolan Lawson
795da23418 fix: fix "sapper export" with a custom PORT
Fixes #565
2019-02-15 18:50:34 -08:00
Nolan Lawson
1f1211b7b4 Remove unnecessary index.html file serve
As far as I can tell, `/index.html` should no longer exist (outside of `sapper export`, which doesn't apply here). After #525 was merged, we're now using `/service-worker-index.html`, but that's handled by `get_page_handler.ts`, not here. So this code is doing nothing.
2019-02-14 19:14:14 -08:00
Thomas Ghysels
acafeac1cc Fix #561 2019-02-13 17:59:32 +01:00
Rich Harris
82e637ea7c Merge pull request #559 from sveltejs/svelte-extension
Use .svelte extension
2019-02-08 11:47:37 -05:00
Rich Harris
14ace57612 rename .html files to .svelte 2019-02-08 11:40:30 -05:00
Rich Harris
84a0ae562f support .svelte or .html extensions 2019-02-08 11:34:33 -05:00
Rich Harris
8870b58766 bump alpha version 2019-02-08 10:42:46 -05:00
Rich Harris
54506c1eb6 bump alpha version 2019-02-07 08:47:32 -05:00
Rich Harris
4f6b2dcb7c fix kleur thing 2019-02-07 08:47:02 -05:00
Richard Harris
0a87204593 Merge branch 'svelte-3' 2019-02-04 07:43:11 -05:00
Richard Harris
720cf8a859 treat foo.html and foo/index.html the same when generating manifest 2019-02-04 07:42:45 -05:00
Rich Harris
ca034d0857 Support Svelte 3
fixes #546, #551, #552, #554
2019-02-03 14:29:47 -05:00
Richard Harris
96b9d19715 remove typescript in favour of sucrase 2019-02-03 14:28:59 -05:00
Richard Harris
293da8bcd1 fix a cmd-f/cmd-r mistake 2019-02-03 14:12:17 -05:00
Richard Harris
7150c7e088 -> v0.26.0-alpha.3 2019-02-03 13:06:37 -05:00
Richard Harris
a85e1424e3 fix segments 2019-02-03 13:01:40 -05:00
Richard Harris
0628ea99ab minor fixes 2019-02-03 12:51:29 -05:00
Richard Harris
3d7cfbbf3d tidy up 2019-02-03 00:14:53 -05:00
Richard Harris
66be631572 remove experimentalCodeSplitting 2019-02-02 21:00:32 -05:00
Richard Harris
c964500118 implement session/preload on client 2019-02-02 16:13:07 -05:00
Richard Harris
91ea0335ae implement session/preload on server 2019-02-02 15:44:16 -05:00
Richard Harris
11d3da3aed add session tests 2019-02-02 15:42:35 -05:00
Richard Harris
7fefc59929 tidy up 2019-02-02 13:28:48 -05:00
Richard Harris
3521eff4f4 more tidying up 2019-02-02 13:20:53 -05:00
Richard Harris
b7fce99438 simplify 2019-02-02 13:01:55 -05:00
Richard Harris
85c86b5562 tidy up 2019-02-02 12:53:36 -05:00
Richard Harris
81bbfce448 tidy up 2019-02-02 00:15:01 -05:00
Richard Harris
6e8ba295d4 bump svelte version 2019-02-01 23:50:21 -05:00
Rich Harris
0168d8b70c tidy up 2019-02-01 22:37:39 -05:00
Rich Harris
548de702ac move all page info to app-level stores 2019-02-01 22:28:47 -05:00
Rich Harris
7ba1a0a9fa fix test 2019-02-01 11:09:15 -05:00
Rich Harris
3bab780f88 only import preload when appropriate 2019-02-01 11:09:08 -05:00
Rich Harris
263bb08334 various 2019-02-01 10:54:43 -05:00
Richard Harris
3445ec66ac figure out if component has preload early on 2019-02-01 09:28:24 -05:00
Richard Harris
4940c5d5be merge master -> svelte-3, fix various typescript and webpack oddities 2019-02-01 08:21:45 -05:00
Richard Harris
83c8d7f855 -> v0.25.0 2019-02-01 06:45:08 -05:00
Rich Harris
fdfe282130 Merge pull request #484 from mrkishi/goto-temporary-fix
Ensure deepest layout is always refreshed on goto
2019-02-01 06:40:43 -05:00
Rich Harris
b5fbc7e0e8 Merge pull request #539 from cudr/nested-routes-navigate-fix
Fix nested routes navigates
2019-02-01 06:39:25 -05:00
Rich Harris
64eb3f856a Merge pull request #369 from sveltejs/crawl-queue
Don't try to crawl hundreds of pages simultaneously
2019-02-01 06:15:30 -05:00
Richard Harris
18d8e61ecb remove unused declaration 2019-02-01 06:04:43 -05:00
Richard Harris
2a635f92a9 merge master -> crawl-queue 2019-02-01 06:04:00 -05:00
Richard Harris
44bcbeb7d6 remove redundant line 2019-02-01 05:57:17 -05:00
Rich Harris
4023831b18 Merge pull request #542 from sveltejs/gh-528
avoid mutating `opts.headers` in `this.fetch` (#528)
2019-02-01 05:47:54 -05:00
Richard Harris
969169ae20 -> v0.24.3 2019-02-01 05:40:58 -05:00
Rich Harris
79fa15da3d Merge pull request #525 from nolanlawson/nolan/sw-index-html
add service-worker-index.html
2019-02-01 05:36:08 -05:00
Rich Harris
ddc08d94cc Merge pull request #535 from nolanlawson/nolan/no-sourcemap-in-sw
Do not include sourcemap files in Service Worker shell
2019-02-01 05:34:20 -05:00
Rich Harris
f587161d7d first crack at context-driven store 2019-01-31 21:42:29 -05:00
Rich Harris
d486542a8b update store test 2019-01-31 11:32:51 -05:00
Rich Harris
c990c771d8 switch to mjs to align with Svelte 2019-01-31 11:32:05 -05:00
Rich Harris
90f3393ebf default to generating app in src/node_modules/@sapper - fixes #551 2019-01-31 10:35:14 -05:00
Rich Harris
76ce7f227f tidy up test 2019-01-30 16:27:13 -05:00
Rich Harris
1f9efd353c fix scrolling to deep links 2019-01-30 15:43:42 -05:00
Rich Harris
3499631e8e remove experimentalCodeSplitting 2019-01-30 14:08:55 -05:00
Rich Harris
2a825269e9 bump svelte version 2019-01-30 13:38:48 -05:00
Rich Harris
83f7102f6b use nextTick 2019-01-30 13:35:50 -05:00
Rich Harris
e4319bee0e error handling 2019-01-30 10:25:43 -05:00
Rich Harris
da540ef15f update some tests 2019-01-30 10:21:55 -05:00
Rich Harris
c00af6dad0 update deps 2019-01-30 10:21:43 -05:00
Conduitry
92206742d4 avoid mutating opts.headers in this.fetch (#528) 2018-12-31 17:08:29 -05:00
Conduitry
14fc6b3176 support Rollup 1.0 2018-12-31 16:51:05 -05:00
Richard Harris
e2193a6080 -> v0.24.2 2018-12-31 11:46:08 -05:00
Richard Harris
f66c7dcb0d -> v0.24.2 2018-12-31 11:45:20 -05:00
Rich Harris
06f1a0e6c0 Merge pull request #541 from sveltejs/rollup-1.0
support Rollup 1.0
2018-12-31 11:44:22 -05:00
Conduitry
7726325b4b support Rollup 1.0 2018-12-31 11:14:49 -05:00
cudr
b6bc90cea9 add test 2018-12-26 14:12:49 +03:00
cudr
cfba9b2168 fix nested routes navigate 2018-12-25 19:05:00 +03:00
Rich Harris
b25c642bf1 upgrade shimport, bump alpha version 2018-12-23 17:08:54 -05:00
Rich Harris
82a023c302 various 2018-12-20 23:16:03 -05:00
Nolan Lawson
f97400caaa Do not include sourcemap files in Service Worker shell
Fixes #534
2018-12-16 11:48:54 -08:00
Nolan Lawson
03af9b1a16 add service-worker-index.html
fixes #422
2018-12-12 18:30:16 +00:00
Rich Harris
02cef046aa -> v0.24.1 2018-12-09 10:30:34 -05:00
Rich Harris
c2aeac34b6 Merge pull request #530 from artemjackson/patch-1
Fixed rel="preload" `as` attribute for styles
2018-12-09 10:28:39 -05:00
Rich Harris
abd2f7fd39 Merge pull request #529 from artemjackson/master
Added css build info for webpack apps
2018-12-09 10:28:19 -05:00
Artyom Stepanishchev
e7cf9bf1b6 Merge branch 'master' of github.com:sveltejs/sapper 2018-12-09 18:01:31 +03:00
Artyom Stepanishchev
1fdd0e3ad2 Merge branch 'master' of github.com:sveltejs/sapper into patch-1 2018-12-09 18:00:55 +03:00
Rich Harris
af0a7e04f9 Merge pull request #531 from artemjackson/bugfix/tests
Fixed tests for node 6
2018-12-09 09:57:12 -05:00
Artyom Stepanishchev
ed19a19fed Fixed tests for node 6 2018-12-09 17:28:59 +03:00
Artyom Stepanishchev
8ebfcc9a54 Fixed rel="preload" as attribute for styles 2018-12-07 23:59:51 +03:00
Artyom Stepanishchev
af2a792508 Added css build info for webpack apps 2018-12-07 23:28:28 +03:00
Conduitry
14e809af6e update npm-run-all to remove malicious flatmap-stream@0.1.1 2018-12-06 07:02:04 -05:00
Rich Harris
03c5f5b446 -> v0.24.0 2018-10-27 12:40:27 -04:00
Rich Harris
6655b1b49d Merge pull request #503 from sveltejs/gh-490
redirect to external URLs
2018-10-27 12:36:10 -04:00
Rich Harris
eebf076f23 Merge pull request #501 from sveltejs/gh-497
consistent query parameter handling between client and server
2018-10-27 12:35:58 -04:00
Rich Harris
198be28f4b Merge pull request #504 from sveltejs/gh-480
change scroll[X|Y] to page[X|Y]Offset
2018-10-27 12:35:47 -04:00
Rich Harris
4f720446b2 change scroll[X|Y] to page[X|Y]Offset - closes #480 2018-10-27 12:26:53 -04:00
Rich Harris
e69cb3639a redirect to external URLs - closes #490 2018-10-27 12:14:28 -04:00
Rich Harris
1b1a86764f Merge pull request #502 from sveltejs/gh-495
strip leading slash from basepath
2018-10-27 11:50:23 -04:00
Rich Harris
f50f83c4a4 strip leading slash from basepath - fixes #495 2018-10-27 11:41:02 -04:00
Rich Harris
eadefd996b consistent query parameter handling between client and server - fixes #497 2018-10-27 11:36:18 -04:00
Rich Harris
ab52aabd1d Merge pull request #500 from sveltejs/dont-buffer-logs
don't buffer stdout/stderr
2018-10-27 11:18:50 -04:00
Rich Harris
c5a80543b3 reduce flakiness of unrelated test 2018-10-27 11:12:10 -04:00
Rich Harris
cfd95ac024 dont buffer stdout/stderr 2018-10-27 11:02:34 -04:00
Rich Harris
73ff95c677 Merge pull request #498 from mrkishi/build-dir
Add missing posixify to `build_dir`
2018-10-27 10:17:58 -04:00
mrkishi
382fe6b7b9 Add missing posixify 2018-10-26 11:03:29 -03:00
Rich Harris
3b714c0de3 -> v0.23.5 2018-10-24 21:40:04 -04:00
Rich Harris
28186227a9 add tests 2018-10-24 21:20:27 -04:00
Rich Harris
2ac0f2bf3d Merge branch 'search-params-decoding' of https://github.com/mrkishi/sapper into mrkishi-search-params-decoding 2018-10-24 21:10:35 -04:00
Rich Harris
4991f3b359 support non-native promise implementations 2018-10-24 21:05:25 -04:00
Rich Harris
65128118c7 Merge branch '487-async-route-errors' of https://github.com/nikku/sapper into nikku-487-async-route-errors 2018-10-24 20:58:52 -04:00
Rich Harris
3eced6fa4d Merge pull request #492 from sveltejs/lazy-css
fix lazy css bug, add tests
2018-10-24 20:58:08 -04:00
mrkishi
c4aee66c32 Fix search params decoding 2018-10-24 21:19:03 -03:00
Rich Harris
410c52df41 fix lazy css bug, add tests 2018-10-24 18:48:38 -04:00
Rich Harris
ffd56e2a20 -> v0.23.4 2018-10-24 15:51:44 -04:00
Rich Harris
1e5a87cf71 Merge pull request #491 from sveltejs/empty-href-export
ignore empty anchors when exporting
2018-10-24 15:51:28 -04:00
Rich Harris
281e183c61 ignore empty anchors when exporting 2018-10-24 15:38:45 -04:00
Nico Rehwaldt
3fe7b55955 async -> Promise.reject 2018-10-20 22:46:42 +02:00
Nico Rehwaldt
464924ed67 handle async route errors
Related to #487
2018-10-20 22:40:21 +02:00
mrkishi
8108642845 Ensure deepest layout is always refreshed on goto 2018-10-18 18:14:23 -03:00
Rich Harris
e5d7d8ab2b -> v0.23.3 2018-10-16 16:16:11 -04:00
Rich Harris
d3e560325d Merge pull request #477 from sveltejs/clear-errors
clear errors on successful render
2018-10-16 16:15:28 -04:00
Rich Harris
64e5065aa5 clear errors on successful render 2018-10-16 15:59:57 -04:00
Rich Harris
cb45bb0fbe -> v0.23.2 2018-10-16 08:58:02 -04:00
Rich Harris
f39455014a update deps 2018-10-16 08:44:22 -04:00
Rich Harris
4fe8df3696 Merge pull request #471 from sveltejs/missing-css
include css depended upon by entry point, even if also depended on by a lazily-loaded component
2018-10-16 08:38:20 -04:00
Rich Harris
4fdc7055c1 -> v0.23.1 2018-10-15 22:10:18 -04:00
Rich Harris
cca417a85a simplify, preserve monomorphism 2018-10-15 22:07:23 -04:00
Rich Harris
635c13a175 Merge branch 'tags-from-other-pages' of https://github.com/DayBr3ak/sapper into DayBr3ak-tags-from-other-pages 2018-10-15 21:43:39 -04:00
Rich Harris
2e3aef8b21 simplify 2018-10-15 21:36:40 -04:00
Rich Harris
44736754ad fix file extension 2018-10-15 21:27:52 -04:00
Benjamin GROENEVELD
a399d87d9b handle tag click from another page 2018-10-13 21:59:47 +02:00
Benjamin GROENEVELD
a68c62ce91 Fix hash link reliability (fix #434) 2018-10-13 16:45:14 +02:00
Rich Harris
1b9b559d82 include css depended upon by entry point, even if also depended on by a lazily-loaded component 2018-10-11 23:18:51 -04:00
Rich Harris
abcac75826 -> v0.23.0 2018-10-09 15:03:02 -04:00
Rich Harris
4118c566d1 Merge pull request #470 from aubergene/ssi
Allow SSI comments
2018-10-09 15:02:21 -04:00
Rich Harris
0b76f12394 Merge pull request #469 from sveltejs/remove-env-vars
replace magic env vars with documented CLI flags
2018-10-09 14:59:30 -04:00
Julian Burgess
e51cb85c7c Allow SSI directives 2018-10-09 19:50:25 +01:00
Rich Harris
6ae9a5e7c5 replace magic env vars with documented CLI flags 2018-10-09 08:33:25 -04:00
Rich Harris
52f40f9e63 Improve internal API 2018-10-08 19:21:15 -04:00
Rich Harris
5e59855a15 overhaul tests 2018-10-07 18:23:43 -04:00
Rich Harris
18acef3190 -> v0.22.10 2018-10-05 21:25:49 -04:00
Rich Harris
d7f6ca8b4d Merge pull request #466 from sveltejs/css-basepath
no need to use basepath in <link>
2018-10-05 21:22:15 -04:00
Rich Harris
00321932ef no need to use basepath in <link> 2018-10-05 21:16:27 -04:00
Rich Harris
7eb1ec727c add tests for #376 2018-10-05 20:59:45 -04:00
Rich Harris
3f586e19a1 minor tweaks 2018-10-05 20:57:15 -04:00
Daniil Khanin
05b702938f implement sapper no scroll 2018-10-05 00:13:08 +03:00
Rich Harris
3026e7c36e remove some leftover logging 2018-10-02 11:39:38 -04:00
Rich Harris
27a5aed83e -> v0.22.9 2018-10-02 11:13:36 -04:00
Rich Harris
bb04af41bd fix legacy builds 2018-10-02 11:13:09 -04:00
Rich Harris
9403799393 -> v0.22.8 2018-10-02 10:37:19 -04:00
Rich Harris
472c0c198a Merge pull request #462 from sveltejs/overwrite-css-placeholders
ensure CSS placeholders are overwritten
2018-10-02 10:36:39 -04:00
Rich Harris
02256ae214 ensure CSS placeholders are overwritten 2018-10-02 10:27:02 -04:00
Rich Harris
e2d325ec9f -> v0.22.7 2018-10-01 22:58:44 -04:00
Rich Harris
954bcba333 Merge pull request #460 from sveltejs/cookies
more robust cookies
2018-10-01 22:58:30 -04:00
Rich Harris
709c9992e3 more robust cookies 2018-10-01 22:47:11 -04:00
Rich Harris
9773781262 -> v0.22.6 2018-10-01 20:55:25 -04:00
Rich Harris
48b1fafc33 Merge pull request #459 from sveltejs/gh-458
inject a <script> with crossOrigin - fixes #458
2018-10-01 20:48:42 -04:00
Rich Harris
d1624add66 Merge pull request #456 from mrkishi/windows-paths
Fix rollup input paths on Windows
2018-10-01 20:48:21 -04:00
Rich Harris
e2206d0e0d inject a <script> with crossOrigin - fixes #458 2018-10-01 18:55:38 -04:00
Rich Harris
9cd4da4c39 -> v0.22.5 2018-10-01 17:54:29 -04:00
Rich Harris
6ded1a5975 slap self in face 2018-10-01 17:52:57 -04:00
mrkishi
584ddd1c85 Fix rollup input paths on Windows 2018-10-01 17:47:44 -03:00
Rich Harris
4071acf7c0 -> v0.22.4 2018-10-01 15:53:40 -04:00
Rich Harris
e8773d3196 Merge pull request #455 from sveltejs/deconflict-server
put server assets in subfolder
2018-10-01 15:52:14 -04:00
Rich Harris
01a519a4d9 fix everything i just broke 2018-10-01 15:47:01 -04:00
Rich Harris
d9ad1d1b10 put server assets in subfolder 2018-10-01 15:21:35 -04:00
Rich Harris
0826a58995 -> v0.22.3 2018-10-01 12:13:52 -04:00
Rich Harris
6a74097b0c ensure dev client is not imported if server imports client.js 2018-10-01 12:13:03 -04:00
Rich Harris
278be67228 -> v0.22.2 2018-09-30 22:06:19 -04:00
Rich Harris
64921dfc3c make directories relative to project 2018-09-30 22:05:55 -04:00
Rich Harris
c8962ccf8c update gitignore 2018-09-30 21:12:46 -04:00
Rich Harris
664c093391 -> v0.22.1 2018-09-30 21:10:17 -04:00
Rich Harris
4375feac83 -> v0.22.0 2018-09-30 21:05:31 -04:00
Rich Harris
4d7d448597 Merge pull request #453 from sveltejs/gh-444
move app logic into templates (#444)
2018-09-30 21:03:10 -04:00
Rich Harris
2e2b8dcd83 small tweak 2018-09-30 18:26:44 -04:00
Rich Harris
b915bab070 gah cant use agadoo because of placeholder imports 2018-09-30 18:21:28 -04:00
Rich Harris
8530d06d00 golf things down a bit 2018-09-30 18:11:40 -04:00
Rich Harris
a43764a971 put everything in __sapper__ 2018-09-30 14:55:54 -04:00
Rich Harris
4f6efbda79 node 6 support 2018-09-30 12:54:50 -04:00
Rich Harris
5573258a10 update tests 2018-09-30 11:32:58 -04:00
Rich Harris
2185f89669 enforce client app treeshakeability 2018-09-30 10:50:25 -04:00
Rich Harris
e30842caa8 move app logic into templates (#444) 2018-09-30 10:30:00 -04:00
Rich Harris
ff24877d8f -> v0.21.1 2018-09-23 23:21:37 -04:00
Rich Harris
9cf90ce01d -> v0.21.0 2018-09-23 21:48:53 -04:00
Rich Harris
e7f9ddae86 Merge pull request #446 from mrkishi/escaping-issues
Fix filenames
2018-09-23 21:47:28 -04:00
Rich Harris
ffa1e1f704 Merge branch 'master' into escaping-issues 2018-09-23 21:41:02 -04:00
Rich Harris
80bb958b47 Merge pull request #443 from sveltejs/gh-432
update folder structure
2018-09-23 21:39:05 -04:00
mrkishi
532f559fc5 Update package-lock.json 2018-09-21 15:40:12 -03:00
mrkishi
0bd1b0b8e2 Fix filename escaping issues 2018-09-21 15:34:59 -03:00
Rich Harris
10c5ff4169 remove test app manifest from repo 2018-09-19 17:51:56 -04:00
Rich Harris
273823dfd7 move config into single file, add errors to help people migrate 2018-09-19 16:27:30 -04:00
Rich Harris
8f064fe5ac update folder structure (#432) 2018-09-19 12:02:11 -04:00
Rich Harris
f29e7efbd6 const -> let 2018-09-19 11:25:04 -04:00
Rich Harris
e66e3cd7eb -> v0.20.4 2018-09-19 11:11:42 -04:00
Rich Harris
ff415b391b Merge pull request #436 from nsivertsen/devtools
Enable debugging in Chrome and VS Code - fixes #435
2018-09-19 11:09:19 -04:00
Rich Harris
91182ad0a2 Merge pull request #441 from silentworks/bugfix/legacy-manifest
Fix for legacy manifest file
2018-09-19 10:43:50 -04:00
Andrew Smith
467041a3cd Fix for legacy manifest file 2018-09-13 19:45:30 +01:00
Nikolai Sivertsen
520949c5e1 Enable debugging in Chrome and VS Code - fixes 435 2018-09-12 16:55:45 +02:00
Rich Harris
8c07d9d2ac -> v0.20.3 2018-09-08 10:24:21 -04:00
Rich Harris
7bd684a80e Merge pull request #428 from nolanlawson/cache-control-service-worker
Set service-worker max-age to 0
2018-09-08 10:20:04 -04:00
Rich Harris
cbb5e8755b Use MDN recommendation for preventing SW caching 2018-09-08 10:12:55 -04:00
Rich Harris
7ef72dbb77 Merge pull request #429 from nolanlawson/consistent-cache-control
Use consistent cache-control:max-age=600 for HTML pages
2018-09-08 09:40:56 -04:00
Nolan Lawson
87ff9c2aeb fix test 2018-09-07 17:25:17 -07:00
Nolan Lawson
2d1f535314 use consistent cache-control:max-age=600 for HTML pages 2018-09-07 16:46:40 -07:00
Rich Harris
cd1b53b80d Merge pull request #424 from nolanlawson/csp-nonce
Allow scripts to contain a CSP nonce
2018-09-07 19:46:07 -04:00
Rich Harris
0a7be736c0 snake_case 2018-09-07 19:45:40 -04:00
Nolan Lawson
5ee53a98c6 set service-worker max-age to 0 2018-09-07 16:28:38 -07:00
Rich Harris
0e8ed6612c -> v0.20.2 2018-09-07 18:19:39 -04:00
Rich Harris
5ec748b95d Merge pull request #427 from sveltejs/gh-426
handle value-less query string parameters
2018-09-07 18:18:28 -04:00
Rich Harris
64b16715cd handle value-less query string parameters - fixes #426 2018-09-07 18:02:58 -04:00
Rich Harris
9ea5e5e251 Merge pull request #425 from nolanlawson/cache-control-immutable
Add cache-control:immutable for immutable assets
2018-09-07 17:12:23 -04:00
Rich Harris
68b78f56d6 remove unused file 2018-09-07 16:42:56 -04:00
Nolan Lawson
68e93a8fa0 add cache-control:immutable for immutable assets 2018-09-07 11:07:50 -07:00
Nolan Lawson
e377515867 allow scripts to contain a CSP nonce 2018-09-07 09:46:53 -07:00
Rich Harris
99ae39b8a8 -> v0.20.1 2018-09-06 18:57:11 -04:00
Rich Harris
1b489f4687 -> v0.20.0 2018-09-04 07:35:24 -04:00
Rich Harris
91f2c6e49c Merge pull request #418 from nsivertsen/sourcemaps
Enable source maps by default in dev mode when using rollup
2018-09-04 07:32:15 -04:00
Rich Harris
f5e07e9f78 Merge pull request #419 from sveltejs/gh-417
decode req.params
2018-09-04 07:31:53 -04:00
Rich Harris
17297a9794 Merge pull request #414 from sveltejs/gh-347-b
decode req.path during export
2018-09-04 07:31:36 -04:00
Rich Harris
9ef4f33e38 decode query params 2018-09-03 20:09:25 -04:00
Rich Harris
30966ee7f2 decode req.params - fixes #417 2018-09-03 18:36:07 -04:00
Nikolai Sivertsen
ae90f774e1 Enable source maps by default in dev mode when using rollup 2018-09-04 00:26:18 +02:00
Rich Harris
0706b5f50a decode req.path during export 2018-09-03 09:02:13 -04:00
Rich Harris
499b377bfd -> v0.19.3 2018-09-03 07:55:30 -04:00
Rich Harris
1baeb79d4b Merge branch 'master' of github.com:sveltejs/sapper 2018-09-03 07:54:42 -04:00
Rich Harris
0cc5ff95d6 minor tidy up 2018-09-03 07:54:39 -04:00
Rich Harris
e90525c1e8 Merge pull request #413 from sveltejs/gh-347
better unicode handling - fixes #347, i think
2018-09-03 07:47:41 -04:00
Rich Harris
6ccae0cd33 better unicode handling - fixes #347, i think 2018-09-02 23:00:39 -04:00
Rich Harris
8b60d568dc -> v0.19.2 2018-09-02 21:56:45 -04:00
Rich Harris
64c2394c9d Merge branch 'master' of github.com:sveltejs/sapper 2018-09-02 21:54:13 -04:00
Rich Harris
b28037291a Merge pull request #412 from sveltejs/gh-315
allow reserved words as route names
2018-09-02 21:54:09 -04:00
Rich Harris
bf9cbe2f3b print details of webpack errors - fixes #403 2018-09-02 21:53:46 -04:00
Rich Harris
2c507b5a2e allow reserved words as route names - fixes #315 2018-09-02 21:46:25 -04:00
Rich Harris
4a92fbbbfa Merge pull request #410 from sveltejs/gh-220
ignore things that look like temp files when generating manifest data
2018-09-02 21:13:33 -04:00
Rich Harris
b16440ff0f Merge pull request #411 from sveltejs/gh-235
ignore clicks on <a> elements without hrefs
2018-09-02 21:13:18 -04:00
Rich Harris
64223b572b ignore clicks on <a> elements without hrefs - fixes #235 2018-09-02 20:56:50 -04:00
Rich Harris
1b6dfd3580 ignore things that look like temp files when generating manifest data - fixes #220 2018-09-02 20:33:00 -04:00
Rich Harris
c0b833862a -> v0.19.1 2018-09-02 18:41:32 -04:00
Rich Harris
45f4c47a3e oops that wasnt quite right 2018-09-02 18:41:17 -04:00
Rich Harris
48b87edb5b Merge branch 'master' of github.com:sveltejs/sapper 2018-09-02 18:27:20 -04:00
Rich Harris
f9f283603e Merge pull request #409 from sveltejs/fix-redirects
don't include origin in export redirects
2018-09-02 18:26:56 -04:00
Rich Harris
a56ee6bdb7 regenerate lockfile 2018-09-02 17:01:43 -04:00
Rich Harris
a18af2a473 dont include origin in export redirects 2018-09-02 17:01:29 -04:00
Rich Harris
fe5a8fb1e7 dont include .map files in package 2018-09-02 14:53:12 -04:00
Rich Harris
57a26e3511 -> v0.19.0 2018-09-02 14:50:01 -04:00
Rich Harris
bebb0dd595 CSS extraction and code-splitting
closes #388
2018-09-02 14:46:27 -04:00
Rich Harris
afba0491ed -> v0.18.7 2018-08-31 16:40:50 -04:00
Rich Harris
350d37e210 Merge pull request #397 from sveltejs/gh-280
Implement differential bundling
2018-08-31 16:39:20 -04:00
Rich Harris
96fc19e939 update shimport 2018-08-31 16:32:56 -04:00
Rich Harris
5be3809d9e -> v0.18.6 2018-08-31 11:13:24 -04:00
Rich Harris
15cc4bf296 bundle webpack-format-messages 2018-08-31 11:13:03 -04:00
Rich Harris
c7cce985e3 serve legacy assets if such there be 2018-08-30 23:13:34 -04:00
Rich Harris
e00b315dec emit legacy build 2018-08-30 22:58:07 -04:00
Rich Harris
afcd643035 -> v0.18.5 2018-08-30 20:41:03 -04:00
Rich Harris
7cc2a03aae oops 2018-08-30 20:38:40 -04:00
Rich Harris
002718b609 -> v0.18.4 2018-08-30 20:00:58 -04:00
Rich Harris
45d216c64d Merge pull request #396 from sveltejs/gh-381
implement --dev-port flag
2018-08-30 19:59:09 -04:00
Rich Harris
3d69d483d7 merge master -> gh-381 2018-08-30 19:49:28 -04:00
Rich Harris
54da524467 implement --dev-port flag - fixes #381 2018-08-30 19:46:14 -04:00
Rich Harris
ee95240ca6 Merge pull request #394 from sveltejs/gh-390
omit trailing slash from server route matchers
2018-08-30 19:37:23 -04:00
Rich Harris
74d5d1f9c0 Merge pull request #395 from sveltejs/gh-391
Remove webpack annotations when building with Rollup
2018-08-30 19:37:01 -04:00
Rich Harris
8c2688b1be remove url-parse 2018-08-30 19:34:59 -04:00
Rich Harris
e170e4af9b use builtin url module 2018-08-30 19:29:36 -04:00
Rich Harris
bc31c73c33 omit trailing slash from server route matchers - fixes #390 2018-08-30 18:48:10 -04:00
Rich Harris
7798f8f684 minor tidy up 2018-08-30 18:41:37 -04:00
Rich Harris
70fd7038b0 skip webpack annotations when using Rollup 2018-08-30 18:38:46 -04:00
Rich Harris
c6af2ddfa3 Merge pull request #393 from sveltejs/gh-392
handle non-Sapper responses when exporting
2018-08-30 18:29:17 -04:00
Rich Harris
65d0172abe handle non-Sapper responses when exporting - fixes #392 2018-08-30 18:22:40 -04:00
Rich Harris
1e22031765 -> v0.18.3 2018-08-29 22:52:01 -04:00
Rich Harris
46bf8f2b78 -> v0.18.2 2018-08-29 22:43:21 -04:00
Rich Harris
553db81b7b -> v0.18.1 2018-08-29 22:29:46 -04:00
Rich Harris
67cc29ed38 Merge pull request #386 from sveltejs/gh-385
implement --live
2018-08-29 22:28:42 -04:00
Rich Harris
36f930f489 use --live by default, if using Rollup or --no-hot 2018-08-29 22:19:53 -04:00
Rich Harris
3b098caa6e implement --live and --hot - fixes #385 2018-08-29 21:51:08 -04:00
Rich Harris
d63b9437b5 -> v0.18.0 2018-08-29 21:08:15 -04:00
Rich Harris
e51c733e3f Merge pull request #379 from sveltejs/gh-130
Rollup support
2018-08-29 21:02:48 -04:00
Rich Harris
708fe4c74b rebuild lockfile 2018-08-29 20:53:48 -04:00
Rich Harris
4259fc8e58 update shimport, minor tidy up 2018-08-29 20:20:02 -04:00
Rich Harris
f05a8e52a0 deprecate, dont break 2018-08-29 18:01:27 -04:00
Rich Harris
76cb6d97f3 oops 2018-08-29 18:01:17 -04:00
Rich Harris
5d0b7af47b i feel good about this 2018-08-29 17:40:13 -04:00
Rich Harris
bb737eeb32 success i think? 2018-08-29 17:37:20 -04:00
Rich Harris
86dee17040 come ON 2018-08-29 17:29:17 -04:00
Rich Harris
01a709e017 ffffuuuuuuuuuuu 2018-08-29 17:27:34 -04:00
Rich Harris
f87f0e3b80 stab in the dark 2018-08-29 17:24:48 -04:00
Rich Harris
8226e9bc1f starting to lose my sense of humour 2018-08-29 17:17:36 -04:00
Rich Harris
d6d0a15015 WHAT IS HAPPENING 2018-08-29 17:10:00 -04:00
Rich Harris
ddec58ebd4 ffs 2018-08-29 17:05:56 -04:00
Rich Harris
9d904b3911 argh 2018-08-29 17:02:21 -04:00
Rich Harris
c36df0d650 try to diagnose latest windows idiocy 2018-08-29 16:58:50 -04:00
Rich Harris
ae19288797 update rollup 2018-08-29 16:45:29 -04:00
Rich Harris
de308d5bb0 rebuild lockfile 2018-08-29 16:29:37 -04:00
Rich Harris
99b096a5c4 rimraf before mkdirp 2018-08-29 16:05:41 -04:00
Rich Harris
36fc8a947b use shimport 2018-08-29 15:58:27 -04:00
Rich Harris
6393a30b13 print nice build summaries 2018-08-29 15:03:10 -04:00
Rich Harris
458be49b35 emit errors and warnings, albeit clumsily 2018-08-29 13:26:31 -04:00
Rich Harris
f8d742bdd0 hashing 2018-08-29 10:55:52 -04:00
Rich Harris
7e698f1613 use watchChange plugin hook to detect invalidations 2018-08-28 18:06:31 -04:00
Rich Harris
70b5cc86dc replace client_assets.json with build.json, include bundler name 2018-08-28 17:56:46 -04:00
Rich Harris
19a5dcad1d update CLI 2018-08-28 17:29:27 -04:00
Rich Harris
85e25d6380 add a --bundler option, for forcing rollup or webpack 2018-08-28 17:29:14 -04:00
Rich Harris
6e2383b66b add shimport 2018-08-28 17:28:40 -04:00
Rich Harris
200c5fcbd2 get tests passing again 2018-08-25 14:01:07 -04:00
Rich Harris
9cbb8bdc33 first stab at supporting Rollup (#130) 2018-08-25 12:42:27 -04:00
Rich Harris
3d39836cfb prevent deprecation warnings 2018-08-25 09:12:06 -04:00
Rich Harris
24f2855f89 create a facade over webpack, to support alternative compilers 2018-08-25 09:11:45 -04:00
Rich Harris
d5bf206d2a Merge pull request #378 from sveltejs/export-timeout
export should fail on timeouts
2018-08-25 08:14:18 -04:00
Rich Harris
8abc01551e export should fail on timeouts 2018-08-24 14:25:48 -04:00
Rich Harris
62b8a79e9f -> v0.17.1 2018-08-23 11:23:40 -04:00
Rich Harris
7f255563a4 Merge pull request #371 from sveltejs/show-files-on-error
show which file is causing an error/warning
2018-08-23 11:21:04 -04:00
Rich Harris
32f4a50f25 show which file is causing an error/warning 2018-08-23 11:09:02 -04:00
Rich Harris
18e6f29de7 merge master -> crawl-queue 2018-08-22 18:39:28 -04:00
Rich Harris
b1a9be2dc3 -> v0.17.0 2018-08-19 22:07:04 -04:00
Rich Harris
c5456d3033 Merge pull request #365 from sveltejs/cheap-watch
Use cheap-watch
2018-08-19 22:05:33 -04:00
Rich Harris
9b33dad589 merge master -> cheap-watch 2018-08-19 19:03:12 -04:00
Rich Harris
4315a46ff2 -> v0.16.1 2018-08-19 18:55:41 -04:00
Rich Harris
0fb5827968 fix file watching 2018-08-19 18:55:09 -04:00
Rich Harris
f9bf23dc43 use cheap-watch instead of chokidar (#364) 2018-08-19 18:52:01 -04:00
Rich Harris
611017fd28 -> v0.16.0 2018-08-19 17:39:02 -04:00
Rich Harris
72b265a35f Merge pull request #363 from sveltejs/bundle-deps
[WIP] Slim down the bundle
2018-08-19 17:36:18 -04:00
Rich Harris
e0d533f2ea bundle more stuff 2018-08-19 16:15:04 -04:00
Rich Harris
dba83641e4 remove glob and cheerio from dependencies 2018-08-19 15:20:14 -04:00
Rich Harris
d0c6b9cdca limit parallel crawls 2018-08-19 12:49:58 -04:00
Rich Harris
14e5c8e761 update lockfile 2018-08-16 12:48:50 -04:00
Rich Harris
cbbf4a95db -> v0.15.8 2018-08-16 12:46:13 -04:00
Rich Harris
55b7ffd2ed Merge pull request #361 from sveltejs/handle-unknown-preload-errors
handle unknown preload errors
2018-08-16 12:44:27 -04:00
Rich Harris
9f4d4e70de can remove this, preloading is set false on render 2018-08-16 12:39:54 -04:00
Rich Harris
deef1bbfcf handle unknown preload errors 2018-08-16 12:25:23 -04:00
Seth Thompson
17b0fc0d0c nit 2018-08-11 17:52:53 -04:00
Seth Thompson
3c44c511e4 make sure page has expected preloading value 2018-08-11 17:51:44 -04:00
Seth Thompson
7cf1b9613a prefetching should not set root preloading value, closes #352 2018-08-11 12:26:27 -04:00
Rich Harris
99e5a9601c -> v0.15.7 2018-08-09 20:14:37 -04:00
Rich Harris
4c9c1dccf5 Merge pull request #350 from sveltejs/gh-344
pass response object to store getter
2018-08-09 20:13:17 -04:00
Rich Harris
2cddd5afa0 Merge pull request #345 from sveltejs/fix/redirect
Fix Preload's Redirect
2018-08-09 20:08:51 -04:00
Rich Harris
8c6a0c4773 Merge branch 'master' into gh-344 2018-08-09 20:03:37 -04:00
Rich Harris
af5063552d Merge pull request #351 from sveltejs/argh-windows
doh
2018-08-09 20:02:51 -04:00
Rich Harris
419d154794 fffffuuuuu 2018-08-09 19:53:26 -04:00
Rich Harris
abda059be5 doh 2018-08-09 19:46:09 -04:00
Rich Harris
444908cac5 pass response object to store getter - fixes #344 2018-08-08 10:57:10 -04:00
Luke Edwards
c6da26e1a0 add redirect test to root (“/“) 2018-08-06 20:29:28 -07:00
Luke Edwards
aad87857ce fix: replace leading slash in preload’s redirect 2018-08-06 20:28:28 -07:00
Rich Harris
666c113297 -> v0.15.6 2018-08-06 22:36:17 -04:00
Rich Harris
84a58f34a0 add test for exporting with custom basepath 2018-08-06 22:35:02 -04:00
Rich Harris
75f5b5c721 Merge pull request #342 from aubergene/gh-338
Remove basepath from deferred urls and add trailing slash to root
2018-08-06 22:06:09 -04:00
Julian Burgess
a176a3b79b Remove basepath from deferred urls and add trailing slash to root request 2018-08-06 16:43:02 +01:00
Rich Harris
1627a5767a -> v0.15.5 2018-08-03 01:18:12 -04:00
Rich Harris
6ff3a9e9ab Merge branch 'master' of github.com:sveltejs/sapper 2018-08-03 01:16:43 -04:00
Rich Harris
3ce2bd30f9 Use npm ci instead of npm install (#336)
* dont write server_info.json either - second half of #318

* use npm ci

* update lockfile

* try this
2018-08-03 01:16:26 -04:00
Rich Harris
de4f99807f Merge branch 'master' of github.com:sveltejs/sapper 2018-08-03 00:11:09 -04:00
Rich Harris
eae8351f77 Better/faster exporting
* add --build and --build-dir options to sapper export (#325)

* tweak export logging, update port-authority to prevent timeout bug

* better logging of export progress

* handle case where linked resource is already fetched

* default to .sapper/dev instead of .sapper

* handle query params and redirects

* dont write server_info.json either - second half of #318

* update changelog

* update lockfile

* try to track down ci test failures

* err wut

* curiouser and curiouser

* ok, seems to work now
2018-08-03 00:10:58 -04:00
Rich Harris
d386308301 update changelog 2018-08-02 13:23:12 -04:00
Rich Harris
13afbc84d7 dont write server_info.json either - second half of #318 2018-08-02 10:59:23 -04:00
Rich Harris
31327b3780 Merge pull request #333 from sveltejs/gh-332
only blur activeElement if there is one
2018-08-02 10:43:27 -04:00
Rich Harris
81f483d7b8 Merge pull request #334 from sveltejs/gh-318
dont emit client_info.json
2018-08-02 08:40:30 -04:00
Rich Harris
1bcf20511b dont emit client_info.json - fixes #318 2018-08-01 21:46:26 -04:00
Rich Harris
003fa8ab2c only blur activeElement if there is one - fixes #332 2018-08-01 21:34:30 -04:00
Rich Harris
d1fcd07c92 -> v0.15.4 2018-08-01 08:47:41 -04:00
Rich Harris
47a6d6f662 Merge pull request #326 from lukeed/feat/ignore
Add `ignore` option
2018-08-01 08:46:49 -04:00
Luke Edwards
4b2b6440d0 fix: use more specific ignore pattern;
~> leaked into another test’s route
2018-07-31 16:54:29 -07:00
Rich Harris
fc855f30f8 -> v0.15.3 2018-07-31 15:06:47 -04:00
Rich Harris
4a75fff4ec Merge pull request #329 from sveltejs/parallel-exports
parallelize exports
2018-07-31 15:05:38 -04:00
Rich Harris
7b7b695938 Merge pull request #320 from sveltejs/gh-319
Some dev documentation
2018-07-31 14:59:57 -04:00
Rich Harris
2fca2e295f Merge pull request #328 from sveltejs/export-no-minify-js
don't minify JS when minifying HTML
2018-07-31 14:59:27 -04:00
Rich Harris
eae991d369 parallelize exports 2018-07-31 14:56:29 -04:00
Rich Harris
c2b393d3fd dont minify JS when minifying HTML 2018-07-31 14:43:58 -04:00
Luke Edwards
566addd406 add tests for opts.ignore 2018-07-29 14:17:13 -07:00
Luke Edwards
3d77dacbd6 attach ignore options to test app, w/ matching routes 2018-07-29 14:17:04 -07:00
Luke Edwards
51b4f9cbbf add opts.ignore support 2018-07-29 14:01:44 -07:00
Robert Hall
1d611be83e Using npm 2018-07-25 15:50:56 -06:00
Robert Hall
1782904994 Some dev documentation 2018-07-25 10:10:22 -06:00
Rich Harris
e3ddbfc181 Merge pull request #314 from sveltejs/fix-child-segment
fix child.segment bug
2018-07-23 17:08:25 -04:00
Rich Harris
8e3830b646 fix child.segment bug 2018-07-23 17:02:35 -04:00
Rich Harris
b28cdff233 -> v0.15.2 2018-07-23 16:38:49 -04:00
Rich Harris
7f586ff1a3 Merge pull request #313 from sveltejs/gh-312
Skip layout components where none is provided
2018-07-23 16:37:30 -04:00
Rich Harris
731d4f535c skip layout components where none is provided - fixes #312 2018-07-23 16:31:00 -04:00
Rich Harris
f8c731ca21 failing tests for #312 2018-07-23 14:31:11 -04:00
Rich Harris
39eb3be01e -> v0.15.1 2018-07-22 21:25:33 -04:00
Rich Harris
d0bb728e25 -> v0.15.0 2018-07-22 21:04:03 -04:00
Rich Harris
58de0f9c99 Nested routes
Fixes #262
2018-07-22 21:00:37 -04:00
Rich Harris
b75ae7ba96 -> v0.14.2 2018-07-14 21:05:39 -04:00
Rich Harris
091e38082e Merge pull request #307 from sveltejs/unsafe-replacements
prevent unsafe replacements of preloaded data etc
2018-07-15 02:05:20 +01:00
Rich Harris
74acf93c7a prevent unsafe replacements of preloaded data etc 2018-07-14 20:56:05 -04:00
Rich Harris
0e3775397f Merge pull request #306 from sveltejs/refactor-route-generation
Refactor route generation
2018-07-05 08:25:59 -04:00
Rich Harris
8dc52a04e4 split pages and server routes into separate arrays 2018-07-05 08:14:07 -04:00
Rich Harris
008b607c01 generate pages and server routes separately 2018-07-04 10:53:41 -04:00
Rich Harris
d01a407137 -> v0.14.1 2018-07-02 10:24:54 -04:00
Rich Harris
c0c717d9ec Merge pull request #283 from elcobvg/feature/route-regexp
Feature: use regexp in routes
2018-07-02 10:23:30 -04:00
Elco Brouwer von Gonzenbach
4f011bfc37 Convert whitespace to tabs. Add some unit tests for create routes 2018-07-02 11:52:17 +07:00
Elco Brouwer von Gonzenbach
6c4ab32cf0 Sync update to sapper 0.14.0 2018-06-29 06:57:01 +07:00
Rich Harris
09b4dc1b9a -> v0.14.0 2018-06-28 13:35:21 -04:00
Rich Harris
bdd5a54527 Merge pull request #301 from sveltejs/gh-297
treat foo/index.json.js as foo.json.js
2018-06-28 13:27:57 -04:00
Rich Harris
b7bb4db8c1 treat foo/index.json.js as foo.json.js - fixes #297 2018-06-28 13:20:41 -04:00
Rich Harris
5b5f33d3cf error on 4xx.html and 5xx.html 2018-06-28 12:57:59 -04:00
Rich Harris
9611656b76 Merge pull request #300 from sveltejs/gh-293
[WIP] simplify rendering of error pages
2018-06-28 12:52:41 -04:00
Rich Harris
e9a71774d5 Merge pull request #299 from sveltejs/gh-270
return a Promise from goto
2018-06-28 12:18:32 -04:00
Rich Harris
2205b8aec5 oops 2018-06-28 12:03:27 -04:00
Rich Harris
5c4e4d5d36 only navigate if route is found - fixes #279 2018-06-28 11:45:38 -04:00
Rich Harris
e87247493f replace 4xx.html and 5xx.html with _error.html 2018-06-28 11:38:21 -04:00
Rich Harris
0aeb63a05b simplify rendering of error pages 2018-06-27 18:35:41 -04:00
Rich Harris
57eeb5659a return a Promise from goto - fixes #270 2018-06-27 17:32:20 -04:00
Rich Harris
f821c19528 -> v0.13.6 2018-06-27 17:20:45 -04:00
Rich Harris
b9a120164a Merge pull request #298 from sveltejs/gh-296
fix req.baseUrl synthesis
2018-06-27 17:19:55 -04:00
Rich Harris
087356f781 fix req.baseUrl synthesis 2018-06-27 16:57:04 -04:00
Rich Harris
31110a5326 -> v0.13.5 2018-06-26 18:30:46 -04:00
Rich Harris
667a68768c Merge pull request #294 from sveltejs/gh-289
fix handling of fatal errors
2018-06-26 18:29:56 -04:00
Rich Harris
5075981a90 fix handling of fatal errors - fixes #289 2018-06-26 13:49:11 -04:00
Rich Harris
611dc4f6be -> v0.13.4 2018-06-18 22:45:51 -04:00
Rich Harris
0b43eaa992 blur active element on navigation - fixes #287 2018-06-18 22:44:55 -04:00
Rich Harris
47cdc1c4c8 wait until server restarts before emitting hot reload update 2018-06-18 22:31:10 -04:00
Rich Harris
31c071ad72 Merge branch 'master' of github.com:sveltejs/sapper 2018-06-18 12:22:42 -04:00
Rich Harris
e91edaee12 Merge pull request #286 from sveltejs/invalidate-client-assets
always refresh client_assets in dev
2018-06-18 12:22:37 -04:00
Rich Harris
34c1fee5db Merge branch 'master' of github.com:sveltejs/sapper 2018-06-17 13:02:13 -04:00
Rich Harris
5375422633 Merge pull request #285 from sveltejs/event-on-exit
emit a fatal event if server crashes
2018-06-17 13:02:03 -04:00
Rich Harris
1dafe934b0 initialise rebuild stats 2018-06-17 13:01:51 -04:00
Rich Harris
e1a33c6a9b always refresh client_assets in dev 2018-06-17 13:00:27 -04:00
Rich Harris
0800fa016b emit a fatal event if server crashes 2018-06-16 20:18:32 -04:00
Rich Harris
8f3454c3b1 -> v0.13.3 2018-06-16 13:49:44 -04:00
Rich Harris
f0d7a1aaab change fatal events to be clonable, for IPC purposes 2018-06-16 13:49:19 -04:00
Rich Harris
8240595d70 -> v0.13.2 2018-06-15 10:58:55 -04:00
Rich Harris
658d8dd50c Merge pull request #284 from sveltejs/emit-basepath
Emit basepath event
2018-06-15 10:57:04 -04:00
Rich Harris
9eeeaa24c1 emit a basepath event on first run 2018-06-14 17:20:46 -04:00
Rich Harris
9c4a3592ff remove some unused code 2018-06-14 16:34:16 -04:00
Elco Brouwer von Gonzenbach
0e2c2ca101 Correct errors in param pattern and matching patterns 2018-06-13 10:00:39 +07:00
Elco Brouwer von Gonzenbach
8015be8069 Correct spacing 2018-06-12 09:15:54 +07:00
Elco Brouwer von Gonzenbach
e39ad59589 Add regexp option to routes 2018-06-12 09:11:54 +07:00
Rich Harris
be7cff4818 -> v0.13.1 2018-06-05 14:41:12 -04:00
Rich Harris
d6632cf312 Merge pull request #281 from sveltejs/gh-276
reinstate ten second interval between heartbeats
2018-06-05 20:40:17 +02:00
Rich Harris
f6e012ec73 reinstate ten second interval between heartbeats - fixes #276 2018-06-05 14:35:37 -04:00
Rich Harris
087acd5765 -> v0.13.0 2018-05-28 19:49:40 -04:00
Rich Harris
43bf6e8d8a Merge pull request #273 from sveltejs/gh-272
[WIP] expose dev, build, export APIs
2018-05-28 19:47:08 -04:00
Rich Harris
78be6aa343 add api.js 2018-05-28 18:04:18 -04:00
Rich Harris
8ba57969c2 oops 2018-05-26 12:39:44 -04:00
Rich Harris
58d2f605fc expose find_page method 2018-05-26 12:31:52 -04:00
Rich Harris
e0b4319c7d preserve webpack stats, write client assets elsewhere 2018-05-26 12:31:43 -04:00
Rich Harris
98d0df4320 work around webpack silliness 2018-05-23 22:05:40 -04:00
Rich Harris
6aa3ce4f05 make stdout etc available via api 2018-05-23 21:56:35 -04:00
Rich Harris
046db325f1 update deps 2018-05-23 20:41:48 -04:00
Rich Harris
1a4bace5f4 add dev API 2018-05-23 09:05:24 -04:00
Rich Harris
0dbf75f100 create API for exporting 2018-05-22 11:57:24 -04:00
Rich Harris
4f49fd8d5c create build API 2018-05-22 11:32:06 -04:00
Rich Harris
86f71e1faf Merge pull request #268 from lukeed/dep/colors
Update colors dep
2018-05-22 08:01:23 -04:00
Luke Edwards
147e2c64b5 update webpack-format-messages 2018-05-17 13:03:25 -07:00
Luke Edwards
9063057b0c swap clorox —> ansi-colors 2018-05-15 09:00:55 -07:00
Rich Harris
25f0d94595 -> v0.12.0 2018-05-05 10:00:58 -04:00
Rich Harris
8155df2e22 Merge branch 'gh-157' 2018-05-05 09:58:12 -04:00
Rich Harris
bb51470004 Merge pull request #259 from sveltejs/gh-157
switch to single App component model
2018-05-05 09:57:28 -04:00
Rich Harris
53446e2ec7 Merge branch 'master' into gh-157 2018-05-05 09:45:04 -04:00
Rich Harris
c4c09550eb Merge pull request #260 from sveltejs/another-sorting-bug
fix sorting
2018-05-05 09:43:16 -04:00
Rich Harris
da47fdec96 fix sorting 2018-05-05 09:38:24 -04:00
Rich Harris
971342ac7a set preloading: true when appropriate 2018-05-04 23:23:41 -04:00
Rich Harris
3becc1cbe2 error on incorrect init args 2018-05-04 23:06:10 -04:00
Rich Harris
8ee5346900 switch to single App component model (#157) 2018-05-04 22:46:41 -04:00
Rich Harris
9e4b79c6ff Merge pull request #258 from sveltejs/gh-208
exit with code 1 if build/export fails
2018-05-04 17:48:29 -04:00
Rich Harris
4ec1c65395 exit with code 1 if build/export fails - fixes #208 2018-05-04 17:42:37 -04:00
Rich Harris
c743d11b3b -> v0.11.1 2018-05-04 17:22:34 -04:00
Rich Harris
b525eb6480 get tests passing 2018-05-04 17:19:39 -04:00
Rich Harris
210d03fb06 Merge branch 'collision' of https://github.com/akihikodaki/sapper into akihikodaki-collision 2018-05-04 17:08:55 -04:00
Rich Harris
0685cc4cbe Merge branch 'master' of github.com:sveltejs/sapper 2018-05-04 17:08:47 -04:00
Rich Harris
9e2d0a7fbc Merge branch 'master' into collision 2018-05-04 17:05:18 -04:00
Rich Harris
a751a3b731 Merge pull request #254 from akihikodaki/dot_strict
Ignore files and directories with leading dots except .well-known
2018-05-04 17:04:27 -04:00
Rich Harris
bc7faeeab9 remove unused esm package 2018-05-04 16:55:57 -04:00
Rich Harris
a88c1de2f6 Merge pull request #256 from johnmuhl/esm
replace discontinued @std/esm package with esm
2018-05-04 16:53:35 -04:00
john muhl
a231795c4c replace discontinued @std/esm package with esm 2018-05-04 13:56:17 -05:00
Akihiko Odaki
ba7525c676 Ignore files and directories with leading dots except .well-known 2018-05-04 22:18:23 +09:00
Rich Harris
4843e9a40a -> v0.11.0 2018-05-03 23:51:04 -04:00
Rich Harris
ca4a1ca9b0 Merge pull request #251 from sveltejs/client-info
only save the bits of client_info we need
2018-05-03 23:49:30 -04:00
Rich Harris
ad7c872ee3 Merge pull request #250 from sveltejs/gh-240
implement --launcher
2018-05-03 23:49:06 -04:00
Rich Harris
4f98324a8a oops, missed one 2018-05-03 23:46:41 -04:00
Rich Harris
1fcf3f79ee only save the bits of client_info we need 2018-05-03 23:42:19 -04:00
Rich Harris
0b5741194a Merge pull request #205 from sveltejs/gh-140
prefetch on mouse stop
2018-05-03 23:31:08 -04:00
Rich Harris
9653d4c6ce Merge pull request #249 from sveltejs/gh-241
allow process.env.NODE_ENV to be overridden when building
2018-05-03 23:30:55 -04:00
Rich Harris
4fa5ed5e2c simplify 2018-05-03 23:30:09 -04:00
Rich Harris
f4eac2515f fix tests 2018-05-03 23:23:02 -04:00
Rich Harris
1a5364ae9d on second thoughts, default to build/index.js 2018-05-03 23:16:56 -04:00
Rich Harris
d7a9074c69 implement --launcher 2018-05-03 23:04:05 -04:00
Rich Harris
00adb53802 allow process.env.NODE_ENV to be overridden when building (#241) 2018-05-03 22:21:00 -04:00
Rich Harris
b10edddc96 cheat 2018-05-03 22:01:14 -04:00
Rich Harris
93b2d12438 Merge branch 'master' into gh-140 2018-05-03 21:54:52 -04:00
Rich Harris
7303e811be update tests, move test app to v2 2018-05-03 21:54:23 -04:00
Rich Harris
992d89027d Merge branch 'master' into collision 2018-05-03 21:44:28 -04:00
Rich Harris
3531cc587d -> v0.10.7 2018-05-03 21:42:50 -04:00
Rich Harris
562a91fa57 Merge pull request #245 from johnmuhl/patch-1
Include process.env in exporter server options
2018-05-03 21:40:50 -04:00
Rich Harris
93128a0156 Merge pull request #243 from akihikodaki/dot
Accept directory entries which starts with dot as routes
2018-05-03 21:39:46 -04:00
Rich Harris
d7a2132966 Merge pull request #234 from akihikodaki/master
Do not encode characters allowed in path when generating routes
2018-05-03 21:37:59 -04:00
John Muhl
56ac1aea9d match sapper start 2018-04-22 22:50:05 -05:00
John Muhl
37a9fb62e2 Include process.env in exporter server options 2018-04-22 20:29:47 -05:00
Rich Harris
a70e88b1f4 -> v0.10.6 2018-04-19 13:03:12 -04:00
Akihiko Odaki
6f9ce9ce85 Accept directory entries which starts with dot as routes
It allows to implement .well-known URIs.
2018-04-19 22:04:03 +09:00
Akihiko Odaki
917dd60cc3 Allow to have middleware for the path same with a HTML page
HTTP allows to change the type of the content to serve by Accept field in
the request. The middleware for the path same with a HTML page will
be inserted before the HTML renderer, and can take advantage of this
feature, using expressjs's "accepts" method, for example.
2018-04-15 23:11:08 +09:00
Akihiko Odaki
b13cc6f39a Do not encode characters allowed in path when generating routes
In RFC 3986, some characters not allowed in query, which encodeURIComponent
is designed for, is allowed in path.
A notable example is "@", which is commonly included in paths of social
profile pages. Such characters should not be encoded.

The new encoding function is conforming to the RFC.
2018-04-14 01:08:27 +09:00
Rich-Harris
2758382c68 -> v0.10.5 2018-04-06 18:32:44 -07:00
Rich Harris
dd7f1ff99c Merge pull request #231 from sveltejs/fix-missing-service-worker
fix missing service worker
2018-04-06 21:31:53 -04:00
Rich-Harris
45142cd037 fix missing service worker 2018-04-06 14:44:50 -07:00
Rich-Harris
ceb1caf1de -> v0.10.4 2018-04-03 21:43:30 -04:00
Rich Harris
7e263a3076 Merge pull request #227 from naturalethic/upgrade-chokidar-disable-globbing-issue-212
Upgrade chokidar disable globbing issue 212
2018-04-03 21:42:34 -04:00
Rich Harris
ec88d4a430 Remove unnecessary globbing pattern 2018-04-03 21:38:28 -04:00
Joshua Kifer
909ea72108 Update dev.ts 2018-04-03 14:04:08 -07:00
Joshua Kifer
cd09d75d99 Merge branch 'master' into upgrade-chokidar-disable-globbing-issue-212 2018-04-03 13:00:07 -07:00
Joshua Kifer
0e3abe489a Re-upgrade chokidar, disable globbing 2018-04-03 12:58:06 -07:00
Joshua Kifer
a5d141d2f1 Update (#1)
* Downgrade chokidar to 1.7.0

* -> v0.10.3
2018-04-03 12:49:55 -07:00
Rich-Harris
87eae6164b -> v0.10.3 2018-04-02 15:39:34 -04:00
Rich Harris
97e00f5a9c Merge pull request #226 from naturalethic/downgrade-chokidar
Downgrade chokidar to 1.7.0
2018-04-02 15:38:40 -04:00
Joshua Kifer
bd55558b5e Downgrade chokidar to 1.7.0 2018-04-02 12:24:57 -07:00
Rich-Harris
25dc4b3a4c -> v0.10.2 2018-03-25 15:20:48 -04:00
Rich Harris
72c27b78a3 Merge pull request #215 from sveltejs/stable-sort
Stable sort
2018-03-25 15:19:43 -04:00
Rich-Harris
25809ec409 enforce stable sort 2018-03-25 15:12:35 -04:00
Rich-Harris
3220c522d7 attach store to error pages 2018-03-20 16:08:23 -04:00
Rich Harris
d5d25f1d30 -> v0.10.1 2018-03-18 22:47:11 -04:00
Rich Harris
7ccd6ba329 Merge pull request #207 from sveltejs/fix-fetch-paths
fix server-side fetch paths
2018-03-18 22:41:01 -04:00
Rich Harris
35c30ae2c5 fix server-side fetch paths 2018-03-18 22:36:55 -04:00
Rich Harris
2c61f6d396 -> v0.10.0 2018-03-18 22:17:53 -04:00
Rich Harris
86233a8eab Merge pull request #206 from sveltejs/sapper-base-error
app/template.html must have %sapper.base%
2018-03-18 22:13:24 -04:00
Rich Harris
c140b128ee expect %sapper.base% 2018-03-18 22:06:11 -04:00
Rich Harris
a6b1527fd3 try using mousemove in tests 2018-03-18 21:53:13 -04:00
Rich Harris
c2f3a2aac0 prefetch on mouse stop (#140) 2018-03-18 21:41:47 -04:00
Rich Harris
66ac9773c0 Merge pull request #204 from nolanlawson/ignore-source-maps
Add support for sourcemap *.map files
2018-03-18 21:23:26 -04:00
Rich Harris
e60714bb98 Merge pull request #203 from sveltejs/gh-178-fetch
implement this.fetch
2018-03-18 21:21:00 -04:00
Nolan Lawson
52dfd6e939 Don't preload .map files 2018-03-18 16:31:53 -07:00
Nolan Lawson
fc2312eba6 Add full *.map file support 2018-03-18 16:17:41 -07:00
Nolan Lawson
cf90476255 Ignore source map files in %sapper.scripts% 2018-03-18 11:13:24 -07:00
Rich Harris
1e8d7d10ab implement this.fetch (#178) 2018-03-17 19:21:25 -04:00
Rich Harris
cf6621b83c Merge pull request #202 from sveltejs/gh-178-store
add server- and client-side store management (#178)
2018-03-17 16:10:48 -04:00
Rich Harris
9812cbd71c add server- and client-side store management (#178) 2018-03-17 13:45:59 -04:00
Rich Harris
67a81a3cac Merge pull request #201 from sveltejs/simplify-tests
simplify tests
2018-03-17 13:24:42 -04:00
Rich Harris
67463683cc simplify tests 2018-03-17 13:18:18 -04:00
Rich Harris
b94481b716 Support being mounted on a path — fixes #180 2018-03-17 11:55:02 -04:00
Rich Harris
a95ddee48d add protocol to startup message 2018-03-16 10:51:19 -04:00
Rich Harris
953694f77f update deps 2018-03-16 10:51:04 -04:00
Rich Harris
2f24cb0429 -> v0.9.6 2018-03-11 22:01:06 -04:00
Rich Harris
687071902d -> v0.9.5 2018-03-11 21:30:17 -04:00
Rich Harris
cd3fcfdf3c move deps to devDeps 2018-03-11 21:29:34 -04:00
Rich Harris
dad48e4abd Merge pull request #197 from sveltejs/fix-clorox
workaround clorox bug
2018-03-11 21:29:12 -04:00
Rich Harris
37d3d57694 workaround clorox bug 2018-03-11 20:51:14 -04:00
Rich Harris
9a5d273590 -> v0.9.4 2018-03-11 19:00:39 -04:00
Rich Harris
3816fe71ad Merge pull request #196 from sveltejs/gh-186
implement --open
2018-03-11 16:52:41 -04:00
Rich Harris
69f5b9cac7 implement --open - fixes #186 2018-03-11 16:01:13 -04:00
Rich Harris
ad14320dc3 Merge pull request #195 from sveltejs/export-logs
show which files are being exported
2018-03-11 15:50:13 -04:00
Rich Harris
43563bd8e5 show which files are being exported 2018-03-11 15:44:53 -04:00
Rich Harris
02d558b97c Merge pull request #194 from sveltejs/gh-172
minify HTML on export
2018-03-11 15:19:07 -04:00
Rich Harris
866286c95e minify HTML on export 2018-03-11 14:57:10 -04:00
Rich Harris
e1b5e336dc Merge pull request #193 from sveltejs/gh-15
minify HTML templates
2018-03-11 14:14:39 -04:00
Rich Harris
1d71b86c0f remove all hard-coded locations (#181) 2018-03-11 13:43:11 -04:00
Rich Harris
bdc248f09a minify HTML at build time (also fixes #181) 2018-03-11 13:35:29 -04:00
Rich Harris
be63ea7c96 add SAPPER_BASE and SAPPER_APP environment variables 2018-03-11 13:29:39 -04:00
Rich Harris
819ec0b776 minify HTML templates - fixes #15 2018-03-11 13:10:43 -04:00
Rich Harris
d22d37fb18 Merge pull request #192 from sveltejs/misc-tidy-up
a few small tweaks
2018-03-11 13:10:15 -04:00
Rich Harris
8ec433581a a few small tweaks 2018-03-11 12:54:35 -04:00
Rich Harris
0d0e4d664e -> v0.9.3 2018-03-10 23:32:06 -05:00
Rich Harris
4348fad16d -> v0.9.2 2018-03-10 23:29:41 -05:00
Rich Harris
4314897a78 -> v0.9.1 2018-03-10 23:28:14 -05:00
Rich Harris
b1c57466c0 -> v0.9.0 2018-03-10 23:24:03 -05:00
Rich Harris
ef55fc5ddd move built files to dist 2018-03-10 23:20:11 -05:00
Rich Harris
e011fce935 Merge pull request #191 from sveltejs/gh-173
use code-splitting etc
2018-03-10 23:14:53 -05:00
Rich Harris
ba3d9c85c5 clorox seems to have a bug with inverse (TODO investigate) 2018-03-10 23:09:02 -05:00
Rich Harris
cddd7adaad lazy-load stuff 2018-03-10 23:00:36 -05:00
Rich Harris
d8412f33ba ignore some files 2018-03-10 22:33:33 -05:00
Rich Harris
254e41b11e use code-splitting etc 2018-03-10 22:26:53 -05:00
Rich Harris
491c5e3b92 Merge pull request #190 from sveltejs/gh-57
allow server routes to be .ts files (or anything else)
2018-03-10 20:46:25 -05:00
Rich Harris
4441ceb91d Merge pull request #189 from sveltejs/introduce-spelling-error
use wrong spelling of "grey"
2018-03-10 20:45:56 -05:00
Rich Harris
77e418cd21 Merge pull request #188 from sveltejs/gh-112
use devalue instead of serialize-javascript
2018-03-10 20:45:39 -05:00
Rich Harris
4171786953 ensure directories are not mistaken for routes 2018-03-10 20:38:48 -05:00
Rich Harris
5f7cbadd8d remove extensions from entry points 2018-03-10 20:16:46 -05:00
Rich Harris
9bac32eea4 allow server routes to be .ts files (or anything else) - fixes #57 2018-03-10 20:08:23 -05:00
Rich Harris
3a19657ad9 use wrong spelling of "grey" 2018-03-10 20:04:44 -05:00
Rich Harris
d1b6d029e9 merge master -> gh-112 2018-03-10 19:36:08 -05:00
Rich Harris
45b1147228 use devalue instead of serialize-javascript - fixes #112 2018-03-10 19:27:04 -05:00
Rich Harris
c827fda703 Merge pull request #187 from lukeed/fix/chalk
Replace Chalk with Clorox
2018-03-10 16:11:35 -05:00
Luke Edwards
dd39909371 replace chalk with clorox 2018-03-10 12:30:36 -08:00
Rich Harris
fb24c862f3 Merge pull request #185 from sveltejs/gh-165
use window.location.hostname in dev client
2018-03-10 10:44:48 -05:00
Rich Harris
542115f82e Merge pull request #184 from sveltejs/gh-169-b
Fix hard-coded port
2018-03-10 10:28:21 -05:00
Rich Harris
61000a4795 use window.location.hostname in dev client - fixes #165 2018-03-10 10:26:00 -05:00
Rich Harris
7f98d50e15 treat PORT=xxxx the same as --port xxxx 2018-03-10 10:09:18 -05:00
Rich Harris
c580259c07 dont hardcode port 2018-03-10 10:01:42 -05:00
Rich Harris
e8f3aff0da Merge pull request #183 from sveltejs/use-polka
Use polka, remove unused dependencies
2018-03-10 09:54:22 -05:00
Rich Harris
c82031a8e5 remove some unused deps 2018-03-10 09:48:52 -05:00
Rich Harris
1eed1023aa switch to polka, remove unused deps 2018-03-10 09:39:07 -05:00
Rich Harris
c1a2d93da6 Merge pull request #182 from sveltejs/gh-177
kill child process if webpack crashes
2018-03-10 08:51:05 -05:00
Rich Harris
504654b58e kill child process if webpack crashes - fixes #177 2018-03-09 21:02:05 -05:00
Rich Harris
b1067103a4 -> v0.8.4 2018-03-07 15:57:46 -05:00
Rich Harris
06af8e87da Merge pull request #175 from sveltejs/fix-route-sorting
fix route sorting
2018-03-07 14:32:56 -05:00
Rich Harris
8bb0999878 fix route sorting 2018-03-07 14:26:30 -05:00
Rich Harris
b5a8d29c37 -> v0.8.3 2018-03-05 15:27:38 -05:00
Rich Harris
5925636b16 Merge pull request #170 from sveltejs/gh-169
better CLI
2018-03-05 15:25:33 -05:00
Rich Harris
bc232007c3 simplify sade initialisation 2018-03-05 15:17:34 -05:00
Rich Harris
ffaacb4c99 use fs.existsSync 2018-03-05 15:11:44 -05:00
Rich Harris
47b50f2c0e admin 2018-03-05 15:09:59 -05:00
Rich Harris
a66ac00d42 tidy up tests 2018-03-05 15:09:51 -05:00
Rich Harris
0f8c04b03d use port-authority 2018-03-05 15:09:33 -05:00
Rich Harris
d9d93f41c4 add get-port back as dev dependency, for testing 2018-03-05 13:57:30 -05:00
Rich Harris
5289fc11d8 better CLI, more port control. fixes #169 2018-03-05 13:51:11 -05:00
Rich Harris
dd6c51567a -> v0.8.2 2018-03-04 22:55:00 -05:00
Rich Harris
01ff84f241 Merge pull request #167 from sveltejs/gh-166
rename preloadRoutes to prefetchRoutes
2018-03-04 22:54:11 -05:00
Rich Harris
329c113723 rename preloadRoutes to prefetchRoutes 2018-03-04 22:38:55 -05:00
Rich Harris
2ad10b380f -> v0.8.1 2018-03-04 21:37:55 -05:00
Rich Harris
e6314cde96 Merge pull request #164 from sveltejs/gh-163
add sapper start task
2018-03-04 21:36:51 -05:00
Rich Harris
b64e25a177 add sapper start task 2018-03-04 21:28:31 -05:00
Rich Harris
49bc1b00a9 -> v0.8.0 2018-03-04 19:31:14 -05:00
Rich Harris
24bfcc8d2d Merge pull request #162 from sveltejs/gh-103
URI-encode routes
2018-03-04 19:11:22 -05:00
Rich Harris
b405e5878e Merge branch 'master' into gh-103 2018-03-04 19:00:28 -05:00
Rich Harris
ef0ca58a21 Merge pull request #161 from sveltejs/gh-160
add preloadRoutes function
2018-03-04 19:00:14 -05:00
Rich Harris
854147fa6c URI-encodes routes - fixes #103 2018-03-04 18:59:35 -05:00
Rich Harris
50ecc5c130 preload errors 2018-03-04 18:26:58 -05:00
Rich Harris
7e2f5f8fb6 add preloadRoutes function - closes #160 2018-03-04 18:05:33 -05:00
Rich Harris
acef0e808f Merge branch 'logging' 2018-03-04 16:17:18 -05:00
Rich Harris
248573f510 fix deprecation warning 2018-03-04 16:17:10 -05:00
Rich Harris
e91955fdad Merge pull request #158 from sveltejs/logging
vastly better logging
2018-03-04 15:49:14 -05:00
Rich Harris
368e6d5cb1 bump timeout for travis 2018-03-04 15:27:35 -05:00
Rich Harris
1984203e87 vastly better logging 2018-03-04 15:11:36 -05:00
Rich Harris
0165c14fd9 update webpack/config 2018-03-04 12:35:13 -05:00
Rich Harris
bdb9d49187 simpler wait-for-port 2018-03-04 11:25:59 -05:00
Rich Harris
4d79cb81ed Merge pull request #153 from sveltejs/stability
various stability improvements
2018-03-03 23:02:24 -05:00
Rich Harris
181b0711ec replace mime, having weird bundling problems with it 2018-03-03 22:50:10 -05:00
Rich Harris
1b282e7b0d remove unused get_asset_handler 2018-03-03 21:54:19 -05:00
Rich Harris
99853c5181 various stability improvements 2018-03-03 21:48:50 -05:00
Rich Harris
ff3b43443e Merge pull request #152 from sveltejs/gh-148
various improvements to manifest generation - fixes #148
2018-03-03 16:35:27 -05:00
Rich Harris
2622692f69 various improvements to manifest generation - fixes #148 2018-03-03 15:39:40 -05:00
Rich Harris
7625302ec7 Merge pull request #150 from sveltejs/gh-133
sapper build defaults to `build` dir, sapper export defaults to `export` dir
2018-03-03 15:07:35 -05:00
Rich Harris
09422e3c5a Merge branch 'master' into gh-133 2018-03-03 14:34:22 -05:00
Rich Harris
a96fb93bfb Fix test failures — closes #132 2018-03-03 14:33:47 -05:00
Rich Harris
17d7ca36f1 update test 2018-03-03 12:20:46 -05:00
Rich Harris
b73e5eaa8e sapper build defaults to build dir, sapper export defaults to export dir (#133) 2018-03-03 12:09:06 -05:00
Rich Harris
d9cb572271 -> v0.7.6 2018-02-28 17:14:38 -05:00
Rich Harris
34c28f36cd Merge pull request #147 from sveltejs/gh-138
don't serve error page for unhandled server route errors
2018-02-28 17:11:52 -05:00
Rich Harris
5dd04eb35c tidy up - next is unused 2018-02-28 16:59:39 -05:00
Rich Harris
b1d072d43a dont serve error page for unhandled server route errors - fixes #138 2018-02-28 16:54:38 -05:00
Rich Harris
5ad3f3f1d5 Merge pull request #146 from sveltejs/gh-145
prevent client-side navigation to server routes
2018-02-28 16:20:42 -05:00
Rich Harris
58754c6d15 use blog.json instead of blog/list.json 2018-02-28 16:17:07 -05:00
Rich Harris
c36780fdc8 prevent client-side navigation to server routes - fixes #145 2018-02-28 14:23:19 -05:00
Rich Harris
9bebb56bd6 -> v0.7.5 2018-02-28 13:40:42 -05:00
Rich Harris
f475634d8d Merge pull request #144 from sveltejs/gh-139
allow dynamic parameters inside route parts
2018-02-28 12:26:00 -05:00
Rich Harris
58c1eb9fa8 allow dynamic parameters inside route parts - fixes #139 2018-02-28 09:39:21 -05:00
Rich Harris
631afbbfe4 -> v0.7.4 2018-02-27 20:10:48 -05:00
Rich Harris
1cc9acb4f1 Merge pull request #142 from sveltejs/gh-141
force NODE_ENV=production in build/export
2018-02-27 20:09:05 -05:00
Rich Harris
19005110f1 huh, not sure why that changed 2018-02-27 19:58:49 -05:00
Rich Harris
21ee8ad39d force NODE_ENV=production in build/export 2018-02-27 19:49:58 -05:00
Rich Harris
906b0c7ad5 Merge pull request #134 from sveltejs/source-map-support
install source-map-support
2018-02-27 19:46:17 -05:00
Rich Harris
896fd410d1 install source-map-support 2018-02-20 14:01:25 -05:00
Rich Harris
c0cc877456 -> v0.7.3 2018-02-20 12:23:32 -05:00
Rich Harris
3ed9ce27a1 Merge pull request #131 from sveltejs/webpack-insanity
handle case where webpack asset is an array instead of a string
2018-02-20 12:18:29 -05:00
Rich Harris
edba45b809 Merge pull request #129 from sveltejs/robustify-hmr
ensure old server is killed before listening for port on new server
2018-02-20 12:18:10 -05:00
Rich Harris
43c1890235 handle case where webpack asset is an array instead of a string 2018-02-20 11:11:55 -05:00
Rich Harris
605929053c ensure old server is killed before listening for port on new server 2018-02-20 11:11:02 -05:00
Rich Harris
2752c73ebb -> v0.7.2 2018-02-18 17:24:12 -05:00
Rich Harris
2547db39ac -> v0.7.1 2018-02-18 17:09:55 -05:00
Rich Harris
1285739cc5 -> v0.7.1 2018-02-18 17:08:35 -05:00
Rich Harris
14d64e854a -> v0.7.0 2018-02-18 13:00:36 -05:00
Rich Harris
c419c73550 fix tests 2018-02-18 12:55:56 -05:00
Rich Harris
835b94175d workaround weird webpack(?) bug by not deleting old files 2018-02-18 12:49:37 -05:00
Rich Harris
25bdcf9957 Merge branch 'gh-83' 2018-02-18 12:12:45 -05:00
Rich Harris
792ccf5c6a robustify dev server port selection 2018-02-18 12:12:25 -05:00
Rich Harris
4ca8195037 Merge pull request #127 from sveltejs/gh-83
implement this.redirect in preload
2018-02-18 10:36:05 -05:00
Rich Harris
cb12231053 implement this.error 2018-02-18 09:48:32 -05:00
Rich Harris
d55401d45b see if this fixes windows tests 2018-02-18 08:27:07 -05:00
Rich Harris
99d4eafb0b argh these flaky tests are killing me 2018-02-18 08:18:14 -05:00
Rich Harris
bff6f550be implement this.redirect in preload (#83) 2018-02-17 22:56:47 -05:00
Rich Harris
f8ea9ebda1 Merge pull request #126 from sveltejs/gh-91
[WIP] restructure everything
2018-02-17 19:49:12 -05:00
Rich Harris
181d7b4a61 need to come up with a more robust approach to this... 2018-02-17 19:27:34 -05:00
Rich Harris
beb415c65d argh 2018-02-17 19:22:05 -05:00
Rich Harris
5bbd7ead17 and again 2018-02-17 19:16:06 -05:00
Rich Harris
e11405d555 try increasing timeout 2018-02-17 19:12:47 -05:00
Rich Harris
9fe0ca2c22 remove 4xx and 5xx pages when initing 2018-02-17 19:00:06 -05:00
Rich Harris
f2eb95d546 various minor fixes 2018-02-17 18:40:20 -05:00
Rich Harris
ab1ca60363 basic sapper dev task, with HMR 2018-02-17 17:44:57 -05:00
Rich Harris
d95f52f8e9 fix tests, add WIP dev task 2018-02-17 11:15:26 -05:00
Rich Harris
b02183af53 fix exporting 2018-02-16 14:25:53 -05:00
Rich Harris
f9828f9fd2 work in progress 2018-02-16 12:01:55 -05:00
Rich Harris
9a760c570f move webpack configs in test app 2018-02-14 12:25:40 -05:00
Rich Harris
0f390920a8 fix some typescript stuff 2018-02-14 12:25:24 -05:00
Rich Harris
9adb6ca7e6 Merge pull request #120 from sveltejs/gh-92
implement sapper upgrade
2018-02-14 10:28:01 -05:00
Rich Harris
24980651c0 that was a weird typo 2018-02-13 22:08:29 -05:00
Rich Harris
7c6436a99c implement sapper upgrade 2018-02-13 18:46:53 -05:00
Rich Harris
f6b26f1b07 Merge pull request #119 from sveltejs/better-cli
Better CLI
2018-02-13 17:30:08 -05:00
Rich Harris
55b60369f9 add --help to CLI 2018-02-13 17:12:55 -05:00
Rich Harris
2be9dd1883 Move build.ts and export.ts into src/cli - fixes #115 2018-02-13 15:57:02 -05:00
Rich Harris
b29700f725 update electron to squelch vuln warning 2018-02-13 15:50:04 -05:00
Rich Harris
7188ce0d0d -> v0.6.4 2018-02-06 10:51:24 -05:00
Rich Harris
4f8ce19fe1 Merge pull request #114 from lukeed/fix/prod-hmr
Fix: Remove HMR attempts in Prod~!
2018-02-06 10:39:19 -05:00
Rich Harris
a85f2921e8 Merge pull request #113 from lukeed/feat/map-config
Consolidate Rollup config file
2018-02-06 10:37:34 -05:00
Luke Edwards
7a2ed16884 fix HMR attempts in production 2018-02-05 14:09:24 -08:00
Luke Edwards
08e575fee0 shrink repetitive rollup.config file 2018-02-05 13:43:10 -08:00
Rich Harris
7dbcab74d3 remove logging 2018-02-03 16:35:10 -05:00
Rich Harris
9b1b545194 -> v0.6.3 2018-02-03 16:26:53 -05:00
Rich Harris
7b01242f3e always build in prod mode 2018-02-03 16:26:47 -05:00
Rich Harris
15b1fbf8a6 ignore non-html responses when crawling, and close middleware when done 2018-02-03 16:17:28 -05:00
Rich Harris
8f1d2e0a04 -> v0.6.2 2018-02-03 13:56:38 -05:00
Rich Harris
dfb8692d78 handle unspecified type in sapper export 2018-02-03 13:56:14 -05:00
Rich Harris
09d3c4d85e add prepublish script 2018-02-03 13:49:21 -05:00
Rich Harris
1e623dde29 -> v0.6.1 2018-02-03 13:48:30 -05:00
Rich Harris
5104abf329 -> v0.6.0 2018-02-03 13:09:31 -05:00
Rich Harris
6554fc8616 Merge branch 'restructure' 2018-02-03 13:07:36 -05:00
Rich Harris
cd01b7e6db Merge branch 'master' of github.com:sveltejs/sapper 2018-02-03 12:24:59 -05:00
Rich Harris
bfa3da6d3d Merge branch 'issue_109-patch-1' of https://github.com/samhatchett/sapper into samhatchett-issue_109-patch-1 2018-02-03 12:07:53 -05:00
Rich Harris
6ee092f8d4 Merge pull request #107 from lukastaegert/fix-search-param-handling
Fix query param handling
2018-02-03 12:05:57 -05:00
Rich Harris
ac70004f77 remove runtime.js.map (again?) 2018-02-03 12:04:39 -05:00
Rich Harris
3449f1eb37 add test for #105 2018-02-03 12:04:14 -05:00
Rich Harris
16cb1fccc6 Merge pull request #105 from thgh/patch-2
Fix route not found when url is /?
2018-02-03 12:03:36 -05:00
Rich Harris
b20c1c029f Merge branch 'thgh-patch-1' 2018-02-03 11:50:37 -05:00
Rich Harris
7abfb1aab1 Merge branch 'restructure' 2018-02-03 11:50:12 -05:00
Rich Harris
205c2defe4 Merge branch 'patch-1' of https://github.com/thgh/sapper into thgh-patch-1 2018-02-03 11:45:54 -05:00
Rich Harris
09a6eec83e Merge pull request #101 from sveltejs/restructure
Restructure codebase
2018-02-03 11:44:57 -05:00
Rich Harris
2cabf61ea7 ignore runtime.js.map 2018-02-03 11:41:33 -05:00
Sam Hatchett
71cfdd2907 fixes api route default content-type
fixes issue where api routes were being defaulted to text/html. Page routes should be text/html, but api routes could be json, zip files, etc., and express does some type-guessing to assist in case the user code does not specify the content-type.
2018-01-31 11:08:25 -05:00
Lukas Taegert
297f4276de Fix query param handling by
* not using a for-of loop on an iterator that is transpiled wrongly
* not using URL.searchParams which is only supported by rather new
  browsers
2018-01-26 23:29:34 +01:00
Thomas Ghysels
422e31e183 Fix route not found when url is /? 2018-01-26 02:48:56 +01:00
Thomas Ghysels
b53ee061c0 Fix DOMException when location.hash is invalid selector 2018-01-26 02:24:49 +01:00
Rich Harris
8bad37205d convert to typescript 2018-01-21 16:28:02 -05:00
Rich Harris
fd0dd4fe58 and again... 2018-01-21 16:14:16 -05:00
Rich Harris
4940644ae3 more tidying up 2018-01-21 16:11:46 -05:00
Rich Harris
fb8d952eeb more tidying up 2018-01-21 16:02:42 -05:00
Rich Harris
fc631c4866 make route handling more explicit 2018-01-21 15:41:13 -05:00
Rich Harris
03ce2ea998 tidy up a bit 2018-01-21 15:04:22 -05:00
Rich Harris
dd8deb2d8a wip 3 2018-01-21 14:41:11 -05:00
Rich Harris
7d721abb2a wip 2 2018-01-21 11:15:32 -05:00
Rich Harris
39b1fa89ce wip 2018-01-21 11:03:23 -05:00
Rich Harris
7a3506420f Merge pull request #100 from sveltejs/gh-99
return a promise from init
2018-01-20 20:16:46 -05:00
Rich Harris
72ae4a1c64 ugh still need to wait for requests to complete 2018-01-20 19:55:21 -05:00
Rich Harris
a09c33d6a5 return a promise from init - fixes #99 2018-01-20 19:49:41 -05:00
Rich Harris
4590aa313c Merge pull request #96 from mrkishi/master
Identify js and html route clashes
2018-01-20 18:36:50 -05:00
Rich Harris
d11bd954e0 seems tests weren't actually running in appveyor? (#98)
well this was harder than it should have been
2018-01-20 18:34:30 -05:00
Rich Harris
c15959710b huh. not sure where this broke 2018-01-20 13:39:49 -05:00
Rich Harris
bb8ff74f68 remove noise from tests 2018-01-20 13:21:53 -05:00
Rich Harris
2cbbe91490 Merge branch 'master' of github.com:sveltejs/sapper 2018-01-20 12:53:16 -05:00
Rich Harris
faeddd8add work around Svelte hydration failures 2018-01-20 12:53:06 -05:00
Rich Harris
d77722c042 Merge branch 'chexxor-patch-1' 2018-01-20 12:40:35 -05:00
Rich Harris
61daba7a64 add hydration test, add window.init function to make it possible 2018-01-20 12:40:31 -05:00
Rich Harris
54ff8cc2e6 Merge branch 'patch-1' of https://github.com/chexxor/sapper into chexxor-patch-1 2018-01-20 12:37:48 -05:00
Rich Harris
e6fcafe09b Merge pull request #95 from lukeed/fix/express-reliance
Remove Express Helpers
2018-01-20 12:10:43 -05:00
Rich Harris
a305d3cea1 Merge pull request #97 from sveltejs/gh-90
return service worker from generate_asset_cache
2018-01-20 12:09:11 -05:00
Rich Harris
75e70207b8 return service worker from generate_asset_cache - fixes #90 2018-01-20 12:02:32 -05:00
mrkishi
8a8526d9ed Identify js and html route clashes 2018-01-20 01:42:13 -02:00
Luke Edwards
9a76229bb6 test: shim setHeader method 2018-01-19 13:56:01 -08:00
Luke Edwards
f4e46e6e6c replace Express shorthands w/ native counterparts 2018-01-19 13:54:55 -08:00
Alex Berg
90cd347112 Fix typo 2018-01-19 01:25:20 -06:00
Alex Berg
5adfdd6fe0 Hydrate on first load, not destroy 2018-01-19 01:22:08 -06:00
Rich Harris
a6dc61a182 -> v0.5.1 2018-01-16 08:47:50 -05:00
Rich Harris
96666d05ec only write to filesystem in dev mode 2018-01-16 08:47:44 -05:00
Rich Harris
6390ba692b -> v0.5.0 2018-01-15 10:28:48 -05:00
Rich Harris
0e131cc81e Merge pull request #88 from sveltejs/gh-9
Exporting
2018-01-15 10:24:35 -05:00
Rich Harris
bd3d5713cb Merge pull request #64 from lukeed/lazy-chokidar
Lazily Require Chokidar
2018-01-15 10:04:37 -05:00
Rich Harris
9ec23c47ad update test 2018-01-15 10:04:24 -05:00
Rich Harris
b7bb69925e rename extract to export, for familiarity to next.js devs 2018-01-15 10:03:27 -05:00
Rich Harris
25124f6ee7 Merge branch 'master' into lazy-chokidar 2018-01-15 09:58:39 -05:00
Rich Harris
73d491cd19 Merge branch 'master' into lazy-chokidar 2018-01-15 09:58:03 -05:00
Rich Harris
e25fceb4b8 node 6 is the new IE 2018-01-15 09:36:12 -05:00
Rich Harris
3807147c57 add missing dependency 2018-01-14 22:45:59 -05:00
Rich Harris
a523ba58ff save pages as index.html, ignore hashes 2018-01-14 22:45:51 -05:00
Rich Harris
fe03fd3a52 update lockfile 2018-01-14 18:21:37 -05:00
Rich Harris
89c430a0cb slightly different approach to extracting 2018-01-14 18:19:51 -05:00
Rich Harris
8ef312849c always write service-worker.js and shell index.html file 2018-01-14 18:16:10 -05:00
Rich Harris
4200446684 ignore trailing slash in pathnames 2018-01-14 18:15:40 -05:00
Rich Harris
681ed005b8 remove unused deps 2018-01-14 18:15:12 -05:00
Rich Harris
d457af8d51 update test 2018-01-14 18:14:07 -05:00
Rich Harris
0c158b9e1f Merge branch 'master' of https://github.com/freedmand/sapper into freedmand-master 2018-01-14 13:48:07 -05:00
Rich Harris
50011e2077 always print stdout/stderr, to avoid wild goose chase debugging 2018-01-14 13:47:23 -05:00
Rich Harris
f27b7973e3 Build before extracting 2018-01-14 13:46:25 -05:00
Rich Harris
2af2ab3cb9 Ensure output dir exists, return Promise 2018-01-14 13:45:47 -05:00
Rich Harris
6a4dc1901c Enforce prod mode, return a Promise so it can be used programmatically 2018-01-14 13:45:01 -05:00
Rich Harris
fbbc0e9e19 Merge branch 'master' of https://github.com/freedmand/sapper into freedmand-master 2018-01-14 12:29:15 -05:00
Rich Harris
1213c3da46 fix lockfile mess 2018-01-14 12:27:35 -05:00
Rich Harris
4cc2104088 add back test that got lost in a merge conflict somewhere 2018-01-14 12:23:07 -05:00
Rich Harris
d6dda371ca typo 2018-01-14 12:22:41 -05:00
Rich Harris
304c06085e Merge branch 'master' into master 2018-01-14 12:19:47 -05:00
Rich Harris
33b6450e34 Merge branch 'master' into master 2018-01-14 12:16:09 -05:00
Rich Harris
8faa98af6a -> v0.4.0 2018-01-14 12:07:06 -05:00
Rich Harris
14df138528 Merge pull request #87 from sveltejs/gh-3
Serialize preloaded data for initial page and serve to client
2018-01-14 11:50:18 -05:00
Rich Harris
44285cdb2f serialized preloaded data and send to client as initial payload - fixes #3 2018-01-14 11:22:00 -05:00
Rich Harris
bd656cfd5b Merge branch 'fix-tests-without-async' into gh-3 2018-01-14 10:45:55 -05:00
Rich Harris
c4b4bd587d use %sapper.scripts% 2018-01-14 10:45:21 -05:00
Rich Harris
2abfdb03d5 wait for window.READY so that this tests we dont double-preload 2018-01-14 10:44:38 -05:00
Rich Harris
a80ac3a8b8 change tests back to non-async versions 2018-01-14 00:43:57 -05:00
Rich Harris
887cb09386 merge 2018-01-14 00:21:55 -05:00
Rich Harris
cfeeafded4 Merge pull request #84 from sveltejs/test-in-node-6
test in node 6
2018-01-14 00:18:23 -05:00
Rich Harris
2cae674033 Merge branch 'master' into test-in-node-6 2018-01-14 00:14:40 -05:00
Rich Harris
7c0f32662d remove async from new test 2018-01-14 00:10:20 -05:00
Rich Harris
b4fb1c3268 Merge branch 'master' of github.com:sveltejs/sapper 2018-01-14 00:02:32 -05:00
Rich Harris
ecd0f673a9 test in node 6 2018-01-14 00:01:51 -05:00
Rich Harris
40d16852f7 prevent unnecessary promise chains, and hoist handler function 2018-01-14 00:01:10 -05:00
Rich Harris
133be03791 Merge pull request #72 from nolanlawson/fix-style-loader
Explicitly load style-loader/css-loader deps
2018-01-13 23:33:38 -05:00
Rich Harris
727a76ebb5 fall through to 404 if no handler exists for method 2018-01-13 23:29:41 -05:00
Rich Harris
e3c047831a add test for #77 2018-01-13 23:29:16 -05:00
Emil Tholin
81b5e0d764 Handle DELETE requests with del export 2018-01-10 19:24:22 +01:00
Emil Tholin
98e904dcfc Remove async/await from test.js 2018-01-07 12:22:40 +01:00
Nolan Lawson
ca51372150 Explicitly load style-loader/css-loader deps
This appears to fix sveltejs/sapper-template#27
2018-01-06 17:21:40 -08:00
Luke Edwards
7cef1f1120 only return from show-url if in server context 2018-01-06 16:11:39 -08:00
Luke Edwards
1b73baabce [temp - debug]: log out the preload value 2018-01-06 15:40:40 -08:00
Luke Edwards
5aa01b922b add page.title() Nightmare action 2018-01-06 15:16:18 -08:00
Luke Edwards
f0bc68be88 use built-in for document.title 2018-01-06 15:07:43 -08:00
Luke Edwards
be7c53becc quick attempt at fixing test for travis 2018-01-06 14:53:14 -08:00
freedmand
9ea4137b87 Add option to extract server-side routes at directories other than /api.
Also clarifies some texts and documentation.
2018-01-05 19:21:25 -08:00
freedmand
7588911108 Removes all async/await from the extraction pipeline, and adds unit tests for extracted client pages that match a regular expression 2018-01-05 14:56:58 -08:00
freedmand
fc8280adea Fixes small issue with reading chunk files 2018-01-05 14:42:04 -08:00
freedmand
d08f9eb5a4 Fixes funky indentation in extraction unit test 2018-01-05 14:29:46 -08:00
Emil Tholin
2b3472b1b1 Remove async/await from lib 2018-01-05 23:19:40 +01:00
freedmand
30ddb3dd7e Adds a sapper extract CLI command, which scrapes the server to run as a static website starting at the site's root.
TESTED=Basic unit test ensuring relevant routes are added.
2018-01-05 14:16:30 -08:00
Luke Edwards
0c891ba79e require chokidar lazily; dev-mode only 2018-01-05 00:39:17 -08:00
Rich Harris
ee94f355d5 update marked due to vulnerability 2018-01-04 17:17:08 -05:00
Rich Harris
bea9b7965a update package-lock 2018-01-04 17:13:17 -05:00
Rich Harris
1312aede1f -> v0.3.2 2018-01-03 13:48:03 -05:00
Rich Harris
50e307e0c0 add test for programmatic prefetch 2018-01-03 13:46:07 -05:00
Emil Tholin
e87ac1f367 Export prefetch 2018-01-03 18:39:51 +01:00
Rich Harris
5da9d0926a update README, add license 2018-01-01 16:50:21 -05:00
Rich Harris
9538499d51 -> v0.3.1 2017-12-31 16:36:02 -05:00
Rich Harris
ff1e632057 -> v0.3.0 2017-12-31 16:10:36 -05:00
Rich Harris
aeeb231477 Merge branch 'master' of github.com:sveltejs/sapper 2017-12-31 16:08:14 -05:00
Rich Harris
d1940db8c0 Merge pull request #56 from sveltejs/gh-55
handle nested routes
2017-12-31 16:08:08 -05:00
Rich Harris
98f9a64b64 specify pkg.files 2017-12-31 16:05:26 -05:00
Rich Harris
b9bef802d3 lint 2017-12-31 16:05:18 -05:00
Rich Harris
a7024b3806 fix index route 2017-12-31 16:04:54 -05:00
Rich Harris
423e02aeae handle nested routes - fixes #55 2017-12-31 13:25:52 -05:00
Rich Harris
12b73ecebf Merge pull request #54 from sveltejs/preload-req
pass server request object to preload
2017-12-31 13:02:24 -05:00
Rich Harris
e1bc38b5a7 bump timeout 2017-12-31 12:49:17 -05:00
Rich Harris
b66f624f01 pass server request object to preload 2017-12-30 17:31:07 -05:00
Rich Harris
502dd547d1 only preload once - fixes #49 2017-12-25 18:06:27 -05:00
Rich Harris
4c343490d2 merge master -> gh-49 2017-12-25 17:34:27 -05:00
Rich Harris
b3027c5816 port runtime to typescript, move runtime/app.js to runtime.js 2017-12-25 17:14:39 -05:00
Rich Harris
c29e8022cc replace all occurences of variables 2017-12-25 16:18:19 -05:00
Rich Harris
e4cd4c9cb0 Merge pull request #52 from sveltejs/gh-48
cancel navigation if overtaken by a second navigation
2017-12-25 16:17:48 -05:00
Rich Harris
feddad42b2 failing test for #49 2017-12-24 21:34:28 -05:00
Rich Harris
3c4ebcda30 cancel navigation if overtaken by a second navigation - fixes #48 2017-12-24 20:37:00 -05:00
Rich Harris
75aedf4663 -> v0.2.10 2017-12-24 07:56:01 -05:00
Rich Harris
c8366dec74 handle deep links 2017-12-24 07:53:39 -05:00
Rich Harris
9a936669c6 -> v0.2.9 2017-12-23 15:01:49 -05:00
Rich Harris
0226bd90c6 dont write service-worker.js and index.html to disk in prod mode 2017-12-23 15:01:29 -05:00
Rich Harris
e1926e1bcb -> v0.2.8 2017-12-23 13:16:58 -05:00
Rich Harris
db1c1f332a Add goto function (#46)
* WIP

* programmatic navigation

* get tests working

* wait longer
2017-12-23 13:15:40 -05:00
Rich Harris
e8d510b261 dont use /tmp, it fails when now server wakes after a sleep 2017-12-23 12:27:51 -05:00
Rich Harris
f8e237b265 make invalidation message look less like an error 2017-12-23 10:55:55 -05:00
Rich Harris
68c2f2e388 linting 2017-12-22 09:19:32 -05:00
Rich Harris
0bcb61650b use nightmare for testing 2017-12-21 16:48:53 -05:00
Rich Harris
43a12a8331 -> v0.2.7 2017-12-21 13:40:10 -05:00
Rich Harris
f0feab5738 fix typo 2017-12-21 13:39:13 -05:00
Rich Harris
e9203b4d71 empty .sapper when building 2017-12-21 12:01:53 -05:00
Rich Harris
8e79e706e6 -> v0.2.6 2017-12-21 11:56:04 -05:00
Rich Harris
4b495f44fd Merge pull request #42 from sveltejs/gh-40
render main.js back to templates, to allow relative imports
2017-12-21 11:54:53 -05:00
Rich Harris
222a750b7b render main.js back to templates, to allow relative imports - fixes #40 2017-12-21 11:38:03 -05:00
Rich Harris
5b214c964c -> v0.2.5 2017-12-21 08:59:00 -05:00
Rich Harris
95f99fd378 Merge pull request #39 from sveltejs/windows-nested-routes
use /, not path.sep, when creating routes
2017-12-21 08:55:41 -05:00
Rich Harris
1bed4b0670 use /, not path.sep, when creating routes 2017-12-21 08:46:40 -05:00
Rich Harris
9d4890913a Merge pull request #37 from sveltejs/gh-33
error if routes clash
2017-12-20 21:00:04 -05:00
Rich Harris
f50d3c4262 error if routes clash - fixes #33 2017-12-20 20:46:28 -05:00
Rich Harris
8925e541d5 Merge pull request #36 from sveltejs/gh-19
stream responses
2017-12-20 18:50:06 -05:00
Rich Harris
a48afb77d3 stream responses - fixes #19 2017-12-20 18:39:39 -05:00
Rich Harris
45e845ee92 Merge pull request #35 from sveltejs/gh-2
add preload header for main.js and current route
2017-12-20 18:13:07 -05:00
Rich Harris
492f024d2a add preload header for main.js and current route - fixes #2 2017-12-20 18:04:11 -05:00
Rich Harris
8d40992cf1 Merge pull request #34 from sveltejs/gh-13
Rebundle when routes/templates change
2017-12-20 17:51:04 -05:00
Rich Harris
4232f75b19 rebundle when main.js changes 2017-12-20 17:36:22 -05:00
Rich Harris
fefb0d96d7 rebundle when routes and templates change 2017-12-20 17:34:23 -05:00
Rich Harris
cd91bf2ca4 -> v0.2.4 2017-12-20 16:33:54 -05:00
Rich Harris
7466e8da82 -> v0.2.3 2017-12-20 09:31:51 -05:00
Rich Harris
463307db86 pass URL to 404 handler 2017-12-20 08:29:28 -05:00
Rich Harris
2a68394dce Merge pull request #31 from sveltejs/possible-windows-fix-3
posixify import paths
2017-12-20 08:28:32 -05:00
Rich Harris
c8fe0679ae posixify import paths 2017-12-19 20:48:44 -05:00
Rich Harris
51d45cf38f -> v0.2.2 2017-12-19 08:55:40 -05:00
Rich Harris
92fbc28e11 make dest dir in buid as well as dev 2017-12-19 08:54:25 -05:00
Rich Harris
c1b1b3ed63 add some tests - closes #10 2017-12-18 21:39:17 -05:00
Rich Harris
cd8b9ddb14 -> v0.2.1 2017-12-18 17:11:17 -05:00
Rich Harris
924855d248 Merge pull request #26 from sveltejs/gh-14
inject HMR import
2017-12-18 17:08:08 -05:00
Rich Harris
8b516ef9bd inject HMR import - fixes #14 2017-12-18 17:07:17 -05:00
Rich Harris
8604088f3d -> v0.2.0 2017-12-18 15:48:28 -05:00
Rich Harris
8da3ca16ab Separate build step (closes #21) 2017-12-18 15:38:56 -05:00
Rich Harris
d0dd1d6cc9 Merge pull request #23 from sveltejs/remove-webpack-dev-middleware
remove webpack-dev-middleware
2017-12-18 12:02:27 -05:00
Rich Harris
8270463281 remove webpack-dev-middleware 2017-12-18 11:41:02 -05:00
Rich Harris
514331b5e3 -> v0.1.5 2017-12-17 21:39:55 -05:00
Rich Harris
63d39575be starting to lose my sense of humour 2017-12-17 21:39:43 -05:00
Rich Harris
3af5503009 -> v0.1.4 2017-12-17 21:34:28 -05:00
Rich Harris
c1de442dd1 argh not again 2017-12-17 21:34:16 -05:00
Rich Harris
0c6b7e3836 -> v0.1.3 2017-12-17 21:07:55 -05:00
Rich Harris
dc5e2543cb argh copypasta fail 2017-12-17 21:07:34 -05:00
Rich Harris
ecc7b80d91 -> v0.1.2 2017-12-17 20:43:52 -05:00
Rich Harris
40024e7d86 Merge pull request #18 from sveltejs/make-dest-dir
create dest dir immediately - should fix some CI failures
2017-12-17 20:41:55 -05:00
Rich Harris
6f71f7ad4d Merge pull request #17 from sveltejs/gh-11
use atime.getTime() and mtime.getTime() - hopefully fixes #11
2017-12-17 20:41:30 -05:00
Rich Harris
6eb99b195e use atime.getTime() and mtime.getTime() - hopefully fixes #11 2017-12-17 20:39:18 -05:00
Rich Harris
9e08fee9a1 create dest dir immediately - should fix some CI failures 2017-12-17 20:24:58 -05:00
Rich Harris
442ce366e2 -> v0.1.1 2017-12-17 15:18:03 -05:00
Rich Harris
dc929fcd83 inject app path, since dest might be /tmp causing resolution failure 2017-12-17 15:17:23 -05:00
Rich Harris
2dc246398b -> v0.1.0 2017-12-17 15:05:51 -05:00
Rich Harris
b7ac067459 always write to .sapper, not templates, since we cant guarantee fs access 2017-12-17 15:04:20 -05:00
Rich Harris
8b50ff34b8 named exports, for tree-shakeability when we add new stuff 2017-12-17 15:01:26 -05:00
Rich Harris
62abdb2a87 remove magic return values from server routes 2017-12-17 15:01:05 -05:00
Rich Harris
34d0bae4a1 -> v0.0.22 2017-12-16 20:31:37 -05:00
Rich Harris
4f0b336627 fix prod mode 2017-12-16 20:30:14 -05:00
Rich Harris
e71bf298fb inject __dev__ variable 2017-12-16 20:19:02 -05:00
Rich Harris
e4936375db support HMR 2017-12-16 20:10:49 -05:00
Rich Harris
08ff7ad234 shuffle things around 2017-12-16 17:19:28 -05:00
Rich Harris
5995b7ae6a run webpack in watch mode during dev 2017-12-16 16:50:46 -05:00
Rich Harris
71ed3864b7 run webpack in watch mode 2017-12-16 16:24:36 -05:00
Rich Harris
bd7f6e2b1a expose main.js 2017-12-16 15:40:22 -05:00
Rich Harris
dd1f2d79ff -> v0.0.21 2017-12-16 12:18:34 -05:00
Rich Harris
dccd3cdeb0 prevent default when navigating to current location 2017-12-16 10:59:46 -05:00
Rich Harris
b3b5d9f352 handle hashchange correctly 2017-12-16 08:53:42 -05:00
Rich Harris
10ddaeb7a3 dont navigate on hashchange 2017-12-16 08:16:09 -05:00
Rich Harris
060f9b2f5e tidy up dependencies 2017-12-16 08:07:40 -05:00
Rich Harris
32dfa94247 dont include directories in cache manifest 2017-12-16 08:07:22 -05:00
Rich Harris
797cc3cde1 remove esm stuff - no longer used 2017-12-16 08:07:10 -05:00
Rich Harris
9eca90067c -> v0.0.20 2017-12-15 18:37:19 -05:00
Rich Harris
57f293e872 dont cache shell/sw in dev 2017-12-15 18:37:08 -05:00
Rich Harris
7e65c481d8 doh 2017-12-15 18:34:38 -05:00
Rich Harris
0fe93cd177 -> v0.0.19 2017-12-15 18:27:04 -05:00
Rich Harris
67fe570f6d dont try to prevent event where none exists 2017-12-15 18:26:55 -05:00
Rich Harris
a3d44aba31 -> v0.0.18 2017-12-15 17:20:36 -05:00
Rich Harris
80ae909b73 serve assets from memory, use caching 2017-12-15 17:20:24 -05:00
Rich Harris
892b18cf80 -> v0.0.17 2017-12-15 16:47:34 -05:00
Rich Harris
0eb96bf01f oops, remove logging 2017-12-15 16:47:29 -05:00
Rich Harris
419f5c5235 -> v0.0.16 2017-12-15 16:46:27 -05:00
Rich Harris
4c61ed5fdd better link click handling, track scroll position 2017-12-15 16:46:11 -05:00
Rich Harris
c19447cf05 -> v0.0.15 2017-12-15 15:29:30 -05:00
Rich Harris
cb2364f476 add noscript message (todo - make it configurable) 2017-12-15 15:29:08 -05:00
Rich Harris
de427d400e -> v0.0.14 2017-12-15 14:49:56 -05:00
Rich Harris
e810ead93f move files around 2017-12-15 14:46:23 -05:00
Rich Harris
f5a19ef34b tweak service worker stuff 2017-12-15 14:43:38 -05:00
Rich Harris
b8c03d330b refactor some webpack stuff, support service worker generation 2017-12-14 15:38:41 -05:00
Rich Harris
6e769496ec -> v0.0.13 2017-12-14 08:23:00 -05:00
Rich Harris
e46aceb2fe implement prefetching anchors with rel=prefetch 2017-12-14 08:21:32 -05:00
Rich Harris
a87cac2481 refactor some stuff 2017-12-14 07:53:17 -05:00
Rich Harris
608fdb7533 -> v0.0.12 2017-12-14 07:15:07 -05:00
Rich Harris
80166b5a7d -> v0.0.11 2017-12-14 07:12:01 -05:00
Rich Harris
24b259f80b fix location, so that runtime can be found from /tmp 2017-12-14 07:11:52 -05:00
Rich Harris
8a9f4bd268 -> v0.0.10 2017-12-14 07:07:47 -05:00
Rich Harris
d940da1a77 serve errors 2017-12-14 07:07:29 -05:00
Rich Harris
91269f5705 -> v0.0.9 2017-12-13 22:38:18 -05:00
Rich Harris
80a9818e95 dont assume error was caught 2017-12-13 22:38:09 -05:00
Rich Harris
478ccf53cc -> v0.0.8 2017-12-13 22:33:24 -05:00
Rich Harris
b32278e88b argh 2017-12-13 22:33:12 -05:00
Rich Harris
881d411db0 -> v0.0.7 2017-12-13 22:30:15 -05:00
456 changed files with 22986 additions and 4400 deletions

12
.gitignore vendored
View File

@@ -1,2 +1,12 @@
.DS_Store
node_modules
yarn.lock
yarn-error.log
node_modules
cypress/screenshots
__sapper__
sapper
runtime.js
dist
!rollup.config.js
/runtime/app.mjs
/runtime/server.mjs

3
.netlify/state.json Normal file
View File

@@ -0,0 +1,3 @@
{
"siteId": "a6a3cfed-c34e-42f7-9616-07ad2eedb15f"
}

20
.travis.yml Normal file
View File

@@ -0,0 +1,20 @@
sudo: false
language: node_js
node_js:
- "stable"
env:
global:
- BUILD_TIMEOUT=10000
addons:
apt:
packages:
- xvfb
install:
- export DISPLAY=':99.0'
- Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
- npm ci || npm i

626
CHANGELOG.md Normal file
View File

@@ -0,0 +1,626 @@
# sapper changelog
## 0.27.1
* Prevent infinite loop if `preload` errors ([#677](https://github.com/sveltejs/sapper/pull/677))
* Allow disabling of live reload ([#683](https://github.com/sveltejs/sapper/pull/683))
* Let browser handle initial scroll ([#331](https://github.com/sveltejs/sapper/issues/331))
* Allow custom route file extensions via `--ext` ([#632](https://github.com/sveltejs/sapper/pull/632))
* Wait for server to restart before attaching debugger ([#694](https://github.com/sveltejs/sapper/pull/694))
* Fix export queue ([#698](https://github.com/sveltejs/sapper/pull/698))
* Rerun `preload` functions when query changes ([#701](https://github.com/sveltejs/sapper/issues/701))
* Navigate when spread route changes ([#688](https://github.com/sveltejs/sapper/issues/688))
## 0.27.0
* Change license from LIL to MIT ([#652](https://github.com/sveltejs/sapper/pull/652))
* Fix index server route mapping ([#624](https://github.com/sveltejs/sapper/issues/624))
## 0.26.1
* Handle skipped segments ([#663](https://github.com/sveltejs/sapper/pull/663))
## 0.26.0
* Update to Svelte 3
* Slot-based nested routes ([#573](https://github.com/sveltejs/sapper/issues/573))
* Make `page`, `preloading` and `session` stores available to components ([#642](https://github.com/sveltejs/sapper/pull/642))
* Handle missing/empty refs when exporting ([#602](https://github.com/sveltejs/sapper/issues/602))
* Prevent race condition when exporting ([#585](https://github.com/sveltejs/sapper/pull/585))
* Fix redirects with base path ([#589](https://github.com/sveltejs/sapper/issues/589))
* Add `<link rel="preload">` to exported HTML ([#568](https://github.com/sveltejs/sapper/pull/568))
* Handle deep links that are invalid selectors on initial load ([#516](https://github.com/sveltejs/sapper/issues/516))
* Use shared queue for exporting ([#604](https://github.com/sveltejs/sapper/issues/604))
* Handle `+` character in query string ([#618](https://github.com/sveltejs/sapper/issues/618))
* Spread routes ([#545](https://github.com/sveltejs/sapper/issues/545))
* Fix navigation from `/a/[id]` to `/b/[id]` ([#610](https://github.com/sveltejs/sapper/pull/610))
* Allow `preload` functions to return falsy values ([#587](https://github.com/sveltejs/sapper/issues/587))
* Mount error pages correctly ([#620](https://github.com/sveltejs/sapper/pull/620))
## 0.25.0
* Force refresh on `goto(current_url)` ([#484](https://github.com/sveltejs/sapper/pull/484))
* Fix preloading navigation bug ([#532](https://github.com/sveltejs/sapper/issues/532))
* Don't mutate opts.headers ([#528](https://github.com/sveltejs/sapper/issues/528))
* Don't crawl hundreds of pages simultaneously ([#369](https://github.com/sveltejs/sapper/pull/369))
## 0.24.3
* Add service-worker-index.html shell file for offline support ([#422](https://github.com/sveltejs/sapper/issues/422))
* Don't cache .map files ([#534](https://github.com/sveltejs/sapper/issues/534))
## 0.24.2
* Support Rollup 1.0 ([#541](https://github.com/sveltejs/sapper/pull/541))
## 0.24.1
* Include CSS chunks in webpack build info to avoid duplication ([#529](https://github.com/sveltejs/sapper/pull/529))
* Fix preload `as` for styles ([#530](https://github.com/sveltejs/sapper/pull/530))
## 0.24.0
* Handle external URLs in `this.redirect` ([#490](https://github.com/sveltejs/sapper/issues/490))
* Strip leading `/` from basepath ([#495](https://github.com/sveltejs/sapper/issues/495))
* Treat duplicate query string parameters as arrays ([#497](https://github.com/sveltejs/sapper/issues/497))
* Don't buffer `stdout` and `stderr` ([#305](https://github.com/sveltejs/sapper/issues/305))
* Posixify `build_dir` ([#498](https://github.com/sveltejs/sapper/pull/498))
* Use `page[XY]Offset` instead of `scroll[XY]` ([#480](https://github.com/sveltejs/sapper/issues/480))
## 0.23.5
* Include lazily-imported CSS in main CSS chunk ([#492](https://github.com/sveltejs/sapper/pull/492))
* Make search param decoding spec-compliant ([#493](https://github.com/sveltejs/sapper/pull/493))
* Handle async route errors ([#488](https://github.com/sveltejs/sapper/pull/488))
## 0.23.4
* Ignore empty anchors when exporting ([#491](https://github.com/sveltejs/sapper/pull/491))
## 0.23.3
* Clear `error` and `status` on successful render ([#477](https://github.com/sveltejs/sapper/pull/477))
## 0.23.2
* Fix entry point CSS ([#471](https://github.com/sveltejs/sapper/pull/471))
## 0.23.1
* Scroll to deeplink that matches current URL ([#472](https://github.com/sveltejs/sapper/pull/472))
* Scroll to deeplink on another page ([#341](https://github.com/sveltejs/sapper/issues/341))
## 0.23.0
* Overhaul internal APIs ([#468](https://github.com/sveltejs/sapper/pull/468))
* Remove unused `sapper start` and `sapper upgrade` ([#468](https://github.com/sveltejs/sapper/pull/468))
* Remove magic environment variables ([#469](https://github.com/sveltejs/sapper/pull/469))
* Preserve SSI comments ([#470](https://github.com/sveltejs/sapper/pull/470))
## 0.22.10
* Handle `sapper-noscroll` attribute on `<a>` elements ([#376](https://github.com/sveltejs/sapper/issues/376))
* Fix CSS paths when using a base path ([#466](https://github.com/sveltejs/sapper/pull/466))
## 0.22.9
* Fix legacy builds ([#462](https://github.com/sveltejs/sapper/pull/462))
## 0.22.8
* Ensure CSS placeholders are overwritten ([#462](https://github.com/sveltejs/sapper/pull/462))
## 0.22.7
* Fix cookies ([#460](https://github.com/sveltejs/sapper/pull/460))
## 0.22.6
* Normalise chunk filenames on Windows ([#456](https://github.com/sveltejs/sapper/pull/456))
* Load modules with credentials ([#458](https://github.com/sveltejs/sapper/pull/458))
## 0.22.5
* Fix `sapper dev`. Oops.
## 0.22.4
* Ensure launcher does not overwrite a module ([#455](https://github.com/sveltejs/sapper/pull/455))
## 0.22.3
* Prevent server from accidentally importing dev client
## 0.22.2
* Make paths in generated code relative to project
## 0.22.1
* Fix `pkg.files`
## 0.22.0
* Move generated files into `__sapper__` ([#453](https://github.com/sveltejs/sapper/pull/453))
* Change default build and export directories to `__sapper__/build` and `__sapper__/export` ([#453](https://github.com/sveltejs/sapper/pull/453))
## 0.21.1
* Read template from build directory in production
## 0.21.0
* Change project folder structure ([#432](https://github.com/sveltejs/sapper/issues/432))
* Escape filenames ([#446](https://github.com/sveltejs/sapper/pull/446/))
## 0.20.4
* Fix legacy build CSS ([#439](https://github.com/sveltejs/sapper/issues/439))
* Enable debugging in Chrome and VSCode ([#435](https://github.com/sveltejs/sapper/issues/435))
## 0.20.3
* Inject `nonce` attribute if `res.locals.nonce` is present ([#424](https://github.com/sveltejs/sapper/pull/424))
* Prevent service worker caching ([#428](https://github.com/sveltejs/sapper/pull/428))
* Consistent caching for HTML responses ([#429](https://github.com/sveltejs/sapper/pull/429))
## 0.20.2
* Add `immutable` cache control header for hashed assets ([#425](https://github.com/sveltejs/sapper/pull/425))
* Handle value-less query string params ([#426](https://github.com/sveltejs/sapper/issues/426))
## 0.20.1
* Update shimport
## 0.20.0
* Decode `req.params` and `req.query` ([#417](https://github.com/sveltejs/sapper/issues/417))
* Decode URLs before writing files in `sapper export` ([#414](https://github.com/sveltejs/sapper/pull/414))
* Generate server sourcemaps for Rollup apps in dev mode ([#418](https://github.com/sveltejs/sapper/pull/418))
## 0.19.3
* Better unicode route handling ([#347](https://github.com/sveltejs/sapper/issues/347))
## 0.19.2
* Ignore editor tmp files ([#220](https://github.com/sveltejs/sapper/issues/220))
* Ignore clicks an `<a>` element without `href` ([#235](https://github.com/sveltejs/sapper/issues/235))
* Allow routes that are reserved JavaScript words ([#315](https://github.com/sveltejs/sapper/issues/315))
* Print out webpack errors ([#403](https://github.com/sveltejs/sapper/issues/403))
## 0.19.1
* Don't include local origin in export redirects ([#409](https://github.com/sveltejs/sapper/pull/409))
## 0.19.0
* Extract styles out of JS into .css files, for Rollup apps ([#388](https://github.com/sveltejs/sapper/issues/388))
* Fix `prefetchRoutes` ([#380](https://github.com/sveltejs/sapper/issues/380))
## 0.18.7
* Support differential bundling for Rollup apps via a `--legacy` flag ([#280](https://github.com/sveltejs/sapper/issues/280))
## 0.18.6
* Bundle missing dependency
## 0.18.5
* Bugfix
## 0.18.4
* Handle non-Sapper responses when exporting ([#382](https://github.com/sveltejs/sapper/issues/392))
* Add `--dev-port` flag to `sapper dev` ([#381](https://github.com/sveltejs/sapper/issues/381))
## 0.18.3
* Fix service worker Rollup build config
## 0.18.2
* Update `pkg.files`
## 0.18.1
* Add live reloading ([#385](https://github.com/sveltejs/sapper/issues/385))
## 0.18.0
* Rollup support ([#379](https://github.com/sveltejs/sapper/pull/379))
* Fail `export` if a page times out (configurable with `--timeout`) ([#378](https://github.com/sveltejs/sapper/pull/378))
## 0.17.1
* Print which file is causing build errors/warnings ([#371](https://github.com/sveltejs/sapper/pull/371))
## 0.17.0
* Use `cheap-watch` instead of `chokidar` ([#364](https://github.com/sveltejs/sapper/issues/364))
## 0.16.1
* Fix file watching regression in previous version
## 0.16.0
* Slim down installed package ([#363](https://github.com/sveltejs/sapper/pull/363))
## 0.15.8
* Only set `preloading: true` on navigation, not prefetch ([#352](https://github.com/sveltejs/sapper/issues/352))
* Provide fallback for missing preload errors ([#361](https://github.com/sveltejs/sapper/pull/361))
## 0.15.7
* Strip leading slash from redirects ([#291](https://github.com/sveltejs/sapper/issues/291))
* Pass `(req, res)` to store getter ([#344](https://github.com/sveltejs/sapper/issues/344))
## 0.15.6
* Fix exporting with custom basepath ([#342](https://github.com/sveltejs/sapper/pull/342))
## 0.15.5
* Faster `export` with more explanatory output ([#335](https://github.com/sveltejs/sapper/pull/335))
* Only blur `activeElement` if it exists ([#332](https://github.com/sveltejs/sapper/issues/332))
* Don't emit `client_info.json` or `server_info.json` ([#318](https://github.com/sveltejs/sapper/issues/318))
## 0.15.4
* Add `ignore` option ([#326](https://github.com/sveltejs/sapper/pull/326))
## 0.15.3
* Crawl pages in parallel when exporting ([#329](https://github.com/sveltejs/sapper/pull/329))
* Don't minify inline JS when exporting ([#328](https://github.com/sveltejs/sapper/pull/328))
## 0.15.2
* Collapse component chains where no intermediate layout component is specified ([#312](https://github.com/sveltejs/sapper/issues/312))
## 0.15.1
* Prevent confusing error when no root layout is specified
## 0.15.0
* Nested routes (consult [migration guide](https://sapper.svelte.technology/guide#0-14-to-0-15) and docs on [layouts](https://sapper.svelte.technology/guide#layouts)) ([#262](https://github.com/sveltejs/sapper/issues/262))
## 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))
## 0.14.0
* `4xx.html` and `5xx.html` are replaced with `_error.html` ([#209](https://github.com/sveltejs/sapper/issues/209))
* Treat `foo/index.json.js` and `foo.json.js` as equivalents ([#297](https://github.com/sveltejs/sapper/issues/297))
* Return a promise from `goto` ([#270](https://github.com/sveltejs/sapper/issues/270))
* Use store when rendering error pages ([#293](https://github.com/sveltejs/sapper/issues/293))
* Prevent console errors when visiting an error page ([#279](https://github.com/sveltejs/sapper/issues/279))
## 0.13.6
* Fix `baseUrl` synthesis ([#296](https://github.com/sveltejs/sapper/issues/296))
## 0.13.5
* Fix handling of fatal errors ([#289](https://github.com/sveltejs/sapper/issues/289))
## 0.13.4
* Focus `<body>` after navigation ([#287](https://github.com/sveltejs/sapper/issues/287))
* Fix timing of hot reload updates
* Emit `fatal` event if server crashes ([#285](https://github.com/sveltejs/sapper/pull/285))
* Emit `stdout` and `stderr` events on dev watcher ([#285](https://github.com/sveltejs/sapper/pull/285))
* Always refresh client assets in dev ([#286](https://github.com/sveltejs/sapper/pull/286))
* Correctly initialise rebuild stats
## 0.13.3
* Make `fatal` events clonable for IPC purposes
## 0.13.2
* Emit a `basepath` event ([#284](https://github.com/sveltejs/sapper/pull/284))
## 0.13.1
* Reinstate ten-second interval between dev server heartbeats ([#276](https://github.com/sveltejs/sapper/issues/276))
## 0.13.0
* Expose `dev`, `build`, `export` and `find_page` APIs ([#272](https://github.com/sveltejs/sapper/issues/272))
## 0.12.0
* Each app has a single `<App>` component. See the [migration guide](https://sapper.svelte.technology/guide#0-11-to-0-12) for more information ([#157](https://github.com/sveltejs/sapper/issues/157))
* Process exits with error code 1 if build/export fails ([#208](https://github.com/sveltejs/sapper/issues/208))
## 0.11.1
* Limit routes with leading dots to `.well-known` URIs ([#252](https://github.com/sveltejs/sapper/issues/252))
* Allow server routes to sit in front of pages ([#236](https://github.com/sveltejs/sapper/pull/236))
## 0.11.0
* Create launcher file ([#240](https://github.com/sveltejs/sapper/issues/240))
* Only keep necessary parts of webpack stats ([#251](https://github.com/sveltejs/sapper/pull/251))
* Allow `NODE_ENV` to be overridden when building ([#241](https://github.com/sveltejs/sapper/issues/241))
## 0.10.7
* Allow routes to have a leading `.` ([#243](https://github.com/sveltejs/sapper/pull/243))
* Only encode necessary characters in routes ([#234](https://github.com/sveltejs/sapper/pull/234))
* Preserve existing `process.env` when exporting ([#245](https://github.com/sveltejs/sapper/pull/245))
## 0.10.6
* Fix error reporting in `sapper start`
## 0.10.5
* Fix missing service worker ([#231](https://github.com/sveltejs/sapper/pull/231))
## 0.10.4
* Upgrade chokidar, this time with a fix ([#227](https://github.com/sveltejs/sapper/pull/227))
## 0.10.3
* Downgrade chokidar ([#212](https://github.com/sveltejs/sapper/issues/212))
## 0.10.2
* Attach `store` to error pages
* Fix sorting edge case ([#215](https://github.com/sveltejs/sapper/pull/215))
## 0.10.1
* Fix server-side `fetch` paths ([#207](https://github.com/sveltejs/sapper/pull/207))
## 0.10.0
* Support mounting on a path (this requires `app/template.html` to include `%sapper.base%`) ([#180](https://github.com/sveltejs/sapper/issues/180))
* Support per-request server-side `Store` with client-side hydration ([#178](https://github.com/sveltejs/sapper/issues/178))
* Add `this.fetch` to `preload`, with credentials support ([#178](https://github.com/sveltejs/sapper/issues/178))
* Exclude sourcemaps from preload links and `<script>` block ([#204](https://github.com/sveltejs/sapper/pull/204))
* Register service worker in `<script>` block
## 0.9.6
* Whoops — `tslib` is a runtime dependency
## 0.9.5
* Stringify clorox output ([#197](https://github.com/sveltejs/sapper/pull/197))
## 0.9.4
* Add `SAPPER_BASE` and `SAPPER_APP` environment variables ([#181](https://github.com/sveltejs/sapper/issues/181))
* Minify template in `sapper build` ([#15](https://github.com/sveltejs/sapper/issues/15))
* Minify all HTML files in `sapper export` ([#172](https://github.com/sveltejs/sapper/issues/172))
* Log exported files ([#195](https://github.com/sveltejs/sapper/pull/195))
* Add `--open`/`-o` flag to `sapper dev` and `sapper start` ([#186](https://github.com/sveltejs/sapper/issues/186))
## 0.9.3
* Fix path to `sapper-dev-client`
## 0.9.2
* Include `dist` files in package
## 0.9.1
* Include `sapper` bin
## 0.9.0
* Use `devalue` instead of `serialize-javascript`, allowing `preload` to return non-POJOs and cyclical/repeated references, but *not* functions ([#112](https://github.com/sveltejs/sapper/issues/112))
* Kill child process if webpack crashes ([#177](https://github.com/sveltejs/sapper/issues/177))
* Support HMR on remote devices ([#165](https://github.com/sveltejs/sapper/issues/165))
* Remove hard-coded port (([#169](https://github.com/sveltejs/sapper/issues/169)))
* Allow non-JS files, e.g. TypeScript to be used as entry points and server routes ([#57](https://github.com/sveltejs/sapper/issues/57))
* Faster startup ([#173](https://github.com/sveltejs/sapper/issues/173))
## 0.8.4
* Fix route sorting ([#175](https://github.com/sveltejs/sapper/pull/175))
## 0.8.3
* Automatically select available port, or use `--port` flag for `dev` and `start` ([#169](https://github.com/sveltejs/sapper/issues/169))
* Show stats after build/export ([#168](https://github.com/sveltejs/sapper/issues/168))
* Various CLI improvements ([#170](https://github.com/sveltejs/sapper/pull/170))
## 0.8.2
* Rename `preloadRoutes` to `prefetchRoutes` ([#166](https://github.com/sveltejs/sapper/issues/166))
## 0.8.1
* Add `sapper start` command, for running an app built with `sapper build` ([#163](https://github.com/sveltejs/sapper/issues/163))
## 0.8.0
* Update to webpack 4
* Add `preloadRoutes` function — secondary routes are no longer automatically preloaded ([#160](https://github.com/sveltejs/sapper/issues/160))
* `sapper build` outputs to `build`, `sapper build custom-dir` outputs to `custom-dir` ([#150](https://github.com/sveltejs/sapper/pull/150))
* `sapper export` outputs to `export`, `sapper export custom-dir` outputs to `custom-dir` ([#150](https://github.com/sveltejs/sapper/pull/150))
* Improved logging ([#158](https://github.com/sveltejs/sapper/pull/158))
* URI-encode routes ([#103](https://github.com/sveltejs/sapper/issues/103))
* Various performance and stability improvements ([#152](https://github.com/sveltejs/sapper/pull/152))
## 0.7.6
* Prevent client-side navigation to server route ([#145](https://github.com/sveltejs/sapper/issues/145))
* Don't serve error page for server route errors ([#138](https://github.com/sveltejs/sapper/issues/138))
## 0.7.5
* Allow dynamic parameters inside route parts ([#139](https://github.com/sveltejs/sapper/issues/139))
## 0.7.4
* Force `NODE_ENV='production'` when running `build` or `export` ([#141](https://github.com/sveltejs/sapper/issues/141))
* Use source-map-support ([#134](https://github.com/sveltejs/sapper/pull/134))
## 0.7.3
* Handle webpack assets that are arrays instead of strings ([#131](https://github.com/sveltejs/sapper/pull/131))
* Wait for new server to start before broadcasting HMR update ([#129](https://github.com/sveltejs/sapper/pull/129))
## 0.7.2
* Add `hmr-client.js` to package
* Wait until first successful client build before creating service-worker.js
## 0.7.1
* Add missing `tslib` dependency
## 0.7.0
* Restructure app layout (see [migration guide](https://sapper.svelte.technology/guide#0-6-to-0-7)) ([#126](https://github.com/sveltejs/sapper/pull/126))
* Support `this.redirect(status, location)` and `this.error(status, error)` in `preload` functions ([#127](https://github.com/sveltejs/sapper/pull/127))
* Add `sapper dev` command
* Add `sapper --help` command
## 0.6.4
* Prevent phantom HMR requests in production mode ([#114](https://github.com/sveltejs/sapper/pull/114))
## 0.6.3
* Ignore non-HTML responses when crawling during `export`
* Build in prod mode for `export`
## 0.6.2
* Handle unspecified type in `sapper export`
## 0.6.1
* Fix `pkg.files` and `pkg.bin`
## 0.6.0
* Hydrate on first load, and only on first load ([#93](https://github.com/sveltejs/sapper/pull/93))
* Identify clashes between page and server routes ([#96](https://github.com/sveltejs/sapper/pull/96))
* Remove Express-specific utilities, for compatbility with Polka et al ([#94](https://github.com/sveltejs/sapper/issues/94))
* Return a promise from `init` when first page has rendered ([#99](https://github.com/sveltejs/sapper/issues/99))
* Handle invalid hash links ([#104](https://github.com/sveltejs/sapper/pull/104))
* Avoid `URLSearchParams` ([#107](https://github.com/sveltejs/sapper/pull/107))
* Don't automatically set `Content-Type` for server routes ([#111](https://github.com/sveltejs/sapper/pull/111))
* Handle empty query string routes, e.g. `/?` ([#105](https://github.com/sveltejs/sapper/pull/105))
## 0.5.1
* Only write service-worker.js to filesystem in dev mode ([#90](https://github.com/sveltejs/sapper/issues/90))
## 0.5.0
* Experimental support for `sapper export` ([#9](https://github.com/sveltejs/sapper/issues/9))
* Lazily load chokidar, for faster startup ([#64](https://github.com/sveltejs/sapper/pull/64))
## 0.4.0
* `%sapper.main%` has been replaced with `%sapper.scripts%` ([#86](https://github.com/sveltejs/sapper/issues/86))
* Node 6 support ([#67](https://github.com/sveltejs/sapper/pull/67))
* Explicitly load css-loader and style-loader ([#72](https://github.com/sveltejs/sapper/pull/72))
* DELETE requests are handled with `del` exports ([#77](https://github.com/sveltejs/sapper/issues/77))
* Send preloaded data for first route to client, where possible ([#3](https://github.com/sveltejs/sapper/issues/3))
## 0.3.2
* Expose `prefetch` function ([#61](https://github.com/sveltejs/sapper/pull/61))
## 0.3.1
* Fix missing `runtime.js`
## 0.3.0
* Move `sapper/runtime/app.js` to `sapper/runtime.js`
* Cancel navigation if overtaken by second navigation ([#48](https://github.com/sveltejs/sapper/issues/48))
* Store preloaded data, to avoiding double prefetching ([#49](https://github.com/sveltejs/sapper/issues/49))
* Pass server request object to `preload` ([#54](https://github.com/sveltejs/sapper/pull/54))
* Nested routes ([#55](https://github.com/sveltejs/sapper/issues/55))
## 0.2.10
* Handle deep links correctly ([#44](https://github.com/sveltejs/sapper/issues/44))
## 0.2.9
* Don't write files to disk in prod mode
## 0.2.8
* Add `goto` function ([#29](https://github.com/sveltejs/sapper/issues/29))
* Don't use `/tmp` as destination in Now environments
## 0.2.7
* Fix streaming bug
## 0.2.6
* Render main.js back to templates, to allow relative imports ([#40](https://github.com/sveltejs/sapper/issues/40))
## 0.2.5
* Fix nested routes on Windows ([#39](https://github.com/sveltejs/sapper/pull/39))
* Rebundle when routes and main.js change ([#34](https://github.com/sveltejs/sapper/pull/34))
* Add `Link...preload` headers for JavaScript assets ([#2](https://github.com/sveltejs/sapper/issues/2))
* Stream document up to first dynamic content ([#19](https://github.com/sveltejs/sapper/issues/19))
* Error if routes clash ([#33](https://github.com/sveltejs/sapper/issues/33))
## 0.2.4
* Posixify path to HMR client
## 0.2.3
* Posixify import paths, even on Windows ([#31](https://github.com/sveltejs/sapper/pull/31))
* Pass `url` to 404 handler
## 0.2.2
* Create destination directory when building, don't assume it's already there from dev mode
* We have tests now!
## 0.2.1
* Inject HMR logic in dev mode
## 0.2.0
* Separate `sapper build` from prod server ([#21](https://github.com/sveltejs/sapper/issues/21))
## 0.1.3-5
* Fix typo
## 0.1.2
* Use `atime.getTime()` and `mtime.getTime()` instead of `atimeMs` and `mtimeMs` ([#11](https://github.com/sveltejs/sapper/issues/11))
* Make dest dir before anyone tries to write to it ([#18](https://github.com/sveltejs/sapper/pull/18))
## 0.1.1
* Expose resolved pathname to `sapper/runtime/app.js` as `__app__` inside main.js
## 0.1.0
* First public preview

7
LICENSE Normal file
View File

@@ -0,0 +1,7 @@
Copyright (c) 2016-19 [these people](https://github.com/sveltejs/sapper/graphs/contributors)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

179
README.md
View File

@@ -1,150 +1,77 @@
# sapper
Combat-ready apps, engineered by Svelte.
## This is not a thing yet
If you visit this README in a few weeks, hopefully it will have blossomed into the app development framework we deserve. Right now, it's just a set of ideas.
---
[Next.js](https://github.com/zeit/next.js/) introduced a beautiful idea — that you should be able to build your app as universal React components in a special `pages` directory, and the framework should take care of routing and rendering on both client and server. What if we did the same thing for Svelte?
High-level goals:
* Extreme ease of development
* Code-splitting and HMR out of the box (probably via webpack)
* Best-in-class performance
* As little magic as possible. Anyone should be able to understand how everything fits together, and e.g. make changes to the webpack config
* Links are just `<a>` tags, no special `<Link>` components
[Military-grade progressive web apps, powered by Svelte.](https://sapper.svelte.dev)
## Design
## What is Sapper?
A Sapper app is just an Express app (conventionally, `server.js`) that uses the `sapper` middleware:
Sapper is a framework for building high-performance universal web apps. [Read the guide](https://sapper.svelte.dev/docs) or the [introductory blog post](https://svelte.dev/blog/sapper-towards-the-ideal-web-app-framework) to learn more.
```js
const app = require('express')();
const sapper = require('sapper');
app.use(sapper());
## Get started
const { PORT = 3000 } = process.env;
app.listen(PORT, () => {
console.log(`listening on port ${PORT}`);
});
Clone the [starter project template](https://github.com/sveltejs/sapper-template) with [degit](https://github.com/rich-harris/degit)...
When cloning you have to choose between rollup or webpack:
```bash
npx degit "sveltejs/sapper-template#rollup" my-app
# or: npx degit "sveltejs/sapper-template#webpack" my-app
```
The middleware serves pages that match files in the `routes` directory, and assets generated by webpack. In development mode, the middleware once activated watches `routes` to keep the app up-to-date.
...then install dependencies and start the dev server...
## Routing
Like Next, routes are defined by the project directory structure, but with some crucial differences:
* Files with an `.html` extension are treated as Svelte components. The `routes/about.html` (or `routes/about/index.html`) would create the `/about` route.
* Files with a `.js` or `.mjs` extension are more generic route handlers. These files should export functions corresponding to the HTTP methods they support (example below).
* Instead of route masking, we embed parameters in the filename. For example `post/[id].html` maps to `/post/:id`, and the component will be rendered with the appropriate parameter.
* Nested routes (read [this article](https://joshduff.com/2015-06-why-you-need-a-state-router.md)) can be handled by creating a file that matches the subroute — for example, `routes/app/settings/[submenu].html` would match `/app/settings/profile` *and* `app/settings`, but in the latter case the `submenu` parameter would be `null`.
An example of a generic route:
```js
// routes/api/post/[id].js
export async function get(req, res) {
try {
const data = await getPostFromDatabase(req.params.id);
const json = JSON.stringify(data);
res.set({
'Content-Type': 'application/json',
'Content-Length': json.length
});
res.send(json);
} catch (err) {
res.status(500).send(err.message);
}
}
```bash
cd my-app
npm install
npm run dev
```
Or, if you omit the `res` argument, it can use the return value:
...and navigate to [localhost:3000](http://localhost:3000). To build and run in production mode:
```js
// routes/api/post/[id].js
export async function get(req) {
return await getPostFromDatabase(req.params.id);
}
```bash
npm run build
npm start
```
## Development
## Client-side app
Pull requests are encouraged and always welcome. [Pick an issue](https://github.com/sveltejs/sapper/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) and help us out!
Sapper will create (and in development mode, update) a barebones `main.js` file that dynamically imports individual routes and renders them — something like this:
To install and work on Sapper locally:
```js
window.addEventListener('click', event => {
let a = event.target;
while (a && a.nodeName !== 'A') a = a.parentNode;
if (!a) return;
if (navigate(new URL(a.href))) event.preventDefault();
});
const target = document.querySelector('#sapper');
let component;
function navigate(url) {
if (url.origin !== window.location.origin) return;
let match;
let params = {};
const query = {};
function render(mod) {
if (component) {
component.destroy();
} else {
target.innerHTML = '';
}
component = new mod.default({
target,
data: { query, params },
hydrate: !!component
});
}
if (url.pathname === '/about') {
import('/about/index.html').then(render);
} else if (url.pathname === '/') {
import('/index.js').then(render);
} else if (match = /^\/post\/([^\/]+)$/.exec(url.pathname)) {
params.id = match[1];
import('/post/[id].html').then(render);
} else if (match = /^\/([^\/]+)$/.exec(url.pathname)) {
params.wildcard = match[1];
import('/[wildcard].html').then(render);
}
return true;
}
navigate(window.location);
```bash
git clone git@github.com:sveltejs/sapper.git
cd sapper
npm install
npm run dev
```
We're glossing over a lot of important stuff here — e.g. handling `popstate` — but you get the idea. Knowledge of all the possible routes means we can generate optimal code, much in the same way that statically analysing Svelte templates allows the compiler to generate optimal code.
### Linking to a Live Project
You can make changes locally to Sapper and test it against a local Sapper project. For a quick project that takes almost no setup, use the default [sapper-template](https://github.com/sveltejs/sapper-template) project. Instruction on setup are found in that project repository.
## Things to figure out
To link Sapper to your project, from the root of your local Sapper git checkout:
* How to customise the overall page template
* An equivalent of `getInitialProps`
* Critical CSS
* `store` integration
* Route transitions
* Equivalent of `next export`
* A good story for realtime/GraphQL stuff
* Service worker
* Using `Link...rel=preload` headers to push main.js/[route].js plus styles
* ...and lots of other things that haven't occurred to me yet.
```bash
cd sapper
npm link
```
Then, to link from `sapper-template` (or any other given project):
```bash
cd sapper-template
npm link sapper
```
You should be good to test changes locally.
### Running Tests
```bash
npm run test
```
## License
[MIT](LICENSE)

1
api.js Normal file
View File

@@ -0,0 +1 @@
module.exports = require('./dist/api.js');

21
appveyor.yml Normal file
View File

@@ -0,0 +1,21 @@
version: "{build}"
shallow_clone: true
init:
- git config --global core.autocrlf false
build: off
environment:
matrix:
# node.js
- nodejs_version: 11
install:
- ps: Install-Product node $env:nodejs_version
- npm ci
test_script:
- node --version && npm --version
- npm test

1
config/rollup.js Normal file
View File

@@ -0,0 +1 @@
module.exports = require('../dist/rollup.js');

1
config/webpack.js Normal file
View File

@@ -0,0 +1 @@
module.exports = require('../dist/webpack.js');

View File

@@ -1,110 +0,0 @@
require('svelte/ssr/register');
const esm = require('@std/esm');
const fs = require('fs');
const path = require('path');
const glob = require('glob');
const rimraf = require('rimraf');
const create_routes = require('./utils/create_routes.js');
const create_templates = require('./utils/create_templates.js');
const create_app = require('./utils/create_app.js');
const create_webpack_compiler = require('./utils/create_webpack_compiler.js');
const { src, dest, dev } = require('./lib/config.js');
const esmRequire = esm(module, {
esm: 'js'
});
module.exports = function connect(opts) {
rimraf.sync(dest);
fs.mkdirSync(dest);
let routes = create_routes(
glob.sync('**/*.+(html|js|mjs)', { cwd: src })
);
create_app(src, dest, routes, opts);
const webpack_compiler = create_webpack_compiler(
dest,
routes,
dev
);
const templates = create_templates();
return async function(req, res, next) {
const url = req.url.replace(/\?.+/, '');
if (url.startsWith('/client/')) {
res.set({
'Content-Type': 'application/javascript'
});
fs.createReadStream(`${dest}${url}`).pipe(res);
return;
}
// whatever happens, we're going to serve some HTML
res.set({
'Content-Type': 'text/html'
});
try {
for (const route of routes) {
if (route.test(url)) {
req.params = route.exec(url);
const chunk = await webpack_compiler.get_chunk(route.id);
const mod = require(chunk);
if (route.type === 'page') {
const main = await webpack_compiler.client_main;
let data = { params: req.params, query: req.query };
if (mod.default.preload) data = Object.assign(data, await mod.default.preload(data));
const { html, head, css } = mod.default.render(data);
const page = templates.render(200, {
main,
html,
head: `<noscript id='sapper-head-start'></noscript>${head}<noscript id='sapper-head-end'></noscript>`,
styles: (css && css.code ? `<style>${css.code}</style>` : '')
});
res.status(200);
res.end(page);
}
else {
const handler = mod[req.method.toLowerCase()];
if (handler) {
if (handler.length === 2) {
handler(req, res);
} else {
const data = await handler(req);
// TODO headers, error handling
if (typeof data === 'string') {
res.end(data);
} else {
res.end(JSON.stringify(data));
}
}
}
}
return;
}
}
res.status(404).end(templates.render(404, {
status: 404,
url
}));
} catch(err) {
// TODO nice error pages
res.status(500);
res.end(err.stack);
}
};
};

1
index.js Normal file
View File

@@ -0,0 +1 @@
throw new Error(`As of Sapper 0.22, you should not import 'sapper' directly. See https://sapper.svelte.technology/guide#0-21-to-0-22 for more information`);

View File

@@ -1,12 +0,0 @@
const path = require('path');
exports.dev = process.env.NODE_ENV !== 'production';
exports.templates = path.resolve(process.env.SAPPER_TEMPLATES || 'templates');
exports.src = path.resolve(process.env.SAPPER_ROUTES || 'routes');
exports.dest = path.resolve(
process.env.NOW ? '/tmp' :
process.env.SAPPER_DEST || '.sapper'
);

View File

@@ -1,16 +0,0 @@
const glob = require('glob');
const create_routes = require('../utils/create_routes.js');
const { src } = require('./config.js');
const route_manager = {
routes: create_routes(
glob.sync('**/*.+(html|js|mjs)', { cwd: src })
),
onchange(fn) {
// TODO in dev mode, keep this updated, and allow
// webpack compiler etc to hook into it
}
};
module.exports = route_manager;

View File

@@ -1,2 +1,5 @@
--require source-map-support/register
--require sucrase/register
--recursive
utils/**/*.test.js
test/unit/*/test.ts
test/apps/*/test.ts

6532
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,25 +1,76 @@
{
"name": "sapper",
"version": "0.0.6",
"description": "Combat-ready apps, engineered by Svelte",
"main": "connect.js",
"version": "0.27.1",
"description": "Military-grade apps, engineered by Svelte",
"bin": {
"sapper": "./sapper"
},
"files": [
"*.js",
"webpack",
"config",
"sapper",
"dist/*.js",
"runtime/*.mjs",
"runtime/internal"
],
"directories": {
"test": "test"
},
"dependencies": {
"@std/esm": "^0.18.0",
"rimraf": "^2.6.2",
"webpack": "^3.10.0"
"html-minifier": "^4.0.0",
"http-link-header": "^1.0.2",
"shimport": "^1.0.0",
"sourcemap-codec": "^1.4.4",
"string-hash": "^1.1.3"
},
"devDependencies": {
"mocha": "^4.0.1",
"svelte": "^1.47.1"
"@types/mocha": "^5.2.6",
"@types/node": "^12.0.0",
"@types/puppeteer": "^1.12.4",
"agadoo": "^1.0.1",
"cheap-watch": "^1.0.2",
"cookie": "^0.3.1",
"devalue": "^1.1.0",
"eslint": "^5.16.0",
"eslint-plugin-import": "^2.17.2",
"kleur": "^3.0.3",
"mocha": "^6.1.4",
"node-fetch": "^2.5.0",
"npm-run-all": "^4.1.5",
"polka": "^0.5.2",
"port-authority": "^1.0.5",
"pretty-bytes": "^5.2.0",
"puppeteer": "^1.15.0",
"require-relative": "^0.8.7",
"rollup": "^1.11.3",
"rollup-plugin-commonjs": "^9.3.4",
"rollup-plugin-json": "^4.0.0",
"rollup-plugin-node-resolve": "^4.2.3",
"rollup-plugin-replace": "^2.2.0",
"rollup-plugin-string": "^3.0.0",
"rollup-plugin-sucrase": "^2.1.0",
"rollup-plugin-svelte": "^5.0.3",
"sade": "^1.4.2",
"sirv": "^0.4.2",
"sucrase": "^3.10.1",
"svelte": "^3.2.2",
"svelte-loader": "^2.13.3",
"webpack": "^4.31.0",
"webpack-format-messages": "^2.0.5",
"yootils": "0.0.15"
},
"peerDependencies": {
"svelte": "^1.47.1"
"svelte": "^3.2.2"
},
"scripts": {
"test": "mocha --opts mocha.opts"
"test": "mocha --opts mocha.opts",
"pretest": "npm run build",
"build": "rm -rf dist && rollup -c",
"prepare": "npm run build",
"dev": "rollup -cw",
"prepublishOnly": "npm test",
"update_mime_types": "curl http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types | grep -e \"^[^#]\" > runtime/src/server/middleware/mime-types.md"
},
"repository": "https://github.com/sveltejs/sapper",
"keywords": [
@@ -30,12 +81,9 @@
"express"
],
"author": "Rich Harris",
"license": "LIL",
"license": "MIT",
"bugs": {
"url": "https://github.com/sveltejs/sapper/issues"
},
"homepage": "https://github.com/sveltejs/sapper#readme",
"@std/esm": {
"esm": "js"
}
"homepage": "https://github.com/sveltejs/sapper#readme"
}

70
rollup.config.js Normal file
View File

@@ -0,0 +1,70 @@
import sucrase from 'rollup-plugin-sucrase';
import { string } from 'rollup-plugin-string';
import json from 'rollup-plugin-json';
import resolve from 'rollup-plugin-node-resolve';
import commonjs from 'rollup-plugin-commonjs';
import pkg from './package.json';
import { builtinModules } from 'module';
const external = [].concat(
Object.keys(pkg.dependencies),
Object.keys(process.binding('natives')),
'sapper/core.js',
'svelte/compiler'
);
function template(kind, external) {
return {
input: `runtime/src/${kind}/index.ts`,
output: {
file: `runtime/${kind}.mjs`,
format: 'es',
paths: id => id.replace('@sapper', '.')
},
external,
plugins: [
resolve({
extensions: ['.mjs', '.js', '.ts']
}),
commonjs(),
string({
include: '**/*.md'
}),
sucrase({
transforms: ['typescript']
})
]
};
}
export default [
template('app', id => /^(svelte\/?|@sapper\/)/.test(id)),
template('server', id => /^(svelte\/?|@sapper\/)/.test(id) || builtinModules.includes(id)),
{
input: [
`src/api.ts`,
`src/cli.ts`,
`src/core.ts`,
`src/config/rollup.ts`,
`src/config/webpack.ts`
],
output: {
dir: 'dist',
format: 'cjs',
sourcemap: true,
chunkFileNames: '[name].js'
},
external,
plugins: [
json(),
resolve({
extensions: ['.mjs', '.js', '.ts']
}),
commonjs(),
sucrase({
transforms: ['typescript']
})
]
}
];

View File

@@ -1,22 +0,0 @@
const app = {
init(callback) {
window.addEventListener('click', event => {
let a = event.target;
while (a && a.nodeName !== 'A') a = a.parentNode;
if (!a) return;
if (callback(new URL(a.href))) {
event.preventDefault();
history.pushState({}, '', a.href);
}
});
window.addEventListener('popstate', event => {
callback(window.location);
});
callback(window.location);
}
};
export default app;

View File

@@ -0,0 +1,7 @@
<h1>{status}</h1>
<p>{error.message}</p>
{#if process.env.NODE_ENV === 'development'}
<pre>{error.stack}</pre>
{/if}

View File

@@ -0,0 +1 @@
<slot></slot>

View File

@@ -0,0 +1,5 @@
import { writable } from 'svelte/store';
export const CONTEXT_KEY = {};
export const preload = () => ({});

390
runtime/src/app/app.ts Normal file
View File

@@ -0,0 +1,390 @@
import { writable } from 'svelte/store.mjs';
import App from '@sapper/internal/App.svelte';
import { root_preload, ErrorComponent, ignore, components, routes } from '@sapper/internal/manifest-client';
import {
Target,
ScrollPosition,
Component,
Redirect,
ComponentLoader,
ComponentConstructor,
Route,
Query,
Page
} from './types';
import goto from './goto';
declare const __SAPPER__;
export const initial_data = typeof __SAPPER__ !== 'undefined' && __SAPPER__;
let ready = false;
let root_component: Component;
let current_token: {};
let root_preloaded: Promise<any>;
let current_branch = [];
let current_query = '{}';
const stores = {
page: writable({}),
preloading: writable(null),
session: writable(initial_data && initial_data.session)
};
let $session;
let session_dirty: boolean;
stores.session.subscribe(async value => {
$session = value;
if (!ready) return;
session_dirty = true;
const target = select_target(new URL(location.href));
const token = current_token = {};
const { redirect, props, branch } = await hydrate_target(target);
if (token !== current_token) return; // a secondary navigation happened while we were loading
await render(redirect, branch, props, target.page);
});
export let prefetching: {
href: string;
promise: Promise<{ redirect?: Redirect, data?: any }>;
} = null;
export function set_prefetching(href, promise) {
prefetching = { href, promise };
}
export let store;
export function set_store(fn) {
store = fn(initial_data.store);
}
export let target: Node;
export function set_target(element) {
target = element;
}
export let uid = 1;
export function set_uid(n) {
uid = n;
}
export let cid: number;
export function set_cid(n) {
cid = n;
}
const _history = typeof history !== 'undefined' ? history : {
pushState: (state: any, title: string, href: string) => {},
replaceState: (state: any, title: string, href: string) => {},
scrollRestoration: ''
};
export { _history as history };
export const scroll_history: Record<string, ScrollPosition> = {};
export function extract_query(search: string) {
const query = Object.create(null);
if (search.length > 0) {
search.slice(1).split('&').forEach(searchParam => {
let [, key, value = ''] = /([^=]*)(?:=(.*))?/.exec(decodeURIComponent(searchParam.replace(/\+/g, ' ')));
if (typeof query[key] === 'string') query[key] = [<string>query[key]];
if (typeof query[key] === 'object') (query[key] as string[]).push(value);
else query[key] = value;
});
}
return query;
}
export function select_target(url: URL): Target {
if (url.origin !== location.origin) return null;
if (!url.pathname.startsWith(initial_data.baseUrl)) return null;
let path = url.pathname.slice(initial_data.baseUrl.length);
if (path === '') {
path = '/';
}
// avoid accidental clashes between server routes and page routes
if (ignore.some(pattern => pattern.test(path))) return;
for (let i = 0; i < routes.length; i += 1) {
const route = routes[i];
const match = route.pattern.exec(path);
if (match) {
const query: Query = extract_query(url.search);
const part = route.parts[route.parts.length - 1];
const params = part.params ? part.params(match) : {};
const page = { path, query, params };
return { href: url.href, route, match, page };
}
}
}
export function handle_error(url: URL) {
const { pathname, search } = location;
const { session, preloaded, status, error } = initial_data;
if (!root_preloaded) {
root_preloaded = preloaded && preloaded[0]
}
const props = {
error,
status,
session,
level0: {
props: root_preloaded
},
level1: {
props: {
status,
error
},
component: ErrorComponent
},
segments: preloaded
}
const query = extract_query(search);
render(null, [], props, { path: pathname, query, params: {} });
}
export function scroll_state() {
return {
x: pageXOffset,
y: pageYOffset
};
}
export async function navigate(target: Target, id: number, noscroll?: boolean, hash?: string): Promise<any> {
if (id) {
// popstate or initial navigation
cid = id;
} else {
const current_scroll = scroll_state();
// clicked on a link. preserve scroll state
scroll_history[cid] = current_scroll;
id = cid = ++uid;
scroll_history[cid] = noscroll ? current_scroll : { x: 0, y: 0 };
}
cid = id;
if (root_component) stores.preloading.set(true);
const loaded = prefetching && prefetching.href === target.href ?
prefetching.promise :
hydrate_target(target);
prefetching = null;
const token = current_token = {};
const { redirect, props, branch } = await loaded;
if (token !== current_token) return; // a secondary navigation happened while we were loading
await render(redirect, branch, props, target.page);
if (document.activeElement) document.activeElement.blur();
if (!noscroll) {
let scroll = scroll_history[id];
if (hash) {
// scroll is an element id (from a hash), we need to compute y.
const deep_linked = document.getElementById(hash.slice(1));
if (deep_linked) {
scroll = {
x: 0,
y: deep_linked.getBoundingClientRect().top
};
}
}
scroll_history[cid] = scroll;
if (scroll) scrollTo(scroll.x, scroll.y);
}
}
async function render(redirect: Redirect, branch: any[], props: any, page: Page) {
if (redirect) return goto(redirect.location, { replaceState: true });
stores.page.set(page);
stores.preloading.set(false);
if (root_component) {
root_component.$set(props);
} else {
props.stores = {
page: { subscribe: stores.page.subscribe },
preloading: { subscribe: stores.preloading.subscribe },
session: stores.session
};
props.level0 = {
props: await root_preloaded
};
// first load — remove SSR'd <head> contents
const start = document.querySelector('#sapper-head-start');
const end = document.querySelector('#sapper-head-end');
if (start && end) {
while (start.nextSibling !== end) detach(start.nextSibling);
detach(start);
detach(end);
}
root_component = new App({
target,
props,
hydrate: true
});
}
current_branch = branch;
current_query = JSON.stringify(page.query);
ready = true;
session_dirty = false;
}
function part_changed(i, segment, match, stringified_query) {
// TODO only check query string changes for preload functions
// that do in fact depend on it (using static analysis or
// runtime instrumentation)
if (stringified_query !== current_query) return true;
const previous = current_branch[i];
if (!previous) return false;
if (segment !== previous.segment) return true;
if (previous.match) {
if (JSON.stringify(previous.match.slice(1, i + 2)) !== JSON.stringify(match.slice(1, i + 2))) {
return true;
}
}
}
export async function hydrate_target(target: Target): Promise<{
redirect?: Redirect;
props?: any;
branch?: Array<{ Component: ComponentConstructor, preload: (page) => Promise<any>, segment: string }>;
}> {
const { route, page } = target;
const segments = page.path.split('/').filter(Boolean);
let redirect: Redirect = null;
const props = { error: null, status: 200, segments: [segments[0]] };
const preload_context = {
fetch: (url: string, opts?: any) => fetch(url, opts),
redirect: (statusCode: number, location: string) => {
if (redirect && (redirect.statusCode !== statusCode || redirect.location !== location)) {
throw new Error(`Conflicting redirects`);
}
redirect = { statusCode, location };
},
error: (status: number, error: Error | string) => {
props.error = typeof error === 'string' ? new Error(error) : error;
props.status = status;
}
};
if (!root_preloaded) {
root_preloaded = initial_data.preloaded[0] || root_preload.call(preload_context, {
path: page.path,
query: page.query,
params: {}
}, $session);
}
let branch;
let l = 1;
try {
const stringified_query = JSON.stringify(page.query);
const match = route.pattern.exec(page.path);
let segment_dirty = false;
branch = await Promise.all(route.parts.map(async (part, i) => {
const segment = segments[i];
if (part_changed(i, segment, match, stringified_query)) segment_dirty = true;
props.segments[l] = segments[i + 1]; // TODO make this less confusing
if (!part) return { segment };
const j = l++;
if (!session_dirty && !segment_dirty && current_branch[i] && current_branch[i].part === part.i) {
return current_branch[i];
}
segment_dirty = false;
const { default: component, preload } = await load_component(components[part.i]);
let preloaded;
if (ready || !initial_data.preloaded[i + 1]) {
preloaded = preload
? await preload.call(preload_context, {
path: page.path,
query: page.query,
params: part.params ? part.params(target.match) : {}
}, $session)
: {};
} else {
preloaded = initial_data.preloaded[i + 1];
}
return (props[`level${j}`] = { component, props: preloaded, segment, match, part: part.i });
}));
} catch (error) {
props.error = error;
props.status = 500;
branch = [];
}
return { redirect, props, branch };
}
function load_css(chunk: string) {
const href = `client/${chunk}`;
if (document.querySelector(`link[href="${href}"]`)) return;
return new Promise((fulfil, reject) => {
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = href;
link.onload = () => fulfil();
link.onerror = reject;
document.head.appendChild(link);
});
}
export function load_component(component: ComponentLoader): Promise<{
default: ComponentConstructor,
preload?: (input: any) => any
}> {
// TODO this is temporary — once placeholders are
// always rewritten, scratch the ternary
const promises: Array<Promise<any>> = (typeof component.css === 'string' ? [] : component.css.map(load_css));
promises.unshift(component.js());
return Promise.all(promises).then(values => values[0]);
}
function detach(node: Node) {
node.parentNode.removeChild(node);
}

View File

@@ -0,0 +1,13 @@
import { history, select_target, navigate, cid } from '../app';
export default function goto(href: string, opts = { replaceState: false }) {
const target = select_target(new URL(href, document.baseURI));
if (target) {
history[opts.replaceState ? 'replaceState' : 'pushState']({ id: cid }, '', href);
return navigate(target, null).then(() => {});
}
location.href = href;
return new Promise(f => {}); // never resolves
}

9
runtime/src/app/index.ts Normal file
View File

@@ -0,0 +1,9 @@
import { getContext } from 'svelte';
import { CONTEXT_KEY } from '@sapper/internal/shared';
export const stores = () => getContext(CONTEXT_KEY);
export { default as start } from './start/index';
export { default as goto } from './goto/index';
export { default as prefetch } from './prefetch/index';
export { default as prefetchRoutes } from './prefetchRoutes/index';

View File

@@ -0,0 +1,14 @@
import { select_target, prefetching, set_prefetching, hydrate_target } from '../app';
import { Target } from '../types';
export default function prefetch(href: string) {
const target: Target = select_target(new URL(href, document.baseURI));
if (target) {
if (!prefetching || href !== prefetching.href) {
set_prefetching(href, hydrate_target(target));
}
return prefetching.promise;
}
}

View File

@@ -0,0 +1,13 @@
import { components, routes } from '@sapper/internal/manifest-client';
import { load_component } from '../app';
export default function prefetchRoutes(pathnames: string[]) {
return routes
.filter(pathnames
? route => pathnames.some(pathname => route.pattern.test(pathname))
: () => true
)
.reduce((promise: Promise<any>, route) => promise.then(() => {
return Promise.all(route.parts.map(part => part && load_component(components[part.i])));
}), Promise.resolve());
}

View File

@@ -0,0 +1,133 @@
import {
cid,
history,
initial_data,
navigate,
scroll_history,
scroll_state,
select_target,
handle_error,
set_target,
uid,
set_uid,
set_cid
} from '../app';
import prefetch from '../prefetch/index';
export default function start(opts: {
target: Node
}) {
if ('scrollRestoration' in history) {
history.scrollRestoration = 'manual';
}
set_target(opts.target);
addEventListener('click', handle_click);
addEventListener('popstate', handle_popstate);
// prefetch
addEventListener('touchstart', trigger_prefetch);
addEventListener('mousemove', handle_mousemove);
return Promise.resolve().then(() => {
const { hash, href } = location;
history.replaceState({ id: uid }, '', href);
const url = new URL(location.href);
if (initial_data.error) return handle_error(url);
const target = select_target(url);
if (target) return navigate(target, uid, true, hash);
});
}
let mousemove_timeout: NodeJS.Timer;
function handle_mousemove(event: MouseEvent) {
clearTimeout(mousemove_timeout);
mousemove_timeout = setTimeout(() => {
trigger_prefetch(event);
}, 20);
}
function trigger_prefetch(event: MouseEvent | TouchEvent) {
const a: HTMLAnchorElement = <HTMLAnchorElement>find_anchor(<Node>event.target);
if (!a || a.rel !== 'prefetch') return;
prefetch(a.href);
}
function handle_click(event: MouseEvent) {
// Adapted from https://github.com/visionmedia/page.js
// MIT license https://github.com/visionmedia/page.js#license
if (which(event) !== 1) return;
if (event.metaKey || event.ctrlKey || event.shiftKey) return;
if (event.defaultPrevented) return;
const a: HTMLAnchorElement | SVGAElement = <HTMLAnchorElement | SVGAElement>find_anchor(<Node>event.target);
if (!a) return;
if (!a.href) return;
// check if link is inside an svg
// in this case, both href and target are always inside an object
const svg = typeof a.href === 'object' && a.href.constructor.name === 'SVGAnimatedString';
const href = String(svg ? (<SVGAElement>a).href.baseVal : a.href);
if (href === location.href) {
if (!location.hash) event.preventDefault();
return;
}
// Ignore if tag has
// 1. 'download' attribute
// 2. rel='external' attribute
if (a.hasAttribute('download') || a.getAttribute('rel') === 'external') return;
// Ignore if <a> has a target
if (svg ? (<SVGAElement>a).target.baseVal : a.target) return;
const url = new URL(href);
// Don't handle hash changes
if (url.pathname === location.pathname && url.search === location.search) return;
const target = select_target(url);
if (target) {
const noscroll = a.hasAttribute('sapper-noscroll');
navigate(target, null, noscroll, url.hash);
event.preventDefault();
history.pushState({ id: cid }, '', url.href);
}
}
function which(event: MouseEvent) {
return event.which === null ? event.button : event.which;
}
function find_anchor(node: Node) {
while (node && node.nodeName.toUpperCase() !== 'A') node = node.parentNode; // SVG <a> elements have a lowercase name
return node;
}
function handle_popstate(event: PopStateEvent) {
scroll_history[cid] = scroll_state();
if (event.state) {
const url = new URL(location.href);
const target = select_target(url);
if (target) {
navigate(target, event.state.id);
} else {
location.href = location.href;
}
} else {
// hashchange
set_uid(uid + 1);
set_cid(uid);
history.replaceState({ id: cid }, '', location.href);
}
}

62
runtime/src/app/types.ts Normal file
View File

@@ -0,0 +1,62 @@
export type Params = Record<string, string>;
export type Query = Record<string, string | true>;
export type RouteData = { params: Params, query: Query, path: string };
type Child = {
segment?: string;
props?: any;
component?: Component;
};
export interface ComponentConstructor {
new (options: { target: Node, props: any, hydrate: boolean }): Component;
preload: (props: { params: Params, query: Query }) => Promise<any>;
};
export interface Component {
$set: (data: any) => void;
$destroy: () => void;
}
export type ComponentLoader = {
js: () => Promise<{ default: ComponentConstructor }>,
css: string[]
};
export type Route = {
pattern: RegExp;
parts: Array<{
i: number;
params?: (match: RegExpExecArray) => Record<string, string>;
}>;
};
export type Manifest = {
ignore: RegExp[];
root: ComponentConstructor;
error: () => Promise<{ default: ComponentConstructor }>;
pages: Route[]
};
export type ScrollPosition = {
x: number;
y: number;
};
export type Target = {
href: string;
route: Route;
match: RegExpExecArray;
page: Page;
};
export type Redirect = {
statusCode: number;
location: string;
};
export type Page = {
path: string;
params: Record<string, string>;
query: Record<string, string | string[]>;
};

View File

@@ -0,0 +1 @@
export { default as middleware } from './middleware/index';

View File

@@ -0,0 +1,379 @@
import { writable } from 'svelte/store.mjs';
import fs from 'fs';
import path from 'path';
import cookie from 'cookie';
import devalue from 'devalue';
import fetch from 'node-fetch';
import URL from 'url';
import { Manifest, Page, Req, Res } from './types';
import { build_dir, dev, src_dir } from '@sapper/internal/manifest-server';
import App from '@sapper/internal/App.svelte';
export function get_page_handler(
manifest: Manifest,
session_getter: (req: Req, res: Res) => any
) {
const get_build_info = dev
? () => JSON.parse(fs.readFileSync(path.join(build_dir, 'build.json'), 'utf-8'))
: (assets => () => assets)(JSON.parse(fs.readFileSync(path.join(build_dir, 'build.json'), 'utf-8')));
const template = dev
? () => read_template(src_dir)
: (str => () => str)(read_template(build_dir));
const has_service_worker = fs.existsSync(path.join(build_dir, 'service-worker.js'));
const { server_routes, pages } = manifest;
const error_route = manifest.error;
function bail(req: Req, res: Res, err: Error) {
console.error(err);
const message = dev ? escape_html(err.message) : 'Internal server error';
res.statusCode = 500;
res.end(`<pre>${message}</pre>`);
}
function handle_error(req: Req, res: Res, statusCode: number, error: Error | string) {
handle_page({
pattern: null,
parts: [
{ name: null, component: error_route }
]
}, req, res, statusCode, error || new Error('Unknown error in preload function'));
}
async function handle_page(page: Page, req: Req, res: Res, status = 200, error: Error | string = null) {
const is_service_worker_index = req.path === '/service-worker-index.html';
const build_info: {
bundler: 'rollup' | 'webpack',
shimport: string | null,
assets: Record<string, string | string[]>,
legacy_assets?: Record<string, string>
} = get_build_info();
res.setHeader('Content-Type', 'text/html');
res.setHeader('Cache-Control', dev ? 'no-cache' : 'max-age=600');
// preload main.js and current route
// TODO detect other stuff we can preload? images, CSS, fonts?
let preloaded_chunks = Array.isArray(build_info.assets.main) ? build_info.assets.main : [build_info.assets.main];
if (!error && !is_service_worker_index) {
page.parts.forEach(part => {
if (!part) return;
// using concat because it could be a string or an array. thanks webpack!
preloaded_chunks = preloaded_chunks.concat(build_info.assets[part.name]);
});
}
if (build_info.bundler === 'rollup') {
// TODO add dependencies and CSS
const link = preloaded_chunks
.filter(file => file && !file.match(/\.map$/))
.map(file => `<${req.baseUrl}/client/${file}>;rel="modulepreload"`)
.join(', ');
res.setHeader('Link', link);
} else {
const link = preloaded_chunks
.filter(file => file && !file.match(/\.map$/))
.map((file) => {
const as = /\.css$/.test(file) ? 'style' : 'script';
return `<${req.baseUrl}/client/${file}>;rel="preload";as="${as}"`;
})
.join(', ');
res.setHeader('Link', link);
}
const session = session_getter(req, res);
let redirect: { statusCode: number, location: string };
let preload_error: { statusCode: number, message: Error | string };
const preload_context = {
redirect: (statusCode: number, location: string) => {
if (redirect && (redirect.statusCode !== statusCode || redirect.location !== location)) {
throw new Error(`Conflicting redirects`);
}
location = location.replace(/^\//g, ''); // leading slash (only)
redirect = { statusCode, location };
},
error: (statusCode: number, message: Error | string) => {
preload_error = { statusCode, message };
},
fetch: (url: string, opts?: any) => {
const parsed = new URL.URL(url, `http://127.0.0.1:${process.env.PORT}${req.baseUrl ? req.baseUrl + '/' :''}`);
if (opts) {
opts = Object.assign({}, opts);
const include_cookies = (
opts.credentials === 'include' ||
opts.credentials === 'same-origin' && parsed.origin === `http://127.0.0.1:${process.env.PORT}`
);
if (include_cookies) {
opts.headers = Object.assign({}, opts.headers);
const cookies = Object.assign(
{},
cookie.parse(req.headers.cookie || ''),
cookie.parse(opts.headers.cookie || '')
);
const set_cookie = res.getHeader('Set-Cookie');
(Array.isArray(set_cookie) ? set_cookie : [set_cookie]).forEach(str => {
const match = /([^=]+)=([^;]+)/.exec(<string>str);
if (match) cookies[match[1]] = match[2];
});
const str = Object.keys(cookies)
.map(key => `${key}=${cookies[key]}`)
.join('; ');
opts.headers.cookie = str;
}
}
return fetch(parsed.href, opts);
}
};
let preloaded;
let match;
let params;
try {
const root_preloaded = manifest.root_preload
? manifest.root_preload.call(preload_context, {
path: req.path,
query: req.query,
params: {}
}, session)
: {};
match = error ? null : page.pattern.exec(req.path);
let toPreload = [root_preloaded];
if (!is_service_worker_index) {
toPreload = toPreload.concat(page.parts.map(part => {
if (!part) return null;
// the deepest level is used below, to initialise the store
params = part.params ? part.params(match) : {};
return part.preload
? part.preload.call(preload_context, {
path: req.path,
query: req.query,
params
}, session)
: {};
}))
}
preloaded = await Promise.all(toPreload);
} catch (err) {
if (error) {
return bail(req, res, err)
}
preload_error = { statusCode: 500, message: err };
preloaded = []; // appease TypeScript
}
try {
if (redirect) {
const location = URL.resolve((req.baseUrl || '') + '/', redirect.location);
res.statusCode = redirect.statusCode;
res.setHeader('Location', location);
res.end();
return;
}
if (preload_error) {
handle_error(req, res, preload_error.statusCode, preload_error.message);
return;
}
const segments = req.path.split('/').filter(Boolean);
// TODO make this less confusing
const layout_segments = [segments[0]];
let l = 1;
page.parts.forEach((part, i) => {
layout_segments[l] = segments[i + 1];
if (!part) return null;
l++;
});
const props = {
stores: {
page: {
subscribe: writable({
path: req.path,
query: req.query,
params
}).subscribe
},
preloading: {
subscribe: writable(null).subscribe
},
session: writable(session)
},
segments: layout_segments,
status: error ? status : 200,
error: error ? error instanceof Error ? error : { message: error } : null,
level0: {
props: preloaded[0]
},
level1: {
segment: segments[0],
props: {}
}
};
if (!is_service_worker_index) {
let l = 1;
for (let i = 0; i < page.parts.length; i += 1) {
const part = page.parts[i];
if (!part) continue;
props[`level${l++}`] = {
component: part.component,
props: preloaded[i + 1] || {},
segment: segments[i]
};
}
}
const { html, head, css } = App.render(props);
const serialized = {
preloaded: `[${preloaded.map(data => try_serialize(data)).join(',')}]`,
session: session && try_serialize(session, err => {
throw new Error(`Failed to serialize session data: ${err.message}`);
}),
error: error && try_serialize(props.error)
};
let script = `__SAPPER__={${[
error && `error:${serialized.error},status:${status}`,
`baseUrl:"${req.baseUrl}"`,
serialized.preloaded && `preloaded:${serialized.preloaded}`,
serialized.session && `session:${serialized.session}`
].filter(Boolean).join(',')}};`;
if (has_service_worker) {
script += `if('serviceWorker' in navigator)navigator.serviceWorker.register('${req.baseUrl}/service-worker.js');`;
}
const file = [].concat(build_info.assets.main).filter(file => file && /\.js$/.test(file))[0];
const main = `${req.baseUrl}/client/${file}`;
if (build_info.bundler === 'rollup') {
if (build_info.legacy_assets) {
const legacy_main = `${req.baseUrl}/client/legacy/${build_info.legacy_assets.main}`;
script += `(function(){try{eval("async function x(){}");var main="${main}"}catch(e){main="${legacy_main}"};var s=document.createElement("script");try{new Function("if(0)import('')")();s.src=main;s.type="module";s.crossOrigin="use-credentials";}catch(e){s.src="${req.baseUrl}/client/shimport@${build_info.shimport}.js";s.setAttribute("data-main",main);}document.head.appendChild(s);}());`;
} else {
script += `var s=document.createElement("script");try{new Function("if(0)import('')")();s.src="${main}";s.type="module";s.crossOrigin="use-credentials";}catch(e){s.src="${req.baseUrl}/client/shimport@${build_info.shimport}.js";s.setAttribute("data-main","${main}")}document.head.appendChild(s)`;
}
} else {
script += `</script><script src="${main}">`;
}
let styles: string;
// TODO make this consistent across apps
// TODO embed build_info in placeholder.ts
if (build_info.css && build_info.css.main) {
const css_chunks = new Set();
if (build_info.css.main) css_chunks.add(build_info.css.main);
page.parts.forEach(part => {
if (!part) return;
const css_chunks_for_part = build_info.css.chunks[part.file];
if (css_chunks_for_part) {
css_chunks_for_part.forEach(file => {
css_chunks.add(file);
});
}
});
styles = Array.from(css_chunks)
.map(href => `<link rel="stylesheet" href="client/${href}">`)
.join('')
} else {
styles = (css && css.code ? `<style>${css.code}</style>` : '');
}
// users can set a CSP nonce using res.locals.nonce
const nonce_attr = (res.locals && res.locals.nonce) ? ` nonce="${res.locals.nonce}"` : '';
const body = template()
.replace('%sapper.base%', () => `<base href="${req.baseUrl}/">`)
.replace('%sapper.scripts%', () => `<script${nonce_attr}>${script}</script>`)
.replace('%sapper.html%', () => html)
.replace('%sapper.head%', () => `<noscript id='sapper-head-start'></noscript>${head}<noscript id='sapper-head-end'></noscript>`)
.replace('%sapper.styles%', () => styles);
res.statusCode = status;
res.end(body);
} catch(err) {
if (error) {
bail(req, res, err)
} else {
handle_error(req, res, 500, err);
}
}
}
return function find_route(req: Req, res: Res, next: () => void) {
if (req.path === '/service-worker-index.html') {
const homePage = pages.find(page => page.pattern.test('/'));
handle_page(homePage, req, res);
return;
}
for (const page of pages) {
if (page.pattern.test(req.path)) {
handle_page(page, req, res);
return;
}
}
handle_error(req, res, 404, 'Not found');
};
}
function read_template(dir = build_dir) {
return fs.readFileSync(`${dir}/template.html`, 'utf-8');
}
function try_serialize(data: any, fail?: (err) => void) {
try {
return devalue(data);
} catch (err) {
if (fail) fail(err);
return null;
}
}
function escape_html(html: string) {
const chars: Record<string, string> = {
'"' : 'quot',
"'": '#39',
'&': 'amp',
'<' : 'lt',
'>' : 'gt'
};
return html.replace(/["'&<>]/g, c => `&${chars[c]};`);
}

View File

@@ -0,0 +1,75 @@
import { Req, Res, ServerRoute } from './types';
export function get_server_route_handler(routes: ServerRoute[]) {
async function handle_route(route: ServerRoute, req: Req, res: Res, next: () => void) {
req.params = route.params(route.pattern.exec(req.path));
const method = req.method.toLowerCase();
// 'delete' cannot be exported from a module because it is a keyword,
// so check for 'del' instead
const method_export = method === 'delete' ? 'del' : method;
const handle_method = route.handlers[method_export];
if (handle_method) {
if (process.env.SAPPER_EXPORT) {
const { write, end, setHeader } = res;
const chunks: any[] = [];
const headers: Record<string, string> = {};
// intercept data so that it can be exported
res.write = function(chunk: any) {
chunks.push(Buffer.from(chunk));
write.apply(res, arguments);
};
res.setHeader = function(name: string, value: string) {
headers[name.toLowerCase()] = value;
setHeader.apply(res, arguments);
};
res.end = function(chunk?: any) {
if (chunk) chunks.push(Buffer.from(chunk));
end.apply(res, arguments);
process.send({
__sapper__: true,
event: 'file',
url: req.url,
method: req.method,
status: res.statusCode,
type: headers['content-type'],
body: Buffer.concat(chunks).toString()
});
};
}
const handle_next = (err?: Error) => {
if (err) {
res.statusCode = 500;
res.end(err.message);
} else {
process.nextTick(next);
}
};
try {
await handle_method(req, res, handle_next);
} catch (err) {
handle_next(err);
}
} else {
// no matching handler for method
process.nextTick(next);
}
}
return function find_route(req: Req, res: Res, next: () => void) {
for (const route of routes) {
if (route.pattern.test(req.path)) {
handle_route(route, req, res, next);
return;
}
}
next();
};
}

View File

@@ -0,0 +1,133 @@
import fs from 'fs';
import path from 'path';
import { build_dir, dev, manifest } from '@sapper/internal/manifest-server';
import { Handler, Req, Res } from './types';
import { get_server_route_handler } from './get_server_route_handler';
import { get_page_handler } from './get_page_handler';
import { lookup } from './mime';
export default function middleware(opts: {
session?: (req: Req, res: Res) => any,
ignore?: any
} = {}) {
const { session, ignore } = opts;
let emitted_basepath = false;
return compose_handlers(ignore, [
(req: Req, res: Res, next: () => void) => {
if (req.baseUrl === undefined) {
let { originalUrl } = req;
if (req.url === '/' && originalUrl[originalUrl.length - 1] !== '/') {
originalUrl += '/';
}
req.baseUrl = originalUrl
? originalUrl.slice(0, -req.url.length)
: '';
}
if (!emitted_basepath && process.send) {
process.send({
__sapper__: true,
event: 'basepath',
basepath: req.baseUrl
});
emitted_basepath = true;
}
if (req.path === undefined) {
req.path = req.url.replace(/\?.*/, '');
}
next();
},
fs.existsSync(path.join(build_dir, 'service-worker.js')) && serve({
pathname: '/service-worker.js',
cache_control: 'no-cache, no-store, must-revalidate'
}),
fs.existsSync(path.join(build_dir, 'service-worker.js.map')) && serve({
pathname: '/service-worker.js.map',
cache_control: 'no-cache, no-store, must-revalidate'
}),
serve({
prefix: '/client/',
cache_control: dev ? 'no-cache' : 'max-age=31536000, immutable'
}),
get_server_route_handler(manifest.server_routes),
get_page_handler(manifest, session || noop)
].filter(Boolean));
}
export function compose_handlers(ignore: any, handlers: Handler[]): Handler {
const total = handlers.length;
function nth_handler(n: number, req: Req, res: Res, next: () => void) {
if (n >= total) {
return next();
}
handlers[n](req, res, () => nth_handler(n+1, req, res, next));
}
return !ignore
? (req, res, next) => nth_handler(0, req, res, next)
: (req, res, next) => {
if (should_ignore(req.path, ignore)) {
next();
} else {
nth_handler(0, req, res, next);
}
};
}
export function should_ignore(uri: string, val: any) {
if (Array.isArray(val)) return val.some(x => should_ignore(uri, x));
if (val instanceof RegExp) return val.test(uri);
if (typeof val === 'function') return val(uri);
return uri.startsWith(val.charCodeAt(0) === 47 ? val : `/${val}`);
}
export function serve({ prefix, pathname, cache_control }: {
prefix?: string,
pathname?: string,
cache_control: string
}) {
const filter = pathname
? (req: Req) => req.path === pathname
: (req: Req) => req.path.startsWith(prefix);
const cache: Map<string, Buffer> = new Map();
const read = dev
? (file: string) => fs.readFileSync(path.resolve(build_dir, file))
: (file: string) => (cache.has(file) ? cache : cache.set(file, fs.readFileSync(path.resolve(build_dir, file)))).get(file)
return (req: Req, res: Res, next: () => void) => {
if (filter(req)) {
const type = lookup(req.path);
try {
const file = decodeURIComponent(req.path.slice(1));
const data = read(file);
res.setHeader('Content-Type', type);
res.setHeader('Cache-Control', cache_control);
res.end(data);
} catch (err) {
res.statusCode = 404;
res.end('not found');
}
} else {
next();
}
};
}
function noop(){}

View File

@@ -0,0 +1,767 @@
application/andrew-inset ez
application/applixware aw
application/atom+xml atom
application/atomcat+xml atomcat
application/atomsvc+xml atomsvc
application/ccxml+xml ccxml
application/cdmi-capability cdmia
application/cdmi-container cdmic
application/cdmi-domain cdmid
application/cdmi-object cdmio
application/cdmi-queue cdmiq
application/cu-seeme cu
application/davmount+xml davmount
application/docbook+xml dbk
application/dssc+der dssc
application/dssc+xml xdssc
application/ecmascript ecma
application/emma+xml emma
application/epub+zip epub
application/exi exi
application/font-tdpfr pfr
application/gml+xml gml
application/gpx+xml gpx
application/gxf gxf
application/hyperstudio stk
application/inkml+xml ink inkml
application/ipfix ipfix
application/java-archive jar
application/java-serialized-object ser
application/java-vm class
application/javascript js
application/json json map
application/jsonml+json jsonml
application/lost+xml lostxml
application/mac-binhex40 hqx
application/mac-compactpro cpt
application/mads+xml mads
application/marc mrc
application/marcxml+xml mrcx
application/mathematica ma nb mb
application/mathml+xml mathml
application/mbox mbox
application/mediaservercontrol+xml mscml
application/metalink+xml metalink
application/metalink4+xml meta4
application/mets+xml mets
application/mods+xml mods
application/mp21 m21 mp21
application/mp4 mp4s
application/msword doc dot
application/mxf mxf
application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy
application/oda oda
application/oebps-package+xml opf
application/ogg ogx
application/omdoc+xml omdoc
application/onenote onetoc onetoc2 onetmp onepkg
application/oxps oxps
application/patch-ops-error+xml xer
application/pdf pdf
application/pgp-encrypted pgp
application/pgp-signature asc sig
application/pics-rules prf
application/pkcs10 p10
application/pkcs7-mime p7m p7c
application/pkcs7-signature p7s
application/pkcs8 p8
application/pkix-attr-cert ac
application/pkix-cert cer
application/pkix-crl crl
application/pkix-pkipath pkipath
application/pkixcmp pki
application/pls+xml pls
application/postscript ai eps ps
application/prs.cww cww
application/pskc+xml pskcxml
application/rdf+xml rdf
application/reginfo+xml rif
application/relax-ng-compact-syntax rnc
application/resource-lists+xml rl
application/resource-lists-diff+xml rld
application/rls-services+xml rs
application/rpki-ghostbusters gbr
application/rpki-manifest mft
application/rpki-roa roa
application/rsd+xml rsd
application/rss+xml rss
application/rtf rtf
application/sbml+xml sbml
application/scvp-cv-request scq
application/scvp-cv-response scs
application/scvp-vp-request spq
application/scvp-vp-response spp
application/sdp sdp
application/set-payment-initiation setpay
application/set-registration-initiation setreg
application/shf+xml shf
application/smil+xml smi smil
application/sparql-query rq
application/sparql-results+xml srx
application/srgs gram
application/srgs+xml grxml
application/sru+xml sru
application/ssdl+xml ssdl
application/ssml+xml ssml
application/tei+xml tei teicorpus
application/thraud+xml tfi
application/timestamped-data tsd
application/vnd.3gpp.pic-bw-large plb
application/vnd.3gpp.pic-bw-small psb
application/vnd.3gpp.pic-bw-var pvb
application/vnd.3gpp2.tcap tcap
application/vnd.3m.post-it-notes pwn
application/vnd.accpac.simply.aso aso
application/vnd.accpac.simply.imp imp
application/vnd.acucobol acu
application/vnd.acucorp atc acutc
application/vnd.adobe.air-application-installer-package+zip air
application/vnd.adobe.formscentral.fcdt fcdt
application/vnd.adobe.fxp fxp fxpl
application/vnd.adobe.xdp+xml xdp
application/vnd.adobe.xfdf xfdf
application/vnd.ahead.space ahead
application/vnd.airzip.filesecure.azf azf
application/vnd.airzip.filesecure.azs azs
application/vnd.amazon.ebook azw
application/vnd.americandynamics.acc acc
application/vnd.amiga.ami ami
application/vnd.android.package-archive apk
application/vnd.anser-web-certificate-issue-initiation cii
application/vnd.anser-web-funds-transfer-initiation fti
application/vnd.antix.game-component atx
application/vnd.apple.installer+xml mpkg
application/vnd.apple.mpegurl m3u8
application/vnd.aristanetworks.swi swi
application/vnd.astraea-software.iota iota
application/vnd.audiograph aep
application/vnd.blueice.multipass mpm
application/vnd.bmi bmi
application/vnd.businessobjects rep
application/vnd.chemdraw+xml cdxml
application/vnd.chipnuts.karaoke-mmd mmd
application/vnd.cinderella cdy
application/vnd.claymore cla
application/vnd.cloanto.rp9 rp9
application/vnd.clonk.c4group c4g c4d c4f c4p c4u
application/vnd.cluetrust.cartomobile-config c11amc
application/vnd.cluetrust.cartomobile-config-pkg c11amz
application/vnd.commonspace csp
application/vnd.contact.cmsg cdbcmsg
application/vnd.cosmocaller cmc
application/vnd.crick.clicker clkx
application/vnd.crick.clicker.keyboard clkk
application/vnd.crick.clicker.palette clkp
application/vnd.crick.clicker.template clkt
application/vnd.crick.clicker.wordbank clkw
application/vnd.criticaltools.wbs+xml wbs
application/vnd.ctc-posml pml
application/vnd.cups-ppd ppd
application/vnd.curl.car car
application/vnd.curl.pcurl pcurl
application/vnd.dart dart
application/vnd.data-vision.rdz rdz
application/vnd.dece.data uvf uvvf uvd uvvd
application/vnd.dece.ttml+xml uvt uvvt
application/vnd.dece.unspecified uvx uvvx
application/vnd.dece.zip uvz uvvz
application/vnd.denovo.fcselayout-link fe_launch
application/vnd.dna dna
application/vnd.dolby.mlp mlp
application/vnd.dpgraph dpg
application/vnd.dreamfactory dfac
application/vnd.ds-keypoint kpxx
application/vnd.dvb.ait ait
application/vnd.dvb.service svc
application/vnd.dynageo geo
application/vnd.ecowin.chart mag
application/vnd.enliven nml
application/vnd.epson.esf esf
application/vnd.epson.msf msf
application/vnd.epson.quickanime qam
application/vnd.epson.salt slt
application/vnd.epson.ssf ssf
application/vnd.eszigno3+xml es3 et3
application/vnd.ezpix-album ez2
application/vnd.ezpix-package ez3
application/vnd.fdf fdf
application/vnd.fdsn.mseed mseed
application/vnd.fdsn.seed seed dataless
application/vnd.flographit gph
application/vnd.fluxtime.clip ftc
application/vnd.framemaker fm frame maker book
application/vnd.frogans.fnc fnc
application/vnd.frogans.ltf ltf
application/vnd.fsc.weblaunch fsc
application/vnd.fujitsu.oasys oas
application/vnd.fujitsu.oasys2 oa2
application/vnd.fujitsu.oasys3 oa3
application/vnd.fujitsu.oasysgp fg5
application/vnd.fujitsu.oasysprs bh2
application/vnd.fujixerox.ddd ddd
application/vnd.fujixerox.docuworks xdw
application/vnd.fujixerox.docuworks.binder xbd
application/vnd.fuzzysheet fzs
application/vnd.genomatix.tuxedo txd
application/vnd.geogebra.file ggb
application/vnd.geogebra.tool ggt
application/vnd.geometry-explorer gex gre
application/vnd.geonext gxt
application/vnd.geoplan g2w
application/vnd.geospace g3w
application/vnd.gmx gmx
application/vnd.google-earth.kml+xml kml
application/vnd.google-earth.kmz kmz
application/vnd.grafeq gqf gqs
application/vnd.groove-account gac
application/vnd.groove-help ghf
application/vnd.groove-identity-message gim
application/vnd.groove-injector grv
application/vnd.groove-tool-message gtm
application/vnd.groove-tool-template tpl
application/vnd.groove-vcard vcg
application/vnd.hal+xml hal
application/vnd.handheld-entertainment+xml zmm
application/vnd.hbci hbci
application/vnd.hhe.lesson-player les
application/vnd.hp-hpgl hpgl
application/vnd.hp-hpid hpid
application/vnd.hp-hps hps
application/vnd.hp-jlyt jlt
application/vnd.hp-pcl pcl
application/vnd.hp-pclxl pclxl
application/vnd.hydrostatix.sof-data sfd-hdstx
application/vnd.ibm.minipay mpy
application/vnd.ibm.modcap afp listafp list3820
application/vnd.ibm.rights-management irm
application/vnd.ibm.secure-container sc
application/vnd.iccprofile icc icm
application/vnd.igloader igl
application/vnd.immervision-ivp ivp
application/vnd.immervision-ivu ivu
application/vnd.insors.igm igm
application/vnd.intercon.formnet xpw xpx
application/vnd.intergeo i2g
application/vnd.intu.qbo qbo
application/vnd.intu.qfx qfx
application/vnd.ipunplugged.rcprofile rcprofile
application/vnd.irepository.package+xml irp
application/vnd.is-xpr xpr
application/vnd.isac.fcs fcs
application/vnd.jam jam
application/vnd.jcp.javame.midlet-rms rms
application/vnd.jisp jisp
application/vnd.joost.joda-archive joda
application/vnd.kahootz ktz ktr
application/vnd.kde.karbon karbon
application/vnd.kde.kchart chrt
application/vnd.kde.kformula kfo
application/vnd.kde.kivio flw
application/vnd.kde.kontour kon
application/vnd.kde.kpresenter kpr kpt
application/vnd.kde.kspread ksp
application/vnd.kde.kword kwd kwt
application/vnd.kenameaapp htke
application/vnd.kidspiration kia
application/vnd.kinar kne knp
application/vnd.koan skp skd skt skm
application/vnd.kodak-descriptor sse
application/vnd.las.las+xml lasxml
application/vnd.llamagraphics.life-balance.desktop lbd
application/vnd.llamagraphics.life-balance.exchange+xml lbe
application/vnd.lotus-1-2-3 123
application/vnd.lotus-approach apr
application/vnd.lotus-freelance pre
application/vnd.lotus-notes nsf
application/vnd.lotus-organizer org
application/vnd.lotus-screencam scm
application/vnd.lotus-wordpro lwp
application/vnd.macports.portpkg portpkg
application/vnd.mcd mcd
application/vnd.medcalcdata mc1
application/vnd.mediastation.cdkey cdkey
application/vnd.mfer mwf
application/vnd.mfmp mfm
application/vnd.micrografx.flo flo
application/vnd.micrografx.igx igx
application/vnd.mif mif
application/vnd.mobius.daf daf
application/vnd.mobius.dis dis
application/vnd.mobius.mbk mbk
application/vnd.mobius.mqy mqy
application/vnd.mobius.msl msl
application/vnd.mobius.plc plc
application/vnd.mobius.txf txf
application/vnd.mophun.application mpn
application/vnd.mophun.certificate mpc
application/vnd.mozilla.xul+xml xul
application/vnd.ms-artgalry cil
application/vnd.ms-cab-compressed cab
application/vnd.ms-excel xls xlm xla xlc xlt xlw
application/vnd.ms-excel.addin.macroenabled.12 xlam
application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb
application/vnd.ms-excel.sheet.macroenabled.12 xlsm
application/vnd.ms-excel.template.macroenabled.12 xltm
application/vnd.ms-fontobject eot
application/vnd.ms-htmlhelp chm
application/vnd.ms-ims ims
application/vnd.ms-lrm lrm
application/vnd.ms-officetheme thmx
application/vnd.ms-pki.seccat cat
application/vnd.ms-pki.stl stl
application/vnd.ms-powerpoint ppt pps pot
application/vnd.ms-powerpoint.addin.macroenabled.12 ppam
application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm
application/vnd.ms-powerpoint.slide.macroenabled.12 sldm
application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm
application/vnd.ms-powerpoint.template.macroenabled.12 potm
application/vnd.ms-project mpp mpt
application/vnd.ms-word.document.macroenabled.12 docm
application/vnd.ms-word.template.macroenabled.12 dotm
application/vnd.ms-works wps wks wcm wdb
application/vnd.ms-wpl wpl
application/vnd.ms-xpsdocument xps
application/vnd.mseq mseq
application/vnd.musician mus
application/vnd.muvee.style msty
application/vnd.mynfc taglet
application/vnd.neurolanguage.nlu nlu
application/vnd.nitf ntf nitf
application/vnd.noblenet-directory nnd
application/vnd.noblenet-sealer nns
application/vnd.noblenet-web nnw
application/vnd.nokia.n-gage.data ngdat
application/vnd.nokia.n-gage.symbian.install n-gage
application/vnd.nokia.radio-preset rpst
application/vnd.nokia.radio-presets rpss
application/vnd.novadigm.edm edm
application/vnd.novadigm.edx edx
application/vnd.novadigm.ext ext
application/vnd.oasis.opendocument.chart odc
application/vnd.oasis.opendocument.chart-template otc
application/vnd.oasis.opendocument.database odb
application/vnd.oasis.opendocument.formula odf
application/vnd.oasis.opendocument.formula-template odft
application/vnd.oasis.opendocument.graphics odg
application/vnd.oasis.opendocument.graphics-template otg
application/vnd.oasis.opendocument.image odi
application/vnd.oasis.opendocument.image-template oti
application/vnd.oasis.opendocument.presentation odp
application/vnd.oasis.opendocument.presentation-template otp
application/vnd.oasis.opendocument.spreadsheet ods
application/vnd.oasis.opendocument.spreadsheet-template ots
application/vnd.oasis.opendocument.text odt
application/vnd.oasis.opendocument.text-master odm
application/vnd.oasis.opendocument.text-template ott
application/vnd.oasis.opendocument.text-web oth
application/vnd.olpc-sugar xo
application/vnd.oma.dd2+xml dd2
application/vnd.openofficeorg.extension oxt
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
application/vnd.openxmlformats-officedocument.presentationml.slide sldx
application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx
application/vnd.openxmlformats-officedocument.presentationml.template potx
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx
application/vnd.osgeo.mapguide.package mgp
application/vnd.osgi.dp dp
application/vnd.osgi.subsystem esa
application/vnd.palm pdb pqa oprc
application/vnd.pawaafile paw
application/vnd.pg.format str
application/vnd.pg.osasli ei6
application/vnd.picsel efif
application/vnd.pmi.widget wg
application/vnd.pocketlearn plf
application/vnd.powerbuilder6 pbd
application/vnd.previewsystems.box box
application/vnd.proteus.magazine mgz
application/vnd.publishare-delta-tree qps
application/vnd.pvi.ptid1 ptid
application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb
application/vnd.realvnc.bed bed
application/vnd.recordare.musicxml mxl
application/vnd.recordare.musicxml+xml musicxml
application/vnd.rig.cryptonote cryptonote
application/vnd.rim.cod cod
application/vnd.rn-realmedia rm
application/vnd.rn-realmedia-vbr rmvb
application/vnd.route66.link66+xml link66
application/vnd.sailingtracker.track st
application/vnd.seemail see
application/vnd.sema sema
application/vnd.semd semd
application/vnd.semf semf
application/vnd.shana.informed.formdata ifm
application/vnd.shana.informed.formtemplate itp
application/vnd.shana.informed.interchange iif
application/vnd.shana.informed.package ipk
application/vnd.simtech-mindmapper twd twds
application/vnd.smaf mmf
application/vnd.smart.teacher teacher
application/vnd.solent.sdkm+xml sdkm sdkd
application/vnd.spotfire.dxp dxp
application/vnd.spotfire.sfs sfs
application/vnd.stardivision.calc sdc
application/vnd.stardivision.draw sda
application/vnd.stardivision.impress sdd
application/vnd.stardivision.math smf
application/vnd.stardivision.writer sdw vor
application/vnd.stardivision.writer-global sgl
application/vnd.stepmania.package smzip
application/vnd.stepmania.stepchart sm
application/vnd.sun.xml.calc sxc
application/vnd.sun.xml.calc.template stc
application/vnd.sun.xml.draw sxd
application/vnd.sun.xml.draw.template std
application/vnd.sun.xml.impress sxi
application/vnd.sun.xml.impress.template sti
application/vnd.sun.xml.math sxm
application/vnd.sun.xml.writer sxw
application/vnd.sun.xml.writer.global sxg
application/vnd.sun.xml.writer.template stw
application/vnd.sus-calendar sus susp
application/vnd.svd svd
application/vnd.symbian.install sis sisx
application/vnd.syncml+xml xsm
application/vnd.syncml.dm+wbxml bdm
application/vnd.syncml.dm+xml xdm
application/vnd.tao.intent-module-archive tao
application/vnd.tcpdump.pcap pcap cap dmp
application/vnd.tmobile-livetv tmo
application/vnd.trid.tpt tpt
application/vnd.triscape.mxs mxs
application/vnd.trueapp tra
application/vnd.ufdl ufd ufdl
application/vnd.uiq.theme utz
application/vnd.umajin umj
application/vnd.unity unityweb
application/vnd.uoml+xml uoml
application/vnd.vcx vcx
application/vnd.visio vsd vst vss vsw
application/vnd.visionary vis
application/vnd.vsf vsf
application/vnd.wap.wbxml wbxml
application/vnd.wap.wmlc wmlc
application/vnd.wap.wmlscriptc wmlsc
application/vnd.webturbo wtb
application/vnd.wolfram.player nbp
application/vnd.wordperfect wpd
application/vnd.wqd wqd
application/vnd.wt.stf stf
application/vnd.xara xar
application/vnd.xfdl xfdl
application/vnd.yamaha.hv-dic hvd
application/vnd.yamaha.hv-script hvs
application/vnd.yamaha.hv-voice hvp
application/vnd.yamaha.openscoreformat osf
application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg
application/vnd.yamaha.smaf-audio saf
application/vnd.yamaha.smaf-phrase spf
application/vnd.yellowriver-custom-menu cmp
application/vnd.zul zir zirz
application/vnd.zzazz.deck+xml zaz
application/voicexml+xml vxml
application/widget wgt
application/winhlp hlp
application/wsdl+xml wsdl
application/wspolicy+xml wspolicy
application/x-7z-compressed 7z
application/x-abiword abw
application/x-ace-compressed ace
application/x-apple-diskimage dmg
application/x-authorware-bin aab x32 u32 vox
application/x-authorware-map aam
application/x-authorware-seg aas
application/x-bcpio bcpio
application/x-bittorrent torrent
application/x-blorb blb blorb
application/x-bzip bz
application/x-bzip2 bz2 boz
application/x-cbr cbr cba cbt cbz cb7
application/x-cdlink vcd
application/x-cfs-compressed cfs
application/x-chat chat
application/x-chess-pgn pgn
application/x-conference nsc
application/x-cpio cpio
application/x-csh csh
application/x-debian-package deb udeb
application/x-dgc-compressed dgc
application/x-director dir dcr dxr cst cct cxt w3d fgd swa
application/x-doom wad
application/x-dtbncx+xml ncx
application/x-dtbook+xml dtb
application/x-dtbresource+xml res
application/x-dvi dvi
application/x-envoy evy
application/x-eva eva
application/x-font-bdf bdf
application/x-font-ghostscript gsf
application/x-font-linux-psf psf
application/x-font-pcf pcf
application/x-font-snf snf
application/x-font-type1 pfa pfb pfm afm
application/x-freearc arc
application/x-futuresplash spl
application/x-gca-compressed gca
application/x-glulx ulx
application/x-gnumeric gnumeric
application/x-gramps-xml gramps
application/x-gtar gtar
application/x-hdf hdf
application/x-install-instructions install
application/x-iso9660-image iso
application/x-java-jnlp-file jnlp
application/x-latex latex
application/x-lzh-compressed lzh lha
application/x-mie mie
application/x-mobipocket-ebook prc mobi
application/x-ms-application application
application/x-ms-shortcut lnk
application/x-ms-wmd wmd
application/x-ms-wmz wmz
application/x-ms-xbap xbap
application/x-msaccess mdb
application/x-msbinder obd
application/x-mscardfile crd
application/x-msclip clp
application/x-msdownload exe dll com bat msi
application/x-msmediaview mvb m13 m14
application/x-msmetafile wmf wmz emf emz
application/x-msmoney mny
application/x-mspublisher pub
application/x-msschedule scd
application/x-msterminal trm
application/x-mswrite wri
application/x-netcdf nc cdf
application/x-nzb nzb
application/x-pkcs12 p12 pfx
application/x-pkcs7-certificates p7b spc
application/x-pkcs7-certreqresp p7r
application/x-rar-compressed rar
application/x-research-info-systems ris
application/x-sh sh
application/x-shar shar
application/x-shockwave-flash swf
application/x-silverlight-app xap
application/x-sql sql
application/x-stuffit sit
application/x-stuffitx sitx
application/x-subrip srt
application/x-sv4cpio sv4cpio
application/x-sv4crc sv4crc
application/x-t3vm-image t3
application/x-tads gam
application/x-tar tar
application/x-tcl tcl
application/x-tex tex
application/x-tex-tfm tfm
application/x-texinfo texinfo texi
application/x-tgif obj
application/x-ustar ustar
application/x-wais-source src
application/x-x509-ca-cert der crt
application/x-xfig fig
application/x-xliff+xml xlf
application/x-xpinstall xpi
application/x-xz xz
application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8
application/xaml+xml xaml
application/xcap-diff+xml xdf
application/xenc+xml xenc
application/xhtml+xml xhtml xht
application/xml xml xsl
application/xml-dtd dtd
application/xop+xml xop
application/xproc+xml xpl
application/xslt+xml xslt
application/xspf+xml xspf
application/xv+xml mxml xhvml xvml xvm
application/yang yang
application/yin+xml yin
application/zip zip
audio/adpcm adp
audio/basic au snd
audio/midi mid midi kar rmi
audio/mp4 m4a mp4a
audio/mpeg mpga mp2 mp2a mp3 m2a m3a
audio/ogg oga ogg spx
audio/s3m s3m
audio/silk sil
audio/vnd.dece.audio uva uvva
audio/vnd.digital-winds eol
audio/vnd.dra dra
audio/vnd.dts dts
audio/vnd.dts.hd dtshd
audio/vnd.lucent.voice lvp
audio/vnd.ms-playready.media.pya pya
audio/vnd.nuera.ecelp4800 ecelp4800
audio/vnd.nuera.ecelp7470 ecelp7470
audio/vnd.nuera.ecelp9600 ecelp9600
audio/vnd.rip rip
audio/webm weba
audio/x-aac aac
audio/x-aiff aif aiff aifc
audio/x-caf caf
audio/x-flac flac
audio/x-matroska mka
audio/x-mpegurl m3u
audio/x-ms-wax wax
audio/x-ms-wma wma
audio/x-pn-realaudio ram ra
audio/x-pn-realaudio-plugin rmp
audio/x-wav wav
audio/xm xm
chemical/x-cdx cdx
chemical/x-cif cif
chemical/x-cmdf cmdf
chemical/x-cml cml
chemical/x-csml csml
chemical/x-xyz xyz
font/collection ttc
font/otf otf
font/ttf ttf
font/woff woff
font/woff2 woff2
image/bmp bmp
image/cgm cgm
image/g3fax g3
image/gif gif
image/ief ief
image/jpeg jpeg jpg jpe
image/ktx ktx
image/png png
image/prs.btif btif
image/sgi sgi
image/svg+xml svg svgz
image/tiff tiff tif
image/vnd.adobe.photoshop psd
image/vnd.dece.graphic uvi uvvi uvg uvvg
image/vnd.djvu djvu djv
image/vnd.dvb.subtitle sub
image/vnd.dwg dwg
image/vnd.dxf dxf
image/vnd.fastbidsheet fbs
image/vnd.fpx fpx
image/vnd.fst fst
image/vnd.fujixerox.edmics-mmr mmr
image/vnd.fujixerox.edmics-rlc rlc
image/vnd.ms-modi mdi
image/vnd.ms-photo wdp
image/vnd.net-fpx npx
image/vnd.wap.wbmp wbmp
image/vnd.xiff xif
image/webp webp
image/x-3ds 3ds
image/x-cmu-raster ras
image/x-cmx cmx
image/x-freehand fh fhc fh4 fh5 fh7
image/x-icon ico
image/x-mrsid-image sid
image/x-pcx pcx
image/x-pict pic pct
image/x-portable-anymap pnm
image/x-portable-bitmap pbm
image/x-portable-graymap pgm
image/x-portable-pixmap ppm
image/x-rgb rgb
image/x-tga tga
image/x-xbitmap xbm
image/x-xpixmap xpm
image/x-xwindowdump xwd
message/rfc822 eml mime
model/iges igs iges
model/mesh msh mesh silo
model/vnd.collada+xml dae
model/vnd.dwf dwf
model/vnd.gdl gdl
model/vnd.gtw gtw
model/vnd.mts mts
model/vnd.vtu vtu
model/vrml wrl vrml
model/x3d+binary x3db x3dbz
model/x3d+vrml x3dv x3dvz
model/x3d+xml x3d x3dz
text/cache-manifest appcache
text/calendar ics ifb
text/css css
text/csv csv
text/html html htm
text/n3 n3
text/plain txt text conf def list log in
text/prs.lines.tag dsc
text/richtext rtx
text/sgml sgml sgm
text/tab-separated-values tsv
text/troff t tr roff man me ms
text/turtle ttl
text/uri-list uri uris urls
text/vcard vcard
text/vnd.curl curl
text/vnd.curl.dcurl dcurl
text/vnd.curl.mcurl mcurl
text/vnd.curl.scurl scurl
text/vnd.dvb.subtitle sub
text/vnd.fly fly
text/vnd.fmi.flexstor flx
text/vnd.graphviz gv
text/vnd.in3d.3dml 3dml
text/vnd.in3d.spot spot
text/vnd.sun.j2me.app-descriptor jad
text/vnd.wap.wml wml
text/vnd.wap.wmlscript wmls
text/x-asm s asm
text/x-c c cc cxx cpp h hh dic
text/x-fortran f for f77 f90
text/x-java-source java
text/x-nfo nfo
text/x-opml opml
text/x-pascal p pas
text/x-setext etx
text/x-sfv sfv
text/x-uuencode uu
text/x-vcalendar vcs
text/x-vcard vcf
video/3gpp 3gp
video/3gpp2 3g2
video/h261 h261
video/h263 h263
video/h264 h264
video/jpeg jpgv
video/jpm jpm jpgm
video/mj2 mj2 mjp2
video/mp4 mp4 mp4v mpg4
video/mpeg mpeg mpg mpe m1v m2v
video/ogg ogv
video/quicktime qt mov
video/vnd.dece.hd uvh uvvh
video/vnd.dece.mobile uvm uvvm
video/vnd.dece.pd uvp uvvp
video/vnd.dece.sd uvs uvvs
video/vnd.dece.video uvv uvvv
video/vnd.dvb.file dvb
video/vnd.fvt fvt
video/vnd.mpegurl mxu m4u
video/vnd.ms-playready.media.pyv pyv
video/vnd.uvvu.mp4 uvu uvvu
video/vnd.vivo viv
video/webm webm
video/x-f4v f4v
video/x-fli fli
video/x-flv flv
video/x-m4v m4v
video/x-matroska mkv mk3d mks
video/x-mng mng
video/x-ms-asf asf asx
video/x-ms-vob vob
video/x-ms-wm wm
video/x-ms-wmv wmv
video/x-ms-wmx wmx
video/x-ms-wvx wvx
video/x-msvideo avi
video/x-sgi-movie movie
video/x-smv smv
x-conference/x-cooltalk ice

View File

@@ -0,0 +1,20 @@
import mime_raw from './mime-types.md';
const map: Map<string, string> = new Map();
mime_raw.split('\n').forEach((row: string) => {
const match = /(.+?)\t+(.+)/.exec(row);
if (!match) return;
const type = match[1];
const extensions = match[2].split(' ');
extensions.forEach(ext => {
map.set(ext, type);
});
});
export function lookup(file: string) {
const match = /\.([^\.]+)$/.exec(file);
return match && map.get(match[1]);
}

View File

@@ -0,0 +1,63 @@
import { ClientRequest, ServerResponse } from 'http';
export type ServerRoute = {
pattern: RegExp;
handlers: Record<string, Handler>;
params: (match: RegExpMatchArray) => Record<string, string>;
};
export type Page = {
pattern: RegExp;
parts: Array<{
name: string;
component: Component;
params?: (match: RegExpMatchArray) => Record<string, string>;
preload?: (data: any) => any | Promise<any>;
}>
};
export type Manifest = {
server_routes: ServerRoute[];
pages: Page[];
root: Component;
root_preload?: (data: any) => any | Promise<any>;
error: Component;
}
export type Handler = (req: Req, res: Res, next: () => void) => void;
export type Props = {
error?: { message: string };
status?: number;
child: {
segment: string;
component: Component;
props: Props;
};
[key: string]: any;
};
export interface Req extends ClientRequest {
url: string;
baseUrl: string;
originalUrl: string;
method: string;
path: string;
params: Record<string, string>;
query: Record<string, string>;
headers: Record<string, string>;
}
export interface Res extends ServerResponse {
write: (data: any) => void;
}
export { ServerResponse };
interface Component {
render: (data: any) => {
head: string;
css: { code: string, map: any };
html: string
}
}

2
sapper Executable file
View File

@@ -0,0 +1,2 @@
#!/usr/bin/env node
require('./dist/cli.js');

40
sapper-dev-client.js Normal file
View File

@@ -0,0 +1,40 @@
let source;
function check() {
if (typeof module === 'undefined') return;
if (module.hot.status() === 'idle') {
module.hot.check(true).then(modules => {
console.log(`[SAPPER] applied HMR update`);
});
}
}
export function connect(port) {
if (source || !window.EventSource) return;
source = new EventSource(`http://${window.location.hostname}:${port}/__sapper__`);
window.source = source;
source.onopen = function(event) {
console.log(`[SAPPER] dev client connected`);
};
source.onerror = function(error) {
console.error(error);
};
source.onmessage = function(event) {
const data = JSON.parse(event.data);
if (!data) return; // just a heartbeat
if (data.action === 'reload') {
window.location.reload();
}
if (data.status === 'completed') {
check();
}
};
}

5
site/.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
.DS_Store
node_modules
yarn-error.log
/cypress/screenshots/
/__sapper__/

88
site/README.md Normal file
View File

@@ -0,0 +1,88 @@
# sapper-template
The default [Sapper](https://github.com/sveltejs/sapper) template, with branches for Rollup and webpack. To clone it and get started:
```bash
# for Rollup
npx degit sveltejs/sapper-template#rollup my-app
# for webpack
npx degit sveltejs/sapper-template#webpack my-app
cd my-app
npm install # or yarn!
npm run dev
```
Open up [localhost:3000](http://localhost:3000) and start clicking around.
Consult [sapper.svelte.technology](https://sapper.svelte.technology) for help getting started.
## Structure
Sapper expects to find two directories in the root of your project — `src` and `static`.
### src
The [src](src) directory contains the entry points for your app — `client.js`, `server.js` and (optionally) a `service-worker.js` — along with a `template.html` file and a `routes` directory.
#### src/routes
This is the heart of your Sapper app. There are two kinds of routes — *pages*, and *server routes*.
**Pages** are Svelte components written in `.html` files. When a user first visits the application, they will be served a server-rendered version of the route in question, plus some JavaScript that 'hydrates' the page and initialises a client-side router. From that point forward, navigating to other pages is handled entirely on the client for a fast, app-like feel. (Sapper will preload and cache the code for these subsequent pages, so that navigation is instantaneous.)
**Server routes** are modules written in `.js` files, that export functions corresponding to HTTP methods. Each function receives Express `request` and `response` objects as arguments, plus a `next` function. This is useful for creating a JSON API, for example.
There are three simple rules for naming the files that define your routes:
* A file called `src/routes/about.html` corresponds to the `/about` route. A file called `src/routes/blog/[slug].html` corresponds to the `/blog/:slug` route, in which case `params.slug` is available to the route
* The file `src/routes/index.html` (or `src/routes/index.js`) corresponds to the root of your app. `src/routes/about/index.html` is treated the same as `src/routes/about.html`.
* Files and directories with a leading underscore do *not* create routes. This allows you to colocate helper modules and components with the routes that depend on them — for example you could have a file called `src/routes/_helpers/datetime.js` and it would *not* create a `/_helpers/datetime` route
### static
The [static](static) directory contains any static assets that should be available. These are served using [sirv](https://github.com/lukeed/sirv).
In your [service-worker.js](app/service-worker.js) file, you can import these as `files` from the generated manifest...
```js
import { files } from '../__sapper__/service-worker.js';
```
...so that you can cache them (though you can choose not to, for example if you don't want to cache very large files).
## Bundler config
Sapper uses Rollup or webpack to provide code-splitting and dynamic imports, as well as compiling your Svelte components. With webpack, it also provides hot module reloading. As long as you don't do anything daft, you can edit the configuration files to add whatever plugins you'd like.
## Production mode and deployment
To start a production version of your app, run `npm run build && npm start`. This will disable live reloading, and activate the appropriate bundler plugins.
You can deploy your application to any environment that supports Node 8 or above. As an example, to deploy to [Now](https://zeit.co/now), run these commands:
```bash
npm install -g now
now
```
## Using external components with webpack
When using Svelte components installed from npm, such as [@sveltejs/svelte-virtual-list](https://github.com/sveltejs/svelte-virtual-list), Svelte needs the original component source (rather than any precompiled JavaScript that ships with the component). This allows the component to be rendered server-side, and also keeps your client-side app smaller.
Because of that, it's essential that webpack doesn't treat the package as an *external dependency*. You can either modify the `externals` option in [webpack/server.config.js](webpack/server.config.js), or simply install the package to `devDependencies` rather than `dependencies`, which will cause it to get bundled (and therefore compiled) with your app:
```bash
yarn add -D @sveltejs/svelte-virtual-list
```
## Bugs and feedback
Sapper is in early development, and may have the odd rough edge here and there. Please be vocal over on the [Sapper issue tracker](https://github.com/sveltejs/sapper/issues).

18
site/appveyor.yml Normal file
View File

@@ -0,0 +1,18 @@
version: "{build}"
shallow_clone: true
init:
- git config --global core.autocrlf false
build: off
environment:
matrix:
# node.js
- nodejs_version: stable
install:
- ps: Install-Product node $env:nodejs_version
- npm install cypress
- npm install

3
site/config.js Normal file
View File

@@ -0,0 +1,3 @@
export const SLUG_PRESERVE_UNICODE = false;
export const SLUG_SEPARATOR = '_';
export const SLUG_LANG = 'en';

View File

@@ -0,0 +1,52 @@
---
title: Introduction
---
### Before we begin
> Sapper is in early development, and some things may change before we hit version 1.0. This document is a work-in-progress. If you get stuck, reach out for help in the [Discord chatroom](https://svelte.dev/chat).
>
> See the [migration guides](migrating) for help upgrading from older versions.
### What is Sapper?
Sapper is a framework for building extremely high-performance web apps. You're looking at one right now! There are two basic concepts:
* Each page of your app is a [Svelte](https://svelte.dev) component
* You create pages by adding files to the `src/routes` directory of your project. These will be server-rendered so that a user's first visit to your app is as fast as possible, then a client-side app takes over
Building an app with all the modern best practices — code-splitting, offline support, server-rendered views with client-side hydration — is fiendishly complicated. Sapper does all the boring stuff for you so that you can get on with the creative part.
You don't need to know Svelte to understand the rest of this guide, but it will help. In short, it's a UI framework that compiles your components to highly optimized vanilla JavaScript. Read the [introductory blog post](https://svelte.dev/blog/svelte-3-rethinking-reactivity) and the [tutorial](https://svelte.dev/tutorial) to learn more.
### Why the name?
In war, the soldiers who build bridges, repair roads, clear minefields and conduct demolitions — all under combat conditions — are known as *sappers*.
For web developers, the stakes are generally lower than for combat engineers. But we face our own hostile environment: underpowered devices, poor network connections, and the complexity inherent in front-end engineering. Sapper, which is short for <b>S</b>velte <b>app</b> mak<b>er</b>, is your courageous and dutiful ally.
### Comparison with Next.js
[Next.js](https://github.com/zeit/next.js) is a React framework from [Zeit](https://zeit.co), and is the inspiration for Sapper. There are a few notable differences, however:
* Sapper is powered by Svelte instead of React, so it's faster and your apps are smaller
* Instead of route masking, we encode route parameters in filenames (see the [routing](docs#Routing) section below)
* As well as *pages*, you can create *server routes* in your `src/routes` directory. This makes it very easy to, for example, add a JSON API such as the one powering this very page (try visiting [/docs.json](/docs.json))
* Links are just `<a>` elements, rather than framework-specific `<Link>` components. That means, for example, that [this link right here](/), despite being inside a blob of markdown, works with the router as you'd expect
### Getting started
The easiest way to start building a Sapper app is to clone the [sapper-template](https://github.com/sveltejs/sapper-template) repo with [degit](https://github.com/Rich-Harris/degit):
```bash
npx degit sveltejs/sapper-template#rollup my-app
# or: npx degit sveltejs/sapper-template#webpack my-app
cd my-app
npm install
npm run dev
```
This will scaffold a new project in the `my-app` directory, install its dependencies, and start a server on [localhost:3000](http://localhost:3000). Try editing the files to get a feel for how everything works you may not need to bother reading the rest of this guide!

View File

@@ -0,0 +1,112 @@
---
title: Sapper app structure
---
This section is a reference for the curious. We recommend you play around with the project template first, and come back here when you've got a feel for how things fit together.
If you take a look inside the [sapper-template](https://github.com/sveltejs/sapper-template) repo, you'll see some files that Sapper expects to find:
```bash
├ package.json
├ src
│ ├ routes
│ │ ├ # your routes here
│ │ ├ _error.svelte
│ │ └ index.svelte
│ ├ client.js
│ ├ server.js
│ ├ service-worker.js
│ └ template.html
├ static
│ ├ # your files here
└ rollup.config.js / webpack.config.js
```
When you first run Sapper, it will create an additional `__sapper__` directory containing generated files.
You'll notice a few extra files and a `cypress` directory which relates to [testing](docs#Testing) — we don't need to worry about those right now.
> You *can* create these files from scratch, but it's much better to use the template. See [getting started](docs#Getting_started) for instructions on how to easily clone it
### package.json
Your package.json contains your app's dependencies and defines a number of scripts:
* `npm run dev` — start the app in development mode, and watch source files for changes
* `npm run build` — build the app in production mode
* `npm run export` — bake out a static version, if applicable (see [exporting](docs#Exporting))
* `npm start` — start the app in production mode after you've built it
* `npm test` — run the tests (see [testing](docs#Testing))
### src
This contains the three *entry points* for your app — `src/client.js`, `src/server.js` and (optionally) `src/service-worker.js` — along with a `src/template.html` file.
#### src/client.js
This *must* import, and call, the `start` function from the generated `@sapper/app` module:
```js
import * as sapper from '@sapper/app';
sapper.start({
target: document.querySelector('#sapper')
});
```
In many cases, that's the entirety of your entry module, though you can do as much or as little here as you wish. See the [client API](docs#Client_API) section for more information on functions you can import.
#### src/server.js
This is a normal Express (or [Polka](https://github.com/lukeed/polka), etc) app, with three requirements:
* it should serve the contents of the `static` folder, using for example [sirv](https://github.com/lukeed/sirv)
* it should call `app.use(sapper.middleware())` at the end, where `sapper` is imported from `@sapper/server`
* it must listen on `process.env.PORT`
Beyond that, you can write the server however you like.
#### src/service-worker.js
Service workers act as proxy servers that give you fine-grained control over how to respond to network requests. For example, when the browser requests `/goats.jpg`, the service worker can respond with a file it previously cached, or it can pass the request on to the server, or it could even respond with something completely different, such as a picture of llamas.
Among other things, this makes it possible to build applications that work offline.
Because every app needs a slightly different service worker (sometimes it's appropriate to always serve from the cache, sometimes that should only be a last resort in case of no connectivity), Sapper doesn't attempt to control the service worker. Instead, you write the logic in `service-worker.js`. You can import any of the following from `@sapper/service-worker`:
* `files` — an array of files found in the `static` directory
* `shell` — the client-side JavaScript generated by the bundler (Rollup or webpack)
* `routes` — an array of `{ pattern: RegExp }` objects you can use to determine whether a Sapper-controlled page is being requested
* `timestamp` — the time the service worker was generated (useful for generating unique cache names)
#### src/template.html
This file is a template for responses from the server. Sapper will inject content that replaces the following tags:
* `%sapper.base%` — a `<base>` element (see [base URLs](docs#Base_URLs))
* `%sapper.styles%` — critical CSS for the page being requested
* `%sapper.head%` — HTML representing page-specific `<head>` contents, like `<title>`
* `%sapper.html%` — HTML representing the body of the page being rendered
* `%sapper.scripts%` — script tags for the client-side app
### src/routes
This is the meat of your app — the pages and server routes. See the section on [routing](docs#Routing) for the juicy details.
### static
This is a place to put any files that your app uses — fonts, images and so on. For example `static/favicon.png` will be served as `/favicon.png`.
Sapper doesn't serve these files — you'd typically use [sirv](https://github.com/lukeed/sirv) or [serve-static](https://github.com/expressjs/serve-static) for that — but it will read the contents of the `static` folder so that you can easily generate a cache manifest for offline support (see [service-worker.js](docs#templates-service-worker-js)).
### rollup.config.js / webpack.config.js
Sapper can use [Rollup](https://rollupjs.org/) or [webpack](https://webpack.js.org/) to bundle your app. You probably won't need to change the config, but if you want to (for example to add new loaders or plugins), you can.

View File

@@ -0,0 +1,127 @@
---
title: Routing
---
As we've seen, there are two types of route in Sapper — pages, and server routes.
### Pages
Pages are Svelte components written in `.svelte` files. When a user first visits the application, they will be served a server-rendered version of the route in question, plus some JavaScript that 'hydrates' the page and initialises a client-side router. From that point forward, navigating to other pages is handled entirely on the client for a fast, app-like feel.
The filename determines the route. For example, `src/routes/index.svelte` is the root of your site:
```html
<!-- src/routes/index.svelte -->
<svelte:head>
<title>Welcome</title>
</svelte:head>
<h1>Hello and welcome to my site!</h1>
```
A file called either `src/routes/about.svelte` or `src/routes/about/index.svelte` would correspond to the `/about` route:
```html
<!-- src/routes/about.svelte -->
<svelte:head>
<title>About</title>
</svelte:head>
<h1>About this site</h1>
<p>TODO...</p>
```
Dynamic parameters are encoded using `[brackets]`. For example, here's how you could create a page that renders a blog post:
```html
<!-- src/routes/blog/[slug].svelte -->
<script context="module">
// the (optional) preload function takes a
// `{ path, params, query }` object and turns it into
// the data we need to render the page
export async function preload(page, session) {
// the `slug` parameter is available because this file
// is called [slug].svelte
const { slug } = page.params;
// `this.fetch` is a wrapper around `fetch` that allows
// you to make credentialled requests on both
// server and client
const res = await this.fetch(`blog/${slug}.json`);
const article = await res.json();
return { article };
}
</script>
<script>
export let article;
</script>
<svelte:head>
<title>{article.title}</title>
</svelte:head>
<h1>{article.title}</h1>
<div class='content'>
{@html article.html}
</div>
```
> See the section on [preloading](docs#Preloading) for more info about `preload` and `this.fetch`
### Server routes
Server routes are modules written in `.js` files that export functions corresponding to HTTP methods. Each function receives HTTP `request` and `response` objects as arguments, plus a `next` function. This is useful for creating a JSON API. For example, here's how you could create an endpoint that served the blog page above:
```js
// routes/blog/[slug].json.js
import db from './_database.js'; // the underscore tells Sapper this isn't a route
export async function get(req, res, next) {
// the `slug` parameter is available because this file
// is called [slug].json.js
const { slug } = req.params;
const article = await db.get(slug);
if (article !== null) {
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify(article));
} else {
next();
}
}
```
> `delete` is a reserved word in JavaScript. To handle DELETE requests, export a function called `del` instead.
### File naming rules
There are three simple rules for naming the files that define your routes:
* A file called `src/routes/about.svelte` corresponds to the `/about` route. A file called `src/routes/blog/[slug].svelte` corresponds to the `/blog/:slug` route, in which case `params.slug` is available to `preload`
* The file `src/routes/index.svelte` corresponds to the root of your app. `src/routes/about/index.svelte` is treated the same as `src/routes/about.svelte`.
* Files and directories with a leading underscore do *not* create routes. This allows you to colocate helper modules and components with the routes that depend on them — for example you could have a file called `src/routes/_helpers/datetime.js` and it would *not* create a `/_helpers/datetime` route
### Error page
In addition to regular pages, there is a 'special' page that Sapper expects to find — `src/routes/_error.svelte`. This will be shown when an error occurs while rendering a page.
The `error` object is made available to the template along with the HTTP `status` code.
### Regexes in routes
You can use a subset of regular expressions to qualify route parameters, by placing them in parentheses after the parameter name.
For example, `src/routes/items/[id([0-9]+)].svelte` would only match numeric IDs — `/items/123` would match, but `/items/xyz` would not.
Because of technical limitations, the following characters cannot be used: `/`, `\`, `?`, `:`, `(` and `)`.

View File

@@ -0,0 +1,47 @@
---
title: Client API
---
The `@sapper/app` module, which is generated by Sapper based on the shape of your app, contains functions for controlling Sapper programmatically and responding to events.
### start({ target })
* `target` — an element to render pages to
This configures the router and starts the application — listens for clicks on `<a>` elements, interacts with the `history` API, and renders and updates your Svelte components.
Returns a `Promise` that resolves when the initial page has been hydrated.
```js
import * as sapper from '@sapper/app';
sapper.start({
target: document.querySelector('#sapper')
}).then(() => {
console.log('client-side app has started');
});
```
### goto(href, options?)
* `href` — the page to go to
* `options` — can include a `replaceState` property, which determines whether to use `history.pushState` (the default) or `history.replaceState`). Not required
Programmatically navigates to the given `href`. If the destination is a Sapper route, Sapper will handle the navigation, otherwise the page will be reloaded with the new `href`. (In other words, the behaviour is as though the user clicked on a link with this `href`.)
### prefetch(href)
* `href` — the page to prefetch
Programmatically prefetches the given page, which means a) ensuring that the code for the page is loaded, and b) calling the page's `preload` method with the appropriate options. This is the same behaviour that Sapper triggers when the user taps or mouses over an `<a>` element with [rel=prefetch](docs#Prefetching).
### prefetchRoutes(routes?)
* `routes` — an optional array of strings representing routes to prefetch
Programmatically prefetches the code for routes that haven't yet been fetched. Typically, you might call this after `sapper.start()` is complete, to speed up subsequent navigation (this is the 'L' of the [PRPL pattern](https://developers.google.com/web/fundamentals/performance/prpl-pattern/)). Omitting arguments will cause all routes to be fetched, or you can specify routes by any matching pathname such as `/about` (to match `src/routes/about.svelte`) or `/blog/*` (to match `src/routes/blog/[slug].svelte`). Unlike `prefetch`, this won't call `preload` for individual pages.

View File

@@ -0,0 +1,114 @@
---
title: Preloading
---
As seen in the [routing](docs#Routing) section, page components can have an optional `preload` function that will load some data that the page depends on. This is similar to `getInitialProps` in Next.js or `asyncData` in Nuxt.js.
```html
<script context="module">
export async function preload(page, session) {
const { slug } = page.params;
const res = await this.fetch(`blog/${slug}.json`);
const article = await res.json();
return { article };
}
</script>
```
It lives in a `context="module"` script — see the [tutorial](https://svelte.dev/tutorial/module-exports) — because it's not part of the component instance itself; instead, it runs *before* the component is created, allowing you to avoid flashes while data is fetched.
### Argument
The `preload` function receives two arguments — `page` and `session`.
`page` is a `{ path, params, query }` object where `path` is the URL's pathname, `params` is derived from `path` and the route filename, and `query` is an object of values in the query string.
So if the example above was `src/routes/blog/[slug].svelte` and the URL was `/blog/some-post?foo=bar&baz`, the following would be true:
* `page.path === '/blog/some-post'`
* `page.params.slug === 'some-post'`
* `page.query.foo === 'bar'`
* `page.query.baz === true`
`session` is generated on the server by the `session` option passed to `sapper.middleware` (TODO this needs further documentation. Perhaps a server API section?)
### Return value
If you return a Promise from `preload`, the page will delay rendering until the promise resolves. You can also return a plain object.
When Sapper renders a page on the server, it will attempt to serialize the resolved value (using [devalue](https://github.com/Rich-Harris/devalue)) and include it on the page, so that the client doesn't also need to call `preload` upon initialization. Serialization will fail if the value includes functions or custom classes (cyclical and repeated references are fine, as are built-ins like `Date`, `Map`, `Set` and `RegExp`).
### Context
Inside `preload`, you have access to three methods:
* `this.fetch(url, options)`
* `this.error(statusCode, error)`
* `this.redirect(statusCode, location)`
#### this.fetch
In browsers, you can use `fetch` to make AJAX requests, for getting data from your server routes (among other things). On the server it's a little trickier — you can make HTTP requests, but you must specify an origin, and you don't have access to cookies. This means that it's impossible to request data based on the user's session, such as data that requires you to be logged in.
To fix this, Sapper provides `this.fetch`, which works on the server as well as in the client:
```html
<script context="module">
export async function preload() {
const res = await this.fetch(`secret-data.json`, {
credentials: 'include'
});
// ...
}
</script>
```
Note that you will need to use session middleware such as [express-session](https://github.com/expressjs/session) in your `app/server.js` in order to maintain user sessions or do anything involving authentication.
#### this.error
If the user navigated to `/blog/some-invalid-slug`, we would want to render a 404 Not Found page. We can do that with `this.error`:
```html
<script context="module">
export async function preload({ params, query }) {
const { slug } = params;
const res = await this.fetch(`blog/${slug}.json`);
if (res.status === 200) {
const article = await res.json();
return { article };
}
this.error(404, 'Not found');
}
</script>
```
The same applies to other error codes you might encounter.
#### this.redirect
You can abort rendering and redirect to a different location with `this.redirect`:
```html
<script context="module">
export async function preload(page, session) {
const { user } = session;
if (!user) {
return this.redirect(302, 'login');
}
return { user };
}
</script>
```

View File

@@ -0,0 +1,86 @@
---
title: Layouts
---
So far, we've treated pages as entirely standalone components — upon navigation, the existing component will be destroyed, and a new one will take its place.
But in many apps, there are elements that should be visible on *every* page, such as top-level navigation or a footer. Instead of repeating them in every page, we can use *layout* components.
To create a layout component that applies to every page, make a file called `src/routes/_layout.svelte`. The default layout component (the one that Sapper uses if you don't bring your own) looks like this...
```html
<slot></slot>
```
...but we can add whatever markup, styles and behaviour we want. For example, let's add a nav bar:
```html
<!-- src/routes/_layout.svelte -->
<nav>
<a href=".">Home</a>
<a href="about">About</a>
<a href="settings">Settings</a>
</nav>
<slot></slot>
```
If we create pages for `/`, `/about` and `/settings`...
```html
<!-- src/routes/index.svelte -->
<h1>Home</h1>
```
```html
<!-- src/routes/about.svelte -->
<h1>About</h1>
```
```html
<!-- src/routes/settings.svelte -->
<h1>Settings</h1>
```
...the nav will always be visible, and clicking between the three pages will only result in the `<h1>` being replaced.
### Nested routes
Suppose we don't just have a single `/settings` page, but instead have nested pages like `/settings/profile` and `/settings/notifications` with a shared submenu (for an real-life example, see [github.com/settings](https://github.com/settings)).
We can create a layout that only applies to pages below `/settings` (while inheriting the root layout with the top-level nav):
```html
<!-- src/routes/settings/_layout.svelte -->
<h1>Settings</h1>
<div class="submenu">
<a href="settings/profile">Profile</a>
<a href="settings/notifications">Notifications</a>
</div>
<slot></slot>
```
Layout components receive a `segment` property which is useful for things like styling:
```diff
+<script>
+ export let segment;
+</script>
+
<div class="submenu">
- <a href="settings/profile">Profile</a>
- <a href="settings/notifications">Notifications</a>
+ <a
+ class:selected={segment === "profile"}
+ href="settings/profile"
+ >Profile</a>
+
+ <a
+ class:selected={segment === "notifications"}
+ href="settings/notifications"
+ >Notifications</a>
</div>
```

View File

@@ -0,0 +1,32 @@
---
title: Server-side rendering
---
Sapper, by default, renders server-side first (SSR), and then re-mounts any dynamic elements on the client. Svelte provides [excellent support for this](https://svelte.dev/docs#server-side-rendering). This has benefits in performance and search engine indexing, among others, but comes with its own set of complexities.
### Making a component SSR compatible
Sapper works well with most third-party libraries you are likely to come across. However, sometimes, a third-party library comes bundled in a way which allows it to work with multiple different module loaders. Sometimes, this code creates a dependency on `window`, such as checking for the existence of `window.global` might do.
Since there is no `window` in a server-side environment like Sapper's, the action of simply importing such a module can cause the import to fail, and terminate the Sapper's server with an error such as:
```bash
ReferenceError: window is not defined
```
The way to get around this is to use a dynamic import for your component, from within the `onMount` function (which is only called on the client), so that your import code is never called on the server.
```html
<script>
import { onMount } from 'svelte';
let MyComponent;
onMount(async () => {
const module = await import('my-non-ssr-component');
MyComponent = module.default;
});
</script>
<svelte:component this={MyComponent} foo="bar"/>
```

View File

@@ -0,0 +1,40 @@
---
title: Stores
---
The `page` and `session` values passed to `preload` functions are available to components as [stores](https://svelte.dev/tutorial/writable-stores), along with `preloading`.
Inside a component, get references to the stores like so:
```html
<script>
import { stores } from '@sapper/app';
const { preloading, page, session } = stores();
</script>
```
* `preloading` contains a readonly boolean value, indicating whether or not a navigation is pending
* `page` contains a readonly `{ path, params, query }` object, identical to that passed to `preload` functions
* `session` contains whatever data was seeded on the server. It is a [writable store](https://svelte.dev/tutorial/writable-stores), meaning you can update it with new data (for example, after the user logs in) and your app will be refreshed
### Seeding session data
On the server, you can populate `session` by passing an option to `sapper.middleware`:
```js
// src/server.js
express() // or Polka, or a similar framework
.use(
serve('assets'),
authenticationMiddleware(),
sapper.middleware({
session: (req, res) => ({
user: req.user
})
})
)
.listen(process.env.PORT);
```
> Session data must be serializable (using [devalue](https://github.com/Rich-Harris/devalue)) — no functions or custom classes, just built-in JavaScript data types

View File

@@ -0,0 +1,22 @@
---
title: Prefetching
---
Sapper uses code splitting to break your app into small chunks (one per route), ensuring fast startup times.
For *dynamic* routes, such as our `src/routes/blog/[slug].svelte` example, that's not enough. In order to render the blog post, we need to fetch the data for it, and we can't do that until we know what `slug` is. In the worst case, that could cause lag as the browser waits for the data to come back from the server.
### rel=prefetch
We can mitigate that by *prefetching* the data. Adding a `rel=prefetch` attribute to a link...
```html
<a rel=prefetch href='blog/what-is-sapper'>What is Sapper?</a>
```
...will cause Sapper to run the page's `preload` function as soon as the user hovers over the link (on a desktop) or touches it (on mobile), rather than waiting for the `click` event to trigger navigation. Typically, this buys us an extra couple of hundred milliseconds, which is the difference between a user interface that feels laggy, and one that feels snappy.
> `rel=prefetch` is a Sapper idiom, not a standard attribute for `<a>` elements
<!-- TODO add a function to prefetch programmatically -->

View File

@@ -0,0 +1,15 @@
---
title: Building
---
Up until now we've been using `sapper dev` to build our application and run a development server. But when it comes to production, we want to create a self-contained optimized build.
### sapper build
This command packages up your application into the `__sapper__/build` directory. (You can change this to a custom directory, as well as controlling various other options — do `sapper build --help` for more information.)
The output is a Node app that you can run from the project root:
```bash
node __sapper__/build
```

View File

@@ -0,0 +1,63 @@
---
title: Exporting
---
Many sites are effectively *static*, which is to say they don't actually need an Express server backing them. Instead, they can be hosted and served as static files, which allows them to be deployed to more hosting environments (such as [Netlify](https://www.netlify.com/) or [GitHub Pages](https://pages.github.com/)). Static sites are generally cheaper to operate and have better performance characteristics.
Sapper allows you to *export* a static site with a single zero-config `sapper export` command. In fact, you're looking at an exported site right now!
Static doesn't mean non-interactive — your Svelte components work exactly as they do normally, and you still get all the benefits of client-side routing and prefetching.
### sapper export
Inside your Sapper project, try this:
```bash
# npx allows you to use locally-installed dependencies
npx sapper export
```
This will create a `__sapper__/export` folder with a production-ready build of your site. You can launch it like so:
```bash
npx serve __sapper__/export
```
Navigate to [localhost:5000](http://localhost:5000) (or whatever port `serve` picked), and verify that your site works as expected.
You can also add a script to your package.json...
```js
{
"scripts": {
...
"export": "sapper export"
}
}
```
...allowing you to `npm run export` your app.
### How it works
When you run `sapper export`, Sapper first builds a production version of your app, as though you had run `sapper build`, and copies the contents of your `assets` folder to the destination. It then starts the server, and navigates to the root of your app. From there, it follows any `<a>` elements it finds, and captures any data served by the app.
Because of this, any pages you want to be included in the exported site must be reachable by `<a>` elements. Additionally, any non-page routes should be requested in `preload`, *not* in `onMount` or elsewhere.
### When not to export
The basic rule is this: for an app to be exportable, any two users hitting the same page of your app must get the same content from the server. In other words, any app that involves user sessions or authentication is *not* a candidate for `sapper export`.
Note that you can still export apps with dynamic routes, like our `src/routes/blog/[slug].svelte` example from earlier. `sapper export` will intercept `fetch` requests made inside `preload`, so the data served from `src/routes/blog/[slug].json.js` will also be captured.
### Route conflicts
Because `sapper export` writes to the filesystem, it isn't possible to have two server routes that would cause a directory and a file to have the same name. For example, `src/routes/foo/index.js` and `src/routes/foo/bar.js` would try to create `export/foo` and `export/foo/bar`, which is impossible.
The solution is to rename one of the routes to avoid conflict — for example, `src/routes/foo-bar.js`. (Note that you would also need to update any code that fetches data from `/foo/bar` to reference `/foo-bar` instead.)
For *pages*, we skirt around this problem by writing `export/foo/index.html` instead of `export/foo`.

View File

@@ -0,0 +1,64 @@
---
title: Deployment
---
Sapper apps run anywhere that supports Node 8 or higher.
### Deploying to Now
> This section relates to Now 1, not Now 2
We can very easily deploy our apps to [Now][]:
```bash
npm install -g now
now
```
This will upload the source code to Now, whereupon it will do `npm run build` and `npm start` and give you a URL for the deployed app.
For other hosting environments, you may need to do `npm run build` yourself.
### Deploying service workers
Sapper makes the Service Worker file (`service-worker.js`) unique by including a timestamp in the source code
(calculated using `Date.now()`).
In environments where the app is deployed to multiple servers (such as [Now][]), it is advisable to use a
consistent timestamp for all deployments. Otherwise, users may run into issues where the Service Worker
updates unexpectedly because the app hits server 1, then server 2, and they have slightly different timestamps.
To override Sapper's timestamp, you can use an environment variable (e.g. `SAPPER_TIMESTAMP`) and then modify
the `service-worker.js`:
```js
const timestamp = process.env.SAPPER_TIMESTAMP; // instead of `import { timestamp }`
const ASSETS = `cache${timestamp}`;
export default {
/* ... */
plugins: [
/* ... */
replace({
/* ... */
'process.env.SAPPER_TIMESTAMP': process.env.SAPPER_TIMESTAMP || Date.now()
})
]
}
```
Then you can set it using the environment variable, e.g.:
```bash
SAPPER_TIMESTAMP=$(date +%s%3N) npm run build
```
When deploying to [Now][], you can pass the environment variable into Now itself:
```bash
now -e SAPPER_TIMESTAMP=$(date +%s%3N)
```
[Now]: https://zeit.co/now

View File

@@ -0,0 +1,39 @@
---
title: Security
---
By default, Sapper does not add security headers to your app, but you may add them yourself using middleware such as [Helmet][].
### Content Security Policy (CSP)
Sapper generates inline `<script>`s, which can fail to execute if [Content Security Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) headers disallow arbitrary script execution (`unsafe-inline`).
To work around this, Sapper can inject a [nonce](https://www.troyhunt.com/locking-down-your-website-scripts-with-csp-hashes-nonces-and-report-uri/) which can be configured with middleware to emit the proper CSP headers. Here is an example using [Express][] and [Helmet][]:
```js
// server.js
import uuidv4 from 'uuid/v4';
import helmet from 'helmet';
app.use((req, res, next) => {
res.locals.nonce = uuidv4();
next();
});
app.use(helmet({
contentSecurityPolicy: {
directives: {
scriptSrc: [
"'self'",
(req, res) => `'nonce-${res.locals.nonce}'`
]
}
}
}));
app.use(sapper.middleware());
```
Using `res.locals.nonce` in this way follows the convention set by
[Helmet's CSP docs](https://helmetjs.github.io/docs/csp/#generating-nonces).
[Express]: https://expressjs.com/
[Helmet]: https://helmetjs.github.io/

View File

@@ -0,0 +1,28 @@
---
title: Base URLs
---
Ordinarily, the root of your Sapper app is served at `/`. But in some cases, your app may need to be served from a different base path — for example, if Sapper only controls part of your domain, or if you have multiple Sapper apps living side-by-side.
This can be done like so:
```js
// app/server.js
express() // or Polka, or a similar framework
.use(
'/my-base-path', // <!-- add this line
compression({ threshold: 0 }),
serve('assets'),
sapper.middleware()
)
.listen(process.env.PORT);
```
Sapper will detect the base path and configure both the server-side and client-side routers accordingly.
If you're [exporting](docs#Exporting) your app, you will need to tell the exporter where to begin crawling:
```bash
sapper export --basepath my-base-path
```

View File

@@ -0,0 +1,14 @@
---
title: Testing
---
You can use whatever testing frameworks and libraries you'd like. The default in [sapper-template](https://github.com/sveltejs/sapper-template) is [Cypress](https://cypress.io).
### Running the tests
```bash
npm test
```
This will start the server and open Cypress. You can (and should!) add your own tests in `cypress/integration/spec.js` — consult the [docs](https://docs.cypress.io/guides/overview/why-cypress.html) for more information.

View File

@@ -0,0 +1,19 @@
---
title: Debugging
---
Debugging your server code is particularly easy with [ndb](https://github.com/GoogleChromeLabs/ndb). Install it globally...
```bash
npm install -g ndb
```
...then run Sapper:
```bash
ndb npm run dev
```
> This assumes that `npm run dev` runs `sapper dev`. You can also run Sapper via [npx](https://blog.npmjs.org/post/162869356040/introducing-npx-an-npm-package-runner), as in `ndb npx sapper dev`.
Note that you may not see any terminal output for a few seconds while ndb starts up.

View File

@@ -0,0 +1,367 @@
---
title: Migrating
---
Until we reach version 1.0, there may be occasional changes to the project structure Sapper expects.
### 0.25 to 0.26
The most significant change yet: Sapper is now built on Svelte 3.
#### Importing Sapper
Your app's runtime is now built to `src/node_modules/@sapper` this allows you to easily import it from anywhere in your source code. Update your `server.js`...
```diff
// src/server.js
-import * as sapper from '../__sapper__/server.js';
+import * as sapper from '@sapper/server';
```
...and client.js:
```diff
-import * as sapper from '../__sapper__/client.js';
+import * as sapper from '@sapper/app';
sapper.start({
target: document.querySelector('#sapper')
});
```
The same applies to imports like `goto` and `prefetchRoutes`.
#### Webpack config
If you're using webpack, you must update your configuration to recognise `.mjs` and `.svelte` files:
```js
resolve: {
extensions: ['.mjs', '.js', '.json', '.svelte', '.html']
}
```
If you're using .svelte files (recommended), you'll also need to tell `svelte-loader` to expect them:
```diff
-test: /\.html$/
+test: /\.(svelte|html)$/
```
#### Session data
Passing data from server to client is now accomplished with a `session` function passed to the middleware:
```js
// src/server.js
sapper.middleware({
session: (req, res) => ({
// session data goes here
})
})
```
This data is available in `preload` functions as the second argument:
```html
<!-- SomeComponent.svelte -->
<script context="module">
export function preload(page, session) {
const { path, params, query } = page; // as before
if (!session.user) return this.redirect(302, 'login');
// ...
}
</script>
```
#### Stores
It is also available, along with `page` and `preloading`, as a store inside components:
```html
<script>
import * as sapper from '@sapper/app';
const { page, preloading, session } = sapper.stores();
</script>
```
`page` and `preloading` are [readable stores](https://svelte.dev/tutorial/readable-stores), while `session` is [writable](https://svelte.dev/tutorial/writable-stores). Writing to the session store (for example, after the user logs in) will cause any `preload` functions that rely on session data to re-run; it will not persist anything to the server.
#### Layouts
Your layout components should now use a `<slot>` element to render nested routes, instead of `<svelte:component>`:
```diff
<main>
- <svelte:component this={child.component} {...child.props}/>
+ <slot></slot>
</main>
```
The layout component itself receives a `segment` prop, which is equivalent to `child.segment` in earlier versions.
### 0.21 to 0.22
Instead of importing middleware from the `sapper` package, or importing the client runtime from `sapper/runtime.js`, the app is *compiled into* the generated files:
```diff
// src/client.js
-import { init } from 'sapper/runtime.js';
-import { manifest } from './manifest/client.js';
+import * as sapper from '../__sapper__/client.js';
-init({
+sapper.start({
target: document.querySelector('#sapper'),
- manifest
});
```
```diff
// src/server.js
import sirv from 'sirv';
import polka from 'polka';
import compression from 'compression';
-import sapper from 'sapper';
-import { manifest } from './manifest/server.js';
+import * as sapper from '../__sapper__/server.js';
const { PORT, NODE_ENV } = process.env;
const dev = NODE_ENV === 'development';
polka() // You can also use Express
.use(
compression({ threshold: 0 }),
- sirv('assets', { dev }),
+ sirv('static', { dev }),
- sapper({ manifest })
+ sapper.middleware()
)
.listen(PORT, err => {
if (err) console.log('error', err);
});
```
```diff
// src/service-worker.js
-import { assets, shell, routes, timestamp } from './manifest/service-worker.js';
+import { files, shell, routes, timestamp } from '../__sapper__/service-worker.js';
```
In addition, the default build and export directories are now `__sapper__/build` and `__sapper__/export` respectively.
### 0.20 to 0.21
* The `app` directory is now `src`
* The `routes` directory is now `src/routes`
* The `assets` directory is now `static` (remember to update your `src/server.js` file to reflect this change as well)
* Instead of having three separate config files (`webpack/client.config.js`, `webpack/server.config.js` and `webpack/service-worker.config.js`), there is a single `webpack.config.js` file that exports `client`, `server` and `serviceworker` configs.
### 0.17 to 0.18
The `sapper/webpack/config.js` file (required in the `webpack/*.config.js` files) is now `sapper/config/webpack.js`.
### 0.14 to 0.15
This release changed how routing is handled, resulting in a number of changes.
Instead of a single `App.html` component, you can place `_layout.html` components in any directory under `routes`. You should move `app/App.html` to `routes/_layout.html` and modify it like so:
```diff
-<!-- app/App.html -->
+<!-- routes/_layout.html -->
-<Nav path={props.path}/>
+<Nav segment={child.segment}/>
-<svelte:component this={Page} {...props}/>
+<svelte:component this={child.component} {...child.props}/>
```
You will then need to remove `App` from your client and server entry points, and replace `routes` with `manifest`:
```diff
// app/client.js
import { init } from 'sapper/runtime.js';
-import { routes } from './manifest/client.js';
-import App from './App.html';
+import { manifest } from './manifest/client.js';
init({
target: document.querySelector('#sapper'),
- routes,
- App
+ manifest
});
```
```diff
// app/server.js
import sirv from 'sirv';
import polka from 'polka';
import sapper from 'sapper';
import compression from 'compression';
-import { routes } from './manifest/server.js';
-import App from './App.html';
+import { manifest } from './manifest/server.js';
polka()
.use(
compression({ threshold: 0 }),
sirv('assets'),
- sapper({ routes, App })
+ sapper({ manifest })
)
.listen(process.env.PORT)
.catch(err => {
console.log('error', err);
});
```
`preload` functions no longer take the entire request object on the server; instead, they receive the same argument as on the client.
### 0.13 to 0.14
The `4xx.html` and `5xx.html` error pages have been replaced with a single page, `_error.html`. In addition to the regular `params`, `query` and `path` props, it receives `status` and `error`.
### 0.11 to 0.12
In earlier versions, each page was a completely standalone component. Upon navigation, the entire page would be torn down and a new one created. Typically, each page would import a shared `<Layout>` component to achieve visual consistency.
As of 0.12, this changes: we have a single `<App>` component, defined in `app/App.html`, which controls the rendering of the rest of the app. See [sapper-template](https://github.com/sveltejs/sapper-template/blob/master/app/App.html) for an example.
This component is rendered with the following values:
* `Page` — a component constructor for the current page
* `props` — an object with `params`, `query`, and any data returned from the page's `preload` function
* `preloading``true` during preload, `false` otherwise. Useful for showing progress indicators
Sapper needs to know about your app component. To that end, you will need to modify your `app/server.js` and `app/client.js`:
```diff
// app/server.js
import polka from 'polka';
import sapper from 'sapper';
import serve from 'serve-static';
import { routes } from './manifest/server.js';
+import App from './App.html';
polka()
.use(
serve('assets'),
- sapper({ routes })
+ sapper({ App, routes })
)
.listen(process.env.PORT);
```
```diff
// app/client.js
import { init } from 'sapper/runtime.js';
import { routes } from './manifest/client.js';
+import App from './App.html';
-init(target: document.querySelector('#sapper'), routes);
+init({
+ target: document.querySelector('#sapper'),
+ routes,
+ App
+});
```
Once your `App.html` has been created and your server and client apps updated, you can remove any `<Layout>` components from your individual pages.
### <0.9 to 0.10
##### app/template.html
* Your `<head>` element must contain `%sapper.base%` (see ([base URLs](docs#Base_URLs))
* Remove references to your service worker; this is now handled by `%sapper.scripts%`
##### Pages
* Your `preload` functions should now use `this.fetch` instead of `fetch`. `this.fetch` allows you to make credentialled requests on the server, and means that you no longer need to create a `global.fetch` object in `app/server.js`.
### 0.6 to 0.7
Consult [sapper-template](https://github.com/sveltejs/sapper-template) for full examples of all the below points.
##### package.json
To start a dev server, use `sapper dev` rather than `node server.js`. In all likelihood, your package.json will have an `npm run dev` script that will need to be updated.
##### Entry points
As of version 0.7, Sapper expects to find your entry points — for client, server and service worker — in an `app` folder. Instead of using magically-injected `__variables__`, each entry point imports from its corresponding file in the `app/manifests` folder. These are automatically generated by Sapper.
```js
// app/client.js (formerly templates/main.js)
import { init } from 'sapper/runtime.js';
import { routes } from './manifest/client.js';
init(document.querySelector('#sapper'), routes);
if (module.hot) module.hot.accept(); // enable hot reloading
```
```js
// app/server.js (formerly server.js)
// Note that we're now using ES module syntax, because this
// file is processed by webpack like the rest of your app
import sapper from 'sapper';
import { routes } from './manifest/server.js';
// ..other imports
// we now pass the `routes` object to the Sapper middleware
app.use(sapper({
routes
}));
```
```js
// app/service-worker.js (formerly templates/service-worker.js)
import { assets, shell, timestamp, routes } from './manifest/service-worker.js';
// replace e.g. `__assets__` with `assets` in the rest of the file
```
##### Templates and error pages
In previous versions, we had `templates/2xx.html`, `templates/4xx.html` and `templates/5xx.html`. Now, we have a single template, `app/template.html`, which should look like your old `templates/2xx.html`.
For handling error states, we have a 'special' route: `routes/_error.html`.
This page is just like any other, except that it will get rendered whenever an error states is reached. The component has access to `status` and `error` values.
Note that you can now use `this.error(statusCode, error)` inside your `preload` functions.
##### Webpack configs
Your webpack configs now live in a `webpack` directory:
* `webpack.client.config.js` is now `webpack/client.config.js`
* `webpack.server.config.js` is now `webpack/server.config.js`
If you have a service worker, you should also have a `webpack/service-worker.config.js` file. See [sapper-template](https://github.com/sveltejs/sapper-template) for an example.

4
site/cypress.json Normal file
View File

@@ -0,0 +1,4 @@
{
"baseUrl": "http://localhost:3000",
"video": false
}

View File

@@ -0,0 +1,5 @@
{
"name": "Using fixtures to represent data",
"email": "hello@cypress.io",
"body": "Fixtures are a great way to mock data for responses to routes"
}

View File

@@ -0,0 +1,19 @@
describe('Sapper template app', () => {
beforeEach(() => {
cy.visit('/')
});
it('has the correct <h1>', () => {
cy.contains('h1', 'Great success!')
});
it('navigates to /about', () => {
cy.get('nav a').contains('about').click();
cy.url().should('include', '/about');
});
it('navigates to /blog', () => {
cy.get('nav a').contains('blog').click();
cy.url().should('include', '/blog');
});
});

View File

@@ -0,0 +1,17 @@
// ***********************************************************
// This example plugins/index.js can be used to load plugins
//
// You can change the location of this file or turn off loading
// the plugins file with the 'pluginsFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/plugins-guide
// ***********************************************************
// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)
module.exports = (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
}

View File

@@ -0,0 +1,25 @@
// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add("login", (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This is will overwrite an existing command --
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })

View File

@@ -0,0 +1,20 @@
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import commands.js using ES2015 syntax:
import './commands'
// Alternatively you can use CommonJS syntax:
// require('./commands')

3264
site/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

43
site/package.json Normal file
View File

@@ -0,0 +1,43 @@
{
"name": "sapper.svelte.dev",
"description": "sapper.svelte.dev",
"version": "0.0.1",
"scripts": {
"dev": "sapper dev",
"export": "sapper export --legacy",
"stage": "netlify deploy --dir=__sapper__/export",
"deploy": "netlify deploy --dir=__sapper__/export --prod",
"prestage": "npm run export",
"predeploy": "npm run export",
"cy:run": "cypress run",
"cy:open": "cypress open",
"test": "run-p --race dev cy:run"
},
"dependencies": {
"@polka/send": "^0.4.0",
"compression": "^1.7.4",
"highlight.js": "^9.15.6",
"marked": "^0.6.2",
"polka": "^0.5.2",
"prismjs": "^1.16.0",
"sirv": "^0.4.2"
},
"devDependencies": {
"@babel/core": "^7.4.4",
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/plugin-transform-runtime": "^7.4.4",
"@babel/preset-env": "^7.4.4",
"@babel/runtime": "^7.4.4",
"@sveltejs/site-kit": "^1.0.4",
"npm-run-all": "^4.1.5",
"rollup": "^1.11.3",
"rollup-plugin-babel": "^4.3.2",
"rollup-plugin-commonjs": "^9.3.4",
"rollup-plugin-node-resolve": "^4.2.3",
"rollup-plugin-replace": "^2.2.0",
"rollup-plugin-svelte": "^5.0.3",
"rollup-plugin-terser": "^4.0.4",
"sapper": "alpha",
"svelte": "^3.2.2"
}
}

87
site/rollup.config.js Normal file
View File

@@ -0,0 +1,87 @@
import resolve from 'rollup-plugin-node-resolve';
import replace from 'rollup-plugin-replace';
import commonjs from 'rollup-plugin-commonjs';
import svelte from 'rollup-plugin-svelte';
import babel from 'rollup-plugin-babel';
import { terser } from 'rollup-plugin-terser';
import config from 'sapper/config/rollup.js';
import pkg from './package.json';
const mode = process.env.NODE_ENV;
const dev = mode === 'development';
const legacy = !!process.env.SAPPER_LEGACY_BUILD;
export default {
client: {
input: config.client.input(),
output: config.client.output(),
plugins: [
replace({
'process.browser': true,
'process.env.NODE_ENV': JSON.stringify(mode)
}),
svelte({
dev,
hydratable: true,
emitCss: true
}),
resolve(),
commonjs(),
legacy && babel({
extensions: ['.js', '.mjs', '.html', '.svelte'],
runtimeHelpers: true,
exclude: ['node_modules/@babel/**'],
presets: [
['@babel/preset-env', {
targets: '> 0.25%, not dead'
}]
],
plugins: [
'@babel/plugin-syntax-dynamic-import',
['@babel/plugin-transform-runtime', {
useESModules: true
}]
]
}),
!dev && terser({
module: true
})
],
},
server: {
input: config.server.input(),
output: config.server.output(),
plugins: [
replace({
'process.browser': false,
'process.env.NODE_ENV': JSON.stringify(mode)
}),
svelte({
generate: 'ssr',
dev
}),
resolve(),
commonjs()
],
external: Object.keys(pkg.dependencies).concat(
require('module').builtinModules || Object.keys(process.binding('natives'))
),
},
serviceworker: {
input: config.serviceworker.input(),
output: config.serviceworker.output(),
plugins: [
resolve(),
replace({
'process.browser': true,
'process.env.NODE_ENV': JSON.stringify(mode)
}),
commonjs(),
!dev && terser()
]
}
};

6
site/src/client.js Normal file
View File

@@ -0,0 +1,6 @@
import '@sveltejs/site-kit/base.css';
import * as sapper from '@sapper/app';
sapper.start({
target: document.querySelector('#sapper')
});

View File

@@ -0,0 +1,71 @@
<script>
const dev = process.env.NODE_ENV === 'development';
export let status;
export let error;
// we don't want to use <svelte:window bind:online> here,
// because we only care about the online state when
// the page first loads
let online = typeof navigator !== 'undefined'
? navigator.onLine
: true;
</script>
<style>
.container {
padding: var(--top-offset) var(--side-nav) 6rem var(--side-nav);
}
h1, p { margin: 0 auto }
h1 {
font-size: 2.8em;
font-weight: 300;
margin: 0 0 0.5em 0;
}
p { margin: 1em auto }
.error {
background-color: #da106e;
color: white;
padding: 12px 16px;
font: 600 16px/1.7 var(--font);
border-radius: 2px;
}
/* @media (min-width: 480px) {
h1 { font-size: 4em }
} */
</style>
<svelte:head>
<title>{status}</title>
</svelte:head>
<div class="container">
{#if online}
<h1>Yikes!</h1>
{#if error.message}
<p class="error">{status}: {error.message}</p>
{:else}
<p class="error">Encountered a {status} error</p>
{/if}
{#if dev && error.stack}
<pre>{error.stack}</pre>
{:else}
{#if status >= 500}
<p>Please try reloading the page.</p>
{/if}
<p>If the error persists, please drop by <a href="https://svelte.dev/chat">Discord chatroom</a> and let us know, or raise an issue on <a href="https://github.com/sveltejs/svelte">GitHub</a>. Thanks!</p>
{/if}
{:else}
<h1>It looks like you're offline</h1>
<p>Reload the page once you've found the internet.</p>
{/if}
</div>

View File

@@ -0,0 +1,40 @@
<script>
import { page } from '@sapper/app';
import { Icons, Icon, Nav, NavItem } from '@sveltejs/site-kit';
export let segment;
</script>
<style>
:global(html) {
--prime: rgb(21, 151, 148) !important; /* TODO remove .theme-default from shared, so we don't need !important */
}
main {
position: relative;
margin: 0 auto;
/* padding: var(--nav-h) var(--side-nav) 0 var(--side-nav); */
padding: var(--nav-h) 0 0 0;
overflow-x: hidden;
}
</style>
<Icons/>
<Nav {segment} {page} logo="sapper-logo-horizontal.svg">
<NavItem segment="docs">Docs</NavItem>
<NavItem external="https://svelte.dev">Svelte</NavItem>
<NavItem external="https://svelte.dev/chat" title="Discord Chat">
<Icon name="message-square"/>
</NavItem>
<NavItem external="https://github.com/sveltejs/sapper" title="GitHub Repo">
<Icon name="github"/>
</NavItem>
</Nav>
<main>
<slot></slot>
</main>

View File

@@ -0,0 +1,14 @@
import send from '@polka/send';
import generate_docs from '../../utils/generate_docs.js';
let json;
export function get(req, res) {
if (!json || process.env.NODE_ENV !== 'production') {
json = JSON.stringify(generate_docs('docs')); // TODO it errors if I send the non-stringified value
}
send(res, 200, json, {
'Content-Type': 'application/json'
});
}

View File

@@ -0,0 +1,22 @@
<script context="module">
export async function preload() {
const sections = await this.fetch(`docs.json`).then(r => r.json());
return { sections };
}
</script>
<script>
import { Docs } from '@sveltejs/site-kit'
export let sections;
</script>
<svelte:head>
<title>Docs • Sapper</title>
<meta name="twitter:title" content="Sapper docs">
<meta name="twitter:description" content="The next small thing in web development">
<meta name="Description" content="The next small thing in web development">
</svelte:head>
<Docs {sections}/>

View File

@@ -0,0 +1,64 @@
<script>
import { Hero, Blurb } from '@sveltejs/site-kit';
</script>
<style>
</style>
<svelte:head>
<title>Sapper • The next small thing in web development</title>
</svelte:head>
<Hero
title="Sapper"
tagline="The next small thing in web development"
outline="sapper-logo-outline.svg"
logotype="sapper-logotype.svg"
/>
<Blurb>
<a href="https://svelte.dev" slot="one">
<h2>Powered by Svelte</h2>
<p>Sapper is an application framework powered by Svelte — build bigger apps with a smaller footprint</p>
<span class="learn-more">learn more</span>
</a>
<a href="docs" slot="two">
<h2>Best of both worlds</h2>
<p>All the SEO and progressive enhancement of a server-rendered app, with the slick navigation of an SPA</p>
<span class="learn-more">learn more</span>
</a>
<a href="docs" slot="three">
<h2>Build fast</h2>
<p>Hit the ground running with advanced routing, server-side rendering, code-splitting, offline support and more</p>
<span class="learn-more">learn more</span>
</a>
<div class="description" slot="what">
<p>Sapper is a framework for building web applications of all sizes, with a beautiful development experience and flexible filesystem-based routing.</p>
<p>Unlike single-page apps, Sapper doesn't compromise on SEO, progressive enhancement or the initial load experience — but unlike traditional server-rendered apps, navigation is instantaneous for that app-like feel.</p>
<p><a href="https://svelte.dev/blog/sapper-towards-the-ideal-web-app-framework">Read the introductory blog post</a> to learn more.</p>
</div>
<div style="grid-area: start; display: flex; flex-direction: column; min-width: 0" slot="how">
<pre class="language-bash" style="margin: 0 0 1em 0; min-width: 0; min-height: 0">
# for Rollup
npx degit sveltejs/sapper-template#rollup my-app
# for webpack
npx degit sveltejs/sapper-template#webpack my-app
cd my-app
npm install
npm run dev & open http://localhost:3000
</pre>
<p class="cta"><a rel="prefetch" href="docs">Learn Sapper</a></p>
</div>
</Blurb>

View File

@@ -0,0 +1,14 @@
import send from '@polka/send';
import generate_docs from '../../utils/generate_docs.js';
let json;
export function get(req, res) {
if (!json || process.env.NODE_ENV !== 'production') {
json = JSON.stringify(generate_docs('migrating')); // TODO it errors if I send the non-stringified value
}
send(res, 200, json, {
'Content-Type': 'application/json'
});
}

View File

@@ -0,0 +1,22 @@
<script context="module">
export async function preload() {
const sections = await this.fetch(`migrating.json`).then(r => r.json());
return { sections };
}
</script>
<script>
import { Docs } from '@sveltejs/site-kit'
export let sections;
</script>
<svelte:head>
<title>Migration • Sapper</title>
<meta name="twitter:title" content="Sapper migration guides">
<meta name="twitter:description" content="The next small thing in web development">
<meta name="Description" content="The next small thing in web development">
</svelte:head>
<Docs {sections}/>

17
site/src/server.js Normal file
View File

@@ -0,0 +1,17 @@
import sirv from 'sirv';
import polka from 'polka';
import compression from 'compression';
import * as sapper from '@sapper/server';
const { PORT, NODE_ENV } = process.env;
const dev = NODE_ENV === 'development';
polka() // You can also use Express
.use(
compression({ threshold: 0 }),
sirv('static', { dev }),
sapper.middleware()
)
.listen(PORT, err => {
if (err) console.log('error', err);
});

View File

@@ -0,0 +1,82 @@
import { timestamp, files, shell, routes } from '@sapper/service-worker';
const ASSETS = `cache${timestamp}`;
// `shell` is an array of all the files generated by the bundler,
// `files` is an array of everything in the `static` directory
const to_cache = shell.concat(files);
const cached = new Set(to_cache);
self.addEventListener('install', event => {
event.waitUntil(
caches
.open(ASSETS)
.then(cache => cache.addAll(to_cache))
.then(() => {
self.skipWaiting();
})
);
});
self.addEventListener('activate', event => {
event.waitUntil(
caches.keys().then(async keys => {
// delete old caches
for (const key of keys) {
if (key !== ASSETS) await caches.delete(key);
}
self.clients.claim();
})
);
});
self.addEventListener('fetch', event => {
if (event.request.method !== 'GET' || event.request.headers.has('range')) return;
const url = new URL(event.request.url);
// don't try to handle e.g. data: URIs
if (!url.protocol.startsWith('http')) return;
// ignore dev server requests
if (url.hostname === self.location.hostname && url.port !== self.location.port) return;
// always serve static files and bundler-generated assets from cache
if (url.host === self.location.host && cached.has(url.pathname)) {
event.respondWith(caches.match(event.request));
return;
}
// for pages, you might want to serve a shell `service-worker-index.html` file,
// which Sapper has generated for you. It's not right for every
// app, but if it's right for yours then uncomment this section
/*
if (url.origin === self.origin && routes.find(route => route.pattern.test(url.pathname))) {
event.respondWith(caches.match('/service-worker-index.html'));
return;
}
*/
if (event.request.cache === 'only-if-cached') return;
// for everything else, try the network first, falling back to
// cache if the user is offline. (If the pages never change, you
// might prefer a cache-first approach to a network-first one.)
event.respondWith(
caches
.open(`offline${timestamp}`)
.then(async cache => {
try {
const response = await fetch(event.request);
cache.put(event.request, response.clone());
return response;
} catch(err) {
const response = await cache.match(event.request);
if (response) return response;
throw err;
}
})
);
});

52
site/src/template.html Normal file
View File

@@ -0,0 +1,52 @@
<!doctype html>
<html lang='en' class="theme-default typo-default">
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width,initial-scale=1.0'>
<meta name='theme-color' content='#159794'>
%sapper.base%
<link href=prism.css rel=stylesheet>
<link rel='manifest' href='manifest.json'>
<link rel='icon' type='image/png' href='favicon.png'>
<meta name='twitter:card' content='summary_large_image'>
<meta name='twitter:site' content='@sveltejs'>
<meta name='twitter:creator' content='@sveltejs'>
<meta name='twitter:image' content='https://sapper.svelte.dev/images/twitter-card.png'>
<!-- Sapper generates a <style> tag containing critical CSS
for the current page. CSS for the rest of the app is
lazily loaded when it precaches secondary pages -->
%sapper.styles%
<style>
.hljs, .hljs-subst { color: #333; }
.hljs-comment { color: #999; }
.hljs-tag { color: #170; }
.hljs-keyword { color: #708; }
.hljs-attr { color: #333; }
.hljs-number { color: #164; }
.hljs-type, .hljs-string, .hljs-selector-id, .hljs-selector-class, .hljs-quote, .hljs-template-tag, .hljs-deletion { color: rgb(16,94,16); }
.hljs-title, .hljs-section { color: rgb(16,94,16); }
.hljs-literal { color: #170; }
.hljs-meta { color: #555; }
.hljs-meta-string { color: #555; }
</style>
<!-- This contains the contents of the <svelte:head> component, if
the current page has one -->
%sapper.head%
</head>
<body>
<!-- The application will be rendered inside this element,
because `app/client.js` references it -->
<div id='sapper'>%sapper.html%</div>
<!-- Sapper creates a <script> tag containing `app/client.js`
and anything else it needs to hydrate the app and
initialise the router -->
%sapper.scripts%
</body>
</html>

View File

@@ -0,0 +1,158 @@
// TODO put this in site-kit? svelte.dev uses Prism instead of hljs
import fs from 'fs';
import path from 'path';
import { SLUG_SEPARATOR, SLUG_PRESERVE_UNICODE } from '../../config';
import { extract_frontmatter, extract_metadata, langs, link_renderer } from '@sveltejs/site-kit/utils/markdown.js';
import { make_session_slug_processor } from '@sveltejs/site-kit/utils/slug';
import marked from 'marked';
import hljs from 'highlight.js';
const escaped = {
'"': '&quot;',
"'": '&#39;',
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
};
const unescaped = Object.keys(escaped).reduce(
(unescaped, key) => ((unescaped[escaped[key]] = key), unescaped),
{}
);
function unescape(str) {
return String(str).replace(/&.+?;/g, match => unescaped[match] || match);
}
const block_types = [
'blockquote',
'html',
'heading',
'hr',
'list',
'listitem',
'paragraph',
'table',
'tablerow',
'tablecell'
];
export default function generate_docs(dir) {
const make_slug = make_session_slug_processor({
separator: SLUG_SEPARATOR,
preserve_unicode: SLUG_PRESERVE_UNICODE
});
return fs
.readdirSync(`content/${dir}`)
.filter(file => file[0] !== '.' && path.extname(file) === '.md')
.map(file => {
const markdown = fs.readFileSync(`content/${dir}/${file}`, 'utf-8');
const { content, metadata } = extract_frontmatter(markdown);
const section_slug = make_slug(metadata.title);
const subsections = [];
const renderer = new marked.Renderer();
let block_open = false;
renderer.link = link_renderer;
renderer.hr = () => {
block_open = true;
return '<div class="side-by-side"><div class="copy">';
};
renderer.code = (source, lang) => {
source = source.replace(/^ +/gm, match =>
match.split(' ').join('\t')
);
const lines = source.split('\n');
const meta = extract_metadata(lines[0], lang);
let prefix = '';
// let class_name = 'code-block';
let class_name = '';
if (meta) {
source = lines.slice(1).join('\n');
const filename = meta.filename || (lang === 'html' && 'App.svelte');
if (filename) {
prefix = `<span class='filename'>${prefix} ${filename}</span>`;
class_name += ' named';
}
}
if (meta && meta.hidden) {
return '';
}
const plang = langs[lang];
const { value: highlighted } = hljs.highlight(lang, source);
// const highlighted = PrismJS.highlight(
// source,
// PrismJS.languages[plang],
// lang
// );
const html = `<div class='${class_name}'>${prefix}<pre class='language-${plang}'><code>${highlighted}</code></pre></div>`;
if (block_open) {
block_open = false;
return `</div><div class="code">${html}</div></div>`;
}
return html;
};
renderer.heading = (text, level, rawtext) => {
const slug = level <= 4 && make_slug(rawtext);
if (level === 3 || level === 4) {
const title = unescape(
text
.replace(/<\/?code>/g, '')
.replace(/\.(\w+)(\((.+)?\))?/, (m, $1, $2, $3) => {
if ($3) return `.${$1}(...)`;
if ($2) return `.${$1}()`;
return `.${$1}`;
})
);
subsections.push({ slug, title, level });
}
return `
<h${level}>
<span id="${slug}" class="offset-anchor" ${level > 4 ? 'data-scrollignore' : ''}></span>
<a href="${dir}#${slug}" class="anchor" aria-hidden="true"></a>
${text}
</h${level}>`;
};
block_types.forEach(type => {
const fn = renderer[type];
renderer[type] = function() {
return fn.apply(this, arguments);
};
});
const html = marked(content, { renderer });
const hashes = {};
return {
html: html.replace(/@@(\d+)/g, (m, id) => hashes[id] || m),
metadata,
subsections,
slug: section_slug,
file,
};
});
}

BIN
site/static/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" viewBox="0 0 24 24">
<g fill="none" stroke="white" stroke-width="2">
<line x1='5' y1='12' x2='19' y2='12' />
<polyline points='12 5 19 12 12 19' />
</g>
</svg>

After

Width:  |  Height:  |  Size: 275 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" viewBox="0 0 24 24">
<path style="fill: #aa1e1e" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" />
</svg>

After

Width:  |  Height:  |  Size: 229 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" viewBox="0 0 24 24">
<path style="stroke: #676778; stroke-width: 2; fill: none" d="M2,8 L12,16 L22,8"/>
</svg>

After

Width:  |  Height:  |  Size: 221 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" viewBox="0 0 24 24">
<path style="fill: #aa1e1e" d="M19.5,3.09L20.91,4.5L16.41,9H20V11H13V4H15V7.59L19.5,3.09M20.91,19.5L19.5,20.91L15,16.41V20H13V13H20V15H16.41L20.91,19.5M4.5,3.09L9,7.59V4H11V11H4V9H7.59L3.09,4.5L4.5,3.09M3.09,19.5L7.59,15H4V13H11V20H9V16.41L4.5,20.91L3.09,19.5Z" />
</svg>

After

Width:  |  Height:  |  Size: 405 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" viewBox="0 0 24 24">
<path fill="#aa1e1e" d="M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z" />
</svg>

After

Width:  |  Height:  |  Size: 212 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" viewBox="0 0 24 24">
<path fill="#999" d="M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z" />
</svg>

After

Width:  |  Height:  |  Size: 213 B

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" viewBox="0 0 24 24">
<g style="fill: none; stroke: white; stroke-width: 2;">
<path d='M20 14.66V20a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h5.34' />
<polygon points='18 2 22 6 12 16 8 16 8 12 18 2' />
</g>
</svg>

After

Width:  |  Height:  |  Size: 333 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" viewBox="0 0 24 24">
<path style="fill: #aa1e1e" d="M9.5,13.09L10.91,14.5L6.41,19H10V21H3V14H5V17.59L9.5,13.09M10.91,9.5L9.5,10.91L5,6.41V10H3V3H10V5H6.41L10.91,9.5M14.5,13.09L19,17.59V14H21V21H14V19H17.59L13.09,14.5L14.5,13.09M13.09,9.5L17.59,5H14V3H21V10H19V6.41L14.5,10.91L13.09,9.5Z" />
</svg>

After

Width:  |  Height:  |  Size: 411 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" viewBox="0 0 24 24">
<path fill="#aa1e1e" d="M12,5C16.97,5 21,7.69 21,11C21,12.68 19.96,14.2 18.29,15.29C19.36,14.42 20,13.32 20,12.13C20,9.29 16.42,7 12,7V10L8,6L12,2V5M12,19C7.03,19 3,16.31 3,13C3,11.32 4.04,9.8 5.71,8.71C4.64,9.58 4,10.68 4,11.88C4,14.71 7.58,17 12,17V14L16,18L12,22V19Z" />
</svg>

After

Width:  |  Height:  |  Size: 415 B

Some files were not shown because too many files have changed in this diff Show More