Dev server now serves .jade, .co, .styl as text/plain (so browsers will display them...
authordsc <david.schoonover@gmail.com>
Mon, 20 Feb 2012 10:28:14 +0000 (02:28 -0800)
committerdsc <david.schoonover@gmail.com>
Mon, 20 Feb 2012 10:28:14 +0000 (02:28 -0800)
Cokefile
lib/server/index.js
lib/server/server.co
lib/underscore/array.co [moved from lib/underscore/underscore.array.co with 100% similarity]
lib/underscore/index.co
lib/underscore/object.co [moved from lib/underscore/underscore.object.co with 100% similarity]
lib/underscore/string.co [new file with mode: 0644]

index 5384371..a663a84 100644 (file)
--- a/Cokefile
+++ b/Cokefile
@@ -2,7 +2,9 @@ require 'buildtools'
 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.
@@ -11,18 +13,30 @@ task \link 'Link package source to node_modules so the name resolves correctly'
         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'
@@ -31,6 +45,6 @@ task \test 'Rebuild test files and run tests' ->
     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
 
 
index 0f3d9c4..37f5743 100755 (executable)
@@ -3,3 +3,6 @@ var coco = require('coco')
 ,   coffee = require('coffee-script')
 ,   server = require('./server')
 ;
+
+module.exports = exports = server;
+
index a7dc7ab..d21c21d 100755 (executable)
@@ -5,25 +5,23 @@ path     = require 'path'
 {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'
@@ -37,13 +35,16 @@ VERSION = stdout.trim!
 
 ### 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', {
@@ -55,18 +56,16 @@ app.configure ->
         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
@@ -74,7 +73,7 @@ app.configure ->
         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'
@@ -83,7 +82,9 @@ app.configure ->
     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
@@ -98,3 +99,15 @@ app.get '/:page', (req, res) ->
     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()
+
index 2f3bc94..5ea04c0 100644 (file)
@@ -1,8 +1,10 @@
 _     = 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 = _
 
diff --git a/lib/underscore/string.co b/lib/underscore/string.co
new file mode 100644 (file)
index 0000000..122d492
--- /dev/null
@@ -0,0 +1,36 @@
+_    = 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