Comparing version 0.3.7 to 1.0.0
270
lib/index.js
@@ -1,134 +0,221 @@ | ||
'use strict'; | ||
"use strict"; | ||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; | ||
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } | ||
var _objectPath = require('object-path'); | ||
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } | ||
var _objectPath2 = _interopRequireDefault(_objectPath); | ||
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } | ||
var _cryptoExtra = require('crypto-extra'); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
var _cryptoExtra2 = _interopRequireDefault(_cryptoExtra); | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
var _deepAssign = require('deep-assign'); | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
var _deepAssign2 = _interopRequireDefault(_deepAssign); | ||
var format = require('format-util'); | ||
var _types = require('./components/types'); | ||
var superagent = require('superagent'); | ||
var _types2 = _interopRequireDefault(_types); | ||
var parseErr = require('parse-err'); | ||
var _intrinsics = require('./components/intrinsics'); | ||
var safeStringify = require('fast-safe-stringify'); // <https://lacke.mn/reduce-your-bundle-js-file-size/> | ||
// <https://github.com/lodash/babel-plugin-lodash/issues/221> | ||
var _intrinsics2 = _interopRequireDefault(_intrinsics); | ||
var _pseudos = require('./components/pseudos'); | ||
var isError = require('lodash/isError'); | ||
var _pseudos2 = _interopRequireDefault(_pseudos); | ||
var isObject = require('lodash/isObject'); | ||
var _apply = require('./components/apply'); | ||
var isString = require('lodash/isString'); | ||
var _apply2 = _interopRequireDefault(_apply); | ||
var includes = require('lodash/includes'); | ||
var _emit = require('./utils/emit'); | ||
var omit = require('lodash/omit'); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
var isEmpty = require('lodash/isEmpty'); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
var isPlainObject = require('lodash/isPlainObject'); | ||
var Axe = function () { | ||
var isUndefined = require('lodash/isUndefined'); | ||
var isNull = require('lodash/isNull'); // add retry logic to superagent | ||
require('superagent-retry')(superagent); // eslint-disable-next-line import/no-unassigned-import | ||
require('console-polyfill'); // these are known as "placeholder tokens", see this link for more info: | ||
// <https://nodejs.org/api/util.html#util_util_format_format_args> | ||
// | ||
// since they aren't exposed (or don't seem to be) by node (at least not yet) | ||
// we just define an array that contains them for now | ||
// <https://github.com/nodejs/node/issues/17601> | ||
var tokens = ['%s', '%d', '%i', '%f', '%j', '%o', '%O', '%%']; | ||
var levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal']; | ||
var endpoint = 'https://api.cabinjs.com'; | ||
var Axe = | ||
/*#__PURE__*/ | ||
function () { | ||
function Axe() { | ||
var _this = this; | ||
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
_classCallCheck(this, Axe); | ||
this._name = opts.name || 'axe-' + _cryptoExtra2.default.randomString(15, '0123456789'); | ||
if (!opts.name) { | ||
(0, _emit.warn)('Stacks with generated names cannot be updated! Provide your own name to remedy this.'); | ||
} | ||
this.config = Object.assign({ | ||
key: '', | ||
endpoint: endpoint, | ||
headers: {}, | ||
timeout: 5000, | ||
retry: 3, | ||
showStack: true, | ||
showMeta: false, | ||
silent: false, | ||
logger: console, | ||
levels: ['info', 'warn', 'error', 'fatal'], | ||
capture: true | ||
}, config); // we could have used `auto-bind` but it's not compiled for browser | ||
this._params = opts.params || {}; | ||
this.envParam = opts.envParam !== undefined ? opts.envParam : true; | ||
this.hiddenParams = opts.hiddenParams !== undefined ? opts.hiddenParams : true; | ||
this.log = this.log.bind(this); // bind helper functions for each log level | ||
if (opts.appendEnv) { | ||
if (process.env.NODE_ENV) { | ||
this.baseName = this._name; | ||
this._name += '--' + process.env.NODE_ENV; | ||
} else { | ||
(0, _emit.warn)('"appendEnv" is set to true, but environment was not found!'); | ||
} | ||
} | ||
levels.forEach(function (level) { | ||
_this[level] = function () { | ||
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { | ||
args[_key] = arguments[_key]; | ||
} | ||
this._stack = { | ||
Mappings: {}, | ||
Conditions: {}, | ||
Resources: {}, | ||
Outputs: {}, | ||
Parameters: {} | ||
}; | ||
return _this.log.apply(_this, _toConsumableArray([level].concat([].slice.call(args)))); | ||
}; | ||
}); // aliases | ||
this.addMapping = function (data) { | ||
return _this._add('Mappings', data); | ||
}; | ||
this.addCondition = function (data) { | ||
return _this._add('Conditions', data); | ||
}; | ||
this.addResource = function (data) { | ||
return _this._add('Resources', data); | ||
}; | ||
this.addOutput = function (data) { | ||
return _this._add('Outputs', data); | ||
}; | ||
this.err = this.error; | ||
this.warning = this.warn; | ||
} // eslint-disable-next-line complexity | ||
this.apply = _apply2.default; | ||
} | ||
_createClass(Axe, [{ | ||
key: '_add', | ||
value: function _add(type, data) { | ||
key: "log", | ||
value: function log(level, message) { | ||
var _this2 = this; | ||
if (typeof data === 'function') { | ||
data = data(this); | ||
var meta = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; | ||
for (var _len2 = arguments.length, args = new Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) { | ||
args[_key2 - 3] = arguments[_key2]; | ||
} | ||
if (Array.isArray(data)) { | ||
data = data.filter(Boolean); | ||
var originalArgs = [level, message, meta].concat(_toConsumableArray([].slice.call(args))); | ||
var config = this.config; | ||
var modifier = 0; | ||
if (level === 'warning') level = 'warn'; | ||
if (level === 'err') level = 'error'; | ||
return data.forEach(function (i) { | ||
return _this2._add(type, i); | ||
}); | ||
} | ||
if (isError(level)) { | ||
meta = message; | ||
message = level; | ||
level = 'error'; | ||
} else if (!isString(level) || !includes(levels, level)) { | ||
meta = message; | ||
message = level; | ||
level = 'info'; | ||
modifier = -1; | ||
} // if there are four or more args | ||
// then infer to use util.format on everything | ||
var key = Object.keys(data)[0]; | ||
if (this._stack[type][key]) { | ||
throw new Error('Duplicate ' + type.toLowerCase() + ' ID was found: ' + key); | ||
if (arguments.length >= 4 + modifier) { | ||
message = format.apply(void 0, _toConsumableArray(originalArgs.slice(1 + modifier))); | ||
meta = {}; | ||
} else if (arguments.length === 3 + modifier && isString(message) && tokens.some(function (t) { | ||
return includes(message, t); | ||
})) { | ||
// otherwise if there are three args and if the `message` contains | ||
// a placeholder token (e.g. '%s' or '%d' - see above `tokens` variable) | ||
// then we can infer that the `meta` arg passed is used for formatting | ||
message = format(message, meta); | ||
meta = {}; | ||
} else if (!isError(message)) { | ||
if (isError(meta)) { | ||
meta = { | ||
err: parseErr(meta) | ||
}; | ||
} else if (!isPlainObject(meta) && !isUndefined(meta) && !isNull(meta)) { | ||
// if the `meta` variable passed was not an Object then convert it | ||
message = format(message, meta); | ||
meta = {}; | ||
} else if (!isString(message)) { | ||
// if the message is not a string then we should run `util.format` on it | ||
// assuming we're formatting it like it was another argument | ||
// (as opposed to using something like fast-json-stringify) | ||
message = format(message); | ||
} | ||
} | ||
if (type === 'Resources') { | ||
(function () { | ||
var tags = _objectPath2.default.get(data[key], 'Properties.Tags'); | ||
if (tags && !Array.isArray(tags)) { | ||
data[key].Properties.Tags = Object.keys(tags).map(function (tag) { | ||
return { | ||
Key: tag, | ||
Value: tags[tag] | ||
}; | ||
}); | ||
if (!isPlainObject(meta)) meta = {}; | ||
var err; | ||
if (isError(message)) { | ||
err = message; | ||
if (!isObject(meta.err)) meta.err = parseErr(err); | ||
var _message = message; | ||
message = _message.message; | ||
} // set default level on meta | ||
meta.level = level; // set the body used for returning with and sending logs | ||
// (and also remove circular references) | ||
var body = safeStringify({ | ||
message: message, | ||
meta: meta | ||
}); // send to Cabin or other logging service here the `message` and `meta` | ||
if (config.capture && includes(config.levels, level) && (!isError(err) || !err._captureFailed)) { | ||
// if the user didn't specify a key | ||
// and they are using the default endpoint | ||
// then we should throw an error to them | ||
if (config.endpoint === endpoint && !config.key) throw new Error("Please provide your Cabin API key as `new Axe({ key: 'YOUR-CABIN-API-KEY' })`.\nVisit <https://cabinjs.com> to sign up for free!\nHide this message with `new Axe({ capture: false })`."); // capture the log over HTTP | ||
var req = superagent.post(config.endpoint).timeout(config.timeout); // basic auth (e.g. Cabin API key) | ||
if (config.key) req.auth(config.key); // set headers if any | ||
if (!isEmpty(config.headers)) req.set(config.headers); | ||
req.retry(config.retry).send(body).end(function (err) { | ||
if (err) { | ||
err._captureFailed = true; | ||
_this2.config.logger.error(err); | ||
} | ||
})(); | ||
} | ||
}); | ||
} // Suppress logs if it was silent | ||
(0, _deepAssign2.default)(this._stack[type], data); | ||
if (config.silent) return body; // if there was meta information then output it | ||
var omitted = omit(meta, ['level', 'err']); // fatal should use error (e.g. in browser) | ||
if (level === 'fatal') level = 'error'; // if we didn't pass a level as a method | ||
// (e.g. console.info), then we should still | ||
// use the logger's `log` method to output | ||
if (modifier === -1) level = 'log'; // show stack trace if necessary (along with any metadata) | ||
if (level === 'error' && isError(err) && config.showStack) { | ||
if (!config.showMeta || isEmpty(omitted)) this.config.logger.error(err);else this.config.logger.error(err, omitted); | ||
} else if (!config.showMeta || isEmpty(omitted)) { | ||
this.config.logger[level](message); | ||
} else { | ||
this.config.logger[level](message, omitted); | ||
} // return the parsed body in case we need it | ||
return body; | ||
} | ||
}, { | ||
key: 'toJSON', | ||
value: function toJSON(pretty) { | ||
return pretty ? JSON.stringify(this._stack, null, 2) : JSON.stringify(this._stack); | ||
} | ||
}]); | ||
@@ -139,4 +226,3 @@ | ||
module.exports = _extends({ | ||
Stack: Axe | ||
}, _types2.default, _intrinsics2.default, _pseudos2.default); | ||
module.exports = Axe; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJmb3JtYXQiLCJyZXF1aXJlIiwic3VwZXJhZ2VudCIsInBhcnNlRXJyIiwic2FmZVN0cmluZ2lmeSIsImlzRXJyb3IiLCJpc09iamVjdCIsImlzU3RyaW5nIiwiaW5jbHVkZXMiLCJvbWl0IiwiaXNFbXB0eSIsImlzUGxhaW5PYmplY3QiLCJpc1VuZGVmaW5lZCIsImlzTnVsbCIsInRva2VucyIsImxldmVscyIsImVuZHBvaW50IiwiQXhlIiwiY29uZmlnIiwiT2JqZWN0IiwiYXNzaWduIiwia2V5IiwiaGVhZGVycyIsInRpbWVvdXQiLCJyZXRyeSIsInNob3dTdGFjayIsInNob3dNZXRhIiwic2lsZW50IiwibG9nZ2VyIiwiY29uc29sZSIsImNhcHR1cmUiLCJsb2ciLCJiaW5kIiwiZm9yRWFjaCIsImxldmVsIiwiYXJncyIsImNvbmNhdCIsInNsaWNlIiwiY2FsbCIsImVyciIsImVycm9yIiwid2FybmluZyIsIndhcm4iLCJtZXNzYWdlIiwibWV0YSIsIm9yaWdpbmFsQXJncyIsIm1vZGlmaWVyIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic29tZSIsInQiLCJib2R5IiwiX2NhcHR1cmVGYWlsZWQiLCJFcnJvciIsInJlcSIsInBvc3QiLCJhdXRoIiwic2V0Iiwic2VuZCIsImVuZCIsIm9taXR0ZWQiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBTUEsU0FBU0MsUUFBUSxhQUFSLENBQWY7O0FBQ0EsSUFBTUMsYUFBYUQsUUFBUSxZQUFSLENBQW5COztBQUNBLElBQU1FLFdBQVdGLFFBQVEsV0FBUixDQUFqQjs7QUFDQSxJQUFNRyxnQkFBZ0JILFFBQVEscUJBQVIsQ0FBdEIsQyxDQUNBO0FBQ0E7OztBQUNBLElBQU1JLFVBQVVKLFFBQVEsZ0JBQVIsQ0FBaEI7O0FBQ0EsSUFBTUssV0FBV0wsUUFBUSxpQkFBUixDQUFqQjs7QUFDQSxJQUFNTSxXQUFX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RUFBMEJTLE9BQTFCLEVBQW1DaUIsT0FBbkM7QUFDRCxPQXpIcUMsQ0EySHRDOzs7QUFDQSxhQUFPVCxJQUFQO0FBQ0Q7Ozs7OztBQUdIVSxPQUFPQyxPQUFQLEdBQWlCN0MsR0FBakIiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBmb3JtYXQgPSByZXF1aXJlKCdmb3JtYXQtdXRpbCcpO1xuY29uc3Qgc3VwZXJhZ2VudCA9IHJlcXVpcmUoJ3N1cGVyYWdlbnQnKTtcbmNvbnN0IHBhcnNlRXJyID0gcmVxdWlyZSgncGFyc2UtZXJyJyk7XG5jb25zdCBzYWZlU3RyaW5naWZ5ID0gcmVxdWlyZSgnZmFzdC1zYWZlLXN0cmluZ2lmeScpO1xuLy8gPGh0dHBzOi8vbGFja2UubW4vcmVkdWNlLXlvdXItYnVuZGxlLWpzLWZpbGUtc2l6ZS8+XG4vLyA8aHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9iYWJlbC1wbHVnaW4tbG9kYXNoL2lzc3Vlcy8yMjE+XG5jb25zdCBpc0Vycm9yID0gcmVxdWlyZSgnbG9kYXNoL2lzRXJyb3InKTtcbmNvbnN0IGlzT2JqZWN0ID0gcmVxdWlyZSgnbG9kYXNoL2lzT2JqZWN0Jyk7XG5jb25zdCBpc1N0cmluZyA9IHJlcXVpcmUoJ2xvZGFzaC9pc1N0cmluZycpO1xuY29uc3QgaW5jbHVkZXMgPSByZXF1aXJlKCdsb2Rhc2gvaW5jbHVkZXMnKTtcbmNvbnN0IG9taXQgPSByZXF1aXJlKCdsb2Rhc2gvb21pdCcpO1xuY29uc3QgaXNFbXB0eSA9IHJlcXVpcmUoJ2xvZGFzaC9pc0VtcHR5Jyk7XG5jb25zdCBpc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnbG9kYXNoL2lzUGxhaW5PYmplY3QnKTtcbmNvbnN0IGlzVW5kZWZpbmVkID0gcmVxdWlyZSgnbG9kYXNoL2lzVW5kZWZpbmVkJyk7XG5jb25zdCBpc051bGwgPSByZXF1aXJlKCdsb2Rhc2gvaXNOdWxsJyk7XG5cbi8vIGFkZCByZXRyeSBsb2dpYyB0byBzdXBlcmFnZW50XG5yZXF1aXJlKCdzdXBlcmFnZW50LXJldHJ5Jykoc3VwZXJhZ2VudCk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW5hc3NpZ25lZC1pbXBvcnRcbnJlcXVpcmUoJ2NvbnNvbGUtcG9seWZpbGwnKTtcblxuLy8gdGhlc2UgYXJlIGtub3duIGFzIFwicGxhY2Vob2xkZXIgdG9rZW5zXCIsIHNlZSB0aGlzIGxpbmsgZm9yIG1vcmUgaW5mbzpcbi8vIDxodHRwczovL25vZGVqcy5vcmcvYXBpL3V0aWwuaHRtbCN1dGlsX3V0aWxfZm9ybWF0X2Zvcm1hdF9hcmdzPlxuLy9cbi8vIHNpbmNlIHRoZXkgYXJlbid0IGV4cG9zZWQgKG9yIGRvbid0IHNlZW0gdG8gYmUpIGJ5IG5vZGUgKGF0IGxlYXN0IG5vdCB5ZXQpXG4vLyB3ZSBqdXN0IGRlZmluZSBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZW0gZm9yIG5vd1xuLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMTc2MDE+XG5jb25zdCB0b2tlbnMgPSBbJyVzJywgJyVkJywgJyVpJywgJyVmJywgJyVqJywgJyVvJywgJyVPJywgJyUlJ107XG5jb25zdCBsZXZlbHMgPSBbJ3RyYWNlJywgJ2RlYnVnJywgJ2luZm8nLCAnd2FybicsICdlcnJvcicsICdmYXRhbCddO1xuY29uc3QgZW5kcG9pbnQgPSAnaHR0cHM6Ly9hcGkuY2FiaW5qcy5jb20nO1xuXG5jbGFzcyBBeGUge1xuICBjb25zdHJ1Y3Rvcihjb25maWcgPSB7fSkge1xuICAgIHRoaXMuY29uZmlnID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHtcbiAgICAgICAga2V5OiAnJyxcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICB0aW1lb3V0OiA1MDAwLFxuICAgICAgICByZXRyeTogMyxcbiAgICAgICAgc2hvd1N0YWNrOiB0cnVlLFxuICAgICAgICBzaG93TWV0YTogZmFsc2UsXG4gICAgICAgIHNpbGVudDogZmFsc2UsXG4gICAgICAgIGxvZ2dlcjogY29uc29sZSxcbiAgICAgICAgbGV2ZWxzOiBbJ2luZm8nLCAnd2FybicsICdlcnJvcicsICdmYXRhbCddLFxuICAgICAgICBjYXB0dXJlOiB0cnVlXG4gICAgICB9LFxuICAgICAgY29uZmlnXG4gICAgKTtcblxuICAgIC8vIHdlIGNvdWxkIGhhdmUgdXNlZCBgYXV0by1iaW5kYCBidXQgaXQncyBub3QgY29tcGlsZWQgZm9yIGJyb3dzZXJcbiAgICB0aGlzLmxvZyA9IHRoaXMubG9nLmJpbmQodGhpcyk7XG5cbiAgICAvLyBiaW5kIGhlbHBlciBmdW5jdGlvbnMgZm9yIGVhY2ggbG9nIGxldmVsXG4gICAgbGV2ZWxzLmZvckVhY2gobGV2ZWwgPT4ge1xuICAgICAgdGhpc1tsZXZlbF0gPSAoLi4uYXJncykgPT5cbiAgICAgICAgdGhpcy5sb2coLi4uW2xldmVsXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmdzKSkpO1xuICAgIH0pO1xuXG4gICAgLy8gYWxpYXNlc1xuICAgIHRoaXMuZXJyID0gdGhpcy5lcnJvcjtcbiAgICB0aGlzLndhcm5pbmcgPSB0aGlzLndhcm47XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBsb2cobGV2ZWwsIG1lc3NhZ2UsIG1ldGEgPSB7fSwgLi4uYXJncykge1xuICAgIGNvbnN0IG9yaWdpbmFsQXJncyA9IFtsZXZlbCwgbWVzc2FnZSwgbWV0YSwgLi4uW10uc2xpY2UuY2FsbChhcmdzKV07XG4gICAgY29uc3QgeyBjb25maWcgfSA9IHRoaXM7XG4gICAgbGV0IG1vZGlmaWVyID0gMDtcblxuICAgIGlmIChsZXZlbCA9PT0gJ3dhcm5pbmcnKSBsZXZlbCA9ICd3YXJuJztcbiAgICBpZiAobGV2ZWwgPT09ICdlcnInKSBsZXZlbCA9ICdlcnJvcic7XG5cbiAgICBpZiAoaXNFcnJvcihsZXZlbCkpIHtcbiAgICAgIG1ldGEgPSBtZXNzYWdlO1xuICAgICAgbWVzc2FnZSA9IGxldmVsO1xuICAgICAgbGV2ZWwgPSAnZXJyb3InO1xuICAgIH0gZWxzZSBpZiAoIWlzU3RyaW5nKGxldmVsKSB8fCAhaW5jbHVkZXMobGV2ZWxzLCBsZXZlbCkpIHtcbiAgICAgIG1ldGEgPSBtZXNzYWdlO1xuICAgICAgbWVzc2FnZSA9IGxldmVsO1xuICAgICAgbGV2ZWwgPSAnaW5mbyc7XG4gICAgICBtb2RpZmllciA9IC0xO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIGFyZSBmb3VyIG9yIG1vcmUgYXJnc1xuICAgIC8vIHRoZW4gaW5mZXIgdG8gdXNlIHV0aWwuZm9ybWF0IG9uIGV2ZXJ5dGhpbmdcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0ICsgbW9kaWZpZXIpIHtcbiAgICAgIG1lc3NhZ2UgPSBmb3JtYXQoLi4ub3JpZ2luYWxBcmdzLnNsaWNlKDEgKyBtb2RpZmllcikpO1xuICAgICAgbWV0YSA9IHt9O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBhcmd1bWVudHMubGVuZ3RoID09PSAzICsgbW9kaWZpZXIgJiZcbiAgICAgIGlzU3RyaW5nKG1lc3NhZ2UpICYmXG4gICAgICB0b2tlbnMuc29tZSh0ID0+IGluY2x1ZGVzKG1lc3NhZ2UsIHQpKVxuICAgICkge1xuICAgICAgLy8gb3RoZXJ3aXNlIGlmIHRoZXJlIGFyZSB0aHJlZSBhcmdzIGFuZCBpZiB0aGUgYG1lc3NhZ2VgIGNvbnRhaW5zXG4gICAgICAvLyBhIHBsYWNlaG9sZGVyIHRva2VuIChlLmcuICclcycgb3IgJyVkJyAtIHNlZSBhYm92ZSBgdG9rZW5zYCB2YXJpYWJsZSlcbiAgICAgIC8vIHRoZW4gd2UgY2FuIGluZmVyIHRoYXQgdGhlIGBtZXRhYCBhcmcgcGFzc2VkIGlzIHVzZWQgZm9yIGZvcm1hdHRpbmdcbiAgICAgIG1lc3NhZ2UgPSBmb3JtYXQobWVzc2FnZSwgbWV0YSk7XG4gICAgICBtZXRhID0ge307XG4gICAgfSBlbHNlIGlmICghaXNFcnJvcihtZXNzYWdlKSkge1xuICAgICAgaWYgKGlzRXJyb3IobWV0YSkpIHtcbiAgICAgICAgbWV0YSA9IHsgZXJyOiBwYXJzZUVycihtZXRhKSB9O1xuICAgICAgfSBlbHNlIGlmICghaXNQbGFpbk9iamVjdChtZXRhKSAmJiAhaXNVbmRlZmluZWQobWV0YSkgJiYgIWlzTnVsbChtZXRhKSkge1xuICAgICAgICAvLyBpZiB0aGUgYG1ldGFgIHZhcmlhYmxlIHBhc3NlZCB3YXMgbm90IGFuIE9iamVjdCB0aGVuIGNvbnZlcnQgaXRcbiAgICAgICAgbWVzc2FnZSA9IGZvcm1hdChtZXNzYWdlLCBtZXRhKTtcbiAgICAgICAgbWV0YSA9IHt9O1xuICAgICAgfSBlbHNlIGlmICghaXNTdHJpbmcobWVzc2FnZSkpIHtcbiAgICAgICAgLy8gaWYgdGhlIG1lc3NhZ2UgaXMgbm90IGEgc3RyaW5nIHRoZW4gd2Ugc2hvdWxkIHJ1biBgdXRpbC5mb3JtYXRgIG9uIGl0XG4gICAgICAgIC8vIGFzc3VtaW5nIHdlJ3JlIGZvcm1hdHRpbmcgaXQgbGlrZSBpdCB3YXMgYW5vdGhlciBhcmd1bWVudFxuICAgICAgICAvLyAoYXMgb3Bwb3NlZCB0byB1c2luZyBzb21ldGhpbmcgbGlrZSBmYXN0LWpzb24tc3RyaW5naWZ5KVxuICAgICAgICBtZXNzYWdlID0gZm9ybWF0KG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNQbGFpbk9iamVjdChtZXRhKSkgbWV0YSA9IHt9O1xuXG4gICAgbGV0IGVycjtcbiAgICBpZiAoaXNFcnJvcihtZXNzYWdlKSkge1xuICAgICAgZXJyID0gbWVzc2FnZTtcbiAgICAgIGlmICghaXNPYmplY3QobWV0YS5lcnIpKSBtZXRhLmVyciA9IHBhcnNlRXJyKGVycik7XG4gICAgICAoeyBtZXNzYWdlIH0gPSBtZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgZGVmYXVsdCBsZXZlbCBvbiBtZXRhXG4gICAgbWV0YS5sZXZlbCA9IGxldmVsO1xuXG4gICAgLy8gc2V0IHRoZSBib2R5IHVzZWQgZm9yIHJldHVybmluZyB3aXRoIGFuZCBzZW5kaW5nIGxvZ3NcbiAgICAvLyAoYW5kIGFsc28gcmVtb3ZlIGNpcmN1bGFyIHJlZmVyZW5jZXMpXG4gICAgY29uc3QgYm9keSA9IHNhZmVTdHJpbmdpZnkoeyBtZXNzYWdlLCBtZXRhIH0pO1xuXG4gICAgLy8gc2VuZCB0byBDYWJpbiBvciBvdGhlciBsb2dnaW5nIHNlcnZpY2UgaGVyZSB0aGUgYG1lc3NhZ2VgIGFuZCBgbWV0YWBcbiAgICBpZiAoXG4gICAgICBjb25maWcuY2FwdHVyZSAmJlxuICAgICAgaW5jbHVkZXMoY29uZmlnLmxldmVscywgbGV2ZWwpICYmXG4gICAgICAoIWlzRXJyb3IoZXJyKSB8fCAhZXJyLl9jYXB0dXJlRmFpbGVkKVxuICAgICkge1xuICAgICAgLy8gaWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBrZXlcbiAgICAgIC8vIGFuZCB0aGV5IGFyZSB1c2luZyB0aGUgZGVmYXVsdCBlbmRwb2ludFxuICAgICAgLy8gdGhlbiB3ZSBzaG91bGQgdGhyb3cgYW4gZXJyb3IgdG8gdGhlbVxuICAgICAgaWYgKGNvbmZpZy5lbmRwb2ludCA9PT0gZW5kcG9pbnQgJiYgIWNvbmZpZy5rZXkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIlBsZWFzZSBwcm92aWRlIHlvdXIgQ2FiaW4gQVBJIGtleSBhcyBgbmV3IEF4ZSh7IGtleTogJ1lPVVItQ0FCSU4tQVBJLUtFWScgfSlgLlxcblZpc2l0IDxodHRwczovL2NhYmluanMuY29tPiB0byBzaWduIHVwIGZvciBmcmVlIVxcbkhpZGUgdGhpcyBtZXNzYWdlIHdpdGggYG5ldyBBeGUoeyBjYXB0dXJlOiBmYWxzZSB9KWAuXCJcbiAgICAgICAgKTtcblxuICAgICAgLy8gY2FwdHVyZSB0aGUgbG9nIG92ZXIgSFRUUFxuICAgICAgY29uc3QgcmVxID0gc3VwZXJhZ2VudC5wb3N0KGNvbmZpZy5lbmRwb2ludCkudGltZW91dChjb25maWcudGltZW91dCk7XG5cbiAgICAgIC8vIGJhc2ljIGF1dGggKGUuZy4gQ2FiaW4gQVBJIGtleSlcbiAgICAgIGlmIChjb25maWcua2V5KSByZXEuYXV0aChjb25maWcua2V5KTtcblxuICAgICAgLy8gc2V0IGhlYWRlcnMgaWYgYW55XG4gICAgICBpZiAoIWlzRW1wdHkoY29uZmlnLmhlYWRlcnMpKSByZXEuc2V0KGNvbmZpZy5oZWFkZXJzKTtcblxuICAgICAgcmVxXG4gICAgICAgIC5yZXRyeShjb25maWcucmV0cnkpXG4gICAgICAgIC5zZW5kKGJvZHkpXG4gICAgICAgIC5lbmQoZXJyID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBlcnIuX2NhcHR1cmVGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb25maWcubG9nZ2VyLmVycm9yKGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTdXBwcmVzcyBsb2dzIGlmIGl0IHdhcyBzaWxlbnRcbiAgICBpZiAoY29uZmlnLnNpbGVudCkgcmV0dXJuIGJvZHk7XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgbWV0YSBpbmZvcm1hdGlvbiB0aGVuIG91dHB1dCBpdFxuICAgIGNvbnN0IG9taXR0ZWQgPSBvbWl0KG1ldGEsIFsnbGV2ZWwnLCAnZXJyJ10pO1xuXG4gICAgLy8gZmF0YWwgc2hvdWxkIHVzZSBlcnJvciAoZS5nLiBpbiBicm93c2VyKVxuICAgIGlmIChsZXZlbCA9PT0gJ2ZhdGFsJykgbGV2ZWwgPSAnZXJyb3InO1xuXG4gICAgLy8gaWYgd2UgZGlkbid0IHBhc3MgYSBsZXZlbCBhcyBhIG1ldGhvZFxuICAgIC8vIChlLmcuIGNvbnNvbGUuaW5mbyksIHRoZW4gd2Ugc2hvdWxkIHN0aWxsXG4gICAgLy8gdXNlIHRoZSBsb2dnZXIncyBgbG9nYCBtZXRob2QgdG8gb3V0cHV0XG4gICAgaWYgKG1vZGlmaWVyID09PSAtMSkgbGV2ZWwgPSAnbG9nJztcblxuICAgIC8vIHNob3cgc3RhY2sgdHJhY2UgaWYgbmVjZXNzYXJ5IChhbG9uZyB3aXRoIGFueSBtZXRhZGF0YSlcbiAgICBpZiAobGV2ZWwgPT09ICdlcnJvcicgJiYgaXNFcnJvcihlcnIpICYmIGNvbmZpZy5zaG93U3RhY2spIHtcbiAgICAgIGlmICghY29uZmlnLnNob3dNZXRhIHx8IGlzRW1wdHkob21pdHRlZCkpIHRoaXMuY29uZmlnLmxvZ2dlci5lcnJvcihlcnIpO1xuICAgICAgZWxzZSB0aGlzLmNvbmZpZy5sb2dnZXIuZXJyb3IoZXJyLCBvbWl0dGVkKTtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuc2hvd01ldGEgfHwgaXNFbXB0eShvbWl0dGVkKSkge1xuICAgICAgdGhpcy5jb25maWcubG9nZ2VyW2xldmVsXShtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWcubG9nZ2VyW2xldmVsXShtZXNzYWdlLCBvbWl0dGVkKTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gdGhlIHBhcnNlZCBib2R5IGluIGNhc2Ugd2UgbmVlZCBpdFxuICAgIHJldHVybiBib2R5O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQXhlO1xuIl19 |
223
package.json
{ | ||
"name": "axe", | ||
"version": "0.3.7", | ||
"description": "Create AWS infrastructure with Javascript", | ||
"author": "Jason Maurer", | ||
"license": "MIT", | ||
"homepage": "https://github.com/jsonmaur/axe#readme", | ||
"repository": { | ||
"type": "git", | ||
"url": "git+https://github.com/jsonmaur/axe.git" | ||
"description": "Logging add-on to send logs over HTTP to your server in Node and Browser environments. Works with any logger! Chop up your logs consistently! Made for Cabin and Lad.", | ||
"version": "1.0.0", | ||
"author": "Nick Baugh <niftylettuce@gmail.com> (http://niftylettuce.com)", | ||
"ava": { | ||
"serial": true | ||
}, | ||
"bugs": { | ||
"url": "https://github.com/cabinjs/axe/issues" | ||
}, | ||
"contributors": [ | ||
"Nick Baugh <niftylettuce@gmail.com> (http://niftylettuce.com)", | ||
"Alexis Tyler <xo@wvvw.me> (https://wvvw.me/)" | ||
], | ||
"dependencies": { | ||
"console-polyfill": "^0.3.0", | ||
"fast-safe-stringify": "^2.0.4", | ||
"format-util": "^1.0.3", | ||
"lodash": "^4.17.10", | ||
"parse-err": "^0.0.2", | ||
"superagent": "^3.8.3", | ||
"superagent-retry": "^0.6.0" | ||
}, | ||
"devDependencies": { | ||
"@babel/cli": "^7.0.0-beta.51", | ||
"@babel/core": "^7.0.0-beta.51", | ||
"@babel/preset-env": "^7.0.0-beta.51", | ||
"ava": "^1.0.0-beta.6", | ||
"babelify": "^9.0.0", | ||
"browserify": "^16.2.2", | ||
"caniuse-lite": "^1.0.30000856", | ||
"codecov": "^3.0.2", | ||
"cross-env": "^5.2.0", | ||
"eslint": "^5.0.0", | ||
"eslint-config-prettier": "^2.9.0", | ||
"eslint-plugin-compat": "^2.4.0", | ||
"eslint-plugin-prettier": "^2.6.0", | ||
"express": "^4.16.3", | ||
"husky": "^0.14.3", | ||
"jsdom": "^11.11.0", | ||
"koa": "^2.5.1", | ||
"lint-staged": "^7.2.0", | ||
"nyc": "^12.0.2", | ||
"prettier": "^1.13.5", | ||
"remark-cli": "^5.0.0", | ||
"remark-preset-github": "^0.0.8", | ||
"rimraf": "^2.6.2", | ||
"sinon": "^6.0.0", | ||
"tinyify": "^2.4.3", | ||
"xo": "^0.21.1" | ||
}, | ||
"engines": { | ||
"node": ">=4" | ||
"node": ">=6.4" | ||
}, | ||
"files": [ | ||
"lib", | ||
"dist" | ||
], | ||
"homepage": "https://github.com/cabinjs/axe", | ||
"keywords": [ | ||
"airbrake", | ||
"analytic", | ||
"analytics", | ||
"api", | ||
"axe", | ||
"aws", | ||
"amazon web services", | ||
"hosting", | ||
"cloudformation", | ||
"stack", | ||
"infra", | ||
"infrastructure", | ||
"devops", | ||
"server" | ||
"bugsnag", | ||
"bunyan", | ||
"cabin", | ||
"cabinjs", | ||
"chalk", | ||
"color", | ||
"colored", | ||
"connect", | ||
"console", | ||
"express", | ||
"hackable", | ||
"hapi", | ||
"koa", | ||
"lad", | ||
"ladjs", | ||
"lass", | ||
"log", | ||
"logger", | ||
"logging", | ||
"loggly", | ||
"middleware", | ||
"official", | ||
"raven", | ||
"sentry", | ||
"signale", | ||
"timber", | ||
"transport", | ||
"winston", | ||
"wrapper" | ||
], | ||
"files": [ | ||
"bin/", | ||
"lib/", | ||
"license", | ||
"readme.md" | ||
], | ||
"license": "MIT", | ||
"lint-staged": { | ||
"*.{js,jsx,mjs,ts,tsx,css,less,scss,json,graphql}": [ | ||
"prettier --write --single-quote --trailing-comma none", | ||
"git add" | ||
], | ||
"*.md": [ | ||
"remark . -qfo", | ||
"git add" | ||
] | ||
}, | ||
"main": "lib/index.js", | ||
"bin": { | ||
"axe": "bin/axe" | ||
"remarkConfig": { | ||
"plugins": [ | ||
"preset-github" | ||
] | ||
}, | ||
"repository": { | ||
"type": "git", | ||
"url": "https://github.com/cabinjs/axe" | ||
}, | ||
"scripts": { | ||
"test:lint": "standard --verbose | snazzy", | ||
"test:unit": "mocha 'src/**/*.test.js' -R dot -r babel-register -r babel-polyfill", | ||
"test": "npm-run-all test:*", | ||
"prebuild": "rm -rf lib", | ||
"build": "babel src -d lib --no-comments --ignore '*.test.js'", | ||
"watch": "npm run build -- -w", | ||
"prepublish": "npm run build" | ||
"ava": "cross-env NODE_ENV=test ava", | ||
"browserify": "browserify src/index.js -o dist/axe.js -s Axe -d -t babelify", | ||
"build": "npm run build:clean && npm run build:lib && npm run build:dist", | ||
"build:clean": "rimraf lib dist", | ||
"build:dist": "npm run browserify && npm run minify", | ||
"build:lib": "babel src --out-dir lib", | ||
"coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov", | ||
"lint": "xo && remark . -qfo && eslint lib && eslint dist", | ||
"minify": "cross-env NODE_ENV=production browserify src/index.js -o dist/axe.min.js -s Axe -d -t babelify -p tinyify", | ||
"nyc": "cross-env NODE_ENV=test nyc ava", | ||
"precommit": "lint-staged && npm test", | ||
"test": "npm run build && npm run lint && npm run ava", | ||
"test-coverage": "npm run build && npm run lint && npm run nyc" | ||
}, | ||
"dependencies": { | ||
"aws-sdk": "2.6.12", | ||
"chalk": "1.1.3", | ||
"crypto-extra": "0.4.0", | ||
"deep-assign": "2.0.0", | ||
"minimist": "1.2.0", | ||
"object-path": "0.11.2" | ||
}, | ||
"devDependencies": { | ||
"babel-cli": "6.18.0", | ||
"babel-plugin-transform-object-rest-spread": "6.16.0", | ||
"babel-polyfill": "6.16.0", | ||
"babel-preset-latest": "6.16.0", | ||
"babel-register": "6.18.0", | ||
"chai": "3.5.0", | ||
"mocha": "3.1.2", | ||
"npm-run-all": "3.1.1", | ||
"pre-commit": "1.1.3", | ||
"proxyquire": "1.7.10", | ||
"sinon": "1.17.6", | ||
"snazzy": "5.0.0", | ||
"standard": "8.5.0" | ||
}, | ||
"standard": { | ||
"globals": [ | ||
"describe", | ||
"it" | ||
] | ||
}, | ||
"babel": { | ||
"presets": [ | ||
"latest" | ||
"unpkg": "dist/axe.min.js", | ||
"xo": { | ||
"extends": "prettier", | ||
"plugins": [ | ||
"prettier" | ||
], | ||
"plugins": [ | ||
"transform-object-rest-spread" | ||
"parserOptions": { | ||
"sourceType": "script" | ||
}, | ||
"rules": { | ||
"prettier/prettier": [ | ||
"error", | ||
{ | ||
"singleQuote": true, | ||
"bracketSpacing": true, | ||
"trailingComma": "none" | ||
} | ||
], | ||
"max-len": [ | ||
"error", | ||
{ | ||
"code": 80, | ||
"ignoreUrls": true | ||
} | ||
], | ||
"capitalized-comments": "off", | ||
"camelcase": "off", | ||
"no-warning-comments": "off" | ||
}, | ||
"space": true, | ||
"ignore": [ | ||
"config.js" | ||
] | ||
}, | ||
"precommit": [ | ||
"test:lint" | ||
] | ||
} | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
No bug tracker
MaintenancePackage does not have a linked bug tracker in package.json.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
No website
QualityPackage does not have a website.
Found 1 instance in 1 package
1006723
7585
0
0
287
2
7
26
6
3
+ Addedconsole-polyfill@^0.3.0
+ Addedfast-safe-stringify@^2.0.4
+ Addedformat-util@^1.0.3
+ Addedlodash@^4.17.10
+ Addedparse-err@^0.0.2
+ Addedsuperagent@^3.8.3
+ Addedsuperagent-retry@^0.6.0
+ Addedasynckit@0.4.0(transitive)
+ Addedcall-bind@1.0.7(transitive)
+ Addedcombined-stream@1.0.8(transitive)
+ Addedcomponent-emitter@1.3.1(transitive)
+ Addedconsole-polyfill@0.3.0(transitive)
+ Addedcookiejar@2.1.4(transitive)
+ Addedcore-util-is@1.0.3(transitive)
+ Addeddebug@3.2.7(transitive)
+ Addeddefine-data-property@1.1.4(transitive)
+ Addeddelayed-stream@1.0.0(transitive)
+ Addedes-define-property@1.0.0(transitive)
+ Addedes-errors@1.3.0(transitive)
+ Addedextend@3.0.2(transitive)
+ Addedfast-safe-stringify@2.1.1(transitive)
+ Addedform-data@2.5.1(transitive)
+ Addedformat-util@1.0.5(transitive)
+ Addedformidable@1.2.6(transitive)
+ Addedfunction-bind@1.1.2(transitive)
+ Addedget-intrinsic@1.2.4(transitive)
+ Addedgopd@1.0.1(transitive)
+ Addedhas-property-descriptors@1.0.2(transitive)
+ Addedhas-proto@1.0.3(transitive)
+ Addedhas-symbols@1.0.3(transitive)
+ Addedhasown@2.0.2(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedlodash@4.17.21(transitive)
+ Addedmethods@1.1.2(transitive)
+ Addedmime@1.6.0(transitive)
+ Addedmime-db@1.52.0(transitive)
+ Addedmime-types@2.1.35(transitive)
+ Addedms@2.1.3(transitive)
+ Addedobject-inspect@1.13.2(transitive)
+ Addedparse-err@0.0.2(transitive)
+ Addedprocess-nextick-args@2.0.1(transitive)
+ Addedqs@6.13.0(transitive)
+ Addedreadable-stream@2.3.8(transitive)
+ Addedsafe-buffer@5.1.2(transitive)
+ Addedset-function-length@1.2.2(transitive)
+ Addedside-channel@1.0.6(transitive)
+ Addedstring_decoder@1.1.1(transitive)
+ Addedsuperagent@3.8.3(transitive)
+ Addedsuperagent-retry@0.6.0(transitive)
+ Addedutil-deprecate@1.0.2(transitive)
- Removedaws-sdk@2.6.12
- Removedchalk@1.1.3
- Removedcrypto-extra@0.4.0
- Removeddeep-assign@2.0.0
- Removedminimist@1.2.0
- Removedobject-path@0.11.2
- Removedansi-regex@2.1.1(transitive)
- Removedansi-styles@2.2.1(transitive)
- Removedaws-sdk@2.6.12(transitive)
- Removedbase64-js@1.5.1(transitive)
- Removedbuffer@4.9.1(transitive)
- Removedchalk@1.1.3(transitive)
- Removedcrypto-browserify@1.0.9(transitive)
- Removedcrypto-extra@0.4.0(transitive)
- Removeddeep-assign@2.0.0(transitive)
- Removedescape-string-regexp@1.0.5(transitive)
- Removedhas-ansi@2.0.0(transitive)
- Removedieee754@1.2.1(transitive)
- Removedis-obj@1.0.1(transitive)
- Removedjmespath@0.15.0(transitive)
- Removedlodash@3.5.0(transitive)
- Removedminimist@1.2.0(transitive)
- Removedobject-path@0.11.2(transitive)
- Removedpunycode@1.3.2(transitive)
- Removedquerystring@0.2.0(transitive)
- Removedsax@1.1.5(transitive)
- Removedstrip-ansi@3.0.1(transitive)
- Removedsupports-color@2.0.0(transitive)
- Removedurl@0.10.3(transitive)
- Removedxml2js@0.4.15(transitive)
- Removedxmlbuilder@2.6.2(transitive)