atm3-command-init
Advanced tools
Comparing version
255
index.js
@@ -11,136 +11,171 @@ var Promise = require('bluebird'); | ||
exports.name = 'init'; | ||
exports.usage = '<mobile|pc|conf>'; | ||
exports.desc = 'scaffold with specifed template mobile or pc or just update fis-conf.js file. default is mobile'; | ||
exports.usage = '<react|mobile|pc|conf>'; | ||
exports.desc = 'scaffold with specifed template react/mobile/pc or just update fis-conf.js file. default is react'; | ||
exports.register = function (commander) { | ||
commander | ||
.option('-u, --username <userName>', 'set username') | ||
.option('-p, --projectname <projectName>', 'set projectname') | ||
.action(function (template) { | ||
var args = [].slice.call(arguments); | ||
var options = args.pop(); | ||
commander | ||
.option('-u, --username <userName>', 'set username') | ||
.option('-p, --projectname <projectName>', 'set projectname') | ||
.action(function (template) { | ||
var args = [].slice.call(arguments); | ||
var options = args.pop(); | ||
var settings = { | ||
userName: options.username || '', | ||
projectName: options.projectname || '', | ||
template: args[0] || 'mobile' | ||
}; | ||
var settings = { | ||
userName: trim(options.username), | ||
projectName: trim(options.projectname), | ||
template: args[0] || 'mobile' | ||
}; | ||
// 根据 fis-conf.js 确定 root 目录 | ||
Promise.try(function () { | ||
if (!settings.root) { | ||
var findup = require('findup'); | ||
// 根据 fis-conf.js 确定 root 目录 | ||
Promise.try(function () { | ||
return findupAsync(settings); | ||
}).then(function () {// prompt | ||
return promptAsync(settings); | ||
}).then(function () { | ||
return settings.template == 'react' ? generateReactTemplateAsync(settings) : generateHtmlTemplateAsync(settings); | ||
}); | ||
return new Promise(function (resolve, reject) { | ||
var fup = findup(process.cwd(), 'fis-conf.js'); | ||
var dir = null; | ||
}); | ||
}; | ||
fup.on('found', function (found) { | ||
dir = found; | ||
fup.stop(); | ||
}); | ||
function findupAsync(settings) { | ||
if (!settings.root) { | ||
var findup = require('findup'); | ||
fup.on('error', reject); | ||
return new Promise(function (resolve, reject) { | ||
var fup = findup(process.cwd(), 'fis-conf.js'); | ||
var dir = null; | ||
fup.on('end', function () { | ||
resolve(dir); | ||
}); | ||
}).then(function (dir) { | ||
settings.root = dir || process.cwd(); | ||
}); | ||
} | ||
}).then(function () {// prompt | ||
fis.log.info('Current Dir: %s', settings.root); | ||
fup.on('found', function (found) { | ||
dir = found; | ||
fup.stop(); | ||
}); | ||
if (settings.userName && settings.projectName) { | ||
return settings; | ||
} else { | ||
var schema = []; | ||
var variables = { | ||
username: '', | ||
projectname: '' | ||
}; | ||
fup.on('error', reject); | ||
Object.keys(variables).forEach(function (key) { | ||
schema.push({ | ||
name: key, | ||
required: true, | ||
'default': variables[key] | ||
}); | ||
}); | ||
fup.on('end', function () { | ||
resolve(dir); | ||
}); | ||
}).then(function (dir) { | ||
settings.root = dir || process.cwd(); | ||
}); | ||
} else { | ||
return Promise.resolve(settings); | ||
} | ||
} | ||
if (schema.length) { | ||
var prompt = require('prompt'); | ||
prompt.start(); | ||
function promptAsync(settings) { | ||
return new Promise(function (resolve, reject) { | ||
fis.log.info('Current Dir: %s', settings.root); | ||
return new Promise(function (resolve, reject) { | ||
prompt.get(schema, function (error, result) { | ||
if (error) { | ||
return reject(error); | ||
} | ||
if (settings.userName && settings.projectName) { | ||
return resolve(settings); | ||
} else { | ||
var schema = []; | ||
var variables = { | ||
username: '', | ||
projectname: '' | ||
}; | ||
settings.userName = result.username; | ||
settings.projectName = result.projectname; | ||
resolve(settings); | ||
}); | ||
}); | ||
} | ||
Object.keys(variables).forEach(function (key) { | ||
schema.push({ | ||
name: key, | ||
required: true, | ||
'default': variables[key] | ||
}); | ||
}); | ||
return settings; | ||
} | ||
}).then(function () { | ||
fis.log.info("settings: ", settings); | ||
if (!settings.userName || !settings.projectName) { | ||
fis.log.error("userName and projectName is required!"); | ||
return process.exit(0); | ||
} | ||
var projectDir = settings.root + '/' + settings.projectName; | ||
if (path.basename(settings.root) === settings.projectName) { | ||
projectDir = settings.root; | ||
} | ||
if (!exists(projectDir)) { | ||
mkdir(projectDir); | ||
fis.log.info("mkdir %s [OK]", projectDir); | ||
} | ||
if (schema.length) { | ||
var prompt = require('prompt'); | ||
prompt.start(); | ||
copyFiles(projectDir, settings.userName, settings.projectName, settings.template); | ||
prompt.get(schema, function (error, result) { | ||
if (error) { | ||
return reject(error); | ||
} | ||
if (settings.template === 'mobile' || settings.template === 'pc') { | ||
var dirs = ['design', 'font', 'img', 'slice']; | ||
settings.userName = trim(result.username); | ||
settings.projectName = trim(result.projectname); | ||
resolve(settings); | ||
}); | ||
} else { | ||
return resolve(settings); | ||
} | ||
} | ||
}); | ||
} | ||
dirs.forEach(function (dir) { | ||
if (!exists(projectDir + '/' + dir)) | ||
mkdir(projectDir + '/' + dir); | ||
}); | ||
fis.log.info('mkdir empty dirs: ', dirs, " [OK]"); | ||
function generateHtmlTemplateAsync(settings) { | ||
return new Promise(function (resolve, reject) { | ||
var projectDir = prepareProjectDirHook(settings); | ||
generateFisConf(settings, projectDir); | ||
copyHtmlFiles(projectDir, settings.template); | ||
fis.log.info('init ' + settings.template + ' project done!'); | ||
} | ||
}); | ||
if (settings.template === 'mobile' || settings.template === 'pc') { | ||
var dirs = ['design', 'font', 'img', 'slice']; | ||
dirs.forEach(function (dir) { | ||
if (!exists(projectDir + '/' + dir)) mkdir(projectDir + '/' + dir); | ||
}); | ||
fis.log.info('mkdir empty dirs: ', dirs, " [OK]"); | ||
fis.log.info('init ' + settings.template + ' project done!'); | ||
} | ||
}); | ||
} | ||
}); | ||
}; | ||
function generateReactTemplateAsync(settings) { | ||
return new Promise(function (resolve, reject) { | ||
var projectDir = prepareProjectDirHook(settings); | ||
generateFisConf(settings, projectDir); | ||
fis.util.copy(__dirname + "/react-guide-template", projectDir, null, null, true); | ||
}); | ||
} | ||
function copyFiles(projectDir, username, projectName, template) { | ||
var isMobile = template !== 'pc'; | ||
function copyHtmlFiles(projectDir, template) { | ||
var isMobile = template !== 'pc'; | ||
var fisConf = fs.readFileSync(__dirname + '/templates/fis-conf.js', {encoding: 'utf8'}); | ||
fisConf = fisConf.replace('__userName__', username) | ||
.replace('__projectName__', projectName) | ||
.replace('__scale__', isMobile ? 0.5 : 1.0); | ||
if (template !== 'mobile' && template !== 'pc') { | ||
fis.log.info("just update fis-conf.js file!"); | ||
return false; | ||
} | ||
write(projectDir + "/fis-conf.js", fisConf, {encoding: 'utf8'}); | ||
fis.log.info("generate fis-conf.js OK"); | ||
if (isMobile) { | ||
fis.util.copy(__dirname + "/html-templates/mobile", projectDir, null, null, true); | ||
} else { | ||
fis.util.copy(__dirname + "/html-templates/pc", projectDir, null, null, true); | ||
} | ||
fis.log.info("copy html, css, js files OK!"); | ||
} | ||
if (template !== 'mobile' && template !== 'pc') { | ||
fis.log.info("just update fis-conf.js file!"); | ||
return false; | ||
} | ||
function prepareProjectDirHook(settings) { | ||
fis.log.info("settings: ", settings); | ||
if (!settings.userName || !settings.projectName) { | ||
fis.log.error("userName and projectName is required!"); | ||
return process.exit(0); | ||
} | ||
var projectDir = settings.root + '/' + settings.projectName; | ||
if (path.basename(settings.root) === settings.projectName) { | ||
projectDir = settings.root; | ||
} | ||
if (!exists(projectDir)) { | ||
mkdir(projectDir); | ||
fis.log.info("mkdir %s [OK]", projectDir); | ||
} | ||
return projectDir; | ||
} | ||
if (isMobile) { | ||
fis.util.copy(__dirname + "/templates/mobile", projectDir, null, null, true); | ||
} else { | ||
fis.util.copy(__dirname + "/templates/pc", projectDir, null, null, true); | ||
} | ||
fis.log.info("copy html, css, js files OK!"); | ||
function generateFisConf(settings, projectDir) { | ||
var isMobile = settings.template !== 'pc'; | ||
var confPath = settings.template == 'react' ? '/react-guide-template/fis-conf.js' : '/html-templates/fis-conf.js'; | ||
var fisConf = fs.readFileSync(__dirname + confPath, { encoding: 'utf8' }); | ||
fisConf = fisConf.replace(/__userName__/g, settings.userName) | ||
.replace(/__projectName__/g, settings.projectName) | ||
.replace(/__scale__/g, isMobile ? 0.5 : 1.0); | ||
write(projectDir + "/fis-conf.js", fisConf, { encoding: 'utf8' }); | ||
fis.log.info("generate fis-conf.js OK"); | ||
} | ||
function trim(str) { | ||
return (str || '').replace(/^\s+|\s+$/g, ""); | ||
} |
{ | ||
"name": "atm3-command-init", | ||
"version": "0.1.6", | ||
"version": "0.2.0", | ||
"description": "scaffold for atm", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
1149607
489.47%49
157.89%7925
1197.05%7
600%3
50%