diff --git a/.gitignore b/.gitignore index 0ac4886..bac1410 100644 --- a/.gitignore +++ b/.gitignore @@ -59,4 +59,8 @@ typings/ # next.js build output .next -.vscode +.vscode/* +!.vscode/settings.json + +# compiled javascript +dist diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9f2b0ac --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "[javascript]": { + "editor.formatOnSave": false + }, + "standard.autoFixOnSave": true +} diff --git a/dist/babel.js b/dist/babel.js deleted file mode 100644 index 7a397a1..0000000 --- a/dist/babel.js +++ /dev/null @@ -1,578 +0,0 @@ -"use strict"; - -var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - -var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); - -var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); - -var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); - -var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); - -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - -var template = require('@babel/template'); - -var types = require('@babel/types'); - -var numberOfContracts = 0; -var contractName = ''; -var metadata = {}; -var extendData = {}; - -function isMethod(node) { - if (!node) return false; - var type = node.type; - - if (type === 'ClassMethod' || type === 'ClassPrivateMethod') { - return true; - } - - var valueType = node.value && node.value.type; - return valueType === 'FunctionExpression' || valueType === 'ArrowFunctionExpression'; -} - -var SUPPORTED_TYPES = ['number', 'string', 'boolean', 'bigint', 'null', 'undefined', 'function', 'array', 'map', 'set', 'date', 'regexp', 'promise', 'address']; - -function concatUnique(a, b) { - if (!Array.isArray(a)) { - a = [a]; - } - - if (!Array.isArray(b)) { - b = [b]; - } - - var result = a.concat(b.filter(function (i) { - return !a.includes(i); - })); - - for (var i = 0; i < result.length; i++) { - if (!SUPPORTED_TYPES.includes(result[i])) { - return 'any'; - } - } - - if (result.length === 1) { - return result[0]; - } - - return result; -} - -function getTypeName(node, insideUnion) { - if (!node) return 'any'; - var ta = insideUnion ? node : node.typeAnnotation; - var tn = ta.type; - if (!tn) return 'any'; - var result; - - if (tn === 'Identifier') { - result = ta.name; - } else if (!tn.endsWith('TypeAnnotation')) { - result = tn; - } else { - result = tn.slice(0, tn.length - 14); - } - - result = result.toLowerCase(); // sanitize result - - if (result === 'void') { - result = 'undefined'; - } else if (result === 'nullliteral') { - result = 'null'; - } else if (result === 'generic') { - var t = ta.id.name.toLowerCase(); - result = SUPPORTED_TYPES.includes(t) ? t : 'any'; - } else if (result === 'nullable') { - result = concatUnique(['undefined', 'null'], getTypeName(ta)); - } else if (result === 'union') { - result = []; - ta.types.forEach(function (ut) { - result = concatUnique(result, getTypeName(ut, true)); - }); - } else if (!SUPPORTED_TYPES.includes(result)) { - result = 'any'; - } - - return result !== 'any' && Array.isArray(result) ? result : [result]; -} - -function getTypeParams(params) { - return params.map(function (p) { - var item = p.left || p; - var param = { - name: item.name, - type: getTypeName(item.typeAnnotation) - }; - - if (p.right) { - if (types.isNullLiteral(p.right)) { - param.defaultValue = null; - } else if (types.isLiteral(p.right)) { - param.defaultValue = p.right.value; - } - } - - return param; - }); -} - -var METHOD_DECORATORS = ['transaction', 'view', 'pure', 'payable', 'internal', 'onreceive']; -var PROPERTY_DECORATORS = ['state', 'pure', 'internal', 'view']; - -module.exports = function (_ref) { - var t = _ref.types; - return { - visitor: { - ClassDeclaration: function ClassDeclaration(path) { - new IceTea(t).classDeclaration(path); - }, - Program: { - exit: function exit(path) { - new IceTea(t).exit(path.node); - } - } - } - }; -}; - -var IceTea = -/*#__PURE__*/ -function () { - function IceTea(types) { - (0, _classCallCheck2["default"])(this, IceTea); - this.types = types; - this.__on_deployed = 0; - this.className = ''; - this.metadata = {}; - this.klass = undefined; - } - - (0, _createClass2["default"])(IceTea, [{ - key: "classDeclaration", - value: function classDeclaration(path) { - var _this = this; - - var klass = path.node; - this.className = klass.id.name; - this.klass = klass; - - if (!metadata[this.className]) { - metadata[this.className] = {}; - } - - this.metadata = metadata[this.className]; - - if (klass.superClass) { - extendData[this.className] = klass.superClass.name; - } - - var contracts = this.findDecorators(klass, 'contract'); - numberOfContracts += contracts.length; - var ctor = this.findConstructor(klass); - - if (ctor) { - ctor.kind = 'method'; - ctor.key.name = '__on_deployed'; - this.replaceSuper(ctor); - } - - if (contracts.length > 0) { - contractName = klass.id.name; - this.deleteDecorators(klass, contracts); - } - - path.get('body.body').map(function (body) { - if (['ClassProperty', 'ClassPrivateProperty'].includes(body.node.type)) { - _this.classProperty(body); - } else if (['ClassMethod', 'ClassPrivateMethod'].includes(body.node.type)) { - _this.classMethod(body.node); - } - }); - } - }, { - key: "classProperty", - value: function classProperty(path) { - var node = path.node; - var decorators = node.decorators || []; - - if (!decorators.every(function (decorator) { - return PROPERTY_DECORATORS.includes(decorator.expression.name); - })) { - var allowDecorators = PROPERTY_DECORATORS.map(function (method) { - return "@".concat(method); - }); - throw this.buildError("Only ".concat(allowDecorators.join(', '), " are valid for a class field."), node); - } - - var states = this.findDecorators(node, 'state'); - var internals = this.findDecorators(node, 'internal'); - var name = node.key.name || '#' + node.key.id.name; // private property does not have key.name - - if (internals.length > 0) { - if (name.startsWith('#')) { - throw this.buildError('Private field cannot be @internal.', node); - } - - if (decorators.some(function (decorator) { - return ['transaction', 'view', 'pure', 'onreceive'].includes(decorator.expression.name); - })) { - throw this.buildError('A @transaction, @view, @pure or @onreceive field cannot be @internal.', node); - } - } - - if (states.length && node.value && !this.isConstant(node.value) && !isMethod(node)) { - var klassPath = path.parentPath.parentPath; - var onDeploy = this.findMethod(klassPath.node, '__on_deployed'); - - if (!onDeploy) { - var _klassPath$node$body$; - - // class noname is only used for valid syntax - var _fn = template.smart("\n class noname {\n __on_deployed () {}\n }\n "); - - (_klassPath$node$body$ = klassPath.node.body.body).unshift.apply(_klassPath$node$body$, (0, _toConsumableArray2["default"])(_fn().body.body)); - - onDeploy = klassPath.node.body.body[0]; - this.metadata['__on_deployed'] = { - type: 'ClassMethod', - decorators: ['payable'] - }; - } - - var fn = template.smart("\n this.NAME = DEFAULT\n "); - onDeploy.body.body.unshift(fn({ - NAME: name, - DEFAULT: node.value - })); // initialization is already added to constructor - // if (states.length === 0) { - // path.remove() - // } - } - - if (states.length > 0) { - if (isMethod(node)) { - throw this.buildError('Function cannot be marked as @state.', node); - } - - var indents = this.findMethodDefinition(this.klass, name); - - if (indents.length > 0) { - throw this.buildError("".concat(name, " is already marked @state and cannot have getter or setter."), node); - } - - var pures = this.findDecorators(node, 'pure'); - - if (pures.length > 0) { - throw this.buildError("".concat(name, " cannot be marked with both @state and @pure."), node); - } - - this.wrapState(path); - - if (!this.metadata[name]) { - var decoratorNames = decorators.map(function (decorator) { - return decorator.expression.name; - }); - - if (decoratorNames.length === 1 && decoratorNames[0] === 'state') { - decoratorNames.push('internal'); - } - - this.metadata[name] = { - type: node.type, - decorators: decoratorNames, - fieldType: getTypeName(node.typeAnnotation) - }; - } - - return; - } - - if (!this.metadata[name]) { - this.metadata[name] = { - type: node.type, - decorators: decorators.map(function (decorator) { - return decorator.expression.name; - }) - }; - - if (!isMethod(node)) { - this.metadata[name]['fieldType'] = getTypeName(node.typeAnnotation); - - if (decorators.length === 0) { - if (name.startsWith('#')) { - // private property - this.metadata[name]['decorators'].push('pure'); - } else { - this.metadata[name]['decorators'].push('internal'); - } - } - } else { - this.metadata[name]['returnType'] = getTypeName(node.value.returnType); - this.metadata[name]['params'] = getTypeParams(node.value.params); - - if (decorators.length === 0) { - if (name.startsWith('#')) { - // private function - this.metadata[name]['decorators'].push('view'); - } else { - this.metadata[name]['decorators'].push('internal'); - } - } - } - } // delete propery decorator - - - this.deleteDecorators(node, this.findDecorators.apply(this, [node].concat(PROPERTY_DECORATORS))); - } - }, { - key: "classMethod", - value: function classMethod(klass) { - var decorators = klass.decorators || []; - - if (!decorators.every(function (decorator) { - return METHOD_DECORATORS.includes(decorator.expression.name); - })) { - var allowDecorators = METHOD_DECORATORS.map(function (method) { - return "@".concat(method); - }); - throw this.buildError("Only ".concat(allowDecorators.join(', '), " is allowed by method"), klass); - } - - var name = klass.key.name || '#' + klass.key.id.name; - - if (name === '__on_received') { - throw this.buildError('__on_received cannot be specified directly.', klass); - } - - if (name === '__on_deployed') { - if (this.__on_deployed > 0) { - throw this.buildError('__on_deployed cannot be specified directly.', klass); - } - - this.__on_deployed += 1; - } - - if (name.startsWith('#')) { - var payables = this.findDecorators(klass, 'payable'); - - if (payables.length > 0) { - throw this.buildError('Private function cannot be @payable.', klass); - } - - var internals = this.findDecorators(klass, 'internal'); - - if (internals.length > 0) { - throw this.buildError('Private function cannot be @internal.', klass); - } - } - - if (!this.metadata[name]) { - this.metadata[name] = { - type: klass.type, - decorators: decorators.map(function (decorator) { - return decorator.expression.name; - }), - returnType: getTypeName(klass.returnType), - params: getTypeParams(klass.params) - }; - - if (decorators.length === 0) { - if (name.startsWith('#') || name === '__on_deployed') { - // private method - this.metadata[name].decorators.push('view'); - } else { - this.metadata[name].decorators.push('internal'); - } - } - } - - var onreceives = this.findDecorators(klass, 'onreceive'); - - if (onreceives.length > 0) { - var _payables = this.findDecorators(klass, 'payable'); - - if (_payables.length === 0 && klass.body.body.length > 0) { - throw this.buildError('Non-payable @onreceive function should have empty body.', klass); - } - - if (this.metadata['__on_received']) { - throw this.buildError('Only one @onreceive is allowed per class.', klass); - } - - this.metadata['__on_received'] = klass.key.name; - } - - this.deleteDecorators(klass, this.findDecorators.apply(this, [klass].concat(METHOD_DECORATORS))); - } - }, { - key: "exit", - value: function exit(node) { - if (numberOfContracts === 0) { - throw this.buildError('Your smart contract does not have a @contract class.', node); - } - - if (numberOfContracts > 1) { - throw this.buildError('Your smart contract has more than one @contract classes.', node); - } - - var name = contractName; - var parent = extendData[name]; - - while (parent) { - metadata[contractName] = _objectSpread({}, metadata[parent], {}, metadata[contractName]); - name = parent; - parent = extendData[name]; - } - - this.appendNewCommand(node); - this.appendMetadata(node); - this.reset(); - } - }, { - key: "reset", - value: function reset() { - numberOfContracts = 0; - contractName = ''; - metadata = {}; - extendData = {}; - } - }, { - key: "replaceSuper", - value: function replaceSuper(ctor) { - ctor.body.body = ctor.body.body.map(function (body) { - if (!body.expression || body.expression.type !== 'CallExpression') { - return body; - } - - if (body.expression.callee.type === 'Super') { - var superTemplate = template.smart("\n super.__on_deployed(ARGUMENTS)\n "); - body = superTemplate({ - ARGUMENTS: body.expression.arguments - }); - } - - return body; - }); - } - }, { - key: "wrapState", - value: function wrapState(path) { - var node = path.node; - var name = node.key.name || '#' + node.key.id.name; - var wrap = template.smart("\n class noname {\n get NAME() {\n return __proxyState$Get(\"NAME\", DEFAULT);\n }\n set NAME(value) {\n this.setState(\"NAME\", __proxyState$Unwrap(value));\n }\n }\n "); - path.replaceWithMultiple(wrap({ - NAME: name, - DEFAULT: node.value - }).body.body); - } - }, { - key: "appendNewCommand", - value: function appendNewCommand(node) { - var append = template.smart("\n const __contract = new NAME();\n "); - node.body.push(append({ - NAME: contractName - })); - } - }, { - key: "appendMetadata", - value: function appendMetadata(node) { - var meta = template.smart("\n const __metadata = META\n "); - node.body.push(meta({ - META: this.types.valueToNode(metadata[contractName]) - })); - } - }, { - key: "findConstructor", - value: function findConstructor(klass) { - return klass.body.body.filter(function (body) { - return body.kind === 'constructor'; - })[0]; - } - }, { - key: "findMethodDefinition", - value: function findMethodDefinition(klass, name) { - return klass.body.body.filter(function (body) { - return ['MethodDefinition', 'ClassMethod'].includes(body.type) && body.key.name === name && ['get', 'set'].includes(body.kind); - }); - } - }, { - key: "findMethod", - value: function findMethod(klass) { - for (var _len = arguments.length, names = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - names[_key - 1] = arguments[_key]; - } - - return klass.body.body.filter(function (body) { - return body.type === 'ClassMethod' && names.includes(body.key.name); - })[0]; - } - }, { - key: "buildError", - value: function buildError(message, nodePath) { - this.reset(); - - if (nodePath && nodePath.buildCodeFrameError) { - return nodePath.buildCodeFrameError(message); - } - - return new SyntaxError(message); - } - }, { - key: "findDecorators", - value: function findDecorators(klass) { - for (var _len2 = arguments.length, names = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - names[_key2 - 1] = arguments[_key2]; - } - - return (klass.decorators || []).filter(function (decorator) { - return names.includes(decorator.expression.name); - }); - } - }, { - key: "deleteDecorators", - value: function deleteDecorators(klass, decorators) { - decorators.forEach(function (decorator) { - var index = klass.decorators.indexOf(decorator); - - if (index >= 0) { - klass.decorators.splice(index, 1); - } - }); - } - }, { - key: "isConstant", - value: function isConstant(value) { - var _this2 = this; - - var types = this.types; - - if (types.isLiteral(value) && value.type !== 'TemplateLiteral') { - return true; - } - - if (value.type === 'ArrayExpression') { - return value.elements && value.elements.every(function (element) { - return _this2.isConstant(element); - }); - } - - if (value.type === 'BinaryExpression') { - return value.left && value.right && this.isConstant(value.left) && this.isConstant(value.right); - } - - if (value.type === 'ObjectExpression') { - return value.properties && value.properties.every(function (property) { - return property.key.type !== 'TemplateLiteral' && _this2.isConstant(property.value); - }); - } - - return false; - } - }]); - return IceTea; -}(); \ No newline at end of file diff --git a/dist/common.js b/dist/common.js deleted file mode 100644 index 92804cd..0000000 --- a/dist/common.js +++ /dev/null @@ -1,49 +0,0 @@ -"use strict"; - -var validate = require('validate-npm-package-name'); - -exports.plugins = ['decorators-legacy', 'classProperties', 'flow', 'flowComments', 'asyncGenerators', 'bigInt', 'classPrivateMethods', 'classPrivateProperties', 'classProperties', 'doExpressions', 'flow', 'flowComments', 'functionBind', 'functionSent', 'jsx', 'logicalAssignment', 'nullishCoalescingOperator', 'numericSeparator', 'objectRestSpread', 'optionalCatchBinding', 'optionalChaining', ['pipelineOperator', { - proposal: 'minimal' -}], 'throwExpressions']; - -exports.isHttp = function (value) { - return value.startsWith('http://') || value.startsWith('https://'); -}; - -exports.isNodeModule = function (value) { - var _validate = validate(value), - validForNewPackages = _validate.validForNewPackages, - validForOldPackages = _validate.validForOldPackages; - - return validForNewPackages || validForOldPackages; -}; - -var whiteListModules = ['lodash', 'moment', 'big.js', '@hapi/joi', 'validator', 'ajv', 'cheerio', '@iceteachain/utils', ';', 'assert', 'buffer', 'crypto', 'querystring', 'stream', 'string_decoder', 'url', 'util', 'create-hash']; - -exports.isWhitelistModule = function (value) { - return whiteListModules.some(function (element) { - return value === element || value.startsWith("".concat(element, "/")); - }); -}; - -exports.getWhiteListModules = function () { - return whiteListModules; -}; - -exports.setWhiteListModules = function (modules) { - whiteListModules = modules; -}; - -exports.addWhiteListModule = function (module) { - if (whiteListModules.includes(module)) { - return; - } - - whiteListModules.push(module); -}; - -exports.removeWhiteListModule = function (module) { - whiteListModules = whiteListModules.filter(function (whitelist) { - return whitelist !== module; - }); -}; \ No newline at end of file diff --git a/dist/external.js b/dist/external.js deleted file mode 100644 index 7d064fc..0000000 --- a/dist/external.js +++ /dev/null @@ -1,82 +0,0 @@ -"use strict"; - -var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - -var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); - -var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); - -var template = require('@babel/template'); - -var _require = require('./common'), - isWhitelistModule = _require.isWhitelistModule; - -var Icetea = -/*#__PURE__*/ -function () { - function Icetea(types, data) { - (0, _classCallCheck2["default"])(this, Icetea); - this.types = types; - this.data = data; - } - - (0, _createClass2["default"])(Icetea, [{ - key: "run", - value: function run(path) { - var node = path.node; - - if (!node || node.callee.name !== 'require') { - return; - } - - var arguments_ = node.arguments; - - if (!arguments_.length || arguments_[0].type !== 'StringLiteral') { - return; - } - - var value = arguments_[0].value; - var code = this.data[value]; - - if (!code) { - if (!isWhitelistModule(value)) { - throw this.buildError('External source not found for non-whitelist moduel: ' + value, node); - } - - return; - } - - if (value.endsWith('.json')) { - path.replaceWith(this.types.valueToNode(code)); - } else { - var fn = template.expression("(function () {\n const module={exports:{}}\n const exports=module.exports;\n CODE\n ;return module.exports\n })()"); - path.replaceWith(fn({ - CODE: code - })); - } - } - }, { - key: "buildError", - value: function buildError(message, nodePath) { - if (nodePath && nodePath.buildCodeFrameError) { - throw nodePath.buildCodeFrameError(message); - } - - throw new SyntaxError(message); - } - }]); - return Icetea; -}(); - -module.exports = function (data) { - return function (babel) { - var t = babel.types; - return { - visitor: { - CallExpression: function CallExpression(path) { - new Icetea(t, data).run(path); - } - } - }; - }; -}; \ No newline at end of file diff --git a/dist/import2require.js b/dist/import2require.js deleted file mode 100644 index cfd3b7b..0000000 --- a/dist/import2require.js +++ /dev/null @@ -1,91 +0,0 @@ -"use strict"; - -var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - -var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); - -var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); - -var template = require('@babel/template'); - -var IceTea = -/*#__PURE__*/ -function () { - function IceTea(types) { - (0, _classCallCheck2["default"])(this, IceTea); - this.types = types; - } - - (0, _createClass2["default"])(IceTea, [{ - key: "run", - value: function run(klass) { - var node = klass.node; - var source = "require('".concat(node.source.value, "')"); - var specifiers = node.specifiers; - var lefts = []; - var hasDefault = false; - var require1 = template.smart("\n const LOCAL = SOURCE\n "); - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = specifiers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var specifier = _step.value; - - if (specifier.type === 'ImportNamespaceSpecifier' || specifier.type === 'ImportDefaultSpecifier') { - klass.replaceWith(require1({ - LOCAL: specifier.local.name, - SOURCE: source - })); - source = specifier.local.name; - hasDefault = true; - } - - if (specifier.type === 'ImportSpecifier') { - lefts.push([specifier.local.name, specifier.imported.name]); - } - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator["return"] != null) { - _iterator["return"](); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - if (lefts.length > 0) { - var tmp = '{' + lefts.map(function (left) { - return "".concat(left[1], ": ").concat(left[0]); - }).join(', ') + '}'; - var require2 = template.smart("\n const ".concat(tmp, " = SOURCE\n ")); - klass.insertAfter(require2({ - SOURCE: source - })); - } - - if (!hasDefault) { - klass.remove(); - } - } - }]); - return IceTea; -}(); - -module.exports = function (babel) { - var t = babel.types; - return { - visitor: { - ImportDeclaration: function ImportDeclaration(node) { - new IceTea(t).run(node); - } - } - }; -}; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index abcb0e1..0000000 --- a/dist/index.js +++ /dev/null @@ -1,158 +0,0 @@ -"use strict"; - -var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - -var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); - -var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); - -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - -var prettier = require('prettier/standalone'); - -var plugins = [require('prettier/parser-babylon')]; - -var Terser = require('terser'); - -var flowPlugin = require('@babel/plugin-transform-flow-strip-types'); - -var plugin = require('./babel'); - -var makeWrapper = require('./wrapper'); - -var _require = require('./transform'), - transform = _require.transform, - babelify = _require.babelify; - -var _require2 = require('./common'), - getWhiteListModules = _require2.getWhiteListModules, - setWhiteListModules = _require2.setWhiteListModules, - addWhiteListModule = _require2.addWhiteListModule, - removeWhiteListModule = _require2.removeWhiteListModule; - -var transpile = function transpile(src) { - var options, - _options$minify, - minify, - _options$minifyOpts, - minifyOpts, - _options$prettier, - prettier, - _options$prettierOpts, - prettierOpts, - _options$context, - context, - _options$buildOptions, - buildOptions, - project, - _args = arguments; - - return _regenerator["default"].async(function transpile$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - options = _args.length > 1 && _args[1] !== undefined ? _args[1] : {}; - _options$minify = options.minify, minify = _options$minify === void 0 ? false : _options$minify, _options$minifyOpts = options.minifyOpts, minifyOpts = _options$minifyOpts === void 0 ? {} : _options$minifyOpts, _options$prettier = options.prettier, prettier = _options$prettier === void 0 ? false : _options$prettier, _options$prettierOpts = options.prettierOpts, prettierOpts = _options$prettierOpts === void 0 ? {} : _options$prettierOpts, _options$context = options.context, context = _options$context === void 0 ? '/' : _options$context, _options$buildOptions = options.buildOptions, buildOptions = _options$buildOptions === void 0 ? {} : _options$buildOptions, project = options.project; // The decorated plugins should append this, but for now we add here to simplify - // src += ';const __contract = new __contract_name();const __metadata = {}' - // then, babelify it - - src = babelify(src, [plugin]); // remove flow types - - src = babelify(src, [flowPlugin]); // don't know, maybe babel not support decorators along to private property - - _context.next = 6; - return _regenerator["default"].awrap(transform(src, context, project, buildOptions)); - - case 6: - src = _context.sent; - // finally, wrap it - src = makeWrapper(src).trim(); // preparation for minified - - src = prettify(src, { - semi: true - }); - - if (prettier) { - src = prettify(src, prettierOpts); - } else if (minify) { - src = doMinify(src, minifyOpts); - } // console.log(src) - - - return _context.abrupt("return", src); - - case 11: - case "end": - return _context.stop(); - } - } - }); -}; - -var simpleTranspile = function simpleTranspile(src) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var _options$minify2 = options.minify, - minify = _options$minify2 === void 0 ? false : _options$minify2, - _options$minifyOpts2 = options.minifyOpts, - minifyOpts = _options$minifyOpts2 === void 0 ? {} : _options$minifyOpts2, - _options$prettier2 = options.prettier, - prettier = _options$prettier2 === void 0 ? false : _options$prettier2, - _options$prettierOpts2 = options.prettierOpts, - prettierOpts = _options$prettierOpts2 === void 0 ? {} : _options$prettierOpts2; // The decorated plugins should append this, but for now we add here to simplify - // src += ';const __contract = new __contract_name();const __metadata = {}' - // then, babelify it - - src = babelify(src, [plugin]); // remove flow types - - src = babelify(src, [flowPlugin]); // finally, wrap it - - src = makeWrapper(src).trim(); // preparation for minified - - src = prettify(src, { - semi: true - }); - - if (prettier) { - src = prettify(src, prettierOpts); - } else if (minify) { - src = doMinify(src, minifyOpts); - } - - return src; -}; - -function prettify(src) { - var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - return prettier.format(src, { - parser: 'babel', - plugins: plugins - }); -} - -function doMinify(src) { - var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var result = Terser.minify(src, _objectSpread({ - parse: { - bare_returns: true - }, - keep_classnames: true, - keep_fnames: true - }, opts)); - - if (result.error) { - throw new Error(JSON.stringify(result.error)); - } - - return result.code; -} - -module.exports = { - transpile: transpile, - simpleTranspile: simpleTranspile, - addWhiteListModule: addWhiteListModule, - removeWhiteListModule: removeWhiteListModule, - getWhiteListModules: getWhiteListModules, - setWhiteListModules: setWhiteListModules -}; \ No newline at end of file diff --git a/dist/preprocess.js b/dist/preprocess.js deleted file mode 100644 index ca2eadd..0000000 --- a/dist/preprocess.js +++ /dev/null @@ -1,75 +0,0 @@ -"use strict"; - -var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - -var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); - -var fetch = require('node-fetch'); - -var PLAIN_IMPORT_REGEX = /^[ \t]*import\s+["'](https?:\/\/.+)["'][ \t]*$/gm; -var REQUIRE_REGEX = /\brequire\s*\(\s*["'](https?:\/\/.+)["']\s*\)/g; // From https://github.com/// -// To https://raw.githubusercontent.com///master/ - -function changeGithubPath(src) { - if (!src.startsWith('https://github.com/')) { - return src; - } - - var parts = src.replace('https://github.com/', '').split('/'); - var path = parts.slice(2); - var repo = parts.slice(0, 2); - var url = ['https://raw.githubusercontent.com'].concat((0, _toConsumableArray2["default"])(repo), ['master'], (0, _toConsumableArray2["default"])(path)).join('/'); - return url; -} - -function preparePromises(src, regex, map) { - var e = regex.exec(src); - - while (e) { - var p = e[1]; - var content = fetch(changeGithubPath(p)).then(function (resp) { - return resp.text(); - }); - map[p] = content; - e = regex.exec(src); - } -} - -function resolveRegEx(src, regex, wrapFn) { - var map = {}; - preparePromises(src, regex, map); - var promises = Object.values(map); - if (!promises.length) return Promise.resolve(src); - return Promise.all(promises).then(function (values) { - var keys = Object.keys(map); - - for (var i = 0; i < keys.length; i++) { - map[keys[i]] = wrapFn ? wrapFn(values[i]) : values[i]; - } - }).then(function () { - return src.replace(regex, function (match, group) { - return map[group]; - }); - }).then(function (src) { - return resolveRegEx(src, regex, wrapFn); - }); -} - -function resolveImports(src) { - return resolveRegEx(src, PLAIN_IMPORT_REGEX, function (src) { - // return '(function(){\n' + src.trim() + '\n}).call(global)' - return src; // for import, include as is - }); -} - -function resolveRequires(src) { - return resolveRegEx(src, REQUIRE_REGEX, function (src) { - return '(function(){const module={exports:{}};const exports=module.exports;\n' + src.trim() + ';\nreturn module.exports}).call(global)'; - }); -} - -exports.resolveExternal = function (src) { - return resolveImports(src).then(function (src) { - return resolveRequires(src); - }); -}; \ No newline at end of file diff --git a/dist/transform/babelify.js b/dist/transform/babelify.js deleted file mode 100644 index dc351d9..0000000 --- a/dist/transform/babelify.js +++ /dev/null @@ -1,24 +0,0 @@ -"use strict"; - -var babel = require('@babel/core'); - -var _require = require('../common'), - babelPlugins = _require.plugins; - -module.exports = function (src, plugins) { - var sourceFilename = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'Contract source'; - return babel.transformSync(src, { - parserOpts: { - sourceType: 'module', - strictMode: true, - sourceFilename: sourceFilename, - allowReturnOutsideFunction: true, - allowAwaitOutsideFunction: true, - plugins: babelPlugins - }, - retainLines: false, - minified: false, - sourceMaps: false, - plugins: plugins - }).code; -}; \ No newline at end of file diff --git a/dist/transform/index.js b/dist/transform/index.js deleted file mode 100644 index 9663ee4..0000000 --- a/dist/transform/index.js +++ /dev/null @@ -1,279 +0,0 @@ -"use strict"; - -var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - -var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); - -var url = require('url'); - -var fs = require('fs'); - -var path = require('path'); - -var axios = require('axios'); - -var babelParser = require('@babel/parser'); - -var traverse = require('@babel/traverse')["default"]; - -var _require = require('../common'), - plugins = _require.plugins, - isHttp = _require.isHttp, - isNodeModule = _require.isNodeModule, - isWhitelistModule = _require.isWhitelistModule; - -var resolveExternal = require('../external'); - -var importToRequire = require('../import2require'); - -var babelify = require('./babelify'); -/** - * transform bundle library with contract source - * @param {string} src - contract source require external library - * @param {string} context - for recursive require - * @param {Object} project - support icetea-studio (does not use fs) - * @param {Object} options - bundle module config - */ - - -exports.transform = function _callee2(src) { - var context, - project, - options, - parsed, - requires, - _args2 = arguments; - return _regenerator["default"].async(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - context = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : '/'; - project = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : null; - options = _args2.length > 3 && _args2[3] !== undefined ? _args2[3] : {}; - _context2.next = 5; - return _regenerator["default"].awrap(babelify(src, [importToRequire])); - - case 5: - src = _context2.sent; - parsed = babelParser.parse(src, { - sourceType: 'module', - plugins: plugins - }); - requires = {}; - traverse(parsed, { - CallExpression: function CallExpression(_ref) { - var node = _ref.node; - - if (!node || node.callee.name !== 'require') { - return; - } - - var arguments_ = node.arguments; - - if (arguments_.length !== 1 || arguments_[0].type !== 'StringLiteral') { - return; - } - - var value = arguments_[0].value; - requires[value] = value; - } - }); - _context2.next = 11; - return _regenerator["default"].awrap(Promise.all(Object.keys(requires).map(function _callee(value) { - var _data, _data2, localFlag, moduleName, filePath, data; - - return _regenerator["default"].async(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (!(isWhitelistModule(value) || options.remote && options.remote[value])) { - _context.next = 3; - break; - } - - delete requires[value]; - return _context.abrupt("return"); - - case 3: - if (!isHttp(value)) { - _context.next = 17; - break; - } - - if (['.js', '.json'].includes(path.extname(value))) { - _context.next = 6; - break; - } - - throw new Error('"require" supports only .js and .json files.'); - - case 6: - _context.next = 8; - return _regenerator["default"].awrap(axios.get(value)); - - case 8: - _data = _context.sent.data; - - if (!(typeof _data === 'string')) { - _context.next = 15; - break; - } - - _context.next = 12; - return _regenerator["default"].awrap(exports.transform(_data, value, null, options)); - - case 12: - requires[value] = _context.sent; - _context.next = 16; - break; - - case 15: - requires[value] = _data; - - case 16: - return _context.abrupt("return"); - - case 17: - if (!isHttp(context)) { - _context.next = 33; - break; - } - - if (!isNodeModule(value)) { - _context.next = 20; - break; - } - - throw new Error('Cannot use node_modules in remote URL.'); - - case 20: - if (['.js', '.json'].includes(path.extname(value))) { - _context.next = 22; - break; - } - - throw new Error('"require" supports only .js and .json files.'); - - case 22: - _context.next = 24; - return _regenerator["default"].awrap(axios.get(url.resolve(context, value))); - - case 24: - _data2 = _context.sent.data; - - if (!(typeof _data2 === 'string')) { - _context.next = 31; - break; - } - - _context.next = 28; - return _regenerator["default"].awrap(exports.transform(_data2, url.resolve(context, value), null, options)); - - case 28: - requires[value] = _context.sent; - _context.next = 32; - break; - - case 31: - requires[value] = _data2; - - case 32: - return _context.abrupt("return"); - - case 33: - // if you want to use bundle instead of blockchain node_modules - localFlag = '@local'; - moduleName = value; - - if (moduleName.endsWith(localFlag)) { - moduleName = moduleName.slice(0, -localFlag.length); - } - - if (isNodeModule(moduleName)) { - filePath = require.resolve("".concat(moduleName)); // to ignore webpack warning - } else { - if (project) { - filePath = path.join(context, value); - } else { - filePath = require.resolve("".concat(path.resolve(context, value))); - } - } - - if (['.js', '.json'].includes(path.extname(filePath))) { - _context.next = 39; - break; - } - - throw new Error('"require" supports only .js and .json files.'); - - case 39: - if (project) { - data = project.getFile(filePath).getData().toString(); - } else { - data = fs.readFileSync(filePath).toString(); - } - - _context.prev = 40; - data = JSON.parse(data); - requires[value] = data; - _context.next = 54; - break; - - case 45: - _context.prev = 45; - _context.t0 = _context["catch"](40); - - if (!(_context.t0 instanceof SyntaxError)) { - _context.next = 53; - break; - } - - _context.next = 50; - return _regenerator["default"].awrap(exports.transform(data, path.dirname(filePath), project, options)); - - case 50: - requires[value] = _context.sent; - _context.next = 54; - break; - - case 53: - throw _context.t0; - - case 54: - case "end": - return _context.stop(); - } - } - }, null, null, [[40, 45]]); - }))); - - case 11: - if (!(Object.keys(requires).length === 0)) { - _context2.next = 13; - break; - } - - return _context2.abrupt("return", src); - - case 13: - _context2.next = 15; - return _regenerator["default"].awrap(babelify(src, [resolveExternal(requires)])); - - case 15: - src = _context2.sent; - - if (src.endsWith(';')) { - src = src.slice(0, -1); // for redundancy Semicolon - } - - return _context2.abrupt("return", src); - - case 18: - case "end": - return _context2.stop(); - } - } - }); -}; - -exports.babelify = babelify; \ No newline at end of file diff --git a/dist/wrapper.js b/dist/wrapper.js deleted file mode 100644 index 7c52ee2..0000000 --- a/dist/wrapper.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; - -module.exports = function (src) { - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - noState = _ref.noState; - - var stateFunc = noState ? '' : "\n const __proxyState$Unwrap = value => {\n const real = value && value.__proxyState$RealObj;\n return typeof real !== 'function' ? value : real.call(value);\n }\n\n const __proxyState$Get = (name, defValue) => {\n\n // this will throw if msg.callType if 'pure'\n const state = this.getState(name, defValue);\n \n // no need to check with Object.isFrozen since we can use msg.type\n // note that typeof null is 'object'\n if (state === null || typeof state !== 'object' || 'view' === msg.callType) {\n return state;\n }\n\n const saveState = () => this.setState(name, state);\n \n const makeProxy = realObj => {\n const handler = {\n get (target, property, receiver) {\n if (property === '__proxyState$RealObj') {\n return () => realObj;\n }\n \n const v = Reflect.get(target, property, receiver);\n if (v === null || typeof v !== 'object') {\n return v;\n }\n return makeProxy(v)\n },\n\n set (target, prop, value, receiver) {\n const r = Reflect.set(target, prop, __proxyState$Unwrap(value), receiver);\n saveState();\n return r;\n },\n\n defineProperty (target, property, desc) {\n if (desc.value) {\n desc.value = __proxyState$Unwrap(desc.value)\n }\n const r = Reflect.defineProperty(target, property, desc);\n saveState();\n return r;\n },\n\n deleteProperty (target, property) {\n const r = Reflect.deleteProperty(target, property);\n saveState();\n return r;\n }\n }\n \n return new Proxy(realObj, handler);\n }\n \n return makeProxy(state)\n }\n "; - return "'use strict';\nconst {msg, block, balanceOf, loadContract, loadLibrary, isValidAddress, deployContract} = this.runtime\n\nif (!msg.name) {\n throw new Error(\"Method name is required.\")\n}\n\n".concat(stateFunc, "\n\n").concat(src, "\n\n// block to scope our let/const\n{\n const __name = typeof __metadata[msg.name] === 'string' ? __metadata[msg.name] : msg.name\n if ([\"__on_deployed\", \"__on_received\"].includes(msg.name) && !(__name in __contract)) {\n // call event methods but contract does not have one\n return;\n }\n if (![\"__metadata\", \"address\", \"balance\", \"deployedBy\"].includes(__name) && \n (!(__name in __contract) || __name.startsWith('#'))) {\n throw new Error(\"Method \" + __name + \" is private or does not exist.\");\n }\n if (__metadata[__name] && __metadata[__name].decorators && __metadata[__name].decorators.includes('internal')) {\n throw new Error(\"Method \" + msg.name + \" is internal.\")\n }\n Object.defineProperties(__contract, Object.getOwnPropertyDescriptors(this));\n const __c = {\n instance: __contract,\n meta: __metadata\n };\n if (__name === \"__metadata\") {\n return __c;\n }\n const __checkType = (value, typeHolder, typeProp, info) => {\n if (!typeHolder) return value\n const types = typeHolder[typeProp]\n if (types && Array.isArray(types)) {\n let valueType = value === null ? 'null' : typeof value;\n if (!types.includes(valueType)) {\n if (valueType === 'object') {\n valueType = Object.prototype.toString.call(value).split(' ')[1].slice(0, -1).toLowerCase()\n if (types.includes(valueType)) return value;\n }\n\n if(valueType === 'string' && types.includes('address')) {\n if(isValidAddress(value)) {\n return true;\n }\n }\n\n throw new Error(\"Error executing '\" + __name + \"': wrong \" + info + \" type. Expect: \" + \n types.join(\" | \") + \". Got: \" + valueType + \".\");\n }\n }\n return value;\n }\n if (typeof __c.instance[__name] === \"function\") {\n // Check stateMutablitity\n const isValidCallType = (d) => {\n if ([\"__on_deployed\", \"__on_received\"].includes(__name) || !__metadata[__name]) return true; // FIXME\n if (!__metadata[__name].decorators) {\n return false;\n }\n if (d === \"transaction\" && __metadata[__name].decorators.includes(\"payable\")) {\n return true;\n } \n return __metadata[__name].decorators.includes(d);\n }\n if (!isValidCallType(msg.callType)) {\n throw new Error(\"Method \" + __name + \" is not decorated as @\" + msg.callType + \" and cannot be invoked in such mode\");\n }\n // Check input param type\n const params = msg.params;\n if (__metadata[__name] && __metadata[__name].params && __metadata[__name].params.length) {\n __metadata[__name].params.forEach((p, index) => {\n const pv = (params.length > index) ? params[index] : undefined;\n __checkType(pv, p, 'type', \"param '\" + p.name + \"'\");\n })\n }\n // Call the function, finally\n if (typeof __c.instance.onready === 'function') __c.instance.onready()\n const result = __c.instance[__name].apply(__c.instance, params);\n return __checkType(result, __metadata[__name], 'returnType', \"return\");\n }\n\n if (typeof __c.instance.onready === 'function') __c.instance.onready()\n return __checkType(__c.instance[__name], __metadata[__name], 'fieldType', 'field');\n}\n"); -}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 34e8f47..59c7f8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@iceteachain/sunseed", - "version": "0.1.1", + "version": "0.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/cli": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.7.0.tgz", - "integrity": "sha512-jECEqAq6Ngf3pOhLSg7od9WKyrIacyh1oNNYtRXNn+ummSHCTXBamGywOAtiae34Vk7zKuQNnLvo2BKTMCoV4A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.7.4.tgz", + "integrity": "sha512-O7mmzaWdm+VabWQmxuM8hqNrWGGihN83KfhPUzp2lAW4kzIMwBxujXkZbD4fMwKMYY9FXTbDvXsJqU+5XHXi4A==", "dev": true, "requires": { "chokidar": "^2.1.8", - "commander": "^2.8.1", + "commander": "^4.0.1", "convert-source-map": "^1.1.0", "fs-readdir-recursive": "^1.1.0", "glob": "^7.0.0", @@ -19,6 +19,14 @@ "make-dir": "^2.1.0", "slash": "^2.0.0", "source-map": "^0.5.0" + }, + "dependencies": { + "commander": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.0.1.tgz", + "integrity": "sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA==", + "dev": true + } } }, "@babel/code-frame": { @@ -30,17 +38,17 @@ } }, "@babel/core": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.2.tgz", - "integrity": "sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.4.tgz", + "integrity": "sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ==", "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.2", - "@babel/helpers": "^7.7.0", - "@babel/parser": "^7.7.2", - "@babel/template": "^7.7.0", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.7.2", + "@babel/generator": "^7.7.4", + "@babel/helpers": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "json5": "^2.1.0", @@ -48,12 +56,26 @@ "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", + "requires": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + } } }, "@babel/generator": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", + "dev": true, "requires": { "@babel/types": "^7.7.2", "jsesc": "^2.5.1", @@ -62,121 +84,121 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz", - "integrity": "sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz", + "integrity": "sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.0.tgz", - "integrity": "sha512-Cd8r8zs4RKDwMG/92lpZcnn5WPQ3LAMQbCw42oqUh4s7vsSN5ANUZjMel0OOnxDLq57hoDDbai+ryygYfCTOsw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz", + "integrity": "sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-explode-assignable-expression": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-call-delegate": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.0.tgz", - "integrity": "sha512-Su0Mdq7uSSWGZayGMMQ+z6lnL00mMCnGAbO/R0ZO9odIdB/WNU/VfQKqMQU0fdIsxQYbRjDM4BixIa93SQIpvw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz", + "integrity": "sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA==", "requires": { - "@babel/helper-hoist-variables": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-hoist-variables": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.2.tgz", - "integrity": "sha512-pAil/ZixjTlrzNpjx+l/C/wJk002Wo7XbbZ8oujH/AoJ3Juv0iN/UTcPUHXKMFLqsfS0Hy6Aow8M31brUYBlQQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz", + "integrity": "sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A==", "requires": { "@babel/helper-regex": "^7.4.4", "regexpu-core": "^4.6.0" } }, "@babel/helper-define-map": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz", - "integrity": "sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz", + "integrity": "sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg==", "requires": { - "@babel/helper-function-name": "^7.7.0", - "@babel/types": "^7.7.0", + "@babel/helper-function-name": "^7.7.4", + "@babel/types": "^7.7.4", "lodash": "^4.17.13" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.0.tgz", - "integrity": "sha512-CDs26w2shdD1urNUAji2RJXyBFCaR+iBEGnFz3l7maizMkQe3saVw9WtjG1tz8CwbjvlFnaSLVhgnu1SWaherg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz", + "integrity": "sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg==", "requires": { - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-function-name": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", - "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", "requires": { - "@babel/helper-get-function-arity": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-get-function-arity": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", - "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-hoist-variables": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz", - "integrity": "sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz", + "integrity": "sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz", - "integrity": "sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz", + "integrity": "sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-module-imports": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz", - "integrity": "sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz", + "integrity": "sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-module-transforms": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz", - "integrity": "sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ==", - "requires": { - "@babel/helper-module-imports": "^7.7.0", - "@babel/helper-simple-access": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/types": "^7.7.0", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.4.tgz", + "integrity": "sha512-ehGBu4mXrhs0FxAqN8tWkzF8GSIGAiEumu4ONZ/hD9M88uHcD+Yu2ttKfOCgwzoesJOJrtQh7trI5YPbRtMmnA==", + "requires": { + "@babel/helper-module-imports": "^7.7.4", + "@babel/helper-simple-access": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4", "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz", - "integrity": "sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz", + "integrity": "sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-plugin-utils": { @@ -193,64 +215,64 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz", - "integrity": "sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz", + "integrity": "sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.7.0", - "@babel/helper-wrap-function": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-annotate-as-pure": "^7.7.4", + "@babel/helper-wrap-function": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-replace-supers": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz", - "integrity": "sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz", + "integrity": "sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.7.0", - "@babel/helper-optimise-call-expression": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-member-expression-to-functions": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-simple-access": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz", - "integrity": "sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz", + "integrity": "sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A==", "requires": { - "@babel/template": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", - "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-wrap-function": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz", - "integrity": "sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz", + "integrity": "sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg==", "requires": { - "@babel/helper-function-name": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-function-name": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helpers": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.0.tgz", - "integrity": "sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.4.tgz", + "integrity": "sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==", "requires": { - "@babel/template": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/highlight": { @@ -264,93 +286,103 @@ } }, "@babel/parser": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.3.tgz", - "integrity": "sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A==" + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.4.tgz", + "integrity": "sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz", - "integrity": "sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz", + "integrity": "sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.7.0", - "@babel/plugin-syntax-async-generators": "^7.2.0" + "@babel/helper-remap-async-to-generator": "^7.7.4", + "@babel/plugin-syntax-async-generators": "^7.7.4" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz", - "integrity": "sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz", + "integrity": "sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0" + "@babel/plugin-syntax-dynamic-import": "^7.7.4" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz", + "integrity": "sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.2.0" + "@babel/plugin-syntax-json-strings": "^7.7.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", - "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + "@babel/plugin-syntax-object-rest-spread": "^7.7.4" + }, + "dependencies": { + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + } } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz", + "integrity": "sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding": "^7.7.4" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz", - "integrity": "sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz", + "integrity": "sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-create-regexp-features-plugin": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz", + "integrity": "sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz", + "integrity": "sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-flow": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.7.0.tgz", - "integrity": "sha512-vQMV07p+L+jZeUnvX3pEJ9EiXGCjB5CTTvsirFD9rpEuATnoAvLBLoYbw1v5tyn3d2XxSuvEKi8cV3KqYUa0vQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.7.4.tgz", + "integrity": "sha512-2AMAWl5PsmM5KPkB22cvOkUyWk6MjUaqhHNU5nSPUl/ns3j5qLfw2SuYP5RbVZ0tfLvePr4zUScbICtDP2CUNw==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz", + "integrity": "sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -359,417 +391,441 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz", + "integrity": "sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz", - "integrity": "sha512-hi8FUNiFIY1fnUI2n1ViB1DR0R4QeK4iHcTlW6aJkrPoTdb8Rf1EMQ6GT3f67DDkYyWgew9DFoOZ6gOoEsdzTA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz", + "integrity": "sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz", + "integrity": "sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz", - "integrity": "sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz", + "integrity": "sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg==", "requires": { - "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-module-imports": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.7.0" + "@babel/helper-remap-async-to-generator": "^7.7.4" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz", + "integrity": "sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz", - "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz", + "integrity": "sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz", - "integrity": "sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.7.0", - "@babel/helper-define-map": "^7.7.0", - "@babel/helper-function-name": "^7.7.0", - "@babel/helper-optimise-call-expression": "^7.7.0", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz", + "integrity": "sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.7.4", + "@babel/helper-define-map": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/helper-replace-supers": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz", + "integrity": "sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", - "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz", + "integrity": "sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz", - "integrity": "sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz", + "integrity": "sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-create-regexp-features-plugin": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", - "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz", + "integrity": "sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz", + "integrity": "sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.6.3.tgz", - "integrity": "sha512-l0ETkyEofkqFJ9LS6HChNIKtVJw2ylKbhYMlJ5C6df+ldxxaLIyXY4yOdDQQspfFpV8/vDiaWoJlvflstlYNxg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.7.4.tgz", + "integrity": "sha512-w9dRNlHY5ElNimyMYy0oQowvQpwt/PRHI0QS98ZJCTZU2bvSnKXo5zEiD5u76FBPigTm8TkqzmnUTg16T7qbkA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0" + "@babel/plugin-syntax-flow": "^7.7.4" } }, "@babel/plugin-transform-for-of": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", - "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz", + "integrity": "sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz", - "integrity": "sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz", + "integrity": "sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g==", "requires": { - "@babel/helper-function-name": "^7.7.0", + "@babel/helper-function-name": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz", + "integrity": "sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", - "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz", + "integrity": "sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", - "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.4.tgz", + "integrity": "sha512-/542/5LNA18YDtg1F+QHvvUSlxdvjZoD/aldQwkq+E3WCkbEjNSN9zdrOXaSlfg3IfGi22ijzecklF/A7kVZFQ==", "requires": { - "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-module-transforms": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz", - "integrity": "sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.4.tgz", + "integrity": "sha512-k8iVS7Jhc367IcNF53KCwIXtKAH7czev866ThsTgy8CwlXjnKZna2VHwChglzLleYrcHz1eQEIJlGRQxB53nqA==", "requires": { - "@babel/helper-module-transforms": "^7.7.0", + "@babel/helper-module-transforms": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.7.0", + "@babel/helper-simple-access": "^7.7.4", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz", - "integrity": "sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz", + "integrity": "sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw==", "requires": { - "@babel/helper-hoist-variables": "^7.7.0", + "@babel/helper-hoist-variables": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz", - "integrity": "sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz", + "integrity": "sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw==", "requires": { - "@babel/helper-module-transforms": "^7.7.0", + "@babel/helper-module-transforms": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz", - "integrity": "sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz", + "integrity": "sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.0" + "@babel/helper-create-regexp-features-plugin": "^7.7.4" } }, "@babel/plugin-transform-new-target": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", - "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz", + "integrity": "sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-object-super": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", - "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz", + "integrity": "sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5" + "@babel/helper-replace-supers": "^7.7.4" } }, "@babel/plugin-transform-parameters": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", - "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz", + "integrity": "sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw==", "requires": { - "@babel/helper-call-delegate": "^7.4.4", - "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-call-delegate": "^7.7.4", + "@babel/helper-get-function-arity": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-property-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", - "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz", + "integrity": "sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-regenerator": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz", - "integrity": "sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.4.tgz", + "integrity": "sha512-e7MWl5UJvmPEwFJTwkBlPmqixCtr9yAASBqff4ggXTNicZiwbF8Eefzm6NVgfiBp7JdAGItecnctKTgH44q2Jw==", "requires": { "regenerator-transform": "^0.14.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", - "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz", + "integrity": "sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-runtime": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.2.tgz", - "integrity": "sha512-cqULw/QB4yl73cS5Y0TZlQSjDvNkzDbu0FurTZyHlJpWE5T3PCMdnyV+xXoH1opr1ldyHODe3QAX3OMAii5NxA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.7.4.tgz", + "integrity": "sha512-O8kSkS5fP74Ad/8pfsCMGa8sBRdLxYoSReaARRNSz3FbFQj3z/QUvoUmJ28gn9BO93YfnXc3j+Xyaqe8cKDNBQ==", "requires": { - "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-module-imports": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", "resolve": "^1.8.1", "semver": "^5.5.1" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz", + "integrity": "sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", - "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz", + "integrity": "sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz", + "integrity": "sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/helper-regex": "^7.0.0" } }, "@babel/plugin-transform-template-literals": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", - "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz", + "integrity": "sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-annotate-as-pure": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz", + "integrity": "sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz", - "integrity": "sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz", + "integrity": "sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-create-regexp-features-plugin": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/preset-env": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.1.tgz", - "integrity": "sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.4.tgz", + "integrity": "sha512-Dg+ciGJjwvC1NIe/DGblMbcGq1HOtKbw8RLl4nIjlfcILKEOkWT/vRqPpumswABEBVudii6dnVwrBtzD7ibm4g==", "requires": { - "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-module-imports": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.7.0", - "@babel/plugin-proposal-dynamic-import": "^7.7.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.6.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.7.0", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-syntax-top-level-await": "^7.7.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.7.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.6.3", - "@babel/plugin-transform-classes": "^7.7.0", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.6.0", - "@babel/plugin-transform-dotall-regex": "^7.7.0", - "@babel/plugin-transform-duplicate-keys": "^7.5.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.7.0", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.5.0", - "@babel/plugin-transform-modules-commonjs": "^7.7.0", - "@babel/plugin-transform-modules-systemjs": "^7.7.0", - "@babel/plugin-transform-modules-umd": "^7.7.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.0", - "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.5.5", - "@babel/plugin-transform-parameters": "^7.4.4", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.7.0", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.6.2", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.4.4", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.7.0", - "@babel/types": "^7.7.1", + "@babel/plugin-proposal-async-generator-functions": "^7.7.4", + "@babel/plugin-proposal-dynamic-import": "^7.7.4", + "@babel/plugin-proposal-json-strings": "^7.7.4", + "@babel/plugin-proposal-object-rest-spread": "^7.7.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.4", + "@babel/plugin-syntax-async-generators": "^7.7.4", + "@babel/plugin-syntax-dynamic-import": "^7.7.4", + "@babel/plugin-syntax-json-strings": "^7.7.4", + "@babel/plugin-syntax-object-rest-spread": "^7.7.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.7.4", + "@babel/plugin-syntax-top-level-await": "^7.7.4", + "@babel/plugin-transform-arrow-functions": "^7.7.4", + "@babel/plugin-transform-async-to-generator": "^7.7.4", + "@babel/plugin-transform-block-scoped-functions": "^7.7.4", + "@babel/plugin-transform-block-scoping": "^7.7.4", + "@babel/plugin-transform-classes": "^7.7.4", + "@babel/plugin-transform-computed-properties": "^7.7.4", + "@babel/plugin-transform-destructuring": "^7.7.4", + "@babel/plugin-transform-dotall-regex": "^7.7.4", + "@babel/plugin-transform-duplicate-keys": "^7.7.4", + "@babel/plugin-transform-exponentiation-operator": "^7.7.4", + "@babel/plugin-transform-for-of": "^7.7.4", + "@babel/plugin-transform-function-name": "^7.7.4", + "@babel/plugin-transform-literals": "^7.7.4", + "@babel/plugin-transform-member-expression-literals": "^7.7.4", + "@babel/plugin-transform-modules-amd": "^7.7.4", + "@babel/plugin-transform-modules-commonjs": "^7.7.4", + "@babel/plugin-transform-modules-systemjs": "^7.7.4", + "@babel/plugin-transform-modules-umd": "^7.7.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", + "@babel/plugin-transform-new-target": "^7.7.4", + "@babel/plugin-transform-object-super": "^7.7.4", + "@babel/plugin-transform-parameters": "^7.7.4", + "@babel/plugin-transform-property-literals": "^7.7.4", + "@babel/plugin-transform-regenerator": "^7.7.4", + "@babel/plugin-transform-reserved-words": "^7.7.4", + "@babel/plugin-transform-shorthand-properties": "^7.7.4", + "@babel/plugin-transform-spread": "^7.7.4", + "@babel/plugin-transform-sticky-regex": "^7.7.4", + "@babel/plugin-transform-template-literals": "^7.7.4", + "@babel/plugin-transform-typeof-symbol": "^7.7.4", + "@babel/plugin-transform-unicode-regex": "^7.7.4", + "@babel/types": "^7.7.4", "browserslist": "^4.6.0", "core-js-compat": "^3.1.1", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", "semver": "^5.5.0" + }, + "dependencies": { + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + } } }, "@babel/runtime": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", - "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.4.tgz", + "integrity": "sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw==", "requires": { "regenerator-runtime": "^0.13.2" } }, "@babel/template": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", - "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/traverse": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", - "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.2", - "@babel/helper-function-name": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0", - "@babel/parser": "^7.7.2", - "@babel/types": "^7.7.2", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/generator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", + "requires": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + } } }, "@babel/types": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", - "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -1065,6 +1121,15 @@ "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", "dev": true }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "abab": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", @@ -1101,6 +1166,28 @@ "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", "dev": true }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + }, + "acorn-walk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz", + "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==" + } + } + }, "acorn-walk": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", @@ -1218,6 +1305,40 @@ "safer-buffer": "~2.1.0" } }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -1339,8 +1460,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -1397,6 +1517,11 @@ } } }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -1413,11 +1538,15 @@ "dev": true, "optional": true }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1452,6 +1581,24 @@ } } }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, "browser-process-hrtime": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", @@ -1462,7 +1609,6 @@ "version": "1.11.3", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, "requires": { "resolve": "1.1.7" }, @@ -1470,11 +1616,137 @@ "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" } } }, + "browserify": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz", + "integrity": "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==", + "requires": { + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, "browserslist": { "version": "4.7.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.3.tgz", @@ -1494,11 +1766,30 @@ "node-int64": "^0.4.0" } }, + "buffer": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, "builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", @@ -1521,6 +1812,11 @@ "unset-value": "^1.0.0" } }, + "cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1596,6 +1892,15 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -1674,6 +1979,24 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + } + } + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1697,8 +2020,28 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, "contains-path": { "version": "0.1.0", @@ -1721,11 +2064,11 @@ "dev": true }, "core-js-compat": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.4.1.tgz", - "integrity": "sha512-YdeJI26gLc0CQJ9asLE5obEgBz2I0+CIgnoTbS2T0d5IPQw/OCgCIFR527RmpduxjrB3gSEHoGOCTq9sigOyfw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.4.2.tgz", + "integrity": "sha512-W0Aj+LM3EAxxjD0Kp2o4be8UlnxIZHNupBv2znqrheR4aY2nOn91794k/xoSp+SxqqriiZpTsSwBtZr60cbkwQ==", "requires": { - "browserslist": "^4.7.2", + "browserslist": "^4.7.3", "semver": "^6.3.0" }, "dependencies": { @@ -1739,8 +2082,41 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } }, "cross-spawn": { "version": "6.0.5", @@ -1755,6 +2131,29 @@ "which": "^1.2.9" } }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, "cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", @@ -1770,6 +2169,11 @@ "cssom": "0.3.x" } }, + "dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1884,6 +2288,11 @@ } } }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, "deglob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/deglob/-/deglob-4.0.1.tgz", @@ -1912,18 +2321,58 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "requires": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + } + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, "detect-newline": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", "dev": true }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, "diff-sequences": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", "dev": true }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1933,6 +2382,11 @@ "esutils": "^2.0.2" } }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -1942,6 +2396,14 @@ "webidl-conversions": "^4.0.2" } }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "^2.0.2" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1953,9 +2415,23 @@ } }, "electron-to-chromium": { - "version": "1.3.308", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.308.tgz", - "integrity": "sha512-IwU/0LTzTa03Q0YDzg11RlK8e/V92tmPqFOaTEsdv7JJXtC/+v/H4bT2FmsA/xaFQWJvi0ZVcRppw8o0AD9XJQ==" + "version": "1.3.314", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.314.tgz", + "integrity": "sha512-IKDR/xCxKFhPts7h+VaSXS02Z1mznP3fli1BbXWXeN89i2gCzKraU8qLpEid8YzKcmZdZD3Mly3cn5/lY9xsBQ==" + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } }, "emoji-regex": { "version": "7.0.3", @@ -2528,6 +3004,20 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, "exec-sh": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", @@ -2746,6 +3236,11 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, "fb-watchman": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", @@ -2903,8 +3398,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.9", @@ -3465,6 +3959,11 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3505,7 +4004,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3595,7 +4093,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -3648,6 +4145,34 @@ } } }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "hosted-git-info": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", @@ -3663,6 +4188,11 @@ "whatwg-encoding": "^1.0.1" } }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -3674,6 +4204,11 @@ "sshpk": "^1.7.0" } }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -3683,6 +4218,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -3727,7 +4267,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -3736,8 +4275,15 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "requires": { + "source-map": "~0.5.3" + } }, "inquirer": { "version": "6.5.2", @@ -3789,6 +4335,30 @@ } } }, + "insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "requires": { + "JSONStream": "^1.0.3", + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + } + } + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -4029,8 +4599,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -4656,6 +5225,14 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "requires": { + "jsonify": "~0.0.0" + } + }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -4676,6 +5253,16 @@ "minimist": "^1.2.0" } }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -4710,6 +5297,15 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, + "labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "requires": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -4767,6 +5363,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -4815,6 +5416,16 @@ "object-visit": "^1.0.0" } }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4842,6 +5453,15 @@ "to-regex": "^3.0.2" } }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, "mime-db": { "version": "1.42.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", @@ -4863,11 +5483,20 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4902,7 +5531,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" }, @@ -4910,11 +5538,38 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } }, + "module-deps": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz", + "integrity": "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==", + "requires": { + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4970,11 +5625,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" - }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -5001,9 +5651,9 @@ } }, "node-releases": { - "version": "1.1.40", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.40.tgz", - "integrity": "sha512-r4LPcC5b/bS8BdtWH1fbeK88ib/wg9aqmg6/s3ngNLn2Ewkn/8J6Iw3P9RTlfIAdSdvYvQl2thCY5Y+qTAQ2iQ==", + "version": "1.1.41", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.41.tgz", + "integrity": "sha512-+IctMa7wIs8Cfsa8iYzeaLTFwv5Y4r5jZud+4AnfymzeEXKBCavFX0KBgzVaPVqf0ywa6PrO8/b+bPqdwjGBSg==", "requires": { "semver": "^6.3.0" }, @@ -5058,8 +5708,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", @@ -5188,7 +5837,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -5234,6 +5882,11 @@ "word-wrap": "~1.2.3" } }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -5285,6 +5938,11 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5294,6 +5952,27 @@ "callsites": "^3.0.0" } }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "requires": { + "path-platform": "~0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -5316,6 +5995,11 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -5332,8 +6016,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "2.0.1", @@ -5346,6 +6029,11 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" + }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -5363,6 +6051,18 @@ } } }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -5469,12 +6169,15 @@ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "optional": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { "version": "2.0.3", @@ -5509,6 +6212,19 @@ "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", "dev": true }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -5531,12 +6247,47 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, "react-is": { "version": "16.12.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==", "dev": true }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "requires": { + "readable-stream": "^2.0.2" + } + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -5562,8 +6313,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5820,6 +6569,15 @@ "glob": "^7.1.3" } }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -5927,6 +6685,32 @@ } } }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "requires": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "requires": { + "fast-safe-stringify": "^2.0.7" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -5942,6 +6726,11 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", @@ -5954,6 +6743,11 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, "sisteransi": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", @@ -6271,6 +7065,56 @@ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "stream-http": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz", + "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^3.0.6", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, "string-length": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", @@ -6333,8 +7177,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, "requires": { "safe-buffer": "~5.1.0" } @@ -6366,6 +7208,14 @@ "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "requires": { + "minimist": "^1.1.0" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -6380,6 +7230,14 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "requires": { + "acorn-node": "^1.2.0" + } + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -6392,6 +7250,21 @@ "string-width": "^3.0.0" } }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" + }, + "tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "requires": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + } + }, "terser": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/terser/-/terser-4.4.0.tgz", @@ -6436,8 +7309,24 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "requires": { + "process": "~0.11.0" + } }, "tmp": { "version": "0.0.33", @@ -6532,6 +7421,11 @@ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -6559,8 +7453,12 @@ "type-fest": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "uglify-js": { "version": "3.6.9", @@ -6582,6 +7480,23 @@ } } }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==" + }, + "undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "requires": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -6624,6 +7539,14 @@ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", "dev": true }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "^1.0.0" + } + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -6686,18 +7609,47 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { "version": "1.0.0", @@ -6750,6 +7702,11 @@ "extsprintf": "^1.2.0" } }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, "w3c-hr-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", @@ -6841,8 +7798,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "1.0.3", @@ -6882,8 +7838,7 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "4.0.0", diff --git a/package.json b/package.json index 94f67ff..d41265e 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,12 @@ { "name": "@iceteachain/sunseed", - "version": "0.1.1", + "version": "0.2.0", "description": "Compile djs to raw js for deploying on Icetea Blockchain.", "main": "index.js", "browser": "dist/index.js", "scripts": { "build": "babel src --out-dir dist", + "install": "npm run build", "test": "jest --coverage", "lint": "standard", "fix": "standard --fix" @@ -21,24 +22,27 @@ }, "homepage": "https://github.com/TradaTech/sunseed#readme", "dependencies": { - "@babel/core": "^7.7.2", - "@babel/parser": "^7.7.3", - "@babel/plugin-transform-flow-strip-types": "^7.6.3", - "@babel/plugin-transform-runtime": "^7.6.2", - "@babel/preset-env": "^7.7.1", - "@babel/runtime": "^7.7.2", - "@babel/template": "^7.7.0", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.7.2", + "@babel/core": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/plugin-transform-flow-strip-types": "^7.7.4", + "@babel/plugin-transform-runtime": "^7.7.4", + "@babel/preset-env": "^7.7.4", + "@babel/runtime": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4", "axios": "^0.19.0", - "node-fetch": "^2.6.0", + "browserify": "^16.5.0", + "mkdirp": "^0.5.1", "prettier": "^1.19.1", + "tempy": "^0.3.0", "terser": "^4.4.0", "validate-npm-package-name": "^3.0.0" }, "devDependencies": { - "@babel/cli": "^7.7.0", + "@babel/cli": "^7.7.4", "jest": "^24.9.0", + "moment": "^2.24.0", "standard": "^14.3.1" }, "standard": { @@ -52,7 +56,7 @@ }, "husky": { "hooks": { - "pre-commit": "npm run build" + "pre-commit": "npm run lint" } }, "jest": { diff --git a/src/transform/babelify.js b/src/babelify.js similarity index 89% rename from src/transform/babelify.js rename to src/babelify.js index 4287a82..a3d2c17 100644 --- a/src/transform/babelify.js +++ b/src/babelify.js @@ -1,5 +1,5 @@ const babel = require('@babel/core') -const { plugins: babelPlugins } = require('../common') +const { plugins: babelPlugins } = require('./common') module.exports = (src, plugins, sourceFilename = 'Contract source') => { return babel.transformSync(src, { diff --git a/src/common.js b/src/common.js index 6c0725d..ac15fe6 100644 --- a/src/common.js +++ b/src/common.js @@ -1,6 +1,6 @@ const validate = require('validate-npm-package-name') -exports.plugins = [ +module.exports.plugins = [ 'decorators-legacy', 'classProperties', 'flow', @@ -26,11 +26,11 @@ exports.plugins = [ 'throwExpressions' ] -exports.isHttp = (value) => { +module.exports.isHttp = (value) => { return value.startsWith('http://') || value.startsWith('https://') } -exports.isNodeModule = (value) => { +module.exports.isNodeModule = (value) => { const { validForNewPackages, validForOldPackages } = validate(value) return validForNewPackages || validForOldPackages } @@ -40,27 +40,47 @@ let whiteListModules = [ 'assert', 'buffer', 'crypto', 'querystring', 'stream', 'string_decoder', 'url', 'util', 'create-hash' ] -exports.isWhitelistModule = (value) => { +module.exports.isWhitelistModule = (value) => { return whiteListModules.some(element => { return value === element || value.startsWith(`${element}/`) }) } -exports.getWhiteListModules = () => { +module.exports.getWhiteListModules = () => { return whiteListModules } -exports.setWhiteListModules = (modules) => { +module.exports.setWhiteListModules = (modules) => { whiteListModules = modules } -exports.addWhiteListModule = (module) => { +module.exports.addWhiteListModule = (module) => { if (whiteListModules.includes(module)) { return } whiteListModules.push(module) } -exports.removeWhiteListModule = (module) => { +module.exports.removeWhiteListModule = (module) => { whiteListModules = whiteListModules.filter(whitelist => (whitelist !== module)) } + +module.exports.typeOf = (node) => { + if (!node) { + return 'undefined' + } + const type = node.type + const valueType = node.value && node.value.type + if (['ClassMethod', 'ClassPrivateMethod'].includes(type) || ['FunctionExpression', 'ArrowFunctionExpression'].includes(valueType)) { + return 'function' + } + if (valueType === 'CallExpression' && node.value.callee && node.value.callee.name === 'Symbol') { + return 'symbol' + } + if (valueType === 'NewExpression' && node.value.callee && node.value.callee.name === 'WeakMap') { + return 'weakmap' + } + return 'object' +} + +module.exports.isNode = () => typeof process !== 'undefined' && process.versions != null && process.versions.node != null diff --git a/src/constant.js b/src/constant.js new file mode 100644 index 0000000..dd38e65 --- /dev/null +++ b/src/constant.js @@ -0,0 +1,8 @@ +const METHODS = { + __ON_DEPLOYED: '__on_deployed', + __ON_RECEIVED: '__on_received' +} +module.exports.METHODS = METHODS + +const FORBIDDEN_STATE_TYPES = ['function', 'symbol', 'weakmap'] +module.exports.FORBIDDEN_STATE_TYPES = FORBIDDEN_STATE_TYPES diff --git a/src/entryWrapper.js b/src/entryWrapper.js new file mode 100644 index 0000000..ded038e --- /dev/null +++ b/src/entryWrapper.js @@ -0,0 +1,90 @@ +module.exports = (src) => { + return `'use strict'; +const {msg, block, balanceOf, loadContract, loadLibrary, isValidAddress, deployContract} = this.runtime +const { path: __path } = require(';').stateUtil(this) + +if (!msg.name) { + throw new Error("Method name is required.") +} + +${src} + +// block to scope our let/const +{ + const __name = typeof __metadata[msg.name] === 'string' ? __metadata[msg.name] : msg.name + if (["__on_deployed", "__on_received"].includes(msg.name) && !(__name in __contract)) { + // call event methods but contract does not have one + return; + } + if (!["__metadata", "address", "balance", "deployedBy"].includes(__name) && + (!(__name in __contract) || __name.startsWith('#'))) { + throw new Error("Method " + __name + " is private or does not exist."); + } + if (__metadata[__name] && __metadata[__name].decorators && __metadata[__name].decorators.includes('internal')) { + throw new Error("Method " + msg.name + " is internal.") + } + Object.defineProperties(__contract, Object.getOwnPropertyDescriptors(this)); + const __c = { + instance: __contract, + meta: __metadata + }; + if (__name === "__metadata") { + return __c; + } + const __checkType = (value, typeHolder, typeProp, info) => { + if (!typeHolder) return value + const types = typeHolder[typeProp] + if (types && Array.isArray(types)) { + let valueType = value === null ? 'null' : typeof value; + if (!types.includes(valueType)) { + if (valueType === 'object') { + valueType = Object.prototype.toString.call(value).split(' ')[1].slice(0, -1).toLowerCase() + if (types.includes(valueType)) return value; + } + + if(valueType === 'string' && types.includes('address')) { + if(isValidAddress(value)) { + return true; + } + } + + throw new Error("Error executing '" + __name + "': wrong " + info + " type. Expect: " + + types.join(" | ") + ". Got: " + valueType + "."); + } + } + return value; + } + if (typeof __c.instance[__name] === "function") { + // Check stateMutablitity + const isValidCallType = (d) => { + if (["__on_deployed", "__on_received"].includes(__name) || !__metadata[__name]) return true; // FIXME + if (!__metadata[__name].decorators) { + return false; + } + if (d === "transaction" && __metadata[__name].decorators.includes("payable")) { + return true; + } + return __metadata[__name].decorators.includes(d); + } + if (!isValidCallType(msg.callType)) { + throw new Error("Method " + __name + " is not decorated as @" + msg.callType + " and cannot be invoked in such mode"); + } + // Check input param type + const params = msg.params; + if (__metadata[__name] && __metadata[__name].params && __metadata[__name].params.length) { + __metadata[__name].params.forEach((p, index) => { + const pv = (params.length > index) ? params[index] : undefined; + __checkType(pv, p, 'type', "param '" + p.name + "'"); + }) + } + // Call the function, finally + if (typeof __c.instance.onready === 'function') __c.instance.onready() + const result = __c.instance[__name].apply(__c.instance, params); + return __checkType(result, __metadata[__name], 'returnType', "return"); + } + + if (typeof __c.instance.onready === 'function') __c.instance.onready() + return __checkType(__c.instance[__name], __metadata[__name], 'fieldType', 'field'); +} +` +} diff --git a/src/external.js b/src/external.js deleted file mode 100644 index 4b0c540..0000000 --- a/src/external.js +++ /dev/null @@ -1,64 +0,0 @@ -const template = require('@babel/template') -const { isWhitelistModule } = require('./common') - -class Icetea { - constructor (types, data) { - this.types = types - this.data = data - } - - run (path) { - const node = path.node - if (!node || node.callee.name !== 'require') { - return - } - const arguments_ = node.arguments - if (!arguments_.length || arguments_[0].type !== 'StringLiteral') { - return - } - const value = arguments_[0].value - const code = this.data[value] - - if (!code) { - if (!isWhitelistModule(value)) { - throw this.buildError('External source not found for non-whitelist moduel: ' + value, node) - } - return - } - - if (value.endsWith('.json')) { - path.replaceWith(this.types.valueToNode(code)) - } else { - const fn = template.expression(`(function () { - const module={exports:{}} - const exports=module.exports; - CODE - ;return module.exports - })()`) - path.replaceWith(fn({ - CODE: code - })) - } - } - - buildError (message, nodePath) { - if (nodePath && nodePath.buildCodeFrameError) { - throw nodePath.buildCodeFrameError(message) - } - throw new SyntaxError(message) - } -} - -module.exports = function (data) { - return function (babel) { - const { types: t } = babel - - return { - visitor: { - CallExpression: function (path) { - new Icetea(t, data).run(path) - } - } - } - } -} diff --git a/src/index.js b/src/index.js index 2c32b85..863576d 100644 --- a/src/index.js +++ b/src/index.js @@ -2,10 +2,12 @@ const prettier = require('prettier/standalone') const plugins = [require('prettier/parser-babylon')] const Terser = require('terser') const flowPlugin = require('@babel/plugin-transform-flow-strip-types') - -const plugin = require('./babel') -const makeWrapper = require('./wrapper') -const { transform, babelify } = require('./transform') +const { isNode } = require('./common') +const babelify = require('./babelify') +const mainPlugin = require('./plugins/main') +const import2require = require('./plugins/import2require') +const transform = require('./transform') +const makeWrapper = require('./entryWrapper') const { getWhiteListModules, setWhiteListModules, addWhiteListModule, removeWhiteListModule } = require('./common') const transpile = async (src, options = {}) => { @@ -14,36 +16,32 @@ const transpile = async (src, options = {}) => { minifyOpts = {}, prettier = false, prettierOpts = {}, - context = '/', - buildOptions = {}, + buildOpts = {}, project // for studio support file, to keep deadline, TODO: remove if possible } = options - // The decorated plugins should append this, but for now we add here to simplify - // src += ';const __contract = new __contract_name();const __metadata = {}' - // then, babelify it - src = babelify(src, [plugin]) - - // remove flow types - src = babelify(src, [flowPlugin]) + if (isNode() && project) { + throw new Error('options.project is only on browser') + } - // don't know, maybe babel not support decorators along to private property - src = await transform(src, context, project, buildOptions) + src = babelify(src, [mainPlugin, flowPlugin, import2require]) - // finally, wrap it - src = makeWrapper(src).trim() + // browserify it + src = await transform(src, project, buildOpts) - // preparation for minified + // Minify need semi to work properly src = prettify(src, { semi: true }) if (prettier) { src = prettify(src, prettierOpts) } else if (minify) { - src = doMinify(src, minifyOpts) + try { + src = doMinify(src, minifyOpts) + } catch (err) { + throw new Error(`Terser minify does not support some new node features, err=${err}`) + } } - // console.log(src) - return src } @@ -55,13 +53,7 @@ const simpleTranspile = (src, options = {}) => { prettierOpts = {} } = options - // The decorated plugins should append this, but for now we add here to simplify - // src += ';const __contract = new __contract_name();const __metadata = {}' - // then, babelify it - src = babelify(src, [plugin]) - - // remove flow types - src = babelify(src, [flowPlugin]) + src = babelify(src, [mainPlugin, flowPlugin, import2require]) // finally, wrap it src = makeWrapper(src).trim() diff --git a/src/plugins/browserify.js b/src/plugins/browserify.js new file mode 100644 index 0000000..193eb1d --- /dev/null +++ b/src/plugins/browserify.js @@ -0,0 +1,35 @@ +const template = require('@babel/template') + +module.exports = function ({ types: t }) { + return { + visitor: { + Program (path) { + const { node } = path + const main = node.body[0].expression + const entryIndex = main.arguments[2].elements[0].value - 1 + const entryPath = path.get('body')[0].get('expression.arguments')[0].get('properties')[entryIndex] + return processEntryFile(entryPath) + } + } + } +} + +function processEntryFile (path) { + const entryFunction = path.get('value.elements')[0] + const entryBody = entryFunction.get('body') + + const wrap = template.smart(` + function inner(require,module,exports) { + BODY + } + __return_value = inner.call(this,require,module,exports) + `) + entryBody.replaceWithMultiple(wrap({ BODY: entryBody.node })) + + const functionWrap = template.expression(` + function (require,module,exports) { + BODY + }.bind(this) + `) + entryFunction.replaceWithMultiple(functionWrap({ BODY: entryBody.node })) +} diff --git a/src/import2require.js b/src/plugins/import2require.js similarity index 89% rename from src/import2require.js rename to src/plugins/import2require.js index 0a15356..133b33e 100644 --- a/src/import2require.js +++ b/src/plugins/import2require.js @@ -9,13 +9,13 @@ class IceTea { const node = klass.node let source = `require('${node.source.value}')` const specifiers = node.specifiers - let lefts = [] + const lefts = [] let hasDefault = false const require1 = template.smart(` const LOCAL = SOURCE `) - for (let specifier of specifiers) { + for (const specifier of specifiers) { if (specifier.type === 'ImportNamespaceSpecifier' || specifier.type === 'ImportDefaultSpecifier') { klass.replaceWith( require1({ @@ -31,7 +31,7 @@ class IceTea { } } if (lefts.length > 0) { - let tmp = '{' + lefts.map(left => `${left[1]}: ${left[0]}`).join(', ') + '}' + const tmp = '{' + lefts.map(left => `${left[1]}: ${left[0]}`).join(', ') + '}' const require2 = template.smart(` const ${tmp} = SOURCE `) diff --git a/src/babel.js b/src/plugins/main.js similarity index 73% rename from src/babel.js rename to src/plugins/main.js index ed988a7..a847efe 100644 --- a/src/babel.js +++ b/src/plugins/main.js @@ -1,5 +1,8 @@ const template = require('@babel/template') const types = require('@babel/types') +const { METHODS, FORBIDDEN_STATE_TYPES } = require('../constant') +const { typeOf } = require('../common') + let numberOfContracts = 0 let contractName = '' let metadata = {} @@ -118,11 +121,12 @@ module.exports = function ({ types: t }) { class IceTea { constructor (types) { - this.types = types - this.__on_deployed = 0 + this.types = types // babel types + this[METHODS.__ON_DEPLOYED] = 0 // count __on_deployed this.className = '' this.metadata = {} this.klass = undefined + this.onDeployedPivot = 0 // appending state in exist ondeploy } classDeclaration (path) { @@ -142,7 +146,7 @@ class IceTea { const ctor = this.findConstructor(klass) if (ctor) { ctor.kind = 'method' - ctor.key.name = '__on_deployed' + ctor.key.name = METHODS.__ON_DEPLOYED this.replaceSuper(ctor) } @@ -171,7 +175,6 @@ class IceTea { throw this.buildError(`Only ${allowDecorators.join(', ')} are valid for a class field.`, node) } - const states = this.findDecorators(node, 'state') const internals = this.findDecorators(node, 'internal') const name = node.key.name || ('#' + node.key.id.name) // private property does not have key.name @@ -186,40 +189,10 @@ class IceTea { } } - if (states.length && node.value && !this.isConstant(node.value) && !isMethod(node)) { - const klassPath = path.parentPath.parentPath - let onDeploy = this.findMethod(klassPath.node, '__on_deployed') - if (!onDeploy) { - // class noname is only used for valid syntax - const fn = template.smart(` - class noname { - __on_deployed () {} - } - `) - klassPath.node.body.body.unshift(...fn().body.body) - onDeploy = klassPath.node.body.body[0] - this.metadata['__on_deployed'] = { - type: 'ClassMethod', - decorators: ['payable'] - } - } - const fn = template.smart(` - this.NAME = DEFAULT - `) - onDeploy.body.body.unshift(fn({ - NAME: name, - DEFAULT: node.value - })) - - // initialization is already added to constructor - // if (states.length === 0) { - // path.remove() - // } - } - - if (states.length > 0) { - if (isMethod(node)) { - throw this.buildError('Function cannot be marked as @state.', node) + if (this.isState(node)) { + const typeOfNode = typeOf(node) + if (FORBIDDEN_STATE_TYPES.includes(typeOfNode)) { + throw this.buildError(`${typeOfNode} cannot be marked as @state.`, node) } const indents = this.findMethodDefinition(this.klass, name) @@ -232,7 +205,20 @@ class IceTea { throw this.buildError(`${name} cannot be marked with both @state and @pure.`, node) } - this.wrapState(path) + if (!this.isConstant(node.value)) { + const klassPath = path.parentPath.parentPath + const onDeploy = this.findOrCreateOnDeployed(klassPath) + const fn = template.smart(` + this.NAME.value(DEFAULT) + `) + onDeploy.body.body.splice(this.onDeployedPivot, 0, fn({ + NAME: name, + DEFAULT: node.value + })) + this.onDeployedPivot += 1 + } + + this.wrapState(path, this.isConstant(node.value)) if (!this.metadata[name]) { const decoratorNames = decorators.map(decorator => decorator.expression.name) @@ -245,9 +231,27 @@ class IceTea { fieldType: getTypeName(node.typeAnnotation) } } + return } + if (this.isStateDependent(path) && !isMethod(node)) { + const klassPath = path.parentPath.parentPath + const onDeploy = this.findOrCreateOnDeployed(klassPath) + const fn = template.smart('this.PROPERTY = VALUE') + onDeploy.body.body.splice(this.onDeployedPivot, 0, fn({ + PROPERTY: name, + VALUE: node.value + })) + this.onDeployedPivot += 1 + + const property = template.smart(`NAME = msg.name === '${METHODS.__ON_DEPLOYED}' ? undefined : VALUE`) + path.replaceWith(property({ + NAME: name, + VALUE: node.value + })) + } + if (!this.metadata[name]) { this.metadata[name] = { type: node.type, @@ -255,22 +259,22 @@ class IceTea { } if (!isMethod(node)) { - this.metadata[name]['fieldType'] = getTypeName(node.typeAnnotation) + this.metadata[name].fieldType = getTypeName(node.typeAnnotation) if (decorators.length === 0) { if (name.startsWith('#')) { // private property - this.metadata[name]['decorators'].push('pure') + this.metadata[name].decorators.push('pure') } else { - this.metadata[name]['decorators'].push('internal') + this.metadata[name].decorators.push('internal') } } } else { - this.metadata[name]['returnType'] = getTypeName(node.value.returnType) - this.metadata[name]['params'] = getTypeParams(node.value.params) + this.metadata[name].returnType = getTypeName(node.value.returnType) + this.metadata[name].params = getTypeParams(node.value.params) if (decorators.length === 0) { if (name.startsWith('#')) { // private function - this.metadata[name]['decorators'].push('view') + this.metadata[name].decorators.push('view') } else { - this.metadata[name]['decorators'].push('internal') + this.metadata[name].decorators.push('internal') } } } @@ -291,14 +295,14 @@ class IceTea { } const name = klass.key.name || ('#' + klass.key.id.name) - if (name === '__on_received') { - throw this.buildError('__on_received cannot be specified directly.', klass) + if (name === METHODS.__ON_RECEIVED) { + throw this.buildError(`${METHODS.__ON_RECEIVED} cannot be specified directly.`, klass) } - if (name === '__on_deployed') { - if (this.__on_deployed > 0) { - throw this.buildError('__on_deployed cannot be specified directly.', klass) + if (name === METHODS.__ON_DEPLOYED) { + if (this[METHODS.__ON_DEPLOYED] > 0) { + throw this.buildError(`${METHODS.__ON_DEPLOYED} cannot be specified directly.`, klass) } - this.__on_deployed += 1 + this[METHODS.__ON_DEPLOYED] += 1 } if (name.startsWith('#')) { const payables = this.findDecorators(klass, 'payable') @@ -319,7 +323,7 @@ class IceTea { params: getTypeParams(klass.params) } if (decorators.length === 0) { - if (name.startsWith('#') || name === '__on_deployed') { // private method + if (name.startsWith('#') || name === METHODS.__ON_DEPLOYED) { // private method this.metadata[name].decorators.push('view') } else { this.metadata[name].decorators.push('internal') @@ -333,10 +337,10 @@ class IceTea { if (payables.length === 0 && klass.body.body.length > 0) { throw this.buildError('Non-payable @onreceive function should have empty body.', klass) } - if (this.metadata['__on_received']) { + if (this.metadata[METHODS.__ON_RECEIVED]) { throw this.buildError('Only one @onreceive is allowed per class.', klass) } - this.metadata['__on_received'] = klass.key.name + this.metadata[METHODS.__ON_RECEIVED] = klass.key.name } this.deleteDecorators(klass, this.findDecorators(klass, ...METHOD_DECORATORS)) @@ -377,7 +381,7 @@ class IceTea { } if (body.expression.callee.type === 'Super') { const superTemplate = template.smart(` - super.__on_deployed(ARGUMENTS) + super.${METHODS.__ON_DEPLOYED}(ARGUMENTS) `) body = superTemplate({ ARGUMENTS: body.expression.arguments @@ -387,22 +391,19 @@ class IceTea { }) } - wrapState (path) { + wrapState (path, useInitValue = true) { const { node } = path const name = node.key.name || ('#' + node.key.id.name) const wrap = template.smart(` class noname { - get NAME() { - return __proxyState$Get("NAME", DEFAULT); - } - set NAME(value) { - this.setState("NAME", __proxyState$Unwrap(value)); - } + NAME = __path('NAME', DEFAULT) } - `) + `, { + plugins: ['classProperties'] + }) path.replaceWithMultiple(wrap({ NAME: name, - DEFAULT: node.value + DEFAULT: useInitValue ? node.value : undefined }).body.body) } @@ -468,6 +469,9 @@ class IceTea { } isConstant (value) { + if (value === null || value === undefined) { + return true + } const { types } = this if (types.isLiteral(value) && value.type !== 'TemplateLiteral') { return true @@ -485,6 +489,65 @@ class IceTea { return property.key.type !== 'TemplateLiteral' && this.isConstant(property.value) }) } + if (['FunctionExpression', 'ArrowFunctionExpression'].includes(value.type)) { + const { body } = value + if (body.type === 'BlockStatement') { + const returnStatement = body.body.find(block => block.type === 'ReturnStatement') + if (!returnStatement) { + return this.isConstant(returnStatement) + } + return this.isConstant(returnStatement.argument) + } + return this.isConstant(body) + } return false } + + isState (node) { + const states = this.findDecorators(node, 'state') + return states.length > 0 + } + + isStateDependent (path) { + let isDependent = false + path.traverse({ + CallExpression (path) { + const { node } = path + if (!node.callee || !node.callee.property || !node.callee.object || !node.callee.object.object) { + return + } + if (node.callee.type !== 'MemberExpression') { + return + } + if (node.callee.property.name !== 'value') { + return + } + if (node.callee.object.object.type !== 'ThisExpression') { + return + } + isDependent = true + } + }) + return isDependent + } + + findOrCreateOnDeployed (klassPath) { + let onDeploy = this.findMethod(klassPath.node, METHODS.__ON_DEPLOYED) + if (!onDeploy) { + // class noname is only used for valid syntax + const fn = template.smart(` + class noname { + ${METHODS.__ON_DEPLOYED} () {} + } + `) + klassPath.node.body.body.unshift(...fn().body.body) + onDeploy = klassPath.node.body.body[0] + this.metadata[METHODS.__ON_DEPLOYED] = { + type: 'ClassMethod', + decorators: ['payable'] + } + this.onDeployedPivot = 0 + } + return onDeploy + } } diff --git a/src/transform.js b/src/transform.js new file mode 100644 index 0000000..5651d6a --- /dev/null +++ b/src/transform.js @@ -0,0 +1,134 @@ +const traverse = require('@babel/traverse').default +const babelParser = require('@babel/parser') +const tempy = require('tempy') +const fs = require('fs') +const fsp = fs.promises +const path = require('path') +const url = require('url') +const axios = require('axios') +const mkdirp = require('mkdirp') +const template = require('@babel/template') +const browserify = require('browserify') +const { isNode, plugins, getWhiteListModules, isHttp } = require('./common') +const babelify = require('./babelify') +const browserifyPlugin = require('./plugins/browserify') +const makeEntryWrapper = require('./entryWrapper') +const makeWrapper = require('./wrapper') + +const transform = async (src, project = null, options = {}) => { + const { remote, basedir = '.' } = options + const parsed = babelParser.parse(src, { + sourceType: 'module', + plugins + }) + const requires = {} + traverse(parsed, { + CallExpression: ({ node }) => { + if (!node || node.callee.name !== 'require') { + return + } + const arguments_ = node.arguments + if (arguments_.length !== 1 || arguments_[0].type !== 'StringLiteral') { + return + } + const value = arguments_[0].value + requires[value] = value + } + }) + + const dir = tempy.directory() + + if (isNode()) { + src = await transformUsingFs(src, dir, requires, remote, basedir) + } + return src +} + +async function transformUsingFs (src, dir, requires, remote, basedir) { + const ignores = getWhiteListModules() + await Promise.all(Object.keys(requires).map(async value => { + if (isHttp(value)) { + const data = (await axios.get(value)).data + const tmpdir = '.tmp-dir-' + Math.random().toFixed(20).slice(2) + const parsed = new url.URL(value) + const filename = path.basename(parsed.pathname) + mkdirp.sync(`${dir}/${tmpdir}`) + const filepath = `${dir}/${tmpdir}/${filename}` + if (typeof data === 'object') { + await fsp.writeFile(filepath, JSON.stringify(data)) + } else { + await fsp.writeFile(filepath, data) + } + requires[value] = filepath + return true + } + if (remote && remote[value]) { + ignores.push(value) + } + delete requires[value] + return true + })) + + src = babelify(src, [function ({ types: t }) { + return { + visitor: { + CallExpression: function (path) { + const node = path.node + if (!node || node.callee.name !== 'require') { + return + } + const arguments_ = node.arguments + if (!arguments_.length || arguments_[0].type !== 'StringLiteral') { + return + } + const value = arguments_[0].value + const filename = requires[value] + if (!filename) { + return + } + const fn = template.expression('require(\'NAME\')') + path.replaceWith(fn({ + NAME: filename + })) + } + } + } + }]) + + src = makeEntryWrapper(src).trim() + + const tmpfile = '.tmp-sunseed-' + Math.random().toFixed(20).slice(2) + '.js' + const tmpfilepath = `${basedir}/${tmpfile}` + await fsp.writeFile(tmpfilepath, src) + try { + src = (await bundle(tmpfilepath, ignores, basedir)).toString() + await fsp.unlink(tmpfilepath) + } catch (err) { + await fsp.unlink(tmpfilepath) + throw err + } + + for (const key in requires) { + src = src.replace(new RegExp(requires[key], 'g'), key) + } + + src = babelify(src, [browserifyPlugin]) + + src = makeWrapper(src).trim() + + return src +} + +function bundle (filepath, ignores, basedir) { + return new Promise((resolve, reject) => { + const bundle = browserify(filepath, { node: true, builtins: false, basedir }).external(ignores).bundle() + bundle.on('error', reject) + const tmpfile = tempy.directory() + '/.tmp-browserify-' + Math.random().toFixed(20).slice(2) + bundle.pipe(fs.createWriteStream(tmpfile)) + bundle.on('end', () => { + fsp.readFile(tmpfile).then(resolve).catch(reject) + }) + }) +} + +module.exports = transform diff --git a/src/transform/index.js b/src/transform/index.js deleted file mode 100644 index aecd8fd..0000000 --- a/src/transform/index.js +++ /dev/null @@ -1,126 +0,0 @@ -const url = require('url') -const fs = require('fs') -const path = require('path') -const axios = require('axios') -const babelParser = require('@babel/parser') -const traverse = require('@babel/traverse').default -const { plugins, isHttp, isNodeModule, isWhitelistModule } = require('../common') -const resolveExternal = require('../external') -const importToRequire = require('../import2require') -const babelify = require('./babelify') - -/** - * transform bundle library with contract source - * @param {string} src - contract source require external library - * @param {string} context - for recursive require - * @param {Object} project - support icetea-studio (does not use fs) - * @param {Object} options - bundle module config - */ -exports.transform = async (src, context = '/', project = null, options = {}) => { - src = await babelify(src, [importToRequire]) - const parsed = babelParser.parse(src, { - sourceType: 'module', - plugins - }) - let requires = {} - - traverse(parsed, { - CallExpression: ({ node }) => { - if (!node || node.callee.name !== 'require') { - return - } - const arguments_ = node.arguments - if (arguments_.length !== 1 || arguments_[0].type !== 'StringLiteral') { - return - } - const value = arguments_[0].value - requires[value] = value - } - }) - - await Promise.all(Object.keys(requires).map(async value => { - if (isWhitelistModule(value) || (options.remote && options.remote[value])) { - delete requires[value] - return - } - if (isHttp(value)) { - if (!['.js', '.json'].includes(path.extname(value))) { - throw new Error('"require" supports only .js and .json files.') - } - const data = (await axios.get(value)).data - if (typeof data === 'string') { - requires[value] = await exports.transform(data, value, null, options) - } else { - requires[value] = data - } - return - } - if (isHttp(context)) { - if (isNodeModule(value)) { - throw new Error('Cannot use node_modules in remote URL.') - } - if (!['.js', '.json'].includes(path.extname(value))) { - throw new Error('"require" supports only .js and .json files.') - } - const data = (await axios.get(url.resolve(context, value))).data - if (typeof data === 'string') { - // try to parse json string - requires[value] = await exports.transform(data, url.resolve(context, value), null, options) - } else { - requires[value] = data - } - return - } - - // if you want to use bundle instead of blockchain node_modules - const localFlag = '@local' - let moduleName = value - if (moduleName.endsWith(localFlag)) { - moduleName = moduleName.slice(0, -localFlag.length) - } - - let filePath - if (isNodeModule(moduleName)) { - filePath = require.resolve(`${moduleName}`) // to ignore webpack warning - } else { - if (project) { - filePath = path.join(context, value) - } else { - filePath = require.resolve(`${path.resolve(context, value)}`) - } - } - - if (!['.js', '.json'].includes(path.extname(filePath))) { - throw new Error('"require" supports only .js and .json files.') - } - let data - if (project) { - data = project.getFile(filePath).getData().toString() - } else { - data = fs.readFileSync(filePath).toString() - } - try { - data = JSON.parse(data) - requires[value] = data - } catch (err) { - if (err instanceof SyntaxError) { - requires[value] = await exports.transform(data, path.dirname(filePath), project, options) - } else { - throw err - } - } - })) - - if (Object.keys(requires).length === 0) { - return src - } - - // first, preprocess - src = await babelify(src, [resolveExternal(requires)]) - if (src.endsWith(';')) { - src = src.slice(0, -1) // for redundancy Semicolon - } - return src -} - -exports.babelify = babelify diff --git a/src/wrapper.js b/src/wrapper.js index c0137de..b97d04e 100644 --- a/src/wrapper.js +++ b/src/wrapper.js @@ -1,156 +1,9 @@ -module.exports = (src, { - noState -} = {}) => { - - const stateFunc = noState ? '' : ` - const __proxyState$Unwrap = value => { - const real = value && value.__proxyState$RealObj; - return typeof real !== 'function' ? value : real.call(value); - } - - const __proxyState$Get = (name, defValue) => { - - // this will throw if msg.callType if 'pure' - const state = this.getState(name, defValue); +module.exports = (src) => { + return ` + let __return_value - // no need to check with Object.isFrozen since we can use msg.type - // note that typeof null is 'object' - if (state === null || typeof state !== 'object' || 'view' === msg.callType) { - return state; - } - - const saveState = () => this.setState(name, state); + ${src} - const makeProxy = realObj => { - const handler = { - get (target, property, receiver) { - if (property === '__proxyState$RealObj') { - return () => realObj; - } - - const v = Reflect.get(target, property, receiver); - if (v === null || typeof v !== 'object') { - return v; - } - return makeProxy(v) - }, - - set (target, prop, value, receiver) { - const r = Reflect.set(target, prop, __proxyState$Unwrap(value), receiver); - saveState(); - return r; - }, - - defineProperty (target, property, desc) { - if (desc.value) { - desc.value = __proxyState$Unwrap(desc.value) - } - const r = Reflect.defineProperty(target, property, desc); - saveState(); - return r; - }, - - deleteProperty (target, property) { - const r = Reflect.deleteProperty(target, property); - saveState(); - return r; - } - } - - return new Proxy(realObj, handler); - } - - return makeProxy(state) - } + return __return_value ` - - return `'use strict'; -const {msg, block, balanceOf, loadContract, loadLibrary, isValidAddress, deployContract} = this.runtime - -if (!msg.name) { - throw new Error("Method name is required.") -} - -${stateFunc} - -${src} - -// block to scope our let/const -{ - const __name = typeof __metadata[msg.name] === 'string' ? __metadata[msg.name] : msg.name - if (["__on_deployed", "__on_received"].includes(msg.name) && !(__name in __contract)) { - // call event methods but contract does not have one - return; - } - if (!["__metadata", "address", "balance", "deployedBy"].includes(__name) && - (!(__name in __contract) || __name.startsWith('#'))) { - throw new Error("Method " + __name + " is private or does not exist."); - } - if (__metadata[__name] && __metadata[__name].decorators && __metadata[__name].decorators.includes('internal')) { - throw new Error("Method " + msg.name + " is internal.") - } - Object.defineProperties(__contract, Object.getOwnPropertyDescriptors(this)); - const __c = { - instance: __contract, - meta: __metadata - }; - if (__name === "__metadata") { - return __c; - } - const __checkType = (value, typeHolder, typeProp, info) => { - if (!typeHolder) return value - const types = typeHolder[typeProp] - if (types && Array.isArray(types)) { - let valueType = value === null ? 'null' : typeof value; - if (!types.includes(valueType)) { - if (valueType === 'object') { - valueType = Object.prototype.toString.call(value).split(' ')[1].slice(0, -1).toLowerCase() - if (types.includes(valueType)) return value; - } - - if(valueType === 'string' && types.includes('address')) { - if(isValidAddress(value)) { - return true; - } - } - - throw new Error("Error executing '" + __name + "': wrong " + info + " type. Expect: " + - types.join(" | ") + ". Got: " + valueType + "."); - } - } - return value; - } - if (typeof __c.instance[__name] === "function") { - // Check stateMutablitity - const isValidCallType = (d) => { - if (["__on_deployed", "__on_received"].includes(__name) || !__metadata[__name]) return true; // FIXME - if (!__metadata[__name].decorators) { - return false; - } - if (d === "transaction" && __metadata[__name].decorators.includes("payable")) { - return true; - } - return __metadata[__name].decorators.includes(d); - } - if (!isValidCallType(msg.callType)) { - throw new Error("Method " + __name + " is not decorated as @" + msg.callType + " and cannot be invoked in such mode"); - } - // Check input param type - const params = msg.params; - if (__metadata[__name] && __metadata[__name].params && __metadata[__name].params.length) { - __metadata[__name].params.forEach((p, index) => { - const pv = (params.length > index) ? params[index] : undefined; - __checkType(pv, p, 'type', "param '" + p.name + "'"); - }) - } - // Call the function, finally - if (typeof __c.instance.onready === 'function') __c.instance.onready() - const result = __c.instance[__name].apply(__c.instance, params); - return __checkType(result, __metadata[__name], 'returnType', "return"); - } - - if (typeof __c.instance.onready === 'function') __c.instance.onready() - return __checkType(__c.instance[__name], __metadata[__name], 'fieldType', 'field'); } -` -} \ No newline at end of file diff --git a/test/contract.test.js b/test/contract.test.js index 5d8644b..dbf508d 100644 --- a/test/contract.test.js +++ b/test/contract.test.js @@ -1,6 +1,7 @@ const Terser = require('terser') -const plugin = require('../src/babel') -const { babelify, transform } = require('../src/transform') +const plugin = require('../src/plugins/main') +const babelify = require('../src/babelify') +const transform = require('../src/transform') test('constructor to deploy', () => { let src = ` @@ -45,8 +46,19 @@ test('state', () => { } ` src = babelify(src, [plugin]) - src = Terser.minify(src).code - expect(src).toBe('class A{get property(){const e=this.getState("property");if(\"object\"!=typeof e)return e;const t=this.setState,r={get(e,t,o){const p=Object.getOwnPropertyDescriptor(e,t),n=Reflect.get(e,t,o);return(!p||p.writable||p.configurable)&&"object"==typeof n?new Proxy(n,r):n},defineProperty(r,o,p){const n=Reflect.defineProperty(r,o,p);return t("property",e),n},deleteProperty(r,o){const p=Reflect.deleteProperty(r,o);return t("property",e),p}};return new Proxy(e,r)}set property(e){this.setState("property",e)}}const __contract=new A,__metadata={property:{type:"ClassProperty",decorators:["state","internal"],fieldType:"any"}};') + expect(src).toBe(`class A { + property = __path("property"); +} + +const __contract = new A(); + +const __metadata = { + property: { + type: "ClassProperty", + decorators: ["state", "internal"], + fieldType: "any" + } +};`) }) test('non constant', () => { @@ -76,53 +88,22 @@ test('non constant state init', () => { let src = ` @contract class A { @state property = Math.PI + xyz = this.property.value() + + constructor() { + this.x = 1 + } } ` src = babelify(src, [plugin]) expect(src).toBe(`class A { - __on_deployed() { - this.property = Math.PI; - } - - get property() { - const state = this.getState("property", Math.PI); - - if (typeof state !== "object") { - return state; - } - - const setState = this.setState; - const handler = { - get(target, property, receiver) { - const desc = Object.getOwnPropertyDescriptor(target, property); - const value = Reflect.get(target, property, receiver); - if (desc && !desc.writable && !desc.configurable) return value; - - if (typeof value === 'object') { - return new Proxy(value, handler); - } + property = __path("property"); + xyz = msg.name === '__on_deployed' ? undefined : this.property.value(); - return value; - }, - - defineProperty(target, property, descriptor) { - const result = Reflect.defineProperty(target, property, descriptor); - setState("property", state); - return result; - }, - - deleteProperty(target, property) { - const result = Reflect.deleteProperty(target, property); - setState("property", state); - return result; - } - - }; - return new Proxy(state, handler); - } - - set property(value) { - this.setState("property", value); + __on_deployed() { + this.property.value(Math.PI); + this.xyz = this.property.value(); + this.x = 1; } } @@ -130,14 +111,21 @@ test('non constant state init', () => { const __contract = new A(); const __metadata = { - __on_deployed: { - type: "ClassMethod", - decorators: ["payable"] - }, property: { type: "ClassProperty", decorators: ["state", "internal"], fieldType: "any" + }, + xyz: { + type: "ClassProperty", + decorators: ["internal"], + fieldType: "any" + }, + __on_deployed: { + type: "ClassMethod", + decorators: ["view"], + returnType: "any", + params: [] } };`) }) @@ -147,10 +135,188 @@ test('json remote', async () => { const test = require('https://gist.githubusercontent.com/Sotatek-DucPham/4b06f0eafc710a9ce54615c5d3d7e98d/raw/f1cf29bdac9d09d59f996f512c83f6d09c0710a2/test.json') @contract class A {} ` - src = await transform(src) src = babelify(src, [plugin]) - src = Terser.minify(src).code - expect(src).toBe('const test={test:1};class A{}const __contract=new A,__metadata={};') + try { + src = await transform(src) + } catch (err) { + console.log(err) + } + expect(src).toBe(`let __return_value + + (function () { + function r(e, n, t) { + function o(i, f) { + if (!n[i]) { + if (!e[i]) { + var c = "function" == typeof require && require; + if (!f && c) return c(i, !0); + if (u) return u(i, !0); + var a = new Error("Cannot find module '" + i + "'"); + throw a.code = "MODULE_NOT_FOUND", a; + } + + var p = n[i] = { + exports: {} + }; + e[i][0].call(p.exports, function (r) { + var n = e[i][1][r]; + return o(n || r); + }, p, p.exports, r, e, n, t); + } + + return n[i].exports; + } + + for (var u = "function" == typeof require && require, i = 0; i < t.length; i++) o(t[i]); + + return o; + } + + return r; +})()({ + 1: [function (require, module, exports) { + { + function inner(require, module, exports) { + { + 'use strict'; + + const { + msg, + block, + balanceOf, + loadContract, + loadLibrary, + isValidAddress, + deployContract + } = this.runtime; + + const { + path: __path + } = require(';').stateUtil(this); + + if (!msg.name) { + throw new Error("Method name is required."); + } + + const test = require("https://gist.githubusercontent.com/Sotatek-DucPham/4b06f0eafc710a9ce54615c5d3d7e98d/raw/f1cf29bdac9d09d59f996f512c83f6d09c0710a2/test.json"); + + class A {} + + const __contract = new A(); + + const __metadata = {}; // block to scope our let/const + + { + const __name = typeof __metadata[msg.name] === 'string' ? __metadata[msg.name] : msg.name; + + if (["__on_deployed", "__on_received"].includes(msg.name) && !(__name in __contract)) { + // call event methods but contract does not have one + return; + } + + if (!["__metadata", "address", "balance", "deployedBy"].includes(__name) && (!(__name in __contract) || __name.startsWith('#'))) { + throw new Error("Method " + __name + " is private or does not exist."); + } + + if (__metadata[__name] && __metadata[__name].decorators && __metadata[__name].decorators.includes('internal')) { + throw new Error("Method " + msg.name + " is internal."); + } + + Object.defineProperties(__contract, Object.getOwnPropertyDescriptors(this)); + const __c = { + instance: __contract, + meta: __metadata + }; + + if (__name === "__metadata") { + return __c; + } + + const __checkType = (value, typeHolder, typeProp, info) => { + if (!typeHolder) return value; + const types = typeHolder[typeProp]; + + if (types && Array.isArray(types)) { + let valueType = value === null ? 'null' : typeof value; + + if (!types.includes(valueType)) { + if (valueType === 'object') { + valueType = Object.prototype.toString.call(value).split(' ')[1].slice(0, -1).toLowerCase(); + if (types.includes(valueType)) return value; + } + + if (valueType === 'string' && types.includes('address')) { + if (isValidAddress(value)) { + return true; + } + } + + throw new Error("Error executing '" + __name + "': wrong " + info + " type. Expect: " + types.join(" | ") + ". Got: " + valueType + "."); + } + } + + return value; + }; + + if (typeof __c.instance[__name] === "function") { + // Check stateMutablitity + const isValidCallType = d => { + if (["__on_deployed", "__on_received"].includes(__name) || !__metadata[__name]) return true; // FIXME + + if (!__metadata[__name].decorators) { + return false; + } + + if (d === "transaction" && __metadata[__name].decorators.includes("payable")) { + return true; + } + + return __metadata[__name].decorators.includes(d); + }; + + if (!isValidCallType(msg.callType)) { + throw new Error("Method " + __name + " is not decorated as @" + msg.callType + " and cannot be invoked in such mode"); + } // Check input param type + + + const params = msg.params; + + if (__metadata[__name] && __metadata[__name].params && __metadata[__name].params.length) { + __metadata[__name].params.forEach((p, index) => { + const pv = params.length > index ? params[index] : undefined; + + __checkType(pv, p, 'type', "param '" + p.name + "'"); + }); + } // Call the function, finally + + + if (typeof __c.instance.onready === 'function') __c.instance.onready(); + + const result = __c.instance[__name].apply(__c.instance, params); + + return __checkType(result, __metadata[__name], 'returnType', "return"); + } + + if (typeof __c.instance.onready === 'function') __c.instance.onready(); + return __checkType(__c.instance[__name], __metadata[__name], 'fieldType', 'field'); + } + } + } + + __return_value = inner.call(this, require, module, exports); + } + }.bind(this), { + "https://gist.githubusercontent.com/Sotatek-DucPham/4b06f0eafc710a9ce54615c5d3d7e98d/raw/f1cf29bdac9d09d59f996f512c83f6d09c0710a2/test.json": 2, + ";": ";" + }], + 2: [function (require, module, exports) { + module.exports = { + "test": 1 + }; + }, {}] +}, {}, [1]); + + return __return_value`) }) test('js remote', async () => { @@ -158,10 +324,10 @@ test('js remote', async () => { const test = require('https://gist.githubusercontent.com/Sotatek-DucPham/2ff57e279116fd9e7ee3ae39b4e81860/raw/d5c5c2716d60b507c7f52ac99b7d5653230ed513/test.js') @contract class A {} ` - src = await transform(src) src = babelify(src, [plugin]) - src = Terser.minify(src).code - expect(src).toBe('const test=function(){const t={exports:{}};t.exports;return t.exports=()=>"test",t.exports}();class A{}const __contract=new A,__metadata={};') + src = await transform(src) + src = Terser.minify(src, { parse: { bare_returns: true } }).code + expect(src).toBe('let __return_value;return function e(t,r,n){function o(i,s){if(!r[i]){if(!t[i]){var c="function"==typeof require&&require;if(!s&&c)return c(i,!0);if(a)return a(i,!0);var d=new Error("Cannot find module \'"+i+"\'");throw d.code="MODULE_NOT_FOUND",d}var u=r[i]={exports:{}};t[i][0].call(u.exports,(function(e){return o(t[i][1][e]||e)}),u,u.exports,e,t,r,n)}return r[i].exports}for(var a="function"==typeof require&&require,i=0;i{if(!r)return t;const a=r[n];if(a&&Array.isArray(a)){let r=null===t?"null":typeof t;if(!a.includes(r)){if("object"===r&&(r=Object.prototype.toString.call(t).split(" ")[1].slice(0,-1).toLowerCase(),a.includes(r)))return t;if("string"===r&&a.includes("address")&&i(t))return!0;throw new Error("Error executing \'"+e+"\': wrong "+o+" type. Expect: "+a.join(" | ")+". Got: "+r+".")}}return t};if("function"==typeof r.instance[e]){if(!(t=>!(!["__on_deployed","__on_received"].includes(e)&&l[e])||!!l[e].decorators&&(!("transaction"!==t||!l[e].decorators.includes("payable"))||l[e].decorators.includes(t)))(t.callType))throw new Error("Method "+e+" is not decorated as @"+t.callType+" and cannot be invoked in such mode");const o=t.params;l[e]&&l[e].params&&l[e].params.length&&l[e].params.forEach((e,t)=>{const r=o.length>t?o[t]:void 0;n(r,e,"type","param \'"+e.name+"\'")}),"function"==typeof r.instance.onready&&r.instance.onready();const a=r.instance[e].apply(r.instance,o);return n(a,l[e],"returnType","return")}return"function"==typeof r.instance.onready&&r.instance.onready(),n(r.instance[e],l[e],"fieldType","field")}}}.call(this,e,t,r)}.bind(this),{"https://gist.githubusercontent.com/Sotatek-DucPham/2ff57e279116fd9e7ee3ae39b4e81860/raw/d5c5c2716d60b507c7f52ac99b7d5653230ed513/test.js":2,";":";"}],2:[function(e,t,r){t.exports=()=>"test"},{}]},{},[1]),__return_value;') }) test('whitelist require', async () => { @@ -171,10 +337,10 @@ test('whitelist require', async () => { @pure test() { return _.isEmpty([]) } } ` - src = await transform(src) src = babelify(src, [plugin]) - src = Terser.minify(src).code - expect(src).toBe('const _=require("lodash");class A{test(){return _.isEmpty([])}}const __contract=new A,__metadata={test:{type:"ClassMethod",decorators:["pure"],returnType:"any",params:[]}};') + src = await transform(src) + src = Terser.minify(src, { parse: { bare_returns: true } }).code + expect(src).toBe('let __return_value;return function e(r,t,n){function o(i,s){if(!t[i]){if(!r[i]){var c="function"==typeof require&&require;if(!s&&c)return c(i,!0);if(a)return a(i,!0);var d=new Error("Cannot find module \'"+i+"\'");throw d.code="MODULE_NOT_FOUND",d}var l=t[i]={exports:{}};r[i][0].call(l.exports,(function(e){return o(r[i][1][e]||e)}),l,l.exports,e,r,t,n)}return t[i].exports}for(var a="function"==typeof require&&require,i=0;i{if(!t)return r;const a=t[n];if(a&&Array.isArray(a)){let t=null===r?"null":typeof r;if(!a.includes(t)){if("object"===t&&(t=Object.prototype.toString.call(r).split(" ")[1].slice(0,-1).toLowerCase(),a.includes(t)))return r;if("string"===t&&a.includes("address")&&i(r))return!0;throw new Error("Error executing \'"+e+"\': wrong "+o+" type. Expect: "+a.join(" | ")+". Got: "+t+".")}}return r};if("function"==typeof t.instance[e]){if(!(r=>!(!["__on_deployed","__on_received"].includes(e)&&p[e])||!!p[e].decorators&&(!("transaction"!==r||!p[e].decorators.includes("payable"))||p[e].decorators.includes(r)))(r.callType))throw new Error("Method "+e+" is not decorated as @"+r.callType+" and cannot be invoked in such mode");const o=r.params;p[e]&&p[e].params&&p[e].params.length&&p[e].params.forEach((e,r)=>{const t=o.length>r?o[r]:void 0;n(t,e,"type","param \'"+e.name+"\'")}),"function"==typeof t.instance.onready&&t.instance.onready();const a=t.instance[e].apply(t.instance,o);return n(a,p[e],"returnType","return")}return"function"==typeof t.instance.onready&&t.instance.onready(),n(t.instance[e],p[e],"fieldType","field")}}}.call(this,e,r,t)}.bind(this),{";":";",lodash:"lodash"}]},{},[1]),__return_value;') }) test('whitelist special', async () => { @@ -184,22 +350,10 @@ test('whitelist special', async () => { @pure test() { return _.isEmpty([]) } } ` - src = await transform(src) src = babelify(src, [plugin]) - src = Terser.minify(src).code - expect(src).toBe('const _=require(";");class A{test(){return _.isEmpty([])}}const __contract=new A,__metadata={test:{type:"ClassMethod",decorators:["pure"],returnType:"any",params:[]}};') -}) - -test('prefer local module', async () => { - let src = ` - const moment = require('moment@local') - @contract class A { - @pure test() { return moment().format() } - } - ` - await transform(src) - babelify(src, [plugin]) - Terser.minify(src) + src = await transform(src) + src = Terser.minify(src, { parse: { bare_returns: true } }).code + expect(src).toBe('let __return_value;return function e(r,t,n){function o(i,s){if(!t[i]){if(!r[i]){var c="function"==typeof require&&require;if(!s&&c)return c(i,!0);if(a)return a(i,!0);var d=new Error("Cannot find module \'"+i+"\'");throw d.code="MODULE_NOT_FOUND",d}var u=t[i]={exports:{}};r[i][0].call(u.exports,(function(e){return o(r[i][1][e]||e)}),u,u.exports,e,r,t,n)}return t[i].exports}for(var a="function"==typeof require&&require,i=0;i{if(!t)return r;const a=t[n];if(a&&Array.isArray(a)){let t=null===r?"null":typeof r;if(!a.includes(t)){if("object"===t&&(t=Object.prototype.toString.call(r).split(" ")[1].slice(0,-1).toLowerCase(),a.includes(t)))return r;if("string"===t&&a.includes("address")&&i(r))return!0;throw new Error("Error executing \'"+e+"\': wrong "+o+" type. Expect: "+a.join(" | ")+". Got: "+t+".")}}return r};if("function"==typeof t.instance[e]){if(!(r=>!(!["__on_deployed","__on_received"].includes(e)&&p[e])||!!p[e].decorators&&(!("transaction"!==r||!p[e].decorators.includes("payable"))||p[e].decorators.includes(r)))(r.callType))throw new Error("Method "+e+" is not decorated as @"+r.callType+" and cannot be invoked in such mode");const o=r.params;p[e]&&p[e].params&&p[e].params.length&&p[e].params.forEach((e,r)=>{const t=o.length>r?o[r]:void 0;n(t,e,"type","param \'"+e.name+"\'")}),"function"==typeof t.instance.onready&&t.instance.onready();const a=t.instance[e].apply(t.instance,o);return n(a,p[e],"returnType","return")}return"function"==typeof t.instance.onready&&t.instance.onready(),n(t.instance[e],p[e],"fieldType","field")}}}.call(this,e,r,t)}.bind(this),{";":";"}]},{},[1]),__return_value;') }) test('prefer remote module', async () => { @@ -209,24 +363,17 @@ test('prefer remote module', async () => { @pure test() { return ms(100) } } ` - src = await transform(src, '/', null, { remote: { ms: true } }) - expect(src).toBe(`const ms = require('ms'); - -@contract -class A { - @pure - test() { - return ms(100); - } - -}`) + src = babelify(src, [plugin]) + src = await transform(src, null, { remote: { ms: true } }) + src = Terser.minify(src, { parse: { bare_returns: true } }).code + expect(src).toBe('let __return_value;return function e(r,t,n){function o(i,s){if(!t[i]){if(!r[i]){var c="function"==typeof require&&require;if(!s&&c)return c(i,!0);if(a)return a(i,!0);var d=new Error("Cannot find module \'"+i+"\'");throw d.code="MODULE_NOT_FOUND",d}var u=t[i]={exports:{}};r[i][0].call(u.exports,(function(e){return o(r[i][1][e]||e)}),u,u.exports,e,r,t,n)}return t[i].exports}for(var a="function"==typeof require&&require,i=0;i{if(!t)return r;const a=t[n];if(a&&Array.isArray(a)){let t=null===r?"null":typeof r;if(!a.includes(t)){if("object"===t&&(t=Object.prototype.toString.call(r).split(" ")[1].slice(0,-1).toLowerCase(),a.includes(t)))return r;if("string"===t&&a.includes("address")&&i(r))return!0;throw new Error("Error executing \'"+e+"\': wrong "+o+" type. Expect: "+a.join(" | ")+". Got: "+t+".")}}return r};if("function"==typeof t.instance[e]){if(!(r=>!(!["__on_deployed","__on_received"].includes(e)&&p[e])||!!p[e].decorators&&(!("transaction"!==r||!p[e].decorators.includes("payable"))||p[e].decorators.includes(r)))(r.callType))throw new Error("Method "+e+" is not decorated as @"+r.callType+" and cannot be invoked in such mode");const o=r.params;p[e]&&p[e].params&&p[e].params.length&&p[e].params.forEach((e,r)=>{const t=o.length>r?o[r]:void 0;n(t,e,"type","param \'"+e.name+"\'")}),"function"==typeof t.instance.onready&&t.instance.onready();const a=t.instance[e].apply(t.instance,o);return n(a,p[e],"returnType","return")}return"function"==typeof t.instance.onready&&t.instance.onready(),n(t.instance[e],p[e],"fieldType","field")}}}.call(this,e,r,t)}.bind(this),{";":";",ms:"ms"}]},{},[1]),__return_value;') }) test('inherit contract', async () => { let src = ` class A { constructor() { console.log('A') } - @state state: number + @state state: number } @contract class B extends A { constructor() { @@ -242,47 +389,7 @@ test('inherit contract', async () => { console.log('A'); } - get state() { - const state = this.getState("state"); - - if (typeof state !== "object") { - return state; - } - - const setState = this.setState; - const handler = { - get(target, property, receiver) { - const desc = Object.getOwnPropertyDescriptor(target, property); - const value = Reflect.get(target, property, receiver); - if (desc && !desc.writable && !desc.configurable) return value; - - if (typeof value === 'object') { - return new Proxy(value, handler); - } - - return value; - }, - - defineProperty(target, property, descriptor) { - const result = Reflect.defineProperty(target, property, descriptor); - setState("state", state); - return result; - }, - - deleteProperty(target, property) { - const result = Reflect.deleteProperty(target, property); - setState("state", state); - return result; - } - - }; - return new Proxy(state, handler); - } - - set state(value) { - this.setState("state", value); - } - + state = __path("state"); } class B extends A { diff --git a/test/external.test.js b/test/external.test.js deleted file mode 100644 index 75adc53..0000000 --- a/test/external.test.js +++ /dev/null @@ -1,20 +0,0 @@ -const external = require('../src/external') -const { babelify } = require('../src/transform') - -describe('external plugin', () => { - test('require non string literal', () => { - let src = ` - const test = require(1) - ` - babelify(src, [external([])]) - }) - - test('external source not found', () => { - let src = ` - const test = require('./test') - ` - expect(() => { - src = babelify(src, [external([])]) - }).toThrow(SyntaxError) - }) -}) diff --git a/test/flow.test.js b/test/flow.test.js index 43c7c02..92b05ae 100644 --- a/test/flow.test.js +++ b/test/flow.test.js @@ -1,6 +1,6 @@ const flowPlugin = require('@babel/plugin-transform-flow-strip-types') -const plugin = require('../src/babel') -const { babelify } = require('../src/transform') +const plugin = require('../src/plugins/main') +const babelify = require('../src/babelify') test('typed state', () => { let src = ` @@ -13,87 +13,8 @@ test('typed state', () => { ` src = babelify(src, [plugin]) expect(src).toBe(`class Typed { - get state() { - const state = this.getState("state"); - - if (typeof state !== "object") { - return state; - } - - const setState = this.setState; - const handler = { - get(target, property, receiver) { - const desc = Object.getOwnPropertyDescriptor(target, property); - const value = Reflect.get(target, property, receiver); - if (desc && !desc.writable && !desc.configurable) return value; - - if (typeof value === 'object') { - return new Proxy(value, handler); - } - - return value; - }, - - defineProperty(target, property, descriptor) { - const result = Reflect.defineProperty(target, property, descriptor); - setState("state", state); - return result; - }, - - deleteProperty(target, property) { - const result = Reflect.deleteProperty(target, property); - setState("state", state); - return result; - } - - }; - return new Proxy(state, handler); - } - - set state(value) { - this.setState("state", value); - } - - get #state() { - const state = this.getState("#state"); - - if (typeof state !== "object") { - return state; - } - - const setState = this.setState; - const handler = { - get(target, property, receiver) { - const desc = Object.getOwnPropertyDescriptor(target, property); - const value = Reflect.get(target, property, receiver); - if (desc && !desc.writable && !desc.configurable) return value; - - if (typeof value === 'object') { - return new Proxy(value, handler); - } - - return value; - }, - - defineProperty(target, property, descriptor) { - const result = Reflect.defineProperty(target, property, descriptor); - setState("#state", state); - return result; - }, - - deleteProperty(target, property) { - const result = Reflect.deleteProperty(target, property); - setState("#state", state); - return result; - } - - }; - return new Proxy(state, handler); - } - - set #state(value) { - this.setState("#state", value); - } + state = __path("state"); + #state = __path("#state"); test(arg1: number = 1, arg2: string = null): void {} @@ -140,46 +61,7 @@ test('address state', () => { src = babelify(src, [plugin]) src = babelify(src, [flowPlugin]) expect(src).toBe(`class AddressTest { - get who() { - const state = this.getState("who"); - - if (typeof state !== "object") { - return state; - } - - const setState = this.setState; - const handler = { - get(target, property, receiver) { - const desc = Object.getOwnPropertyDescriptor(target, property); - const value = Reflect.get(target, property, receiver); - if (desc && !desc.writable && !desc.configurable) return value; - - if (typeof value === 'object') { - return new Proxy(value, handler); - } - - return value; - }, - - defineProperty(target, property, descriptor) { - const result = Reflect.defineProperty(target, property, descriptor); - setState("who", state); - return result; - }, - - deleteProperty(target, property) { - const result = Reflect.deleteProperty(target, property); - setState("who", state); - return result; - } - - }; - return new Proxy(state, handler); - } - - set who(value) { - this.setState("who", value); - } + who = __path("who"); withdraw(who) {} diff --git a/test/import2require.test.js b/test/import2require.test.js index 0e0e1c7..175ca46 100644 --- a/test/import2require.test.js +++ b/test/import2require.test.js @@ -1,5 +1,5 @@ -const importToRequire = require('../src/import2require') -const { babelify } = require('../src/transform') +const importToRequire = require('../src/plugins/import2require') +const babelify = require('../src/babelify') test('pure property', () => { let src = ` diff --git a/test/internal.test.js b/test/internal.test.js index 6233d60..819558b 100644 --- a/test/internal.test.js +++ b/test/internal.test.js @@ -1,5 +1,5 @@ -const plugin = require('../src/babel') -const { babelify } = require('../src/transform') +const plugin = require('../src/plugins/main') +const babelify = require('../src/babelify') describe('internal new feature', () => { test('some misuse situation', () => { diff --git a/test/misuse.test.js b/test/misuse.test.js index 3cbb1f7..721b057 100644 --- a/test/misuse.test.js +++ b/test/misuse.test.js @@ -1,5 +1,6 @@ -const plugin = require('../src/babel') -const { babelify, transform } = require('../src/transform') +const plugin = require('../src/plugins/main') +const babelify = require('../src/babelify') +const transform = require('../src/transform') test('2 contract decorators error', () => { let src = ` @@ -111,7 +112,7 @@ test('only one @onreceive per class', () => { }) test('only js and json, weak way', () => { - let src = ` + const src = ` const test = require('./misc/test.node') @contract class A {} ` diff --git a/test/property.test.js b/test/property.test.js index 7a21a12..1c3015b 100644 --- a/test/property.test.js +++ b/test/property.test.js @@ -1,7 +1,7 @@ -const plugin = require('../src/babel') -const { babelify } = require('../src/transform') +const plugin = require('../src/plugins/main') +const babelify = require('../src/babelify') const { transpile } = require('../src') -const makeWrapper = require('../src/wrapper') +const makeWrapper = require('../src/entryWrapper') test('pure property', () => { let src = ` @@ -68,10 +68,10 @@ test('not use function property with state', () => { }).toThrow(SyntaxError) }) -test('not use private function with state', () => { +test('not use Symbol with state', () => { let src = ` @contract class A { - @state #func = () => {} + @state symbol = Symbol() } ` expect(() => { @@ -79,20 +79,45 @@ test('not use private function with state', () => { }).toThrow(SyntaxError) }) -test('try transpile', async () => { +test('not use WeakMap with state', () => { let src = ` @contract class A { - @state state = 1 + @state map = new WeakMap() } ` - let cannotMinSrc = ` + expect(() => { + src = babelify(src, [plugin]) + }).toThrow(SyntaxError) +}) + +test('not use private function with state', () => { + let src = ` + @contract class A { + @state #func = () => {} + } + ` + expect(() => { + src = babelify(src, [plugin]) + }).toThrow(SyntaxError) +}) + +test('try transpile', async () => { + const cannotMinStateSrc = ` + @contract class A { + @state state = 1 + } +` + + const cannotMinSrc = ` @contract class A { @pure state = () => 1 } ` - await transpile(src, { prettier: true }) - await transpile(src, { minify: true }) + await transpile(cannotMinStateSrc, { prettier: true }) + await transpile(cannotMinSrc, { prettier: true }) + // TODO: wait for Terser support classProperties + await expect(transpile(cannotMinStateSrc, { minify: true })).rejects.toThrow(Error) await expect(transpile(cannotMinSrc, { minify: true })).rejects.toThrow(Error) }) @@ -107,172 +132,12 @@ test('getState default', async () => { ` src = babelify(src, [plugin]) expect(src).toBe(`class A { - get numberState() { - const state = this.getState("numberState", 1); - - if (typeof state !== "object") { - return state; - } - - const setState = this.setState; - const handler = { - get(target, property, receiver) { - const desc = Object.getOwnPropertyDescriptor(target, property); - const value = Reflect.get(target, property, receiver); - if (desc && !desc.writable && !desc.configurable) return value; - - if (typeof value === 'object') { - return new Proxy(value, handler); - } - - return value; - }, - - defineProperty(target, property, descriptor) { - const result = Reflect.defineProperty(target, property, descriptor); - setState("numberState", state); - return result; - }, - - deleteProperty(target, property) { - const result = Reflect.deleteProperty(target, property); - setState("numberState", state); - return result; - } - - }; - return new Proxy(state, handler); - } - - set numberState(value) { - this.setState("numberState", value); - } - - get arrayState() { - const state = this.getState("arrayState", [1, 2, 3]); - - if (typeof state !== "object") { - return state; - } - - const setState = this.setState; - const handler = { - get(target, property, receiver) { - const desc = Object.getOwnPropertyDescriptor(target, property); - const value = Reflect.get(target, property, receiver); - if (desc && !desc.writable && !desc.configurable) return value; - - if (typeof value === 'object') { - return new Proxy(value, handler); - } - - return value; - }, - - defineProperty(target, property, descriptor) { - const result = Reflect.defineProperty(target, property, descriptor); - setState("arrayState", state); - return result; - }, - - deleteProperty(target, property) { - const result = Reflect.deleteProperty(target, property); - setState("arrayState", state); - return result; - } - - }; - return new Proxy(state, handler); - } - - set arrayState(value) { - this.setState("arrayState", value); - } - - get sumState() { - const state = this.getState("sumState", 1 + 2); - - if (typeof state !== "object") { - return state; - } - - const setState = this.setState; - const handler = { - get(target, property, receiver) { - const desc = Object.getOwnPropertyDescriptor(target, property); - const value = Reflect.get(target, property, receiver); - if (desc && !desc.writable && !desc.configurable) return value; - - if (typeof value === 'object') { - return new Proxy(value, handler); - } - - return value; - }, - - defineProperty(target, property, descriptor) { - const result = Reflect.defineProperty(target, property, descriptor); - setState("sumState", state); - return result; - }, - - deleteProperty(target, property) { - const result = Reflect.deleteProperty(target, property); - setState("sumState", state); - return result; - } - - }; - return new Proxy(state, handler); - } - - set sumState(value) { - this.setState("sumState", value); - } - - get objState() { - const state = this.getState("objState", { - state: 1 - }); - - if (typeof state !== "object") { - return state; - } - - const setState = this.setState; - const handler = { - get(target, property, receiver) { - const desc = Object.getOwnPropertyDescriptor(target, property); - const value = Reflect.get(target, property, receiver); - if (desc && !desc.writable && !desc.configurable) return value; - - if (typeof value === 'object') { - return new Proxy(value, handler); - } - - return value; - }, - - defineProperty(target, property, descriptor) { - const result = Reflect.defineProperty(target, property, descriptor); - setState("objState", state); - return result; - }, - - deleteProperty(target, property) { - const result = Reflect.deleteProperty(target, property); - setState("objState", state); - return result; - } - - }; - return new Proxy(state, handler); - } - - set objState(value) { - this.setState("objState", value); - } - + numberState = __path("numberState", 1); + arrayState = __path("arrayState", [1, 2, 3]); + sumState = __path("sumState", 1 + 2); + objState = __path("objState", { + state: 1 + }); } const __contract = new A();