From 51cb868699d21a7197c3671f1240bec03a75551d Mon Sep 17 00:00:00 2001
From: Bill Wallace <wayfarer3130@gmail.com>
Date: Wed, 5 Mar 2025 10:28:59 -0500
Subject: [PATCH 1/2] fix: dependency updates in preparation for adding
 typescript

---
 .gitignore           |   4 +
 Gruntfile.js         | 160 ++++++++++++-----------
 dist/loglevel.js     | 293 -------------------------------------------
 dist/loglevel.min.js |   3 -
 package.json         |  11 +-
 5 files changed, 93 insertions(+), 378 deletions(-)
 delete mode 100644 dist/loglevel.js
 delete mode 100644 dist/loglevel.min.js

diff --git a/.gitignore b/.gitignore
index 78f4955..37d0c52 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,7 @@ npm-debug.log
 
 _SpecRunner.html
 .grunt
+
+dist/
+*.code-workspace
+package-lock.json
diff --git a/Gruntfile.js b/Gruntfile.js
index 5af9f54..bd5615e 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,40 +1,41 @@
-'use strict';
+"use strict";
 
-var Jasmine = require('jasmine');
+var Jasmine = require("jasmine");
 
 module.exports = function (grunt) {
     var jasmineRequireJsOptions = {
-        specs: 'test/*-test.js',
-        helpers: 'test/*-helper.js',
+        specs: "test/*-test.js",
+        helpers: "test/*-helper.js",
     };
 
     // Project configuration.
     grunt.initConfig({
         // Metadata.
-        pkg: grunt.file.readJSON('package.json'),
-        banner: '/*! <%= pkg.name %> - v<%= pkg.version %>' +
-                ' - <%= pkg.homepage %>' +
-                ' - (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>' +
-                ' - licensed <%= pkg.license %> */\n',
+        pkg: grunt.file.readJSON("package.json"),
+        banner:
+            "/*! <%= pkg.name %> - v<%= pkg.version %>" +
+            " - <%= pkg.homepage %>" +
+            ' - (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>' +
+            " - licensed <%= pkg.license %> */\n",
         // Task configuration.
         concat: {
             options: {
-                banner: '<%= banner %>',
-                stripBanners: true
+                banner: "<%= banner %>",
+                stripBanners: true,
             },
             dist: {
-                src: ['lib/<%= pkg.name %>.js'],
-                dest: 'dist/<%= pkg.name %>.js'
-            }
+                src: ["lib/<%= pkg.name %>.js"],
+                dest: "dist/<%= pkg.name %>.js",
+            },
         },
         uglify: {
             options: {
-                banner: '<%= banner %>'
+                banner: "<%= banner %>",
             },
             dist: {
-                src: '<%= concat.dist.dest %>',
-                dest: 'dist/<%= pkg.name %>.min.js'
-            }
+                src: "<%= concat.dist.dest %>",
+                dest: "dist/<%= pkg.name %>.min.js",
+            },
         },
         jasmine: {
             requirejs: {
@@ -42,124 +43,131 @@ module.exports = function (grunt) {
                 options: {
                     specs: jasmineRequireJsOptions.specs,
                     helpers: jasmineRequireJsOptions.helpers,
-                    template: require('./vendor/grunt-template-jasmine-requirejs')
-                }
+                    template: require("./vendor/grunt-template-jasmine-requirejs"),
+                },
             },
             global: {
-                src: 'lib/**/*.js',
+                src: "lib/**/*.js",
                 options: {
-                    specs: 'test/global-integration.js',
-                }
+                    specs: "test/global-integration.js",
+                },
             },
             context: {
-                src: 'test/test-context-using-apply.generated.js',
+                src: "test/test-context-using-apply.generated.js",
                 options: {
-                    specs: 'test/global-integration-with-new-context.js',
-                }
-            }
+                    specs: "test/global-integration-with-new-context.js",
+                },
+            },
         },
         jasmine_node: {
             options: {
-                specs: ['test/node-integration.js']
-            }
+                specs: ["test/node-integration.js"],
+            },
         },
         open: {
             jasmine: {
-                path: 'http://127.0.0.1:8000/_SpecRunner.html'
-            }
+                path: "http://127.0.0.1:8000/_SpecRunner.html",
+            },
         },
         connect: {
             test: {
                 port: 8000,
-                keepalive: true
-            }
+                keepalive: true,
+            },
         },
         jshint: {
             options: {
-                jshintrc: '.jshintrc'
+                jshintrc: ".jshintrc",
             },
             gruntfile: {
-                src: 'Gruntfile.js'
+                src: "Gruntfile.js",
             },
             lib: {
                 options: {
-                    jshintrc: 'lib/.jshintrc'
+                    jshintrc: "lib/.jshintrc",
                 },
-                src: ['lib/**/*.js']
+                src: ["lib/**/*.js"],
             },
             test: {
                 options: {
-                    jshintrc: 'test/.jshintrc'
+                    jshintrc: "test/.jshintrc",
                 },
-                src: ['test/*.js', '!test/*.generated.js']
-            }
+                src: ["test/*.js", "!test/*.generated.js"],
+            },
         },
         watch: {
             gruntfile: {
-                files: '<%= jshint.gruntfile.src %>',
-                tasks: ['jshint:gruntfile']
+                files: "<%= jshint.gruntfile.src %>",
+                tasks: ["jshint:gruntfile"],
             },
             lib: {
-                files: '<%= jshint.lib.src %>',
-                tasks: ['jshint:lib', 'test']
+                files: "<%= jshint.lib.src %>",
+                tasks: ["jshint:lib", "test"],
             },
             test: {
-                files: '<%= jshint.test.src %>',
-                tasks: ['jshint:test', 'test']
-            }
+                files: "<%= jshint.test.src %>",
+                tasks: ["jshint:test", "test"],
+            },
         },
         preprocess: {
             "test-context-using-apply": {
-                src: 'test/test-context-using-apply.js',
-                dest: 'test/test-context-using-apply.generated.js'
-            }
+                src: "test/test-context-using-apply.js",
+                dest: "test/test-context-using-apply.generated.js",
+            },
+        },
+        clean: {
+            test: ["test/test-context-using-apply.generated.js"],
         },
-        clean:{
-            test:['test/test-context-using-apply.generated.js']
-        }
     });
 
     // These plugins provide necessary tasks.
-    grunt.loadNpmTasks('grunt-contrib-concat');
-    grunt.loadNpmTasks('grunt-contrib-uglify');
-    grunt.loadNpmTasks('grunt-contrib-jasmine');
-    grunt.loadNpmTasks('grunt-contrib-jshint');
-    grunt.loadNpmTasks('grunt-contrib-watch');
+    grunt.loadNpmTasks("grunt-contrib-concat");
+    grunt.loadNpmTasks("grunt-contrib-uglify");
+    grunt.loadNpmTasks("grunt-contrib-jasmine");
+    grunt.loadNpmTasks("grunt-contrib-jshint");
+    grunt.loadNpmTasks("grunt-contrib-watch");
 
-    grunt.loadNpmTasks('grunt-contrib-connect');
-    grunt.loadNpmTasks('grunt-open');
-    grunt.loadNpmTasks('grunt-preprocess');
-    grunt.loadNpmTasks('grunt-contrib-clean');
+    grunt.loadNpmTasks("grunt-contrib-connect");
+    grunt.loadNpmTasks("grunt-open");
+    grunt.loadNpmTasks("grunt-preprocess");
+    grunt.loadNpmTasks("grunt-contrib-clean");
 
     // Run Jasmine with Node.js tests (as opposed to browser tests).
     //
     // NOTE: This is designed for Jasmine 2.4, which matches the version used
     // in `grunt-contrib-jasmine`. If that package is updated, this should also
     // be updated to match.
-    grunt.registerTask('jasmine_node', 'Run Jasmine in Node.js', function() {
-        var done = this.async();
-
+    grunt.registerTask("jasmine_node", "Run Jasmine in Node.js", function () {
         var jasmine = new Jasmine({ projectBaseDir: __dirname });
-        jasmine.onComplete(function(success) {
-            done(success);
-        });
 
         jasmine.execute(this.options().specs);
     });
 
     // Build a distributable release
-    grunt.registerTask('dist', ['test', 'dist-build']);
-    grunt.registerTask('dist-build', ['concat', 'uglify']);
+    grunt.registerTask("dist", ["test", "dist-build"]);
+    grunt.registerTask("dist-build", ["concat", "uglify"]);
 
     // Check everything is good
-    grunt.registerTask('test', ['jshint', 'test-browser', 'test-node']);
-    grunt.registerTask('test-browser', ['jasmine:global', 'test-browser-context', 'jasmine:requirejs']);
-    grunt.registerTask('test-browser-context', ['preprocess', 'jasmine:context', 'clean:test']);
-    grunt.registerTask('test-node', ['jasmine_node']);
+    grunt.registerTask("test", ["jshint", "test-browser", "test-node"]);
+    grunt.registerTask("test-browser", [
+        "jasmine:global",
+        "test-browser-context",
+        "jasmine:requirejs",
+    ]);
+    grunt.registerTask("test-browser-context", [
+        "preprocess",
+        "jasmine:context",
+        "clean:test",
+    ]);
+    grunt.registerTask("test-node", ["jasmine_node"]);
 
     // Test with a live server and an actual browser
-    grunt.registerTask('integration-test', ['jasmine:requirejs:src:build', 'open:jasmine', 'connect:test:keepalive']);
+    grunt.registerTask("integration-test", [
+        "jasmine:requirejs:src:build",
+        "open:jasmine",
+        "connect:test:keepalive",
+    ]);
 
     // Default task.
-    grunt.registerTask('default', 'test');
+    grunt.registerTask("default", "test");
 };
diff --git a/dist/loglevel.js b/dist/loglevel.js
deleted file mode 100644
index 893e4cb..0000000
--- a/dist/loglevel.js
+++ /dev/null
@@ -1,293 +0,0 @@
-/*! loglevel - v1.9.2 - https://github.com/pimterry/loglevel - (c) 2024 Tim Perry - licensed MIT */
-(function (root, definition) {
-    "use strict";
-    if (typeof define === 'function' && define.amd) {
-        define(definition);
-    } else if (typeof module === 'object' && module.exports) {
-        module.exports = definition();
-    } else {
-        root.log = definition();
-    }
-}(this, function () {
-    "use strict";
-
-    // Slightly dubious tricks to cut down minimized file size
-    var noop = function() {};
-    var undefinedType = "undefined";
-
-    var logMethods = [
-        "trace",
-        "debug",
-        "info",
-        "warn",
-        "error"
-    ];
-
-    var _loggersByName = {};
-    var defaultLogger = null;
-
-    // Build the best logging method possible for this env
-    // Wherever possible we want to bind, not wrap, to preserve stack traces
-    function defaultMethodFactory(methodName, _level, _loggerName) {
-        if (typeof console !== undefinedType) {
-            var consoleMethod = console[methodName] || console.log;
-            if (typeof consoleMethod === "function") {
-                return consoleMethod.bind(console);
-            }
-        }
-
-        return noop;
-    }
-
-    // These private functions always need `this` to be set properly
-
-    function replaceLoggingMethods() {
-        /*jshint validthis:true */
-        var level = this.getLevel();
-
-        // Replace the actual methods.
-        for (var i = 0; i < logMethods.length; i++) {
-            var methodName = logMethods[i];
-            this[methodName] = (i < level) ?
-                noop :
-                this.methodFactory(methodName, level, this.name);
-        }
-
-        // Make `log.log` an alias to ensure compatibility with `console.*`.
-        this.log = this.info;
-
-        // Return any important warnings.
-        if (typeof console === undefinedType && level < this.levels.SILENT) {
-            return "No console available for logging";
-        }
-    }
-
-    function Logger(name, factory) {
-      // Private instance variables.
-      var self = this;
-      /**
-       * The level inherited from a parent logger (or a global default). We
-       * cache this here rather than delegating to the parent so that it stays
-       * in sync with the actual logging methods that we have installed (the
-       * parent could change levels but we might not have rebuilt the loggers
-       * in this child yet).
-       * @type {number}
-       */
-      var inheritedLevel;
-      /**
-       * The default level for this logger, if any. If set, this overrides
-       * `inheritedLevel`.
-       * @type {number|null}
-       */
-      var defaultLevel;
-      /**
-       * A user-specific level for this logger. If set, this overrides
-       * `defaultLevel`.
-       * @type {number|null}
-       */
-      var userLevel;
-
-      var storageKey = "loglevel";
-      if (typeof name === "string") {
-        storageKey += ":" + name;
-      } else if (typeof name === "symbol") {
-        storageKey = undefined;
-      }
-
-      function persistLevelIfPossible(levelNum) {
-          var levelName = (logMethods[levelNum] || 'silent').toUpperCase();
-
-          if (typeof window === undefinedType || !storageKey) return;
-
-          // Use localStorage if available
-          try {
-              window.localStorage[storageKey] = levelName;
-              return;
-          } catch (ignore) {}
-
-          // Use session cookie as fallback
-          try {
-              window.document.cookie =
-                encodeURIComponent(storageKey) + "=" + levelName + ";";
-          } catch (ignore) {}
-      }
-
-      function getPersistedLevel() {
-          var storedLevel;
-
-          if (typeof window === undefinedType || !storageKey) return;
-
-          try {
-              storedLevel = window.localStorage[storageKey];
-          } catch (ignore) {}
-
-          // Fallback to cookies if local storage gives us nothing
-          if (typeof storedLevel === undefinedType) {
-              try {
-                  var cookie = window.document.cookie;
-                  var cookieName = encodeURIComponent(storageKey);
-                  var location = cookie.indexOf(cookieName + "=");
-                  if (location !== -1) {
-                      storedLevel = /^([^;]+)/.exec(
-                          cookie.slice(location + cookieName.length + 1)
-                      )[1];
-                  }
-              } catch (ignore) {}
-          }
-
-          // If the stored level is not valid, treat it as if nothing was stored.
-          if (self.levels[storedLevel] === undefined) {
-              storedLevel = undefined;
-          }
-
-          return storedLevel;
-      }
-
-      function clearPersistedLevel() {
-          if (typeof window === undefinedType || !storageKey) return;
-
-          // Use localStorage if available
-          try {
-              window.localStorage.removeItem(storageKey);
-          } catch (ignore) {}
-
-          // Use session cookie as fallback
-          try {
-              window.document.cookie =
-                encodeURIComponent(storageKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC";
-          } catch (ignore) {}
-      }
-
-      function normalizeLevel(input) {
-          var level = input;
-          if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) {
-              level = self.levels[level.toUpperCase()];
-          }
-          if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) {
-              return level;
-          } else {
-              throw new TypeError("log.setLevel() called with invalid level: " + input);
-          }
-      }
-
-      /*
-       *
-       * Public logger API - see https://github.com/pimterry/loglevel for details
-       *
-       */
-
-      self.name = name;
-
-      self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3,
-          "ERROR": 4, "SILENT": 5};
-
-      self.methodFactory = factory || defaultMethodFactory;
-
-      self.getLevel = function () {
-          if (userLevel != null) {
-            return userLevel;
-          } else if (defaultLevel != null) {
-            return defaultLevel;
-          } else {
-            return inheritedLevel;
-          }
-      };
-
-      self.setLevel = function (level, persist) {
-          userLevel = normalizeLevel(level);
-          if (persist !== false) {  // defaults to true
-              persistLevelIfPossible(userLevel);
-          }
-
-          // NOTE: in v2, this should call rebuild(), which updates children.
-          return replaceLoggingMethods.call(self);
-      };
-
-      self.setDefaultLevel = function (level) {
-          defaultLevel = normalizeLevel(level);
-          if (!getPersistedLevel()) {
-              self.setLevel(level, false);
-          }
-      };
-
-      self.resetLevel = function () {
-          userLevel = null;
-          clearPersistedLevel();
-          replaceLoggingMethods.call(self);
-      };
-
-      self.enableAll = function(persist) {
-          self.setLevel(self.levels.TRACE, persist);
-      };
-
-      self.disableAll = function(persist) {
-          self.setLevel(self.levels.SILENT, persist);
-      };
-
-      self.rebuild = function () {
-          if (defaultLogger !== self) {
-              inheritedLevel = normalizeLevel(defaultLogger.getLevel());
-          }
-          replaceLoggingMethods.call(self);
-
-          if (defaultLogger === self) {
-              for (var childName in _loggersByName) {
-                _loggersByName[childName].rebuild();
-              }
-          }
-      };
-
-      // Initialize all the internal levels.
-      inheritedLevel = normalizeLevel(
-          defaultLogger ? defaultLogger.getLevel() : "WARN"
-      );
-      var initialLevel = getPersistedLevel();
-      if (initialLevel != null) {
-          userLevel = normalizeLevel(initialLevel);
-      }
-      replaceLoggingMethods.call(self);
-    }
-
-    /*
-     *
-     * Top-level API
-     *
-     */
-
-    defaultLogger = new Logger();
-
-    defaultLogger.getLogger = function getLogger(name) {
-        if ((typeof name !== "symbol" && typeof name !== "string") || name === "") {
-            throw new TypeError("You must supply a name when creating a logger.");
-        }
-
-        var logger = _loggersByName[name];
-        if (!logger) {
-            logger = _loggersByName[name] = new Logger(
-                name,
-                defaultLogger.methodFactory
-            );
-        }
-        return logger;
-    };
-
-    // Grab the current global log variable in case of overwrite
-    var _log = (typeof window !== undefinedType) ? window.log : undefined;
-    defaultLogger.noConflict = function() {
-        if (typeof window !== undefinedType &&
-               window.log === defaultLogger) {
-            window.log = _log;
-        }
-
-        return defaultLogger;
-    };
-
-    defaultLogger.getLoggers = function getLoggers() {
-        return _loggersByName;
-    };
-
-    // ES6 default export, for compatibility
-    defaultLogger['default'] = defaultLogger;
-
-    return defaultLogger;
-}));
diff --git a/dist/loglevel.min.js b/dist/loglevel.min.js
deleted file mode 100644
index 5d1b396..0000000
--- a/dist/loglevel.min.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! loglevel - v1.9.2 - https://github.com/pimterry/loglevel - (c) 2024 Tim Perry - licensed MIT */
-
-!function(e,o){"use strict";"function"==typeof define&&define.amd?define(o):"object"==typeof module&&module.exports?module.exports=o():e.log=o()}(this,function(){"use strict";var l=function(){},a="undefined",s=["trace","debug","info","warn","error"],d={},v=null;function w(e,o,n){if(typeof console!==a){var t=console[e]||console.log;if("function"==typeof t)return t.bind(console)}return l}function g(){for(var e=this.getLevel(),o=0;o<s.length;o++){var n=s[o];this[n]=o<e?l:this.methodFactory(n,e,this.name)}if(this.log=this.info,typeof console===a&&e<this.levels.SILENT)return"No console available for logging"}function n(e,o){var n,t,l,i=this,r="loglevel";function c(){var e;if(typeof window!==a&&r){try{e=window.localStorage[r]}catch(e){}if(typeof e===a)try{var o=window.document.cookie,n=encodeURIComponent(r),t=o.indexOf(n+"=");-1!==t&&(e=/^([^;]+)/.exec(o.slice(t+n.length+1))[1])}catch(e){}return void 0===i.levels[e]&&(e=void 0),e}}function f(e){var o=e;if("string"==typeof o&&void 0!==i.levels[o.toUpperCase()]&&(o=i.levels[o.toUpperCase()]),"number"==typeof o&&0<=o&&o<=i.levels.SILENT)return o;throw new TypeError("log.setLevel() called with invalid level: "+e)}"string"==typeof e?r+=":"+e:"symbol"==typeof e&&(r=void 0),i.name=e,i.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},i.methodFactory=o||w,i.getLevel=function(){return null!=l?l:null!=t?t:n},i.setLevel=function(e,o){return l=f(e),!1!==o&&function(e){var o=(s[e]||"silent").toUpperCase();if(typeof window!==a&&r){try{return window.localStorage[r]=o}catch(e){}try{window.document.cookie=encodeURIComponent(r)+"="+o+";"}catch(e){}}}(l),g.call(i)},i.setDefaultLevel=function(e){t=f(e),c()||i.setLevel(e,!1)},i.resetLevel=function(){l=null,function(){if(typeof window!==a&&r){try{window.localStorage.removeItem(r)}catch(e){}try{window.document.cookie=encodeURIComponent(r)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch(e){}}}(),g.call(i)},i.enableAll=function(e){i.setLevel(i.levels.TRACE,e)},i.disableAll=function(e){i.setLevel(i.levels.SILENT,e)},i.rebuild=function(){if(v!==i&&(n=f(v.getLevel())),g.call(i),v===i)for(var e in d)d[e].rebuild()},n=f(v?v.getLevel():"WARN");var u=c();null!=u&&(l=f(u)),g.call(i)}(v=new n).getLogger=function(e){if("symbol"!=typeof e&&"string"!=typeof e||""===e)throw new TypeError("You must supply a name when creating a logger.");var o=d[e];return o||(o=d[e]=new n(e,v.methodFactory)),o};var e=typeof window!==a?window.log:void 0;return v.noConflict=function(){return typeof window!==a&&window.log===v&&(window.log=e),v},v.getLoggers=function(){return d},v.default=v});
\ No newline at end of file
diff --git a/package.json b/package.json
index 565008c..72ce0be 100644
--- a/package.json
+++ b/package.json
@@ -35,24 +35,23 @@
     "dist-build": "grunt dist-build",
     "watch": "grunt watch"
   },
-  "dependencies": {},
   "devDependencies": {
     "@types/core-js": "2.5.0",
     "@types/node": "^12.0.4",
-    "grunt": "~1.5.3",
-    "grunt-cli": "^1.4.3",
+    "grunt": "~1.6.1",
+    "grunt-cli": "^1.5.0",
     "grunt-contrib-clean": "^1.1.0",
     "grunt-contrib-concat": "~0.5.0",
     "grunt-contrib-connect": "^3.0.0",
     "grunt-contrib-jasmine": "^4.0.0",
     "grunt-contrib-jshint": "^3.2.0",
-    "grunt-contrib-uglify": "^3.4.0",
+    "grunt-contrib-uglify": "^5.2.2",
     "grunt-contrib-watch": "^1.1.0",
     "grunt-open": "~0.2.3",
     "grunt-preprocess": "^5.1.0",
-    "jasmine": "^2.4.1",
+    "jasmine": "^5.6.0",
     "ts-node": "^10.9.2",
-    "typescript": "^3.5.1"
+    "typescript": "^5.8.2"
   },
   "keywords": [
     "log",

From ef289b820a0cb564a1a51bbfcde3656aceb5a028 Mon Sep 17 00:00:00 2001
From: Bill Wallace <wayfarer3130@gmail.com>
Date: Wed, 5 Mar 2025 12:18:57 -0500
Subject: [PATCH 2/2] Undo quote change

---
 Gruntfile.js | 155 +++++++++++++++++++++++----------------------------
 1 file changed, 71 insertions(+), 84 deletions(-)

diff --git a/Gruntfile.js b/Gruntfile.js
index bd5615e..aba2f90 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,41 +1,40 @@
-"use strict";
+'use strict';
 
-var Jasmine = require("jasmine");
+var Jasmine = require('jasmine');
 
 module.exports = function (grunt) {
     var jasmineRequireJsOptions = {
-        specs: "test/*-test.js",
-        helpers: "test/*-helper.js",
+        specs: 'test/*-test.js',
+        helpers: 'test/*-helper.js',
     };
 
     // Project configuration.
     grunt.initConfig({
         // Metadata.
-        pkg: grunt.file.readJSON("package.json"),
-        banner:
-            "/*! <%= pkg.name %> - v<%= pkg.version %>" +
-            " - <%= pkg.homepage %>" +
-            ' - (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>' +
-            " - licensed <%= pkg.license %> */\n",
+        pkg: grunt.file.readJSON('package.json'),
+        banner: '/*! <%= pkg.name %> - v<%= pkg.version %>' +
+                ' - <%= pkg.homepage %>' +
+                ' - (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>' +
+                ' - licensed <%= pkg.license %> */\n',
         // Task configuration.
         concat: {
             options: {
-                banner: "<%= banner %>",
-                stripBanners: true,
+                banner: '<%= banner %>',
+                stripBanners: true
             },
             dist: {
-                src: ["lib/<%= pkg.name %>.js"],
-                dest: "dist/<%= pkg.name %>.js",
-            },
+                src: ['lib/<%= pkg.name %>.js'],
+                dest: 'dist/<%= pkg.name %>.js'
+            }
         },
         uglify: {
             options: {
-                banner: "<%= banner %>",
+                banner: '<%= banner %>'
             },
             dist: {
-                src: "<%= concat.dist.dest %>",
-                dest: "dist/<%= pkg.name %>.min.js",
-            },
+                src: '<%= concat.dist.dest %>',
+                dest: 'dist/<%= pkg.name %>.min.js'
+            }
         },
         jasmine: {
             requirejs: {
@@ -43,131 +42,119 @@ module.exports = function (grunt) {
                 options: {
                     specs: jasmineRequireJsOptions.specs,
                     helpers: jasmineRequireJsOptions.helpers,
-                    template: require("./vendor/grunt-template-jasmine-requirejs"),
-                },
+                    template: require('./vendor/grunt-template-jasmine-requirejs')
+                }
             },
             global: {
-                src: "lib/**/*.js",
+                src: 'lib/**/*.js',
                 options: {
-                    specs: "test/global-integration.js",
-                },
+                    specs: 'test/global-integration.js',
+                }
             },
             context: {
-                src: "test/test-context-using-apply.generated.js",
+                src: 'test/test-context-using-apply.generated.js',
                 options: {
-                    specs: "test/global-integration-with-new-context.js",
-                },
-            },
+                    specs: 'test/global-integration-with-new-context.js',
+                }
+            }
         },
         jasmine_node: {
             options: {
-                specs: ["test/node-integration.js"],
-            },
+                specs: ['test/node-integration.js']
+            }
         },
         open: {
             jasmine: {
-                path: "http://127.0.0.1:8000/_SpecRunner.html",
-            },
+                path: 'http://127.0.0.1:8000/_SpecRunner.html'
+            }
         },
         connect: {
             test: {
                 port: 8000,
-                keepalive: true,
-            },
+                keepalive: true
+            }
         },
         jshint: {
             options: {
-                jshintrc: ".jshintrc",
+                jshintrc: '.jshintrc'
             },
             gruntfile: {
-                src: "Gruntfile.js",
+                src: 'Gruntfile.js'
             },
             lib: {
                 options: {
-                    jshintrc: "lib/.jshintrc",
+                    jshintrc: 'lib/.jshintrc'
                 },
-                src: ["lib/**/*.js"],
+                src: ['lib/**/*.js']
             },
             test: {
                 options: {
-                    jshintrc: "test/.jshintrc",
+                    jshintrc: 'test/.jshintrc'
                 },
-                src: ["test/*.js", "!test/*.generated.js"],
-            },
+                src: ['test/*.js', '!test/*.generated.js']
+            }
         },
         watch: {
             gruntfile: {
-                files: "<%= jshint.gruntfile.src %>",
-                tasks: ["jshint:gruntfile"],
+                files: '<%= jshint.gruntfile.src %>',
+                tasks: ['jshint:gruntfile']
             },
             lib: {
-                files: "<%= jshint.lib.src %>",
-                tasks: ["jshint:lib", "test"],
+                files: '<%= jshint.lib.src %>',
+                tasks: ['jshint:lib', 'test']
             },
             test: {
-                files: "<%= jshint.test.src %>",
-                tasks: ["jshint:test", "test"],
-            },
+                files: '<%= jshint.test.src %>',
+                tasks: ['jshint:test', 'test']
+            }
         },
         preprocess: {
             "test-context-using-apply": {
-                src: "test/test-context-using-apply.js",
-                dest: "test/test-context-using-apply.generated.js",
-            },
-        },
-        clean: {
-            test: ["test/test-context-using-apply.generated.js"],
+                src: 'test/test-context-using-apply.js',
+                dest: 'test/test-context-using-apply.generated.js'
+            }
         },
+        clean:{
+            test:['test/test-context-using-apply.generated.js']
+        }
     });
 
     // These plugins provide necessary tasks.
-    grunt.loadNpmTasks("grunt-contrib-concat");
-    grunt.loadNpmTasks("grunt-contrib-uglify");
-    grunt.loadNpmTasks("grunt-contrib-jasmine");
-    grunt.loadNpmTasks("grunt-contrib-jshint");
-    grunt.loadNpmTasks("grunt-contrib-watch");
+    grunt.loadNpmTasks('grunt-contrib-concat');
+    grunt.loadNpmTasks('grunt-contrib-uglify');
+    grunt.loadNpmTasks('grunt-contrib-jasmine');
+    grunt.loadNpmTasks('grunt-contrib-jshint');
+    grunt.loadNpmTasks('grunt-contrib-watch');
 
-    grunt.loadNpmTasks("grunt-contrib-connect");
-    grunt.loadNpmTasks("grunt-open");
-    grunt.loadNpmTasks("grunt-preprocess");
-    grunt.loadNpmTasks("grunt-contrib-clean");
+    grunt.loadNpmTasks('grunt-contrib-connect');
+    grunt.loadNpmTasks('grunt-open');
+    grunt.loadNpmTasks('grunt-preprocess');
+    grunt.loadNpmTasks('grunt-contrib-clean');
 
     // Run Jasmine with Node.js tests (as opposed to browser tests).
     //
     // NOTE: This is designed for Jasmine 2.4, which matches the version used
     // in `grunt-contrib-jasmine`. If that package is updated, this should also
     // be updated to match.
-    grunt.registerTask("jasmine_node", "Run Jasmine in Node.js", function () {
+    grunt.registerTask('jasmine_node', 'Run Jasmine in Node.js', function() {
         var jasmine = new Jasmine({ projectBaseDir: __dirname });
 
         jasmine.execute(this.options().specs);
     });
 
     // Build a distributable release
-    grunt.registerTask("dist", ["test", "dist-build"]);
-    grunt.registerTask("dist-build", ["concat", "uglify"]);
+    grunt.registerTask('dist', ['test', 'dist-build']);
+    grunt.registerTask('dist-build', ['concat', 'uglify']);
 
     // Check everything is good
-    grunt.registerTask("test", ["jshint", "test-browser", "test-node"]);
-    grunt.registerTask("test-browser", [
-        "jasmine:global",
-        "test-browser-context",
-        "jasmine:requirejs",
-    ]);
-    grunt.registerTask("test-browser-context", [
-        "preprocess",
-        "jasmine:context",
-        "clean:test",
-    ]);
-    grunt.registerTask("test-node", ["jasmine_node"]);
+    grunt.registerTask('test', ['jshint', 'test-browser', 'test-node']);
+    grunt.registerTask('test-browser', ['jasmine:global', 'test-browser-context', 'jasmine:requirejs']);
+    grunt.registerTask('test-browser-context', ['preprocess', 'jasmine:context', 'clean:test']);
+    grunt.registerTask('test-node', ['jasmine_node']);
 
     // Test with a live server and an actual browser
-    grunt.registerTask("integration-test", [
-        "jasmine:requirejs:src:build",
-        "open:jasmine",
-        "connect:test:keepalive",
-    ]);
+    grunt.registerTask('integration-test', ['jasmine:requirejs:src:build', 'open:jasmine', 'connect:test:keepalive']);
 
     // Default task.
-    grunt.registerTask("default", "test");
+    grunt.registerTask('default', 'test');
 };