From cddd7adaad096dffba493bae646c90467842a77e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 10 Mar 2018 23:00:36 -0500 Subject: [PATCH] lazy-load stuff --- .gitignore | 2 + chunk1.js | 12 ------ chunk1.js.map | 1 - cli.ts.js.map | 1 - core.ts.js.map | 1 - middleware.ts.js.map | 1 - package.json | 2 +- src/cli.ts | 96 +++++++++++++------------------------------- src/cli/build.ts | 2 +- src/cli/dev.ts | 13 +++++- src/cli/export.ts | 2 +- src/cli/start.ts | 35 ++++++++++++++++ webpack.ts.js.map | 1 - 13 files changed, 81 insertions(+), 88 deletions(-) delete mode 100644 chunk1.js delete mode 100644 chunk1.js.map delete mode 100644 cli.ts.js.map delete mode 100644 core.ts.js.map delete mode 100644 middleware.ts.js.map create mode 100644 src/cli/start.ts delete mode 100644 webpack.ts.js.map diff --git a/.gitignore b/.gitignore index 87d5ec9..57aee3f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,8 @@ test/app/.sapper test/app/app/manifest test/app/export test/app/build +*.js +*.js.map *.ts.js *.ts.js.map !rollup.config.js \ No newline at end of file diff --git a/chunk1.js b/chunk1.js deleted file mode 100644 index cc695a8..0000000 --- a/chunk1.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -var path = require('path'); - -var dev = function () { return process.env.NODE_ENV !== 'production'; }; -var src = function () { return path.resolve(process.env.SAPPER_ROUTES || 'routes'); }; -var dest = function () { return path.resolve(process.env.SAPPER_DEST || '.sapper'); }; - -exports.dev = dev; -exports.src = src; -exports.dest = dest; -//# sourceMappingURL=./chunk1.js.map diff --git a/chunk1.js.map b/chunk1.js.map deleted file mode 100644 index 19e3ccb..0000000 --- a/chunk1.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"chunk1.js","sources":["src/config.ts"],"sourcesContent":["import * as path from 'path';\n\nexport const dev = () => process.env.NODE_ENV !== 'production';\nexport const src = () => path.resolve(process.env.SAPPER_ROUTES || 'routes');\nexport const dest = () => path.resolve(process.env.SAPPER_DEST || '.sapper');\n"],"names":["path.resolve"],"mappings":";;;;IAEa,GAAG,GAAG,cAAM,OAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,GAAA,CAAC;AAC/D,IAAa,GAAG,GAAG,cAAM,OAAAA,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,QAAQ,CAAC,GAAA,CAAC;AAC7E,IAAa,IAAI,GAAG,cAAM,OAAAA,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,SAAS,CAAC,GAAA;;;;;;"} \ No newline at end of file diff --git a/cli.ts.js.map b/cli.ts.js.map deleted file mode 100644 index bcfceef..0000000 --- a/cli.ts.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"cli.ts.js","sources":["src/cli/build.ts","src/cli/export.ts","src/cli/dev.ts","src/cli.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as clorox from 'clorox';\nimport mkdirp from 'mkdirp';\nimport rimraf from 'rimraf';\nimport { create_compilers, create_app, create_routes, create_serviceworker } from '../core'\nimport { src, dest, dev } from '../config';\n\nexport default async function build() {\n\tconst output = dest();\n\n\tmkdirp.sync(output);\n\trimraf.sync(path.join(output, '**/*'));\n\n\tconst routes = create_routes();\n\n\t// create app/manifest/client.js and app/manifest/server.js\n\tcreate_app({ routes, src, dev });\n\n\tconst { client, server, serviceworker } = create_compilers();\n\n\tconst client_stats = await compile(client);\n\tconsole.log(clorox.inverse(`\\nbuilt client`));\n\tconsole.log(client_stats.toString({ colors: true }));\n\tfs.writeFileSync(path.join(output, 'client_info.json'), JSON.stringify(client_stats.toJson()));\n\n\tconst server_stats = await compile(server);\n\tconsole.log(clorox.inverse(`\\nbuilt server`));\n\tconsole.log(server_stats.toString({ colors: true }));\n\n\tlet serviceworker_stats;\n\n\tif (serviceworker) {\n\t\tcreate_serviceworker({\n\t\t\troutes,\n\t\t\tclient_files: client_stats.toJson().assets.map((chunk: { name: string }) => `/client/${chunk.name}`),\n\t\t\tsrc\n\t\t});\n\n\t\tserviceworker_stats = await compile(serviceworker);\n\t\tconsole.log(clorox.inverse(`\\nbuilt service worker`));\n\t\tconsole.log(serviceworker_stats.toString({ colors: true }));\n\t}\n}\n\nfunction compile(compiler: any) {\n\treturn new Promise((fulfil, reject) => {\n\t\tcompiler.run((err: Error, stats: any) => {\n\t\t\tif (err) {\n\t\t\t\treject(err);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tif (stats.hasErrors()) {\n\t\t\t\tconsole.error(stats.toString({ colors: true }));\n\t\t\t\treject(new Error(`Encountered errors while building app`));\n\t\t\t}\n\n\t\t\telse {\n\t\t\t\tfulfil(stats);\n\t\t\t}\n\t\t});\n\t});\n}\n","import * as child_process from 'child_process';\nimport * as path from 'path';\nimport * as sander from 'sander';\nimport polka from 'polka';\nimport cheerio from 'cheerio';\nimport URL from 'url-parse';\nimport fetch from 'node-fetch';\nimport * as ports from 'port-authority';\nimport { dest } from '../config';\n\nconst app = polka();\n\nexport default async function exporter(export_dir: string) {\n\tconst build_dir = dest();\n\n\t// Prep output directory\n\tsander.rimrafSync(export_dir);\n\n\tsander.copydirSync('assets').to(export_dir);\n\tsander.copydirSync(build_dir, 'client').to(export_dir, 'client');\n\n\tif (sander.existsSync(build_dir, 'service-worker.js')) {\n\t\tsander.copyFileSync(build_dir, 'service-worker.js').to(export_dir, 'service-worker.js');\n\t}\n\n\tconst port = await ports.find(3000);\n\n\tconst origin = `http://localhost:${port}`;\n\n\tconst proc = child_process.fork(path.resolve(`${build_dir}/server.js`), [], {\n\t\tcwd: process.cwd(),\n\t\tenv: {\n\t\t\tPORT: port,\n\t\t\tNODE_ENV: 'production',\n\t\t\tSAPPER_DEST: build_dir,\n\t\t\tSAPPER_EXPORT: 'true'\n\t\t}\n\t});\n\n\tconst seen = new Set();\n\tconst saved = new Set();\n\n\tproc.on('message', message => {\n\t\tif (!message.__sapper__) return;\n\n\t\tconst url = new URL(message.url, origin);\n\n\t\tif (saved.has(url.pathname)) return;\n\t\tsaved.add(url.pathname);\n\n\t\tif (message.type === 'text/html') {\n\t\t\tconst file = `${export_dir}/${url.pathname}/index.html`;\n\t\t\tsander.writeFileSync(file, message.body);\n\t\t} else {\n\t\t\tconst file = `${export_dir}/${url.pathname}`;\n\t\t\tsander.writeFileSync(file, message.body);\n\t\t}\n\t});\n\n\tfunction handle(url: URL) {\n\t\tif (url.origin !== origin) return;\n\n\t\tif (seen.has(url.pathname)) return;\n\t\tseen.add(url.pathname);\n\n\t\treturn fetch(url.href)\n\t\t\t.then(r => {\n\t\t\t\tif (r.headers.get('Content-Type') === 'text/html') {\n\t\t\t\t\treturn r.text().then((body: string) => {\n\t\t\t\t\t\tconst $ = cheerio.load(body);\n\t\t\t\t\t\tconst hrefs: string[] = [];\n\n\t\t\t\t\t\t$('a[href]').each((i: number, $a) => {\n\t\t\t\t\t\t\threfs.push($a.attribs.href);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn hrefs.reduce((promise, href) => {\n\t\t\t\t\t\t\treturn promise.then(() => handle(new URL(href, url.href)));\n\t\t\t\t\t\t}, Promise.resolve());\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err: Error) => {\n\t\t\t\tconsole.error(`Error rendering ${url.pathname}: ${err.message}`);\n\t\t\t});\n\t}\n\n\treturn ports.wait(port)\n\t\t.then(() => handle(new URL(origin))) // TODO all static routes\n\t\t.then(() => proc.kill());\n}","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as net from 'net';\nimport * as clorox from 'clorox';\nimport * as child_process from 'child_process';\nimport * as http from 'http';\nimport mkdirp from 'mkdirp';\nimport rimraf from 'rimraf';\nimport format_messages from 'webpack-format-messages';\nimport prettyMs from 'pretty-ms';\nimport * as ports from 'port-authority';\nimport { dest } from '../config';\nimport { create_compilers, create_app, create_routes, create_serviceworker } from '../core';\n\ntype Deferred = {\n\tpromise?: Promise;\n\tfulfil?: (value?: any) => void;\n\treject?: (err: Error) => void;\n}\n\nfunction deferred() {\n\tconst d: Deferred = {};\n\n\td.promise = new Promise((fulfil, reject) => {\n\t\td.fulfil = fulfil;\n\t\td.reject = reject;\n\t});\n\n\treturn d;\n}\n\nfunction create_hot_update_server(port: number, interval = 10000) {\n\tconst clients = new Set();\n\n\tconst server = http.createServer((req, res) => {\n\t\tif (req.url !== '/__sapper__') return;\n\n\t\treq.socket.setKeepAlive(true);\n\t\tres.writeHead(200, {\n\t\t\t'Access-Control-Allow-Origin': '*',\n\t\t\t'Access-Control-Allow-Headers': 'Cache-Control',\n\t\t\t'Content-Type': 'text/event-stream;charset=utf-8',\n\t\t\t'Cache-Control': 'no-cache, no-transform',\n\t\t\t'Connection': 'keep-alive',\n\t\t\t// While behind nginx, event stream should not be buffered:\n\t\t\t// http://nginx.org/docs/http/ngx_http_proxy_module.html#proxy_buffering\n\t\t\t'X-Accel-Buffering': 'no'\n\t\t});\n\n\t\tres.write('\\n');\n\n\t\tclients.add(res);\n\t\treq.on('close', () => {\n\t\t\tclients.delete(res);\n\t\t});\n\t});\n\n\tserver.listen(port);\n\n\tfunction send(data: any) {\n\t\tclients.forEach(client => {\n\t\t\tclient.write(`data: ${JSON.stringify(data)}\\n\\n`);\n\t\t});\n\t}\n\n\tsetInterval(() => {\n\t\tsend(null)\n\t}, interval);\n\n\treturn { send };\n}\n\nexport default async function dev(port: number) {\n\tprocess.env.NODE_ENV = 'development';\n\n\tconst dir = dest();\n\trimraf.sync(dir);\n\tmkdirp.sync(dir);\n\n\tconst dev_port = await ports.find(10000);\n\n\tconst routes = create_routes();\n\tcreate_app({ routes, dev_port });\n\n\tconst hot_update_server = create_hot_update_server(dev_port);\n\n\twatch_files('routes/**/*', ['add', 'unlink'], () => {\n\t\tconst routes = create_routes();\n\t\tcreate_app({ routes, dev_port });\n\t});\n\n\twatch_files('app/template.html', ['change'], () => {\n\t\thot_update_server.send({\n\t\t\taction: 'reload'\n\t\t});\n\t});\n\n\tlet proc: child_process.ChildProcess;\n\n\tprocess.on('exit', () => {\n\t\t// sometimes webpack crashes, so we need to kill our children\n\t\tif (proc) proc.kill();\n\t});\n\n\tconst deferreds = {\n\t\tserver: deferred(),\n\t\tclient: deferred()\n\t};\n\n\tlet restarting = false;\n\tlet build = {\n\t\tunique_warnings: new Set(),\n\t\tunique_errors: new Set()\n\t};\n\n\tfunction restart_build(filename: string) {\n\t\tif (restarting) return;\n\n\t\trestarting = true;\n\t\tbuild = {\n\t\t\tunique_warnings: new Set(),\n\t\t\tunique_errors: new Set()\n\t\t};\n\n\t\tprocess.nextTick(() => {\n\t\t\trestarting = false;\n\t\t});\n\n\t\tconsole.log(`\\n${clorox.bold.cyan(path.relative(process.cwd(), filename))} changed. rebuilding...`);\n\t}\n\n\t// TODO watch the configs themselves?\n\tconst compilers = create_compilers();\n\n\tfunction watch(compiler: any, { name, invalid = noop, error = noop, result }: {\n\t\tname: string,\n\t\tinvalid?: (filename: string) => void;\n\t\terror?: (error: Error) => void;\n\t\tresult: (stats: any) => void;\n\t}) {\n\t\tcompiler.hooks.invalid.tap('sapper', (filename: string) => {\n\t\t\tinvalid(filename);\n\t\t});\n\n\t\tcompiler.watch({}, (err: Error, stats: any) => {\n\t\t\tif (err) {\n\t\t\t\tconsole.error(clorox.red(`✗ ${name}`));\n\t\t\t\tconsole.error(clorox.red(err.message));\n\t\t\t\terror(err);\n\t\t\t} else {\n\t\t\t\tconst messages = format_messages(stats);\n\t\t\t\tconst info = stats.toJson();\n\n\t\t\t\tif (messages.errors.length > 0) {\n\t\t\t\t\tconsole.log(clorox.bold.red(`✗ ${name}`));\n\n\t\t\t\t\tconst filtered = messages.errors.filter((message: string) => {\n\t\t\t\t\t\treturn !build.unique_errors.has(message);\n\t\t\t\t\t});\n\n\t\t\t\t\tfiltered.forEach((message: string) => {\n\t\t\t\t\t\tbuild.unique_errors.add(message);\n\t\t\t\t\t\tconsole.log(message);\n\t\t\t\t\t});\n\n\t\t\t\t\tconst hidden = messages.errors.length - filtered.length;\n\t\t\t\t\tif (hidden > 0) {\n\t\t\t\t\t\tconsole.log(`${hidden} duplicate ${hidden === 1 ? 'error' : 'errors'} hidden\\n`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (messages.warnings.length > 0) {\n\t\t\t\t\t\tconsole.log(clorox.bold.yellow(`• ${name}`));\n\n\t\t\t\t\t\tconst filtered = messages.warnings.filter((message: string) => {\n\t\t\t\t\t\t\treturn !build.unique_warnings.has(message);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tfiltered.forEach((message: string) => {\n\t\t\t\t\t\t\tbuild.unique_warnings.add(message);\n\t\t\t\t\t\t\tconsole.log(`${message}\\n`);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst hidden = messages.warnings.length - filtered.length;\n\t\t\t\t\t\tif (hidden > 0) {\n\t\t\t\t\t\t\tconsole.log(`${hidden} duplicate ${hidden === 1 ? 'warning' : 'warnings'} hidden\\n`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.log(`${clorox.bold.green(`✔ ${name}`)} ${clorox.gray(`(${prettyMs(info.time)})`)}`);\n\t\t\t\t\t}\n\n\t\t\t\t\tresult(info);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\twatch(compilers.server, {\n\t\tname: 'server',\n\n\t\tinvalid: filename => {\n\t\t\trestart_build(filename);\n\t\t\t// TODO print message\n\t\t\tdeferreds.server = deferred();\n\t\t},\n\n\t\tresult: info => {\n\t\t\t// TODO log compile errors/warnings\n\n\t\t\tfs.writeFileSync(path.join(dir, 'server_info.json'), JSON.stringify(info, null, ' '));\n\n\t\t\tdeferreds.client.promise.then(() => {\n\t\t\t\tfunction restart() {\n\t\t\t\t\tports.wait(port).then(deferreds.server.fulfil);\n\t\t\t\t}\n\n\t\t\t\tif (proc) {\n\t\t\t\t\tproc.kill();\n\t\t\t\t\tproc.on('exit', restart);\n\t\t\t\t} else {\n\t\t\t\t\trestart();\n\t\t\t\t}\n\n\t\t\t\tproc = child_process.fork(`${dir}/server.js`, [], {\n\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\tenv: Object.assign({\n\t\t\t\t\t\tPORT: port\n\t\t\t\t\t}, process.env)\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t});\n\n\twatch(compilers.client, {\n\t\tname: 'client',\n\n\t\tinvalid: filename => {\n\t\t\trestart_build(filename);\n\t\t\tdeferreds.client = deferred();\n\n\t\t\t// TODO we should delete old assets. due to a webpack bug\n\t\t\t// i don't even begin to comprehend, this is apparently\n\t\t\t// quite difficult\n\t\t},\n\n\t\tresult: info => {\n\t\t\tfs.writeFileSync(path.join(dir, 'client_info.json'), JSON.stringify(info, null, ' '));\n\t\t\tdeferreds.client.fulfil();\n\n\t\t\tconst client_files = info.assets.map((chunk: { name: string }) => `/client/${chunk.name}`);\n\n\t\t\tdeferreds.server.promise.then(() => {\n\t\t\t\thot_update_server.send({\n\t\t\t\t\tstatus: 'completed'\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tcreate_serviceworker({\n\t\t\t\troutes: create_routes(),\n\t\t\t\tclient_files\n\t\t\t});\n\n\t\t\twatch_serviceworker();\n\t\t}\n\t});\n\n\tlet watch_serviceworker = compilers.serviceworker\n\t\t? function() {\n\t\t\twatch_serviceworker = noop;\n\n\t\t\twatch(compilers.serviceworker, {\n\t\t\t\tname: 'service worker',\n\n\t\t\t\tresult: info => {\n\t\t\t\t\tfs.writeFileSync(path.join(dir, 'serviceworker_info.json'), JSON.stringify(info, null, ' '));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t: noop;\n}\n\nfunction noop() {}\n\nfunction watch_files(pattern: string, events: string[], callback: () => void) {\n\tconst chokidar = require('chokidar');\n\n\tconst watcher = chokidar.watch(pattern, {\n\t\tpersistent: true,\n\t\tignoreInitial: true\n\t});\n\n\tevents.forEach(event => {\n\t\twatcher.on(event, callback);\n\t});\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as child_process from 'child_process';\nimport sade from 'sade';\nimport * as clorox from 'clorox';\nimport prettyMs from 'pretty-ms';\nimport help from './cli/help.md';\nimport build from './cli/build';\nimport exporter from './cli/export';\nimport dev from './cli/dev';\nimport upgrade from './cli/upgrade';\nimport * as ports from 'port-authority';\nimport * as pkg from '../package.json';\n\nconst prog = sade('sapper').version(pkg.version);\n\nprog.command('dev')\n\t.describe('Start a development server')\n\t.option('-p, --port', 'Specify a port')\n\t.action(async (opts: { port: number }) => {\n\t\tlet port = opts.port || +process.env.PORT;\n\n\t\tif (port) {\n\t\t\tif (!await ports.check(port)) {\n\t\t\t\tconsole.log(clorox.bold.red(`> Port ${port} is unavailable`));\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\tport = await ports.find(3000);\n\t\t}\n\n\t\tdev(port);\n\t});\n\nprog.command('build [dest]')\n\t.describe('Create a production-ready version of your app')\n\t.action((dest = 'build') => {\n\t\tconsole.log(`> Building...`);\n\n\t\tprocess.env.NODE_ENV = 'production';\n\t\tprocess.env.SAPPER_DEST = dest;\n\n\t\tconst start = Date.now();\n\n\t\tbuild()\n\t\t\t.then(() => {\n\t\t\t\tconst elapsed = Date.now() - start;\n\t\t\t\tconsole.error(`\\n> Finished in ${prettyMs(elapsed)}. Type ${clorox.bold.cyan(dest === 'build' ? 'npx sapper start' : `npx sapper start ${dest}`)} to run the app.`);\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tconsole.error(err ? err.details || err.stack || err.message || err : 'Unknown error');\n\t\t\t});\n\t});\n\nprog.command('start [dir]')\n\t.describe('Start your app')\n\t.option('-p, --port', 'Specify a port')\n\t.action(async (dir = 'build', opts: { port: number }) => {\n\t\tlet port = opts.port || +process.env.PORT;\n\n\t\tconst resolved = path.resolve(dir);\n\t\tconst server = path.resolve(dir, 'server.js');\n\n\t\tif (!fs.existsSync(server)) {\n\t\t\tconsole.log(clorox.bold.red(`> ${dir}/server.js does not exist — type ${clorox.bold.cyan(dir === 'build' ? `npx sapper build` : `npx sapper build ${dir}`)} to create it`));\n\t\t\treturn;\n\t\t}\n\n\t\tif (port) {\n\t\t\tif (!await ports.check(port)) {\n\t\t\t\tconsole.log(clorox.bold.red(`> Port ${port} is unavailable`));\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\tport = await ports.find(3000);\n\t\t}\n\n\t\tchild_process.fork(server, [], {\n\t\t\tcwd: process.cwd(),\n\t\t\tenv: Object.assign({\n\t\t\t\tNODE_ENV: 'production',\n\t\t\t\tPORT: port,\n\t\t\t\tSAPPER_DEST: dir\n\t\t\t}, process.env)\n\t\t});\n\t});\n\nprog.command('export [dest]')\n\t.describe('Export your app as static files (if possible)')\n\t.action((dest = 'export') => {\n\t\tconsole.log(`> Building...`);\n\n\t\tprocess.env.NODE_ENV = 'production';\n\t\tprocess.env.SAPPER_DEST = '.sapper/.export';\n\n\t\tconst start = Date.now();\n\n\t\tbuild()\n\t\t\t.then(() => {\n\t\t\t\tconst elapsed = Date.now() - start;\n\t\t\t\tconsole.error(`\\n> Built in ${prettyMs(elapsed)}. Exporting...`);\n\t\t\t})\n\t\t\t.then(() => exporter(dest))\n\t\t\t.then(() => {\n\t\t\t\tconst elapsed = Date.now() - start;\n\t\t\t\tconsole.error(`\\n> Finished in ${prettyMs(elapsed)}. Type ${clorox.bold.cyan(`npx serve ${dest}`)} to run the app.`);\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tconsole.error(err ? err.details || err.stack || err.message || err : 'Unknown error');\n\t\t\t});\n\t});\n\n// TODO upgrade\n\nprog.parse(process.argv);\n"],"names":["dest","path.join","create_routes","create_app","create_compilers","clorox.inverse","fs.writeFileSync","create_serviceworker","sander.rimrafSync","sander.copydirSync","sander.existsSync","sander.copyFileSync","ports.find","child_process.fork","path.resolve","sander.writeFileSync","ports.wait","http.createServer","clorox.bold","path.relative","clorox.red","clorox.gray","pkg.version","ports.check","fs.existsSync"],"mappings":"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"} \ No newline at end of file diff --git a/core.ts.js.map b/core.ts.js.map deleted file mode 100644 index 72fe51c..0000000 --- a/core.ts.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"core.ts.js","sources":["src/core/utils.ts","src/core/create_app.ts","src/core/create_serviceworker.ts","src/core/create_compilers.ts","src/core/create_routes.ts"],"sourcesContent":["import * as fs from 'fs';\n\nexport function write(file: string, code: string) {\n\tfs.writeFileSync(file, code);\n\tfudge_mtime(file);\n}\n\nexport function posixify(file: string) {\n\treturn file.replace(/[/\\\\]/g, '/');\n}\n\nexport function fudge_mtime(file: string) {\n\t// need to fudge the mtime so that webpack doesn't go doolally\n\tconst { atime, mtime } = fs.statSync(file);\n\tfs.utimesSync(\n\t\tfile,\n\t\tnew Date(atime.getTime() - 999999),\n\t\tnew Date(mtime.getTime() - 999999)\n\t);\n}","import * as fs from 'fs';\nimport * as path from 'path';\nimport mkdirp from 'mkdirp';\nimport create_routes from './create_routes';\nimport { fudge_mtime, posixify, write } from './utils';\nimport { dev } from '../config';\nimport { Route } from '../interfaces';\n\n// in dev mode, we avoid touching the fs unnecessarily\nlet last_client_manifest: string = null;\nlet last_server_manifest: string = null;\n\nexport default function create_app({ routes, dev_port }: {\n\troutes: Route[];\n\tdev_port: number;\n}) {\n\tmkdirp.sync('app/manifest');\n\n\tconst client_manifest = generate_client(routes, dev_port);\n\tconst server_manifest = generate_server(routes);\n\n\tif (client_manifest !== last_client_manifest) {\n\t\twrite(`app/manifest/client.js`, client_manifest);\n\t\tlast_client_manifest = client_manifest;\n\t}\n\n\tif (server_manifest !== last_server_manifest) {\n\t\twrite(`app/manifest/server.js`, server_manifest);\n\t\tlast_server_manifest = server_manifest;\n\t}\n}\n\nfunction generate_client(routes: Route[], dev_port?: number) {\n\tlet code = `\n\t\t// This file is generated by Sapper — do not edit it!\n\t\texport const routes = [\n\t\t\t${routes\n\t\t\t\t.map(route => {\n\t\t\t\t\tif (route.type !== 'page') {\n\t\t\t\t\t\treturn `{ pattern: ${route.pattern}, ignore: true }`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst file = posixify(`../../routes/${route.file}`);\n\n\t\t\t\t\tif (route.id === '_4xx' || route.id === '_5xx') {\n\t\t\t\t\t\treturn `{ error: '${route.id.slice(1)}', load: () => import(/* webpackChunkName: \"${route.id}\" */ '${file}') }`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst params = route.params.length === 0\n\t\t\t\t\t\t? '{}'\n\t\t\t\t\t\t: `{ ${route.params.map((part, i) => `${part}: match[${i + 1}]`).join(', ')} }`;\n\n\t\t\t\t\treturn `{ pattern: ${route.pattern}, params: ${route.params.length > 0 ? `match` : `()`} => (${params}), load: () => import(/* webpackChunkName: \"${route.id}\" */ '${file}') }`;\n\t\t\t\t})\n\t\t\t\t.join(',\\n\\t')}\n\t\t];`.replace(/^\\t\\t/gm, '').trim();\n\n\tif (dev()) {\n\t\tconst sapper_dev_client = posixify(\n\t\t\tpath.resolve(__dirname, 'sapper-dev-client.js')\n\t\t);\n\n\t\tcode += `\n\n\t\t\tif (module.hot) {\n\t\t\t\timport('${sapper_dev_client}').then(client => {\n\t\t\t\t\tclient.connect(${dev_port});\n\t\t\t\t});\n\t\t\t}`.replace(/^\\t{3}/gm, '');\n\t}\n\n\treturn code;\n}\n\nfunction generate_server(routes: Route[]) {\n\tlet code = `\n\t\t// This file is generated by Sapper — do not edit it!\n\t\t${routes\n\t\t\t.map(route => {\n\t\t\t\tconst file = posixify(`../../routes/${route.file}`);\n\t\t\t\treturn route.type === 'page'\n\t\t\t\t\t? `import ${route.id} from '${file}';`\n\t\t\t\t\t: `import * as ${route.id} from '${file}';`;\n\t\t\t})\n\t\t\t.join('\\n')}\n\n\t\texport const routes = [\n\t\t\t${routes\n\t\t\t\t.map(route => {\n\t\t\t\t\tconst file = posixify(`../../${route.file}`);\n\n\t\t\t\t\tif (route.id === '_4xx' || route.id === '_5xx') {\n\t\t\t\t\t\treturn `{ error: '${route.id.slice(1)}', module: ${route.id} }`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst params = route.params.length === 0\n\t\t\t\t\t\t? '{}'\n\t\t\t\t\t\t: `{ ${route.params.map((part, i) => `${part}: match[${i + 1}]`).join(', ')} }`;\n\n\t\t\t\t\treturn `{ id: '${route.id}', type: '${route.type}', pattern: ${route.pattern}, params: ${route.params.length > 0 ? `match` : `()`} => (${params}), module: ${route.id} }`;\n\t\t\t\t})\n\t\t\t\t.join(',\\n\\t')\n\t\t\t}\n\t\t];`.replace(/^\\t\\t/gm, '').trim();\n\n\treturn code;\n}","import * as fs from 'fs';\nimport * as path from 'path';\nimport glob from 'glob';\nimport create_routes from './create_routes';\nimport { fudge_mtime, posixify, write } from './utils';\nimport { Route } from '../interfaces';\n\nexport default function create_serviceworker({ routes, client_files }: {\n\troutes: Route[];\n\tclient_files: string[];\n}) {\n\tconst assets = glob.sync('**', { cwd: 'assets', nodir: true });\n\n\tlet code = `\n\t\t// This file is generated by Sapper — do not edit it!\n\t\texport const timestamp = ${Date.now()};\n\n\t\texport const assets = [\\n\\t${assets.map((x: string) => `\"${x}\"`).join(',\\n\\t')}\\n];\n\n\t\texport const shell = [\\n\\t${client_files.map((x: string) => `\"${x}\"`).join(',\\n\\t')}\\n];\n\n\t\texport 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];\n\t`.replace(/^\\t\\t/gm, '').trim();\n\n\twrite('app/manifest/service-worker.js', code);\n}","import * as path from 'path';\nimport relative from 'require-relative';\n\nexport default function create_compilers() {\n\tconst webpack = relative('webpack', process.cwd());\n\n\tconst serviceworker_config = try_require(path.resolve('webpack/service-worker.config.js'));\n\n\treturn {\n\t\tclient: webpack(\n\t\t\trequire(path.resolve('webpack/client.config.js'))\n\t\t),\n\n\t\tserver: webpack(\n\t\t\trequire(path.resolve('webpack/server.config.js'))\n\t\t),\n\n\t\tserviceworker: serviceworker_config && webpack(serviceworker_config)\n\t};\n}\n\nfunction try_require(specifier: string) {\n\ttry {\n\t\treturn require(specifier);\n\t} catch (err) {\n\t\tif (err.code === 'MODULE_NOT_FOUND') return null;\n\t\tthrow err;\n\t}\n}","import * as path from 'path';\nimport glob from 'glob';\nimport { src } from '../config';\nimport { Route } from '../interfaces';\n\nexport default function create_routes({ files } = { files: glob.sync('**/*.*', { cwd: src(), nodir: true }) }) {\n\tconst routes: Route[] = files\n\t\t.map((file: string) => {\n\t\t\tif (/(^|\\/|\\\\)_/.test(file)) return;\n\n\t\t\tif (/]\\[/.test(file)) {\n\t\t\t\tthrow new Error(`Invalid route ${file} — parameters must be separated`);\n\t\t\t}\n\n\t\t\tconst base = file.replace(/\\.[^/.]+$/, '');\n\t\t\tconst parts = base.split('/'); // glob output is always posix-style\n\t\t\tif (parts[parts.length - 1] === 'index') parts.pop();\n\n\t\t\tconst id = (\n\t\t\t\tparts.join('_').replace(/[[\\]]/g, '$').replace(/^\\d/, '_$&').replace(/[^a-zA-Z0-9_$]/g, '_')\n\t\t\t ) || '_';\n\n\t\t\tconst params: string[] = [];\n\t\t\tconst param_pattern = /\\[([^\\]]+)\\]/g;\n\t\t\tlet match;\n\t\t\twhile (match = param_pattern.exec(base)) {\n\t\t\t\tparams.push(match[1]);\n\t\t\t}\n\n\t\t\t// TODO can we do all this with sub-parts? or does\n\t\t\t// nesting make that impossible?\n\t\t\tlet pattern_string = '';\n\t\t\tlet i = parts.length;\n\t\t\tlet nested = true;\n\t\t\twhile (i--) {\n\t\t\t\tconst part = encodeURIComponent(parts[i].normalize()).replace(/%5B/g, '[').replace(/%5D/g, ']');\n\t\t\t\tconst dynamic = ~part.indexOf('[');\n\n\t\t\t\tif (dynamic) {\n\t\t\t\t\tconst matcher = part.replace(param_pattern, `([^\\/]+?)`);\n\t\t\t\t\tpattern_string = nested ? `(?:\\\\/${matcher}${pattern_string})?` : `\\\\/${matcher}${pattern_string}`;\n\t\t\t\t} else {\n\t\t\t\t\tnested = false;\n\t\t\t\t\tpattern_string = `\\\\/${part}${pattern_string}`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst pattern = new RegExp(`^${pattern_string}\\\\/?$`);\n\n\t\t\tconst test = (url: string) => pattern.test(url);\n\n\t\t\tconst exec = (url: string) => {\n\t\t\t\tconst match = pattern.exec(url);\n\t\t\t\tif (!match) return;\n\n\t\t\t\tconst result: Record = {};\n\t\t\t\tparams.forEach((param, i) => {\n\t\t\t\t\tresult[param] = match[i + 1];\n\t\t\t\t});\n\n\t\t\t\treturn result;\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\ttype: path.extname(file) === '.html' ? 'page' : 'route',\n\t\t\t\tfile,\n\t\t\t\tpattern,\n\t\t\t\ttest,\n\t\t\t\texec,\n\t\t\t\tparts,\n\t\t\t\tparams\n\t\t\t};\n\t\t})\n\t\t.filter(Boolean)\n\t\t.sort((a: Route, b: Route) => {\n\t\t\tif (a.file === '4xx.html' || a.file === '5xx.html') return -1;\n\t\t\tif (b.file === '4xx.html' || b.file === '5xx.html') return 1;\n\n\t\t\tconst max = Math.max(a.parts.length, b.parts.length);\n\n\t\t\tfor (let i = 0; i < max; i += 1) {\n\t\t\t\tconst a_part = a.parts[i];\n\t\t\t\tconst b_part = b.parts[i];\n\n\t\t\t\tif (!a_part) return -1;\n\t\t\t\tif (!b_part) return 1;\n\n\t\t\t\tconst a_sub_parts = get_sub_parts(a_part);\n\t\t\t\tconst b_sub_parts = get_sub_parts(b_part);\n\t\t\t\tconst max = Math.max(a_sub_parts.length, b_sub_parts.length);\n\n\t\t\t\tfor (let i = 0; i < max; i += 1) {\n\t\t\t\t\tconst a_sub_part = a_sub_parts[i];\n\t\t\t\t\tconst b_sub_part = b_sub_parts[i];\n\n\t\t\t\t\tif (!a_sub_part) return 1; // b is more specific, so goes first\n\t\t\t\t\tif (!b_sub_part) return -1;\n\n\t\t\t\t\tif (a_sub_part.dynamic !== b_sub_part.dynamic) {\n\t\t\t\t\t\treturn a_sub_part.dynamic ? 1 : -1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!a_sub_part.dynamic && a_sub_part.content !== b_sub_part.content) {\n\t\t\t\t\t\treturn b_sub_part.content.length - a_sub_part.content.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow new Error(`The ${a.file} and ${b.file} routes clash`);\n\t\t});\n\n\treturn routes;\n}\n\nfunction get_sub_parts(part: string) {\n\treturn part.split(/[\\[\\]]/)\n\t\t.map((content, i) => {\n\t\t\tif (!content) return null;\n\t\t\treturn {\n\t\t\t\tcontent,\n\t\t\t\tdynamic: i % 2 === 1\n\t\t\t};\n\t\t})\n\t\t.filter(Boolean);\n}"],"names":["fs.writeFileSync","fs.utimesSync","dev","path.resolve","path.extname"],"mappings":"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"} \ No newline at end of file diff --git a/middleware.ts.js.map b/middleware.ts.js.map deleted file mode 100644 index 339dd03..0000000 --- a/middleware.ts.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"middleware.ts.js","sources":["src/middleware/mime.ts","src/middleware.ts"],"sourcesContent":["import mime_raw from './mime-types.md';\n\nconst map: Map = new Map();\n\nmime_raw.split('\\n').forEach((row: string) => {\n\tconst match = /(.+?)\\t+(.+)/.exec(row);\n\tif (!match) return;\n\n\tconst type = match[1];\n\tconst extensions = match[2].split(' ');\n\n\textensions.forEach(ext => {\n\t\tmap.set(ext, type);\n\t});\n});\n\nexport function lookup(file: string) {\n\tconst match = /\\.([^\\.]+)$/.exec(file);\n\treturn match && map.get(match[1]);\n}","import * as fs from 'fs';\nimport * as path from 'path';\nimport { ClientRequest, ServerResponse } from 'http';\nimport mkdirp from 'mkdirp';\nimport rimraf from 'rimraf';\nimport devalue from 'devalue';\nimport { lookup } from './middleware/mime';\nimport { create_routes, templates, create_compilers } from './core/index';\nimport { dest, dev } from './config';\nimport { Route, Template } from './interfaces';\nimport sourceMapSupport from 'source-map-support';\n\nsourceMapSupport.install();\n\ntype RouteObject = {\n\tid: string;\n\ttype: 'page' | 'route';\n\tpattern: RegExp;\n\tparams: (match: RegExpMatchArray) => Record;\n\tmodule: {\n\t\trender: (data: any) => {\n\t\t\thead: string;\n\t\t\tcss: { code: string, map: any };\n\t\t\thtml: string\n\t\t},\n\t\tpreload: (data: any) => any | Promise\n\t};\n\terror?: string;\n}\n\ntype Handler = (req: Req, res: ServerResponse, next: () => void) => void;\n\ninterface Req extends ClientRequest {\n\turl: string;\n\tmethod: string;\n\tpathname: string;\n\tparams: Record;\n}\n\nexport default function middleware({ routes }: {\n\troutes: RouteObject[]\n}) {\n\tconst output = dest();\n\n\tconst client_info = JSON.parse(fs.readFileSync(path.join(output, 'client_info.json'), 'utf-8'));\n\n\tconst middleware = compose_handlers([\n\t\t(req: Req, res: ServerResponse, next: () => void) => {\n\t\t\treq.pathname = req.url.replace(/\\?.*/, '');\n\t\t\tnext();\n\t\t},\n\n\t\tfs.existsSync(path.join(output, 'index.html')) && serve({\n\t\t\tpathname: '/index.html',\n\t\t\tcache_control: 'max-age=600'\n\t\t}),\n\n\t\tfs.existsSync(path.join(output, 'service-worker.js')) && serve({\n\t\t\tpathname: '/service-worker.js',\n\t\t\tcache_control: 'max-age=600'\n\t\t}),\n\n\t\tserve({\n\t\t\tprefix: '/client/',\n\t\t\tcache_control: 'max-age=31536000'\n\t\t}),\n\n\t\tget_route_handler(client_info.assetsByChunkName, routes)\n\t].filter(Boolean));\n\n\treturn middleware;\n}\n\nfunction serve({ prefix, pathname, cache_control }: {\n\tprefix?: string,\n\tpathname?: string,\n\tcache_control: string\n}) {\n\tconst filter = pathname\n\t\t? (req: Req) => req.pathname === pathname\n\t\t: (req: Req) => req.pathname.startsWith(prefix);\n\n\tconst output = dest();\n\n\tconst cache: Map = new Map();\n\n\tconst read = dev()\n\t\t? (file: string) => fs.readFileSync(path.resolve(output, file))\n\t\t: (file: string) => (cache.has(file) ? cache : cache.set(file, fs.readFileSync(path.resolve(output, file)))).get(file)\n\n\treturn (req: Req, res: ServerResponse, next: () => void) => {\n\t\tif (filter(req)) {\n\t\t\tconst type = lookup(req.pathname);\n\n\t\t\ttry {\n\t\t\t\tconst data = read(req.pathname.slice(1));\n\n\t\t\t\tres.setHeader('Content-Type', type);\n\t\t\t\tres.setHeader('Cache-Control', cache_control);\n\t\t\t\tres.end(data);\n\t\t\t} catch (err) {\n\t\t\t\tres.statusCode = 404;\n\t\t\t\tres.end('not found');\n\t\t\t}\n\t\t} else {\n\t\t\tnext();\n\t\t}\n\t};\n}\n\nconst resolved = Promise.resolve();\n\nfunction get_route_handler(chunks: Record, routes: RouteObject[]) {\n\tconst template = dev()\n\t\t? () => fs.readFileSync('app/template.html', 'utf-8')\n\t\t: (str => () => str)(fs.readFileSync('app/template.html', 'utf-8'));\n\n\tfunction handle_route(route: RouteObject, req: Req, res: ServerResponse) {\n\t\treq.params = route.params(route.pattern.exec(req.pathname));\n\n\t\tconst mod = route.module;\n\n\t\tif (route.type === 'page') {\n\t\t\tres.setHeader('Content-Type', 'text/html');\n\n\t\t\t// preload main.js and current route\n\t\t\t// TODO detect other stuff we can preload? images, CSS, fonts?\n\t\t\tconst link = []\n\t\t\t\t.concat(chunks.main, chunks[route.id])\n\t\t\t\t.map(file => `;rel=\"preload\";as=\"script\"`)\n\t\t\t\t.join(', ');\n\n\t\t\tres.setHeader('Link', link);\n\n\t\t\tconst data = { params: req.params, query: req.query };\n\n\t\t\tlet redirect: { statusCode: number, location: string };\n\t\t\tlet error: { statusCode: number, message: Error | string };\n\n\t\t\tPromise.resolve(\n\t\t\t\tmod.preload ? mod.preload.call({\n\t\t\t\t\tredirect: (statusCode: number, location: string) => {\n\t\t\t\t\t\tredirect = { statusCode, location };\n\t\t\t\t\t},\n\t\t\t\t\terror: (statusCode: number, message: Error | string) => {\n\t\t\t\t\t\terror = { statusCode, message };\n\t\t\t\t\t}\n\t\t\t\t}, req) : {}\n\t\t\t).catch(err => {\n\t\t\t\terror = { statusCode: 500, message: err };\n\t\t\t}).then(preloaded => {\n\t\t\t\tif (redirect) {\n\t\t\t\t\tres.statusCode = redirect.statusCode;\n\t\t\t\t\tres.setHeader('Location', redirect.location);\n\t\t\t\t\tres.end();\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (error) {\n\t\t\t\t\thandle_error(req, res, error.statusCode, error.message);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst serialized = try_serialize(preloaded); // TODO bail on non-POJOs\n\t\t\t\tObject.assign(data, preloaded);\n\n\t\t\t\tconst { html, head, css } = mod.render(data);\n\n\t\t\t\tlet scripts = []\n\t\t\t\t\t.concat(chunks.main) // chunks main might be an array. it might not! thanks, webpack\n\t\t\t\t\t.map(file => ``)\n\t\t\t\t\t.join('');\n\n\t\t\t\tscripts = `${scripts}`;\n\n\t\t\t\tconst page = template()\n\t\t\t\t\t.replace('%sapper.scripts%', scripts)\n\t\t\t\t\t.replace('%sapper.html%', html)\n\t\t\t\t\t.replace('%sapper.head%', `${head}`)\n\t\t\t\t\t.replace('%sapper.styles%', (css && css.code ? `` : ''));\n\n\t\t\t\tres.end(page);\n\n\t\t\t\tif (process.send) {\n\t\t\t\t\tprocess.send({\n\t\t\t\t\t\t__sapper__: true,\n\t\t\t\t\t\turl: req.url,\n\t\t\t\t\t\tmethod: req.method,\n\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\ttype: 'text/html',\n\t\t\t\t\t\tbody: page\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\telse {\n\t\t\tconst method = req.method.toLowerCase();\n\t\t\t// 'delete' cannot be exported from a module because it is a keyword,\n\t\t\t// so check for 'del' instead\n\t\t\tconst method_export = method === 'delete' ? 'del' : method;\n\t\t\tconst handler = mod[method_export];\n\t\t\tif (handler) {\n\t\t\t\tif (process.env.SAPPER_EXPORT) {\n\t\t\t\t\tconst { write, end, setHeader } = res;\n\t\t\t\t\tconst chunks: any[] = [];\n\t\t\t\t\tconst headers: Record = {};\n\n\t\t\t\t\t// intercept data so that it can be exported\n\t\t\t\t\tres.write = function(chunk: any) {\n\t\t\t\t\t\tchunks.push(new Buffer(chunk));\n\t\t\t\t\t\twrite.apply(res, arguments);\n\t\t\t\t\t};\n\n\t\t\t\t\tres.setHeader = function(name: string, value: string) {\n\t\t\t\t\t\theaders[name.toLowerCase()] = value;\n\t\t\t\t\t\tsetHeader.apply(res, arguments);\n\t\t\t\t\t};\n\n\t\t\t\t\tres.end = function(chunk?: any) {\n\t\t\t\t\t\tif (chunk) chunks.push(new Buffer(chunk));\n\t\t\t\t\t\tend.apply(res, arguments);\n\n\t\t\t\t\t\tprocess.send({\n\t\t\t\t\t\t\t__sapper__: true,\n\t\t\t\t\t\t\turl: req.url,\n\t\t\t\t\t\t\tmethod: req.method,\n\t\t\t\t\t\t\tstatus: res.statusCode,\n\t\t\t\t\t\t\ttype: headers['content-type'],\n\t\t\t\t\t\t\tbody: Buffer.concat(chunks).toString()\n\t\t\t\t\t\t});\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst handle_bad_result = (err?: Error) => {\n\t\t\t\t\tif (err) {\n\t\t\t\t\t\tconsole.error(err.stack);\n\t\t\t\t\t\tres.statusCode = 500;\n\t\t\t\t\t\tres.end(err.message);\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle_error(req, res, 404, 'Not found');\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\ttry {\n\t\t\t\t\thandler(req, res, handle_bad_result);\n\t\t\t\t} catch (err) {\n\t\t\t\t\thandle_bad_result(err);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// no matching handler for method — 404\n\t\t\t\thandle_error(req, res, 404, 'Not found');\n\t\t\t}\n\t\t}\n\t}\n\n\tconst not_found_route = routes.find((route: RouteObject) => route.error === '4xx');\n\tconst error_route = routes.find((route: RouteObject) => route.error === '5xx');\n\n\tfunction handle_error(req: Req, res: ServerResponse, statusCode: number, message: Error | string) {\n\t\tres.statusCode = statusCode;\n\t\tres.setHeader('Content-Type', 'text/html');\n\n\t\tconst error = message instanceof Error ? message : new Error(message);\n\n\t\tconst not_found = statusCode >= 400 && statusCode < 500;\n\n\t\tconst route = not_found\n\t\t\t? not_found_route\n\t\t\t: error_route;\n\n\t\tconst title: string = not_found\n\t\t\t? 'Not found'\n\t\t\t: `Internal server error: ${error.message}`;\n\n\t\tconst rendered = route ? route.module.render({\n\t\t\tstatus: statusCode,\n\t\t\terror\n\t\t}) : { head: '', css: null, html: title };\n\n\t\tconst { head, css, html } = rendered;\n\n\t\tconst page = template()\n\t\t\t.replace('%sapper.scripts%', ``)\n\t\t\t.replace('%sapper.html%', html)\n\t\t\t.replace('%sapper.head%', `${head}`)\n\t\t\t.replace('%sapper.styles%', (css && css.code ? `` : ''));\n\n\t\tres.end(page);\n\t}\n\n\treturn function find_route(req: Req, res: ServerResponse) {\n\t\tconst url = req.pathname;\n\n\t\ttry {\n\t\t\tfor (const route of routes) {\n\t\t\t\tif (!route.error && route.pattern.test(url)) return handle_route(route, req, res);\n\t\t\t}\n\n\t\t\thandle_error(req, res, 404, 'Not found');\n\t\t} catch (error) {\n\t\t\thandle_error(req, res, 500, error);\n\t\t}\n\t};\n}\n\nfunction compose_handlers(handlers: Handler[]) {\n\treturn (req: Req, res: ServerResponse, next: () => void) => {\n\t\tlet i = 0;\n\t\tfunction go() {\n\t\t\tconst handler = handlers[i];\n\n\t\t\tif (handler) {\n\t\t\t\thandler(req, res, () => {\n\t\t\t\t\ti += 1;\n\t\t\t\t\tgo();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tnext();\n\t\t\t}\n\t\t}\n\n\t\tgo();\n\t};\n}\n\nfunction read_json(file: string) {\n\treturn JSON.parse(fs.readFileSync(file, 'utf-8'));\n}\n\nfunction try_serialize(data: any) {\n\ttry {\n\t\treturn devalue(data);\n\t} catch (err) {\n\t\treturn null;\n\t}\n}"],"names":["dest","fs.readFileSync","path.join","fs.existsSync","dev","path.resolve"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index ed1eaf8..2ee260d 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Military-grade apps, engineered by Svelte", "main": "middleware.js", "bin": { - "sapper": "sapper" + "sapper": "./sapper" }, "files": [ "*.js", diff --git a/src/cli.ts b/src/cli.ts index c80ef82..eeb7814 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -4,11 +4,7 @@ import * as child_process from 'child_process'; import sade from 'sade'; import * as clorox from 'clorox'; import prettyMs from 'pretty-ms'; -import help from './cli/help.md'; -import build from './cli/build'; -import exporter from './cli/export'; -import dev from './cli/dev'; -import upgrade from './cli/upgrade'; +// import upgrade from './cli/upgrade'; import * as ports from 'port-authority'; import * as pkg from '../package.json'; @@ -18,23 +14,13 @@ prog.command('dev') .describe('Start a development server') .option('-p, --port', 'Specify a port') .action(async (opts: { port: number }) => { - let port = opts.port || +process.env.PORT; - - if (port) { - if (!await ports.check(port)) { - console.log(clorox.bold.red(`> Port ${port} is unavailable`)); - return; - } - } else { - port = await ports.find(3000); - } - - dev(port); + const { dev } = await import('./cli/dev'); + dev(opts); }); prog.command('build [dest]') .describe('Create a production-ready version of your app') - .action((dest = 'build') => { + .action(async (dest = 'build') => { console.log(`> Building...`); process.env.NODE_ENV = 'production'; @@ -42,52 +28,26 @@ prog.command('build [dest]') const start = Date.now(); - build() - .then(() => { - const elapsed = Date.now() - start; - console.error(`\n> Finished in ${prettyMs(elapsed)}. Type ${clorox.bold.cyan(dest === 'build' ? 'npx sapper start' : `npx sapper start ${dest}`)} to run the app.`); - }) - .catch(err => { - console.error(err ? err.details || err.stack || err.message || err : 'Unknown error'); - }); + try { + const { build } = await import('./cli/build'); + await build(); + console.error(`\n> Finished in ${elapsed(start)}. Type ${clorox.bold.cyan(dest === 'build' ? 'npx sapper start' : `npx sapper start ${dest}`)} to run the app.`); + } catch (err) { + console.error(err ? err.details || err.stack || err.message || err : 'Unknown error'); + } }); prog.command('start [dir]') .describe('Start your app') .option('-p, --port', 'Specify a port') .action(async (dir = 'build', opts: { port: number }) => { - let port = opts.port || +process.env.PORT; - - const resolved = path.resolve(dir); - const server = path.resolve(dir, 'server.js'); - - if (!fs.existsSync(server)) { - console.log(clorox.bold.red(`> ${dir}/server.js does not exist — type ${clorox.bold.cyan(dir === 'build' ? `npx sapper build` : `npx sapper build ${dir}`)} to create it`)); - return; - } - - if (port) { - if (!await ports.check(port)) { - console.log(clorox.bold.red(`> Port ${port} is unavailable`)); - return; - } - } else { - port = await ports.find(3000); - } - - child_process.fork(server, [], { - cwd: process.cwd(), - env: Object.assign({ - NODE_ENV: 'production', - PORT: port, - SAPPER_DEST: dir - }, process.env) - }); + const { start } = await import('./cli/start'); + start(dir, opts); }); prog.command('export [dest]') .describe('Export your app as static files (if possible)') - .action((dest = 'export') => { + .action(async (dest = 'export') => { console.log(`> Building...`); process.env.NODE_ENV = 'production'; @@ -95,21 +55,23 @@ prog.command('export [dest]') const start = Date.now(); - build() - .then(() => { - const elapsed = Date.now() - start; - console.error(`\n> Built in ${prettyMs(elapsed)}. Exporting...`); - }) - .then(() => exporter(dest)) - .then(() => { - const elapsed = Date.now() - start; - console.error(`\n> Finished in ${prettyMs(elapsed)}. Type ${clorox.bold.cyan(`npx serve ${dest}`)} to run the app.`); - }) - .catch(err => { - console.error(err ? err.details || err.stack || err.message || err : 'Unknown error'); - }); + try { + const { build } = await import('./cli/build'); + await build(); + console.error(`\n> Built in ${elapsed(start)}. Exporting...`); + + const { exporter } = await import('./cli/export'); + await exporter(dest); + console.error(`\n> Finished in ${elapsed(start)}. Type ${clorox.bold.cyan(`npx serve ${dest}`)} to run the app.`); + } catch (err) { + console.error(err ? err.details || err.stack || err.message || err : 'Unknown error'); + } }); // TODO upgrade prog.parse(process.argv); + +function elapsed(start: number) { + return prettyMs(Date.now() - start); +} \ No newline at end of file diff --git a/src/cli/build.ts b/src/cli/build.ts index b17e0da..a201d75 100644 --- a/src/cli/build.ts +++ b/src/cli/build.ts @@ -6,7 +6,7 @@ import rimraf from 'rimraf'; import { create_compilers, create_app, create_routes, create_serviceworker } from '../core' import { src, dest, dev } from '../config'; -export default async function build() { +export async function build() { const output = dest(); mkdirp.sync(output); diff --git a/src/cli/dev.ts b/src/cli/dev.ts index 80cc99b..99f9a9f 100644 --- a/src/cli/dev.ts +++ b/src/cli/dev.ts @@ -70,9 +70,20 @@ function create_hot_update_server(port: number, interval = 10000) { return { send }; } -export default async function dev(port: number) { +export async function dev(opts: { port: number }) { process.env.NODE_ENV = 'development'; + let port = opts.port || +process.env.PORT; + + if (port) { + if (!await ports.check(port)) { + console.log(clorox.bold.red(`> Port ${port} is unavailable`)); + return; + } + } else { + port = await ports.find(3000); + } + const dir = dest(); rimraf.sync(dir); mkdirp.sync(dir); diff --git a/src/cli/export.ts b/src/cli/export.ts index 6dcf9d3..8e4598a 100644 --- a/src/cli/export.ts +++ b/src/cli/export.ts @@ -10,7 +10,7 @@ import { dest } from '../config'; const app = polka(); -export default async function exporter(export_dir: string) { +export async function exporter(export_dir: string) { const build_dir = dest(); // Prep output directory diff --git a/src/cli/start.ts b/src/cli/start.ts new file mode 100644 index 0000000..ffb1ec8 --- /dev/null +++ b/src/cli/start.ts @@ -0,0 +1,35 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as child_process from 'child_process'; +import * as clorox from 'clorox'; +import * as ports from 'port-authority'; + +export async function start(dir: string, opts: { port: number }) { + let port = opts.port || +process.env.PORT; + + const resolved = path.resolve(dir); + const server = path.resolve(dir, 'server.js'); + + if (!fs.existsSync(server)) { + console.log(clorox.bold.red(`> ${dir}/server.js does not exist — type ${clorox.bold.cyan(dir === 'build' ? `npx sapper build` : `npx sapper build ${dir}`)} to create it`)); + return; + } + + if (port) { + if (!await ports.check(port)) { + console.log(clorox.bold.red(`> Port ${port} is unavailable`)); + return; + } + } else { + port = await ports.find(3000); + } + + child_process.fork(server, [], { + cwd: process.cwd(), + env: Object.assign({ + NODE_ENV: 'production', + PORT: port, + SAPPER_DEST: dir + }, process.env) + }); +} \ No newline at end of file diff --git a/webpack.ts.js.map b/webpack.ts.js.map deleted file mode 100644 index eaadffa..0000000 --- a/webpack.ts.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"webpack.ts.js","sources":["src/webpack.ts"],"sourcesContent":["import { dest, dev } from './config';\n\nexport default {\n\tdev: dev(),\n\n\tclient: {\n\t\tentry: () => {\n\t\t\treturn {\n\t\t\t\tmain: './app/client'\n\t\t\t};\n\t\t},\n\n\t\toutput: () => {\n\t\t\treturn {\n\t\t\t\tpath: `${dest()}/client`,\n\t\t\t\tfilename: '[hash]/[name].js',\n\t\t\t\tchunkFilename: '[hash]/[name].[id].js',\n\t\t\t\tpublicPath: '/client/'\n\t\t\t};\n\t\t}\n\t},\n\n\tserver: {\n\t\tentry: () => {\n\t\t\treturn {\n\t\t\t\tserver: './app/server'\n\t\t\t};\n\t\t},\n\n\t\toutput: () => {\n\t\t\treturn {\n\t\t\t\tpath: dest(),\n\t\t\t\tfilename: '[name].js',\n\t\t\t\tchunkFilename: '[hash]/[name].[id].js',\n\t\t\t\tlibraryTarget: 'commonjs2'\n\t\t\t};\n\t\t}\n\t},\n\n\tserviceworker: {\n\t\tentry: () => {\n\t\t\treturn {\n\t\t\t\t'service-worker': './app/service-worker'\n\t\t\t};\n\t\t},\n\n\t\toutput: () => {\n\t\t\treturn {\n\t\t\t\tpath: dest(),\n\t\t\t\tfilename: '[name].js',\n\t\t\t\tchunkFilename: '[name].[id].[hash].js'\n\t\t\t}\n\t\t}\n\t}\n};"],"names":["dev","dest"],"mappings":";;;;AAEA,cAAe;IACd,GAAG,EAAEA,eAAG,EAAE;IAEV,MAAM,EAAE;QACP,KAAK,EAAE;YACN,OAAO;gBACN,IAAI,EAAE,cAAc;aACpB,CAAC;SACF;QAED,MAAM,EAAE;YACP,OAAO;gBACN,IAAI,EAAKC,gBAAI,EAAE,YAAS;gBACxB,QAAQ,EAAE,kBAAkB;gBAC5B,aAAa,EAAE,uBAAuB;gBACtC,UAAU,EAAE,UAAU;aACtB,CAAC;SACF;KACD;IAED,MAAM,EAAE;QACP,KAAK,EAAE;YACN,OAAO;gBACN,MAAM,EAAE,cAAc;aACtB,CAAC;SACF;QAED,MAAM,EAAE;YACP,OAAO;gBACN,IAAI,EAAEA,gBAAI,EAAE;gBACZ,QAAQ,EAAE,WAAW;gBACrB,aAAa,EAAE,uBAAuB;gBACtC,aAAa,EAAE,WAAW;aAC1B,CAAC;SACF;KACD;IAED,aAAa,EAAE;QACd,KAAK,EAAE;YACN,OAAO;gBACN,gBAAgB,EAAE,sBAAsB;aACxC,CAAC;SACF;QAED,MAAM,EAAE;YACP,OAAO;gBACN,IAAI,EAAEA,gBAAI,EAAE;gBACZ,QAAQ,EAAE,WAAW;gBACrB,aAAa,EAAE,uBAAuB;aACtC,CAAA;SACD;KACD;CACD,CAAC;;;;"} \ No newline at end of file