From 71a6b6c06c07021bf5ce59f4eb8f2fe4f8f71930 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sat, 19 Aug 2017 13:55:32 -0700 Subject: [PATCH 01/53] install `gittar` --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index aae9c3241..1dd466183 100644 --- a/package.json +++ b/package.json @@ -121,6 +121,7 @@ "file-loader": "^0.11.1", "fs.promised": "^3.0.0", "get-port": "^3.1.0", + "gittar": "^0.1.0", "glob": "^7.1.2", "html-webpack-exclude-assets-plugin": "0.0.5", "html-webpack-plugin": "^2.28.0", From d4ff63808d3aa44c7f667d6464ccaf90889b81c9 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sat, 19 Aug 2017 15:16:32 -0700 Subject: [PATCH 02/53] remove flags: css,sass,less,dest,type --- README.md | 6 ------ src/commands/create.js | 29 ----------------------------- src/commands/init.js | 14 -------------- 3 files changed, 49 deletions(-) diff --git a/README.md b/README.md index 3026634b9..b94de4e5b 100644 --- a/README.md +++ b/README.md @@ -95,12 +95,6 @@ $ preact init $ preact create --name Directory and package name for the new app. - --dest Directory to create the app within. [default: ] - --type A project template to start from. - [Options: "full", "root", "simple", "empty"] [default: "full"] - --less Pre-install LESS support. [boolean] [default: false] - --sass Pre-install SASS/SCSS support. [boolean] [default: false] - --stylus Pre-install STYLUS support. [boolean] [default: false] --git Initialize version control using git. [boolean] [default: false] --no-install Disables installing of dependencies. [boolean] [default: false] --yarn Installs dependencies with yarn. [boolean] [default: false] diff --git a/src/commands/create.js b/src/commands/create.js index 83dd83d71..73464da14 100644 --- a/src/commands/create.js +++ b/src/commands/create.js @@ -26,44 +26,15 @@ export default asyncCommand({ name: { description: 'directory and package name for the new app' }, - dest: { - description: 'Directory to create the app within', - defaultDescription: '' - }, force: { description: 'Force option to create the directory for the new app', default: false }, - type: { - description: 'A project template to start from', - choices: [ - 'full', - 'root', - 'simple', - 'empty' - ], - default: 'full' - }, yarn: { description: "Use 'yarn' instead of 'npm'", type: 'boolean', default: false }, - less: { - description: 'Pre-install LESS support', - type: 'boolean', - default: false - }, - sass: { - description: 'Pre-install SASS/SCSS support', - type: 'boolean', - default: false - }, - stylus: { - description: 'Pre-install STYLUS support', - type: 'boolean', - default: false - }, git: { description: 'Initialize version control using git', type: 'boolean', diff --git a/src/commands/init.js b/src/commands/init.js index 3cd9e28e0..533e47b49 100644 --- a/src/commands/init.js +++ b/src/commands/init.js @@ -45,20 +45,6 @@ export default asyncCommand({ message: 'Directory to create the app within', default: '' }, - { - type: 'list', - name: 'type', - message: 'A project template to start from', - choices: ['full', 'root', 'simple', 'empty'], - default: 'full', - }, - { - type: 'list', - name: 'style', - message: 'What do you want to use for your styling?', - choices: ['css', 'less', 'sass', 'stylus'], - default: 'css' - }, { type: 'confirm', name: 'yarn', From 6c3c3aa32ad5384708261e408c94003bddeefca4 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sat, 19 Aug 2017 15:28:07 -0700 Subject: [PATCH 03/53] purge *css flag-related stuffs --- src/commands/create.js | 39 +-------------------------------------- 1 file changed, 1 insertion(+), 38 deletions(-) diff --git a/src/commands/create.js b/src/commands/create.js index 73464da14..4d51151af 100644 --- a/src/commands/create.js +++ b/src/commands/create.js @@ -128,25 +128,7 @@ export default asyncCommand({ 'preact-cli', 'if-env', 'eslint', - 'eslint-config-synacor', - - // install sass setup if --sass - ...(argv.sass ? [ - 'node-sass', - 'sass-loader' - ] : []), - - // install less setup if --less - ...(argv.less ? [ - 'less', - 'less-loader' - ] : []), - - // install stylus if --stylus - ...(argv.stylus ? [ - 'stylus', - 'stylus-loader' - ] : []) + 'eslint-config-synacor' ], 'dev'); spinner.text = 'Installing dependencies'; @@ -160,25 +142,6 @@ export default asyncCommand({ spinner.succeed('Done!\n'); - if (argv.less || argv.sass || argv.stylus) { - let extension; - - if (argv.less) extension = '.less'; - if (argv.sass) extension = '.scss'; - if (argv.stylus) extension = '.styl'; - - const cssFiles = await promisify(glob)(`${target}/**/*.css`, { - ignore: [ - `${target}/build/**`, - `${target}/node_modules/**` - ] - }); - - const changeExtension = fileName => fs.rename(fileName, fileName.replace(/.css$/, extension)); - - await Promise.all(cssFiles.map(changeExtension)); - } - if (argv.git) { await initGit(target); } From b7f4cdcd814b2155b353620196b19c2a00ed943f Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sat, 19 Aug 2017 15:46:42 -0700 Subject: [PATCH 04/53] extract yarn-vs-npm logic before printing --- src/commands/create.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/commands/create.js b/src/commands/create.js index 4d51151af..c00a22884 100644 --- a/src/commands/create.js +++ b/src/commands/create.js @@ -48,6 +48,7 @@ export default asyncCommand({ }, async handler(argv) { + let isYarn = argv.yarn === true; let template = TEMPLATES[argv.type]; if (!template) { @@ -102,11 +103,11 @@ export default asyncCommand({ spinner.text = 'Initializing project'; - await initialize(argv.yarn, target); + await initialize(isYarn, target); let pkg = JSON.parse(await fs.readFile(path.resolve(target, 'package.json'))); - pkg.scripts = await pkgScripts(argv.yarn, pkg); + pkg.scripts = await pkgScripts(isYarn, pkg); try { await fs.stat(path.resolve(target, 'src')); @@ -124,7 +125,7 @@ export default asyncCommand({ if (argv.install) { spinner.text = 'Installing dev dependencies'; - await install(argv.yarn, target, [ + await install(isYarn, target, [ 'preact-cli', 'if-env', 'eslint', @@ -133,7 +134,7 @@ export default asyncCommand({ spinner.text = 'Installing dependencies'; - await install(argv.yarn, target, [ + await install(isYarn, target, [ 'preact', 'preact-compat', 'preact-router' @@ -146,18 +147,20 @@ export default asyncCommand({ await initGit(target); } + let pfx = isYarn ? 'yarn' : 'npm run'; + return trimLeft(` To get started, cd into the new directory: \u001b[32mcd ${path.relative(process.cwd(), target)}\u001b[39m To start a development live-reload server: - \u001b[32m${argv.yarn === true ? 'yarn start' : 'npm start'}\u001b[39m + \u001b[32m${pfx} start\u001b[39m To create a production build (in ./build): - \u001b[32m${argv.yarn === true ? 'yarn build' : 'npm run build'}\u001b[39m + \u001b[32m${pfx} build\u001b[39m To start a production HTTP/2 server: - \u001b[32m${argv.yarn === true ? 'yarn serve' : 'npm run serve'}\u001b[39m + \u001b[32m${pfx} serve\u001b[39m `) + '\n'; } }); From 427b22ef96f8132a43038ee7094372c4557ec751 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sat, 19 Aug 2017 15:50:22 -0700 Subject: [PATCH 05/53] replace ansi-codes with `chalk.green` --- src/commands/create.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/commands/create.js b/src/commands/create.js index c00a22884..d14c59072 100644 --- a/src/commands/create.js +++ b/src/commands/create.js @@ -1,7 +1,6 @@ import asyncCommand from '../lib/async-command'; import fs from 'fs.promised'; import copy from 'recursive-copy'; -import glob from 'glob'; import mkdirp from 'mkdirp'; import ora from 'ora'; import chalk from 'chalk'; @@ -151,16 +150,16 @@ export default asyncCommand({ return trimLeft(` To get started, cd into the new directory: - \u001b[32mcd ${path.relative(process.cwd(), target)}\u001b[39m + ${ chalk.green('cd ' + path.relative(process.cwd(), target)) } To start a development live-reload server: - \u001b[32m${pfx} start\u001b[39m + ${ chalk.green(pfx + ' start') } To create a production build (in ./build): - \u001b[32m${pfx} build\u001b[39m + ${ chalk.green(pfx + ' build') } To start a production HTTP/2 server: - \u001b[32m${pfx} serve\u001b[39m + ${ chalk.green(pfx + ' serve') } `) + '\n'; } }); From 8ab768849ece2b2ce5a0da640da404f9e7254855 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sat, 19 Aug 2017 16:37:01 -0700 Subject: [PATCH 06/53] extract `pkgFile` path --- src/commands/create.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/commands/create.js b/src/commands/create.js index d14c59072..6138ad340 100644 --- a/src/commands/create.js +++ b/src/commands/create.js @@ -104,22 +104,23 @@ export default asyncCommand({ await initialize(isYarn, target); - let pkg = JSON.parse(await fs.readFile(path.resolve(target, 'package.json'))); + // Construct user's `package.json` file + let pkgFile = path.resolve(target, 'package.json'); + let pkgData = JSON.parse(await fs.readFile(pkgFile)); - pkg.scripts = await pkgScripts(isYarn, pkg); + pkgData.scripts = await pkgScripts(isYarn, pkgData); try { await fs.stat(path.resolve(target, 'src')); - } - catch (err) { - pkg.scripts.test = pkg.scripts.test.replace('src', '.'); + } catch (_) { + pkgData.scripts.test = pkgData.scripts.test.replace('src', '.'); } - pkg.eslintConfig = { + pkgData.eslintConfig = { extends: 'eslint-config-synacor' }; - await fs.writeFile(path.resolve(target, 'package.json'), JSON.stringify(pkg, null, 2)); + await fs.writeFile(pkgFile, JSON.stringify(pkgData, null, 2)); if (argv.install) { spinner.text = 'Installing dev dependencies'; From 6b878d40e29693fb81b35eb9859c40f9644e9dde Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sat, 19 Aug 2017 17:03:14 -0700 Subject: [PATCH 07/53] use `argv.name` within pkg & manifest (Closes #326) - declare `log-symbols` as a dependency - it is already a direct dependency of `ora` --- package.json | 1 + src/commands/create.js | 24 ++++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 1dd466183..e6eb2ff12 100644 --- a/package.json +++ b/package.json @@ -132,6 +132,7 @@ "less": "^2.7.2", "less-loader": "^4.0.3", "loader-utils": "^1.1.0", + "log-symbols": "^2.0.0", "minimatch": "^3.0.3", "mkdirp": "^0.5.1", "offline-plugin": "^4.6.2", diff --git a/src/commands/create.js b/src/commands/create.js index 6138ad340..0af2b06bc 100644 --- a/src/commands/create.js +++ b/src/commands/create.js @@ -2,9 +2,11 @@ import asyncCommand from '../lib/async-command'; import fs from 'fs.promised'; import copy from 'recursive-copy'; import mkdirp from 'mkdirp'; +import glob from 'glob'; import ora from 'ora'; import chalk from 'chalk'; import inquirer from 'inquirer'; +import logSymbols from 'log-symbols'; import promisify from 'es6-promisify'; import path from 'path'; import { install, initialize, pkgScripts, initGit, trimLeft } from './../lib/setup'; @@ -23,7 +25,7 @@ export default asyncCommand({ builder: { name: { - description: 'directory and package name for the new app' + description: 'The application\'s name' }, force: { description: 'Force option to create the directory for the new app', @@ -54,13 +56,12 @@ export default asyncCommand({ throw Error(`Unknown app template "${argv.type}".`); } - let target = path.resolve(process.cwd(), argv.dest || argv.name); + let target = path.resolve(process.cwd(), argv.dest); let exists = false; try { exists = (await fs.stat(target)).isDirectory(); - } - catch (err) {} + } catch (err) {} if (exists && argv.force) { const question = { @@ -110,6 +111,21 @@ export default asyncCommand({ pkgData.scripts = await pkgScripts(isYarn, pkgData); + if (argv.name) { + pkgData.name = argv.name; + // Find a `manifest.json`; use the first match, if any + let files = await promisify(glob)(target + '/**/manifest.json'); + let manifest = files[0] && JSON.parse(await fs.readFile(files[0])); + if (manifest) { + manifest.name = manifest.short_name = argv.name; + await fs.writeFile(files[0], JSON.stringify(manifest, null, 2)); + if (argv.name.length > 12) { + // @see https://developer.chrome.com/extensions/manifest/name#short_name + process.stdout.write(`\n${logSymbols.warning} Your \`short_name\` should be fewer than 12 characters.\n`); + } + } + } + try { await fs.stat(path.resolve(target, 'src')); } catch (_) { From 86a4f3bad7ae6740edd1aa78761c5c944455d6fb Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sat, 19 Aug 2017 18:04:15 -0700 Subject: [PATCH 08/53] extract an `error` helper - with nice symbol & formatting --- src/commands/create.js | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/commands/create.js b/src/commands/create.js index 0af2b06bc..8cce0c23e 100644 --- a/src/commands/create.js +++ b/src/commands/create.js @@ -5,21 +5,20 @@ import mkdirp from 'mkdirp'; import glob from 'glob'; import ora from 'ora'; import chalk from 'chalk'; +import gittar from 'gittar'; import inquirer from 'inquirer'; import logSymbols from 'log-symbols'; import promisify from 'es6-promisify'; import path from 'path'; import { install, initialize, pkgScripts, initGit, trimLeft } from './../lib/setup'; -const TEMPLATES = { - full: 'examples/full', - empty: 'examples/empty', - root: 'examples/root', - simple: 'examples/simple' -}; +function error(text, code) { + process.stderr.write(logSymbols.error + chalk.red(' ERROR ') + text + '\n'); + process.exit(code || 1); +} export default asyncCommand({ - command: 'create [dest]', + command: 'create