/* * grunt-init-amber * https://amber-lang.net/ * * Copyright (c) 2013 Manfred Kroehnert, contributors * Licensed under the MIT license. */ 'use strict'; // Basic template description. exports.description = 'Create a web application based on Amber Smalltalk.'; // Template-specific notes to be displayed before question prompts. exports.notes = ' _Project title_ should be a human-readable title.'; // Template-specific notes to be displayed after question prompts. exports.after = 'You need to have these installed globally via npm:' + ' _@ambers/cli_; _grunt-cli_; _bower_.' + ' Now, install project dependencies with _bower install_,' + ' tool dependencies with _npm install_ and recompile with _grunt_.' + ' If you are running _amber init_, these three tasks are going to be performed for you now.' + ' Afterwards, start the development server with _amber serve_.' + ' Your application is then accessible via _http://localhost:4000/_'; // Any existing file or directory matching this wildcard will cause a warning. exports.warnOn = '*'; // The actual init template. exports.template = function (grunt, init, done) { 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('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 Application or The Library doing The Thing.'), 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!' }, init.prompt('version'), init.prompt('repository'), init.prompt('homepage'), init.prompt('bugs'), init.prompt('author_url'), init.prompt('licenses', 'MIT') ], function (err, props) { // Files to copy (and process). var files = init.filesToCopy(props); // Add properly-named license files. init.addLicenseFiles(files, props.licenses); // Actually copy (and process) files. init.copyAndProcess(files, props, {noProcess: 'libs/**'}); // Clean up non-npm props. delete props.namespace; props.name = props.name.toLowerCase(); // A few additional properties. props.keywords = ['Amber', 'Smalltalk']; props.devDependencies = { "@ambers/sdk": "^0.10.6", "grunt": "1.0.1", "grunt-contrib-clean": "^1.1.0", "grunt-contrib-requirejs": "^1.0.0", "grunt-exec": "^2.0.0", "requirejs": "^2.1.15" }; props.node_version = '>=4.0.0'; props.scripts = { "test": "grunt test" }; // Generate package.json file, used by npm and grunt. init.writePackageJSON('package.json', props); // generate bower.json file grunt.file.write('bower.json', JSON.stringify({ "name": props.name, "description": props.description, "ignore": [ "**/.*", "node_modules", "bower_components", "/*.js", "/*.html", "test", "tests" ], "authors": [ { "name": props.author_name, "email": props.author_email } ], "homepage": props.homepage, "main": props.main, "keywords": props.keywords, "license": props.licenses, "private": false, "dependencies": { "amber": "^0.22.0", "amber-compat-es2015": "^0.1.5", "amber-contrib-jquery": "^0.4.1", "amber-contrib-web": "^0.5.1", "domite": "^0.7.1", "silk": "^0.3.1" }, "devDependencies": { "amber-contrib-legacy": "^0.6.1", "amber-ide-starter-dialog": "^0.1.0", "helios": "^0.9.1" } }, null, 2)); // All done! done(); }); };