-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathtransform.js
59 lines (52 loc) · 1.45 KB
/
transform.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
const Url = require('url')
const staticModule = require('static-module')
const path = require('path')
const quote = require('quote-stream')
const requireStyle = require('./')
const fromString = require('from2-string')
const PassThrough = require('readable-stream/passthrough')
const resolve = require('resolve')
const pump = require('pump')
const replace = require('replacestream')
const urify = require('urify')
const cssUrlRegex = require('./util/css-url-regex')
module.exports = requireStyleTransform
function requireStyleTransform (file, options) {
if (/\.json$/.test(file)) return new PassThrough()
if (!options) options = {}
var vars = options.vars || {
__filename: file,
__dirname: path.dirname(file),
require: { resolve: resolver }
}
var sm = staticModule(
{ 'require-style': styleTransformed },
{ vars: vars, varModules: { path } }
)
return sm
function styleTransformed (file) {
var css = ''
try {
css = requireStyle(file)
} catch (err) {
sm.emit('error', err)
}
return pump(
fromString(css),
replace(cssUrlRegex, (match, _, url) => {
console.log('match', match)
try {
const { pathname } = Url.parse(url)
// TODO async-ify
return `url(${urify(pathname)})`
} catch (err) {
return match
}
}),
quote()
)
}
function resolver (path) {
return resolve.sync(path, { basedir: path.dirname(file) })
}
}