UNPKG

5.41 kBPlain TextView Raw
1#!/usr/bin/env node
2
3var path = require('path');
4var cli = require('commander');
5var fs = require('fs');
6
7var Helpers = require('../lib/gen/helpers');
8var Folder = require('../lib/gen/folder');
9var Renderer = require('../lib/gen/renderer');
10var exec = Helpers.exec;
11
12cli
13 .version(require('../package').version);
14
15cli
16 .usage('PATH [options]')
17 .option('--no-db', 'Disable models and database')
18 .option('--no-assets', 'Disable asset pipeline')
19 .option('--no-sessions', 'Disable sessions support')
20 .option('--no-tests', 'Disable tests')
21 .option('--no-tasks', 'Disable command-line tasks')
22 .option('--no-helpers', 'Disable helpers')
23 .option('--no-public', 'Disable public folder')
24 .option('--bare', 'Disable everything')
25 .on('--help', function() {
26 console.log(' start a project:');
27 console.log(' $ expo myproject');
28 console.log('');
29 console.log(" see Expo's website for more info.");
30 console.log(' http://ricostacruz.com/expo/');
31 });
32 cli.parse(process.argv);
33
34var project = cli.args.shift();
35
36if (project) spawn(project);
37else cli.help();
38
39function spawn(project) {
40 var options = {
41 project: project,
42 db: !cli.noDb && !cli.bare,
43 assets: !cli.noAssets && !cli.bare,
44 sessions: !cli.noSessions && !cli.bare,
45 tests: !cli.noTests && !cli.bare,
46 tasks: !cli.noTasks && !cli.bare,
47 helpers: !cli.noHelpers && !cli.bare,
48 public: !cli.noPublic && !cli.bare
49 };
50
51 var render = Renderer(options);
52 var p = project;
53
54 var f = new Folder(p);
55
56 f.banner(p, 'your project');
57 f.mkdir('');
58 f.write('Readme.md', render.readme('Readme.md'));
59 f.write('run', render.text('run'), 0755);
60 f.write('app.js', render.appjs('app.js'));
61 f.write('.gitignore', render.text('gitignore'));
62 f.write('Procfile', render.text('Procfile'));
63 f.write('package.json', render.package('package.json'));
64
65 f.mkdir('app');
66
67 if (options.assets) {
68 f.banner('assets', 'where your images, CSS and JS files live', 32);
69 f.mkdir('assets');
70 f.mkdir('assets/css');
71 f.write('assets/css/application.styl', render.text('assets.application.styl'));
72 f.mkdir('assets/js');
73 f.write('assets/js/application.js', render.js('assets.application.js'));
74 f.gkeep('assets/img');
75 }
76
77 f.banner('initializers', 'code that initializes the app environment', 33);
78 f.mkdir('app/initializers');
79 f.write('app/initializers/app.js', render.appjs('init.app.js'));
80
81 if (options.helpers) {
82 f.banner('helpers', 'functions available in your views', 34);
83 f.mkdir('app/helpers');
84 f.write('app/helpers/app_helper.js', render.js('helpers.app_helper.js'));
85 }
86
87 f.banner('routes', 'auto-loaded files that create URL routes');
88 f.mkdir('app/routes');
89 f.write('app/routes/home.js', render.js('routes.home.js'));
90
91 if (options.tasks) {
92 f.banner('tasks', 'command line tasks');
93 f.mkdir('app/tasks');
94 f.write('app/tasks/db.js', render.js('tasks.db.js'));
95 }
96
97 f.banner('views', 'template files');
98 f.mkdir('app/views');
99 f.write('app/views/index.jade', render.jade('views.index.jade'));
100 f.write('app/views/layout.jade', render.jade('views.layout.jade'));
101 f.mkdir('app/views/errors');
102 f.write('app/views/errors/404.jade', render.jade('views.404.jade'));
103 f.write('app/views/errors/500.jade', render.jade('views.500.jade'));
104
105 f.banner('config', 'yaml config files', 34);
106 f.mkdir('config');
107
108 if (options.db) {
109 f.write('config/database.yml', render.js('config.database.yml'));
110 f.write('config/database.yml.example', render.js('config.database.yml'));
111 }
112
113 options.sessions &&
114 f.write('config/secret_token.yml', render.secret());
115
116 options.assets &&
117 f.write('config/assets.yml', render.js('config.assets.yml'));
118
119 if (options.db) {
120 f.banner('db', 'development sqlite database');
121 f.gkeep('db');
122 }
123
124 f.banner('lib', 'models and code');
125
126 if (options.db) {
127 f.mkdir('lib');
128 f.mkdir('lib/models');
129 f.write('lib/models/sample.js', render.js('model.sample.js'));
130 } else {
131 f.gkeep('lib');
132 }
133
134 if (options.public) {
135 f.banner('public', 'static files go here');
136 f.mkdir('public');
137 f.write('public/robots.txt', render.text('robots.txt'));
138 }
139
140 if (options.tests) {
141 f.banner('test', 'tests, specs');
142 f.mkdir('test');
143 f.write('test/setup.js', render.js('test.setup.js'));
144 f.write('test/app_test.js', render.js('test.app_test.js'));
145 }
146
147 console.log('');
148 console.log(' install dependencies:');
149 console.log(' $ cd '+p);
150 console.log(' $ npm install && npm shrinkwrap');
151 console.log('');
152
153 cli.confirm('Do that now? [yn] ', function(go) {
154 if (go) {
155 var cmd = 'cd '+p+' && npm install && npm shrinkwrap';
156 exec(cmd, function() {
157 console.log('');
158 console.log(" let's begin!");
159 console.log(' $ cd '+p);
160 done();
161 });
162 } else {
163 done(0);
164 }
165
166 function done(err) {
167 if (options.db) {
168 console.log('');
169 console.log(' setup the datbaase:');
170 console.log(' $ $EDITOR config/database.yml');
171 console.log(' $ ./run db-create');
172 console.log(' $ ./run db-sync');
173 }
174 console.log('');
175 console.log(' run the app:');
176 console.log(' $ ./run server');
177 console.log('');
178 console.log(' more info:');
179 console.log(' $ ./run --help');
180 console.log('');
181 process.exit(err);
182 };
183 });
184}