template.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /*
  2. * grunt-init-amber
  3. * https://amber-lang.net/
  4. *
  5. * Copyright (c) 2013 Manfred Kroehnert, contributors
  6. * Licensed under the MIT license.
  7. */
  8. 'use strict';
  9. // Basic template description.
  10. exports.description = 'Create a web application based on Amber Smalltalk.';
  11. // Template-specific notes to be displayed before question prompts.
  12. exports.notes = ' _Project title_ should be a human-readable title.';
  13. // Template-specific notes to be displayed after question prompts.
  14. exports.after = 'You should now install project dependencies with _bower install_.' +
  15. ' Afterwards, start the development server with _./bower_components/amber/bin/amber serve_.' +
  16. ' Your application is then accessible via _http://localhost:4000/_';
  17. // Any existing file or directory matching this wildcard will cause a warning.
  18. exports.warnOn = '*';
  19. // The actual init template.
  20. exports.template = function(grunt, init, done) {
  21. var remembered = {};
  22. function rememberViaValidator(name) {
  23. var old = init.prompts[name].validator || function (line) {
  24. return true;
  25. };
  26. init.prompts[name].validator = old.length == 1 ? function (line) {
  27. remembered[name] = line;
  28. return old.call(this, line);
  29. } : function (line, next) {
  30. remembered[name] = line;
  31. return old.call(this, line, next);
  32. }; //apply would not work, .length is used to call it differently.
  33. }
  34. init.prompts.name.message= 'Name of the Amber application.';
  35. init.prompts.name.validator= function (line) { return /^[A-Z][A-Za-z0-9]*$/.test(line) };
  36. init.prompts.name.warning= 'Must be a valid class name: only alphanumeric and starting with an uppercase letter!';
  37. rememberViaValidator('author_email');
  38. rememberViaValidator('repository');
  39. rememberViaValidator('name');
  40. init.process({type: 'amber'}, [
  41. // Prompt for these values.
  42. init.prompt('name', 'AmberApplication'),
  43. init.prompt('title'),
  44. init.prompt('description', 'Amber Application.'),
  45. init.prompt('author_name'),
  46. init.prompt('author_email'),
  47. init.prompt('version'),
  48. init.prompt('repository'),
  49. {
  50. name: 'namespace',
  51. message: 'Namespace of the new Amber package.',
  52. altDefault: function(value, data, done) {
  53. var mail = remembered.author_email || "none";
  54. var repo = remembered.repository || "none";
  55. var match = repo.match(/:\/\/([^/]*)\/((.*)\/)?/);
  56. var source = match && match[1] ? match[1].split(/\W/).reverse().concat(match[3] ? match[3].split(/\W/) : [])
  57. : mail !== "none" ? mail.split(/\W/).reverse()
  58. : ('st' + Math.random().toString(32)).split(/\W/);
  59. value = (source.join('-') + '-' + remembered.name).toLowerCase();
  60. done(null, value);
  61. },
  62. validator: /^[a-z][a-z0-9\-]*$/,
  63. warning: 'Only lowercase letters, numbers, and - are allowed in namespaces!'
  64. },
  65. init.prompt('author_url'),
  66. init.prompt('homepage'),
  67. init.prompt('bugs'),
  68. init.prompt('licenses', 'MIT')
  69. ], function(err, props) {
  70. // Files to copy (and process).
  71. var files = init.filesToCopy(props);
  72. // Add properly-named license files.
  73. init.addLicenseFiles(files, props.licenses);
  74. // Actually copy (and process) files.
  75. init.copyAndProcess(files, props, {noProcess: 'libs/**'});
  76. // Clean up non-npm props.
  77. delete props.namespace;
  78. // A few additional properties.
  79. props.keywords = ['Amber', 'Smalltalk'];
  80. props.devDependencies = {
  81. "grunt": "~0.4.0",
  82. "grunt-execute": "~0.2.1",
  83. "grunt-contrib-clean": "~0.5.0",
  84. "amber-dev": "0.0.3"
  85. };
  86. props.node_version = '>= 0.8.0';
  87. props.scripts = {
  88. "test": "grunt test"
  89. };
  90. // Generate package.json file, used by npm and grunt.
  91. init.writePackageJSON('package.json', props);
  92. // generate bower.json file
  93. grunt.file.write('bower.json', JSON.stringify({
  94. "name": props.name,
  95. "description": props.description,
  96. "version": props.version,
  97. "ignore": [
  98. "**/.*",
  99. "node_modules",
  100. "bower_components",
  101. "/test_runner.js",
  102. "test",
  103. "tests"
  104. ],
  105. "authors": [
  106. {
  107. "name": props.author_name,
  108. "email": props.author_email
  109. }
  110. ],
  111. "homepage": props.homepage,
  112. "main": props.main,
  113. "keywords": props.keywords,
  114. "license": props.licenses,
  115. "private": false,
  116. "dependencies": {
  117. "amber": "~0.12.4"
  118. }
  119. }, null, 4));
  120. // All done!
  121. done();
  122. });
  123. };