diff --git a/.eslintrc.js b/.eslintrc.js index ade4266..994f3f3 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,9 +1,16 @@ module.exports = { + root: true, env: { es6: true, node: true }, - extends: "eslint:recommended", + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + parser: "@typescript-eslint/parser", + plugins: ["@typescript-eslint"], globals: { Atomics: "readonly", SharedArrayBuffer: "readonly" @@ -12,7 +19,10 @@ module.exports = { ecmaVersion: 2018, sourceType: "module" }, - rules: {}, + rules: { + "@typescript-eslint/explicit-function-return-type": [0], + "@typescript-eslint/no-explicit-any": [0] + }, overrides: [ { files: ["**/__tests__/*.js"], diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0314819 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.exclude": { + "compiler/**/*.js": true + } +} \ No newline at end of file diff --git a/__tests__/integration.js b/__tests__/integration.js index fcc883b..5d9c174 100644 --- a/__tests__/integration.js +++ b/__tests__/integration.js @@ -54,12 +54,12 @@ it("Works with plugin-transform-modules-commonjs", function () { filename: __filename, plugins: [ require.resolve("../babel-plugin"), - "@babel/plugin-transform-modules-commonjs" + "@babel/plugin-transform-modules-commonjs", ], babelrc: false }).code; code = babel.transform(code).code; // Reformat - expect(code).toMatchInlineSnapshot("\n \"\\\"use strict\\\";\n\n var _react = _interopRequireDefault(require(\\\"react\\\"));\n\n var _useCustomProperties = _interopRequireDefault(require(\\\"cssta/runtime/useCustomProperties\\\"));\n\n var _useCustomPropertyStyles = _interopRequireDefault(require(\\\"cssta/runtime/useCustomPropertyStyles\\\"));\n\n var _VariablesContext = _interopRequireDefault(require(\\\"cssta/runtime/VariablesContext\\\"));\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n }\n\n const exportedCustomProperties = {\n \\\"color\\\": \\\"red\\\"\n };\n const unresolvedStyleTuples0 = [[\\\"color\\\", \\\"var(--color)\\\"]];\n\n const Test1 = _react.default.forwardRef((props, ref) => {\n const customProperties = (0, _useCustomProperties.default)(exportedCustomProperties);\n const styles = (0, _useCustomPropertyStyles.default)(unresolvedStyleTuples0, customProperties);\n const style = props.style != null ? [styles, props.style] : styles;\n return _react.default.createElement(_VariablesContext.default.Provider, {\n value: customProperties\n }, _react.default.createElement(Button, { ...props,\n ref: ref,\n style: style\n }));\n });\n\n const styles0 = {\n color: \\\"red\\\"\n };\n\n const Test2 = _react.default.forwardRef((props, ref) => {\n const style = props.style != null ? [styles0, props.style] : styles0;\n return _react.default.createElement(Button, { ...props,\n ref: ref,\n style: style\n });\n });\"\n "); + expect(code).toMatchInlineSnapshot("\n \"\\\"use strict\\\";\n\n var _react = _interopRequireDefault(require(\\\"react\\\"));\n\n var _useCustomProperties = _interopRequireDefault(require(\\\"cssta/runtime/useCustomProperties\\\"));\n\n var _useCustomPropertyStyle = _interopRequireDefault(require(\\\"cssta/runtime/useCustomPropertyStyle\\\"));\n\n var _VariablesContext = _interopRequireDefault(require(\\\"cssta/runtime/VariablesContext\\\"));\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n }\n\n const exportedCustomProperties = {\n \\\"color\\\": \\\"red\\\"\n };\n const unresolvedStyleTuples0 = [[\\\"color\\\", \\\"var(--color)\\\"]];\n\n const Test1 = _react.default.forwardRef((props, ref) => {\n const customProperties = (0, _useCustomProperties.default)(exportedCustomProperties);\n const styles = (0, _useCustomPropertyStyle.default)(unresolvedStyleTuples0, customProperties);\n const style = props.style != null ? [styles, props.style] : styles;\n return _react.default.createElement(_VariablesContext.default.Provider, {\n value: customProperties\n }, _react.default.createElement(Button, { ...props,\n ref: ref,\n style: style\n }));\n });\n\n const styles0 = {\n color: \\\"red\\\"\n };\n\n const Test2 = _react.default.forwardRef((props, ref) => {\n const style = props.style != null ? [styles0, props.style] : styles0;\n return _react.default.createElement(Button, { ...props,\n ref: ref,\n style: style\n });\n });\"\n "); }); it("Works with options", function () { var code = babel.transform("import styled from 'cssta/native';" + @@ -68,7 +68,7 @@ it("Works with options", function () { "`;", { filename: __filename, plugins: [ - [require.resolve("../babel-plugin"), { globals: { color: "red" } }] + [require.resolve("../babel-plugin"), { globals: { color: "red" } }], ], babelrc: false }).code; diff --git a/__tests__/integration.ts b/__tests__/integration.ts index 47dbb64..c0087cf 100644 --- a/__tests__/integration.ts +++ b/__tests__/integration.ts @@ -15,7 +15,7 @@ it("Works with babel-plugin-cssta", () => { { filename: __filename, plugins: [require.resolve("../babel-plugin")], - babelrc: false + babelrc: false, } ); expect(code).toMatchInlineSnapshot(` @@ -66,7 +66,7 @@ it("Works with babel-plugin-macros", () => { { filename: __filename, plugins: ["babel-plugin-macros"], - babelrc: false + babelrc: false, } ); expect(code).toMatchInlineSnapshot(` @@ -116,9 +116,9 @@ it("Works with plugin-transform-modules-commonjs", () => { filename: __filename, plugins: [ require.resolve("../babel-plugin"), - "@babel/plugin-transform-modules-commonjs" + "@babel/plugin-transform-modules-commonjs", ], - babelrc: false + babelrc: false, } ); code = babel.transform(code).code; // Reformat @@ -129,7 +129,7 @@ it("Works with plugin-transform-modules-commonjs", () => { var _useCustomProperties = _interopRequireDefault(require(\\"cssta/runtime/useCustomProperties\\")); - var _useCustomPropertyStyles = _interopRequireDefault(require(\\"cssta/runtime/useCustomPropertyStyles\\")); + var _useCustomPropertyStyle = _interopRequireDefault(require(\\"cssta/runtime/useCustomPropertyStyle\\")); var _VariablesContext = _interopRequireDefault(require(\\"cssta/runtime/VariablesContext\\")); @@ -146,7 +146,7 @@ it("Works with plugin-transform-modules-commonjs", () => { const Test1 = _react.default.forwardRef((props, ref) => { const customProperties = (0, _useCustomProperties.default)(exportedCustomProperties); - const styles = (0, _useCustomPropertyStyles.default)(unresolvedStyleTuples0, customProperties); + const styles = (0, _useCustomPropertyStyle.default)(unresolvedStyleTuples0, customProperties); const style = props.style != null ? [styles, props.style] : styles; return _react.default.createElement(_VariablesContext.default.Provider, { value: customProperties @@ -179,9 +179,9 @@ it("Works with options", () => { { filename: __filename, plugins: [ - [require.resolve("../babel-plugin"), { globals: { color: "red" } }] + [require.resolve("../babel-plugin"), { globals: { color: "red" } }], ], - babelrc: false + babelrc: false, } ); expect(code).toMatchInlineSnapshot(` diff --git a/benchmark/mocks/react-native.js b/benchmark/mocks/react-native.js index ce7362b..971f564 100644 --- a/benchmark/mocks/react-native.js +++ b/benchmark/mocks/react-native.js @@ -1,8 +1,7 @@ -// @flow -import { createElement } from 'react'; +import { createElement } from "react"; export const StyleSheet = { - create: () => ({}), + create: () => ({}) }; -export const View = props => createElement('view', props); +export const View = props => createElement("view", props); diff --git a/benchmark/yarn.lock b/benchmark/yarn.lock index ba63217..8bc6b66 100644 --- a/benchmark/yarn.lock +++ b/benchmark/yarn.lock @@ -295,9 +295,9 @@ acorn-jsx@^5.0.2: integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw== acorn@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" - integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== acorn@^7.0.0: version "7.0.0" diff --git a/compiler/babel/__testUtil__/index.ts b/compiler/babel/__testUtil__/index.ts index 4df1992..bd52e59 100644 --- a/compiler/babel/__testUtil__/index.ts +++ b/compiler/babel/__testUtil__/index.ts @@ -1,12 +1,12 @@ import * as babel from "@babel/core"; import generate from "@babel/generator"; import buildElement from "../buildElement"; -import { Options } from "../options"; +import { Options } from "../../options"; const { types: t } = babel; export const styled: { test: (x: TemplateStringsArray) => string } = { - test: String.raw + test: String.raw, } as any; export const build = (css: string, options: Options = {}) => { @@ -22,7 +22,7 @@ export const build = (css: string, options: Options = {}) => { { jsx: true, ...options } ); } - } + }, }); const { code } = generate(ast); return code.replace(/"/g, "'"); diff --git a/compiler/babel/__tests__/buildCondition.ts b/compiler/babel/__tests__/buildCondition.ts index eeae5e3..b65498e 100644 --- a/compiler/babel/__tests__/buildCondition.ts +++ b/compiler/babel/__tests__/buildCondition.ts @@ -14,7 +14,7 @@ const run = (inputSelector: string, mediaQuery?: string | undefined) => { const environment = createEnvironment(babel, body); const node = buildCondition(babel, { selector, mediaQuery }, environment); body.pushContainer("body", t.returnStatement(node)); - } + }, }); const { code } = generate(ast); return code.replace(/"/g, "'"); diff --git a/compiler/babel/__tests__/interpolation.ts b/compiler/babel/__tests__/interpolation.ts index 3608443..19bb81a 100644 --- a/compiler/babel/__tests__/interpolation.ts +++ b/compiler/babel/__tests__/interpolation.ts @@ -16,7 +16,7 @@ it("Works with substititions", () => { const { tag, quasi: body } = path.node; const element = tag.arguments[0]; buildElement(babel, path, element, body, { jsx: true }); - } + }, }); const { code } = generate(ast); expect(code).toMatchInlineSnapshot(` @@ -49,7 +49,7 @@ it("Works with substititions and simple viewport units", () => { const { tag, quasi: body } = path.node; const element = tag.arguments[0]; buildElement(babel, path, element, body, { jsx: true }); - } + }, }); const { code } = generate(ast); expect(code).toMatchInlineSnapshot(` diff --git a/compiler/babel/__tests__/mixed.ts b/compiler/babel/__tests__/mixed.ts index 65df3cf..855093d 100644 --- a/compiler/babel/__tests__/mixed.ts +++ b/compiler/babel/__tests__/mixed.ts @@ -304,12 +304,12 @@ it("Supports viewport units in shorthands with custom properties", () => { "import React from 'react'; import useCustomProperties from 'cssta/runtime/useCustomProperties'; import useViewportStyleTuples from 'cssta/runtime/useViewportStyleTuples'; - import useCustomPropertyStyles from 'cssta/runtime/useCustomPropertyStyles'; + import useCustomPropertyStyle from 'cssta/runtime/useCustomPropertyStyle'; const unresolvedStyleTuples0 = [['margin', '10vw var(--whyDoIDoThisToMyself)']]; const Example = React.forwardRef((props, ref) => { const customProperties = useCustomProperties(null); const unresolvedStyleTuples1 = useViewportStyleTuples(unresolvedStyleTuples0); - const styles = useCustomPropertyStyles(unresolvedStyleTuples1, customProperties); + const styles = useCustomPropertyStyle(unresolvedStyleTuples1, customProperties); const style = props.style != null ? [styles, props.style] : styles; return ; });" diff --git a/compiler/babel/__tests__/mixin-include.ts b/compiler/babel/__tests__/mixin-include.ts index b5462bc..dffb045 100644 --- a/compiler/babel/__tests__/mixin-include.ts +++ b/compiler/babel/__tests__/mixin-include.ts @@ -13,7 +13,7 @@ it("Works with mixins", () => { const { tag, quasi: body } = path.node; const element = tag.arguments[0]; buildElement(babel, path, element, body, { jsx: true }); - } + }, }); const { code } = generate(ast); expect(code).toMatchInlineSnapshot(` @@ -39,7 +39,7 @@ it("Works with conditional mixins", () => { const { tag, quasi: body } = path.node; const element = tag.arguments[0]; buildElement(babel, path, element, body, { jsx: true }); - } + }, }); const { code } = generate(ast); expect(code).toMatchInlineSnapshot(` @@ -71,7 +71,7 @@ it("Works with multiple mixins", () => { const { tag, quasi: body } = path.node; const element = tag.arguments[0]; buildElement(babel, path, element, body, { jsx: true }); - } + }, }); const { code } = generate(ast); expect(code).toMatchInlineSnapshot(` @@ -100,7 +100,7 @@ it("Gives sensible error message when using mixins incorrectly", () => { const { tag, quasi: body } = path.node; const element = tag.arguments[0]; buildElement(babel, path, element, body, { jsx: true }); - } + }, }); }).toThrow("Mixins should use interpolation (e.g. @include ${useStyles})"); }); diff --git a/compiler/babel/__tests__/mixin.ts b/compiler/babel/__tests__/mixin.ts index 5e4bc05..c360be7 100644 --- a/compiler/babel/__tests__/mixin.ts +++ b/compiler/babel/__tests__/mixin.ts @@ -17,7 +17,7 @@ const build = (css: string, options = {}) => { options ); } - } + }, }); const { code } = generate(ast); return code.replace(/"/g, "'"); @@ -49,12 +49,12 @@ it("Supports mixins with custom properties", () => { const code = build(css); expect(code).toMatchInlineSnapshot(` "import useCustomProperties from 'cssta/runtime/useCustomProperties'; - import useCustomPropertyStyles from 'cssta/runtime/useCustomPropertyStyles'; + import useCustomPropertyStyle from 'cssta/runtime/useCustomPropertyStyle'; const unresolvedStyleTuples0 = [['color', 'var(--red)']]; const Example = () => { const customProperties = useCustomProperties(null); - const styles = useCustomPropertyStyles(unresolvedStyleTuples0, customProperties); + const styles = useCustomPropertyStyle(unresolvedStyleTuples0, customProperties); const style = styles; return style; };" diff --git a/compiler/babel/__tests__/transform.ts b/compiler/babel/__tests__/transform.ts index db314b6..45e457a 100644 --- a/compiler/babel/__tests__/transform.ts +++ b/compiler/babel/__tests__/transform.ts @@ -14,7 +14,7 @@ it("Works with existing React", () => { const { tag, quasi: body } = path.node; const element = tag.arguments[0]; buildElement(babel, path, element, body, { jsx: true }); - } + }, }); const { code } = generate(ast); expect(code).toMatchInlineSnapshot(` @@ -52,7 +52,7 @@ it("Works with multiple component definitions", () => { const { tag, quasi: body } = path.node; const element = tag.arguments[0]; buildElement(babel, path, element, body, { jsx: true }); - } + }, }); const { code } = generate(ast); expect(code).toMatchInlineSnapshot(` diff --git a/compiler/babel/__tests__/variables.ts b/compiler/babel/__tests__/variables.ts index 55b03c6..6b76b31 100644 --- a/compiler/babel/__tests__/variables.ts +++ b/compiler/babel/__tests__/variables.ts @@ -9,11 +9,11 @@ it("Supports imported variables", () => { expect(code).toMatchInlineSnapshot(` "import React from 'react'; import useCustomProperties from 'cssta/runtime/useCustomProperties'; - import useCustomPropertyStyles from 'cssta/runtime/useCustomPropertyStyles'; + import useCustomPropertyStyle from 'cssta/runtime/useCustomPropertyStyle'; const unresolvedStyleTuples0 = [['width', 'var(--width)']]; const Example = React.forwardRef((props, ref) => { const customProperties = useCustomProperties(null); - const styles = useCustomPropertyStyles(unresolvedStyleTuples0, customProperties); + const styles = useCustomPropertyStyle(unresolvedStyleTuples0, customProperties); const style = props.style != null ? [styles, props.style] : styles; return ; });" @@ -147,7 +147,7 @@ it("Supports rules where only some import variables", () => { expect(code).toMatchInlineSnapshot(` "import React from 'react'; import useCustomProperties from 'cssta/runtime/useCustomProperties'; - import useCustomPropertyStyles from 'cssta/runtime/useCustomPropertyStyles'; + import useCustomPropertyStyle from 'cssta/runtime/useCustomPropertyStyle'; const styles0 = { width: 100 }; @@ -162,8 +162,8 @@ it("Supports rules where only some import variables", () => { ...props }, ref) => { const customProperties = useCustomProperties(null); - const styles = useCustomPropertyStyles(unresolvedStyleTuples0, customProperties); - const styles2 = useCustomPropertyStyles(unresolvedStyleTuples1, customProperties); + const styles = useCustomPropertyStyle(unresolvedStyleTuples0, customProperties); + const styles2 = useCustomPropertyStyle(unresolvedStyleTuples1, customProperties); const baseStyle = cond1 === true ? styles2 : cond2 === true ? styles1 : cond1 === true ? styles : styles0; const style = props.style != null ? [baseStyle, props.style] : baseStyle; return ; @@ -178,8 +178,8 @@ it("Supports global variables in config", () => { const code = build(css, { globals: { - primary: "red" - } + primary: "red", + }, }); expect(code).toMatchInlineSnapshot(` "import React from 'react'; @@ -201,17 +201,17 @@ it("Omits missing globals", () => { const code = build(css, { globals: { - primary: "red" - } + primary: "red", + }, }); expect(code).toMatchInlineSnapshot(` "import React from 'react'; import useCustomProperties from 'cssta/runtime/useCustomProperties'; - import useCustomPropertyStyles from 'cssta/runtime/useCustomPropertyStyles'; + import useCustomPropertyStyle from 'cssta/runtime/useCustomPropertyStyle'; const unresolvedStyleTuples0 = [['color', 'red'], ['background', 'var(--secondary)']]; const Example = React.forwardRef((props, ref) => { const customProperties = useCustomProperties(null); - const styles = useCustomPropertyStyles(unresolvedStyleTuples0, customProperties); + const styles = useCustomPropertyStyle(unresolvedStyleTuples0, customProperties); const style = props.style != null ? [styles, props.style] : styles; return ; });" @@ -226,8 +226,8 @@ it("Does not allow overwriting global variables", () => { expect(() => { build(css, { globals: { - primary: "red" - } + primary: "red", + }, }); }).toThrow( 'Attempted to overwrite global variable "primary". Either change this variable, or remove it from the globals. See line `--primary: blue`' @@ -243,9 +243,9 @@ it("Supports failing build on missing global", () => { expect(() => { build(css, { globals: { - primary: "red" + primary: "red", }, - globalVarsOnly: true + globalVarsOnly: true, }); }).toThrow( 'Found variable "secondary". This was not defined in the globals, and `globalVarsOnly` is enabled. See line with `var(--secondary)`' @@ -260,9 +260,9 @@ it("Does not fail failing build on missing global with globalVarsOnly if there i const code = build(css, { globals: { - primary: "red" + primary: "red", }, - globalVarsOnly: true + globalVarsOnly: true, }); expect(code).toMatchInlineSnapshot(` "import React from 'react'; @@ -276,3 +276,35 @@ it("Does not fail failing build on missing global with globalVarsOnly if there i });" `); }); + +it("Supports global variables with media queries", () => { + const css = styled.test` + color: var(--primary); + `; + + const code = build(css, { + globals: ` + --primary: red; + + @media (prefers-color-scheme: dark) { + --primary: pink; + } + `, + }); + expect(code).toMatchInlineSnapshot(` + "import React from 'react'; + import { useColorScheme } from 'react-native'; + const styles0 = { + color: 'red' + }; + const styles1 = { + color: 'pink' + }; + const Example = React.forwardRef((props, ref) => { + const colorScheme = useColorScheme(); + const baseStyle = colorScheme === 'dark' ? styles1 : styles0; + const style = props.style != null ? [baseStyle, props.style] : baseStyle; + return ; + });" + `); +}); diff --git a/compiler/babel/__tests__/viewport.ts b/compiler/babel/__tests__/viewport.ts index c4c746b..4cb43b4 100644 --- a/compiler/babel/__tests__/viewport.ts +++ b/compiler/babel/__tests__/viewport.ts @@ -144,3 +144,21 @@ it("Supports viewport units in shorthands", () => { });" `); }); + +it("Supports simple viewport units with calc", () => { + const css = styled.test` + width: calc(10vw - 100px); + `; + + const code = build(css); + expect(code).toMatchInlineSnapshot(` + "import React from 'react'; + import useViewportStyle from 'cssta/runtime/useViewportStyle'; + const unresolvedStyleTuples0 = [['width', 'calc(10vw - 100px)']]; + const Example = React.forwardRef((props, ref) => { + const styles0 = useViewportStyle(unresolvedStyleTuples0); + const style = props.style != null ? [styles0, props.style] : styles0; + return ; + });" + `); +}); diff --git a/compiler/babel/buildCondition.ts b/compiler/babel/buildCondition.ts index 57afe3d..c539670 100644 --- a/compiler/babel/buildCondition.ts +++ b/compiler/babel/buildCondition.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-use-before-define */ import selectorParser, { Node } from "postcss-selector-parser"; import { Condition } from "../css/types"; import { Environment } from "./environment"; @@ -13,7 +14,7 @@ const combineLogicalValidators = ( if (validators.length === 0) { throw new Error("Cannot construct logical validaton"); } - const nodeValidators: string[] = validators.filter(v => v != null); + const nodeValidators: string[] = validators.filter((v) => v != null); if (nodeValidators.length === 0) return null; return nodeValidators .slice(1) @@ -27,7 +28,7 @@ const createLogicalValidator = (babel: any, operator: string, nodes: Node[]) => combineLogicalValidators( babel, operator, - nodes.map(node => createValidator(babel, node)) + nodes.map((node) => createValidator(babel, node)) ); // eslint-disable-line const createValidator = (babel: any, node: Node): Validator => { @@ -77,7 +78,7 @@ const createValidator = (babel: any, node: Node): Validator => { const aspectRatioWH = ({ types: t }, str: string) => { const [w, h] = str .split("/") - .map(x => x.trim()) + .map((x) => x.trim()) .map(Number); return t.binaryExpression("/", t.numericLiteral(w), t.numericLiteral(h)); }; @@ -194,7 +195,7 @@ const createMediaQueryValidator = ( combineLogicalValidators( babel, "&&", - (queryPart.match(/\([^()]+\)/g) || []).map(query => + (queryPart.match(/\([^()]+\)/g) || []).map((query) => createMediaFeatureValidator(babel, query, environment) ) ); @@ -216,14 +217,14 @@ export default ( environment: Environment ) => { let selectorNode: Node; - selectorParser(node => { + selectorParser((node) => { selectorNode = node; }).processSync(selector); if (!selectorNode) throw new Error("Expected to parse selector"); const validatorNode = combineLogicalValidators(babel, "&&", [ createValidator(babel, selectorNode), - createMediaQueryValidator(babel, mediaQuery, environment) + createMediaQueryValidator(babel, mediaQuery, environment), ]); return validatorNode; diff --git a/compiler/babel/buildElement.ts b/compiler/babel/buildElement.ts index 40a4bac..ad816f1 100644 --- a/compiler/babel/buildElement.ts +++ b/compiler/babel/buildElement.ts @@ -1,6 +1,6 @@ import extractRules from "../css/extractRules"; import { StyleType } from "../css/types"; -import extractCss from "./extractCss"; +import extractSubstitutionMap from "./extractSubstitutionMap"; import createEnvironment from "./environment"; import styleSheet from "./styleSheet"; import style from "./style"; @@ -10,7 +10,7 @@ import useKeyframes from "./useKeyframes"; import useAnimation from "./useAnimation"; import returnElement from "./returnElement"; import forwardRefComponent from "./forwardRefComponent"; -import { Options } from "./options"; +import { Options } from "../options"; export default ( babel: any, @@ -19,15 +19,15 @@ export default ( cssNode: any, options?: Options ) => { - const { cssText, substitutionMap } = extractCss(cssNode, options); - const cssOutput = extractRules(cssText); + const { cssText, substitutionMap } = extractSubstitutionMap(cssNode); + const cssOutput = extractRules(cssText, options); const { propTypes, styles, transitions, animations, keyframes, - exportedVariables + exportedVariables, } = cssOutput; const { path, propsVariable, refVariable } = forwardRefComponent( @@ -40,12 +40,12 @@ export default ( const hasImportedVariables = styles.some( - x => x.type === StyleType.Tuples && x.importedVariables.length !== 0 + (x) => x.type === StyleType.Tuples && x.importedVariables.length !== 0 ) || - transitions.some(x => x.importedVariables.length !== 0) || - animations.some(x => x.importedVariables.length !== 0) || - keyframes.some(x => x.importedVariables.length !== 0) || - exportedVariables.some(x => x.importedVariables.length !== 0); + transitions.some((x) => x.importedVariables.length !== 0) || + animations.some((x) => x.importedVariables.length !== 0) || + keyframes.some((x) => x.importedVariables.length !== 0) || + exportedVariables.some((x) => x.importedVariables.length !== 0); const hasExportedVariables = exportedVariables.length !== 0; if (hasExportedVariables && options != null && options.globals != null) { @@ -81,13 +81,13 @@ export default ( const styleVariable = style(babel, path, environment, { propsVariable, styleSheetRuleExpressions, - willModifyStyle + willModifyStyle, }); if (transitions.length !== 0) { useTransition(babel, path, cssOutput, environment, { styleVariable, - customPropertiesVariable + customPropertiesVariable, }); } @@ -100,7 +100,7 @@ export default ( useAnimation(babel, path, cssOutput, environment, { styleVariable, keyframesVariable, - customPropertiesVariable + customPropertiesVariable, }); } @@ -109,7 +109,7 @@ export default ( refVariable, styleVariable, hasExportedVariables, - customPropertiesVariable + customPropertiesVariable, }); path.scope.crawl(); diff --git a/compiler/babel/buildMixin.ts b/compiler/babel/buildMixin.ts index d85c18d..971a102 100644 --- a/compiler/babel/buildMixin.ts +++ b/compiler/babel/buildMixin.ts @@ -1,21 +1,21 @@ import extractRules from "../css/extractRules"; import { StyleType } from "../css/types"; -import extractCss from "./extractCss"; +import extractSubstitutionMap from "./extractSubstitutionMap"; import createEnvironment from "./environment"; import styleSheet from "./styleSheet"; import style from "./style"; import useCustomProperties from "./useCustomProperties"; -import { Options } from "./options"; +import { Options } from "../options"; export default (babel: any, nodePath: any, cssNode: any, options?: Options) => { - const { cssText, substitutionMap } = extractCss(cssNode, options); - const cssOutput = extractRules(cssText); + const { cssText, substitutionMap } = extractSubstitutionMap(cssNode); + const cssOutput = extractRules(cssText, options); const { styles, transitions, animations, keyframes, - exportedVariables + exportedVariables, } = cssOutput; if (transitions.length !== 0) { @@ -35,7 +35,7 @@ export default (babel: any, nodePath: any, cssNode: any, options?: Options) => { const environment = createEnvironment(babel, path); const hasImportedVariables = styles.some( - rule => + (rule) => rule.type === StyleType.Tuples && rule.importedVariables.length !== 0 ); @@ -59,7 +59,7 @@ export default (babel: any, nodePath: any, cssNode: any, options?: Options) => { ); const styleVariable = style(babel, path, environment, { - styleSheetRuleExpressions + styleSheetRuleExpressions, }); path.pushContainer("body", t.returnStatement(styleVariable)); diff --git a/compiler/babel/environment/index.ts b/compiler/babel/environment/index.ts index ba11ff8..8961157 100644 --- a/compiler/babel/environment/index.ts +++ b/compiler/babel/environment/index.ts @@ -46,6 +46,6 @@ export default (babel: any, path: any) => { } return t.cloneDeep(windowVariables.height); - } + }, }; }; diff --git a/compiler/babel/environment/useMediaQuery.ts b/compiler/babel/environment/useMediaQuery.ts index 4334252..858ed5e 100644 --- a/compiler/babel/environment/useMediaQuery.ts +++ b/compiler/babel/environment/useMediaQuery.ts @@ -5,7 +5,7 @@ export default (babel: any, path: any) => { const windowVariables = { width: generateNiceId(babel, path, "windowWidth"), - height: generateNiceId(babel, path, "windowHeight") + height: generateNiceId(babel, path, "windowHeight"), }; const useWindowDimensionsImport = getOrCreateImport( @@ -17,10 +17,10 @@ export default (babel: any, path: any) => { t.variableDeclarator( t.objectPattern([ t.objectProperty(t.identifier("width"), windowVariables.width), - t.objectProperty(t.identifier("height"), windowVariables.height) + t.objectProperty(t.identifier("height"), windowVariables.height), ]), t.callExpression(useWindowDimensionsImport, []) - ) + ), ]); path.pushContainer("body", windowDeclarator); diff --git a/compiler/babel/extractCss.ts b/compiler/babel/extractCss.ts deleted file mode 100644 index 01a3de6..0000000 --- a/compiler/babel/extractCss.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { varRegExp } from "../../runtime/cssRegExp"; -import { Options } from "./options"; - -export type SubstitutionMap = Record; - -export default ( - { quasis, expressions }: { quasis: any[]; expressions: any[] }, - options?: Options -) => { - const substitutionNames = expressions.map( - (_, index) => `__substitution-${index}__` - ); - - const quasiValue = (quasi: any) => { - let value = quasi.value.cooked as string; - - if (options != null && options.globals != null) { - value = value.replace(varRegExp, (fullMatch, variable, fallback) => { - if (options.globals[variable] != null) { - return options.globals[variable]; - } else if (fallback) { - return fallback; - } else if (!options.globalVarsOnly) { - return fullMatch; - } else { - throw new Error( - `Found variable "${variable}". This was not defined in the globals, and \`globalVarsOnly\` is enabled. See line with \`var(--${variable})\`` - ); - } - }); - } - - return value; - }; - - const cssText = - quasiValue(quasis[0]) + - substitutionNames - .map((name, index) => name + quasiValue(quasis[index + 1])) - .join(""); - - const substitutionMap = {} as SubstitutionMap; - substitutionNames.forEach((substitution, index) => { - substitutionMap[substitution] = expressions[index]; - }); - - return { cssText, substitutionMap }; -}; diff --git a/compiler/babel/extractSubstitutionMap.ts b/compiler/babel/extractSubstitutionMap.ts new file mode 100644 index 0000000..5467b0e --- /dev/null +++ b/compiler/babel/extractSubstitutionMap.ts @@ -0,0 +1,28 @@ +export type SubstitutionMap = Record; + +const quasiValue = (quasi: any) => quasi.value.cooked as string; + +export default ({ + quasis, + expressions, +}: { + quasis: any[]; + expressions: any[]; +}) => { + const substitutionNames = expressions.map( + (_, index) => `__substitution-${index}__` + ); + + const cssText = + quasiValue(quasis[0]) + + substitutionNames + .map((name, index) => name + quasiValue(quasis[index + 1])) + .join(""); + + const substitutionMap = {} as SubstitutionMap; + substitutionNames.forEach((substitution, index) => { + substitutionMap[substitution] = expressions[index]; + }); + + return { cssText, substitutionMap }; +}; diff --git a/compiler/babel/forwardRefComponent.ts b/compiler/babel/forwardRefComponent.ts index a59cbd6..0ed2f45 100644 --- a/compiler/babel/forwardRefComponent.ts +++ b/compiler/babel/forwardRefComponent.ts @@ -17,7 +17,7 @@ export default (babel: any, nodePath: any, { propTypes }) => { const { types: t } = babel; const propKeys = Object.keys(propTypes); - const propsSpread = propKeys.map(key => + const propsSpread = propKeys.map((key) => t.objectProperty( t.identifier(key), t.identifier(key), @@ -35,7 +35,7 @@ export default (babel: any, nodePath: any, { propTypes }) => { : t.objectPattern([...propsSpread, t.restElement(propsVariable)]); const reactImport = getOrCreateImport(babel, nodePath, "react", undefined, { - preferredName: "React" + preferredName: "React", }); const componentDefinition = t.callExpression( t.memberExpression(reactImport, t.identifier("forwardRef")), @@ -43,7 +43,7 @@ export default (babel: any, nodePath: any, { propTypes }) => { t.arrowFunctionExpression( [propsObject, refVariable], t.blockStatement([]) - ) + ), ] ); diff --git a/compiler/babel/returnElement.ts b/compiler/babel/returnElement.ts index 9a6c347..aa32a3f 100644 --- a/compiler/babel/returnElement.ts +++ b/compiler/babel/returnElement.ts @@ -1,5 +1,5 @@ import { getOrCreateImport } from "./util"; -import { Options } from "./options"; +import { Options } from "../options"; const createBaseElement = ( babel: any, @@ -20,9 +20,9 @@ const createBaseElement = ( t.objectProperty(t.identifier("ref"), refVariable), styleVariable != null ? t.objectProperty(t.identifier("style"), styleVariable) - : null + : null, ].filter(Boolean) - ) + ), ] ); } else { @@ -40,7 +40,7 @@ const createBaseElement = ( t.jsxIdentifier("style"), t.jsxExpressionContainer(styleVariable) ) - : null + : null, ].filter(Boolean), true ), @@ -70,9 +70,9 @@ const createVariablesExporter = ( [ t.memberExpression(variablesContextImport, t.identifier("Provider")), t.objectExpression([ - t.objectProperty(t.identifier("value"), customPropertiesVariable) + t.objectProperty(t.identifier("value"), customPropertiesVariable), ]), - baseElement + baseElement, ] ); } else { @@ -86,7 +86,7 @@ const createVariablesExporter = ( t.jsxAttribute( t.jsxIdentifier("value"), t.jsxExpressionContainer(customPropertiesVariable) - ) + ), ], false ), @@ -106,7 +106,7 @@ export default ( refVariable, styleVariable, hasExportedVariables, - customPropertiesVariable + customPropertiesVariable, } ) => { const { types: t } = babel; @@ -115,12 +115,12 @@ export default ( jsx, propsVariable, refVariable, - styleVariable + styleVariable, }); const returned = hasExportedVariables ? createVariablesExporter(babel, path, baseElement, { jsx, - customPropertiesVariable + customPropertiesVariable, }) : baseElement; diff --git a/compiler/babel/style.ts b/compiler/babel/style.ts index 0b26da4..be9b074 100644 --- a/compiler/babel/style.ts +++ b/compiler/babel/style.ts @@ -10,7 +10,7 @@ export default ( { propsVariable, styleSheetRuleExpressions, - willModifyStyle = false + willModifyStyle = false, }: { propsVariable?: any; styleSheetRuleExpressions: StyleSheetExpression[]; @@ -37,7 +37,7 @@ export default ( styleGroup.push(expression); return accum; }, []) - .map(expressionGroup => { + .map((expressionGroup) => { const ruleExpression = expressionGroup.reduce( (accum, { condition, expression }) => { if (condition == null) return expression; @@ -84,7 +84,7 @@ export default ( let styleVariable: any; if (styleExpression != null) { styleVariable = createVariable(babel, path, "style", styleExpression, { - kind: willModifyStyle ? "let" : "const" + kind: willModifyStyle ? "let" : "const", }); } diff --git a/compiler/babel/styleSheet/__tests__/styleBody.ts b/compiler/babel/styleSheet/__tests__/styleBody.ts index ae2c65f..7ef7242 100644 --- a/compiler/babel/styleSheet/__tests__/styleBody.ts +++ b/compiler/babel/styleSheet/__tests__/styleBody.ts @@ -2,7 +2,7 @@ import * as babel from "@babel/core"; import generate from "@babel/generator"; import styleBody from "../styleBody"; import { StyleTuple } from "../../../../runtime/cssUtil"; -import { SubstitutionMap } from "../../extractCss"; +import { SubstitutionMap } from "../../extractSubstitutionMap"; const { types: t } = babel; @@ -17,7 +17,7 @@ const run = (substitutionMap: SubstitutionMap, styleTuples: StyleTuple[]) => { styleTuples ); path.get("body").pushContainer("body", t.returnStatement(node)); - } + }, }); const { code } = generate(ast); return code.replace(/"/g, "'"); @@ -83,7 +83,10 @@ it("Transforms shorthand values", () => { it("Combines a simple value before a shorthand value", () => { const code = run( { int1: t.identifier("opacity"), int2: t.identifier("margin") }, - [["opacity", "int1"], ["margin", "int2"]] + [ + ["opacity", "int1"], + ["margin", "int2"], + ] ); expect(code).toMatchInlineSnapshot(` "import { transformStyleTuples } from 'cssta/runtime/cssUtil'; @@ -99,7 +102,10 @@ it("Combines a simple value before a shorthand value", () => { it("Combines a simple value after a shorthand value", () => { const code = run( { int1: t.identifier("margin"), int2: t.identifier("opacity") }, - [["margin", "int2"], ["opacity", "int1"]] + [ + ["margin", "int2"], + ["opacity", "int1"], + ] ); expect(code).toMatchInlineSnapshot(` "import { transformStyleTuples } from 'cssta/runtime/cssUtil'; @@ -121,7 +127,7 @@ it("Combines multiple simple values with a shorthand value", () => { int4: t.identifier("color"), int5: t.identifier("left"), int6: t.identifier("border"), - int7: t.identifier("opacity") + int7: t.identifier("opacity"), }, [ ["top", "int1"], @@ -130,7 +136,7 @@ it("Combines multiple simple values with a shorthand value", () => { ["color", "int4"], ["left", "int5"], ["border", "int6"], - ["opacity", "int7"] + ["opacity", "int7"], ] ); expect(code).toMatchInlineSnapshot(` @@ -156,7 +162,7 @@ it("Does not allow multiple values for simple properties", () => { run( { int1: t.identifier("color1"), - int2: t.identifier("color2") + int2: t.identifier("color2"), }, [["color", "int1 int2"]] ); @@ -167,7 +173,7 @@ it("Allows multiple values for shorthand properties", () => { const code = run( { int1: t.identifier("margin1"), - int2: t.identifier("margin2") + int2: t.identifier("margin2"), }, [["margin", "int1 int2"]] ); diff --git a/compiler/babel/styleSheet/index.ts b/compiler/babel/styleSheet/index.ts index a6b485d..267260d 100644 --- a/compiler/babel/styleSheet/index.ts +++ b/compiler/babel/styleSheet/index.ts @@ -5,26 +5,26 @@ import { Condition, StyleType, StyleTuplesDeclaration, - StyleMixinDeclaration + StyleMixinDeclaration, } from "../../css/types"; import { Environment } from "../environment"; -import { SubstitutionMap } from "../extractCss"; +import { SubstitutionMap } from "../extractSubstitutionMap"; import { createTopLevelVariable, createVariable, - getOrCreateImport + getOrCreateImport, } from "../util"; import styleBody from "./styleBody"; import { createTopLevelStyleTuplesVariable } from "./styleTuples"; import { ViewportMode, getViewportMode, - interpolateViewportUnits + interpolateViewportUnits, } from "./viewport"; export enum OptimizationFlag { None, - SupersetsPrevious + SupersetsPrevious, } const createVariablesStyleExpression = ( @@ -38,6 +38,7 @@ const createVariablesStyleExpression = ( const baseUnresolvedStyleTuplesVariable = createTopLevelStyleTuplesVariable( babel, path, + substitutionMap, styleTuples ); @@ -61,7 +62,7 @@ const createVariablesStyleExpression = ( path, "unresolvedStyleTuples", t.callExpression(useViewportStyleTuplesImport, [ - baseUnresolvedStyleTuplesVariable + baseUnresolvedStyleTuplesVariable, ]), { prefix0: true } ); @@ -70,7 +71,7 @@ const createVariablesStyleExpression = ( const useCustomPropertyStylesImport = getOrCreateImport( babel, path, - "cssta/runtime/useCustomPropertyStyles" + "cssta/runtime/useCustomPropertyStyle" ); const styleExpression = createVariable( babel, @@ -78,7 +79,7 @@ const createVariablesStyleExpression = ( "styles", t.callExpression(useCustomPropertyStylesImport, [ unresolvedStyleTuplesVariable, - customPropertiesVariable + customPropertiesVariable, ]) ); return styleExpression; @@ -111,6 +112,7 @@ const createStyleExpression = ( const unresolvedStyleTuplesVariable = createTopLevelStyleTuplesVariable( babel, path, + substitutionMap, styleTuples ); const cssToReactNativeImport = getOrCreateImport( @@ -128,7 +130,7 @@ const createStyleExpression = ( } else if (viewportMode === ViewportMode.SimpleLengthUnits) { const [ nextSubstitutionMap, - styleTuplesWithViewportSubstitutions + styleTuplesWithViewportSubstitutions, ] = interpolateViewportUnits( babel, substitutionMap, @@ -149,7 +151,7 @@ const createStyleExpression = ( } styleExpression = createTopLevelVariable(babel, path, "styles", style, { - prefix0: true + prefix0: true, }); } @@ -175,21 +177,21 @@ const createMixinExpression = ( babel, path, "mixinInclude", - t.callExpression(substitution, []), + t.callExpression(t.cloneDeep(substitution), []), { prefix0: true } ); }; const mergeFirstStyleIntoAllRules = (styles: StyleTuplesDeclaration[]) => { const mergeeRule = styles[0]; - const stylesMerged = styles.map(rule => { + const stylesMerged = styles.map((rule) => { if (rule === mergeeRule) return rule; const ownStyleKeys = new Set( - rule.styleTuples.map(styleTuple => styleTuple[0]) + rule.styleTuples.map((styleTuple) => styleTuple[0]) ); const stylesToMerge = mergeeRule.styleTuples.filter( - styleTuple => !ownStyleKeys.has(styleTuple[0]) + (styleTuple) => !ownStyleKeys.has(styleTuple[0]) ); if (stylesToMerge.length === 0) return rule; @@ -202,17 +204,17 @@ const mergeFirstStyleIntoAllRules = (styles: StyleTuplesDeclaration[]) => { const getOptimizationFlag = (styles: StyleDeclaration[]) => { let lastStyleKeys: string[] | null = null; - return styles.map(rule => { + return styles.map((rule) => { if (rule.type === StyleType.Mixin) { lastStyleKeys = null; return OptimizationFlag.None; } - const ownStyleKeys = rule.styleTuples.map(styleTuple => styleTuple[0]); + const ownStyleKeys = rule.styleTuples.map((styleTuple) => styleTuple[0]); const supersets = lastStyleKeys != null && - lastStyleKeys.every(key => ownStyleKeys.includes(key)); + lastStyleKeys.every((key) => ownStyleKeys.includes(key)); lastStyleKeys = ownStyleKeys; @@ -240,7 +242,7 @@ export default ( if ( styles.length === 2 && styles[0].condition == null && - styles.every(style => style.type === StyleType.Tuples) + styles.every((style) => style.type === StyleType.Tuples) ) { const mergedStyleTuples = mergeFirstStyleIntoAllRules( styles as StyleTuplesDeclaration[] @@ -266,7 +268,7 @@ export default ( }); } else { const stylesheetOptimizationFlags = getOptimizationFlag(styles); - const styleSheetExpressions = styles.map(rule => + const styleSheetExpressions = styles.map((rule) => rule.type === StyleType.Tuples ? createStyleExpression( babel, @@ -281,7 +283,7 @@ export default ( styleSheetRuleExpressions = styles.map((style, i) => ({ condition: style.condition, expression: styleSheetExpressions[i], - optimizationFlag: stylesheetOptimizationFlags[i] + optimizationFlag: stylesheetOptimizationFlags[i], })); } diff --git a/compiler/babel/styleSheet/simpleUnitTypes.ts b/compiler/babel/styleSheet/simpleUnitTypes.ts index f4503b8..e144d1f 100644 --- a/compiler/babel/styleSheet/simpleUnitTypes.ts +++ b/compiler/babel/styleSheet/simpleUnitTypes.ts @@ -1,7 +1,7 @@ export enum UnitType { Length, Number, - String + String, } /* @@ -44,19 +44,19 @@ export default { height: UnitType.Length, justifyContent: UnitType.String, left: UnitType.Length, - marginBottomWidth: UnitType.Length, - marginLeftWidth: UnitType.Length, - marginRightWidth: UnitType.Length, - marginTopWidth: UnitType.Length, + marginBottom: UnitType.Length, + marginLeft: UnitType.Length, + marginRight: UnitType.Length, + marginTop: UnitType.Length, maxHeight: UnitType.Length, maxWidth: UnitType.Length, minHeight: UnitType.Length, minWidth: UnitType.Length, overflow: UnitType.String, - paddingBottomWidth: UnitType.Length, - paddingLeftWidth: UnitType.Length, - paddingRightWidth: UnitType.Length, - paddingTopWidth: UnitType.Length, + paddingBottom: UnitType.Length, + paddingLeft: UnitType.Length, + paddingRight: UnitType.Length, + paddingTop: UnitType.Length, position: UnitType.String, right: UnitType.Length, top: UnitType.Length, @@ -76,5 +76,5 @@ export default { letterSpacing: UnitType.Length, textDecorationColor: UnitType.String, textDecorationStyle: UnitType.String, - writingDirection: UnitType.String + writingDirection: UnitType.String, }; diff --git a/compiler/babel/styleSheet/styleBody.ts b/compiler/babel/styleSheet/styleBody.ts index 1a7ebc8..4b96d44 100644 --- a/compiler/babel/styleSheet/styleBody.ts +++ b/compiler/babel/styleSheet/styleBody.ts @@ -1,18 +1,19 @@ import { getPropertyName } from "css-to-react-native"; import { transformStyleTuples, StyleTuple } from "../../../runtime/cssUtil"; +import { SubstitutionMap } from "../extractSubstitutionMap"; import { jsonToNode, getOrCreateImport } from "../util"; import { getSubstitutionRegExp, containsSubstitution, - getStringWithSubstitutedValues + getStringWithSubstitutedValues, } from "./substitutionUtil"; import unitTypes from "./simpleUnitTypes"; import substituteSimpleUnit from "./substituteSimpleUnit"; -import { SubstitutionMap } from "../extractCss"; +import { calcRe } from "./util"; enum InterpolationType { NoOrSimple, - Template + Template, } type StyleTupleGroup = { @@ -26,7 +27,7 @@ const getInterpolationType = ( ) => { if (!containsSubstitution(substitutionMap, value)) { return InterpolationType.NoOrSimple; - } else if (getPropertyName(prop) in unitTypes) { + } else if (getPropertyName(prop) in unitTypes && !calcRe.test(value)) { return InterpolationType.NoOrSimple; } return InterpolationType.Template; @@ -37,7 +38,7 @@ const createStyleTupleGroups = ( styleTuples: StyleTuple[] ) => { const groups = [] as StyleTupleGroup[]; - styleTuples.forEach(styleTuple => { + styleTuples.forEach((styleTuple) => { const interpolationType = getInterpolationType(substitutionMap, styleTuple); const lastGroup = groups[groups.length - 1]; @@ -59,6 +60,8 @@ const createSimpleNoInterpolationStyleMap = ( substitutionMap: SubstitutionMap, styleTuplesGroup: StyleTuple[] ) => { + const { types: t } = babel; + const substitutionRegExp = Object.keys(substitutionMap).length !== 0 ? getSubstitutionRegExp(substitutionMap) @@ -81,7 +84,7 @@ const createSimpleNoInterpolationStyleMap = ( } else if (substitutionMatches.length === 1) { const substitution = substitutionMatches[0] === value.trim() - ? substitutionMap[value] + ? t.cloneDeep(substitutionMap[value]) : getStringWithSubstitutedValues(babel, substitutionMap, value); styleMap[propertyName] = substituteSimpleUnit( @@ -132,7 +135,7 @@ const transformStyleTupleGroup = ( styleTuplesGroup.map(([prop, value]) => t.arrayExpression([ t.stringLiteral(getPropertyName(prop)), - getStringWithSubstitutedValues(babel, substitutionMap, value) + getStringWithSubstitutedValues(babel, substitutionMap, value), ]) ) ); @@ -150,7 +153,7 @@ export default ( ) => { const { types: t } = babel; const tupleGroups = createStyleTupleGroups(substitutionMap, styleTuples); - const transformedGroups = tupleGroups.map(tupleGroup => + const transformedGroups = tupleGroups.map((tupleGroup) => transformStyleTupleGroup(babel, path, substitutionMap, tupleGroup) ); diff --git a/compiler/babel/styleSheet/styleTuples.ts b/compiler/babel/styleSheet/styleTuples.ts index 8b47ea6..d7a5ab0 100644 --- a/compiler/babel/styleSheet/styleTuples.ts +++ b/compiler/babel/styleSheet/styleTuples.ts @@ -1,16 +1,28 @@ import { StyleTuple } from "../../../runtime/cssUtil"; -import { createTopLevelVariable, jsonToNode } from "../util"; +import { SubstitutionMap } from "../extractSubstitutionMap"; +import { createTopLevelVariable } from "../util"; +import { getStringWithSubstitutedValues } from "./substitutionUtil"; export const createTopLevelStyleTuplesVariable = ( babel: any, path: any, + substitutionMap: SubstitutionMap, styleTuples: StyleTuple[] ) => { + const { types: t } = babel; + const styleTuplesNode = t.arrayExpression( + styleTuples.map(([key, value]) => + t.arrayExpression([ + t.stringLiteral(key), + getStringWithSubstitutedValues(babel, substitutionMap, value), + ]) + ) + ); const unresolvedStyleTuplesVariable = createTopLevelVariable( babel, path, "unresolvedStyleTuples", - jsonToNode(babel, styleTuples), + styleTuplesNode, { prefix0: true } ); return unresolvedStyleTuplesVariable; diff --git a/compiler/babel/styleSheet/substitutionUtil.ts b/compiler/babel/styleSheet/substitutionUtil.ts index 61c74ad..e5e1e6d 100644 --- a/compiler/babel/styleSheet/substitutionUtil.ts +++ b/compiler/babel/styleSheet/substitutionUtil.ts @@ -1,4 +1,4 @@ -import { SubstitutionMap } from "../extractCss"; +import { SubstitutionMap } from "../extractSubstitutionMap"; export const getSubstitutionRegExp = (substitutionMap: SubstitutionMap) => { const substititionNames = Object.keys(substitutionMap); @@ -18,7 +18,7 @@ export const containsSubstitution = ( const getTemplateValues = (cooked: string) => ({ cooked, - raw: JSON.stringify(cooked).slice(1, -1) + raw: JSON.stringify(cooked).slice(1, -1), }); export const getStringWithSubstitutedValues = ( @@ -43,7 +43,7 @@ export const getStringWithSubstitutedValues = ( ? t.templateElement(templateValue) : t.templateElement(templateValue, true); }); - const expressions = expressionValues.map(value => + const expressions = expressionValues.map((value) => t.cloneDeep(substitutionMap[value]) ); diff --git a/compiler/babel/styleSheet/util.ts b/compiler/babel/styleSheet/util.ts new file mode 100644 index 0000000..d89f9f6 --- /dev/null +++ b/compiler/babel/styleSheet/util.ts @@ -0,0 +1 @@ +export const calcRe = /calc/g; diff --git a/compiler/babel/styleSheet/viewport.ts b/compiler/babel/styleSheet/viewport.ts index baae98e..bf68396 100644 --- a/compiler/babel/styleSheet/viewport.ts +++ b/compiler/babel/styleSheet/viewport.ts @@ -2,14 +2,15 @@ import { getPropertyName } from "css-to-react-native"; import { viewportUnitRegExp } from "../../../runtime/cssRegExp"; import { StyleTuple } from "../../../runtime/cssUtil"; import { StyleTuplesDeclaration } from "../../css/types"; -import { SubstitutionMap } from "../extractCss"; +import { SubstitutionMap } from "../extractSubstitutionMap"; import { Environment } from "../environment"; import unitTypes, { UnitType } from "./simpleUnitTypes"; +import { calcRe } from "./util"; export enum ViewportMode { None = 0, SimpleLengthUnits = 1, - ComplexUnits = 2 + ComplexUnits = 2, } export const getViewportMode = (rule: StyleTuplesDeclaration): ViewportMode => @@ -18,7 +19,10 @@ export const getViewportMode = (rule: StyleTuplesDeclaration): ViewportMode => ([prop, value]): ViewportMode => { if (!viewportUnitRegExp.test(value)) { return ViewportMode.None; - } else if (unitTypes[getPropertyName(prop)] === UnitType.Length) { + } else if ( + unitTypes[getPropertyName(prop)] === UnitType.Length && + !calcRe.test(value) + ) { return ViewportMode.SimpleLengthUnits; } else { return ViewportMode.ComplexUnits; diff --git a/compiler/babel/useAnimation.ts b/compiler/babel/useAnimation.ts index 13ccb75..40fdaec 100644 --- a/compiler/babel/useAnimation.ts +++ b/compiler/babel/useAnimation.ts @@ -6,7 +6,7 @@ import { createTopLevelVariable, createVariable, jsonToNode, - getOrCreateImport + getOrCreateImport, } from "./util"; export default ( @@ -21,7 +21,7 @@ export default ( // FIXME: We could be more granular than useCustomPropertyShorthandParts whenever one part has a variable in const animationImportsVariables = animations.some( - animation => animation.importedVariables.length > 0 + (animation) => animation.importedVariables.length > 0 ); let animationExpression: any; @@ -108,7 +108,7 @@ export default ( t.callExpression(useAnimationImport, [ keyframesVariable, animationExpression, - styleVariable + styleVariable, ]) ) ) diff --git a/compiler/babel/useCustomProperties.ts b/compiler/babel/useCustomProperties.ts index 0d0e3ea..5dedd3e 100644 --- a/compiler/babel/useCustomProperties.ts +++ b/compiler/babel/useCustomProperties.ts @@ -2,14 +2,14 @@ import { ComponentDefinition, Condition, - VariableExportDeclaration + VariableExportDeclaration, } from "../css/types"; import { Environment } from "./environment"; import buildCondition from "./buildCondition"; import { createTopLevelVariable, createVariable, - getOrCreateImport + getOrCreateImport, } from "./util"; const conditionsEqual = (a: Condition | null, b: Condition | null) => { @@ -37,7 +37,7 @@ export default ( const { exportedVariables } = cssOutput; const groups: ExportedVariablesGroup[] = []; - exportedVariables.forEach(exportedVariables => { + exportedVariables.forEach((exportedVariables) => { const { condition } = exportedVariables; const lastGroup = groups[groups.length - 1]; diff --git a/compiler/babel/useKeyframes.ts b/compiler/babel/useKeyframes.ts index 0f15d3d..8b4a478 100644 --- a/compiler/babel/useKeyframes.ts +++ b/compiler/babel/useKeyframes.ts @@ -1,6 +1,6 @@ import { ComponentDefinition, KeyframeOfStyleTuples } from "../css/types"; import styleBody from "./styleSheet/styleBody"; -import { SubstitutionMap } from "./extractCss"; +import { SubstitutionMap } from "./extractSubstitutionMap"; import { createTopLevelVariable } from "./util"; const createKeyframeStatic = ( @@ -15,7 +15,7 @@ const createKeyframeStatic = ( t.objectProperty( t.stringLiteral("style"), styleBody(babel, path, substitutionMap, keyframe.styleTuples) - ) + ), ]); }; @@ -27,7 +27,7 @@ const createKeyframesStatic = ( ) => { const { types: t } = babel; return t.arrayExpression( - sequence.map(keyframe => + sequence.map((keyframe) => createKeyframeStatic(babel, path, substitutionMap, keyframe) ) ); @@ -38,7 +38,7 @@ export default (babel: any, path: any, cssOutput: ComponentDefinition) => { const { keyframes } = cssOutput; const keyframesImportVariables = keyframes.some( - keyframe => keyframe.importedVariables.length !== 0 + (keyframe) => keyframe.importedVariables.length !== 0 ); let keyframesVariable: any; diff --git a/compiler/babel/useTransition.ts b/compiler/babel/useTransition.ts index 0b5fde3..ebd85eb 100644 --- a/compiler/babel/useTransition.ts +++ b/compiler/babel/useTransition.ts @@ -6,7 +6,7 @@ import { createTopLevelVariable, createVariable, jsonToNode, - getOrCreateImport + getOrCreateImport, } from "./util"; export default ( @@ -21,7 +21,7 @@ export default ( // FIXME: We could be more granular than useCustomPropertyShorthandParts whenever one part has a variable in const transitionImportsVariables = transitions.some( - transition => transition.importedVariables.length > 0 + (transition) => transition.importedVariables.length > 0 ); let transitionVariable: any; @@ -105,7 +105,7 @@ export default ( styleVariable, t.callExpression(useTransitionImport, [ transitionVariable, - styleVariable + styleVariable, ]) ) ) diff --git a/compiler/babel/util.ts b/compiler/babel/util.ts index 27c366a..81c5bf9 100644 --- a/compiler/babel/util.ts +++ b/compiler/babel/util.ts @@ -29,7 +29,7 @@ export const createVariable = ( const { types: t } = babel; const id = generateNiceId(babel, path, name, { prefix0 }); const declaration = t.variableDeclaration(kind, [ - t.variableDeclarator(id, init) + t.variableDeclarator(id, init), ]); const [declarationPath] = path.pushContainer("body", declaration); path.scope.registerDeclaration(declarationPath); @@ -46,7 +46,7 @@ export const createTopLevelVariable = ( const { types: t } = babel; const id = generateNiceId(babel, path, name, idOpts); const declaration = t.variableDeclaration("const", [ - t.variableDeclarator(id, init) + t.variableDeclarator(id, init), ]); const statementPath = path.getStatementParent(); const [declarationPath] = statementPath.insertBefore(declaration); @@ -61,12 +61,14 @@ export const jsonToNode = (babel: any, object: any) => { } else if (typeof object === "number") { return t.numericLiteral(object); } else if (Array.isArray(object)) { - return t.arrayExpression(object.map(element => jsonToNode(babel, element))); + return t.arrayExpression( + object.map((element) => jsonToNode(babel, element)) + ); } else if (object === null) { return t.nullLiteral(); } return t.objectExpression( - Object.keys(object).map(key => + Object.keys(object).map((key) => t.objectProperty(t.stringLiteral(key), jsonToNode(babel, object[key])) ) ); @@ -83,15 +85,15 @@ export const getImportBindings = ( ); const allImportBindings = importedName === "default" - ? allBindings.filter(reference => + ? allBindings.filter((reference) => t.isImportDefaultSpecifier(reference.path.node) ) : allBindings.filter( - reference => + (reference) => t.isImportSpecifier(reference.path.node) && reference.path.node.imported.name === importedName ); - const importBindingsForModule = allImportBindings.filter(reference => { + const importBindingsForModule = allImportBindings.filter((reference) => { const importDeclaration = reference.path.findParent(t.isImportDeclaration); const importModuleName = importDeclaration.node.source.value; return importModuleName === moduleName; diff --git a/compiler/css/__tests__/applyGlobals.ts b/compiler/css/__tests__/applyGlobals.ts new file mode 100644 index 0000000..f159bc2 --- /dev/null +++ b/compiler/css/__tests__/applyGlobals.ts @@ -0,0 +1,376 @@ +import postcss from "postcss"; +import { parseGlobals, applyGlobals } from "../applyGlobals"; + +test("Handles null/undefined", () => { + expect(parseGlobals(null)).toEqual({ + vars: new Map(), + conditions: [], + globalVarsOnly: false, + }); + expect(parseGlobals(undefined)).toEqual({ + vars: new Map(), + conditions: [], + globalVarsOnly: false, + }); +}); + +test("Handles objects", () => { + expect(parseGlobals({ color: "red" })).toEqual({ + vars: new Map([["color", new Set([0])]]), + conditions: [{ query: undefined, values: new Map([["color", "red"]]) }], + globalVarsOnly: false, + }); + expect(parseGlobals({ color: "red", other: "green" })).toEqual({ + vars: new Map([ + ["color", new Set([0])], + ["other", new Set([0])], + ]), + conditions: [ + { + query: undefined, + values: new Map([ + ["color", "red"], + ["other", "green"], + ]), + }, + ], + globalVarsOnly: false, + }); +}); + +test("Handles basic strings", () => { + expect( + parseGlobals(` + --color: red; + `) + ).toEqual({ + vars: new Map([["color", new Set([0])]]), + conditions: [{ query: undefined, values: new Map([["color", "red"]]) }], + globalVarsOnly: false, + }); + expect( + parseGlobals(` + --color: red; + --other: green; + `) + ).toEqual({ + vars: new Map([ + ["color", new Set([0])], + ["other", new Set([0])], + ]), + conditions: [ + { + query: undefined, + values: new Map([ + ["color", "red"], + ["other", "green"], + ]), + }, + ], + globalVarsOnly: false, + }); +}); + +test("Handles strings with media queries", () => { + expect( + parseGlobals(` + --color: red; + + @media (prefers-color-scheme: dark) { + --color: green; + } + `) + ).toEqual({ + vars: new Map([["color", new Set([0, 1])]]), + conditions: [ + { query: undefined, values: new Map([["color", "red"]]) }, + { + query: "(prefers-color-scheme: dark)", + values: new Map([["color", "green"]]), + }, + ], + globalVarsOnly: false, + }); + + expect( + parseGlobals(` + --color: red; + --other: green; + + @media (prefers-color-scheme: dark) { + --color: green; + --other: red; + } + `) + ).toEqual({ + vars: new Map([ + ["color", new Set([0, 1])], + ["other", new Set([0, 1])], + ]), + conditions: [ + { + query: undefined, + values: new Map([ + ["color", "red"], + ["other", "green"], + ]), + }, + { + query: "(prefers-color-scheme: dark)", + values: new Map([ + ["color", "green"], + ["other", "red"], + ]), + }, + ], + globalVarsOnly: false, + }); + + expect( + parseGlobals(` + --color: red; + --other: green; + + @media (prefers-color-scheme: dark) { + --color: green; + } + `) + ).toEqual({ + vars: new Map([ + ["color", new Set([0, 1])], + ["other", new Set([0])], + ]), + conditions: [ + { + query: undefined, + values: new Map([ + ["color", "red"], + ["other", "green"], + ]), + }, + { + query: "(prefers-color-scheme: dark)", + values: new Map([["color", "green"]]), + }, + ], + globalVarsOnly: false, + }); +}); + +test("Applying non-conditional globals", () => { + const globals = { + vars: new Map([["color", new Set([0])]]), + conditions: [{ query: undefined, values: new Map([["color", "red"]]) }], + globalVarsOnly: false, + }; + + const root = postcss.parse(` + .someRule { + color: var(--color); + } + `); + applyGlobals(root, globals); + expect(root.toString()).toMatchInlineSnapshot(` + " + .someRule { + color: red; + } + " + `); +}); + +test("Applying non-conditional globals with other values", () => { + const globals = { + vars: new Map([["color", new Set([0])]]), + conditions: [{ query: undefined, values: new Map([["color", "red"]]) }], + globalVarsOnly: false, + }; + + const root = postcss.parse(` + .someRule { + background: url(some-url) var(--color); + } + `); + applyGlobals(root, globals); + expect(root.toString()).toMatchInlineSnapshot(` + " + .someRule { + background: url(some-url) red; + } + " + `); +}); + +test("Applying non-conditional globals with multiple rules", () => { + const globals = { + vars: new Map([["color", new Set([0])]]), + conditions: [{ query: undefined, values: new Map([["color", "red"]]) }], + globalVarsOnly: false, + }; + + const root = postcss.parse(` + .someRule { + background: url(some-url) var(--color); + } + + .someOtherRule { + background: url(some-url) var(--color); + } + `); + applyGlobals(root, globals); + expect(root.toString()).toMatchInlineSnapshot(` + " + .someRule { + background: url(some-url) red; + } + + .someOtherRule { + background: url(some-url) red; + } + " + `); +}); + +test("Applying conditional globals", () => { + const globals = { + vars: new Map([["color", new Set([0, 1])]]), + conditions: [ + { query: undefined, values: new Map([["color", "red"]]) }, + { + query: "(prefers-color-scheme: dark)", + values: new Map([["color", "green"]]), + }, + ], + globalVarsOnly: false, + }; + + const root = postcss.parse(` + .someRule { + color: var(--color); + } + `); + applyGlobals(root, globals); + expect(root.toString()).toMatchInlineSnapshot(` + " + .someRule { + color: red; + } + @media (prefers-color-scheme: dark) { + .someRule { + color: green; + } + } + " + `); +}); + +test("Applying conditional globals with other non-var decls", () => { + const globals = { + vars: new Map([["color", new Set([0, 1])]]), + conditions: [ + { query: undefined, values: new Map([["color", "red"]]) }, + { + query: "(prefers-color-scheme: dark)", + values: new Map([["color", "green"]]), + }, + ], + globalVarsOnly: false, + }; + + const root = postcss.parse(` + .someRule { + notVar: something; + color: var(--color); + alsoNotVar: something else; + } + `); + applyGlobals(root, globals); + expect(root.toString()).toMatchInlineSnapshot(` + " + .someRule { + notVar: something; + color: red; + alsoNotVar: something else; + } + @media (prefers-color-scheme: dark) { + .someRule { + notVar: something; + color: green; + alsoNotVar: something else; + } + } + " + `); +}); + +test("Applying conditional globals inside media queries", () => { + const globals = { + vars: new Map([["color", new Set([0, 1])]]), + conditions: [ + { query: undefined, values: new Map([["color", "red"]]) }, + { + query: "(prefers-color-scheme: dark)", + values: new Map([["color", "green"]]), + }, + ], + globalVarsOnly: false, + }; + + const root = postcss.parse(` + .someRule { + color: var(--color); + } + + @media (platform: ios) { + .someRule { + background: var(--color); + color: orange; + } + } + + @media (platform: ios), (platform: android) { + .someRule { + border-color: var(--color); + } + } + `); + applyGlobals(root, globals); + expect(root.toString()).toMatchInlineSnapshot(` + " + .someRule { + color: red; + } + @media (prefers-color-scheme: dark) { + .someRule { + color: green; + } + } + + @media (platform: ios) { + .someRule { + background: red; + color: orange; + } + } + + @media (platform: ios) and (prefers-color-scheme: dark) { + .someRule { + background: green; + color: orange; + } + } + + @media (platform: ios), (platform: android) { + .someRule { + border-color: red; + } + } + + @media (platform: ios) and (prefers-color-scheme: dark), (platform: android) and (prefers-color-scheme: dark) { + .someRule { + border-color: green; + } + } + " + `); +}); diff --git a/compiler/css/__tests__/extractRules.ts b/compiler/css/__tests__/extractRules.ts index 914e84f..819d839 100644 --- a/compiler/css/__tests__/extractRules.ts +++ b/compiler/css/__tests__/extractRules.ts @@ -14,8 +14,8 @@ it("Scopes top-level declarations", () => { type: StyleType.Tuples, condition: null, styleTuples: [["color", "red"]], - importedVariables: [] - } + importedVariables: [], + }, ]); expect(rules.transitions).toEqual([]); expect(rules.animations).toEqual([]); @@ -34,9 +34,12 @@ it("Scopes multiple top-level declarations into one class", () => { { type: StyleType.Tuples, condition: null, - styleTuples: [["color", "red"], ["border-left-color", "green"]], - importedVariables: [] - } + styleTuples: [ + ["color", "red"], + ["border-left-color", "green"], + ], + importedVariables: [], + }, ]); expect(rules.transitions).toEqual([]); expect(rules.animations).toEqual([]); @@ -57,8 +60,8 @@ it("Scopes boolean attribute selectors", () => { type: StyleType.Tuples, condition: { selector: "&[cssta|attribute]", mediaQuery: null }, styleTuples: [["color", "red"]], - importedVariables: [] - } + importedVariables: [], + }, ]); expect(rules.transitions).toEqual([]); expect(rules.animations).toEqual([]); @@ -74,18 +77,18 @@ it("Scopes string attribute selectors", () => { `; const rules = extractRules(css); expect(rules.propTypes).toEqual({ - stringAttribute: { type: "oneOf", values: ["red"] } + stringAttribute: { type: "oneOf", values: ["red"] }, }); expect(rules.styles).toEqual([ { type: StyleType.Tuples, condition: { selector: '&[cssta|stringAttribute="red"]', - mediaQuery: null + mediaQuery: null, }, styleTuples: [["color", "red"]], - importedVariables: [] - } + importedVariables: [], + }, ]); expect(rules.transitions).toEqual([]); expect(rules.animations).toEqual([]); @@ -120,7 +123,7 @@ it("Scopes attribute selectors", () => { booleanValue1: { type: "bool" }, booleanValue2: { type: "bool" }, stringValue1: { type: "oneOf", values: ["a", "b"] }, - stringValue2: { type: "oneOf", values: ["c"] } + stringValue2: { type: "oneOf", values: ["c"] }, }); expect(rules.styles).toMatchInlineSnapshot(` Array [ @@ -213,7 +216,7 @@ it("Recognises variable declarations", () => { expect(rules.animations).toEqual([]); expect(rules.keyframes).toEqual([]); expect(rules.exportedVariables).toEqual([ - { condition: null, name: "color", value: "red", importedVariables: [] } + { condition: null, name: "color", value: "red", importedVariables: [] }, ]); }); @@ -228,8 +231,8 @@ it("Recognises variable imports", () => { type: StyleType.Tuples, condition: null, styleTuples: [["color", "var(--color)"]], - importedVariables: ["color"] - } + importedVariables: ["color"], + }, ]); expect(rules.transitions).toEqual([]); expect(rules.animations).toEqual([]); @@ -252,7 +255,7 @@ it("Recognises multiple variable declarations", () => { expect(rules.exportedVariables).toEqual([ { condition: null, name: "color", value: "red", importedVariables: [] }, { condition: null, name: "color", value: "blue", importedVariables: [] }, - { condition: null, name: "other", value: "green", importedVariables: [] } + { condition: null, name: "other", value: "green", importedVariables: [] }, ]); }); @@ -267,8 +270,8 @@ it("Recognises multiple variable imports", () => { type: StyleType.Tuples, condition: null, styleTuples: [["margin", "var(--large) var(--small)"]], - importedVariables: ["large", "small"] - } + importedVariables: ["large", "small"], + }, ]); expect(rules.transitions).toEqual([]); expect(rules.animations).toEqual([]); @@ -288,14 +291,14 @@ it("Mixes variable and style declarations", () => { type: StyleType.Tuples, condition: null, styleTuples: [["color", "var(--color)"]], - importedVariables: ["color"] - } + importedVariables: ["color"], + }, ]); expect(rules.transitions).toEqual([]); expect(rules.animations).toEqual([]); expect(rules.keyframes).toEqual([]); expect(rules.exportedVariables).toEqual([ - { condition: null, name: "color", value: "red", importedVariables: [] } + { condition: null, name: "color", value: "red", importedVariables: [] }, ]); }); @@ -307,7 +310,7 @@ it("Recognises transitions", () => { expect(rules.propTypes).toEqual({}); expect(rules.styles).toEqual([]); expect(rules.transitions).toEqual([ - { condition: null, part: { _: "color 1s linear" }, importedVariables: [] } + { condition: null, part: { _: "color 1s linear" }, importedVariables: [] }, ]); expect(rules.animations).toEqual([]); expect(rules.keyframes).toEqual([]); @@ -331,10 +334,10 @@ it("Recognises transitions using long hand", () => { property: "color", delay: "1s", duration: "2s", - timingFunction: "linear" + timingFunction: "linear", }, - importedVariables: [] - } + importedVariables: [], + }, ]); expect(rules.animations).toEqual([]); expect(rules.keyframes).toEqual([]); @@ -352,8 +355,8 @@ it("Recognises multiple separate transitions", () => { { condition: null, part: { _: "color 1s linear, transform 2s ease-in-out" }, - importedVariables: [] - } + importedVariables: [], + }, ]); expect(rules.animations).toEqual([]); expect(rules.keyframes).toEqual([]); @@ -372,8 +375,8 @@ it("Recognises multiple property transitions", () => { { condition: null, part: { _: "1s linear", property: "color, transform" }, - importedVariables: [] - } + importedVariables: [], + }, ]); expect(rules.animations).toEqual([]); expect(rules.keyframes).toEqual([]); @@ -393,8 +396,8 @@ it("Overrides previous transition declarations when using shorthand", () => { { condition: null, part: { _: "1s linear" }, - importedVariables: [] - } + importedVariables: [], + }, ]); expect(rules.animations).toEqual([]); expect(rules.keyframes).toEqual([]); @@ -412,8 +415,8 @@ it("Recognises multiple allows variables in transitions", () => { { condition: null, part: { _: "color var(--time) var(--easing)" }, - importedVariables: ["time", "easing"] - } + importedVariables: ["time", "easing"], + }, ]); expect(rules.animations).toEqual([]); expect(rules.keyframes).toEqual([]); @@ -432,8 +435,8 @@ it("Recognises animations", () => { { condition: null, part: { _: "test 1s linear" }, - importedVariables: [] - } + importedVariables: [], + }, ]); expect(rules.keyframes).toEqual([]); expect(rules.exportedVariables).toEqual([]); @@ -459,10 +462,10 @@ it("Recognises animation long hands", () => { duration: "1s", delay: "2s", iterations: "3", - timingFunction: "linear" + timingFunction: "linear", }, - importedVariables: [] - } + importedVariables: [], + }, ]); expect(rules.keyframes).toEqual([]); expect(rules.exportedVariables).toEqual([]); @@ -483,8 +486,8 @@ it("Overrides previous animation declarations when using shorthand", () => { { condition: null, part: { _: "test 1s" }, - importedVariables: [] - } + importedVariables: [], + }, ]); expect(rules.keyframes).toEqual([]); expect(rules.exportedVariables).toEqual([]); @@ -503,10 +506,10 @@ it("Recognises keyframes", () => { name: "test", sequence: [ { time: 0, styleTuples: [["opacity", "0"]] }, - { time: 1, styleTuples: [["opacity", "1"]] } + { time: 1, styleTuples: [["opacity", "1"]] }, ], - importedVariables: [] - } + importedVariables: [], + }, ]); }); @@ -529,19 +532,19 @@ it("Recognises multiple keyframes", () => { name: "test1", sequence: [ { time: 0, styleTuples: [["opacity", "0"]] }, - { time: 1, styleTuples: [["opacity", "1"]] } + { time: 1, styleTuples: [["opacity", "1"]] }, ], - importedVariables: [] + importedVariables: [], }, { name: "test2", sequence: [ { time: 0, styleTuples: [["opacity", "0"]] }, { time: 0.5, styleTuples: [["opacity", "0.5"]] }, - { time: 1, styleTuples: [["opacity", "1"]] } + { time: 1, styleTuples: [["opacity", "1"]] }, ], - importedVariables: [] - } + importedVariables: [], + }, ]); }); @@ -555,8 +558,8 @@ it("Imports variables from keyframes", () => { expect(keyframes[0].sequence).toEqual([ { time: 0, - styleTuples: [["color", "var(--primary)"]] - } + styleTuples: [["color", "var(--primary)"]], + }, ]); expect(keyframes[0].importedVariables).toEqual(["primary"]); }); @@ -574,8 +577,8 @@ it("Recognises media queries for top-level declarations", () => { type: StyleType.Tuples, condition: { selector: "&", mediaQuery: "(min-width: 500px)" }, styleTuples: [["color", "red"]], - importedVariables: [] - } + importedVariables: [], + }, ]); expect(rules.transitions).toEqual([]); expect(rules.animations).toEqual([]); @@ -598,11 +601,11 @@ it("Recognises media queries for nested rules", () => { type: StyleType.Tuples, condition: { selector: "&[cssta|prop]", - mediaQuery: "(min-width: 500px)" + mediaQuery: "(min-width: 500px)", }, styleTuples: [["color", "red"]], - importedVariables: [] - } + importedVariables: [], + }, ]); expect(rules.transitions).toEqual([]); expect(rules.animations).toEqual([]); @@ -750,8 +753,8 @@ it("Handles mixins", () => { { type: StyleType.Mixin, condition: null, - substitution: "someMixin" - } + substitution: "someMixin", + }, ]); expect(rules.transitions).toEqual([]); expect(rules.animations).toEqual([]); @@ -771,8 +774,8 @@ it("Handles conditional mixins", () => { { type: StyleType.Mixin, condition: { selector: "&[cssta|cond]", mediaQuery: null }, - substitution: "someMixin" - } + substitution: "someMixin", + }, ]); expect(rules.transitions).toEqual([]); expect(rules.animations).toEqual([]); @@ -792,8 +795,8 @@ it("Handles mixins in media queries", () => { { type: StyleType.Mixin, condition: { selector: "&", mediaQuery: "(min-width: 500px)" }, - substitution: "someMixin" - } + substitution: "someMixin", + }, ]); expect(rules.transitions).toEqual([]); expect(rules.animations).toEqual([]); @@ -816,10 +819,10 @@ it("Handles conditional mixins in media queries", () => { type: StyleType.Mixin, condition: { selector: "&[cssta|cond]", - mediaQuery: "(min-width: 500px)" + mediaQuery: "(min-width: 500px)", }, - substitution: "someMixin" - } + substitution: "someMixin", + }, ]); expect(rules.transitions).toEqual([]); expect(rules.animations).toEqual([]); @@ -841,20 +844,26 @@ it("Handles mixins within style tuples", () => { { type: StyleType.Tuples, condition: null, - styleTuples: [["top", "10px"], ["right", "10px"]], - importedVariables: [] + styleTuples: [ + ["top", "10px"], + ["right", "10px"], + ], + importedVariables: [], }, { type: StyleType.Mixin, condition: null, - substitution: "someMixin" + substitution: "someMixin", }, { type: StyleType.Tuples, condition: null, - styleTuples: [["bottom", "10px"], ["left", "var(--left)"]], - importedVariables: ["left"] - } + styleTuples: [ + ["bottom", "10px"], + ["left", "var(--left)"], + ], + importedVariables: ["left"], + }, ]); expect(rules.transitions).toEqual([]); expect(rules.animations).toEqual([]); diff --git a/compiler/css/__tests__/getRoot.ts b/compiler/css/__tests__/getRoot.ts index 90578a7..92c7839 100644 --- a/compiler/css/__tests__/getRoot.ts +++ b/compiler/css/__tests__/getRoot.ts @@ -148,7 +148,7 @@ it("Generates multile prop types for multiple attributes", () => { undefined, { boolAttribute: { type: "bool" }, - stringAttribute: { type: "oneOf", values: ["1", "2"] } + stringAttribute: { type: "oneOf", values: ["1", "2"] }, } ); }); diff --git a/compiler/css/applyGlobals.ts b/compiler/css/applyGlobals.ts new file mode 100644 index 0000000..3d92bb9 --- /dev/null +++ b/compiler/css/applyGlobals.ts @@ -0,0 +1,143 @@ +import postcss, { AtRule, Root } from "postcss"; +import { varRegExp } from "../../runtime/cssRegExp"; +import { Options } from "../options"; + +export type Globals = { + vars: Map>; + conditions: { + query: string | undefined; + values: Map; + }[]; + globalVarsOnly: boolean; +}; + +export const parseGlobals = ( + input: Record | string, + { globalVarsOnly = false } = {} +): Globals => { + if (input == null) { + return { vars: new Map(), conditions: [], globalVarsOnly }; + } else if (typeof input === "object") { + return { + vars: new Map(Object.keys(input).map((v) => [v, new Set([0])])), + conditions: [ + { query: undefined, values: new Map(Object.entries(input)) }, + ], + globalVarsOnly, + }; + } + + const root = postcss.parse(input); + + const atRules: AtRule[] = []; + root.walkAtRules("media", (atRule) => atRules.push(atRule)); + + const vars = new Map>(); + const conditions = [ + { query: undefined, values: new Map() }, + ...atRules.map((atRule) => ({ + query: atRule.params, + values: new Map(), + })), + ]; + + root.walkDecls((decl) => { + const prop = decl.prop.slice("--".length); + + let conditionIndex = 0; + if (decl.parent.type === "atrule" && decl.parent.name === "media") { + conditionIndex = atRules.indexOf(decl.parent) + 1; + } + + conditions[conditionIndex].values.set(prop, decl.value); + + if (!vars.has(prop)) vars.set(prop, new Set()); + vars.get(prop).add(conditionIndex); + }); + + return { vars, conditions, globalVarsOnly }; +}; + +export const applyGlobals = (root: Root, globals: Globals) => { + root.walkRules((rule) => { + const conditionProps = new Map(); + + rule.walkDecls((decl) => { + Array.from((decl.value as any).matchAll(varRegExp)).forEach( + (match: string[]) => { + const conditions = globals.vars.get(match[1]); + if (conditions == null) return; + conditions.forEach((cond) => { + conditionProps.set(cond, decl.prop); + }); + } + ); + }); + + // Sorted backwards + // We add the at rules directly after the rule, so the last needs to be added first + const conditionIndicies = Array.from(conditionProps.keys()).sort( + (a, b) => b - a + ); + + conditionIndicies.forEach((index) => { + const { query, values } = globals.conditions[index]; + + const ruleCopy = rule.clone(); + let didEdit = false; + + const replaceVars = (value: string) => + value.replace(varRegExp, (fullMatch, variable, fallback) => { + didEdit = true; + if (values.has(variable)) { + return values.get(variable); + } else if (fallback) { + return fallback; + } else if (!globals.globalVarsOnly) { + return fullMatch; + } else { + throw new Error( + `Found variable "${variable}". This was not defined in the globals, and \`globalVarsOnly\` is enabled. See line with \`var(--${variable})\`` + ); + } + }); + + ruleCopy.walkDecls((decl) => { + decl.value = replaceVars(decl.value); + }); + + if (!didEdit) return; + + if (query === undefined) { + rule.replaceWith(ruleCopy); + } else if (rule.parent.type === "atrule") { + const params = rule.parent.params + .split(",") + .map((rule) => `${rule} and ${query}`) + .join(","); + const atRule = postcss.atRule({ name: "media", params }); + atRule.append(ruleCopy); + rule.parent.parent.insertAfter(rule.parent, atRule); + } else { + /* + We do actually have to clone the whole rule for cases like + + border: 0px solid var(--color); + border-top: 1px; + border-bottom: 1px; + + Otherwise we'd reset the top and bottom width + + It's also more performant to copy the whole style, as a later stage + optimises for this exact case + */ + const atRule = postcss.atRule({ name: "media", params: query }); + atRule.append(ruleCopy); + rule.parent.insertAfter(rule, atRule); + } + }); + }); +}; + +export default (root: Root, options: Options) => + applyGlobals(root, parseGlobals(options.globals, options)); diff --git a/compiler/css/extractRules.ts b/compiler/css/extractRules.ts index eef3a04..55ca3cf 100644 --- a/compiler/css/extractRules.ts +++ b/compiler/css/extractRules.ts @@ -4,6 +4,7 @@ import { TransitionPart, AnimationPart } from "../../runtime/animationTypes"; import { StyleTuple } from "../../runtime/cssUtil"; import { varRegExp, varRegExpNonGlobal } from "../../runtime/cssRegExp"; import getRoot from "./getRoot"; +import applyGlobals from "./applyGlobals"; import { isDirectChildOfKeyframes } from "./util"; import { Condition, @@ -14,20 +15,20 @@ import { KeyframeOfStyleTuples, KeyframesDeclaration, ComponentDefinition, - StyleType + StyleType, } from "./types"; const walkToArray = ( walker: (callback: (node: Node) => void) => void ): T[] => { const nodes = []; - walker(node => nodes.push(node)); + walker((node) => nodes.push(node)); return nodes; }; const getStyleTuples = (nodes: Node[]): StyleTuple[] => nodes - .filter(node => node.type === "decl") + .filter((node) => node.type === "decl") .map((node: Declaration) => [node.prop, node.value]); const getStyleTuplesImportedVariables = ( @@ -35,11 +36,11 @@ const getStyleTuplesImportedVariables = ( ): string[] => { const importedVariablesSet = new Set(); - styleTuples.forEach(tuple => { + styleTuples.forEach((tuple) => { const referencedVariableMatches = tuple[1].match(varRegExp); if (referencedVariableMatches == null) return; - referencedVariableMatches.forEach(match => { + referencedVariableMatches.forEach((match) => { importedVariablesSet.add(match.match(varRegExpNonGlobal)[1]); }); }); @@ -54,7 +55,7 @@ const transitionAttributes: Record = { "transition-delay": "delay", "transition-duration": "duration", "transition-property": "property", - "transition-timing-function": "timingFunction" + "transition-timing-function": "timingFunction", }; const animationAttributes: Record = { @@ -63,7 +64,7 @@ const animationAttributes: Record = { "animation-duration": "duration", "animation-name": "name", "animation-timing-function": "timingFunction", - "animation-iteration-count": "iterations" + "animation-iteration-count": "iterations", }; const getTransitionAnimationParts = ( @@ -109,13 +110,13 @@ const filteredStyleTuples = ( styleTuples: StyleTuple[]; }> => { return declarationRules - .map(rule => { - const styleTuples = getStyleTuples(rule.nodes).filter(styleTuple => + .map((rule) => { + const styleTuples = getStyleTuples(rule.nodes).filter((styleTuple) => fn(styleTuple[0]) ); return { condition: getCondition(rule), styleTuples }; }) - .filter(style => style.styleTuples.length > 0); + .filter((style) => style.styleTuples.length > 0); }; const getStyleTuplesMixinsForRule = (rule: Rule): StyleDeclaration[] => { @@ -123,7 +124,7 @@ const getStyleTuplesMixinsForRule = (rule: Rule): StyleDeclaration[] => { const groups: StyleDeclaration[] = []; let currentStyleTuples = null; - rule.nodes.forEach(node => { + rule.nodes.forEach((node) => { switch (node.type) { case "decl": { const { prop, value } = node; @@ -142,11 +143,12 @@ const getStyleTuplesMixinsForRule = (rule: Rule): StyleDeclaration[] => { condition, styleTuples: [], // Set imported variables after - importedVariables: null as any + importedVariables: null as any, }; groups.push(currentStyleTuples); } currentStyleTuples.styleTuples.push([prop, value]); + break; } case "atrule": { if ((node as AtRule).name !== "include") { @@ -157,13 +159,13 @@ const getStyleTuplesMixinsForRule = (rule: Rule): StyleDeclaration[] => { groups.push({ type: StyleType.Mixin, condition, - substitution: (node as AtRule).params + substitution: (node as AtRule).params, }); } } }); - groups.forEach(group => { + groups.forEach((group) => { if (group.type === StyleType.Tuples) { group.importedVariables = getStyleTuplesImportedVariables( group.styleTuples @@ -175,12 +177,12 @@ const getStyleTuplesMixinsForRule = (rule: Rule): StyleDeclaration[] => { }; const getKeyframes = (atRule: AtRule): KeyframesDeclaration => { - const sequence = walkToArray(cb => atRule.walkRules(cb)) + const sequence = walkToArray((cb) => atRule.walkRules(cb)) .reduce((accum: KeyframeOfStyleTuples[], rule) => { const timeSelectors = rule.selector .split(",") - .map(selector => selector.trim()) - .map(selector => { + .map((selector) => selector.trim()) + .map((selector) => { if (/[\d.]%/.test(selector)) return parseFloat(selector) / 100; if (/from/i.test(selector)) return 0; if (/to/i.test(selector)) return 1; @@ -188,13 +190,13 @@ const getKeyframes = (atRule: AtRule): KeyframesDeclaration => { }); const styleTuples = getStyleTuples( - walkToArray(cb => rule.walkDecls(cb)) + walkToArray((cb) => rule.walkDecls(cb)) ); const newKeyframeBlocks: KeyframeOfStyleTuples[] = timeSelectors.map( - time => ({ + (time) => ({ time, - styleTuples + styleTuples, }) ); return accum.concat(newKeyframeBlocks); @@ -211,11 +213,12 @@ const getKeyframes = (atRule: AtRule): KeyframesDeclaration => { return { name, sequence, importedVariables }; }; -export default (inputCss: string): ComponentDefinition => { +export default (inputCss: string, globals?: any): ComponentDefinition => { const { root, propTypes } = getRoot(inputCss); + if (globals != null) applyGlobals(root, globals); - const declarationRules = walkToArray(cb => root.walkRules(cb)).filter( - rule => !isDirectChildOfKeyframes(rule) + const declarationRules = walkToArray((cb) => root.walkRules(cb)).filter( + (rule) => !isDirectChildOfKeyframes(rule) ); const styles: StyleDeclaration[] = declarationRules @@ -224,38 +227,39 @@ export default (inputCss: string): ComponentDefinition => { [] ) .filter( - style => style.type === StyleType.Mixin || style.styleTuples.length !== 0 + (style) => + style.type === StyleType.Mixin || style.styleTuples.length !== 0 ); const transitions: TransitionDeclaration[] = filteredStyleTuples( declarationRules, - property => property in transitionAttributes + (property) => property in transitionAttributes ).map(({ condition, styleTuples }) => ({ condition, part: getTransitionAnimationParts(styleTuples, transitionAttributes), - importedVariables: getStyleTuplesImportedVariables(styleTuples) + importedVariables: getStyleTuplesImportedVariables(styleTuples), })); const animations: AnimationDeclaration[] = filteredStyleTuples( declarationRules, - property => property in animationAttributes + (property) => property in animationAttributes ).map(({ condition, styleTuples }) => ({ condition, part: getTransitionAnimationParts(styleTuples, animationAttributes), - importedVariables: getStyleTuplesImportedVariables(styleTuples) + importedVariables: getStyleTuplesImportedVariables(styleTuples), })); - const keyframes: KeyframesDeclaration[] = walkToArray(cb => + const keyframes: KeyframesDeclaration[] = walkToArray((cb) => root.walkAtRules(cb) ) - .filter(atRule => atRule.name === "keyframes") + .filter((atRule) => atRule.name === "keyframes") .map(getKeyframes); const exportedVariables: VariableExportDeclaration[] = filteredStyleTuples( declarationRules, - property => property.startsWith("--") + (property) => property.startsWith("--") ).reduce((accum, { condition, styleTuples }) => { - const declarations = styleTuples.map(styleTuple => { + const declarations = styleTuples.map((styleTuple) => { const importedVariables = getStyleTuplesImportedVariables([styleTuple]); const name = styleTuple[0].substring("--".length); const value = styleTuple[1]; @@ -270,6 +274,6 @@ export default (inputCss: string): ComponentDefinition => { transitions, animations, keyframes, - exportedVariables + exportedVariables, }; }; diff --git a/compiler/css/getRoot.ts b/compiler/css/getRoot.ts index 8cf0077..fdb81f9 100644 --- a/compiler/css/getRoot.ts +++ b/compiler/css/getRoot.ts @@ -1,4 +1,3 @@ -// @flow /* eslint-disable no-param-reassign */ import postcss, { Root, AtRule, Node } from "postcss"; import selectorParser from "postcss-selector-parser"; @@ -52,7 +51,7 @@ const nestNode = (node: Node) => { export default ( inputCss: string, - allowCombinators: boolean = false + allowCombinators = false ): { root: Root; propTypes: PropTypes } => { const transformedInput = inputCss.replace(/(\[\s*)@(\w)/g, `$1cssta|$2`); const root = postcss.parse(transformedInput); @@ -60,15 +59,15 @@ export default ( iterateChildren(root, nestNode); const propTypes = {}; - const validateAndTransformSelectors = selectorParser(container => { - container.each(selector => { + const validateAndTransformSelectors = selectorParser((container) => { + container.each((selector) => { if (selector.type !== "selector") { throw new Error("Expected selector"); } let didScopeNode = false; - selector.walk(node => { + selector.walk((node) => { if (node.type === "combinator" && !allowCombinators) { throw new Error("Invalid use of combinator in selector"); } else if (node.type === "nesting") { @@ -81,7 +80,7 @@ export default ( ? node.parent.parent.parent : node.parent; const isTiedToNesting = nodeThatMustBeTiedToNesting.nodes.some( - child => child.type === "nesting" + (child) => child.type === "nesting" ); if (!isTiedToNesting) { @@ -128,7 +127,7 @@ export default ( }); }); - root.walkRules(rule => { + root.walkRules((rule) => { if (!isDirectChildOfKeyframes(rule)) { rule.selector = validateAndTransformSelectors.processSync(rule.selector); } diff --git a/compiler/css/types.ts b/compiler/css/types.ts index 8b9dc1a..f762f09 100644 --- a/compiler/css/types.ts +++ b/compiler/css/types.ts @@ -39,7 +39,7 @@ export type VariableExportDeclaration = { export enum StyleType { Tuples, - Mixin + Mixin, } export type StyleTuplesDeclaration = { diff --git a/compiler/babel/options.ts b/compiler/options.ts similarity index 61% rename from compiler/babel/options.ts rename to compiler/options.ts index ff6e073..f224698 100644 --- a/compiler/babel/options.ts +++ b/compiler/options.ts @@ -1,5 +1,5 @@ export type Options = { jsx?: boolean; - globals?: Record; + globals?: Record | string; globalVarsOnly?: boolean; }; diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index aa6a699..dfeb388 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -205,7 +205,7 @@ GEM jekyll-seo-tag (~> 2.1) minitest (5.11.3) multipart-post (2.1.1) - nokogiri (1.10.4) + nokogiri (1.10.8) mini_portile2 (~> 2.4.0) octokit (4.14.0) sawyer (~> 0.8.0, >= 0.5.3) @@ -219,7 +219,7 @@ GEM ruby-enum (0.7.2) i18n ruby_dep (1.5.0) - rubyzip (1.2.3) + rubyzip (2.0.0) safe_yaml (1.0.5) sass (3.7.4) sass-listen (~> 4.0.0) diff --git a/docs/media-queries.md b/docs/media-queries.md index c41ab3d..052acfa 100644 --- a/docs/media-queries.md +++ b/docs/media-queries.md @@ -25,7 +25,7 @@ const Title = cssta(Text)` @media (platform: ios) { font-family: "San Francisco"; } -}; +`; ``` Just like in CSS, rules can be nested in media queries. @@ -55,7 +55,7 @@ const Title = cssta(Text)` @media (platform: ios) and (min-width: 600px) { font-family: "San Francisco Display"; } -}; +`; ``` We also support viewport units. diff --git a/native.d.ts b/native.d.ts new file mode 100644 index 0000000..d7044ac --- /dev/null +++ b/native.d.ts @@ -0,0 +1,17 @@ +declare module 'cssta/native' { + type CssConstructor = ( + css: TemplateStringsArray, + ...values: (string | number | (() => any))[] + ) => T; + + type ComponentConstructor = ( + component: React.ElementType, + ) => CssConstructor>>; + + type Mixin = { + mixin: CssConstructor; + }; + + const styled: ComponentConstructor & Mixin; + export default styled; +} diff --git a/package.json b/package.json index 3414668..eca44ff 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,11 @@ { "name": "cssta", - "version": "0.9.3", + "version": "0.10.1", "main": "index.js", "license": "MIT", "scripts": { "test": "jest", + "build": "tsc", "prepack": "tsc", "clean": "git clean -xf compiler runtime", "readme": "cp ./docs/index.md ./README.md; sed -i -e 's%{{ site.baseurl }}%https://jacobp100.github.io/cssta%g' ./README.md; sed -i -e 's/{% raw %}//g' ./README.md; sed -i -e 's/{% endraw %}//g' ./README.md; sed -i -e '1,5d' ./README.md; rm ./README.md-e" @@ -26,37 +27,48 @@ "url": "https://github.com/jacobp100/cssta" }, "files": [ - "compiler", - "runtime", + "compiler/**/*.js", + "runtime/**/*.js", "native.macro.js", - "babel-plugin.js" + "babel-plugin.js", + "native.d.ts" ], "devDependencies": { - "@babel/core": "^7.6.2", - "@babel/generator": "^7.5.5", - "@babel/plugin-transform-modules-commonjs": "^7.5.0", - "@babel/preset-env": "^7.6.2", - "@babel/preset-typescript": "^7.6.0", - "@types/jest": "^24.0.18", - "@types/node": "^12.7.11", - "@types/react": "^16.9.5", - "@types/react-native": "^0.60.18", - "@types/react-test-renderer": "^16.9.0", - "babel-plugin-macros": "^2.6.1", - "eslint": "^6.3.0", + "@babel/core": "^7.7.5", + "@babel/generator": "^7.7.4", + "@babel/plugin-transform-modules-commonjs": "^7.7.5", + "@babel/preset-env": "^7.7.6", + "@babel/preset-typescript": "^7.7.4", + "@types/jest": "^24.0.23", + "@types/node": "^12.12.17", + "@types/react-test-renderer": "^16.9.1", + "@typescript-eslint/eslint-plugin": "^2.11.0", + "@typescript-eslint/parser": "^2.11.0", + "babel-plugin-macros": "^2.8.0", + "eslint": "^6.7.2", "jest": "^24.9.0", - "prettier": "^1.18.2", - "react": "^16.10.2", - "react-test-renderer": "^16.10.2", - "typescript": "^3.6.3" + "prettier": "^2.2.1", + "react": "^16.12.0", + "react-test-renderer": "^16.12.0", + "typescript": "^3.7.3" }, "dependencies": { + "@types/react": "16.9.5", + "@types/react-native": "^0.60.25", "css-color-function": "^1.3.3", - "css-to-react-native": "^2.3.2", - "postcss": "^7.0.17", + "css-to-react-native": "^3.0.0", + "postcss": "^7.0.24", "postcss-selector-parser": "^6.0.2" }, "jest": { - "testRegex": "/__tests__/.*\\.ts?$" + "testRegex": "/__tests__/.*\\.ts?$", + "moduleFileExtensions": [ + "ts", + "tsx", + "js", + "jsx", + "json", + "node" + ] } } diff --git a/runtime/__mocks__/react-native.ts b/runtime/__mocks__/react-native.ts index 97dc74a..ed9fd97 100644 --- a/runtime/__mocks__/react-native.ts +++ b/runtime/__mocks__/react-native.ts @@ -2,7 +2,7 @@ export const Easing = { linear: "linear", ease: "ease", bezier: (a: number, b: number, c: number, d: number) => - `bezier(${a}, ${b}, ${c}, ${d})` + `bezier(${a}, ${b}, ${c}, ${d})`, }; export class AnimatedNode { @@ -33,7 +33,7 @@ export class AnimatedNode { } export const Animated = { - Value: function(value: number) { + Value: function (value: number) { return new AnimatedNode("value", value); }, timing: (value: AnimatedNode, options: any) => @@ -43,7 +43,7 @@ export const Animated = { parallel: (value: AnimatedNode, options: any) => new AnimatedNode("parallel", value, options), sequence: (value: AnimatedNode, options: any) => - new AnimatedNode("sequence", value, options) + new AnimatedNode("sequence", value, options), }; export const StyleSheet = { @@ -52,5 +52,5 @@ export const StyleSheet = { ? Object.assign({}, ...values.map(StyleSheet.flatten)) : values != null ? values - : {} + : {}, }; diff --git a/runtime/__tests__/animationUtil.ts b/runtime/__tests__/animationUtil.ts index fe6107a..6843cfb 100644 --- a/runtime/__tests__/animationUtil.ts +++ b/runtime/__tests__/animationUtil.ts @@ -12,7 +12,7 @@ it("Inteprolates string values", () => { expect(interpolated).toEqual({ type: "interpolate", value: 0, - options: { inputRange: [0, 1], outputRange: ["red", "green"] } + options: { inputRange: [0, 1], outputRange: ["red", "green"] }, }); }); @@ -22,7 +22,7 @@ it("Inteprolates number values with interpolate numbers = false", () => { expect(interpolated).toEqual({ type: "interpolate", value: 0, - options: { inputRange: [0, 1], outputRange: [5, 10] } + options: { inputRange: [0, 1], outputRange: [5, 10] }, }); }); @@ -38,7 +38,7 @@ it("Inteprolates transforms", () => { [0, 1], [ [{ translateY: 5 }, { rotate: "30deg" }], - [{ translateY: 10 }, { rotate: "45deg" }] + [{ translateY: 10 }, { rotate: "45deg" }], ], animation, false @@ -48,16 +48,16 @@ it("Inteprolates transforms", () => { translateY: { type: "interpolate", value: 0, - options: { inputRange: [0, 1], outputRange: [5, 10] } - } + options: { inputRange: [0, 1], outputRange: [5, 10] }, + }, }, { rotate: { type: "interpolate", value: 0, - options: { inputRange: [0, 1], outputRange: ["30deg", "45deg"] } - } - } + options: { inputRange: [0, 1], outputRange: ["30deg", "45deg"] }, + }, + }, ]); }); @@ -68,7 +68,7 @@ it("Logs console error when animated transform nodes don't match", () => { [0, 1], [ [{ translateY: 5 }, { rotate: "30deg" }], - [{ translateY: 10 }, { rotate: "45deg" }, { scale: 3 }] + [{ translateY: 10 }, { rotate: "45deg" }, { scale: 3 }], ], animation, false @@ -87,7 +87,7 @@ it("Doesn't crash when transform nodes don't match", () => { [0, 1], [ [{ translateY: 10 }, { rotate: "45deg" }, { scale: 3 }], - [{ translateY: 5 }, { rotate: "30deg" }] + [{ translateY: 5 }, { rotate: "30deg" }], ], animation, false diff --git a/runtime/__tests__/useAnimation.ts b/runtime/__tests__/useAnimation.ts index c125cfa..b593a34 100644 --- a/runtime/__tests__/useAnimation.ts +++ b/runtime/__tests__/useAnimation.ts @@ -8,15 +8,15 @@ it("Fires animation on creation", () => { const keyframes = { test: [ { time: 0, style: { color: "red" } }, - { time: 1, style: { color: "blue" } } - ] + { time: 1, style: { color: "blue" } }, + ], }; const animation: Animation = { delay: 0, duration: 1000, iterations: 1, name: "test", - timingFunction: "linear" + timingFunction: "linear", }; const startSpy = jest.spyOn(AnimatedNode.prototype, "start"); @@ -37,7 +37,7 @@ it("Fires animation on creation", () => { expect(animationStyle.color).toEqual({ type: "interpolate", value: 0, - options: { inputRange: [0, 1], outputRange: ["red", "blue"] } + options: { inputRange: [0, 1], outputRange: ["red", "blue"] }, }); expect(startSpy).toHaveReturnedWith({ type: "parallel", @@ -45,9 +45,9 @@ it("Fires animation on creation", () => { { type: "timing", value: { type: "value", value: 0 }, - options: { delay: 0, duration: 1000, easing: "linear", toValue: 1 } - } - ] + options: { delay: 0, duration: 1000, easing: "linear", toValue: 1 }, + }, + ], }); expect(setValueSpy).toHaveBeenCalledWith(0); expect(setValueSpy).toHaveReturnedWith({ type: "value", value: 0 }); @@ -61,8 +61,8 @@ it("Handles no animation", () => { const keyframes = { test: [ { time: 0, style: { color: "red" } }, - { time: 1, style: { color: "blue" } } - ] + { time: 1, style: { color: "blue" } }, + ], }; const startSpy = jest.spyOn(AnimatedNode.prototype, "start"); @@ -89,15 +89,15 @@ it("Handles going from no animation to an animation", () => { const keyframes = { test: [ { time: 0, style: { color: "red" } }, - { time: 1, style: { color: "blue" } } - ] + { time: 1, style: { color: "blue" } }, + ], }; const animation: Animation = { delay: 0, duration: 1000, iterations: 1, name: "test", - timingFunction: "linear" + timingFunction: "linear", }; const startSpy = jest.spyOn(AnimatedNode.prototype, "start"); @@ -120,7 +120,7 @@ it("Handles going from no animation to an animation", () => { expect(style[1].color).toEqual({ type: "interpolate", value: 0, - options: { inputRange: [0, 1], outputRange: ["red", "blue"] } + options: { inputRange: [0, 1], outputRange: ["red", "blue"] }, }); expect(startSpy).toHaveReturnedWith({ type: "parallel", @@ -128,9 +128,9 @@ it("Handles going from no animation to an animation", () => { { type: "timing", value: { type: "value", value: 0 }, - options: { delay: 0, duration: 1000, easing: "linear", toValue: 1 } - } - ] + options: { delay: 0, duration: 1000, easing: "linear", toValue: 1 }, + }, + ], }); expect(setValueSpy).toHaveBeenCalledWith(0); expect(setValueSpy).toHaveReturnedWith({ type: "value", value: 0 }); @@ -144,26 +144,26 @@ it("Handles changing animation to an animation", () => { const keyframes = { test: [ { time: 0, style: { color: "red" } }, - { time: 1, style: { color: "blue" } } + { time: 1, style: { color: "blue" } }, ], other: [ { time: 0, style: { color: "orange" } }, - { time: 1, style: { color: "purple" } } - ] + { time: 1, style: { color: "purple" } }, + ], }; const animation1: Animation = { delay: 0, duration: 1000, iterations: 1, name: "test", - timingFunction: "linear" + timingFunction: "linear", }; const animation2: Animation = { delay: 0, duration: 2000, iterations: 1, name: "other", - timingFunction: "linear" + timingFunction: "linear", }; const startSpy = jest.spyOn(AnimatedNode.prototype, "start"); @@ -185,7 +185,7 @@ it("Handles changing animation to an animation", () => { expect(animationStyle.color).toEqual({ type: "interpolate", value: 0, - options: { inputRange: [0, 1], outputRange: ["red", "blue"] } + options: { inputRange: [0, 1], outputRange: ["red", "blue"] }, }); expect(startSpy).toHaveLastReturnedWith({ type: "parallel", @@ -193,9 +193,9 @@ it("Handles changing animation to an animation", () => { { type: "timing", value: { type: "value", value: 0 }, - options: { delay: 0, duration: 1000, easing: "linear", toValue: 1 } - } - ] + options: { delay: 0, duration: 1000, easing: "linear", toValue: 1 }, + }, + ], }); expect(setValueSpy).toHaveBeenLastCalledWith(0); expect(setValueSpy).toHaveLastReturnedWith({ type: "value", value: 0 }); @@ -206,7 +206,7 @@ it("Handles changing animation to an animation", () => { expect(animationStyle.color).toEqual({ type: "interpolate", value: 0, - options: { inputRange: [0, 1], outputRange: ["orange", "purple"] } + options: { inputRange: [0, 1], outputRange: ["orange", "purple"] }, }); expect(startSpy).toHaveLastReturnedWith({ type: "parallel", @@ -214,9 +214,9 @@ it("Handles changing animation to an animation", () => { { type: "timing", value: { type: "value", value: 0 }, - options: { delay: 0, duration: 2000, easing: "linear", toValue: 1 } - } - ] + options: { delay: 0, duration: 2000, easing: "linear", toValue: 1 }, + }, + ], }); expect(setValueSpy).toHaveBeenLastCalledWith(0); expect(setValueSpy).toHaveLastReturnedWith({ type: "value", value: 0 }); @@ -230,15 +230,15 @@ it("Fires animation on creation", () => { const keyframes = { test: [ { time: 0, style: { color: "red", opacity: 0 } }, - { time: 1, style: { color: "blue", opacity: 1 } } - ] + { time: 1, style: { color: "blue", opacity: 1 } }, + ], }; const animation: Animation = { delay: 0, duration: 1000, iterations: 1, name: "test", - timingFunction: "linear" + timingFunction: "linear", }; let animationStyle: any; @@ -262,15 +262,15 @@ it("Handles looping", () => { const keyframes = { test: [ { time: 0, style: { color: "red" } }, - { time: 1, style: { color: "blue" } } - ] + { time: 1, style: { color: "blue" } }, + ], }; const animation: Animation = { delay: 0, duration: 1000, iterations: 3, name: "test", - timingFunction: "linear" + timingFunction: "linear", }; const startSpy = jest.spyOn(AnimatedNode.prototype, "start"); @@ -297,19 +297,19 @@ it("Handles looping", () => { delay: 0, duration: 1000, easing: "linear", - toValue: 1 - } + toValue: 1, + }, }, { type: "timing", value: { type: "value", value: 0 }, - options: { duration: 0, toValue: 0 } - } - ] + options: { duration: 0, toValue: 0 }, + }, + ], }, - options: { iterations: 3 } - } - ] + options: { iterations: 3 }, + }, + ], }); instance.unmount(); @@ -323,7 +323,7 @@ it("Handles no animation", () => { duration: 1000, iterations: 3, name: null, - timingFunction: "linear" + timingFunction: "linear", }; const startSpy = jest.spyOn(AnimatedNode.prototype, "start"); @@ -343,20 +343,20 @@ it("Handles no animation", () => { it("Handles missing start frame", () => { const keyframes = { - test: [{ time: 1, style: { color: "blue" } }] + test: [{ time: 1, style: { color: "blue" } }], }; const animation: Animation = { delay: 0, duration: 1000, iterations: 3, name: "test", - timingFunction: "linear" + timingFunction: "linear", }; let animationStyle: any; const Test = () => { [, /* inputStyle */ animationStyle] = useAnimation(keyframes, animation, { - color: "red" + color: "red", }); return null; }; @@ -369,9 +369,9 @@ it("Handles missing start frame", () => { value: 0, options: { inputRange: [0, 1], - outputRange: ["red", "blue"] - } - } + outputRange: ["red", "blue"], + }, + }, }); instance.unmount(); @@ -379,20 +379,20 @@ it("Handles missing start frame", () => { it("Handles missing end frame", () => { const keyframes = { - test: [{ time: 0, style: { color: "blue" } }] + test: [{ time: 0, style: { color: "blue" } }], }; const animation: Animation = { delay: 0, duration: 1000, iterations: 3, name: "test", - timingFunction: "linear" + timingFunction: "linear", }; let animationStyle: any; const Test = () => { [, /* inputStyle */ animationStyle] = useAnimation(keyframes, animation, { - color: "red" + color: "red", }); return null; }; @@ -405,9 +405,9 @@ it("Handles missing end frame", () => { value: 0, options: { inputRange: [0, 1], - outputRange: ["blue", "red"] - } - } + outputRange: ["blue", "red"], + }, + }, }); instance.unmount(); diff --git a/runtime/__tests__/useCustomPropertyStyle.ts b/runtime/__tests__/useCustomPropertyStyle.ts index ad44771..de2233d 100644 --- a/runtime/__tests__/useCustomPropertyStyle.ts +++ b/runtime/__tests__/useCustomPropertyStyle.ts @@ -7,7 +7,7 @@ import VariablesContext from "../VariablesContext"; it("Converts style tuples and variables into a style object", () => { const styleTuples: [string, string][] = [ ["color", "red"], - ["margin", "var(--small)"] + ["margin", "var(--small)"], ]; let style: any; @@ -30,7 +30,7 @@ it("Converts style tuples and variables into a style object", () => { marginTop: 10, marginRight: 10, marginBottom: 10, - marginLeft: 10 + marginLeft: 10, }); instance.unmount(); diff --git a/runtime/__tests__/useTransition.ts b/runtime/__tests__/useTransition.ts index f29a272..7020ff1 100644 --- a/runtime/__tests__/useTransition.ts +++ b/runtime/__tests__/useTransition.ts @@ -9,8 +9,8 @@ it("Transitions when changing styles", () => { property: "color", delay: 0, duration: 1000, - timingFunction: "linear" - } + timingFunction: "linear", + }, ]; let transitionStyle: any; @@ -27,8 +27,8 @@ it("Transitions when changing styles", () => { color: { options: { inputRange: [0, 1], outputRange: ["red", "red"] }, type: "interpolate", - value: 0 - } + value: 0, + }, }); instance.update(React.createElement(Test, { styles: { color: "blue" } })); @@ -37,8 +37,8 @@ it("Transitions when changing styles", () => { color: { options: { inputRange: [0, 1], outputRange: ["red", "blue"] }, type: "interpolate", - value: 0 - } + value: 0, + }, }); instance.unmount(); @@ -50,8 +50,8 @@ it("Does not transition when style has no value", () => { property: "color", delay: 0, duration: 1000, - timingFunction: "linear" - } + timingFunction: "linear", + }, ]; let transitionStyle: any; @@ -73,8 +73,8 @@ it("Handles going from no value to a new value", () => { property: "color", delay: 0, duration: 1000, - timingFunction: "linear" - } + timingFunction: "linear", + }, ]; let transitionStyle: any; @@ -97,8 +97,8 @@ it("Handles going from no value to a new value", () => { color: { options: { inputRange: [0, 1], outputRange: ["red", "blue"] }, type: "interpolate", - value: 0 - } + value: 0, + }, }); instance.unmount(); @@ -110,8 +110,8 @@ it("Handles adding more transitioned values", () => { property: "color", delay: 0, duration: 1000, - timingFunction: "linear" - } + timingFunction: "linear", + }, ]; const transition2: Transition = [ ...transition1, @@ -119,8 +119,8 @@ it("Handles adding more transitioned values", () => { property: "opacity", delay: 0, duration: 1000, - timingFunction: "linear" - } + timingFunction: "linear", + }, ]; let transitionStyle: any; @@ -132,7 +132,7 @@ it("Handles adding more transitioned values", () => { const instance = create( React.createElement(Test, { styles: { color: "red", opacity: 0 }, - transition: transition1 + transition: transition1, }) ); @@ -140,14 +140,14 @@ it("Handles adding more transitioned values", () => { color: { options: { inputRange: [0, 1], outputRange: ["red", "red"] }, type: "interpolate", - value: 0 - } + value: 0, + }, }); instance.update( React.createElement(Test, { styles: { color: "blue", opacity: 0.5 }, - transition: transition1 + transition: transition1, }) ); @@ -155,14 +155,14 @@ it("Handles adding more transitioned values", () => { color: { options: { inputRange: [0, 1], outputRange: ["red", "blue"] }, type: "interpolate", - value: 0 - } + value: 0, + }, }); instance.update( React.createElement(Test, { styles: { color: "green", opacity: 1 }, - transition: transition2 + transition: transition2, }) ); @@ -170,9 +170,9 @@ it("Handles adding more transitioned values", () => { color: { options: { inputRange: [0, 1], outputRange: ["blue", "green"] }, type: "interpolate", - value: 0 + value: 0, }, - opacity: { type: "value", value: 0.5 } + opacity: { type: "value", value: 0.5 }, }); instance.unmount(); diff --git a/runtime/animationUtil.ts b/runtime/animationUtil.ts index ed081c4..6aeaf01 100644 --- a/runtime/animationUtil.ts +++ b/runtime/animationUtil.ts @@ -23,7 +23,7 @@ export const interpolateValue = ( if (process.env.NODE_ENV !== "production") { const currentProperties = String(firstValue.map(Object.keys)); // Not the *best* practise here... - const transformsAreConsistent = outputRange.every(range => { + const transformsAreConsistent = outputRange.every((range) => { const rangeProperties = String( (range as TransformInterpolation).map(Object.keys) ); @@ -40,7 +40,7 @@ export const interpolateValue = ( return firstValue.map((transform, index) => { const transformProperty = Object.keys(transform)[0]; - const innerOutputRange = outputRange.map(range => { + const innerOutputRange = outputRange.map((range) => { const rangeValue = range[index]; return rangeValue != null ? rangeValue[transformProperty] : null; }); @@ -48,7 +48,7 @@ export const interpolateValue = ( // We *have* to interpolate even numeric values, as we will always animate between 0--1 const interpolation = animation.interpolate({ inputRange, - outputRange: innerOutputRange + outputRange: innerOutputRange, }); return { [transformProperty]: interpolation }; @@ -60,5 +60,5 @@ export const easingFunctions: Record = { ease: Easing.ease, "ease-in": Easing.bezier(0.42, 0, 1.0, 1.0), "ease-out": Easing.bezier(0, 0, 0.58, 1.0), - "ease-in-out": Easing.bezier(0.42, 0, 0.58, 1.0) + "ease-in-out": Easing.bezier(0.42, 0, 0.58, 1.0), }; diff --git a/runtime/css-transforms/calc.ts b/runtime/css-transforms/calc.ts new file mode 100644 index 0000000..989f4ae --- /dev/null +++ b/runtime/css-transforms/calc.ts @@ -0,0 +1,79 @@ +// Two levels of nesting +const calcFnRe = /calc\(((?:[^(]|\((?:[^(]|\([^(]+\))+\))+)\)/g; +const bracketsRe = /\(([^)]+)\)/g; +const addSubtractRe = /([^+-]+)([+-])(.*)/; +const multiplyDivideRe = /([^*/]+)([*/])(.*)/; +const unitRe = /([\d.]+)(px|)/; + +type Node = { value: number; unit: "" | "px" }; + +const resolveValue = (value: string): Node | null => { + const match = value.match(unitRe); + if (match === null) return null; + return { value: Number(match[1]), unit: match[2] as any }; +}; + +const resolveMultiplyDivide = (value: string): Node | null => { + const match = value.match(multiplyDivideRe); + if (match === null) return resolveValue(value); + + const lhs = resolveValue(match[1]); + if (lhs === null) return null; + const rhs = resolveMultiplyDivide(match[3]); + if (rhs === null) return null; + + if (match[2] === "*") { + if (lhs.unit.length === 0) { + return { value: lhs.value * rhs.value, unit: rhs.unit }; + } else if (rhs.unit.length === 0) { + return { value: lhs.value * rhs.value, unit: lhs.unit }; + } + } else if (match[2] === "/") { + if (rhs.unit.length === 0) { + return { value: lhs.value / rhs.value, unit: lhs.unit }; + } + } + + return null; +}; + +const resolveAddSubtract = (value: string): Node | null => { + const match = value.match(addSubtractRe); + if (match === null) return resolveMultiplyDivide(value); + + const lhs = resolveMultiplyDivide(match[1]); + if (lhs === null) return null; + const rhs = resolveAddSubtract(match[3]); + if (rhs === null) return null; + + if (lhs.unit !== rhs.unit) return null; + + return { + value: match[2] === "+" ? lhs.value + rhs.value : lhs.value - rhs.value, + unit: lhs.unit, + }; +}; + +const resolveBrackets = (value: string): string => { + const out = value.replace(bracketsRe, (_, inner) => resolveBrackets(inner)); + const node = resolveAddSubtract(out); + + if (node !== null) { + return `${node.value}${node.unit}`; + } else { + throw new Error("Failed to parse calc"); + } +}; + +export default (inputValue: string): string => { + let value = inputValue; + let didReplace: boolean; + do { + didReplace = false; + value = value.replace(calcFnRe, (_, rest) => { + didReplace = true; + return resolveBrackets(rest); + }); + } while (didReplace); + return value; +}; diff --git a/runtime/cssUtil.ts b/runtime/cssUtil.ts index eb2009d..9d905e0 100644 --- a/runtime/cssUtil.ts +++ b/runtime/cssUtil.ts @@ -1,6 +1,7 @@ import cssToReactNative, { transformRawValue } from "css-to-react-native"; import transformVariables from "./css-transforms/variables"; import transformColors from "./css-transforms/colors"; +import transformCalc from "./css-transforms/calc"; import { Variables } from "./VariablesContext"; // Viewport (hopefully) already transformed @@ -19,6 +20,7 @@ export const transformStyleTuples = ( transformedValue = transformVariables(transformedValue, appliedVariables); } transformedValue = transformColors(transformedValue); + transformedValue = transformCalc(transformedValue); return [property, transformedValue]; }); return cssToReactNative(transformedStyleTuples); diff --git a/runtime/flattenAnimation.ts b/runtime/flattenAnimation.ts index b6e2366..ed1b9a1 100644 --- a/runtime/flattenAnimation.ts +++ b/runtime/flattenAnimation.ts @@ -1,7 +1,7 @@ import { getDurationInMs, durationRegExp, - easingRegExp + easingRegExp, } from "./animationShorthandUtil"; import { Animation, AnimationPart } from "./animationTypes"; @@ -15,7 +15,7 @@ const defaultValue = (): Animation => ({ duration: 0, iterations: 1, name: null, - timingFunction: "ease" + timingFunction: "ease", }); const TIMING_FUNCTION = 1 << 0; @@ -28,7 +28,7 @@ const getAnimationShorthand = (shorthandParts: string[]) => { const accum = defaultValue(); let set = 0; - shorthandParts.forEach(part => { + shorthandParts.forEach((part) => { if (!(set & TIMING_FUNCTION) && easingRegExp.test(part)) { accum.timingFunction = part as any; set &= TIMING_FUNCTION; @@ -54,7 +54,7 @@ const getAnimationShorthand = (shorthandParts: string[]) => { export default (styles: AnimationPart[]): Animation => { let accum = defaultValue(); - styles.forEach(style => { + styles.forEach((style) => { if (style == null) return; if (style._ != null) { diff --git a/runtime/flattenTransition.ts b/runtime/flattenTransition.ts index 626f84a..5875eec 100644 --- a/runtime/flattenTransition.ts +++ b/runtime/flattenTransition.ts @@ -2,7 +2,7 @@ import { getPropertyName } from "css-to-react-native"; import { getDurationInMs, durationRegExp, - easingRegExp + easingRegExp, } from "./animationShorthandUtil"; import { Transition, TimingFunction, TransitionPart } from "./animationTypes"; @@ -25,11 +25,11 @@ const getTransitionShorthand = ( delay: 0, duration: 0, timingFunction: "ease", - property: null + property: null, }; let set = 0; - shorthandParts.forEach(part => { + shorthandParts.forEach((part) => { if (!(set & TIMING_FUNCTION) && easingRegExp.test(part)) { accum.timingFunction = part as any; set &= TIMING_FUNCTION; @@ -58,7 +58,7 @@ export default (styles: TransitionPart[]): Transition => { let timingFunctions = []; let properties: string[] = []; - styles.forEach(style => { + styles.forEach((style) => { if (style == null) return; if (style._ != null) { @@ -67,7 +67,7 @@ export default (styles: TransitionPart[]): Transition => { timingFunctions = []; properties = []; - split(style._).forEach(shorthand => { + split(style._).forEach((shorthand) => { const resolved = getTransitionShorthand(shorthand.trim().split(/\s+/)); const property = resolved.property; diff --git a/runtime/useAnimation.ts b/runtime/useAnimation.ts index e76e023..006ad19 100644 --- a/runtime/useAnimation.ts +++ b/runtime/useAnimation.ts @@ -5,7 +5,7 @@ import { interpolateValue, easingFunctions, OutputRange, - InterpolatedValue + InterpolatedValue, } from "./animationUtil"; import { Style } from "./cssUtil"; @@ -26,7 +26,7 @@ const noAnimations: AnimationState = { duration: 0, iterations: 1, name: null, - timingFunction: "ease" + timingFunction: "ease", }; const getAnimationState = ( @@ -43,18 +43,18 @@ const getAnimationState = ( if (animationSequence == null) return noAnimations; const animatedProperties = Object.keys( - Object.assign({}, ...animationSequence.map(frame => frame.style)) + Object.assign({}, ...animationSequence.map((frame) => frame.style)) ); const animationValues = {}; const animations = {}; - animatedProperties.forEach(animationProperty => { + animatedProperties.forEach((animationProperty) => { animationValues[animationProperty] = new Animated.Value(0); const currentValue = currentStyles[animationProperty]; let keyframes = animationSequence - .filter(frame => animationProperty in frame.style) + .filter((frame) => animationProperty in frame.style) .map(({ time, style }) => ({ time, value: style[animationProperty] })); // Fixes missing start/end values keyframes = [].concat( @@ -65,8 +65,8 @@ const getAnimationState = ( : [] ); - const inputRange = keyframes.map(frame => frame.time); - const outputRange: OutputRange = keyframes.map(frame => frame.value); + const inputRange = keyframes.map((frame) => frame.time); + const outputRange: OutputRange = keyframes.map((frame) => frame.value); const animation = animationValues[animationProperty]; animations[animationProperty] = interpolateValue( inputRange, @@ -82,7 +82,7 @@ const getAnimationState = ( duration, iterations, name, - timingFunction + timingFunction, }; }; @@ -91,7 +91,7 @@ const animate = ({ duration, iterations, timingFunction, - animationValues: animationValuesObject + animationValues: animationValuesObject, }) => { if (animationValuesObject == null) return; @@ -99,9 +99,9 @@ const animate = ({ animationValuesObject ); - animationValues.forEach(animation => animation.setValue(0)); + animationValues.forEach((animation) => animation.setValue(0)); - const timings = animationValues.map(animation => { + const timings = animationValues.map((animation) => { const config = { toValue: 1, duration, @@ -109,7 +109,7 @@ const animate = ({ easing: typeof timingFunction === "string" ? easingFunctions[timingFunction] - : timingFunction + : timingFunction, }; let res = Animated.timing(animation, config); @@ -117,7 +117,7 @@ const animate = ({ res = Animated.sequence([ res, // Reset animation - Animated.timing(animation, { toValue: 0, duration: 0 }) + Animated.timing(animation, { toValue: 0, duration: 0 }), ]); res = Animated.loop(res, { iterations }); } diff --git a/runtime/useCustomPropertyShorthandParts.ts b/runtime/useCustomPropertyShorthandParts.ts index 90f6783..22a6616 100644 --- a/runtime/useCustomPropertyShorthandParts.ts +++ b/runtime/useCustomPropertyShorthandParts.ts @@ -7,9 +7,9 @@ export default ( customProperties: Variables ): Record[] => { return useMemo(() => { - return unresolvedShorthandParts.map(part => { + return unresolvedShorthandParts.map((part) => { const accum = {}; - Object.keys(part).forEach(key => { + Object.keys(part).forEach((key) => { accum[key] = variables(part[key], customProperties); }); return accum; diff --git a/runtime/useTransition.ts b/runtime/useTransition.ts index 258fffa..8f6cd33 100644 --- a/runtime/useTransition.ts +++ b/runtime/useTransition.ts @@ -11,7 +11,7 @@ const useStyleGroup = (transition: Style, inputStyleUnflattened: any) => { const inputStyle = StyleSheet.flatten(inputStyleUnflattened); const [{ style, previousStyle }, setStyleGroup] = useState(() => ({ style: inputStyle, - previousStyle: inputStyle + previousStyle: inputStyle, })); const styleChanged = transition.some( @@ -84,7 +84,8 @@ const animate = ( toValue, duration, delay, - easing: easingFunctions[timingFunction] + easing: easingFunctions[timingFunction], + useNativeDriver: false, }); } ); @@ -110,7 +111,7 @@ export default (transition: Transition, inputStyleUnflattened: any) => { const transitionStyle = {}; - animationNames.forEach(animationName => { + animationNames.forEach((animationName) => { const previousValue = previousStyle[animationName]; const nextValue = style[animationName]; diff --git a/runtime/useViewportStyleTuples.ts b/runtime/useViewportStyleTuples.ts index ab7abae..e6d00bd 100644 --- a/runtime/useViewportStyleTuples.ts +++ b/runtime/useViewportStyleTuples.ts @@ -9,7 +9,7 @@ export default (unresolvedStyleTuples: StyleTuple[]): StyleTuple[] => { return useMemo(() => { return unresolvedStyleTuples.map(([prop, value]) => [ prop, - transformViewport(value, windowDimensions) + transformViewport(value, windowDimensions), ]); }, [unresolvedStyleTuples, windowDimensions]); }; diff --git a/runtime/useWindowDimensions.ts b/runtime/useWindowDimensions.ts index 5cc0cee..916c2b1 100644 --- a/runtime/useWindowDimensions.ts +++ b/runtime/useWindowDimensions.ts @@ -13,7 +13,7 @@ export default (): { width: number; height: number } => { Dimensions.addEventListener("change", listener); return () => Dimensions.removeEventListener("change", listener); - }, [setDimensions]); + }, []); return dimensions; }; diff --git a/tsconfig.json b/tsconfig.json index 8daadd2..d33e066 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "lib": ["es2018"], + "lib": ["es2019"], "esModuleInterop": true, "jsx": "react-native" } diff --git a/yarn.lock b/yarn.lock index d3be614..52d3693 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,19 +29,19 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.2.tgz#069a776e8d5e9eefff76236bc8845566bd31dd91" - integrity sha512-l8zto/fuoZIbncm+01p8zPSDZu/VuuJhAfA7d/AbzM09WR7iVhavvfNDYCNpo1VvLk6E6xgAoP9P+/EMJHuRkQ== +"@babel/core@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.5.tgz#ae1323cd035b5160293307f50647e83f8ba62f7e" + integrity sha512-M42+ScN4+1S9iB6f+TL7QBpoQETxbclx+KNoKJABghnKYE+fMzSGqst0BZJc8CpI625bwPwYgUyRvxZ+0mZzpw== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.2" - "@babel/helpers" "^7.6.2" - "@babel/parser" "^7.6.2" - "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.2" - "@babel/types" "^7.6.0" - convert-source-map "^1.1.0" + "@babel/generator" "^7.7.4" + "@babel/helpers" "^7.7.4" + "@babel/parser" "^7.7.5" + "@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" lodash "^4.17.13" @@ -60,68 +60,76 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/generator@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.2.tgz#dac8a3c2df118334c2a29ff3446da1636a8f8c03" - integrity sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ== +"@babel/generator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.4.tgz#db651e2840ca9aa66f327dcec1dc5f5fa9611369" + integrity sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg== dependencies: - "@babel/types" "^7.6.0" + "@babel/types" "^7.7.4" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== +"@babel/helper-annotate-as-pure@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz#bb3faf1e74b74bd547e867e48f551fa6b098b6ce" + integrity sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.4" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz#5f73f2b28580e224b5b9bd03146a4015d6217f5f" + integrity sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ== dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-explode-assignable-expression" "^7.7.4" + "@babel/types" "^7.7.4" -"@babel/helper-call-delegate@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" - integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== +"@babel/helper-call-delegate@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz#621b83e596722b50c0066f9dc37d3232e461b801" + integrity sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA== dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/helper-hoist-variables" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" -"@babel/helper-create-class-features-plugin@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.6.0.tgz#769711acca889be371e9bc2eb68641d55218021f" - integrity sha512-O1QWBko4fzGju6VoVvrZg0RROCVifcLxiApnGP3OWfWzvxRZFCoBD81K5ur5e3bVY2Vf/5rIJm8cqPKn8HUJng== +"@babel/helper-create-class-features-plugin@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz#fce60939fd50618610942320a8d951b3b639da2d" + integrity sha512-l+OnKACG4uiDHQ/aJT8dwpR+LhCJALxL0mJ6nzjB25e5IPwqV1VOsY7ah6UB1DG+VOXAIMtuC54rFJGiHkxjgA== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-member-expression-to-functions" "^7.5.5" - "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-member-expression-to-functions" "^7.7.4" + "@babel/helper-optimise-call-expression" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/helper-replace-supers" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" -"@babel/helper-define-map@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" - integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== +"@babel/helper-create-regexp-features-plugin@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz#6d5762359fd34f4da1500e4cff9955b5299aaf59" + integrity sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.5.5" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + +"@babel/helper-define-map@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz#2841bf92eb8bd9c906851546fe6b9d45e162f176" + integrity sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg== + dependencies: + "@babel/helper-function-name" "^7.7.4" + "@babel/types" "^7.7.4" lodash "^4.17.13" -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== +"@babel/helper-explode-assignable-expression@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz#fa700878e008d85dc51ba43e9fb835cddfe05c84" + integrity sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg== dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" "@babel/helper-function-name@^7.1.0": version "7.1.0" @@ -132,6 +140,15 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-function-name@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" + integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ== + dependencies: + "@babel/helper-get-function-arity" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" @@ -139,45 +156,52 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-hoist-variables@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" - integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== +"@babel/helper-get-function-arity@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" + integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA== dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.7.4" -"@babel/helper-member-expression-to-functions@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" - integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== +"@babel/helper-hoist-variables@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz#612384e3d823fdfaaf9fce31550fe5d4db0f3d12" + integrity sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ== dependencies: - "@babel/types" "^7.5.5" + "@babel/types" "^7.7.4" -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== +"@babel/helper-member-expression-to-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz#356438e2569df7321a8326644d4b790d2122cb74" + integrity sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.4" -"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" - integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== +"@babel/helper-module-imports@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91" + integrity sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ== dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/types" "^7.5.5" + "@babel/types" "^7.7.4" + +"@babel/helper-module-transforms@^7.7.4", "@babel/helper-module-transforms@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz#d044da7ffd91ec967db25cd6748f704b6b244835" + integrity sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw== + dependencies: + "@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@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== +"@babel/helper-optimise-call-expression@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2" + integrity sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.4" "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" @@ -191,34 +215,34 @@ dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== +"@babel/helper-remap-async-to-generator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz#c68c2407350d9af0e061ed6726afb4fff16d0234" + integrity sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw== dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.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@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" - integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== +"@babel/helper-replace-supers@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz#3c881a6a6a7571275a72d82e6107126ec9e2cdd2" + integrity sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg== dependencies: - "@babel/helper-member-expression-to-functions" "^7.5.5" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" + "@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@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== +"@babel/helper-simple-access@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz#a169a0adb1b5f418cfc19f22586b2ebf58a9a294" + integrity sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A== dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" "@babel/helper-split-export-declaration@^7.4.4": version "7.4.4" @@ -227,15 +251,22 @@ dependencies: "@babel/types" "^7.4.4" -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== +"@babel/helper-split-export-declaration@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" + integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" + "@babel/types" "^7.7.4" + +"@babel/helper-wrap-function@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz#37ab7fed5150e22d9d7266e830072c0cdd8baace" + integrity sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg== + dependencies: + "@babel/helper-function-name" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" "@babel/helpers@^7.5.5": version "7.5.5" @@ -246,14 +277,14 @@ "@babel/traverse" "^7.5.5" "@babel/types" "^7.5.5" -"@babel/helpers@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" - integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== +"@babel/helpers@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" + integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg== dependencies: - "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.2" - "@babel/types" "^7.6.0" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" "@babel/highlight@^7.0.0": version "7.5.0" @@ -269,436 +300,438 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== -"@babel/parser@^7.6.0", "@babel/parser@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.2.tgz#205e9c95e16ba3b8b96090677a67c9d6075b70a1" - integrity sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg== +"@babel/parser@^7.7.4", "@babel/parser@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.5.tgz#cbf45321619ac12d83363fcf9c94bb67fa646d71" + integrity sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig== -"@babel/plugin-proposal-async-generator-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" - integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== +"@babel/plugin-proposal-async-generator-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz#0351c5ac0a9e927845fffd5b82af476947b7ce6d" + integrity sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.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@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" - integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== +"@babel/plugin-proposal-dynamic-import@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz#dde64a7f127691758cbfed6cf70de0fa5879d52d" + integrity sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ== dependencies: "@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@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" - integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== +"@babel/plugin-proposal-json-strings@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz#7700a6bfda771d8dc81973249eac416c6b4c697d" + integrity sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw== dependencies: "@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@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096" - integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw== +"@babel/plugin-proposal-object-rest-spread@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz#cc57849894a5c774214178c8ab64f6334ec8af71" + integrity sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ== dependencies: "@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" -"@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== +"@babel/plugin-proposal-optional-catch-binding@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz#ec21e8aeb09ec6711bc0a39ca49520abee1de379" + integrity sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w== dependencies: "@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@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz#05413762894f41bfe42b9a5e80919bd575dcc802" - integrity sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw== +"@babel/plugin-proposal-unicode-property-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz#7c239ccaf09470dbe1d453d50057460e84517ebb" + integrity sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" -"@babel/plugin-syntax-async-generators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" - integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== +"@babel/plugin-syntax-async-generators@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz#331aaf310a10c80c44a66b238b6e49132bd3c889" + integrity sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-dynamic-import@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" - integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== +"@babel/plugin-syntax-dynamic-import@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz#29ca3b4415abfe4a5ec381e903862ad1a54c3aec" + integrity sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" - integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== +"@babel/plugin-syntax-json-strings@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz#86e63f7d2e22f9e27129ac4e83ea989a382e86cc" + integrity sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": +"@babel/plugin-syntax-object-rest-spread@^7.0.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== +"@babel/plugin-syntax-object-rest-spread@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" + integrity sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-typescript@^7.2.0": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz#a7cc3f66119a9f7ebe2de5383cce193473d65991" - integrity sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag== +"@babel/plugin-syntax-optional-catch-binding@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz#a3e38f59f4b6233867b4a92dcb0ee05b2c334aa6" + integrity sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-arrow-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== +"@babel/plugin-syntax-top-level-await@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz#bd7d8fa7b9fee793a36e4027fd6dd1aa32f946da" + integrity sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" - integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== +"@babel/plugin-syntax-typescript@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.7.4.tgz#5d037ffa10f3b25a16f32570ebbe7a8c2efa304b" + integrity sha512-77blgY18Hud4NM1ggTA8xVT/dBENQf17OpiToSa2jSmEY3fWXD2jwrdVlO4kq5yzUTeF15WSQ6b4fByNvJcjpQ== dependencies: - "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" -"@babel/plugin-transform-block-scoped-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== +"@babel/plugin-transform-arrow-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz#76309bd578addd8aee3b379d809c802305a98a12" + integrity sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz#96c33ab97a9ae500cc6f5b19e04a7e6553360a79" - integrity sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ== +"@babel/plugin-transform-async-to-generator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz#694cbeae6d613a34ef0292713fa42fb45c4470ba" + integrity sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg== dependencies: + "@babel/helper-module-imports" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.13" + "@babel/helper-remap-async-to-generator" "^7.7.4" -"@babel/plugin-transform-classes@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" - integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== +"@babel/plugin-transform-block-scoped-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz#d0d9d5c269c78eaea76227ace214b8d01e4d837b" + integrity sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.5.5" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" - globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== +"@babel/plugin-transform-block-scoping@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" + integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.13" -"@babel/plugin-transform-destructuring@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" - integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== +"@babel/plugin-transform-classes@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz#c92c14be0a1399e15df72667067a8f510c9400ec" + integrity sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg== dependencies: + "@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.4" + "@babel/helper-split-export-declaration" "^7.7.4" + globals "^11.1.0" -"@babel/plugin-transform-dotall-regex@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz#44abb948b88f0199a627024e1508acaf8dc9b2f9" - integrity sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA== +"@babel/plugin-transform-computed-properties@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz#e856c1628d3238ffe12d668eb42559f79a81910d" + integrity sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" -"@babel/plugin-transform-duplicate-keys@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" - integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== +"@babel/plugin-transform-destructuring@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz#2b713729e5054a1135097b6a67da1b6fe8789267" + integrity sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-exponentiation-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== +"@babel/plugin-transform-dotall-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz#f7ccda61118c5b7a2599a72d5e3210884a021e96" + integrity sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-for-of@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" - integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== +"@babel/plugin-transform-duplicate-keys@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz#3d21731a42e3f598a73835299dd0169c3b90ac91" + integrity sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-function-name@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" - integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== +"@babel/plugin-transform-exponentiation-operator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz#dd30c0191e3a1ba19bcc7e389bdfddc0729d5db9" + integrity sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ== dependencies: - "@babel/helper-function-name" "^7.1.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== +"@babel/plugin-transform-for-of@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz#248800e3a5e507b1f103d8b4ca998e77c63932bc" + integrity sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-member-expression-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" - integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== +"@babel/plugin-transform-function-name@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz#75a6d3303d50db638ff8b5385d12451c865025b1" + integrity sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g== dependencies: + "@babel/helper-function-name" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-amd@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" - integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== +"@babel/plugin-transform-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz#27fe87d2b5017a2a5a34d1c41a6b9f6a6262643e" + integrity sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw== dependencies: - "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" - integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== +"@babel/plugin-transform-member-expression-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz#aee127f2f3339fc34ce5e3055d7ffbf7aa26f19a" + integrity sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz#39e0fb717224b59475b306402bb8eedab01e729c" + integrity sha512-CT57FG4A2ZUNU1v+HdvDSDrjNWBrtCmSH6YbbgN3Lrf0Di/q/lWRxZrE72p3+HCCz9UjfZOEBdphgC0nzOS6DQ== dependencies: - "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-module-transforms" "^7.7.5" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486" - integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g== +"@babel/plugin-transform-modules-commonjs@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz#1d27f5eb0bcf7543e774950e5b2fa782e637b345" + integrity sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q== dependencies: - "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-module-transforms" "^7.7.5" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-simple-access" "^7.7.4" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" - integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== +"@babel/plugin-transform-modules-systemjs@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz#cd98152339d3e763dfe838b7d4273edaf520bb30" + integrity sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw== dependencies: - "@babel/helper-hoist-variables" "^7.4.4" + "@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@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" - integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== +"@babel/plugin-transform-modules-umd@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz#1027c355a118de0aae9fee00ad7813c584d9061f" + integrity sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw== dependencies: - "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-module-transforms" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz#c1ca0bb84b94f385ca302c3932e870b0fb0e522b" - integrity sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g== +"@babel/plugin-transform-named-capturing-groups-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz#fb3bcc4ee4198e7385805007373d6b6f42c98220" + integrity sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw== dependencies: - regexpu-core "^4.6.0" + "@babel/helper-create-regexp-features-plugin" "^7.7.4" -"@babel/plugin-transform-new-target@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" - integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== +"@babel/plugin-transform-new-target@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz#4a0753d2d60639437be07b592a9e58ee00720167" + integrity sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-object-super@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" - integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== +"@babel/plugin-transform-object-super@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz#48488937a2d586c0148451bf51af9d7dda567262" + integrity sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg== dependencies: "@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@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" - integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== +"@babel/plugin-transform-parameters@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz#da4555c97f39b51ac089d31c7380f03bca4075ce" + integrity sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw== dependencies: - "@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@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" - integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== +"@babel/plugin-transform-property-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz#2388d6505ef89b266103f450f9167e6bd73f98c2" + integrity sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-regenerator@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" - integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== +"@babel/plugin-transform-regenerator@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz#3a8757ee1a2780f390e89f246065ecf59c26fce9" + integrity sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw== dependencies: regenerator-transform "^0.14.0" -"@babel/plugin-transform-reserved-words@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" - integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== +"@babel/plugin-transform-reserved-words@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz#6a7cf123ad175bb5c69aec8f6f0770387ed3f1eb" + integrity sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-shorthand-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== +"@babel/plugin-transform-shorthand-properties@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz#74a0a9b2f6d67a684c6fbfd5f0458eb7ba99891e" + integrity sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-spread@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz#fc77cf798b24b10c46e1b51b1b88c2bf661bb8dd" - integrity sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg== +"@babel/plugin-transform-spread@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz#aa673b356fe6b7e70d69b6e33a17fef641008578" + integrity sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-sticky-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== +"@babel/plugin-transform-sticky-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz#ffb68c05090c30732076b1285dc1401b404a123c" + integrity sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" -"@babel/plugin-transform-template-literals@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" - integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== +"@babel/plugin-transform-template-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz#1eb6411736dd3fe87dbd20cc6668e5121c17d604" + integrity sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ== dependencies: - "@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@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" - integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== +"@babel/plugin-transform-typeof-symbol@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz#3174626214f2d6de322882e498a38e8371b2140e" + integrity sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-typescript@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.6.0.tgz#48d78405f1aa856ebeea7288a48a19ed8da377a6" - integrity sha512-yzw7EopOOr6saONZ3KA3lpizKnWRTe+rfBqg4AmQbSow7ik7fqmzrfIqt053osLwLE2AaTqGinLM2tl6+M/uog== +"@babel/plugin-transform-typescript@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.4.tgz#2974fd05f4e85c695acaf497f432342de9fc0636" + integrity sha512-X8e3tcPEKnwwPVG+vP/vSqEShkwODOEeyQGod82qrIuidwIrfnsGn11qPM1jBLF4MqguTXXYzm58d0dY+/wdpg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.6.0" + "@babel/helper-create-class-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-typescript" "^7.2.0" + "@babel/plugin-syntax-typescript" "^7.7.4" -"@babel/plugin-transform-unicode-regex@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz#b692aad888a7e8d8b1b214be6b9dc03d5031f698" - integrity sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw== +"@babel/plugin-transform-unicode-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz#a3c0f65b117c4c81c5b6484f2a5e7b95346b83ae" + integrity sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" -"@babel/preset-env@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.2.tgz#abbb3ed785c7fe4220d4c82a53621d71fc0c75d3" - integrity sha512-Ru7+mfzy9M1/YTEtlDS8CD45jd22ngb9tXnn64DvQK3ooyqSw9K4K9DUWmYknTTVk4TqygL9dqCrZgm1HMea/Q== +"@babel/preset-env@^7.7.6": + version "7.7.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.6.tgz#39ac600427bbb94eec6b27953f1dfa1d64d457b2" + integrity sha512-k5hO17iF/Q7tR9Jv8PdNBZWYW6RofxhnxKjBMc0nG4JTaWvOTiPoO/RLFwAKcA4FpmuBFm6jkoqaRJLGi0zdaQ== dependencies: - "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-module-imports" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-dynamic-import" "^7.5.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.6.2" - "@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-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.5.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.6.2" - "@babel/plugin-transform-classes" "^7.5.5" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.6.0" - "@babel/plugin-transform-dotall-regex" "^7.6.2" - "@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.4.4" - "@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.6.0" - "@babel/plugin-transform-modules-systemjs" "^7.5.0" - "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.2" - "@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.4.5" - "@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.6.2" - "@babel/types" "^7.6.0" + "@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.5" + "@babel/plugin-transform-modules-commonjs" "^7.7.5" + "@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.5" + "@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" + core-js-compat "^3.4.7" invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.5.0" -"@babel/preset-typescript@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.6.0.tgz#25768cb8830280baf47c45ab1a519a9977498c98" - integrity sha512-4xKw3tTcCm0qApyT6PqM9qniseCE79xGHiUnNdKGdxNsGUc2X7WwZybqIpnTmoukg3nhPceI5KPNzNqLNeIJww== +"@babel/preset-typescript@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.7.4.tgz#780059a78e6fa7f7a4c87f027292a86b31ce080a" + integrity sha512-rqrjxfdiHPsnuPur0jKrIIGQCIgoTWMTjlbWE69G4QJ6TIOVnnRnIJhUxNTL/VwDmEAVX08Tq3B1nirer5341w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.6.0" + "@babel/plugin-transform-typescript" "^7.7.4" -"@babel/runtime@^7.4.2": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" - integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== +"@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2": + version "7.7.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.6.tgz#d18c511121aff1b4f2cd1d452f1bac9601dd830f" + integrity sha512-BWAJxpNVa0QlE5gZdWjSxXtemZyZ9RmrmVozxt3NUXeZhVIJ5ANyqmMc0JDrivBZyxUuQvFxlvH4OWWOogGfUw== dependencies: regenerator-runtime "^0.13.2" @@ -711,14 +744,14 @@ "@babel/parser" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/template@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" - integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== +"@babel/template@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" + integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.6.0" - "@babel/types" "^7.6.0" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.5.5": version "7.5.5" @@ -735,17 +768,17 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/traverse@^7.4.4", "@babel/traverse@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.2.tgz#b0e2bfd401d339ce0e6c05690206d1e11502ce2c" - integrity sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ== +"@babel/traverse@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" + integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.2" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.6.2" - "@babel/types" "^7.6.0" + "@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" @@ -759,10 +792,10 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.2.0", "@babel/types@^7.6.0": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648" - integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g== +"@babel/types@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" + integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== dependencies: esutils "^2.0.2" lodash "^4.17.13" @@ -975,6 +1008,11 @@ dependencies: "@babel/types" "^7.3.0" +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -995,44 +1033,49 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/jest-diff@*": - version "20.0.1" - resolved "https://registry.yarnpkg.com/@types/jest-diff/-/jest-diff-20.0.1.tgz#35cc15b9c4f30a18ef21852e255fdb02f6d59b89" - integrity sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA== - -"@types/jest@^24.0.18": - version "24.0.18" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.18.tgz#9c7858d450c59e2164a8a9df0905fc5091944498" - integrity sha512-jcDDXdjTcrQzdN06+TSVsPPqxvsZA/5QkYfIZlq1JMw7FdP5AZylbOc+6B/cuDurctRe+MziUMtQ3xQdrbjqyQ== +"@types/jest@^24.0.23": + version "24.0.23" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.23.tgz#046f8e2ade026fe831623e361a36b6fb9a4463e4" + integrity sha512-L7MBvwfNpe7yVPTXLn32df/EK+AMBFAFvZrRuArGs7npEWnlziUXK+5GMIUTI4NIuwok3XibsjXCs5HxviYXjg== dependencies: - "@types/jest-diff" "*" + jest-diff "^24.3.0" + +"@types/json-schema@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" + integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== + +"@types/node@^12.12.17": + version "12.12.17" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.17.tgz#191b71e7f4c325ee0fb23bc4a996477d92b8c39b" + integrity sha512-Is+l3mcHvs47sKy+afn2O1rV4ldZFU7W8101cNlOd+MRbjM4Onida8jSZnJdTe/0Pcf25g9BNIUsuugmE6puHA== -"@types/node@^12.7.11": - version "12.7.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.11.tgz#be879b52031cfb5d295b047f5462d8ef1a716446" - integrity sha512-Otxmr2rrZLKRYIybtdG/sgeO+tHY20GxeDjcGmUnmmlCWyEnv2a2x1ZXBo3BTec4OiTXMQCiazB8NMBf0iRlFw== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prop-types@*": version "15.7.3" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== -"@types/react-native@^0.60.18": - version "0.60.18" - resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.60.18.tgz#00cee391af17f2f1c0936c2143ffbd97c65fddfb" - integrity sha512-l/mZQ6r1Y3Owokp00wGZDTiSSkCbGGNscAsuc2ZFa86p1nBmYGot/a5tYvWrw1mRSbUqYb0/J/NqQZwoGoB+3A== +"@types/react-native@^0.60.25": + version "0.60.25" + resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.60.25.tgz#65cb0bf5dd0631079215b63525458e4123c1c90e" + integrity sha512-827dIVvSTxSH5uTpsJJH7O4wpRuw0rm3yIzRL3a2yKawA0nyhgC1GPKTXHFIn2GfSdXn1Gty2dJ+k6uDZF3MWQ== dependencies: "@types/prop-types" "*" "@types/react" "*" -"@types/react-test-renderer@^16.9.0": - version "16.9.0" - resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-16.9.0.tgz#d60f530ecf4c906721511603cca711b4fa830d41" - integrity sha512-bN5EyjtuTY35xX7N5j0KP1vg5MpUXHpFTX6tGsqkNOthjNvet4VQOYRxFh+NT5cDSJrATmAFK9NLeYZ4mp/o0Q== +"@types/react-test-renderer@^16.9.1": + version "16.9.1" + resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-16.9.1.tgz#9d432c46c515ebe50c45fa92c6fb5acdc22e39c4" + integrity sha512-nCXQokZN1jp+QkoDNmDZwoWpKY8HDczqevIDO4Uv9/s9rbGPbSpy8Uaxa5ixHKkcm/Wt0Y9C3wCxZivh4Al+rQ== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.9.5": +"@types/react@*", "@types/react@16.9.5": version "16.9.5" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.5.tgz#079dabd918b19b32118c25fd00a786bb6d0d5e51" integrity sha512-jQ12VMiFOWYlp+j66dghOWcmDDwhca0bnlcTxS4Qz/fh5gi6wpaZDthPEu/Gc/YlAuO87vbiUXL8qKstFvuOaA== @@ -1057,6 +1100,49 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^2.11.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.11.0.tgz#4477c33491ccf0a9a3f4a30ef84978fa0ea0cad2" + integrity sha512-G2HHA1vpMN0EEbUuWubiCCfd0R3a30BB+UdvnFkxwZIxYEGOrWEXDv8tBFO9f44CWc47Xv9lLM3VSn4ORLI2bA== + dependencies: + "@typescript-eslint/experimental-utils" "2.11.0" + eslint-utils "^1.4.3" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.11.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.11.0.tgz#cef18e6b122706c65248a5d8984a9779ed1e52ac" + integrity sha512-YxcA/y0ZJaCc/fB/MClhcDxHI0nOBB7v2/WxBju2cOTanX7jO9ttQq6Fy4yW9UaY5bPd9xL3cun3lDVqk67sPQ== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.11.0" + eslint-scope "^5.0.0" + +"@typescript-eslint/parser@^2.11.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.11.0.tgz#cdcc3be73ee31cbef089af5ff97ccaa380ef6e8b" + integrity sha512-DyGXeqhb3moMioEFZIHIp7oXBBh7dEfPTzGrlyP0Mi9ScCra4SWEGs3kPd18mG7Sy9Wy8z88zmrw5tSGL6r/6A== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.11.0" + "@typescript-eslint/typescript-estree" "2.11.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.11.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.11.0.tgz#21ada6504274cd1644855926312c798fc697e9fb" + integrity sha512-HGY4+d4MagO6cKMcKfIKaTMxcAv7dEVnji2Zi+vi5VV8uWAM631KjAB5GxFcexMYrwKT0EekRiiGK1/Sd7VFGA== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash.unescape "4.0.1" + semver "^6.3.0" + tsutils "^3.17.1" + abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" @@ -1075,10 +1161,10 @@ acorn-globals@^4.1.0: acorn "^6.0.1" acorn-walk "^6.0.1" -acorn-jsx@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f" - integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw== +acorn-jsx@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== acorn-walk@^6.0.1: version "6.2.0" @@ -1086,19 +1172,19 @@ acorn-walk@^6.0.1: integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== acorn@^5.5.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^6.0.1: version "6.2.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.1.tgz#3ed8422d6dec09e6121cc7a843ca86a330a86b51" integrity sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q== -acorn@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.0.0.tgz#26b8d1cd9a9b700350b71c0905546f64d1284e7a" - integrity sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ== +acorn@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: version "6.10.2" @@ -1110,11 +1196,18 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: +ansi-escapes@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +ansi-escapes@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" + integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + dependencies: + type-fest "^0.8.1" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -1130,6 +1223,11 @@ ansi-regex@^4.0.0, ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1274,14 +1372,14 @@ babel-plugin-jest-hoist@^24.9.0: dependencies: "@types/babel__traverse" "^7.0.6" -babel-plugin-macros@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz#41f7ead616fc36f6a93180e89697f69f51671181" - integrity sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ== +babel-plugin-macros@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== dependencies: - "@babel/runtime" "^7.4.2" - cosmiconfig "^5.2.0" - resolve "^1.10.0" + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" babel-preset-jest@^24.9.0: version "24.9.0" @@ -1357,7 +1455,7 @@ browser-resolve@^1.11.3: dependencies: resolve "1.1.7" -browserslist@^4.6.0, browserslist@^4.6.6: +browserslist@^4.6.0: version "4.7.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17" integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA== @@ -1366,6 +1464,15 @@ browserslist@^4.6.0, browserslist@^4.6.6: electron-to-chromium "^1.3.247" node-releases "^1.1.29" +browserslist@^4.8.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.2.tgz#b45720ad5fbc8713b7253c20766f701c9a694289" + integrity sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA== + dependencies: + caniuse-lite "^1.0.30001015" + electron-to-chromium "^1.3.322" + node-releases "^1.1.42" + bser@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.0.tgz#65fc784bf7f87c009b973c12db6546902fa9c7b5" @@ -1393,25 +1500,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1432,6 +1520,11 @@ caniuse-lite@^1.0.30000989: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000998.tgz#7227a8046841e7d01e156ae7227a504d065f6744" integrity sha512-8Tj5sPZR9kMHeDD9SZXIVr5m9ofufLLCG2Y4QwQrH18GIwG+kCc+zYdlR036ZRkuKjVVetyxeAgGA1xF7XdmzQ== +caniuse-lite@^1.0.30001015: + version "1.0.30001015" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001015.tgz#15a7ddf66aba786a71d99626bc8f2b91c6f0f5f0" + integrity sha512-/xL2AbW/XWHNu1gnIrO8UitBGoFthcsDgU9VLK1/dpsoxbaD5LscHozKze05R6WLsBvLhqv78dAPozMFQBYLbQ== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -1478,12 +1571,12 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: - restore-cursor "^2.0.0" + restore-cursor "^3.1.0" cli-width@^2.0.0: version "2.2.0" @@ -1589,17 +1682,24 @@ convert-source-map@^1.1.0, convert-source-map@^1.4.0: dependencies: safe-buffer "~5.1.1" +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.1.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.2.1.tgz#0cbdbc2e386e8e00d3b85dc81c848effec5b8150" - integrity sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A== +core-js-compat@^3.4.7: + version "3.4.8" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.4.8.tgz#f72e6a4ed76437ea710928f44615f926a81607d5" + integrity sha512-l3WTmnXHV2Sfu5VuD7EHE2w7y+K68+kULKt5RJg8ZJk3YhHF1qLD4O8v8AmNq+8vbOwnPFFDvds25/AoEvMqlQ== dependencies: - browserslist "^4.6.6" + browserslist "^4.8.2" semver "^6.3.0" core-util-is@1.0.2, core-util-is@~1.0.0: @@ -1607,15 +1707,16 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cosmiconfig@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" @@ -1643,14 +1744,14 @@ css-color-keywords@^1.0.0: resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= -css-to-react-native@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.3.2.tgz#e75e2f8f7aa385b4c3611c52b074b70a002f2e7d" - integrity sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw== +css-to-react-native@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" + integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== dependencies: camelize "^1.0.0" css-color-keywords "^1.0.0" - postcss-value-parser "^3.3.0" + postcss-value-parser "^4.0.2" cssesc@^3.0.0: version "3.0.0" @@ -1812,11 +1913,21 @@ electron-to-chromium@^1.3.247: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.273.tgz#94872d6823219f2812f2e35a2ce2a7d03c1eaa3f" integrity sha512-0kUppiHQvHEENHh+nTtvTt4eXMwcPyWmMaj73GPrSEm3ldKhmmHuOH6IjrmuW6YmyS/fpXcLvMQLNVpqRhpNWw== +electron-to-chromium@^1.3.322: + version "1.3.322" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz#a6f7e1c79025c2b05838e8e344f6e89eb83213a8" + integrity sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -1877,27 +1988,22 @@ eslint-scope@^5.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" - integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== dependencies: - eslint-visitor-keys "^1.0.0" - -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + eslint-visitor-keys "^1.1.0" eslint-visitor-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== -eslint@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.3.0.tgz#1f1a902f67bfd4c354e7288b81e40654d927eb6a" - integrity sha512-ZvZTKaqDue+N8Y9g0kp6UPZtS4FSY3qARxBs7p4f0H0iof381XHduqVerFWtK8DPtKmemqbqCFENWSQgPR/Gow== +eslint@^6.7.2: + version "6.7.2" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.7.2.tgz#c17707ca4ad7b2d8af986a33feba71e18a9fecd1" + integrity sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -1906,19 +2012,19 @@ eslint@^6.3.0: debug "^4.0.1" doctrine "^3.0.0" eslint-scope "^5.0.0" - eslint-utils "^1.4.2" + eslint-utils "^1.4.3" eslint-visitor-keys "^1.1.0" - espree "^6.1.1" + espree "^6.1.2" esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" - globals "^11.7.0" + globals "^12.1.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^6.4.1" + inquirer "^7.0.0" is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" @@ -1927,7 +2033,7 @@ eslint@^6.3.0: minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.2" + optionator "^0.8.3" progress "^2.0.0" regexpp "^2.0.1" semver "^6.1.2" @@ -1937,13 +2043,13 @@ eslint@^6.3.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.1.tgz#7f80e5f7257fc47db450022d723e356daeb1e5de" - integrity sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ== +espree@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== dependencies: - acorn "^7.0.0" - acorn-jsx "^5.0.2" + acorn "^7.1.0" + acorn-jsx "^5.1.0" eslint-visitor-keys "^1.1.0" esprima@^3.1.3: @@ -2091,7 +2197,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fast-levenshtein@~2.0.4: +fast-levenshtein@~2.0.4, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -2103,10 +2209,10 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= +figures@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" + integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== dependencies: escape-string-regexp "^1.0.5" @@ -2261,11 +2367,30 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.1.0, globals@^11.7.0: +glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^12.1.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" + integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== + dependencies: + type-fest "^0.8.1" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: version "4.2.1" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.1.tgz#1c1f0c364882c868f5bff6512146328336a11b1d" @@ -2395,14 +2520,6 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - import-fresh@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" @@ -2411,6 +2528,14 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -2447,22 +2572,22 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" - integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== +inquirer@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" + integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== dependencies: - ansi-escapes "^3.2.0" + ansi-escapes "^4.2.1" chalk "^2.4.2" - cli-cursor "^2.1.0" + cli-cursor "^3.1.0" cli-width "^2.0.0" external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" run-async "^2.2.0" rxjs "^6.4.0" - string-width "^2.1.0" + string-width "^4.1.0" strip-ansi "^5.1.0" through "^2.3.6" @@ -2546,11 +2671,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -2580,6 +2700,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" @@ -2768,7 +2893,7 @@ jest-config@^24.9.0: pretty-format "^24.9.0" realpath-native "^1.1.0" -jest-diff@^24.9.0: +jest-diff@^24.3.0, jest-diff@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== @@ -3238,6 +3363,11 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -3261,7 +3391,12 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14: +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + +lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -3350,10 +3485,10 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "1.40.0" -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== minimatch@^3.0.4: version "3.0.4" @@ -3417,10 +3552,10 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.12.1: version "2.14.0" @@ -3512,6 +3647,13 @@ node-releases@^1.1.29: dependencies: semver "^6.3.0" +node-releases@^1.1.42: + version "1.1.42" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.42.tgz#a999f6a62f8746981f6da90627a8d2fc090bbad7" + integrity sha512-OQ/ESmUqGawI2PRX+XIRao44qWYBBfN54ImQYdWVTQqUckuejOg76ysSqDBK8NG3zwySRVnX36JwDQ6x+9GxzA== + dependencies: + semver "^6.3.0" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -3640,12 +3782,12 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== dependencies: - mimic-fn "^1.0.0" + mimic-fn "^2.1.0" optimist@^0.6.1: version "0.6.1" @@ -3655,7 +3797,7 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= @@ -3667,6 +3809,18 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" +optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -3736,6 +3890,16 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" @@ -3773,6 +3937,11 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -3821,15 +3990,15 @@ postcss-selector-parser@^6.0.2: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-value-parser@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== +postcss-value-parser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" + integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== -postcss@^7.0.17: - version "7.0.17" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.17.tgz#4da1bdff5322d4a0acaab4d87f3e782436bad31f" - integrity sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ== +postcss@^7.0.24: + version "7.0.24" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.24.tgz#972c3c5be431b32e40caefe6c81b5a19117704c2" + integrity sha512-Xl0XvdNWg+CblAXzNvbSOUvgJXwSjmbAKORqyw9V2AlHrm1js2gFw9y3jibBAhpKZi8b5JzJCVh/FyzPsTtgTA== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -3840,10 +4009,10 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prettier@^1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" - integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== +prettier@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" + integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== pretty-format@^24.9.0: version "24.9.0" @@ -3935,20 +4104,20 @@ react-is@^16.8.4: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb" integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== -react-test-renderer@^16.10.2: - version "16.10.2" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.10.2.tgz#4d8492f8678c9b43b721a7d79ed0840fdae7c518" - integrity sha512-k9Qzyev6cTIcIfrhgrFlYQAFxh5EEDO6ALNqYqmKsWVA7Q/rUMTay5nD3nthi6COmYsd4ghVYyi8U86aoeMqYQ== +react-test-renderer@^16.12.0: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.12.0.tgz#11417ffda579306d4e841a794d32140f3da1b43f" + integrity sha512-Vj/teSqt2oayaWxkbhQ6gKis+t5JrknXfPVo+aIJ8QwYAqMPH77uptOdrlphyxl8eQI/rtkOYg86i/UWkpFu0w== dependencies: object-assign "^4.1.1" prop-types "^15.6.2" react-is "^16.8.6" - scheduler "^0.16.2" + scheduler "^0.18.0" -react@^16.10.2: - version "16.10.2" - resolved "https://registry.yarnpkg.com/react/-/react-16.10.2.tgz#a5ede5cdd5c536f745173c8da47bda64797a4cf0" - integrity sha512-MFVIq0DpIhrHFyqLU0S3+4dIcBhhOvBE8bJ/5kHPVOVaGdo0KuiQzpcjCPsf585WvhypqtrMILyoE2th6dT+Lw== +react@^16.12.0: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" + integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -4028,6 +4197,11 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== +regexpp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" + integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + regexpu-core@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" @@ -4153,12 +4327,19 @@ resolve@^1.10.0, resolve@^1.3.2: dependencies: path-parse "^1.0.6" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= +resolve@^1.12.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.13.1.tgz#be0aa4c06acd53083505abb35f4d66932ab35d16" + integrity sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w== dependencies: - onetime "^2.0.0" + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" signal-exit "^3.0.2" ret@~0.1.10: @@ -4239,10 +4420,10 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.16.2: - version "0.16.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.16.2.tgz#f74cd9d33eff6fc554edfb79864868e4819132c1" - integrity sha512-BqYVWqwz6s1wZMhjFvLfVR5WXP7ZY32M/wYPo04CcuPM7XZEbV2TBNW7Z0UkguPTl0dWMA59VbNXxK6q+pHItg== +scheduler@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" + integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -4465,7 +4646,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.1.0: +"string-width@^1.0.2 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -4482,6 +4663,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -4510,6 +4700,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -4667,11 +4864,18 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -tslib@^1.9.0: +tslib@^1.8.1, tslib@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -4691,10 +4895,15 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -typescript@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.3.tgz#fea942fabb20f7e1ca7164ff626f1a9f3f70b4da" - integrity sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw== +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typescript@^3.7.3: + version "3.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.3.tgz#b36840668a16458a7025b9eabfad11b66ab85c69" + integrity sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw== uglify-js@^3.1.4: version "3.6.0" @@ -4875,6 +5084,11 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -4937,6 +5151,13 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== +yaml@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" + integrity sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw== + dependencies: + "@babel/runtime" "^7.6.3" + yargs-parser@^13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"