1 | _ = require 'lodash'
|
2 | util = require 'util'
|
3 | path = require 'path'
|
4 | url = require 'url'
|
5 | GitHubApi = require 'github'
|
6 | latestVersion = require 'latest-version'
|
7 | yeoman = require 'yeoman-generator'
|
8 | packageJSON = require '../package.json'
|
9 |
|
10 | extractGeneratorName = (__, appname) ->
|
11 | _.kebabCase appname
|
12 |
|
13 | githubUserInfo = (name, cb) ->
|
14 | github = new GitHubApi version: '3.0.0'
|
15 | github.user.getFrom user: name, cb
|
16 |
|
17 | class OctobluServiceGenerator extends yeoman.generators.Base
|
18 | constructor: (args, options, config) ->
|
19 | super
|
20 | @currentYear = (new Date()).getFullYear()
|
21 | {@realname, @githubUrl} = options
|
22 | @on 'end', => @installDependencies skipInstall: options['skip-install']
|
23 | @pkg = JSON.parse @readFileAsString path.join __dirname, '../package.json'
|
24 |
|
25 | askFor: ->
|
26 |
|
27 | done = @async()
|
28 | latestVersion packageJSON.name
|
29 | .catch (error) =>
|
30 | console.error 'unable to retrieve latest version'
|
31 | console.error error.stack
|
32 | process.exit 1
|
33 | .then (version) =>
|
34 | console.log ''
|
35 | if version == packageJSON.version
|
36 | console.log "** using latest version #{version} **"
|
37 | console.log ''
|
38 | else
|
39 | console.log '** this generator version is outofdate **'
|
40 | console.log "** the installed version is #{packageJSON.version} **"
|
41 | console.log "** I need version #{version} **"
|
42 | console.log ''
|
43 |
|
44 | console.log @yeoman
|
45 | generatorName = extractGeneratorName @_, @appname
|
46 |
|
47 | prompts = [
|
48 | name: 'githubUser'
|
49 | message: 'Would you mind telling me your username on GitHub?'
|
50 | default: 'octoblu'
|
51 | ,
|
52 | name: 'generatorName'
|
53 | message: 'What\'s the base name of your generator?'
|
54 | default: generatorName
|
55 | ]
|
56 |
|
57 | @prompt prompts, (props) =>
|
58 | @githubUser = props.githubUser
|
59 | @generatorName = props.generatorName
|
60 | done()
|
61 |
|
62 | userInfo: ->
|
63 | return if @realname? and @githubUrl?
|
64 |
|
65 | done = @async()
|
66 |
|
67 | githubUserInfo @githubUser, (err, res) =>
|
68 | @realname = res.name
|
69 | @email = res.email
|
70 | @githubUrl = res.html_url
|
71 | done()
|
72 |
|
73 | projectfiles: ->
|
74 | appName = _.kebabCase @generatorName
|
75 | generatorNameWithoutService = @generatorName.replace(/\-service$/, '')
|
76 | fullFilePrefix = _.kebabCase @generatorName
|
77 | filePrefix = _.kebabCase generatorNameWithoutService
|
78 | instancePrefix = _.camelCase generatorNameWithoutService
|
79 | classPrefix = _.upperFirst instancePrefix
|
80 |
|
81 | serviceClass = "#{classPrefix}Service"
|
82 | serviceInstance = "#{instancePrefix}Service"
|
83 |
|
84 | controllerClass = "#{classPrefix}Controller"
|
85 | controllerInstance = "#{instancePrefix}Controller"
|
86 |
|
87 | context = {
|
88 | filePrefix
|
89 | serviceClass
|
90 | serviceInstance
|
91 | controllerClass
|
92 | controllerInstance
|
93 | appName
|
94 | fullFilePrefix
|
95 | @githubUrl
|
96 | @realname
|
97 | }
|
98 | @template "_package.json", "package.json", context
|
99 | @template "src/_server.coffee", "src/server.coffee", context
|
100 | @template "src/_router.coffee", "src/router.coffee", context
|
101 | @template "src/services/_service.coffee", "src/services/#{filePrefix}-service.coffee", context
|
102 | @template "src/controllers/_controller.coffee", "src/controllers/#{filePrefix}-controller.coffee", context
|
103 | @template "test/_mocha.opts", "test/mocha.opts", context
|
104 | @template "test/_test_helper.coffee", "test/test_helper.coffee", context
|
105 | @template "test/integration/_hello-spec.coffee", "test/integration/#{filePrefix}-hello-spec.coffee", context
|
106 | @template "_index.js", "index.js", context
|
107 | @template "_command.js", "command.js", context
|
108 | @template "_command.coffee", "command.coffee", context
|
109 | @template "_travis.yml", ".travis.yml", context
|
110 | @template "_Dockerfile", "Dockerfile", context
|
111 | @template "_dockerignore", ".dockerignore", context
|
112 | @template "README.md", "README.md", context
|
113 | @template "LICENSE", "LICENSE", context
|
114 |
|
115 | gitfiles: ->
|
116 | @copy '_gitignore', '.gitignore'
|
117 |
|
118 | app: ->
|
119 |
|
120 | templates: ->
|
121 |
|
122 | tests: ->
|
123 |
|
124 | module.exports = OctobluServiceGenerator
|