1 |
torben |
2125 |
module.exports = function( grunt ) { |
2 |
|
|
|
3 |
|
|
"use strict"; |
4 |
|
|
|
5 |
|
|
var |
6 |
|
|
// files |
7 |
|
|
coreFiles = [ |
8 |
|
|
"jquery.ui.core.js", |
9 |
|
|
"jquery.ui.widget.js", |
10 |
|
|
"jquery.ui.mouse.js", |
11 |
|
|
"jquery.ui.draggable.js", |
12 |
|
|
"jquery.ui.droppable.js", |
13 |
|
|
"jquery.ui.resizable.js", |
14 |
|
|
"jquery.ui.selectable.js", |
15 |
|
|
"jquery.ui.sortable.js", |
16 |
|
|
"jquery.ui.effect.js" |
17 |
|
|
], |
18 |
|
|
|
19 |
|
|
uiFiles = coreFiles.map(function( file ) { |
20 |
|
|
return "ui/" + file; |
21 |
|
|
}).concat( expandFiles( "ui/*.js" ).filter(function( file ) { |
22 |
|
|
return coreFiles.indexOf( file.substring(3) ) === -1; |
23 |
|
|
})), |
24 |
|
|
|
25 |
|
|
allI18nFiles = expandFiles( "ui/i18n/*.js" ), |
26 |
|
|
|
27 |
|
|
cssFiles = [ |
28 |
|
|
"core", |
29 |
|
|
"accordion", |
30 |
|
|
"autocomplete", |
31 |
|
|
"button", |
32 |
|
|
"datepicker", |
33 |
|
|
"dialog", |
34 |
|
|
"menu", |
35 |
|
|
"progressbar", |
36 |
|
|
"resizable", |
37 |
|
|
"selectable", |
38 |
|
|
"slider", |
39 |
|
|
"spinner", |
40 |
|
|
"tabs", |
41 |
|
|
"tooltip", |
42 |
|
|
"theme" |
43 |
|
|
].map(function( component ) { |
44 |
|
|
return "themes/base/jquery.ui." + component + ".css"; |
45 |
|
|
}), |
46 |
|
|
|
47 |
|
|
// minified files |
48 |
|
|
minify = { |
49 |
|
|
options: { |
50 |
|
|
preserveComments: false |
51 |
|
|
}, |
52 |
|
|
main: { |
53 |
|
|
options: { |
54 |
|
|
banner: createBanner( uiFiles ) |
55 |
|
|
}, |
56 |
|
|
files: { |
57 |
|
|
"dist/jquery-ui.min.js": "dist/jquery-ui.js" |
58 |
|
|
} |
59 |
|
|
}, |
60 |
|
|
i18n: { |
61 |
|
|
options: { |
62 |
|
|
banner: createBanner( allI18nFiles ) |
63 |
|
|
}, |
64 |
|
|
files: { |
65 |
|
|
"dist/i18n/jquery-ui-i18n.min.js": "dist/i18n/jquery-ui-i18n.js" |
66 |
|
|
} |
67 |
|
|
} |
68 |
|
|
}, |
69 |
|
|
|
70 |
|
|
minifyCSS = { |
71 |
|
|
options: { |
72 |
|
|
keepSpecialComments: 0 |
73 |
|
|
}, |
74 |
|
|
main: { |
75 |
|
|
options: { |
76 |
|
|
keepSpecialComments: "*" |
77 |
|
|
}, |
78 |
|
|
src: "dist/jquery-ui.css", |
79 |
|
|
dest: "dist/jquery-ui.min.css" |
80 |
|
|
} |
81 |
|
|
}, |
82 |
|
|
|
83 |
|
|
compareFiles = { |
84 |
|
|
all: [ |
85 |
|
|
"dist/jquery-ui.js", |
86 |
|
|
"dist/jquery-ui.min.js" |
87 |
|
|
] |
88 |
|
|
}; |
89 |
|
|
|
90 |
|
|
function mapMinFile( file ) { |
91 |
|
|
return "dist/" + file.replace( /\.js$/, ".min.js" ).replace( /ui\//, "minified/" ); |
92 |
|
|
} |
93 |
|
|
|
94 |
|
|
function expandFiles( files ) { |
95 |
|
|
return grunt.util._.pluck( grunt.file.expandMapping( files ), "src" ).map(function( values ) { |
96 |
|
|
return values[ 0 ]; |
97 |
|
|
}); |
98 |
|
|
} |
99 |
|
|
|
100 |
|
|
uiFiles.concat( allI18nFiles ).forEach(function( file ) { |
101 |
|
|
minify[ file ] = { |
102 |
|
|
options: { |
103 |
|
|
banner: createBanner() |
104 |
|
|
}, |
105 |
|
|
files: {} |
106 |
|
|
}; |
107 |
|
|
minify[ file ].files[ mapMinFile( file ) ] = file; |
108 |
|
|
}); |
109 |
|
|
|
110 |
|
|
cssFiles.forEach(function( file ) { |
111 |
|
|
minifyCSS[ file ] = { |
112 |
|
|
options: { |
113 |
|
|
banner: createBanner() |
114 |
|
|
}, |
115 |
|
|
src: file, |
116 |
|
|
dest: "dist/" + file.replace( /\.css$/, ".min.css" ).replace( /themes\/base\//, "themes/base/minified/" ) |
117 |
|
|
}; |
118 |
|
|
}); |
119 |
|
|
|
120 |
|
|
uiFiles.forEach(function( file ) { |
121 |
|
|
// TODO this doesn't do anything until https://github.com/rwldrn/grunt-compare-size/issues/13 |
122 |
|
|
compareFiles[ file ] = [ file, mapMinFile( file ) ]; |
123 |
|
|
}); |
124 |
|
|
|
125 |
|
|
// grunt plugins |
126 |
|
|
grunt.loadNpmTasks( "grunt-contrib-jshint" ); |
127 |
|
|
grunt.loadNpmTasks( "grunt-contrib-uglify" ); |
128 |
|
|
grunt.loadNpmTasks( "grunt-contrib-concat" ); |
129 |
|
|
grunt.loadNpmTasks( "grunt-contrib-qunit" ); |
130 |
|
|
grunt.loadNpmTasks( "grunt-contrib-csslint" ); |
131 |
|
|
grunt.loadNpmTasks( "grunt-contrib-cssmin" ); |
132 |
|
|
grunt.loadNpmTasks( "grunt-html" ); |
133 |
|
|
grunt.loadNpmTasks( "grunt-compare-size" ); |
134 |
|
|
grunt.loadNpmTasks( "grunt-git-authors" ); |
135 |
|
|
// local testswarm and build tasks |
136 |
|
|
grunt.loadTasks( "build/tasks" ); |
137 |
|
|
|
138 |
|
|
function stripDirectory( file ) { |
139 |
|
|
return file.replace( /.+\/(.+?)>?$/, "$1" ); |
140 |
|
|
} |
141 |
|
|
|
142 |
|
|
function createBanner( files ) { |
143 |
|
|
// strip folders |
144 |
|
|
var fileNames = files && files.map( stripDirectory ); |
145 |
|
|
return "/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - " + |
146 |
|
|
"<%= grunt.template.today('isoDate') %>\n" + |
147 |
|
|
"<%= pkg.homepage ? '* ' + pkg.homepage + '\\n' : '' %>" + |
148 |
|
|
(files ? "* Includes: " + fileNames.join(", ") + "\n" : "")+ |
149 |
|
|
"* Copyright <%= grunt.template.today('yyyy') %> <%= pkg.author.name %>;" + |
150 |
|
|
" Licensed <%= _.pluck(pkg.licenses, 'type').join(', ') %> */\n"; |
151 |
|
|
} |
152 |
|
|
|
153 |
|
|
grunt.initConfig({ |
154 |
|
|
pkg: grunt.file.readJSON("package.json"), |
155 |
|
|
files: { |
156 |
|
|
dist: "<%= pkg.name %>-<%= pkg.version %>", |
157 |
|
|
cdn: "<%= pkg.name %>-<%= pkg.version %>-cdn", |
158 |
|
|
themes: "<%= pkg.name %>-themes-<%= pkg.version %>" |
159 |
|
|
}, |
160 |
|
|
compare_size: compareFiles, |
161 |
|
|
concat: { |
162 |
|
|
ui: { |
163 |
|
|
options: { |
164 |
|
|
banner: createBanner( uiFiles ), |
165 |
|
|
stripBanners: { |
166 |
|
|
block: true |
167 |
|
|
} |
168 |
|
|
}, |
169 |
|
|
src: uiFiles, |
170 |
|
|
dest: "dist/jquery-ui.js" |
171 |
|
|
}, |
172 |
|
|
i18n: { |
173 |
|
|
options: { |
174 |
|
|
banner: createBanner( allI18nFiles ) |
175 |
|
|
}, |
176 |
|
|
src: allI18nFiles, |
177 |
|
|
dest: "dist/i18n/jquery-ui-i18n.js" |
178 |
|
|
}, |
179 |
|
|
css: { |
180 |
|
|
options: { |
181 |
|
|
banner: createBanner( cssFiles ), |
182 |
|
|
stripBanners: { |
183 |
|
|
block: true |
184 |
|
|
} |
185 |
|
|
}, |
186 |
|
|
src: cssFiles, |
187 |
|
|
dest: "dist/jquery-ui.css" |
188 |
|
|
} |
189 |
|
|
}, |
190 |
|
|
uglify: minify, |
191 |
|
|
cssmin: minifyCSS, |
192 |
|
|
htmllint: { |
193 |
|
|
// ignore files that contain invalid html, used only for ajax content testing |
194 |
|
|
all: grunt.file.expand( [ "demos/**/*.html", "tests/**/*.html" ] ).filter(function( file ) { |
195 |
|
|
return !/(?:ajax\/content\d\.html|tabs\/data\/test\.html|tests\/unit\/core\/core\.html)/.test( file ); |
196 |
|
|
}) |
197 |
|
|
}, |
198 |
|
|
copy: { |
199 |
|
|
dist: { |
200 |
|
|
src: [ |
201 |
|
|
"AUTHORS.txt", |
202 |
|
|
"jquery-*.js", |
203 |
|
|
"MIT-LICENSE.txt", |
204 |
|
|
"README.md", |
205 |
|
|
"Gruntfile.js", |
206 |
|
|
"package.json", |
207 |
|
|
"*.jquery.json", |
208 |
|
|
"ui/**/*", |
209 |
|
|
"ui/.jshintrc", |
210 |
|
|
"demos/**/*", |
211 |
|
|
"themes/**/*", |
212 |
|
|
"external/**/*", |
213 |
|
|
"tests/**/*" |
214 |
|
|
], |
215 |
|
|
renames: { |
216 |
|
|
"dist/jquery-ui.js": "ui/jquery-ui.js", |
217 |
|
|
"dist/jquery-ui.min.js": "ui/minified/jquery-ui.min.js", |
218 |
|
|
"dist/i18n/jquery-ui-i18n.js": "ui/i18n/jquery-ui-i18n.js", |
219 |
|
|
"dist/i18n/jquery-ui-i18n.min.js": "ui/minified/i18n/jquery-ui-i18n.min.js", |
220 |
|
|
"dist/jquery-ui.css": "themes/base/jquery-ui.css", |
221 |
|
|
"dist/jquery-ui.min.css": "themes/base/minified/jquery-ui.min.css" |
222 |
|
|
}, |
223 |
|
|
dest: "dist/<%= files.dist %>" |
224 |
|
|
}, |
225 |
|
|
dist_min: { |
226 |
|
|
src: "dist/minified/**/*", |
227 |
|
|
strip: /^dist/, |
228 |
|
|
dest: "dist/<%= files.dist %>/ui" |
229 |
|
|
}, |
230 |
|
|
dist_css_min: { |
231 |
|
|
src: "dist/themes/base/minified/*.css", |
232 |
|
|
strip: /^dist/, |
233 |
|
|
dest: "dist/<%= files.dist %>" |
234 |
|
|
}, |
235 |
|
|
dist_units_images: { |
236 |
|
|
src: "themes/base/images/*", |
237 |
|
|
strip: /^themes\/base\//, |
238 |
|
|
dest: "dist/" |
239 |
|
|
}, |
240 |
|
|
dist_min_images: { |
241 |
|
|
src: "themes/base/images/*", |
242 |
|
|
strip: /^themes\/base\//, |
243 |
|
|
dest: "dist/<%= files.dist %>/themes/base/minified" |
244 |
|
|
}, |
245 |
|
|
cdn: { |
246 |
|
|
src: [ |
247 |
|
|
"AUTHORS.txt", |
248 |
|
|
"MIT-LICENSE.txt", |
249 |
|
|
"ui/*.js", |
250 |
|
|
"package.json" |
251 |
|
|
], |
252 |
|
|
renames: { |
253 |
|
|
"dist/jquery-ui.js": "jquery-ui.js", |
254 |
|
|
"dist/jquery-ui.min.js": "jquery-ui.min.js", |
255 |
|
|
"dist/i18n/jquery-ui-i18n.js": "i18n/jquery-ui-i18n.js", |
256 |
|
|
"dist/i18n/jquery-ui-i18n.min.js": "i18n/jquery-ui-i18n.min.js" |
257 |
|
|
}, |
258 |
|
|
dest: "dist/<%= files.cdn %>" |
259 |
|
|
}, |
260 |
|
|
cdn_i18n: { |
261 |
|
|
src: "ui/i18n/jquery.ui.datepicker-*.js", |
262 |
|
|
strip: "ui/", |
263 |
|
|
dest: "dist/<%= files.cdn %>" |
264 |
|
|
}, |
265 |
|
|
cdn_i18n_min: { |
266 |
|
|
src: "dist/minified/i18n/jquery.ui.datepicker-*.js", |
267 |
|
|
strip: "dist/minified", |
268 |
|
|
dest: "dist/<%= files.cdn %>" |
269 |
|
|
}, |
270 |
|
|
cdn_min: { |
271 |
|
|
src: "dist/minified/*.js", |
272 |
|
|
strip: /^dist\/minified/, |
273 |
|
|
dest: "dist/<%= files.cdn %>/ui" |
274 |
|
|
}, |
275 |
|
|
cdn_themes: { |
276 |
|
|
src: "dist/<%= files.themes %>/themes/**/*", |
277 |
|
|
strip: "dist/<%= files.themes %>", |
278 |
|
|
dest: "dist/<%= files.cdn %>" |
279 |
|
|
}, |
280 |
|
|
themes: { |
281 |
|
|
src: [ |
282 |
|
|
"AUTHORS.txt", |
283 |
|
|
"MIT-LICENSE.txt", |
284 |
|
|
"package.json" |
285 |
|
|
], |
286 |
|
|
dest: "dist/<%= files.themes %>" |
287 |
|
|
} |
288 |
|
|
}, |
289 |
|
|
zip: { |
290 |
|
|
dist: { |
291 |
|
|
src: "<%= files.dist %>", |
292 |
|
|
dest: "<%= files.dist %>.zip" |
293 |
|
|
}, |
294 |
|
|
cdn: { |
295 |
|
|
src: "<%= files.cdn %>", |
296 |
|
|
dest: "<%= files.cdn %>.zip" |
297 |
|
|
}, |
298 |
|
|
themes: { |
299 |
|
|
src: "<%= files.themes %>", |
300 |
|
|
dest: "<%= files.themes %>.zip" |
301 |
|
|
} |
302 |
|
|
}, |
303 |
|
|
md5: { |
304 |
|
|
dist: { |
305 |
|
|
src: "dist/<%= files.dist %>", |
306 |
|
|
dest: "dist/<%= files.dist %>/MANIFEST" |
307 |
|
|
}, |
308 |
|
|
cdn: { |
309 |
|
|
src: "dist/<%= files.cdn %>", |
310 |
|
|
dest: "dist/<%= files.cdn %>/MANIFEST" |
311 |
|
|
}, |
312 |
|
|
themes: { |
313 |
|
|
src: "dist/<%= files.themes %>", |
314 |
|
|
dest: "dist/<%= files.themes %>/MANIFEST" |
315 |
|
|
} |
316 |
|
|
}, |
317 |
|
|
qunit: { |
318 |
|
|
files: expandFiles( "tests/unit/**/*.html" ).filter(function( file ) { |
319 |
|
|
// disabling everything that doesn't (quite) work with PhantomJS for now |
320 |
|
|
// TODO except for all|index|test, try to include more as we go |
321 |
|
|
return !( /(all|index|test|dialog|dialog_deprecated|tabs|tooltip)\.html$/ ).test( file ); |
322 |
|
|
}) |
323 |
|
|
}, |
324 |
|
|
jshint: { |
325 |
|
|
ui: { |
326 |
|
|
options: { |
327 |
|
|
jshintrc: "ui/.jshintrc" |
328 |
|
|
}, |
329 |
|
|
files: { |
330 |
|
|
src: "ui/*.js" |
331 |
|
|
} |
332 |
|
|
}, |
333 |
|
|
grunt: { |
334 |
|
|
options: { |
335 |
|
|
jshintrc: ".jshintrc" |
336 |
|
|
}, |
337 |
|
|
files: { |
338 |
|
|
src: [ "Gruntfile.js", "build/**/*.js" ] |
339 |
|
|
} |
340 |
|
|
}, |
341 |
|
|
tests: { |
342 |
|
|
options: { |
343 |
|
|
jshintrc: "tests/.jshintrc" |
344 |
|
|
}, |
345 |
|
|
files: { |
346 |
|
|
src: "tests/unit/**/*.js" |
347 |
|
|
} |
348 |
|
|
} |
349 |
|
|
}, |
350 |
|
|
csslint: { |
351 |
|
|
base_theme: { |
352 |
|
|
src: "themes/base/*.css", |
353 |
|
|
options: { |
354 |
|
|
"adjoining-classes": false, |
355 |
|
|
"box-model": false, |
356 |
|
|
"compatible-vendor-prefixes": false, |
357 |
|
|
"duplicate-background-images": false, |
358 |
|
|
"import": false, |
359 |
|
|
"important": false, |
360 |
|
|
"outline-none": false, |
361 |
|
|
"overqualified-elements": false, |
362 |
|
|
"text-indent": false |
363 |
|
|
} |
364 |
|
|
} |
365 |
|
|
} |
366 |
|
|
}); |
367 |
|
|
|
368 |
|
|
grunt.registerTask( "default", [ "lint", "test" ] ); |
369 |
|
|
grunt.registerTask( "lint", [ "jshint", "csslint", "htmllint" ] ); |
370 |
|
|
grunt.registerTask( "test", [ "qunit" ] ); |
371 |
|
|
grunt.registerTask( "sizer", [ "concat:ui", "uglify:main", "compare_size:all" ] ); |
372 |
|
|
grunt.registerTask( "sizer_all", [ "concat:ui", "uglify", "compare_size" ] ); |
373 |
|
|
grunt.registerTask( "build", [ "concat", "uglify", "cssmin", "copy:dist_units_images" ] ); |
374 |
|
|
grunt.registerTask( "release", "clean build copy:dist copy:dist_min copy:dist_min_images copy:dist_css_min md5:dist zip:dist".split( " " ) ); |
375 |
|
|
grunt.registerTask( "release_themes", "release generate_themes copy:themes md5:themes zip:themes".split( " " ) ); |
376 |
|
|
grunt.registerTask( "release_cdn", "release_themes copy:cdn copy:cdn_min copy:cdn_i18n copy:cdn_i18n_min copy:cdn_themes md5:cdn zip:cdn".split( " " ) ); |
377 |
|
|
|
378 |
|
|
}; |