From 03ce2ea998a2ee955ef41098c59cec67aff891ff Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 21 Jan 2018 15:04:22 -0500 Subject: [PATCH] tidy up a bit --- .gitignore | 7 +- cli.js | 54 ----- cli.js.map | 1 - core.js.map | 1 - middleware.js | 361 ------------------------------- middleware.js.map | 1 - src/config.js | 9 - src/core/generate_asset_cache.js | 6 +- src/core/utils/compilers.js | 17 +- src/core/utils/create_app.js | 4 +- src/middleware/index.js | 5 + webpack/config.js | 71 ------ webpack/config.js.map | 1 - 13 files changed, 19 insertions(+), 519 deletions(-) delete mode 100644 cli.js delete mode 100644 cli.js.map delete mode 100644 core.js.map delete mode 100644 middleware.js delete mode 100644 middleware.js.map delete mode 100644 webpack/config.js delete mode 100644 webpack/config.js.map diff --git a/.gitignore b/.gitignore index 13773db..345e41f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,10 @@ test/app/.sapper runtime.js yarn.lock cli.js +cli.js.map middleware.js -core.js \ No newline at end of file +middleware.js.map +core.js +core.js.map +webpack/config.js +webpack/config.js.map \ No newline at end of file diff --git a/cli.js b/cli.js deleted file mode 100644 index 40ec17b..0000000 --- a/cli.js +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env node -'use strict'; - -function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } - -var core_js = require('./core.js'); -var path = require('path'); -var mkdirp = _interopDefault(require('mkdirp')); -var rimraf = _interopDefault(require('rimraf')); - -const dev = process.env.NODE_ENV !== 'production'; - -const templates = path.resolve(process.env.SAPPER_TEMPLATES || 'templates'); - -const src = path.resolve(process.env.SAPPER_ROUTES || 'routes'); - -const dest = path.resolve(process.env.SAPPER_DEST || '.sapper'); - -if (dev) { - mkdirp.sync(dest); - rimraf.sync(path.join(dest, '**/*')); -} - -const entry = { - client: path.resolve(templates, '.main.rendered.js'), - server: path.resolve(dest, 'server-entry.js') -}; - -const cmd = process.argv[2]; -const start = Date.now(); - -if (cmd === 'build') { - core_js.build({ dest, dev, entry, src }) - .then(() => { - const elapsed = Date.now() - start; - console.error(`built in ${elapsed}ms`); // TODO beautify this, e.g. 'built in 4.7 seconds' - }) - .catch(err => { - console.error(err ? err.details || err.stack || err.message || err : 'Unknown error'); - }); -} else if (cmd === 'export') { - const start = Date.now(); - - core_js.build({ dest, dev, entry, src }) - .then(() => core_js.export({ src, dest })) - .then(() => { - const elapsed = Date.now() - start; - console.error(`extracted in ${elapsed}ms`); // TODO beautify this, e.g. 'built in 4.7 seconds' - }) - .catch(err => { - console.error(err ? err.details || err.stack || err.message || err : 'Unknown error'); - }); -} -//# sourceMappingURL=cli.js.map diff --git a/cli.js.map b/cli.js.map deleted file mode 100644 index 6923c3b..0000000 --- a/cli.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"cli.js","sources":["src/config.js","src/cli/index.js"],"sourcesContent":["import * as path from 'path';\nimport mkdirp from 'mkdirp';\nimport rimraf from 'rimraf';\n\nexport const dev = process.env.NODE_ENV !== 'production';\n\nexport const templates = path.resolve(process.env.SAPPER_TEMPLATES || 'templates');\n\nexport const src = path.resolve(process.env.SAPPER_ROUTES || 'routes');\n\nexport const dest = path.resolve(process.env.SAPPER_DEST || '.sapper');\n\nif (dev) {\n\tmkdirp.sync(dest);\n\trimraf.sync(path.join(dest, '**/*'));\n}\n\nexport const entry = {\n\tclient: path.resolve(templates, '.main.rendered.js'),\n\tserver: path.resolve(dest, 'server-entry.js')\n};","import { build, export as exporter } from 'sapper/core.js';\nimport { dest, dev, entry, src } from '../config.js';\n\nconst cmd = process.argv[2];\nconst start = Date.now();\n\nif (cmd === 'build') {\n\tbuild({ dest, dev, entry, src })\n\t\t.then(() => {\n\t\t\tconst elapsed = Date.now() - start;\n\t\t\tconsole.error(`built in ${elapsed}ms`); // TODO beautify this, e.g. 'built in 4.7 seconds'\n\t\t})\n\t\t.catch(err => {\n\t\t\tconsole.error(err ? err.details || err.stack || err.message || err : 'Unknown error');\n\t\t});\n} else if (cmd === 'export') {\n\tconst start = Date.now();\n\n\tbuild({ dest, dev, entry, src })\n\t\t.then(() => exporter({ src, dest }))\n\t\t.then(() => {\n\t\t\tconst elapsed = Date.now() - start;\n\t\t\tconsole.error(`extracted in ${elapsed}ms`); // TODO beautify this, e.g. 'built in 4.7 seconds'\n\t\t})\n\t\t.catch(err => {\n\t\t\tconsole.error(err ? err.details || err.stack || err.message || err : 'Unknown error');\n\t\t});\n}\n"],"names":["path.resolve","path.join","build","exporter"],"mappings":";;;;;;;;;;AAIO,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;;AAEzD,AAAO,MAAM,SAAS,GAAGA,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,WAAW,CAAC,CAAC;;AAEnF,AAAO,MAAM,GAAG,GAAGA,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,QAAQ,CAAC,CAAC;;AAEvE,AAAO,MAAM,IAAI,GAAGA,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;;AAEvE,IAAI,GAAG,EAAE;CACR,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;CAClB,MAAM,CAAC,IAAI,CAACC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;CACrC;;AAED,AAAO,MAAM,KAAK,GAAG;CACpB,MAAM,EAAED,YAAY,CAAC,SAAS,EAAE,mBAAmB,CAAC;CACpD,MAAM,EAAEA,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC;CAC7C;;ACjBD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;;AAEzB,IAAI,GAAG,KAAK,OAAO,EAAE;CACpBE,aAAK,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;GAC9B,IAAI,CAAC,MAAM;GACX,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;GACnC,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;GACvC,CAAC;GACD,KAAK,CAAC,GAAG,IAAI;GACb,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,GAAG,eAAe,CAAC,CAAC;GACtF,CAAC,CAAC;CACJ,MAAM,IAAI,GAAG,KAAK,QAAQ,EAAE;CAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;;CAEzBA,aAAK,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;GAC9B,IAAI,CAAC,MAAMC,cAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;GACnC,IAAI,CAAC,MAAM;GACX,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;GACnC,OAAO,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;GAC3C,CAAC;GACD,KAAK,CAAC,GAAG,IAAI;GACb,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,GAAG,eAAe,CAAC,CAAC;GACtF,CAAC,CAAC;CACJ"} \ No newline at end of file diff --git a/core.js.map b/core.js.map deleted file mode 100644 index 4a8d6ed..0000000 --- a/core.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"core.js","sources":["src/core/utils/create_routes.js","src/core/route_manager.js","src/core/templates.js","src/core/utils/compilers.js","src/core/utils/create_app.js","src/core/generate_asset_cache.js","src/core/build.js","src/core/export.js"],"sourcesContent":["import * as path from 'path';\n\nexport default function create_routes(files) {\n\tconst routes = files\n\t\t.map(file => {\n\t\t\tif (/(^|\\/|\\\\)_/.test(file)) return;\n\n\t\t\tconst parts = file.replace(/\\.(html|js|mjs)$/, '').split('/'); // glob output is always posix-style\n\t\t\tif (parts[parts.length - 1] === 'index') parts.pop();\n\n\t\t\tconst id = (\n\t\t\t\tparts.join('_').replace(/[[\\]]/g, '$').replace(/^\\d/, '_$&').replace(/[^a-zA-Z0-9_$]/g, '_')\n\t\t\t ) || '_';\n\n\t\t\tconst dynamic = parts\n\t\t\t\t.filter(part => part[0] === '[')\n\t\t\t\t.map(part => part.slice(1, -1));\n\n\t\t\tlet pattern_string = '';\n\t\t\tlet i = parts.length;\n\t\t\tlet nested = true;\n\t\t\twhile (i--) {\n\t\t\t\tconst part = parts[i];\n\t\t\t\tconst dynamic = part[0] === '[';\n\n\t\t\t\tif (dynamic) {\n\t\t\t\t\tpattern_string = nested ? `(?:\\\\/([^/]+)${pattern_string})?` : `\\\\/([^/]+)${pattern_string}`;\n\t\t\t\t} else {\n\t\t\t\t\tnested = false;\n\t\t\t\t\tpattern_string = `\\\\/${part}${pattern_string}`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst pattern = new RegExp(`^${pattern_string}\\\\/?$`);\n\n\t\t\tconst test = url => pattern.test(url);\n\n\t\t\tconst exec = url => {\n\t\t\t\tconst match = pattern.exec(url);\n\t\t\t\tif (!match) return;\n\n\t\t\t\tconst params = {};\n\t\t\t\tdynamic.forEach((param, i) => {\n\t\t\t\t\tparams[param] = match[i + 1];\n\t\t\t\t});\n\n\t\t\t\treturn params;\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\ttype: path.extname(file) === '.html' ? 'page' : 'route',\n\t\t\t\tfile,\n\t\t\t\tpattern,\n\t\t\t\ttest,\n\t\t\t\texec,\n\t\t\t\tparts,\n\t\t\t\tdynamic\n\t\t\t};\n\t\t})\n\t\t.filter(Boolean)\n\t\t.sort((a, b) => {\n\t\t\tlet same = true;\n\n\t\t\tfor (let i = 0; true; i += 1) {\n\t\t\t\tconst a_part = a.parts[i];\n\t\t\t\tconst b_part = b.parts[i];\n\n\t\t\t\tif (!a_part && !b_part) {\n\t\t\t\t\tif (same) throw new Error(`The ${a.file} and ${b.file} routes clash`);\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\tif (!a_part) return -1;\n\t\t\t\tif (!b_part) return 1;\n\n\t\t\t\tconst a_is_dynamic = a_part[0] === '[';\n\t\t\t\tconst b_is_dynamic = b_part[0] === '[';\n\n\t\t\t\tif (a_is_dynamic === b_is_dynamic) {\n\t\t\t\t\tif (!a_is_dynamic && a_part !== b_part) same = false;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\treturn a_is_dynamic ? 1 : -1;\n\t\t\t}\n\t\t});\n\n\treturn routes;\n}","import glob from 'glob';\nimport create_routes from './utils/create_routes.js';\n\nexport let routes;\n\nexport function update({ src }) {\n\troutes = create_routes(\n\t\tglob.sync('**/*.+(html|js|mjs)', { cwd: src })\n\t);\n\n\treturn routes;\n}","import * as fs from 'fs';\nimport glob from 'glob';\nimport chalk from 'chalk';\nimport framer from 'code-frame';\nimport { locate } from 'locate-character';\n\nlet templates;\n\nfunction error(e) {\n\tif (e.title) console.error(chalk.bold.red(e.title));\n\tif (e.body) console.error(chalk.red(e.body));\n\tif (e.url) console.error(chalk.cyan(e.url));\n\tif (e.frame) console.error(chalk.grey(e.frame));\n\n\tprocess.exit(1);\n}\n\nexport function create_templates() {\n\ttemplates = glob.sync('*.html', { cwd: 'templates' })\n\t\t.map(file => {\n\t\t\tconst template = fs.readFileSync(`templates/${file}`, 'utf-8');\n\t\t\tconst status = file.replace('.html', '').toLowerCase();\n\n\t\t\tif (!/^[0-9x]{3}$/.test(status)) {\n\t\t\t\terror({\n\t\t\t\t\ttitle: `templates/${file}`,\n\t\t\t\t\tbody: `Bad template — should be a valid status code like 404.html, or a wildcard like 2xx.html`\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst index = template.indexOf('%sapper.main%');\n\t\t\tif (index !== -1) {\n\t\t\t\t// TODO remove this in a future version\n\t\t\t\tconst { line, column } = locate(template, index, { offsetLine: 1 });\n\t\t\t\tconst frame = framer(template, line, column);\n\n\t\t\t\terror({\n\t\t\t\t\ttitle: `templates/${file}`,\n\t\t\t\t\tbody: ``; - - if (serialized) { - return `${main}`; - } - - return main; - }), - html: promise.then(({ rendered }) => rendered.html), - head: promise.then(({ rendered }) => `${rendered.head}`), - styles: promise.then(({ rendered }) => (rendered.css && rendered.css.code ? `` : '')) - }); - } else { - const { html, head, css } = mod.render(data); - - const page = core_js.templates.render(200, { - scripts: ``, - html, - head: `${head}`, - styles: (css && css.code ? `` : '') - }); - - res.end(page); - } - } - - else { - 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 handler = mod[method_export]; - if (handler) { - handler(req, res, next); - } else { - // no matching handler for method — 404 - next(); - } - } - } - - return function find_route(req, res, next) { - const url = req.pathname; - - // whatever happens, we're going to serve some HTML - res.setHeader('Content-Type', 'text/html'); - - resolved - .then(() => { - for (const route of core_js.route_manager.routes) { - if (route.test(url)) return handle_route(route, req, res, next, fn()); - } - - // no matching route — 404 - next(); - }) - .catch(err => { - res.statusCode = 500; - res.end(core_js.templates.render(500, { - title: (err && err.name) || 'Internal server error', - url, - error: escape_html(err && (err.details || err.message || err) || 'Unknown error'), - stack: err && err.stack.split('\n').slice(1).join('\n') - })); - }); - }; -} - -function get_not_found_handler(fn) { - return function handle_not_found(req, res) { - const asset_cache = fn(); - - res.statusCode = 404; - res.end(core_js.templates.render(404, { - title: 'Not found', - status: 404, - method: req.method, - scripts: ``, - url: req.url - })); - }; -} - -function compose_handlers(handlers) { - return (req, res, next) => { - let i = 0; - function go() { - const handler = handlers[i]; - - if (handler) { - handler(req, res, () => { - i += 1; - go(); - }); - } else { - next(); - } - } - - go(); - }; -} - -function read_json(file) { - return JSON.parse(fs.readFileSync(file, 'utf-8')); -} - -function try_serialize(data) { - try { - return serialize(data); - } catch (err) { - return null; - } -} - -module.exports = index; -//# sourceMappingURL=middleware.js.map diff --git a/middleware.js.map b/middleware.js.map deleted file mode 100644 index 883ece4..0000000 --- a/middleware.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"middleware.js","sources":["src/config.js","src/middleware/create_watcher.js","src/middleware/index.js"],"sourcesContent":["import * as path from 'path';\nimport mkdirp from 'mkdirp';\nimport rimraf from 'rimraf';\n\nexport const dev = process.env.NODE_ENV !== 'production';\n\nexport const templates = path.resolve(process.env.SAPPER_TEMPLATES || 'templates');\n\nexport const src = path.resolve(process.env.SAPPER_ROUTES || 'routes');\n\nexport const dest = path.resolve(process.env.SAPPER_DEST || '.sapper');\n\nif (dev) {\n\tmkdirp.sync(dest);\n\trimraf.sync(path.join(dest, '**/*'));\n}\n\nexport const entry = {\n\tclient: path.resolve(templates, '.main.rendered.js'),\n\tserver: path.resolve(dest, 'server-entry.js')\n};","import * as fs from 'fs';\nimport * as path from 'path';\nimport chalk from 'chalk';\nimport { compilers, generate_asset_cache } from 'sapper/core.js';\nimport { dest } from '../config.js';\n\nfunction deferred() {\n\tconst d = {};\n\n\td.promise = new Promise((fulfil, reject) => {\n\t\td.fulfil = fulfil;\n\t\td.reject = reject;\n\t});\n\n\treturn d;\n}\n\nexport default function create_watcher() {\n\tconst deferreds = {\n\t\tclient: deferred(),\n\t\tserver: deferred()\n\t};\n\n\tconst invalidate = () => Promise.all([\n\t\tdeferreds.client.promise,\n\t\tdeferreds.server.promise\n\t]).then(([client_stats, server_stats]) => {\n\t\tconst client_info = client_stats.toJson();\n\t\tfs.writeFileSync(path.join(dest, 'stats.client.json'), JSON.stringify(client_info, null, ' '));\n\n\t\tconst server_info = server_stats.toJson();\n\t\tfs.writeFileSync(path.join(dest, 'stats.server.json'), JSON.stringify(server_info, null, ' '));\n\n\t\treturn generate_asset_cache(\n\t\t\tclient_stats.toJson(),\n\t\t\tserver_stats.toJson()\n\t\t);\n\t});\n\n\tfunction watch_compiler(type) {\n\t\tconst compiler = compilers[type];\n\n\t\tcompiler.plugin('invalid', filename => {\n\t\t\tconsole.log(chalk.cyan(`${type} bundle invalidated, file changed: ${chalk.bold(filename)}`));\n\t\t\tdeferreds[type] = deferred();\n\t\t\twatcher.ready = invalidate();\n\t\t});\n\n\t\tcompiler.plugin('failed', err => {\n\t\t\tdeferreds[type].reject(err);\n\t\t});\n\n\t\treturn compiler.watch({}, (err, stats) => {\n\t\t\tif (stats.hasErrors()) {\n\t\t\t\tdeferreds[type].reject(stats.toJson().errors[0]);\n\t\t\t} else {\n\t\t\t\tdeferreds[type].fulfil(stats);\n\t\t\t}\n\t\t});\n\t}\n\n\tconst watcher = {\n\t\tready: invalidate(),\n\t\tclient: watch_compiler('client'),\n\t\tserver: watch_compiler('server'),\n\n\t\tclose: () => {\n\t\t\twatcher.client.close();\n\t\t\twatcher.server.close();\n\t\t}\n\t};\n\n\treturn watcher;\n}","import * as fs from 'fs';\nimport * as path from 'path';\nimport serialize from 'serialize-javascript';\nimport escape_html from 'escape-html';\nimport { route_manager, templates, create_app, compilers, generate_asset_cache } from 'sapper/core.js';\nimport create_watcher from './create_watcher.js';\nimport { dest, dev, entry, src } from '../config.js';\n\nfunction connect_dev() {\n\tcreate_app({ dev, entry, src });\n\n\tconst watcher = create_watcher();\n\n\tlet asset_cache;\n\n\tconst middleware = compose_handlers([\n\t\trequire('webpack-hot-middleware')(compilers.client, {\n\t\t\treload: true,\n\t\t\tpath: '/__webpack_hmr',\n\t\t\theartbeat: 10 * 1000\n\t\t}),\n\n\t\t(req, res, next) => {\n\t\t\twatcher.ready.then(cache => {\n\t\t\t\tasset_cache = cache;\n\t\t\t\tnext();\n\t\t\t});\n\t\t},\n\n\t\tset_req_pathname,\n\n\t\tget_asset_handler({\n\t\t\tfilter: pathname => pathname === '/index.html',\n\t\t\ttype: 'text/html',\n\t\t\tcache: 'max-age=600',\n\t\t\tfn: () => asset_cache.client.index\n\t\t}),\n\n\t\tget_asset_handler({\n\t\t\tfilter: pathname => pathname === '/service-worker.js',\n\t\t\ttype: 'application/javascript',\n\t\t\tcache: 'max-age=600',\n\t\t\tfn: () => asset_cache.client.service_worker\n\t\t}),\n\n\t\tget_asset_handler({\n\t\t\tfilter: pathname => pathname.startsWith('/client/'),\n\t\t\ttype: 'application/javascript',\n\t\t\tcache: 'max-age=31536000',\n\t\t\tfn: pathname => asset_cache.client.chunks[pathname]\n\t\t}),\n\n\t\tget_route_handler(() => asset_cache),\n\n\t\tget_not_found_handler(() => asset_cache)\n\t]);\n\n\tmiddleware.close = () => {\n\t\twatcher.close();\n\t\t// TODO shut down chokidar\n\t};\n\n\treturn middleware;\n}\n\nfunction connect_prod() {\n\tconst asset_cache = generate_asset_cache({\n\t\tsrc, dest,\n\t\tdev: false,\n\t\tclient_info: read_json(path.join(dest, 'stats.client.json')),\n\t\tserver_info: read_json(path.join(dest, 'stats.server.json'))\n\t});\n\n\tconst middleware = compose_handlers([\n\t\tset_req_pathname,\n\n\t\tget_asset_handler({\n\t\t\tfilter: pathname => pathname === '/index.html',\n\t\t\ttype: 'text/html',\n\t\t\tcache: 'max-age=600',\n\t\t\tfn: () => asset_cache.client.index\n\t\t}),\n\n\t\tget_asset_handler({\n\t\t\tfilter: pathname => pathname === '/service-worker.js',\n\t\t\ttype: 'application/javascript',\n\t\t\tcache: 'max-age=600',\n\t\t\tfn: () => asset_cache.client.service_worker\n\t\t}),\n\n\t\tget_asset_handler({\n\t\t\tfilter: pathname => pathname.startsWith('/client/'),\n\t\t\ttype: 'application/javascript',\n\t\t\tcache: 'max-age=31536000',\n\t\t\tfn: pathname => asset_cache.client.chunks[pathname]\n\t\t}),\n\n\t\tget_route_handler(() => asset_cache),\n\n\t\tget_not_found_handler(() => asset_cache)\n\t]);\n\n\t// here for API consistency between dev, and prod, but\n\t// doesn't actually need to do anything\n\tmiddleware.close = () => {};\n\n\treturn middleware;\n}\n\nexport default dev ? connect_dev : connect_prod;\n\nfunction set_req_pathname(req, res, next) {\n\treq.pathname = req.url.replace(/\\?.+/, '');\n\tnext();\n}\n\nfunction get_asset_handler(opts) {\n\treturn (req, res, next) => {\n\t\tif (!opts.filter(req.pathname)) return next();\n\n\t\tres.setHeader('Content-Type', opts.type);\n\t\tres.setHeader('Cache-Control', opts.cache);\n\n\t\tres.end(opts.fn(req.pathname));\n\t};\n}\n\nconst resolved = Promise.resolve();\n\nfunction get_route_handler(fn) {\n\tfunction handle_route(route, req, res, next, { client, server }) {\n\t\treq.params = route.exec(req.pathname);\n\n\t\tconst mod = require(server.entry)[route.id];\n\n\t\tif (route.type === 'page') {\n\t\t\t// preload main.js and current route\n\t\t\t// TODO detect other stuff we can preload? images, CSS, fonts?\n\t\t\tres.setHeader('Link', `<${client.main_file}>;rel=\"preload\";as=\"script\", <${client.routes[route.id]}>;rel=\"preload\";as=\"script\"`);\n\n\t\t\tconst data = { params: req.params, query: req.query };\n\n\t\t\tif (mod.preload) {\n\t\t\t\tconst promise = Promise.resolve(mod.preload(req)).then(preloaded => {\n\t\t\t\t\tconst serialized = try_serialize(preloaded);\n\t\t\t\t\tObject.assign(data, preloaded);\n\n\t\t\t\t\treturn { rendered: mod.render(data), serialized };\n\t\t\t\t});\n\n\t\t\t\treturn templates.stream(res, 200, {\n\t\t\t\t\tscripts: promise.then(({ serialized }) => {\n\t\t\t\t\t\tconst main = ``;\n\n\t\t\t\t\t\tif (serialized) {\n\t\t\t\t\t\t\treturn `${main}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn main;\n\t\t\t\t\t}),\n\t\t\t\t\thtml: promise.then(({ rendered }) => rendered.html),\n\t\t\t\t\thead: promise.then(({ rendered }) => `${rendered.head}`),\n\t\t\t\t\tstyles: promise.then(({ rendered }) => (rendered.css && rendered.css.code ? `` : ''))\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst { html, head, css } = mod.render(data);\n\n\t\t\t\tconst page = templates.render(200, {\n\t\t\t\t\tscripts: ``,\n\t\t\t\t\thtml,\n\t\t\t\t\thead: `${head}`,\n\t\t\t\t\tstyles: (css && css.code ? `` : '')\n\t\t\t\t});\n\n\t\t\t\tres.end(page);\n\t\t\t}\n\t\t}\n\n\t\telse {\n\t\t\tconst method = req.method.toLowerCase();\n\t\t\t// 'delete' cannot be exported from a module because it is a keyword,\n\t\t\t// so check for 'del' instead\n\t\t\tconst method_export = method === 'delete' ? 'del' : method;\n\t\t\tconst handler = mod[method_export];\n\t\t\tif (handler) {\n\t\t\t\thandler(req, res, next);\n\t\t\t} else {\n\t\t\t\t// no matching handler for method — 404\n\t\t\t\tnext();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn function find_route(req, res, next) {\n\t\tconst url = req.pathname;\n\n\t\t// whatever happens, we're going to serve some HTML\n\t\tres.setHeader('Content-Type', 'text/html');\n\n\t\tresolved\n\t\t\t.then(() => {\n\t\t\t\tfor (const route of route_manager.routes) {\n\t\t\t\t\tif (route.test(url)) return handle_route(route, req, res, next, fn());\n\t\t\t\t}\n\n\t\t\t\t// no matching route — 404\n\t\t\t\tnext();\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tres.statusCode = 500;\n\t\t\t\tres.end(templates.render(500, {\n\t\t\t\t\ttitle: (err && err.name) || 'Internal server error',\n\t\t\t\t\turl,\n\t\t\t\t\terror: escape_html(err && (err.details || err.message || err) || 'Unknown error'),\n\t\t\t\t\tstack: err && err.stack.split('\\n').slice(1).join('\\n')\n\t\t\t\t}));\n\t\t\t});\n\t};\n}\n\nfunction get_not_found_handler(fn) {\n\treturn function handle_not_found(req, res) {\n\t\tconst asset_cache = fn();\n\n\t\tres.statusCode = 404;\n\t\tres.end(templates.render(404, {\n\t\t\ttitle: 'Not found',\n\t\t\tstatus: 404,\n\t\t\tmethod: req.method,\n\t\t\tscripts: ``,\n\t\t\turl: req.url\n\t\t}));\n\t};\n}\n\nfunction compose_handlers(handlers) {\n\treturn (req, res, next) => {\n\t\tlet i = 0;\n\t\tfunction go() {\n\t\t\tconst handler = handlers[i];\n\n\t\t\tif (handler) {\n\t\t\t\thandler(req, res, () => {\n\t\t\t\t\ti += 1;\n\t\t\t\t\tgo();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tnext();\n\t\t\t}\n\t\t}\n\n\t\tgo();\n\t};\n}\n\nfunction read_json(file) {\n\treturn JSON.parse(fs.readFileSync(file, 'utf-8'));\n}\n\nfunction try_serialize(data) {\n\ttry {\n\t\treturn serialize(data);\n\t} catch (err) {\n\t\treturn null;\n\t}\n}"],"names":["templates","path.resolve","path.join","fs.writeFileSync","generate_asset_cache","compilers","create_app","route_manager","fs.readFileSync"],"mappings":"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"} \ No newline at end of file diff --git a/src/config.js b/src/config.js index 35f2d33..f685ca7 100644 --- a/src/config.js +++ b/src/config.js @@ -1,20 +1,11 @@ import * as path from 'path'; -import mkdirp from 'mkdirp'; -import rimraf from 'rimraf'; export const dev = process.env.NODE_ENV !== 'production'; export const templates = path.resolve(process.env.SAPPER_TEMPLATES || 'templates'); - export const src = path.resolve(process.env.SAPPER_ROUTES || 'routes'); - export const dest = path.resolve(process.env.SAPPER_DEST || '.sapper'); -if (dev) { - mkdirp.sync(dest); - rimraf.sync(path.join(dest, '**/*')); -} - export const entry = { client: path.resolve(templates, '.main.rendered.js'), server: path.resolve(dest, 'server-entry.js') diff --git a/src/core/generate_asset_cache.js b/src/core/generate_asset_cache.js index 05546e1..ce82339 100644 --- a/src/core/generate_asset_cache.js +++ b/src/core/generate_asset_cache.js @@ -1,7 +1,7 @@ import * as fs from 'fs'; import * as path from 'path'; import glob from 'glob'; -import * as templates from './templates.js'; +import { create_templates, render } from './templates.js'; import * as route_manager from './route_manager.js'; function ensure_array(thing) { @@ -9,7 +9,7 @@ function ensure_array(thing) { } export default function generate_asset_cache({ src, dest, dev, client_info, server_info }) { - templates.create_templates(); // TODO refactor this... + create_templates(); // TODO refactor this... const main_file = `/client/${ensure_array(client_info.assetsByChunkName.main)[0]}`; @@ -71,7 +71,7 @@ function generate_service_worker({ chunk_files, src }) { } function generate_index(main_file) { - return templates.render(200, { + return render(200, { styles: '', head: '', html: '', diff --git a/src/core/utils/compilers.js b/src/core/utils/compilers.js index 4424d45..9c10cab 100644 --- a/src/core/utils/compilers.js +++ b/src/core/utils/compilers.js @@ -1,12 +1,9 @@ import * as path from 'path'; import relative from 'require-relative'; -const webpack = relative('webpack', process.cwd()); - -export let client; -export let server; - export function get_compilers() { + const webpack = relative('webpack', process.cwd()); + return { client: webpack( require(path.resolve('webpack.client.config.js')) @@ -16,12 +13,4 @@ export function get_compilers() { require(path.resolve('webpack.server.config.js')) ) }; -} - -// export const client = webpack( -// require(path.resolve('webpack.client.config.js')) -// ); - -// export const server = webpack( -// require(path.resolve('webpack.server.config.js')) -// ); \ No newline at end of file +} \ No newline at end of file diff --git a/src/core/utils/create_app.js b/src/core/utils/create_app.js index 4046482..003aa41 100644 --- a/src/core/utils/create_app.js +++ b/src/core/utils/create_app.js @@ -1,7 +1,7 @@ import * as fs from 'fs'; import * as path from 'path'; import * as route_manager from '../route_manager.js'; -import * as templates from '../templates.js'; +import { create_templates } from '../templates.js'; function posixify(file) { return file.replace(/[/\\]/g, '/'); @@ -90,7 +90,7 @@ export function start_watching({ src }) { }); watch('templates/**.html', () => { - templates.create_templates(); + create_templates(); // TODO reload current page? }); } diff --git a/src/middleware/index.js b/src/middleware/index.js index 525f483..aadb35e 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -1,5 +1,7 @@ import * as fs from 'fs'; import * as path from 'path'; +import mkdirp from 'mkdirp'; +import rimraf from 'rimraf'; import serialize from 'serialize-javascript'; import escape_html from 'escape-html'; import { route_manager, templates, create_app, compilers, generate_asset_cache } from 'sapper/core.js'; @@ -7,6 +9,9 @@ import create_watcher from './create_watcher.js'; import { dest, dev, entry, src } from '../config.js'; function connect_dev() { + mkdirp.sync(dest); + rimraf.sync(path.join(dest, '**/*')); + create_app({ dev, entry, src }); const watcher = create_watcher(); diff --git a/webpack/config.js b/webpack/config.js deleted file mode 100644 index be6bfba..0000000 --- a/webpack/config.js +++ /dev/null @@ -1,71 +0,0 @@ -'use strict'; - -function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } - -var path = require('path'); -var mkdirp = _interopDefault(require('mkdirp')); -var rimraf = _interopDefault(require('rimraf')); - -const dev = process.env.NODE_ENV !== 'production'; - -const templates = path.resolve(process.env.SAPPER_TEMPLATES || 'templates'); - -const src = path.resolve(process.env.SAPPER_ROUTES || 'routes'); - -const dest = path.resolve(process.env.SAPPER_DEST || '.sapper'); - -if (dev) { - mkdirp.sync(dest); - rimraf.sync(path.join(dest, '**/*')); -} - -const entry = { - client: path.resolve(templates, '.main.rendered.js'), - server: path.resolve(dest, 'server-entry.js') -}; - -var index = { - dev, - - client: { - entry: () => { - return { - main: [ - entry.client, - // workaround for https://github.com/webpack-contrib/extract-text-webpack-plugin/issues/456 - 'style-loader/lib/addStyles', - 'css-loader/lib/css-base' - ] - }; - }, - - output: () => { - return { - path: `${dest}/client`, - filename: '[name].[hash].js', - chunkFilename: '[name].[id].[hash].js', - publicPath: '/client/' - }; - } - }, - - server: { - entry: () => { - return { - main: entry.server - }; - }, - - output: () => { - return { - path: `${dest}/server`, - filename: '[name].[hash].js', - chunkFilename: '[name].[id].[hash].js', - libraryTarget: 'commonjs2' - }; - } - } -}; - -module.exports = index; -//# sourceMappingURL=config.js.map diff --git a/webpack/config.js.map b/webpack/config.js.map deleted file mode 100644 index 1be5aa7..0000000 --- a/webpack/config.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"config.js","sources":["../src/config.js","../src/webpack/index.js"],"sourcesContent":["import * as path from 'path';\nimport mkdirp from 'mkdirp';\nimport rimraf from 'rimraf';\n\nexport const dev = process.env.NODE_ENV !== 'production';\n\nexport const templates = path.resolve(process.env.SAPPER_TEMPLATES || 'templates');\n\nexport const src = path.resolve(process.env.SAPPER_ROUTES || 'routes');\n\nexport const dest = path.resolve(process.env.SAPPER_DEST || '.sapper');\n\nif (dev) {\n\tmkdirp.sync(dest);\n\trimraf.sync(path.join(dest, '**/*'));\n}\n\nexport const entry = {\n\tclient: path.resolve(templates, '.main.rendered.js'),\n\tserver: path.resolve(dest, 'server-entry.js')\n};","import { dest, dev, entry } from '../config.js';\n\nexport default {\n\tdev,\n\n\tclient: {\n\t\tentry: () => {\n\t\t\treturn {\n\t\t\t\tmain: [\n\t\t\t\t\tentry.client,\n\t\t\t\t\t// workaround for https://github.com/webpack-contrib/extract-text-webpack-plugin/issues/456\n\t\t\t\t\t'style-loader/lib/addStyles',\n\t\t\t\t\t'css-loader/lib/css-base'\n\t\t\t\t]\n\t\t\t};\n\t\t},\n\n\t\toutput: () => {\n\t\t\treturn {\n\t\t\t\tpath: `${dest}/client`,\n\t\t\t\tfilename: '[name].[hash].js',\n\t\t\t\tchunkFilename: '[name].[id].[hash].js',\n\t\t\t\tpublicPath: '/client/'\n\t\t\t};\n\t\t}\n\t},\n\n\tserver: {\n\t\tentry: () => {\n\t\t\treturn {\n\t\t\t\tmain: entry.server\n\t\t\t};\n\t\t},\n\n\t\toutput: () => {\n\t\t\treturn {\n\t\t\t\tpath: `${dest}/server`,\n\t\t\t\tfilename: '[name].[hash].js',\n\t\t\t\tchunkFilename: '[name].[id].[hash].js',\n\t\t\t\tlibraryTarget: 'commonjs2'\n\t\t\t};\n\t\t}\n\t}\n};\n"],"names":["path.resolve","path.join"],"mappings":";;;;;;;;AAIO,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;;AAEzD,AAAO,MAAM,SAAS,GAAGA,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,WAAW,CAAC,CAAC;;AAEnF,AAAO,MAAM,GAAG,GAAGA,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,QAAQ,CAAC,CAAC;;AAEvE,AAAO,MAAM,IAAI,GAAGA,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;;AAEvE,IAAI,GAAG,EAAE;CACR,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;CAClB,MAAM,CAAC,IAAI,CAACC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;CACrC;;AAED,AAAO,MAAM,KAAK,GAAG;CACpB,MAAM,EAAED,YAAY,CAAC,SAAS,EAAE,mBAAmB,CAAC;CACpD,MAAM,EAAEA,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC;CAC7C;;AClBD,YAAe;CACd,GAAG;;CAEH,MAAM,EAAE;EACP,KAAK,EAAE,MAAM;GACZ,OAAO;IACN,IAAI,EAAE;KACL,KAAK,CAAC,MAAM;;KAEZ,4BAA4B;KAC5B,yBAAyB;KACzB;IACD,CAAC;GACF;;EAED,MAAM,EAAE,MAAM;GACb,OAAO;IACN,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC;IACtB,QAAQ,EAAE,kBAAkB;IAC5B,aAAa,EAAE,uBAAuB;IACtC,UAAU,EAAE,UAAU;IACtB,CAAC;GACF;EACD;;CAED,MAAM,EAAE;EACP,KAAK,EAAE,MAAM;GACZ,OAAO;IACN,IAAI,EAAE,KAAK,CAAC,MAAM;IAClB,CAAC;GACF;;EAED,MAAM,EAAE,MAAM;GACb,OAAO;IACN,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC;IACtB,QAAQ,EAAE,kBAAkB;IAC5B,aAAa,EAAE,uBAAuB;IACtC,aAAa,EAAE,WAAW;IAC1B,CAAC;GACF;EACD;CACD,CAAC;;;;"} \ No newline at end of file