From 2b6e26eaf72ff2ac4cc7518f1461741727246a6c Mon Sep 17 00:00:00 2001 From: Sotatek-DucPham Date: Mon, 25 Nov 2019 09:49:50 +0700 Subject: [PATCH 01/12] fix: remove dist folder --- .gitignore | 3 + dist/babel.js | 578 ------------------------------------- dist/common.js | 49 ---- dist/external.js | 82 ------ dist/import2require.js | 91 ------ dist/index.js | 158 ---------- dist/preprocess.js | 75 ----- dist/transform/babelify.js | 24 -- dist/transform/index.js | 279 ------------------ dist/wrapper.js | 9 - package.json | 5 +- 11 files changed, 6 insertions(+), 1347 deletions(-) delete mode 100644 dist/babel.js delete mode 100644 dist/common.js delete mode 100644 dist/external.js delete mode 100644 dist/import2require.js delete mode 100644 dist/index.js delete mode 100644 dist/preprocess.js delete mode 100644 dist/transform/babelify.js delete mode 100644 dist/transform/index.js delete mode 100644 dist/wrapper.js diff --git a/.gitignore b/.gitignore index 0ac4886..5d26580 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,6 @@ typings/ # next.js build output .next .vscode + +# compile javascript +dist 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.json b/package.json index 94f67ff..bcfecdc 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" @@ -52,7 +53,7 @@ }, "husky": { "hooks": { - "pre-commit": "npm run build" + "pre-commit": "npm run lint" } }, "jest": { From 3b011a55c493b5797386ef5e804073f25a8df387 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPham Date: Mon, 25 Nov 2019 10:31:13 +0700 Subject: [PATCH 02/12] fix: adjust some test case --- .gitignore | 5 +- .vscode/settings.json | 6 ++ package-lock.json | 8 ++- package.json | 1 + test/contract.test.js | 78 ++-------------------- test/flow.test.js | 111 ++---------------------------- test/property.test.js | 152 +++--------------------------------------- 7 files changed, 39 insertions(+), 322 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index 5d26580..bac1410 100644 --- a/.gitignore +++ b/.gitignore @@ -59,7 +59,8 @@ typings/ # next.js build output .next -.vscode +.vscode/* +!.vscode/settings.json -# compile javascript +# 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/package-lock.json b/package-lock.json index 34e8f47..0233465 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@iceteachain/sunseed", - "version": "0.1.1", + "version": "0.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -4915,6 +4915,12 @@ } } }, + "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", diff --git a/package.json b/package.json index bcfecdc..2e0c2bc 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "devDependencies": { "@babel/cli": "^7.7.0", "jest": "^24.9.0", + "moment": "^2.24.0", "standard": "^14.3.1" }, "standard": { diff --git a/test/contract.test.js b/test/contract.test.js index 5d8644b..0e44f3c 100644 --- a/test/contract.test.js +++ b/test/contract.test.js @@ -46,7 +46,7 @@ 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{get property(){return __proxyState$Get("property")}set property(t){this.setState("property",__proxyState$Unwrap(t))}}const __contract=new A,__metadata={property:{type:"ClassProperty",decorators:["state","internal"],fieldType:"any"}};') }) test('non constant', () => { @@ -85,44 +85,11 @@ test('non constant state init', () => { } 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); - } - - 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); + return __proxyState$Get("property", Math.PI); } set property(value) { - this.setState("property", value); + this.setState("property", __proxyState$Unwrap(value)); } } @@ -191,7 +158,7 @@ test('whitelist special', async () => { }) test('prefer local module', async () => { - let src = ` + const src = ` const moment = require('moment@local') @contract class A { @pure test() { return moment().format() } @@ -243,44 +210,11 @@ test('inherit contract', async () => { } 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); + return __proxyState$Get("state"); } set state(value) { - this.setState("state", value); + this.setState("state", __proxyState$Unwrap(value)); } } diff --git a/test/flow.test.js b/test/flow.test.js index 43c7c02..17b74af 100644 --- a/test/flow.test.js +++ b/test/flow.test.js @@ -14,85 +14,19 @@ 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); + return __proxyState$Get("state"); } set state(value) { - this.setState("state", value); + this.setState("state", __proxyState$Unwrap(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); + return __proxyState$Get("#state"); } set #state(value) { - this.setState("#state", value); + this.setState("#state", __proxyState$Unwrap(value)); } test(arg1: number = 1, arg2: string = null): void {} @@ -141,44 +75,11 @@ test('address state', () => { 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); + return __proxyState$Get("who"); } set who(value) { - this.setState("who", value); + this.setState("who", __proxyState$Unwrap(value)); } withdraw(who) {} diff --git a/test/property.test.js b/test/property.test.js index 7a21a12..c3bb9f5 100644 --- a/test/property.test.js +++ b/test/property.test.js @@ -80,12 +80,12 @@ test('not use private function with state', () => { }) test('try transpile', async () => { - let src = ` + const src = ` @contract class A { @state state = 1 } ` - let cannotMinSrc = ` + const cannotMinSrc = ` @contract class A { @pure state = () => 1 } @@ -108,169 +108,37 @@ 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); + return __proxyState$Get("numberState", 1); } set numberState(value) { - this.setState("numberState", value); + this.setState("numberState", __proxyState$Unwrap(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); + return __proxyState$Get("arrayState", [1, 2, 3]); } set arrayState(value) { - this.setState("arrayState", value); + this.setState("arrayState", __proxyState$Unwrap(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); + return __proxyState$Get("sumState", 1 + 2); } set sumState(value) { - this.setState("sumState", value); + this.setState("sumState", __proxyState$Unwrap(value)); } get objState() { - const state = this.getState("objState", { + return __proxyState$Get("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); + this.setState("objState", __proxyState$Unwrap(value)); } } From fe7cd38e571975fb6dab9c28c0703764e9756713 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPham Date: Mon, 25 Nov 2019 11:42:27 +0700 Subject: [PATCH 03/12] chore: update deps and fix some lint warning --- package-lock.json | 776 ++++++++++++++++++++++------------------- package.json | 20 +- src/babel.js | 20 +- src/import2require.js | 6 +- src/transform/index.js | 6 +- src/wrapper.js | 3 +- test/external.test.js | 2 +- test/misuse.test.js | 2 +- 8 files changed, 445 insertions(+), 390 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0233465..6bd1235 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,13 +5,13 @@ "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", @@ -1721,11 +1777,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": { @@ -1953,9 +2009,9 @@ } }, "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==" }, "emoji-regex": { "version": "7.0.3", @@ -5007,9 +5063,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" }, diff --git a/package.json b/package.json index 2e0c2bc..00e348e 100644 --- a/package.json +++ b/package.json @@ -22,15 +22,15 @@ }, "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", "prettier": "^1.19.1", @@ -38,7 +38,7 @@ "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" diff --git a/src/babel.js b/src/babel.js index ed988a7..b4a2dc0 100644 --- a/src/babel.js +++ b/src/babel.js @@ -198,7 +198,7 @@ class IceTea { `) klassPath.node.body.body.unshift(...fn().body.body) onDeploy = klassPath.node.body.body[0] - this.metadata['__on_deployed'] = { + this.metadata.__on_deployed = { type: 'ClassMethod', decorators: ['payable'] } @@ -255,22 +255,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') } } } @@ -333,10 +333,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.__on_received) { throw this.buildError('Only one @onreceive is allowed per class.', klass) } - this.metadata['__on_received'] = klass.key.name + this.metadata.__on_received = klass.key.name } this.deleteDecorators(klass, this.findDecorators(klass, ...METHOD_DECORATORS)) diff --git a/src/import2require.js b/src/import2require.js index 0a15356..133b33e 100644 --- a/src/import2require.js +++ b/src/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/transform/index.js b/src/transform/index.js index aecd8fd..bb782e6 100644 --- a/src/transform/index.js +++ b/src/transform/index.js @@ -22,7 +22,7 @@ exports.transform = async (src, context = '/', project = null, options = {}) => sourceType: 'module', plugins }) - let requires = {} + const requires = {} traverse(parsed, { CallExpression: ({ node }) => { @@ -62,10 +62,10 @@ exports.transform = async (src, context = '/', project = null, options = {}) => 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 + const data = (await axios.get(url.URL(value, context))).data if (typeof data === 'string') { // try to parse json string - requires[value] = await exports.transform(data, url.resolve(context, value), null, options) + requires[value] = await exports.transform(data, url.URL(value, context), null, options) } else { requires[value] = data } diff --git a/src/wrapper.js b/src/wrapper.js index c0137de..fd3479e 100644 --- a/src/wrapper.js +++ b/src/wrapper.js @@ -1,7 +1,6 @@ module.exports = (src, { noState } = {}) => { - const stateFunc = noState ? '' : ` const __proxyState$Unwrap = value => { const real = value && value.__proxyState$RealObj; @@ -153,4 +152,4 @@ ${src} return __checkType(__c.instance[__name], __metadata[__name], 'fieldType', 'field'); } ` -} \ No newline at end of file +} diff --git a/test/external.test.js b/test/external.test.js index 75adc53..43c9f68 100644 --- a/test/external.test.js +++ b/test/external.test.js @@ -3,7 +3,7 @@ const { babelify } = require('../src/transform') describe('external plugin', () => { test('require non string literal', () => { - let src = ` + const src = ` const test = require(1) ` babelify(src, [external([])]) diff --git a/test/misuse.test.js b/test/misuse.test.js index 3cbb1f7..921fa13 100644 --- a/test/misuse.test.js +++ b/test/misuse.test.js @@ -111,7 +111,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 {} ` From 3593d92755669e64e767eee19eb47a12ae3de5af Mon Sep 17 00:00:00 2001 From: Sotatek-DucPham Date: Mon, 25 Nov 2019 14:19:36 +0700 Subject: [PATCH 04/12] fix: do not use proxy for state --- src/babel.js | 11 +++------ test/contract.test.js | 33 ++++++++++++------------- test/flow.test.js | 25 +++---------------- test/property.test.js | 57 ++++++++++++------------------------------- 4 files changed, 38 insertions(+), 88 deletions(-) diff --git a/src/babel.js b/src/babel.js index b4a2dc0..eccd020 100644 --- a/src/babel.js +++ b/src/babel.js @@ -392,14 +392,11 @@ class IceTea { 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 diff --git a/test/contract.test.js b/test/contract.test.js index 0e44f3c..4b86ef2 100644 --- a/test/contract.test.js +++ b/test/contract.test.js @@ -45,8 +45,19 @@ test('state', () => { } ` src = babelify(src, [plugin]) - src = Terser.minify(src).code - expect(src).toBe('class A{get property(){return __proxyState$Get("property")}set property(t){this.setState("property",__proxyState$Unwrap(t))}}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', () => { @@ -84,14 +95,7 @@ test('non constant state init', () => { this.property = Math.PI; } - get property() { - return __proxyState$Get("property", Math.PI); - } - - set property(value) { - this.setState("property", __proxyState$Unwrap(value)); - } - + property = __path("property", Math.PI); } const __contract = new A(); @@ -209,14 +213,7 @@ test('inherit contract', async () => { console.log('A'); } - get state() { - return __proxyState$Get("state"); - } - - set state(value) { - this.setState("state", __proxyState$Unwrap(value)); - } - + state = __path("state"); } class B extends A { diff --git a/test/flow.test.js b/test/flow.test.js index 17b74af..13d6773 100644 --- a/test/flow.test.js +++ b/test/flow.test.js @@ -13,21 +13,8 @@ test('typed state', () => { ` src = babelify(src, [plugin]) expect(src).toBe(`class Typed { - get state() { - return __proxyState$Get("state"); - } - - set state(value) { - this.setState("state", __proxyState$Unwrap(value)); - } - - get #state() { - return __proxyState$Get("#state"); - } - - set #state(value) { - this.setState("#state", __proxyState$Unwrap(value)); - } + state = __path("state"); + #state = __path("#state"); test(arg1: number = 1, arg2: string = null): void {} @@ -74,13 +61,7 @@ test('address state', () => { src = babelify(src, [plugin]) src = babelify(src, [flowPlugin]) expect(src).toBe(`class AddressTest { - get who() { - return __proxyState$Get("who"); - } - - set who(value) { - this.setState("who", __proxyState$Unwrap(value)); - } + who = __path("who"); withdraw(who) {} diff --git a/test/property.test.js b/test/property.test.js index c3bb9f5..0495565 100644 --- a/test/property.test.js +++ b/test/property.test.js @@ -80,19 +80,22 @@ test('not use private function with state', () => { }) test('try transpile', async () => { - const src = ` - @contract class A { - @state state = 1 - } - ` + 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,40 +110,12 @@ test('getState default', async () => { ` src = babelify(src, [plugin]) expect(src).toBe(`class A { - get numberState() { - return __proxyState$Get("numberState", 1); - } - - set numberState(value) { - this.setState("numberState", __proxyState$Unwrap(value)); - } - - get arrayState() { - return __proxyState$Get("arrayState", [1, 2, 3]); - } - - set arrayState(value) { - this.setState("arrayState", __proxyState$Unwrap(value)); - } - - get sumState() { - return __proxyState$Get("sumState", 1 + 2); - } - - set sumState(value) { - this.setState("sumState", __proxyState$Unwrap(value)); - } - - get objState() { - return __proxyState$Get("objState", { - state: 1 - }); - } - - set objState(value) { - this.setState("objState", __proxyState$Unwrap(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(); From 0ba5d374e5252e462a037872ce55f71c5d17aa0a Mon Sep 17 00:00:00 2001 From: Sotatek-DucPham Date: Mon, 25 Nov 2019 15:42:39 +0700 Subject: [PATCH 05/12] fix: prepare for next refactor --- src/babel.js | 48 ++++++++++++++++++++++++++++++++++--------- src/wrapper.js | 1 + test/contract.test.js | 14 ++++++++++--- 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/babel.js b/src/babel.js index eccd020..f8ce2ac 100644 --- a/src/babel.js +++ b/src/babel.js @@ -204,17 +204,12 @@ class IceTea { } } const fn = template.smart(` - this.NAME = DEFAULT + this.NAME.value(DEFAULT) `) - onDeploy.body.body.unshift(fn({ + onDeploy.body.body.push(fn({ NAME: name, DEFAULT: node.value })) - - // initialization is already added to constructor - // if (states.length === 0) { - // path.remove() - // } } if (states.length > 0) { @@ -232,7 +227,7 @@ class IceTea { throw this.buildError(`${name} cannot be marked with both @state and @pure.`, node) } - this.wrapState(path) + this.wrapState(path, this.isConstant(node.value)) if (!this.metadata[name]) { const decoratorNames = decorators.map(decorator => decorator.expression.name) @@ -248,6 +243,36 @@ class IceTea { return } + if (!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.PROPERTY = VALUE') + onDeploy.body.body.push(fn({ + PROPERTY: name, + VALUE: node.value + })) + + const property = template.smart('NAME = msg.name === \'__on_deployed\' ? undefined : VALUE') + path.replaceWith(property({ + NAME: name, + VALUE: node.value + })) + } + if (!this.metadata[name]) { this.metadata[name] = { type: node.type, @@ -387,7 +412,7 @@ class IceTea { }) } - wrapState (path) { + wrapState (path, useInitValue = true) { const { node } = path const name = node.key.name || ('#' + node.key.id.name) const wrap = template.smart(` @@ -399,7 +424,7 @@ class IceTea { }) path.replaceWithMultiple(wrap({ NAME: name, - DEFAULT: node.value + DEFAULT: useInitValue ? node.value : undefined }).body.body) } @@ -465,6 +490,9 @@ class IceTea { } isConstant (value) { + if (value === null || value === undefined) { + return true + } const { types } = this if (types.isLiteral(value) && value.type !== 'TemplateLiteral') { return true diff --git a/src/wrapper.js b/src/wrapper.js index fd3479e..a5f75d4 100644 --- a/src/wrapper.js +++ b/src/wrapper.js @@ -65,6 +65,7 @@ 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.") diff --git a/test/contract.test.js b/test/contract.test.js index 4b86ef2..b5569c8 100644 --- a/test/contract.test.js +++ b/test/contract.test.js @@ -87,15 +87,18 @@ test('non constant state init', () => { let src = ` @contract class A { @state property = Math.PI + xyz = property.value() } ` src = babelify(src, [plugin]) expect(src).toBe(`class A { __on_deployed() { - this.property = Math.PI; + this.property.value(Math.PI); + this.xyz = property.value(); } - property = __path("property", Math.PI); + property = __path("property"); + xyz = msg.name === '__on_deployed' ? undefined : property.value(); } const __contract = new A(); @@ -109,6 +112,11 @@ const __metadata = { type: "ClassProperty", decorators: ["state", "internal"], fieldType: "any" + }, + xyz: { + type: "ClassProperty", + decorators: ["internal"], + fieldType: "any" } };`) }) @@ -197,7 +205,7 @@ test('inherit contract', async () => { let src = ` class A { constructor() { console.log('A') } - @state state: number + @state state: number } @contract class B extends A { constructor() { From d57c8af55a71329188df9638f52e005547a2bd9d Mon Sep 17 00:00:00 2001 From: Sotatek-DucPham Date: Tue, 26 Nov 2019 15:10:14 +0700 Subject: [PATCH 06/12] fix: use constant value instead of string --- src/babel.js | 39 ++++++++++++++++++++------------------- src/constant.js | 6 ++++++ 2 files changed, 26 insertions(+), 19 deletions(-) create mode 100644 src/constant.js diff --git a/src/babel.js b/src/babel.js index f8ce2ac..e6e874f 100644 --- a/src/babel.js +++ b/src/babel.js @@ -1,5 +1,6 @@ const template = require('@babel/template') const types = require('@babel/types') +const { METHODS } = require('./constant') let numberOfContracts = 0 let contractName = '' let metadata = {} @@ -119,7 +120,7 @@ module.exports = function ({ types: t }) { class IceTea { constructor (types) { this.types = types - this.__on_deployed = 0 + this[METHODS.__ON_DEPLOYED] = 0 this.className = '' this.metadata = {} this.klass = undefined @@ -142,7 +143,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) } @@ -188,17 +189,17 @@ 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') + 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 { - __on_deployed () {} + ${METHODS.__ON_DEPLOYED} () {} } `) klassPath.node.body.body.unshift(...fn().body.body) onDeploy = klassPath.node.body.body[0] - this.metadata.__on_deployed = { + this.metadata[METHODS.__ON_DEPLOYED] = { type: 'ClassMethod', decorators: ['payable'] } @@ -245,17 +246,17 @@ class IceTea { if (!this.isConstant(node.value) && !isMethod(node)) { const klassPath = path.parentPath.parentPath - let onDeploy = this.findMethod(klassPath.node, '__on_deployed') + 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 { - __on_deployed () {} + ${METHODS.__ON_DEPLOYED} () {} } `) klassPath.node.body.body.unshift(...fn().body.body) onDeploy = klassPath.node.body.body[0] - this.metadata.__on_deployed = { + this.metadata[METHODS.__ON_DEPLOYED] = { type: 'ClassMethod', decorators: ['payable'] } @@ -266,7 +267,7 @@ class IceTea { VALUE: node.value })) - const property = template.smart('NAME = msg.name === \'__on_deployed\' ? undefined : VALUE') + const property = template.smart(`NAME = msg.name === '${METHODS.__ON_DEPLOYED}' ? undefined : VALUE`) path.replaceWith(property({ NAME: name, VALUE: node.value @@ -316,14 +317,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') @@ -344,7 +345,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') @@ -358,10 +359,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)) @@ -402,7 +403,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 diff --git a/src/constant.js b/src/constant.js new file mode 100644 index 0000000..f8eb8e1 --- /dev/null +++ b/src/constant.js @@ -0,0 +1,6 @@ +const METHODS = { + __ON_DEPLOYED: '__on_deployed', + __ON_RECEIVED: '__on_received' +} + +module.exports.METHODS = METHODS From 69c879c540f4cebe4a63f07321316c726f63572b Mon Sep 17 00:00:00 2001 From: Sotatek-DucPham Date: Tue, 26 Nov 2019 15:45:06 +0700 Subject: [PATCH 07/12] fix: state forbidden type --- src/babel.js | 8 +++++--- src/common.js | 18 ++++++++++++++++++ src/constant.js | 4 +++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/babel.js b/src/babel.js index e6e874f..fcb36ed 100644 --- a/src/babel.js +++ b/src/babel.js @@ -1,6 +1,7 @@ const template = require('@babel/template') const types = require('@babel/types') -const { METHODS } = require('./constant') +const { METHODS, FORBIDDEN_STATE_TYPES } = require('./constant') +const { typeOf } = require('./common') let numberOfContracts = 0 let contractName = '' let metadata = {} @@ -214,8 +215,9 @@ class IceTea { } if (states.length > 0) { - if (isMethod(node)) { - throw this.buildError('Function cannot be marked as @state.', 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) diff --git a/src/common.js b/src/common.js index 6c0725d..5bc72e9 100644 --- a/src/common.js +++ b/src/common.js @@ -64,3 +64,21 @@ exports.addWhiteListModule = (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' +} diff --git a/src/constant.js b/src/constant.js index f8eb8e1..dd38e65 100644 --- a/src/constant.js +++ b/src/constant.js @@ -2,5 +2,7 @@ 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 From 37639ba0070f0aea69f51dcd0ec3bd609e7c235a Mon Sep 17 00:00:00 2001 From: Sotatek-DucPham Date: Tue, 26 Nov 2019 16:51:14 +0700 Subject: [PATCH 08/12] fix: __on_deployed append right code --- src/babel.js | 63 ++++++++++++++++++++----------------------- test/contract.test.js | 24 +++++++++++------ 2 files changed, 45 insertions(+), 42 deletions(-) diff --git a/src/babel.js b/src/babel.js index fcb36ed..0af3ae8 100644 --- a/src/babel.js +++ b/src/babel.js @@ -120,11 +120,12 @@ module.exports = function ({ types: t }) { class IceTea { constructor (types) { - this.types = types - this[METHODS.__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) { @@ -190,28 +191,15 @@ class IceTea { if (states.length && node.value && !this.isConstant(node.value) && !isMethod(node)) { const klassPath = path.parentPath.parentPath - 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'] - } - } + const onDeploy = this.findOrCreateOnDeployed(klassPath) const fn = template.smart(` this.NAME.value(DEFAULT) `) - onDeploy.body.body.push(fn({ + onDeploy.body.body.splice(this.onDeployedPivot, 0, fn({ NAME: name, DEFAULT: node.value })) + this.onDeployedPivot += 1 } if (states.length > 0) { @@ -248,26 +236,13 @@ class IceTea { if (!this.isConstant(node.value) && !isMethod(node)) { const klassPath = path.parentPath.parentPath - 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'] - } - } + const onDeploy = this.findOrCreateOnDeployed(klassPath) const fn = template.smart('this.PROPERTY = VALUE') - onDeploy.body.body.push(fn({ + 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({ @@ -515,4 +490,24 @@ class IceTea { } return false } + + 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/test/contract.test.js b/test/contract.test.js index b5569c8..98c8c27 100644 --- a/test/contract.test.js +++ b/test/contract.test.js @@ -87,27 +87,29 @@ test('non constant state init', () => { let src = ` @contract class A { @state property = Math.PI - xyz = property.value() + xyz = this.property.value() + + constructor() { + this.x = 1 + } } ` src = babelify(src, [plugin]) expect(src).toBe(`class A { + property = __path("property"); + xyz = msg.name === '__on_deployed' ? undefined : this.property.value(); + __on_deployed() { this.property.value(Math.PI); - this.xyz = property.value(); + this.xyz = this.property.value(); + this.x = 1; } - property = __path("property"); - xyz = msg.name === '__on_deployed' ? undefined : property.value(); } const __contract = new A(); const __metadata = { - __on_deployed: { - type: "ClassMethod", - decorators: ["payable"] - }, property: { type: "ClassProperty", decorators: ["state", "internal"], @@ -117,6 +119,12 @@ const __metadata = { type: "ClassProperty", decorators: ["internal"], fieldType: "any" + }, + __on_deployed: { + type: "ClassMethod", + decorators: ["view"], + returnType: "any", + params: [] } };`) }) From 571de841d4470b3debcd24282f502757b05ac936 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPham Date: Tue, 26 Nov 2019 17:50:18 +0700 Subject: [PATCH 09/12] refactor: state check --- src/babel.js | 36 +++++++++++++++++++++--------------- src/common.js | 16 ++++++++-------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/babel.js b/src/babel.js index 0af3ae8..a473766 100644 --- a/src/babel.js +++ b/src/babel.js @@ -174,7 +174,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 @@ -189,20 +188,7 @@ class IceTea { } } - if (states.length && node.value && !this.isConstant(node.value) && !isMethod(node)) { - 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 - } - - if (states.length > 0) { + if (this.isState(node)) { const typeOfNode = typeOf(node) if (FORBIDDEN_STATE_TYPES.includes(typeOfNode)) { throw this.buildError(`${typeOfNode} cannot be marked as @state.`, node) @@ -218,6 +204,19 @@ class IceTea { throw this.buildError(`${name} cannot be marked with both @state and @pure.`, node) } + 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]) { @@ -231,9 +230,11 @@ class IceTea { fieldType: getTypeName(node.typeAnnotation) } } + return } + // TODO: isDependent instead of Not constant if (!this.isConstant(node.value) && !isMethod(node)) { const klassPath = path.parentPath.parentPath const onDeploy = this.findOrCreateOnDeployed(klassPath) @@ -491,6 +492,11 @@ class IceTea { return false } + isState (node) { + const states = this.findDecorators(node, 'state') + return states.length > 0 + } + findOrCreateOnDeployed (klassPath) { let onDeploy = this.findMethod(klassPath.node, METHODS.__ON_DEPLOYED) if (!onDeploy) { diff --git a/src/common.js b/src/common.js index 5bc72e9..dbbdb00 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,28 +40,28 @@ 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)) } From 4fc0862246dbe7c47525c7f2432afff046c26646 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPham Date: Tue, 26 Nov 2019 18:19:04 +0700 Subject: [PATCH 10/12] feat: state dependent --- src/babel.js | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/babel.js b/src/babel.js index a473766..ed8b40a 100644 --- a/src/babel.js +++ b/src/babel.js @@ -235,7 +235,7 @@ class IceTea { } // TODO: isDependent instead of Not constant - if (!this.isConstant(node.value) && !isMethod(node)) { + if (this.isStateDependent(path) && !isMethod(node)) { const klassPath = path.parentPath.parentPath const onDeploy = this.findOrCreateOnDeployed(klassPath) const fn = template.smart('this.PROPERTY = VALUE') @@ -497,6 +497,29 @@ class IceTea { 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) { From bc119761395b564d3308302cd6bfe4c1920d7224 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPham Date: Wed, 27 Nov 2019 09:14:18 +0700 Subject: [PATCH 11/12] feat: update test --- src/babel.js | 12 +++++++++++- test/property.test.js | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/babel.js b/src/babel.js index ed8b40a..5cadf49 100644 --- a/src/babel.js +++ b/src/babel.js @@ -234,7 +234,6 @@ class IceTea { return } - // TODO: isDependent instead of Not constant if (this.isStateDependent(path) && !isMethod(node)) { const klassPath = path.parentPath.parentPath const onDeploy = this.findOrCreateOnDeployed(klassPath) @@ -489,6 +488,17 @@ 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 } diff --git a/test/property.test.js b/test/property.test.js index 0495565..ddc205f 100644 --- a/test/property.test.js +++ b/test/property.test.js @@ -68,6 +68,28 @@ test('not use function property with state', () => { }).toThrow(SyntaxError) }) +test('not use Symbol with state', () => { + let src = ` + @contract class A { + @state symbol = Symbol() + } + ` + expect(() => { + src = babelify(src, [plugin]) + }).toThrow(SyntaxError) +}) + +test('not use WeakMap with state', () => { + let src = ` + @contract class A { + @state map = new WeakMap() + } + ` + expect(() => { + src = babelify(src, [plugin]) + }).toThrow(SyntaxError) +}) + test('not use private function with state', () => { let src = ` @contract class A { From f256544e54f03b557bd165360624f87ff74ac81b Mon Sep 17 00:00:00 2001 From: Sotatek-DucPham Date: Thu, 28 Nov 2019 15:02:21 +0700 Subject: [PATCH 12/12] fix: remove stateFunc --- src/wrapper.js | 68 +------------------------------------------------- 1 file changed, 1 insertion(+), 67 deletions(-) diff --git a/src/wrapper.js b/src/wrapper.js index a5f75d4..ded038e 100644 --- a/src/wrapper.js +++ b/src/wrapper.js @@ -1,68 +1,4 @@ -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); - - // 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); - - 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) - } - ` - +module.exports = (src) => { return `'use strict'; const {msg, block, balanceOf, loadContract, loadLibrary, isValidAddress, deployContract} = this.runtime const { path: __path } = require(';').stateUtil(this) @@ -71,8 +7,6 @@ if (!msg.name) { throw new Error("Method name is required.") } -${stateFunc} - ${src} // block to scope our let/const