-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
126 lines (110 loc) · 2.68 KB
/
index.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
126
'use strict';
const escape = require('escape-string-regexp');
const filesystem = require('fs');
const lodash = require('lodash');
const logger = require('loggy');
class ReplaceCompiler {
constructor(config) {
this.config = lodash.defaultsDeep(
lodash.cloneDeep(config || {}),
{
plugins: {
replace: {}
}
}
);
}
getConfig() {
return lodash.defaultsDeep(
this.config.plugins.replace,
{
encoding: 'utf8',
log: true,
mappings: {
date: (new Date()).toISOString(),
timestamp: Math.floor(Date.now() / 1000)
},
paths: [],
replacePrefix: '{!',
replaceSuffix: '!}'
}
);
}
getPaths(files, config) {
return lodash
.chain(files)
.map(
(file) => {
return (file.destinationPath || file.destPath || file.path).replace(/\\/g, '/');
}
)
.filter(
(path) => {
return !config.paths.length || config.paths.indexOf(path) > -1;
}
)
.value();
}
replaceFile(path, config) {
return new Promise(
(resolve, reject) => {
filesystem.readFile(
path,
config.encoding,
(error, data) => {
if (error) {
return reject(error);
}
lodash.forIn(
config.mappings,
(value, key) => {
const searchString = escape(config.replacePrefix + key.toString() + config.replaceSuffix);
const searchExpression = new RegExp(searchString, 'g');
data = data.replace(searchExpression, value);
}
);
filesystem.writeFile(
path,
data,
config.encoding,
(error) => {
if (error) {
return reject(error);
}
return resolve(data);
}
);
}
);
}
);
}
onCompile(files, assets) {
const started = Date.now();
const config = this.getConfig();
const paths = this.getPaths(files.concat(assets), config);
return Promise
.all(
lodash.map(
paths,
(path) => {
return this.replaceFile(path, config);
}
)
)
.then(
() => {
logger.info(
'replaced mappings in ' +
paths.length +
' files, replaced in ' +
(Date.now() - started) +
'ms'
);
}
)
.catch((error) => logger.error(error));
}
}
ReplaceCompiler.prototype.brunchPlugin = true;
module.exports = ReplaceCompiler;