forked from ejfrancis/grunt-envpreprocess
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrunt-text-replace.js
187 lines (165 loc) · 6.79 KB
/
grunt-text-replace.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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
var grunt = require('grunt');
var path = require('path');
var gruntTextReplace = {};
exports.replace = function (settings) {
gruntTextReplace.replace(settings);
}
exports.replaceText = function (settings) {
var text = settings.text;
var replacements = settings.replacements;
return gruntTextReplace.replaceTextMultiple(text, replacements);
}
exports.replaceFile = function (settings) {
return gruntTextReplace.replaceFile(settings)
}
exports.replaceFileMultiple = function (settings) {
return gruntTextReplace.replaceFileMultiple(settings)
}
gruntTextReplace = {
replaceFileMultiple: function (settings) {
var sourceFiles = grunt.file.expand(settings.src);
sourceFiles.forEach(function (pathToSource) {
gruntTextReplace.replaceFile({
src: pathToSource,
dest: settings.dest,
replacements: settings.replacements
});
});
},
replaceFile: function (settings) {
var pathToSourceFile = settings.src;
var pathToDestinationFile = this.getPathToDestination(pathToSourceFile, settings.dest);
var replacements = settings.replacements;
var isThereAGenuineReplacement = replacements.reduce(function (previous, current) {
return previous || (current.from !== current.to)
}, false);
var isReplacementRequired = (pathToSourceFile !== pathToDestinationFile) || isThereAGenuineReplacement
if (isReplacementRequired) {
grunt.file.copy(pathToSourceFile, pathToDestinationFile, {
process: function (text) {
return gruntTextReplace.replaceTextMultiple(text, replacements);
}
});
}
},
replaceTextMultiple: function (text, replacements) {
return replacements.reduce(function (newText, replacement) {
return gruntTextReplace.replaceText({
text: newText,
from: replacement.from,
to: replacement.to
});
}, text);
},
replaceText: function (settings) {
var text = settings.text;
var from = this.convertPatternToRegex(settings.from);
var to = this.expandReplacement(settings.to);
return text.replace(from, to);
},
replace: function (settings) {
var src = grunt.file.expand(settings.src || []);
var dest = settings.dest;
var overwrite = settings.overwrite;
var replacements = settings.replacements;
var isDestinationDirectory = (/\/$/).test(dest);
var initialWarnCount = grunt.fail.warncount;
if (typeof dest === 'undefined' &&
typeof src === 'undefined' &&
typeof replacements === 'undefined') {
grunt.warn(gruntTextReplace.errorMessages.noTargetsDefined);
} else if (typeof dest === 'undefined' && overwrite !== true) {
grunt.warn(gruntTextReplace.errorMessages.noDestination);
} else if (typeof replacements === 'undefined') {
grunt.warn(gruntTextReplace.errorMessages.noReplacements);
} else if (typeof dest !== 'undefined' && overwrite === true) {
grunt.warn(gruntTextReplace.errorMessages.overwriteFailure);
} else if ((isDestinationDirectory === false && src.length > 1) && overwrite !== true) {
grunt.warn(gruntTextReplace.errorMessages.multipleSourceSingleDestination);
} else if (grunt.fail.warncount - initialWarnCount === 0) {
gruntTextReplace.replaceFileMultiple({
src: src,
dest: dest,
replacements: replacements
});
}
},
errorMessages: {
noTargetsDefined: "No targets were found. Remember to wrap functionality " +
"within a target.",
noDestination: "Destination is not defined! If you want to overwrite " +
"files, then make sure to set overwrite: true. If you don't wish to " +
"overwrite, then make sure to set a destination",
noReplacements: "No replacements were found.",
overwriteFailure: "Overwrite is to true, but a destination has also " +
"been defined. If you want to overwrite files, remove the destination. " +
"If you want to send files to a destination, then ensure overwrite is " +
"not set to true",
multipleSourceSingleDestination: "Cannot write multiple files to same " +
"file. If you wish to export to a directory, make sure there is a " +
"trailing slash on the destination. If you wish to write to a single " +
"file, make sure there is only one source file"
},
getPathToDestination: function (pathToSource, pathToDestinationFile) {
var isDestinationDirectory = (/\/$/).test(pathToDestinationFile);
var fileName = path.basename(pathToSource);
var newPathToDestination;
if (typeof pathToDestinationFile === 'undefined') {
newPathToDestination = pathToSource;
} else {
newPathToDestination = pathToDestinationFile + (isDestinationDirectory ? fileName : '');
}
return newPathToDestination;
},
convertPatternToRegex: function (pattern) {
var regexCharacters = '\\[](){}^$-.*+?|,/';
if (typeof pattern === 'string') {
regexCharacters.split('').forEach(function (character) {
var characterAsRegex = new RegExp('(\\' + character + ')', 'g');
pattern = pattern.replace(characterAsRegex, '\\$1');
});
pattern = new RegExp(pattern, 'g');
}
return pattern;
},
expandReplacement: function (replacement) {
if (typeof replacement === 'function') {
return this.expandFunctionReplacement(replacement);
} else if (typeof replacement === 'string') {
return this.expandStringReplacement(replacement);
} else {
return gruntTextReplace.expandNonStringReplacement(replacement);
}
},
expandFunctionReplacement: function (replacement) {
return function () {
var matchedSubstring = arguments[0];
var index = arguments[arguments.length - 2];
var fullText = arguments[arguments.length - 1];
var regexMatches = Array.prototype.slice.call(arguments, 1,
arguments.length - 2);
var returnValue = replacement(matchedSubstring, index, fullText,
regexMatches);
return (typeof returnValue === 'string') ?
gruntTextReplace.processGruntTemplate(returnValue) :
gruntTextReplace.expandNonStringReplacement(returnValue);
};
},
expandStringReplacement: function (replacement) {
return gruntTextReplace.processGruntTemplate(replacement);
},
expandNonStringReplacement: function (replacement) {
var isReplacementNullOrUndefined = (typeof replacement === 'undefined') || (replacement === null);
return isReplacementNullOrUndefined ? '' : String(replacement);
},
processGruntTemplate: function (string) {
var isProcessTemplateTrue = true;
if (grunt.task.current.data &&
grunt.task.current.data.options &&
typeof grunt.task.current.data.options.processTemplates !== 'undefined' &&
grunt.task.current.data.options.processTemplates === false) {
isProcessTemplateTrue = false;
}
return isProcessTemplateTrue ? grunt.template.process(string) : string;
}
}