From d4771ad076ae91ad04fa8e87d0af19140eb754f8 Mon Sep 17 00:00:00 2001 From: Hal Henke Date: Sat, 24 Oct 2015 04:38:35 +1100 Subject: [PATCH 01/13] require package-merge --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index 8b8320e..529f034 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,8 @@ "husky": "^0.10.1", "isparta": "^3.0.4", "nsp": "^2.0.2", + "package-merge": "^0.1.2", + "precommit-hook": "^3.0.0", "rimraf": "^2.4.3", "sinon": "^1.16.1", "tap-xunit": "^1.1.1" From 5c736c9cae39c035713e898b0bafb15e377a6fb8 Mon Sep 17 00:00:00 2001 From: Hal Henke Date: Sat, 24 Oct 2015 04:40:49 +1100 Subject: [PATCH 02/13] functions to merge a pre-existing package.son file with generated template and tests --- lib/mergePack.js | 25 +++++++++++++++++++++++++ test/lib/mergePack-test.js | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 lib/mergePack.js create mode 100644 test/lib/mergePack-test.js diff --git a/lib/mergePack.js b/lib/mergePack.js new file mode 100644 index 0000000..c9037df --- /dev/null +++ b/lib/mergePack.js @@ -0,0 +1,25 @@ +import merge from 'package-merge'; +import fs from 'fs'; +import path from 'path'; + +const getPackage = () => { + let origPackage; + try { + origPackage = fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8'); + } catch (e) { + origPackage = false; + } + return origPackage; +}; + +const mergePackages = (origPackage, destinations) => compiledFiles => { + if (origPackage) { + const newPackagePath = path.join(process.cwd(), 'package.json'); + const packageIndex = destinations.indexOf(newPackagePath); + const packageContents = compiledFiles[packageIndex]; + const mergedPack = merge(origPackage, packageContents); + compiledFiles[packageIndex] = mergedPack; + } + return compiledFiles; +}; +export {getPackage, mergePackages}; diff --git a/test/lib/mergePack-test.js b/test/lib/mergePack-test.js new file mode 100644 index 0000000..cccc8b1 --- /dev/null +++ b/test/lib/mergePack-test.js @@ -0,0 +1,38 @@ +import {test} from 'blue-tape'; +import {mergePackages} from '../../lib/mergePack'; +import path from 'path'; + +test('Merge Packages', t => { + + const packPath = path.join(process.cwd(), 'package.json'); + const templatedFile = JSON.stringify({ + name: 'templatePackage', + description: 'This should overwrite stuff' + }); + const originalFile = JSON.stringify({ + name: 'originalPackage', + description: 'This should be overwritten by a template', + scripts: { + start: 'do a lotta stuff' + } + }); + const mergedFile = JSON.stringify({ + name: 'templatePackage', + description: 'This should overwrite stuff', + scripts: { + start: 'do a lotta stuff' + } + }); + + t.ok(mergePackages instanceof Function, 'should be function'); + + t.ok(mergePackages() instanceof Function, 'should return function'); + + t.deepEqual(mergePackages(false, [packPath])([templatedFile]), [templatedFile], + 'should return the generated package when there is no pre-existing package.json'); + + t.deepEqual(mergePackages(originalFile, [packPath])([templatedFile]), [mergedFile], + 'should merge an existing package.json with template and return results'); + + t.end(); +}); From d75360055fbf4edb5a055fecb988feecdd398fa5 Mon Sep 17 00:00:00 2001 From: Hal Henke Date: Sat, 24 Oct 2015 04:42:07 +1100 Subject: [PATCH 03/13] Add merge package step between template compilation and content saving --- lib/cli.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/cli.js b/lib/cli.js index 1a6851b..815b711 100755 --- a/lib/cli.js +++ b/lib/cli.js @@ -7,6 +7,7 @@ import {parse} from 'nomnom'; import glob from 'glob'; import parseProps from './parseProps'; import generate from './generate'; +import {getPackage, mergePackages} from './mergePack'; import fs from 'fs'; import mkdirp from 'mkdirp'; import path from 'path'; @@ -58,6 +59,7 @@ const scaffold = args => { getPrompt() .then(parseProps(defaults)) .then(generate(srcContent)) + .then(mergePackages(getPackage(), destinations)) .then(saveCompiled) .then(() => { console.log(green('OK'), 'Generation completed', '\n'); From 2a626cc9eb098129b3ebb50cccc999f66da25c64 Mon Sep 17 00:00:00 2001 From: Hal Henke Date: Mon, 26 Oct 2015 20:02:48 +1100 Subject: [PATCH 04/13] export functions rather than object in mergePack --- lib/mergePack.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/mergePack.js b/lib/mergePack.js index c9037df..d9ca600 100644 --- a/lib/mergePack.js +++ b/lib/mergePack.js @@ -2,7 +2,7 @@ import merge from 'package-merge'; import fs from 'fs'; import path from 'path'; -const getPackage = () => { +export const getPackage = () => { let origPackage; try { origPackage = fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8'); @@ -12,7 +12,7 @@ const getPackage = () => { return origPackage; }; -const mergePackages = (origPackage, destinations) => compiledFiles => { +export const mergePackages = (origPackage, destinations) => compiledFiles => { if (origPackage) { const newPackagePath = path.join(process.cwd(), 'package.json'); const packageIndex = destinations.indexOf(newPackagePath); @@ -22,4 +22,3 @@ const mergePackages = (origPackage, destinations) => compiledFiles => { } return compiledFiles; }; -export {getPackage, mergePackages}; From 0746fa51e2879d145ef71946a793800a11801541 Mon Sep 17 00:00:00 2001 From: Hal Henke Date: Mon, 26 Oct 2015 20:04:01 +1100 Subject: [PATCH 05/13] Swap out package-merge for loads.merge for package.json merging --- lib/mergePack.js | 8 ++++---- package.json | 2 +- test/lib/mergePack-test.js | 27 +++++++++++++++++++-------- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/lib/mergePack.js b/lib/mergePack.js index d9ca600..f468b87 100644 --- a/lib/mergePack.js +++ b/lib/mergePack.js @@ -1,11 +1,11 @@ -import merge from 'package-merge'; +import merge from 'lodash.merge'; import fs from 'fs'; import path from 'path'; export const getPackage = () => { let origPackage; try { - origPackage = fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8'); + origPackage = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8')); } catch (e) { origPackage = false; } @@ -16,8 +16,8 @@ export const mergePackages = (origPackage, destinations) => compiledFiles => { if (origPackage) { const newPackagePath = path.join(process.cwd(), 'package.json'); const packageIndex = destinations.indexOf(newPackagePath); - const packageContents = compiledFiles[packageIndex]; - const mergedPack = merge(origPackage, packageContents); + const packageContents = JSON.parse(compiledFiles[packageIndex]); + const mergedPack = JSON.stringify(merge(origPackage, packageContents), null, 2); compiledFiles[packageIndex] = mergedPack; } return compiledFiles; diff --git a/package.json b/package.json index 529f034..8489aeb 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "cli-color": "^1.0.0", "glob": "^5.0.14", "handlebars": "^4.0.0", + "lodash.merge": "^3.3.2", "mkdirp": "^0.5.1", "nomnom": "^1.8.1", "prompt": "^0.2.14" @@ -58,7 +59,6 @@ "isparta": "^3.0.4", "nsp": "^2.0.2", "package-merge": "^0.1.2", - "precommit-hook": "^3.0.0", "rimraf": "^2.4.3", "sinon": "^1.16.1", "tap-xunit": "^1.1.1" diff --git a/test/lib/mergePack-test.js b/test/lib/mergePack-test.js index cccc8b1..3896939 100644 --- a/test/lib/mergePack-test.js +++ b/test/lib/mergePack-test.js @@ -7,22 +7,31 @@ test('Merge Packages', t => { const packPath = path.join(process.cwd(), 'package.json'); const templatedFile = JSON.stringify({ name: 'templatePackage', - description: 'This should overwrite stuff' + description: 'This should overwrite stuff', + main: 'src/index.js', + scripts: { + start: 'do a lotta stuff', + test: 'mocha this package' + } }); - const originalFile = JSON.stringify({ + const originalFile = { name: 'originalPackage', description: 'This should be overwritten by a template', scripts: { - start: 'do a lotta stuff' + start: 'do a lotta stuff', + lint: 'lint this package' } - }); - const mergedFile = JSON.stringify({ + }; + const mergedFile = { name: 'templatePackage', description: 'This should overwrite stuff', + main: 'src/index.js', scripts: { - start: 'do a lotta stuff' + start: 'do a lotta stuff', + lint: 'lint this package', + test: 'mocha this package' } - }); + }; t.ok(mergePackages instanceof Function, 'should be function'); @@ -31,7 +40,9 @@ test('Merge Packages', t => { t.deepEqual(mergePackages(false, [packPath])([templatedFile]), [templatedFile], 'should return the generated package when there is no pre-existing package.json'); - t.deepEqual(mergePackages(originalFile, [packPath])([templatedFile]), [mergedFile], + const merger = mergePackages(originalFile, [packPath])([templatedFile])[0]; + + t.deepEqual(JSON.parse(merger), mergedFile, 'should merge an existing package.json with template and return results'); t.end(); From 4bb6fb4fb66de3331fef8e205d2883fa50f20e34 Mon Sep 17 00:00:00 2001 From: Hal Henke Date: Mon, 26 Oct 2015 20:05:03 +1100 Subject: [PATCH 06/13] test that package.json output has decent formatting --- test/lib/mergePack-test.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/lib/mergePack-test.js b/test/lib/mergePack-test.js index 3896939..c6ef471 100644 --- a/test/lib/mergePack-test.js +++ b/test/lib/mergePack-test.js @@ -45,5 +45,7 @@ test('Merge Packages', t => { t.deepEqual(JSON.parse(merger), mergedFile, 'should merge an existing package.json with template and return results'); + t.ok(merger.match(/\s\s/), 'merged package should be formatted with spaces'); + t.end(); }); From 81f1663d95078929baa42fb26795ce40f2ec0d65 Mon Sep 17 00:00:00 2001 From: Hal Henke Date: Sat, 28 Nov 2015 02:54:05 +1100 Subject: [PATCH 07/13] Get rid of unused `package.merge` package --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 8489aeb..844fcc5 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,6 @@ "husky": "^0.10.1", "isparta": "^3.0.4", "nsp": "^2.0.2", - "package-merge": "^0.1.2", "rimraf": "^2.4.3", "sinon": "^1.16.1", "tap-xunit": "^1.1.1" From 4aa57912e88a44e8eb59d4b32a15d442d2dbf94f Mon Sep 17 00:00:00 2001 From: Hal Henke Date: Sat, 28 Nov 2015 02:56:22 +1100 Subject: [PATCH 08/13] Swap order of arguments in loads.merge in order to choose users original package fields over template ones --- lib/mergePack.js | 2 +- test/lib/mergePack-test.js | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/mergePack.js b/lib/mergePack.js index f468b87..55c384e 100644 --- a/lib/mergePack.js +++ b/lib/mergePack.js @@ -17,7 +17,7 @@ export const mergePackages = (origPackage, destinations) => compiledFiles => { const newPackagePath = path.join(process.cwd(), 'package.json'); const packageIndex = destinations.indexOf(newPackagePath); const packageContents = JSON.parse(compiledFiles[packageIndex]); - const mergedPack = JSON.stringify(merge(origPackage, packageContents), null, 2); + const mergedPack = JSON.stringify(merge(packageContents, origPackage), null, 2); compiledFiles[packageIndex] = mergedPack; } return compiledFiles; diff --git a/test/lib/mergePack-test.js b/test/lib/mergePack-test.js index c6ef471..9ad579d 100644 --- a/test/lib/mergePack-test.js +++ b/test/lib/mergePack-test.js @@ -7,27 +7,27 @@ test('Merge Packages', t => { const packPath = path.join(process.cwd(), 'package.json'); const templatedFile = JSON.stringify({ name: 'templatePackage', - description: 'This should overwrite stuff', + description: 'This should not overwrite stuff', main: 'src/index.js', scripts: { - start: 'do a lotta stuff', + start: 'do a lotta new stuff', test: 'mocha this package' } }); const originalFile = { name: 'originalPackage', - description: 'This should be overwritten by a template', + description: 'This should not be overwritten by a template', scripts: { - start: 'do a lotta stuff', + start: 'do a lotta old stuff', lint: 'lint this package' } }; const mergedFile = { - name: 'templatePackage', - description: 'This should overwrite stuff', + name: 'originalPackage', + description: 'This should not be overwritten by a template', main: 'src/index.js', scripts: { - start: 'do a lotta stuff', + start: 'do a lotta old stuff', lint: 'lint this package', test: 'mocha this package' } From 763e1af7deafe6e578fa7dbbf2dd9bd6a9e3a666 Mon Sep 17 00:00:00 2001 From: Hal Henke Date: Thu, 11 Feb 2016 03:50:56 +1100 Subject: [PATCH 09/13] Add object rest/spread syntax --- .babelrc | 3 ++- package.json | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.babelrc b/.babelrc index c13c5f6..831f20a 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,4 @@ { - "presets": ["es2015"] + "presets": ["es2015"], + "plugins": ["transform-object-rest-spread"] } diff --git a/package.json b/package.json index 844fcc5..daca325 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ }, "devDependencies": { "babel-eslint": "^4.1.1", + "babel-plugin-transform-object-rest-spread": "^6.5.0", "blue-tape": "^0.1.10", "eslint": "^1.3.1", "faucet": "0.0.1", From 3a4f07a7dcf83c27f1536215900b9d865e21e415 Mon Sep 17 00:00:00 2001 From: Hal Henke Date: Thu, 11 Feb 2016 03:52:37 +1100 Subject: [PATCH 10/13] Very Rough version of changes --- lib/cli.js | 31 +++++++++++++++++++++++++++++-- lib/properties.js | 21 +++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/lib/cli.js b/lib/cli.js index 815b711..7cca7e1 100755 --- a/lib/cli.js +++ b/lib/cli.js @@ -11,14 +11,41 @@ import {getPackage, mergePackages} from './mergePack'; import fs from 'fs'; import mkdirp from 'mkdirp'; import path from 'path'; -import {properties, defaults} from './properties'; +import {packageProperties, properties, defaults} from './properties'; import { blackBright as grey, greenBright as green, yellowBright as yellow, redBright as red} from 'cli-color'; -const schema = {properties}; +let schema = {properties}; + +let gitHub, author; +const existingPackage = getPackage(); +if (existingPackage) { + console.log(`Existing package.json file has been used to get default variables.`); + // console.log('name is ', existingPackage.name); + schema.properties = {...schema.properties, ...packageProperties}; + schema.properties['package.name'].default = existingPackage.name; + schema.properties['package.description'].default = existingPackage.description; + if (existingPackage.repository) { + gitHub = existingPackage.repository.url.match(/github.com:(.*)\//); + if (gitHub) { + schema.properties['user.github'].default = gitHub[1]; + } + } + if (existingPackage.author) { + schema.properties['user.name'].default = existingPackage.author; + // author = existingPackage.author.match(/(.*)((?:\s<)([\w\d@\.]*)(?:>)){0,1}/); + // if (author) { + // schema.properties['user.name'].default = author[1]; + // if (author.length == 3) { + // schema.properties['user.email'].default = author[2]; + // } + // } + } + console.dir(schema); +} Object.assign(prompt, { diff --git a/lib/properties.js b/lib/properties.js index e407699..3e08e45 100644 --- a/lib/properties.js +++ b/lib/properties.js @@ -16,6 +16,27 @@ export const defaults = { } }; +export const packageProperties = { + 'deps': { + description: 'Keep existing dependencies?: ', + message: 'Required', + type: 'boolean', + required: true + }, + 'devDeps': { + description: 'Keep existing devDependencies?: ', + message: 'Required', + type: 'boolean', + required: true + }, + 'scripts': { + description: 'Keep existing scripts?: ', + message: 'Required', + type: 'boolean', + required: true + } +}; + export const properties = { 'user.name': { From 5bb8e17758b690f972ea3e0af04fcbe2231fab16 Mon Sep 17 00:00:00 2001 From: Hal Henke Date: Thu, 11 Feb 2016 04:26:35 +1100 Subject: [PATCH 11/13] use `parse-author` & `parse-github-url` to get author & Github info from pre-existing package.json if available --- lib/cli.js | 28 +++++++++++++--------------- package.json | 2 ++ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/cli.js b/lib/cli.js index 7cca7e1..ccec79b 100755 --- a/lib/cli.js +++ b/lib/cli.js @@ -4,6 +4,8 @@ import 'babel-polyfill'; import prompt from 'prompt'; import {parse} from 'nomnom'; +import parseAuthor from 'parse-author'; +import parseGithub from 'parse-github-url'; import glob from 'glob'; import parseProps from './parseProps'; import generate from './generate'; @@ -20,29 +22,25 @@ import { let schema = {properties}; -let gitHub, author; +let gitHub, authorInfo; const existingPackage = getPackage(); if (existingPackage) { console.log(`Existing package.json file has been used to get default variables.`); - // console.log('name is ', existingPackage.name); schema.properties = {...schema.properties, ...packageProperties}; schema.properties['package.name'].default = existingPackage.name; schema.properties['package.description'].default = existingPackage.description; - if (existingPackage.repository) { - gitHub = existingPackage.repository.url.match(/github.com:(.*)\//); - if (gitHub) { - schema.properties['user.github'].default = gitHub[1]; - } + if (existingPackage.repository && existingPackage.repository.url) { + gitHub = parseGithub(existingPackage.repository.url).owner; + schema.properties['user.github'].default = gitHub; } if (existingPackage.author) { - schema.properties['user.name'].default = existingPackage.author; - // author = existingPackage.author.match(/(.*)((?:\s<)([\w\d@\.]*)(?:>)){0,1}/); - // if (author) { - // schema.properties['user.name'].default = author[1]; - // if (author.length == 3) { - // schema.properties['user.email'].default = author[2]; - // } - // } + authorInfo = parseAuthor(existingPackage.author); + if (authorInfo.name) { + schema.properties['user.name'].default = authorInfo.name; + } + if (authorInfo.email) { + schema.properties['user.email'].default = authorInfo.email; + } } console.dir(schema); } diff --git a/package.json b/package.json index daca325..e1d219a 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,8 @@ "husky": "^0.10.1", "isparta": "^3.0.4", "nsp": "^2.0.2", + "parse-author": "^0.2.0", + "parse-github-url": "^0.3.0", "rimraf": "^2.4.3", "sinon": "^1.16.1", "tap-xunit": "^1.1.1" From 959e47fc2c4ae61b35f57d30b4d7691b85fa21d3 Mon Sep 17 00:00:00 2001 From: Hal Henke Date: Fri, 12 Feb 2016 00:56:08 +1100 Subject: [PATCH 12/13] Option to merge pre-existing dependencies, devDependencies and scripts into template package.json --- lib/cli.js | 2 ++ lib/packageExtras.js | 26 ++++++++++++++++++++++++++ lib/properties.js | 17 ++++++++++------- 3 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 lib/packageExtras.js diff --git a/lib/cli.js b/lib/cli.js index ccec79b..d611282 100755 --- a/lib/cli.js +++ b/lib/cli.js @@ -9,6 +9,7 @@ import parseGithub from 'parse-github-url'; import glob from 'glob'; import parseProps from './parseProps'; import generate from './generate'; +import packageExtras from './packageExtras'; import {getPackage, mergePackages} from './mergePack'; import fs from 'fs'; import mkdirp from 'mkdirp'; @@ -82,6 +83,7 @@ const scaffold = args => { prompt.override = args; getPrompt() + .then(packageExtras(existingPackage)) .then(parseProps(defaults)) .then(generate(srcContent)) .then(mergePackages(getPackage(), destinations)) diff --git a/lib/packageExtras.js b/lib/packageExtras.js new file mode 100644 index 0000000..745b289 --- /dev/null +++ b/lib/packageExtras.js @@ -0,0 +1,26 @@ +// import fs from 'fs'; +// import path from 'path'; +// const templatePackage = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'template', 'package.json'), 'utf-8')); +// const templatePackage = JSON.parse(fs.readFileSync(path.join('..', '/template', 'package.json'), 'utf-8')); +const templatePackage = require('../template/package.json'); + +const packageExtras = userPackage => props => { + if (props['package.dependencies']) { + props['package.dependencies'] = {...templatePackage.dependencies, ...userPackage.dependencies}; + } else { + props['package.dependencies'] = {...templatePackage.dependencies}; + } + if (props['package.devDependencies']) { + props['package.devDependencies'] = {...templatePackage.devDependencies, ...userPackage.devDependencies}; + } else { + props['package.devDependencies'] = {...templatePackage.devDependencies}; + } + if (props['package.scripts']) { + props['package.scripts'] = {...templatePackage.scripts, ...userPackage.scripts}; + } else { + props['package.scripts'] = {...templatePackage.scripts}; + } + return props; +} + +export default packageExtras; diff --git a/lib/properties.js b/lib/properties.js index 3e08e45..6f1ae18 100644 --- a/lib/properties.js +++ b/lib/properties.js @@ -12,25 +12,28 @@ export const defaults = { }, package: { name: '', - description: '' + description: '', + dependencies: {}, + devDependencies: {}, + scripts: {} } }; export const packageProperties = { - 'deps': { - description: 'Keep existing dependencies?: ', + 'package.dependencies': { + description: 'Keep existing dependencies? (true|false): ', message: 'Required', type: 'boolean', required: true }, - 'devDeps': { - description: 'Keep existing devDependencies?: ', + 'package.devDependencies': { + description: 'Keep existing devDependencies? (true|false): ', message: 'Required', type: 'boolean', required: true }, - 'scripts': { - description: 'Keep existing scripts?: ', + 'package.scripts': { + description: 'Keep existing scripts? (true|false): ', message: 'Required', type: 'boolean', required: true From 52e69f8d88251943601da11decdc586194e34c10 Mon Sep 17 00:00:00 2001 From: Hal Henke Date: Sun, 14 Feb 2016 01:34:31 +1100 Subject: [PATCH 13/13] Refactor - change big chain of if else statements into something a little more extensible - move author/github stuff into separate file --- lib/cli.js | 32 ++++---------------------------- lib/mergePack.js | 29 ++++++++++++++++++++++++++++- lib/packageExtras.js | 36 +++++++++++++----------------------- template/package.json | 4 ++-- 4 files changed, 47 insertions(+), 54 deletions(-) diff --git a/lib/cli.js b/lib/cli.js index d611282..04c79b9 100755 --- a/lib/cli.js +++ b/lib/cli.js @@ -4,13 +4,11 @@ import 'babel-polyfill'; import prompt from 'prompt'; import {parse} from 'nomnom'; -import parseAuthor from 'parse-author'; -import parseGithub from 'parse-github-url'; import glob from 'glob'; import parseProps from './parseProps'; import generate from './generate'; -import packageExtras from './packageExtras'; -import {getPackage, mergePackages} from './mergePack'; +import setPackageProps from './packageExtras'; +import {getPackage, getPackageProps, mergePackages} from './mergePack'; import fs from 'fs'; import mkdirp from 'mkdirp'; import path from 'path'; @@ -22,30 +20,8 @@ import { redBright as red} from 'cli-color'; let schema = {properties}; - -let gitHub, authorInfo; const existingPackage = getPackage(); -if (existingPackage) { - console.log(`Existing package.json file has been used to get default variables.`); - schema.properties = {...schema.properties, ...packageProperties}; - schema.properties['package.name'].default = existingPackage.name; - schema.properties['package.description'].default = existingPackage.description; - if (existingPackage.repository && existingPackage.repository.url) { - gitHub = parseGithub(existingPackage.repository.url).owner; - schema.properties['user.github'].default = gitHub; - } - if (existingPackage.author) { - authorInfo = parseAuthor(existingPackage.author); - if (authorInfo.name) { - schema.properties['user.name'].default = authorInfo.name; - } - if (authorInfo.email) { - schema.properties['user.email'].default = authorInfo.email; - } - } - console.dir(schema); -} - +schema = getPackageProps(existingPackage, packageProperties, schema); Object.assign(prompt, { message: '>'.green, @@ -83,7 +59,7 @@ const scaffold = args => { prompt.override = args; getPrompt() - .then(packageExtras(existingPackage)) + .then(setPackageProps(existingPackage)) .then(parseProps(defaults)) .then(generate(srcContent)) .then(mergePackages(getPackage(), destinations)) diff --git a/lib/mergePack.js b/lib/mergePack.js index 55c384e..7b974cb 100644 --- a/lib/mergePack.js +++ b/lib/mergePack.js @@ -1,6 +1,8 @@ -import merge from 'lodash.merge'; import fs from 'fs'; import path from 'path'; +import merge from 'lodash.merge'; +import parseAuthor from 'parse-author'; +import parseGithub from 'parse-github-url'; export const getPackage = () => { let origPackage; @@ -12,6 +14,31 @@ export const getPackage = () => { return origPackage; }; +export const getPackageProps = (existingPackage, packageProperties, schema) => { + let gitHub, authorInfo; + if (existingPackage) { + console.log(`Existing package.json file has been used to get default variables.`); + schema.properties = {...schema.properties, ...packageProperties}; + schema.properties['package.name'].default = existingPackage.name; + schema.properties['package.description'].default = existingPackage.description; + // Try to get Name, Email & GitHub Username + if (existingPackage.repository && existingPackage.repository.url) { + gitHub = parseGithub(existingPackage.repository.url).owner; + schema.properties['user.github'].default = gitHub; + } + if (existingPackage.author) { + authorInfo = parseAuthor(existingPackage.author); + if (authorInfo.name) { + schema.properties['user.name'].default = authorInfo.name; + } + if (authorInfo.email) { + schema.properties['user.email'].default = authorInfo.email; + } + } + } + return schema; +}; + export const mergePackages = (origPackage, destinations) => compiledFiles => { if (origPackage) { const newPackagePath = path.join(process.cwd(), 'package.json'); diff --git a/lib/packageExtras.js b/lib/packageExtras.js index 745b289..5875109 100644 --- a/lib/packageExtras.js +++ b/lib/packageExtras.js @@ -1,26 +1,16 @@ -// import fs from 'fs'; -// import path from 'path'; -// const templatePackage = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'template', 'package.json'), 'utf-8')); -// const templatePackage = JSON.parse(fs.readFileSync(path.join('..', '/template', 'package.json'), 'utf-8')); -const templatePackage = require('../template/package.json'); +import templatePackage from '../template/package.json'; -const packageExtras = userPackage => props => { - if (props['package.dependencies']) { - props['package.dependencies'] = {...templatePackage.dependencies, ...userPackage.dependencies}; - } else { - props['package.dependencies'] = {...templatePackage.dependencies}; - } - if (props['package.devDependencies']) { - props['package.devDependencies'] = {...templatePackage.devDependencies, ...userPackage.devDependencies}; - } else { - props['package.devDependencies'] = {...templatePackage.devDependencies}; - } - if (props['package.scripts']) { - props['package.scripts'] = {...templatePackage.scripts, ...userPackage.scripts}; - } else { - props['package.scripts'] = {...templatePackage.scripts}; - } +const packageFields = ['dependencies', 'devDependencies', 'scripts']; + +const setPackageProps = userPackage => props => { + packageFields.forEach((field) => { + if (props[`package.${field}`]) { + props[`package.${field}`] = {...templatePackage[field], ...userPackage[field]}; + } else { + props[`package.${field}`] = {...templatePackage[field]}; + } + }); return props; -} +}; -export default packageExtras; +export default setPackageProps; diff --git a/template/package.json b/template/package.json index ffa3489..68f313e 100644 --- a/template/package.json +++ b/template/package.json @@ -28,11 +28,11 @@ "precommit": "npm run lint", "prepush": "npm run validate" }, - "devDependencies": { + "devDependencies": { "babel-cli": "^6.2.0", "babel-core": "^6.0.0", "babel-preset-es2015": "^6.1.18", - "babel-preset-stage-1":"^6.0.0", + "babel-preset-stage-1": "^6.0.0", "babel-eslint": "^4.0.5", "babel-loader": "^6.0.0", "babel-plugin-transform-object-assign": "^6.1.18",