├── .gitignore ├── .jshintrc ├── .nvmrc ├── .prettierignore ├── .prettierrc.json ├── .travis.yml ├── CHANGELOG.md ├── MIT-LICENSE.txt ├── README.md ├── bower.json ├── package-lock.json ├── package.json ├── publish.sh ├── src ├── logger.d.ts ├── logger.js └── logger.min.js ├── test-src ├── .jshintrc ├── index.html ├── loggertests.js ├── typescript-consumer │ ├── index.ts │ ├── new-style-import.ts │ └── old-style-import.ts └── vendor │ ├── qunit-1.18.0.css │ ├── qunit-1.18.0.js │ └── sinon-1.14.1.js ├── travis-ci-build.sh └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # artefacts 2 | dist/ 3 | build/ 4 | 5 | # IDE junk 6 | .settings 7 | .project 8 | .DS_Store 9 | .idea/ 10 | 11 | # NodeJS 12 | node_modules 13 | npm-debug.log 14 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "curly": true, 3 | "eqeqeq": true, 4 | "undef": true, 5 | "browser": true, 6 | "strict": true, 7 | "globals": { 8 | "console": true, 9 | "define": true, 10 | "module": true 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 14 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | src/logger.min.js 2 | test-src/vendor/**/* -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | install: 3 | - npm install 4 | script: 5 | - "./travis-ci-build.sh" 6 | before_deploy: | 7 | PKG_VERSION=$(node -p "require('./package.json').version") 8 | NPM_TAG="latest" 9 | if [[ ${PKG_VERSION} =~ -next$ ]]; then 10 | NPM_TAG="next" 11 | SHORT_COMMIT_HASH=$(git rev-parse --short HEAD) 12 | UNIQ_PKG_VERSION="${PKG_VERSION}.${SHORT_COMMIT_HASH}" 13 | npm --no-git-tag-version version ${UNIQ_PKG_VERSION} 14 | fi 15 | deploy: 16 | skip_cleanup: true 17 | provider: npm 18 | tag: "$NPM_TAG" 19 | email: 20 | secure: E0W/OPo16kYTP4USEqOyEOgVkXGVYrjyFlJB6n3ZdKbrWJ6+x4d/pHlBnfjr48F9I/A2++LttoclIaB8Jb679M2O++4CWg1kTiNpxeH/89e8ZEzY6eban+z3o+JuHWFZ5cQY5mwV5KIOfF5e1SNM49/9DYVFR0gKkEDmsX48zPE= 21 | api_key: 22 | secure: 0c81sGUazNzVs+c7JCt5t2JRSk/qOi6cHd75HXU4EVTj39KAMzY2loraqMYDnq9Pz0RNWMDtuCbIgmDWxllkJXp8EuaO6ywrrCBE2ACqio6esZ8CiXrZVey5K1tPgaloqgfcwkJM1R74x3fqv6WKzDf1PdFZV+eXo7/X2OSjpSc= 23 | on: 24 | branch: master 25 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 1.6.1 2 | 3 | - Released 12th November, 2020 4 | - Add `setDefaults` alias for `useDefaults` (#103, @harrisrobin) 5 | 6 | ## 1.6.0 7 | 8 | - Released 23rd October, 2017 9 | - Fix broken TypeScript definitions introduced in 1.5.0, fixes #85 10 | - Add `Logger.trace()` method to TypeScript definitions, fixes #86 11 | - Export all interfaces in TypeScript definitions 12 | 13 | ## 1.5.0 14 | 15 | - Released 13th October, 2017 16 | - Added `Logger.trace()` (#67, @ddanila) 17 | - Fix TypeScript definitions for ILoggerOpts (#70, @timm-gs) 18 | - Export ILogger interface in TypeScript definitions (#82, @tanneess) 19 | 20 | ## 1.4.1 21 | 22 | - Released 19th August, 2017 23 | - Fixed `Logger.getLevel()` Typescript definition error (#57, @timaebi) 24 | 25 | ## 1.4.0 26 | 27 | - Released 18th August, 2017 28 | - Add `Logger.getLevel()` (#49, @BenjaminVadant) 29 | - Invoke `console.debug` if present (#34, @ajwagner777) 30 | - Add Typing for `Logger.createDefaultHandler()` (#55, @scevallos) 31 | - Fix typo in README (#43, @gamtiq) 32 | - Update README to reference rawgit.com (#33, @tjenkinson) 33 | 34 | ## 1.3.0 35 | 36 | - Released 5th July, 2016 37 | - Add `Logger.createDefaultHandler()`, fixes #26 38 | - Correct typo in README, fixes #28 39 | - Adds Typescript definitions (`logger.d.ts`), (#27, @pjsb) 40 | 41 | ## 1.2.0 42 | 43 | - Released 10 September, 2015 44 | - Support for custom message formatter in Logger.useDefaults() 45 | - Logger.useDefaults() now expects a hash instead of a logLevel. 46 | 47 | ## 1.1.1 48 | 49 | - Released 14th July, 2015 50 | - Fixed botched npm release of 1.1.0 :) 51 | 52 | ## 1.1.0 53 | 54 | - Released 14th July, 2015 55 | - Prevent stringification of objects (#17, @paulinthought) 56 | 57 | ## 1.0.0 58 | 59 | - Released 18th April, 2015 60 | - Introduce timing operations (#time and #timeEnd) 61 | - Update gulp dependencies. 62 | 63 | ## 0.9.14 64 | 65 | - Released 4th September, 2014 66 | - Fix for IE7 (#10, @james-west) 67 | 68 | ## 0.9.12 69 | 70 | - Released 13th July, 2014 71 | - Fixed `release` task to correctly push tags to origin. 72 | 73 | ## 0.9.11 74 | 75 | - Released 11th July, 2014 76 | - Twiddling with the build and packaging process. 77 | - Added npm test script (`npm test`). 78 | 79 | ## 0.9.8 80 | 81 | - Released 11th July, 2014 82 | - Added missing minified file. 83 | 84 | ## 0.9.7 85 | 86 | - Released 11th July, 2014 87 | - Bower version updated. 88 | - Whitespace issue (spaces instead of tabs). 89 | - Dropped the notion of a `dist` folder, just giving in and checking the versioned release files into 90 | source control as it strikes me that's the "bower way"(tm). 91 | 92 | ## 0.9.6 93 | 94 | - Released 20th May, 2014 95 | - `Logger.useDefaults()` now supports IE8+ (#4, @AdrianTP) 96 | 97 | ## 0.9.5 98 | 99 | - Released 19th May, 2014 100 | - Support for NodeJS environment (#9, @fatso83) 101 | -------------------------------------------------------------------------------- /MIT-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 Jonny Reeves, http://jonnyreeves.co.uk/ 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # js-Logger [![Build Status](https://travis-ci.org/jonnyreeves/js-logger.svg?branch=master)](https://travis-ci.org/jonnyreeves/js-logger) [![npm version](https://badge.fury.io/js/js-logger.svg)](http://badge.fury.io/js/js-logger) ![npm dependencies](https://david-dm.org/jonnyreeves/js-logger.png) 2 | 3 | > Lightweight, unobtrusive, configurable JavaScript logger. 4 | 5 | [logger.js](https://github.com/jonnyreeves/js-logger/blob/master/src/logger.js) will make you rich, famous and want for almost nothing - oh and it's a flexible abstraction over using `console.log` as well. 6 | 7 | ## Installation 8 | 9 | js-Logger has zero dependencies and comes with AMD and CommonJS module boilerplate. If the last sentence meant nothing to you then just lob the following into your page: 10 | 11 | ```html 12 | 13 | ``` 14 | 15 | Have a look at [babel-plugin-js-logger](https://github.com/core-process/babel-plugin-js-logger), in case your project utilizes [Babel](https://babeljs.io/), and you want to use js-Logger throughout your entire project efficiently. 16 | 17 | ## Usage 18 | 19 | Nothing beats the sheer ecstasy of logging! js-Logger does its best to not be awkward and get in the way. If you're the sort of person who just wants to get down and dirty then all you need is one line of code: 20 | 21 | ```js 22 | // Log messages will be written to the window's console. 23 | Logger.useDefaults(); 24 | ``` 25 | 26 | Now, when you want to emit a red-hot log message, just drop one of the following (the syntax is identical to the `console` object) 27 | 28 | ```js 29 | Logger.debug("I'm a debug message!"); 30 | Logger.info("OMG! Check this window out!", window); 31 | Logger.warn("Purple Alert! Purple Alert!"); 32 | Logger.error("HOLY SHI... no carrier."); 33 | Logger.trace("Very verbose message that usually is not needed..."); 34 | Logger.trace( 35 | "...containing stack trace (if console.trace() method supports it)" 36 | ); 37 | ``` 38 | 39 | Log messages can get a bit annoying; you don't need to tell me, it's all cool. If things are getting too noisy for your liking then it's time you read up on the `Logger.setLevel` method: 40 | 41 | ```js 42 | // Only log WARN and ERROR messages. 43 | Logger.setLevel(Logger.WARN); 44 | Logger.debug("Donut machine is out of pink ones"); // Not a peep. 45 | Logger.warn("Asteroid detected!"); // Logs "Asteroid detected!", best do something about that! 46 | 47 | // Ah, you know what, I'm sick of all these messages. 48 | // But I want to see them again later 49 | var oldLevel = Logger.getLevel(); 50 | Logger.setLevel(Logger.OFF); 51 | Logger.error("Hull breach on decks 5 through to 41!"); // ... 52 | 53 | // Actually, maybe those logs were quite useful... 54 | Logger.setLevel(oldLevel); 55 | ``` 56 | 57 | ## Log Handler Functions 58 | 59 | All log messages are routed through a handler function which redirects filtered messages somewhere. You can configure the handler function via `Logger.setHandler` noting that the supplied function expects two arguments; the first being the log messages to output and the latter being a context object which can be inspected by the log handler. 60 | 61 | ```js 62 | Logger.setHandler(function (messages, context) { 63 | // Send messages to a custom logging endpoint for analysis. 64 | // TODO: Add some security? (nah, you worry too much! :P) 65 | jQuery.post("/logs", { message: messages[0], level: context.level }); 66 | }); 67 | ``` 68 | 69 | ### Default Log Handler Function 70 | 71 | js-Logger provides a default handler function which writes to your browser's `console` object using the appropriate logging functions based on the message's log level (ie: `Logger.info()` will result in a call to `console.info()`). The default handler automatically shims for sub-optiomal environments right down to IE7's complete lack of `console` object (it only appears when you open the DevTools - seriously, this is one of the anti-user troll things I've seen!) 72 | 73 | Use `Logger.createDefaultHandler()` to return a new log handler function which can then be supplied to `Logger.setHandler()`. 74 | 75 | You can customise the formatting of each log message by supplying a formatter function to `createDefaultHandler`: 76 | 77 | ```js 78 | Logger.createDefaultHandler({ 79 | formatter: function (messages, context) { 80 | // prefix each log message with a timestamp. 81 | messages.unshift(new Date().toUTCString()); 82 | }, 83 | }); 84 | ``` 85 | 86 | You can use functional composition to extend the default handler with your own custom handler logic: 87 | 88 | ```js 89 | var consoleHandler = Logger.createDefaultHandler(); 90 | var myHandler = function (messages, context) { 91 | jQuery.post("/logs", { message: messages[0], level: context.level }); 92 | }; 93 | 94 | Logger.setHandler(function (messages, context) { 95 | consoleHandler(messages, context); 96 | myHandler(messages, context); 97 | }); 98 | ``` 99 | 100 | ### useDefaults 101 | 102 | `Logger.useDefaults()` is a convenience function which allows you to configure both the default logLevel and handler in one go: 103 | 104 | ```js 105 | Logger.useDefaults({ 106 | defaultLevel: Logger.WARN, 107 | formatter: function (messages, context) { 108 | messages.unshift(new Date().toUTCString()); 109 | }, 110 | }); 111 | ``` 112 | 113 | You can also use the alias `Logger.setDefaults()`. 114 | 115 | ## Named Loggers 116 | 117 | Okay, let's get serious, logging is not for kids, it's for adults with serious software to write and mission critical log messages to trawl through. To help you in your goal, js-Logger provides 'named' loggers which can be configured individual with their own contexts. 118 | 119 | ```js 120 | // Retrieve a named logger and store it for use. 121 | var myLogger = Logger.get("ModuleA"); 122 | myLogger.info("FizzWozz starting up"); 123 | 124 | // This logger instance can be configured independent of all others (including the global one). 125 | myLogger.setLevel(Logger.WARN); 126 | 127 | // As it's the same instance being returned each time, you don't have to store a reference: 128 | Logger.get("ModuleA").warn("FizzWozz combombulated!"); 129 | ``` 130 | 131 | Note that `Logger.setLevel()` will also change the current log filter level for all named logger instances; so typically you would configure your logger levels like so: 132 | 133 | ```js 134 | // Create several named loggers (typically in their own module) 135 | var loggerA = Logger.get("LoggerA"); 136 | var loggerB = Logger.get("LoggerB"); 137 | var loggerC = Logger.get("LoggerC"); 138 | 139 | // Configure log levels. 140 | Logger.setLevel(Logger.WARN); // Global logging level. 141 | Logger.get("LoggerB").setLevel(Logger.DEBUG); // Enable debug logging for LoggerB 142 | Logger.get("LoggerC").setLevel(Logger.TRACE); // Enable trace logging for LoggerC 143 | ``` 144 | 145 | ## Profiling 146 | 147 | Sometimes its good to know what's taking so damn long; you can use `Logger.time()` and `Logger.timeEnd()` to keep tabs on things, the default log handler implementation delegates to the equivalent console methods if they exist, or write to `console.log` if they don't. 148 | 149 | ```js 150 | // Start timing something 151 | Logger.time("self destruct sequence"); 152 | 153 | // ... Some time passes ... 154 | 155 | // Stop timing something. 156 | Logger.timeEnd("self destruct sequence"); // logs: 'self destruct sequence: 1022ms'. 157 | ``` 158 | 159 | Note that `time` and `timeEnd` methods are also provided to named Logger instances. 160 | 161 | ## Usage with TypeScript 162 | 163 | TypeScript is great, you should use it. See [the typescript consumer test](./test-src/typescript-consumer/index.ts) for example usage. 164 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-logger", 3 | "main": "src/logger.js", 4 | "ignore": ["**/.*", "node_modules", "components", "test-src"] 5 | } 6 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-logger", 3 | "version": "1.6.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/json5": { 8 | "version": "0.0.29", 9 | "resolved": "http://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", 10 | "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", 11 | "dev": true 12 | }, 13 | "ajv": { 14 | "version": "5.5.2", 15 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 16 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 17 | "dev": true, 18 | "requires": { 19 | "co": "^4.6.0", 20 | "fast-deep-equal": "^1.0.0", 21 | "fast-json-stable-stringify": "^2.0.0", 22 | "json-schema-traverse": "^0.3.0" 23 | } 24 | }, 25 | "ansi-styles": { 26 | "version": "1.0.0", 27 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", 28 | "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", 29 | "dev": true 30 | }, 31 | "arrify": { 32 | "version": "1.0.1", 33 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 34 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 35 | "dev": true 36 | }, 37 | "asn1": { 38 | "version": "0.2.4", 39 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 40 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 41 | "dev": true, 42 | "requires": { 43 | "safer-buffer": "~2.1.0" 44 | } 45 | }, 46 | "assert-plus": { 47 | "version": "1.0.0", 48 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 49 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 50 | "dev": true 51 | }, 52 | "async": { 53 | "version": "1.0.0", 54 | "resolved": "http://registry.npmjs.org/async/-/async-1.0.0.tgz", 55 | "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", 56 | "dev": true, 57 | "optional": true 58 | }, 59 | "asynckit": { 60 | "version": "0.4.0", 61 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 62 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 63 | "dev": true 64 | }, 65 | "aws-sign2": { 66 | "version": "0.7.0", 67 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 68 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 69 | "dev": true 70 | }, 71 | "aws4": { 72 | "version": "1.8.0", 73 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 74 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 75 | "dev": true 76 | }, 77 | "balanced-match": { 78 | "version": "1.0.0", 79 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 80 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 81 | "dev": true 82 | }, 83 | "bcrypt-pbkdf": { 84 | "version": "1.0.2", 85 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 86 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 87 | "dev": true, 88 | "requires": { 89 | "tweetnacl": "^0.14.3" 90 | } 91 | }, 92 | "brace-expansion": { 93 | "version": "1.1.11", 94 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 95 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 96 | "dev": true, 97 | "requires": { 98 | "balanced-match": "^1.0.0", 99 | "concat-map": "0.0.1" 100 | } 101 | }, 102 | "buffer-from": { 103 | "version": "1.1.1", 104 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 105 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 106 | "dev": true 107 | }, 108 | "caseless": { 109 | "version": "0.12.0", 110 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 111 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 112 | "dev": true 113 | }, 114 | "chalk": { 115 | "version": "0.4.0", 116 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", 117 | "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", 118 | "dev": true, 119 | "requires": { 120 | "ansi-styles": "~1.0.0", 121 | "has-color": "~0.1.0", 122 | "strip-ansi": "~0.1.0" 123 | } 124 | }, 125 | "cli": { 126 | "version": "1.0.1", 127 | "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", 128 | "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", 129 | "dev": true, 130 | "requires": { 131 | "exit": "0.1.2", 132 | "glob": "^7.1.1" 133 | } 134 | }, 135 | "co": { 136 | "version": "4.6.0", 137 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 138 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 139 | "dev": true 140 | }, 141 | "color-convert": { 142 | "version": "1.9.3", 143 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 144 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 145 | "dev": true, 146 | "requires": { 147 | "color-name": "1.1.3" 148 | } 149 | }, 150 | "color-name": { 151 | "version": "1.1.3", 152 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 153 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 154 | "dev": true 155 | }, 156 | "colors": { 157 | "version": "1.2.4", 158 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.4.tgz", 159 | "integrity": "sha512-6Y+iBnWmXL+AWtlOp2Vr6R2w5MUlNJRwR0ShVFaAb1CqWzhPOpQg4L0jxD+xpw/Nc8QJwaq3KM79QUCriY8CWQ==", 160 | "dev": true 161 | }, 162 | "combined-stream": { 163 | "version": "1.0.7", 164 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 165 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 166 | "dev": true, 167 | "requires": { 168 | "delayed-stream": "~1.0.0" 169 | } 170 | }, 171 | "commander": { 172 | "version": "2.17.1", 173 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", 174 | "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", 175 | "dev": true 176 | }, 177 | "concat-map": { 178 | "version": "0.0.1", 179 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 180 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 181 | "dev": true 182 | }, 183 | "concat-stream": { 184 | "version": "1.6.2", 185 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 186 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 187 | "dev": true, 188 | "requires": { 189 | "buffer-from": "^1.0.0", 190 | "inherits": "^2.0.3", 191 | "readable-stream": "^2.2.2", 192 | "typedarray": "^0.0.6" 193 | } 194 | }, 195 | "console-browserify": { 196 | "version": "1.1.0", 197 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 198 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 199 | "dev": true, 200 | "requires": { 201 | "date-now": "^0.1.4" 202 | } 203 | }, 204 | "core-util-is": { 205 | "version": "1.0.2", 206 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 207 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 208 | "dev": true 209 | }, 210 | "cross-env": { 211 | "version": "5.2.0", 212 | "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", 213 | "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", 214 | "dev": true, 215 | "requires": { 216 | "cross-spawn": "^6.0.5", 217 | "is-windows": "^1.0.0" 218 | } 219 | }, 220 | "cross-spawn": { 221 | "version": "6.0.5", 222 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 223 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 224 | "dev": true, 225 | "requires": { 226 | "nice-try": "^1.0.4", 227 | "path-key": "^2.0.1", 228 | "semver": "^5.5.0", 229 | "shebang-command": "^1.2.0", 230 | "which": "^1.2.9" 231 | } 232 | }, 233 | "cycle": { 234 | "version": "1.0.3", 235 | "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", 236 | "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", 237 | "dev": true, 238 | "optional": true 239 | }, 240 | "dashdash": { 241 | "version": "1.14.1", 242 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 243 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 244 | "dev": true, 245 | "requires": { 246 | "assert-plus": "^1.0.0" 247 | } 248 | }, 249 | "date-now": { 250 | "version": "0.1.4", 251 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 252 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", 253 | "dev": true 254 | }, 255 | "debug": { 256 | "version": "2.6.9", 257 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 258 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 259 | "dev": true, 260 | "requires": { 261 | "ms": "2.0.0" 262 | } 263 | }, 264 | "deepmerge": { 265 | "version": "2.2.1", 266 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", 267 | "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", 268 | "dev": true 269 | }, 270 | "delayed-stream": { 271 | "version": "1.0.0", 272 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 273 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 274 | "dev": true 275 | }, 276 | "diff": { 277 | "version": "3.5.0", 278 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 279 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 280 | "dev": true 281 | }, 282 | "dom-serializer": { 283 | "version": "0.1.0", 284 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", 285 | "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", 286 | "dev": true, 287 | "requires": { 288 | "domelementtype": "~1.1.1", 289 | "entities": "~1.1.1" 290 | }, 291 | "dependencies": { 292 | "domelementtype": { 293 | "version": "1.1.3", 294 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", 295 | "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", 296 | "dev": true 297 | }, 298 | "entities": { 299 | "version": "1.1.2", 300 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", 301 | "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", 302 | "dev": true 303 | } 304 | } 305 | }, 306 | "domelementtype": { 307 | "version": "1.2.1", 308 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.2.1.tgz", 309 | "integrity": "sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA==", 310 | "dev": true 311 | }, 312 | "domhandler": { 313 | "version": "2.3.0", 314 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", 315 | "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", 316 | "dev": true, 317 | "requires": { 318 | "domelementtype": "1" 319 | } 320 | }, 321 | "domutils": { 322 | "version": "1.5.1", 323 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", 324 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", 325 | "dev": true, 326 | "requires": { 327 | "dom-serializer": "0", 328 | "domelementtype": "1" 329 | } 330 | }, 331 | "ecc-jsbn": { 332 | "version": "0.1.2", 333 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 334 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 335 | "dev": true, 336 | "requires": { 337 | "jsbn": "~0.1.0", 338 | "safer-buffer": "^2.1.0" 339 | } 340 | }, 341 | "entities": { 342 | "version": "1.0.0", 343 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", 344 | "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", 345 | "dev": true 346 | }, 347 | "es6-promise": { 348 | "version": "4.2.5", 349 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", 350 | "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", 351 | "dev": true 352 | }, 353 | "escape-string-regexp": { 354 | "version": "1.0.5", 355 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 356 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 357 | "dev": true 358 | }, 359 | "exit": { 360 | "version": "0.1.2", 361 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 362 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 363 | "dev": true 364 | }, 365 | "extend": { 366 | "version": "3.0.2", 367 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 368 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 369 | "dev": true 370 | }, 371 | "extract-zip": { 372 | "version": "1.6.7", 373 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", 374 | "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", 375 | "dev": true, 376 | "requires": { 377 | "concat-stream": "1.6.2", 378 | "debug": "2.6.9", 379 | "mkdirp": "0.5.1", 380 | "yauzl": "2.4.1" 381 | } 382 | }, 383 | "extsprintf": { 384 | "version": "1.3.0", 385 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 386 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 387 | "dev": true 388 | }, 389 | "eyes": { 390 | "version": "0.1.8", 391 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 392 | "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", 393 | "dev": true, 394 | "optional": true 395 | }, 396 | "fast-deep-equal": { 397 | "version": "1.1.0", 398 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 399 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", 400 | "dev": true 401 | }, 402 | "fast-json-stable-stringify": { 403 | "version": "2.0.0", 404 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 405 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 406 | "dev": true 407 | }, 408 | "fd-slicer": { 409 | "version": "1.0.1", 410 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", 411 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", 412 | "dev": true, 413 | "requires": { 414 | "pend": "~1.2.0" 415 | } 416 | }, 417 | "forever-agent": { 418 | "version": "0.6.1", 419 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 420 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 421 | "dev": true 422 | }, 423 | "form-data": { 424 | "version": "2.3.3", 425 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 426 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 427 | "dev": true, 428 | "requires": { 429 | "asynckit": "^0.4.0", 430 | "combined-stream": "^1.0.6", 431 | "mime-types": "^2.1.12" 432 | } 433 | }, 434 | "fs-extra": { 435 | "version": "1.0.0", 436 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", 437 | "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", 438 | "dev": true, 439 | "requires": { 440 | "graceful-fs": "^4.1.2", 441 | "jsonfile": "^2.1.0", 442 | "klaw": "^1.0.0" 443 | } 444 | }, 445 | "fs.realpath": { 446 | "version": "1.0.0", 447 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 448 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 449 | "dev": true 450 | }, 451 | "getpass": { 452 | "version": "0.1.7", 453 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 454 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 455 | "dev": true, 456 | "requires": { 457 | "assert-plus": "^1.0.0" 458 | } 459 | }, 460 | "glob": { 461 | "version": "7.1.3", 462 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 463 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 464 | "dev": true, 465 | "requires": { 466 | "fs.realpath": "^1.0.0", 467 | "inflight": "^1.0.4", 468 | "inherits": "2", 469 | "minimatch": "^3.0.4", 470 | "once": "^1.3.0", 471 | "path-is-absolute": "^1.0.0" 472 | } 473 | }, 474 | "graceful-fs": { 475 | "version": "4.1.11", 476 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 477 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 478 | "dev": true 479 | }, 480 | "har-schema": { 481 | "version": "2.0.0", 482 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 483 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 484 | "dev": true 485 | }, 486 | "har-validator": { 487 | "version": "5.1.0", 488 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", 489 | "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", 490 | "dev": true, 491 | "requires": { 492 | "ajv": "^5.3.0", 493 | "har-schema": "^2.0.0" 494 | } 495 | }, 496 | "has-color": { 497 | "version": "0.1.7", 498 | "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", 499 | "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", 500 | "dev": true 501 | }, 502 | "has-flag": { 503 | "version": "3.0.0", 504 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 505 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 506 | "dev": true 507 | }, 508 | "hasha": { 509 | "version": "2.2.0", 510 | "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", 511 | "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", 512 | "dev": true, 513 | "requires": { 514 | "is-stream": "^1.0.1", 515 | "pinkie-promise": "^2.0.0" 516 | } 517 | }, 518 | "htmlparser2": { 519 | "version": "3.8.3", 520 | "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", 521 | "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", 522 | "dev": true, 523 | "requires": { 524 | "domelementtype": "1", 525 | "domhandler": "2.3", 526 | "domutils": "1.5", 527 | "entities": "1.0", 528 | "readable-stream": "1.1" 529 | }, 530 | "dependencies": { 531 | "isarray": { 532 | "version": "0.0.1", 533 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 534 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 535 | "dev": true 536 | }, 537 | "readable-stream": { 538 | "version": "1.1.14", 539 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 540 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 541 | "dev": true, 542 | "requires": { 543 | "core-util-is": "~1.0.0", 544 | "inherits": "~2.0.1", 545 | "isarray": "0.0.1", 546 | "string_decoder": "~0.10.x" 547 | } 548 | }, 549 | "string_decoder": { 550 | "version": "0.10.31", 551 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 552 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 553 | "dev": true 554 | } 555 | } 556 | }, 557 | "http-signature": { 558 | "version": "1.2.0", 559 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 560 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 561 | "dev": true, 562 | "requires": { 563 | "assert-plus": "^1.0.0", 564 | "jsprim": "^1.2.2", 565 | "sshpk": "^1.7.0" 566 | } 567 | }, 568 | "inflight": { 569 | "version": "1.0.6", 570 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 571 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 572 | "dev": true, 573 | "requires": { 574 | "once": "^1.3.0", 575 | "wrappy": "1" 576 | } 577 | }, 578 | "inherits": { 579 | "version": "2.0.3", 580 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 581 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 582 | "dev": true 583 | }, 584 | "is-stream": { 585 | "version": "1.1.0", 586 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 587 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 588 | "dev": true 589 | }, 590 | "is-typedarray": { 591 | "version": "1.0.0", 592 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 593 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 594 | "dev": true 595 | }, 596 | "is-windows": { 597 | "version": "1.0.2", 598 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 599 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 600 | "dev": true 601 | }, 602 | "isarray": { 603 | "version": "1.0.0", 604 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 605 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 606 | "dev": true 607 | }, 608 | "isexe": { 609 | "version": "2.0.0", 610 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 611 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 612 | "dev": true 613 | }, 614 | "isstream": { 615 | "version": "0.1.2", 616 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 617 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 618 | "dev": true 619 | }, 620 | "jsbn": { 621 | "version": "0.1.1", 622 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 623 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 624 | "dev": true 625 | }, 626 | "jshint": { 627 | "version": "2.9.6", 628 | "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.6.tgz", 629 | "integrity": "sha512-KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==", 630 | "dev": true, 631 | "requires": { 632 | "cli": "~1.0.0", 633 | "console-browserify": "1.1.x", 634 | "exit": "0.1.x", 635 | "htmlparser2": "3.8.x", 636 | "lodash": "~4.17.10", 637 | "minimatch": "~3.0.2", 638 | "phantom": "~4.0.1", 639 | "phantomjs-prebuilt": "~2.1.7", 640 | "shelljs": "0.3.x", 641 | "strip-json-comments": "1.0.x", 642 | "unicode-5.2.0": "^0.7.5" 643 | } 644 | }, 645 | "json-schema": { 646 | "version": "0.2.3", 647 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 648 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 649 | "dev": true 650 | }, 651 | "json-schema-traverse": { 652 | "version": "0.3.1", 653 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 654 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 655 | "dev": true 656 | }, 657 | "json-stringify-safe": { 658 | "version": "5.0.1", 659 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 660 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 661 | "dev": true 662 | }, 663 | "json5": { 664 | "version": "1.0.1", 665 | "resolved": "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 666 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 667 | "dev": true, 668 | "requires": { 669 | "minimist": "^1.2.0" 670 | } 671 | }, 672 | "jsonfile": { 673 | "version": "2.4.0", 674 | "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", 675 | "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", 676 | "dev": true, 677 | "requires": { 678 | "graceful-fs": "^4.1.6" 679 | } 680 | }, 681 | "jsprim": { 682 | "version": "1.4.1", 683 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 684 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 685 | "dev": true, 686 | "requires": { 687 | "assert-plus": "1.0.0", 688 | "extsprintf": "1.3.0", 689 | "json-schema": "0.2.3", 690 | "verror": "1.10.0" 691 | } 692 | }, 693 | "kew": { 694 | "version": "0.7.0", 695 | "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", 696 | "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", 697 | "dev": true 698 | }, 699 | "klaw": { 700 | "version": "1.3.1", 701 | "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", 702 | "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", 703 | "dev": true, 704 | "requires": { 705 | "graceful-fs": "^4.1.9" 706 | } 707 | }, 708 | "lodash": { 709 | "version": "4.17.21", 710 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 711 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 712 | "dev": true 713 | }, 714 | "make-error": { 715 | "version": "1.3.5", 716 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", 717 | "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", 718 | "dev": true 719 | }, 720 | "mime-db": { 721 | "version": "1.37.0", 722 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 723 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", 724 | "dev": true 725 | }, 726 | "mime-types": { 727 | "version": "2.1.21", 728 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 729 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 730 | "dev": true, 731 | "requires": { 732 | "mime-db": "~1.37.0" 733 | } 734 | }, 735 | "minimatch": { 736 | "version": "3.0.4", 737 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 738 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 739 | "dev": true, 740 | "requires": { 741 | "brace-expansion": "^1.1.7" 742 | } 743 | }, 744 | "minimist": { 745 | "version": "1.2.0", 746 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 747 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 748 | "dev": true 749 | }, 750 | "mkdirp": { 751 | "version": "0.5.1", 752 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 753 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 754 | "dev": true, 755 | "requires": { 756 | "minimist": "0.0.8" 757 | }, 758 | "dependencies": { 759 | "minimist": { 760 | "version": "0.0.8", 761 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 762 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 763 | "dev": true 764 | } 765 | } 766 | }, 767 | "ms": { 768 | "version": "2.0.0", 769 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 770 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 771 | "dev": true 772 | }, 773 | "nice-try": { 774 | "version": "1.0.5", 775 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 776 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 777 | "dev": true 778 | }, 779 | "node-qunit-phantomjs": { 780 | "version": "2.0.0", 781 | "resolved": "https://registry.npmjs.org/node-qunit-phantomjs/-/node-qunit-phantomjs-2.0.0.tgz", 782 | "integrity": "sha512-xZV0J8fBbe8h04IkBxLtwvGVbP0ViUhkJzjFx/tb7uWT02w6iMt5X6HDmdTZuQXBMsgahyaIGjW30l3HSlj2yA==", 783 | "dev": true, 784 | "requires": { 785 | "chalk": "^2.2.0", 786 | "minimist": "^1.2.0", 787 | "phantomjs-prebuilt": "^2.1.3", 788 | "qunit-phantomjs-runner": "^2.3.1" 789 | }, 790 | "dependencies": { 791 | "ansi-styles": { 792 | "version": "3.2.1", 793 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 794 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 795 | "dev": true, 796 | "requires": { 797 | "color-convert": "^1.9.0" 798 | } 799 | }, 800 | "chalk": { 801 | "version": "2.4.1", 802 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 803 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 804 | "dev": true, 805 | "requires": { 806 | "ansi-styles": "^3.2.1", 807 | "escape-string-regexp": "^1.0.5", 808 | "supports-color": "^5.3.0" 809 | } 810 | } 811 | } 812 | }, 813 | "nomnom": { 814 | "version": "1.8.1", 815 | "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", 816 | "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", 817 | "dev": true, 818 | "requires": { 819 | "chalk": "~0.4.0", 820 | "underscore": "~1.6.0" 821 | } 822 | }, 823 | "oauth-sign": { 824 | "version": "0.9.0", 825 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 826 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 827 | "dev": true 828 | }, 829 | "once": { 830 | "version": "1.4.0", 831 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 832 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 833 | "dev": true, 834 | "requires": { 835 | "wrappy": "1" 836 | } 837 | }, 838 | "path-is-absolute": { 839 | "version": "1.0.1", 840 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 841 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 842 | "dev": true 843 | }, 844 | "path-key": { 845 | "version": "2.0.1", 846 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 847 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 848 | "dev": true 849 | }, 850 | "pend": { 851 | "version": "1.2.0", 852 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 853 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 854 | "dev": true 855 | }, 856 | "performance-now": { 857 | "version": "2.1.0", 858 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 859 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 860 | "dev": true 861 | }, 862 | "phantom": { 863 | "version": "4.0.12", 864 | "resolved": "https://registry.npmjs.org/phantom/-/phantom-4.0.12.tgz", 865 | "integrity": "sha512-Tz82XhtPmwCk1FFPmecy7yRGZG2btpzY2KI9fcoPT7zT9det0CcMyfBFPp1S8DqzsnQnm8ZYEfdy528mwVtksA==", 866 | "dev": true, 867 | "optional": true, 868 | "requires": { 869 | "phantomjs-prebuilt": "^2.1.16", 870 | "split": "^1.0.1", 871 | "winston": "^2.4.0" 872 | } 873 | }, 874 | "phantomjs-prebuilt": { 875 | "version": "2.1.16", 876 | "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", 877 | "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", 878 | "dev": true, 879 | "requires": { 880 | "es6-promise": "^4.0.3", 881 | "extract-zip": "^1.6.5", 882 | "fs-extra": "^1.0.0", 883 | "hasha": "^2.2.0", 884 | "kew": "^0.7.0", 885 | "progress": "^1.1.8", 886 | "request": "^2.81.0", 887 | "request-progress": "^2.0.1", 888 | "which": "^1.2.10" 889 | } 890 | }, 891 | "pinkie": { 892 | "version": "2.0.4", 893 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 894 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 895 | "dev": true 896 | }, 897 | "pinkie-promise": { 898 | "version": "2.0.1", 899 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 900 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 901 | "dev": true, 902 | "requires": { 903 | "pinkie": "^2.0.0" 904 | } 905 | }, 906 | "prettier": { 907 | "version": "2.1.2", 908 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", 909 | "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", 910 | "dev": true 911 | }, 912 | "process-nextick-args": { 913 | "version": "2.0.0", 914 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 915 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 916 | "dev": true 917 | }, 918 | "progress": { 919 | "version": "1.1.8", 920 | "resolved": "http://registry.npmjs.org/progress/-/progress-1.1.8.tgz", 921 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", 922 | "dev": true 923 | }, 924 | "psl": { 925 | "version": "1.1.29", 926 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", 927 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", 928 | "dev": true 929 | }, 930 | "punycode": { 931 | "version": "1.4.1", 932 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 933 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 934 | "dev": true 935 | }, 936 | "qs": { 937 | "version": "6.5.2", 938 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 939 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 940 | "dev": true 941 | }, 942 | "qunit-phantomjs-runner": { 943 | "version": "2.3.1", 944 | "resolved": "https://registry.npmjs.org/qunit-phantomjs-runner/-/qunit-phantomjs-runner-2.3.1.tgz", 945 | "integrity": "sha512-RLg51606zm6/HwZi29NciAMAqifyJE1oGg77tEuk05vEa7kuqEaI0Mkjw976Ynnq7GXurATnbFd+471c024tBQ==", 946 | "dev": true, 947 | "requires": { 948 | "qunit-reporter-junit": "^1.0.2" 949 | } 950 | }, 951 | "qunit-reporter-junit": { 952 | "version": "1.1.1", 953 | "resolved": "https://registry.npmjs.org/qunit-reporter-junit/-/qunit-reporter-junit-1.1.1.tgz", 954 | "integrity": "sha1-7rYiZFeJaZPnlaEZQPGK9q+lebQ=", 955 | "dev": true 956 | }, 957 | "readable-stream": { 958 | "version": "2.3.6", 959 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 960 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 961 | "dev": true, 962 | "requires": { 963 | "core-util-is": "~1.0.0", 964 | "inherits": "~2.0.3", 965 | "isarray": "~1.0.0", 966 | "process-nextick-args": "~2.0.0", 967 | "safe-buffer": "~5.1.1", 968 | "string_decoder": "~1.1.1", 969 | "util-deprecate": "~1.0.1" 970 | } 971 | }, 972 | "replace": { 973 | "version": "1.0.0", 974 | "resolved": "https://registry.npmjs.org/replace/-/replace-1.0.0.tgz", 975 | "integrity": "sha512-5qUu+E1YMF9AMeVEoXa9VjEEgHk7cRNs3GWAN3Z1mt0ugwUxFuuXkDuoOS3nuvN9gH4KR/8Bd2R/Q944ofGtuA==", 976 | "dev": true, 977 | "requires": { 978 | "colors": "1.2.4", 979 | "minimatch": "3.0.4", 980 | "nomnom": "1.8.1" 981 | } 982 | }, 983 | "request": { 984 | "version": "2.88.0", 985 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 986 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 987 | "dev": true, 988 | "requires": { 989 | "aws-sign2": "~0.7.0", 990 | "aws4": "^1.8.0", 991 | "caseless": "~0.12.0", 992 | "combined-stream": "~1.0.6", 993 | "extend": "~3.0.2", 994 | "forever-agent": "~0.6.1", 995 | "form-data": "~2.3.2", 996 | "har-validator": "~5.1.0", 997 | "http-signature": "~1.2.0", 998 | "is-typedarray": "~1.0.0", 999 | "isstream": "~0.1.2", 1000 | "json-stringify-safe": "~5.0.1", 1001 | "mime-types": "~2.1.19", 1002 | "oauth-sign": "~0.9.0", 1003 | "performance-now": "^2.1.0", 1004 | "qs": "~6.5.2", 1005 | "safe-buffer": "^5.1.2", 1006 | "tough-cookie": "~2.4.3", 1007 | "tunnel-agent": "^0.6.0", 1008 | "uuid": "^3.3.2" 1009 | } 1010 | }, 1011 | "request-progress": { 1012 | "version": "2.0.1", 1013 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", 1014 | "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", 1015 | "dev": true, 1016 | "requires": { 1017 | "throttleit": "^1.0.0" 1018 | } 1019 | }, 1020 | "rimraf": { 1021 | "version": "2.6.2", 1022 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1023 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1024 | "dev": true, 1025 | "requires": { 1026 | "glob": "^7.0.5" 1027 | } 1028 | }, 1029 | "safe-buffer": { 1030 | "version": "5.1.2", 1031 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1032 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1033 | "dev": true 1034 | }, 1035 | "safer-buffer": { 1036 | "version": "2.1.2", 1037 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1038 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1039 | "dev": true 1040 | }, 1041 | "semver": { 1042 | "version": "5.6.0", 1043 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 1044 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", 1045 | "dev": true 1046 | }, 1047 | "shebang-command": { 1048 | "version": "1.2.0", 1049 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1050 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1051 | "dev": true, 1052 | "requires": { 1053 | "shebang-regex": "^1.0.0" 1054 | } 1055 | }, 1056 | "shebang-regex": { 1057 | "version": "1.0.0", 1058 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1059 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1060 | "dev": true 1061 | }, 1062 | "shelljs": { 1063 | "version": "0.3.0", 1064 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", 1065 | "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", 1066 | "dev": true 1067 | }, 1068 | "source-map": { 1069 | "version": "0.6.1", 1070 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1071 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1072 | "dev": true 1073 | }, 1074 | "source-map-support": { 1075 | "version": "0.5.9", 1076 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", 1077 | "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", 1078 | "dev": true, 1079 | "requires": { 1080 | "buffer-from": "^1.0.0", 1081 | "source-map": "^0.6.0" 1082 | } 1083 | }, 1084 | "split": { 1085 | "version": "1.0.1", 1086 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", 1087 | "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", 1088 | "dev": true, 1089 | "optional": true, 1090 | "requires": { 1091 | "through": "2" 1092 | } 1093 | }, 1094 | "sshpk": { 1095 | "version": "1.15.1", 1096 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz", 1097 | "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==", 1098 | "dev": true, 1099 | "requires": { 1100 | "asn1": "~0.2.3", 1101 | "assert-plus": "^1.0.0", 1102 | "bcrypt-pbkdf": "^1.0.0", 1103 | "dashdash": "^1.12.0", 1104 | "ecc-jsbn": "~0.1.1", 1105 | "getpass": "^0.1.1", 1106 | "jsbn": "~0.1.0", 1107 | "safer-buffer": "^2.0.2", 1108 | "tweetnacl": "~0.14.0" 1109 | } 1110 | }, 1111 | "stack-trace": { 1112 | "version": "0.0.10", 1113 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 1114 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", 1115 | "dev": true, 1116 | "optional": true 1117 | }, 1118 | "string_decoder": { 1119 | "version": "1.1.1", 1120 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1121 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1122 | "dev": true, 1123 | "requires": { 1124 | "safe-buffer": "~5.1.0" 1125 | } 1126 | }, 1127 | "strip-ansi": { 1128 | "version": "0.1.1", 1129 | "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", 1130 | "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", 1131 | "dev": true 1132 | }, 1133 | "strip-bom": { 1134 | "version": "3.0.0", 1135 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1136 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1137 | "dev": true 1138 | }, 1139 | "strip-json-comments": { 1140 | "version": "1.0.4", 1141 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", 1142 | "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", 1143 | "dev": true 1144 | }, 1145 | "supports-color": { 1146 | "version": "5.5.0", 1147 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1148 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1149 | "dev": true, 1150 | "requires": { 1151 | "has-flag": "^3.0.0" 1152 | } 1153 | }, 1154 | "throttleit": { 1155 | "version": "1.0.0", 1156 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", 1157 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", 1158 | "dev": true 1159 | }, 1160 | "through": { 1161 | "version": "2.3.8", 1162 | "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", 1163 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1164 | "dev": true, 1165 | "optional": true 1166 | }, 1167 | "tough-cookie": { 1168 | "version": "2.4.3", 1169 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 1170 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 1171 | "dev": true, 1172 | "requires": { 1173 | "psl": "^1.1.24", 1174 | "punycode": "^1.4.1" 1175 | } 1176 | }, 1177 | "ts-node": { 1178 | "version": "7.0.1", 1179 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", 1180 | "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", 1181 | "dev": true, 1182 | "requires": { 1183 | "arrify": "^1.0.0", 1184 | "buffer-from": "^1.1.0", 1185 | "diff": "^3.1.0", 1186 | "make-error": "^1.1.1", 1187 | "minimist": "^1.2.0", 1188 | "mkdirp": "^0.5.1", 1189 | "source-map-support": "^0.5.6", 1190 | "yn": "^2.0.0" 1191 | } 1192 | }, 1193 | "tsconfig-paths": { 1194 | "version": "3.7.0", 1195 | "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.7.0.tgz", 1196 | "integrity": "sha512-7iE+Q/2E1lgvxD+c0Ot+GFFmgmfIjt/zCayyruXkXQ84BLT85gHXy0WSoQSiuFX9+d+keE/jiON7notV74ZY+A==", 1197 | "dev": true, 1198 | "requires": { 1199 | "@types/json5": "^0.0.29", 1200 | "deepmerge": "^2.0.1", 1201 | "json5": "^1.0.1", 1202 | "minimist": "^1.2.0", 1203 | "strip-bom": "^3.0.0" 1204 | } 1205 | }, 1206 | "tunnel-agent": { 1207 | "version": "0.6.0", 1208 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1209 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1210 | "dev": true, 1211 | "requires": { 1212 | "safe-buffer": "^5.0.1" 1213 | } 1214 | }, 1215 | "tweetnacl": { 1216 | "version": "0.14.5", 1217 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1218 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1219 | "dev": true 1220 | }, 1221 | "typedarray": { 1222 | "version": "0.0.6", 1223 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1224 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1225 | "dev": true 1226 | }, 1227 | "typescript": { 1228 | "version": "3.1.3", 1229 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.3.tgz", 1230 | "integrity": "sha512-+81MUSyX+BaSo+u2RbozuQk/UWx6hfG0a5gHu4ANEM4sU96XbuIyAB+rWBW1u70c6a5QuZfuYICn3s2UjuHUpA==", 1231 | "dev": true 1232 | }, 1233 | "uglify-js": { 1234 | "version": "3.4.9", 1235 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", 1236 | "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", 1237 | "dev": true, 1238 | "requires": { 1239 | "commander": "~2.17.1", 1240 | "source-map": "~0.6.1" 1241 | } 1242 | }, 1243 | "underscore": { 1244 | "version": "1.6.0", 1245 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", 1246 | "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", 1247 | "dev": true 1248 | }, 1249 | "unicode-5.2.0": { 1250 | "version": "0.7.5", 1251 | "resolved": "https://registry.npmjs.org/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz", 1252 | "integrity": "sha512-KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA==", 1253 | "dev": true 1254 | }, 1255 | "util-deprecate": { 1256 | "version": "1.0.2", 1257 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1258 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1259 | "dev": true 1260 | }, 1261 | "uuid": { 1262 | "version": "3.3.2", 1263 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1264 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 1265 | "dev": true 1266 | }, 1267 | "verror": { 1268 | "version": "1.10.0", 1269 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1270 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1271 | "dev": true, 1272 | "requires": { 1273 | "assert-plus": "^1.0.0", 1274 | "core-util-is": "1.0.2", 1275 | "extsprintf": "^1.2.0" 1276 | } 1277 | }, 1278 | "which": { 1279 | "version": "1.3.1", 1280 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1281 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1282 | "dev": true, 1283 | "requires": { 1284 | "isexe": "^2.0.0" 1285 | } 1286 | }, 1287 | "winston": { 1288 | "version": "2.4.4", 1289 | "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", 1290 | "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==", 1291 | "dev": true, 1292 | "optional": true, 1293 | "requires": { 1294 | "async": "~1.0.0", 1295 | "colors": "1.0.x", 1296 | "cycle": "1.0.x", 1297 | "eyes": "0.1.x", 1298 | "isstream": "0.1.x", 1299 | "stack-trace": "0.0.x" 1300 | }, 1301 | "dependencies": { 1302 | "colors": { 1303 | "version": "1.0.3", 1304 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 1305 | "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", 1306 | "dev": true, 1307 | "optional": true 1308 | } 1309 | } 1310 | }, 1311 | "wrappy": { 1312 | "version": "1.0.2", 1313 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1314 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1315 | "dev": true 1316 | }, 1317 | "yauzl": { 1318 | "version": "2.4.1", 1319 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", 1320 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", 1321 | "dev": true, 1322 | "requires": { 1323 | "fd-slicer": "~1.0.1" 1324 | } 1325 | }, 1326 | "yn": { 1327 | "version": "2.0.0", 1328 | "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", 1329 | "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", 1330 | "dev": true 1331 | } 1332 | } 1333 | } 1334 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-logger", 3 | "version": "1.6.1", 4 | "license": "MIT", 5 | "description": "Lightweight, unobtrusive, configurable JavaScript logger", 6 | "author": "Jonny Reeves (http://jonnyreeves.co.uk)", 7 | "homepage": "http://github.com/jonnyreeves/js-logger", 8 | "typings": "./src/logger.d.ts", 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/jonnyreeves/js-logger.git" 12 | }, 13 | "bugs": { 14 | "url": "http://github.com/jonnyreeves/js-logger/issues" 15 | }, 16 | "licenses": [ 17 | { 18 | "type": "MIT", 19 | "url": "http://github.com/jonnyreeves/js-logger/blob/master/MIT-LICENSE.txt" 20 | } 21 | ], 22 | "files": [ 23 | "/src", 24 | "CHANGELOG", 25 | "MIT-LICENSE.txt", 26 | "README" 27 | ], 28 | "main": "src/logger.js", 29 | "scripts": { 30 | "lint": "jshint --exclude=src/*.min.js src/*.js test-src/*.js", 31 | "format": "prettier --write .", 32 | "test": "prettier --check . && npm run test:unit && npm run test:tsd", 33 | "test:unit": "node-qunit-phantomjs ./test-src/index.html", 34 | "test:tsd": "ts-node -r tsconfig-paths/register test-src/typescript-consumer/index.ts", 35 | "build": "npm run build:version && npm run build:minify", 36 | "build:minify": "uglifyjs src/logger.js --mangle --compress -o src/logger.min.js", 37 | "build:version": "cross-env replace -s 'VERSION = \"[^\"]+\"' \"VERSION = \\\"$npm_package_version\\\"\" src/logger.js" 38 | }, 39 | "devDependencies": { 40 | "cross-env": "^5.2.0", 41 | "jshint": "^2.9.6", 42 | "node-qunit-phantomjs": "^2.0.0", 43 | "prettier": "2.1.2", 44 | "replace": "^1.0.0", 45 | "rimraf": "^2.6.2", 46 | "ts-node": "^7.0.1", 47 | "tsconfig-paths": "^3.7.0", 48 | "typescript": "^3.1.3", 49 | "uglify-js": "^3.4.9" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /publish.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -ex 3 | 4 | function die() { 5 | echo ERROR: "$1" 6 | exit 1 7 | } 8 | 9 | function workspace_is_clean() { 10 | git diff-index --quiet HEAD 11 | return $? 12 | } 13 | 14 | function git_branch_name() { 15 | git rev-parse --abbrev-ref HEAD 16 | } 17 | 18 | function is_up_to_date() { 19 | git fetch 20 | [[ $(git rev-parse HEAD) == $(git rev-parse @{u}) ]] 21 | } 22 | 23 | if ! workspace_is_clean; then 24 | die "workspace has uncommitted changes, please commit them and try again" 25 | fi 26 | 27 | if [[ "$(git_branch_name)" != "master" ]]; then 28 | die "releases can only be made from the 'master' branch, you currently have '$(git_branch_name)' checked out" 29 | fi 30 | 31 | if ! is_up_to_date; then 32 | die "workspace has un-pushed commits, please push them and try again" 33 | fi 34 | 35 | PKG_VERSION=$(node -p "require('./package.json').version") 36 | 37 | npm install 38 | if ! workspace_is_clean; then 39 | die "workspace changes detected after npm install; please commit these changes and try again" 40 | fi 41 | 42 | CHANGELOG_FIRST_LINE=$(head -n 1 CHANGELOG.md) 43 | if [[ "${CHANGELOG_FIRST_LINE}" != "## ${PKG_VERSION}" ]]; then 44 | die "Expected first line of the CHANGELOG to be '## ${PKG_VERSION}' but was '${CHANGELOG_FIRST_LINE}'" 45 | fi 46 | 47 | echo 48 | head -n 10 CHANGELOG.md | sed 's/^/> /' 49 | echo 50 | read -p "Above are the first 10 lines of the CHANGELOG; does this look correct? " -n 1 -r 51 | echo 52 | if [[ ! $REPLY =~ ^[Yy]$ ]]; then 53 | die "Aborting based on user input" 54 | fi 55 | 56 | npm run lint 57 | npm run test 58 | npm run build 59 | 60 | git add . 61 | git commit -m "Release v${PKG_VERSION}" 62 | git push origin master 63 | 64 | git tag "v${PKG_VERSION}" 65 | git push origin "refs/tags/v${PKG_VERSION}" 66 | 67 | npm publish -------------------------------------------------------------------------------- /src/logger.d.ts: -------------------------------------------------------------------------------- 1 | export interface ILogger { 2 | TRACE: ILogLevel; 3 | DEBUG: ILogLevel; 4 | INFO: ILogLevel; 5 | TIME: ILogLevel; 6 | WARN: ILogLevel; 7 | ERROR: ILogLevel; 8 | OFF: ILogLevel; 9 | 10 | trace(...x: any[]): void; 11 | debug(...x: any[]): void; 12 | info(...x: any[]): void; 13 | log(...x: any[]): void; 14 | warn(...x: any[]): void; 15 | error(...x: any[]): void; 16 | time(label: string): void; 17 | timeEnd(label: string): void; 18 | 19 | /** 20 | * Sets the global logging filter level which applies to *all* previously 21 | * registered, and future Logger instances. (note that named loggers (retrieved 22 | * via `Logger.get`) can be configured independently if required). 23 | * 24 | * @param {ILogLevel} level the level to switch to 25 | */ 26 | setLevel(level: ILogLevel): void; 27 | 28 | /** 29 | * Gets the global logging filter level 30 | * 31 | * @return {ILogLevel} the current logging level 32 | */ 33 | getLevel(): ILogLevel; 34 | 35 | enabledFor(level: ILogLevel): boolean; 36 | } 37 | 38 | export interface GlobalLogger extends ILogger { 39 | /** 40 | * Configure and example a Default implementation which writes to the 41 | * `window.console` (if present). The `options` hash can be used to configure 42 | * the default logLevel and provide a custom message formatter. 43 | */ 44 | useDefaults(options?: ILoggerOpts): void; 45 | 46 | /** 47 | * Set the global logging handler. The supplied function should 48 | * expect two arguments, the first being an arguments object with the 49 | * supplied log messages and the second being a context object which 50 | * contains a hash of stateful parameters which the logging function can consume. 51 | * @param {setHandlerCallback} callback the callback which handles the logging 52 | */ 53 | setHandler(logHandler: ILogHandler): void; 54 | 55 | /** 56 | * Retrieve a ContextualLogger instance. Note that named loggers automatically 57 | * inherit the global logger's level, default context and log handler. 58 | * 59 | * @param {string} name the logger name 60 | * @return {ILogger} the named logger 61 | */ 62 | get(name: string): ILogger; 63 | 64 | /** 65 | * CreateDefaultHandler returns a handler function which can be passed to `Logger.setHandler()` which will 66 | * write to the window's console object (if present); the optional options object can be used to customise the 67 | * formatter used to format each log message. 68 | */ 69 | createDefaultHandler(options?: CreateDefaultHandlerOptions): ILogHandler; 70 | } 71 | 72 | export interface ILogHandler { 73 | (messages: any[], context: IContext): void; 74 | } 75 | 76 | export interface ILogLevel extends Object { 77 | /** 78 | * The numerical representation of the level 79 | */ 80 | value: number; 81 | /** 82 | * Human readable name of the log level 83 | */ 84 | name: string; 85 | } 86 | 87 | export interface IContext extends Object { 88 | /** 89 | * The currrent log level 90 | */ 91 | level: ILogLevel; 92 | /** 93 | * The optional current logger name 94 | */ 95 | name?: string; 96 | } 97 | 98 | export interface CreateDefaultHandlerOptions { 99 | formatter?: ILogHandler; 100 | } 101 | 102 | export interface ILoggerOpts extends Object { 103 | defaultLevel?: ILogLevel; 104 | formatter?: ILogHandler; 105 | } 106 | 107 | declare const Logger: GlobalLogger; 108 | 109 | /** 110 | * Configure and example a Default implementation which writes to the 111 | * `window.console` (if present). The `options` hash can be used to configure 112 | * the default logLevel and provide a custom message formatter. 113 | */ 114 | export function useDefaults(options?: ILoggerOpts): void; 115 | 116 | /** 117 | * alias to useDefaults. 118 | */ 119 | export function setDefaults(options?: ILoggerOpts): void; 120 | 121 | /** 122 | * Set the global logging handler. The supplied function should 123 | * expect two arguments, the first being an arguments object with the 124 | * supplied log messages and the second being a context object which 125 | * contains a hash of stateful parameters which the logging function can consume. 126 | * @param {setHandlerCallback} callback the callback which handles the logging 127 | */ 128 | export function setHandler(logHandler: ILogHandler): void; 129 | 130 | /** 131 | * Retrieve a ContextualLogger instance. Note that named loggers automatically 132 | * inherit the global logger's level, default context and log handler. 133 | * 134 | * @param {string} name the logger name 135 | * @return {ILogger} the named logger 136 | */ 137 | export function get(name: string): ILogger; 138 | 139 | /** 140 | * CreateDefaultHandler returns a handler function which can be passed to `Logger.setHandler()` which will 141 | * write to the window's console object (if present); the optional options object can be used to customise the 142 | * formatter used to format each log message. 143 | */ 144 | export function createDefaultHandler( 145 | options?: CreateDefaultHandlerOptions 146 | ): ILogHandler; 147 | 148 | export default Logger; 149 | -------------------------------------------------------------------------------- /src/logger.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * js-logger - http://github.com/jonnyreeves/js-logger 3 | * Jonny Reeves, http://jonnyreeves.co.uk/ 4 | * js-logger may be freely distributed under the MIT license. 5 | */ 6 | (function (global) { 7 | "use strict"; 8 | 9 | // Top level module for the global, static logger instance. 10 | var Logger = {}; 11 | 12 | // For those that are at home that are keeping score. 13 | Logger.VERSION = "1.6.1"; 14 | 15 | // Function which handles all incoming log messages. 16 | var logHandler; 17 | 18 | // Map of ContextualLogger instances by name; used by Logger.get() to return the same named instance. 19 | var contextualLoggersByNameMap = {}; 20 | 21 | // Polyfill for ES5's Function.bind. 22 | var bind = function (scope, func) { 23 | return function () { 24 | return func.apply(scope, arguments); 25 | }; 26 | }; 27 | 28 | // Super exciting object merger-matron 9000 adding another 100 bytes to your download. 29 | var merge = function () { 30 | var args = arguments, 31 | target = args[0], 32 | key, 33 | i; 34 | for (i = 1; i < args.length; i++) { 35 | for (key in args[i]) { 36 | if (!(key in target) && args[i].hasOwnProperty(key)) { 37 | target[key] = args[i][key]; 38 | } 39 | } 40 | } 41 | return target; 42 | }; 43 | 44 | // Helper to define a logging level object; helps with optimisation. 45 | var defineLogLevel = function (value, name) { 46 | return { value: value, name: name }; 47 | }; 48 | 49 | // Predefined logging levels. 50 | Logger.TRACE = defineLogLevel(1, "TRACE"); 51 | Logger.DEBUG = defineLogLevel(2, "DEBUG"); 52 | Logger.INFO = defineLogLevel(3, "INFO"); 53 | Logger.TIME = defineLogLevel(4, "TIME"); 54 | Logger.WARN = defineLogLevel(5, "WARN"); 55 | Logger.ERROR = defineLogLevel(8, "ERROR"); 56 | Logger.OFF = defineLogLevel(99, "OFF"); 57 | 58 | // Inner class which performs the bulk of the work; ContextualLogger instances can be configured independently 59 | // of each other. 60 | var ContextualLogger = function (defaultContext) { 61 | this.context = defaultContext; 62 | this.setLevel(defaultContext.filterLevel); 63 | this.log = this.info; // Convenience alias. 64 | }; 65 | 66 | ContextualLogger.prototype = { 67 | // Changes the current logging level for the logging instance. 68 | setLevel: function (newLevel) { 69 | // Ensure the supplied Level object looks valid. 70 | if (newLevel && "value" in newLevel) { 71 | this.context.filterLevel = newLevel; 72 | } 73 | }, 74 | 75 | // Gets the current logging level for the logging instance 76 | getLevel: function () { 77 | return this.context.filterLevel; 78 | }, 79 | 80 | // Is the logger configured to output messages at the supplied level? 81 | enabledFor: function (lvl) { 82 | var filterLevel = this.context.filterLevel; 83 | return lvl.value >= filterLevel.value; 84 | }, 85 | 86 | trace: function () { 87 | this.invoke(Logger.TRACE, arguments); 88 | }, 89 | 90 | debug: function () { 91 | this.invoke(Logger.DEBUG, arguments); 92 | }, 93 | 94 | info: function () { 95 | this.invoke(Logger.INFO, arguments); 96 | }, 97 | 98 | warn: function () { 99 | this.invoke(Logger.WARN, arguments); 100 | }, 101 | 102 | error: function () { 103 | this.invoke(Logger.ERROR, arguments); 104 | }, 105 | 106 | time: function (label) { 107 | if (typeof label === "string" && label.length > 0) { 108 | this.invoke(Logger.TIME, [label, "start"]); 109 | } 110 | }, 111 | 112 | timeEnd: function (label) { 113 | if (typeof label === "string" && label.length > 0) { 114 | this.invoke(Logger.TIME, [label, "end"]); 115 | } 116 | }, 117 | 118 | // Invokes the logger callback if it's not being filtered. 119 | invoke: function (level, msgArgs) { 120 | if (logHandler && this.enabledFor(level)) { 121 | logHandler(msgArgs, merge({ level: level }, this.context)); 122 | } 123 | }, 124 | }; 125 | 126 | // Protected instance which all calls to the to level `Logger` module will be routed through. 127 | var globalLogger = new ContextualLogger({ filterLevel: Logger.OFF }); 128 | 129 | // Configure the global Logger instance. 130 | (function () { 131 | // Shortcut for optimisers. 132 | var L = Logger; 133 | 134 | L.enabledFor = bind(globalLogger, globalLogger.enabledFor); 135 | L.trace = bind(globalLogger, globalLogger.trace); 136 | L.debug = bind(globalLogger, globalLogger.debug); 137 | L.time = bind(globalLogger, globalLogger.time); 138 | L.timeEnd = bind(globalLogger, globalLogger.timeEnd); 139 | L.info = bind(globalLogger, globalLogger.info); 140 | L.warn = bind(globalLogger, globalLogger.warn); 141 | L.error = bind(globalLogger, globalLogger.error); 142 | 143 | // Don't forget the convenience alias! 144 | L.log = L.info; 145 | })(); 146 | 147 | // Set the global logging handler. The supplied function should expect two arguments, the first being an arguments 148 | // object with the supplied log messages and the second being a context object which contains a hash of stateful 149 | // parameters which the logging function can consume. 150 | Logger.setHandler = function (func) { 151 | logHandler = func; 152 | }; 153 | 154 | // Sets the global logging filter level which applies to *all* previously registered, and future Logger instances. 155 | // (note that named loggers (retrieved via `Logger.get`) can be configured independently if required). 156 | Logger.setLevel = function (level) { 157 | // Set the globalLogger's level. 158 | globalLogger.setLevel(level); 159 | 160 | // Apply this level to all registered contextual loggers. 161 | for (var key in contextualLoggersByNameMap) { 162 | if (contextualLoggersByNameMap.hasOwnProperty(key)) { 163 | contextualLoggersByNameMap[key].setLevel(level); 164 | } 165 | } 166 | }; 167 | 168 | // Gets the global logging filter level 169 | Logger.getLevel = function () { 170 | return globalLogger.getLevel(); 171 | }; 172 | 173 | // Retrieve a ContextualLogger instance. Note that named loggers automatically inherit the global logger's level, 174 | // default context and log handler. 175 | Logger.get = function (name) { 176 | // All logger instances are cached so they can be configured ahead of use. 177 | return ( 178 | contextualLoggersByNameMap[name] || 179 | (contextualLoggersByNameMap[name] = new ContextualLogger( 180 | merge({ name: name }, globalLogger.context) 181 | )) 182 | ); 183 | }; 184 | 185 | // CreateDefaultHandler returns a handler function which can be passed to `Logger.setHandler()` which will 186 | // write to the window's console object (if present); the optional options object can be used to customise the 187 | // formatter used to format each log message. 188 | Logger.createDefaultHandler = function (options) { 189 | options = options || {}; 190 | 191 | options.formatter = 192 | options.formatter || 193 | function defaultMessageFormatter(messages, context) { 194 | // Prepend the logger's name to the log message for easy identification. 195 | if (context.name) { 196 | messages.unshift("[" + context.name + "]"); 197 | } 198 | }; 199 | 200 | // Map of timestamps by timer labels used to track `#time` and `#timeEnd()` invocations in environments 201 | // that don't offer a native console method. 202 | var timerStartTimeByLabelMap = {}; 203 | 204 | // Support for IE8+ (and other, slightly more sane environments) 205 | var invokeConsoleMethod = function (hdlr, messages) { 206 | Function.prototype.apply.call(hdlr, console, messages); 207 | }; 208 | 209 | // Check for the presence of a logger. 210 | if (typeof console === "undefined") { 211 | return function () { 212 | /* no console */ 213 | }; 214 | } 215 | 216 | return function (messages, context) { 217 | // Convert arguments object to Array. 218 | messages = Array.prototype.slice.call(messages); 219 | 220 | var hdlr = console.log; 221 | var timerLabel; 222 | 223 | if (context.level === Logger.TIME) { 224 | timerLabel = 225 | (context.name ? "[" + context.name + "] " : "") + messages[0]; 226 | 227 | if (messages[1] === "start") { 228 | if (console.time) { 229 | console.time(timerLabel); 230 | } else { 231 | timerStartTimeByLabelMap[timerLabel] = new Date().getTime(); 232 | } 233 | } else { 234 | if (console.timeEnd) { 235 | console.timeEnd(timerLabel); 236 | } else { 237 | invokeConsoleMethod(hdlr, [ 238 | timerLabel + 239 | ": " + 240 | (new Date().getTime() - timerStartTimeByLabelMap[timerLabel]) + 241 | "ms", 242 | ]); 243 | } 244 | } 245 | } else { 246 | // Delegate through to custom warn/error loggers if present on the console. 247 | if (context.level === Logger.WARN && console.warn) { 248 | hdlr = console.warn; 249 | } else if (context.level === Logger.ERROR && console.error) { 250 | hdlr = console.error; 251 | } else if (context.level === Logger.INFO && console.info) { 252 | hdlr = console.info; 253 | } else if (context.level === Logger.DEBUG && console.debug) { 254 | hdlr = console.debug; 255 | } else if (context.level === Logger.TRACE && console.trace) { 256 | hdlr = console.trace; 257 | } 258 | 259 | options.formatter(messages, context); 260 | invokeConsoleMethod(hdlr, messages); 261 | } 262 | }; 263 | }; 264 | 265 | // Configure and example a Default implementation which writes to the `window.console` (if present). The 266 | // `options` hash can be used to configure the default logLevel and provide a custom message formatter. 267 | Logger.useDefaults = function (options) { 268 | Logger.setLevel((options && options.defaultLevel) || Logger.DEBUG); 269 | Logger.setHandler(Logger.createDefaultHandler(options)); 270 | }; 271 | 272 | // Createa an alias to useDefaults to avoid reaking a react-hooks rule. 273 | Logger.setDefaults = Logger.useDefaults; 274 | 275 | // Export to popular environments boilerplate. 276 | if (typeof define === "function" && define.amd) { 277 | define(Logger); 278 | } else if (typeof module !== "undefined" && module.exports) { 279 | module.exports = Logger; 280 | } else { 281 | Logger._prevLogger = global.Logger; 282 | 283 | Logger.noConflict = function () { 284 | global.Logger = Logger._prevLogger; 285 | return Logger; 286 | }; 287 | 288 | global.Logger = Logger; 289 | } 290 | })(this); 291 | -------------------------------------------------------------------------------- /src/logger.min.js: -------------------------------------------------------------------------------- 1 | !function(e){"use strict";var t,c={};c.VERSION="1.6.1";var o={},n=function(e,n){return function(){return n.apply(e,arguments)}},r=function(){var e,n,t=arguments,o=t[0];for(n=1;n=n.value},trace:function(){this.invoke(c.TRACE,arguments)},debug:function(){this.invoke(c.DEBUG,arguments)},info:function(){this.invoke(c.INFO,arguments)},warn:function(){this.invoke(c.WARN,arguments)},error:function(){this.invoke(c.ERROR,arguments)},time:function(e){"string"==typeof e&&0 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /test-src/loggertests.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | "use strict"; 3 | 4 | QUnit.module("js-logger", { 5 | beforeEach: function () { 6 | var calls = []; 7 | 8 | this.calls = calls; 9 | this.logger = window.Logger; 10 | 11 | this.logger.setHandler(function (messages, context) { 12 | calls.push({ messages: messages, context: context }); 13 | }); 14 | }, 15 | }); 16 | 17 | QUnit.test( 18 | "Global Logger - Log messages routed to logger function", 19 | function (assert) { 20 | var logger = this.logger; 21 | 22 | // Enable all log messages. 23 | logger.setLevel(logger.TRACE); 24 | 25 | // Route some messages through to the logFunc. 26 | logger.trace("A trace message"); 27 | logger.debug("A debug message"); 28 | logger.info("An info message"); 29 | logger.warn("A warning message"); 30 | logger.error("An error message"); 31 | 32 | // Check they were received. 33 | assert.equal(this.calls[0].messages[0], "A trace message"); 34 | assert.strictEqual(this.calls[0].context.level, logger.TRACE); 35 | 36 | assert.equal(this.calls[1].messages[0], "A debug message"); 37 | assert.strictEqual(this.calls[1].context.level, logger.DEBUG); 38 | 39 | assert.equal(this.calls[2].messages[0], "An info message"); 40 | assert.strictEqual(this.calls[2].context.level, logger.INFO); 41 | 42 | assert.equal(this.calls[3].messages[0], "A warning message"); 43 | assert.strictEqual(this.calls[3].context.level, logger.WARN); 44 | 45 | assert.equal(this.calls[4].messages[0], "An error message"); 46 | assert.strictEqual(this.calls[4].context.level, logger.ERROR); 47 | } 48 | ); 49 | 50 | QUnit.test( 51 | "Global Logger - Timing operations routed to logger function", 52 | function (assert) { 53 | var logger = this.logger; 54 | 55 | // Enable all log messages. 56 | logger.setLevel(logger.TRACE); 57 | 58 | logger.time("label"); 59 | assert.strictEqual(this.calls[0].context.level, logger.TIME); 60 | assert.strictEqual(this.calls[0].messages[0], "label"); 61 | assert.strictEqual(this.calls[0].messages[1], "start"); 62 | 63 | logger.timeEnd("label"); 64 | assert.strictEqual(this.calls[1].context.level, logger.TIME); 65 | assert.strictEqual(this.calls[1].messages[0], "label"); 66 | assert.strictEqual(this.calls[1].messages[1], "end"); 67 | } 68 | ); 69 | 70 | QUnit.test("Global Logger.enabledFor", function (assert) { 71 | var logger = this.logger; 72 | 73 | logger.setLevel(logger.OFF); 74 | assert.equal(logger.enabledFor(logger.TRACE), false); 75 | assert.equal(logger.enabledFor(logger.DEBUG), false); 76 | assert.equal(logger.enabledFor(logger.INFO), false); 77 | assert.equal(logger.enabledFor(logger.TIME), false); 78 | assert.equal(logger.enabledFor(logger.WARN), false); 79 | assert.equal(logger.enabledFor(logger.ERROR), false); 80 | 81 | logger.setLevel(logger.TRACE); 82 | assert.equal(logger.enabledFor(logger.TRACE), true); 83 | assert.equal(logger.enabledFor(logger.DEBUG), true); 84 | assert.equal(logger.enabledFor(logger.INFO), true); 85 | assert.equal(logger.enabledFor(logger.TIME), true); 86 | assert.equal(logger.enabledFor(logger.WARN), true); 87 | assert.equal(logger.enabledFor(logger.ERROR), true); 88 | 89 | logger.setLevel(logger.DEBUG); 90 | assert.equal(logger.enabledFor(logger.TRACE), false); 91 | assert.equal(logger.enabledFor(logger.DEBUG), true); 92 | assert.equal(logger.enabledFor(logger.INFO), true); 93 | assert.equal(logger.enabledFor(logger.TIME), true); 94 | assert.equal(logger.enabledFor(logger.WARN), true); 95 | assert.equal(logger.enabledFor(logger.ERROR), true); 96 | 97 | logger.setLevel(logger.INFO); 98 | assert.equal(logger.enabledFor(logger.TRACE), false); 99 | assert.equal(logger.enabledFor(logger.DEBUG), false); 100 | assert.equal(logger.enabledFor(logger.INFO), true); 101 | assert.equal(logger.enabledFor(logger.TIME), true); 102 | assert.equal(logger.enabledFor(logger.WARN), true); 103 | assert.equal(logger.enabledFor(logger.ERROR), true); 104 | 105 | logger.setLevel(logger.WARN); 106 | assert.equal(logger.enabledFor(logger.TRACE), false); 107 | assert.equal(logger.enabledFor(logger.DEBUG), false); 108 | assert.equal(logger.enabledFor(logger.INFO), false); 109 | assert.equal(logger.enabledFor(logger.TIME), false); 110 | assert.equal(logger.enabledFor(logger.WARN), true); 111 | assert.equal(logger.enabledFor(logger.ERROR), true); 112 | 113 | logger.setLevel(logger.ERROR); 114 | assert.equal(logger.enabledFor(logger.TRACE), false); 115 | assert.equal(logger.enabledFor(logger.DEBUG), false); 116 | assert.equal(logger.enabledFor(logger.INFO), false); 117 | assert.equal(logger.enabledFor(logger.TIME), false); 118 | assert.equal(logger.enabledFor(logger.WARN), false); 119 | assert.equal(logger.enabledFor(logger.ERROR), true); 120 | }); 121 | 122 | QUnit.test("Named logger messages not routed to global logger", function ( 123 | assert 124 | ) { 125 | var logger = this.logger; 126 | var namedLogger = this.logger.get("getLogger"); 127 | 128 | logger.setLevel(Logger.DEBUG); 129 | namedLogger.setLevel(Logger.DEBUG); 130 | 131 | namedLogger.info("Message via get logger"); 132 | 133 | assert.ok( 134 | this.calls.length === 1, 135 | "Log message was only routed via named logger." 136 | ); 137 | }); 138 | 139 | QUnit.test("Named logger, same instance returned", function (assert) { 140 | assert.strictEqual( 141 | this.logger.get("myLogger"), 142 | this.logger.get("myLogger"), 143 | "Exact same logger instance returned" 144 | ); 145 | }); 146 | 147 | QUnit.test("Named logger setLevel does not affect global logger", function ( 148 | assert 149 | ) { 150 | var named = this.logger.get("MyLogger"); 151 | 152 | // Set the get logger at a lower level than the global logger. 153 | this.logger.setLevel(Logger.OFF); 154 | named.setLevel(Logger.DEBUG); 155 | 156 | named.debug("Debug message via named logger"); 157 | this.logger.debug("Debug message via Global Logger"); 158 | 159 | // Check the log message was routed correctly. 160 | assert.ok(this.calls.length === 1, "LoggerFunc was invoked once"); 161 | assert.equal(this.calls[0].context.name, "MyLogger"); 162 | }); 163 | 164 | QUnit.test("Logger.log convenience method", function (assert) { 165 | this.logger.setLevel(Logger.INFO); 166 | this.logger.log("log message"); 167 | 168 | assert.ok(this.calls.length === 1); 169 | assert.strictEqual( 170 | this.calls[0].context.level, 171 | Logger.INFO, 172 | "Logger.log message routed at INFO level" 173 | ); 174 | }); 175 | 176 | QUnit.test("Named logger.log convenience method", function (assert) { 177 | var named = this.logger.get("logHelper"); 178 | named.setLevel(Logger.INFO); 179 | named.log("log message"); 180 | 181 | assert.ok(this.calls.length === 1); 182 | assert.strictEqual( 183 | this.calls[0].context.level, 184 | Logger.INFO, 185 | "Logger.log message routed at INFO level" 186 | ); 187 | }); 188 | 189 | QUnit.test( 190 | "Logger.setLevel - Modify log filter level of all named loggers", 191 | function (assert) { 192 | var logger = this.logger; 193 | var named = logger.get("NamedA"); 194 | 195 | // No no log messages will be routed through this logger. 196 | named.setLevel(logger.OFF); 197 | 198 | // Switch the global log level to DEBUG, should affect all named loggers 199 | logger.setLevel(logger.DEBUG); 200 | 201 | named.debug("debug message"); 202 | 203 | assert.ok( 204 | this.calls.length === 1, 205 | "Logger.setLevel() sets log filter level for all named loggers" 206 | ); 207 | } 208 | ); 209 | 210 | QUnit.test("Logger.getLevel - Get the log filter level", function (assert) { 211 | var logger = this.logger; 212 | logger.setLevel(Logger.DEBUG); 213 | 214 | var level = logger.getLevel(); 215 | 216 | assert.strictEqual(level, Logger.DEBUG); 217 | }); 218 | 219 | QUnit.test("Logger.useDefaults logs to console (except trace)", function ( 220 | assert 221 | ) { 222 | var logger = this.logger; 223 | 224 | var sandbox = sinon.sandbox.create(); 225 | sandbox.stub(console, "trace"); 226 | sandbox.stub(console, "debug"); 227 | sandbox.stub(console, "info"); 228 | sandbox.stub(console, "warn"); 229 | sandbox.stub(console, "error"); 230 | 231 | logger.useDefaults(); // default loglevel is debug 232 | logger.trace("trace message"); 233 | logger.debug("debug message"); 234 | logger.info("info message"); 235 | logger.warn("warning message"); 236 | logger.error("error message"); 237 | 238 | assert.ok( 239 | console.trace.callCount === 0, 240 | "logger.trace calls console.trace" 241 | ); 242 | assert.ok(console.debug.calledOnce, "logger.debug calls console.debug"); 243 | assert.ok(console.info.calledOnce, "logger.info calls console.info"); 244 | assert.ok(console.warn.calledOnce, "logger.warn calls console.warn"); 245 | assert.ok(console.error.calledOnce, "logger.error calls console.error"); 246 | 247 | sandbox.restore(); 248 | }); 249 | 250 | QUnit.test( 251 | "Logger.useDefaults forward timing operations through to the console", 252 | function (assert) { 253 | var logger = this.logger; 254 | 255 | var sandbox = sinon.sandbox.create(); 256 | sandbox.stub(console, "time"); 257 | sandbox.stub(console, "timeEnd"); 258 | 259 | logger.useDefaults(); 260 | logger.time("label"); 261 | logger.timeEnd("label"); 262 | 263 | assert.ok(console.time.calledOnce, "logger.time calls console.time"); 264 | assert.ok( 265 | console.timeEnd.calledOnce, 266 | "logger.timeEnd calls console.timeEnd" 267 | ); 268 | 269 | sandbox.restore(); 270 | } 271 | ); 272 | 273 | QUnit.test( 274 | "Logger.useDefaults can be supplied a custom message formatter", 275 | function (assert) { 276 | var sandbox = sinon.sandbox.create(); 277 | sandbox.stub(console, "warn"); 278 | 279 | var namedLogger = this.logger.get("Dave"); 280 | var formatterSpy = sinon.spy(); 281 | 282 | this.logger.useDefaults({ 283 | formatter: formatterSpy, 284 | }); 285 | 286 | namedLogger.warn("Hello", "World"); 287 | 288 | assert.equal(formatterSpy.callCount, 1, "formatter invoked once per log"); 289 | assert.deepEqual( 290 | formatterSpy.firstCall.args[0], 291 | ["Hello", "World"], 292 | "Log messages supplied to handler" 293 | ); 294 | assert.ok( 295 | formatterSpy.firstCall.args[1].name === "Dave", 296 | "Context passed to formatter" 297 | ); 298 | 299 | sandbox.restore(); 300 | } 301 | ); 302 | 303 | QUnit.test("Logger.setDefaults is an alias for useDefaults", function ( 304 | assert 305 | ) { 306 | var sandbox = sinon.sandbox.create(); 307 | sandbox.stub(console, "warn"); 308 | 309 | var formatterSpy = sinon.spy(); 310 | 311 | this.logger.setDefaults({ 312 | formatter: formatterSpy, 313 | }); 314 | 315 | this.logger.warn("Hello", "World"); 316 | 317 | assert.ok(formatterSpy.callCount, "formatter invoked once per log"); 318 | 319 | sandbox.restore(); 320 | }); 321 | })(); 322 | -------------------------------------------------------------------------------- /test-src/typescript-consumer/index.ts: -------------------------------------------------------------------------------- 1 | import oldStyleImportTest from "./old-style-import"; 2 | import newStyleImportTest from "./new-style-import"; 3 | 4 | oldStyleImportTest(); 5 | newStyleImportTest(); 6 | -------------------------------------------------------------------------------- /test-src/typescript-consumer/new-style-import.ts: -------------------------------------------------------------------------------- 1 | import jsLogger, { ILogger } from "js-logger"; 2 | 3 | export default () => { 4 | jsLogger.useDefaults(); 5 | const myLogger: ILogger = jsLogger.get("myLogger"); 6 | myLogger.info("Yay Typescript!"); 7 | }; 8 | -------------------------------------------------------------------------------- /test-src/typescript-consumer/old-style-import.ts: -------------------------------------------------------------------------------- 1 | import * as jsLogger from "js-logger"; 2 | import { ILogger } from "js-logger"; 3 | 4 | export default () => { 5 | jsLogger.useDefaults(); 6 | const myLogger: ILogger = jsLogger.get("myLogger"); 7 | myLogger.info("Yay Typescript!"); 8 | }; 9 | -------------------------------------------------------------------------------- /test-src/vendor/qunit-1.18.0.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * QUnit 1.18.0 3 | * http://qunitjs.com/ 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license 7 | * http://jquery.org/license 8 | * 9 | * Date: 2015-04-03T10:23Z 10 | */ 11 | 12 | /** Font Family and Sizes */ 13 | 14 | #qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult { 15 | font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif; 16 | } 17 | 18 | #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; } 19 | #qunit-tests { font-size: smaller; } 20 | 21 | 22 | /** Resets */ 23 | 24 | #qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter { 25 | margin: 0; 26 | padding: 0; 27 | } 28 | 29 | 30 | /** Header */ 31 | 32 | #qunit-header { 33 | padding: 0.5em 0 0.5em 1em; 34 | 35 | color: #8699A4; 36 | background-color: #0D3349; 37 | 38 | font-size: 1.5em; 39 | line-height: 1em; 40 | font-weight: 400; 41 | 42 | border-radius: 5px 5px 0 0; 43 | } 44 | 45 | #qunit-header a { 46 | text-decoration: none; 47 | color: #C2CCD1; 48 | } 49 | 50 | #qunit-header a:hover, 51 | #qunit-header a:focus { 52 | color: #FFF; 53 | } 54 | 55 | #qunit-testrunner-toolbar label { 56 | display: inline-block; 57 | padding: 0 0.5em 0 0.1em; 58 | } 59 | 60 | #qunit-banner { 61 | height: 5px; 62 | } 63 | 64 | #qunit-testrunner-toolbar { 65 | padding: 0.5em 1em 0.5em 1em; 66 | color: #5E740B; 67 | background-color: #EEE; 68 | overflow: hidden; 69 | } 70 | 71 | #qunit-userAgent { 72 | padding: 0.5em 1em 0.5em 1em; 73 | background-color: #2B81AF; 74 | color: #FFF; 75 | text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; 76 | } 77 | 78 | #qunit-modulefilter-container { 79 | float: right; 80 | padding: 0.2em; 81 | } 82 | 83 | .qunit-url-config { 84 | display: inline-block; 85 | padding: 0.1em; 86 | } 87 | 88 | .qunit-filter { 89 | display: block; 90 | float: right; 91 | margin-left: 1em; 92 | } 93 | 94 | /** Tests: Pass/Fail */ 95 | 96 | #qunit-tests { 97 | list-style-position: inside; 98 | } 99 | 100 | #qunit-tests li { 101 | padding: 0.4em 1em 0.4em 1em; 102 | border-bottom: 1px solid #FFF; 103 | list-style-position: inside; 104 | } 105 | 106 | #qunit-tests > li { 107 | display: none; 108 | } 109 | 110 | #qunit-tests li.running, 111 | #qunit-tests li.pass, 112 | #qunit-tests li.fail, 113 | #qunit-tests li.skipped { 114 | display: list-item; 115 | } 116 | 117 | #qunit-tests.hidepass li.running, 118 | #qunit-tests.hidepass li.pass { 119 | visibility: hidden; 120 | position: absolute; 121 | width: 0px; 122 | height: 0px; 123 | padding: 0; 124 | border: 0; 125 | margin: 0; 126 | } 127 | 128 | #qunit-tests li strong { 129 | cursor: pointer; 130 | } 131 | 132 | #qunit-tests li.skipped strong { 133 | cursor: default; 134 | } 135 | 136 | #qunit-tests li a { 137 | padding: 0.5em; 138 | color: #C2CCD1; 139 | text-decoration: none; 140 | } 141 | 142 | #qunit-tests li p a { 143 | padding: 0.25em; 144 | color: #6B6464; 145 | } 146 | #qunit-tests li a:hover, 147 | #qunit-tests li a:focus { 148 | color: #000; 149 | } 150 | 151 | #qunit-tests li .runtime { 152 | float: right; 153 | font-size: smaller; 154 | } 155 | 156 | .qunit-assert-list { 157 | margin-top: 0.5em; 158 | padding: 0.5em; 159 | 160 | background-color: #FFF; 161 | 162 | border-radius: 5px; 163 | } 164 | 165 | .qunit-collapsed { 166 | display: none; 167 | } 168 | 169 | #qunit-tests table { 170 | border-collapse: collapse; 171 | margin-top: 0.2em; 172 | } 173 | 174 | #qunit-tests th { 175 | text-align: right; 176 | vertical-align: top; 177 | padding: 0 0.5em 0 0; 178 | } 179 | 180 | #qunit-tests td { 181 | vertical-align: top; 182 | } 183 | 184 | #qunit-tests pre { 185 | margin: 0; 186 | white-space: pre-wrap; 187 | word-wrap: break-word; 188 | } 189 | 190 | #qunit-tests del { 191 | background-color: #E0F2BE; 192 | color: #374E0C; 193 | text-decoration: none; 194 | } 195 | 196 | #qunit-tests ins { 197 | background-color: #FFCACA; 198 | color: #500; 199 | text-decoration: none; 200 | } 201 | 202 | /*** Test Counts */ 203 | 204 | #qunit-tests b.counts { color: #000; } 205 | #qunit-tests b.passed { color: #5E740B; } 206 | #qunit-tests b.failed { color: #710909; } 207 | 208 | #qunit-tests li li { 209 | padding: 5px; 210 | background-color: #FFF; 211 | border-bottom: none; 212 | list-style-position: inside; 213 | } 214 | 215 | /*** Passing Styles */ 216 | 217 | #qunit-tests li li.pass { 218 | color: #3C510C; 219 | background-color: #FFF; 220 | border-left: 10px solid #C6E746; 221 | } 222 | 223 | #qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; } 224 | #qunit-tests .pass .test-name { color: #366097; } 225 | 226 | #qunit-tests .pass .test-actual, 227 | #qunit-tests .pass .test-expected { color: #999; } 228 | 229 | #qunit-banner.qunit-pass { background-color: #C6E746; } 230 | 231 | /*** Failing Styles */ 232 | 233 | #qunit-tests li li.fail { 234 | color: #710909; 235 | background-color: #FFF; 236 | border-left: 10px solid #EE5757; 237 | white-space: pre; 238 | } 239 | 240 | #qunit-tests > li:last-child { 241 | border-radius: 0 0 5px 5px; 242 | } 243 | 244 | #qunit-tests .fail { color: #000; background-color: #EE5757; } 245 | #qunit-tests .fail .test-name, 246 | #qunit-tests .fail .module-name { color: #000; } 247 | 248 | #qunit-tests .fail .test-actual { color: #EE5757; } 249 | #qunit-tests .fail .test-expected { color: #008000; } 250 | 251 | #qunit-banner.qunit-fail { background-color: #EE5757; } 252 | 253 | /*** Skipped tests */ 254 | 255 | #qunit-tests .skipped { 256 | background-color: #EBECE9; 257 | } 258 | 259 | #qunit-tests .qunit-skipped-label { 260 | background-color: #F4FF77; 261 | display: inline-block; 262 | font-style: normal; 263 | color: #366097; 264 | line-height: 1.8em; 265 | padding: 0 0.5em; 266 | margin: -0.4em 0.4em -0.4em 0; 267 | } 268 | 269 | /** Result */ 270 | 271 | #qunit-testresult { 272 | padding: 0.5em 1em 0.5em 1em; 273 | 274 | color: #2B81AF; 275 | background-color: #D2E0E6; 276 | 277 | border-bottom: 1px solid #FFF; 278 | } 279 | #qunit-testresult .module-name { 280 | font-weight: 700; 281 | } 282 | 283 | /** Fixture */ 284 | 285 | #qunit-fixture { 286 | position: absolute; 287 | top: -10000px; 288 | left: -10000px; 289 | width: 1000px; 290 | height: 1000px; 291 | } 292 | -------------------------------------------------------------------------------- /travis-ci-build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -ex 3 | 4 | npm run lint 5 | npm run test 6 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "buildOnSave": false, 4 | "include": ["src/*", "test-src/typescript-consumer/*"], 5 | "exclude": ["node_modules"], 6 | "typeAcquisition": { 7 | "enable": false 8 | }, 9 | "compilerOptions": { 10 | "baseUrl": ".", 11 | "paths": { 12 | "*": ["*", "src/*", "test-src/*"], 13 | "js-logger": ["src/logger"] 14 | }, 15 | "esModuleInterop": true, 16 | "diagnostics": true, 17 | "sourceMap": true, 18 | "alwaysStrict": false, 19 | "moduleResolution": "node", 20 | "noImplicitAny": true, 21 | "noImplicitReturns": true, 22 | "noImplicitThis": true, 23 | "pretty": true, 24 | "target": "es5", 25 | "module": "commonjs", 26 | "removeComments": false, 27 | "preserveConstEnums": true, 28 | "declaration": false, 29 | "experimentalDecorators": true, 30 | "emitDecoratorMetadata": true, 31 | "allowSyntheticDefaultImports": true, 32 | "traceResolution": true, 33 | "lib": ["es5"] 34 | } 35 | } 36 | --------------------------------------------------------------------------------