├── .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 [](https://travis-ci.org/jonnyreeves/js-logger) [](http://badge.fury.io/js/js-logger) 
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 |
--------------------------------------------------------------------------------