robusta
Version:
A tool for generating Backbone/CoffeeScript Node.js-based apps
142 lines (120 loc) • 3.69 kB
text/coffeescript
fs = require 'fs'
http = require 'http'
npm = require 'npm'
create_folders = ->
console.log '++ generating folders'
for folder in ['src', 'vendors', 'www', 'www/js']
console.log "++ #{folder}"
fs.mkdirSync folder, 0o777
create_toaster_file = ->
console.log '++ generating toaster.coffee'
toaster_file = '''
toast 'src'
# EXCLUDED FOLDERS (optional)
# exclude: ['folder/to/exclude', 'another/folder/to/exclude', ... ]
# => VENDORS (optional)
vendors: ['vendors/jquery.min.js', 'vendors/underscore-min.js', 'vendors/backbone-min.js' ]
# => OPTIONS (optional, default values listed)
# bare: false
# packaging: true
# expose: ''
minify: false
# => HTTPFOLDER (optional), RELEASE / DEBUG (required)
httpfolder: 'www'
release: 'www/js/app.js'
debug: 'www/js/app-debug.js'
'''
fs.writeFileSync 'toaster.coffee', toaster_file
create_package_file = ->
console.log '++ generating package.json'
fs.writeFileSync 'package.json', '''
{
"name": "your_app",
"version": "0.0.1",
"dependencies": {
"express": "2.5.0",
"coffee-script": "1.1.3"
}
}
'''
download_vendor_files = (when_complete) ->
console.log "++ downloading vendor files"
vendor_files = [
{ file: "underscore-min.js", host: "underscorejs.org" },
{ file: "backbone-min.js", host: "backbonejs.org" },
{ file: "jquery.min.js", host: "code.jquery.com"}
]
number_to_download = vendor_files.length
files_downloaded = 0
download_next_file = ->
item = vendor_files.pop()
return if !item
console.log "++ downloading #{item.host}/#{item.file} to vendors/#{item.file}"
http.get {host: item.host, port: 80, path: "/#{item.file}" }, (resp) ->
data = ""
resp.on 'data', (chunk) -> data += chunk
resp.on 'end', ->
fs.writeFileSync "vendors/#{item.file}", data
when_complete() if ++files_downloaded >= number_to_download
download_next_file()
download_next_file()
setup_backbone_structure = ->
console.log "++ setting up backbone structure"
for folder in ['app', 'app/collections', 'app/models', 'app/routers', 'app/templates', 'app/views']
console.log "++ src/#{folder}"
fs.mkdirSync "src/#{folder}", 0o777
console.log "++ src/app/app.coffee"
fs.writeFileSync "src/app/app.coffee", "# application startup code"
create_website = ->
console.log "++ creating website"
console.log "++ www/index.html"
fs.writeFileSync "www/index.html", '''
<!doctype html>
<html>
<head>
<script type="text/javascript" src="js/app.js"></script>
</head>
<body>
<h1>Hello, Robusta</h1>
</body>
</html>
'''
create_server = ->
console.log "++ creating server"
console.log "++ server.coffee"
fs.writeFileSync "server.coffee", '''
port = process.env.PORT || 3001
app = require('express').createServer()
serveUp = (res, filename) ->
console.log "REQUESTING: ", filename
res.sendfile "#{__dirname}/www#{filename}"
app.get "/", (req, res) -> serveUp res, "/index.html"
app.get "/*", (req, res) -> serveUp res, req.url
app.listen port
console.log "Server started on #{port}"
'''
build_js = ->
console.log "++ compiling javascript"
toaster = require 'coffee-toaster'
new toaster.Toaster '.', {'c': true}
finished = ->
console.log ''
console.log 'Your project has been created. Before you begin, you must install your packages:'
console.log ' npm install'
console.log ''
console.log 'To run the server:'
console.log ' robusta run'
console.log ''
console.log 'For more options:'
console.log ' robusta -h'
console.log ''
exports.initialize_project = ->
create_folders()
create_toaster_file()
create_package_file()
download_vendor_files ->
setup_backbone_structure()
create_website()
create_server()
build_js()
finished()