-
Notifications
You must be signed in to change notification settings - Fork 1
/
dojo.coffee
96 lines (95 loc) · 3.27 KB
/
dojo.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
connect = require 'connect'
fs = require 'fs'
fs.exists ?= require('path').exists
{exec} = require 'child_process'
module.exports = (options) ->
# Merge user options with default options
options ?= {}
options.method ?= 'release'
options.version ?= '1.8.3'
options.repository ?= '/tmp'
# Store HTTP request in case we need to download Dojo
loading = true
submodules = ['dojo', 'dijit', 'dojox', 'util']
mapping = {}
args = []
switch options.method
when 'release'
dir = options.repository + '/dojo-release-' + options.version
mapping =
dojo: dir + '/dojo'
dijit: dir + '/dijit'
dojox: dir + '/dojox'
util: dir + '/util'
fs.exists dir, (exists) ->
return finish() if exists
url = 'http://download.dojotoolkit.org/release-' + options.version + '/dojo-release-' + options.version + '.tar.gz'
tgz = options.repository + '/dojo-release-' + options.version + '.tar.gz'
cmd = 'curl ' + url + ' -o ' + tgz + ' && tar -xzf ' + tgz + ' -C ' + options.repository
exec cmd, (err, stdout, stderr) ->
finish(err)
when 'git'
count = 0
_finish = ->
return if ++count isnt 4
finish()
submodules.forEach (submodule) ->
revision = options[ submodule + '_revision' ] or 'HEAD'
dirname = 'git-' + submodule + '-' + revision
mapping[submodule] = options.repository + '/' + dirname
clone = (next) ->
fs.exists options.repository + '/' + dirname, (exists) ->
# Unrequired checkout if the directory named after the revision exists
return _finish() if exists and revision isnt 'HEAD'
return next() if exists
url = 'https://github.com/dojo/' + submodule + '.git'
cmds = []
cmds.push 'cd ' + options.repository
cmds.push 'git clone ' + url + ' ' + dirname
cmds = cmds.join ' && '
exec cmds, (err, stdout, stderr) ->
next(err)
checkout = (next) ->
cmds = []
cmds.push 'cd ' + options.repository + '/' + dirname
cmds.push 'git checkout ' + revision
cmds = cmds.join ' && '
exec cmds, (err, stdout, stderr) ->
next(err)
clone (err) ->
return finish err if err
checkout (err) ->
return finish err if err
_finish()
else
throw new Error 'Invalid method option "' + options.method + '" (expects "download")'
finish = (err) ->
throw err if err
loading = false
for arg in args
plugin.apply null, arg
plugin = (req, res, next) ->
return args.push arguments if loading
app = /^\/(\w+)\/.*/.exec req.url
if app and submodules.indexOf( app[1] ) isnt -1
app = app[1];
req.url = req.url.substr app.length + 1
### prior express 1.7
# Less
connect.compiler({ src: mapping[app], enable: ['less'] })(req, res, (err) ->
console.log err if err
# Static
sttc = connect.static mapping[app]
sttc req, res, ->
req.url = '/' + app + req.url
next()
)
###
# Static
sttc = connect.static mapping[app]
sttc req, res, ->
req.url = '/' + app + req.url
next()
else
next()
plugin