diff --git a/.gitignore b/.gitignore index b785b0e8..1bdbebc0 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,7 @@ npm-debug.log *.stackdump # builds -build \ No newline at end of file +build + +# Closure compiler generated JS binary. +closure_compiled_binary.js \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index 497085a8..0b3f3320 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -11,7 +11,6 @@ */ module.exports = function(grunt) { - var piskelScripts = require('./piskel-script-list.js').scripts; var getGhostConfig = function (delay) { return { @@ -84,6 +83,61 @@ module.exports = function(grunt) { 'build/piskel-packaged-min.js' : ['build/piskel-packaged.js'] } } + }, + closureCompiler: { + options: { + // [REQUIRED] Path to closure compiler + compilerFile: 'closure_compiler_20130823.jar', + + // [OPTIONAL] set to true if you want to check if files were modified + // before starting compilation (can save some time in large sourcebases) + //checkModified: true, + + // [OPTIONAL] Set Closure Compiler Directives here + compilerOpts: { + /** + * Keys will be used as directives for the compiler + * values can be strings or arrays. + * If no value is required use null + */ + //compilation_level: 'ADVANCED_OPTIMIZATIONS', + compilation_level: 'SIMPLE_OPTIMIZATIONS', + externs: ['piskel-closure-externs.js'], + // Inject some constants in JS code, could we use that for appengine wiring ? + //define: ["'goog.DEBUG=false'"], + warning_level: 'verbose', + jscomp_off: ['checkTypes', 'fileoverviewTags'], + summary_detail_level: 1, + language_in: 'ECMASCRIPT3' + //output_wrapper: '"(function(){%output%}).call(this);"' + }, + execOpts: { // [OPTIONAL] Set exec method options + maxBuffer: 999999 * 1024 + } + + }, + compile: { + + /** + *[OPTIONAL] Here you can add new or override previous option of the Closure Compiler Directives. + * IMPORTANT! The feature is enabled as a temporary solution to [#738](https://github.com/gruntjs/grunt/issues/738). + * As soon as issue will be fixed this feature will be removed. + */ + TEMPcompilerOpts: { + }, + src: [ + 'js/**/*.js', + //'!js/lib/**/*.js', + '!js/lib/bootstrap/**/*.js', + '!js/lib/jsColor_1_4_0/**/*.js', + '!js/lib/gif/**/*.js', + 'piskel-boot.js', + 'piskel-script-list.js' + ], + + // This generated JS binary is currently not used and even excluded from source control using .gitignore. + dest: 'closure_compiled_binary.js' + } } }); @@ -99,6 +153,7 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-closure-tools'); grunt.loadNpmTasks('grunt-ghost'); grunt.loadNpmTasks('grunt-leading-indent'); @@ -106,15 +161,17 @@ module.exports = function(grunt) { grunt.registerTask('lint', ['leadingIndent:jsFiles', 'leadingIndent:cssFiles', 'jshint']); // Validate & Test - grunt.registerTask('test', ['leadingIndent:jsFiles', 'leadingIndent:cssFiles', 'jshint', 'connect:test', 'ghost:default']); + grunt.registerTask('test', ['leadingIndent:jsFiles', 'leadingIndent:cssFiles', 'jshint', 'compile', 'connect:test', 'ghost:default']); // Validate & Test (faster version) will NOT work on travis !! - grunt.registerTask('precommit', ['leadingIndent:jsFiles', 'leadingIndent:cssFiles', 'jshint', 'connect:test', 'ghost:local']); + grunt.registerTask('precommit', ['leadingIndent:jsFiles', 'leadingIndent:cssFiles', 'jshint', 'compile', 'connect:test', 'ghost:local']); + + // Compile JS code (eg verify JSDoc annotation and types, no actual minified code generated). + grunt.registerTask('compile', ['closureCompiler:compile']); // Validate & Build - grunt.registerTask('default', ['leadingIndent:jsFiles', 'leadingIndent:cssFiles', 'jshint', 'concat', 'uglify']); + grunt.registerTask('default', ['leadingIndent:jsFiles', 'leadingIndent:cssFiles', 'jshint', 'concat', 'compile', 'uglify']); // Start webserver grunt.registerTask('serve', ['connect:serve']); - }; diff --git a/closure_compiler_20130823.jar b/closure_compiler_20130823.jar new file mode 100644 index 00000000..fc290866 Binary files /dev/null and b/closure_compiler_20130823.jar differ diff --git a/js/Events.js b/js/Events.js index 06e2dda2..d7f8d25b 100644 --- a/js/Events.js +++ b/js/Events.js @@ -1,5 +1,5 @@ // TODO(grosbouddha): put under pskl namespace. -Events = { +var Events = { TOOL_SELECTED : "TOOL_SELECTED", TOOL_RELEASED : "TOOL_RELEASED", diff --git a/js/drawingtools/BaseTool.js b/js/drawingtools/BaseTool.js index f1d77ad0..0b3d365e 100644 --- a/js/drawingtools/BaseTool.js +++ b/js/drawingtools/BaseTool.js @@ -1,4 +1,4 @@ -/* +/** * @provide pskl.drawingtools.BaseTool * * @require pskl.utils diff --git a/js/drawingtools/Circle.js b/js/drawingtools/Circle.js index a665dc96..784a90c2 100644 --- a/js/drawingtools/Circle.js +++ b/js/drawingtools/Circle.js @@ -1,4 +1,4 @@ -/* +/** * @provide pskl.drawingtools.Circle * * @require pskl.utils diff --git a/js/drawingtools/ColorPicker.js b/js/drawingtools/ColorPicker.js index 9c5d72c6..8bbedf0d 100644 --- a/js/drawingtools/ColorPicker.js +++ b/js/drawingtools/ColorPicker.js @@ -1,4 +1,4 @@ -/* +/** * @provide pskl.drawingtools.ColorPicker * * @require pskl.utils diff --git a/js/drawingtools/Eraser.js b/js/drawingtools/Eraser.js index fd3cb7e3..c66a4220 100644 --- a/js/drawingtools/Eraser.js +++ b/js/drawingtools/Eraser.js @@ -1,4 +1,4 @@ -/* +/** * @provide pskl.drawingtools.Eraser * * @require Constants diff --git a/js/drawingtools/Move.js b/js/drawingtools/Move.js index e561b91a..a800f481 100644 --- a/js/drawingtools/Move.js +++ b/js/drawingtools/Move.js @@ -1,4 +1,4 @@ -/* +/** * @provide pskl.drawingtools.Move * * @require pskl.utils diff --git a/js/drawingtools/PaintBucket.js b/js/drawingtools/PaintBucket.js index 428596e0..cb0ffa66 100644 --- a/js/drawingtools/PaintBucket.js +++ b/js/drawingtools/PaintBucket.js @@ -1,4 +1,4 @@ -/* +/** * @provide pskl.drawingtools.PaintBucket * * @require pskl.utils diff --git a/js/drawingtools/Rectangle.js b/js/drawingtools/Rectangle.js index 532afd35..6d555508 100644 --- a/js/drawingtools/Rectangle.js +++ b/js/drawingtools/Rectangle.js @@ -1,4 +1,4 @@ -/* +/** * @provide pskl.drawingtools.Rectangle * * @require pskl.utils diff --git a/js/drawingtools/SimplePen.js b/js/drawingtools/SimplePen.js index 1f7d482a..a5dbbb0e 100644 --- a/js/drawingtools/SimplePen.js +++ b/js/drawingtools/SimplePen.js @@ -1,4 +1,4 @@ -/* +/** * @provide pskl.drawingtools.SimplePen * * @require pskl.utils diff --git a/js/drawingtools/Stroke.js b/js/drawingtools/Stroke.js index e97bc144..6952c1bc 100644 --- a/js/drawingtools/Stroke.js +++ b/js/drawingtools/Stroke.js @@ -1,4 +1,4 @@ -/* +/** * @provide pskl.drawingtools.Stroke * * @require pskl.utils diff --git a/js/drawingtools/selectiontools/BaseSelect.js b/js/drawingtools/selectiontools/BaseSelect.js index 334171dc..13c761ac 100644 --- a/js/drawingtools/selectiontools/BaseSelect.js +++ b/js/drawingtools/selectiontools/BaseSelect.js @@ -1,4 +1,4 @@ -/* +/** * @provide pskl.drawingtools.BaseSelect * * @require pskl.utils diff --git a/js/drawingtools/selectiontools/RectangleSelect.js b/js/drawingtools/selectiontools/RectangleSelect.js index 810d814b..9789c427 100644 --- a/js/drawingtools/selectiontools/RectangleSelect.js +++ b/js/drawingtools/selectiontools/RectangleSelect.js @@ -1,4 +1,4 @@ -/* +/** * @provide pskl.drawingtools.RectangleSelect * * @require pskl.utils diff --git a/js/drawingtools/selectiontools/ShapeSelect.js b/js/drawingtools/selectiontools/ShapeSelect.js index 6d931850..ffe3a628 100644 --- a/js/drawingtools/selectiontools/ShapeSelect.js +++ b/js/drawingtools/selectiontools/ShapeSelect.js @@ -1,4 +1,4 @@ -/* +/** * @provide pskl.drawingtools.ShapeSelect * * @require pskl.utils diff --git a/js/utils/PixelUtils.js b/js/utils/PixelUtils.js index 94e1fcb5..0966d5a3 100644 --- a/js/utils/PixelUtils.js +++ b/js/utils/PixelUtils.js @@ -44,7 +44,7 @@ x0 : Math.min(x0, x1), y0 : Math.min(y0, y1), x1 : Math.max(x0, x1), - y1 : Math.max(y0, y1), + y1 : Math.max(y0, y1) }; }, @@ -172,6 +172,6 @@ widthBoundDpi = Math.floor(width / pictureWidth); return Math.min(heightBoundDpi, widthBoundDpi); - }, + } }; })(); \ No newline at end of file diff --git a/js/utils/core.js b/js/utils/core.js index 58fc39fd..46ccaaed 100644 --- a/js/utils/core.js +++ b/js/utils/core.js @@ -24,7 +24,7 @@ if (typeof Function.prototype.bind !== "function") { }; } -/* +/** * @provide pskl.utils * * @require Constants diff --git a/package.json b/package.json index 857b51aa..cfc74920 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "grunt-contrib-jshint": "0.5.4", "grunt-contrib-uglify": "0.2.2", "grunt-ghost": "1.0.12", - "grunt-leading-indent" : "0.1.0" + "grunt-leading-indent": "0.1.0", + "grunt-closure-tools": "~0.8.3" } } diff --git a/piskel-boot.js b/piskel-boot.js index 2ac97da7..1c8da006 100644 --- a/piskel-boot.js +++ b/piskel-boot.js @@ -11,14 +11,14 @@ window.exports = {}; var scriptIndex = 0; window.loadNextScript = function () { - if (scriptIndex == exports.scripts.length) { + if (scriptIndex == window.exports.scripts.length) { pskl.app.init(); // cleanup delete window.exports; delete window.loadDebugScripts; delete window.done; } else { - loadScript(exports.scripts[scriptIndex], "loadNextScript()"); + loadScript(window.exports.scripts[scriptIndex], "loadNextScript()"); scriptIndex ++; } }; diff --git a/piskel-closure-externs.js b/piskel-closure-externs.js new file mode 100644 index 00000000..b5f3d789 --- /dev/null +++ b/piskel-closure-externs.js @@ -0,0 +1,17 @@ +/** + * @fileoverview Externs for Piskel + * + * @externs + */ + +// Piskel externs. +var exports; +var $; +var console; +var pskl; + +// Piskel libs externs. +var define; +var jQuery; +var getComputedStyle; +var URL; \ No newline at end of file