project-starter-dan
Version:
A project scaffolding tool.
113 lines (100 loc) • 3.41 kB
JavaScript
const file = require('file');
const chalk = require('chalk');
const path = require('path');
const fs = require('fs-extra');
module.exports = {
getDirectories,
copyTemplate,
saveTemplate,
checkIsDir,
changeConfig
}
//polyfill for includes
if(!Array.prototype.includes) {
Array.prototype.includes = function(searchElement, fromIndex) {
'use strict';
fromIndex = fromIndex || 0;
return this.indexOf(searchElement, fromIndex) >= 0;
};
}
function getDirectories(srcpath) {
return fs.readdirSync(srcpath).filter((file) => {
return fs.statSync(path.join(srcpath, file)).isDirectory();
});
}
function copyTemplate(templateDir, destDir, scaffold, callback) {
const adjIgnores = (start) => {
// because npm changes all gitignores to npm ignores when publishing modules, change these back on copy
file.walkSync(start, (dirPath, dirs, files) => {
if(files.includes('.npmignore')) {
fs.renameSync(path.join(dirPath, '.npmignore'), path.join(dirPath, '.gitignore'));
}
})
};
const adjJson = (start, scaffold) => {
// because npm changes all gitignores to npm ignores when publishing modules, change these back on copy
file.walkSync(start, (dirPath, dirs, files) => {
if(files.includes('package.json')) {
const jsonData = require(path.join(dirPath, 'package.json'));
Object.keys(scaffold).forEach(key => {
if(key != 'moveon') jsonData[key] = scaffold[key];
});
fs.writeFileSync(path.join(dirPath, 'package.json'), JSON.stringify(jsonData, null, 2), 'utf8');
}
})
}
fs.copy(templateDir, destDir, (err) => {
if(err) {
callback && callback(err);
return console.error(err);
}
adjIgnores(destDir);
typeof scaffold === 'object' && adjJson(destDir, scaffold);
const name = path.basename(templateDir);
const dest = path.basename(destDir);
console.log(chalk.green(`Copied template ${chalk.white(name)} into ./${dest}.`));
callback && callback();
});
}
function saveTemplate(src, cwd, dirname, callback) {
const addTemplate = (dirPath) => {
const destName = path.basename(dirPath);
const templateDir = path.join(dirname, 'templates', destName);
const options = {
//filter out node_modules from the template.
filter: (name) => {
return path.basename(name) != 'node_modules';
}
};
fs.copy(dirPath, templateDir, options, (err) => {
if(err) {
callback && callback(err);
return console.error(err);
}
console.log(chalk.green(`Added template ${chalk.white(destName)} to usable templates.`));
callback && callback();
});
}
if(path.isAbsolute(src) && checkIsDir(src)) {
addTemplate(src);
} else if(checkIsDir(path.join(cwd, src))) {
addTemplate(path.join(cwd, src));
} else {
console.log(chalk.yellow('Error saving template. Make sure path exists and is a directory.'));
}
}
function checkIsDir(dirPath) {
try {
return fs.statSync(dirPath).isDirectory();
} catch (err) {
return false;
}
}
function changeConfig(configdir, oldConfig, newConfig) {
const newFile = oldConfig;
Object.keys(newConfig).forEach(key => {
newFile[key] = newConfig[key];
});
fs.writeFileSync(configdir, JSON.stringify(newFile, null, 2), 'utf8');
console.log(chalk.cyan('Updated dank.config.json with new configuration.'));
}