From 39b1fa89ce9c179c3cb8beeea59c0d90deab56a5 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 21 Jan 2018 11:03:23 -0500 Subject: [PATCH] wip --- cli.js | 932 ++++++++++++++++++ lib/config.js | 21 - middleware.js | 772 +++++++++++++++ mocha.opts | 1 + package-lock.json | 535 +++++----- package.json | 13 +- rollup.config.js | 69 ++ runtime/README.md | 1 + {cli => src/cli}/index.js | 7 +- src/config.js | 21 + {lib => src/middleware}/index.js | 24 +- src/middleware/tmp.json | 154 +++ {lib => src/shared}/build.js | 18 +- {lib/utils => src/shared}/export.js | 26 +- .../shared}/generate_asset_cache.js | 16 +- src/shared/index.js | 7 + {lib => src/shared}/route_manager.js | 14 +- {lib => src/shared}/templates.js | 20 +- {lib => src/shared}/utils/compilers.js | 9 +- {lib => src/shared}/utils/create_app.js | 10 +- {lib => src/shared}/utils/create_routes.js | 6 +- {lib => src/shared}/utils/create_watcher.js | 16 +- src/webpack/index.js | 44 + test/common/test.js | 21 +- test/unit/create_routes.test.js | 5 +- webpack/config.js | 30 +- webpack/hmr.js | 1 - 27 files changed, 2392 insertions(+), 401 deletions(-) create mode 100644 cli.js delete mode 100644 lib/config.js create mode 100644 middleware.js create mode 100644 runtime/README.md rename {cli => src/cli}/index.js (85%) create mode 100644 src/config.js rename {lib => src/middleware}/index.js (91%) create mode 100644 src/middleware/tmp.json rename {lib => src/shared}/build.js (72%) rename {lib/utils => src/shared}/export.js (82%) rename {lib/utils => src/shared}/generate_asset_cache.js (85%) create mode 100644 src/shared/index.js rename {lib => src/shared}/route_manager.js (66%) rename {lib => src/shared}/templates.js (91%) rename {lib => src/shared}/utils/compilers.js (54%) rename {lib => src/shared}/utils/create_app.js (92%) rename {lib => src/shared}/utils/create_routes.js (95%) rename {lib => src/shared}/utils/create_watcher.js (83%) create mode 100644 src/webpack/index.js delete mode 100644 webpack/hmr.js diff --git a/cli.js b/cli.js new file mode 100644 index 0000000..d5af45d --- /dev/null +++ b/cli.js @@ -0,0 +1,932 @@ +#!/usr/bin/env node +'use strict'; + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var fs = require('fs'); +var path = require('path'); +var mkdirp = _interopDefault(require('mkdirp')); +var rimraf = _interopDefault(require('rimraf')); +var relative = _interopDefault(require('require-relative')); +var glob = _interopDefault(require('glob')); +var chalk = _interopDefault(require('chalk')); +var framer = _interopDefault(require('code-frame')); +var locateCharacter = require('locate-character'); +var sander = require('sander'); +var express = _interopDefault(require('express')); +var cheerio = _interopDefault(require('cheerio')); +var fetch = _interopDefault(require('node-fetch')); +var URL = _interopDefault(require('url-parse')); +var serialize = _interopDefault(require('serialize-javascript')); +var escape_html = _interopDefault(require('escape-html')); + +const webpack = relative('webpack', process.cwd()); + +const client = webpack( + require(path.resolve('webpack.client.config.js')) +); + +const server = webpack( + require(path.resolve('webpack.server.config.js')) +); + +var compilers = Object.freeze({ + client: client, + server: server +}); + +function create_matchers(files) { + const routes = files + .map(file => { + if (/(^|\/|\\)_/.test(file)) return; + + const parts = file.replace(/\.(html|js|mjs)$/, '').split('/'); // glob output is always posix-style + if (parts[parts.length - 1] === 'index') parts.pop(); + + const id = ( + parts.join('_').replace(/[[\]]/g, '$').replace(/^\d/, '_$&').replace(/[^a-zA-Z0-9_$]/g, '_') + ) || '_'; + + const dynamic = parts + .filter(part => part[0] === '[') + .map(part => part.slice(1, -1)); + + let pattern_string = ''; + let i = parts.length; + let nested = true; + while (i--) { + const part = parts[i]; + const dynamic = part[0] === '['; + + if (dynamic) { + pattern_string = nested ? `(?:\\/([^/]+)${pattern_string})?` : `\\/([^/]+)${pattern_string}`; + } else { + nested = false; + pattern_string = `\\/${part}${pattern_string}`; + } + } + + const pattern = new RegExp(`^${pattern_string}\\/?$`); + + const test = url => pattern.test(url); + + const exec = url => { + const match = pattern.exec(url); + if (!match) return; + + const params = {}; + dynamic.forEach((param, i) => { + params[param] = match[i + 1]; + }); + + return params; + }; + + return { + id, + type: path.extname(file) === '.html' ? 'page' : 'route', + file, + pattern, + test, + exec, + parts, + dynamic + }; + }) + .filter(Boolean) + .sort((a, b) => { + let same = true; + + for (let i = 0; true; i += 1) { + const a_part = a.parts[i]; + const b_part = b.parts[i]; + + if (!a_part && !b_part) { + if (same) throw new Error(`The ${a.file} and ${b.file} routes clash`); + return 0; + } + + if (!a_part) return -1; + if (!b_part) return 1; + + const a_is_dynamic = a_part[0] === '['; + const b_is_dynamic = b_part[0] === '['; + + if (a_is_dynamic === b_is_dynamic) { + if (!a_is_dynamic && a_part !== b_part) same = false; + continue; + } + + return a_is_dynamic ? 1 : -1; + } + }); + + return routes; +} + +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 callbacks = []; + +function onchange(fn) { + callbacks.push(fn); +} + +let routes; + +function update() { + routes = create_matchers( + glob.sync('**/*.+(html|js|mjs)', { cwd: src }) + ); + + callbacks.forEach(fn => fn()); +} + +update(); + +if (dev) { + const watcher = require('chokidar').watch(`${src}/**/*.+(html|js|mjs)`, { + ignoreInitial: true, + persistent: false + }); + + watcher.on('add', update); + watcher.on('change', update); + watcher.on('unlink', update); +} + + +var route_manager = Object.freeze({ + onchange: onchange, + get routes () { return routes; } +}); + +function posixify(file) { + return file.replace(/[/\\]/g, '/'); +} + +function create_app() { + const { routes: routes$$1 } = route_manager; + + function create_client_main() { + const template = fs.readFileSync('templates/main.js', 'utf-8'); + + const code = `[${ + routes$$1 + .filter(route => route.type === 'page') + .map(route => { + const params = route.dynamic.length === 0 ? + '{}' : + `{ ${route.dynamic.map((part, i) => `${part}: match[${i + 1}]`).join(', ') } }`; + + const file = posixify(`${src}/${route.file}`); + return `{ pattern: ${route.pattern}, params: match => (${params}), load: () => import(/* webpackChunkName: "${route.id}" */ '${file}') }` + }) + .join(', ') + }]`; + + let main = template + .replace(/__app__/g, posixify(path.resolve(__dirname, '../../runtime/app.js'))) + .replace(/__routes__/g, code) + .replace(/__dev__/g, String(dev)); + + if (dev) { + const hmr_client = posixify(require.resolve(`webpack-hot-middleware/client`)); + main += `\n\nimport('${hmr_client}?path=/__webpack_hmr&timeout=20000'); if (module.hot) module.hot.accept();`; + } + + fs.writeFileSync(entry.client, main); + + // need to fudge the mtime, because webpack is soft in the head + const { atime, mtime } = fs.statSync(entry.client); + fs.utimesSync(entry.client, new Date(atime.getTime() - 999999), new Date(mtime.getTime() - 999999)); + } + + function create_server_routes() { + const imports = routes$$1 + .map(route => { + const file = posixify(`${src}/${route.file}`); + return route.type === 'page' ? + `import ${route.id} from '${file}';` : + `import * as ${route.id} from '${file}';`; + }) + .join('\n'); + + const exports = `export { ${routes$$1.map(route => route.id)} };`; + + fs.writeFileSync(entry.server, `${imports}\n\n${exports}`); + + const { atime, mtime } = fs.statSync(entry.server); + fs.utimesSync(entry.server, new Date(atime.getTime() - 999999), new Date(mtime.getTime() - 999999)); + } + + create_client_main(); + create_server_routes(); +} + +if (dev) { + onchange(create_app); + + const watcher = require('chokidar').watch(`templates/main.js`, { + ignoreInitial: true, + persistent: false + }); + + watcher.on('add', create_app); + watcher.on('change', create_app); + watcher.on('unlink', create_app); +} + +let templates$1; + +function error(e) { + if (e.title) console.error(chalk.bold.red(e.title)); + if (e.body) console.error(chalk.red(e.body)); + if (e.url) console.error(chalk.cyan(e.url)); + if (e.frame) console.error(chalk.grey(e.frame)); + + process.exit(1); +} + +function create_templates() { + templates$1 = glob.sync('*.html', { cwd: 'templates' }) + .map(file => { + const template = fs.readFileSync(`templates/${file}`, 'utf-8'); + const status = file.replace('.html', '').toLowerCase(); + + if (!/^[0-9x]{3}$/.test(status)) { + error({ + title: `templates/${file}`, + body: `Bad template — should be a valid status code like 404.html, or a wildcard like 2xx.html` + }); + } + + const index = template.indexOf('%sapper.main%'); + if (index !== -1) { + // TODO remove this in a future version + const { line, column } = locateCharacter.locate(template, index, { offsetLine: 1 }); + const frame = framer(template, line, column); + + error({ + title: `templates/${file}`, + body: ``; + + 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 = 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 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(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(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$1(file) { + return JSON.parse(fs.readFileSync(file, 'utf-8')); +} + +function try_serialize(data) { + try { + return serialize(data); + } catch (err) { + return null; + } +} + +const { PORT = 3000, OUTPUT_DIR = 'dist' } = process.env; + +const origin = `http://localhost:${PORT}`; + +const app = express(); + +function read_json(file) { + return JSON.parse(sander.readFileSync(file, { encoding: 'utf-8' })); +} + +function exporter() { + // Prep output directory + sander.rimrafSync(OUTPUT_DIR); + + const { service_worker } = generate_asset_cache( + read_json(path.join(dest, 'stats.client.json')), + read_json(path.join(dest, 'stats.server.json')) + ); + + sander.copydirSync('assets').to(OUTPUT_DIR); + sander.copydirSync(dest, 'client').to(OUTPUT_DIR, 'client'); + sander.writeFileSync(OUTPUT_DIR, 'service-worker.js', service_worker); + + // Intercept server route fetches + function save(res) { + res = res.clone(); + + return res.text().then(body => { + const { pathname } = new URL(res.url); + let dest$$1 = OUTPUT_DIR + pathname; + + const type = res.headers.get('Content-Type'); + if (type.startsWith('text/html')) dest$$1 += '/index.html'; + + sander.writeFileSync(dest$$1, body); + + return body; + }); + } + + global.fetch = (url, opts) => { + if (url[0] === '/') { + url = `http://localhost:${PORT}${url}`; + + return fetch(url, opts) + .then(r => { + save(r); + return r; + }); + } + + return fetch(url, opts); + }; + + app.use(middleware()); + const server = app.listen(PORT); + + const seen = new Set(); + + function handle(url) { + if (url.origin !== origin) return; + + if (seen.has(url.pathname)) return; + seen.add(url.pathname); + + return fetch(url.href) + .then(r => { + save(r); + return r.text(); + }) + .then(body => { + const $ = cheerio.load(body); + const hrefs = []; + + $('a[href]').each((i, $a) => { + hrefs.push($a.attribs.href); + }); + + return hrefs.reduce((promise, href) => { + return promise.then(() => handle(new URL(href, url.href))); + }, Promise.resolve()); + }) + .catch(err => { + console.error(`Error rendering ${url.pathname}: ${err.message}`); + }); + } + + return handle(new URL(origin)) // TODO all static routes + .then(() => server.close()); +} + +const cmd = process.argv[2]; +const start = Date.now(); + +if (cmd === 'build') { + build() + .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(); + + build() + .then(() => exporter()) + .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'); + }); +} diff --git a/lib/config.js b/lib/config.js deleted file mode 100644 index 27efcdc..0000000 --- a/lib/config.js +++ /dev/null @@ -1,21 +0,0 @@ -const path = require('path'); -const mkdirp = require('mkdirp'); -const rimraf = require('rimraf'); - -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.SAPPER_DEST || '.sapper'); - -if (exports.dev) { - mkdirp.sync(exports.dest); - rimraf.sync(path.join(exports.dest, '**/*')); -} - -exports.entry = { - client: path.resolve(exports.templates, '.main.rendered.js'), - server: path.resolve(exports.dest, 'server-entry.js') -}; \ No newline at end of file diff --git a/middleware.js b/middleware.js new file mode 100644 index 0000000..c23539e --- /dev/null +++ b/middleware.js @@ -0,0 +1,772 @@ +'use strict'; + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var fs = require('fs'); +var path = require('path'); +var serialize = _interopDefault(require('serialize-javascript')); +var escape_html = _interopDefault(require('escape-html')); +var glob = _interopDefault(require('glob')); +var mkdirp = _interopDefault(require('mkdirp')); +var rimraf = _interopDefault(require('rimraf')); +var chalk = _interopDefault(require('chalk')); +var framer = _interopDefault(require('code-frame')); +var locateCharacter = require('locate-character'); +var relative = _interopDefault(require('require-relative')); + +function create_matchers(files) { + const routes = files + .map(file => { + if (/(^|\/|\\)_/.test(file)) return; + + const parts = file.replace(/\.(html|js|mjs)$/, '').split('/'); // glob output is always posix-style + if (parts[parts.length - 1] === 'index') parts.pop(); + + const id = ( + parts.join('_').replace(/[[\]]/g, '$').replace(/^\d/, '_$&').replace(/[^a-zA-Z0-9_$]/g, '_') + ) || '_'; + + const dynamic = parts + .filter(part => part[0] === '[') + .map(part => part.slice(1, -1)); + + let pattern_string = ''; + let i = parts.length; + let nested = true; + while (i--) { + const part = parts[i]; + const dynamic = part[0] === '['; + + if (dynamic) { + pattern_string = nested ? `(?:\\/([^/]+)${pattern_string})?` : `\\/([^/]+)${pattern_string}`; + } else { + nested = false; + pattern_string = `\\/${part}${pattern_string}`; + } + } + + const pattern = new RegExp(`^${pattern_string}\\/?$`); + + const test = url => pattern.test(url); + + const exec = url => { + const match = pattern.exec(url); + if (!match) return; + + const params = {}; + dynamic.forEach((param, i) => { + params[param] = match[i + 1]; + }); + + return params; + }; + + return { + id, + type: path.extname(file) === '.html' ? 'page' : 'route', + file, + pattern, + test, + exec, + parts, + dynamic + }; + }) + .filter(Boolean) + .sort((a, b) => { + let same = true; + + for (let i = 0; true; i += 1) { + const a_part = a.parts[i]; + const b_part = b.parts[i]; + + if (!a_part && !b_part) { + if (same) throw new Error(`The ${a.file} and ${b.file} routes clash`); + return 0; + } + + if (!a_part) return -1; + if (!b_part) return 1; + + const a_is_dynamic = a_part[0] === '['; + const b_is_dynamic = b_part[0] === '['; + + if (a_is_dynamic === b_is_dynamic) { + if (!a_is_dynamic && a_part !== b_part) same = false; + continue; + } + + return a_is_dynamic ? 1 : -1; + } + }); + + return routes; +} + +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 callbacks = []; + +function onchange(fn) { + callbacks.push(fn); +} + +let routes; + +function update() { + routes = create_matchers( + glob.sync('**/*.+(html|js|mjs)', { cwd: src }) + ); + + callbacks.forEach(fn => fn()); +} + +update(); + +if (dev) { + const watcher = require('chokidar').watch(`${src}/**/*.+(html|js|mjs)`, { + ignoreInitial: true, + persistent: false + }); + + watcher.on('add', update); + watcher.on('change', update); + watcher.on('unlink', update); +} + + +var route_manager = Object.freeze({ + onchange: onchange, + get routes () { return routes; } +}); + +let templates$1; + +function error(e) { + if (e.title) console.error(chalk.bold.red(e.title)); + if (e.body) console.error(chalk.red(e.body)); + if (e.url) console.error(chalk.cyan(e.url)); + if (e.frame) console.error(chalk.grey(e.frame)); + + process.exit(1); +} + +function create_templates() { + templates$1 = glob.sync('*.html', { cwd: 'templates' }) + .map(file => { + const template = fs.readFileSync(`templates/${file}`, 'utf-8'); + const status = file.replace('.html', '').toLowerCase(); + + if (!/^[0-9x]{3}$/.test(status)) { + error({ + title: `templates/${file}`, + body: `Bad template — should be a valid status code like 404.html, or a wildcard like 2xx.html` + }); + } + + const index = template.indexOf('%sapper.main%'); + if (index !== -1) { + // TODO remove this in a future version + const { line, column } = locateCharacter.locate(template, index, { offsetLine: 1 }); + const frame = framer(template, line, column); + + error({ + title: `templates/${file}`, + body: ``; + + 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 = 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 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(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(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; diff --git a/mocha.opts b/mocha.opts index d68a99b..a1babb5 100644 --- a/mocha.opts +++ b/mocha.opts @@ -1,3 +1,4 @@ +--require ts-node/register --recursive test/unit/**/*.js test/common/test.js \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index aae8adf..4907693 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,36 @@ { "name": "sapper", - "version": "0.4.0", + "version": "0.5.1", "lockfileVersion": 1, "requires": true, "dependencies": { + "@std/esm": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@std/esm/-/esm-0.19.7.tgz", + "integrity": "sha512-bPBbpu1vqgOOD70aMVG5tgioPdttKXQQFq6xodjZxVbPprtZIcm8NcTEJoB+/1QoH8z1TIqjaEN1Wm3YndnfNQ==", + "dev": true + }, "@types/node": { - "version": "7.0.52", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.52.tgz", - "integrity": "sha512-jjpyQsKGsOF/wUElNjfPULk+d8PKvJOIXk3IUeBYYmNCy5dMWfrI+JiixYNw8ppKOlcRwWTXFl0B+i5oGrf95Q==" + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.3.0.tgz", + "integrity": "sha512-wNBfvNjzsJl4tswIZKXCFQY0lss9nKUyJnG6T94X/eqjRgI2jHZ4evdjhQYBSan/vGtF6XVXPApOmNH2rf0KKw==" + }, + "@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true }, "accepts": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", - "dev": true, "requires": { "mime-types": "2.1.17", "negotiator": "0.6.1" @@ -158,8 +175,7 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "array-map": { "version": "0.0.0", @@ -255,7 +271,7 @@ "dev": true, "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000791", + "caniuse-db": "1.0.30000793", "normalize-range": "0.1.2", "num2fraction": "1.2.2", "postcss": "5.2.18", @@ -351,7 +367,6 @@ "version": "1.18.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "dev": true, "requires": { "bytes": "3.0.0", "content-type": "1.0.4", @@ -363,17 +378,6 @@ "qs": "6.5.1", "raw-body": "2.3.2", "type-is": "1.6.15" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "boolbase": { @@ -490,8 +494,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000791", - "electron-to-chromium": "1.3.30" + "caniuse-db": "1.0.30000793", + "electron-to-chromium": "1.3.31" } }, "buffer": { @@ -522,8 +526,7 @@ "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "caller-path": { "version": "0.1.0", @@ -570,15 +573,15 @@ "dev": true, "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000791", + "caniuse-db": "1.0.30000793", "lodash.memoize": "4.1.2", "lodash.uniq": "4.5.0" } }, "caniuse-db": { - "version": "1.0.30000791", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000791.tgz", - "integrity": "sha1-Bnh/VsrvQwChfjXRN0RxI731Nvk=", + "version": "1.0.30000793", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000793.tgz", + "integrity": "sha1-PADGbkI6ehkHx92Wdpp4sq+opy4=", "dev": true }, "caseless": { @@ -859,26 +862,22 @@ "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "core-js": { "version": "2.5.3", @@ -979,9 +978,9 @@ "dev": true }, "css-loader": { - "version": "0.28.8", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.8.tgz", - "integrity": "sha512-4jGj7Ag6WUZ5lQyE4te9sJLn0lgkz6HI3WDE4aw98AkW1IAKXPP4blTpPeorlLDpNsYvojo0SYgRJOdz2KbuAw==", + "version": "0.28.9", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.9.tgz", + "integrity": "sha512-r3dgelMm/mkPz5Y7m9SeiGE46i2VsEU/OYbez+1llfxtv8b2y5/b5StaeEvPK3S5tlNQI+tDW/xDIhKJoZgDtw==", "dev": true, "requires": { "babel-code-frame": "6.26.0", @@ -992,7 +991,7 @@ "lodash.camelcase": "4.3.0", "object-assign": "4.1.1", "postcss": "5.2.18", - "postcss-modules-extract-imports": "1.1.0", + "postcss-modules-extract-imports": "1.2.0", "postcss-modules-local-by-default": "1.2.0", "postcss-modules-scope": "1.1.0", "postcss-modules-values": "1.3.0", @@ -1097,7 +1096,7 @@ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { - "es5-ext": "0.10.37" + "es5-ext": "0.10.38" } }, "dashdash": { @@ -1115,10 +1114,9 @@ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -1214,8 +1212,7 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "des.js": { "version": "1.0.0", @@ -1229,8 +1226,7 @@ "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "diff": { "version": "3.3.1", @@ -1319,8 +1315,7 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron": { "version": "1.7.10", @@ -1331,6 +1326,14 @@ "@types/node": "7.0.52", "electron-download": "3.3.0", "extract-zip": "1.6.6" + }, + "dependencies": { + "@types/node": { + "version": "7.0.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.52.tgz", + "integrity": "sha512-jjpyQsKGsOF/wUElNjfPULk+d8PKvJOIXk3IUeBYYmNCy5dMWfrI+JiixYNw8ppKOlcRwWTXFl0B+i5oGrf95Q==", + "dev": true + } } }, "electron-download": { @@ -1345,20 +1348,11 @@ "minimist": "1.2.0", "nugget": "2.0.1", "path-exists": "2.1.0", - "rc": "1.2.3", - "semver": "5.4.1", + "rc": "1.2.4", + "semver": "5.5.0", "sumchecker": "1.3.1" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -1376,20 +1370,11 @@ } } }, - "electron-releases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/electron-releases/-/electron-releases-2.1.0.tgz", - "integrity": "sha512-cyKFD1bTE/UgULXfaueIN1k5EPFzs+FRc/rvCY5tIynefAPqopQEgjr0EzY+U3Dqrk/G4m9tXSPuZ77v6dL/Rw==", - "dev": true - }, "electron-to-chromium": { - "version": "1.3.30", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.30.tgz", - "integrity": "sha512-zx1Prv7kYLfc4OA60FhxGbSo4qrEjgSzpo1/37i7l9ltXPYOoQBtjQxY9KmsgfHnBxHlBGXwLlsbt/gub1w5lw==", - "dev": true, - "requires": { - "electron-releases": "2.1.0" - } + "version": "1.3.31", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.31.tgz", + "integrity": "sha512-XE4CLbswkZgZFn34cKFy1xaX+F5LHxeDLjY1+rsK9asDzknhbrd9g/n/01/acbU25KTsUSiLKwvlLyA+6XLUOA==", + "dev": true }, "elliptic": { "version": "6.4.0", @@ -1413,14 +1398,12 @@ "encodeurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", - "dev": true + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" }, "encoding": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, "requires": { "iconv-lite": "0.4.19" } @@ -1504,9 +1487,9 @@ } }, "es5-ext": { - "version": "0.10.37", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", - "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", + "version": "0.10.38", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz", + "integrity": "sha512-jCMyePo7AXbUESwbl8Qi01VSH2piY9s/a3rSU/5w/MlTIx8HPL1xn2InGN8ejt/xulcJgnTO7vqNtOAxzYd2Kg==", "requires": { "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" @@ -1518,7 +1501,7 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.38", "es6-symbol": "3.1.1" } }, @@ -1528,7 +1511,7 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.38", "es6-iterator": "2.0.3", "es6-set": "0.1.5", "es6-symbol": "3.1.1", @@ -1547,7 +1530,7 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.38", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" @@ -1559,7 +1542,7 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.37" + "es5-ext": "0.10.38" } }, "es6-weak-map": { @@ -1568,7 +1551,7 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.38", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" } @@ -1595,9 +1578,9 @@ } }, "eslint": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.15.0.tgz", - "integrity": "sha512-zEO/Z1ZUxIQ+MhDVKkVTUYpIPDTEJLXGMrkID+5v1NeQHtCz6FZikWuFRgxE1Q/RV2V4zVl1u3xmpPADHhMZ6A==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.16.0.tgz", + "integrity": "sha512-YVXV4bDhNoHHcv0qzU4Meof7/P26B4EuaktMi5L1Tnt52Aov85KmYA8c5D+xyZr/BkhvwUqr011jDSD/QTULxg==", "dev": true, "requires": { "ajv": "5.5.2", @@ -1632,7 +1615,7 @@ "pluralize": "7.0.0", "progress": "2.0.0", "require-uncached": "1.0.3", - "semver": "5.4.1", + "semver": "5.5.0", "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", "table": "4.0.2", @@ -1645,6 +1628,15 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", @@ -1680,17 +1672,6 @@ "requires": { "debug": "2.6.9", "resolve": "1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "eslint-module-utils": { @@ -1701,17 +1682,6 @@ "requires": { "debug": "2.6.9", "pkg-dir": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "eslint-plugin-import": { @@ -1732,15 +1702,6 @@ "read-pkg-up": "2.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", @@ -1823,8 +1784,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "event-emitter": { "version": "0.3.5", @@ -1832,7 +1792,7 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.37" + "es5-ext": "0.10.38" } }, "event-stream": { @@ -1898,7 +1858,6 @@ "version": "4.16.2", "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", - "dev": true, "requires": { "accepts": "1.3.4", "array-flatten": "1.1.1", @@ -1930,17 +1889,6 @@ "type-is": "1.6.15", "utils-merge": "1.0.1", "vary": "1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "extend": { @@ -1980,15 +1928,6 @@ "yauzl": "2.4.1" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "mkdirp": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", @@ -2077,7 +2016,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "1.0.1", @@ -2086,17 +2024,6 @@ "parseurl": "1.3.2", "statuses": "1.3.1", "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "find-up": { @@ -2164,14 +2091,12 @@ "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "from": { "version": "0.1.7", @@ -3192,6 +3117,15 @@ "integrity": "sha1-eIspgVsS1Tus9XVkhHbm+QQdEz8=", "dev": true }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", @@ -3225,7 +3159,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, "requires": { "depd": "1.1.1", "inherits": "2.0.3", @@ -3236,14 +3169,12 @@ "depd": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" }, "setprototypeof": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" } } }, @@ -3266,8 +3197,7 @@ "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "icss-replace-symbols": { "version": "1.1.0", @@ -3421,8 +3351,7 @@ "ipaddr.js": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", - "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=", - "dev": true + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" }, "is-absolute-url": { "version": "2.1.0", @@ -3667,9 +3596,9 @@ } }, "js-base64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.0.tgz", - "integrity": "sha512-Wehd+7Pf9tFvGb+ydPm9TjYjV8X1YHOVyG8QyELZxEMqOhemVwGRmoG8iQ/soqI3n8v4xn59zaLxiCJiaaRzKA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.1.tgz", + "integrity": "sha512-2h586r2I/CqU7z1aa1kBgWaVAXWAZK+zHnceGi/jFgn7+7VSluxYer/i3xOZVearCxxXvyDkLtTBo+OeJCA3kA==", "dev": true }, "js-tokens": { @@ -3917,6 +3846,12 @@ "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", "dev": true }, + "make-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.2.tgz", + "integrity": "sha512-l9ra35l5VWLF24y75Tg8XgfGLX0ueRhph118WKM6H5denx4bB5QF59+4UAm9oJ2qsPQZas/CQUDdtDdfvYHBdQ==", + "dev": true + }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -3966,8 +3901,7 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { "version": "1.1.0", @@ -4094,14 +4028,12 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { "version": "2.3.11", @@ -4135,20 +4067,17 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" }, "mime-db": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", - "dev": true + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" }, "mime-types": { "version": "2.1.17", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "dev": true, "requires": { "mime-db": "1.30.0" } @@ -4227,6 +4156,15 @@ "supports-color": "4.4.0" }, "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", @@ -4247,8 +4185,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "mute-stream": { "version": "0.0.7", @@ -4271,8 +4208,7 @@ "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "nightmare": { "version": "2.10.0", @@ -4293,24 +4229,12 @@ "rimraf": "2.6.2", "sliced": "1.0.1", "split2": "2.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, "requires": { "encoding": "0.1.12", "is-stream": "1.1.0" @@ -4337,7 +4261,7 @@ "querystring-es3": "0.2.1", "readable-stream": "2.3.3", "stream-browserify": "2.0.1", - "stream-http": "2.7.2", + "stream-http": "2.8.0", "string_decoder": "1.0.3", "timers-browserify": "2.0.4", "tty-browserify": "0.0.0", @@ -4353,7 +4277,7 @@ "requires": { "hosted-git-info": "2.5.0", "is-builtin-module": "1.0.0", - "semver": "5.4.1", + "semver": "5.5.0", "validate-npm-package-license": "3.0.1" } }, @@ -4481,15 +4405,6 @@ "throttleit": "0.0.2" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -4539,7 +4454,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, "requires": { "ee-first": "1.1.1" } @@ -4666,19 +4580,24 @@ "error-ex": "1.3.1" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, "parse5": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", "requires": { - "@types/node": "7.0.52" + "@types/node": "9.3.0" } }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, "path-browserify": { "version": "0.0.0", @@ -4715,8 +4634,7 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { "version": "2.0.0", @@ -4822,7 +4740,7 @@ "dev": true, "requires": { "chalk": "1.1.3", - "js-base64": "2.4.0", + "js-base64": "2.4.1", "source-map": "0.5.7", "supports-color": "3.2.3" }, @@ -5044,9 +4962,9 @@ } }, "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz", + "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=", "dev": true, "requires": { "postcss": "6.0.16" @@ -5363,7 +5281,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", - "dev": true, "requires": { "forwarded": "0.1.2", "ipaddr.js": "1.5.2" @@ -5414,8 +5331,7 @@ "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, "query-string": { "version": "4.3.4", @@ -5437,6 +5353,11 @@ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=" + }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", @@ -5494,14 +5415,12 @@ "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raw-body": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "dev": true, "requires": { "bytes": "3.0.0", "http-errors": "1.6.2", @@ -5510,9 +5429,9 @@ } }, "rc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.3.tgz", - "integrity": "sha1-UVdakA+N1oOBxxC0cSwhVMPiA1s=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.4.tgz", + "integrity": "sha1-oPYGyq4qO4YrvQ74VILAElsxX6M=", "dev": true, "requires": { "deep-extend": "0.4.2", @@ -5718,7 +5637,7 @@ "stringstream": "0.0.5", "tough-cookie": "2.3.3", "tunnel-agent": "0.6.0", - "uuid": "3.1.0" + "uuid": "3.2.1" } }, "require-directory": { @@ -5746,6 +5665,11 @@ "resolve-from": "1.0.1" } }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, "resolve": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", @@ -5894,15 +5818,14 @@ } }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, "send": { "version": "0.16.1", "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", - "dev": true, "requires": { "debug": "2.6.9", "depd": "1.1.2", @@ -5917,17 +5840,6 @@ "on-finished": "2.3.0", "range-parser": "1.2.0", "statuses": "1.3.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "serialize-javascript": { @@ -5939,7 +5851,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", - "dev": true, "requires": { "encodeurl": "1.0.1", "escape-html": "1.0.3", @@ -5965,8 +5876,7 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "sha.js": { "version": "2.4.9", @@ -6080,6 +5990,23 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, + "source-map-support": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.2.tgz", + "integrity": "sha512-9zHceZbQwERaMK1MiFguvx1dL9GQPLXInr2D/wUxAsuV6ZKc9F0DHYWeloMcalkYRbtanwqUakoDjvj55cL/4A==", + "dev": true, + "requires": { + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "spdx-correct": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", @@ -6159,8 +6086,7 @@ "statuses": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" }, "stream-browserify": { "version": "2.0.1", @@ -6181,9 +6107,9 @@ } }, "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", + "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", "requires": { "builtin-status-codes": "3.0.0", "inherits": "2.0.3", @@ -6303,17 +6229,6 @@ "requires": { "debug": "2.6.9", "es6-promise": "4.2.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "supports-color": { @@ -6325,9 +6240,9 @@ } }, "svelte": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-1.51.1.tgz", - "integrity": "sha512-Uf9huHmtXLzdmkfuEYQeXMvFE9dt8M9/jzujX3/Q2Ek2dzvVz1ARTLP76hlnGqUf4q28w8wfkQxFEx4LgDV5MQ==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-1.53.0.tgz", + "integrity": "sha512-0Hfv3Ez7IH0X69EXyvAo2PpmvdNU7CfmAjDuDJuzvf5Jk69FKmC9HexKNqiN6UvnLjkoHCaZK3SI+A0Q+5/odA==", "dev": true }, "svelte-loader": { @@ -6500,10 +6415,48 @@ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, + "ts-node": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz", + "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "chalk": "2.3.0", + "diff": "3.3.1", + "make-error": "1.3.2", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map-support": "0.5.2", + "tsconfig": "7.0.0", + "v8flags": "3.0.1", + "yn": "2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "requires": { + "@types/strip-bom": "3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1" + } + }, "tslib": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", - "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", "dev": true }, "tty-browserify": { @@ -6540,7 +6493,6 @@ "version": "1.6.15", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", - "dev": true, "requires": { "media-typer": "0.3.0", "mime-types": "2.1.17" @@ -6621,8 +6573,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "url": { "version": "0.11.0", @@ -6640,6 +6591,15 @@ } } }, + "url-parse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", + "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + } + }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -6663,15 +6623,23 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", "dev": true }, + "v8flags": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", + "integrity": "sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + }, "validate-npm-package-license": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", @@ -6684,8 +6652,7 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "vendors": { "version": "1.0.1", @@ -6959,6 +6926,12 @@ "requires": { "fd-slicer": "1.0.1" } + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true } } } diff --git a/package.json b/package.json index 8501e75..360d881 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,13 @@ "name": "sapper", "version": "0.5.1", "description": "Military-grade apps, engineered by Svelte", - "main": "lib/index.js", + "main": "middleware.js", "bin": { "sapper": "cli/index.js" }, "files": [ - "cli", - "lib", + "cli.js", + "middleware.js", "runtime", "runtime.js", "webpack" @@ -22,8 +22,11 @@ "chokidar": "^1.7.0", "code-frame": "^5.0.0", "escape-html": "^1.0.3", + "express": "^4.16.2", + "glob": "^7.1.2", "locate-character": "^2.0.5", "mkdirp": "^0.5.1", + "node-fetch": "^1.7.3", "relative": "^3.0.2", "require-relative": "^0.8.7", "rimraf": "^2.6.2", @@ -35,20 +38,20 @@ "webpack-hot-middleware": "^2.21.0" }, "devDependencies": { + "@std/esm": "^0.19.7", "css-loader": "^0.28.7", "eslint": "^4.13.1", "eslint-plugin-import": "^2.8.0", - "express": "^4.16.2", "get-port": "^3.2.0", "mocha": "^4.0.1", "nightmare": "^2.10.0", - "node-fetch": "^1.7.3", "npm-run-all": "^4.1.2", "rollup": "^0.53.0", "rollup-plugin-typescript": "^0.8.1", "style-loader": "^0.19.1", "svelte": "^1.49.1", "svelte-loader": "^2.3.2", + "ts-node": "^4.1.0", "tslib": "^1.8.1", "typescript": "^2.6.2", "wait-on": "^2.0.2" diff --git a/rollup.config.js b/rollup.config.js index 77a4f03..8074091 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,6 +1,59 @@ import typescript from 'rollup-plugin-typescript'; +import pkg from './package.json'; + +const external = [].concat( + Object.keys(pkg.dependencies), + Object.keys(process.binding('natives')) +); export default [ + // cli.js + { + input: 'src/cli/index.js', + output: { + file: 'cli.js', + format: 'cjs', + banner: '#!/usr/bin/env node' + }, + external, + plugins: [ + typescript({ + typescript: require('typescript') + }) + ] + }, + + // core.js + // { + // input: 'src/core/index.js', + // output: { + // file: 'core.js', + // format: 'cjs', + // banner: '#!/usr/bin/env node' + // }, + // external, + // plugins: [ + // typescript({ + // typescript: require('typescript') + // }) + // ] + // }, + + // middleware.js + { + input: 'src/middleware/index.js', + output: { + file: 'middleware.js', + format: 'cjs' + }, + external, + plugins: [ + typescript({ + typescript: require('typescript') + }) + ] + }, + // runtime.js { input: 'src/runtime/index.ts', @@ -8,6 +61,22 @@ export default [ file: 'runtime.js', format: 'es' }, + external, + plugins: [ + typescript({ + typescript: require('typescript') + }) + ] + }, + + // webpack/config.js + { + input: 'src/webpack/index.js', + output: { + file: 'webpack/config.js', + format: 'cjs' + }, + external, plugins: [ typescript({ typescript: require('typescript') diff --git a/runtime/README.md b/runtime/README.md new file mode 100644 index 0000000..7b650d6 --- /dev/null +++ b/runtime/README.md @@ -0,0 +1 @@ +This directory exists for legacy reasons and should be deleted before releasing version 1. \ No newline at end of file diff --git a/cli/index.js b/src/cli/index.js similarity index 85% rename from cli/index.js rename to src/cli/index.js index afd006a..1999207 100755 --- a/cli/index.js +++ b/src/cli/index.js @@ -1,6 +1,5 @@ -#!/usr/bin/env node - -const build = require('../lib/build.js'); +import build from '../shared/build.js'; +import exporter from '../shared/export.js'; const cmd = process.argv[2]; const start = Date.now(); @@ -18,7 +17,7 @@ if (cmd === 'build') { const start = Date.now(); build() - .then(() => require('../lib/utils/export.js')()) + .then(() => exporter()) .then(() => { const elapsed = Date.now() - start; console.error(`extracted in ${elapsed}ms`); // TODO beautify this, e.g. 'built in 4.7 seconds' diff --git a/src/config.js b/src/config.js new file mode 100644 index 0000000..35f2d33 --- /dev/null +++ b/src/config.js @@ -0,0 +1,21 @@ +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') +}; \ No newline at end of file diff --git a/lib/index.js b/src/middleware/index.js similarity index 91% rename from lib/index.js rename to src/middleware/index.js index 8b3648a..87b24b6 100644 --- a/lib/index.js +++ b/src/middleware/index.js @@ -1,14 +1,14 @@ -const fs = require('fs'); -const path = require('path'); -const serialize = require('serialize-javascript'); -const route_manager = require('./route_manager.js'); -const templates = require('./templates.js'); -const create_app = require('./utils/create_app.js'); -const create_watcher = require('./utils/create_watcher.js'); -const compilers = require('./utils/compilers.js'); -const generate_asset_cache = require('./utils/generate_asset_cache.js'); -const escape_html = require('escape-html'); -const { dest, dev } = require('./config.js'); +import * as fs from 'fs'; +import * as path from 'path'; +import serialize from 'serialize-javascript'; +import escape_html from 'escape-html'; +import * as route_manager from '../shared/route_manager.js'; +import * as templates from '../shared/templates.js'; +import create_app from '../shared/utils/create_app.js'; +import create_watcher from '../shared/utils/create_watcher.js'; +import * as compilers from '../shared/utils/compilers.js'; +import generate_asset_cache from '../shared/generate_asset_cache.js'; +import { dest, dev } from '../config.js'; function connect_dev() { create_app(); @@ -109,7 +109,7 @@ function connect_prod() { return middleware; } -module.exports = dev ? connect_dev : connect_prod; +export default dev ? connect_dev : connect_prod; function set_req_pathname(req, res, next) { req.pathname = req.url.replace(/\?.+/, ''); diff --git a/src/middleware/tmp.json b/src/middleware/tmp.json new file mode 100644 index 0000000..1f3ea02 --- /dev/null +++ b/src/middleware/tmp.json @@ -0,0 +1,154 @@ +[ + { + "x": 1979, + "y": 7.19 + }, + { + "x": 1980, + "y": 7.83 + }, + { + "x": 1981, + "y": 7.24 + }, + { + "x": 1982, + "y": 7.44 + }, + { + "x": 1983, + "y": 7.51 + }, + { + "x": 1984, + "y": 7.1 + }, + { + "x": 1985, + "y": 6.91 + }, + { + "x": 1986, + "y": 7.53 + }, + { + "x": 1987, + "y": 7.47 + }, + { + "x": 1988, + "y": 7.48 + }, + { + "x": 1989, + "y": 7.03 + }, + { + "x": 1990, + "y": 6.23 + }, + { + "x": 1991, + "y": 6.54 + }, + { + "x": 1992, + "y": 7.54 + }, + { + "x": 1993, + "y": 6.5 + }, + { + "x": 1994, + "y": 7.18 + }, + { + "x": 1995, + "y": 6.12 + }, + { + "x": 1996, + "y": 7.87 + }, + { + "x": 1997, + "y": 6.73 + }, + { + "x": 1998, + "y": 6.55 + }, + { + "x": 1999, + "y": 6.23 + }, + { + "x": 2000, + "y": 6.31 + }, + { + "x": 2001, + "y": 6.74 + }, + { + "x": 2002, + "y": 5.95 + }, + { + "x": 2003, + "y": 6.13 + }, + { + "x": 2004, + "y": 6.04 + }, + { + "x": 2005, + "y": 5.56 + }, + { + "x": 2006, + "y": 5.91 + }, + { + "x": 2007, + "y": 4.29 + }, + { + "x": 2008, + "y": 4.72 + }, + { + "x": 2009, + "y": 5.38 + }, + { + "x": 2010, + "y": 4.92 + }, + { + "x": 2011, + "y": 4.61 + }, + { + "x": 2012, + "y": 3.62 + }, + { + "x": 2013, + "y": 5.35 + }, + { + "x": 2014, + "y": 5.28 + }, + { + "x": 2015, + "y": 4.63 + }, + { + "x": 2016, + "y": 4.72 + } + ] \ No newline at end of file diff --git a/lib/build.js b/src/shared/build.js similarity index 72% rename from lib/build.js rename to src/shared/build.js index 445a0ce..3f18d0a 100644 --- a/lib/build.js +++ b/src/shared/build.js @@ -1,15 +1,15 @@ process.env.NODE_ENV = 'production'; -const fs = require('fs'); -const path = require('path'); -const mkdirp = require('mkdirp'); -const rimraf = require('rimraf'); -const { client, server } = require('./utils/compilers.js'); -const create_app = require('./utils/create_app.js'); -const generate_asset_cache = require('./utils/generate_asset_cache.js'); -const { dest } = require('./config.js'); +import * as fs from 'fs'; +import * as path from 'path'; +import mkdirp from 'mkdirp'; +import rimraf from 'rimraf'; +import { client, server } from './utils/compilers.js'; +import create_app from './utils/create_app.js'; +import generate_asset_cache from './generate_asset_cache.js'; +import { dest } from '../config.js'; -module.exports = () => { +export default () => { mkdirp.sync(dest); rimraf.sync(path.join(dest, '**/*')); diff --git a/lib/utils/export.js b/src/shared/export.js similarity index 82% rename from lib/utils/export.js rename to src/shared/export.js index 0b9cb26..b13ea45 100644 --- a/lib/utils/export.js +++ b/src/shared/export.js @@ -1,22 +1,24 @@ -const path = require('path'); -const sander = require('sander'); -const app = require('express')(); -const cheerio = require('cheerio'); -const fetch = require('node-fetch'); -const URL = require('url-parse'); -const generate_asset_cache = require('./generate_asset_cache.js'); -const sapper = require('../index.js'); +import * as path from 'path'; +import * as sander from 'sander'; +import express from 'express'; +import cheerio from 'cheerio'; +import fetch from 'node-fetch'; +import URL from 'url-parse'; +import generate_asset_cache from './generate_asset_cache.js'; +import { dest } from '../config.js'; +import middleware from '../middleware/index.js'; const { PORT = 3000, OUTPUT_DIR = 'dist' } = process.env; -const { dest } = require('../config.js'); const origin = `http://localhost:${PORT}`; +const app = express(); + function read_json(file) { return JSON.parse(sander.readFileSync(file, { encoding: 'utf-8' })); } -module.exports = function() { +export default function() { // Prep output directory sander.rimrafSync(OUTPUT_DIR); @@ -60,7 +62,7 @@ module.exports = function() { return fetch(url, opts); }; - app.use(sapper()); + app.use(middleware()); const server = app.listen(PORT); const seen = new Set(); @@ -95,4 +97,4 @@ module.exports = function() { return handle(new URL(origin)) // TODO all static routes .then(() => server.close()); -}; +} \ No newline at end of file diff --git a/lib/utils/generate_asset_cache.js b/src/shared/generate_asset_cache.js similarity index 85% rename from lib/utils/generate_asset_cache.js rename to src/shared/generate_asset_cache.js index d0143c7..91ae425 100644 --- a/lib/utils/generate_asset_cache.js +++ b/src/shared/generate_asset_cache.js @@ -1,15 +1,15 @@ -const fs = require('fs'); -const path = require('path'); -const glob = require('glob'); -const templates = require('../templates.js'); -const route_manager = require('../route_manager.js'); -const { dest, dev } = require('../config.js'); +import * as fs from 'fs'; +import * as path from 'path'; +import glob from 'glob'; +import * as templates from './templates.js'; +import * as route_manager from './route_manager.js'; +import { dest, dev } from '../config.js'; function ensure_array(thing) { return Array.isArray(thing) ? thing : [thing]; // omg webpack what the HELL are you doing } -module.exports = function generate_asset_cache(clientInfo, serverInfo) { +export default function generate_asset_cache(clientInfo, serverInfo) { const main_file = `/client/${ensure_array(clientInfo.assetsByChunkName.main)[0]}`; const chunk_files = clientInfo.assets.map(chunk => `/client/${chunk.name}`); @@ -48,7 +48,7 @@ module.exports = function generate_asset_cache(clientInfo, serverInfo) { service_worker }; -}; +} function generate_service_worker(chunk_files) { const assets = glob.sync('**', { cwd: 'assets', nodir: true }); diff --git a/src/shared/index.js b/src/shared/index.js new file mode 100644 index 0000000..98c7757 --- /dev/null +++ b/src/shared/index.js @@ -0,0 +1,7 @@ +import * as route_manager from './route_manager.js'; +import * as templates from './templates.js'; + +export { default as build } from './build.js'; +export { default as export } from './export.js'; +export { default as generate_asset_cache } from './generate_asset_cache.js'; +export { route_manager, templates }; \ No newline at end of file diff --git a/lib/route_manager.js b/src/shared/route_manager.js similarity index 66% rename from lib/route_manager.js rename to src/shared/route_manager.js index 7f0f9a2..9efe5b9 100644 --- a/lib/route_manager.js +++ b/src/shared/route_manager.js @@ -1,15 +1,17 @@ -const glob = require('glob'); -const create_routes = require('./utils/create_routes.js'); -const { src, dev } = require('./config.js'); +import glob from 'glob'; +import create_routes from './utils/create_routes.js'; +import { src, dev } from '../config.js'; const callbacks = []; -exports.onchange = fn => { +export function onchange(fn) { callbacks.push(fn); -}; +} + +export let routes; function update() { - exports.routes = create_routes( + routes = create_routes( glob.sync('**/*.+(html|js|mjs)', { cwd: src }) ); diff --git a/lib/templates.js b/src/shared/templates.js similarity index 91% rename from lib/templates.js rename to src/shared/templates.js index 9568d50..216783c 100644 --- a/lib/templates.js +++ b/src/shared/templates.js @@ -1,9 +1,9 @@ -const fs = require('fs'); -const glob = require('glob'); -const chalk = require('chalk'); -const framer = require('code-frame'); -const { locate } = require('locate-character'); -const { dev } = require('./config.js'); +import * as fs from 'fs'; +import glob from 'glob'; +import chalk from 'chalk'; +import framer from 'code-frame'; +import { locate } from 'locate-character'; +import { dev } from '../config.js'; let templates; @@ -112,16 +112,16 @@ if (dev) { watcher.on('unlink', create_templates); } -exports.render = (status, data) => { +export function render(status, data) { const template = templates.find(template => template.test(status)); if (template) return template.render(data); return `Missing template for status code ${status}`; -}; +} -exports.stream = (res, status, data) => { +export function stream(res, status, data) { const template = templates.find(template => template.test(status)); if (template) return template.stream(res, data); return `Missing template for status code ${status}`; -}; +} diff --git a/lib/utils/compilers.js b/src/shared/utils/compilers.js similarity index 54% rename from lib/utils/compilers.js rename to src/shared/utils/compilers.js index 58bf7d2..3def12e 100644 --- a/lib/utils/compilers.js +++ b/src/shared/utils/compilers.js @@ -1,11 +1,12 @@ -const path = require('path'); -const relative = require('require-relative'); +import * as path from 'path'; +import relative from 'require-relative'; + const webpack = relative('webpack', process.cwd()); -exports.client = webpack( +export const client = webpack( require(path.resolve('webpack.client.config.js')) ); -exports.server = webpack( +export const server = webpack( require(path.resolve('webpack.server.config.js')) ); \ No newline at end of file diff --git a/lib/utils/create_app.js b/src/shared/utils/create_app.js similarity index 92% rename from lib/utils/create_app.js rename to src/shared/utils/create_app.js index e4da699..6fcb64e 100644 --- a/lib/utils/create_app.js +++ b/src/shared/utils/create_app.js @@ -1,7 +1,7 @@ -const fs = require('fs'); -const path = require('path'); -const route_manager = require('../route_manager.js'); -const { src, entry, dev } = require('../config.js'); +import * as fs from 'fs'; +import * as path from 'path'; +import * as route_manager from '../route_manager.js'; +import { src, entry, dev } from '../../config.js'; function posixify(file) { return file.replace(/[/\\]/g, '/'); @@ -79,4 +79,4 @@ if (dev) { watcher.on('unlink', create_app); } -module.exports = create_app; +export default create_app; diff --git a/lib/utils/create_routes.js b/src/shared/utils/create_routes.js similarity index 95% rename from lib/utils/create_routes.js rename to src/shared/utils/create_routes.js index 8e4122f..97b6d09 100644 --- a/lib/utils/create_routes.js +++ b/src/shared/utils/create_routes.js @@ -1,6 +1,6 @@ -const path = require('path'); +import * as path from 'path'; -module.exports = function create_matchers(files) { +export default function create_matchers(files) { const routes = files .map(file => { if (/(^|\/|\\)_/.test(file)) return; @@ -87,4 +87,4 @@ module.exports = function create_matchers(files) { }); return routes; -}; \ No newline at end of file +} \ No newline at end of file diff --git a/lib/utils/create_watcher.js b/src/shared/utils/create_watcher.js similarity index 83% rename from lib/utils/create_watcher.js rename to src/shared/utils/create_watcher.js index b4ed3bf..c0f3c34 100644 --- a/lib/utils/create_watcher.js +++ b/src/shared/utils/create_watcher.js @@ -1,9 +1,9 @@ -const fs = require('fs'); -const path = require('path'); -const chalk = require('chalk'); -const compilers = require('./compilers.js'); -const generate_asset_cache = require('./generate_asset_cache.js'); -const { dest } = require('../config.js'); +import * as fs from 'fs'; +import * as path from 'path'; +import chalk from 'chalk'; +import * as compilers from './compilers.js'; +import generate_asset_cache from '../../shared/generate_asset_cache.js'; +import { dest } from '../../config.js'; function deferred() { const d = {}; @@ -16,7 +16,7 @@ function deferred() { return d; } -module.exports = function create_watcher() { +export default function create_watcher() { const deferreds = { client: deferred(), server: deferred() @@ -72,4 +72,4 @@ module.exports = function create_watcher() { }; return watcher; -}; \ No newline at end of file +} \ No newline at end of file diff --git a/src/webpack/index.js b/src/webpack/index.js new file mode 100644 index 0000000..5c50bab --- /dev/null +++ b/src/webpack/index.js @@ -0,0 +1,44 @@ +import { dest, dev, entry } from '../config.js'; + +export default { + 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' + }; + } + } +}; diff --git a/test/common/test.js b/test/common/test.js index cd56f9a..efe7216 100644 --- a/test/common/test.js +++ b/test/common/test.js @@ -1,11 +1,18 @@ -const path = require('path'); -const assert = require('assert'); +import * as path from 'path'; +import * as assert from 'assert'; + +// import express from 'express'; +// import Nightmare from 'nightmare'; +// import serve from 'serve-static'; +// import walkSync from 'walk-sync'; +// import fetch from 'node-fetch'; + +// TODO reintegrate these as imports +const Nightmare = require('nightmare'); const express = require('express'); const serve = require('serve-static'); -const Nightmare = require('nightmare'); -const getPort = require('get-port'); -const fetch = require('node-fetch'); const walkSync = require('walk-sync'); +const fetch = require('node-fetch'); run('production'); run('development'); @@ -82,7 +89,7 @@ function run(env) { let sapper; if (env === 'production') { - const cli = path.resolve(__dirname, '../../cli/index.js'); + const cli = path.resolve(__dirname, '../../cli.js'); exec_promise = exec(`node ${cli} export`); } @@ -91,7 +98,7 @@ function run(env) { delete require.cache[resolved]; sapper = require(resolved); - return getPort(); + return require('get-port')(); }).then(port => { PORT = port; base = `http://localhost:${PORT}`; diff --git a/test/unit/create_routes.test.js b/test/unit/create_routes.test.js index 3589db6..cbc4856 100644 --- a/test/unit/create_routes.test.js +++ b/test/unit/create_routes.test.js @@ -1,7 +1,6 @@ -const path = require('path'); -const assert = require('assert'); +import * as assert from 'assert'; -const create_routes = require('../../lib/utils/create_routes.js'); +import create_routes from '../../src/shared/utils/create_routes.js'; describe('create_routes', () => { it('sorts routes correctly', () => { diff --git a/webpack/config.js b/webpack/config.js index ae0aed2..0b51e8e 100644 --- a/webpack/config.js +++ b/webpack/config.js @@ -1,6 +1,30 @@ -const { dest, dev, entry } = require('../lib/config.js'); +'use strict'; -module.exports = { +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: { @@ -42,3 +66,5 @@ module.exports = { } } }; + +module.exports = index; diff --git a/webpack/hmr.js b/webpack/hmr.js deleted file mode 100644 index 39cb639..0000000 --- a/webpack/hmr.js +++ /dev/null @@ -1 +0,0 @@ -import 'webpack-hot-middleware/client?path=/__webpack_hmr&timeout=20000'; \ No newline at end of file