1 | var fs = require('fs')
|
2 | var path = require('path')
|
3 | var mkdirp = require('mkdirp')
|
4 | var txain = require('txain')
|
5 | var colors = require('colors')
|
6 | var version = require('../package.json').version
|
7 | var _ = require('underscore')
|
8 | var utils = require('./utils')
|
9 |
|
10 | module.exports = function(yargs) {
|
11 | var argv = yargs.options({
|
12 | 'd': {
|
13 | alias: 'directory',
|
14 | default: process.cwd(),
|
15 | describe: 'Directory where the new project will be created',
|
16 | type: 'string',
|
17 | }
|
18 | })
|
19 | .wrap(yargs.terminalWidth())
|
20 | .help('help')
|
21 | .argv
|
22 |
|
23 | console.log('Creating project at %s', argv.directory)
|
24 | var projectName = path.basename(argv.directory)
|
25 |
|
26 | txain(function(callback) {
|
27 | mkdirp(argv.directory, callback)
|
28 | })
|
29 | .then(function(callback) {
|
30 |
|
31 | var configFile = path.join(argv.directory, 'config.json')
|
32 | var exists = fs.existsSync(configFile)
|
33 | if (exists) return callback()
|
34 | var data = {
|
35 | projectName: projectName,
|
36 | region: null,
|
37 | api: null,
|
38 | stage: null,
|
39 | }
|
40 | fs.writeFile(configFile, JSON.stringify(data, null, 2), 'utf8', callback)
|
41 | })
|
42 | .then(function(callback) {
|
43 | require('./cli-region').select(callback)
|
44 | })
|
45 | .then(function(callback) {
|
46 | require('./cli-api').select(callback)
|
47 | })
|
48 | .then(function(callback) {
|
49 | require('./cli-stage').select(callback)
|
50 | })
|
51 | .then(function(callback) {
|
52 | require('./cli-role').select(callback)
|
53 | })
|
54 | .then(function(callback) {
|
55 |
|
56 | var dirs = [
|
57 | 'web/assets',
|
58 | 'web/views',
|
59 | 'web/controllers',
|
60 | 'web/libs',
|
61 | 'test',
|
62 | ]
|
63 | dirs = dirs.map(function(dir) {
|
64 | return path.join(argv.directory, dir)
|
65 | })
|
66 | txain(dirs).each(mkdirp).end(callback)
|
67 | })
|
68 | .then(function(callback) {
|
69 |
|
70 | var routesFile = path.join(argv.directory, 'web/controllers/routes.json')
|
71 | var exists = fs.existsSync(routesFile)
|
72 | if (exists) return callback()
|
73 | var data = [
|
74 | {
|
75 | 'method': 'GET',
|
76 | 'path': '/',
|
77 | 'function': 'home',
|
78 | 'handler': 'run',
|
79 | }
|
80 | ]
|
81 | fs.writeFile(routesFile, JSON.stringify(data, null, 2), 'utf8', callback)
|
82 | })
|
83 | .then(function(callback) {
|
84 |
|
85 | var controllerFile = path.join(argv.directory, 'web/controllers/home.js')
|
86 | var exists = fs.existsSync(controllerFile)
|
87 | if (exists) return callback()
|
88 | var code = `
|
89 | exports.run = function(req, res, event, context) {
|
90 | res.send('Hello world')
|
91 | }
|
92 | `
|
93 | fs.writeFile(controllerFile, code, 'utf8', callback)
|
94 | })
|
95 | .then(function(callback) {
|
96 | var packageJson = path.join(argv.directory, 'package.json')
|
97 | var exists = fs.existsSync(packageJson)
|
98 | if (exists) return callback()
|
99 |
|
100 | var data = {
|
101 | private: true,
|
102 | name: projectName,
|
103 | version: '1.0.0',
|
104 | description: 'Node.js app made with backbeam-lambda',
|
105 | scripts: {
|
106 | start: 'node app',
|
107 | test: 'NODE_ENV=test mocha --bail --reporter spec test/',
|
108 | },
|
109 | author: {
|
110 | name: process.env.USER || '',
|
111 | },
|
112 | license: 'ISC',
|
113 | dependencies: {
|
114 | 'aws-sdk': '2.2.3',
|
115 | },
|
116 | devDependencies: {
|
117 | 'mocha': '^1.21.4',
|
118 | },
|
119 | keywords: ['backbeam'],
|
120 | engines: {
|
121 | node : '0.10.36',
|
122 | }
|
123 | }
|
124 | fs.writeFile(packageJson, JSON.stringify(data, null, 2), 'utf8', callback)
|
125 | })
|
126 | .then(function(callback) {
|
127 | var testUtils = path.join(argv.directory, 'test', 'test-utils.js')
|
128 | var exists = fs.existsSync(testUtils)
|
129 | if (exists) return callback()
|
130 |
|
131 | var code = `
|
132 | var txain = require('txain')
|
133 | var assert = require('assert')
|
134 |
|
135 | var request = require('supertest')(require('../app').app)
|
136 | exports.request = request
|
137 | `
|
138 | fs.writeFile(testUtils, code, 'utf8', callback)
|
139 | })
|
140 | .then(function(callback) {
|
141 | console.log('Project created. Run `npm install` to install dependencies')
|
142 | callback()
|
143 | })
|
144 | .end(utils.end)
|
145 | }
|
146 |
|
147 | if (module.id === require.main.id) {
|
148 | exports.run()
|
149 | }
|