diff --git a/.eslintignore b/.eslintignore index 786cea1a0..a9cb8bddc 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,3 @@ server/components server/routes -shared/routes/Repl/examples.js \ No newline at end of file +universal/routes/Repl/examples.js \ No newline at end of file diff --git a/.gitignore b/.gitignore index f9fa58473..f90f5ee9a 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,7 @@ public/blog public/codemirror* public/rollup.browser.js public/svelte* -shared/components/guide-summary.json -shared/routes/Repl/examples.js +universal/components/guide-summary.json +universal/routes/Repl/examples.js server/components server/routes \ No newline at end of file diff --git a/client/rollup.config.codemirror.js b/client/rollup.config.codemirror.js index c35729bb3..7bd299f5c 100644 --- a/client/rollup.config.codemirror.js +++ b/client/rollup.config.codemirror.js @@ -2,7 +2,7 @@ import nodeResolve from 'rollup-plugin-node-resolve'; import commonjs from 'rollup-plugin-commonjs'; import uglify from 'rollup-plugin-uglify'; -const dev = !!process.env.DEV; +const dev = !!process.env.ROLLUP_WATCH; export default { entry: 'client/src/codemirror.js', diff --git a/client/rollup.config.js b/client/rollup.config.js index f7ef32b1e..1d50fdbe2 100644 --- a/client/rollup.config.js +++ b/client/rollup.config.js @@ -10,10 +10,10 @@ import uglify from 'rollup-plugin-uglify'; import buble from 'rollup-plugin-buble'; const CleanCSS = require( 'clean-css' ); -const dev = !!process.env.DEV; +const dev = !!process.env.ROLLUP_WATCH; const root = path.resolve( '.' ); -console.log( `creating ${dev ? 'development' : 'production'} bundle` ); +console.log( `creating ${dev ? 'development' : 'production'} client bundle` ); export default { entry: 'client/src/main.js', @@ -25,7 +25,7 @@ export default { commonjs(), svelte({ css ( css ) { - let styles = fs.readFileSync( `${root}/server/templates/main.css`, 'utf-8' ) + let styles = fs.readFileSync( `${root}/templates/main.css`, 'utf-8' ) .replace( '__components__', css ); if ( dev ) { diff --git a/client/src/main.js b/client/src/main.js index e2795d56d..6e0dcb718 100644 --- a/client/src/main.js +++ b/client/src/main.js @@ -1,10 +1,10 @@ import roadtrip from 'roadtrip'; -import Index from '../../shared/routes/Index.html'; -import BlogIndex from '../../shared/routes/BlogIndex.html'; -import BlogPost from '../../shared/routes/BlogPost.html'; -import Guide from '../../shared/routes/Guide.html'; -import Repl from '../../shared/routes/Repl/index.html'; -import Nav from '../../shared/components/Nav.html'; +import Index from '../../universal/routes/Index.html'; +import BlogIndex from '../../universal/routes/BlogIndex.html'; +import BlogPost from '../../universal/routes/BlogPost.html'; +import Guide from '../../universal/routes/Guide.html'; +import Repl from '../../universal/routes/Repl/index.html'; +import Nav from '../../universal/components/Nav.html'; import * as store from './store.js'; const header = document.querySelector( 'header' ); diff --git a/package.json b/package.json index 48b761d03..be7a3e415 100644 --- a/package.json +++ b/package.json @@ -3,10 +3,10 @@ "version": "1.0.0", "description": "Docs and examples for Svelte", "scripts": { - "start": "node server", + "start": "node server/dist", "bundle": "rollup -c", "prebundle": "rm -rf client/dist && mkdir -p client/dist && rm -rf service-worker/dist && mkdir -p service-worker/dist", - "dev": "export DEV=true && rollup -c -w & node scripts/prep && node server", + "dev": "rollup -c -w & node scripts/prep && npm start", "prep": "npm run zip && node scripts/prep && npm run bundle", "zip": "sh scripts/zip.sh", "prestage": "npm run prep", @@ -33,11 +33,9 @@ "devDependencies": { "chalk": "^1.1.3", "clean-css": "^4.0.12", - "compression": "^1.6.2", "eslint": "^4.0.0", "eslint-plugin-html": "^3.0.0", "eslint-plugin-import": "^2.2.0", - "express": "^4.15.2", "glob": "^7.1.1", "highlight.js": "^9.11.0", "html-entities": "^1.2.1", @@ -50,7 +48,7 @@ "rollup-plugin-json": "^2.1.1", "rollup-plugin-node-resolve": "^3.0.0", "rollup-plugin-replace": "^1.1.1", - "rollup-plugin-svelte": "^2.0.0", + "rollup-plugin-svelte": "^2.0.1", "rollup-plugin-uglify": "^2.0.1", "rollup-watch": "^4.0.0", "uglify-js": "^3.0.0" @@ -58,11 +56,13 @@ "dependencies": { "codemirror": "^5.25.2", "curl-amd": "^0.8.12", + "compression": "^1.6.2", + "express": "^4.15.2", "file-saver": "^1.3.3", "jszip": "^3.1.3", "locate-character": "^2.0.0", "roadtrip": "^0.5.1", - "rollup": "^0.42.0", + "rollup": "^0.43.0", "sourcemap-codec": "^1.3.1", "svelte": "^1.21.0" }, diff --git a/rollup.config.js b/rollup.config.js index a72c45c4d..26147243a 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,9 +1,11 @@ import client from './client/rollup.config.js'; import codemirror from './client/rollup.config.codemirror.js'; import serviceWorker from './service-worker/rollup.config.js'; +import server from './server/rollup.config.js'; export default [ client, codemirror, - serviceWorker + serviceWorker, + server ]; \ No newline at end of file diff --git a/scripts/prep/build-components.js b/scripts/prep/build-components.js deleted file mode 100644 index efb3a5c70..000000000 --- a/scripts/prep/build-components.js +++ /dev/null @@ -1,38 +0,0 @@ -const fs = require( 'fs' ); -const path = require( 'path' ); -const rollup = require( 'rollup' ); -const svelte = require( 'rollup-plugin-svelte' ); -const resolve = require( 'rollup-plugin-node-resolve' ); -const json = require( 'rollup-plugin-json' ); -const { mkdirp } = require( './utils.js' ); - -const root = path.resolve( __dirname, '../..' ); - -// generate bundles for each route, plus the nav -[ - 'routes/Index', - 'routes/BlogIndex', - 'routes/BlogPost', - 'routes/Guide', - 'routes/Repl/index', - 'components/Nav' -].forEach( entry => { - rollup.rollup({ - entry: `${root}/shared/${entry}.html`, - plugins: [ - resolve(), - json(), - svelte({ - generate: 'ssr', - css: false - }) - ] - }).then( bundle => { - const { code } = bundle.generate({ format: 'cjs' }); - - const dest = `${root}/server/${entry}.js`; - mkdirp( path.dirname( dest ) ); - - fs.writeFileSync( dest, code ); - }); -}); \ No newline at end of file diff --git a/scripts/prep/build-examples.js b/scripts/prep/build-examples.js index 4fa528ac5..f79c08b91 100644 --- a/scripts/prep/build-examples.js +++ b/scripts/prep/build-examples.js @@ -53,7 +53,7 @@ manifest.forEach( group => { }); }); -fs.writeFileSync( `${root}/shared/routes/Repl/examples.js`, ` +fs.writeFileSync( `${root}/universal/routes/Repl/examples.js`, ` // this file is auto-generated, don't edit it export const exampleGroups = ${JSON.stringify( summary )}; export const redirects = ${JSON.stringify( redirects )}; diff --git a/scripts/prep/build-guide.js b/scripts/prep/build-guide.js index 9b4e78076..9a0a61c9e 100644 --- a/scripts/prep/build-guide.js +++ b/scripts/prep/build-guide.js @@ -132,4 +132,4 @@ const sections = fs.readdirSync( `${root}/guide` ) }); fs.writeFileSync( `${root}/public/guide.json`, JSON.stringify( sections ) ); -fs.writeFileSync( `${root}/shared/components/guide-summary.json`, JSON.stringify( sections ) ); \ No newline at end of file +fs.writeFileSync( `${root}/universal/components/guide-summary.json`, JSON.stringify( sections ) ); \ No newline at end of file diff --git a/scripts/prep/index.js b/scripts/prep/index.js index 63a493e48..301afd07c 100644 --- a/scripts/prep/index.js +++ b/scripts/prep/index.js @@ -1,4 +1,3 @@ -require( './build-components.js' ); require( './build-examples.js' ); require( './build-repl.js' ); require( './build-blog.js' ); diff --git a/server/rollup.config.js b/server/rollup.config.js new file mode 100644 index 000000000..066e6171b --- /dev/null +++ b/server/rollup.config.js @@ -0,0 +1,25 @@ +import json from 'rollup-plugin-json'; +import svelte from 'rollup-plugin-svelte'; +import replace from 'rollup-plugin-replace'; +import pkg from '../package.json'; + +const dev = !!process.env.ROLLUP_WATCH; + +export default { + entry: 'server/src/index.js', + dest: 'server/dist/index.js', + format: 'cjs', + external: Object.keys(pkg.dependencies).concat([ + 'path', 'fs' + ]), + plugins: [ + json(), + svelte({ + generate: 'ssr', + css: false + }), + replace({ + __dev__: !!dev + }) + ] +}; \ No newline at end of file diff --git a/server/index.js b/server/src/index.js similarity index 53% rename from server/index.js rename to server/src/index.js index 5a8d7d536..55fe8b485 100644 --- a/server/index.js +++ b/server/src/index.js @@ -1,53 +1,28 @@ -const path = require( 'path' ); -const express = require( 'express' ); -const compression = require( 'compression' ); -const servePage = require( './servePage.js' ); +import path from 'path'; +import express from 'express'; +import compression from 'compression'; +import servePage from './servePage.js'; + +import Nav from '../../universal/components/Nav.html'; +import Index from '../../universal/routes/Index.html'; +import BlogIndex from '../../universal/routes/BlogIndex.html'; +import BlogPost from '../../universal/routes/BlogPost.html'; +import Guide from '../../universal/routes/Guide.html'; +import Repl from '../../universal/routes/Repl/index.html'; const dev = !!process.env.DEV; const app = express(); -const root = path.resolve( __dirname, '..' ); +const root = path.resolve( '.' ); app.use( compression({ threshold: 0 }) ); -function renderComponent ( file, data ) { - if ( dev ) { - const rollup = require( 'rollup' ); - const json = require( 'rollup-plugin-json' ); - const svelte = require( 'rollup-plugin-svelte' ); - const resolve = require( 'rollup-plugin-node-resolve' ); - - return rollup.rollup({ - entry: `${root}/shared/${file}.html`, - plugins: [ - resolve(), - json(), - svelte({ - generate: 'ssr', - css: false - }) - ] - }).then( bundle => { - const { code } = bundle.generate({ - format: 'iife', - moduleName: 'SvelteComponent' - }); - - const SvelteComponent = eval( `(function () { ${code}; return SvelteComponent; })()` ); - - return SvelteComponent.render( data ); - }); - } - - return require( `./${file}.js` ).render( data ); -} - app.get( '/', ( req, res ) => { servePage( res, { title: 'Svelte • The magical disappearing UI framework', - nav: renderComponent( 'components/Nav', { route: 'index' }), - route: renderComponent( 'routes/Index' ) + nav: Nav.render({ route: 'index' }), + route: Index.render() }).catch( err => { console.log( err.stack ); // eslint-disable-line no-console }); @@ -66,8 +41,8 @@ app.get( '/blog', ( req, res ) => { servePage( res, { title: 'Svelte • The magical disappearing UI framework', - nav: renderComponent( 'components/Nav', { route: 'blog' }), - route: renderComponent( 'routes/BlogIndex', { posts }) + nav: Nav.render({ route: 'blog' }), + route: BlogIndex.render({ posts }) }).catch( err => { console.log( err.stack ); // eslint-disable-line no-console }); @@ -89,8 +64,8 @@ app.get( '/blog/:slug', ( req, res ) => { servePage( res, { title: `${post.metadata.title} • Svelte`, - nav: renderComponent( 'components/Nav', { route: 'blog' }), - route: renderComponent( 'routes/BlogPost', { post }) + nav: Nav.render({ route: 'blog' }), + route: BlogPost.render({ post }) }).catch( err => { console.log( err.stack ); // eslint-disable-line no-console }); @@ -101,8 +76,8 @@ app.get( '/guide', ( req, res ) => { servePage( res, { title: 'Learn Svelte', - nav: renderComponent( 'components/Nav', { route: 'guide' }), - route: renderComponent( 'routes/Guide', { sections }) + nav: Nav.render({ route: 'guide' }), + route: Guide.render({ sections }) }).catch( err => { console.log( err.stack ); // eslint-disable-line no-console }); @@ -111,8 +86,8 @@ app.get( '/guide', ( req, res ) => { app.get( '/repl', ( req, res ) => { servePage( res, { title: 'Svelte REPL', - nav: renderComponent( 'components/Nav', { route: 'repl' }), - route: renderComponent( 'routes/Repl/index' ) // TODO is there any point? just render an empty box instead? + nav: Nav.render({ route: 'repl' }), + route: Repl.render() // TODO is there any point? just render an empty box instead? }).catch( err => { console.log( err.stack ); // eslint-disable-line no-console }); diff --git a/server/servePage.js b/server/src/servePage.js similarity index 78% rename from server/servePage.js rename to server/src/servePage.js index 3208bfc5b..35df9095b 100644 --- a/server/servePage.js +++ b/server/src/servePage.js @@ -1,18 +1,16 @@ -const fs = require( 'fs' ); - -const dev = process.env.DEV; +import fs from 'fs'; // TODO this is unfortunate... would be nice to have a neater solution -const hashed = dev ? { +const hashed = __dev__ ? { bundle: '/bundle.js', css: '/main.css' } : { - bundle: require( './manifests/bundle.json' )[ 'bundle.js' ].replace( 'client/dist', '' ), - css: require( './manifests/css.json' )[ 'main.css' ].replace( 'client/dist', '' ) + bundle: require( '../manifests/bundle.json' )[ 'bundle.js' ].replace( 'client/dist', '' ), + css: require( '../manifests/css.json' )[ 'main.css' ].replace( 'client/dist', '' ) }; -let template = fs.readFileSync( `${__dirname}/templates/index.html`, 'utf-8' ); -if ( !dev ) { +let template = fs.readFileSync( `templates/index.html`, 'utf-8' ); +if ( !__dev__ ) { // TODO come up with a better approach than this massive hack... template = template .replace( '/bundle.js', hashed.bundle ) @@ -52,7 +50,7 @@ const preload = [ `; rel=preload; as=font; type='font/woff2'` ].join( ', ' ); -module.exports = function servePage ( res, data ) { +export default function servePage ( res, data ) { res.writeHead( 200, { 'Content-Type': 'text/html', Link: preload @@ -76,4 +74,4 @@ module.exports = function servePage ( res, data ) { return promise.then( () => { res.end(); }); -}; \ No newline at end of file +} \ No newline at end of file diff --git a/service-worker/rollup.config.js b/service-worker/rollup.config.js index 7e08e7d71..92f617dde 100644 --- a/service-worker/rollup.config.js +++ b/service-worker/rollup.config.js @@ -3,7 +3,7 @@ import buble from 'rollup-plugin-buble'; import uglify from 'rollup-plugin-uglify'; import glob from 'glob'; -const dev = !!process.env.DEV; +const dev = !!process.env.ROLLUP_WATCH; console.log( `creating ${dev ? 'development' : 'production'} service worker` ); diff --git a/server/templates/index.html b/templates/index.html similarity index 100% rename from server/templates/index.html rename to templates/index.html diff --git a/server/templates/main.css b/templates/main.css similarity index 100% rename from server/templates/main.css rename to templates/main.css diff --git a/shared/components/GuideContents.html b/universal/components/GuideContents.html similarity index 100% rename from shared/components/GuideContents.html rename to universal/components/GuideContents.html diff --git a/shared/components/Nav.html b/universal/components/Nav.html similarity index 100% rename from shared/components/Nav.html rename to universal/components/Nav.html diff --git a/shared/routes/BlogIndex.html b/universal/routes/BlogIndex.html similarity index 100% rename from shared/routes/BlogIndex.html rename to universal/routes/BlogIndex.html diff --git a/shared/routes/BlogPost.html b/universal/routes/BlogPost.html similarity index 100% rename from shared/routes/BlogPost.html rename to universal/routes/BlogPost.html diff --git a/shared/routes/Guide.html b/universal/routes/Guide.html similarity index 100% rename from shared/routes/Guide.html rename to universal/routes/Guide.html diff --git a/shared/routes/Index.html b/universal/routes/Index.html similarity index 100% rename from shared/routes/Index.html rename to universal/routes/Index.html diff --git a/shared/routes/Repl/CodeMirror.html b/universal/routes/Repl/CodeMirror.html similarity index 100% rename from shared/routes/Repl/CodeMirror.html rename to universal/routes/Repl/CodeMirror.html diff --git a/shared/routes/Repl/ComponentSelector.html b/universal/routes/Repl/ComponentSelector.html similarity index 100% rename from shared/routes/Repl/ComponentSelector.html rename to universal/routes/Repl/ComponentSelector.html diff --git a/shared/routes/Repl/ExampleSelector.html b/universal/routes/Repl/ExampleSelector.html similarity index 100% rename from shared/routes/Repl/ExampleSelector.html rename to universal/routes/Repl/ExampleSelector.html diff --git a/shared/routes/Repl/Viewer.html b/universal/routes/Repl/Viewer.html similarity index 100% rename from shared/routes/Repl/Viewer.html rename to universal/routes/Repl/Viewer.html diff --git a/shared/routes/Repl/index.html b/universal/routes/Repl/index.html similarity index 100% rename from shared/routes/Repl/index.html rename to universal/routes/Repl/index.html diff --git a/shared/routes/Repl/utils/debounce.js b/universal/routes/Repl/utils/debounce.js similarity index 100% rename from shared/routes/Repl/utils/debounce.js rename to universal/routes/Repl/utils/debounce.js diff --git a/shared/routes/Repl/utils/get.js b/universal/routes/Repl/utils/get.js similarity index 100% rename from shared/routes/Repl/utils/get.js rename to universal/routes/Repl/utils/get.js diff --git a/shared/routes/Repl/utils/getLocationFromStack.js b/universal/routes/Repl/utils/getLocationFromStack.js similarity index 100% rename from shared/routes/Repl/utils/getLocationFromStack.js rename to universal/routes/Repl/utils/getLocationFromStack.js diff --git a/shared/routes/Repl/utils/gist.js b/universal/routes/Repl/utils/gist.js similarity index 100% rename from shared/routes/Repl/utils/gist.js rename to universal/routes/Repl/utils/gist.js diff --git a/shared/routes/Repl/utils/load.js b/universal/routes/Repl/utils/load.js similarity index 100% rename from shared/routes/Repl/utils/load.js rename to universal/routes/Repl/utils/load.js diff --git a/yarn.lock b/yarn.lock index ece1c0698..3a8bb5112 100644 --- a/yarn.lock +++ b/yarn.lock @@ -383,7 +383,7 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@2.2.0, debug@^2.2.0, debug@~2.2.0: +debug@2.2.0, debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: @@ -395,7 +395,7 @@ debug@2.6.7: dependencies: ms "2.0.0" -debug@^2.6.8: +debug@^2.2.0, debug@^2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: @@ -1691,27 +1691,27 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -readable-stream@^2.0.2, readable-stream@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: + version "2.2.9" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" dependencies: + buffer-shims "~1.0.0" core-util-is "~1.0.0" inherits "~2.0.1" isarray "~1.0.0" process-nextick-args "~1.0.6" - string_decoder "~0.10.x" + string_decoder "~1.0.0" util-deprecate "~1.0.1" -readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: - version "2.2.9" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" +readable-stream@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" dependencies: - buffer-shims "~1.0.0" core-util-is "~1.0.0" inherits "~2.0.1" isarray "~1.0.0" process-nextick-args "~1.0.6" - string_decoder "~1.0.0" + string_decoder "~0.10.x" util-deprecate "~1.0.1" readdirp@^2.0.0: @@ -1857,9 +1857,9 @@ rollup-plugin-replace@^1.1.1: minimatch "^3.0.2" rollup-pluginutils "^1.5.0" -rollup-plugin-svelte@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-svelte/-/rollup-plugin-svelte-2.0.0.tgz#e580880b19034393acc7f38b76830802fa465569" +rollup-plugin-svelte@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-svelte/-/rollup-plugin-svelte-2.0.1.tgz#bf48eccbc452d5940be7f7312054fc8f7ded3f83" dependencies: require-relative "^0.8.7" rollup-pluginutils "^2.0.1" @@ -1892,9 +1892,9 @@ rollup-watch@^4.0.0: chokidar "^1.7.0" require-relative "0.8.7" -rollup@^0.42.0: - version "0.42.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.42.0.tgz#56e791b3a2f3dd7190bbb80a375675f2fe0f9b23" +rollup@^0.43.0: + version "0.43.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.43.0.tgz#b36bdb75fa5e0823b6de8aee18ff7b5655520543" dependencies: source-map-support "^0.4.0"