-
Notifications
You must be signed in to change notification settings - Fork 0
/
requirejs.groovy
98 lines (71 loc) · 2.66 KB
/
requirejs.groovy
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
import org.gradle.api.Project
import org.gradle.api.file.ConfigruableFileTree
import org.gradle.api.Plugin
import org.gradle.api.artifacts.Configuration
import org.gradle.api.tasks.Copy
class RequireJsOptimizerExtension {
static final String NAME = 'requirejsOptimizer'
ConfigruableFileTree unpackedOptimizerLibraries
static RequireJsOptimizerExtension get(Project project){
return project.extensions.getByType(RequireJsOptimizerExtension)
}
}
class RequireJsOptimizerPlugin implements Plugin<Project> {
static final String LIBRARIES_CONFIGURATION_NAME = 'requirejsOptimizerLibraries'
static final String UNPACK_LIBRARIES_TASK_NAME = 'unpackRequirejsOptimizerLibraries'
private RequireJsOptimizerExtension extension
void apply(Project project) {
extension = project.extensions.create(RequireJsOptimizerExtension.NAME, RequireJsOptimizerExtension)
}
}
class RequireJsOptimizerTask extends DefaultTask {
File rDotJs
def configurationFile
def outputDir
def logLevel = LogLevel.INFO
Map<String, Object> extraOptions = [:]
@TaskAction
void optimizeWebAssets() {
Map<String, Object> options = [
dir: getOutputDir(),
logLevel: getLogLevel().ordinal()
]
runRequireJsOptimizer(options + extraOptions)
relocateCssFiles() // The optimizer writes CSS files into the root of $outputDir, but we want them in $outputDir/css
}
@InputFile
File getConfigurationFile(){
return project.file(configurationFile)
}
@OutputDirectory
File getOutputDir(){
return project.file(outputDir)
}
LogLevel getLogLevel(){
return (logLevel instanceof LogLevel) ? logLevel : LogLevel.valueOf((logLevel as String).toUpperCase())
}
private void runRequireJsOptimizer(Map<String, Object> options){
List<String> optimizerArgs = [getConfigurationFile().absolutePath]
optimizerArgs.addAll(options.collect {k, v -> "$k=${v as String}"})
runInNodeJs(rDotJs, ['-o'] + optimizerArgs)
}
private void runInNodeJs(File script, List<String> args) {
List<String> command = ['node', script.absolutePath] + args
Process process = command.execute()
process.waitForProcessOutput(System.out, System.err)
if(process.exitValue() != 0) {
throw new GradleException("Node (running r.js) exited with status ${process.exitValue()}.")
}
}
private void relocateCssFiles(){
FileTree optimizedCss = project.fileTree(getOutputDir()) { include ('*.css') }
project.copy {
from optimizedCss
into new File(getOutputDir(), 'css')
}
project.delete optimizedCss
}
static enum LogLevel {
TRACE, INFO, WARN, ERROR, SILENT
}
}