-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
preprocessor.js
121 lines (99 loc) · 3.23 KB
/
preprocessor.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
var fs = require('graceful-fs')
var crypto = require('crypto')
var mm = require('minimatch')
var isBinaryFile = require('isbinaryfile')
var log = require('./logger').create('preprocess')
var sha1 = function (data) {
var hash = crypto.createHash('sha1')
hash.update(data)
return hash.digest('hex')
}
var createNextProcessor = function (preprocessors, file, done) {
return function nextPreprocessor (error, content) {
// normalize B-C
if (arguments.length === 1 && typeof error === 'string') {
content = error
error = null
}
if (error) {
file.content = null
file.contentPath = null
return done(error)
}
if (!preprocessors.length) {
file.contentPath = null
file.content = content
file.sha = sha1(content)
return done()
}
preprocessors.shift()(content, file, nextPreprocessor)
}
}
var createPreprocessor = function (config, basePath, injector) {
var alreadyDisplayedWarnings = {}
var instances = {}
var patterns = Object.keys(config)
var instantiatePreprocessor = function (name) {
if (alreadyDisplayedWarnings[name]) {
return
}
var p
try {
p = injector.get('preprocessor:' + name)
} catch (e) {
if (e.message.indexOf('No provider for "preprocessor:' + name + '"') !== -1) {
log.warn('Can not load "%s", it is not registered!\n ' +
'Perhaps you are missing some plugin?', name)
} else {
log.warn('Can not load "%s"!\n ' + e.stack, name)
}
alreadyDisplayedWarnings[name] = true
}
return p
}
patterns.forEach(function (pattern) {
config[pattern].forEach(instantiatePreprocessor)
})
return function preprocess (file, done) {
patterns = Object.keys(config)
return fs.readFile(file.originalPath, function (err, buffer) {
if (err) {
throw err
}
isBinaryFile(buffer, buffer.length, function (err, thisFileIsBinary) {
if (err) {
throw err
}
var preprocessors = []
var nextPreprocessor = createNextProcessor(preprocessors, file, done)
for (var i = 0; i < patterns.length; i++) {
if (mm(file.originalPath, patterns[i], {dot: true})) {
if (thisFileIsBinary) {
log.warn('Ignoring preprocessing (%s) %s because it is a binary file.',
config[patterns[i]].join(', '), file.originalPath)
} else {
config[patterns[i]].forEach(function (name) {
var p = instances[name]
if (p == null) {
p = instantiatePreprocessor(name)
}
if (p == null) {
if (!alreadyDisplayedWarnings[name]) {
alreadyDisplayedWarnings[name] = true
log.warn('Failed to instantiate preprocessor %s', name)
}
return
}
instances[name] = p
preprocessors.push(p)
})
}
}
}
nextPreprocessor(null, thisFileIsBinary ? buffer : buffer.toString())
})
})
}
}
createPreprocessor.$inject = ['config.preprocessors', 'config.basePath', 'injector']
exports.createPreprocessor = createPreprocessor