|
| 1 | +#!/usr/bin/env node |
| 2 | + |
| 3 | +var Khaos = require('khaos') |
| 4 | +var metadata = require('read-metadata') |
| 5 | +var download = require('download-github-repo') |
| 6 | +var logger = require('../lib/logger') |
| 7 | +var program = require('commander') |
| 8 | +var exists = require('fs').existsSync |
| 9 | +var join = require('path').join |
| 10 | +var resolve = require('path').resolve |
| 11 | +var rm = require('rimraf').sync |
| 12 | +var uid = require('uid') |
| 13 | + |
| 14 | +/** |
| 15 | + * Usage. |
| 16 | + */ |
| 17 | + |
| 18 | +program |
| 19 | + .usage('<template> <project-name>') |
| 20 | + |
| 21 | +/** |
| 22 | + * Help. |
| 23 | + */ |
| 24 | + |
| 25 | +program.on('--help', function () { |
| 26 | + console.log(' Examples:') |
| 27 | + console.log() |
| 28 | + console.log(' # create a new project with an official template') |
| 29 | + console.log(' $ vue init webpack my-project') |
| 30 | + console.log() |
| 31 | + console.log(' # create a new project straight from a github template') |
| 32 | + console.log(' $ vue init username/repo my-project') |
| 33 | + console.log() |
| 34 | +}) |
| 35 | + |
| 36 | +/** |
| 37 | + * Help. |
| 38 | + */ |
| 39 | + |
| 40 | +program.parse(process.argv) |
| 41 | +if (program.args.length < 2) return program.help() |
| 42 | + |
| 43 | +/** |
| 44 | + * Padding. |
| 45 | + */ |
| 46 | + |
| 47 | +console.log() |
| 48 | +process.on('exit', function () { |
| 49 | + console.log() |
| 50 | +}) |
| 51 | + |
| 52 | +/** |
| 53 | + * Settings. |
| 54 | + */ |
| 55 | + |
| 56 | +var template = program.args[0] |
| 57 | +var name = program.args[1] |
| 58 | +var dir = program.directory |
| 59 | +var to = resolve(name) |
| 60 | +if (exists(to)) logger.fatal('"%s" already exists.', name) |
| 61 | + |
| 62 | +/** |
| 63 | + * Detect official template. |
| 64 | + */ |
| 65 | + |
| 66 | +if (!~template.indexOf('/')) { |
| 67 | + template = 'vuejs-templates/' + template |
| 68 | +} |
| 69 | + |
| 70 | +/** |
| 71 | + * Download and generate. |
| 72 | + */ |
| 73 | + |
| 74 | +var tmp = '/tmp/vue-template-' + uid() |
| 75 | +download(template, tmp, function (err) { |
| 76 | + if (err) logger.fatal(err) |
| 77 | + generate(tmp, to, function (err) { |
| 78 | + if (err) logger.fatal(err) |
| 79 | + rm(tmp) |
| 80 | + console.log() |
| 81 | + logger.success('Generated "%s".', name) |
| 82 | + }) |
| 83 | +}) |
| 84 | + |
| 85 | +/** |
| 86 | + * Generate a template given a `src` and `dest`. |
| 87 | + * |
| 88 | + * @param {String} src |
| 89 | + * @param {String} dest |
| 90 | + * @param {Function} fn |
| 91 | + */ |
| 92 | + |
| 93 | +function generate (src, dest, fn) { |
| 94 | + var template = join(src, 'template') |
| 95 | + var khaos = new Khaos(template) |
| 96 | + var opts = options(src) |
| 97 | + |
| 98 | + // work around prompt-for bug... |
| 99 | + // which ignores default value for strings |
| 100 | + // otherwise we can just use khaos.generate :( |
| 101 | + khaos.schema(opts.schema) |
| 102 | + khaos.read(function (err, files) { |
| 103 | + if (err) logger.fatal(err) |
| 104 | + khaos.parse(files, function (err, schema) { |
| 105 | + if (err) logger.fatal(err) |
| 106 | + khaos.prompt(schema, function (err, answers) { |
| 107 | + if (err) logger.fatal(err) |
| 108 | + if (!answers.name) answers.name = name |
| 109 | + khaos.write(dest, files, answers, fn) |
| 110 | + }) |
| 111 | + }) |
| 112 | + }) |
| 113 | +} |
| 114 | + |
| 115 | +/** |
| 116 | + * Read prompts metadata. |
| 117 | + * |
| 118 | + * @param {String} dir |
| 119 | + * @return {Object} |
| 120 | + */ |
| 121 | + |
| 122 | +function options (dir) { |
| 123 | + var file = join(dir, 'meta.json') |
| 124 | + var opts = exists(file) |
| 125 | + ? metadata.sync(file) |
| 126 | + : {} |
| 127 | + defaultName(opts) |
| 128 | + return opts |
| 129 | +} |
| 130 | + |
| 131 | +/** |
| 132 | + * Automatically infer the default project name |
| 133 | + * |
| 134 | + * @param {Object} opts |
| 135 | + */ |
| 136 | + |
| 137 | +function defaultName (opts) { |
| 138 | + var schema = opts.schema || (opts.schema = {}) |
| 139 | + if (!schema.name || typeof schema.name !== 'object') { |
| 140 | + schema.name = { |
| 141 | + 'type': 'string', |
| 142 | + 'default': name |
| 143 | + } |
| 144 | + } else { |
| 145 | + schema.name['default'] = name |
| 146 | + } |
| 147 | +} |
0 commit comments