From 4f6efbda790ee22a3be32ff7b112e85a27c0be3d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Sep 2018 12:54:50 -0400 Subject: [PATCH] node 6 support --- src/api/build.ts | 11 ++-- src/core/create_manifests.ts | 5 +- templates/src/client/app.ts | 57 ++++++++++++------- templates/src/client/goto/index.ts | 2 +- .../src/server/middleware/get_page_handler.ts | 1 + test/app/webpack.config.js | 1 + 6 files changed, 44 insertions(+), 33 deletions(-) diff --git a/src/api/build.ts b/src/api/build.ts index ec2e1d3..c9d93f4 100644 --- a/src/api/build.ts +++ b/src/api/build.ts @@ -3,19 +3,16 @@ import * as path from 'path'; import mkdirp from 'mkdirp'; import rimraf from 'rimraf'; import { EventEmitter } from 'events'; -import * as codec from 'sourcemap-codec'; -import hash from 'string-hash'; import minify_html from './utils/minify_html'; import { create_compilers, create_main_manifests, create_manifest_data, create_serviceworker_manifest } from '../core'; import * as events from './interfaces'; import { copy_shimport } from './utils/copy_shimport'; -import { Dirs, PageComponent } from '../interfaces'; -import { CompileResult } from '../core/create_compilers/interfaces'; +import { Dirs } from '../interfaces'; import read_template from '../core/read_template'; type Opts = { legacy: boolean; - bundler: string; + bundler: 'rollup' | 'webpack'; }; export function build(opts: Opts, dirs: Dirs) { @@ -58,7 +55,7 @@ async function execute(emitter: EventEmitter, opts: Opts, dirs: Dirs) { // create src/manifest/client.js and src/manifest/server.js create_main_manifests({ bundler: opts.bundler, manifest_data }); - const { client, server, serviceworker } = await create_compilers(opts.bundler, dirs); + const { client, server, serviceworker } = await create_compilers(opts.bundler); const client_result = await client.compile(); emitter.emit('build', { @@ -71,7 +68,7 @@ async function execute(emitter: EventEmitter, opts: Opts, dirs: Dirs) { if (opts.legacy) { process.env.SAPPER_LEGACY_BUILD = 'true'; - const { client } = await create_compilers(opts.bundler, dirs); + const { client } = await create_compilers(opts.bundler); const client_result = await client.compile(); diff --git a/src/core/create_manifests.ts b/src/core/create_manifests.ts index 3d315cd..9b58442 100644 --- a/src/core/create_manifests.ts +++ b/src/core/create_manifests.ts @@ -202,10 +202,7 @@ function generate_server( root, error - }; - - // this is included for legacy reasons - export const routes = {};`.replace(/^\t\t/gm, '').trim(); + };`.replace(/^\t\t/gm, '').trim(); return `// This file is generated by Sapper — do not edit it!\n` + template .replace('__BUILD__DIR__', JSON.stringify(locations.dest())) diff --git a/templates/src/client/app.ts b/templates/src/client/app.ts index 6763518..db1e644 100644 --- a/templates/src/client/app.ts +++ b/templates/src/client/app.ts @@ -93,7 +93,7 @@ export function scroll_state() { }; } -export async function navigate(target: Target, id: number): Promise { +export function navigate(target: Target, id: number): Promise { if (id) { // popstate or initial navigation cid = id; @@ -117,14 +117,15 @@ export async function navigate(target: Target, id: number): Promise { prefetching = null; const token = current_token = {}; - const { redirect, data, nullable_depth } = await loaded; - if (redirect) { - await goto(redirect.location, { replaceState: true }); - } else { + return loaded.then(({ redirect, data, nullable_depth }) => { + if (redirect) { + return goto(redirect.location, { replaceState: true }); + } + render(data, nullable_depth, scroll_history[id], token); if (document.activeElement) document.activeElement.blur(); - } + }); } function render(data: any, nullable_depth: number, scroll: ScrollPosition, token: {}) { @@ -216,29 +217,43 @@ export function prepare_page(target: Target): Promise<{ : {}; } - return Promise.all(page.parts.map(async (part, i) => { + return Promise.all(page.parts.map((part, i) => { if (i < changed_from) return null; if (!part) return null; - const Component = await load_component(part.component); + return load_component(part.component).then(Component => { + const req = { + path, + query, + params: part.params ? part.params(target.match) : {} + }; - const req = { - path, - query, - params: part.params ? part.params(target.match) : {} - }; + let preloaded; + if (ready || !initial_data.preloaded[i + 1]) { + preloaded = Component.preload + ? Component.preload.call(preload_context, req) + : {}; + } else { + preloaded = initial_data.preloaded[i + 1]; + } - const preloaded = ready || !initial_data.preloaded[i + 1] - ? Component.preload ? await Component.preload.call(preload_context, req) : {} - : initial_data.preloaded[i + 1]; - - return { Component, preloaded }; + return Promise.resolve(preloaded).then(preloaded => { + return { Component, preloaded }; + }); + }); })).catch(err => { error = { statusCode: 500, message: err }; return []; - }).then(async results => { - if (!root_data) root_data = await root_preload; - + }).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 }; } diff --git a/templates/src/client/goto/index.ts b/templates/src/client/goto/index.ts index 05e48fd..547c6e2 100644 --- a/templates/src/client/goto/index.ts +++ b/templates/src/client/goto/index.ts @@ -5,7 +5,7 @@ export default function goto(href: string, opts = { replaceState: false }) { let promise; if (target) { - promise = navigate(target, null); + promise = navigate(target, null).then(() => {}); if (history) history[opts.replaceState ? 'replaceState' : 'pushState']({ id: cid }, '', href); } else { window.location.href = href; diff --git a/templates/src/server/middleware/get_page_handler.ts b/templates/src/server/middleware/get_page_handler.ts index 6dff50b..654e4b8 100644 --- a/templates/src/server/middleware/get_page_handler.ts +++ b/templates/src/server/middleware/get_page_handler.ts @@ -3,6 +3,7 @@ import * as path from 'path'; import cookie from 'cookie'; import devalue from 'devalue'; import fetch from 'node-fetch'; +import { URL } from 'url'; import { build_dir, dev, src_dir, IGNORE } from '../placeholders'; import { Manifest, Page, Props, Req, Res, Store } from './types'; diff --git a/test/app/webpack.config.js b/test/app/webpack.config.js index 911475d..78d0c85 100644 --- a/test/app/webpack.config.js +++ b/test/app/webpack.config.js @@ -1,3 +1,4 @@ +const path = require('path'); const webpack = require('webpack'); const config = require('../../config/webpack.js'); const sapper_pkg = require('../../package.json');