diff --git a/.gitignore b/.gitignore index 955852e2..665cbb82 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ extension/Handlebar.js upload.py gen/ node_modules/ +.tmp/ diff --git a/Gruntfile.js b/Gruntfile.js index bd90d175..3457337e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,63 +1,187 @@ -'use strict'; +var request = require('superagent'); module.exports = function(grunt) { + 'use strict'; + + require('load-grunt-tasks')(grunt); + grunt.initConfig({ - 'git-describe': { - options: { + pkg: grunt.file.readJSON('package.json'), + changelog: 'CHANGELOG.md', + + 'gh-release': {}, - }, - 'run': {} - }, closurecompiler: { minify: { requiresConfig: 'git-revision', files: { - "gen/axs_testing.js": [ - "./lib/closure-library/closure/goog/base.js", - "./src/js/axs.js", - "./src/js/BrowserUtils.js", - "./src/js/Constants.js", - "./src/js/AccessibilityUtils.js", - "./src/js/Properties.js", - "./src/js/AuditRule.js", - "./src/js/AuditRules.js", - "./src/js/AuditResults.js", - "./src/js/Audit.js", - "./src/audits/*" + '.tmp/build/axs_testing.js': [ + './lib/closure-library/closure/goog/base.js', + './src/js/axs.js', + './src/js/BrowserUtils.js', + './src/js/Constants.js', + './src/js/AccessibilityUtils.js', + './src/js/Properties.js', + './src/js/AuditRule.js', + './src/js/AuditRules.js', + './src/js/AuditResults.js', + './src/js/Audit.js', + './src/audits/*' ] }, options: { - "language_in": "ECMASCRIPT5", - "formatting": "PRETTY_PRINT", - "summary_detail_level": 3, - "warning_level": "VERBOSE", - "compilation_level": "SIMPLE_OPTIMIZATIONS", - "output_wrapper": "<%= grunt.file.read('scripts/output_wrapper.txt') %>", - "externs": "./src/js/externs/externs.js" + 'language_in': 'ECMASCRIPT5', + 'formatting': 'PRETTY_PRINT', + 'summary_detail_level': 3, + 'warning_level': 'VERBOSE', + 'compilation_level': 'SIMPLE_OPTIMIZATIONS', + 'output_wrapper': "<%= grunt.file.read('scripts/output_wrapper.txt') %>", + 'externs': './src/js/externs/externs.js' } } }, + qunit: { all: ['test/index.html'] + }, + + copy: { + dist: { + expand: true, + cwd: '.tmp/build', + src: '**/*', + dest: 'dist/js' + } + }, + + clean: { + all: ['.tmp', 'dist'] + }, + + bump: { + options: { + files: ['package.json', 'bower.json'], + updateConfigs: ['pkg'], + pushTo: "<%= grunt.config.get('gh-release.remote') %>", + commitFiles: ['package.json', grunt.config.get('changelog'), 'bower.json', 'dist'] + } + }, + + prompt: { + 'gh-release': { + options: { + questions: [ + { + config: 'gh-release.remote', + type: 'input', + message: 'Git Remote (usually GoogleChrome or origin)', + default: 'GoogleChrome', + validate: function(val) { + return (grunt.util._.size(val) > 0); + } + }, + { + config: 'gh-release.repo', + type: 'input', + message: 'Github Repository', + default: 'GoogleChrome/accessibility-developer-tools', + validate: function(val) { + return (grunt.util._.size(val) > 0); + } + }, + { + config: 'gh-release.username', + type: 'input', + message: 'Github Username', + validate: function(val) { + return (grunt.util._.size(val) > 0); + } + }, + { + config: 'gh-release.password', + type: 'password', + message: 'Github Password or Token', + validate: function(val) { + return (grunt.util._.size(val) > 0); + } + } + ] + } + } } }); - grunt.loadNpmTasks('grunt-closurecompiler'); - grunt.loadNpmTasks('grunt-contrib-qunit'); + grunt.registerTask('changelog', function(type) { + grunt.task.requires('bump-only:' + type); - grunt.registerTask('git-describe', function() { - var _spawn = require("grunt-util-spawn")(grunt); + var config = { + data: { + version: grunt.config.get('pkg.version'), + releaseDate: grunt.template.today("yyyy-mm-dd") + } + }; + var stopRegex = /^\#\#\ [0-9]+.*$/m; + var stopIndex = 0; + var releaseNotes = ''; + var dest = grunt.config.get('changelog'); + var contents = grunt.file.read(dest); + var headerTpl = "## <%= version %> - <%= releaseDate %>\n\n"; + var header = grunt.template.process(headerTpl, config); + + if (contents.length > 0) { + if ((stopIndex = contents.search(stopRegex)) !== -1) { + releaseNotes = contents.slice(0, stopIndex); + } + } + + grunt.config.set("gh-release.release-notes", releaseNotes); + + grunt.file.write(dest, "" + header + contents); + grunt.log.ok("Changelog updated, and release notes extracted."); + }); + + grunt.registerTask('gh-release', function() { + var config = grunt.config.get('gh-release'); + var pkg = grunt.config.get('pkg'); + var done = this.async(); + + request + .post('https://api.github.com/repos/' + config.repo + '/releases') + .auth(config.username, config.password) + .set('Accept', 'application/vnd.github.v3') + .set('User-Agent', 'grunt') + .send({ + 'tag_name': 'v' + pkg.version, + name: pkg.version, + body: config['release-notes'], + draft: true + }) + .end(function(err, res){ + if (typeof err !== "undefined" && err !== null) { + grunt.fail.warn('Error encountered while creating Github release.', err); + } + + if (res.statusCode === 201){ + grunt.log.ok('Github release created'); + done(); + } else { + grunt.fail.warn('Unable to create github release.', res.text); + } + }); + }); + + grunt.registerTask('git-describe', function() { // Start async task var done = this.async(); - _spawn({ - "cmd" : "git", - "args" : [ "rev-parse", "HEAD" ], - "opts" : { - "cwd" : "." + grunt.util.spawn({ + 'cmd' : 'git', + 'args' : [ 'rev-parse', 'HEAD' ], + 'opts' : { + 'cwd' : '.' } - }, function(err, result) { + }, function(err, result) { if (err) { grunt.log.error(err).verbose.error(result); done(); @@ -69,20 +193,34 @@ module.exports = function(grunt) { }); }); + grunt.registerTask('release', function(type) { + if (typeof type === 'undefined' || type === null) { + grunt.fail.fatal('You must specify a release type. i.e. grunt release:prerelease'); + } + + grunt.task.run([ + 'prompt:gh-release', + 'build', + 'test:unit', + 'copy:dist', + 'bump-only:' + type, + 'changelog:' + type, + 'bump-commit', + 'gh-release' + ]); + }); + grunt.registerTask('save-revision', function() { grunt.event.once('git-describe', function (rev) { - grunt.log.writeln("Git Revision: " + rev); + grunt.log.writeln('Git Revision: ' + rev); grunt.config.set('git-revision', rev); }); grunt.task.run('git-describe'); }); - grunt.registerTask('copy-dist', function() { - grunt.file.copy('gen/axs_testing.js', 'dist/js/axs_testing.js'); - }); + grunt.registerTask('build', ['clean:all', 'save-revision', 'closurecompiler:minify']); + grunt.registerTask('test:unit', ['qunit']); - grunt.registerTask('default', ['save-revision', 'closurecompiler:minify', 'qunit']); - grunt.registerTask('build', ['default', 'copy-dist']); - grunt.registerTask('travis', ['closurecompiler:minify', 'qunit']); + grunt.registerTask('travis', ['closurecompiler:minify', 'test:unit']); + grunt.registerTask('default', ['build', 'test:unit']); }; - diff --git a/bower.json b/bower.json index 2611fe5a..c8233970 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "accessibility-developer-tools", - "version": "2.7.0", + "version": "2.7.1-2", "homepage": "https://github.com/GoogleChrome/accessibility-developer-tools", "authors": [ "Google" diff --git a/dist/js/.gitkeep b/dist/js/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/dist/js/axs_testing.js b/dist/js/axs_testing.js index 7236b238..5803b76d 100644 --- a/dist/js/axs_testing.js +++ b/dist/js/axs_testing.js @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - * Generated from http://github.com/GoogleChrome/accessibility-developer-tools/tree/a33b34feb4bf5c6990c9d88f98c3c8e3115168ab + * Generated from http://github.com/GoogleChrome/accessibility-developer-tools/tree/0c7d7eea6a18368637fa2366427d875d9672a582 * * See project README for build steps. */ @@ -62,7 +62,7 @@ goog.setTestOnly = function(a) { goog.forwardDeclare = function(a) { }; COMPILED || (goog.isProvided_ = function(a) { - return !goog.implicitNamespaces_[a] && goog.isDefAndNotNull(goog.getObjectByName(a)); + return!goog.implicitNamespaces_[a] && goog.isDefAndNotNull(goog.getObjectByName(a)); }, goog.implicitNamespaces_ = {}); goog.getObjectByName = function(a, b) { for (var c = a.split("."), d = b || goog.global, e;e = c.shift();) { @@ -153,14 +153,14 @@ goog.DEPENDENCIES_ENABLED && (goog.included_ = {}, goog.dependencies_ = {pathToN var b = goog.global.document; if ("complete" == b.readyState) { if (/\bdeps.js$/.test(a)) { - return !1; + return!1; } throw Error('Cannot write "' + a + '" after document load'); } b.write('