From 82a023c302b2733f8e9ec9632854df5e5110e84a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 20 Dec 2018 23:16:03 -0500 Subject: [PATCH 01/38] various --- package-lock.json | 34 +++++----------- src/cli.ts | 2 + src/core/create_compilers/RollupResult.ts | 3 +- src/core/create_compilers/extract_css.ts | 7 +++- src/core/create_manifests.ts | 18 +++++---- templates/src/client/app.ts | 39 +++++++++++-------- templates/src/client/types.ts | 6 +-- .../src/server/middleware/get_page_handler.ts | 8 ++-- 8 files changed, 59 insertions(+), 58 deletions(-) diff --git a/package-lock.json b/package-lock.json index b6b895e..b51052d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sapper", - "version": "0.24.0", + "version": "0.24.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1805,7 +1805,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -2362,14 +2362,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2384,20 +2382,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -2514,8 +2509,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -2527,7 +2521,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2542,7 +2535,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2550,14 +2542,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -2576,7 +2566,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -2657,8 +2646,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -2670,7 +2658,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -2792,7 +2779,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4400,7 +4386,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, diff --git a/src/cli.ts b/src/cli.ts index d3e8667..43e4d45 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -129,6 +129,7 @@ prog.command('dev') }); } catch (err) { console.log(colors.bold.red(`> ${err.message}`)); + console.log(colors.gray(err.stack)); process.exit(1); } }); @@ -171,6 +172,7 @@ prog.command('build [dest]') console.error(`\n> Finished in ${elapsed(start)}. Type ${colors.bold.cyan(`node ${dest}`)} to run the app.`); } catch (err) { console.log(`${colors.bold.red(`> ${err.message}`)}`); + console.log(colors.gray(err.stack)); process.exit(1); } }); diff --git a/src/core/create_compilers/RollupResult.ts b/src/core/create_compilers/RollupResult.ts index 1c44c2c..adbfeb0 100644 --- a/src/core/create_compilers/RollupResult.ts +++ b/src/core/create_compilers/RollupResult.ts @@ -47,7 +47,8 @@ export default class RollupResult implements CompileResult { } else { for (const name in compiler.input) { const file = compiler.input[name]; - this.assets[name] = compiler.chunks.find(chunk => file in chunk.modules).fileName; + const chunk = compiler.chunks.find(chunk => file in chunk.modules); + if (chunk) this.assets[name] = chunk.fileName; } } diff --git a/src/core/create_compilers/extract_css.ts b/src/core/create_compilers/extract_css.ts index a60d848..47bf99e 100644 --- a/src/core/create_compilers/extract_css.ts +++ b/src/core/create_compilers/extract_css.ts @@ -161,6 +161,8 @@ export default function extract_css(client_result: CompileResult, components: Pa // recursively find the chunks this component depends on entry_chunk_dependencies.forEach(chunk => { + if (!chunk) return; // TODO why does this happen? + chunk.imports.forEach(file => { entry_chunk_dependencies.add(lookup.get(file)); }); @@ -182,7 +184,8 @@ export default function extract_css(client_result: CompileResult, components: Pa if (!chunk) { // this should never happen! - throw new Error(`Could not find chunk that owns ${component.file}`); + return; + // throw new Error(`Could not find chunk that owns ${component.file}`); } const chunk_dependencies: Set = new Set([chunk]); @@ -190,6 +193,8 @@ export default function extract_css(client_result: CompileResult, components: Pa // recursively find the chunks this component depends on chunk_dependencies.forEach(chunk => { + if (!chunk) return; // TODO why does this happen? + chunk.imports.forEach(file => { chunk_dependencies.add(lookup.get(file)); }); diff --git a/src/core/create_manifests.ts b/src/core/create_manifests.ts index 3ff7a95..5ce21f0 100644 --- a/src/core/create_manifests.ts +++ b/src/core/create_manifests.ts @@ -151,11 +151,11 @@ function generate_client( } return `// This file is generated by Sapper — do not edit it!\n` + template - .replace('__ROOT__', stringify(get_file(path_to_routes, manifest_data.root), false)) - .replace('__ERROR__', stringify(posixify(`${path_to_routes}/_error.html`), false)) - .replace('__IGNORE__', `[${server_routes_to_ignore.map(route => route.pattern).join(', ')}]`) - .replace('__COMPONENTS__', components) - .replace('__PAGES__', pages) + + .replace(/__ROOT__/g, stringify(get_file(path_to_routes, manifest_data.root), false)) + .replace(/__ERROR__/g, stringify(posixify(`${path_to_routes}/_error.html`), false)) + .replace(/__IGNORE__/g, `[${server_routes_to_ignore.map(route => route.pattern).join(', ')}]`) + .replace(/__COMPONENTS__/g, components) + .replace(/__PAGES__/g, pages) + footer; } @@ -174,8 +174,8 @@ function generate_server( manifest_data.server_routes.map(route => `import * as __${route.name} from ${stringify(posixify(`${path_to_routes}/${route.file}`))};`), manifest_data.components.map(component => - `import __${component.name} from ${stringify(get_file(path_to_routes, component))};`), - `import root from ${stringify(get_file(path_to_routes, manifest_data.root))};`, + `import __${component.name}, * as __${component.name}_static from ${stringify(get_file(path_to_routes, component))};`), + `import root, * as root_static from ${stringify(get_file(path_to_routes, manifest_data.root))};`, `import error from ${stringify(posixify(`${path_to_routes}/_error.html`))};` ); @@ -207,7 +207,8 @@ function generate_server( const props = [ `name: "${part.component.name}"`, `file: ${stringify(part.component.file)}`, - `component: __${part.component.name}` + `component: __${part.component.name}`, + `preload: __${part.component.name}_static.preload` ]; if (part.params.length > 0) { @@ -222,6 +223,7 @@ function generate_server( ], root, + root_preload: root_static['pre' + 'load'], error };`.replace(/^\t\t/gm, '').trim(); diff --git a/templates/src/client/app.ts b/templates/src/client/app.ts index 8461d3d..a99df92 100644 --- a/templates/src/client/app.ts +++ b/templates/src/client/app.ts @@ -1,4 +1,4 @@ -import RootComponent from '__ROOT__'; +import RootComponent, * as RootComponentStatic from '__ROOT__'; import ErrorComponent from '__ERROR__'; import { Target, @@ -127,7 +127,7 @@ export function navigate(target: Target, id: number, noscroll?: boolean, hash?: cid = id; if (root_component) { - root_component.set({ preloading: true }); + root_component.$set({ preloading: true }); } const loaded = prefetching && prefetching.href === target.url.href ? prefetching.promise : @@ -146,12 +146,12 @@ export function navigate(target: Target, id: number, noscroll?: boolean, hash?: }); } -function render(data: any, nullable_depth: number, scroll: ScrollPosition, noscroll: boolean, hash: string, token: {}) { +function render(props: any, nullable_depth: number, scroll: ScrollPosition, noscroll: boolean, hash: string, token: {}) { if (current_token !== token) return; if (root_component) { // first, clear out highest-level root component - let level = data.child; + let level = props.child; for (let i = 0; i < nullable_depth; i += 1) { if (i === nullable_depth) break; level = level.props.child; @@ -159,11 +159,12 @@ function render(data: any, nullable_depth: number, scroll: ScrollPosition, noscr const { component } = level; level.component = null; - root_component.set({ child: data.child }); + root_component.$set({ child: props.child }); // then render new stuff + // TODO do we need to call `flush` before doing this? level.component = component; - root_component.set(data); + root_component.$set(props); } else { // first load — remove SSR'd contents const start = document.querySelector('#sapper-head-start'); @@ -175,11 +176,11 @@ function render(data: any, nullable_depth: number, scroll: ScrollPosition, noscr detach(end); } - Object.assign(data, root_data); + Object.assign(props, root_data); root_component = new RootComponent({ target, - data, + props, store, hydrate: true }); @@ -201,7 +202,7 @@ function render(data: any, nullable_depth: number, scroll: ScrollPosition, noscr if (scroll) scrollTo(scroll.x, scroll.y); } - Object.assign(root_props, data); + Object.assign(root_props, props); ready = true; } @@ -238,8 +239,9 @@ export function prepare_page(target: Target): Promise<{ }; if (!root_preload) { - root_preload = RootComponent.preload - ? initial_data.preloaded[0] || RootComponent.preload.call(preload_context, { + const preload_fn = RootComponentStatic['pre' + 'load']; // Rollup makes us jump through these hoops :( + root_preload = preload_fn + ? initial_data.preloaded[0] || preload_fn.call(preload_context, { path, query, params: {} @@ -251,7 +253,7 @@ export function prepare_page(target: Target): Promise<{ if (i < changed_from) return null; if (!part) return null; - return load_component(components[part.i]).then(Component => { + return load_component(components[part.i]).then(({ default: Component, preload }) => { const req = { path, query, @@ -260,8 +262,8 @@ export function prepare_page(target: Target): Promise<{ let preloaded; if (ready || !initial_data.preloaded[i + 1]) { - preloaded = Component.preload - ? Component.preload.call(preload_context, req) + preloaded = preload + ? preload.call(preload_context, req) : {}; } else { preloaded = initial_data.preloaded[i + 1]; @@ -303,7 +305,7 @@ export function prepare_page(target: Target): Promise<{ }; return { - data: Object.assign({}, props, { + props: Object.assign({}, props, { preloading: false, child: { component: ErrorComponent, @@ -372,12 +374,15 @@ function load_css(chunk: string) { }); } -export function load_component(component: ComponentLoader): Promise { +export function load_component(component: ComponentLoader): Promise<{ + default: ComponentConstructor, + preload?: (input: any) => any +}> { // TODO this is temporary — once placeholders are // always rewritten, scratch the ternary const promises: Array> = (typeof component.css === 'string' ? [] : component.css.map(load_css)); promises.unshift(component.js()); - return Promise.all(promises).then(values => values[0].default); + return Promise.all(promises).then(values => values[0]); } function detach(node: Node) { diff --git a/templates/src/client/types.ts b/templates/src/client/types.ts index 2a28582..d3388c3 100644 --- a/templates/src/client/types.ts +++ b/templates/src/client/types.ts @@ -16,13 +16,13 @@ export type RootProps = { }; export interface ComponentConstructor { - new (options: { target: Node, data: any, store: Store, hydrate: boolean }): Component; + new (options: { target: Node, props: any, store: Store, hydrate: boolean }): Component; preload: (props: { params: Params, query: Query }) => Promise; }; export interface Component { - set: (data: any) => void; - destroy: () => void; + $set: (data: any) => void; + $destroy: () => void; } export type ComponentLoader = { diff --git a/templates/src/server/middleware/get_page_handler.ts b/templates/src/server/middleware/get_page_handler.ts index 802ee0f..f156dde 100644 --- a/templates/src/server/middleware/get_page_handler.ts +++ b/templates/src/server/middleware/get_page_handler.ts @@ -135,8 +135,8 @@ export function get_page_handler( let match; try { - const root_preloaded = manifest.root.preload - ? manifest.root.preload.call(preload_context, { + const root_preloaded = manifest.root_preload + ? manifest.root_preload.call(preload_context, { path: req.path, query: req.query, params: {} @@ -148,8 +148,8 @@ export function get_page_handler( preloaded = await Promise.all([root_preloaded].concat(page.parts.map(part => { if (!part) return null; - return part.component.preload - ? part.component.preload.call(preload_context, { + return part.preload + ? part.preload.call(preload_context, { path: req.path, query: req.query, params: part.params ? part.params(match) : {} From b25c642bf17b4dfe5750f1bf762070c84995940d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 23 Dec 2018 17:08:54 -0500 Subject: [PATCH 02/38] upgrade shimport, bump alpha version --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b51052d..6535371 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sapper", - "version": "0.24.1", + "version": "0.25.0-alpha1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -5378,9 +5378,9 @@ } }, "shimport": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/shimport/-/shimport-0.0.11.tgz", - "integrity": "sha512-wRlG/wMuV/czrzJEWBUPjydU/Ve0kTrTH8wHLRjuY6S2BDB+qDDXkTY/WrNc/7t5jnd0LPVO1sRIE7Ga6uXTpw==" + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/shimport/-/shimport-0.0.14.tgz", + "integrity": "sha512-JfzpHhyZ6CYuPYUSitFNw2/IxWEABLN1chs9xDHnn4tPXXCmfIn1METCmIl8Vwvm2FZGW7b8WB4zMCKaJEhY6A==" }, "signal-exit": { "version": "3.0.2", diff --git a/package.json b/package.json index d753c9e..02fe937 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sapper", - "version": "0.24.1", + "version": "0.25.0-alpha2", "description": "Military-grade apps, engineered by Svelte", "bin": { "sapper": "./sapper" @@ -18,7 +18,7 @@ }, "dependencies": { "html-minifier": "^3.5.20", - "shimport": "0.0.11", + "shimport": "0.0.14", "source-map-support": "^0.5.9", "sourcemap-codec": "^1.4.3", "string-hash": "^1.1.3", From 14fc6b3176b077c2018d1e1a78600ad2de0db1d6 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Mon, 31 Dec 2018 11:14:49 -0500 Subject: [PATCH 03/38] support Rollup 1.0 --- src/core/create_compilers/RollupCompiler.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/create_compilers/RollupCompiler.ts b/src/core/create_compilers/RollupCompiler.ts index f750e42..f8dc627 100644 --- a/src/core/create_compilers/RollupCompiler.ts +++ b/src/core/create_compilers/RollupCompiler.ts @@ -142,12 +142,14 @@ export default class RollupCompiler { const bundle = await rollup.rollup({ input, + inlineDynamicImports: true, external: (id: string) => { return (id[0] !== '.' && !path.isAbsolute(id)) || id.slice(-5, id.length) === '.json'; } }); - const { code } = await bundle.generate({ format: 'cjs' }); + const resp = await bundle.generate({ format: 'cjs' }); + const { code } = resp.output ? resp.output[0] : resp; // temporarily override require const defaultLoader = require.extensions['.js']; From c00af6dad0a762b188c872db9f44d8c502fce7f0 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 30 Jan 2019 10:21:43 -0500 Subject: [PATCH 04/38] update deps --- package-lock.json | 106 +++++++++++++--------- package.json | 12 +-- src/cli.ts | 2 +- src/core/create_compilers/RollupResult.ts | 2 +- 4 files changed, 71 insertions(+), 51 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6535371..b789751 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sapper", - "version": "0.25.0-alpha1", + "version": "0.25.0-alpha2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -690,6 +690,12 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", + "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -3487,9 +3493,9 @@ } }, "kleur": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", - "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.1.tgz", + "integrity": "sha512-P3kRv+B+Ra070ng2VKQqW4qW7gd/v3iD8sy/zOdcYRsfiD+QBokQNOps/AfP6Hr48cBhIIBFWckB9aO+IZhrWg==", "dev": true }, "levn": { @@ -5096,13 +5102,22 @@ } }, "rollup": { - "version": "0.66.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.66.6.tgz", - "integrity": "sha512-J7/SWanrcb83vfIHqa8+aVVGzy457GcjA6GVZEnD0x2u4OnOd0Q1pCrEoNe8yLwM6z6LZP02zBT2uW0yh5TqOw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.1.2.tgz", + "integrity": "sha512-OkdMxqMl8pWoQc5D8y1cIinYQPPLV8ZkfLgCzL6SytXeNA2P7UHynEQXI9tYxuAjAMsSyvRaWnyJDLHMxq0XAg==", "dev": true, "requires": { "@types/estree": "0.0.39", - "@types/node": "*" + "@types/node": "*", + "acorn": "^6.0.5" + }, + "dependencies": { + "acorn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.6.tgz", + "integrity": "sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA==", + "dev": true + } } }, "rollup-plugin-commonjs": { @@ -5127,20 +5142,20 @@ } }, "rollup-plugin-node-resolve": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz", - "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.0.0.tgz", + "integrity": "sha512-7Ni+/M5RPSUBfUaP9alwYQiIKnKeXCOHiqBpKUl9kwp3jX5ZJtgXAait1cne6pGEVUUztPD6skIKH9Kq9sNtfw==", "dev": true, "requires": { - "builtin-modules": "^2.0.0", + "builtin-modules": "^3.0.0", "is-module": "^1.0.0", - "resolve": "^1.1.6" + "resolve": "^1.8.1" }, "dependencies": { "builtin-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", - "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.0.0.tgz", + "integrity": "sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg==", "dev": true } } @@ -5184,14 +5199,22 @@ } }, "rollup-plugin-svelte": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-4.3.2.tgz", - "integrity": "sha512-aGFuB+hc9c5pmPCgnXiJCbRwrDw7sdPia+WBRKTMEwVv3ygiSOi5gIlGHIPRMvMisioOk0ns5Bu5Gz57JxEZTg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-5.0.1.tgz", + "integrity": "sha512-iwm4ANbdoEQqoCL8m70R3F2Oe/auSr0zIOBVVJWx7IMSkzFZjhd0PeqzKe3BWCllLAnBXIbqTSOHmU2mnvy0SA==", "dev": true, "requires": { "require-relative": "^0.8.7", - "rollup-pluginutils": "^2.3.0", - "sourcemap-codec": "^1.4.1" + "rollup-pluginutils": "^2.3.3", + "sourcemap-codec": "^1.4.4" + }, + "dependencies": { + "sourcemap-codec": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", + "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", + "dev": true + } } }, "rollup-plugin-typescript": { @@ -5763,9 +5786,9 @@ } }, "svelte": { - "version": "2.13.5", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-2.13.5.tgz", - "integrity": "sha512-Mg4+vRwAT1IMR4FAH3cOmMaVVrJ35xUI1qsTW+WoJvRpeBDx7aLZUbgBXnctxdfEJQ4BuP2MCuhYKy8917Au1A==", + "version": "3.0.0-alpha23", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.0.0-alpha23.tgz", + "integrity": "sha512-+5q5AOkYx9k4NGzifo5UYGhVftVU+6jhtEbFr4yGq7A76sUKR3Ytb0j5X3dc0gmi1zGPTxXef1geoggvaPhxMA==", "dev": true }, "svelte-dev-helper": { @@ -5911,27 +5934,16 @@ } }, "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.2.tgz", + "integrity": "sha512-MosTrinKmaAcWgO8tqMjMJB22h+sp3Rd1i4fdoWY4mhBDekOwIAKI/bzmRi7IcbCmjquccYg2gcF6NBkLgr0Tw==", "dev": true, "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", + "arg": "^4.1.0", "diff": "^3.1.0", "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", "source-map-support": "^0.5.6", - "yn": "^2.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "yn": "^3.0.0" } }, "tslib": { @@ -6533,6 +6545,14 @@ "dev": true, "requires": { "kleur": "^2.0.1" + }, + "dependencies": { + "kleur": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "dev": true + } } }, "webpack-sources": { @@ -6621,9 +6641,9 @@ } }, "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz", + "integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==", "dev": true } } diff --git a/package.json b/package.json index 02fe937..c112a3d 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "devalue": "^1.0.4", "eslint": "^5.7.0", "eslint-plugin-import": "^2.14.0", - "kleur": "^2.0.2", + "kleur": "^3.0.1", "mkdirp": "^0.5.1", "mocha": "^5.2.0", "node-fetch": "^2.2.0", @@ -47,20 +47,20 @@ "puppeteer": "^1.9.0", "require-relative": "^0.8.7", "rimraf": "^2.6.2", - "rollup": "^0.66.6", + "rollup": "^1.1.2", "rollup-plugin-commonjs": "^9.2.0", "rollup-plugin-json": "^3.1.0", - "rollup-plugin-node-resolve": "^3.4.0", + "rollup-plugin-node-resolve": "^4.0.0", "rollup-plugin-replace": "^2.1.0", "rollup-plugin-string": "^2.0.2", - "rollup-plugin-svelte": "^4.3.2", + "rollup-plugin-svelte": "^5.0.1", "rollup-plugin-typescript": "^1.0.0", "sade": "^1.4.1", "sander": "^0.6.0", "sirv": "^0.2.2", - "svelte": "^2.13.5", + "svelte": "^3.0.0-alpha23", "svelte-loader": "^2.11.0", - "ts-node": "^7.0.1", + "ts-node": "^8.0.2", "typescript": "^3.1.3", "webpack": "^4.20.2", "webpack-format-messages": "^2.0.3" diff --git a/src/cli.ts b/src/cli.ts index 43e4d45..085c981 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -226,7 +226,7 @@ prog.command('export [dest]') }, onfile: event => { - const size_color = event.size > 150000 ? colors.bold.red : event.size > 50000 ? colors.bold.yellow : colors.bold.gray; + const size_color = event.size > 150000 ? colors.bold().red : event.size > 50000 ? colors.bold().yellow : colors.bold().gray; const size_label = size_color(left_pad(pb(event.size), 10)); const file_label = event.status === 200 diff --git a/src/core/create_compilers/RollupResult.ts b/src/core/create_compilers/RollupResult.ts index adbfeb0..e75864e 100644 --- a/src/core/create_compilers/RollupResult.ts +++ b/src/core/create_compilers/RollupResult.ts @@ -53,7 +53,7 @@ export default class RollupResult implements CompileResult { } this.summary = compiler.chunks.map(chunk => { - const size_color = chunk.code.length > 150000 ? colors.bold.red : chunk.code.length > 50000 ? colors.bold.yellow : colors.bold.white; + const size_color = chunk.code.length > 150000 ? colors.bold().red : chunk.code.length > 50000 ? colors.bold().yellow : colors.bold().white; const size_label = left_pad(pb(chunk.code.length), 10); const lines = [size_color(`${size_label} ${chunk.fileName}`)]; From da540ef15f9107a57d86766ebc84b1be1f7a8ec4 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 30 Jan 2019 10:21:55 -0500 Subject: [PATCH 05/38] update some tests --- test/apps/basics/src/routes/b/index.html | 20 +++++----- .../basics/src/routes/delete-test/index.html | 32 ++++++++-------- .../basics/src/routes/unsafe-replacement.html | 14 +++---- .../src/routes/credentials/index.html | 20 +++++----- test/apps/css/src/routes/bar.html | 22 ++++++----- .../encoding/src/routes/echo/page/[slug].html | 21 ++++++----- test/apps/encoding/src/routes/fünke.html | 20 +++++----- test/apps/errors/src/routes/blog/[slug].html | 34 +++++++++-------- .../errors/src/routes/enhance-your-calm.html | 10 ++--- test/apps/errors/src/routes/throw.html | 10 ++--- test/apps/export/src/routes/blog/[slug].html | 20 +++++----- test/apps/export/src/routes/blog/index.html | 24 ++++++------ test/apps/ignore/src/routes/b/index.html | 20 +++++----- test/apps/layout/src/routes/[x]/[y]/[z].html | 32 ++++++++-------- .../layout/src/routes/[x]/[y]/_layout.html | 37 +++++++++---------- test/apps/preloading/src/routes/_layout.html | 26 +++++++------ .../routes/preload-values/custom-class.html | 30 ++++++++------- .../src/routes/preload-values/set.html | 20 +++++----- .../preloading/src/routes/slow-preload.html | 26 ++++++------- .../redirects/src/routes/redirect-from.html | 14 +++---- .../src/routes/redirect-to-external.html | 14 +++---- .../src/routes/redirect-to-root.html | 14 +++---- test/apps/scroll/src/routes/tall-page.html | 26 ++++++------- 23 files changed, 255 insertions(+), 251 deletions(-) diff --git a/test/apps/basics/src/routes/b/index.html b/test/apps/basics/src/routes/b/index.html index d93079d..8b1cfa6 100644 --- a/test/apps/basics/src/routes/b/index.html +++ b/test/apps/basics/src/routes/b/index.html @@ -1,11 +1,13 @@ -

{letter}

+ \ No newline at end of file + export let letter; + + +

{letter}

\ No newline at end of file diff --git a/test/apps/basics/src/routes/delete-test/index.html b/test/apps/basics/src/routes/delete-test/index.html index a5280cb..e8a2b6e 100644 --- a/test/apps/basics/src/routes/delete-test/index.html +++ b/test/apps/basics/src/routes/delete-test/index.html @@ -1,19 +1,17 @@ - - \ No newline at end of file + onMount(() => { + window.deleted = null; + }); + + function del() { + fetch(`delete-test/42.json`, { method: 'DELETE' }) + .then(r => r.json()) + .then(data => { + window.deleted = data; + }); + } + + + \ No newline at end of file diff --git a/test/apps/basics/src/routes/unsafe-replacement.html b/test/apps/basics/src/routes/unsafe-replacement.html index 98c654f..49fb001 100644 --- a/test/apps/basics/src/routes/unsafe-replacement.html +++ b/test/apps/basics/src/routes/unsafe-replacement.html @@ -1,9 +1,7 @@ -$& + - \ No newline at end of file +$& \ No newline at end of file diff --git a/test/apps/credentials/src/routes/credentials/index.html b/test/apps/credentials/src/routes/credentials/index.html index 688ece6..04a19ee 100644 --- a/test/apps/credentials/src/routes/credentials/index.html +++ b/test/apps/credentials/src/routes/credentials/index.html @@ -1,11 +1,13 @@ -

{message}

+ \ No newline at end of file + export let message; + + +

{message}

\ No newline at end of file diff --git a/test/apps/css/src/routes/bar.html b/test/apps/css/src/routes/bar.html index 876ee63..d63d069 100644 --- a/test/apps/css/src/routes/bar.html +++ b/test/apps/css/src/routes/bar.html @@ -1,11 +1,13 @@ - - \ No newline at end of file + import { onMount } from 'svelte'; + + export let Title; + + onMount(() => { + import('./_components/Title.html').then(mod => { + Title = mod.default; + }); + }); + + + \ No newline at end of file diff --git a/test/apps/encoding/src/routes/echo/page/[slug].html b/test/apps/encoding/src/routes/echo/page/[slug].html index 2cdc03d..deead40 100644 --- a/test/apps/encoding/src/routes/echo/page/[slug].html +++ b/test/apps/encoding/src/routes/echo/page/[slug].html @@ -1,11 +1,14 @@ -

{slug} {JSON.stringify(query)}

+ \ No newline at end of file + export let slug; + export let query; + + +

{slug} {JSON.stringify(query)}

\ No newline at end of file diff --git a/test/apps/encoding/src/routes/fünke.html b/test/apps/encoding/src/routes/fünke.html index e1fba6c..dbff62e 100644 --- a/test/apps/encoding/src/routes/fünke.html +++ b/test/apps/encoding/src/routes/fünke.html @@ -1,11 +1,13 @@ -

{phrase}

+ \ No newline at end of file + export let phrase; + + +

{phrase}

\ No newline at end of file diff --git a/test/apps/errors/src/routes/blog/[slug].html b/test/apps/errors/src/routes/blog/[slug].html index 8a304d0..1fe2daa 100644 --- a/test/apps/errors/src/routes/blog/[slug].html +++ b/test/apps/errors/src/routes/blog/[slug].html @@ -1,19 +1,21 @@ -

{post.title}

+ - return this.fetch(`blog/${slug}.json`).then(r => { - return r.json().then(data => { - if (r.status !== 200) { - this.error(r.status, data); - } - - return data; - }); - }); - } - }; - \ No newline at end of file +

{post.title}

\ No newline at end of file diff --git a/test/apps/errors/src/routes/enhance-your-calm.html b/test/apps/errors/src/routes/enhance-your-calm.html index 398584e..799755b 100644 --- a/test/apps/errors/src/routes/enhance-your-calm.html +++ b/test/apps/errors/src/routes/enhance-your-calm.html @@ -1,7 +1,5 @@ - \ No newline at end of file diff --git a/test/apps/errors/src/routes/throw.html b/test/apps/errors/src/routes/throw.html index 16b4131..4e4cc9a 100644 --- a/test/apps/errors/src/routes/throw.html +++ b/test/apps/errors/src/routes/throw.html @@ -1,7 +1,5 @@ - \ No newline at end of file diff --git a/test/apps/export/src/routes/blog/[slug].html b/test/apps/export/src/routes/blog/[slug].html index f44adaa..2febdf2 100644 --- a/test/apps/export/src/routes/blog/[slug].html +++ b/test/apps/export/src/routes/blog/[slug].html @@ -1,11 +1,13 @@ -

{post.title}

+ \ No newline at end of file + export let post; + + +

{post.title}

\ No newline at end of file diff --git a/test/apps/export/src/routes/blog/index.html b/test/apps/export/src/routes/blog/index.html index 2eea681..d12e432 100644 --- a/test/apps/export/src/routes/blog/index.html +++ b/test/apps/export/src/routes/blog/index.html @@ -1,15 +1,17 @@ + + + +

blog

{#each posts as post}

{post.title}

-{/each} - - \ No newline at end of file +{/each} \ No newline at end of file diff --git a/test/apps/ignore/src/routes/b/index.html b/test/apps/ignore/src/routes/b/index.html index d93079d..8b1cfa6 100644 --- a/test/apps/ignore/src/routes/b/index.html +++ b/test/apps/ignore/src/routes/b/index.html @@ -1,11 +1,13 @@ -

{letter}

+ \ No newline at end of file + export let letter; + + +

{letter}

\ No newline at end of file diff --git a/test/apps/layout/src/routes/[x]/[y]/[z].html b/test/apps/layout/src/routes/[x]/[y]/[z].html index 018f001..b51089c 100644 --- a/test/apps/layout/src/routes/[x]/[y]/[z].html +++ b/test/apps/layout/src/routes/[x]/[y]/[z].html @@ -1,20 +1,18 @@ -z: {segment} {count} -click me - - - oncreate() { - this.set({ - segment: this.get().params.z - }); - } - }; - \ No newline at end of file + + +z: {segment} {count} +click me \ No newline at end of file diff --git a/test/apps/layout/src/routes/[x]/[y]/_layout.html b/test/apps/layout/src/routes/[x]/[y]/_layout.html index 7e632a3..f60dd63 100644 --- a/test/apps/layout/src/routes/[x]/[y]/_layout.html +++ b/test/apps/layout/src/routes/[x]/[y]/_layout.html @@ -1,22 +1,21 @@ + + + + y: {segment} {count} -child segment: {child.segment} - - \ No newline at end of file +child segment: {child.segment} \ No newline at end of file diff --git a/test/apps/preloading/src/routes/_layout.html b/test/apps/preloading/src/routes/_layout.html index 4e39097..30dc0e6 100644 --- a/test/apps/preloading/src/routes/_layout.html +++ b/test/apps/preloading/src/routes/_layout.html @@ -1,15 +1,19 @@ + + + + {#if preloading} {/if} - - - \ No newline at end of file + \ No newline at end of file diff --git a/test/apps/preloading/src/routes/preload-values/custom-class.html b/test/apps/preloading/src/routes/preload-values/custom-class.html index 44e94cb..a4f0499 100644 --- a/test/apps/preloading/src/routes/preload-values/custom-class.html +++ b/test/apps/preloading/src/routes/preload-values/custom-class.html @@ -1,17 +1,19 @@ -

{foo.bar()}

+ - return { - foo: new Foo() - }; - } - }; - \ No newline at end of file +

{foo.bar()}

\ No newline at end of file diff --git a/test/apps/preloading/src/routes/preload-values/set.html b/test/apps/preloading/src/routes/preload-values/set.html index 43066c9..03a5b01 100644 --- a/test/apps/preloading/src/routes/preload-values/set.html +++ b/test/apps/preloading/src/routes/preload-values/set.html @@ -1,11 +1,13 @@ -

{set.has('x')}

+ \ No newline at end of file + export let set; + + +

{set.has('x')}

\ No newline at end of file diff --git a/test/apps/preloading/src/routes/slow-preload.html b/test/apps/preloading/src/routes/slow-preload.html index 0dc35ca..8312e4e 100644 --- a/test/apps/preloading/src/routes/slow-preload.html +++ b/test/apps/preloading/src/routes/slow-preload.html @@ -1,15 +1,13 @@ -

This page should never render

+ - \ No newline at end of file +

This page should never render

\ No newline at end of file diff --git a/test/apps/redirects/src/routes/redirect-from.html b/test/apps/redirects/src/routes/redirect-from.html index 8c419c5..2c07828 100644 --- a/test/apps/redirects/src/routes/redirect-from.html +++ b/test/apps/redirects/src/routes/redirect-from.html @@ -1,9 +1,7 @@ -

unredirected

+ - \ No newline at end of file +

unredirected

\ No newline at end of file diff --git a/test/apps/redirects/src/routes/redirect-to-external.html b/test/apps/redirects/src/routes/redirect-to-external.html index fec2fee..bc713c1 100644 --- a/test/apps/redirects/src/routes/redirect-to-external.html +++ b/test/apps/redirects/src/routes/redirect-to-external.html @@ -1,9 +1,7 @@ -

unredirected

+ - \ No newline at end of file +

unredirected

\ No newline at end of file diff --git a/test/apps/redirects/src/routes/redirect-to-root.html b/test/apps/redirects/src/routes/redirect-to-root.html index 0fa438b..63460f1 100644 --- a/test/apps/redirects/src/routes/redirect-to-root.html +++ b/test/apps/redirects/src/routes/redirect-to-root.html @@ -1,9 +1,7 @@ -

unredirected

+ - \ No newline at end of file +

unredirected

\ No newline at end of file diff --git a/test/apps/scroll/src/routes/tall-page.html b/test/apps/scroll/src/routes/tall-page.html index 67db967..8c79fb7 100644 --- a/test/apps/scroll/src/routes/tall-page.html +++ b/test/apps/scroll/src/routes/tall-page.html @@ -1,3 +1,13 @@ + + scroll to foo
@@ -7,18 +17,4 @@ {#if barLink} link {/if} - - - \ No newline at end of file + \ No newline at end of file From e4319bee0eeec7198c8945b0148d8827b70eb979 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 30 Jan 2019 10:25:43 -0500 Subject: [PATCH 06/38] error handling --- templates/src/client/app.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/templates/src/client/app.ts b/templates/src/client/app.ts index a99df92..5ec07c0 100644 --- a/templates/src/client/app.ts +++ b/templates/src/client/app.ts @@ -305,7 +305,8 @@ export function prepare_page(target: Target): Promise<{ }; return { - props: Object.assign({}, props, { + nullable_depth: 0, + data: Object.assign({}, props, { preloading: false, child: { component: ErrorComponent, From 83f7102f6b5a81e2fde5a1f884da22212d155e7c Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 30 Jan 2019 13:35:50 -0500 Subject: [PATCH 07/38] use nextTick --- templates/src/client/app.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/templates/src/client/app.ts b/templates/src/client/app.ts index 5ec07c0..a409203 100644 --- a/templates/src/client/app.ts +++ b/templates/src/client/app.ts @@ -1,3 +1,4 @@ +import { nextTick } from 'svelte'; import RootComponent, * as RootComponentStatic from '__ROOT__'; import ErrorComponent from '__ERROR__'; import { @@ -161,10 +162,12 @@ function render(props: any, nullable_depth: number, scroll: ScrollPosition, nosc level.component = null; root_component.$set({ child: props.child }); - // then render new stuff - // TODO do we need to call `flush` before doing this? - level.component = component; - root_component.$set(props); + nextTick(() => { + // then render new stuff + // TODO do we need to call `flush` before doing this? + level.component = component; + root_component.$set(props); + }); } else { // first load — remove SSR'd contents const start = document.querySelector('#sapper-head-start'); From 2a825269e9156b1a0ba97a2a15ad4131bce659a8 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 30 Jan 2019 13:38:48 -0500 Subject: [PATCH 08/38] bump svelte version --- package-lock.json | 1315 +++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 621 insertions(+), 696 deletions(-) diff --git a/package-lock.json b/package-lock.json index b789751..8de2885 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,9 +43,9 @@ "dev": true }, "@types/events": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", - "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", "dev": true }, "@types/glob": { @@ -81,15 +81,15 @@ "dev": true }, "@types/node": { - "version": "10.12.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.0.tgz", - "integrity": "sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ==", + "version": "10.12.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.19.tgz", + "integrity": "sha512-2NVovndCjJQj6fUUn9jCgpP4WSqr+u1SoUZMZyJkhGeBFsm6dE46l31S7lPUYt9uQ28XI+ibrJA1f5XyH5HNtA==", "dev": true }, "@types/puppeteer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-1.9.0.tgz", - "integrity": "sha512-ZP3wL4Lqpgu4xZbz/0vQhbIZnllNEawVW3oTpEXyJg+uhf/YQgL8oeTrfoUwj9JXE9UUe53eqmgLl29/d2gjqQ==", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-1.11.2.tgz", + "integrity": "sha512-eHBXpiZz0+PrnvHID68OjwcBjTbK1V49sa4lxjq+jiEe2eaLbRl2F77icNg0ewiB2fgdHJUHBD/9ubjfKrvTEw==", "dev": true, "requires": { "@types/node": "*" @@ -106,174 +106,174 @@ } }, "@webassemblyjs/ast": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.8.tgz", - "integrity": "sha512-dOrtdtEyB8sInpl75yLPNksY4sRl0j/+t6aHyB/YA+ab9hV3Fo7FmG12FHzP+2MvWVAJtDb+6eXR5EZbZJ+uVg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/wast-parser": "1.7.8" + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.8.tgz", - "integrity": "sha512-kn2zNKGsbql5i56VAgRYkpG+VazqHhQQZQycT2uXAazrAEDs23gy+Odkh5VblybjnwX2/BITkDtNmSO76hdIvQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.8.tgz", - "integrity": "sha512-xUwxDXsd1dUKArJEP5wWM5zxgCSwZApSOJyP1XO7M8rNUChUDblcLQ4FpzTpWG2YeylMwMl1MlP5Ztryiz1x4g==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.8.tgz", - "integrity": "sha512-WXiIMnuvuwlhWvVOm8xEXU9DnHaa3AgAU0ZPfvY8vO1cSsmYb2WbGbHnMLgs43vXnA7XAob9b56zuZaMkxpCBg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.8.tgz", - "integrity": "sha512-TLQxyD9qGOIdX5LPQOPo0Ernd88U5rHkFb8WAjeMIeA0sPjCHeVPaGqUGGIXjUcblUkjuDAc07bruCcNHUrHDA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.7.8" + "@webassemblyjs/wast-printer": "1.7.11" } }, "@webassemblyjs/helper-fsm": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.8.tgz", - "integrity": "sha512-TjK0CnD8hAPkV5mbSp5aWl6SO1+H3WFcjWtixWoy8EMA99YnNzYhpc/WSYWhf7yrhpzkq5tZB0tvLK3Svr3IXA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.8.tgz", - "integrity": "sha512-uCutAKR7Nm0VsFixcvnB4HhAyHouNbj0Dx1p7eRjFjXGGZ+N7ftTaG1ZbWCasAEbtwGj54LP8+lkBZdTCPmLGg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", "dev": true }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.8.tgz", - "integrity": "sha512-AdCCE3BMW6V34WYaKUmPgVHa88t2Z14P4/0LjLwuGkI0X6pf7nzp0CehzVVk51cKm2ymVXjl9dCG+gR1yhITIQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.8.tgz", - "integrity": "sha512-BkBhYQuzyl4hgTGOKo87Vdw6f9nj8HhI7WYpI0MCC5qFa5ahrAPOGgyETVdnRbv+Rjukl9MxxfDmVcVC435lDg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" } }, "@webassemblyjs/ieee754": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.8.tgz", - "integrity": "sha512-tOarWChdG1a3y1yqCX0JMDKzrat5tQe4pV6K/TX19BcXsBLYxFQOL1DEDa5KG9syeyvCrvZ+i1+Mv1ExngvktQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.8.tgz", - "integrity": "sha512-GCYeGPgUFWJiZuP4NICbcyUQNxNLJIf476Ei+K+jVuuebtLpfvwkvYT6iTUE7oZYehhkor4Zz2g7SJ/iZaPudQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", "dev": true, "requires": { "@xtuc/long": "4.2.1" } }, "@webassemblyjs/utf8": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.8.tgz", - "integrity": "sha512-9X+f0VV+xNXW2ujfIRSXBJENGE6Qh7bNVKqu3yDjTFB3ar3nsThsGBBKdTG58aXOm2iUH6v28VIf88ymPXODHA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.8.tgz", - "integrity": "sha512-6D3Hm2gFixrfyx9XjSON4ml1FZTugqpkIz5Awvrou8fnpyprVzcm4X8pyGRtA2Piixjl3DqmX/HB1xdWyE097A==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/helper-wasm-section": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8", - "@webassemblyjs/wasm-opt": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8", - "@webassemblyjs/wast-printer": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" } }, "@webassemblyjs/wasm-gen": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.8.tgz", - "integrity": "sha512-a7O/wE6eBeVKKUYgpMK7NOHmMADD85rSXLe3CqrWRDwWff5y3cSVbzpN6Qv3z6C4hdkpq9qyij1Ga1kemOZGvQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/ieee754": "1.7.8", - "@webassemblyjs/leb128": "1.7.8", - "@webassemblyjs/utf8": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" } }, "@webassemblyjs/wasm-opt": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.8.tgz", - "integrity": "sha512-3lbQ0PT81NHCdi1sR/7+SNpZadM4qYcTSr62nFFAA7e5lFwJr14M1Gi+A/Y3PgcDWOHYjsaNGPpPU0H03N6Blg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" } }, "@webassemblyjs/wasm-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.8.tgz", - "integrity": "sha512-rZ/zlhp9DHR/05zh1MbAjT2t624sjrPP/OkJCjXqzm7ynH+nIdNcn9Ixc+qzPMFXhIrk0rBoQ3to6sEIvHh9jQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-api-error": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/ieee754": "1.7.8", - "@webassemblyjs/leb128": "1.7.8", - "@webassemblyjs/utf8": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" } }, "@webassemblyjs/wast-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.8.tgz", - "integrity": "sha512-Q/zrvtUvzWuSiJMcSp90fi6gp2nraiHXjTV2VgAluVdVapM4gy1MQn7akja2p6eSBDQpKJPJ6P4TxRkghRS5dg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/floating-point-hex-parser": "1.7.8", - "@webassemblyjs/helper-api-error": "1.7.8", - "@webassemblyjs/helper-code-frame": "1.7.8", - "@webassemblyjs/helper-fsm": "1.7.8", + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", "@xtuc/long": "4.2.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.8.tgz", - "integrity": "sha512-GllIthRtwTxRDAURRNXscu7Napzmdf1jt1gpiZiK/QN4fH0lSGs3OTmvdfsMNP7tqI4B3ZtfaaWRlNIQug6Xyg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/wast-parser": "1.7.8", + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", "@xtuc/long": "4.2.1" } }, @@ -290,28 +290,22 @@ "dev": true }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.6.tgz", + "integrity": "sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA==", "dev": true }, "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "^5.0.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true }, "acorn-jsx": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", - "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", - "dev": true, - "requires": { - "acorn": "^5.0.3" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true }, "agadoo": { "version": "1.0.1", @@ -345,9 +339,9 @@ } }, "ajv": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", - "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -356,16 +350,22 @@ "uri-js": "^4.2.2" } }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.3.0.tgz", + "integrity": "sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g==", "dev": true }, "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { @@ -744,33 +744,12 @@ "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", "dev": true }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", @@ -814,6 +793,12 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", @@ -912,9 +897,9 @@ "dev": true }, "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, "binary-extensions": { @@ -924,9 +909,9 @@ "dev": true }, "bluebird": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", - "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", "dev": true }, "bn.js": { @@ -970,7 +955,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -1007,7 +992,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -1041,7 +1026,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -1062,9 +1047,9 @@ "dev": true }, "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.0.0.tgz", + "integrity": "sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg==", "dev": true }, "builtin-status-codes": { @@ -1074,23 +1059,24 @@ "dev": true }, "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", "dev": true, "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", "y18n": "^4.0.0" } }, @@ -1119,19 +1105,10 @@ } } }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", + "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", "dev": true }, "camel-case": { @@ -1144,9 +1121,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -1161,9 +1138,9 @@ "dev": true }, "cheap-watch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cheap-watch/-/cheap-watch-1.0.0.tgz", - "integrity": "sha512-ZeqXFSLfd/NzLXyFDKfa48/14nytP43gBD2Go1L1WUYLXAkEqIo4TTmp89AEbnXVOk47//sB2/16UbVs3vfijA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cheap-watch/-/cheap-watch-1.0.2.tgz", + "integrity": "sha512-jp82t+kZAW+ZVnuYuHZEGZqDaUg28uAyOhC915BcKBSYL55fpTyuJ56cYYXZG0JkCPQT80MjRD6q2KqebaPwCw==", "dev": true }, "chokidar": { @@ -1493,7 +1470,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -1506,7 +1483,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -1563,9 +1540,9 @@ "dev": true }, "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -1645,21 +1622,6 @@ } } }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -1671,9 +1633,9 @@ } }, "devalue": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-1.0.4.tgz", - "integrity": "sha512-R3Jef4Cw075TqqvliJ6sAiN9Ygd2onyklpgOv2qdytRKcEN8X2lsW9y6JlD2cDgbEIBWP3wVWXKfAQ1a9vD9UA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-1.1.0.tgz", + "integrity": "sha512-mKj+DaZuxevfmjI78VdlkBr+NDmwaDAKQz0t5RDSmhwBn6m5z82KDnVRKVFeUvlMOmI1fzkAUx4USdqGGhas6g==", "dev": true }, "diff": { @@ -1684,7 +1646,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -1780,16 +1742,17 @@ } }, "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", "dev": true, "requires": { - "es-to-primitive": "^1.1.1", + "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" } }, "es-to-primitive": { @@ -1811,7 +1774,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -1825,9 +1788,9 @@ "dev": true }, "eslint": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.7.0.tgz", - "integrity": "sha512-zYCeFQahsxffGl87U2aJ7DPyH8CbWgxBC213Y8+TCanhUTf2gEvfq3EKpHmEcozTLyPmGe9LZdMAwC/CpJBM5A==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.12.1.tgz", + "integrity": "sha512-54NV+JkTpTu0d8+UYSA8mMKAG4XAsaOrozA9rCW7tgneg1mevcL7wIotPC+fZ0SkWwdhNqoXoxnQCTBp7UvTsg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -1839,7 +1802,7 @@ "eslint-scope": "^4.0.0", "eslint-utils": "^1.3.1", "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", + "espree": "^5.0.0", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^2.0.0", @@ -1847,9 +1810,9 @@ "glob": "^7.1.2", "globals": "^11.7.0", "ignore": "^4.0.6", + "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "inquirer": "^6.1.0", - "is-resolvable": "^1.1.0", "js-yaml": "^3.12.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", @@ -1862,7 +1825,6 @@ "pluralize": "^7.0.0", "progress": "^2.0.0", "regexpp": "^2.0.1", - "require-uncached": "^1.0.3", "semver": "^5.5.1", "strip-ansi": "^4.0.0", "strip-json-comments": "^2.0.1", @@ -1898,13 +1860,13 @@ } }, "eslint-module-utils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", - "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", + "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", "dev": true, "requires": { "debug": "^2.6.8", - "pkg-dir": "^1.0.0" + "pkg-dir": "^2.0.0" }, "dependencies": { "debug": { @@ -1925,21 +1887,21 @@ } }, "eslint-plugin-import": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", - "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", + "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", "dev": true, "requires": { "contains-path": "^0.1.0", - "debug": "^2.6.8", + "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.2.0", - "has": "^1.0.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.3", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.3.0", + "has": "^1.0.3", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", "read-pkg-up": "^2.0.0", - "resolve": "^1.6.0" + "resolve": "^1.9.0" }, "dependencies": { "debug": { @@ -1992,13 +1954,14 @@ "dev": true }, "espree": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", - "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz", + "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==", "dev": true, "requires": { - "acorn": "^5.6.0", - "acorn-jsx": "^4.1.1" + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" } }, "esprima": { @@ -2044,9 +2007,9 @@ "dev": true }, "events": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", "dev": true }, "evp_bytestokey": { @@ -2174,6 +2137,12 @@ "pend": "~1.2.0" } }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -2213,55 +2182,88 @@ } }, "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" + "pkg-dir": "^3.0.0" }, "dependencies": { "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "^3.0.0" } }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "find-up": "^2.1.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" } } } }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "locate-path": "^2.0.0" } }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, "requires": { "circular-json": "^0.3.1", - "del": "^2.0.2", "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", "write": "^0.2.1" } }, @@ -2328,9 +2330,9 @@ "dev": true }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", "dev": true, "optional": true, "requires": { @@ -2356,7 +2358,7 @@ "optional": true }, "are-we-there-yet": { - "version": "1.1.4", + "version": "1.1.5", "bundled": true, "dev": true, "optional": true, @@ -2380,7 +2382,7 @@ } }, "chownr": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true @@ -2416,7 +2418,7 @@ } }, "deep-extend": { - "version": "0.5.1", + "version": "0.6.0", "bundled": true, "dev": true, "optional": true @@ -2465,7 +2467,7 @@ } }, "glob": { - "version": "7.1.2", + "version": "7.1.3", "bundled": true, "dev": true, "optional": true, @@ -2485,12 +2487,12 @@ "optional": true }, "iconv-lite": { - "version": "0.4.21", + "version": "0.4.24", "bundled": true, "dev": true, "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -2551,16 +2553,16 @@ "dev": true }, "minipass": { - "version": "2.2.4", + "version": "2.3.5", "bundled": true, "dev": true, "requires": { - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "dev": true, "optional": true, @@ -2583,7 +2585,7 @@ "optional": true }, "needle": { - "version": "2.2.0", + "version": "2.2.4", "bundled": true, "dev": true, "optional": true, @@ -2594,18 +2596,18 @@ } }, "node-pre-gyp": { - "version": "0.10.0", + "version": "0.10.3", "bundled": true, "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", - "needle": "^2.2.0", + "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", - "rc": "^1.1.7", + "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" @@ -2622,13 +2624,13 @@ } }, "npm-bundled": { - "version": "1.0.3", + "version": "1.0.5", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.1.10", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true, @@ -2703,12 +2705,12 @@ "optional": true }, "rc": { - "version": "1.2.7", + "version": "1.2.8", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "^0.5.1", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -2738,16 +2740,16 @@ } }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "dev": true, "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", + "version": "5.1.2", "bundled": true, "dev": true }, @@ -2764,7 +2766,7 @@ "optional": true }, "semver": { - "version": "5.5.0", + "version": "5.6.0", "bundled": true, "dev": true, "optional": true @@ -2815,17 +2817,17 @@ "optional": true }, "tar": { - "version": "4.4.1", + "version": "4.4.8", "bundled": true, "dev": true, "optional": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.2" } }, @@ -2836,12 +2838,12 @@ "optional": true }, "wide-align": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { @@ -2850,7 +2852,7 @@ "dev": true }, "yallist": { - "version": "3.0.2", + "version": "3.0.3", "bundled": true, "dev": true } @@ -2908,9 +2910,9 @@ } }, "globals": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", - "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", "dev": true }, "globalyzer": { @@ -2919,30 +2921,16 @@ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", "dev": true }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, "globrex": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.1.tgz", - "integrity": "sha512-bqKcPhb+ZtrISivpu6oLmwIyINlPlzueO/BDCdfnzUeu7SYxnHTXmWP7uQI5PnQXc5yGXOscGBEGagloA2hcSw==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", "dev": true }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, "growl": { @@ -3043,9 +3031,9 @@ } }, "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -3053,9 +3041,9 @@ } }, "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "hmac-drbg": { "version": "1.0.1", @@ -3075,14 +3063,14 @@ "dev": true }, "html-minifier": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.20.tgz", - "integrity": "sha512-ZmgNLaTp54+HFKkONyLFEfs5dd/ZOtlquKaTnqIWFmx3Av5zG6ZPcV2d0o9XM2fXOTxxIf6eDcwzFFotke/5zA==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", "requires": { "camel-case": "3.0.x", "clean-css": "4.2.x", "commander": "2.17.x", - "he": "1.1.x", + "he": "1.2.x", "param-case": "2.1.x", "relateurl": "0.2.x", "uglify-js": "3.4.x" @@ -3142,6 +3130,16 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "import-fresh": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3171,9 +3169,9 @@ "dev": true }, "inquirer": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", - "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", "dev": true, "requires": { "ansi-escapes": "^3.0.0", @@ -3187,8 +3185,25 @@ "run-async": "^2.2.0", "rxjs": "^6.1.0", "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", + "strip-ansi": "^5.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "dev": true + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "^4.0.0" + } + } } }, "is-accessor-descriptor": { @@ -3222,12 +3237,12 @@ "dev": true }, "is-builtin-module": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.0.0.tgz", + "integrity": "sha512-/93sDihsAD652hrMEbJGbMAVBf1qc96kyThHQ0CAOONHaE3aROLpTjDe4WQ5aoC5ITHFxEq1z8XqSU7km+8amw==", "dev": true, "requires": { - "builtin-modules": "^1.0.0" + "builtin-modules": "^3.0.0" } }, "is-callable": { @@ -3327,30 +3342,6 @@ "kind-of": "^3.0.2" } }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3395,12 +3386,6 @@ "has": "^1.0.1" } }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", @@ -3444,9 +3429,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3472,10 +3457,21 @@ "dev": true }, "json5": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } }, "jsonify": { "version": "0.0.0", @@ -3510,7 +3506,7 @@ }, "load-json-file": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { @@ -3521,20 +3517,20 @@ } }, "loader-runner": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", - "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true }, "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "dev": true, "requires": { - "big.js": "^3.1.3", + "big.js": "^5.2.2", "emojis-list": "^2.0.0", - "json5": "^0.5.0" + "json5": "^1.0.1" } }, "locate-path": { @@ -3545,14 +3541,6 @@ "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } } }, "lodash": { @@ -3573,13 +3561,12 @@ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "yallist": "^3.0.2" } }, "magic-string": { @@ -3630,18 +3617,18 @@ } }, "matchit": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/matchit/-/matchit-1.0.6.tgz", - "integrity": "sha1-gl2gZGi9Mk8CGevijhKkG/tVJMQ=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/matchit/-/matchit-1.0.7.tgz", + "integrity": "sha512-6GQP+4ukhBEL4pQPQlipd51XnpOlycit/3o6p4XhhZt2+9hc7JlHr7NuWbTLQ2MdSzcxR603L7LF4T8x1e1mXA==", "dev": true, "requires": { "@arr/every": "^1.0.0" } }, "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true }, "md5.js": { @@ -3703,9 +3690,9 @@ } }, "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", "dev": true }, "mimic-fn": { @@ -3737,14 +3724,14 @@ }, "minimist": { "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { "concat-stream": "^1.5.0", @@ -3753,7 +3740,7 @@ "flush-write-stream": "^1.0.0", "from2": "^2.1.0", "parallel-transform": "^1.1.0", - "pump": "^2.0.1", + "pump": "^3.0.0", "pumpify": "^1.3.3", "stream-each": "^1.1.0", "through2": "^2.0.0" @@ -3782,7 +3769,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -3810,7 +3797,7 @@ "dependencies": { "commander": { "version": "2.15.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, @@ -3837,6 +3824,12 @@ "path-is-absolute": "^1.0.0" } }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -3869,9 +3862,9 @@ } }, "mri": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.1.tgz", - "integrity": "sha1-haom09ru7t+A3FmEr5XMXKXK2fE=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", "dev": true }, "ms": { @@ -3887,9 +3880,9 @@ "dev": true }, "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", "dev": true, "optional": true }, @@ -3959,15 +3952,15 @@ } }, "node-fetch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.2.0.tgz", - "integrity": "sha512-OayFWziIxiHY8bCUyLX6sTpDH8Jsbp4FfYd1j1f7vZyfgkcOnAyM4oQR16f8a0s7Gl/viMGRey8eScYk4V4EZA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", + "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", "dev": true }, "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", "dev": true, "requires": { "assert": "^1.1.1", @@ -3977,7 +3970,7 @@ "constants-browserify": "^1.0.0", "crypto-browserify": "^3.11.0", "domain-browser": "^1.1.1", - "events": "^1.0.0", + "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", "path-browserify": "0.0.0", @@ -3991,7 +3984,7 @@ "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", "url": "^0.11.0", - "util": "^0.10.3", + "util": "^0.11.0", "vm-browserify": "0.0.4" }, "dependencies": { @@ -4004,13 +3997,13 @@ } }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-ZVuHxWJv1bopjv/SD5uPhgwUhLqxdJ+SsdUQbGR9HWlXrvnd/C08Cn9Bq48PbvX3y5V97GIpAHpL5Bk9BwChGg==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "is-builtin-module": "^3.0.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } @@ -4237,19 +4230,10 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "pad-right": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", - "integrity": "sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q=", - "dev": true, - "requires": { - "repeat-string": "^1.5.2" - } - }, "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", + "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", "dev": true }, "parallel-transform": { @@ -4271,17 +4255,27 @@ "no-case": "^2.2.0" } }, + "parent-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", + "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", + "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", "dev": true, "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-glob": { @@ -4324,13 +4318,10 @@ "dev": true }, "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -4392,32 +4383,17 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "^1.0.0" + "find-up": "^2.1.0" } }, "pluralize": { @@ -4479,9 +4455,9 @@ "dev": true }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "promise-inflight": { @@ -4502,12 +4478,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -4523,9 +4493,9 @@ } }, "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -4541,6 +4511,18 @@ "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, "punycode": { @@ -4550,30 +4532,19 @@ "dev": true }, "puppeteer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.9.0.tgz", - "integrity": "sha512-GH4PmhJf9wBRAPvtJkEJLAvdNNOofZortmBZSj8cGWYni98GUFqsf66blOEfJbo5B8l0KG5HR2d/W2MejnUrzg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.11.0.tgz", + "integrity": "sha512-iG4iMOHixc2EpzqRV+pv7o3GgmU2dNYEMkvKwSaQO/vMZURakwSOn/EYJ6OIRFYOque1qorzIBvrytPIQB3YzQ==", "dev": true, "requires": { - "debug": "^3.1.0", + "debug": "^4.1.0", "extract-zip": "^1.6.6", "https-proxy-agent": "^2.2.1", "mime": "^2.0.3", - "progress": "^2.0.0", + "progress": "^2.0.1", "proxy-from-env": "^1.0.0", "rimraf": "^2.6.1", - "ws": "^5.1.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "ws": "^6.1.0" } }, "querystring": { @@ -4589,9 +4560,9 @@ "dev": true }, "randomatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", - "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, "requires": { "is-number": "^4.0.0", @@ -4651,22 +4622,11 @@ "requires": { "find-up": "^2.0.0", "read-pkg": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - } } }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -5035,29 +4995,19 @@ "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", "dev": true }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } }, "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "resolve-url": { @@ -5083,12 +5033,12 @@ "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "ripemd160": { @@ -5110,14 +5060,6 @@ "@types/estree": "0.0.39", "@types/node": "*", "acorn": "^6.0.5" - }, - "dependencies": { - "acorn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.6.tgz", - "integrity": "sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA==", - "dev": true - } } }, "rollup-plugin-commonjs": { @@ -5150,14 +5092,6 @@ "builtin-modules": "^3.0.0", "is-module": "^1.0.0", "resolve": "^1.8.1" - }, - "dependencies": { - "builtin-modules": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.0.0.tgz", - "integrity": "sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg==", - "dev": true - } } }, "rollup-plugin-replace": { @@ -5188,7 +5122,7 @@ }, "rollup-pluginutils": { "version": "1.5.2", - "resolved": "http://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", "dev": true, "requires": { @@ -5207,14 +5141,6 @@ "require-relative": "^0.8.7", "rollup-pluginutils": "^2.3.3", "sourcemap-codec": "^1.4.4" - }, - "dependencies": { - "sourcemap-codec": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", - "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", - "dev": true - } } }, "rollup-plugin-typescript": { @@ -5262,22 +5188,21 @@ } }, "rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "sade": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.4.1.tgz", - "integrity": "sha512-r2S6GwNeYFYx02w2SYUfhYI9PzxdfNWxsX1QpI3Z4rK9bu9K3FtNVg2awp54Y9iivcYqR2iWqI3nT5jEihNyBg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.4.2.tgz", + "integrity": "sha512-MTrQm+Nhl4m1mbssYDgAculC/HbShjj08QtHnA2GTpzivfU5aUp8EoHlECmrIHEaa8hZRZSp2Gygv8VMlpXEBw==", "dev": true, "requires": { - "mri": "^1.1.0", - "pad-right": "^0.2.2" + "mri": "^1.1.0" } }, "safe-buffer": { @@ -5329,9 +5254,9 @@ "dev": true }, "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", + "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", "dev": true }, "set-value": { @@ -5365,7 +5290,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -5423,11 +5348,13 @@ } }, "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" } }, @@ -5585,9 +5512,9 @@ } }, "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -5600,14 +5527,14 @@ "dev": true }, "sourcemap-codec": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.3.tgz", - "integrity": "sha512-vFrY/x/NdsD7Yc8mpTJXuao9S8lq08Z/kOITHz6b7YbfI9xL8Spe5EvSQUHOI7SbpY8bRPr0U3kKSsPuqEGSfA==" + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", + "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==" }, "spdx-correct": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", - "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -5631,9 +5558,9 @@ } }, "spdx-license-ids": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", - "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, "split-string": { @@ -5652,12 +5579,12 @@ "dev": true }, "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "safe-buffer": "^5.1.1" + "figgy-pudding": "^3.5.1" } }, "static-extend": { @@ -5682,9 +5609,9 @@ } }, "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { "inherits": "~2.0.1", @@ -5786,9 +5713,9 @@ } }, "svelte": { - "version": "3.0.0-alpha23", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.0.0-alpha23.tgz", - "integrity": "sha512-+5q5AOkYx9k4NGzifo5UYGhVftVU+6jhtEbFr4yGq7A76sUKR3Ytb0j5X3dc0gmi1zGPTxXef1geoggvaPhxMA==", + "version": "3.0.0-alpha25", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.0.0-alpha25.tgz", + "integrity": "sha512-Qbziusyrhy2eeonijfpgq1s0CyzsMrwU5hz3+o+bASFjk5kKFCmKRGYLWRU5JnYFTphZyLw4jPdbBKWFDOMmng==", "dev": true }, "svelte-dev-helper": { @@ -5798,9 +5725,9 @@ "dev": true }, "svelte-loader": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/svelte-loader/-/svelte-loader-2.11.0.tgz", - "integrity": "sha512-+Q24lBhQ8KGB9flHNXjKqq9TJEIcT3VJlzsxhijqrJ9feK9bUG3TLDlosceoAXvOsjxuaHKN1ZveUbbX7J7zUQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/svelte-loader/-/svelte-loader-2.12.0.tgz", + "integrity": "sha512-mxkjxHecbWl3KzhlwWm4C/Mid4Anhk611sEG31aa0BwdELIgLSaAxSJkxJrrFxxNgEKGKyTSeUI3blKNM+3s8Q==", "dev": true, "requires": { "loader-utils": "^1.1.0", @@ -5809,23 +5736,63 @@ } }, "table": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz", - "integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/table/-/table-5.2.2.tgz", + "integrity": "sha512-f8mJmuu9beQEDkKHLzOv4VxVYlU68NpdzjbGPl69i4Hx0sTopJuNxuzJd17iV2h24dAfa93u794OnDA5jqXvfQ==", "dev": true, "requires": { - "ajv": "^6.5.3", - "lodash": "^4.17.10", - "slice-ansi": "1.0.0", + "ajv": "^6.6.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.0.0", "string-width": "^2.1.1" } }, "tapable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", - "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", + "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", "dev": true }, + "terser": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.14.1.tgz", + "integrity": "sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1", + "source-map-support": "~0.5.6" + } + }, + "terser-webpack-plugin": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz", + "integrity": "sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw==", + "dev": true, + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.8.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5834,17 +5801,17 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "^2.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, @@ -5858,9 +5825,9 @@ } }, "tiny-glob": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.2.tgz", - "integrity": "sha512-o8rak1FRmr55Nd1Bdcfd+yetPGclFCVHXiKmoBHYULc+FQXBbqb9S3zKAWyqk+RdWvutlGUOw0kCHC0JLF/T4Q==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.6.tgz", + "integrity": "sha512-A7ewMqPu1B5PWwC3m7KVgAu96Ch5LA0w4SnEN/LbDREj/gAD0nPWboRbn8YoP9ISZXqeNAlMvKSKoEuhcfK3Pw==", "dev": true, "requires": { "globalyzer": "^0.1.0", @@ -5973,9 +5940,9 @@ "dev": true }, "typescript": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.3.tgz", - "integrity": "sha512-+81MUSyX+BaSo+u2RbozuQk/UWx6hfG0a5gHu4ANEM4sU96XbuIyAB+rWBW1u70c6a5QuZfuYICn3s2UjuHUpA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", + "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", "dev": true }, "uglify-js": { @@ -5987,40 +5954,6 @@ "source-map": "~0.6.1" } }, - "uglifyjs-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", - "dev": true, - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "schema-utils": "^0.4.5", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "uglify-es": "^3.3.4", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - } - } - } - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -6171,9 +6104,9 @@ "dev": true }, "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { "inherits": "2.0.3" @@ -6216,17 +6149,17 @@ } }, "webpack": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.20.2.tgz", - "integrity": "sha512-75WFUMblcWYcocjSLlXCb71QuGyH7egdBZu50FtBGl2Nso8CK3Ej+J7bTZz2FPFq5l6fzCisD9modB7t30ikuA==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.0.tgz", + "integrity": "sha512-pxdGG0keDBtamE1mNvT5zyBdx+7wkh6mh7uzMOo/uRQ/fhsdj5FXkh/j5mapzs060forql1oXqXN9HJGju+y7w==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-module-context": "1.7.8", - "@webassemblyjs/wasm-edit": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8", - "acorn": "^5.6.2", - "acorn-dynamic-import": "^3.0.0", + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "acorn": "^6.0.5", + "acorn-dynamic-import": "^4.0.0", "ajv": "^6.1.0", "ajv-keywords": "^3.1.0", "chrome-trace-event": "^1.0.0", @@ -6242,7 +6175,7 @@ "node-libs-browser": "^2.0.0", "schema-utils": "^0.4.4", "tapable": "^1.1.0", - "uglifyjs-webpack-plugin": "^1.2.4", + "terser-webpack-plugin": "^1.1.0", "watchpack": "^1.5.0", "webpack-sources": "^1.3.0" }, @@ -6539,20 +6472,12 @@ } }, "webpack-format-messages": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/webpack-format-messages/-/webpack-format-messages-2.0.3.tgz", - "integrity": "sha512-NjIB6eC3PBz6q7FTxMZ15339LWjyvLHeuJ17HTSV/syLZq71O7p6NS4qDaazUr0Qf8ZnzyVapg49Nxssi/dxcg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/webpack-format-messages/-/webpack-format-messages-2.0.5.tgz", + "integrity": "sha512-URo5MWlxsYNFjyKmK5RUjrmr45JBMs/juWPIxOkDU2bcTwCblyn0zTUw+ZWASBJCnJBgWZ4SOeGWFfCBYLarpA==", "dev": true, "requires": { - "kleur": "^2.0.1" - }, - "dependencies": { - "kleur": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", - "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", - "dev": true - } + "kleur": "^3.0.0" } }, "webpack-sources": { @@ -6605,9 +6530,9 @@ } }, "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.3.tgz", + "integrity": "sha512-tbSxiT+qJI223AP4iLfQbkbxkwdFcneYinM2+x46Gx2wgvbaOMO36czfdfVUBRTHvzAMRhDd98sA5d/BuWbQdg==", "dev": true, "requires": { "async-limiter": "~1.0.0" @@ -6626,9 +6551,9 @@ "dev": true }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true }, "yauzl": { diff --git a/package.json b/package.json index c112a3d..52a96f5 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "sade": "^1.4.1", "sander": "^0.6.0", "sirv": "^0.2.2", - "svelte": "^3.0.0-alpha23", + "svelte": "^3.0.0-alpha25", "svelte-loader": "^2.11.0", "ts-node": "^8.0.2", "typescript": "^3.1.3", From 3499631e8e395937b5e25d8650810e80aac20293 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 30 Jan 2019 14:08:55 -0500 Subject: [PATCH 09/38] remove experimentalCodeSplitting --- rollup.config.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rollup.config.js b/rollup.config.js index 7e13cd6..b8c76fe 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -59,7 +59,6 @@ export default [ typescript({ typescript: require('typescript') }) - ], - experimentalCodeSplitting: true + ] } ]; \ No newline at end of file From 1f9efd353c0ccbbde9ac89cd00a833fb8abf4b98 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 30 Jan 2019 15:43:42 -0500 Subject: [PATCH 10/38] fix scrolling to deep links --- templates/src/client/app.ts | 21 ++++++++++++------- test/apps/basics/test.ts | 5 ++--- test/apps/preloading/test.ts | 6 ++---- .../scroll/src/routes/another-tall-page.html | 2 ++ test/apps/scroll/src/routes/tall-page.html | 2 ++ test/apps/scroll/test.ts | 4 +++- test/apps/store/test.ts | 5 ++--- 7 files changed, 26 insertions(+), 19 deletions(-) diff --git a/templates/src/client/app.ts b/templates/src/client/app.ts index a409203..c188502 100644 --- a/templates/src/client/app.ts +++ b/templates/src/client/app.ts @@ -1,4 +1,4 @@ -import { nextTick } from 'svelte'; +import { tick } from 'svelte'; import RootComponent, * as RootComponentStatic from '__ROOT__'; import ErrorComponent from '__ERROR__'; import { @@ -147,7 +147,7 @@ export function navigate(target: Target, id: number, noscroll?: boolean, hash?: }); } -function render(props: any, nullable_depth: number, scroll: ScrollPosition, noscroll: boolean, hash: string, token: {}) { +async function render(props: any, nullable_depth: number, scroll: ScrollPosition, noscroll: boolean, hash: string, token: {}) { if (current_token !== token) return; if (root_component) { @@ -162,12 +162,16 @@ function render(props: any, nullable_depth: number, scroll: ScrollPosition, nosc level.component = null; root_component.$set({ child: props.child }); - nextTick(() => { - // then render new stuff - // TODO do we need to call `flush` before doing this? - level.component = component; - root_component.$set(props); - }); + await tick(); + + // then render new stuff + // TODO do we need to call `flush` before doing this? + level.component = component; + root_component.$set(props); + + // if we need to scroll to a deep link, we need to + // wait for the current update to happen first + if (!noscroll && hash) await tick(); } else { // first load — remove SSR'd contents const start = document.querySelector('#sapper-head-start'); @@ -193,6 +197,7 @@ function render(props: any, nullable_depth: number, scroll: ScrollPosition, nosc if (hash) { // scroll is an element id (from a hash), we need to compute y. const deep_linked = document.querySelector(hash); + if (deep_linked) { scroll = { x: 0, diff --git a/test/apps/basics/test.ts b/test/apps/basics/test.ts index f7e1ac9..c27b519 100644 --- a/test/apps/basics/test.ts +++ b/test/apps/basics/test.ts @@ -20,19 +20,18 @@ describe('basics', function() { let prefetchRoutes: () => Promise; let prefetch: (href: string) => Promise; let goto: (href: string) => Promise; + let title: () => Promise; // hooks before(async () => { await build({ cwd: __dirname }); runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes, prefetch, goto } = await runner.start()); + ({ base, page, start, prefetchRoutes, prefetch, goto, title } = await runner.start()); }); after(() => runner.end()); - const title = () => page.$eval('h1', node => node.textContent); - it('serves /', async () => { await page.goto(base); diff --git a/test/apps/preloading/test.ts b/test/apps/preloading/test.ts index dccd667..8445c86 100644 --- a/test/apps/preloading/test.ts +++ b/test/apps/preloading/test.ts @@ -1,4 +1,3 @@ -import * as path from 'path'; import * as assert from 'assert'; import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; @@ -17,19 +16,18 @@ describe('preloading', function() { // helpers let start: () => Promise; let prefetchRoutes: () => Promise; + let title: () => Promise; // hooks before(async () => { await build({ cwd: __dirname }); runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes } = await runner.start()); + ({ base, page, start, prefetchRoutes, title } = await runner.start()); }); after(() => runner.end()); - const title = () => page.$eval('h1', node => node.textContent); - it('serializes Set objects returned from preload', async () => { await page.goto(`${base}/preload-values/set`); diff --git a/test/apps/scroll/src/routes/another-tall-page.html b/test/apps/scroll/src/routes/another-tall-page.html index d66879b..a67395a 100644 --- a/test/apps/scroll/src/routes/another-tall-page.html +++ b/test/apps/scroll/src/routes/another-tall-page.html @@ -1,2 +1,4 @@ +

Another tall page

+

element

\ No newline at end of file diff --git a/test/apps/scroll/src/routes/tall-page.html b/test/apps/scroll/src/routes/tall-page.html index 8c79fb7..2fdbd9d 100644 --- a/test/apps/scroll/src/routes/tall-page.html +++ b/test/apps/scroll/src/routes/tall-page.html @@ -8,6 +8,8 @@ }); +

A tall page

+ scroll to foo
diff --git a/test/apps/scroll/test.ts b/test/apps/scroll/test.ts index cd9209e..6bae656 100644 --- a/test/apps/scroll/test.ts +++ b/test/apps/scroll/test.ts @@ -14,13 +14,14 @@ describe('scroll', function() { // helpers let start: () => Promise; let prefetchRoutes: () => Promise; + let title: () => Promise; // hooks before(async () => { await build({ cwd: __dirname }); runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes } = await runner.start()); + ({ base, page, start, prefetchRoutes, title } = await runner.start()); }); after(() => runner.end()); @@ -85,6 +86,7 @@ describe('scroll', function() { await page.click('[href="another-tall-page#bar"]'); await wait(50); + assert.equal(await title(), 'Another tall page'); const scrollY = await page.evaluate(() => window.scrollY); assert.ok(scrollY > 0); }); diff --git a/test/apps/store/test.ts b/test/apps/store/test.ts index a8eab1c..b2e8cfa 100644 --- a/test/apps/store/test.ts +++ b/test/apps/store/test.ts @@ -12,19 +12,18 @@ describe('store', function() { // helpers let start: () => Promise; + let title: () => Promise; // hooks before(async () => { await build({ cwd: __dirname }); runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start } = await runner.start()); + ({ base, page, start, title } = await runner.start()); }); after(() => runner.end()); - const title = () => page.$eval('h1', node => node.textContent); - it('renders store props', async () => { await page.goto(`${base}/store`); From 76ce7f227f432e0645ebe4e32b6e2468e6a47e8a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 30 Jan 2019 16:27:13 -0500 Subject: [PATCH 11/38] tidy up test --- test/apps/store/src/routes/index.html | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/test/apps/store/src/routes/index.html b/test/apps/store/src/routes/index.html index 221c0f5..0cc4b72 100644 --- a/test/apps/store/src/routes/index.html +++ b/test/apps/store/src/routes/index.html @@ -1,7 +1 @@ -

Great success!

- -a -ok -ok - -
\ No newline at end of file +

Great success!

\ No newline at end of file From 90f3393ebff936d89d62bb96c1c98ed8d29d724a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 31 Jan 2019 10:35:14 -0500 Subject: [PATCH 12/38] default to generating app in src/node_modules/@sapper - fixes #551 --- src/api/build.ts | 5 ++++- src/cli.ts | 6 +++--- test/apps/basics/src/client.js | 2 +- test/apps/basics/src/server.js | 2 +- test/apps/basics/src/service-worker.js | 13 ++++++------- test/apps/credentials/src/client.js | 2 +- test/apps/credentials/src/server.js | 2 +- test/apps/credentials/src/service-worker.js | 8 ++++---- test/apps/css/src/client.js | 2 +- test/apps/css/src/server.js | 2 +- test/apps/css/src/service-worker.js | 8 ++++---- test/apps/encoding/src/client.js | 2 +- test/apps/encoding/src/server.js | 2 +- test/apps/encoding/src/service-worker.js | 8 ++++---- test/apps/errors/src/client.js | 2 +- test/apps/errors/src/server.js | 2 +- test/apps/errors/src/service-worker.js | 8 ++++---- test/apps/export/src/client.js | 2 +- test/apps/export/src/server.js | 2 +- test/apps/export/src/service-worker.js | 8 ++++---- test/apps/ignore/src/client.js | 2 +- test/apps/ignore/src/server.js | 2 +- test/apps/ignore/src/service-worker.js | 8 ++++---- test/apps/layout/src/client.js | 2 +- test/apps/layout/src/server.js | 2 +- test/apps/layout/src/service-worker.js | 8 ++++---- test/apps/preloading/src/client.js | 2 +- test/apps/preloading/src/server.js | 2 +- test/apps/preloading/src/service-worker.js | 8 ++++---- test/apps/redirects/src/client.js | 2 +- test/apps/redirects/src/server.js | 2 +- test/apps/redirects/src/service-worker.js | 8 ++++---- test/apps/scroll/src/client.js | 2 +- test/apps/scroll/src/server.js | 2 +- test/apps/scroll/src/service-worker.js | 8 ++++---- test/apps/store/src/client.js | 2 +- test/apps/store/src/server.js | 2 +- test/apps/store/src/service-worker.js | 8 ++++---- test/apps/with-basepath/src/client.js | 2 +- test/apps/with-basepath/src/server.js | 2 +- test/apps/with-basepath/src/service-worker.js | 8 ++++---- 41 files changed, 87 insertions(+), 85 deletions(-) diff --git a/src/api/build.ts b/src/api/build.ts index ac563de..201e355 100644 --- a/src/api/build.ts +++ b/src/api/build.ts @@ -26,7 +26,7 @@ export async function build({ cwd, src = 'src', routes = 'src/routes', - output = '__sapper__', + output = 'src/node_modules/@sapper', static: static_files = 'static', dest = '__sapper__/build', @@ -48,6 +48,9 @@ export async function build({ throw new Error(`Legacy builds are not supported for projects using webpack`); } + rimraf.sync(path.join(output, '**/*')); + mkdirp.sync(output); + rimraf.sync(path.join(dest, '**/*')); mkdirp.sync(`${dest}/client`); copy_shimport(dest); diff --git a/src/cli.ts b/src/cli.ts index 085c981..161ab80 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -29,7 +29,7 @@ prog.command('dev') .option('--src', 'Source directory', 'src') .option('--routes', 'Routes directory', 'src/routes') .option('--static', 'Static files directory', 'static') - .option('--output', 'Sapper output directory', '__sapper__') + .option('--output', 'Sapper output directory', 'src/node_modules/@sapper') .option('--build-dir', 'Development build directory', '__sapper__/dev') .action(async (opts: { port: number, @@ -142,7 +142,7 @@ prog.command('build [dest]') .option('--cwd', 'Current working directory', '.') .option('--src', 'Source directory', 'src') .option('--routes', 'Routes directory', 'src/routes') - .option('--output', 'Sapper output directory', '__sapper__') + .option('--output', 'Sapper output directory', 'src/node_modules/@sapper') .example(`build custom-dir -p 4567`) .action(async (dest = '__sapper__/build', opts: { port: string, @@ -188,7 +188,7 @@ prog.command('export [dest]') .option('--src', 'Source directory', 'src') .option('--routes', 'Routes directory', 'src/routes') .option('--static', 'Static files directory', 'static') - .option('--output', 'Sapper output directory', '__sapper__') + .option('--output', 'Sapper output directory', 'src/node_modules/@sapper') .option('--build-dir', 'Intermediate build directory', '__sapper__/build') .action(async (dest = '__sapper__/export', opts: { build: boolean, diff --git a/test/apps/basics/src/client.js b/test/apps/basics/src/client.js index 0865a4a..5fd4ce8 100644 --- a/test/apps/basics/src/client.js +++ b/test/apps/basics/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/client'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/basics/src/server.js b/test/apps/basics/src/server.js index 0e7741c..7f090b8 100644 --- a/test/apps/basics/src/server.js +++ b/test/apps/basics/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/basics/src/service-worker.js b/test/apps/basics/src/service-worker.js index 9d2ac9d..c80a8f4 100644 --- a/test/apps/basics/src/service-worker.js +++ b/test/apps/basics/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; -// `shell` is an array of all the files generated by webpack, -// `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +// `app.shell` is an array of all the files generated by webpack, +// `app.files` is an array of everything in the `static` directory +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -52,7 +52,6 @@ self.addEventListener('fetch', event => { // which Sapper has generated for you. It's not right for every // app, but if it's right for yours then uncomment this section /* - if (url.origin === self.origin && routes.find(route => route.pattern.test(url.pathname))) { event.respondWith(caches.match('/index.html')); return; } @@ -65,7 +64,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/credentials/src/client.js b/test/apps/credentials/src/client.js index 0865a4a..5fd4ce8 100644 --- a/test/apps/credentials/src/client.js +++ b/test/apps/credentials/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/client'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/credentials/src/server.js b/test/apps/credentials/src/server.js index 2761f50..951243e 100644 --- a/test/apps/credentials/src/server.js +++ b/test/apps/credentials/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/credentials/src/service-worker.js b/test/apps/credentials/src/service-worker.js index 9d2ac9d..8adb97a 100644 --- a/test/apps/credentials/src/service-worker.js +++ b/test/apps/credentials/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/css/src/client.js b/test/apps/css/src/client.js index 0865a4a..5fd4ce8 100644 --- a/test/apps/css/src/client.js +++ b/test/apps/css/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/client'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/css/src/server.js b/test/apps/css/src/server.js index 0e7741c..7f090b8 100644 --- a/test/apps/css/src/server.js +++ b/test/apps/css/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/css/src/service-worker.js b/test/apps/css/src/service-worker.js index 9d2ac9d..8adb97a 100644 --- a/test/apps/css/src/service-worker.js +++ b/test/apps/css/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/encoding/src/client.js b/test/apps/encoding/src/client.js index 0865a4a..5fd4ce8 100644 --- a/test/apps/encoding/src/client.js +++ b/test/apps/encoding/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/client'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/encoding/src/server.js b/test/apps/encoding/src/server.js index 0e7741c..7f090b8 100644 --- a/test/apps/encoding/src/server.js +++ b/test/apps/encoding/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/encoding/src/service-worker.js b/test/apps/encoding/src/service-worker.js index 9d2ac9d..8adb97a 100644 --- a/test/apps/encoding/src/service-worker.js +++ b/test/apps/encoding/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/errors/src/client.js b/test/apps/errors/src/client.js index 0865a4a..5fd4ce8 100644 --- a/test/apps/errors/src/client.js +++ b/test/apps/errors/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/client'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/errors/src/server.js b/test/apps/errors/src/server.js index 0e7741c..7f090b8 100644 --- a/test/apps/errors/src/server.js +++ b/test/apps/errors/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/errors/src/service-worker.js b/test/apps/errors/src/service-worker.js index 9d2ac9d..8adb97a 100644 --- a/test/apps/errors/src/service-worker.js +++ b/test/apps/errors/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/export/src/client.js b/test/apps/export/src/client.js index 0865a4a..5fd4ce8 100644 --- a/test/apps/export/src/client.js +++ b/test/apps/export/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/client'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/export/src/server.js b/test/apps/export/src/server.js index d5a668b..2c6932d 100644 --- a/test/apps/export/src/server.js +++ b/test/apps/export/src/server.js @@ -1,6 +1,6 @@ import sirv from 'sirv'; import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT, NODE_ENV } = process.env; const dev = NODE_ENV === 'development'; diff --git a/test/apps/export/src/service-worker.js b/test/apps/export/src/service-worker.js index 9d2ac9d..8adb97a 100644 --- a/test/apps/export/src/service-worker.js +++ b/test/apps/export/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/ignore/src/client.js b/test/apps/ignore/src/client.js index 0865a4a..5fd4ce8 100644 --- a/test/apps/ignore/src/client.js +++ b/test/apps/ignore/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/client'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/ignore/src/server.js b/test/apps/ignore/src/server.js index f987e4a..4a66815 100644 --- a/test/apps/ignore/src/server.js +++ b/test/apps/ignore/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/ignore/src/service-worker.js b/test/apps/ignore/src/service-worker.js index 9d2ac9d..8adb97a 100644 --- a/test/apps/ignore/src/service-worker.js +++ b/test/apps/ignore/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/layout/src/client.js b/test/apps/layout/src/client.js index 0865a4a..5fd4ce8 100644 --- a/test/apps/layout/src/client.js +++ b/test/apps/layout/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/client'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/layout/src/server.js b/test/apps/layout/src/server.js index 0e7741c..7f090b8 100644 --- a/test/apps/layout/src/server.js +++ b/test/apps/layout/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/layout/src/service-worker.js b/test/apps/layout/src/service-worker.js index 9d2ac9d..8adb97a 100644 --- a/test/apps/layout/src/service-worker.js +++ b/test/apps/layout/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/preloading/src/client.js b/test/apps/preloading/src/client.js index 0865a4a..5fd4ce8 100644 --- a/test/apps/preloading/src/client.js +++ b/test/apps/preloading/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/client'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/preloading/src/server.js b/test/apps/preloading/src/server.js index 0e7741c..7f090b8 100644 --- a/test/apps/preloading/src/server.js +++ b/test/apps/preloading/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/preloading/src/service-worker.js b/test/apps/preloading/src/service-worker.js index 9d2ac9d..8adb97a 100644 --- a/test/apps/preloading/src/service-worker.js +++ b/test/apps/preloading/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/redirects/src/client.js b/test/apps/redirects/src/client.js index 0865a4a..5fd4ce8 100644 --- a/test/apps/redirects/src/client.js +++ b/test/apps/redirects/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/client'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/redirects/src/server.js b/test/apps/redirects/src/server.js index 0e7741c..7f090b8 100644 --- a/test/apps/redirects/src/server.js +++ b/test/apps/redirects/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/redirects/src/service-worker.js b/test/apps/redirects/src/service-worker.js index 9d2ac9d..8adb97a 100644 --- a/test/apps/redirects/src/service-worker.js +++ b/test/apps/redirects/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/scroll/src/client.js b/test/apps/scroll/src/client.js index 0865a4a..5fd4ce8 100644 --- a/test/apps/scroll/src/client.js +++ b/test/apps/scroll/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/client'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/scroll/src/server.js b/test/apps/scroll/src/server.js index 0e7741c..7f090b8 100644 --- a/test/apps/scroll/src/server.js +++ b/test/apps/scroll/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/scroll/src/service-worker.js b/test/apps/scroll/src/service-worker.js index 9d2ac9d..8adb97a 100644 --- a/test/apps/scroll/src/service-worker.js +++ b/test/apps/scroll/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/store/src/client.js b/test/apps/store/src/client.js index df66471..eb6262c 100644 --- a/test/apps/store/src/client.js +++ b/test/apps/store/src/client.js @@ -1,5 +1,5 @@ import { Store } from 'svelte/store.js'; -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/client'; window.start = () => sapper.start({ target: document.querySelector('#sapper'), diff --git a/test/apps/store/src/server.js b/test/apps/store/src/server.js index c40e690..843b06d 100644 --- a/test/apps/store/src/server.js +++ b/test/apps/store/src/server.js @@ -1,6 +1,6 @@ import polka from 'polka'; import { Store } from 'svelte/store.js'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/store/src/service-worker.js b/test/apps/store/src/service-worker.js index 9d2ac9d..8adb97a 100644 --- a/test/apps/store/src/service-worker.js +++ b/test/apps/store/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/with-basepath/src/client.js b/test/apps/with-basepath/src/client.js index 0865a4a..5fd4ce8 100644 --- a/test/apps/with-basepath/src/client.js +++ b/test/apps/with-basepath/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/client'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/with-basepath/src/server.js b/test/apps/with-basepath/src/server.js index b187dad..22da3e9 100644 --- a/test/apps/with-basepath/src/server.js +++ b/test/apps/with-basepath/src/server.js @@ -1,6 +1,6 @@ import sirv from 'sirv'; import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT, NODE_ENV } = process.env; const dev = NODE_ENV === 'development'; diff --git a/test/apps/with-basepath/src/service-worker.js b/test/apps/with-basepath/src/service-worker.js index 9d2ac9d..8adb97a 100644 --- a/test/apps/with-basepath/src/service-worker.js +++ b/test/apps/with-basepath/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); From c990c771d80c58e86e713b35d2eb4f29b23e2027 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 31 Jan 2019 11:32:05 -0500 Subject: [PATCH 13/38] switch to mjs to align with Svelte --- .gitignore | 2 +- rollup.config.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 58cad32..0a43809 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,4 @@ sapper runtime.js dist !rollup.config.js -templates/*.js \ No newline at end of file +templates/*.mjs \ No newline at end of file diff --git a/rollup.config.js b/rollup.config.js index b8c76fe..27a4cf2 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -16,7 +16,7 @@ function template(kind, external, target) { return { input: `templates/src/${kind}/index.ts`, output: { - file: `templates/${kind}.js`, + file: `templates/${kind}.mjs`, format: 'es' }, external, From d486542a8b40c65845b043d77466849c91c8d07b Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 31 Jan 2019 11:32:51 -0500 Subject: [PATCH 14/38] update store test --- test/apps/store/src/client.js | 4 +--- test/apps/store/src/routes/store.html | 7 ++++++- test/apps/store/src/server.js | 9 +++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/test/apps/store/src/client.js b/test/apps/store/src/client.js index eb6262c..5fd4ce8 100644 --- a/test/apps/store/src/client.js +++ b/test/apps/store/src/client.js @@ -1,9 +1,7 @@ -import { Store } from 'svelte/store.js'; import * as sapper from '@sapper/client'; window.start = () => sapper.start({ - target: document.querySelector('#sapper'), - store: data => new Store(data) + target: document.querySelector('#sapper') }); window.prefetchRoutes = () => sapper.prefetchRoutes(); diff --git a/test/apps/store/src/routes/store.html b/test/apps/store/src/routes/store.html index 148147a..c0b1309 100644 --- a/test/apps/store/src/routes/store.html +++ b/test/apps/store/src/routes/store.html @@ -1 +1,6 @@ -

{$title}

\ No newline at end of file + + +

{$session.title}

\ No newline at end of file diff --git a/test/apps/store/src/server.js b/test/apps/store/src/server.js index 843b06d..16d904e 100644 --- a/test/apps/store/src/server.js +++ b/test/apps/store/src/server.js @@ -1,5 +1,4 @@ import polka from 'polka'; -import { Store } from 'svelte/store.js'; import * as sapper from '@sapper/server'; const { PORT } = process.env; @@ -12,11 +11,9 @@ polka() }) .use( sapper.middleware({ - store: (req, res) => { - return new Store({ - title: `${req.hello} ${res.locals.name}` - }); - } + session: (req, res) => ({ + title: `${req.hello} ${res.locals.name}` + }) }) ) .listen(PORT); From f587161d7d3380e928388069541f957278851831 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 31 Jan 2019 21:42:29 -0500 Subject: [PATCH 15/38] first crack at context-driven store --- .gitignore | 3 +- package-lock.json | 6 +-- package.json | 5 ++- rollup.config.js | 5 ++- src/api/build.ts | 2 +- src/api/dev.ts | 6 ++- src/cli.ts | 36 ++++++++--------- src/core/create_compilers/extract_css.ts | 2 +- src/core/create_manifests.ts | 19 +++++---- src/interfaces.ts | 6 ++- templates/App.html | 13 ++++++ templates/internal.mjs | 1 + templates/src/{client => app}/app.ts | 34 ++++++++-------- templates/src/{client => app}/goto/index.ts | 0 templates/src/app/index.ts | 13 ++++++ .../src/{client => app}/prefetch/index.ts | 0 .../{client => app}/prefetchRoutes/index.ts | 0 templates/src/{client => app}/start/index.ts | 6 +-- templates/src/{client => app}/types.ts | 0 templates/src/client/index.ts | 4 -- .../src/server/middleware/get_page_handler.ts | 40 ++++++++++++------- templates/src/server/middleware/index.ts | 10 +++-- templates/src/shared/stores.ts | 4 ++ test/apps/basics/src/client.js | 2 +- test/apps/credentials/src/client.js | 2 +- test/apps/css/src/client.js | 2 +- test/apps/encoding/src/client.js | 2 +- test/apps/errors/src/client.js | 2 +- test/apps/export/src/client.js | 2 +- test/apps/ignore/src/client.js | 2 +- test/apps/layout/src/client.js | 2 +- test/apps/preloading/src/client.js | 2 +- test/apps/preloading/src/routes/_layout.html | 5 ++- test/apps/redirects/src/client.js | 2 +- test/apps/scroll/src/client.js | 2 +- test/apps/store/src/client.js | 2 +- test/apps/store/src/routes/store.html | 4 +- test/apps/with-basepath/src/client.js | 2 +- 38 files changed, 150 insertions(+), 100 deletions(-) create mode 100644 templates/App.html create mode 100644 templates/internal.mjs rename templates/src/{client => app}/app.ts (94%) rename templates/src/{client => app}/goto/index.ts (100%) create mode 100644 templates/src/app/index.ts rename templates/src/{client => app}/prefetch/index.ts (100%) rename templates/src/{client => app}/prefetchRoutes/index.ts (100%) rename templates/src/{client => app}/start/index.ts (95%) rename templates/src/{client => app}/types.ts (100%) delete mode 100644 templates/src/client/index.ts create mode 100644 templates/src/shared/stores.ts diff --git a/.gitignore b/.gitignore index 0a43809..b2cc98d 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,5 @@ sapper runtime.js dist !rollup.config.js -templates/*.mjs \ No newline at end of file +templates/app.mjs +templates/server.mjs \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8de2885..51abda0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5713,9 +5713,9 @@ } }, "svelte": { - "version": "3.0.0-alpha25", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.0.0-alpha25.tgz", - "integrity": "sha512-Qbziusyrhy2eeonijfpgq1s0CyzsMrwU5hz3+o+bASFjk5kKFCmKRGYLWRU5JnYFTphZyLw4jPdbBKWFDOMmng==", + "version": "3.0.0-alpha26", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.0.0-alpha26.tgz", + "integrity": "sha512-8++B3/arwhWggcvBYZnGDd9xKsYchqw4Os2haA38v6BSIcSSY706puNK01+PAdVvLCUJH/R4U6T8uV/fhjwVVw==", "dev": true }, "svelte-dev-helper": { diff --git a/package.json b/package.json index 52a96f5..beb95b5 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "config", "sapper", "dist/*.js", - "templates/*.js" + "templates/*.js", + "templates/*.html" ], "directories": { "test": "test" @@ -58,7 +59,7 @@ "sade": "^1.4.1", "sander": "^0.6.0", "sirv": "^0.2.2", - "svelte": "^3.0.0-alpha25", + "svelte": "^3.0.0-alpha26", "svelte-loader": "^2.11.0", "ts-node": "^8.0.2", "typescript": "^3.1.3", diff --git a/rollup.config.js b/rollup.config.js index 27a4cf2..dcd8df9 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -17,7 +17,8 @@ function template(kind, external, target) { input: `templates/src/${kind}/index.ts`, output: { file: `templates/${kind}.mjs`, - format: 'es' + format: 'es', + paths: id => id.replace('@sapper', '.') }, external, plugins: [ @@ -35,7 +36,7 @@ function template(kind, external, target) { } export default [ - template('client', ['__ROOT__', '__ERROR__'], 'ES2017'), + template('app', ['__ROOT__', '__ERROR__', 'svelte', '@sapper/App.html'], 'ES2017'), template('server', builtinModules, 'ES2015'), { diff --git a/src/api/build.ts b/src/api/build.ts index 201e355..2fbeff0 100644 --- a/src/api/build.ts +++ b/src/api/build.ts @@ -70,7 +70,7 @@ export async function build({ const manifest_data = create_manifest_data(routes); - // create src/manifest/client.js and src/manifest/server.js + // create src/node_modules/@sapper/app.mjs and server.mjs create_main_manifests({ bundler, manifest_data, diff --git a/src/api/dev.ts b/src/api/dev.ts index 54fddc9..4ac6195 100644 --- a/src/api/dev.ts +++ b/src/api/dev.ts @@ -72,7 +72,7 @@ class Watcher extends EventEmitter { cwd = '.', src = 'src', routes = 'src/routes', - output = '__sapper__', + output = 'src/node_modules/@sapper', static: static_files = 'static', dest = '__sapper__/dev', 'dev-port': dev_port, @@ -144,6 +144,10 @@ class Watcher extends EventEmitter { } const { cwd, src, dest, routes, output, static: static_files } = this.dirs; + + rimraf.sync(path.join(output, '**/*')); + mkdirp.sync(output); + rimraf.sync(dest); mkdirp.sync(`${dest}/client`); if (this.bundler === 'rollup') copy_shimport(dest); diff --git a/src/cli.ts b/src/cli.ts index 161ab80..748ef5e 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -10,7 +10,7 @@ const prog = sade('sapper').version(pkg.version); if (process.argv[2] === 'start') { // remove this in a future version - console.error(colors.bold.red(`'sapper start' has been removed`)); + console.error(colors.bold().red(`'sapper start' has been removed`)); console.error(`Use 'node [build_dir]' instead`); process.exit(1); } @@ -74,7 +74,7 @@ prog.command('dev') watcher.on('ready', async (event: ReadyEvent) => { if (first) { - console.log(colors.bold.cyan(`> Listening on http://localhost:${event.port}`)); + console.log(colors.bold().cyan(`> Listening on http://localhost:${event.port}`)); if (opts.open) { const { exec } = await import('child_process'); exec(`open http://localhost:${event.port}`); @@ -85,7 +85,7 @@ prog.command('dev') watcher.on('invalid', (event: InvalidEvent) => { const changed = event.changed.map(filename => path.relative(process.cwd(), filename)).join(', '); - console.log(`\n${colors.bold.cyan(changed)} changed. rebuilding...`); + console.log(`\n${colors.bold().cyan(changed)} changed. rebuilding...`); }); watcher.on('error', (event: ErrorEvent) => { @@ -94,16 +94,16 @@ prog.command('dev') }); watcher.on('fatal', (event: FatalEvent) => { - console.log(colors.bold.red(`> ${event.message}`)); + console.log(colors.bold().red(`> ${event.message}`)); if (event.log) console.log(event.log); }); watcher.on('build', (event: BuildEvent) => { if (event.errors.length) { - console.log(colors.bold.red(`✗ ${event.type}`)); + console.log(colors.bold().red(`✗ ${event.type}`)); event.errors.filter(e => !e.duplicate).forEach(error => { - if (error.file) console.log(colors.bold(error.file)); + if (error.file) console.log(colors.bold()(error.file)); console.log(error.message); }); @@ -112,10 +112,10 @@ prog.command('dev') console.log(`${hidden} duplicate ${hidden === 1 ? 'error' : 'errors'} hidden\n`); } } else if (event.warnings.length) { - console.log(colors.bold.yellow(`• ${event.type}`)); + console.log(colors.bold().yellow(`• ${event.type}`)); event.warnings.filter(e => !e.duplicate).forEach(warning => { - if (warning.file) console.log(colors.bold(warning.file)); + if (warning.file) console.log(colors.bold()(warning.file)); console.log(warning.message); }); @@ -124,11 +124,11 @@ prog.command('dev') console.log(`${hidden} duplicate ${hidden === 1 ? 'warning' : 'warnings'} hidden\n`); } } else { - console.log(`${colors.bold.green(`✔ ${event.type}`)} ${colors.gray(`(${format_milliseconds(event.duration)})`)}`); + console.log(`${colors.bold().green(`✔ ${event.type}`)} ${colors.gray(`(${format_milliseconds(event.duration)})`)}`); } }); } catch (err) { - console.log(colors.bold.red(`> ${err.message}`)); + console.log(colors.bold().red(`> ${err.message}`)); console.log(colors.gray(err.stack)); process.exit(1); } @@ -169,9 +169,9 @@ prog.command('build [dest]') require('./server/server.js'); `.replace(/^\t+/gm, '').trim()); - console.error(`\n> Finished in ${elapsed(start)}. Type ${colors.bold.cyan(`node ${dest}`)} to run the app.`); + console.error(`\n> Finished in ${elapsed(start)}. Type ${colors.bold().cyan(`node ${dest}`)} to run the app.`); } catch (err) { - console.log(`${colors.bold.red(`> ${err.message}`)}`); + console.log(`${colors.bold().red(`> ${err.message}`)}`); console.log(colors.gray(err.stack)); process.exit(1); } @@ -222,24 +222,24 @@ prog.command('export [dest]') timeout: opts.timeout, oninfo: event => { - console.log(colors.bold.cyan(`> ${event.message}`)); + console.log(colors.bold().cyan(`> ${event.message}`)); }, onfile: event => { - const size_color = event.size > 150000 ? colors.bold().red : event.size > 50000 ? colors.bold().yellow : colors.bold().gray; + const size_color = event.size > 150000 ? colors.bold()().red : event.size > 50000 ? colors.bold()().yellow : colors.bold()().gray; const size_label = size_color(left_pad(pb(event.size), 10)); const file_label = event.status === 200 ? event.file - : colors.bold[event.status >= 400 ? 'red' : 'yellow'](`(${event.status}) ${event.file}`); + : colors.bold()[event.status >= 400 ? 'red' : 'yellow'](`(${event.status}) ${event.file}`); console.log(`${size_label} ${file_label}`); } }); - console.error(`\n> Finished in ${elapsed(start)}. Type ${colors.bold.cyan(`npx serve ${dest}`)} to run the app.`); + console.error(`\n> Finished in ${elapsed(start)}. Type ${colors.bold().cyan(`npx serve ${dest}`)} to run the app.`); } catch (err) { - console.error(colors.bold.red(`> ${err.message}`)); + console.error(colors.bold().red(`> ${err.message}`)); process.exit(1); } }); @@ -278,7 +278,7 @@ async function _build( console.log(); console.log(c(`┌─${repeat('─', banner.length)}─┐`)); - console.log(c(`│ ${colors.bold(banner) } │`)); + console.log(c(`│ ${colors.bold()(banner) } │`)); console.log(c(`└─${repeat('─', banner.length)}─┘`)); console.log(event.result.print()); diff --git a/src/core/create_compilers/extract_css.ts b/src/core/create_compilers/extract_css.ts index 47bf99e..c35dcf2 100644 --- a/src/core/create_compilers/extract_css.ts +++ b/src/core/create_compilers/extract_css.ts @@ -153,7 +153,7 @@ export default function extract_css(client_result: CompileResult, components: Pa chunks_with_css.add(chunk); }); - const entry = path.resolve(dirs.src, 'client.js'); + const entry = path.resolve(dirs.src, 'app.mjs'); const entry_chunk = client_result.chunks.find(chunk => chunk.modules.indexOf(entry) !== -1); const entry_chunk_dependencies: Set = new Set([entry_chunk]); diff --git a/src/core/create_manifests.ts b/src/core/create_manifests.ts index 5ce21f0..abb752f 100644 --- a/src/core/create_manifests.ts +++ b/src/core/create_manifests.ts @@ -3,6 +3,10 @@ import * as path from 'path'; import { posixify, stringify, walk, write_if_changed } from '../utils'; import { Page, PageComponent, ManifestData } from '../interfaces'; +const app = fs.readFileSync(path.resolve(__dirname, '../templates/App.html'), 'utf-8'); +const internal = fs.readFileSync(path.resolve(__dirname, '../templates/internal.mjs'), 'utf-8'); +const layout = ``; + export function create_main_manifests({ bundler, manifest_data, @@ -31,12 +35,11 @@ export function create_main_manifests({ const client_manifest = generate_client(manifest_data, path_to_routes, bundler, dev, dev_port); const server_manifest = generate_server(manifest_data, path_to_routes, cwd, src, dest, dev); - write_if_changed( - `${output}/_layout.html`, - `` - ); - write_if_changed(`${output}/client.js`, client_manifest); - write_if_changed(`${output}/server.js`, server_manifest); + write_if_changed(`${output}/_layout.html`, layout); + write_if_changed(`${output}/internal.mjs`, internal); + write_if_changed(`${output}/App.html`, app); + write_if_changed(`${output}/app.mjs`, client_manifest); + write_if_changed(`${output}/server.mjs`, server_manifest); } export function create_serviceworker_manifest({ manifest_data, output, client_files, static_files }: { @@ -80,7 +83,7 @@ function generate_client( dev: boolean, dev_port?: number ) { - const template_file = path.resolve(__dirname, '../templates/client.js'); + const template_file = path.resolve(__dirname, '../templates/app.mjs'); const template = fs.readFileSync(template_file, 'utf-8'); const page_ids = new Set(manifest_data.pages.map(page => @@ -167,7 +170,7 @@ function generate_server( dest: string, dev: boolean ) { - const template_file = path.resolve(__dirname, '../templates/server.js'); + const template_file = path.resolve(__dirname, '../templates/server.mjs'); const template = fs.readFileSync(template_file, 'utf-8'); const imports = [].concat( diff --git a/src/interfaces.ts b/src/interfaces.ts index 77bc681..f9eea04 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -19,8 +19,10 @@ export type Template = { stream: (req, res, data: Record>) => void; }; -export type Store = { - get: () => any; +export type WritableStore = { + set: (value: T) => void; + update: (fn: (value: T) => T) => void; + subscribe: (fn: (T: any) => void) => () => void; }; export type PageComponent = { diff --git a/templates/App.html b/templates/App.html new file mode 100644 index 0000000..16bf42d --- /dev/null +++ b/templates/App.html @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/templates/internal.mjs b/templates/internal.mjs new file mode 100644 index 0000000..454d657 --- /dev/null +++ b/templates/internal.mjs @@ -0,0 +1 @@ +export const CONTEXT_KEY = {}; \ No newline at end of file diff --git a/templates/src/client/app.ts b/templates/src/app/app.ts similarity index 94% rename from templates/src/client/app.ts rename to templates/src/app/app.ts index c188502..2c02d6d 100644 --- a/templates/src/client/app.ts +++ b/templates/src/app/app.ts @@ -1,5 +1,6 @@ -import { tick } from 'svelte'; -import RootComponent, * as RootComponentStatic from '__ROOT__'; +import App from '@sapper/App.html'; +import { preloading, page } from '../shared/stores'; +import Root, * as RootStatic from '__ROOT__'; import ErrorComponent from '__ERROR__'; import { Target, @@ -128,7 +129,9 @@ export function navigate(target: Target, id: number, noscroll?: boolean, hash?: cid = id; if (root_component) { - root_component.$set({ preloading: true }); + preloading.set({ + // TODO path, params, query + }); } const loaded = prefetching && prefetching.href === target.url.href ? prefetching.promise : @@ -150,6 +153,8 @@ export function navigate(target: Target, id: number, noscroll?: boolean, hash?: async function render(props: any, nullable_depth: number, scroll: ScrollPosition, noscroll: boolean, hash: string, token: {}) { if (current_token !== token) return; + preloading.set(null); + if (root_component) { // first, clear out highest-level root component let level = props.child; @@ -160,18 +165,12 @@ async function render(props: any, nullable_depth: number, scroll: ScrollPosition const { component } = level; level.component = null; - root_component.$set({ child: props.child }); - - await tick(); + root_component.props = props; // then render new stuff // TODO do we need to call `flush` before doing this? level.component = component; - root_component.$set(props); - - // if we need to scroll to a deep link, we need to - // wait for the current update to happen first - if (!noscroll && hash) await tick(); + root_component.props = props; } else { // first load — remove SSR'd contents const start = document.querySelector('#sapper-head-start'); @@ -185,10 +184,13 @@ async function render(props: any, nullable_depth: number, scroll: ScrollPosition Object.assign(props, root_data); - root_component = new RootComponent({ + root_component = new App({ target, - props, - store, + props: { + Root, + props, + session: __SAPPER__.session + }, hydrate: true }); } @@ -247,7 +249,7 @@ export function prepare_page(target: Target): Promise<{ }; if (!root_preload) { - const preload_fn = RootComponentStatic['pre' + 'load']; // Rollup makes us jump through these hoops :( + const preload_fn = RootStatic['pre' + 'load']; // Rollup makes us jump through these hoops :( root_preload = preload_fn ? initial_data.preloaded[0] || preload_fn.call(preload_context, { path, @@ -315,7 +317,6 @@ export function prepare_page(target: Target): Promise<{ return { nullable_depth: 0, data: Object.assign({}, props, { - preloading: false, child: { component: ErrorComponent, props @@ -327,7 +328,6 @@ export function prepare_page(target: Target): Promise<{ const props = { path, query, error: null, status: null }; const data = { path, - preloading: false, child: Object.assign({}, root_props.child, { segment: segments[0] }) diff --git a/templates/src/client/goto/index.ts b/templates/src/app/goto/index.ts similarity index 100% rename from templates/src/client/goto/index.ts rename to templates/src/app/goto/index.ts diff --git a/templates/src/app/index.ts b/templates/src/app/index.ts new file mode 100644 index 0000000..5fbc232 --- /dev/null +++ b/templates/src/app/index.ts @@ -0,0 +1,13 @@ +import { getContext } from 'svelte'; +import { CONTEXT_KEY } from '@sapper/internal'; +import * as stores from '../shared/stores'; + +export const preloading = { subscribe: stores.preloading.subscribe }; +export const page = { subscribe: stores.page.subscribe }; + +export const getSession = () => getContext(CONTEXT_KEY); + +export { default as start } from './start/index'; +export { default as goto } from './goto/index'; +export { default as prefetch } from './prefetch/index'; +export { default as prefetchRoutes } from './prefetchRoutes/index'; \ No newline at end of file diff --git a/templates/src/client/prefetch/index.ts b/templates/src/app/prefetch/index.ts similarity index 100% rename from templates/src/client/prefetch/index.ts rename to templates/src/app/prefetch/index.ts diff --git a/templates/src/client/prefetchRoutes/index.ts b/templates/src/app/prefetchRoutes/index.ts similarity index 100% rename from templates/src/client/prefetchRoutes/index.ts rename to templates/src/app/prefetchRoutes/index.ts diff --git a/templates/src/client/start/index.ts b/templates/src/app/start/index.ts similarity index 95% rename from templates/src/client/start/index.ts rename to templates/src/app/start/index.ts index 99c01e9..ab9d669 100644 --- a/templates/src/client/start/index.ts +++ b/templates/src/app/start/index.ts @@ -6,25 +6,21 @@ import { scroll_history, scroll_state, select_route, - set_store, set_target, uid, set_uid, set_cid } from '../app'; import prefetch from '../prefetch/index'; -import { Store, ScrollPosition } from '../types'; export default function start(opts: { - target: Node, - store?: (data: any) => Store + target: Node }) { if ('scrollRestoration' in history) { history.scrollRestoration = 'manual'; } set_target(opts.target); - if (opts.store) set_store(opts.store); addEventListener('click', handle_click); addEventListener('popstate', handle_popstate); diff --git a/templates/src/client/types.ts b/templates/src/app/types.ts similarity index 100% rename from templates/src/client/types.ts rename to templates/src/app/types.ts diff --git a/templates/src/client/index.ts b/templates/src/client/index.ts deleted file mode 100644 index f171109..0000000 --- a/templates/src/client/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { default as start } from './start/index'; -export { default as goto } from './goto/index'; -export { default as prefetch } from './prefetch/index'; -export { default as prefetchRoutes } from './prefetchRoutes/index'; \ No newline at end of file diff --git a/templates/src/server/middleware/get_page_handler.ts b/templates/src/server/middleware/get_page_handler.ts index f156dde..aa7b5e3 100644 --- a/templates/src/server/middleware/get_page_handler.ts +++ b/templates/src/server/middleware/get_page_handler.ts @@ -4,12 +4,14 @@ import cookie from 'cookie'; import devalue from 'devalue'; import fetch from 'node-fetch'; import { URL, resolve } from 'url'; +import * as stores from '../../shared/stores'; import { build_dir, dev, src_dir, IGNORE } from '../placeholders'; -import { Manifest, Page, Props, Req, Res, Store } from './types'; +import { Manifest, Page, Props, Req, Res } from './types'; +import App from '@sapper/App.html'; export function get_page_handler( manifest: Manifest, - store_getter: (req: Req, res: Res) => Store + session_getter: (req: Req, res: Res) => any ) { const get_build_info = dev ? () => JSON.parse(fs.readFileSync(path.join(build_dir, 'build.json'), 'utf-8')) @@ -76,7 +78,7 @@ export function get_page_handler( res.setHeader('Link', link); } - const store = store_getter ? store_getter(req, res) : null; + const session = session_getter(req, res); let redirect: { statusCode: number, location: string }; let preload_error: { statusCode: number, message: Error | string }; @@ -127,8 +129,7 @@ export function get_page_handler( } return fetch(parsed.href, opts); - }, - store + } }; let preloaded; @@ -177,11 +178,6 @@ export function get_page_handler( return; } - const serialized = { - preloaded: `[${preloaded.map(data => try_serialize(data)).join(',')}]`, - store: store && try_serialize(store.get()) - }; - const segments = req.path.split('/').filter(Boolean); const props: Props = { @@ -223,15 +219,30 @@ export function get_page_handler( level = level.props.child; } - const { html, head, css } = manifest.root.render(data, { - store + stores.page.set({ + path: req.path, + query: req.query, + params: req.params }); + const { html, head, css } = App.render({ + Root: manifest.root, + props: data, + session + }); + + const serialized = { + preloaded: `[${preloaded.map(data => try_serialize(data)).join(',')}]`, + session: session && try_serialize(session, err => { + throw new Error(`Failed to serialize session data: ${err.message}`); + }) + }; + let script = `__SAPPER__={${[ error && `error:1`, `baseUrl:"${req.baseUrl}"`, serialized.preloaded && `preloaded:${serialized.preloaded}`, - serialized.store && `store:${serialized.store}` + serialized.session && `session:${serialized.session}` ].filter(Boolean).join(',')}};`; if (has_service_worker) { @@ -320,10 +331,11 @@ function read_template(dir = build_dir) { return fs.readFileSync(`${dir}/template.html`, 'utf-8'); } -function try_serialize(data: any) { +function try_serialize(data: any, fail?: (err) => void) { try { return devalue(data); } catch (err) { + if (fail) fail(err); return null; } } diff --git a/templates/src/server/middleware/index.ts b/templates/src/server/middleware/index.ts index f06942c..ae6dcb7 100644 --- a/templates/src/server/middleware/index.ts +++ b/templates/src/server/middleware/index.ts @@ -7,10 +7,10 @@ import { get_page_handler } from './get_page_handler'; import { lookup } from './mime'; export default function middleware(opts: { - store?: (req: Req, res: Res) => Store, + session?: (req: Req, res: Res) => any, ignore?: any } = {}) { - const { store, ignore } = opts; + const { session, ignore } = opts; let emitted_basepath = false; @@ -73,7 +73,7 @@ export default function middleware(opts: { get_server_route_handler(manifest.server_routes), - get_page_handler(manifest, store) + get_page_handler(manifest, session || noop) ].filter(Boolean)); } @@ -140,4 +140,6 @@ export function serve({ prefix, pathname, cache_control }: { next(); } }; -} \ No newline at end of file +} + +function noop(){} \ No newline at end of file diff --git a/templates/src/shared/stores.ts b/templates/src/shared/stores.ts new file mode 100644 index 0000000..f66a43b --- /dev/null +++ b/templates/src/shared/stores.ts @@ -0,0 +1,4 @@ +import { writable } from 'svelte/store'; + +export const preloading = writable(null); +export const page = writable(null); \ No newline at end of file diff --git a/test/apps/basics/src/client.js b/test/apps/basics/src/client.js index 5fd4ce8..6cce7e6 100644 --- a/test/apps/basics/src/client.js +++ b/test/apps/basics/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '@sapper/client'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/credentials/src/client.js b/test/apps/credentials/src/client.js index 5fd4ce8..6cce7e6 100644 --- a/test/apps/credentials/src/client.js +++ b/test/apps/credentials/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '@sapper/client'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/css/src/client.js b/test/apps/css/src/client.js index 5fd4ce8..6cce7e6 100644 --- a/test/apps/css/src/client.js +++ b/test/apps/css/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '@sapper/client'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/encoding/src/client.js b/test/apps/encoding/src/client.js index 5fd4ce8..6cce7e6 100644 --- a/test/apps/encoding/src/client.js +++ b/test/apps/encoding/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '@sapper/client'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/errors/src/client.js b/test/apps/errors/src/client.js index 5fd4ce8..6cce7e6 100644 --- a/test/apps/errors/src/client.js +++ b/test/apps/errors/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '@sapper/client'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/export/src/client.js b/test/apps/export/src/client.js index 5fd4ce8..6cce7e6 100644 --- a/test/apps/export/src/client.js +++ b/test/apps/export/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '@sapper/client'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/ignore/src/client.js b/test/apps/ignore/src/client.js index 5fd4ce8..6cce7e6 100644 --- a/test/apps/ignore/src/client.js +++ b/test/apps/ignore/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '@sapper/client'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/layout/src/client.js b/test/apps/layout/src/client.js index 5fd4ce8..6cce7e6 100644 --- a/test/apps/layout/src/client.js +++ b/test/apps/layout/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '@sapper/client'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/preloading/src/client.js b/test/apps/preloading/src/client.js index 5fd4ce8..6cce7e6 100644 --- a/test/apps/preloading/src/client.js +++ b/test/apps/preloading/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '@sapper/client'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/preloading/src/routes/_layout.html b/test/apps/preloading/src/routes/_layout.html index 30dc0e6..09606e2 100644 --- a/test/apps/preloading/src/routes/_layout.html +++ b/test/apps/preloading/src/routes/_layout.html @@ -7,12 +7,13 @@ -{#if preloading} +{#if $preloading} {/if} diff --git a/test/apps/redirects/src/client.js b/test/apps/redirects/src/client.js index 5fd4ce8..6cce7e6 100644 --- a/test/apps/redirects/src/client.js +++ b/test/apps/redirects/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '@sapper/client'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/scroll/src/client.js b/test/apps/scroll/src/client.js index 5fd4ce8..6cce7e6 100644 --- a/test/apps/scroll/src/client.js +++ b/test/apps/scroll/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '@sapper/client'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/store/src/client.js b/test/apps/store/src/client.js index 5fd4ce8..6cce7e6 100644 --- a/test/apps/store/src/client.js +++ b/test/apps/store/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '@sapper/client'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/store/src/routes/store.html b/test/apps/store/src/routes/store.html index c0b1309..fbd1f36 100644 --- a/test/apps/store/src/routes/store.html +++ b/test/apps/store/src/routes/store.html @@ -1,6 +1,6 @@

{$session.title}

\ No newline at end of file diff --git a/test/apps/with-basepath/src/client.js b/test/apps/with-basepath/src/client.js index 5fd4ce8..6cce7e6 100644 --- a/test/apps/with-basepath/src/client.js +++ b/test/apps/with-basepath/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '@sapper/client'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') From 3445ec66ac2dfd4ddbd4481c6b5b925e7df9fa1f Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Fri, 1 Feb 2019 09:28:24 -0500 Subject: [PATCH 16/38] figure out if component has preload early on --- package.json | 3 +++ src/core/create_manifest_data.ts | 26 ++++++++++++++++++++++---- src/interfaces.ts | 1 + 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 97c282b..c25be2d 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,9 @@ "webpack-format-messages": "^2.0.5", "yootils": "0.0.14" }, + "peerDependencies": { + "svelte": "^3.0.0" + }, "scripts": { "test": "mocha --opts mocha.opts", "pretest": "npm run build", diff --git a/src/core/create_manifest_data.ts b/src/core/create_manifest_data.ts index 9f47093..1d38442 100644 --- a/src/core/create_manifest_data.ts +++ b/src/core/create_manifest_data.ts @@ -1,5 +1,6 @@ import * as fs from 'fs'; import * as path from 'path'; +import svelte from 'svelte/compiler'; import { Page, PageComponent, ServerRoute, ManifestData } from '../interfaces'; import { posixify, reserved_words } from '../utils'; @@ -9,6 +10,19 @@ export default function create_manifest_data(cwd: string): ManifestData { throw new Error(`As of Sapper 0.21, the routes/ directory should become src/routes/`); } + function has_preload(file: string) { + const source = fs.readFileSync(path.join(cwd, file), 'utf-8'); + + if (/preload/.test(source)) { + try { + const { stats } = svelte.compile(source, { generate: false }); + return !!stats.vars.find((variable: any) => variable.module && variable.export_name === 'preload'); + } catch (err) {} + } + + return false; + } + const components: PageComponent[] = []; const pages: Page[] = []; const server_routes: ServerRoute[] = []; @@ -16,7 +30,8 @@ export default function create_manifest_data(cwd: string): ManifestData { const default_layout: PageComponent = { default: true, name: '_default_layout', - file: null + file: null, + has_preload: false }; function walk( @@ -107,7 +122,8 @@ export default function create_manifest_data(cwd: string): ManifestData { const component = fs.existsSync(index) && { name: `${get_slug(item.file)}__layout`, - file: `${item.file}/_layout.html` + file: `${item.file}/_layout.html`, + has_preload: has_preload(`${item.file}/_layout.html`) }; if (component) components.push(component); @@ -125,7 +141,8 @@ export default function create_manifest_data(cwd: string): ManifestData { else if (item.is_page) { const component = { name: get_slug(item.file), - file: item.file + file: item.file, + has_preload: has_preload(item.file) }; const parts = stack.concat({ @@ -162,7 +179,8 @@ export default function create_manifest_data(cwd: string): ManifestData { const root = fs.existsSync(root_file) ? { name: 'main', - file: '_layout.html' + file: '_layout.html', + has_preload: has_preload(root_file) } : default_layout; diff --git a/src/interfaces.ts b/src/interfaces.ts index f9eea04..50dc6ab 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -29,6 +29,7 @@ export type PageComponent = { default?: boolean; name: string; file: string; + has_preload: boolean; }; export type Page = { From 263bb08334c5fb4b48c07880c2cb31f9e2fb1365 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 1 Feb 2019 10:54:43 -0500 Subject: [PATCH 17/38] various --- mocha.opts | 3 +- package-lock.json | 94 ++++++++++++++++++- package.json | 2 + rollup.config.js | 25 ++--- src/core/create_manifest_data.ts | 7 +- src/types.d.ts | 1 + test/apps/AppRunner.ts | 2 +- test/apps/with-sourcemaps/src/client.js | 2 +- test/apps/with-sourcemaps/src/server.js | 2 +- .../with-sourcemaps/src/service-worker.js | 2 +- test/apps/with-sourcemaps/test.ts | 23 +---- 11 files changed, 120 insertions(+), 43 deletions(-) create mode 100644 src/types.d.ts diff --git a/mocha.opts b/mocha.opts index c769c5c..8985f66 100644 --- a/mocha.opts +++ b/mocha.opts @@ -1,5 +1,4 @@ --require source-map-support/register ---require ts-node/register +--require sucrase/register --recursive -test/unit/*/*.ts test/apps/*/test.ts \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6ee03a2..e5494a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -383,6 +383,12 @@ "color-convert": "^1.9.0" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -3528,6 +3534,12 @@ "type-check": "~0.3.2" } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -3748,7 +3760,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, @@ -3793,7 +3805,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -3821,7 +3833,7 @@ "dependencies": { "commander": { "version": "2.15.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, @@ -3897,6 +3909,17 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nan": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", @@ -4014,6 +4037,12 @@ } } }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -4405,6 +4434,15 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, + "pirates": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.0.tgz", + "integrity": "sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -5156,7 +5194,7 @@ }, "rollup-pluginutils": { "version": "1.5.2", - "resolved": "http://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", "dev": true, "requires": { @@ -5166,6 +5204,16 @@ } } }, + "rollup-plugin-sucrase": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-sucrase/-/rollup-plugin-sucrase-2.1.0.tgz", + "integrity": "sha512-chdA3OruR1FH/IIKrzZCpGKLXAx3DOHoK24RIPtlVccK0wbTpHE0HpGEQYCxte1XaB17NgRe/frFyKR7g45qxQ==", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.3.0", + "sucrase": "3.x" + } + }, "rollup-plugin-svelte": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-5.0.1.tgz", @@ -5745,6 +5793,26 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "sucrase": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.9.5.tgz", + "integrity": "sha512-gvNjd3PJ0WAXxWUAQzCw/nlG4J5a2j7q8jN+sX8Fwe3ryIsl9UrEcWPxWoEzBPrj3Fias4U05iN84m4/IFQLdw==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.0" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -5841,6 +5909,24 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", diff --git a/package.json b/package.json index c25be2d..6e9e6c8 100644 --- a/package.json +++ b/package.json @@ -54,11 +54,13 @@ "rollup-plugin-node-resolve": "^4.0.0", "rollup-plugin-replace": "^2.1.0", "rollup-plugin-string": "^2.0.2", + "rollup-plugin-sucrase": "^2.1.0", "rollup-plugin-svelte": "^5.0.1", "rollup-plugin-typescript": "^1.0.0", "sade": "^1.4.2", "sander": "^0.6.0", "sirv": "^0.2.2", + "sucrase": "^3.9.5", "svelte": "^3.0.0-alpha26", "svelte-loader": "^2.12.0", "ts-node": "^8.0.2", diff --git a/rollup.config.js b/rollup.config.js index dcd8df9..da922b8 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,4 +1,4 @@ -import typescript from 'rollup-plugin-typescript'; +import sucrase from 'rollup-plugin-sucrase'; import string from 'rollup-plugin-string'; import json from 'rollup-plugin-json'; import resolve from 'rollup-plugin-node-resolve'; @@ -12,7 +12,7 @@ const external = [].concat( 'sapper/core.js' ); -function template(kind, external, target) { +function template(kind, external) { return { input: `templates/src/${kind}/index.ts`, output: { @@ -22,22 +22,23 @@ function template(kind, external, target) { }, external, plugins: [ - resolve(), + resolve({ + extensions: ['.js', '.ts'] + }), commonjs(), string({ include: '**/*.md' }), - typescript({ - typescript: require('typescript'), - target + sucrase({ + transforms: ['typescript'] }) ] }; } export default [ - template('app', ['__ROOT__', '__ERROR__', 'svelte', '@sapper/App.html'], 'ES2017'), - template('server', builtinModules, 'ES2015'), + template('app', ['__ROOT__', '__ERROR__', 'svelte', '@sapper/App.html']), + template('server', builtinModules), { input: [ @@ -55,10 +56,12 @@ export default [ external, plugins: [ json(), - resolve(), + resolve({ + extensions: ['.js', '.ts'] + }), commonjs(), - typescript({ - typescript: require('typescript') + sucrase({ + transforms: ['typescript'] }) ] } diff --git a/src/core/create_manifest_data.ts b/src/core/create_manifest_data.ts index 1d38442..41336c4 100644 --- a/src/core/create_manifest_data.ts +++ b/src/core/create_manifest_data.ts @@ -15,7 +15,10 @@ export default function create_manifest_data(cwd: string): ManifestData { if (/preload/.test(source)) { try { - const { stats } = svelte.compile(source, { generate: false }); + const { stats } = svelte.compile(source, { + generate: false, + onwarn: () => {} + }); return !!stats.vars.find((variable: any) => variable.module && variable.export_name === 'preload'); } catch (err) {} } @@ -180,7 +183,7 @@ export default function create_manifest_data(cwd: string): ManifestData { ? { name: 'main', file: '_layout.html', - has_preload: has_preload(root_file) + has_preload: has_preload('_layout.html') } : default_layout; diff --git a/src/types.d.ts b/src/types.d.ts new file mode 100644 index 0000000..89c4418 --- /dev/null +++ b/src/types.d.ts @@ -0,0 +1 @@ +declare module 'svelte/compiler'; \ No newline at end of file diff --git a/test/apps/AppRunner.ts b/test/apps/AppRunner.ts index 4bfdcce..0a3d51b 100644 --- a/test/apps/AppRunner.ts +++ b/test/apps/AppRunner.ts @@ -1,5 +1,5 @@ import * as path from 'path'; -import * as puppeteer from 'puppeteer'; +import puppeteer from 'puppeteer'; import * as ports from 'port-authority'; import { fork, ChildProcess } from 'child_process'; diff --git a/test/apps/with-sourcemaps/src/client.js b/test/apps/with-sourcemaps/src/client.js index 0865a4a..6cce7e6 100644 --- a/test/apps/with-sourcemaps/src/client.js +++ b/test/apps/with-sourcemaps/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/with-sourcemaps/src/server.js b/test/apps/with-sourcemaps/src/server.js index 0e7741c..7f090b8 100644 --- a/test/apps/with-sourcemaps/src/server.js +++ b/test/apps/with-sourcemaps/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/with-sourcemaps/src/service-worker.js b/test/apps/with-sourcemaps/src/service-worker.js index 9d2ac9d..67da6f0 100644 --- a/test/apps/with-sourcemaps/src/service-worker.js +++ b/test/apps/with-sourcemaps/src/service-worker.js @@ -1,4 +1,4 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import { timestamp, files, shell, routes } from '@sapper/service-worker'; const ASSETS = `cache${timestamp}`; diff --git a/test/apps/with-sourcemaps/test.ts b/test/apps/with-sourcemaps/test.ts index 1b61c28..2d05958 100644 --- a/test/apps/with-sourcemaps/test.ts +++ b/test/apps/with-sourcemaps/test.ts @@ -1,34 +1,20 @@ -import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; import * as assert from "assert"; -import { AppRunner } from '../AppRunner'; import * as fs from 'fs'; import * as path from "path"; describe('with-sourcemaps', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; - let prefetchRoutes: () => Promise; - let prefetch: (href: string) => Promise; - let goto: (href: string) => Promise; - // hooks before(async () => { await build({ cwd: __dirname }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes, prefetch, goto } = await runner.start()); }); it('does not put sourcemap files in service worker shell', async () => { - const serviceWorker = await import(`${__dirname}/__sapper__/service-worker.js`); - const shell: string[] = serviceWorker.shell; + const service_worker_source = fs.readFileSync(`${__dirname}/src/node_modules/@sapper/service-worker.js`, 'utf-8'); + const shell_source = /shell = (\[[\s\S]+?\])/.exec(service_worker_source)[1]; + const shell = JSON.parse(shell_source); assert.equal(shell.filter(_ => _.endsWith('.map')).length, 0, 'sourcemap files are not cached in SW'); @@ -37,7 +23,4 @@ describe('with-sourcemaps', function() { const sourcemapFiles = fs.readdirSync(clientShellDir).filter(_ => _.endsWith('.map')); assert.ok(sourcemapFiles.length > 0, 'sourcemap files exist'); }); - - after(() => runner.end()); - }); \ No newline at end of file From 3bab780f88d4a03371fe4880678544b56c8eb87e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 1 Feb 2019 11:09:08 -0500 Subject: [PATCH 18/38] only import preload when appropriate --- src/core/create_manifests.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/core/create_manifests.ts b/src/core/create_manifests.ts index 2f28f17..79e37ea 100644 --- a/src/core/create_manifests.ts +++ b/src/core/create_manifests.ts @@ -175,13 +175,13 @@ function generate_server( manifest_data.server_routes.map(route => `import * as __${route.name} from ${stringify(posixify(`${path_to_routes}/${route.file}`))};`), manifest_data.components.map(component => - `import __${component.name}, * as __${component.name}_static from ${stringify(get_file(path_to_routes, component))};`), - `import root, * as root_static from ${stringify(get_file(path_to_routes, manifest_data.root))};`, + `import __${component.name}${component.has_preload ? `, { preload as __${component.name}_preload }` : ''} from ${stringify(get_file(path_to_routes, component))};`), + `import root${manifest_data.root.has_preload ? `, { preload as root_preload }` : ''} from ${stringify(get_file(path_to_routes, manifest_data.root))};`, `import error from ${stringify(posixify(`${path_to_routes}/_error.html`))};` ); let code = ` - ${imports.join('\n')} + ${imports.join('\n')}${manifest_data.root.has_preload ? '' : `\n\nconst root_preload = () => {};`} const d = decodeURIComponent; @@ -209,8 +209,8 @@ function generate_server( `name: "${part.component.name}"`, `file: ${stringify(part.component.file)}`, `component: __${part.component.name}`, - `preload: __${part.component.name}_static.preload` - ]; + part.component.has_preload && `preload: __${part.component.name}_preload` + ].filter(Boolean); if (part.params.length > 0) { const params = part.params.map((param, i) => `${param}: d(match[${i + 1}])`); @@ -224,8 +224,7 @@ function generate_server( ], root, - root_preload: root_static['pre' + 'load'], - + root_preload, error };`.replace(/^\t\t/gm, '').trim(); From 7ba1a0a9fa73c6b42abad08f45f74d71ec3b1584 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 1 Feb 2019 11:09:15 -0500 Subject: [PATCH 19/38] fix test --- test/apps/with-sourcemaps-webpack/test.ts | 27 +++++------------------ 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/test/apps/with-sourcemaps-webpack/test.ts b/test/apps/with-sourcemaps-webpack/test.ts index cb0a3ca..802fa05 100644 --- a/test/apps/with-sourcemaps-webpack/test.ts +++ b/test/apps/with-sourcemaps-webpack/test.ts @@ -1,34 +1,20 @@ -import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; import * as assert from "assert"; -import { AppRunner } from '../AppRunner'; -import * as fs from "fs"; +import * as fs from 'fs'; import * as path from "path"; -describe('with-sourcemaps-webpack', function() { +describe('with-sourcemaps', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; - let prefetchRoutes: () => Promise; - let prefetch: (href: string) => Promise; - let goto: (href: string) => Promise; - // hooks before(async () => { await build({ cwd: __dirname, bundler: 'webpack' }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes, prefetch, goto } = await runner.start()); }); it('does not put sourcemap files in service worker shell', async () => { - const serviceWorker = await import(`${__dirname}/__sapper__/service-worker.js`); - const shell: string[] = serviceWorker.shell; + const service_worker_source = fs.readFileSync(`${__dirname}/src/node_modules/@sapper/service-worker.js`, 'utf-8'); + const shell_source = /shell = (\[[\s\S]+?\])/.exec(service_worker_source)[1]; + const shell = JSON.parse(shell_source); assert.equal(shell.filter(_ => _.endsWith('.map')).length, 0, 'sourcemap files are not cached in SW'); @@ -37,7 +23,4 @@ describe('with-sourcemaps-webpack', function() { const sourcemapFiles = fs.readdirSync(clientShellDir).filter(_ => _.endsWith('.map')); assert.ok(sourcemapFiles.length > 0, 'sourcemap files exist'); }); - - after(() => runner.end()); - }); \ No newline at end of file From 548de702ac8e8b9e6c6fe1b0249d44b7da960e2f Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 1 Feb 2019 22:28:47 -0500 Subject: [PATCH 20/38] move all page info to app-level stores --- src/core/create_manifests.ts | 2 +- templates/internal.mjs | 7 + templates/layout.html | 1 + templates/src/app/app.ts | 147 +++++++----------- templates/src/app/index.ts | 3 +- templates/src/app/types.ts | 8 +- .../src/server/middleware/get_page_handler.ts | 54 +++---- templates/src/server/middleware/types.ts | 8 +- templates/src/shared/stores.ts | 4 - test/apps/basics/src/routes/[slug].html | 6 +- .../basics/src/routes/echo-query/index.html | 6 +- .../encoding/src/routes/echo/page/[slug].html | 4 +- test/apps/layout/src/client.js | 5 + test/apps/layout/src/routes/[x]/[y]/[z].html | 6 +- .../layout/src/routes/[x]/[y]/_layout.html | 6 +- test/apps/layout/test.ts | 16 +- .../src/routes/prefetch/[slug]/index.html | 6 +- 17 files changed, 135 insertions(+), 154 deletions(-) create mode 100644 templates/layout.html delete mode 100644 templates/src/shared/stores.ts diff --git a/src/core/create_manifests.ts b/src/core/create_manifests.ts index 79e37ea..da6f41d 100644 --- a/src/core/create_manifests.ts +++ b/src/core/create_manifests.ts @@ -5,7 +5,7 @@ import { Page, PageComponent, ManifestData } from '../interfaces'; const app = fs.readFileSync(path.resolve(__dirname, '../templates/App.html'), 'utf-8'); const internal = fs.readFileSync(path.resolve(__dirname, '../templates/internal.mjs'), 'utf-8'); -const layout = ``; +const layout = fs.readFileSync(path.resolve(__dirname, '../templates/layout.html'), 'utf-8'); export function create_main_manifests({ bundler, diff --git a/templates/internal.mjs b/templates/internal.mjs index 454d657..0eba064 100644 --- a/templates/internal.mjs +++ b/templates/internal.mjs @@ -1 +1,8 @@ +import { writable } from 'svelte/store'; + +export const stores = { + preloading: writable(null), + page: writable(null) +}; + export const CONTEXT_KEY = {}; \ No newline at end of file diff --git a/templates/layout.html b/templates/layout.html new file mode 100644 index 0000000..8c0dcbb --- /dev/null +++ b/templates/layout.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/app/app.ts b/templates/src/app/app.ts index d6c8e0a..832b46b 100644 --- a/templates/src/app/app.ts +++ b/templates/src/app/app.ts @@ -1,5 +1,5 @@ import App from '@sapper/App.html'; -import { preloading, page } from '../shared/stores'; +import { stores } from '@sapper/internal'; import Root, * as RootStatic from '__ROOT__'; import ErrorComponent from '__ERROR__'; import { @@ -10,7 +10,8 @@ import { ComponentLoader, ComponentConstructor, RootProps, - Page + Page, + PageData } from './types'; import goto from './goto'; @@ -25,20 +26,9 @@ let current_token: {}; let root_preload: Promise; let root_data: any; -const root_props: RootProps = { - path: null, - params: null, - query: null, - child: { - segment: null, - component: null, - props: {} - } -}; - export let prefetching: { href: string; - promise: Promise<{ redirect?: Redirect, data?: any, nullable_depth?: number, new_segments?: any }>; + promise: Promise<{ redirect?: Redirect, data?: any, new_segments?: any }>; } = null; export function set_prefetching(href, promise) { prefetching = { href, promise }; @@ -111,7 +101,7 @@ export function scroll_state() { }; } -export function navigate(target: Target, id: number, noscroll?: boolean, hash?: string): Promise { +export async function navigate(target: Target, id: number, noscroll?: boolean, hash?: string): Promise { let scroll: ScrollPosition; if (id) { // popstate or initial navigation @@ -129,7 +119,7 @@ export function navigate(target: Target, id: number, noscroll?: boolean, hash?: cid = id; if (root_component) { - preloading.set({ + stores.preloading.set({ // TODO path, params, query }); } @@ -141,38 +131,22 @@ export function navigate(target: Target, id: number, noscroll?: boolean, hash?: const token = current_token = {}; - return loaded.then(({ redirect, data, nullable_depth, new_segments }) => { - if (redirect) { - return goto(redirect.location, { replaceState: true }); - } - if (new_segments) { - segments = new_segments; - } - render(data, nullable_depth, scroll_history[id], noscroll, hash, token); - if (document.activeElement) document.activeElement.blur(); - }); + const { redirect, page, data, new_segments, results } = await loaded; + + if (redirect) return goto(redirect.location, { replaceState: true }); + if (new_segments) segments = new_segments; + + await render(results, data, page, scroll_history[id], noscroll, hash, token); + if (document.activeElement) document.activeElement.blur(); } -async function render(props: any, nullable_depth: number, scroll: ScrollPosition, noscroll: boolean, hash: string, token: {}) { +async function render(results: any[], props: any, page: PageData, scroll: ScrollPosition, noscroll: boolean, hash: string, token: {}) { if (current_token !== token) return; - preloading.set(null); + stores.page.set(page); + stores.preloading.set(null); if (root_component) { - // first, clear out highest-level root component - let level = props.child; - for (let i = 0; i < nullable_depth; i += 1) { - if (i === nullable_depth) break; - level = level.props.child; - } - - const { component } = level; - level.component = null; - root_component.props = props; - - // then render new stuff - // TODO do we need to call `flush` before doing this? - level.component = component; root_component.props = props; } else { // first load — remove SSR'd contents @@ -185,7 +159,7 @@ async function render(props: any, nullable_depth: number, scroll: ScrollPosition detach(end); } - Object.assign(props, root_data); + Object.assign(props, root_data); // TODO what is root_data, do we still need it? root_component = new App({ target, @@ -215,14 +189,16 @@ async function render(props: any, nullable_depth: number, scroll: ScrollPosition if (scroll) scrollTo(scroll.x, scroll.y); } - Object.assign(root_props, props); + previous_thingummy = results; ready = true; } +let previous_thingummy = []; + export function prepare_page(target: Target): Promise<{ redirect?: Redirect; data?: any; - nullable_depth?: number; + page: PageData }> { const { page, path, query } = target; const new_segments = path.split('/').filter(Boolean); @@ -240,9 +216,9 @@ export function prepare_page(target: Target): Promise<{ let redirect: Redirect = null; let error: { statusCode: number, message: Error | string } = null; + let page_data: PageData; const preload_context = { - store, fetch: (url: string, opts?: any) => fetch(url, opts), redirect: (statusCode: number, location: string) => { if (redirect && (redirect.statusCode !== statusCode || redirect.location !== location)) { @@ -267,11 +243,13 @@ export function prepare_page(target: Target): Promise<{ } return Promise.all(page.parts.map((part, i) => { - if (i < changed_from) return null; + const segment = new_segments[i]; + + if (i < changed_from || !part) return previous_thingummy[i]; if (!part) return null; return load_component(components[part.i]).then(({ default: Component, preload }) => { - const req = { + page_data = { path, query, params: part.params ? part.params(target.match) : {} @@ -280,7 +258,7 @@ export function prepare_page(target: Target): Promise<{ let preloaded; if (ready || !initial_data.preloaded[i + 1]) { preloaded = preload - ? preload.call(preload_context, req) + ? preload.call(preload_context, page_data) : {}; } else { preloaded = initial_data.preloaded[i + 1]; @@ -304,72 +282,55 @@ export function prepare_page(target: Target): Promise<{ } }).then(results => { if (redirect) { - return { redirect, new_segments }; + return { redirect, new_segments, page: null }; } - const get_params = page.parts[page.parts.length - 1].params || (() => ({})); - const params = get_params(target.match); + const deepest = page.parts[page.parts.length - 1]; + + const page_data = { + path, + query, + params: deepest.params ? deepest.params(target.match) : {} + }; if (error) { - const props = { - path, - query, - params, - error: typeof error.message === 'string' ? new Error(error.message) : error.message, - status: error.statusCode - }; - return { - nullable_depth: 0, new_segments, - data: Object.assign({}, props, { + page: page_data, + data: { child: { component: ErrorComponent, - props + props: { + error: typeof error.message === 'string' ? new Error(error.message) : error.message, + status: error.statusCode + } } - }) + } }; } - const props = { path, query, error: null, status: null }; - const data = { - path, - child: Object.assign({}, root_props.child, { + const props = { + child: { segment: new_segments[0] - }) + } }; - if (changed(query, root_props.query)) data.query = query; - if (changed(params, root_props.params)) data.params = params; - let level = data.child; - let nullable_depth = 0; + let level = props.child; for (let i = 0; i < page.parts.length; i += 1) { const part = page.parts[i]; if (!part) continue; - const get_params = part.params || (() => ({})); - - if (i < changed_from) { - level.props.path = path; - level.props.query = query; - level.props.child = Object.assign({}, level.props.child); - - nullable_depth += 1; - } else { - level.component = results[i].Component; - level.props = Object.assign({}, level.props, props, { - params: get_params(target.match), - }, results[i].preloaded); - - level.props.child = {}; - } + level.component = results[i].Component; + level.props = Object.assign({}, results[i].preloaded, { + child: {} + }); level = level.props.child; level.segment = new_segments[i + 1]; } - return { data, nullable_depth, new_segments }; + return { data: props, new_segments, page: page_data, results }; }); } @@ -402,8 +363,4 @@ export function load_component(component: ComponentLoader): Promise<{ function detach(node: Node) { node.parentNode.removeChild(node); -} - -function changed(a: Record, b: Record) { - return JSON.stringify(a) !== JSON.stringify(b); -} +} \ No newline at end of file diff --git a/templates/src/app/index.ts b/templates/src/app/index.ts index 5fbc232..46d3610 100644 --- a/templates/src/app/index.ts +++ b/templates/src/app/index.ts @@ -1,6 +1,5 @@ import { getContext } from 'svelte'; -import { CONTEXT_KEY } from '@sapper/internal'; -import * as stores from '../shared/stores'; +import { CONTEXT_KEY, stores } from '@sapper/internal'; export const preloading = { subscribe: stores.preloading.subscribe }; export const page = { subscribe: stores.page.subscribe }; diff --git a/templates/src/app/types.ts b/templates/src/app/types.ts index d3388c3..da3f7ad 100644 --- a/templates/src/app/types.ts +++ b/templates/src/app/types.ts @@ -65,4 +65,10 @@ export type Redirect = { export type Store = { get: () => any; -} \ No newline at end of file +} + +export type PageData = { + path: string; + params: Record; + query: Record; +}; \ No newline at end of file diff --git a/templates/src/server/middleware/get_page_handler.ts b/templates/src/server/middleware/get_page_handler.ts index a2ccc19..c695180 100644 --- a/templates/src/server/middleware/get_page_handler.ts +++ b/templates/src/server/middleware/get_page_handler.ts @@ -4,9 +4,9 @@ import cookie from 'cookie'; import devalue from 'devalue'; import fetch from 'node-fetch'; import URL from 'url'; -import * as stores from '../../shared/stores'; import { build_dir, dev, src_dir, IGNORE } from '../placeholders'; import { Manifest, Page, Props, Req, Res } from './types'; +import { stores } from '@sapper/internal'; import App from '@sapper/App.html'; export function get_page_handler( @@ -135,6 +135,7 @@ export function get_page_handler( let preloaded; let match; + let params; try { const root_preloaded = manifest.root_preload @@ -147,16 +148,20 @@ export function get_page_handler( match = error ? null : page.pattern.exec(req.path); + let toPreload = [root_preloaded]; if (!isSWIndexHtml) { toPreload = toPreload.concat(page.parts.map(part => { if (!part) return null; + // the deepest level is used below, to initialise the store + params = part.params ? part.params(match) : {}; + return part.preload ? part.preload.call(preload_context, { path: req.path, query: req.query, - params: part.params ? part.params(match) : {} + params }) : {}; })) @@ -186,60 +191,46 @@ export function get_page_handler( const segments = req.path.split('/').filter(Boolean); - const props: Props = { - path: req.path, - query: req.query, - params: {}, - child: null - }; - - if (error) { - props.error = error instanceof Error ? error : { message: error }; - props.status = status; - } - - const data = Object.assign({}, props, preloaded[0], { - params: {}, + const props = Object.assign({}, preloaded[0], { child: { - segment: segments[0] + segment: segments[0], + props: {} } }); - let level = data.child; - if (isSWIndexHtml) { - level.props = Object.assign({}, props, { - params: {} - }) - } else { + let level = props.child; + if (!isSWIndexHtml) { for (let i = 0; i < page.parts.length; i += 1) { const part = page.parts[i]; if (!part) continue; - const get_params = part.params || (() => ({})); - Object.assign(level, { component: part.component, - props: Object.assign({}, props, { - params: get_params(match) - }, preloaded[i + 1]) + props: Object.assign({}, preloaded[i + 1]) }); level.props.child = { - segment: segments[i + 1] + segment: segments[i + 1], + props: {} }; level = level.props.child; } } + if (error) { + props.child.props.error = error instanceof Error ? error : { message: error }; + props.child.props.status = status; + } + stores.page.set({ path: req.path, query: req.query, - params: req.params + params: params }); const { html, head, css } = App.render({ Root: manifest.root, - props: data, + props: props, session }); @@ -313,6 +304,7 @@ export function get_page_handler( res.statusCode = status; res.end(body); } catch(err) { + console.log(err); if (error) { // we encountered an error while rendering the error page — oops res.statusCode = 500; diff --git a/templates/src/server/middleware/types.ts b/templates/src/server/middleware/types.ts index 6d7597f..b76b75c 100644 --- a/templates/src/server/middleware/types.ts +++ b/templates/src/server/middleware/types.ts @@ -12,6 +12,7 @@ export type Page = { name: string; component: Component; params?: (match: RegExpMatchArray) => Record; + preload?: (data: any) => any | Promise; }> }; @@ -19,6 +20,7 @@ export type Manifest = { server_routes: ServerRoute[]; pages: Page[]; root: Component; + root_preload?: (data: any) => any | Promise; error: Component; } @@ -29,9 +31,6 @@ export type Store = { }; export type Props = { - path: string; - query: Record; - params: Record; error?: { message: string }; status?: number; child: { @@ -64,6 +63,5 @@ interface Component { head: string; css: { code: string, map: any }; html: string - }, - preload: (data: any) => any | Promise + } } \ No newline at end of file diff --git a/templates/src/shared/stores.ts b/templates/src/shared/stores.ts deleted file mode 100644 index f66a43b..0000000 --- a/templates/src/shared/stores.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { writable } from 'svelte/store'; - -export const preloading = writable(null); -export const page = writable(null); \ No newline at end of file diff --git a/test/apps/basics/src/routes/[slug].html b/test/apps/basics/src/routes/[slug].html index ade66de..e31f6d9 100644 --- a/test/apps/basics/src/routes/[slug].html +++ b/test/apps/basics/src/routes/[slug].html @@ -1 +1,5 @@ -

{params.slug.toUpperCase()}

\ No newline at end of file + + +

{$page.params.slug.toUpperCase()}

\ No newline at end of file diff --git a/test/apps/basics/src/routes/echo-query/index.html b/test/apps/basics/src/routes/echo-query/index.html index aa09b35..614bb4d 100644 --- a/test/apps/basics/src/routes/echo-query/index.html +++ b/test/apps/basics/src/routes/echo-query/index.html @@ -1 +1,5 @@ -

{JSON.stringify(query)}

\ No newline at end of file + + +

{JSON.stringify($page.query)}

\ No newline at end of file diff --git a/test/apps/encoding/src/routes/echo/page/[slug].html b/test/apps/encoding/src/routes/echo/page/[slug].html index deead40..e2c9491 100644 --- a/test/apps/encoding/src/routes/echo/page/[slug].html +++ b/test/apps/encoding/src/routes/echo/page/[slug].html @@ -7,8 +7,8 @@ -

{slug} {JSON.stringify(query)}

\ No newline at end of file +

{slug} {JSON.stringify($page.query)}

\ No newline at end of file diff --git a/test/apps/layout/src/client.js b/test/apps/layout/src/client.js index 6cce7e6..c492517 100644 --- a/test/apps/layout/src/client.js +++ b/test/apps/layout/src/client.js @@ -2,6 +2,11 @@ import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') +}).catch(err => { + console.error(`OH NO! ${err.message}`); + throw err; +}).then(() => { + console.log(`STARTED`); }); window.prefetchRoutes = () => sapper.prefetchRoutes(); diff --git a/test/apps/layout/src/routes/[x]/[y]/[z].html b/test/apps/layout/src/routes/[x]/[y]/[z].html index b51089c..38c5575 100644 --- a/test/apps/layout/src/routes/[x]/[y]/[z].html +++ b/test/apps/layout/src/routes/[x]/[y]/[z].html @@ -9,10 +9,10 @@ -z: {segment} {count} +z: {$page.params.z} {count} click me \ No newline at end of file diff --git a/test/apps/layout/src/routes/[x]/[y]/_layout.html b/test/apps/layout/src/routes/[x]/[y]/_layout.html index f60dd63..401f654 100644 --- a/test/apps/layout/src/routes/[x]/[y]/_layout.html +++ b/test/apps/layout/src/routes/[x]/[y]/_layout.html @@ -9,13 +9,13 @@ -y: {segment} {count} +y: {$page.params.y} {count} child segment: {child.segment} \ No newline at end of file diff --git a/test/apps/layout/test.ts b/test/apps/layout/test.ts index 36eda4e..c088432 100644 --- a/test/apps/layout/test.ts +++ b/test/apps/layout/test.ts @@ -26,10 +26,18 @@ describe('layout', function() { it('only recreates components when necessary', async () => { await page.goto(`${base}/foo/bar/baz`); - await start(); const text1 = String(await page.evaluate(() => document.querySelector('#sapper').textContent)); - assert.deepEqual(text1.split('\n').filter(Boolean), [ + assert.deepEqual(text1.split('\n').filter(Boolean).map(str => str.trim()), [ + 'y: bar 1', + 'z: baz 1', + 'click me', + 'child segment: baz' + ]); + + await start(); + const text2 = String(await page.evaluate(() => document.querySelector('#sapper').textContent)); + assert.deepEqual(text2.split('\n').filter(Boolean).map(str => str.trim()), [ 'y: bar 1', 'z: baz 1', 'click me', @@ -39,8 +47,8 @@ describe('layout', function() { await page.click('[href="foo/bar/qux"]'); await wait(50); - const text2 = String(await page.evaluate(() => document.querySelector('#sapper').textContent)); - assert.deepEqual(text2.split('\n').filter(Boolean), [ + const text3 = String(await page.evaluate(() => document.querySelector('#sapper').textContent)); + assert.deepEqual(text3.split('\n').filter(Boolean).map(str => str.trim()), [ 'y: bar 1', 'z: qux 2', 'click me', diff --git a/test/apps/preloading/src/routes/prefetch/[slug]/index.html b/test/apps/preloading/src/routes/prefetch/[slug]/index.html index d13188c..6eebc4c 100644 --- a/test/apps/preloading/src/routes/prefetch/[slug]/index.html +++ b/test/apps/preloading/src/routes/prefetch/[slug]/index.html @@ -1 +1,5 @@ -

{params.slug}

+ + +

{$page.params.slug}

From 0168d8b70c09b36926441d3a8a70a01e5944de8f Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 1 Feb 2019 22:37:39 -0500 Subject: [PATCH 21/38] tidy up --- templates/src/app/app.ts | 8 +++----- templates/src/app/types.ts | 7 ------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/templates/src/app/app.ts b/templates/src/app/app.ts index 832b46b..bb8ecd3 100644 --- a/templates/src/app/app.ts +++ b/templates/src/app/app.ts @@ -9,7 +9,6 @@ import { Redirect, ComponentLoader, ComponentConstructor, - RootProps, Page, PageData } from './types'; @@ -25,6 +24,7 @@ let segments: string[] = []; let current_token: {}; let root_preload: Promise; let root_data: any; +let current_branch = []; export let prefetching: { href: string; @@ -189,12 +189,10 @@ async function render(results: any[], props: any, page: PageData, scroll: Scroll if (scroll) scrollTo(scroll.x, scroll.y); } - previous_thingummy = results; + current_branch = results; ready = true; } -let previous_thingummy = []; - export function prepare_page(target: Target): Promise<{ redirect?: Redirect; data?: any; @@ -245,7 +243,7 @@ export function prepare_page(target: Target): Promise<{ return Promise.all(page.parts.map((part, i) => { const segment = new_segments[i]; - if (i < changed_from || !part) return previous_thingummy[i]; + if (i < changed_from || !part) return current_branch[i]; if (!part) return null; return load_component(components[part.i]).then(({ default: Component, preload }) => { diff --git a/templates/src/app/types.ts b/templates/src/app/types.ts index da3f7ad..04ade83 100644 --- a/templates/src/app/types.ts +++ b/templates/src/app/types.ts @@ -8,13 +8,6 @@ type Child = { component?: Component; }; -export type RootProps = { - path: string; - params: Record; - query: Record; - child: Child; -}; - export interface ComponentConstructor { new (options: { target: Node, props: any, store: Store, hydrate: boolean }): Component; preload: (props: { params: Params, query: Query }) => Promise; From 6e8ba295d47d6dc90915fb2cca92a576b2cdd9f8 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Fri, 1 Feb 2019 23:50:21 -0500 Subject: [PATCH 22/38] bump svelte version --- package-lock.json | 34 +++++++++++++++++----------------- package.json | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index e5494a9..a63479e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -961,7 +961,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -998,7 +998,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -1032,7 +1032,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -1484,7 +1484,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -1497,7 +1497,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -1660,7 +1660,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -3542,7 +3542,7 @@ }, "load-json-file": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { @@ -3760,7 +3760,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, @@ -3805,7 +3805,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -3833,7 +3833,7 @@ "dependencies": { "commander": { "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, @@ -4682,7 +4682,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -5194,7 +5194,7 @@ }, "rollup-pluginutils": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", + "resolved": "http://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", "dev": true, "requires": { @@ -5380,7 +5380,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -5823,9 +5823,9 @@ } }, "svelte": { - "version": "3.0.0-alpha26", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.0.0-alpha26.tgz", - "integrity": "sha512-8++B3/arwhWggcvBYZnGDd9xKsYchqw4Os2haA38v6BSIcSSY706puNK01+PAdVvLCUJH/R4U6T8uV/fhjwVVw==", + "version": "3.0.0-alpha27", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.0.0-alpha27.tgz", + "integrity": "sha512-ykVDgZWpFcCZo3QkciGkQuwLhPM0XmgcJzzz5/srOEf8hfgk+XSaZS9UB9JrQiT7horAU/kA06aYSLaScCxxKw==", "dev": true }, "svelte-dev-helper": { @@ -5929,7 +5929,7 @@ }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, diff --git a/package.json b/package.json index 6e9e6c8..157a264 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "sander": "^0.6.0", "sirv": "^0.2.2", "sucrase": "^3.9.5", - "svelte": "^3.0.0-alpha26", + "svelte": "^3.0.0-alpha27", "svelte-loader": "^2.12.0", "ts-node": "^8.0.2", "typescript": "^3.3.1", From 81bbfce44843a850d5b66a0e4d0f75db9557b1e2 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sat, 2 Feb 2019 00:15:01 -0500 Subject: [PATCH 23/38] tidy up --- templates/src/app/app.ts | 187 +++++++++++++++++---------------------- 1 file changed, 83 insertions(+), 104 deletions(-) diff --git a/templates/src/app/app.ts b/templates/src/app/app.ts index bb8ecd3..098b31e 100644 --- a/templates/src/app/app.ts +++ b/templates/src/app/app.ts @@ -20,7 +20,6 @@ export const pages: Page[] = __PAGES__; let ready = false; let root_component: Component; -let segments: string[] = []; let current_token: {}; let root_preload: Promise; let root_data: any; @@ -28,7 +27,7 @@ let current_branch = []; export let prefetching: { href: string; - promise: Promise<{ redirect?: Redirect, data?: any, new_segments?: any }>; + promise: Promise<{ redirect?: Redirect, data?: any }>; } = null; export function set_prefetching(href, promise) { prefetching = { href, promise }; @@ -131,16 +130,15 @@ export async function navigate(target: Target, id: number, noscroll?: boolean, h const token = current_token = {}; - const { redirect, page, data, new_segments, results } = await loaded; + const { redirect, page, data, branch } = await loaded; if (redirect) return goto(redirect.location, { replaceState: true }); - if (new_segments) segments = new_segments; - await render(results, data, page, scroll_history[id], noscroll, hash, token); + await render(branch, data, page, scroll_history[id], noscroll, hash, token); if (document.activeElement) document.activeElement.blur(); } -async function render(results: any[], props: any, page: PageData, scroll: ScrollPosition, noscroll: boolean, hash: string, token: {}) { +async function render(branch: any[], props: any, page: PageData, scroll: ScrollPosition, noscroll: boolean, hash: string, token: {}) { if (current_token !== token) return; stores.page.set(page); @@ -189,45 +187,20 @@ async function render(results: any[], props: any, page: PageData, scroll: Scroll if (scroll) scrollTo(scroll.x, scroll.y); } - current_branch = results; + current_branch = branch; ready = true; } -export function prepare_page(target: Target): Promise<{ +export async function prepare_page(target: Target): Promise<{ redirect?: Redirect; data?: any; page: PageData }> { const { page, path, query } = target; - const new_segments = path.split('/').filter(Boolean); - let changed_from = 0; - - while ( - segments[changed_from] && - new_segments[changed_from] && - segments[changed_from] === new_segments[changed_from] - ) changed_from += 1; - - if (changed_from === new_segments.length) { - changed_from -= 1; - } + const segments = path.split('/').filter(Boolean); let redirect: Redirect = null; let error: { statusCode: number, message: Error | string } = null; - let page_data: PageData; - - const preload_context = { - fetch: (url: string, opts?: any) => fetch(url, opts), - redirect: (statusCode: number, location: string) => { - if (redirect && (redirect.statusCode !== statusCode || redirect.location !== location)) { - throw new Error(`Conflicting redirects`); - } - redirect = { statusCode, location }; - }, - error: (statusCode: number, message: Error | string) => { - error = { statusCode, message }; - } - }; if (!root_preload) { const preload_fn = RootStatic['pre' + 'load']; // Rollup makes us jump through these hoops :( @@ -240,96 +213,102 @@ export function prepare_page(target: Target): Promise<{ : {}; } - return Promise.all(page.parts.map((part, i) => { - const segment = new_segments[i]; + let branch; - if (i < changed_from || !part) return current_branch[i]; - if (!part) return null; + try { + const preload_context = { + fetch: (url: string, opts?: any) => fetch(url, opts), + redirect: (statusCode: number, location: string) => { + if (redirect && (redirect.statusCode !== statusCode || redirect.location !== location)) { + throw new Error(`Conflicting redirects`); + } + redirect = { statusCode, location }; + }, + error: (statusCode: number, message: Error | string) => { + error = { statusCode, message }; + } + }; - return load_component(components[part.i]).then(({ default: Component, preload }) => { - page_data = { - path, - query, - params: part.params ? part.params(target.match) : {} - }; + branch = await Promise.all(page.parts.map(async (part, i) => { + if (!part) return null; + + const segment = segments[i]; + if (current_branch[i] && current_branch[i].segment === segment) return current_branch[i]; + + const { default: Component, preload } = await load_component(components[part.i]); let preloaded; if (ready || !initial_data.preloaded[i + 1]) { preloaded = preload - ? preload.call(preload_context, page_data) + ? await preload.call(preload_context, { + path, + query, + params: part.params ? part.params(target.match) : {} + }) : {}; } else { preloaded = initial_data.preloaded[i + 1]; } - return Promise.resolve(preloaded).then(preloaded => { - return { Component, preloaded }; - }); - }); - })).catch(err => { - error = { statusCode: 500, message: err }; - return []; - }).then(results => { - if (root_data) { - return results; - } else { - return Promise.resolve(root_preload).then(value => { - root_data = value; - return results; - }); - } - }).then(results => { - if (redirect) { - return { redirect, new_segments, page: null }; - } + return { Component, preloaded, segment }; + })); + } catch (e) { + error = { statusCode: 500, message: e }; + branch = []; + } - const deepest = page.parts[page.parts.length - 1]; + if (!root_data) root_data = await root_preload; - const page_data = { - path, - query, - params: deepest.params ? deepest.params(target.match) : {} - }; + if (redirect) { + return { redirect, page: null }; + } - if (error) { - return { - new_segments, - page: page_data, - data: { - child: { - component: ErrorComponent, - props: { - error: typeof error.message === 'string' ? new Error(error.message) : error.message, - status: error.statusCode - } + const deepest = page.parts[page.parts.length - 1]; + + const page_data = { + path, + query, + params: deepest.params ? deepest.params(target.match) : {} + }; + + if (error) { + return { + page: page_data, + data: { + child: { + component: ErrorComponent, + props: { + error: typeof error.message === 'string' ? new Error(error.message) : error.message, + status: error.statusCode } } - }; - } - - const props = { - child: { - segment: new_segments[0] - } + }, + branch }; + } - let level = props.child; - - for (let i = 0; i < page.parts.length; i += 1) { - const part = page.parts[i]; - if (!part) continue; - - level.component = results[i].Component; - level.props = Object.assign({}, results[i].preloaded, { - child: {} - }); - - level = level.props.child; - level.segment = new_segments[i + 1]; + const props = { + child: { + segment: segments[0] } + }; - return { data: props, new_segments, page: page_data, results }; - }); + let level = props.child; + + for (let i = 0; i < page.parts.length; i += 1) { + const part = page.parts[i]; + if (!part) continue; + + level.component = branch[i].Component; + level.props = Object.assign({}, branch[i].preloaded, { + child: {} + }); + + level = level.props.child; + level.segment = segments[i + 1]; + } + + return { data: props, page: page_data, branch }; } function load_css(chunk: string) { From 85c86b556202748df6004ab80fc65230cbc35f27 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sat, 2 Feb 2019 12:53:36 -0500 Subject: [PATCH 24/38] tidy up --- templates/src/app/app.ts | 115 +++++++++++----------- templates/src/app/goto/index.ts | 4 +- templates/src/app/prefetch/index.ts | 6 +- templates/src/app/prefetchRoutes/index.ts | 12 +-- templates/src/app/start/index.ts | 8 +- templates/src/app/types.ts | 11 ++- 6 files changed, 80 insertions(+), 76 deletions(-) diff --git a/templates/src/app/app.ts b/templates/src/app/app.ts index 098b31e..54250c1 100644 --- a/templates/src/app/app.ts +++ b/templates/src/app/app.ts @@ -9,14 +9,17 @@ import { Redirect, ComponentLoader, ComponentConstructor, - Page, - PageData + Route, + Page } from './types'; import goto from './goto'; +// injected at build time +declare const __IGNORE__, __COMPONENTS__, __PAGES__, __SAPPER__; + const ignore = __IGNORE__; export const components: ComponentLoader[] = __COMPONENTS__; -export const pages: Page[] = __PAGES__; +export const routes: Route[] = __PAGES__; let ready = false; let root_component: Component; @@ -64,19 +67,19 @@ export { _history as history }; export const scroll_history: Record = {}; -export function select_route(url: URL): Target { +export function select_target(url: URL): Target { if (url.origin !== location.origin) return null; if (!url.pathname.startsWith(initial_data.baseUrl)) return null; const path = url.pathname.slice(initial_data.baseUrl.length); - // avoid accidental clashes between server routes and pages + // avoid accidental clashes between server routes and page routes if (ignore.some(pattern => pattern.test(path))) return; - for (let i = 0; i < pages.length; i += 1) { - const page = pages[i]; + for (let i = 0; i < routes.length; i += 1) { + const route = routes[i]; - const match = page.pattern.exec(path); + const match = route.pattern.exec(path); if (match) { const query: Record = Object.create(null); if (url.search.length > 0) { @@ -84,11 +87,22 @@ export function select_route(url: URL): Target { let [, key, value] = /([^=]*)(?:=(.*))?/.exec(decodeURIComponent(searchParam)); value = (value || '').replace(/\+/g, ' '); if (typeof query[key] === 'string') query[key] = [query[key]]; - if (typeof query[key] === 'object') query[key].push(value); + if (typeof query[key] === 'object') (query[key] as string[]).push(value); else query[key] = value; }); } - return { url, path, page, match, query }; + + const part = route.parts[route.parts.length - 1]; + const params = part.params ? part.params(match) : {}; + + return { + href: url.href, + path, + route, + match, + query, + params + }; } } } @@ -122,23 +136,23 @@ export async function navigate(target: Target, id: number, noscroll?: boolean, h // TODO path, params, query }); } - const loaded = prefetching && prefetching.href === target.url.href ? + const loaded = prefetching && prefetching.href === target.href ? prefetching.promise : - prepare_page(target); + hydrate_target(target); prefetching = null; const token = current_token = {}; - const { redirect, page, data, branch } = await loaded; + const { redirect, page, props, branch } = await loaded; if (redirect) return goto(redirect.location, { replaceState: true }); - await render(branch, data, page, scroll_history[id], noscroll, hash, token); + await render(branch, props, page, scroll_history[id], noscroll, hash, token); if (document.activeElement) document.activeElement.blur(); } -async function render(branch: any[], props: any, page: PageData, scroll: ScrollPosition, noscroll: boolean, hash: string, token: {}) { +async function render(branch: any[], props: any, page: Page, scroll: ScrollPosition, noscroll: boolean, hash: string, token: {}) { if (current_token !== token) return; stores.page.set(page); @@ -191,17 +205,31 @@ async function render(branch: any[], props: any, page: PageData, scroll: ScrollP ready = true; } -export async function prepare_page(target: Target): Promise<{ +export async function hydrate_target(target: Target): Promise<{ redirect?: Redirect; - data?: any; - page: PageData + props?: any; + page?: Page; + branch?: Array<{ Component: ComponentConstructor, preload: (page) => Promise, segment: string }> }> { - const { page, path, query } = target; + const { route, path, query, params } = target; const segments = path.split('/').filter(Boolean); let redirect: Redirect = null; let error: { statusCode: number, message: Error | string } = null; + const preload_context = { + fetch: (url: string, opts?: any) => fetch(url, opts), + redirect: (statusCode: number, location: string) => { + if (redirect && (redirect.statusCode !== statusCode || redirect.location !== location)) { + throw new Error(`Conflicting redirects`); + } + redirect = { statusCode, location }; + }, + error: (statusCode: number, message: Error | string) => { + error = { statusCode, message }; + } + }; + if (!root_preload) { const preload_fn = RootStatic['pre' + 'load']; // Rollup makes us jump through these hoops :( root_preload = preload_fn @@ -216,20 +244,7 @@ export async function prepare_page(target: Target): Promise<{ let branch; try { - const preload_context = { - fetch: (url: string, opts?: any) => fetch(url, opts), - redirect: (statusCode: number, location: string) => { - if (redirect && (redirect.statusCode !== statusCode || redirect.location !== location)) { - throw new Error(`Conflicting redirects`); - } - redirect = { statusCode, location }; - }, - error: (statusCode: number, message: Error | string) => { - error = { statusCode, message }; - } - }; - - branch = await Promise.all(page.parts.map(async (part, i) => { + branch = await Promise.all(route.parts.map(async (part, i) => { if (!part) return null; const segment = segments[i]; @@ -259,22 +274,18 @@ export async function prepare_page(target: Target): Promise<{ if (!root_data) root_data = await root_preload; - if (redirect) { - return { redirect, page: null }; - } - - const deepest = page.parts[page.parts.length - 1]; + if (redirect) return { redirect }; const page_data = { path, query, - params: deepest.params ? deepest.params(target.match) : {} + params }; if (error) { return { page: page_data, - data: { + props: { child: { component: ErrorComponent, props: { @@ -287,28 +298,20 @@ export async function prepare_page(target: Target): Promise<{ }; } - const props = { - child: { - segment: segments[0] - } - }; - + const props = { child: {} }; let level = props.child; - for (let i = 0; i < page.parts.length; i += 1) { - const part = page.parts[i]; - if (!part) continue; + branch.forEach(node => { + if (!node) return; - level.component = branch[i].Component; - level.props = Object.assign({}, branch[i].preloaded, { - child: {} - }); + level.segment = node.segment; + level.component = node.Component; + level.props = Object.assign({}, node.preloaded, { child: {} }); level = level.props.child; - level.segment = segments[i + 1]; - } + }); - return { data: props, page: page_data, branch }; + return { props, page: page_data, branch }; } function load_css(chunk: string) { diff --git a/templates/src/app/goto/index.ts b/templates/src/app/goto/index.ts index 29757ed..0241b2c 100644 --- a/templates/src/app/goto/index.ts +++ b/templates/src/app/goto/index.ts @@ -1,7 +1,7 @@ -import { history, select_route, navigate, cid } from '../app'; +import { history, select_target, navigate, cid } from '../app'; export default function goto(href: string, opts = { replaceState: false }) { - const target = select_route(new URL(href, document.baseURI)); + const target = select_target(new URL(href, document.baseURI)); if (target) { history[opts.replaceState ? 'replaceState' : 'pushState']({ id: cid }, '', href); diff --git a/templates/src/app/prefetch/index.ts b/templates/src/app/prefetch/index.ts index cd22c63..d959ef3 100644 --- a/templates/src/app/prefetch/index.ts +++ b/templates/src/app/prefetch/index.ts @@ -1,12 +1,12 @@ -import { select_route, prefetching, set_prefetching, prepare_page } from '../app'; +import { select_target, prefetching, set_prefetching, hydrate_target } from '../app'; import { Target } from '../types'; export default function prefetch(href: string) { - const target: Target = select_route(new URL(href, document.baseURI)); + const target: Target = select_target(new URL(href, document.baseURI)); if (target) { if (!prefetching || href !== prefetching.href) { - set_prefetching(href, prepare_page(target)); + set_prefetching(href, hydrate_target(target)); } return prefetching.promise; diff --git a/templates/src/app/prefetchRoutes/index.ts b/templates/src/app/prefetchRoutes/index.ts index b3c2f3c..b062814 100644 --- a/templates/src/app/prefetchRoutes/index.ts +++ b/templates/src/app/prefetchRoutes/index.ts @@ -1,11 +1,11 @@ -import { components, pages, load_component } from "../app"; +import { components, routes, load_component } from "../app"; export default function prefetchRoutes(pathnames: string[]) { - return pages - .filter(route => { - if (!pathnames) return true; - return pathnames.some(pathname => route.pattern.test(pathname)); - }) + return routes + .filter(pathnames + ? route => pathnames.some(pathname => route.pattern.test(pathname)) + : () => true + ) .reduce((promise: Promise, route) => promise.then(() => { return Promise.all(route.parts.map(part => part && load_component(components[part.i]))); }), Promise.resolve()); diff --git a/templates/src/app/start/index.ts b/templates/src/app/start/index.ts index ab9d669..e371d83 100644 --- a/templates/src/app/start/index.ts +++ b/templates/src/app/start/index.ts @@ -5,7 +5,7 @@ import { navigate, scroll_history, scroll_state, - select_route, + select_target, set_target, uid, set_uid, @@ -35,7 +35,7 @@ export default function start(opts: { history.replaceState({ id: uid }, '', href); if (!initial_data.error) { - const target = select_route(new URL(location.href)); + const target = select_target(new URL(location.href)); if (target) return navigate(target, uid, false, hash); } }); @@ -92,7 +92,7 @@ function handle_click(event: MouseEvent) { // Don't handle hash changes if (url.pathname === location.pathname && url.search === location.search) return; - const target = select_route(url); + const target = select_target(url); if (target) { const noscroll = a.hasAttribute('sapper-noscroll'); navigate(target, null, noscroll, url.hash); @@ -115,7 +115,7 @@ function handle_popstate(event: PopStateEvent) { if (event.state) { const url = new URL(location.href); - const target = select_route(url); + const target = select_target(url); if (target) { navigate(target, event.state.id); } else { diff --git a/templates/src/app/types.ts b/templates/src/app/types.ts index 04ade83..52f89c8 100644 --- a/templates/src/app/types.ts +++ b/templates/src/app/types.ts @@ -23,7 +23,7 @@ export type ComponentLoader = { css: string[] }; -export type Page = { +export type Route = { pattern: RegExp; parts: Array<{ i: number; @@ -35,7 +35,7 @@ export type Manifest = { ignore: RegExp[]; root: ComponentConstructor; error: () => Promise<{ default: ComponentConstructor }>; - pages: Page[] + pages: Route[] }; export type ScrollPosition = { @@ -44,11 +44,12 @@ export type ScrollPosition = { }; export type Target = { - url: URL; + href: string; path: string; - page: Page; + route: Route; match: RegExpExecArray; query: Record; + params: Record; }; export type Redirect = { @@ -60,7 +61,7 @@ export type Store = { get: () => any; } -export type PageData = { +export type Page = { path: string; params: Record; query: Record; From b7fce99438eaf21df69ce8672d1ef0519bfa2aba Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sat, 2 Feb 2019 13:01:55 -0500 Subject: [PATCH 25/38] simplify --- src/core/create_manifests.ts | 1 + templates/internal.mjs | 4 +++- templates/src/app/app.ts | 27 ++++++++++----------------- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/core/create_manifests.ts b/src/core/create_manifests.ts index da6f41d..421b2f3 100644 --- a/src/core/create_manifests.ts +++ b/src/core/create_manifests.ts @@ -153,6 +153,7 @@ function generate_client( return `// This file is generated by Sapper — do not edit it!\n` + template .replace(/__ROOT__/g, stringify(get_file(path_to_routes, manifest_data.root), false)) + .replace(/__ROOT_PRELOAD__/g, manifest_data.root.has_preload ? stringify(get_file(path_to_routes, manifest_data.root), false) : './internal') .replace(/__ERROR__/g, stringify(posixify(`${path_to_routes}/_error.html`), false)) .replace(/__IGNORE__/g, `[${server_routes_to_ignore.map(route => route.pattern).join(', ')}]`) .replace(/__COMPONENTS__/g, components) diff --git a/templates/internal.mjs b/templates/internal.mjs index 0eba064..59fa2f2 100644 --- a/templates/internal.mjs +++ b/templates/internal.mjs @@ -5,4 +5,6 @@ export const stores = { page: writable(null) }; -export const CONTEXT_KEY = {}; \ No newline at end of file +export const CONTEXT_KEY = {}; + +export const preload = () => ({}); \ No newline at end of file diff --git a/templates/src/app/app.ts b/templates/src/app/app.ts index 54250c1..5105583 100644 --- a/templates/src/app/app.ts +++ b/templates/src/app/app.ts @@ -1,6 +1,7 @@ import App from '@sapper/App.html'; import { stores } from '@sapper/internal'; -import Root, * as RootStatic from '__ROOT__'; +import Root from '__ROOT__'; +import { preload as root_preload } from '__ROOT_PRELOAD__'; import ErrorComponent from '__ERROR__'; import { Target, @@ -24,8 +25,7 @@ export const routes: Route[] = __PAGES__; let ready = false; let root_component: Component; let current_token: {}; -let root_preload: Promise; -let root_data: any; +let root_preloaded: Promise; let current_branch = []; export let prefetching: { @@ -171,8 +171,6 @@ async function render(branch: any[], props: any, page: Page, scroll: ScrollPosit detach(end); } - Object.assign(props, root_data); // TODO what is root_data, do we still need it? - root_component = new App({ target, props: { @@ -230,15 +228,12 @@ export async function hydrate_target(target: Target): Promise<{ } }; - if (!root_preload) { - const preload_fn = RootStatic['pre' + 'load']; // Rollup makes us jump through these hoops :( - root_preload = preload_fn - ? initial_data.preloaded[0] || preload_fn.call(preload_context, { - path, - query, - params: {} - }) - : {}; + if (!root_preloaded) { + root_preloaded = initial_data.preloaded[0] || root_preload.call(preload_context, { + path, + query, + params: {} + }); } let branch; @@ -272,8 +267,6 @@ export async function hydrate_target(target: Target): Promise<{ branch = []; } - if (!root_data) root_data = await root_preload; - if (redirect) return { redirect }; const page_data = { @@ -298,7 +291,7 @@ export async function hydrate_target(target: Target): Promise<{ }; } - const props = { child: {} }; + const props = Object.assign({}, await root_preloaded, { child: {} }); let level = props.child; branch.forEach(node => { From 3521eff4f4bea3abf67abfac3c0a4c6ca50a7187 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sat, 2 Feb 2019 13:20:53 -0500 Subject: [PATCH 26/38] more tidying up --- templates/src/app/app.ts | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/templates/src/app/app.ts b/templates/src/app/app.ts index 5105583..b8001bd 100644 --- a/templates/src/app/app.ts +++ b/templates/src/app/app.ts @@ -115,7 +115,6 @@ export function scroll_state() { } export async function navigate(target: Target, id: number, noscroll?: boolean, hash?: string): Promise { - let scroll: ScrollPosition; if (id) { // popstate or initial navigation cid = id; @@ -143,18 +142,16 @@ export async function navigate(target: Target, id: number, noscroll?: boolean, h prefetching = null; const token = current_token = {}; - const { redirect, page, props, branch } = await loaded; + if (token !== current_token) return; // a secondary navigation happened while we were loading if (redirect) return goto(redirect.location, { replaceState: true }); - await render(branch, props, page, scroll_history[id], noscroll, hash, token); + await render(branch, props, page, scroll_history[id], noscroll, hash); if (document.activeElement) document.activeElement.blur(); } -async function render(branch: any[], props: any, page: Page, scroll: ScrollPosition, noscroll: boolean, hash: string, token: {}) { - if (current_token !== token) return; - +async function render(branch: any[], props: any, page: Page, scroll: ScrollPosition, noscroll: boolean, hash: string) { stores.page.set(page); stores.preloading.set(null); @@ -269,15 +266,12 @@ export async function hydrate_target(target: Target): Promise<{ if (redirect) return { redirect }; - const page_data = { - path, - query, - params - }; + const page = { path, query, params }; if (error) { + // TODO be nice if this was less of a special case return { - page: page_data, + page, props: { child: { component: ErrorComponent, @@ -304,7 +298,7 @@ export async function hydrate_target(target: Target): Promise<{ level = level.props.child; }); - return { props, page: page_data, branch }; + return { props, page, branch }; } function load_css(chunk: string) { From 7fefc59929f2abeb4fc320ce5b1a755592e49938 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sat, 2 Feb 2019 13:28:48 -0500 Subject: [PATCH 27/38] tidy up --- templates/internal.mjs | 2 +- templates/src/app/app.ts | 42 ++++++++++++++------------------------ templates/src/app/types.ts | 4 +--- 3 files changed, 17 insertions(+), 31 deletions(-) diff --git a/templates/internal.mjs b/templates/internal.mjs index 59fa2f2..534a6bf 100644 --- a/templates/internal.mjs +++ b/templates/internal.mjs @@ -1,7 +1,7 @@ import { writable } from 'svelte/store'; export const stores = { - preloading: writable(null), + preloading: writable(false), page: writable(null) }; diff --git a/templates/src/app/app.ts b/templates/src/app/app.ts index b8001bd..2ff55d0 100644 --- a/templates/src/app/app.ts +++ b/templates/src/app/app.ts @@ -95,14 +95,9 @@ export function select_target(url: URL): Target { const part = route.parts[route.parts.length - 1]; const params = part.params ? part.params(match) : {}; - return { - href: url.href, - path, - route, - match, - query, - params - }; + const page = { path, query, params }; + + return { href: url.href, route, match, page }; } } } @@ -130,11 +125,8 @@ export async function navigate(target: Target, id: number, noscroll?: boolean, h cid = id; - if (root_component) { - stores.preloading.set({ - // TODO path, params, query - }); - } + if (root_component) stores.preloading.set(true); + const loaded = prefetching && prefetching.href === target.href ? prefetching.promise : hydrate_target(target); @@ -142,18 +134,18 @@ export async function navigate(target: Target, id: number, noscroll?: boolean, h prefetching = null; const token = current_token = {}; - const { redirect, page, props, branch } = await loaded; + const { redirect, props, branch } = await loaded; if (token !== current_token) return; // a secondary navigation happened while we were loading if (redirect) return goto(redirect.location, { replaceState: true }); - await render(branch, props, page, scroll_history[id], noscroll, hash); + await render(branch, props, target.page, scroll_history[id], noscroll, hash); if (document.activeElement) document.activeElement.blur(); } async function render(branch: any[], props: any, page: Page, scroll: ScrollPosition, noscroll: boolean, hash: string) { stores.page.set(page); - stores.preloading.set(null); + stores.preloading.set(false); if (root_component) { root_component.props = props; @@ -203,11 +195,10 @@ async function render(branch: any[], props: any, page: Page, scroll: ScrollPosit export async function hydrate_target(target: Target): Promise<{ redirect?: Redirect; props?: any; - page?: Page; branch?: Array<{ Component: ComponentConstructor, preload: (page) => Promise, segment: string }> }> { - const { route, path, query, params } = target; - const segments = path.split('/').filter(Boolean); + const { route, page } = target; + const segments = page.path.split('/').filter(Boolean); let redirect: Redirect = null; let error: { statusCode: number, message: Error | string } = null; @@ -227,8 +218,8 @@ export async function hydrate_target(target: Target): Promise<{ if (!root_preloaded) { root_preloaded = initial_data.preloaded[0] || root_preload.call(preload_context, { - path, - query, + path: page.path, + query: page.query, params: {} }); } @@ -248,8 +239,8 @@ export async function hydrate_target(target: Target): Promise<{ if (ready || !initial_data.preloaded[i + 1]) { preloaded = preload ? await preload.call(preload_context, { - path, - query, + path: page.path, + query: page.query, params: part.params ? part.params(target.match) : {} }) : {}; @@ -266,12 +257,9 @@ export async function hydrate_target(target: Target): Promise<{ if (redirect) return { redirect }; - const page = { path, query, params }; - if (error) { // TODO be nice if this was less of a special case return { - page, props: { child: { component: ErrorComponent, @@ -298,7 +286,7 @@ export async function hydrate_target(target: Target): Promise<{ level = level.props.child; }); - return { props, page, branch }; + return { props, branch }; } function load_css(chunk: string) { diff --git a/templates/src/app/types.ts b/templates/src/app/types.ts index 52f89c8..e725ed4 100644 --- a/templates/src/app/types.ts +++ b/templates/src/app/types.ts @@ -45,11 +45,9 @@ export type ScrollPosition = { export type Target = { href: string; - path: string; route: Route; match: RegExpExecArray; - query: Record; - params: Record; + page: Page; }; export type Redirect = { From 11d3da3aed7cbb1a3c982025b35f744bbf2c105b Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sat, 2 Feb 2019 15:42:35 -0500 Subject: [PATCH 28/38] add session tests --- test/apps/layout/src/client.js | 5 ----- test/apps/{store => session}/rollup.config.js | 0 test/apps/{store => session}/src/client.js | 0 .../{store => session}/src/routes/_error.html | 0 .../{store => session}/src/routes/index.html | 0 test/apps/session/src/routes/preloaded.html | 18 ++++++++++++++++ test/apps/session/src/routes/session.html | 10 +++++++++ test/apps/{store => session}/src/server.js | 0 .../{store => session}/src/service-worker.js | 0 .../apps/{store => session}/src/template.html | 0 test/apps/{store => session}/test.ts | 21 ++++++++++++++++--- test/apps/store/src/routes/store.html | 6 ------ 12 files changed, 46 insertions(+), 14 deletions(-) rename test/apps/{store => session}/rollup.config.js (100%) rename test/apps/{store => session}/src/client.js (100%) rename test/apps/{store => session}/src/routes/_error.html (100%) rename test/apps/{store => session}/src/routes/index.html (100%) create mode 100644 test/apps/session/src/routes/preloaded.html create mode 100644 test/apps/session/src/routes/session.html rename test/apps/{store => session}/src/server.js (100%) rename test/apps/{store => session}/src/service-worker.js (100%) rename test/apps/{store => session}/src/template.html (100%) rename test/apps/{store => session}/test.ts (59%) delete mode 100644 test/apps/store/src/routes/store.html diff --git a/test/apps/layout/src/client.js b/test/apps/layout/src/client.js index c492517..6cce7e6 100644 --- a/test/apps/layout/src/client.js +++ b/test/apps/layout/src/client.js @@ -2,11 +2,6 @@ import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') -}).catch(err => { - console.error(`OH NO! ${err.message}`); - throw err; -}).then(() => { - console.log(`STARTED`); }); window.prefetchRoutes = () => sapper.prefetchRoutes(); diff --git a/test/apps/store/rollup.config.js b/test/apps/session/rollup.config.js similarity index 100% rename from test/apps/store/rollup.config.js rename to test/apps/session/rollup.config.js diff --git a/test/apps/store/src/client.js b/test/apps/session/src/client.js similarity index 100% rename from test/apps/store/src/client.js rename to test/apps/session/src/client.js diff --git a/test/apps/store/src/routes/_error.html b/test/apps/session/src/routes/_error.html similarity index 100% rename from test/apps/store/src/routes/_error.html rename to test/apps/session/src/routes/_error.html diff --git a/test/apps/store/src/routes/index.html b/test/apps/session/src/routes/index.html similarity index 100% rename from test/apps/store/src/routes/index.html rename to test/apps/session/src/routes/index.html diff --git a/test/apps/session/src/routes/preloaded.html b/test/apps/session/src/routes/preloaded.html new file mode 100644 index 0000000..6964d98 --- /dev/null +++ b/test/apps/session/src/routes/preloaded.html @@ -0,0 +1,18 @@ + + + + +

{title}

+ + \ No newline at end of file diff --git a/test/apps/session/src/routes/session.html b/test/apps/session/src/routes/session.html new file mode 100644 index 0000000..6501114 --- /dev/null +++ b/test/apps/session/src/routes/session.html @@ -0,0 +1,10 @@ + + +

{$session.title}

+ + \ No newline at end of file diff --git a/test/apps/store/src/server.js b/test/apps/session/src/server.js similarity index 100% rename from test/apps/store/src/server.js rename to test/apps/session/src/server.js diff --git a/test/apps/store/src/service-worker.js b/test/apps/session/src/service-worker.js similarity index 100% rename from test/apps/store/src/service-worker.js rename to test/apps/session/src/service-worker.js diff --git a/test/apps/store/src/template.html b/test/apps/session/src/template.html similarity index 100% rename from test/apps/store/src/template.html rename to test/apps/session/src/template.html diff --git a/test/apps/store/test.ts b/test/apps/session/test.ts similarity index 59% rename from test/apps/store/test.ts rename to test/apps/session/test.ts index b2e8cfa..3fd910f 100644 --- a/test/apps/store/test.ts +++ b/test/apps/session/test.ts @@ -3,7 +3,7 @@ import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; import { AppRunner } from '../AppRunner'; -describe('store', function() { +describe('session', function() { this.timeout(10000); let runner: AppRunner; @@ -24,12 +24,27 @@ describe('store', function() { after(() => runner.end()); - it('renders store props', async () => { - await page.goto(`${base}/store`); + it('renders session props', async () => { + await page.goto(`${base}/session`); assert.equal(await title(), 'hello world'); await start(); assert.equal(await title(), 'hello world'); + + await page.click('button'); + assert.equal(await title(), 'changed'); + }); + + it('preloads session props', async () => { + await page.goto(`${base}/preloaded`); + + assert.equal(await title(), 'hello world'); + + await start(); + assert.equal(await title(), 'hello world'); + + await page.click('button'); + assert.equal(await title(), 'changed'); }); }); \ No newline at end of file diff --git a/test/apps/store/src/routes/store.html b/test/apps/store/src/routes/store.html deleted file mode 100644 index fbd1f36..0000000 --- a/test/apps/store/src/routes/store.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

{$session.title}

\ No newline at end of file From 91ea0335ae996ce7905702f47beae0474fad052b Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sat, 2 Feb 2019 15:44:16 -0500 Subject: [PATCH 29/38] implement session/preload on server --- templates/App.html | 3 +-- templates/src/server/middleware/get_page_handler.ts | 5 +++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/App.html b/templates/App.html index 16bf42d..ed4e3c1 100644 --- a/templates/App.html +++ b/templates/App.html @@ -1,13 +1,12 @@ \ No newline at end of file diff --git a/templates/src/server/middleware/get_page_handler.ts b/templates/src/server/middleware/get_page_handler.ts index c695180..a60171d 100644 --- a/templates/src/server/middleware/get_page_handler.ts +++ b/templates/src/server/middleware/get_page_handler.ts @@ -1,3 +1,4 @@ +import { writable } from 'svelte/store.mjs'; import fs from 'fs'; import path from 'path'; import cookie from 'cookie'; @@ -162,7 +163,7 @@ export function get_page_handler( path: req.path, query: req.query, params - }) + }, session) : {}; })) } @@ -231,7 +232,7 @@ export function get_page_handler( const { html, head, css } = App.render({ Root: manifest.root, props: props, - session + session: writable(session) }); const serialized = { From c96450011826b27170e24146a1d602f6e130e6f7 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sat, 2 Feb 2019 16:13:07 -0500 Subject: [PATCH 30/38] implement session/preload on client --- templates/src/app/app.ts | 78 ++++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 27 deletions(-) diff --git a/templates/src/app/app.ts b/templates/src/app/app.ts index 2ff55d0..d65f222 100644 --- a/templates/src/app/app.ts +++ b/templates/src/app/app.ts @@ -3,6 +3,7 @@ import { stores } from '@sapper/internal'; import Root from '__ROOT__'; import { preload as root_preload } from '__ROOT_PRELOAD__'; import ErrorComponent from '__ERROR__'; +import { writable } from 'svelte/store.mjs'; import { Target, ScrollPosition, @@ -18,6 +19,8 @@ import goto from './goto'; // injected at build time declare const __IGNORE__, __COMPONENTS__, __PAGES__, __SAPPER__; +export const initial_data = typeof __SAPPER__ !== 'undefined' && __SAPPER__; + const ignore = __IGNORE__; export const components: ComponentLoader[] = __COMPONENTS__; export const routes: Route[] = __PAGES__; @@ -28,6 +31,26 @@ let current_token: {}; let root_preloaded: Promise; let current_branch = []; +const session = writable(initial_data && initial_data.session); + +let $session; +let session_dirty: boolean; + +session.subscribe(async value => { + $session = value; + + if (!ready) return; + session_dirty = true; + + const target = select_target(new URL(location.href)); + + const token = current_token = {}; + const { redirect, props, branch } = await hydrate_target(target); + if (token !== current_token) return; // a secondary navigation happened while we were loading + + await render(redirect, branch, props, target.page); +}); + export let prefetching: { href: string; promise: Promise<{ redirect?: Redirect, data?: any }>; @@ -56,8 +79,6 @@ export function set_cid(n) { cid = n; } -export const initial_data = typeof __SAPPER__ !== 'undefined' && __SAPPER__; - const _history = typeof history !== 'undefined' ? history : { pushState: (state: any, title: string, href: string) => {}, replaceState: (state: any, title: string, href: string) => {}, @@ -137,13 +158,32 @@ export async function navigate(target: Target, id: number, noscroll?: boolean, h const { redirect, props, branch } = await loaded; if (token !== current_token) return; // a secondary navigation happened while we were loading - if (redirect) return goto(redirect.location, { replaceState: true }); - - await render(branch, props, target.page, scroll_history[id], noscroll, hash); + await render(redirect, branch, props, target.page); if (document.activeElement) document.activeElement.blur(); + + if (!noscroll) { + let scroll = scroll_history[id]; + + if (hash) { + // scroll is an element id (from a hash), we need to compute y. + const deep_linked = document.querySelector(hash); + + if (deep_linked) { + scroll = { + x: 0, + y: deep_linked.getBoundingClientRect().top + }; + } + } + + scroll_history[cid] = scroll; + if (scroll) scrollTo(scroll.x, scroll.y); + } } -async function render(branch: any[], props: any, page: Page, scroll: ScrollPosition, noscroll: boolean, hash: string) { +async function render(redirect: Redirect, branch: any[], props: any, page: Page) { + if (redirect) return goto(redirect.location, { replaceState: true }); + stores.page.set(page); stores.preloading.set(false); @@ -165,31 +205,15 @@ async function render(branch: any[], props: any, page: Page, scroll: ScrollPosit props: { Root, props, - session: __SAPPER__.session + session }, hydrate: true }); } - if (!noscroll) { - if (hash) { - // scroll is an element id (from a hash), we need to compute y. - const deep_linked = document.querySelector(hash); - - if (deep_linked) { - scroll = { - x: 0, - y: deep_linked.getBoundingClientRect().top - }; - } - } - - scroll_history[cid] = scroll; - if (scroll) scrollTo(scroll.x, scroll.y); - } - current_branch = branch; ready = true; + session_dirty = false; } export async function hydrate_target(target: Target): Promise<{ @@ -221,7 +245,7 @@ export async function hydrate_target(target: Target): Promise<{ path: page.path, query: page.query, params: {} - }); + }, $session); } let branch; @@ -231,7 +255,7 @@ export async function hydrate_target(target: Target): Promise<{ if (!part) return null; const segment = segments[i]; - if (current_branch[i] && current_branch[i].segment === segment) return current_branch[i]; + if (!session_dirty && current_branch[i] && current_branch[i].segment === segment) return current_branch[i]; const { default: Component, preload } = await load_component(components[part.i]); @@ -242,7 +266,7 @@ export async function hydrate_target(target: Target): Promise<{ path: page.path, query: page.query, params: part.params ? part.params(target.match) : {} - }) + }, $session) : {}; } else { preloaded = initial_data.preloaded[i + 1]; From 66be631572079235e30fc40d75aa02e73f3230de Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sat, 2 Feb 2019 21:00:32 -0500 Subject: [PATCH 31/38] remove experimentalCodeSplitting --- test/apps/basics/rollup.config.js | 10 ++-------- test/apps/credentials/rollup.config.js | 10 ++-------- test/apps/css/rollup.config.js | 10 ++-------- test/apps/encoding/rollup.config.js | 10 ++-------- test/apps/errors/rollup.config.js | 10 ++-------- test/apps/export/rollup.config.js | 10 ++-------- test/apps/ignore/rollup.config.js | 10 ++-------- test/apps/layout/rollup.config.js | 10 ++-------- test/apps/preloading/rollup.config.js | 10 ++-------- test/apps/redirects/rollup.config.js | 10 ++-------- test/apps/scroll/rollup.config.js | 10 ++-------- test/apps/session/rollup.config.js | 10 ++-------- test/apps/with-basepath/rollup.config.js | 10 ++-------- test/apps/with-sourcemaps/rollup.config.js | 10 ++-------- 14 files changed, 28 insertions(+), 112 deletions(-) diff --git a/test/apps/basics/rollup.config.js b/test/apps/basics/rollup.config.js index 943b676..66d3e59 100644 --- a/test/apps/basics/rollup.config.js +++ b/test/apps/basics/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/credentials/rollup.config.js b/test/apps/credentials/rollup.config.js index 045746e..2047c21 100644 --- a/test/apps/credentials/rollup.config.js +++ b/test/apps/credentials/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka', 'cookie'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka', 'cookie'] }, serviceworker: { diff --git a/test/apps/css/rollup.config.js b/test/apps/css/rollup.config.js index 943b676..66d3e59 100644 --- a/test/apps/css/rollup.config.js +++ b/test/apps/css/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/encoding/rollup.config.js b/test/apps/encoding/rollup.config.js index 943b676..66d3e59 100644 --- a/test/apps/encoding/rollup.config.js +++ b/test/apps/encoding/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/errors/rollup.config.js b/test/apps/errors/rollup.config.js index 943b676..66d3e59 100644 --- a/test/apps/errors/rollup.config.js +++ b/test/apps/errors/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/export/rollup.config.js b/test/apps/export/rollup.config.js index 943b676..66d3e59 100644 --- a/test/apps/export/rollup.config.js +++ b/test/apps/export/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/ignore/rollup.config.js b/test/apps/ignore/rollup.config.js index 943b676..66d3e59 100644 --- a/test/apps/ignore/rollup.config.js +++ b/test/apps/ignore/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/layout/rollup.config.js b/test/apps/layout/rollup.config.js index 943b676..66d3e59 100644 --- a/test/apps/layout/rollup.config.js +++ b/test/apps/layout/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/preloading/rollup.config.js b/test/apps/preloading/rollup.config.js index 943b676..66d3e59 100644 --- a/test/apps/preloading/rollup.config.js +++ b/test/apps/preloading/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/redirects/rollup.config.js b/test/apps/redirects/rollup.config.js index 943b676..66d3e59 100644 --- a/test/apps/redirects/rollup.config.js +++ b/test/apps/redirects/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/scroll/rollup.config.js b/test/apps/scroll/rollup.config.js index 943b676..66d3e59 100644 --- a/test/apps/scroll/rollup.config.js +++ b/test/apps/scroll/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/session/rollup.config.js b/test/apps/session/rollup.config.js index 943b676..66d3e59 100644 --- a/test/apps/session/rollup.config.js +++ b/test/apps/session/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/with-basepath/rollup.config.js b/test/apps/with-basepath/rollup.config.js index 943b676..66d3e59 100644 --- a/test/apps/with-basepath/rollup.config.js +++ b/test/apps/with-basepath/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/with-sourcemaps/rollup.config.js b/test/apps/with-sourcemaps/rollup.config.js index c057e2e..c11f9a6 100644 --- a/test/apps/with-sourcemaps/rollup.config.js +++ b/test/apps/with-sourcemaps/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { From 3d7cfbbf3ded9c7b3d82c8231a158d27ec255ebb Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sun, 3 Feb 2019 00:14:53 -0500 Subject: [PATCH 32/38] tidy up --- .gitignore | 4 +- package.json | 6 +- rollup.config.js | 12 +- .../App.html => runtime/internal/Sapper.html | 2 +- {templates => runtime/internal}/layout.html | 0 .../internal/shared.mjs | 0 {templates => runtime}/src/app/app.ts | 18 +- {templates => runtime}/src/app/goto/index.ts | 0 {templates => runtime}/src/app/index.ts | 2 +- .../src/app/prefetch/index.ts | 0 .../src/app/prefetchRoutes/index.ts | 3 +- {templates => runtime}/src/app/start/index.ts | 0 {templates => runtime}/src/app/types.ts | 6 +- runtime/src/server/constants.js | 1 + {templates => runtime}/src/server/index.ts | 0 .../src/server/middleware/get_page_handler.ts | 9 +- .../middleware/get_server_route_handler.ts | 2 +- .../src/server/middleware/index.ts | 5 +- .../src/server/middleware/mime-types.md | 0 .../src/server/middleware/mime.ts | 0 .../src/server/middleware/types.ts | 6 +- src/api/build.ts | 2 + src/api/dev.ts | 2 + src/api/utils/copy_runtime.ts | 21 +++ src/core/create_manifests.ts | 154 +++++++++--------- templates/src/server/placeholders.ts | 11 -- 26 files changed, 131 insertions(+), 135 deletions(-) rename templates/App.html => runtime/internal/Sapper.html (79%) rename {templates => runtime/internal}/layout.html (100%) rename templates/internal.mjs => runtime/internal/shared.mjs (100%) rename {templates => runtime}/src/app/app.ts (94%) rename {templates => runtime}/src/app/goto/index.ts (100%) rename {templates => runtime}/src/app/index.ts (87%) rename {templates => runtime}/src/app/prefetch/index.ts (100%) rename {templates => runtime}/src/app/prefetchRoutes/index.ts (76%) rename {templates => runtime}/src/app/start/index.ts (100%) rename {templates => runtime}/src/app/types.ts (89%) create mode 100644 runtime/src/server/constants.js rename {templates => runtime}/src/server/index.ts (100%) rename {templates => runtime}/src/server/middleware/get_page_handler.ts (97%) rename {templates => runtime}/src/server/middleware/get_server_route_handler.ts (97%) rename {templates => runtime}/src/server/middleware/index.ts (95%) rename {templates => runtime}/src/server/middleware/mime-types.md (100%) rename {templates => runtime}/src/server/middleware/mime.ts (100%) rename {templates => runtime}/src/server/middleware/types.ts (93%) create mode 100644 src/api/utils/copy_runtime.ts delete mode 100644 templates/src/server/placeholders.ts diff --git a/.gitignore b/.gitignore index b2cc98d..910b5f3 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,5 @@ sapper runtime.js dist !rollup.config.js -templates/app.mjs -templates/server.mjs \ No newline at end of file +/runtime/app.mjs +/runtime/server.mjs \ No newline at end of file diff --git a/package.json b/package.json index 157a264..4fbd90b 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ "config", "sapper", "dist/*.js", - "templates/*.js", - "templates/*.html" + "runtime/*.js", + "runtime/*.html" ], "directories": { "test": "test" @@ -79,7 +79,7 @@ "prepare": "npm run build", "dev": "rollup -cw", "prepublishOnly": "npm test", - "update_mime_types": "curl http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types | grep -e \"^[^#]\" > templates/src/server/middleware/mime-types.md" + "update_mime_types": "curl http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types | grep -e \"^[^#]\" > runtime/src/server/middleware/mime-types.md" }, "repository": "https://github.com/sveltejs/sapper", "keywords": [ diff --git a/rollup.config.js b/rollup.config.js index da922b8..333082f 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -14,16 +14,16 @@ const external = [].concat( function template(kind, external) { return { - input: `templates/src/${kind}/index.ts`, + input: `runtime/src/${kind}/index.ts`, output: { - file: `templates/${kind}.mjs`, + file: `runtime/${kind}.mjs`, format: 'es', paths: id => id.replace('@sapper', '.') }, external, plugins: [ resolve({ - extensions: ['.js', '.ts'] + extensions: ['.mjs', '.js', '.ts'] }), commonjs(), string({ @@ -37,8 +37,8 @@ function template(kind, external) { } export default [ - template('app', ['__ROOT__', '__ERROR__', 'svelte', '@sapper/App.html']), - template('server', builtinModules), + template('app', id => /^(svelte\/?|@sapper\/)/.test(id)), + template('server', id => builtinModules.includes(id)), { input: [ @@ -57,7 +57,7 @@ export default [ plugins: [ json(), resolve({ - extensions: ['.js', '.ts'] + extensions: ['.mjs', '.js', '.ts'] }), commonjs(), sucrase({ diff --git a/templates/App.html b/runtime/internal/Sapper.html similarity index 79% rename from templates/App.html rename to runtime/internal/Sapper.html index ed4e3c1..2203d76 100644 --- a/templates/App.html +++ b/runtime/internal/Sapper.html @@ -1,6 +1,6 @@