From 8ec433581ad9f1776c22450be70d992ba8aab94f Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 11 Mar 2018 12:54:35 -0400 Subject: [PATCH] a few small tweaks --- middleware.js | 2 - src/cli/build.ts | 11 +++-- src/cli/dev.ts | 8 ++-- src/core.ts | 3 +- .../{create_app.ts => create_manifests.ts} | 43 +++++++++++-------- src/core/create_serviceworker.ts | 26 ----------- src/core/utils.ts | 17 +++++--- src/middleware.ts | 2 +- test/app/app/server.js | 2 +- 9 files changed, 48 insertions(+), 66 deletions(-) delete mode 100644 middleware.js rename src/core/{create_app.ts => create_manifests.ts} (71%) delete mode 100644 src/core/create_serviceworker.ts diff --git a/middleware.js b/middleware.js deleted file mode 100644 index 3a6a561..0000000 --- a/middleware.js +++ /dev/null @@ -1,2 +0,0 @@ -// TODO write to this file, instead of middleware.ts.js -module.exports = require('./dist/middleware.ts.js'); \ No newline at end of file diff --git a/src/cli/build.ts b/src/cli/build.ts index c599594..b9a8f08 100644 --- a/src/cli/build.ts +++ b/src/cli/build.ts @@ -3,8 +3,8 @@ import * as path from 'path'; import * as clorox from 'clorox'; import mkdirp from 'mkdirp'; import rimraf from 'rimraf'; -import { create_compilers, create_app, create_routes, create_serviceworker } from '../core' -import { src, dest, dev } from '../config'; +import { create_compilers, create_main_manifests, create_routes, create_serviceworker_manifest } from '../core' +import { dest } from '../config'; export async function build() { const output = dest(); @@ -15,7 +15,7 @@ export async function build() { const routes = create_routes(); // create app/manifest/client.js and app/manifest/server.js - create_app({ routes, src, dev }); + create_main_manifests({ routes }); const { client, server, serviceworker } = create_compilers(); @@ -31,10 +31,9 @@ export async function build() { let serviceworker_stats; if (serviceworker) { - create_serviceworker({ + create_serviceworker_manifest({ routes, - client_files: client_stats.toJson().assets.map((chunk: { name: string }) => `/client/${chunk.name}`), - src + client_files: client_stats.toJson().assets.map((chunk: { name: string }) => `/client/${chunk.name}`) }); serviceworker_stats = await compile(serviceworker); diff --git a/src/cli/dev.ts b/src/cli/dev.ts index 99f9a9f..f936f38 100644 --- a/src/cli/dev.ts +++ b/src/cli/dev.ts @@ -10,7 +10,7 @@ import format_messages from 'webpack-format-messages'; import prettyMs from 'pretty-ms'; import * as ports from 'port-authority'; import { dest } from '../config'; -import { create_compilers, create_app, create_routes, create_serviceworker } from '../core'; +import { create_compilers, create_main_manifests, create_routes, create_serviceworker_manifest } from '../core'; type Deferred = { promise?: Promise; @@ -91,13 +91,13 @@ export async function dev(opts: { port: number }) { const dev_port = await ports.find(10000); const routes = create_routes(); - create_app({ routes, dev_port }); + create_main_manifests({ routes, dev_port }); const hot_update_server = create_hot_update_server(dev_port); watch_files('routes/**/*', ['add', 'unlink'], () => { const routes = create_routes(); - create_app({ routes, dev_port }); + create_main_manifests({ routes, dev_port }); }); watch_files('app/template.html', ['change'], () => { @@ -265,7 +265,7 @@ export async function dev(opts: { port: number }) { }); }); - create_serviceworker({ + create_serviceworker_manifest({ routes: create_routes(), client_files }); diff --git a/src/core.ts b/src/core.ts index d6c2400..c88a89d 100644 --- a/src/core.ts +++ b/src/core.ts @@ -1,4 +1,3 @@ -export { default as create_app } from './core/create_app'; -export { default as create_serviceworker } from './core/create_serviceworker'; +export * from './core/create_manifests'; export { default as create_compilers } from './core/create_compilers'; export { default as create_routes } from './core/create_routes'; \ No newline at end of file diff --git a/src/core/create_app.ts b/src/core/create_manifests.ts similarity index 71% rename from src/core/create_app.ts rename to src/core/create_manifests.ts index cd05eb5..1fdc57a 100644 --- a/src/core/create_app.ts +++ b/src/core/create_manifests.ts @@ -1,33 +1,40 @@ import * as fs from 'fs'; import * as path from 'path'; -import mkdirp from 'mkdirp'; +import * as glob from 'glob'; import create_routes from './create_routes'; -import { fudge_mtime, posixify, write } from './utils'; +import { posixify, write_if_changed } from './utils'; import { dev } from '../config'; import { Route } from '../interfaces'; -// in dev mode, we avoid touching the fs unnecessarily -let last_client_manifest: string = null; -let last_server_manifest: string = null; - -export default function create_app({ routes, dev_port }: { +export function create_main_manifests({ routes, dev_port }: { routes: Route[]; - dev_port: number; + dev_port?: number; }) { - mkdirp.sync('app/manifest'); - const client_manifest = generate_client(routes, dev_port); const server_manifest = generate_server(routes); - if (client_manifest !== last_client_manifest) { - write(`app/manifest/client.js`, client_manifest); - last_client_manifest = client_manifest; - } + write_if_changed(`app/manifest/client.js`, client_manifest); + write_if_changed(`app/manifest/server.js`, server_manifest); +} - if (server_manifest !== last_server_manifest) { - write(`app/manifest/server.js`, server_manifest); - last_server_manifest = server_manifest; - } +export function create_serviceworker_manifest({ routes, client_files }: { + routes: Route[]; + client_files: string[]; +}) { + const assets = glob.sync('**', { cwd: 'assets', nodir: true }); + + let code = ` + // This file is generated by Sapper — do not edit it! + export const timestamp = ${Date.now()}; + + export const assets = [\n\t${assets.map((x: string) => `"${x}"`).join(',\n\t')}\n]; + + export const shell = [\n\t${client_files.map((x: string) => `"${x}"`).join(',\n\t')}\n]; + + export const routes = [\n\t${routes.filter((r: Route) => r.type === 'page' && !/^_[45]xx$/.test(r.id)).map((r: Route) => `{ pattern: ${r.pattern} }`).join(',\n\t')}\n]; + `.replace(/^\t\t/gm, '').trim(); + + write_if_changed('app/manifest/service-worker.js', code); } function generate_client(routes: Route[], dev_port?: number) { diff --git a/src/core/create_serviceworker.ts b/src/core/create_serviceworker.ts deleted file mode 100644 index 6aeb5c8..0000000 --- a/src/core/create_serviceworker.ts +++ /dev/null @@ -1,26 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import glob from 'glob'; -import create_routes from './create_routes'; -import { fudge_mtime, posixify, write } from './utils'; -import { Route } from '../interfaces'; - -export default function create_serviceworker({ routes, client_files }: { - routes: Route[]; - client_files: string[]; -}) { - const assets = glob.sync('**', { cwd: 'assets', nodir: true }); - - let code = ` - // This file is generated by Sapper — do not edit it! - export const timestamp = ${Date.now()}; - - export const assets = [\n\t${assets.map((x: string) => `"${x}"`).join(',\n\t')}\n]; - - export const shell = [\n\t${client_files.map((x: string) => `"${x}"`).join(',\n\t')}\n]; - - export const routes = [\n\t${routes.filter((r: Route) => r.type === 'page' && !/^_[45]xx$/.test(r.id)).map((r: Route) => `{ pattern: ${r.pattern} }`).join(',\n\t')}\n]; - `.replace(/^\t\t/gm, '').trim(); - - write('app/manifest/service-worker.js', code); -} \ No newline at end of file diff --git a/src/core/utils.ts b/src/core/utils.ts index fdf5386..ef80d28 100644 --- a/src/core/utils.ts +++ b/src/core/utils.ts @@ -1,8 +1,13 @@ -import * as fs from 'fs'; +import * as sander from 'sander'; -export function write(file: string, code: string) { - fs.writeFileSync(file, code); - fudge_mtime(file); +const previous_contents = new Map(); + +export function write_if_changed(file: string, code: string) { + if (code !== previous_contents.get(file)) { + previous_contents.set(file, code); + sander.writeFileSync(file, code); + fudge_mtime(file); + } } export function posixify(file: string) { @@ -11,8 +16,8 @@ export function posixify(file: string) { export function fudge_mtime(file: string) { // need to fudge the mtime so that webpack doesn't go doolally - const { atime, mtime } = fs.statSync(file); - fs.utimesSync( + const { atime, mtime } = sander.statSync(file); + sander.utimesSync( file, new Date(atime.getTime() - 999999), new Date(mtime.getTime() - 999999) diff --git a/src/middleware.ts b/src/middleware.ts index 6aa9e5e..d913624 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -5,7 +5,7 @@ import mkdirp from 'mkdirp'; import rimraf from 'rimraf'; import devalue from 'devalue'; import { lookup } from './middleware/mime'; -import { create_routes, templates, create_compilers } from './core/index'; +import { create_routes, create_compilers } from './core'; import { dest, dev } from './config'; import { Route, Template } from './interfaces'; import sourceMapSupport from 'source-map-support'; diff --git a/test/app/app/server.js b/test/app/app/server.js index 0e6d0e6..3d9e7db 100644 --- a/test/app/app/server.js +++ b/test/app/app/server.js @@ -2,7 +2,7 @@ import fs from 'fs'; import polka from 'polka'; import compression from 'compression'; import serve from 'serve-static'; -import sapper from '../../../middleware'; +import sapper from '../../../dist/middleware.ts.js'; import { routes } from './manifest/server.js'; let pending;