This repository has been archived by the owner on Jan 13, 2020. It is now read-only.
/
solder.js
125 lines (97 loc) · 3.48 KB
/
solder.js
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*global __dirname: true, exports: true, process: true, require: true */
/*jslint onevar: true, undef: true, nomen: true, eqeqeq: true, bitwise: true, newcap: true, immed: true */
require.paths.unshift(__dirname);
require.paths.unshift(__dirname + '../deps');
var fs = require('fs'),
path = require('path'),
cache = require('solder/cache'),
Component = require('solder/component'),
version = require('solder/version');
function Solderer (configFile) {
configFile = configFile || './solder-config.js';
try {
this.config = require(fs.realpathSync(configFile)).config;
} catch (e) {
throw new Error('Missing or invalid configuration file: ' + configFile);
}
this.cache = cache.create();
this.cdn = null;
this.componentCache = {};
}
Solderer.prototype.component = function (name) {
var css = [],
js = [],
self = this,
component, definition, requires;
if (this.componentCache[name]) {
return this.componentCache[name];
}
definition = this.config.components[name];
if (!definition) {
throw new Error('Component not found: ' + name);
}
requires = definition.requires || [];
// TODO: Resolve dependency chains and cyclical dependencies
requires.forEach(function (name) {
component = self.component(name);
css = css.concat(component.css);
js = js.concat(component.js);
});
css = css.concat(definition.css || []);
js = js.concat(definition.js || []);
component = this.componentCache[name] = Component.create(this, name,
{css: css, js: js, requires: requires}
);
return component;
};
Solderer.prototype.solder = function (options, callback) {
exports.solder(this, options, callback);
};
// -- Exports ----------------------------------------------------------------
exports.HOME_DIR = (process.env.SOLDER_HOME || process.env.HOME).replace(/^~/,
process.env.HOME) || process.cwd();
exports.urlPattern = /^\/solder\/([^\/]+)\.(css|js)(?:\?([^#]+))?/i;
exports.expressPattern = /^\/solder\/([^\/]+)\.(css|js)$/i;
exports.create = function (configFile) { return new Solderer(configFile); };
exports.createServer = function (config) {
return require('solder/server').start(config);
};
exports.expressRoute = function (server, config) {
config = config || {};
var pattern = config.urlPattern || exports.expressPattern,
solderer = config.solderer || exports.create(config.configFile);
server.get(pattern, function (req, res) {
var options = {
name : req.params[0],
type : req.params[1],
nominify: req.query.hasOwnProperty('no-minify') ||
req.query.hasOwnProperty('nominify')
};
solderer.solder(options, function(err, content, headers) {
if (err) {
console.log(err.message);
res.send('/* ' + err.message + ' */', 500);
}
else {
res.send(content, headers);
}
});
});
};
exports.solder = function(solderer, options, callback) {
var name = options.name,
type = options.type,
nominify = options.nominify || false,
action = nominify ? 'merge' : 'compress',
contentType = type === 'css' ? 'text/css' : 'application/javascript',
headers = {
'Content-Type': contentType + ';charset=utf-8',
'X-Solder' : version.toString()
};
solderer.component(name)[action](type, function (err, content) {
if (err) {
return callback(err);
}
callback(null, content, headers);
});
};