-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrave.js
104 lines (85 loc) · 2.29 KB
/
rave.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
/** @license MIT License (c) copyright 2014 original authors */
/** @author Brian Cavalier */
/** @author John Hann */
var parse = require('./parse');
var path = require('rave/lib/path');
var stylesheet = require('./stylesheet');
var es5Transform = require('rave/lib/es5Transform');
var defaultExtensions = [ 'css' ];
exports.create = create;
exports.translate = translate;
exports.instantiate = instantiate;
function create (context) {
// override extensions if supplied by dev
var env = context.env;
var extensions = (env.loadCss && env.loadCss.extensions)
|| defaultExtensions;
context.raveLoadCss = { seen: {} };
return {
load: [
{
extensions: extensions,
hooks: {
locate: locate,
translate: translate,
instantiate: instantiate
}
}
]
};
}
function locate (load) {
var metadata = load.metadata;
metadata.dontAddExt = true;
return false;
}
function translate (load) {
var source, context, loader, imported, imports;
source = '';
context = load.metadata.rave;
loader = context.loader;
imported = context.raveLoadCss.imported;
imports = load.metadata.raveLoadCssImports = [];
parse.find(load.source, captureUrl, captureImport, captureText);
return source;
function captureUrl (url, text) {
return captureText(parse.toUrl(translateUrl(url)));
}
function captureImport (url, text) {
var name = loader.normalize(url, load.name);
if (!name in imported) {
imports.push(name);
imported[name] = true;
}
return captureText('/* ' + text + ' */');
}
function captureText (text) {
return source += text;
}
function translateUrl (url) {
if (path.isAbsUrl(url)) return url;
var dir = path.splitDirAndFile(load.address)[0];
// TODO: joinPaths should reduce leading dots
return url.charAt(0) === '.'
? path.reduceLeadingDots(url, load.address)
: path.joinPaths(dir, url);
}
}
function instantiate (load) {
var imports;
imports = load.metadata.raveLoadCssImports.reduce(function (next, name) {
return next.then(function () {
return require.async(name);
});
}, Promise.resolve());
return imports.then(function () {
return stylesheet.create(load.source, true).then(function (sheet) {
return {
execute: function () {
sheet.disabled = false;
return new Module(es5Transform.toLoader(sheet));
}
}
});
});
}