Skip to content

Commit

Permalink
feat(cli): add option to specify project keywords
Browse files Browse the repository at this point in the history
  • Loading branch information
simplymichael committed Jan 11, 2021
1 parent bd4e99d commit d3d985b
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 13 deletions.
10 changes: 6 additions & 4 deletions locales/en/index.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@
"somethingWrong": "Something has gone wrong"
},
"questions": {
"projectDesc": "description",
"projectDesc": "Project description",
"projectKeywords": "Keywords, separated by spaces",
"createSrcDir": "Create source directory",
"specifySrcDir": "Specify your source directory",
"linter": "Linter",
"dependencies": "Dependencies, separated by spaces or commas: (dep@version dep2 dep3@version)",
"devDependencies": "Dev dependencies, separated by spaces or commas: (dep@version dep2 dep3@version)",
"dependencies": "Dependencies, separated by spaces: (dep@version dep2 dep3@version)",
"devDependencies": "Dev dependencies, separated by spaces: (dep@version dep2 dep3@version)",
"github": {
"configName": "Your name (git config user.name value)",
"username": "Github username",
Expand All @@ -43,6 +44,7 @@
"header": "Project",
"name": "name",
"description": "description",
"keywords": "keywords",
"directory": "directory",
"owner": "owner"
},
Expand All @@ -68,7 +70,7 @@
"dependencies": "Dependencies",
"devDependencies": "Dev dependencies",
"srcDir": "Source directory",
"review": "Please review selection",
"review": "Please review your selection",
"proceed": "Proceed?"
}
},
Expand Down
74 changes: 65 additions & 9 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ const currentYear = new Date().getFullYear();
const rootDir = path.resolve(__dirname, '..');
const templatesDir = `${rootDir}${SEP}src${SEP}templates`;
const log = console.log;
const WHITESPACE_REGEX = /\s+/;
const marker = {
error: (msg) => coloredMsg(msg, 'red'),
info: (msg) => coloredMsg(msg, 'cyan'),
Expand Down Expand Up @@ -50,6 +51,7 @@ async function setup(projectName, opts) {
let ownerName;
let ownerEmail;
let projectDesc;
let projectKeywords = [];
let dependencies = [];
let devDependencies = [
'commitizen',
Expand All @@ -59,7 +61,6 @@ async function setup(projectName, opts) {
'run-script-os',
'standard-version'
];
const splitRegex = /\s+,?\s+/;
const { directory: projectDir, locale, verbose } = opts;
const gitInitialized = fileExists(`${cwd}/.git`);
const npmInitialized = fileExists(`${cwd}/package.json`);
Expand All @@ -71,7 +72,9 @@ async function setup(projectName, opts) {
}

if(npmInitialized) {
projectDesc = requireWithoutCache(`${cwd}/package.json`).description.trim();
const pj = requireWithoutCache(`${cwd}/package.json`);
projectDesc = pj.description.trim();
projectKeywords = pj.keywords;
}

if(gitInitialized) {
Expand All @@ -94,6 +97,12 @@ async function setup(projectName, opts) {
message: `${translate('questions.projectDesc')}:`,
default: projectDesc
},
{
type: 'input',
name: 'keywords',
message: `${translate('questions.projectKeywords')}:`,
default: projectKeywords.length ? projectKeywords.sort().join(' ') : undefined
},
{
type: 'input',
name: 'name',
Expand Down Expand Up @@ -306,6 +315,15 @@ async function setup(projectName, opts) {
[translate('questions.choices.project.name')]: projectName,
[translate('questions.choices.project.directory')]: projectDir,
[translate('questions.choices.project.description')]: answers['description'],
[translate('questions.choices.project.keywords')]: (
Array.isArray(projectKeywords)
? projectKeywords.concat(answers['keywords'].split(WHITESPACE_REGEX))
: answers['keywords'].split(WHITESPACE_REGEX)
)
.filter(el => el.trim().length > 0)
.map(el => el.toLowerCase())
.map(el => customTrim(el, ','))
.sort(),
[translate('questions.choices.project.owner')]: answers['name'] || ownerName
},
[translate('questions.choices.github.header')]: {
Expand All @@ -327,13 +345,13 @@ async function setup(projectName, opts) {
.concat(answers['test-framework'].toLowerCase() === 'jasmine'
? ['jasmine'] : ['mocha', 'chai'])
.concat([answers['linter'].toLowerCase()])
.concat(answers['dev-dependencies'].split(splitRegex))
.filter(el => el.length > 0)
.concat(answers['dev-dependencies'].split(WHITESPACE_REGEX))
.filter(el => el.trim().length > 0)
.sort(),
};

if(answers['dependencies']) {
settings[translate('questions.choices.dependencies')] = answers['dependencies'].split(splitRegex);
settings[translate('questions.choices.dependencies')] = answers['dependencies'].split(WHITESPACE_REGEX);
}

if(answers['license'] !== translate('answers.unlicensed')) {
Expand Down Expand Up @@ -373,13 +391,14 @@ async function setup(projectName, opts) {
}

if(answers['dependencies']) {
const userDeps = answers['dependencies'].split(splitRegex);
const userDeps = answers['dependencies'].split(WHITESPACE_REGEX)
.filter(el => el.trim().length > 0);

dependencies = dependencies.concat(userDeps);
}

if(answers['dev-dependencies']) {
const userDevDeps = answers['dev-dependencies'].split(splitRegex);
const userDevDeps = answers['dev-dependencies'].split(WHITESPACE_REGEX);

devDependencies = devDependencies.concat(userDevDeps).sort();
}
Expand All @@ -392,7 +411,7 @@ async function setup(projectName, opts) {

devDependencies.push(answers['linter'].toLowerCase());

devDependencies = devDependencies.filter(el => el.length > 0);
devDependencies = devDependencies.filter(el => el.trim().length > 0);

// If the directory is not a git-directory, then initialize git
if(!gitInitialized) {
Expand All @@ -418,6 +437,7 @@ async function setup(projectName, opts) {
translate('setup.npm.initializing'))).start();
await npmInit({
description: answers['description'],
keywords: answers['keywords'],
license: getKeyByValue(licenses, answers['license']).toUpperCase(),
githubUrl: answers['gh-url']
});
Expand Down Expand Up @@ -450,6 +470,7 @@ async function setup(projectName, opts) {
const pjSpinner = ora(marker.info(translate('setup.npm.updating'))).start();
await writePackageJson({
description: answers['description'],
keywords: answers['keywords'],
license: getKeyByValue(licenses, answers['license']).toUpperCase(),
githubUrl: answers['gh-url'],
testFramework: testFramework,
Expand Down Expand Up @@ -560,13 +581,21 @@ function gitInit(opts) {
async function npmInit(opts) {
cp.execSync('npm init -y');

const { description, license, githubUrl } = opts;
const { description, keywords, license, githubUrl } = opts;
const packageJson = requireWithoutCache(`${cwd}${SEP}package.json`);

if(description && typeof description === 'string') {
packageJson.description = description;
}

if(keywords && typeof keywords === 'string') {
packageJson.keywords = keywords.split(WHITESPACE_REGEX)
.filter(el => el.trim().length > 0)
.map(el => el.toLowerCase())
.map(el => customTrim(el, ','))
.sort();
}

if(license && typeof license === 'string') {
packageJson.license = license;
}
Expand Down Expand Up @@ -664,6 +693,7 @@ async function install(deps, devDeps) {
async function writePackageJson(opts) {
const {
description,
keywords,
license,
githubUrl,
linter,
Expand Down Expand Up @@ -721,6 +751,26 @@ async function writePackageJson(opts) {
packageJson.description = description;
}

if(keywords) {
const currKeywords = packageJson.keywords
.slice()
.map(el => el.toLowerCase());
let newKeywords = keywords;
let updatedKeywords;

if(typeof newKeywords === 'string') {
newKeywords = newKeywords.split(WHITESPACE_REGEX)
.map(el => el.toLowerCase())
.map(el => customTrim(el, ','))
.filter(el => !currKeywords.includes(el));
updatedKeywords = currKeywords.concat(newKeywords);
}

packageJson.keywords = updatedKeywords
.filter(el => el.trim().length > 0)
.sort();
}

if(license && packageJson.license.trim().length === 0) {
packageJson.license = license;
}
Expand Down Expand Up @@ -906,6 +956,12 @@ function getKeyByValue(object, value) {
return Object.keys(object).find(key => object[key] === value);
}

function customTrim(str, char = ',') {
return str.trim().replace(
new RegExp(`(^${char})|(${char}$)`, 'gm'), ''
);
}

/**
* Executes a shell command and return it as a Promise.
* @param cmd {string} required
Expand Down

0 comments on commit d3d985b

Please sign in to comment.