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