|
@@ -24,18 +24,64 @@ exports.warnOn = '*';
|
|
|
|
|
|
// The actual init template.
|
|
|
exports.template = function(grunt, init, done) {
|
|
|
- init.prompts.name.message= 'Name of the Amber application.';
|
|
|
- init.prompts.name.validator= /^[A-Z][A-Za-z0-9]*$/;
|
|
|
+ var remembered = {};
|
|
|
+ function rememberViaValidator(name) {
|
|
|
+ var oldValidator = init.prompts[name].validator || function (line) {
|
|
|
+ return true;
|
|
|
+ };
|
|
|
+
|
|
|
+ var newValidator;
|
|
|
+ switch (oldValidator.length) { //apply would not work, .length is used to call it differently
|
|
|
+ case 1:
|
|
|
+ newValidator = function (line) {
|
|
|
+ remembered[name] = line;
|
|
|
+ return oldValidator.call(this, line);
|
|
|
+ };
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ newValidator = function (line, next) {
|
|
|
+ remembered[name] = line;
|
|
|
+ return oldValidator.call(this, line, next);
|
|
|
+ };
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new Error("Panic: " + oldValidator.length + "-argument validator for " + name + ".");
|
|
|
+ }
|
|
|
+
|
|
|
+ init.prompts[name].validator = newValidator;
|
|
|
+ }
|
|
|
+
|
|
|
+ function capitalize(string) {
|
|
|
+ return string[0].toUpperCase() + string.slice(1).toLowerCase();
|
|
|
+ }
|
|
|
+
|
|
|
+ init.prompts.name.message= 'Main class and package of Amber application.\nProject name is derived by lowercasing this.';
|
|
|
+ init.prompts.name.validator= function (line) { return /^[A-Z][A-Za-z0-9]*$/.test(line) };
|
|
|
init.prompts.name.warning= 'Must be a valid class name: only alphanumeric and starting with an uppercase letter!';
|
|
|
+ rememberViaValidator('name');
|
|
|
+ rememberViaValidator('title');
|
|
|
|
|
|
init.process({type: 'amber'}, [
|
|
|
// Prompt for these values.
|
|
|
- init.prompt('name', 'AmberApplication'),
|
|
|
- init.prompt('title'),
|
|
|
- init.prompt('description', 'Amber Application.'),
|
|
|
+ init.prompt('title', 'Application or Library Title'),
|
|
|
+ init.prompt('name', function (value, data, done) {
|
|
|
+ var words = remembered.title.split(/\W/);
|
|
|
+ words = words.filter(function (x) {
|
|
|
+ return x && x !== "none";
|
|
|
+ }).map(capitalize);
|
|
|
+ value = words.length ? words.join('') : 'MysteriousApp';
|
|
|
+ done(null, value);
|
|
|
+ }),
|
|
|
+ init.prompt('description', 'The ACME Application.'),
|
|
|
+ init.prompt('author_name'),
|
|
|
+ init.prompt('author_email'),
|
|
|
{
|
|
|
name: 'namespace',
|
|
|
message: 'Namespace of the new Amber package.',
|
|
|
+ altDefault: function(value, data, done) {
|
|
|
+ value = 'amber-' + remembered.name.toLowerCase();
|
|
|
+ done(null, value);
|
|
|
+ },
|
|
|
validator: /^[a-z][a-z0-9/\-]*$/,
|
|
|
warning: 'Only lowercase letters, numbers, and - are allowed in namespaces!'
|
|
|
},
|
|
@@ -43,10 +89,8 @@ exports.template = function(grunt, init, done) {
|
|
|
init.prompt('repository'),
|
|
|
init.prompt('homepage'),
|
|
|
init.prompt('bugs'),
|
|
|
- init.prompt('licenses', 'MIT'),
|
|
|
- init.prompt('author_name'),
|
|
|
- init.prompt('author_email'),
|
|
|
- init.prompt('author_url')
|
|
|
+ init.prompt('author_url'),
|
|
|
+ init.prompt('licenses', 'MIT')
|
|
|
], function(err, props) {
|
|
|
// Files to copy (and process).
|
|
|
var files = init.filesToCopy(props);
|
|
@@ -60,6 +104,8 @@ exports.template = function(grunt, init, done) {
|
|
|
// Clean up non-npm props.
|
|
|
delete props.namespace;
|
|
|
|
|
|
+ props.name = props.name.toLowerCase();
|
|
|
+
|
|
|
// A few additional properties.
|
|
|
props.keywords = ['Amber', 'Smalltalk'];
|
|
|
props.devDependencies = {
|