From d7a9074c69eee6e7fc86a8c55ac6eec149d146d3 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 3 May 2018 23:04:05 -0400 Subject: [PATCH 1/4] implement --launcher --- src/cli.ts | 37 +++++++++++++++++++++++++++++++++++-- test/app/start.js | 7 +++++++ test/common/test.js | 8 +++++++- 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 test/app/start.js diff --git a/src/cli.ts b/src/cli.ts index 8913b9f..508d308 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -21,9 +21,18 @@ prog.command('dev') prog.command('build [dest]') .describe('Create a production-ready version of your app') - .action(async (dest = 'build') => { + .option('-l, --launcher', 'Create a launcher file (defaults to start.js)') + .option('-p, --port', 'Default port, if using --launcher') + .example(`build -l`) + .example(`build custom-dir -l custom-launcher.js -p 4567`) + .action(async (dest = 'build', opts: { launcher: string | true, port: string }) => { console.log(`> Building...`); + if (opts.port && !opts.launcher) { + console.error(`${clorox.bold.red(`You can only use the --port option with --launcher`)}`); + process.exit(1); + } + process.env.NODE_ENV = 'production'; process.env.SAPPER_DEST = dest; @@ -32,7 +41,31 @@ prog.command('build [dest]') 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.`); + + let cmd; + + if (opts.launcher) { + const launcher = opts.launcher === true ? 'start.js' : opts.launcher; + const resolvedLauncher = path.resolve(launcher); + const resolvedDest = path.resolve(dest); + const relative = path.relative(path.dirname(resolvedLauncher), resolvedDest); + + fs.writeFileSync(resolvedLauncher, ` + // generated by sapper build at ${new Date().toISOString()} + process.env.NODE_ENV = process.env.NODE_ENV || 'production'; + process.env.SAPPER_DEST = require('path').resolve(__dirname, '${relative}'); + process.env.PORT = process.env.PORT || ${opts.port || 3000}; + + console.log('Starting server on port ' + process.env.PORT); + require('${relative[0] === '.' ? relative : `./${relative}`}/server.js'); + `.replace(/^\t+/gm, '').trim()); + + cmd = `node ${path.relative(process.cwd(), launcher)}`; + } else { + cmd = dest === 'build' ? 'npx sapper start' : `npx sapper start ${dest}`; + } + + console.error(`\n> Finished in ${elapsed(start)}. Type ${clorox.bold.cyan(cmd)} to run the app.`); } catch (err) { console.error(err ? err.details || err.stack || err.message || err : 'Unknown error'); } diff --git a/test/app/start.js b/test/app/start.js new file mode 100644 index 0000000..42937e3 --- /dev/null +++ b/test/app/start.js @@ -0,0 +1,7 @@ +// generated by sapper build at 2018-05-04T03:03:00.914Z +process.env.NODE_ENV = process.env.NODE_ENV || 'production'; +process.env.SAPPER_DEST = require('path').resolve(__dirname, 'build'); +process.env.PORT = process.env.PORT || 3000; + +console.log('Starting server on port ' + process.env.PORT); +require('./build/server.js'); \ No newline at end of file diff --git a/test/common/test.js b/test/common/test.js index 6135160..3c328c6 100644 --- a/test/common/test.js +++ b/test/common/test.js @@ -1,3 +1,4 @@ +const fs = require('fs'); const path = require('path'); const assert = require('assert'); const Nightmare = require('nightmare'); @@ -38,6 +39,7 @@ describe('sapper', function() { rimraf.sync('export'); rimraf.sync('build'); rimraf.sync('.sapper'); + rimraf.sync('start.js'); this.timeout(process.env.CI ? 30000 : 10000); @@ -148,7 +150,7 @@ function run({ mode, basepath = '' }) { before(() => { const promise = mode === 'production' - ? exec(`node ${cli} build`).then(() => ports.find(3000)) + ? exec(`node ${cli} build -l`).then(() => ports.find(3000)) : ports.find(3000).then(port => { exec(`node ${cli} dev`); return ports.wait(port).then(() => port); @@ -160,6 +162,10 @@ function run({ mode, basepath = '' }) { const dir = mode === 'production' ? 'build' : '.sapper'; + if (mode === 'production') { + assert.ok(fs.existsSync('start.js')); + } + proc = require('child_process').fork(`${dir}/server.js`, { cwd: process.cwd(), env: { From 1a5364ae9ddd2af04737208410fb05e2c4858b19 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 3 May 2018 23:16:56 -0400 Subject: [PATCH 2/4] on second thoughts, default to build/index.js --- src/cli.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index 508d308..b52d7f9 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -45,22 +45,23 @@ prog.command('build [dest]') let cmd; if (opts.launcher) { - const launcher = opts.launcher === true ? 'start.js' : opts.launcher; + const launcher = opts.launcher === true ? path.join(dest, 'index.js') : opts.launcher; const resolvedLauncher = path.resolve(launcher); - const resolvedDest = path.resolve(dest); - const relative = path.relative(path.dirname(resolvedLauncher), resolvedDest); + const resolvedServer = path.resolve(dest, 'server.js'); + const pathToServer = path.relative(path.dirname(resolvedLauncher), resolvedServer); + const pathToDest = path.relative(path.dirname(resolvedLauncher), dest); fs.writeFileSync(resolvedLauncher, ` // generated by sapper build at ${new Date().toISOString()} process.env.NODE_ENV = process.env.NODE_ENV || 'production'; - process.env.SAPPER_DEST = require('path').resolve(__dirname, '${relative}'); + process.env.SAPPER_DEST = ${pathToDest ? `require('path').resolve(__dirname, '${pathToDest}')` : '__dirname'}; process.env.PORT = process.env.PORT || ${opts.port || 3000}; console.log('Starting server on port ' + process.env.PORT); - require('${relative[0] === '.' ? relative : `./${relative}`}/server.js'); + require('${pathToServer[0] === '.' ? pathToServer : `./${pathToServer}`}'); `.replace(/^\t+/gm, '').trim()); - cmd = `node ${path.relative(process.cwd(), launcher)}`; + cmd = `node ${path.relative(process.cwd(), launcher).replace(/[\/\\]index.js$/, '')}`; } else { cmd = dest === 'build' ? 'npx sapper start' : `npx sapper start ${dest}`; } From f4eac2515fc6c4c9c336a8aca8493e92e780540e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 3 May 2018 23:23:02 -0400 Subject: [PATCH 3/4] fix tests --- test/app/start.js | 7 ------- test/common/test.js | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) delete mode 100644 test/app/start.js diff --git a/test/app/start.js b/test/app/start.js deleted file mode 100644 index 42937e3..0000000 --- a/test/app/start.js +++ /dev/null @@ -1,7 +0,0 @@ -// generated by sapper build at 2018-05-04T03:03:00.914Z -process.env.NODE_ENV = process.env.NODE_ENV || 'production'; -process.env.SAPPER_DEST = require('path').resolve(__dirname, 'build'); -process.env.PORT = process.env.PORT || 3000; - -console.log('Starting server on port ' + process.env.PORT); -require('./build/server.js'); \ No newline at end of file diff --git a/test/common/test.js b/test/common/test.js index 3c328c6..1cd98ab 100644 --- a/test/common/test.js +++ b/test/common/test.js @@ -163,7 +163,7 @@ function run({ mode, basepath = '' }) { const dir = mode === 'production' ? 'build' : '.sapper'; if (mode === 'production') { - assert.ok(fs.existsSync('start.js')); + assert.ok(fs.existsSync('build/index.js')); } proc = require('child_process').fork(`${dir}/server.js`, { From 4fa5ed5e2cf0b3e52f847c6080bf16aa69b6ac50 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 3 May 2018 23:30:09 -0400 Subject: [PATCH 4/4] simplify --- src/cli.ts | 45 +++++++++++++-------------------------------- 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index b52d7f9..52b3ca6 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -21,18 +21,11 @@ prog.command('dev') prog.command('build [dest]') .describe('Create a production-ready version of your app') - .option('-l, --launcher', 'Create a launcher file (defaults to start.js)') - .option('-p, --port', 'Default port, if using --launcher') - .example(`build -l`) - .example(`build custom-dir -l custom-launcher.js -p 4567`) - .action(async (dest = 'build', opts: { launcher: string | true, port: string }) => { + .option('-p, --port', 'Default of process.env.PORT', '3000') + .example(`build custom-dir -p 4567`) + .action(async (dest = 'build', opts: { port: string }) => { console.log(`> Building...`); - if (opts.port && !opts.launcher) { - console.error(`${clorox.bold.red(`You can only use the --port option with --launcher`)}`); - process.exit(1); - } - process.env.NODE_ENV = 'production'; process.env.SAPPER_DEST = dest; @@ -42,31 +35,19 @@ prog.command('build [dest]') const { build } = await import('./cli/build'); await build(); - let cmd; + const launcher = path.resolve(dest, 'index.js'); - if (opts.launcher) { - const launcher = opts.launcher === true ? path.join(dest, 'index.js') : opts.launcher; - const resolvedLauncher = path.resolve(launcher); - const resolvedServer = path.resolve(dest, 'server.js'); - const pathToServer = path.relative(path.dirname(resolvedLauncher), resolvedServer); - const pathToDest = path.relative(path.dirname(resolvedLauncher), dest); + fs.writeFileSync(launcher, ` + // generated by sapper build at ${new Date().toISOString()} + process.env.NODE_ENV = process.env.NODE_ENV || 'production'; + process.env.SAPPER_DEST = __dirname; + process.env.PORT = process.env.PORT || ${opts.port || 3000}; - fs.writeFileSync(resolvedLauncher, ` - // generated by sapper build at ${new Date().toISOString()} - process.env.NODE_ENV = process.env.NODE_ENV || 'production'; - process.env.SAPPER_DEST = ${pathToDest ? `require('path').resolve(__dirname, '${pathToDest}')` : '__dirname'}; - process.env.PORT = process.env.PORT || ${opts.port || 3000}; + console.log('Starting server on port ' + process.env.PORT); + require('./server.js'); + `.replace(/^\t+/gm, '').trim()); - console.log('Starting server on port ' + process.env.PORT); - require('${pathToServer[0] === '.' ? pathToServer : `./${pathToServer}`}'); - `.replace(/^\t+/gm, '').trim()); - - cmd = `node ${path.relative(process.cwd(), launcher).replace(/[\/\\]index.js$/, '')}`; - } else { - cmd = dest === 'build' ? 'npx sapper start' : `npx sapper start ${dest}`; - } - - console.error(`\n> Finished in ${elapsed(start)}. Type ${clorox.bold.cyan(cmd)} to run the app.`); + console.error(`\n> Finished in ${elapsed(start)}. Type ${clorox.bold.cyan(`node ${dest}`)} to run the app.`); } catch (err) { console.error(err ? err.details || err.stack || err.message || err : 'Unknown error'); }