Comparing version 0.2.2 to 0.3.0
@@ -44,4 +44,4 @@ #!/usr/bin/env node | ||
// ---------------------------------------------------------------------------- | ||
_commander2.default.command('init [project]').description("Create a new project with the specified name, and save an alias to this folder.").action(project => { | ||
(0, _init2.default)(project).then(project => { | ||
_commander2.default.command('init [project] [template]').description(`Create a new project with the specified name, and save an alias to this folder.`).action((project, template) => { | ||
(0, _init2.default)(project, template).then(project => { | ||
console.log(`Created new project ${ project }. Add new vars with ${ _chalk2.default.green("biome add") } or fire it up with ${ _chalk2.default.green("biome use") }.`.replace('\n', '')); | ||
@@ -48,0 +48,0 @@ }).catch(console.error.bind(console)); |
102
dist/init.js
@@ -6,2 +6,6 @@ 'use strict'; | ||
}); | ||
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); | ||
exports.default = fetchTemplate; | ||
exports.default = init; | ||
@@ -25,2 +29,10 @@ | ||
var _inquirerPromise = require('inquirer-promise'); | ||
var _inquirerPromise2 = _interopRequireDefault(_inquirerPromise); | ||
var _requestPromise = require('request-promise'); | ||
var _requestPromise2 = _interopRequireDefault(_requestPromise); | ||
var _constants = require('./constants'); | ||
@@ -30,44 +42,60 @@ | ||
// try to find the local project name | ||
const lookFor = { | ||
'package.json': contents => { | ||
let data = JSON.parse(contents); | ||
return data ? data.name : null; | ||
}, | ||
'setup.py': contents => { | ||
let name = contents.match(/name[ ]+=[ ]+['"](.+)['"]/); | ||
return name ? name[1] : null; | ||
// given a template url, return user-populated data. | ||
function fetchTemplate(data) { | ||
if (data && Object.keys(data).length >= 0) { | ||
let keys = Object.keys(data); | ||
return _inquirerPromise2.default.prompt(keys.map(key => { | ||
let value = data[key]; | ||
return { | ||
type: "input", | ||
message: `Enter a value for ${ key }`, | ||
name: key, | ||
default: value | ||
}; | ||
})); | ||
} else { | ||
console.error("The passed template URL doesn't return JSON. Learn more about template URLs at https://github.com/1egoman/biome/blob/master/resources/templateURL.md"); | ||
return; | ||
} | ||
}; | ||
function getProjectName() { | ||
let findFirstMatch = []; | ||
for (let key in lookFor) { | ||
findFirstMatch.push(asyncCheck(_path2.default.join(process.cwd(), key), lookFor[key])); | ||
console.log(_path2.default.join(process.cwd(), key)); | ||
} | ||
} | ||
function asyncCheck(key, value) { | ||
return _fsPromise2.default.readFile(key).then(value); | ||
} | ||
function init(project, template) { | ||
let biomeFile = _path2.default.join(process.cwd(), (0, _constants.biomeLocalName)()); | ||
return _bluebird2.default.any(findFirstMatch); | ||
} | ||
// step 0: Read the Biomefile and see if there's a template | ||
return _fsPromise2.default.readJSON(biomeFile).catch(error => { | ||
return {}; // No biomefile | ||
}).then(biomefile => { | ||
project = biomefile.project || project; | ||
function init(project) { | ||
// step 0: determine project name | ||
if (typeof project !== "string") { | ||
return getProjectName().then(init); | ||
} else if (project.trim().length === 0) { | ||
console.error("No project name was specified or found. Please specify one manually."); | ||
} else { | ||
if (project.length === 0) { | ||
console.error("Project names need to be at least 1 character long."); | ||
throw new Error("Project names need to be at least 1 character long."); | ||
} | ||
if (template || typeof biomefile.template === "string") { | ||
// a template url | ||
return (0, _requestPromise2.default)(template || biomefile.template).then(JSON.parse).then(fetchTemplate); | ||
} else if (biomefile.template) { | ||
return fetchTemplate(biomefile.template); | ||
} else { | ||
// no template | ||
return _bluebird2.default.resolve({}); | ||
} | ||
}).then(data => { | ||
// step 1: write stuff to local Biomefile | ||
let biomeFile = _path2.default.join(process.cwd(), (0, _constants.biomeLocalName)()); | ||
return _fsPromise2.default.writeFile(biomeFile, JSON.stringify({ | ||
name: project | ||
}, null, 2)).then(file => { | ||
// step 2: write creds file in the ~/.biome folder | ||
let biomeProject = _path2.default.join((0, _constants.biomeFolderName)(), `${ project }.json`); | ||
return _fsPromise2.default.writeFile(biomeProject, "{}").then(f => project); | ||
}); | ||
} | ||
return _bluebird2.default.all([data, _fsPromise2.default.writeFile(biomeFile, JSON.stringify({ | ||
name: project, | ||
template | ||
}, null, 2))]); | ||
}).then(_ref => { | ||
var _ref2 = _slicedToArray(_ref, 2); | ||
let data = _ref2[0]; | ||
let file = _ref2[1]; | ||
// step 2: write creds file in the ~/.biome folder | ||
let biomeProject = _path2.default.join((0, _constants.biomeFolderName)(), `${ project }.json`); | ||
return _fsPromise2.default.writeFile(biomeProject, JSON.stringify(data, null, 2)); | ||
}).then(f => project); | ||
} |
{ | ||
"name": "biome", | ||
"version": "0.2.2", | ||
"version": "0.3.0", | ||
"description": "A simple way to manage environment variables on a per-project basis", | ||
@@ -37,2 +37,4 @@ "main": "src/index.js", | ||
"fs-promise": "^0.5.0", | ||
"inquirer-promise": "0.0.3", | ||
"request-promise": "^3.0.0", | ||
"untildify": "^3.0.2", | ||
@@ -39,0 +41,0 @@ "user-home": "^2.0.0" |
@@ -80,2 +80,17 @@ ![Biome: a small script to manage a user's environment variables](https://raw.githubusercontent.com/1egoman/biome/master/resources/hero.png) | ||
"environment", "here"]`. | ||
- Easily give new users a simple way to enter values. Within the `Biomefile`, define a property | ||
called `template`. Each key of `template` should be the variable name, while each value should be | ||
its default value. For example: | ||
```json | ||
{ | ||
"name": "my-project", | ||
"template": { | ||
"KEY": "value" | ||
} | ||
} | ||
``` | ||
Then, when the user runs `biome init`, they'll be prompted for the values specified. Above, they'd | ||
be prompted for `KEY`, and given a default choice of "value". | ||
- Don't want to hardcode templates into a project? As an argument to `biome init`, specify a | ||
template url after the project name, like `biome init project http://example.com/template.json`. | ||
@@ -82,0 +97,0 @@ |
@@ -19,6 +19,6 @@ #!/usr/bin/env node | ||
program | ||
.command('init [project]') | ||
.description("Create a new project with the specified name, and save an alias to this folder.") | ||
.action(project => { | ||
init(project).then(project => { | ||
.command('init [project] [template]') | ||
.description(`Create a new project with the specified name, and save an alias to this folder.`) | ||
.action((project, template) => { | ||
init(project, template).then(project => { | ||
console.log(`Created new project ${project}. Add new vars with ${chalk.green("biome add")} or fire it up with ${chalk.green("biome use")}.`.replace('\n', '')); | ||
@@ -25,0 +25,0 @@ }).catch(console.error.bind(console)); |
@@ -5,50 +5,65 @@ import fs from 'fs-promise'; | ||
import untildify from 'untildify'; | ||
import inquirer from 'inquirer-promise'; | ||
import request from 'request-promise'; | ||
import {biomeLocalName, biomeFolderName} from './constants'; | ||
// try to find the local project name | ||
const lookFor = { | ||
'package.json': contents => { | ||
let data = JSON.parse(contents); | ||
return data ? data.name : null; | ||
}, | ||
'setup.py': contents => { | ||
let name = contents.match(/name[ ]+=[ ]+['"](.+)['"]/); | ||
return name ? name[1] : null; | ||
}, | ||
}; | ||
function getProjectName() { | ||
let findFirstMatch = []; | ||
for (let key in lookFor) { | ||
findFirstMatch.push(asyncCheck(path.join(process.cwd(), key), lookFor[key])); | ||
console.log(path.join(process.cwd(), key)) | ||
// given a template url, return user-populated data. | ||
export default function fetchTemplate(data) { | ||
if (data && Object.keys(data).length >= 0) { | ||
let keys = Object.keys(data); | ||
return inquirer.prompt(keys.map(key => { | ||
let value = data[key]; | ||
return { | ||
type: "input", | ||
message: `Enter a value for ${key}`, | ||
name: key, | ||
default: value, | ||
}; | ||
})); | ||
} else { | ||
console.error("The passed template URL doesn't return JSON. Learn more about template URLs at https://github.com/1egoman/biome/blob/master/resources/templateURL.md"); | ||
return; | ||
} | ||
} | ||
function asyncCheck(key, value) { | ||
return fs.readFile(key).then(value); | ||
} | ||
export default function init(project, template) { | ||
let biomeFile = path.join(process.cwd(), biomeLocalName()); | ||
return Promise.any(findFirstMatch); | ||
} | ||
// step 0: Read the Biomefile and see if there's a template | ||
return fs.readJSON(biomeFile).catch(error => { | ||
return {}; // No biomefile | ||
}).then(biomefile => { | ||
project = biomefile.project || project; | ||
export default function init(project) { | ||
// step 0: determine project name | ||
if (typeof project !== "string") { | ||
return getProjectName().then(init); | ||
} else if (project.trim().length === 0) { | ||
console.error("No project name was specified or found. Please specify one manually."); | ||
} else { | ||
if (project.length === 0) { | ||
console.error("Project names need to be at least 1 character long."); | ||
throw new Error("Project names need to be at least 1 character long."); | ||
} | ||
if (template || typeof biomefile.template === "string") { | ||
// a template url | ||
return request(template || biomefile.template).then(JSON.parse).then(fetchTemplate); | ||
} else if (biomefile.template) { | ||
return fetchTemplate(biomefile.template); | ||
} else { | ||
// no template | ||
return Promise.resolve({}); | ||
} | ||
}).then(data => { | ||
// step 1: write stuff to local Biomefile | ||
let biomeFile = path.join(process.cwd(), biomeLocalName()); | ||
return fs.writeFile( | ||
biomeFile, | ||
JSON.stringify({ | ||
name: project, | ||
}, null, 2) | ||
).then(file => { | ||
// step 2: write creds file in the ~/.biome folder | ||
let biomeProject = path.join(biomeFolderName(), `${project}.json`); | ||
return fs.writeFile(biomeProject, "{}").then(f => project); | ||
}); | ||
} | ||
return Promise.all([data, | ||
fs.writeFile( | ||
biomeFile, | ||
JSON.stringify({ | ||
name: project, | ||
template, | ||
}, null, 2) | ||
), | ||
]); | ||
}).then(([data, file]) => { | ||
// step 2: write creds file in the ~/.biome folder | ||
let biomeProject = path.join(biomeFolderName(), `${project}.json`); | ||
return fs.writeFile(biomeProject, JSON.stringify(data, null, 2)); | ||
}).then(f => project); | ||
} |
218870
1094
99
9
+ Addedinquirer-promise@0.0.3
+ Addedrequest-promise@^3.0.0
+ Addedajv@6.12.6(transitive)
+ Addedansi-escapes@1.4.0(transitive)
+ Addedasn1@0.2.6(transitive)
+ Addedassert-plus@1.0.0(transitive)
+ Addedasynckit@0.4.0(transitive)
+ Addedaws-sign2@0.7.0(transitive)
+ Addedaws4@1.13.2(transitive)
+ Addedbcrypt-pbkdf@1.0.2(transitive)
+ Addedcaseless@0.12.0(transitive)
+ Addedcli-cursor@1.0.2(transitive)
+ Addedcli-width@1.1.1(transitive)
+ Addedcode-point-at@1.1.0(transitive)
+ Addedcombined-stream@1.0.8(transitive)
+ Addedcore-js@2.6.12(transitive)
+ Addedcore-util-is@1.0.2(transitive)
+ Addeddashdash@1.14.1(transitive)
+ Addeddelayed-stream@1.0.0(transitive)
+ Addedearlgrey-runtime@0.1.2(transitive)
+ Addedecc-jsbn@0.1.2(transitive)
+ Addedexit-hook@1.1.1(transitive)
+ Addedextend@3.0.2(transitive)
+ Addedextsprintf@1.3.0(transitive)
+ Addedfast-deep-equal@3.1.3(transitive)
+ Addedfast-json-stable-stringify@2.1.0(transitive)
+ Addedfigures@1.7.0(transitive)
+ Addedforever-agent@0.6.1(transitive)
+ Addedform-data@2.3.3(transitive)
+ Addedgetpass@0.1.7(transitive)
+ Addedhar-schema@2.0.0(transitive)
+ Addedhar-validator@5.1.5(transitive)
+ Addedhttp-signature@1.2.0(transitive)
+ Addedinquirer@0.11.4(transitive)
+ Addedinquirer-promise@0.0.3(transitive)
+ Addedis-fullwidth-code-point@1.0.0(transitive)
+ Addedis-typedarray@1.0.0(transitive)
+ Addedisstream@0.1.2(transitive)
+ Addedjsbn@0.1.1(transitive)
+ Addedjson-schema@0.4.0(transitive)
+ Addedjson-schema-traverse@0.4.1(transitive)
+ Addedjson-stringify-safe@5.0.1(transitive)
+ Addedjsprim@1.4.2(transitive)
+ Addedkaiser@0.0.4(transitive)
+ Addedlodash@3.10.14.17.21(transitive)
+ Addedmime-db@1.52.0(transitive)
+ Addedmime-types@2.1.35(transitive)
+ Addedmute-stream@0.0.5(transitive)
+ Addednumber-is-nan@1.0.1(transitive)
+ Addedoauth-sign@0.9.0(transitive)
+ Addedonetime@1.1.0(transitive)
+ Addedperformance-now@2.1.0(transitive)
+ Addedpsl@1.15.0(transitive)
+ Addedpunycode@2.3.1(transitive)
+ Addedqs@6.5.3(transitive)
+ Addedreadline2@1.0.1(transitive)
+ Addedregenerator-runtime@0.9.6(transitive)
+ Addedrequest@2.88.2(transitive)
+ Addedrequest-promise@3.0.0(transitive)
+ Addedrestore-cursor@1.0.1(transitive)
+ Addedrun-async@0.1.0(transitive)
+ Addedrx-lite@3.1.2(transitive)
+ Addedsafe-buffer@5.2.1(transitive)
+ Addedsafer-buffer@2.1.2(transitive)
+ Addedsshpk@1.18.0(transitive)
+ Addedstring-width@1.0.2(transitive)
+ Addedthrough@2.3.8(transitive)
+ Addedtough-cookie@2.5.0(transitive)
+ Addedtunnel-agent@0.6.0(transitive)
+ Addedtweetnacl@0.14.5(transitive)
+ Addeduri-js@4.4.1(transitive)
+ Addeduuid@3.4.0(transitive)
+ Addedverror@1.10.0(transitive)