require 'buildtools/tasks'
-MODULE_LINK = "node_modules/kraken"
+MODULE_LINK = 'node_modules/kraken'
+EXPRESS_DEP_MIME = 'node_modules/express/node_modules/mime'
+
task \link 'Link package source to node_modules so the name resolves correctly' ->
# Browser-based require doens't support relative requires, but things
# like `require 'kraken/utils'` rarely work in node without this hack.
say "Creating #{basename MODULE_LINK} symlink..."
fs.symlinkSync "../lib", MODULE_LINK
-task \server 'Start dev server' ->
+task \install 'Install project dependencies.' ->
+ <- sh 'npm install', {-verbose, +errors, +die}
+
+ # Remove express's copy of node-mime so we can add our own extensions
+ # and have it pick them up by default.
+ remove EXPRESS_DEP_MIME, true if exists EXPRESS_DEP_MIME
+
+task \setup 'Ensure project is set up for development.' ->
+ invoke \install
invoke \link
invoke \update_version
+
+
+task \server 'Start dev server' ->
+ invoke \setup
+ say ''
run 'lib/server/server.co'
task \build 'Build coco sources' ->
- invoke \link
- invoke \update_version
+ invoke \setup
coco <[ -bjc package.co ]>
task \test 'Rebuild test files and run tests' ->
- invoke \link
+ invoke \setup
tests = glob.globSync 'test/*.co'
tests.forEach (file) ->
js = file.replace '.co', '.js'
sh 'expresso'
task \clean 'Clean up environment and artifacts' ->
- remove [MODULE_LINK, 'var', 'tmp/dest'], true
+ remove [MODULE_LINK, EXPRESS_DEP_MIME, 'var', 'tmp/dest'], true
, coffee = require('coffee-script')
, server = require('./server')
;
+
+module.exports = exports = server;
+
{exec, spawn} = require 'child_process'
_ = require 'underscore'
+mime = require 'mime'
express = require 'express'
compiler = require 'connect-compiler-extras'
-stylus = require 'stylus'
-nib = require 'nib'
-
-
### Config
PORT = 8081
-CWD = process.cwd()
+CWD = process.cwd()
WWW = "#CWD/www"
VAR = "#CWD/var"
STATIC = "#CWD/static"
-NODE_ENV = process.env.NODE_ENV or 'development'
+NODE_ENV = process.env.NODE_ENV or 'development'
+LOG_LEVEL = if NODE_ENV is 'development' then 'INFO' else 'WARN'
VERSION = 'dev'
### Setup
-exports.app = app = express.createServer()
-app.listen PORT
+app = express.createServer()
-console.log "starting Kraken dev server (port=#PORT, env=#NODE_ENV, version=#VERSION)"
-console.log "========================================================================"
+app.start = ->
+ console.log "starting Kraken dev server (port=#PORT, env=#NODE_ENV, version=#VERSION)"
+ console.log "========================================================================"
+ app.listen PORT
app.configure ->
+ mime.define 'text/plain' : <[ jade co styl stylus ]>
+
app.set 'views', WWW
app.set 'view engine', 'jade'
app.set 'view options', {
STATIC : STATIC
} import require './view-helpers'
- # app.use express.logger()
+ app.use express.logger() if LOG_LEVEL is 'DEBUG'
app.use express.bodyParser()
app.use express.methodOverride()
- log_level = 'INFO'
-
app.use compiler do
src : WWW
dest : VAR
enabled : <[ stylus coco pyyaml ]>
options : stylus : { nib:true, include:"#WWW/css" }
- log_level : log_level
+ log_level : LOG_LEVEL
# wrap modules in commonjs closure for browser
app.use compiler do
src : [ VAR, WWW, STATIC ]
dest : VAR
options : commonjs : drop_path_parts:1
- log_level : log_level
+ log_level : LOG_LEVEL
app.use require('browserify') do
mount : '/vendor/browserify.js'
app.use express.static WWW
app.use express.static VAR
app.use express.static STATIC
+
app.use app.router
+
app.use express.errorHandler do
dumpExceptions : true
showStack : true
res.render req.params.page
+
+exports import {
+ CWD, WWW, VAR, STATIC,
+ PORT, LOG_LEVEL, NODE_ENV, VERSION,
+ app, module, require,
+}
+
+
+mainfile = path.basename require.main?.filename
+if require.main is module or 'Cokefile' is mainfile
+ app.start()
+
_ = require 'underscore'
_.str = require 'underscore.string'
_.mixin _.str.exports()
-_.mixin require 'kraken/underscore/underscore.array'
-_.mixin require 'kraken/underscore/underscore.object'
+
+_.mixin require 'kraken/underscore/array'
+_.mixin require 'kraken/underscore/object'
+_.mixin require 'kraken/underscore/string'
module.exports = exports = _
--- /dev/null
+_ = require 'underscore'
+_str = require 'underscore.string'
+
+_string = do
+
+ drop : (s, ...parts) ->
+ do
+ starting = s
+ for part of parts
+ s .= slice part.length if _str.startsWith s, part
+ s .= slice 0, s.length-part.length if _str.endsWith s, part
+ while s and s is not starting
+ s
+
+ ldrop : (s, ...parts) ->
+ do
+ starting = s
+ for part of parts
+ s .= slice part.length if _str.startsWith s, part
+ while s and s is not starting
+ s
+
+ rdrop : (s, ...parts) ->
+ do
+ starting = s
+ for part of parts
+ s .= slice 0, s.length-part.length if _str.endsWith s, part
+ while s and s is not starting
+ s
+
+
+_string import do
+ dropLeft : _string.ldrop
+ dropRight : _string.rdrop
+
+exports import _string