From 1530d68a08e29decabc8f2b49d4c207e5296bada Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 13:24:36 -0700 Subject: [PATCH 01/21] Only compile .pegjs files in lib/ --- build/Gruntfile.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Gruntfile.coffee b/build/Gruntfile.coffee index 7c687ac92..1a34b70f2 100644 --- a/build/Gruntfile.coffee +++ b/build/Gruntfile.coffee @@ -128,7 +128,7 @@ module.exports = (grunt) -> lessConfig.glob_to_multiple.src.push("#{directory}/**/*.less") prebuildLessConfig.src.push("#{directory}/**/*.less") unless theme csonConfig.glob_to_multiple.src.push("#{directory}/**/*.cson") - pegConfig.glob_to_multiple.src.push("#{directory}/**/*.pegjs") + pegConfig.glob_to_multiple.src.push("#{directory}/lib/*.pegjs") grunt.initConfig pkg: grunt.file.readJSON('package.json') From f12eb04339dcc015075677bce0c512c7d2a43d13 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 13:25:05 -0700 Subject: [PATCH 02/21] Don't compile package specs --- build/Gruntfile.coffee | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/Gruntfile.coffee b/build/Gruntfile.coffee index 1a34b70f2..c3261ad90 100644 --- a/build/Gruntfile.coffee +++ b/build/Gruntfile.coffee @@ -125,9 +125,13 @@ module.exports = (grunt) -> {engines, theme} = grunt.file.readJSON(metadataPath) if engines?.atom? coffeeConfig.glob_to_multiple.src.push("#{directory}/**/*.coffee") + coffeeConfig.glob_to_multiple.src.push("!#{directory}/spec/**/*.coffee") + lessConfig.glob_to_multiple.src.push("#{directory}/**/*.less") prebuildLessConfig.src.push("#{directory}/**/*.less") unless theme + csonConfig.glob_to_multiple.src.push("#{directory}/**/*.cson") + pegConfig.glob_to_multiple.src.push("#{directory}/lib/*.pegjs") grunt.initConfig From 931ea2f198b54482f28a8e79e947e5e670fa0c25 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 13:28:17 -0700 Subject: [PATCH 03/21] Ignore package spec folder --- build/tasks/build-task.coffee | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee index 3411f4dae..2530aab79 100644 --- a/build/tasks/build-task.coffee +++ b/build/tasks/build-task.coffee @@ -26,6 +26,7 @@ module.exports = (grunt) -> cp 'package.json', path.join(appDir, 'package.json') + packageNames = [] packageDirectories = [] nonPackageDirectories = [ 'benchmark' @@ -39,6 +40,7 @@ module.exports = (grunt) -> directory = path.join('node_modules', child) if isAtomPackage(directory) packageDirectories.push(directory) + packageNames.push(child) else nonPackageDirectories.push(directory) @@ -92,6 +94,9 @@ module.exports = (grunt) -> '.pairs' '.travis.yml' ] + + packageNames.forEach (packageName) -> ignoredPaths.push(path.join(packageName, 'spec')) + ignoredPaths = ignoredPaths.map (ignoredPath) -> _.escapeRegExp(ignoredPath) # Add .* to avoid matching hunspell_dictionaries. From 91eb0b3b9ff53aff90d3f63a7e26f62ab3a02320 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 13:28:39 -0700 Subject: [PATCH 04/21] Remove unneeded atom-keymap ignores --- build/tasks/build-task.coffee | 3 --- 1 file changed, 3 deletions(-) diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee index 2530aab79..43b1b81ee 100644 --- a/build/tasks/build-task.coffee +++ b/build/tasks/build-task.coffee @@ -81,9 +81,6 @@ module.exports = (grunt) -> path.join('resources', 'win') # These are only require in dev mode when the grammar isn't precompiled - path.join('atom-keymap', 'node_modules', 'loophole') - path.join('atom-keymap', 'node_modules', 'pegjs') - path.join('atom-keymap', 'node_modules', '.bin', 'pegjs') path.join('snippets', 'node_modules', 'loophole') path.join('snippets', 'node_modules', 'pegjs') path.join('snippets', 'node_modules', '.bin', 'pegjs') From 32a475a5a2453224cd7b33290bc90b6d00524661 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 13:32:27 -0700 Subject: [PATCH 05/21] Don't compile spec .less/.cson files --- build/Gruntfile.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/Gruntfile.coffee b/build/Gruntfile.coffee index c3261ad90..55a465e40 100644 --- a/build/Gruntfile.coffee +++ b/build/Gruntfile.coffee @@ -128,9 +128,11 @@ module.exports = (grunt) -> coffeeConfig.glob_to_multiple.src.push("!#{directory}/spec/**/*.coffee") lessConfig.glob_to_multiple.src.push("#{directory}/**/*.less") + lessConfig.glob_to_multiple.src.push("!#{directory}/spec/**/*.less") prebuildLessConfig.src.push("#{directory}/**/*.less") unless theme csonConfig.glob_to_multiple.src.push("#{directory}/**/*.cson") + csonConfig.glob_to_multiple.src.push("!#{directory}/spec/**/*.cson") pegConfig.glob_to_multiple.src.push("#{directory}/lib/*.pegjs") From e633e5d8de82367ed2cf79f5901b23e0e9c4b343 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 13:36:37 -0700 Subject: [PATCH 06/21] Remove empty keymaps/menus folders --- build/tasks/compile-packages-slug-task.coffee | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/build/tasks/compile-packages-slug-task.coffee b/build/tasks/compile-packages-slug-task.coffee index 613a4a380..a56ed6e18 100644 --- a/build/tasks/compile-packages-slug-task.coffee +++ b/build/tasks/compile-packages-slug-task.coffee @@ -54,15 +54,19 @@ module.exports = (grunt) -> mainPath = require.resolve(path.resolve(moduleDirectory, metadata.main)) pack.main = path.relative(appDir, mainPath) - for keymapPath in fs.listSync(path.join(moduleDirectory, 'keymaps'), ['.cson', '.json']) + keymapsPath = path.join(moduleDirectory, 'keymaps') + for keymapPath in fs.listSync(keymapsPath, ['.cson', '.json']) relativePath = path.relative(appDir, keymapPath) pack.keymaps[relativePath] = CSON.readFileSync(keymapPath) rm keymapPath + rm keymapsPath if fs.listSync(keymapsPath).length is 0 - for menuPath in fs.listSync(path.join(moduleDirectory, 'menus'), ['.cson', '.json']) + menusPath = path.join(moduleDirectory, 'menus') + for menuPath in fs.listSync(menusPath, ['.cson', '.json']) relativePath = path.relative(appDir, menuPath) pack.menus[relativePath] = CSON.readFileSync(menuPath) rm menuPath + rm menusPath if fs.listSync(menusPath).length is 0 packages[metadata.name] = pack From bc0acf47a3674b371d98202e39a2b97d24d1c9d6 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 13:46:02 -0700 Subject: [PATCH 07/21] Ignore bundle testla from get-parameter-names This should have been a dev dependency --- build/tasks/build-task.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee index 43b1b81ee..67791af2d 100644 --- a/build/tasks/build-task.coffee +++ b/build/tasks/build-task.coffee @@ -63,6 +63,8 @@ module.exports = (grunt) -> path.join('npm', 'node_modules', '.bin', 'clear') path.join('npm', 'node_modules', '.bin', 'starwars') path.join('pegjs', 'examples') + path.join('get-parameter-names', 'node_modules', 'testla') + path.join('get-parameter-names', '.bin', 'testla') path.join('jasmine-reporters', 'ext') path.join('jasmine-node', 'node_modules', 'gaze') path.join('jasmine-node', 'spec') From f4b8d88143a128b1087b6f85f18a50fe64af9a90 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 13:46:18 -0700 Subject: [PATCH 08/21] Don't bundle appveyor.yml files --- build/tasks/build-task.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee index 67791af2d..af9d26144 100644 --- a/build/tasks/build-task.coffee +++ b/build/tasks/build-task.coffee @@ -92,6 +92,7 @@ module.exports = (grunt) -> '.npmignore' '.pairs' '.travis.yml' + 'appveyor.yml' ] packageNames.forEach (packageName) -> ignoredPaths.push(path.join(packageName, 'spec')) From 5703aeff2c3c8b67250f11ee82b1311eb9d92709 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 13:46:28 -0700 Subject: [PATCH 09/21] Don't bundle .idea folders --- build/tasks/build-task.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee index af9d26144..fd9d296f9 100644 --- a/build/tasks/build-task.coffee +++ b/build/tasks/build-task.coffee @@ -93,6 +93,7 @@ module.exports = (grunt) -> '.pairs' '.travis.yml' 'appveyor.yml' + '.idea' ] packageNames.forEach (packageName) -> ignoredPaths.push(path.join(packageName, 'spec')) From 592641801c618083d5cf4a4b31921567a4187a48 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 13:46:42 -0700 Subject: [PATCH 10/21] Add _ prefix/suffix to test folder pattern --- build/tasks/build-task.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee index fd9d296f9..302e53a70 100644 --- a/build/tasks/build-task.coffee +++ b/build/tasks/build-task.coffee @@ -126,7 +126,7 @@ module.exports = (grunt) -> ignoredPaths.push path.join('spellchecker', 'vendor', 'hunspell_dictionaries') ignoredPaths = ignoredPaths.map (ignoredPath) -> "(#{ignoredPath})" - testFolderPattern = new RegExp("#{_.escapeRegExp(path.sep)}te?sts?#{_.escapeRegExp(path.sep)}") + testFolderPattern = new RegExp("#{_.escapeRegExp(path.sep)}_*te?sts?_*#{_.escapeRegExp(path.sep)}") exampleFolderPattern = new RegExp("#{_.escapeRegExp(path.sep)}examples?#{_.escapeRegExp(path.sep)}") benchmarkFolderPattern = new RegExp("#{_.escapeRegExp(path.sep)}benchmarks?#{_.escapeRegExp(path.sep)}") From d5f7151096e558272fcd4dfb6429fe0ef8a53a4c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 13:47:15 -0700 Subject: [PATCH 11/21] Add missing node_modules segment --- build/tasks/build-task.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee index 302e53a70..6a9ed7e35 100644 --- a/build/tasks/build-task.coffee +++ b/build/tasks/build-task.coffee @@ -64,7 +64,7 @@ module.exports = (grunt) -> path.join('npm', 'node_modules', '.bin', 'starwars') path.join('pegjs', 'examples') path.join('get-parameter-names', 'node_modules', 'testla') - path.join('get-parameter-names', '.bin', 'testla') + path.join('get-parameter-names', 'node_modules', '.bin', 'testla') path.join('jasmine-reporters', 'ext') path.join('jasmine-node', 'node_modules', 'gaze') path.join('jasmine-node', 'spec') From 2a8d08db4224025aacb2b7e14e33384f3f0cbe85 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 13:51:24 -0700 Subject: [PATCH 12/21] Don't bundle config files --- build/tasks/build-task.coffee | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee index 6a9ed7e35..e053678aa 100644 --- a/build/tasks/build-task.coffee +++ b/build/tasks/build-task.coffee @@ -94,6 +94,10 @@ module.exports = (grunt) -> '.travis.yml' 'appveyor.yml' '.idea' + '.editorconfig' + '.lint' + '.lintignore' + '.eslintrc' ] packageNames.forEach (packageName) -> ignoredPaths.push(path.join(packageName, 'spec')) From 426a2e5e6b620857b6544daade3f72d94f38f954 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 13:54:05 -0700 Subject: [PATCH 13/21] Don't bundle .jshintignore files --- build/tasks/build-task.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee index e053678aa..066ee3481 100644 --- a/build/tasks/build-task.coffee +++ b/build/tasks/build-task.coffee @@ -98,6 +98,7 @@ module.exports = (grunt) -> '.lint' '.lintignore' '.eslintrc' + '.jshintignore' ] packageNames.forEach (packageName) -> ignoredPaths.push(path.join(packageName, 'spec')) From cb47dde7b00a43a1bab40c79fcf8f881bdc11f40 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 13:54:14 -0700 Subject: [PATCH 14/21] Don't bundle .git* files --- build/tasks/build-task.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee index 066ee3481..0b71a7a36 100644 --- a/build/tasks/build-task.coffee +++ b/build/tasks/build-task.coffee @@ -99,6 +99,8 @@ module.exports = (grunt) -> '.lintignore' '.eslintrc' '.jshintignore' + '.gitattributes' + '.gitkeep' ] packageNames.forEach (packageName) -> ignoredPaths.push(path.join(packageName, 'spec')) From 175d717d8c6bcbd7143669e70e8a41b6f9d31bc7 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 14:08:54 -0700 Subject: [PATCH 15/21] Don't bundle es6-weak-map --- build/tasks/build-task.coffee | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee index 0b71a7a36..a6f74bffd 100644 --- a/build/tasks/build-task.coffee +++ b/build/tasks/build-task.coffee @@ -87,6 +87,10 @@ module.exports = (grunt) -> path.join('snippets', 'node_modules', 'pegjs') path.join('snippets', 'node_modules', '.bin', 'pegjs') + # These aren't needed since WeakMap is built-in + path.join('emissary', 'node_modules', 'es6-weak-map') + path.join('property-accessors', 'node_modules', 'es6-weak-map') + '.DS_Store' '.jshintrc' '.npmignore' From 0cd8a300f8322eb0bdaef2885e88727ee783e27b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 14:09:31 -0700 Subject: [PATCH 16/21] Don't bundle spec .less files in cache --- build/Gruntfile.coffee | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build/Gruntfile.coffee b/build/Gruntfile.coffee index 55a465e40..14fbd6e5d 100644 --- a/build/Gruntfile.coffee +++ b/build/Gruntfile.coffee @@ -129,7 +129,10 @@ module.exports = (grunt) -> lessConfig.glob_to_multiple.src.push("#{directory}/**/*.less") lessConfig.glob_to_multiple.src.push("!#{directory}/spec/**/*.less") - prebuildLessConfig.src.push("#{directory}/**/*.less") unless theme + + unless theme + prebuildLessConfig.src.push("#{directory}/**/*.less") + prebuildLessConfig.src.push("!#{directory}/spec/**/*.less") csonConfig.glob_to_multiple.src.push("#{directory}/**/*.cson") csonConfig.glob_to_multiple.src.push("!#{directory}/spec/**/*.cson") From 65cc9486474afa8f9db5cf7d6b6800d573e2d83b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 15:10:27 -0700 Subject: [PATCH 17/21] Don't bundle native source files --- build/tasks/build-task.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee index a6f74bffd..0fb967019 100644 --- a/build/tasks/build-task.coffee +++ b/build/tasks/build-task.coffee @@ -125,6 +125,7 @@ module.exports = (grunt) -> ignoredPaths.push "#{_.escapeRegExp(path.join('runas', 'src') + path.sep)}.*\\.(cc|h)*" ignoredPaths.push "#{_.escapeRegExp(path.join('scrollbar-style', 'src') + path.sep)}.*\\.(cc|h)*" ignoredPaths.push "#{_.escapeRegExp(path.join('spellchecker', 'src') + path.sep)}.*\\.(cc|h)*" + ignoredPaths.push "#{_.escapeRegExp(path.join('keyboard-layout', 'src') + path.sep)}.*\\.(cc|h|mm)*" # Ignore build files ignoredPaths.push "#{_.escapeRegExp(path.sep)}binding\\.gyp$" From e4007f7c8f87ee4110cc1eb40c2081c1f1bc2ba2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 15:28:26 -0700 Subject: [PATCH 18/21] Precompile spec/ CoffeeScript files --- build/Gruntfile.coffee | 2 ++ build/tasks/build-task.coffee | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/build/Gruntfile.coffee b/build/Gruntfile.coffee index 14fbd6e5d..b48c7a773 100644 --- a/build/Gruntfile.coffee +++ b/build/Gruntfile.coffee @@ -69,6 +69,8 @@ module.exports = (grunt) -> expand: true src: [ 'src/**/*.coffee' + 'spec/*.coffee' + '!spec/*-spec.coffee' 'exports/**/*.coffee' 'static/**/*.coffee' ] diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee index 0fb967019..343960f61 100644 --- a/build/tasks/build-task.coffee +++ b/build/tasks/build-task.coffee @@ -162,7 +162,6 @@ module.exports = (grunt) -> for directory in packageDirectories cp directory, path.join(appDir, directory), filter: filterPackage - cp 'spec', path.join(appDir, 'spec'), filter: /fixtures|integration|.+-spec\.coffee/ cp 'src', path.join(appDir, 'src'), filter: /.+\.(cson|coffee)$/ cp 'static', path.join(appDir, 'static') From dfc30830ffce970ca829a68860761f191b230c95 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 16:23:41 -0700 Subject: [PATCH 19/21] Recurse into .asar files --- build/tasks/output-build-filetypes.coffee | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/build/tasks/output-build-filetypes.coffee b/build/tasks/output-build-filetypes.coffee index 64b952bbe..9d51ca30c 100644 --- a/build/tasks/output-build-filetypes.coffee +++ b/build/tasks/output-build-filetypes.coffee @@ -1,3 +1,4 @@ +asar = require 'asar' path = require 'path' module.exports = (grunt) -> @@ -5,11 +6,19 @@ module.exports = (grunt) -> shellAppDir = grunt.config.get('atom.shellAppDir') types = {} - grunt.file.recurse shellAppDir, (absolutePath, rootPath, relativePath, fileName) -> - extension = path.extname(fileName) or fileName + registerFile = (filePath) -> + extension = path.extname(filePath) or path.basename(filePath) types[extension] ?= 0 types[extension]++ + if extension is '.asar' + asar.listPackage(filePath).forEach (archivePath) -> + archivePath = archivePath.substring(1) + unless asar.statFile(filePath, archivePath, true).files + registerFile(archivePath) + + grunt.file.recurse shellAppDir, (absolutePath, rootPath, relativePath, fileName) -> registerFile(absolutePath) + extensions = Object.keys(types).sort (extension1, extension2) -> diff = types[extension2] - types[extension1] if diff is 0 From 2d575808817782a71a75f71949a12e894e5b5dc8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 16:31:28 -0700 Subject: [PATCH 20/21] Add --extension option to log out all found paths --- build/tasks/output-build-filetypes.coffee | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/build/tasks/output-build-filetypes.coffee b/build/tasks/output-build-filetypes.coffee index 9d51ca30c..2d7b292f6 100644 --- a/build/tasks/output-build-filetypes.coffee +++ b/build/tasks/output-build-filetypes.coffee @@ -8,8 +8,8 @@ module.exports = (grunt) -> types = {} registerFile = (filePath) -> extension = path.extname(filePath) or path.basename(filePath) - types[extension] ?= 0 - types[extension]++ + types[extension] ?= [] + types[extension].push(filePath) if extension is '.asar' asar.listPackage(filePath).forEach (archivePath) -> @@ -20,11 +20,15 @@ module.exports = (grunt) -> grunt.file.recurse shellAppDir, (absolutePath, rootPath, relativePath, fileName) -> registerFile(absolutePath) extensions = Object.keys(types).sort (extension1, extension2) -> - diff = types[extension2] - types[extension1] + diff = types[extension2].length - types[extension1].length if diff is 0 extension1.toLowerCase().localeCompare(extension2.toLowerCase()) else diff - extensions.forEach (extension) -> - grunt.log.error "#{extension}: #{types[extension]}" + if extension = grunt.option('extension') + types[extension]?.sort().forEach (filePath) -> + console.log filePath + else + extensions.forEach (extension) -> + grunt.log.error "#{extension}: #{types[extension].length}" From ab9a6c12b34eae94434134ba8869c364bc0b9607 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Apr 2015 16:34:55 -0700 Subject: [PATCH 21/21] Only log out top 25 file types --- build/tasks/output-build-filetypes.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/tasks/output-build-filetypes.coffee b/build/tasks/output-build-filetypes.coffee index 2d7b292f6..1b8aeb330 100644 --- a/build/tasks/output-build-filetypes.coffee +++ b/build/tasks/output-build-filetypes.coffee @@ -28,7 +28,7 @@ module.exports = (grunt) -> if extension = grunt.option('extension') types[extension]?.sort().forEach (filePath) -> - console.log filePath + grunt.log.error filePath else - extensions.forEach (extension) -> + extensions[0...25].forEach (extension) -> grunt.log.error "#{extension}: #{types[extension].length}"