|
shell = require 'shelljs' |
|
path = require 'path' |
|
jade = require 'jade' |
|
connect_assets = require 'connect-assets' |
|
S = require 'string' |
|
|
|
|
|
app_root = __dirname |
|
exports.static_path = static_path = path.join app_root, 'client' |
|
js_dir = path.join static_path, 'javascripts' |
|
|
|
sassCompiler = |
|
optionsMap: { } |
|
compileSync: (sourcePath, source) -> |
|
if sourcePath.indexOf static_path == 0 |
|
sourcePath = sourcePath[static_path.length + 1..] |
|
cmd = "cd \"#{static_path}\" && sass --compass -r susy \"#{sourcePath}\"" |
|
shell.exec(cmd, silent: true).output |
|
|
|
cjadeCompiler = |
|
optionsMap: { } |
|
compileSync: (sourcePath, source) -> |
|
filepath = path.normalize(sourcePath).replace js_dir, '' |
|
if filepath[0] == path.sep |
|
filepath = filepath[1..] |
|
filepath = filepath.replace /\\/g, '\/' |
|
filepath = filepath.substring 0, filepath.lastIndexOf '.' |
|
preamble = """ |
|
window.JST = window.JST || {}; |
|
JST['#{filepath}'] = function |
|
""" |
|
compiled = '' + jade.compile(source, client: true, filename: sourcePath, pretty: true, debug: false) |
|
compiled.replace('function anonymous', preamble) + ";" |
|
|
|
assets_context = {} |
|
exports.connect_assets_middleware = connect_assets helperContext: assets_context, src: 'client', jsCompilers: cjade: cjadeCompiler |
|
|
|
assets_context.css.root = exports.stylesheetsDir = 'stylesheets' |
|
assets_context.js.root = exports.javascriptsDir = 'javascripts' |
|
connect_assets.cssCompilers.sass = sassCompiler |
|
|
|
|
|
IS_PROD = process.env.NODE_ENV == 'production' |
|
|
|
if IS_PROD |
|
compiled_assets_mapping = JSON.parse process.env.COMPILED_ASSETS |
|
STATIC_HOST = require('./config').STATIC_HOST |
|
|
|
normalize_route = (route, type) -> |
|
Sroute = S(route) |
|
if route.match '^((https?:)?//)|(www\.)' |
|
return [route] |
|
|
|
if type == 'js' |
|
prefix = exports.javascriptsDir |
|
ext = '.js' |
|
else |
|
prefix = exports.stylesheetsDir |
|
ext = '.css' |
|
route = prefix + '/' + route |
|
if not Sroute.endsWith(ext) |
|
route += ext |
|
|
|
if compiled_assets_mapping[route] |
|
routes = compiled_assets_mapping[route] |
|
else |
|
routes = ['/' + route] |
|
("#{STATIC_HOST}#{r}" for r in routes) |
|
|
|
global.js = (route, routeOptions) -> |
|
if IS_PROD |
|
routes = normalize_route route, 'js' |
|
loadingKeyword = '' |
|
if routeOptions? |
|
loadingKeyword = 'async ' if routeOptions.async? |
|
loadingKeyword = 'defer ' if routeOptions.defer? |
|
("<script #{loadingKeyword}src='#{r}'></script>" for r in routes).join '\n' |
|
else |
|
assets_context.js.apply null, arguments |
|
|
|
global.css = (route) -> |
|
if IS_PROD |
|
routes = normalize_route route, 'css' |
|
("<link rel='stylesheet' href='#{r}'>" for r in routes).join '\n' |
|
else |
|
assets_context.css.apply null, arguments |
|
|
|
exports.assets_instance = connect_assets.instance |