From bdaa0b0681b53f58d7bb1e20c9754f0a38af3807 Mon Sep 17 00:00:00 2001 From: devdoomari Date: Mon, 6 Jan 2020 16:36:43 +0900 Subject: [PATCH 01/34] fix mypy errors --- py_codegen/plugins/typescript/Converter.py | 53 ++++++----- py_codegen/plugins/typescript/__base__.py | 36 ++------ .../ts_fixtures/func_with_literals.d.ts | 4 +- py_codegen/plugins/typescript/package.json | 20 ++--- py_codegen/plugins/typescript/yarn.lock | 89 +++++++++--------- .../test_fixtures/func_with_literals.py | 7 +- .../test_fixtures/func_with_typed_dict.py | 3 +- py_codegen/type_extractor/__base__.py | 5 ++ .../__tests__/test_func_with_literals.py | 15 ++-- py_codegen/type_extractor/__tests__/utils.py | 90 ++++++++----------- .../type_extractor/middlewares/class_found.py | 2 +- .../type_extractor/mock_type_extractor.py | 5 +- py_codegen/type_extractor/nodes/ClassFound.py | 22 ++--- py_codegen/type_extractor/nodes/DictFound.py | 5 +- .../type_extractor/nodes/FunctionFound.py | 27 +++--- py_codegen/type_extractor/nodes/ListFound.py | 5 +- .../type_extractor/nodes/LiteralFound.py | 6 +- .../type_extractor/nodes/MappingFound.py | 6 +- py_codegen/type_extractor/nodes/NoneNode.py | 4 +- py_codegen/type_extractor/nodes/TupleFound.py | 6 +- py_codegen/type_extractor/nodes/TypeOR.py | 11 +-- .../type_extractor/nodes/TypedDictFound.py | 9 +- py_codegen/type_extractor/type_extractor.py | 18 ---- requirements.txt | 4 +- 24 files changed, 208 insertions(+), 244 deletions(-) diff --git a/py_codegen/plugins/typescript/Converter.py b/py_codegen/plugins/typescript/Converter.py index b207979..88952f1 100644 --- a/py_codegen/plugins/typescript/Converter.py +++ b/py_codegen/plugins/typescript/Converter.py @@ -1,12 +1,14 @@ import itertools -from functools import reduce -from textwrap import dedent, indent from typing import ( cast, List, - Callable) + Callable, + Any, + Optional, +) +from typing_extensions import Protocol -from py_codegen.plugins.typescript.__base__ import BaseTypescriptConverter +from py_codegen.plugins.typescript.__base__ import MiddlewareType from py_codegen.plugins.typescript.middlewares.classes import class_middleware from py_codegen.plugins.typescript.middlewares.functions import functionfounds_middleware from py_codegen.plugins.typescript.middlewares.typeddicts import typeddicts_middleware @@ -25,18 +27,12 @@ from py_codegen.type_extractor.nodes.UnknownFound import unknown_found from py_codegen.type_extractor.type_extractor import TypeExtractor, is_builtin -MiddlewareType = Callable[ - [BaseTypeExtractor, BaseTypescriptConverter], - List[str], -] -LiteralConverterType = Callable[ - [LiteralFound], - str, -] +class LiteralConverterType(Protocol): + def __call__(self, val: Any) -> str: ... -def default_literal_converter(val) -> str: +def default_literal_converter(val: Any) -> str: if isinstance(val, str): return f"'{val}'" if isinstance(val, int) \ @@ -63,15 +59,15 @@ class TypescriptConverter: def __init__( self, extractor: TypeExtractor, - middlewares: List[MiddlewareType] = [ - class_middleware, - functionfounds_middleware, - typeddicts_middleware, - ], + middlewares: Optional[List[MiddlewareType]] = None, literal_converter: LiteralConverterType = default_literal_converter, ): self.extractor = extractor - self.middlewares = middlewares + self.middlewares = middlewares or [ + class_middleware, + functionfounds_middleware, + typeddicts_middleware, + ] self.literal_converter = literal_converter def get_identifier(self, node: NodeType) -> str: @@ -105,14 +101,6 @@ def get_identifier(self, node: NodeType) -> str: raise NotImplementedError(f'get_identifier not implemented for {node}') - def run(self): - r: List[List[str]] = [ - middleware(self.extractor, self) - for middleware in self.middlewares - ] - merged: List[str] = list(itertools.chain.from_iterable(r)) - return '\n'.join(merged) - def __convert_builtin(self, typ: type): if typ == str: return 'string' @@ -120,6 +108,15 @@ def __convert_builtin(self, typ: type): return 'number' if typ == bool: return 'boolean' - + raise NotImplementedError(f'__convert_builtin not implemented for {typ}') + def run(self): + r: List[List[str]] = [ + middleware(self.extractor, self) + for middleware in self.middlewares + ] + merged: List[str] = list(itertools.chain.from_iterable(r)) + return '\n'.join(merged) + + diff --git a/py_codegen/plugins/typescript/__base__.py b/py_codegen/plugins/typescript/__base__.py index a21f2b1..44a3e05 100644 --- a/py_codegen/plugins/typescript/__base__.py +++ b/py_codegen/plugins/typescript/__base__.py @@ -1,3 +1,4 @@ +from abc import ABC from textwrap import dedent from typing import ( cast, @@ -22,12 +23,12 @@ from py_codegen.type_extractor.nodes.UnknownFound import unknown_found from py_codegen.type_extractor.type_extractor import TypeExtractor, is_builtin -MiddlewareType = Callable[[ - BaseTypeExtractor, - 'BaseTypescriptConverter', -], List[str]] +MiddlewareType = Callable[ + [BaseTypeExtractor, 'BaseTypescriptConverter'], + List[str], +] -class BaseTypescriptConverter: +class BaseTypescriptConverter(ABC): extractor: TypeExtractor middlewares: List[MiddlewareType] @@ -36,31 +37,10 @@ def __init__( self, extractor: TypeExtractor, ): - self.extractor = extractor + ... def get_identifier(self, node: NodeType) -> str: - # TODO: sanitize names! - if isinstance(node, NoneNode): - return 'null' - if isinstance(node, ClassFound): - return node.name - if isinstance(node, FunctionFound): - return node.name - if isinstance(node, TypedDictFound): - return f"I{node.name}" - if isinstance(node, TypeOR): - return f"{self.get_identifier(node.a)} | {self.get_identifier(node.b)}" - if isinstance(node, DictFound): - return f"{{ [id: string]: {self.get_identifier(node.value)} }}" - if isinstance(node, ListFound): - return f"{self.get_identifier(node.typ)}[]" - if isinstance(node, TupleFound): - return f"[{', '.join([self.get_identifier(typ) for typ in node.types])}]" - if node is unknown_found: - return "any" + ... - if is_builtin(node): - return self.__convert_builtin(cast(type, node)) - raise NotImplementedError(f'get_identifier not implemented for {node}') diff --git a/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts b/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts index 2958fb6..47d48ac 100644 --- a/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts +++ b/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts @@ -1,4 +1,4 @@ export function func_with_literals( - input1: 'a' | 1 | 2 | 3 | [True,3], + input1: 'a' | 1 | 2 | 3 | True | 3, input2: 1 | null, -): True | 0.5 | 3 \ No newline at end of file +): True | 5 | 3 \ No newline at end of file diff --git a/py_codegen/plugins/typescript/package.json b/py_codegen/plugins/typescript/package.json index bbe164f..1ffbe75 100644 --- a/py_codegen/plugins/typescript/package.json +++ b/py_codegen/plugins/typescript/package.json @@ -5,24 +5,24 @@ "main": "index.js", "license": "MIT", "devDependencies": { - "@types/fs-extra": "^8.0.0", - "@types/jest": "^24.0.18", - "@types/lodash": "^4.14.139", - "@types/node": "^12.7.7", - "@types/prettier": "^1.18.2", + "@types/fs-extra": "^8.0.1", + "@types/jest": "^24.0.25", + "@types/lodash": "^4.14.149", + "@types/node": "^13.1.4", + "@types/prettier": "^1.19.0", "fs-extra": "^8.1.0", "jest": "^24.9.0", - "prettier": "^1.18.2", - "ts-jest": "^24.1.0", - "tslint": "^5.20.0", - "typescript": "^3.6.3" + "prettier": "^1.19.1", + "ts-jest": "^24.2.0", + "tslint": "^5.20.1", + "typescript": "^3.7.4" }, "scripts": { "test": "jest", "clean": "rm __tests__/ts_generated/*.d.ts" }, "dependencies": { - "@types/mz": "^0.0.32", + "@types/mz": "^2.7.0", "lodash": "^4.17.15", "mz": "^2.7.0" } diff --git a/py_codegen/plugins/typescript/yarn.lock b/py_codegen/plugins/typescript/yarn.lock index b26c7e1..d271cd8 100644 --- a/py_codegen/plugins/typescript/yarn.lock +++ b/py_codegen/plugins/typescript/yarn.lock @@ -338,10 +338,10 @@ dependencies: "@babel/types" "^7.3.0" -"@types/fs-extra@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.0.0.tgz#d3e2c313ca29f95059f198dd60d1f774642d4b25" - integrity sha512-bCtL5v9zdbQW86yexOlXWTEGvLNqWxMFyi7gQA7Gcthbezr2cPSOb8SkESVKA937QD5cIwOFLDFt0MQoXOEr9Q== +"@types/fs-extra@^8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.0.1.tgz#a2378d6e7e8afea1564e44aafa2e207dadf77686" + integrity sha512-J00cVDALmi/hJOYsunyT52Hva5TnJeKP5yd1r+mH/ZU0mbYZflR0Z5kw5kITtKTRYMhm1JMClOFYdHnQszEvqw== dependencies: "@types/node" "*" @@ -365,27 +365,22 @@ "@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.25": + version "24.0.25" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.25.tgz#2aba377824ce040114aa906ad2cac2c85351360f" + integrity sha512-hnP1WpjN4KbGEK4dLayul6lgtys6FPz0UfxMeMQCv0M+sTnzN3ConfiO72jHgLxl119guHgI8gLqDOrRLsyp2g== dependencies: - "@types/jest-diff" "*" + jest-diff "^24.3.0" -"@types/lodash@^4.14.139": - version "4.14.139" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.139.tgz#b7b8a00d014a7debb29dc2dae4f91d3d3c6d5ab3" - integrity sha512-Z6pbDYaWpluqcF8+6qgv6STPEl0jIlyQmpYGwTrzhgwqok8ltBh/p7GAmYnz81wUhxQRhEr8MBpQrB4fQ/hwIA== +"@types/lodash@^4.14.149": + version "4.14.149" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.149.tgz#1342d63d948c6062838fbf961012f74d4e638440" + integrity sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ== -"@types/mz@^0.0.32": - version "0.0.32" - resolved "https://registry.yarnpkg.com/@types/mz/-/mz-0.0.32.tgz#e8248b4e41424c052edc1725dd33650c313a3659" - integrity sha512-cy3yebKhrHuOcrJGkfwNHhpTXQLgmXSv1BX+4p32j+VUQ6aP2eJ5cL7OvGcAQx75fCTFaAIIAKewvqL+iwSd4g== +"@types/mz@^2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@types/mz/-/mz-2.7.0.tgz#3ef27f457c4c3e8b197ca2670ee41d6f4effddf2" + integrity sha512-Q5TZYMKnH0hdV5fNstmMWL2LLw5eRRtTd73KNtsZxoQ2gtCQyET5X79uERUEwGneuxPglg441I7OSY00+9CkSw== dependencies: "@types/node" "*" @@ -394,15 +389,15 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.9.tgz#a07bfa74331471e1dc22a47eb72026843f7b95c8" integrity sha512-eajkMXG812/w3w4a1OcBlaTwsFPO5F7fJ/amy+tieQxEMWBlbV1JGSjkFM+zkHNf81Cad+dfIRA+IBkvmvdAeA== -"@types/node@^12.7.7": - version "12.7.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.7.tgz#f9bd8c00fa9e1a8129af910fc829f6139c397d6c" - integrity sha512-4jUncNe2tj1nmrO/34PsRpZqYVnRV1svbU78cKhuQKkMntKB/AmdLyGgswcZKjFHEHGpiY8pVD8CuVI55nP54w== +"@types/node@^13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.4.tgz#4cfd90175a200ee9b02bd6b1cd19bc349741607e" + integrity sha512-Lue/mlp2egZJoHXZr4LndxDAd7i/7SQYhV0EjWfb/a4/OZ6tuVwMCVPiwkU5nsEipxEf7hmkSU7Em5VQ8P5NGA== -"@types/prettier@^1.18.2": - version "1.18.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.18.2.tgz#069e7d132024d436fd1f5771f6932426a695f230" - integrity sha512-2JBasa5Qaj81Qsp/dxX2Njy+MdKC767WytHUDsRM7TYEfQvKPxsnGpnCBlBS1i2Aiv1YwCpmKSbQ6O6v8TpiKg== +"@types/prettier@^1.19.0": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.0.tgz#a2502fb7ce9b6626fdbfc2e2a496f472de1bdd05" + integrity sha512-gDE8JJEygpay7IjA/u3JiIURvwZW08f0cZSZLAzFoX/ZmeqvS0Sqv+97aKuHpNsalAMMhwPe+iAS6fQbfmbt7A== "@types/stack-utils@^1.0.1": version "1.0.1" @@ -1805,7 +1800,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== @@ -2822,10 +2817,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@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== pretty-format@^24.9.0: version "24.9.0" @@ -3507,10 +3502,10 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -ts-jest@^24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.1.0.tgz#2eaa813271a2987b7e6c3fefbda196301c131734" - integrity sha512-HEGfrIEAZKfu1pkaxB9au17b1d9b56YZSqz5eCVE8mX68+5reOvlM93xGOzzCREIov9mdH7JBG+s0UyNAqr0tQ== +ts-jest@^24.2.0: + version "24.2.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.2.0.tgz#7abca28c2b4b0a1fdd715cd667d65d047ea4e768" + integrity sha512-Yc+HLyldlIC9iIK8xEN7tV960Or56N49MDP7hubCZUeI7EbIOTsas6rXCMB4kQjLACJ7eDOF4xWEO5qumpKsag== dependencies: bs-logger "0.x" buffer-from "1.x" @@ -3528,10 +3523,10 @@ tslib@^1.8.0, tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== -tslint@^5.20.0: - version "5.20.0" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.0.tgz#fac93bfa79568a5a24e7be9cdde5e02b02d00ec1" - integrity sha512-2vqIvkMHbnx8acMogAERQ/IuINOq6DFqgF8/VDvhEkBqQh/x6SP0Y+OHnKth9/ZcHQSroOZwUQSN18v8KKF0/g== +tslint@^5.20.1: + version "5.20.1" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" + integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== dependencies: "@babel/code-frame" "^7.0.0" builtin-modules "^1.1.1" @@ -3573,10 +3568,10 @@ 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== +typescript@^3.7.4: + version "3.7.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.4.tgz#1743a5ec5fef6a1fa9f3e4708e33c81c73876c19" + integrity sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw== uglify-js@^3.1.4: version "3.4.9" diff --git a/py_codegen/test_fixtures/func_with_literals.py b/py_codegen/test_fixtures/func_with_literals.py index cc63caf..3dab3ad 100644 --- a/py_codegen/test_fixtures/func_with_literals.py +++ b/py_codegen/test_fixtures/func_with_literals.py @@ -6,12 +6,13 @@ def func_with_literals( 'a', 1, Literal[2, 3], - Literal[[True, 3]], + Literal[True, 3], ], input2: Literal[ 1, None ] -) -> Literal[True, 0.5, Literal[3]]: +) -> Literal[True, 5, Literal[3]]: + print(input1) print(input2) - return input1 + return 5 diff --git a/py_codegen/test_fixtures/func_with_typed_dict.py b/py_codegen/test_fixtures/func_with_typed_dict.py index 4661217..8afa1d7 100644 --- a/py_codegen/test_fixtures/func_with_typed_dict.py +++ b/py_codegen/test_fixtures/func_with_typed_dict.py @@ -24,5 +24,6 @@ def __init__(self, a: int): def func_with_typed_dict(input: NestedTypedDict) -> OutputType: return { 'b': len(str(input['child']['a'])), - 's': SomeClass(123) + 'some thing': 'asd', + 's': SomeClass(123), } diff --git a/py_codegen/type_extractor/__base__.py b/py_codegen/type_extractor/__base__.py index a9abe5e..425b1ce 100644 --- a/py_codegen/type_extractor/__base__.py +++ b/py_codegen/type_extractor/__base__.py @@ -19,3 +19,8 @@ def params_to_nodes( def rawtype_to_node(self, typ) -> NodeType: pass + + def add(self, options=None): + def add_decoration(typ): + pass + return add_decoration diff --git a/py_codegen/type_extractor/__tests__/test_func_with_literals.py b/py_codegen/type_extractor/__tests__/test_func_with_literals.py index f5e80d0..01ee2ce 100644 --- a/py_codegen/type_extractor/__tests__/test_func_with_literals.py +++ b/py_codegen/type_extractor/__tests__/test_func_with_literals.py @@ -11,10 +11,9 @@ def test_func_with_list(): type_collector.add(None)(func_with_literals) - func_found_cleaned = cleanup( - type_collector.collected_types[func_with_literals.__qualname__], - ) - assert func_found_cleaned == traverse( + original_func_found = type_collector.collected_types[func_with_literals.__qualname__] + func_found_cleaned = cleanup(original_func_found) + expected_func_found_cleaned = traverse( FunctionFound( name=func_with_literals.__qualname__, params={ @@ -27,7 +26,10 @@ def test_func_with_list(): a=LiteralFound(2), b=LiteralFound(3), ), - b=LiteralFound([True, 3]), + b=TypeOR( + a=LiteralFound(True), + b=LiteralFound(3), + ), ), ), ), @@ -39,10 +41,11 @@ def test_func_with_list(): return_type=TypeOR( a=LiteralFound(True), b=TypeOR( - a=LiteralFound(0.5), + a=LiteralFound(5), b=LiteralFound(3), ), ) ), cleanup, ) + assert func_found_cleaned == expected_func_found_cleaned diff --git a/py_codegen/type_extractor/__tests__/utils.py b/py_codegen/type_extractor/__tests__/utils.py index c64152c..da6f03e 100644 --- a/py_codegen/type_extractor/__tests__/utils.py +++ b/py_codegen/type_extractor/__tests__/utils.py @@ -1,4 +1,5 @@ -from copy import deepcopy +from collections import OrderedDict +from copy import deepcopy, copy from typing import Callable from py_codegen.type_extractor.nodes.BaseNodeType import NodeType @@ -16,80 +17,67 @@ def traverse(node: NodeType, func: traverse_func_type): if isinstance(node, ClassFound): - fields = { + class_found_node = copy(node) + class_found_node.fields = { key: traverse(value, func) for (key, value) in node.fields.items() } - return func( - node._replace( - fields=fields - ) - ) + return func(class_found_node) if isinstance(node, FunctionFound): - params = { - key: traverse(value, func) + function_found_node = copy(node) + function_found_node.params = OrderedDict([ + (key, traverse(value, func)) for (key, value) in node.params.items() - } - return_type = traverse(node.return_type, func) - return func( - node._replace( - params=params, - return_type=return_type, - ) - ) + ]) + function_found_node.return_type = traverse(node.return_type, func) + return func(function_found_node) if isinstance(node, TypedDictFound): - annotations = { + typed_dict_node = copy(node) + typed_dict_node.annotations = { key: traverse(value, func) for (key, value) in node.annotations.items() } - return func( - node._replace( - annotations=annotations, - ) - ) + return func(typed_dict_node) if isinstance(node, TypeOR): - a = traverse(node.a, func) - b = traverse(node.b, func) - return func( - node._replace( - a=a, - b=b - ) - ) + typeor_node = copy(node) + typeor_node.a = traverse(node.a, func) + typeor_node.b = traverse(node.b, func) + return func(typeor_node) return node def cleanup(node: NodeType): if isinstance(node, ClassFound): - new_fields = deepcopy(node.fields) + class_found_node = copy(node) + class_found_node.raw_fields = {} + class_found_node.class_raw = None + class_found_node.fields = copy(node.fields) # for python < 3.7.2 compat. # (python 3.7.2 adds 'return' on fields - new_fields.pop('return', None) - return node._replace( - raw_fields={}, - class_raw=None, - fields=new_fields, - filePath='', - doc='', - ) + class_found_node.fields.pop('return', None) + + class_found_node.filePath = '' + class_found_node.doc = '' + return class_found_node if isinstance(node, FunctionFound): - new_params = deepcopy(node.params) + new_params = copy(node.params) # for python < 3.7.2 compat. # (python 3.7.2 adds 'return' on fields new_params.pop('return', None) - return node._replace( - filePath='', - raw_params={}, - params=new_params, - doc=None, - func=None, # type: ignore - ) + + func_found_node = copy(node) + func_found_node.filePath = '' + func_found_node.raw_params = {} + func_found_node.params = new_params + func_found_node.doc = '' + func_found_node.func = None + return func_found_node if isinstance(node, TypedDictFound): - return node._replace( - raw=None, - ) + new_node = copy(node) + new_node.raw = None + return new_node return node diff --git a/py_codegen/type_extractor/middlewares/class_found.py b/py_codegen/type_extractor/middlewares/class_found.py index c4b33c2..5087ecf 100644 --- a/py_codegen/type_extractor/middlewares/class_found.py +++ b/py_codegen/type_extractor/middlewares/class_found.py @@ -18,7 +18,7 @@ def class_found_middleware(_class, type_extractor: BaseTypeExtractor): _data_class = dataclass(_class) argspec = inspect.getfullargspec(_data_class) module = inspect.getmodule(_class) - filename = module.__file__ + filename = module and module.__file__ fields = type_extractor.params_to_nodes(argspec.annotations, argspec.args) class_found = ClassFound( name=_class.__name__, diff --git a/py_codegen/type_extractor/mock_type_extractor.py b/py_codegen/type_extractor/mock_type_extractor.py index 34e03f3..063b7a6 100644 --- a/py_codegen/type_extractor/mock_type_extractor.py +++ b/py_codegen/type_extractor/mock_type_extractor.py @@ -1,4 +1,7 @@ -class MockTypeExtractor: +from py_codegen.type_extractor.__base__ import BaseTypeExtractor + + +class MockTypeExtractor(BaseTypeExtractor): def __init__(self): self.functions = dict() self.classes = dict() diff --git a/py_codegen/type_extractor/nodes/ClassFound.py b/py_codegen/type_extractor/nodes/ClassFound.py index 77107e3..cadca8c 100644 --- a/py_codegen/type_extractor/nodes/ClassFound.py +++ b/py_codegen/type_extractor/nodes/ClassFound.py @@ -1,20 +1,21 @@ +from dataclasses import dataclass, field from typing import ( Optional, Dict, Any, Callable, - NamedTuple, ) from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType -class ClassFound(BaseNodeType, NamedTuple): # type: ignore +@dataclass +class ClassFound(BaseNodeType): # type: ignore name: str fields: Dict[str, NodeType] - filePath: str = '' - raw_fields: Dict[str, Any] = {} - doc: str = '' + filePath: str = field(default='') + raw_fields: Dict[str, Any] = field(default_factory=dict) + doc: str = field(default='') class_raw: Optional[type] = None INTERNAL_fields_extra: Optional[Dict[str, Any]] = None @@ -24,11 +25,12 @@ def __set_fields_extra( class_found: ClassFound, extra: Dict[str, Any], ): - fields_extra = class_found.INTERNAL_fields_extra or {} - fields_extra[namespace] = extra - return class_found._replace( - INTERNAL_fields_extra=fields_extra, - ) + class_found.INTERNAL_fields_extra = \ + class_found.INTERNAL_fields_extra or {} + + class_found.INTERNAL_fields_extra[namespace] = \ + extra + return class_found return __set_fields_extra diff --git a/py_codegen/type_extractor/nodes/DictFound.py b/py_codegen/type_extractor/nodes/DictFound.py index 9fe48c5..b03d0e6 100644 --- a/py_codegen/type_extractor/nodes/DictFound.py +++ b/py_codegen/type_extractor/nodes/DictFound.py @@ -1,9 +1,10 @@ -from typing import NamedTuple +from dataclasses import dataclass from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType -class DictFound(NamedTuple, BaseNodeType): # type: ignore +@dataclass +class DictFound(BaseNodeType): # type: ignore key: NodeType value: NodeType diff --git a/py_codegen/type_extractor/nodes/FunctionFound.py b/py_codegen/type_extractor/nodes/FunctionFound.py index 48e74db..3d488e7 100644 --- a/py_codegen/type_extractor/nodes/FunctionFound.py +++ b/py_codegen/type_extractor/nodes/FunctionFound.py @@ -1,15 +1,16 @@ -from typing import Callable, NamedTuple, Any, Optional, Dict +from dataclasses import dataclass, field +from typing import Callable, Any, Optional, Dict from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType -class FunctionFound(NamedTuple, BaseNodeType): # type: ignore - +@dataclass +class FunctionFound(BaseNodeType): name: str params: Dict[str, NodeType] return_type: Any func: Optional[Callable] = None - raw_params: Dict[str, Any] = {} + raw_params: Dict[str, Any] = field(default_factory=dict) doc: str = '' filePath: str = '' INTERNAL_params_extra: Optional[Dict[str, Dict[str, Any]]] = None @@ -21,11 +22,10 @@ def __set_fields_extra( func_found: FunctionFound, extra: Dict[str, Any], ): - params_extra = func_found.INTERNAL_params_extra or {} - params_extra[namespace] = extra - return func_found._replace( - INTERNAL_params_extra=params_extra, - ) + func_found.INTERNAL_params_extra = \ + func_found.INTERNAL_params_extra or {} + func_found.INTERNAL_params_extra[namespace] = extra + return func_found return __set_fields_extra @@ -43,11 +43,10 @@ def set_return_type_extra( namespace: str ) -> Callable[[FunctionFound, Any], None]: def __set_return_type_extra(func_found: FunctionFound, extra: Any): - return_extra = func_found.INTERNAL_return_extra or {} - return_extra[namespace] = extra - return func_found._replace( - INTERNAL_params_extra=return_extra - ) + func_found.INTERNAL_return_extra = \ + func_found.INTERNAL_return_extra or {} + func_found.INTERNAL_return_extra[namespace] = extra + return func_found return __set_return_type_extra diff --git a/py_codegen/type_extractor/nodes/ListFound.py b/py_codegen/type_extractor/nodes/ListFound.py index 0445a9d..e174142 100644 --- a/py_codegen/type_extractor/nodes/ListFound.py +++ b/py_codegen/type_extractor/nodes/ListFound.py @@ -1,9 +1,10 @@ -from typing import NamedTuple +from dataclasses import dataclass from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType -class ListFound(NamedTuple, BaseNodeType): # type: ignore +@dataclass +class ListFound(BaseNodeType): # type: ignore typ: NodeType diff --git a/py_codegen/type_extractor/nodes/LiteralFound.py b/py_codegen/type_extractor/nodes/LiteralFound.py index a984ab8..8a37380 100644 --- a/py_codegen/type_extractor/nodes/LiteralFound.py +++ b/py_codegen/type_extractor/nodes/LiteralFound.py @@ -1,7 +1,9 @@ -from typing import NamedTuple, Any +from dataclasses import dataclass +from typing import Any from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType -class LiteralFound(NamedTuple, BaseNodeType): # type: ignore +@dataclass +class LiteralFound(BaseNodeType): # type: ignore value: Any diff --git a/py_codegen/type_extractor/nodes/MappingFound.py b/py_codegen/type_extractor/nodes/MappingFound.py index 21e0c06..7118889 100644 --- a/py_codegen/type_extractor/nodes/MappingFound.py +++ b/py_codegen/type_extractor/nodes/MappingFound.py @@ -1,8 +1,8 @@ -from typing import NamedTuple - +from dataclasses import dataclass from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType -class MappingFound(NamedTuple, BaseNodeType): # type: ignore +@dataclass +class MappingFound(BaseNodeType): # type: ignore key: NodeType value: NodeType diff --git a/py_codegen/type_extractor/nodes/NoneNode.py b/py_codegen/type_extractor/nodes/NoneNode.py index f812333..d0c1f05 100644 --- a/py_codegen/type_extractor/nodes/NoneNode.py +++ b/py_codegen/type_extractor/nodes/NoneNode.py @@ -1,10 +1,8 @@ -from typing import NamedTuple - from py_codegen.type_extractor.__base__ import BaseTypeExtractor from .BaseNodeType import BaseNodeType -class NoneNode(NamedTuple, BaseNodeType): # type: ignore +class NoneNode(BaseNodeType): # type: ignore pass diff --git a/py_codegen/type_extractor/nodes/TupleFound.py b/py_codegen/type_extractor/nodes/TupleFound.py index 904ef7e..53479a8 100644 --- a/py_codegen/type_extractor/nodes/TupleFound.py +++ b/py_codegen/type_extractor/nodes/TupleFound.py @@ -1,7 +1,9 @@ -from typing import NamedTuple, List +from dataclasses import dataclass +from typing import List from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType -class TupleFound(NamedTuple, BaseNodeType): # type: ignore +@dataclass +class TupleFound(BaseNodeType): types: List[NodeType] diff --git a/py_codegen/type_extractor/nodes/TypeOR.py b/py_codegen/type_extractor/nodes/TypeOR.py index d235722..569d5ad 100644 --- a/py_codegen/type_extractor/nodes/TypeOR.py +++ b/py_codegen/type_extractor/nodes/TypeOR.py @@ -1,8 +1,9 @@ -from typing import NamedTuple +from dataclasses import dataclass -from .BaseNodeType import BaseNodeType +from .BaseNodeType import BaseNodeType, NodeType -class TypeOR(NamedTuple, BaseNodeType): # type: ignore - a: type - b: type +@dataclass +class TypeOR(BaseNodeType): # type: ignore + a: NodeType + b: NodeType diff --git a/py_codegen/type_extractor/nodes/TypedDictFound.py b/py_codegen/type_extractor/nodes/TypedDictFound.py index 496fa9a..9d5f7da 100644 --- a/py_codegen/type_extractor/nodes/TypedDictFound.py +++ b/py_codegen/type_extractor/nodes/TypedDictFound.py @@ -1,11 +1,14 @@ -from typing import Dict, NamedTuple, Optional +from dataclasses import dataclass +from typing import Dict, Optional +from typing_extensions import _TypedDictMeta # type: ignore -from mypy_extensions import _TypedDictMeta # type: ignore +# from mypy_extensions import _TypedDictMeta # type: ignore from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType -class TypedDictFound(NamedTuple, BaseNodeType): # type: ignore +@dataclass +class TypedDictFound(BaseNodeType): # type: ignore annotations: Dict[str, NodeType] name: str = '' raw: Optional[_TypedDictMeta] = None diff --git a/py_codegen/type_extractor/type_extractor.py b/py_codegen/type_extractor/type_extractor.py index 9138ce6..32c32e7 100644 --- a/py_codegen/type_extractor/type_extractor.py +++ b/py_codegen/type_extractor/type_extractor.py @@ -80,8 +80,6 @@ def params_to_nodes( ) return processed_params - # def rawtype_to_node(self, typ): - def rawtype_to_node(self, typ, options=None): for middleware in self.middlewares: value = middleware(typ, self) @@ -89,22 +87,6 @@ def rawtype_to_node(self, typ, options=None): return value return unknown_found - # if typ is inspect._empty: - # return unknown_found - # - # elif inspect.isfunction(typ): - # function_found = self.__to_function_found(typ) - # return function_found - # - # elif inspect.isclass(typ): - # class_found = self.__to_class_found(typ) - # self.__add_found(class_found) - # return class_found - # - # return unknown_found - - # raise NotImplementedError(f'type_extractor not implemented for {typ}') - def add(self, options=None): def add_decoration(typ): if not is_builtin(typ): diff --git a/requirements.txt b/requirements.txt index 3b8db95..9ea4101 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ -setuptools==41.2.0 +setuptools>=43.0.0 dataclasses==0.6 extractor==0.5 typing==3.7.4.1 -mypy==0.720 +mypy>=0.761 From f80137c57ceac80e6a73dcb1e36ae31fce5e23a2 Mon Sep 17 00:00:00 2001 From: devdoomari Date: Mon, 6 Jan 2020 20:12:54 +0900 Subject: [PATCH 02/34] add options --- py_codegen/plugins/typescript/yarn.lock | 1114 ++++++++--------- py_codegen/type_extractor/__base__.py | 9 +- .../__tests__/test_class_with_union_field.py | 10 + .../__tests__/test_func_with_list.py | 17 +- .../type_extractor/middlewares/class_found.py | 21 +- .../type_extractor/middlewares/dict_found.py | 10 +- .../middlewares/function_found.py | 19 +- .../type_extractor/middlewares/list_found.py | 9 +- .../middlewares/literal_found.py | 9 +- .../middlewares/mapping_found.py | 10 +- .../type_extractor/middlewares/tuple_found.py | 9 +- .../type_extractor/middlewares/type_or.py | 9 +- .../middlewares/typeddict_found.py | 8 +- .../type_extractor/nodes/BaseNodeType.py | 9 +- py_codegen/type_extractor/nodes/ClassFound.py | 5 +- py_codegen/type_extractor/nodes/DictFound.py | 9 +- .../type_extractor/nodes/FunctionFound.py | 5 +- py_codegen/type_extractor/nodes/ListFound.py | 7 +- .../type_extractor/nodes/LiteralFound.py | 7 +- .../type_extractor/nodes/MappingFound.py | 8 +- py_codegen/type_extractor/nodes/NoneNode.py | 10 +- py_codegen/type_extractor/nodes/TypeOR.py | 7 +- .../type_extractor/nodes/TypedDictFound.py | 8 +- py_codegen/type_extractor/type_extractor.py | 24 +- 24 files changed, 718 insertions(+), 635 deletions(-) diff --git a/py_codegen/plugins/typescript/yarn.lock b/py_codegen/plugins/typescript/yarn.lock index d271cd8..6e0f3da 100644 --- a/py_codegen/plugins/typescript/yarn.lock +++ b/py_codegen/plugins/typescript/yarn.lock @@ -2,133 +2,132 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== dependencies: "@babel/highlight" "^7.0.0" "@babel/core@^7.1.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.4.tgz#84055750b05fcd50f9915a826b44fa347a825250" - integrity sha512-lQgGX3FPRgbz2SKmhMtYgJvVzGZrmjaF4apZ2bLwofAKiSjxU0drPh4S/VasyYXwaTs+A1gvQ45BN8SQJzHsQQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" - "@babel/helpers" "^7.4.4" - "@babel/parser" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" - convert-source-map "^1.1.0" + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9" + integrity sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.7" + "@babel/helpers" "^7.7.4" + "@babel/parser" "^7.7.7" + "@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.11" + lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.0.0", "@babel/generator@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" - integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== +"@babel/generator@^7.4.0", "@babel/generator@^7.7.4", "@babel/generator@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.7.tgz#859ac733c44c74148e1a72980a64ec84b85f4f45" + integrity sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ== dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.7.4" jsesc "^2.5.1" - lodash "^4.17.11" + lodash "^4.17.13" source-map "^0.5.0" - trim-right "^1.0.1" -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== +"@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.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" + "@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" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== +"@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.0.0" + "@babel/types" "^7.7.4" "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== -"@babel/helper-split-export-declaration@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" - integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== +"@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/types" "^7.4.4" + "@babel/types" "^7.7.4" -"@babel/helpers@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5" - integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A== +"@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.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" "@babel/highlight@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" - integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== dependencies: chalk "^2.0.0" esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6" - integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w== +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.4", "@babel/parser@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" + integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== "@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== + 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/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" - integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.4.tgz#0776f038f6d78361860b6823887d4f3937133fe8" - integrity sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A== +"@babel/template@^7.4.0", "@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/generator" "^7.4.4" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@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.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.11" + lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" - integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@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.11" + lodash "^4.17.13" to-fast-properties "^2.0.0" "@cnakazawa/watch@^1.0.3": @@ -139,16 +138,7 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@jest/console@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" - integrity sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg== - dependencies: - "@jest/source-map" "^24.3.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/console@^24.9.0": +"@jest/console@^24.7.1", "@jest/console@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== @@ -237,16 +227,7 @@ source-map "^0.6.0" string-length "^2.0.0" -"@jest/source-map@^24.3.0": - version "24.3.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28" - integrity sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - -"@jest/source-map@^24.9.0": +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== @@ -306,9 +287,9 @@ "@types/yargs" "^13.0.0" "@types/babel__core@^7.1.0": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.1.tgz#ce9a9e5d92b7031421e1d0d74ae59f572ba48be6" - integrity sha512-+hjBtgcFPYyCTo0A15+nxrCVJL7aC6Acg87TXd5OW3QhHswdrOLoles+ldL2Uk8q++7yIfl4tURtztccdeeyOw== + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" + integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -317,9 +298,9 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" - integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== + version "7.6.1" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== dependencies: "@babel/types" "^7.0.0" @@ -332,9 +313,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.6.tgz#328dd1a8fc4cfe3c8458be9477b219ea158fd7b2" - integrity sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw== + version "7.0.8" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.8.tgz#479a4ee3e291a403a1096106013ec22cf9b64012" + integrity sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw== dependencies: "@babel/types" "^7.3.0" @@ -384,12 +365,7 @@ dependencies: "@types/node" "*" -"@types/node@*": - version "10.12.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.9.tgz#a07bfa74331471e1dc22a47eb72026843f7b95c8" - integrity sha512-eajkMXG812/w3w4a1OcBlaTwsFPO5F7fJ/amy+tieQxEMWBlbV1JGSjkFM+zkHNf81Cad+dfIRA+IBkvmvdAeA== - -"@types/node@^13.1.4": +"@types/node@*", "@types/node@^13.1.4": version "13.1.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.4.tgz#4cfd90175a200ee9b02bd6b1cd19bc349741607e" integrity sha512-Lue/mlp2egZJoHXZr4LndxDAd7i/7SQYhV0EjWfb/a4/OZ6tuVwMCVPiwkU5nsEipxEf7hmkSU7Em5VQ8P5NGA== @@ -410,16 +386,16 @@ integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== "@types/yargs@^13.0.0": - version "13.0.2" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.2.tgz#a64674fc0149574ecd90ba746e932b5a5f7b3653" - integrity sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ== + version "13.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.4.tgz#53d231cebe1a540e7e13727fc1f0d13ad4a9ba3b" + integrity sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A== dependencies: "@types/yargs-parser" "*" abab@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" - integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== abbrev@1: version "1.1.1" @@ -427,17 +403,17 @@ abbrev@1: integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== acorn-globals@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" - integrity sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw== + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== dependencies: acorn "^6.0.1" acorn-walk "^6.0.1" acorn-walk@^6.0.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" - integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== acorn@^5.5.3: version "5.7.3" @@ -445,14 +421,14 @@ acorn@^5.5.3: integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== acorn@^6.0.1: - version "6.0.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754" - integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg== + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== ajv@^6.5.5: - version "6.5.5" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.5.tgz#cf97cdade71c6399a92c6d6c4177381291b781a1" - integrity sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg== + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -460,9 +436,9 @@ ajv@^6.5.5: uri-js "^4.2.2" ansi-escapes@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" - integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== + 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-regex@^2.0.0: version "2.1.1" @@ -567,16 +543,16 @@ astral-regex@^1.0.0: integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.1.1: +atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== @@ -587,9 +563,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + version "1.9.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" + integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== babel-jest@^24.9.0: version "24.9.0" @@ -605,13 +581,14 @@ babel-jest@^24.9.0: slash "^2.0.0" babel-plugin-istanbul@^5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.3.tgz#202d20ffc96a821c68a3964412de75b9bdeb48c7" - integrity sha512-IFyehbvRRwdBlI1lDp+FaMsWNnEndEk7065IB8NhzBX+ZKLPwPodgk4I5Gobw/8SNUUzso2Dv3hbqRh88eiSCQ== + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== dependencies: + "@babel/helper-plugin-utils" "^7.0.0" find-up "^3.0.0" - istanbul-lib-instrument "^3.2.0" - test-exclude "^5.2.2" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" babel-plugin-jest-hoist@^24.9.0: version "24.9.0" @@ -653,6 +630,13 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -696,10 +680,10 @@ bs-logger@0.x: dependencies: fast-json-stable-stringify "2.x" -bser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" - integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" @@ -708,7 +692,7 @@ buffer-from@1.x, buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== -builtin-modules@^1.0.0, builtin-modules@^1.1.1: +builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= @@ -755,16 +739,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -774,9 +749,9 @@ chalk@^2.4.2: supports-color "^5.3.0" chownr@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== ci-info@^2.0.0: version "2.0.0" @@ -833,26 +808,21 @@ color-name@1.1.3: integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" -commander@^2.12.1: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== - -commander@~2.17.1: - version "2.17.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== +commander@^2.12.1, commander@~2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== concat-map@0.0.1: version "0.0.1" @@ -864,10 +834,10 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -convert-source-map@^1.1.0, convert-source-map@^1.4.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== +convert-source-map@^1.4.0, 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" @@ -893,14 +863,14 @@ cross-spawn@^6.0.0: which "^1.2.9" cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" - integrity sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog== + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb" - integrity sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog== + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== dependencies: cssom "0.3.x" @@ -920,13 +890,20 @@ data-urls@^1.0.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: +debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" +debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -954,7 +931,7 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -define-properties@^1.1.2: +define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -1034,9 +1011,9 @@ emoji-regex@^7.0.1: integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 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" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" @@ -1047,21 +1024,27 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.5.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" - integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== +es-abstract@^1.17.0-next.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" + integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== dependencies: - es-to-primitive "^1.1.1" + es-to-primitive "^1.2.1" function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-to-primitive@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" is-date-object "^1.0.1" @@ -1073,9 +1056,9 @@ escape-string-regexp@^1.0.5: integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.9.1: - version "1.11.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" - integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== + version "1.12.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.1.tgz#08770602a74ac34c7a90ca9229e7d51e379abc76" + integrity sha512-Q8t2YZ+0e0pc7NRVj3B4tSQ9rim1oi4Fh46k2xhJ2qOiEwhQfdjyEQddWdj7ZFaKmU+5104vn1qrcjEPWq+bgQ== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -1095,19 +1078,19 @@ esprima@^4.0.0: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== exec-sh@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" - integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== execa@^1.0.0: version "1.0.0" @@ -1202,21 +1185,26 @@ fast-deep-equal@^2.0.1: integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: - version "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= + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -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= fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== dependencies: - bser "^2.0.0" + bser "2.1.1" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== fill-range@^4.0.0: version "4.0.0" @@ -1271,11 +1259,11 @@ fs-extra@^8.1.0: universalify "^0.1.0" fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== dependencies: - minipass "^2.2.1" + minipass "^2.6.0" fs.realpath@^1.0.0: version "1.0.0" @@ -1283,12 +1271,12 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.8.tgz#57ea5320f762cd4696e5e8e87120eccc8b11cacf" - integrity sha512-tPvHgPGB7m40CZ68xqFGkKuzN+RnpGmSV+hgeKxhRpbxdqKXUFJGC3yonBOLzQBcJyGpdZFDfCsdOC2KFsXzeA== + version "1.2.11" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" + integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== dependencies: + bindings "^1.5.0" nan "^2.12.1" - node-pre-gyp "^0.12.0" function-bind@^1.1.1: version "1.1.1" @@ -1333,10 +1321,10 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: + 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" @@ -1346,19 +1334,14 @@ glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: path-is-absolute "^1.0.0" globals@^11.1.0: - version "11.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" - integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -graceful-fs@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" - integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== growly@^1.3.0: version "1.3.0" @@ -1366,9 +1349,9 @@ growly@^1.3.0: integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= handlebars@^4.1.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.2.0.tgz#57ce8d2175b9bbb3d8b3cf3e4217b1aec8ddcb2e" - integrity sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw== + version "4.5.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" + integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== dependencies: neo-async "^2.6.0" optimist "^0.6.1" @@ -1394,10 +1377,10 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== has-unicode@^2.0.0: version "2.0.1" @@ -1435,7 +1418,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.1: +has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -1443,9 +1426,9 @@ has@^1.0.1: function-bind "^1.1.1" hosted-git-info@^2.1.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + version "2.8.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== html-encoding-sniffer@^1.0.2: version "1.0.2" @@ -1471,9 +1454,9 @@ iconv-lite@0.4.24, iconv-lite@^0.4.4: safer-buffer ">= 2.1.2 < 3" ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== dependencies: minimatch "^3.0.4" @@ -1499,9 +1482,9 @@ inflight@^1.0.4: wrappy "1" inherits@2, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@~1.3.0: version "1.3.5" @@ -1539,17 +1522,10 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= - dependencies: - builtin-modules "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== is-ci@^2.0.0: version "2.0.0" @@ -1573,9 +1549,9 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== is-descriptor@^0.1.0: version "0.1.6" @@ -1631,19 +1607,19 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== dependencies: - has "^1.0.1" + has "^1.0.3" is-stream@^1.1.0: version "1.1.0" @@ -1651,11 +1627,11 @@ is-stream@^1.1.0: integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== dependencies: - has-symbols "^1.0.0" + has-symbols "^1.0.1" is-typedarray@~1.0.0: version "1.0.0" @@ -1699,27 +1675,22 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#927a354005d99dd43a24607bb8b33fd4e9aca1ad" - integrity sha512-LXTBICkMARVgo579kWDm8SqfB6nvSDKNqIOBEjmJRnL04JvoMHCYGWaMddQnseJYtkEuEvO/sIcOxPLk9gERug== - -istanbul-lib-coverage@^2.0.5: +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== -istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.2.0.tgz#c549208da8a793f6622257a2da83e0ea96ae6a93" - integrity sha512-06IM3xShbNW4NgZv5AP4QH0oHqf1/ivFo8eFys0ZjPXHGldHJQWb3riYOKXqmOqfxXBfxu4B+g/iuhOPZH0RJg== - dependencies: - "@babel/generator" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - istanbul-lib-coverage "^2.0.4" +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" semver "^6.0.0" istanbul-lib-report@^2.0.4: @@ -1732,14 +1703,14 @@ istanbul-lib-report@^2.0.4: supports-color "^6.1.0" istanbul-lib-source-maps@^3.0.1: - version "3.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.5.tgz#1d9ee9d94d2633f15611ee7aae28f9cac6d1aeb9" - integrity sha512-eDhZ7r6r1d1zQPVZehLc3D0K14vRba/eBYkz3rw16DLOrrTzve9RmnkcwrrkWVgO1FL3EK5knujVe5S8QHE9xw== + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== dependencies: debug "^4.1.1" - istanbul-lib-coverage "^2.0.4" + istanbul-lib-coverage "^2.0.5" make-dir "^2.1.0" - rimraf "^2.6.2" + rimraf "^2.6.3" source-map "^0.6.1" istanbul-reports@^2.2.6: @@ -1811,9 +1782,9 @@ jest-diff@^24.3.0, jest-diff@^24.9.0: pretty-format "^24.9.0" jest-docblock@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.3.0.tgz#b9c32dac70f72e4464520d2ba4aec02ab14db5dd" - integrity sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg== + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== dependencies: detect-newline "^2.1.0" @@ -1941,12 +1912,7 @@ jest-pnp-resolver@^1.2.1: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== -jest-regex-util@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" - integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg== - -jest-regex-util@^24.9.0: +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== @@ -2092,15 +2058,7 @@ jest-watcher@^24.9.0: jest-util "^24.9.0" string-length "^2.0.0" -jest-worker@^24.6.0: - version "24.6.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.6.0.tgz#7f81ceae34b7cde0c9827a6980c35b7cdc0161b3" - integrity sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ== - dependencies: - merge-stream "^1.0.1" - supports-color "^6.1.0" - -jest-worker@^24.9.0: +jest-worker@^24.6.0, jest-worker@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== @@ -2192,9 +2150,9 @@ json-stringify-safe@~5.0.1: integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json5@2.x, json5@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" - integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== dependencies: minimist "^1.2.0" @@ -2239,7 +2197,7 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -kleur@^3.0.2: +kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== @@ -2290,12 +2248,7 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash@^4.13.1, lodash@^4.17.11: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== - -lodash@^4.17.15: +lodash@^4.17.13, 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== @@ -2339,13 +2292,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= - dependencies: - readable-stream "^2.0.1" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -2370,17 +2316,17 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -mime-db@~1.37.0: - version "1.37.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" - integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.21" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" - integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== dependencies: - mime-db "~1.37.0" + mime-db "1.43.0" minimatch@^3.0.4: version "3.0.4" @@ -2404,25 +2350,25 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" - integrity sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg== +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== dependencies: - minipass "^2.2.1" + minipass "^2.9.0" mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -2440,9 +2386,9 @@ ms@2.0.0: integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== mz@^2.7.0: version "2.7.0" @@ -2454,9 +2400,9 @@ mz@^2.7.0: thenify-all "^1.0.0" nan@^2.12.1: - version "2.13.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" - integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nanomatch@^1.2.9: version "1.2.13" @@ -2481,18 +2427,18 @@ natural-compare@^1.4.0: integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= needle@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" - integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== dependencies: - debug "^2.1.2" + debug "^3.2.6" iconv-lite "^0.4.4" sax "^1.2.4" neo-async@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" - integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== nice-try@^1.0.4: version "1.0.5" @@ -2520,10 +2466,10 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== +node-pre-gyp@*: + version "0.14.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" + integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -2534,7 +2480,7 @@ node-pre-gyp@^0.12.0: rc "^1.2.7" rimraf "^2.6.1" semver "^5.3.0" - tar "^4" + tar "^4.4.2" nopt@^4.0.1: version "4.0.1" @@ -2545,12 +2491,12 @@ nopt@^4.0.1: osenv "^0.1.4" normalize-package-data@^2.3.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" + resolve "^1.10.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" @@ -2562,14 +2508,21 @@ normalize-path@^2.1.1: remove-trailing-separator "^1.0.1" npm-bundled@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" - integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== npm-packlist@^1.1.6: - version "1.1.12" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" - integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== + version "1.4.7" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.7.tgz#9e954365a06b80b18111ea900945af4f88ed4848" + integrity sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -2597,9 +2550,9 @@ number-is-nan@^1.0.0: integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= nwsapi@^2.0.7: - version "2.0.9" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" - integrity sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== oauth-sign@~0.9.0: version "0.9.0" @@ -2620,10 +2573,15 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-keys@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" - integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object-visit@^1.0.0: version "1.0.1" @@ -2632,13 +2590,23 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== dependencies: define-properties "^1.1.2" - es-abstract "^1.5.1" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" object.pick@^1.3.0: version "1.3.0" @@ -2663,16 +2631,16 @@ optimist@^0.6.1: wordwrap "~0.0.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= + 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.4" + fast-levenshtein "~2.0.6" levn "~0.3.0" prelude-ls "~1.1.2" type-check "~0.3.2" - wordwrap "~1.0.0" + word-wrap "~1.2.3" os-homedir@^1.0.0: version "1.0.2" @@ -2705,9 +2673,9 @@ p-finally@^1.0.0: integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-limit@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" - integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== dependencies: p-try "^2.0.0" @@ -2761,7 +2729,7 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.5, path-parse@^1.0.6: +path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -2833,22 +2801,22 @@ pretty-format@^24.9.0: react-is "^16.8.4" process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== prompts@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.4.tgz#179f9d4db3128b9933aa35f93a800d8fce76a682" - integrity sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.0.tgz#a444e968fa4cc7e86689a74050685ac8006c4cc4" + integrity sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg== dependencies: - kleur "^3.0.2" - sisteransi "^1.0.0" + kleur "^3.0.3" + sisteransi "^1.0.3" -psl@^1.1.24: - version "1.1.29" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" - integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== +psl@^1.1.24, psl@^1.1.28: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== pump@^3.0.0: version "3.0.0" @@ -2863,7 +2831,7 @@ punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -2884,9 +2852,9 @@ rc@^1.2.7: strip-json-comments "~2.0.1" react-is@^16.8.4: - version "16.8.6" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" - integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" + integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== read-pkg-up@^4.0.0: version "4.0.0" @@ -2905,10 +2873,10 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -readable-stream@^2.0.1, readable-stream@^2.0.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== +readable-stream@^2.0.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -2948,21 +2916,21 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -request-promise-core@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" - integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== dependencies: - lodash "^4.13.1" + lodash "^4.17.15" request-promise-native@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" - integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU= + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== dependencies: - request-promise-core "1.1.1" - stealthy-require "^1.1.0" - tough-cookie ">=2.3.3" + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" request@^2.87.0: version "2.88.0" @@ -3022,45 +2990,36 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x: - version "1.10.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" - integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== +resolve@1.x, resolve@^1.10.0, resolve@^1.3.2: + version "1.14.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff" + integrity sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg== dependencies: path-parse "^1.0.6" -resolve@^1.3.2: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== - dependencies: - path-parse "^1.0.5" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@^2.5.4, rimraf@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== - dependencies: - glob "^7.0.5" - -rimraf@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== +rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" rsvp@^4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" - integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -3097,22 +3056,12 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5, semver@^5.5.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== - -semver@^5.4.1, semver@^5.6.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" - integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== - -semver@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" - integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.2.0: +semver@^6.0.0, semver@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -3122,20 +3071,10 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -3164,10 +3103,10 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sisteransi@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" - integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== +sisteransi@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" + integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== slash@^2.0.0: version "2.0.0" @@ -3205,20 +3144,20 @@ snapdragon@^0.8.1: use "^3.1.0" source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: - atob "^2.1.1" + atob "^2.1.2" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" source-map-support@^0.5.6: - version "0.5.9" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" - integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -3239,9 +3178,9 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== spdx-correct@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" - integrity sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ== + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -3260,9 +3199,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" - integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg== + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -3277,9 +3216,9 @@ sprintf-js@~1.0.2: integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" - integrity sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA== + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -3304,7 +3243,7 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -stealthy-require@^1.1.0: +stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= @@ -3343,6 +3282,22 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -3401,27 +3356,27 @@ supports-color@^6.1.0: has-flag "^3.0.0" symbol-tree@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" - integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -tar@^4: - version "4.4.8" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" - integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== +tar@^4.4.2: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== dependencies: chownr "^1.1.1" fs-minipass "^1.2.5" - minipass "^2.3.4" - minizlib "^1.1.1" + minipass "^2.8.6" + minizlib "^1.2.1" mkdirp "^0.5.0" safe-buffer "^5.1.2" - yallist "^3.0.2" + yallist "^3.0.3" -test-exclude@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.2.tgz#7322f8ab037b0b93ad2aab35fe9068baf997a4c4" - integrity sha512-N2pvaLpT8guUpb5Fe1GJlmvmzH3x+DAKmmyEQmFP792QcLYoGE1syxztSvPD1V8yPe6VrcCt6YGQVjSRjCASsA== +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== dependencies: glob "^7.1.3" minimatch "^3.0.4" @@ -3482,7 +3437,15 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -tough-cookie@>=2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.4.3: +tough-cookie@^2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== @@ -3497,11 +3460,6 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - ts-jest@^24.2.0: version "24.2.0" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.2.0.tgz#7abca28c2b4b0a1fdd715cd667d65d047ea4e768" @@ -3519,9 +3477,9 @@ ts-jest@^24.2.0: yargs-parser "10.x" tslib@^1.8.0, tslib@^1.8.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== tslint@^5.20.1: version "5.20.1" @@ -3574,22 +3532,22 @@ typescript@^3.7.4: integrity sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw== uglify-js@^3.1.4: - version "3.4.9" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" - integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== + version "3.7.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.3.tgz#f918fce9182f466d5140f24bb0ff35c2d32dcc6a" + integrity sha512-7tINm46/3puUA4hCkKYo4Xdts+JDaVC9ZPRcG8Xw9R4nhO/gZgUM3TENq8IF4Vatk8qCig4MzP/c8G4u2BkVQg== dependencies: - commander "~2.17.1" + commander "~2.20.3" source-map "~0.6.1" union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" - set-value "^0.4.3" + set-value "^2.0.1" universalify@^0.1.0: version "0.1.2" @@ -3635,9 +3593,9 @@ util.promisify@^1.0.0: object.getownpropertydescriptors "^2.0.3" uuid@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + version "3.3.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -3683,9 +3641,9 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: iconv-lite "0.4.24" whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz#a3d58ef10b76009b042d03e25591ece89b88d171" - integrity sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw== + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== whatwg-url@^6.4.1: version "6.5.0" @@ -3697,9 +3655,9 @@ whatwg-url@^6.4.1: webidl-conversions "^4.0.2" whatwg-url@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" - integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.1" @@ -3724,16 +3682,16 @@ 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" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -3774,10 +3732,10 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= +yallist@^3.0.0, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yargs-parser@10.x: version "10.1.0" diff --git a/py_codegen/type_extractor/__base__.py b/py_codegen/type_extractor/__base__.py index 425b1ce..df054f8 100644 --- a/py_codegen/type_extractor/__base__.py +++ b/py_codegen/type_extractor/__base__.py @@ -1,7 +1,7 @@ from abc import ABC -from typing import Dict, Union, List +from typing import Dict, Union, List, Set, Optional -from py_codegen.type_extractor.nodes.BaseNodeType import NodeType +from py_codegen.type_extractor.nodes.BaseNodeType import NodeType, BaseOption class BaseTypeExtractor(ABC): @@ -20,7 +20,10 @@ def params_to_nodes( def rawtype_to_node(self, typ) -> NodeType: pass - def add(self, options=None): + def add( + self, + options: Optional[Set[BaseOption]] = None, + ): def add_decoration(typ): pass return add_decoration diff --git a/py_codegen/type_extractor/__tests__/test_class_with_union_field.py b/py_codegen/type_extractor/__tests__/test_class_with_union_field.py index 576534f..0023944 100644 --- a/py_codegen/type_extractor/__tests__/test_class_with_union_field.py +++ b/py_codegen/type_extractor/__tests__/test_class_with_union_field.py @@ -1,14 +1,23 @@ +from dataclasses import dataclass + from py_codegen.test_fixtures.union_type_class import ClassWithUnionField +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption from py_codegen.type_extractor.nodes.ClassFound import ClassFound from py_codegen.type_extractor.nodes.TypeOR import TypeOR from py_codegen.type_extractor.__tests__.utils import traverse, cleanup from py_codegen.type_extractor.type_extractor import TypeExtractor +@dataclass(frozen=True) +class SomeOption(BaseOption): + some_var: int + + def test_class_with_union_field(): type_collector = TypeExtractor() type_collector.add(None)(ClassWithUnionField) + type_collector.add({SomeOption(some_var=1)})(ClassWithUnionField) classes = { key: traverse(value, cleanup) @@ -23,6 +32,7 @@ def test_class_with_union_field(): a=str, b=int ) }, + options={SomeOption(some_var=1)}, ) } functions = type_collector.functions diff --git a/py_codegen/type_extractor/__tests__/test_func_with_list.py b/py_codegen/type_extractor/__tests__/test_func_with_list.py index 7627749..57594bd 100644 --- a/py_codegen/type_extractor/__tests__/test_func_with_list.py +++ b/py_codegen/type_extractor/__tests__/test_func_with_list.py @@ -1,14 +1,28 @@ +from dataclasses import dataclass + from py_codegen.type_extractor.__tests__.utils import cleanup, traverse +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound from py_codegen.type_extractor.nodes.ListFound import ListFound from py_codegen.type_extractor.type_extractor import TypeExtractor from py_codegen.test_fixtures.func_with_list import func_with_list +@dataclass(frozen=True) +class SomeOption(BaseOption): + some_var: int + + def test_func_with_list(): type_collector = TypeExtractor() - type_collector.add(None)(func_with_list) + type_collector.add( + options={SomeOption(some_var=3)} + )(func_with_list) + + type_collector.add( + options={SomeOption(some_var=5)} + )(func_with_list) # assert type_collector.classes == {} func_found_cleaned = cleanup( @@ -21,6 +35,7 @@ def test_func_with_list(): 'input': ListFound(str), }, return_type=ListFound(str), + options={SomeOption(some_var=3), SomeOption(some_var=5)}, ), cleanup, ) diff --git a/py_codegen/type_extractor/middlewares/class_found.py b/py_codegen/type_extractor/middlewares/class_found.py index 5087ecf..2718ee8 100644 --- a/py_codegen/type_extractor/middlewares/class_found.py +++ b/py_codegen/type_extractor/middlewares/class_found.py @@ -3,18 +3,32 @@ from dataclasses import dataclass from mypy_extensions import _TypedDictMeta # type: ignore +from typing import Set from py_codegen.type_extractor.__base__ import BaseTypeExtractor +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption from py_codegen.type_extractor.nodes.ClassFound import ClassFound from py_codegen.type_extractor.utils import is_builtin -def class_found_middleware(_class, type_extractor: BaseTypeExtractor): +def class_found_middleware( + _class, + type_extractor: BaseTypeExtractor, + options: Set[BaseOption], +): if not inspect.isclass(_class) \ or is_builtin(_class) \ or _class is inspect._empty \ or isinstance(_class, _TypedDictMeta): return None + + duplicate = type_extractor.collected_types.get(_class.__name__) + if duplicate is not None: + assert isinstance(duplicate, ClassFound) \ + and duplicate.class_raw == _class + duplicate.options = duplicate.options.union(options) + return duplicate + _data_class = dataclass(_class) argspec = inspect.getfullargspec(_data_class) module = inspect.getmodule(_class) @@ -26,10 +40,9 @@ def class_found_middleware(_class, type_extractor: BaseTypeExtractor): filePath=filename, raw_fields=argspec.annotations, fields=fields, - doc=_class.__doc__ + doc=_class.__doc__, + options=options, ) - duplicate = type_extractor.collected_types.get(class_found.name) - assert duplicate == class_found or duplicate is None type_extractor.collected_types[class_found.name] = class_found return class_found diff --git a/py_codegen/type_extractor/middlewares/dict_found.py b/py_codegen/type_extractor/middlewares/dict_found.py index 826a944..50357c7 100644 --- a/py_codegen/type_extractor/middlewares/dict_found.py +++ b/py_codegen/type_extractor/middlewares/dict_found.py @@ -1,16 +1,22 @@ -from typing import Dict +from typing import Dict, Set from py_codegen.type_extractor.__base__ import BaseTypeExtractor from py_codegen.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption from py_codegen.type_extractor.nodes.DictFound import DictFound from py_codegen.type_extractor.nodes.UnknownFound import unknown_found -def dict_found_middleware(typ, type_extractor: BaseTypeExtractor): +def dict_found_middleware( + typ, + type_extractor: BaseTypeExtractor, + options: Set[BaseOption], +): if typ == Dict: # for `Dict` return DictFound( key=unknown_found, value=unknown_found, + options=options, ) typ_origin = get_typ_origin(typ) if typ_origin is not dict and typ_origin is not Dict: diff --git a/py_codegen/type_extractor/middlewares/function_found.py b/py_codegen/type_extractor/middlewares/function_found.py index e0942fc..38af3a5 100644 --- a/py_codegen/type_extractor/middlewares/function_found.py +++ b/py_codegen/type_extractor/middlewares/function_found.py @@ -1,13 +1,26 @@ import inspect +from typing import Set + from py_codegen.type_extractor.__base__ import BaseTypeExtractor +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -def func_found_middleware(func, type_extractor: BaseTypeExtractor): +def func_found_middleware( + func, + type_extractor: BaseTypeExtractor, + options: Set[BaseOption], +): if not inspect.isfunction(func): return None try: + duplicate_func_found = type_extractor.collected_types.get(func.__name__) + if duplicate_func_found is not None: + assert isinstance(duplicate_func_found, FunctionFound) and duplicate_func_found.func == func + duplicate_func_found.options = duplicate_func_found.options.union(options) + return duplicate_func_found + argspec = inspect.getfullargspec(func) signature = inspect.signature(func) module = inspect.getmodule(func) @@ -22,9 +35,9 @@ def func_found_middleware(func, type_extractor: BaseTypeExtractor): doc=func.__doc__ or '', func=func, return_type=return_type, + options=options, ) - duplicate_func_found = type_extractor.collected_types.get(func_found.name) - assert duplicate_func_found == func_found or duplicate_func_found is None + type_extractor.collected_types[func_found.name] = func_found return func_found except Exception as e: diff --git a/py_codegen/type_extractor/middlewares/list_found.py b/py_codegen/type_extractor/middlewares/list_found.py index e92e939..57a7ff4 100644 --- a/py_codegen/type_extractor/middlewares/list_found.py +++ b/py_codegen/type_extractor/middlewares/list_found.py @@ -1,11 +1,16 @@ -from typing import List +from typing import List, Set from py_codegen.type_extractor.__base__ import BaseTypeExtractor from py_codegen.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption from py_codegen.type_extractor.nodes.ListFound import ListFound -def list_found_middleware(typ, type_extractor: BaseTypeExtractor): +def list_found_middleware( + typ, + type_extractor: BaseTypeExtractor, + options: Set[BaseOption], +): typ_origin = get_typ_origin(typ) if typ_origin is not list and typ_origin is not List: return diff --git a/py_codegen/type_extractor/middlewares/literal_found.py b/py_codegen/type_extractor/middlewares/literal_found.py index e746b0f..cd9c297 100644 --- a/py_codegen/type_extractor/middlewares/literal_found.py +++ b/py_codegen/type_extractor/middlewares/literal_found.py @@ -1,8 +1,9 @@ -from typing import Tuple +from typing import Tuple, Set from typing_extensions import Literal from py_codegen.type_extractor.__base__ import BaseTypeExtractor from py_codegen.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption from py_codegen.type_extractor.nodes.LiteralFound import LiteralFound from py_codegen.type_extractor.nodes.TypeOR import TypeOR @@ -15,7 +16,11 @@ def __is_literal_typ(typ_origin): ) -def literal_found_middleware(typ, type_extractor: BaseTypeExtractor): +def literal_found_middleware( + typ, + type_extractor: BaseTypeExtractor, + options: Set[BaseOption], +): typ_origin = get_typ_origin(typ) if not __is_literal_typ(typ_origin): return diff --git a/py_codegen/type_extractor/middlewares/mapping_found.py b/py_codegen/type_extractor/middlewares/mapping_found.py index 8cb0223..8277cf9 100644 --- a/py_codegen/type_extractor/middlewares/mapping_found.py +++ b/py_codegen/type_extractor/middlewares/mapping_found.py @@ -1,12 +1,18 @@ from collections import abc -from typing import Mapping +from typing import Mapping, Set from py_codegen.type_extractor.__base__ import BaseTypeExtractor from py_codegen.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption from py_codegen.type_extractor.nodes.MappingFound import MappingFound -def mapping_found_middleware(typ, type_extractor: BaseTypeExtractor): +def mapping_found_middleware( + typ, + type_extractor: BaseTypeExtractor, + options: Set[BaseOption], + +): typ_origin = get_typ_origin(typ) if typ_origin is not abc.Mapping and typ_origin is not Mapping: return diff --git a/py_codegen/type_extractor/middlewares/tuple_found.py b/py_codegen/type_extractor/middlewares/tuple_found.py index 39239b4..51a6701 100644 --- a/py_codegen/type_extractor/middlewares/tuple_found.py +++ b/py_codegen/type_extractor/middlewares/tuple_found.py @@ -1,11 +1,16 @@ -from typing import Tuple +from typing import Tuple, Set from py_codegen.type_extractor.__base__ import BaseTypeExtractor from py_codegen.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption from py_codegen.type_extractor.nodes.TupleFound import TupleFound -def tuple_found_middleware(typ, type_extractor: BaseTypeExtractor): +def tuple_found_middleware( + typ, + type_extractor: BaseTypeExtractor, + options: Set[BaseOption], +): typ_origin = get_typ_origin(typ) if typ_origin is not tuple and typ_origin is not Tuple: return diff --git a/py_codegen/type_extractor/middlewares/type_or.py b/py_codegen/type_extractor/middlewares/type_or.py index c9ee4aa..8132492 100644 --- a/py_codegen/type_extractor/middlewares/type_or.py +++ b/py_codegen/type_extractor/middlewares/type_or.py @@ -1,11 +1,16 @@ -from typing import Union +from typing import Union, Set from py_codegen.type_extractor.__base__ import BaseTypeExtractor from py_codegen.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption from py_codegen.type_extractor.nodes.TypeOR import TypeOR -def typeor_middleware(typ, type_extractor: BaseTypeExtractor): +def typeor_middleware( + typ, + type_extractor: BaseTypeExtractor, + options: Set[BaseOption], +): typ_origin = get_typ_origin(typ) if typ_origin is not Union: return diff --git a/py_codegen/type_extractor/middlewares/typeddict_found.py b/py_codegen/type_extractor/middlewares/typeddict_found.py index ba4a0c5..301e5a0 100644 --- a/py_codegen/type_extractor/middlewares/typeddict_found.py +++ b/py_codegen/type_extractor/middlewares/typeddict_found.py @@ -1,10 +1,16 @@ from mypy_extensions import _TypedDictMeta # type: ignore +from typing import Set from py_codegen.type_extractor.__base__ import BaseTypeExtractor +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption from py_codegen.type_extractor.nodes.TypedDictFound import TypedDictFound -def typeddict_found_middleware(typ, type_extractor: BaseTypeExtractor): +def typeddict_found_middleware( + typ, + type_extractor: BaseTypeExtractor, + options: Set[BaseOption], +): if not isinstance(typ, _TypedDictMeta): return annotations = { diff --git a/py_codegen/type_extractor/nodes/BaseNodeType.py b/py_codegen/type_extractor/nodes/BaseNodeType.py index 05ff813..3f6f865 100644 --- a/py_codegen/type_extractor/nodes/BaseNodeType.py +++ b/py_codegen/type_extractor/nodes/BaseNodeType.py @@ -1,9 +1,14 @@ -from typing import Union +from dataclasses import dataclass, field +from typing import Union, Set -class BaseNodeType: +class BaseOption: pass +class BaseNodeType: + options: Set[BaseOption] + + NodeType = Union[BaseNodeType, type] diff --git a/py_codegen/type_extractor/nodes/ClassFound.py b/py_codegen/type_extractor/nodes/ClassFound.py index cadca8c..f6d4a7b 100644 --- a/py_codegen/type_extractor/nodes/ClassFound.py +++ b/py_codegen/type_extractor/nodes/ClassFound.py @@ -4,9 +4,9 @@ Dict, Any, Callable, -) + Set) -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption @dataclass @@ -18,6 +18,7 @@ class ClassFound(BaseNodeType): # type: ignore doc: str = field(default='') class_raw: Optional[type] = None INTERNAL_fields_extra: Optional[Dict[str, Any]] = None + options: Set[BaseOption] = field(default_factory=set) def set_fields_extra(namespace: str): diff --git a/py_codegen/type_extractor/nodes/DictFound.py b/py_codegen/type_extractor/nodes/DictFound.py index b03d0e6..a28bd50 100644 --- a/py_codegen/type_extractor/nodes/DictFound.py +++ b/py_codegen/type_extractor/nodes/DictFound.py @@ -1,10 +1,13 @@ -from dataclasses import dataclass +from dataclasses import dataclass, field +from typing import Set -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption @dataclass -class DictFound(BaseNodeType): # type: ignore +class DictFound(BaseNodeType): key: NodeType value: NodeType + + options: Set[BaseOption] = field(default_factory=set) diff --git a/py_codegen/type_extractor/nodes/FunctionFound.py b/py_codegen/type_extractor/nodes/FunctionFound.py index 3d488e7..56fbf89 100644 --- a/py_codegen/type_extractor/nodes/FunctionFound.py +++ b/py_codegen/type_extractor/nodes/FunctionFound.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field -from typing import Callable, Any, Optional, Dict +from typing import Callable, Any, Optional, Dict, Set -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption @dataclass @@ -15,6 +15,7 @@ class FunctionFound(BaseNodeType): filePath: str = '' INTERNAL_params_extra: Optional[Dict[str, Dict[str, Any]]] = None INTERNAL_return_extra: Optional[Dict[str, Any]] = None + options: Set[BaseOption] = field(default_factory=set) def set_params_extra(namespace: str): diff --git a/py_codegen/type_extractor/nodes/ListFound.py b/py_codegen/type_extractor/nodes/ListFound.py index e174142..9dbaeef 100644 --- a/py_codegen/type_extractor/nodes/ListFound.py +++ b/py_codegen/type_extractor/nodes/ListFound.py @@ -1,10 +1,13 @@ -from dataclasses import dataclass +from dataclasses import dataclass, field +from typing import Set -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption @dataclass class ListFound(BaseNodeType): # type: ignore typ: NodeType + options: Set[BaseOption] = field(default_factory=set) + diff --git a/py_codegen/type_extractor/nodes/LiteralFound.py b/py_codegen/type_extractor/nodes/LiteralFound.py index 8a37380..b666e17 100644 --- a/py_codegen/type_extractor/nodes/LiteralFound.py +++ b/py_codegen/type_extractor/nodes/LiteralFound.py @@ -1,9 +1,10 @@ -from dataclasses import dataclass -from typing import Any +from dataclasses import dataclass, field +from typing import Any, Set -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType +from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, BaseOption @dataclass class LiteralFound(BaseNodeType): # type: ignore value: Any + options: Set[BaseOption] = field(default_factory=set) diff --git a/py_codegen/type_extractor/nodes/MappingFound.py b/py_codegen/type_extractor/nodes/MappingFound.py index 7118889..31b51e2 100644 --- a/py_codegen/type_extractor/nodes/MappingFound.py +++ b/py_codegen/type_extractor/nodes/MappingFound.py @@ -1,8 +1,12 @@ -from dataclasses import dataclass -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from dataclasses import dataclass, field +from typing import Set + +from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption @dataclass class MappingFound(BaseNodeType): # type: ignore key: NodeType value: NodeType + + options: Set[BaseOption] = field(default_factory=set) diff --git a/py_codegen/type_extractor/nodes/NoneNode.py b/py_codegen/type_extractor/nodes/NoneNode.py index d0c1f05..35beca4 100644 --- a/py_codegen/type_extractor/nodes/NoneNode.py +++ b/py_codegen/type_extractor/nodes/NoneNode.py @@ -1,5 +1,7 @@ +from typing import Set + from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from .BaseNodeType import BaseNodeType +from .BaseNodeType import BaseNodeType, BaseOption class NoneNode(BaseNodeType): # type: ignore @@ -9,7 +11,11 @@ class NoneNode(BaseNodeType): # type: ignore none_node = NoneNode() -def none_node_middleware(typ, type_extractor: BaseTypeExtractor): +def none_node_middleware( + typ, + type_extractor: BaseTypeExtractor, + options: Set[BaseOption], +): if typ is type(None): return none_node diff --git a/py_codegen/type_extractor/nodes/TypeOR.py b/py_codegen/type_extractor/nodes/TypeOR.py index 569d5ad..bf5b9a6 100644 --- a/py_codegen/type_extractor/nodes/TypeOR.py +++ b/py_codegen/type_extractor/nodes/TypeOR.py @@ -1,9 +1,12 @@ -from dataclasses import dataclass +from dataclasses import dataclass, field +from typing import Set -from .BaseNodeType import BaseNodeType, NodeType +from .BaseNodeType import BaseNodeType, NodeType, BaseOption @dataclass class TypeOR(BaseNodeType): # type: ignore a: NodeType b: NodeType + + options: Set[BaseOption] = field(default_factory=set) diff --git a/py_codegen/type_extractor/nodes/TypedDictFound.py b/py_codegen/type_extractor/nodes/TypedDictFound.py index 9d5f7da..774587b 100644 --- a/py_codegen/type_extractor/nodes/TypedDictFound.py +++ b/py_codegen/type_extractor/nodes/TypedDictFound.py @@ -1,10 +1,10 @@ -from dataclasses import dataclass -from typing import Dict, Optional +from dataclasses import dataclass, field +from typing import Dict, Optional, Set from typing_extensions import _TypedDictMeta # type: ignore # from mypy_extensions import _TypedDictMeta # type: ignore -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption @dataclass @@ -12,4 +12,4 @@ class TypedDictFound(BaseNodeType): # type: ignore annotations: Dict[str, NodeType] name: str = '' raw: Optional[_TypedDictMeta] = None - + options: Set[BaseOption] = field(default_factory=set) diff --git a/py_codegen/type_extractor/type_extractor.py b/py_codegen/type_extractor/type_extractor.py index 32c32e7..e8fb50b 100644 --- a/py_codegen/type_extractor/type_extractor.py +++ b/py_codegen/type_extractor/type_extractor.py @@ -9,7 +9,7 @@ Union, List, Any, -) + Set, Optional) from py_codegen.type_extractor.__base__ import BaseTypeExtractor from py_codegen.type_extractor.middlewares.class_found import class_found_middleware @@ -20,7 +20,7 @@ from py_codegen.type_extractor.middlewares.mapping_found import mapping_found_middleware from py_codegen.type_extractor.middlewares.tuple_found import tuple_found_middleware from py_codegen.type_extractor.middlewares.type_or import typeor_middleware -from py_codegen.type_extractor.nodes.BaseNodeType import NodeType, BaseNodeType +from py_codegen.type_extractor.nodes.BaseNodeType import NodeType, BaseNodeType, BaseOption from py_codegen.type_extractor.nodes.NoneNode import none_node_middleware from py_codegen.type_extractor.middlewares.typeddict_found import typeddict_found_middleware from py_codegen.type_extractor.nodes.UnknownFound import unknown_found @@ -30,7 +30,7 @@ def is_builtin(typ): return inspect.getmodule(typ) is builtins -def builtin_middleware(typ, type_extractor: 'TypeExtractor'): +def builtin_middleware(typ, type_extractor: 'TypeExtractor', options: Set[BaseOption]): if is_builtin(typ): return typ @@ -38,7 +38,7 @@ def builtin_middleware(typ, type_extractor: 'TypeExtractor'): class TypeExtractor(BaseTypeExtractor): middlewares: List[ Callable[ - [Any, 'TypeExtractor'], + [Any, 'TypeExtractor', Set[BaseOption]], BaseNodeType, ] ] = [ @@ -80,16 +80,22 @@ def params_to_nodes( ) return processed_params - def rawtype_to_node(self, typ, options=None): + def rawtype_to_node( + self, typ, + options: Optional[Set[BaseOption]] = None, + ): for middleware in self.middlewares: - value = middleware(typ, self) + value = middleware(typ, self, options or set()) if value is not None: return value return unknown_found - def add(self, options=None): + def add( + self, + options: Optional[Set[BaseOption]] = None, + ): def add_decoration(typ): if not is_builtin(typ): - self.rawtype_to_node(typ, options) + self.rawtype_to_node(typ, options or set()) return typ - return add_decoration \ No newline at end of file + return add_decoration From 3460d8f1b879c560b0a42299bd69aef1c781ba31 Mon Sep 17 00:00:00 2001 From: devdoomari Date: Mon, 2 Mar 2020 11:43:16 +0900 Subject: [PATCH 03/34] add class inheritance --- py_codegen/test_fixtures/class_with_methods.py | 0 .../test_fixtures/classes_with_inheritance.py | 10 ++++++++++ .../__tests__/test_classes_with_inheritance.py | 15 +++++++++++++++ .../type_extractor/middlewares/class_found.py | 6 ++++++ py_codegen/type_extractor/nodes/ClassFound.py | 3 ++- 5 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 py_codegen/test_fixtures/class_with_methods.py create mode 100644 py_codegen/test_fixtures/classes_with_inheritance.py create mode 100644 py_codegen/type_extractor/__tests__/test_classes_with_inheritance.py diff --git a/py_codegen/test_fixtures/class_with_methods.py b/py_codegen/test_fixtures/class_with_methods.py new file mode 100644 index 0000000..e69de29 diff --git a/py_codegen/test_fixtures/classes_with_inheritance.py b/py_codegen/test_fixtures/classes_with_inheritance.py new file mode 100644 index 0000000..d502156 --- /dev/null +++ b/py_codegen/test_fixtures/classes_with_inheritance.py @@ -0,0 +1,10 @@ +class ParentClassA: + from_parent_a: int + + +class ParentClassB: + from_parent_b: str + + +class ChildClass(ParentClassA, ParentClassB): + b: str diff --git a/py_codegen/type_extractor/__tests__/test_classes_with_inheritance.py b/py_codegen/type_extractor/__tests__/test_classes_with_inheritance.py new file mode 100644 index 0000000..0965988 --- /dev/null +++ b/py_codegen/type_extractor/__tests__/test_classes_with_inheritance.py @@ -0,0 +1,15 @@ +from py_codegen.test_fixtures.classes_with_inheritance import ChildClass + +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption +from py_codegen.type_extractor.nodes.ClassFound import ClassFound +from py_codegen.type_extractor.nodes.TypeOR import TypeOR +from py_codegen.type_extractor.__tests__.utils import traverse, cleanup +from py_codegen.type_extractor.type_extractor import TypeExtractor + + +def test_classes_with_inheritance(): + type_collector = TypeExtractor() + + type_collector.add(None)(ChildClass) + + print(type_collector) \ No newline at end of file diff --git a/py_codegen/type_extractor/middlewares/class_found.py b/py_codegen/type_extractor/middlewares/class_found.py index 2718ee8..df48222 100644 --- a/py_codegen/type_extractor/middlewares/class_found.py +++ b/py_codegen/type_extractor/middlewares/class_found.py @@ -30,6 +30,11 @@ def class_found_middleware( return duplicate _data_class = dataclass(_class) + base_classes = [ + type_extractor.rawtype_to_node(base_cls) + for base_cls in list(_class.__bases__) + if base_cls is not object and base_cls is not tuple + ] argspec = inspect.getfullargspec(_data_class) module = inspect.getmodule(_class) filename = module and module.__file__ @@ -38,6 +43,7 @@ def class_found_middleware( name=_class.__name__, class_raw=_class, filePath=filename, + base_classes=base_classes, raw_fields=argspec.annotations, fields=fields, doc=_class.__doc__, diff --git a/py_codegen/type_extractor/nodes/ClassFound.py b/py_codegen/type_extractor/nodes/ClassFound.py index f6d4a7b..388886a 100644 --- a/py_codegen/type_extractor/nodes/ClassFound.py +++ b/py_codegen/type_extractor/nodes/ClassFound.py @@ -4,7 +4,7 @@ Dict, Any, Callable, - Set) + Set, List) from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption @@ -16,6 +16,7 @@ class ClassFound(BaseNodeType): # type: ignore filePath: str = field(default='') raw_fields: Dict[str, Any] = field(default_factory=dict) doc: str = field(default='') + base_classes: List['ClassFound'] = field(default_factory=list) class_raw: Optional[type] = None INTERNAL_fields_extra: Optional[Dict[str, Any]] = None options: Set[BaseOption] = field(default_factory=set) From c63d6539415e40f11b330b1be258dc6050b4d5e2 Mon Sep 17 00:00:00 2001 From: devdoomari Date: Mon, 2 Mar 2020 12:02:11 +0900 Subject: [PATCH 04/34] (fix class inheritance tests) --- .../test_classes_with_inheritance.py | 39 ++++++++++++++++--- py_codegen/type_extractor/__tests__/utils.py | 4 ++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/py_codegen/type_extractor/__tests__/test_classes_with_inheritance.py b/py_codegen/type_extractor/__tests__/test_classes_with_inheritance.py index 0965988..0c14832 100644 --- a/py_codegen/type_extractor/__tests__/test_classes_with_inheritance.py +++ b/py_codegen/type_extractor/__tests__/test_classes_with_inheritance.py @@ -1,15 +1,44 @@ from py_codegen.test_fixtures.classes_with_inheritance import ChildClass -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.nodes.TypeOR import TypeOR from py_codegen.type_extractor.__tests__.utils import traverse, cleanup from py_codegen.type_extractor.type_extractor import TypeExtractor def test_classes_with_inheritance(): - type_collector = TypeExtractor() + type_extractor = TypeExtractor() - type_collector.add(None)(ChildClass) + type_extractor.add(None)(ChildClass) - print(type_collector) \ No newline at end of file + classes = { + key: traverse(value, cleanup) + for (key, value) in type_extractor.collected_types.items() + if isinstance(value, ClassFound) + } + parent_class_a = ClassFound( + name='ParentClassA', + fields={ + 'from_parent_a': int, + }, + ) + parent_class_b = ClassFound( + name='ParentClassB', + fields={ + 'from_parent_b': str, + }, + ) + assert classes == { + 'ParentClassA': parent_class_a, + 'ParentClassB': parent_class_b, + 'ChildClass': ClassFound( + name='ChildClass', + fields={ + 'b': str, + }, + base_classes=[ + parent_class_a, + parent_class_b, + ], + ) + } + print(type_extractor) \ No newline at end of file diff --git a/py_codegen/type_extractor/__tests__/utils.py b/py_codegen/type_extractor/__tests__/utils.py index da6f03e..cd10721 100644 --- a/py_codegen/type_extractor/__tests__/utils.py +++ b/py_codegen/type_extractor/__tests__/utils.py @@ -22,6 +22,10 @@ def traverse(node: NodeType, func: traverse_func_type): key: traverse(value, func) for (key, value) in node.fields.items() } + class_found_node.base_classes = [ + traverse(base_class, func) + for base_class in node.base_classes + ] return func(class_found_node) if isinstance(node, FunctionFound): function_found_node = copy(node) From a132cf3ca217785dd01a5971a6f9368878cfdb0b Mon Sep 17 00:00:00 2001 From: devdoomari Date: Mon, 9 Mar 2020 14:58:54 +0900 Subject: [PATCH 05/34] add pydantic model-class and data-class test --- mypy.ini | 2 + py_codegen/test_fixtures/pydantic_classes.py | 25 +++++++++++ .../__tests__/test_pydantic_classes.py | 41 +++++++++++++++++++ requirements_dev.txt | 3 +- 4 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 mypy.ini create mode 100644 py_codegen/test_fixtures/pydantic_classes.py create mode 100644 py_codegen/type_extractor/__tests__/test_pydantic_classes.py diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 0000000..895701c --- /dev/null +++ b/mypy.ini @@ -0,0 +1,2 @@ +[mypy] +plugins = pydantic.mypy \ No newline at end of file diff --git a/py_codegen/test_fixtures/pydantic_classes.py b/py_codegen/test_fixtures/pydantic_classes.py new file mode 100644 index 0000000..3ba8ed9 --- /dev/null +++ b/py_codegen/test_fixtures/pydantic_classes.py @@ -0,0 +1,25 @@ +from pydantic.dataclasses import dataclass +from pydantic import BaseModel + + +@dataclass +class SomePydanticDataClass: + a: int + b: str + + +class SomePydanticModelClass(BaseModel): + c: int + something: float + + +if __name__ == '__main__': + some_data_class = SomePydanticDataClass( + a=1, + b='a', + ) + some_model_class = SomePydanticModelClass( + c=1, + something=0.3, + ) + diff --git a/py_codegen/type_extractor/__tests__/test_pydantic_classes.py b/py_codegen/type_extractor/__tests__/test_pydantic_classes.py new file mode 100644 index 0000000..8697261 --- /dev/null +++ b/py_codegen/type_extractor/__tests__/test_pydantic_classes.py @@ -0,0 +1,41 @@ +from pydantic import BaseModel + +from py_codegen.type_extractor.nodes.ClassFound import ClassFound +from py_codegen.type_extractor.__tests__.utils import traverse, cleanup +from py_codegen.type_extractor.nodes.DictFound import DictFound +from py_codegen.type_extractor.type_extractor import TypeExtractor +from py_codegen.test_fixtures.pydantic_classes import ( + SomePydanticDataClass, + SomePydanticModelClass, +) + + +def test_various_classes(): + type_extractor = TypeExtractor() + type_extractor.add(None)(SomePydanticModelClass) + type_extractor.add(None)(SomePydanticDataClass) + + print(type_extractor) + classes = { + key: traverse(value, cleanup) + for (key, value) in type_extractor.collected_types.items() + if isinstance(value, ClassFound) + } + assert classes == { + 'BaseModel': classes['BaseModel'], + 'SomePydanticDataClass': ClassFound( + name='SomePydanticDataClass', + fields={ + 'a': int, + 'b': str, + }, + ), + 'SomePydanticModelClass': ClassFound( + name='SomePydanticModelClass', + fields={ + 'c': int, + 'something': float, + }, + base_classes=[classes['BaseModel']], + ), + } diff --git a/requirements_dev.txt b/requirements_dev.txt index 55b033e..1cc0826 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -1 +1,2 @@ -pytest \ No newline at end of file +pytest +pydantic \ No newline at end of file From b8b723cd8168c1bf22ac3ac5c16647ec0faa3b5f Mon Sep 17 00:00:00 2001 From: devdoomari Date: Mon, 13 Apr 2020 03:34:55 +0900 Subject: [PATCH 06/34] update deps 2020-04-13 --- py_codegen/plugins/typescript/package.json | 20 +- py_codegen/plugins/typescript/yarn.lock | 3146 +++++++++----------- requirements.txt | 6 +- 3 files changed, 1487 insertions(+), 1685 deletions(-) diff --git a/py_codegen/plugins/typescript/package.json b/py_codegen/plugins/typescript/package.json index 1ffbe75..e8c5e3d 100644 --- a/py_codegen/plugins/typescript/package.json +++ b/py_codegen/plugins/typescript/package.json @@ -5,17 +5,17 @@ "main": "index.js", "license": "MIT", "devDependencies": { - "@types/fs-extra": "^8.0.1", - "@types/jest": "^24.0.25", + "@types/fs-extra": "^8.1.0", + "@types/jest": "^25.2.1", "@types/lodash": "^4.14.149", - "@types/node": "^13.1.4", - "@types/prettier": "^1.19.0", - "fs-extra": "^8.1.0", - "jest": "^24.9.0", - "prettier": "^1.19.1", - "ts-jest": "^24.2.0", - "tslint": "^5.20.1", - "typescript": "^3.7.4" + "@types/node": "^13.11.1", + "@types/prettier": "^2.0.0", + "fs-extra": "^9.0.0", + "jest": "^25.3.0", + "prettier": "^2.0.4", + "ts-jest": "^25.3.1", + "tslint": "^6.1.1", + "typescript": "^3.8.3" }, "scripts": { "test": "jest", diff --git a/py_codegen/plugins/typescript/yarn.lock b/py_codegen/plugins/typescript/yarn.lock index 6e0f3da..1db9d72 100644 --- a/py_codegen/plugins/typescript/yarn.lock +++ b/py_codegen/plugins/typescript/yarn.lock @@ -2,294 +2,451 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/core@^7.1.0": - version "7.7.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9" - integrity sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.7" - "@babel/helpers" "^7.7.4" - "@babel/parser" "^7.7.7" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/core@^7.1.0", "@babel/core@^7.7.5": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" convert-source-map "^1.7.0" debug "^4.1.0" - json5 "^2.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.0", "@babel/generator@^7.7.4", "@babel/generator@^7.7.7": - version "7.7.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.7.tgz#859ac733c44c74148e1a72980a64ec84b85f4f45" - integrity sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ== +"@babel/generator@^7.9.0", "@babel/generator@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9" + integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ== dependencies: - "@babel/types" "^7.7.4" + "@babel/types" "^7.9.5" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.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== +"@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== 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.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.9.5" -"@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== +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== dependencies: - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== + dependencies: + "@babel/types" "^7.8.3" -"@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== +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== dependencies: - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" -"@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== +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== dependencies: - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.9.0" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + +"@babel/helper-replace-supers@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" + integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== + +"@babel/helpers@^7.9.0": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" + integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + +"@babel/highlight@^7.8.3": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== + dependencies: + "@babel/helper-validator-identifier" "^7.9.0" chalk "^2.0.0" - esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.4", "@babel/parser@^7.7.7": - version "7.7.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" - integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== +"@babel/parser@^7.1.0", "@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" + integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== -"@babel/plugin-syntax-object-rest-spread@^7.0.0": - 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== +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/template@^7.4.0", "@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== +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@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.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" + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7" + integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897" + integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" + integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2" + integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.5" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.5" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@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== +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444" + integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg== dependencies: - esutils "^2.0.2" + "@babel/helper-validator-identifier" "^7.9.5" lodash "^4.17.13" to-fast-properties "^2.0.0" +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + "@cnakazawa/watch@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" - integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== dependencies: exec-sh "^0.3.2" minimist "^1.2.0" -"@jest/console@^24.7.1", "@jest/console@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" - integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== - dependencies: - "@jest/source-map" "^24.9.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/core@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" - integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== - dependencies: - "@jest/console" "^24.7.1" - "@jest/reporters" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" + integrity sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" + integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + +"@jest/console@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.3.0.tgz#33b56b81238427bf3ebe3f7b3378d2f79cdbd409" + integrity sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ== + dependencies: + "@jest/source-map" "^25.2.6" + chalk "^3.0.0" + jest-util "^25.3.0" + slash "^3.0.0" + +"@jest/core@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.3.0.tgz#80f97a7a8b59dde741a24f30871cc26d0197d426" + integrity sha512-+D5a/tFf6pA/Gqft2DLBp/yeSRgXhlJ+Wpst0X/ZkfTRP54qDR3C61VfHwaex+GzZBiTcE9vQeoZ2v5T10+Mqw== + dependencies: + "@jest/console" "^25.3.0" + "@jest/reporters" "^25.3.0" + "@jest/test-result" "^25.3.0" + "@jest/transform" "^25.3.0" + "@jest/types" "^25.3.0" + ansi-escapes "^4.2.1" + chalk "^3.0.0" exit "^0.1.2" - graceful-fs "^4.1.15" - jest-changed-files "^24.9.0" - jest-config "^24.9.0" - jest-haste-map "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-resolve-dependencies "^24.9.0" - jest-runner "^24.9.0" - jest-runtime "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - jest-watcher "^24.9.0" - micromatch "^3.1.10" - p-each-series "^1.0.0" - realpath-native "^1.1.0" - rimraf "^2.5.4" - slash "^2.0.0" - strip-ansi "^5.0.0" - -"@jest/environment@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" - integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== - dependencies: - "@jest/fake-timers" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - -"@jest/fake-timers@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" - integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== - dependencies: - "@jest/types" "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - -"@jest/reporters@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" - integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" + graceful-fs "^4.2.3" + jest-changed-files "^25.3.0" + jest-config "^25.3.0" + jest-haste-map "^25.3.0" + jest-message-util "^25.3.0" + jest-regex-util "^25.2.6" + jest-resolve "^25.3.0" + jest-resolve-dependencies "^25.3.0" + jest-runner "^25.3.0" + jest-runtime "^25.3.0" + jest-snapshot "^25.3.0" + jest-util "^25.3.0" + jest-validate "^25.3.0" + jest-watcher "^25.3.0" + micromatch "^4.0.2" + p-each-series "^2.1.0" + realpath-native "^2.0.0" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.3.0.tgz#587f28ddb4b0dfe97404d3d4a4c9dbfa0245fb2e" + integrity sha512-vgooqwJTHLLak4fE+TaCGeYP7Tz1Y3CKOsNxR1sE0V3nx3KRUHn3NUnt+wbcfd5yQWKZQKAfW6wqbuwQLrXo3g== + dependencies: + "@jest/fake-timers" "^25.3.0" + "@jest/types" "^25.3.0" + jest-mock "^25.3.0" + +"@jest/fake-timers@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.3.0.tgz#995aad36d5c8984165ca5db12e740ab8dbf7042a" + integrity sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ== + dependencies: + "@jest/types" "^25.3.0" + jest-message-util "^25.3.0" + jest-mock "^25.3.0" + jest-util "^25.3.0" + lolex "^5.0.0" + +"@jest/reporters@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.3.0.tgz#7f39f0e6911561cc5112a1b54656de18faee269b" + integrity sha512-1u0ZBygs0C9DhdYgLCrRfZfNKQa+9+J7Uo+Z9z0RWLHzgsxhoG32lrmMOtUw48yR6bLNELdvzormwUqSk4H4Vg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^25.3.0" + "@jest/test-result" "^25.3.0" + "@jest/transform" "^25.3.0" + "@jest/types" "^25.3.0" + chalk "^3.0.0" + collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.2" - istanbul-lib-coverage "^2.0.2" - istanbul-lib-instrument "^3.0.1" - istanbul-lib-report "^2.0.4" - istanbul-lib-source-maps "^3.0.1" - istanbul-reports "^2.2.6" - jest-haste-map "^24.9.0" - jest-resolve "^24.9.0" - jest-runtime "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.6.0" - node-notifier "^5.4.2" - slash "^2.0.0" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + jest-haste-map "^25.3.0" + jest-resolve "^25.3.0" + jest-util "^25.3.0" + jest-worker "^25.2.6" + slash "^3.0.0" source-map "^0.6.0" - string-length "^2.0.0" + string-length "^3.1.0" + terminal-link "^2.0.0" + v8-to-istanbul "^4.0.1" + optionalDependencies: + node-notifier "^6.0.0" -"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" - integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== +"@jest/source-map@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.2.6.tgz#0ef2209514c6d445ebccea1438c55647f22abb4c" + integrity sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ== dependencies: callsites "^3.0.0" - graceful-fs "^4.1.15" + graceful-fs "^4.2.3" source-map "^0.6.0" -"@jest/test-result@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" - integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== +"@jest/test-result@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.3.0.tgz#137fab5e5c6fed36e5d40735d1eb029325e3bf06" + integrity sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw== dependencies: - "@jest/console" "^24.9.0" - "@jest/types" "^24.9.0" + "@jest/console" "^25.3.0" + "@jest/types" "^25.3.0" "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" - integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== +"@jest/test-sequencer@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.3.0.tgz#271ad5f2b8f8137d092ccedc87e16a50f8676209" + integrity sha512-Xvns3xbji7JCvVcDGvqJ/pf4IpmohPODumoPEZJ0/VgC5gI4XaNVIBET2Dq5Czu6Gk3xFcmhtthh/MBOTljdNg== dependencies: - "@jest/test-result" "^24.9.0" - jest-haste-map "^24.9.0" - jest-runner "^24.9.0" - jest-runtime "^24.9.0" + "@jest/test-result" "^25.3.0" + jest-haste-map "^25.3.0" + jest-runner "^25.3.0" + jest-runtime "^25.3.0" -"@jest/transform@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" - integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== +"@jest/transform@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.3.0.tgz#083c5447d5307d9b9494d6968115b647460e71f1" + integrity sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^24.9.0" - babel-plugin-istanbul "^5.1.0" - chalk "^2.0.1" + "@jest/types" "^25.3.0" + babel-plugin-istanbul "^6.0.0" + chalk "^3.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.1.15" - jest-haste-map "^24.9.0" - jest-regex-util "^24.9.0" - jest-util "^24.9.0" - micromatch "^3.1.10" + graceful-fs "^4.2.3" + jest-haste-map "^25.3.0" + jest-regex-util "^25.2.6" + jest-util "^25.3.0" + micromatch "^4.0.2" pirates "^4.0.1" - realpath-native "^1.1.0" - slash "^2.0.0" + realpath-native "^2.0.0" + slash "^3.0.0" source-map "^0.6.1" - write-file-atomic "2.4.1" + write-file-atomic "^3.0.0" -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== +"@jest/types@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.3.0.tgz#88f94b277a1d028fd7117bc1f74451e0fc2131e7" + integrity sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + +"@sinonjs/commons@^1.7.0": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2" + integrity sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw== + dependencies: + type-detect "4.0.8" -"@types/babel__core@^7.1.0": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" - integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== +"@types/babel__core@^7.1.7": + version "7.1.7" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" + integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -313,28 +470,33 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.8" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.8.tgz#479a4ee3e291a403a1096106013ec22cf9b64012" - integrity sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw== + version "7.0.10" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.10.tgz#d9a99f017317d9b3d1abc2ced45d3bca68df0daf" + integrity sha512-74fNdUGrWsgIB/V9kTO5FGHPWYY6Eqn+3Z7L6Hc4e/BxjYV7puvBqp5HwsVYYfLm6iURYBNCx4Ut37OF9yitCw== dependencies: "@babel/types" "^7.3.0" -"@types/fs-extra@^8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.0.1.tgz#a2378d6e7e8afea1564e44aafa2e207dadf77686" - integrity sha512-J00cVDALmi/hJOYsunyT52Hva5TnJeKP5yd1r+mH/ZU0mbYZflR0Z5kw5kITtKTRYMhm1JMClOFYdHnQszEvqw== +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/fs-extra@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.0.tgz#1114834b53c3914806cd03b3304b37b3bd221a4d" + integrity sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg== dependencies: "@types/node" "*" -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== "@types/istanbul-lib-report@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" - integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: "@types/istanbul-lib-coverage" "*" @@ -346,12 +508,13 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/jest@^24.0.25": - version "24.0.25" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.25.tgz#2aba377824ce040114aa906ad2cac2c85351360f" - integrity sha512-hnP1WpjN4KbGEK4dLayul6lgtys6FPz0UfxMeMQCv0M+sTnzN3ConfiO72jHgLxl119guHgI8gLqDOrRLsyp2g== +"@types/jest@^25.2.1": + version "25.2.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.1.tgz#9544cd438607955381c1bdbdb97767a249297db5" + integrity sha512-msra1bCaAeEdkSyA0CZ6gW1ukMIvZ5YoJkdXw/qhQdsuuDlFTcEUrUw8CLCPt2rVRUfXlClVvK2gvPs9IokZaA== dependencies: - jest-diff "^24.3.0" + jest-diff "^25.2.1" + pretty-format "^25.2.1" "@types/lodash@^4.14.149": version "4.14.149" @@ -365,15 +528,20 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@^13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.4.tgz#4cfd90175a200ee9b02bd6b1cd19bc349741607e" - integrity sha512-Lue/mlp2egZJoHXZr4LndxDAd7i/7SQYhV0EjWfb/a4/OZ6tuVwMCVPiwkU5nsEipxEf7hmkSU7Em5VQ8P5NGA== +"@types/node@*", "@types/node@^13.11.1": + version "13.11.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.1.tgz#49a2a83df9d26daacead30d0ccc8762b128d53c7" + integrity sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g== "@types/prettier@^1.19.0": - version "1.19.0" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.0.tgz#a2502fb7ce9b6626fdbfc2e2a496f472de1bdd05" - integrity sha512-gDE8JJEygpay7IjA/u3JiIURvwZW08f0cZSZLAzFoX/ZmeqvS0Sqv+97aKuHpNsalAMMhwPe+iAS6fQbfmbt7A== + version "1.19.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" + integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== + +"@types/prettier@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.0.tgz#dc85454b953178cc6043df5208b9e949b54a3bc4" + integrity sha512-/rM+sWiuOZ5dvuVzV37sUuklsbg+JPOP8d+nNFlo2ZtfpzPiPvh1/gc8liWOLBqe+sR+ZM7guPaIcTt6UZTo7Q== "@types/stack-utils@^1.0.1": version "1.0.1" @@ -381,14 +549,14 @@ integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== "@types/yargs-parser@*": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" - integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" + integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== -"@types/yargs@^13.0.0": - version "13.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.4.tgz#53d231cebe1a540e7e13727fc1f0d13ad4a9ba3b" - integrity sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A== +"@types/yargs@^15.0.0": + version "15.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.4.tgz#7e5d0f8ca25e9d5849f2ea443cf7c402decd8299" + integrity sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg== dependencies: "@types/yargs-parser" "*" @@ -397,12 +565,7 @@ abab@^2.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -acorn-globals@^4.1.0: +acorn-globals@^4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== @@ -415,53 +578,58 @@ acorn-walk@^6.0.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" 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== - acorn@^6.0.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" - integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +acorn@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== ajv@^6.5.5: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== dependencies: - fast-deep-equal "^2.0.1" + fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -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-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" -ansi-regex@^4.0.0, ansi-regex@^4.1.0: +ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +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.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -475,18 +643,13 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== +anymatch@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" + normalize-path "^3.0.0" + picomatch "^2.0.4" argparse@^1.0.7: version "1.0.10" @@ -542,16 +705,16 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -563,47 +726,64 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" - integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== - -babel-jest@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" - integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== - dependencies: - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/babel__core" "^7.1.0" - babel-plugin-istanbul "^5.1.0" - babel-preset-jest "^24.9.0" - chalk "^2.4.2" - slash "^2.0.0" - -babel-plugin-istanbul@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" - integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +babel-jest@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.3.0.tgz#999d0c19e8427f66b796bf9ea233eedf087b957c" + integrity sha512-qiXeX1Cmw4JZ5yQ4H57WpkO0MZ61Qj+YnsVUwAMnDV5ls+yHon11XjarDdgP7H8lTmiEi6biiZA8y3Tmvx6pCg== + dependencies: + "@jest/transform" "^25.3.0" + "@jest/types" "^25.3.0" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^25.3.0" + chalk "^3.0.0" + slash "^3.0.0" + +babel-plugin-istanbul@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" + integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - find-up "^3.0.0" - istanbul-lib-instrument "^3.3.0" - test-exclude "^5.2.3" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^4.0.0" + test-exclude "^6.0.0" -babel-plugin-jest-hoist@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" - integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== +babel-plugin-jest-hoist@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz#2af07632b8ac7aad7d414c1e58425d5fc8e84909" + integrity sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw== dependencies: "@types/babel__traverse" "^7.0.6" -babel-preset-jest@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" - integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== - dependencies: - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^24.9.0" +babel-preset-current-node-syntax@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz#fb4a4c51fe38ca60fede1dc74ab35eb843cb41d6" + integrity sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +babel-preset-jest@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.3.0.tgz#9ab40aee52a19bdc52b8b1ec2403d5914ac3d86b" + integrity sha512-tjdvLKNMwDI9r+QWz9sZUQGTq1dpoxjUqFUpEasAc7MOtHg9XuLT2fx0udFG+k1nvMV0WvHHVAN7VmCZ+1Zxbw== + dependencies: + babel-plugin-jest-hoist "^25.2.6" + babel-preset-current-node-syntax "^0.1.2" balanced-match@^1.0.0: version "1.0.0" @@ -630,13 +810,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -661,10 +834,17 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browser-resolve@^1.11.3: version "1.11.3" @@ -717,11 +897,6 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -739,7 +914,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.3.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -748,10 +923,13 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" ci-info@^2.0.0: version "2.0.0" @@ -768,24 +946,24 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== collection-visit@^1.0.0: version "1.0.0" @@ -802,11 +980,23 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -814,7 +1004,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.12.1, commander@~2.20.3: +commander@^2.12.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -829,12 +1019,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -convert-source-map@^1.4.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.6.0, 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== @@ -846,7 +1031,7 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= @@ -862,17 +1047,31 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": +cross-spawn@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" + integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssom@^0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: version "0.3.8" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssstyle@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" - integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== +cssstyle@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.2.0.tgz#e4c44debccd6b7911ed617a4395e5754bba59992" + integrity sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA== dependencies: - cssom "0.3.x" + cssom "~0.3.6" dashdash@^1.12.0: version "1.14.1" @@ -881,7 +1080,7 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^1.0.0: +data-urls@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== @@ -897,13 +1096,6 @@ debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -921,22 +1113,15 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== define-property@^0.2.5: version "0.2.5" @@ -965,30 +1150,20 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff-sequences@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== +diff-sequences@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" + integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== diff@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" - integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== domexception@^1.0.1: version "1.0.1" @@ -1005,10 +1180,10 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -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.4" @@ -1017,62 +1192,24 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.17.0-next.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" - integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@^1.9.1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.1.tgz#08770602a74ac34c7a90ca9229e7d51e379abc76" - integrity sha512-Q8t2YZ+0e0pc7NRVj3B4tSQ9rim1oi4Fh46k2xhJ2qOiEwhQfdjyEQddWdj7ZFaKmU+5104vn1qrcjEPWq+bgQ== +escodegen@^1.11.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" + integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== dependencies: - esprima "^3.1.3" + esprima "^4.0.1" estraverse "^4.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= - -esprima@^4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -1105,6 +1242,22 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^3.2.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" + integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -1123,17 +1276,17 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" - integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== +expect@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-25.3.0.tgz#5fd36e51befd05afb7184bc954f8a4792d184c71" + integrity sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg== dependencies: - "@jest/types" "^24.9.0" - ansi-styles "^3.2.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.9.0" + "@jest/types" "^25.3.0" + ansi-styles "^4.0.0" + jest-get-type "^25.2.6" + jest-matcher-utils "^25.3.0" + jest-message-util "^25.3.0" + jest-regex-util "^25.2.6" extend-shallow@^2.0.1: version "2.0.1" @@ -1179,10 +1332,10 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -1201,11 +1354,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -1216,12 +1364,20 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: - locate-path "^3.0.0" + locate-path "^5.0.0" + path-exists "^4.0.0" for-in@^1.0.2: version "1.0.2" @@ -1249,53 +1405,30 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== +fs-extra@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" + integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== dependencies: + at-least-node "^1.0.0" graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" + jsonfile "^6.0.1" + universalify "^1.0.0" fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.7: - version "1.2.11" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" - integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" +fsevents@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== get-caller-file@^2.0.1: version "2.0.5" @@ -1309,6 +1442,13 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +get-stream@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -1321,7 +1461,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -1338,7 +1478,7 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== @@ -1348,23 +1488,12 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.1.2: - version "4.5.3" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" - integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.1.0: +har-validator@~5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== @@ -1377,15 +1506,10 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-value@^0.3.1: version "0.3.1" @@ -1418,18 +1542,6 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hosted-git-info@^2.1.4: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== - html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -1437,6 +1549,11 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -1446,27 +1563,25 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@0.4.24, iconv-lite@^0.4.4: +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" imurmurhash@^0.1.4: version "0.1.4" @@ -1481,22 +1596,15 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@~2.0.3: +inherits@2: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= is-accessor-descriptor@^0.1.6: version "0.1.6" @@ -1512,21 +1620,11 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== - is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -1548,11 +1646,6 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -1583,17 +1676,10 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "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" @@ -1607,6 +1693,11 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -1614,26 +1705,17 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== - dependencies: - has "^1.0.3" - is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== -is-typedarray@~1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -1643,12 +1725,12 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +is-wsl@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" + integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== -isarray@1.0.0, isarray@~1.0.0: +isarray@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -1675,406 +1757,403 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" - integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== -istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" - integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== - dependencies: - "@babel/generator" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - istanbul-lib-coverage "^2.0.5" - semver "^6.0.0" +istanbul-lib-instrument@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz#61f13ac2c96cfefb076fe7131156cc05907874e6" + integrity sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg== + dependencies: + "@babel/core" "^7.7.5" + "@babel/parser" "^7.7.5" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" -istanbul-lib-report@^2.0.4: - version "2.0.8" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" - integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - supports-color "^6.1.0" + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" -istanbul-lib-source-maps@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" - integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== dependencies: debug "^4.1.1" - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - rimraf "^2.6.3" + istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" - integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== - dependencies: - handlebars "^4.1.2" - -jest-changed-files@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" - integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== - dependencies: - "@jest/types" "^24.9.0" - execa "^1.0.0" - throat "^4.0.0" - -jest-cli@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" - integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== - dependencies: - "@jest/core" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.3.0.tgz#85d8de6f4bd13dafda9d7f1e3f2565fc0e183c78" + integrity sha512-eqd5hyLbUjIVvLlJ3vQ/MoPxsxfESVXG9gvU19XXjKzxr+dXmZIqCXiY0OiYaibwlHZBJl2Vebkc0ADEMzCXew== + dependencies: + "@jest/types" "^25.3.0" + execa "^3.2.0" + throat "^5.0.0" + +jest-cli@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.3.0.tgz#d9e11f5700cc5946583cf0d01a9bdebceed448d2" + integrity sha512-XpNQPlW1tzpP7RGG8dxpkRegYDuLjzSiENu92+CYM87nEbmEPb3b4+yo8xcsHOnj0AG7DUt9b3uG8LuHI3MDzw== + dependencies: + "@jest/core" "^25.3.0" + "@jest/test-result" "^25.3.0" + "@jest/types" "^25.3.0" + chalk "^3.0.0" exit "^0.1.2" - import-local "^2.0.0" + import-local "^3.0.2" is-ci "^2.0.0" - jest-config "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" + jest-config "^25.3.0" + jest-util "^25.3.0" + jest-validate "^25.3.0" prompts "^2.0.1" - realpath-native "^1.1.0" - yargs "^13.3.0" + realpath-native "^2.0.0" + yargs "^15.3.1" -jest-config@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" - integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== +jest-config@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.3.0.tgz#112b5e2f2e57dec4501dd2fe979044c06fb1317e" + integrity sha512-CmF1JnNWFmoCSPC4tnU52wnVBpuxHjilA40qH/03IHxIevkjUInSMwaDeE6ACfxMPTLidBGBCO3EbxvzPbo8wA== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^24.9.0" - "@jest/types" "^24.9.0" - babel-jest "^24.9.0" - chalk "^2.0.1" + "@jest/test-sequencer" "^25.3.0" + "@jest/types" "^25.3.0" + babel-jest "^25.3.0" + chalk "^3.0.0" + deepmerge "^4.2.2" glob "^7.1.1" - jest-environment-jsdom "^24.9.0" - jest-environment-node "^24.9.0" - jest-get-type "^24.9.0" - jest-jasmine2 "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - micromatch "^3.1.10" - pretty-format "^24.9.0" - realpath-native "^1.1.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== - dependencies: - chalk "^2.0.1" - diff-sequences "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-docblock@^24.3.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" - integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== - dependencies: - detect-newline "^2.1.0" - -jest-each@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" - integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== - dependencies: - "@jest/types" "^24.9.0" - chalk "^2.0.1" - jest-get-type "^24.9.0" - jest-util "^24.9.0" - pretty-format "^24.9.0" - -jest-environment-jsdom@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" - integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - jest-util "^24.9.0" - jsdom "^11.5.1" - -jest-environment-node@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" - integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - jest-util "^24.9.0" - -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== - -jest-haste-map@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" - integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== - dependencies: - "@jest/types" "^24.9.0" - anymatch "^2.0.0" + jest-environment-jsdom "^25.3.0" + jest-environment-node "^25.3.0" + jest-get-type "^25.2.6" + jest-jasmine2 "^25.3.0" + jest-regex-util "^25.2.6" + jest-resolve "^25.3.0" + jest-util "^25.3.0" + jest-validate "^25.3.0" + micromatch "^4.0.2" + pretty-format "^25.3.0" + realpath-native "^2.0.0" + +jest-diff@^25.2.1, jest-diff@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.3.0.tgz#0d7d6f5d6171e5dacde9e05be47b3615e147c26f" + integrity sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w== + dependencies: + chalk "^3.0.0" + diff-sequences "^25.2.6" + jest-get-type "^25.2.6" + pretty-format "^25.3.0" + +jest-docblock@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.3.0.tgz#8b777a27e3477cd77a168c05290c471a575623ef" + integrity sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg== + dependencies: + detect-newline "^3.0.0" + +jest-each@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.3.0.tgz#a319eecf1f6076164ab86f99ca166a55b96c0bd4" + integrity sha512-aBfS4VOf/Qs95yUlX6d6WBv0szvOcTkTTyCIaLuQGj4bSHsT+Wd9dDngVHrCe5uytxpN8VM+NAloI6nbPjXfXw== + dependencies: + "@jest/types" "^25.3.0" + chalk "^3.0.0" + jest-get-type "^25.2.6" + jest-util "^25.3.0" + pretty-format "^25.3.0" + +jest-environment-jsdom@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.3.0.tgz#c493ab8c41f28001520c70ef67dd88b88be6af05" + integrity sha512-jdE4bQN+k2QEZ9sWOxsqDJvMzbdFSCN/4tw8X0TQaCqyzKz58PyEf41oIr4WO7ERdp7WaJGBSUKF7imR3UW1lg== + dependencies: + "@jest/environment" "^25.3.0" + "@jest/fake-timers" "^25.3.0" + "@jest/types" "^25.3.0" + jest-mock "^25.3.0" + jest-util "^25.3.0" + jsdom "^15.2.1" + +jest-environment-node@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.3.0.tgz#9845f0e63991e8498448cb0ae804935689533db9" + integrity sha512-XO09S29Nx1NU7TiMPHMoDIkxoGBuKSTbE+sHp0gXbeLDXhIdhysUI25kOqFFSD9AuDgvPvxWCXrvNqiFsOH33g== + dependencies: + "@jest/environment" "^25.3.0" + "@jest/fake-timers" "^25.3.0" + "@jest/types" "^25.3.0" + jest-mock "^25.3.0" + jest-util "^25.3.0" + semver "^6.3.0" + +jest-get-type@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" + integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== + +jest-haste-map@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.3.0.tgz#b7683031c9c9ddc0521d311564108b244b11e4c6" + integrity sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A== + dependencies: + "@jest/types" "^25.3.0" + anymatch "^3.0.3" fb-watchman "^2.0.0" - graceful-fs "^4.1.15" - invariant "^2.2.4" - jest-serializer "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.9.0" - micromatch "^3.1.10" + graceful-fs "^4.2.3" + jest-serializer "^25.2.6" + jest-util "^25.3.0" + jest-worker "^25.2.6" + micromatch "^4.0.2" sane "^4.0.3" walker "^1.0.7" + which "^2.0.2" optionalDependencies: - fsevents "^1.2.7" + fsevents "^2.1.2" -jest-jasmine2@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" - integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== +jest-jasmine2@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.3.0.tgz#16ae4f68adef65fb45001b26c864bcbcbf972830" + integrity sha512-NCYOGE6+HNzYFSui52SefgpsnIzvxjn6KAgqw66BdRp37xpMD/4kujDHLNW5bS5i53os5TcMn6jYrzQRO8VPrQ== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" + "@jest/environment" "^25.3.0" + "@jest/source-map" "^25.2.6" + "@jest/test-result" "^25.3.0" + "@jest/types" "^25.3.0" + chalk "^3.0.0" co "^4.6.0" - expect "^24.9.0" + expect "^25.3.0" is-generator-fn "^2.0.0" - jest-each "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-runtime "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - pretty-format "^24.9.0" - throat "^4.0.0" - -jest-leak-detector@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" - integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== - dependencies: - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-matcher-utils@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" - integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== - dependencies: - chalk "^2.0.1" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-message-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" - integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + jest-each "^25.3.0" + jest-matcher-utils "^25.3.0" + jest-message-util "^25.3.0" + jest-runtime "^25.3.0" + jest-snapshot "^25.3.0" + jest-util "^25.3.0" + pretty-format "^25.3.0" + throat "^5.0.0" + +jest-leak-detector@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.3.0.tgz#5b6bf04903b35be56038915a55f47291771f769f" + integrity sha512-jk7k24dMIfk8LUSQQGN8PyOy9+J0NAfHZWiDmUDYVMctY8FLJQ1eQ8+PjMoN8PgwhLIggUqgYJnyRFvUz3jLRw== + dependencies: + jest-get-type "^25.2.6" + pretty-format "^25.3.0" + +jest-matcher-utils@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.3.0.tgz#76765788a26edaa8bc5f0100aea52ae383559648" + integrity sha512-ZBUJ2fchNIZt+fyzkuCFBb8SKaU//Rln45augfUtbHaGyVxCO++ANARdBK9oPGXU3hEDgyy7UHnOP/qNOJXFUg== + dependencies: + chalk "^3.0.0" + jest-diff "^25.3.0" + jest-get-type "^25.2.6" + pretty-format "^25.3.0" + +jest-message-util@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.3.0.tgz#e3836826fe5ca538a337b87d9bd2648190867f85" + integrity sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw== dependencies: "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" + "@jest/types" "^25.3.0" "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" + chalk "^3.0.0" + micromatch "^4.0.2" + slash "^3.0.0" stack-utils "^1.0.1" -jest-mock@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" - integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== +jest-mock@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.3.0.tgz#d72644509e40987a732a9a2534a1054f4649402c" + integrity sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ== dependencies: - "@jest/types" "^24.9.0" + "@jest/types" "^25.3.0" jest-pnp-resolver@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== -jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" - integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== +jest-regex-util@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" + integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== -jest-resolve-dependencies@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" - integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== +jest-resolve-dependencies@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.3.0.tgz#b0e4ae053dd44ddacc18c6ee12b5b7c28e445a90" + integrity sha512-bDUlLYmHW+f7J7KgcY2lkq8EMRqKonRl0XoD4Wp5SJkgAxKJnsaIOlrrVNTfXYf+YOu3VCjm/Ac2hPF2nfsCIA== dependencies: - "@jest/types" "^24.9.0" - jest-regex-util "^24.3.0" - jest-snapshot "^24.9.0" + "@jest/types" "^25.3.0" + jest-regex-util "^25.2.6" + jest-snapshot "^25.3.0" -jest-resolve@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" - integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== +jest-resolve@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.3.0.tgz#cb90a5bbea54a02eccdbbf4126a819595dcf91d6" + integrity sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ== dependencies: - "@jest/types" "^24.9.0" + "@jest/types" "^25.3.0" browser-resolve "^1.11.3" - chalk "^2.0.1" + chalk "^3.0.0" jest-pnp-resolver "^1.2.1" - realpath-native "^1.1.0" - -jest-runner@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" - integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.4.2" + realpath-native "^2.0.0" + resolve "^1.15.1" + +jest-runner@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.3.0.tgz#673ef2ac79d2810eb6b2c1a3f82398375a3d1174" + integrity sha512-csDqSC9qGHYWDrzrElzEgFbteztFeZJmKhSgY5jlCIcN0+PhActzRNku0DA1Xa1HxGOb0/AfbP1EGJlP4fGPtA== + dependencies: + "@jest/console" "^25.3.0" + "@jest/environment" "^25.3.0" + "@jest/test-result" "^25.3.0" + "@jest/types" "^25.3.0" + chalk "^3.0.0" exit "^0.1.2" - graceful-fs "^4.1.15" - jest-config "^24.9.0" - jest-docblock "^24.3.0" - jest-haste-map "^24.9.0" - jest-jasmine2 "^24.9.0" - jest-leak-detector "^24.9.0" - jest-message-util "^24.9.0" - jest-resolve "^24.9.0" - jest-runtime "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.6.0" + graceful-fs "^4.2.3" + jest-config "^25.3.0" + jest-docblock "^25.3.0" + jest-haste-map "^25.3.0" + jest-jasmine2 "^25.3.0" + jest-leak-detector "^25.3.0" + jest-message-util "^25.3.0" + jest-resolve "^25.3.0" + jest-runtime "^25.3.0" + jest-util "^25.3.0" + jest-worker "^25.2.6" source-map-support "^0.5.6" - throat "^4.0.0" - -jest-runtime@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" - integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.9.0" - "@jest/source-map" "^24.3.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/yargs" "^13.0.0" - chalk "^2.0.1" + throat "^5.0.0" + +jest-runtime@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.3.0.tgz#af4d40dbcc590fa5de9910cb6a120a13d131050b" + integrity sha512-gn5KYB1wxXRM3nfw8fVpthFu60vxQUCr+ShGq41+ZBFF3DRHZRKj3HDWVAVB4iTNBj2y04QeAo5cZ/boYaPg0w== + dependencies: + "@jest/console" "^25.3.0" + "@jest/environment" "^25.3.0" + "@jest/source-map" "^25.2.6" + "@jest/test-result" "^25.3.0" + "@jest/transform" "^25.3.0" + "@jest/types" "^25.3.0" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.3" - graceful-fs "^4.1.15" - jest-config "^24.9.0" - jest-haste-map "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - realpath-native "^1.1.0" - slash "^2.0.0" - strip-bom "^3.0.0" - yargs "^13.3.0" - -jest-serializer@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" - integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== - -jest-snapshot@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" - integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== + graceful-fs "^4.2.3" + jest-config "^25.3.0" + jest-haste-map "^25.3.0" + jest-message-util "^25.3.0" + jest-mock "^25.3.0" + jest-regex-util "^25.2.6" + jest-resolve "^25.3.0" + jest-snapshot "^25.3.0" + jest-util "^25.3.0" + jest-validate "^25.3.0" + realpath-native "^2.0.0" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^15.3.1" + +jest-serializer@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.2.6.tgz#3bb4cc14fe0d8358489dbbefbb8a4e708ce039b7" + integrity sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ== + +jest-snapshot@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.3.0.tgz#d4feb457494f4aaedcc83fbbf1ca21808fc3df71" + integrity sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg== dependencies: "@babel/types" "^7.0.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - expect "^24.9.0" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-resolve "^24.9.0" - mkdirp "^0.5.1" + "@jest/types" "^25.3.0" + "@types/prettier" "^1.19.0" + chalk "^3.0.0" + expect "^25.3.0" + jest-diff "^25.3.0" + jest-get-type "^25.2.6" + jest-matcher-utils "^25.3.0" + jest-message-util "^25.3.0" + jest-resolve "^25.3.0" + make-dir "^3.0.0" natural-compare "^1.4.0" - pretty-format "^24.9.0" - semver "^6.2.0" - -jest-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" - integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== - dependencies: - "@jest/console" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/source-map" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - callsites "^3.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.15" + pretty-format "^25.3.0" + semver "^6.3.0" + +jest-util@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.3.0.tgz#e3b0064165818f10d78514696fd25efba82cf049" + integrity sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA== + dependencies: + "@jest/types" "^25.3.0" + chalk "^3.0.0" is-ci "^2.0.0" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" + make-dir "^3.0.0" -jest-validate@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" - integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== +jest-validate@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.3.0.tgz#eb95fdee0039647bcd5d4be641b21e4a142a880c" + integrity sha512-3WuXgIZ4HXUvW6gk9twFFkT9j6zUorKnF2oEY8VEsHb7x5LGvVlN3WUsbqazVKuyXwvikO2zFJ/YTySMsMje2w== dependencies: - "@jest/types" "^24.9.0" + "@jest/types" "^25.3.0" camelcase "^5.3.1" - chalk "^2.0.1" - jest-get-type "^24.9.0" + chalk "^3.0.0" + jest-get-type "^25.2.6" leven "^3.1.0" - pretty-format "^24.9.0" - -jest-watcher@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" - integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== - dependencies: - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/yargs" "^13.0.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - jest-util "^24.9.0" - string-length "^2.0.0" - -jest-worker@^24.6.0, jest-worker@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + pretty-format "^25.3.0" + +jest-watcher@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.3.0.tgz#fd03fd5ca52f02bd3161ab177466bf1bfdd34e5c" + integrity sha512-dtFkfidFCS9Ucv8azOg2hkiY3sgJEHeTLtGFHS+jfBEE7eRtrO6+2r1BokyDkaG2FOD7485r/SgpC1MFAENfeA== + dependencies: + "@jest/test-result" "^25.3.0" + "@jest/types" "^25.3.0" + ansi-escapes "^4.2.1" + chalk "^3.0.0" + jest-util "^25.3.0" + string-length "^3.1.0" + +jest-worker@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.6.tgz#d1292625326794ce187c38f51109faced3846c58" + integrity sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA== dependencies: merge-stream "^2.0.0" - supports-color "^6.1.0" + supports-color "^7.0.0" -jest@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" - integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== +jest@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-25.3.0.tgz#7a5e59741d94b8662664c77a9f346246d6bf228b" + integrity sha512-iKd5ShQSHzFT5IL/6h5RZJhApgqXSoPxhp5HEi94v6OAw9QkF8T7X+liEU2eEHJ1eMFYTHmeWLrpBWulsDpaUg== dependencies: - import-local "^2.0.0" - jest-cli "^24.9.0" + "@jest/core" "^25.3.0" + import-local "^3.0.2" + jest-cli "^25.3.0" -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -2092,36 +2171,36 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^11.5.1: - version "11.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== +jsdom@^15.2.1: + version "15.2.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" + integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== dependencies: abab "^2.0.0" - acorn "^5.5.3" - acorn-globals "^4.1.0" + acorn "^7.1.0" + acorn-globals "^4.3.2" array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle "^1.0.0" - data-urls "^1.0.0" + cssom "^0.4.1" + cssstyle "^2.0.0" + data-urls "^1.1.0" domexception "^1.0.1" - escodegen "^1.9.1" + escodegen "^1.11.1" html-encoding-sniffer "^1.0.2" - left-pad "^1.3.0" - nwsapi "^2.0.7" - parse5 "4.0.0" + nwsapi "^2.2.0" + parse5 "5.1.0" pn "^1.1.0" - request "^2.87.0" - request-promise-native "^1.0.5" - sax "^1.2.4" + request "^2.88.0" + request-promise-native "^1.0.7" + saxes "^3.1.9" symbol-tree "^3.2.2" - tough-cookie "^2.3.4" + tough-cookie "^3.0.1" w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.1.2" webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^5.2.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^7.0.0" xml-name-validator "^3.0.0" jsesc@^2.5.1: @@ -2129,11 +2208,6 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -2149,17 +2223,19 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@2.x, json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== +json5@2.x, json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== dependencies: - minimist "^1.2.0" + minimist "^1.2.5" -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= +jsonfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" + integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + dependencies: + universalify "^1.0.0" optionalDependencies: graceful-fs "^4.1.6" @@ -2193,20 +2269,15 @@ kind-of@^5.0.0: integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -left-pad@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -2220,23 +2291,12 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -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" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" + p-locate "^4.1.0" lodash.memoize@4.x: version "4.1.2" @@ -2253,25 +2313,24 @@ lodash@^4.17.13, lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== +lolex@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" + integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== dependencies: - js-tokens "^3.0.0 || ^4.0.0" + "@sinonjs/commons" "^1.7.0" -make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== +make-dir@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" + integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== dependencies: - pify "^4.0.1" - semver "^5.6.0" + semver "^6.0.0" make-error@1.x: - version "1.3.5" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" - integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== makeerror@1.0.x: version "1.0.11" @@ -2297,7 +2356,15 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@4.x, micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -2328,6 +2395,11 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "1.43.0" +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" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -2335,35 +2407,10 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.1.1, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== mixin-deep@^1.2.0: version "1.3.2" @@ -2373,12 +2420,17 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= +mkdirp@1.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^0.5.3: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: - minimist "0.0.8" + minimist "^1.2.5" ms@2.0.0: version "2.0.0" @@ -2399,11 +2451,6 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -2426,20 +2473,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -neo-async@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -2455,50 +2488,16 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= -node-notifier@^5.4.2: - version "5.4.3" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" - integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== +node-notifier@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-6.0.0.tgz#cea319e06baa16deec8ce5cd7f133c4a46b68e12" + integrity sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw== dependencies: growly "^1.3.0" - is-wsl "^1.1.0" - semver "^5.5.0" + is-wsl "^2.1.1" + semver "^6.3.0" shellwords "^0.1.1" - which "^1.3.0" - -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" + which "^1.3.1" normalize-path@^2.1.1: version "2.1.1" @@ -2507,25 +2506,10 @@ normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.7" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.7.tgz#9e954365a06b80b18111ea900945af4f88ed4848" - integrity sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-run-path@^2.0.0: version "2.0.2" @@ -2534,22 +2518,14 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + path-key "^3.0.0" -nwsapi@^2.0.7: +nwsapi@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== @@ -2559,7 +2535,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -2573,16 +2549,6 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -2590,24 +2556,6 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -2622,13 +2570,12 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= +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: - minimist "~0.0.1" - wordwrap "~0.0.2" + mimic-fn "^2.1.0" optionator@^0.8.1: version "0.8.3" @@ -2642,82 +2589,54 @@ optionator@^0.8.1: 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" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-each-series@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" - integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= - dependencies: - p-reduce "^1.0.0" +p-each-series@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" + integrity sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ== p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-limit@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: - p-limit "^2.0.0" - -p-reduce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + p-limit "^2.2.0" p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" @@ -2729,32 +2648,25 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +picomatch@^2.0.4, picomatch@^2.0.5: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== pirates@^4.0.1: version "4.0.1" @@ -2763,12 +2675,12 @@ pirates@^4.0.1: dependencies: node-modules-regexp "^1.0.0" -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: - find-up "^3.0.0" + find-up "^4.0.0" pn@^1.1.0: version "1.1.0" @@ -2785,38 +2697,33 @@ 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.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.4.tgz#2d1bae173e355996ee355ec9830a7a1ee05457ef" + integrity sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w== -pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== +pretty-format@^25.2.1, pretty-format@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.3.0.tgz#d0a4f988ff4a6cd350342fdabbb809aeb4d49ad5" + integrity sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA== dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + "@jest/types" "^25.3.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" prompts@^2.0.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.0.tgz#a444e968fa4cc7e86689a74050685ac8006c4cc4" - integrity sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg== + version "2.3.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" + integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== dependencies: kleur "^3.0.3" - sisteransi "^1.0.3" + sisteransi "^1.0.4" -psl@^1.1.24, psl@^1.1.28: - version "1.7.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" - integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== pump@^3.0.0: version "3.0.0" @@ -2826,11 +2733,6 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -2841,57 +2743,15 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-is@^16.8.4: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" - integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== - -read-pkg-up@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" - integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== - dependencies: - find-up "^3.0.0" - read-pkg "^3.0.0" +react-is@^16.12.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -readable-stream@^2.0.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -realpath-native@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" - integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== - dependencies: - util.promisify "^1.0.0" +realpath-native@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" + integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q== regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -2923,7 +2783,7 @@ request-promise-core@1.1.3: dependencies: lodash "^4.17.15" -request-promise-native@^1.0.5: +request-promise-native@^1.0.7: version "1.0.8" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== @@ -2932,10 +2792,10 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.87.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== +request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -2944,7 +2804,7 @@ request@^2.87.0: extend "~3.0.2" forever-agent "~0.6.1" form-data "~2.3.2" - har-validator "~5.1.0" + har-validator "~5.1.3" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" @@ -2954,7 +2814,7 @@ request@^2.87.0: performance-now "^2.1.0" qs "~6.5.2" safe-buffer "^5.1.2" - tough-cookie "~2.4.3" + tough-cookie "~2.5.0" tunnel-agent "^0.6.0" uuid "^3.3.2" @@ -2968,17 +2828,17 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: - resolve-from "^3.0.0" + resolve-from "^5.0.0" -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-url@^0.2.1: version "0.2.1" @@ -2990,10 +2850,10 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x, resolve@^1.10.0, resolve@^1.3.2: - version "1.14.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff" - integrity sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg== +resolve@1.x, resolve@^1.15.1, resolve@^1.3.2: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== dependencies: path-parse "^1.0.6" @@ -3002,10 +2862,10 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" @@ -3019,7 +2879,7 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== -safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -3051,22 +2911,24 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" -semver@^6.0.0, semver@^6.2.0: +semver@6.x, semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -set-blocking@^2.0.0, set-blocking@~2.0.0: +semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -3088,30 +2950,42 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -sisteransi@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" - integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== +sisteransi@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== snapdragon-node@^2.0.1: version "2.1.1" @@ -3177,31 +3051,10 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -3248,98 +3101,51 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= -string-length@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" - integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= - dependencies: - astral-regex "^1.0.0" - strip-ansi "^4.0.0" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.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== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: +string-length@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" + integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== dependencies: - ansi-regex "^2.0.0" + astral-regex "^1.0.0" + strip-ansi "^5.2.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= +string-width@^4.1.0, string-width@^4.2.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: - ansi-regex "^3.0.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= +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@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== supports-color@^5.3.0: version "5.5.0" @@ -3348,40 +3154,42 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== dependencies: - has-flag "^3.0.0" + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" + integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" symbol-tree@^3.2.2: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" -test-exclude@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" - integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: - glob "^7.1.3" + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" minimatch "^3.0.4" - read-pkg-up "^4.0.0" - require-main-filename "^2.0.0" thenify-all@^1.0.0: version "1.6.0" @@ -3397,10 +3205,10 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -throat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== tmpl@1.0.x: version "1.0.4" @@ -3427,6 +3235,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" @@ -3437,7 +3252,7 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -tough-cookie@^2.3.3, tough-cookie@^2.3.4: +tough-cookie@^2.3.3, tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -3445,13 +3260,14 @@ tough-cookie@^2.3.3, tough-cookie@^2.3.4: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== dependencies: - psl "^1.1.24" - punycode "^1.4.1" + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" tr46@^1.0.1: version "1.0.1" @@ -3460,10 +3276,10 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -ts-jest@^24.2.0: - version "24.2.0" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.2.0.tgz#7abca28c2b4b0a1fdd715cd667d65d047ea4e768" - integrity sha512-Yc+HLyldlIC9iIK8xEN7tV960Or56N49MDP7hubCZUeI7EbIOTsas6rXCMB4kQjLACJ7eDOF4xWEO5qumpKsag== +ts-jest@^25.3.1: + version "25.3.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-25.3.1.tgz#58e2ed3506e4e4487c0b9b532846a5cade9656ba" + integrity sha512-O53FtKguoMUByalAJW+NWEv7c4tus5ckmhfa7/V0jBb2z8v5rDSLFC1Ate7wLknYPC1euuhY6eJjQq4FtOZrkg== dependencies: bs-logger "0.x" buffer-from "1.x" @@ -3471,20 +3287,21 @@ ts-jest@^24.2.0: json5 "2.x" lodash.memoize "4.x" make-error "1.x" - mkdirp "0.x" + micromatch "4.x" + mkdirp "1.x" resolve "1.x" - semver "^5.5" - yargs-parser "10.x" + semver "6.x" + yargs-parser "18.x" -tslib@^1.8.0, tslib@^1.8.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== +tslib@^1.10.0, tslib@^1.8.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== -tslint@^5.20.1: - version "5.20.1" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" - integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== +tslint@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.1.tgz#ac03fbd17f85bfefaae348b353b25a88efe10cde" + integrity sha512-kd6AQ/IgPRpLn6g5TozqzPdGNZ0q0jtXW4//hRcj10qLYBaa3mTUU2y2MCG+RXZm8Zx+KZi0eA+YCrMyNlF4UA== dependencies: "@babel/code-frame" "^7.0.0" builtin-modules "^1.1.1" @@ -3494,10 +3311,10 @@ tslint@^5.20.1: glob "^7.1.1" js-yaml "^3.13.1" minimatch "^3.0.4" - mkdirp "^0.5.1" + mkdirp "^0.5.3" resolve "^1.3.2" semver "^5.3.0" - tslib "^1.8.0" + tslib "^1.10.0" tsutils "^2.29.0" tsutils@^2.29.0: @@ -3526,18 +3343,27 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -typescript@^3.7.4: - version "3.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.4.tgz#1743a5ec5fef6a1fa9f3e4708e33c81c73876c19" - integrity sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw== +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== -uglify-js@^3.1.4: - version "3.7.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.3.tgz#f918fce9182f466d5140f24bb0ff35c2d32dcc6a" - integrity sha512-7tINm46/3puUA4hCkKYo4Xdts+JDaVC9ZPRcG8Xw9R4nhO/gZgUM3TENq8IF4Vatk8qCig4MzP/c8G4u2BkVQg== +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: - commander "~2.20.3" - source-map "~0.6.1" + is-typedarray "^1.0.0" + +typescript@^3.8.3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" + integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== union-value@^1.0.0: version "1.0.1" @@ -3549,10 +3375,10 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== unset-value@^1.0.0: version "1.0.0" @@ -3579,31 +3405,19 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util.promisify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - uuid@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" - integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== +v8-to-istanbul@^4.0.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz#22fe35709a64955f49a08a7c7c959f6520ad6f20" + integrity sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng== dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" verror@1.10.0: version "1.10.0" @@ -3615,11 +3429,20 @@ verror@1.10.0: extsprintf "^1.2.0" w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: - browser-process-hrtime "^0.1.2" + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" walker@^1.0.7, walker@~1.0.5: version "1.0.7" @@ -3633,27 +3456,18 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: iconv-lite "0.4.24" -whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: +whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" @@ -3668,102 +3482,90 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9, which@^1.3.0: +which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: - string-width "^1.0.2 || 2" + isexe "^2.0.0" 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" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" - integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: - graceful-fs "^4.1.11" imurmurhash "^0.1.4" + is-typedarray "^1.0.0" signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" -ws@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== - dependencies: - async-limiter "~1.0.0" +ws@^7.0.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" + integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xmlchars@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yallist@^3.0.0, yallist@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yargs-parser@10.x: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== - dependencies: - camelcase "^4.1.0" - -yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== +yargs-parser@18.x, yargs-parser@^18.1.1: + version "18.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" + integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== +yargs@^15.3.1: + version "15.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" + integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== dependencies: - cliui "^5.0.0" - find-up "^3.0.0" + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" get-caller-file "^2.0.1" require-directory "^2.1.1" require-main-filename "^2.0.0" set-blocking "^2.0.0" - string-width "^3.0.0" + string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.1.1" + yargs-parser "^18.1.1" diff --git a/requirements.txt b/requirements.txt index 9ea4101..9410a87 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ setuptools>=43.0.0 -dataclasses==0.6 -extractor==0.5 -typing==3.7.4.1 +dataclasses>=0.6 +extractor>=0.5 +typing>=3.7.4.1 mypy>=0.761 From 726ff349f8e66018eca3dcf6c8c994c7e2f3f874 Mon Sep 17 00:00:00 2001 From: devdoomari Date: Thu, 19 Mar 2020 18:43:52 +0900 Subject: [PATCH 07/34] add generics support --- .../func_with_simple_generics.py | 19 +++++ py_codegen/test_fixtures/generic_classes.py | 34 ++++++++ .../test_class_of_generic_instance.py | 77 +++++++++++++++++++ .../__tests__/test_class_of_generic_origin.py | 40 ++++++++++ py_codegen/type_extractor/__tests__/utils.py | 20 +++++ .../type_extractor/middlewares/TypeVar.py | 20 +++++ .../type_extractor/middlewares/class_found.py | 22 ++++-- .../middlewares/fixed_generic_found.py | 34 ++++++++ py_codegen/type_extractor/nodes/ClassFound.py | 5 +- .../type_extractor/nodes/FixedGenericFound.py | 10 +++ .../type_extractor/nodes/TypeVarFound.py | 11 +++ py_codegen/type_extractor/type_extractor.py | 4 + requirements.txt | 2 +- 13 files changed, 291 insertions(+), 7 deletions(-) create mode 100644 py_codegen/test_fixtures/func_with_simple_generics.py create mode 100644 py_codegen/test_fixtures/generic_classes.py create mode 100644 py_codegen/type_extractor/__tests__/test_class_of_generic_instance.py create mode 100644 py_codegen/type_extractor/__tests__/test_class_of_generic_origin.py create mode 100644 py_codegen/type_extractor/middlewares/TypeVar.py create mode 100644 py_codegen/type_extractor/middlewares/fixed_generic_found.py create mode 100644 py_codegen/type_extractor/nodes/FixedGenericFound.py create mode 100644 py_codegen/type_extractor/nodes/TypeVarFound.py diff --git a/py_codegen/test_fixtures/func_with_simple_generics.py b/py_codegen/test_fixtures/func_with_simple_generics.py new file mode 100644 index 0000000..b8c002a --- /dev/null +++ b/py_codegen/test_fixtures/func_with_simple_generics.py @@ -0,0 +1,19 @@ +from typing import TypeVar, Generic + +SomeTypeVarA = TypeVar('SomeTypeVarA') + +SomeTypeVarB = TypeVar('SomeTypeVarB', int, str) + + +class SomeGenericClass(Generic[SomeTypeVarA, SomeTypeVarB]): + a: SomeTypeVarA + b: SomeTypeVarB + + +def some_func_with_generics(some_generic_instance: SomeGenericClass[float, int]) -> None: + print(some_generic_instance) + pass + + +print(some_func_with_generics) + diff --git a/py_codegen/test_fixtures/generic_classes.py b/py_codegen/test_fixtures/generic_classes.py new file mode 100644 index 0000000..96a3950 --- /dev/null +++ b/py_codegen/test_fixtures/generic_classes.py @@ -0,0 +1,34 @@ +from typing import TypeVar, Generic + +SomeTypeVarA = TypeVar('SomeTypeVarA') + +SomeTypeVarB = TypeVar('SomeTypeVarB', int, str) + + +class SomeGenericClass(Generic[SomeTypeVarA, SomeTypeVarB]): + a: SomeTypeVarA + b: SomeTypeVarB + some_int: int + + +SomeTypeVarC = TypeVar('SomeTypeVarA') + + +class SomeGenericClassWithInst(Generic[SomeTypeVarC]): + c: SomeTypeVarC + + def __init__(self, c: SomeTypeVarC): + self.c = c + + +some_generic_class_inst = SomeGenericClassWithInst[int](3) + + +class SomeClass: + some_property: int + + +def some_func_with_generic_inst( + input: SomeGenericClass[float, SomeClass] +) -> str: + return 'hello' diff --git a/py_codegen/type_extractor/__tests__/test_class_of_generic_instance.py b/py_codegen/type_extractor/__tests__/test_class_of_generic_instance.py new file mode 100644 index 0000000..0e59557 --- /dev/null +++ b/py_codegen/type_extractor/__tests__/test_class_of_generic_instance.py @@ -0,0 +1,77 @@ +from py_codegen.test_fixtures.generic_classes import ( + some_func_with_generic_inst, + SomeTypeVarA, + SomeTypeVarB, +) +from py_codegen.type_extractor.__tests__.utils import traverse, cleanup +from py_codegen.type_extractor.nodes.ClassFound import ClassFound +from py_codegen.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound +from py_codegen.type_extractor.nodes.TypeVarFound import TypeVarFound +from py_codegen.type_extractor.type_extractor import TypeExtractor + + +# noinspection PyPep8Naming +def test_class_of_generic_instance(): + type_extractor = TypeExtractor() + type_extractor.add()(some_func_with_generic_inst) + print(type_extractor) + + collected_types = { + key: traverse(value, cleanup) + for (key, value) in type_extractor.collected_types.items() + } + some_typevar_A = TypeVarFound( + name='SomeTypeVarA', + original=SomeTypeVarA, + ) + some_typevar_B = TypeVarFound( + name='SomeTypeVarB', + original=SomeTypeVarB, + ) + some_generic_class = ClassFound( + name='SomeGenericClass', + fields={ + 'a': some_typevar_A, + 'b': some_typevar_B, + 'some_int': int, + }, + type_vars=[ + some_typevar_A, some_typevar_B, + ], + ) + some_class = ClassFound( + name='SomeClass', + fields={ + 'some_property': int, + } + ) + assert collected_types['SomeGenericClass'] == some_generic_class + + assert collected_types['SomeClass'] == some_class + + assert collected_types['some_func_with_generic_inst'] == FunctionFound( + name='some_func_with_generic_inst', + params={ + 'input': FixedGenericFound( + type_vars=[float, some_class], + origin=some_generic_class, + ) + }, + return_type=str, + ) + # + # assert collected_types == { + # 'SomeGenericClass': some_generic_class, + # 'SomeClass': some_class, + # 'some_func_with_generic_inst': FunctionFound( + # name='some_func_with_generic_inst', + # params={ + # 'input': FixedGenericFound( + # type_vars=[float, some_class], + # origin=some_generic_class, + # ) + # }, + # return_type=str, + # ) + # } \ No newline at end of file diff --git a/py_codegen/type_extractor/__tests__/test_class_of_generic_origin.py b/py_codegen/type_extractor/__tests__/test_class_of_generic_origin.py new file mode 100644 index 0000000..b0c23d9 --- /dev/null +++ b/py_codegen/type_extractor/__tests__/test_class_of_generic_origin.py @@ -0,0 +1,40 @@ +from py_codegen.test_fixtures.generic_classes import ( + SomeGenericClass, + SomeTypeVarA, + SomeTypeVarB, +) +from py_codegen.type_extractor.__tests__.utils import traverse, cleanup +from py_codegen.type_extractor.nodes.ClassFound import ClassFound +from py_codegen.type_extractor.nodes.TypeVarFound import TypeVarFound +from py_codegen.type_extractor.type_extractor import TypeExtractor + + +def test_class_of_generic_origin(): + type_extractor = TypeExtractor() + type_extractor.add()(SomeGenericClass) + classes = { + key: traverse(value, cleanup) + for (key, value) in type_extractor.collected_types.items() + if isinstance(value, ClassFound) + } + typevar_A = TypeVarFound( + name='SomeTypeVarA', + original=SomeTypeVarA, + ) + typevar_B = TypeVarFound( + name='SomeTypeVarB', + original=SomeTypeVarB, + ) + assert classes == { + 'SomeGenericClass': ClassFound( + name='SomeGenericClass', + fields={ + 'a': typevar_A, + 'b': typevar_B, + 'some_int': int, + }, + type_vars=[ + typevar_A, typevar_B, + ] + ) + } diff --git a/py_codegen/type_extractor/__tests__/utils.py b/py_codegen/type_extractor/__tests__/utils.py index cd10721..cd02b4d 100644 --- a/py_codegen/type_extractor/__tests__/utils.py +++ b/py_codegen/type_extractor/__tests__/utils.py @@ -3,6 +3,8 @@ from typing import Callable from py_codegen.type_extractor.nodes.BaseNodeType import NodeType +from py_codegen.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_codegen.type_extractor.nodes.TypeVarFound import TypeVarFound from py_codegen.type_extractor.nodes.TypedDictFound import TypedDictFound from py_codegen.type_extractor.nodes.ClassFound import ClassFound from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound @@ -47,6 +49,24 @@ def traverse(node: NodeType, func: traverse_func_type): typeor_node.a = traverse(node.a, func) typeor_node.b = traverse(node.b, func) return func(typeor_node) + + if isinstance(node, FixedGenericFound): + fixed_generic_node = copy(node) + fixed_generic_node.origin = traverse( + node.origin, func + ) + fixed_generic_node.type_vars = [ + traverse(node_type_vars, func) + for node_type_vars in node.type_vars + ] + return func(fixed_generic_node) + + if isinstance(node, TypeVarFound): + typevar_node = copy(node) + typevar_node.original = traverse( + node.original, func + ) + return func(typevar_node) return node diff --git a/py_codegen/type_extractor/middlewares/TypeVar.py b/py_codegen/type_extractor/middlewares/TypeVar.py new file mode 100644 index 0000000..04deff4 --- /dev/null +++ b/py_codegen/type_extractor/middlewares/TypeVar.py @@ -0,0 +1,20 @@ +import typing_inspect +from typing import Set + +from py_codegen.type_extractor.__base__ import BaseTypeExtractor +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption +from py_codegen.type_extractor.nodes.TypeVarFound import TypeVarFound + + +def typevar_found_middleware( + _typevar, + type_extractor: BaseTypeExtractor, + options: Set[BaseOption], +): + if not typing_inspect.is_typevar(_typevar): + return None + # __typevar = cast(TypeVar, _typevar) + return TypeVarFound( + name=_typevar.__name__, + original=_typevar, + ) \ No newline at end of file diff --git a/py_codegen/type_extractor/middlewares/class_found.py b/py_codegen/type_extractor/middlewares/class_found.py index df48222..bbf05f6 100644 --- a/py_codegen/type_extractor/middlewares/class_found.py +++ b/py_codegen/type_extractor/middlewares/class_found.py @@ -1,9 +1,10 @@ import inspect +import typing_inspect from dataclasses import dataclass from mypy_extensions import _TypedDictMeta # type: ignore -from typing import Set +from typing import Set, Dict, cast, List, Generic from py_codegen.type_extractor.__base__ import BaseTypeExtractor from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption @@ -30,15 +31,25 @@ def class_found_middleware( return duplicate _data_class = dataclass(_class) - base_classes = [ + + base_classes = cast(List[ClassFound], [ type_extractor.rawtype_to_node(base_cls) for base_cls in list(_class.__bases__) - if base_cls is not object and base_cls is not tuple - ] + if base_cls is not object and + base_cls is not tuple and + base_cls is not Generic + ]) + argspec = inspect.getfullargspec(_data_class) module = inspect.getmodule(_class) filename = module and module.__file__ - fields = type_extractor.params_to_nodes(argspec.annotations, argspec.args) + annotations: Dict = getattr(_class, '__annotations__', argspec.annotations) + fields = type_extractor.params_to_nodes(annotations, annotations.keys()) + type_vars = [ + type_extractor.rawtype_to_node(_typevar) + for _typevar in + list(typing_inspect.get_parameters(_class)) + ] class_found = ClassFound( name=_class.__name__, class_raw=_class, @@ -48,6 +59,7 @@ def class_found_middleware( fields=fields, doc=_class.__doc__, options=options, + type_vars=type_vars, ) type_extractor.collected_types[class_found.name] = class_found diff --git a/py_codegen/type_extractor/middlewares/fixed_generic_found.py b/py_codegen/type_extractor/middlewares/fixed_generic_found.py new file mode 100644 index 0000000..7019899 --- /dev/null +++ b/py_codegen/type_extractor/middlewares/fixed_generic_found.py @@ -0,0 +1,34 @@ +from typing import Dict, Set +import typing_inspect + +from py_codegen.type_extractor.__base__ import BaseTypeExtractor +from py_codegen.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption + + +def fixed_generic_found_middleware( + typ, + type_extractor: BaseTypeExtractor, + options: Set[BaseOption], +): + # if not typing_inspect.is_generic_type(typ) \ + # or typing_inspect.get_origin(typ) is typ: + # return None + + if not typing_inspect.is_generic_type(typ): + return None + + origin = typing_inspect.get_origin(typ) + + if origin is typ: + return None + + origin_node = type_extractor.rawtype_to_node(origin) + type_vars = [ + type_extractor.rawtype_to_node(raw_type) + for raw_type in typing_inspect.get_args(typ) + ] + return FixedGenericFound( + type_vars=type_vars, + origin=origin_node, + ) \ No newline at end of file diff --git a/py_codegen/type_extractor/nodes/ClassFound.py b/py_codegen/type_extractor/nodes/ClassFound.py index 388886a..8a1278a 100644 --- a/py_codegen/type_extractor/nodes/ClassFound.py +++ b/py_codegen/type_extractor/nodes/ClassFound.py @@ -4,9 +4,11 @@ Dict, Any, Callable, - Set, List) + Set, List, +) from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_codegen.type_extractor.nodes.TypeVarFound import TypeVarFound @dataclass @@ -17,6 +19,7 @@ class ClassFound(BaseNodeType): # type: ignore raw_fields: Dict[str, Any] = field(default_factory=dict) doc: str = field(default='') base_classes: List['ClassFound'] = field(default_factory=list) + type_vars: List[TypeVarFound] = field(default_factory=list) class_raw: Optional[type] = None INTERNAL_fields_extra: Optional[Dict[str, Any]] = None options: Set[BaseOption] = field(default_factory=set) diff --git a/py_codegen/type_extractor/nodes/FixedGenericFound.py b/py_codegen/type_extractor/nodes/FixedGenericFound.py new file mode 100644 index 0000000..6c3c0b1 --- /dev/null +++ b/py_codegen/type_extractor/nodes/FixedGenericFound.py @@ -0,0 +1,10 @@ +from dataclasses import dataclass +from typing import List + +from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType + + +@dataclass +class FixedGenericFound(BaseNodeType): + type_vars: List[NodeType] + origin: NodeType \ No newline at end of file diff --git a/py_codegen/type_extractor/nodes/TypeVarFound.py b/py_codegen/type_extractor/nodes/TypeVarFound.py new file mode 100644 index 0000000..d076049 --- /dev/null +++ b/py_codegen/type_extractor/nodes/TypeVarFound.py @@ -0,0 +1,11 @@ +from dataclasses import dataclass +from typing import Set, Dict, List, Optional, TypeVar, Any +# +from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption + + +@dataclass +class TypeVarFound(BaseNodeType): + name: str + original: TypeVar + type_limits: Optional[List[NodeType]] = None diff --git a/py_codegen/type_extractor/type_extractor.py b/py_codegen/type_extractor/type_extractor.py index e8fb50b..69b522f 100644 --- a/py_codegen/type_extractor/type_extractor.py +++ b/py_codegen/type_extractor/type_extractor.py @@ -14,6 +14,7 @@ from py_codegen.type_extractor.__base__ import BaseTypeExtractor from py_codegen.type_extractor.middlewares.class_found import class_found_middleware from py_codegen.type_extractor.middlewares.dict_found import dict_found_middleware +from py_codegen.type_extractor.middlewares.fixed_generic_found import fixed_generic_found_middleware from py_codegen.type_extractor.middlewares.function_found import func_found_middleware from py_codegen.type_extractor.middlewares.list_found import list_found_middleware from py_codegen.type_extractor.middlewares.literal_found import literal_found_middleware @@ -23,6 +24,7 @@ from py_codegen.type_extractor.nodes.BaseNodeType import NodeType, BaseNodeType, BaseOption from py_codegen.type_extractor.nodes.NoneNode import none_node_middleware from py_codegen.type_extractor.middlewares.typeddict_found import typeddict_found_middleware +from py_codegen.type_extractor.middlewares.TypeVar import typevar_found_middleware from py_codegen.type_extractor.nodes.UnknownFound import unknown_found @@ -49,6 +51,8 @@ class TypeExtractor(BaseTypeExtractor): dict_found_middleware, tuple_found_middleware, mapping_found_middleware, + typevar_found_middleware, + fixed_generic_found_middleware, class_found_middleware, func_found_middleware, none_node_middleware, diff --git a/requirements.txt b/requirements.txt index 9410a87..9c99b66 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,5 +2,5 @@ setuptools>=43.0.0 dataclasses>=0.6 extractor>=0.5 typing>=3.7.4.1 +typing_inspect>=0.5.0 mypy>=0.761 - From 6f555f3d193c77b70b7ee7487e33c86251bf3a17 Mon Sep 17 00:00:00 2001 From: devdoomari Date: Sun, 10 May 2020 17:40:08 +0900 Subject: [PATCH 08/34] add newtype support --- py_codegen/test_fixtures/new_type.py | 17 +++++++ .../type_extractor/__tests__/test_newtype.py | 46 +++++++++++++++++++ py_codegen/type_extractor/__tests__/utils.py | 7 +++ .../middlewares/newtype_found.py | 28 +++++++++++ py_codegen/type_extractor/nodes/NewType.py | 10 ++++ py_codegen/type_extractor/type_extractor.py | 2 + 6 files changed, 110 insertions(+) create mode 100644 py_codegen/test_fixtures/new_type.py create mode 100644 py_codegen/type_extractor/__tests__/test_newtype.py create mode 100644 py_codegen/type_extractor/middlewares/newtype_found.py create mode 100644 py_codegen/type_extractor/nodes/NewType.py diff --git a/py_codegen/test_fixtures/new_type.py b/py_codegen/test_fixtures/new_type.py new file mode 100644 index 0000000..8061459 --- /dev/null +++ b/py_codegen/test_fixtures/new_type.py @@ -0,0 +1,17 @@ +from typing import ( + NewType, +) + + +UserId = NewType('UserId', int) + + +def name_by_id(user_id: UserId) -> str: + return str(user_id) + + +class SomeClass: + a: int + + +SomeClassInNewType = NewType('SomeClassInNewType', SomeClass) \ No newline at end of file diff --git a/py_codegen/type_extractor/__tests__/test_newtype.py b/py_codegen/type_extractor/__tests__/test_newtype.py new file mode 100644 index 0000000..4ad3cbb --- /dev/null +++ b/py_codegen/type_extractor/__tests__/test_newtype.py @@ -0,0 +1,46 @@ +from py_codegen.test_fixtures.new_type import ( + name_by_id, + SomeClassInNewType, +) +from py_codegen.type_extractor.__tests__.utils import traverse, cleanup +from py_codegen.type_extractor.nodes.ClassFound import ClassFound +from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound +from py_codegen.type_extractor.nodes.NewType import NewTypeFound +from py_codegen.type_extractor.nodes.TypeVarFound import TypeVarFound +from py_codegen.type_extractor.type_extractor import TypeExtractor + + +def test_newtype(): + type_extractor = TypeExtractor() + type_extractor.add()(name_by_id) + type_extractor.add()(SomeClassInNewType) + cleaned_up = { + key: traverse(value, cleanup) + for (key, value) in type_extractor.collected_types.items() + } + user_id_newtype = NewTypeFound( + name='UserId', + actual=int, + ) + some_class = ClassFound( + name='SomeClass', + fields={ + 'a': int, + } + ) + assert cleaned_up == { + 'UserId': user_id_newtype, + 'name_by_id': FunctionFound( + name='name_by_id', + params={ + 'user_id': user_id_newtype, + }, + return_type=str, + ), + 'SomeClass': some_class, + 'SomeClassInNewType': NewTypeFound( + name='SomeClassInNewType', + actual=some_class, + ), + } + print(1) diff --git a/py_codegen/type_extractor/__tests__/utils.py b/py_codegen/type_extractor/__tests__/utils.py index cd02b4d..c4cb884 100644 --- a/py_codegen/type_extractor/__tests__/utils.py +++ b/py_codegen/type_extractor/__tests__/utils.py @@ -4,6 +4,7 @@ from py_codegen.type_extractor.nodes.BaseNodeType import NodeType from py_codegen.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_codegen.type_extractor.nodes.NewType import NewTypeFound from py_codegen.type_extractor.nodes.TypeVarFound import TypeVarFound from py_codegen.type_extractor.nodes.TypedDictFound import TypedDictFound from py_codegen.type_extractor.nodes.ClassFound import ClassFound @@ -67,6 +68,12 @@ def traverse(node: NodeType, func: traverse_func_type): node.original, func ) return func(typevar_node) + if isinstance(node, NewTypeFound): + newtype_found = copy(node) + newtype_found.actual = traverse( + node.actual, func + ) + return func(newtype_found) return node diff --git a/py_codegen/type_extractor/middlewares/newtype_found.py b/py_codegen/type_extractor/middlewares/newtype_found.py new file mode 100644 index 0000000..7a86cdb --- /dev/null +++ b/py_codegen/type_extractor/middlewares/newtype_found.py @@ -0,0 +1,28 @@ +import inspect + +from typing import Set +from py_codegen.type_extractor.__base__ import BaseTypeExtractor + +from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption +from py_codegen.type_extractor.nodes.NewType import NewTypeFound + + +def newtype_found_middleware( + typ, + type_extractor: BaseTypeExtractor, + options: Set[BaseOption], +): + if not inspect.isfunction(typ): + return None + if typ.__module__ is not 'typing': + return None + if typ.__code__.co_name is not 'new_type': + return None + + newtype_found = NewTypeFound( + name=typ.__name__, + actual=type_extractor.rawtype_to_node(typ.__supertype__), + ) + + type_extractor.collected_types[newtype_found.name] = newtype_found + return newtype_found diff --git a/py_codegen/type_extractor/nodes/NewType.py b/py_codegen/type_extractor/nodes/NewType.py new file mode 100644 index 0000000..b53b471 --- /dev/null +++ b/py_codegen/type_extractor/nodes/NewType.py @@ -0,0 +1,10 @@ +from dataclasses import dataclass +from typing import List + +from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType + + +@dataclass +class NewTypeFound(BaseNodeType): + name: str + actual: NodeType diff --git a/py_codegen/type_extractor/type_extractor.py b/py_codegen/type_extractor/type_extractor.py index 69b522f..345209e 100644 --- a/py_codegen/type_extractor/type_extractor.py +++ b/py_codegen/type_extractor/type_extractor.py @@ -19,6 +19,7 @@ from py_codegen.type_extractor.middlewares.list_found import list_found_middleware from py_codegen.type_extractor.middlewares.literal_found import literal_found_middleware from py_codegen.type_extractor.middlewares.mapping_found import mapping_found_middleware +from py_codegen.type_extractor.middlewares.newtype_found import newtype_found_middleware from py_codegen.type_extractor.middlewares.tuple_found import tuple_found_middleware from py_codegen.type_extractor.middlewares.type_or import typeor_middleware from py_codegen.type_extractor.nodes.BaseNodeType import NodeType, BaseNodeType, BaseOption @@ -54,6 +55,7 @@ class TypeExtractor(BaseTypeExtractor): typevar_found_middleware, fixed_generic_found_middleware, class_found_middleware, + newtype_found_middleware, func_found_middleware, none_node_middleware, builtin_middleware, From d00d7a4ee75d178c32abb9b8335ca65a876493c3 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Thu, 6 Aug 2020 17:05:31 +0900 Subject: [PATCH 09/34] fix newer version of pydantic breaking pydantic testcase --- .../__tests__/test_pydantic_classes.py | 34 +++++++++---------- requirements.txt | 8 ++--- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/py_codegen/type_extractor/__tests__/test_pydantic_classes.py b/py_codegen/type_extractor/__tests__/test_pydantic_classes.py index 8697261..83cd77c 100644 --- a/py_codegen/type_extractor/__tests__/test_pydantic_classes.py +++ b/py_codegen/type_extractor/__tests__/test_pydantic_classes.py @@ -21,21 +21,19 @@ def test_various_classes(): for (key, value) in type_extractor.collected_types.items() if isinstance(value, ClassFound) } - assert classes == { - 'BaseModel': classes['BaseModel'], - 'SomePydanticDataClass': ClassFound( - name='SomePydanticDataClass', - fields={ - 'a': int, - 'b': str, - }, - ), - 'SomePydanticModelClass': ClassFound( - name='SomePydanticModelClass', - fields={ - 'c': int, - 'something': float, - }, - base_classes=[classes['BaseModel']], - ), - } + assert classes['SomePydanticDataClass'] == ClassFound( + name='SomePydanticDataClass', + fields={ + 'a': int, + 'b': str, + }, + ) + + assert classes['SomePydanticModelClass'] == ClassFound( + name='SomePydanticModelClass', + fields={ + 'c': int, + 'something': float, + }, + base_classes=[classes['BaseModel']], + ) diff --git a/requirements.txt b/requirements.txt index 9c99b66..0956d6b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ setuptools>=43.0.0 -dataclasses>=0.6 +dataclasses>=0.7 extractor>=0.5 -typing>=3.7.4.1 -typing_inspect>=0.5.0 -mypy>=0.761 +typing>=3.7.4.3 +typing_inspect>=0.6.0 +mypy>=0.782 From f61185d21ef88ce7eaf6279a3147af0e0a4d52b9 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Fri, 7 Aug 2020 08:46:30 +0900 Subject: [PATCH 10/34] fix tests and update deps (2020-08-06) --- py_codegen/plugins/typescript/Converter.py | 9 +- .../ts_fixtures/func_with_literals.d.ts | 4 +- py_codegen/plugins/typescript/package.json | 26 +- py_codegen/plugins/typescript/yarn.lock | 1592 ++++++++++------- .../test_class_of_generic_instance.py | 34 +- .../middlewares/fixed_generic_found.py | 5 +- requirements.txt | 2 +- 7 files changed, 978 insertions(+), 694 deletions(-) diff --git a/py_codegen/plugins/typescript/Converter.py b/py_codegen/plugins/typescript/Converter.py index 88952f1..cbb799f 100644 --- a/py_codegen/plugins/typescript/Converter.py +++ b/py_codegen/plugins/typescript/Converter.py @@ -35,13 +35,14 @@ def __call__(self, val: Any) -> str: ... def default_literal_converter(val: Any) -> str: if isinstance(val, str): return f"'{val}'" + + if val is True: + return "true" + if val is False: + return "false" if isinstance(val, int) \ or isinstance(val, float): return f"{val}" - if val == True: - return "true" - if val == False: - return "false" if isinstance(val, list): converted = [default_literal_converter(item) for item in val] converted_str = ','.join(converted) diff --git a/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts b/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts index 47d48ac..a439435 100644 --- a/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts +++ b/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts @@ -1,4 +1,4 @@ export function func_with_literals( - input1: 'a' | 1 | 2 | 3 | True | 3, + input1: 'a' | 1 | 2 | 3 | true | 3, input2: 1 | null, -): True | 5 | 3 \ No newline at end of file +): true | 5 | 3 \ No newline at end of file diff --git a/py_codegen/plugins/typescript/package.json b/py_codegen/plugins/typescript/package.json index e8c5e3d..182c3ac 100644 --- a/py_codegen/plugins/typescript/package.json +++ b/py_codegen/plugins/typescript/package.json @@ -5,25 +5,25 @@ "main": "index.js", "license": "MIT", "devDependencies": { - "@types/fs-extra": "^8.1.0", - "@types/jest": "^25.2.1", - "@types/lodash": "^4.14.149", - "@types/node": "^13.11.1", - "@types/prettier": "^2.0.0", - "fs-extra": "^9.0.0", - "jest": "^25.3.0", - "prettier": "^2.0.4", - "ts-jest": "^25.3.1", - "tslint": "^6.1.1", - "typescript": "^3.8.3" + "@types/fs-extra": "^9.0.1", + "@types/jest": "^26.0.9", + "@types/lodash": "^4.14.159", + "@types/node": "^14.0.27", + "@types/prettier": "^2.0.2", + "fs-extra": "^9.0.1", + "jest": "^26.2.2", + "prettier": "^2.0.5", + "ts-jest": "^26.1.4", + "tslint": "^6.1.3", + "typescript": "^3.9.7" }, "scripts": { "test": "jest", "clean": "rm __tests__/ts_generated/*.d.ts" }, "dependencies": { - "@types/mz": "^2.7.0", - "lodash": "^4.17.15", + "@types/mz": "^2.7.1", + "lodash": "^4.17.19", "mz": "^2.7.0" } } diff --git a/py_codegen/plugins/typescript/yarn.lock b/py_codegen/plugins/typescript/yarn.lock index 1db9d72..75dfbb7 100644 --- a/py_codegen/plugins/typescript/yarn.lock +++ b/py_codegen/plugins/typescript/yarn.lock @@ -9,6 +9,13 @@ dependencies: "@babel/highlight" "^7.8.3" +"@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/core@^7.1.0", "@babel/core@^7.7.5": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" @@ -121,6 +128,11 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + "@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": version "7.9.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" @@ -135,6 +147,15 @@ "@babel/traverse" "^7.9.0" "@babel/types" "^7.9.0" +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.8.3": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" @@ -149,6 +170,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== +"@babel/parser@^7.10.4": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.2.tgz#0882ab8a455df3065ea2dcb4c753b2460a24bead" + integrity sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw== + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -219,6 +245,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/template@^7.3.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" @@ -252,6 +287,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.10.4", "@babel/types@^7.3.3": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" + integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -280,148 +324,162 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@jest/console@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.3.0.tgz#33b56b81238427bf3ebe3f7b3378d2f79cdbd409" - integrity sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ== +"@jest/console@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.2.0.tgz#d18f2659b90930e7ec3925fb7209f1ba2cf463f0" + integrity sha512-mXQfx3nSLwiHm1i7jbu+uvi+vvpVjNGzIQYLCfsat9rapC+MJkS4zBseNrgJE0vU921b3P67bQzhduphjY3Tig== dependencies: - "@jest/source-map" "^25.2.6" - chalk "^3.0.0" - jest-util "^25.3.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^26.2.0" + jest-util "^26.2.0" slash "^3.0.0" -"@jest/core@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.3.0.tgz#80f97a7a8b59dde741a24f30871cc26d0197d426" - integrity sha512-+D5a/tFf6pA/Gqft2DLBp/yeSRgXhlJ+Wpst0X/ZkfTRP54qDR3C61VfHwaex+GzZBiTcE9vQeoZ2v5T10+Mqw== +"@jest/core@^26.2.2": + version "26.2.2" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.2.2.tgz#63de01ffce967618003dd7a0164b05c8041b81a9" + integrity sha512-UwA8gNI8aeV4FHGfGAUfO/DHjrFVvlBravF1Tm9Kt6qFE+6YHR47kFhgdepOFpADEKstyO+MVdPvkV6/dyt9sA== dependencies: - "@jest/console" "^25.3.0" - "@jest/reporters" "^25.3.0" - "@jest/test-result" "^25.3.0" - "@jest/transform" "^25.3.0" - "@jest/types" "^25.3.0" + "@jest/console" "^26.2.0" + "@jest/reporters" "^26.2.2" + "@jest/test-result" "^26.2.0" + "@jest/transform" "^26.2.2" + "@jest/types" "^26.2.0" + "@types/node" "*" ansi-escapes "^4.2.1" - chalk "^3.0.0" + chalk "^4.0.0" exit "^0.1.2" - graceful-fs "^4.2.3" - jest-changed-files "^25.3.0" - jest-config "^25.3.0" - jest-haste-map "^25.3.0" - jest-message-util "^25.3.0" - jest-regex-util "^25.2.6" - jest-resolve "^25.3.0" - jest-resolve-dependencies "^25.3.0" - jest-runner "^25.3.0" - jest-runtime "^25.3.0" - jest-snapshot "^25.3.0" - jest-util "^25.3.0" - jest-validate "^25.3.0" - jest-watcher "^25.3.0" + graceful-fs "^4.2.4" + jest-changed-files "^26.2.0" + jest-config "^26.2.2" + jest-haste-map "^26.2.2" + jest-message-util "^26.2.0" + jest-regex-util "^26.0.0" + jest-resolve "^26.2.2" + jest-resolve-dependencies "^26.2.2" + jest-runner "^26.2.2" + jest-runtime "^26.2.2" + jest-snapshot "^26.2.2" + jest-util "^26.2.0" + jest-validate "^26.2.0" + jest-watcher "^26.2.0" micromatch "^4.0.2" p-each-series "^2.1.0" - realpath-native "^2.0.0" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.3.0.tgz#587f28ddb4b0dfe97404d3d4a4c9dbfa0245fb2e" - integrity sha512-vgooqwJTHLLak4fE+TaCGeYP7Tz1Y3CKOsNxR1sE0V3nx3KRUHn3NUnt+wbcfd5yQWKZQKAfW6wqbuwQLrXo3g== +"@jest/environment@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.2.0.tgz#f6faee1630fcc2fad208953164bccb31dbe0e45f" + integrity sha512-oCgp9NmEiJ5rbq9VI/v/yYLDpladAAVvFxZgNsnJxOETuzPZ0ZcKKHYjKYwCtPOP1WCrM5nmyuOhMStXFGHn+g== dependencies: - "@jest/fake-timers" "^25.3.0" - "@jest/types" "^25.3.0" - jest-mock "^25.3.0" + "@jest/fake-timers" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + jest-mock "^26.2.0" -"@jest/fake-timers@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.3.0.tgz#995aad36d5c8984165ca5db12e740ab8dbf7042a" - integrity sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ== +"@jest/fake-timers@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.2.0.tgz#b485c57dc4c74d61406a339807a9af4bac74b75a" + integrity sha512-45Gfe7YzYTKqTayBrEdAF0qYyAsNRBzfkV0IyVUm3cx7AsCWlnjilBM4T40w7IXT5VspOgMPikQlV0M6gHwy/g== dependencies: - "@jest/types" "^25.3.0" - jest-message-util "^25.3.0" - jest-mock "^25.3.0" - jest-util "^25.3.0" - lolex "^5.0.0" + "@jest/types" "^26.2.0" + "@sinonjs/fake-timers" "^6.0.1" + "@types/node" "*" + jest-message-util "^26.2.0" + jest-mock "^26.2.0" + jest-util "^26.2.0" -"@jest/reporters@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.3.0.tgz#7f39f0e6911561cc5112a1b54656de18faee269b" - integrity sha512-1u0ZBygs0C9DhdYgLCrRfZfNKQa+9+J7Uo+Z9z0RWLHzgsxhoG32lrmMOtUw48yR6bLNELdvzormwUqSk4H4Vg== +"@jest/globals@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.2.0.tgz#ad78f1104f250c1a4bf5184a2ba51facc59b23f6" + integrity sha512-Hoc6ScEIPaym7RNytIL2ILSUWIGKlwEv+JNFof9dGYOdvPjb2evEURSslvCMkNuNg1ECEClTE8PH7ULlMJntYA== + dependencies: + "@jest/environment" "^26.2.0" + "@jest/types" "^26.2.0" + expect "^26.2.0" + +"@jest/reporters@^26.2.2": + version "26.2.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.2.2.tgz#5a8632ab410f4fc57782bc05dcf115e91818e869" + integrity sha512-7854GPbdFTAorWVh+RNHyPO9waRIN6TcvCezKVxI1khvFq9YjINTW7J3WU+tbR038Ynn6WjYred6vtT0YmIWVQ== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^25.3.0" - "@jest/test-result" "^25.3.0" - "@jest/transform" "^25.3.0" - "@jest/types" "^25.3.0" - chalk "^3.0.0" + "@jest/console" "^26.2.0" + "@jest/test-result" "^26.2.0" + "@jest/transform" "^26.2.2" + "@jest/types" "^26.2.0" + chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.2" + graceful-fs "^4.2.4" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.0" + istanbul-lib-instrument "^4.0.3" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.0.2" - jest-haste-map "^25.3.0" - jest-resolve "^25.3.0" - jest-util "^25.3.0" - jest-worker "^25.2.6" + jest-haste-map "^26.2.2" + jest-resolve "^26.2.2" + jest-util "^26.2.0" + jest-worker "^26.2.1" slash "^3.0.0" source-map "^0.6.0" - string-length "^3.1.0" + string-length "^4.0.1" terminal-link "^2.0.0" - v8-to-istanbul "^4.0.1" + v8-to-istanbul "^4.1.3" optionalDependencies: - node-notifier "^6.0.0" + node-notifier "^7.0.0" -"@jest/source-map@^25.2.6": - version "25.2.6" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.2.6.tgz#0ef2209514c6d445ebccea1438c55647f22abb4c" - integrity sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ== +"@jest/source-map@^26.1.0": + version "26.1.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.1.0.tgz#a6a020d00e7d9478f4b690167c5e8b77e63adb26" + integrity sha512-XYRPYx4eEVX15cMT9mstnO7hkHP3krNtKfxUYd8L7gbtia8JvZZ6bMzSwa6IQJENbudTwKMw5R1BePRD+bkEmA== dependencies: callsites "^3.0.0" - graceful-fs "^4.2.3" + graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.3.0.tgz#137fab5e5c6fed36e5d40735d1eb029325e3bf06" - integrity sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw== +"@jest/test-result@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.2.0.tgz#51c9b165c8851cfcf7a3466019114785e154f76b" + integrity sha512-kgPlmcVafpmfyQEu36HClK+CWI6wIaAWDHNxfQtGuKsgoa2uQAYdlxjMDBEa3CvI40+2U3v36gQF6oZBkoKatw== dependencies: - "@jest/console" "^25.3.0" - "@jest/types" "^25.3.0" + "@jest/console" "^26.2.0" + "@jest/types" "^26.2.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.3.0.tgz#271ad5f2b8f8137d092ccedc87e16a50f8676209" - integrity sha512-Xvns3xbji7JCvVcDGvqJ/pf4IpmohPODumoPEZJ0/VgC5gI4XaNVIBET2Dq5Czu6Gk3xFcmhtthh/MBOTljdNg== +"@jest/test-sequencer@^26.2.2": + version "26.2.2" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.2.2.tgz#5e8091f2e6c61fdf242af566cb820a4eadc6c4af" + integrity sha512-SliZWon5LNqV/lVXkeowSU6L8++FGOu3f43T01L1Gv6wnFDP00ER0utV9jyK9dVNdXqfMNCN66sfcyar/o7BNw== dependencies: - "@jest/test-result" "^25.3.0" - jest-haste-map "^25.3.0" - jest-runner "^25.3.0" - jest-runtime "^25.3.0" + "@jest/test-result" "^26.2.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.2.2" + jest-runner "^26.2.2" + jest-runtime "^26.2.2" -"@jest/transform@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.3.0.tgz#083c5447d5307d9b9494d6968115b647460e71f1" - integrity sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg== +"@jest/transform@^26.2.2": + version "26.2.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.2.2.tgz#86c005c8d5d749ac54d8df53ea58675fffe7a97e" + integrity sha512-c1snhvi5wRVre1XyoO3Eef5SEWpuBCH/cEbntBUd9tI5sNYiBDmO0My/lc5IuuGYKp/HFIHV1eZpSx5yjdkhKw== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^25.3.0" + "@jest/types" "^26.2.0" babel-plugin-istanbul "^6.0.0" - chalk "^3.0.0" + chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.3" - jest-haste-map "^25.3.0" - jest-regex-util "^25.2.6" - jest-util "^25.3.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.2.2" + jest-regex-util "^26.0.0" + jest-util "^26.2.0" micromatch "^4.0.2" pirates "^4.0.1" - realpath-native "^2.0.0" slash "^3.0.0" source-map "^0.6.1" write-file-atomic "^3.0.0" @@ -436,6 +494,17 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" +"@jest/types@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.2.0.tgz#b28ca1fb517a4eb48c0addea7fcd9edc4ab45721" + integrity sha512-lvm3rJvctxd7+wxKSxxbzpDbr4FXDLaC57WEKdUIZ2cjTYuxYSc0zlyD7Z4Uqr5VdKxRUrtwIkiqBuvgf8uKJA== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + "@sinonjs/commons@^1.7.0": version "1.7.2" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2" @@ -443,6 +512,24 @@ dependencies: type-detect "4.0.8" +"@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@types/babel__core@^7.0.0": + version "7.1.9" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" + integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + "@types/babel__core@^7.1.7": version "7.1.7" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" @@ -481,10 +568,17 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -"@types/fs-extra@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.0.tgz#1114834b53c3914806cd03b3304b37b3bd221a4d" - integrity sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg== +"@types/fs-extra@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.1.tgz#91c8fc4c51f6d5dbe44c2ca9ab09310bd00c7918" + integrity sha512-B42Sxuaz09MhC3DDeW5kubRcQ5by4iuVQ0cRRWM2lggLzAa/KVom0Aft/208NgMvNQQZ86s5rVcqDdn/SH0/mg== + dependencies: + "@types/node" "*" + +"@types/graceful-fs@^4.1.2": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f" + integrity sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ== dependencies: "@types/node" "*" @@ -508,41 +602,51 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/jest@^25.2.1": - version "25.2.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.1.tgz#9544cd438607955381c1bdbdb97767a249297db5" - integrity sha512-msra1bCaAeEdkSyA0CZ6gW1ukMIvZ5YoJkdXw/qhQdsuuDlFTcEUrUw8CLCPt2rVRUfXlClVvK2gvPs9IokZaA== +"@types/jest@^26.0.9": + version "26.0.9" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.9.tgz#0543b57da5f0cd949c5f423a00c56c492289c989" + integrity sha512-k4qFfJ5AUKrWok5KYXp2EPm89b0P/KZpl7Vg4XuOTVVQEhLDBDBU3iBFrjjdgd8fLw96aAtmnwhXHl63bWeBQQ== dependencies: jest-diff "^25.2.1" pretty-format "^25.2.1" -"@types/lodash@^4.14.149": - version "4.14.149" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.149.tgz#1342d63d948c6062838fbf961012f74d4e638440" - integrity sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ== +"@types/lodash@^4.14.159": + version "4.14.159" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.159.tgz#61089719dc6fdd9c5cb46efc827f2571d1517065" + integrity sha512-gF7A72f7WQN33DpqOWw9geApQPh4M3PxluMtaHxWHXEGSN12/WbcEk/eNSqWNQcQhF66VSZ06vCF94CrHwXJDg== -"@types/mz@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@types/mz/-/mz-2.7.0.tgz#3ef27f457c4c3e8b197ca2670ee41d6f4effddf2" - integrity sha512-Q5TZYMKnH0hdV5fNstmMWL2LLw5eRRtTd73KNtsZxoQ2gtCQyET5X79uERUEwGneuxPglg441I7OSY00+9CkSw== +"@types/mz@^2.7.1": + version "2.7.1" + resolved "https://registry.yarnpkg.com/@types/mz/-/mz-2.7.1.tgz#1ac1d69b039c8b3cbe603972b5c12d3167a84f58" + integrity sha512-H86h7KmRDVs9UeSiQvtUeVhS+WYpJSYSsZrRvNYpGWGiytEqxwEtvgRnINESQtCgnojIH2wS2WgaMTJP0firBw== dependencies: "@types/node" "*" -"@types/node@*", "@types/node@^13.11.1": +"@types/node@*": version "13.11.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.1.tgz#49a2a83df9d26daacead30d0ccc8762b128d53c7" integrity sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g== -"@types/prettier@^1.19.0": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" - integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== +"@types/node@^14.0.27": + version "14.0.27" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1" + integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== "@types/prettier@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.0.tgz#dc85454b953178cc6043df5208b9e949b54a3bc4" integrity sha512-/rM+sWiuOZ5dvuVzV37sUuklsbg+JPOP8d+nNFlo2ZtfpzPiPvh1/gc8liWOLBqe+sR+ZM7guPaIcTt6UZTo7Q== +"@types/prettier@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.2.tgz#5bb52ee68d0f8efa9cc0099920e56be6cc4e37f3" + integrity sha512-IkVfat549ggtkZUthUzEX49562eGikhSYeVGX97SkMFn+sTZrgRewXjQ4tPKFPCykZHkX1Zfd9OoELGqKU2jJA== + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -560,33 +664,28 @@ dependencies: "@types/yargs-parser" "*" -abab@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" - integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== +abab@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.4.tgz#6dfa57b417ca06d21b2478f0e638302f99c2405c" + integrity sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ== -acorn-globals@^4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" + acorn "^7.1.1" + acorn-walk "^7.1.1" -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^6.0.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== - -acorn@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" - integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== +acorn@^7.1.1: + version "7.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" + integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== ajv@^6.5.5: version "6.12.0" @@ -605,11 +704,6 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.11.0" -ansi-regex@^4.1.0: - version "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" @@ -673,11 +767,6 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -700,11 +789,6 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -730,17 +814,18 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== -babel-jest@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.3.0.tgz#999d0c19e8427f66b796bf9ea233eedf087b957c" - integrity sha512-qiXeX1Cmw4JZ5yQ4H57WpkO0MZ61Qj+YnsVUwAMnDV5ls+yHon11XjarDdgP7H8lTmiEi6biiZA8y3Tmvx6pCg== +babel-jest@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.2.2.tgz#70f618f2d7016ed71b232241199308985462f812" + integrity sha512-JmLuePHgA+DSOdOL8lPxCgD2LhPPm+rdw1vnxR73PpIrnmKCS2/aBhtkAcxQWuUcW2hBrH8MJ3LKXE7aWpNZyA== dependencies: - "@jest/transform" "^25.3.0" - "@jest/types" "^25.3.0" + "@jest/transform" "^26.2.2" + "@jest/types" "^26.2.0" "@types/babel__core" "^7.1.7" babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^25.3.0" - chalk "^3.0.0" + babel-preset-jest "^26.2.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" slash "^3.0.0" babel-plugin-istanbul@^6.0.0: @@ -754,11 +839,14 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz#2af07632b8ac7aad7d414c1e58425d5fc8e84909" - integrity sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw== +babel-plugin-jest-hoist@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz#bdd0011df0d3d513e5e95f76bd53b51147aca2dd" + integrity sha512-B/hVMRv8Nh1sQ1a3EY8I0n4Y1Wty3NrR5ebOyVT302op+DOAau+xNEImGMsUWOC3++ZlMooCytKz+NgN8aKGbA== dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" babel-preset-current-node-syntax@^0.1.2: @@ -777,12 +865,12 @@ babel-preset-current-node-syntax@^0.1.2: "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -babel-preset-jest@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.3.0.tgz#9ab40aee52a19bdc52b8b1ec2403d5914ac3d86b" - integrity sha512-tjdvLKNMwDI9r+QWz9sZUQGTq1dpoxjUqFUpEasAc7MOtHg9XuLT2fx0udFG+k1nvMV0WvHHVAN7VmCZ+1Zxbw== +babel-preset-jest@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.2.0.tgz#f198201a4e543a43eb40bc481e19736e095fd3e0" + integrity sha512-R1k8kdP3R9phYQugXeNnK/nvCGlBzG4m3EoIIukC80GXb6wCv2XiwPhK6K9MAkQcMszWBYvl2Wm+yigyXFQqXg== dependencies: - babel-plugin-jest-hoist "^25.2.6" + babel-plugin-jest-hoist "^26.2.0" babel-preset-current-node-syntax "^0.1.2" balanced-match@^1.0.0: @@ -846,13 +934,6 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== - dependencies: - resolve "1.1.7" - bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -902,6 +983,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" + integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -931,6 +1017,19 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -1056,7 +1155,7 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" -cssom@^0.4.1: +cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== @@ -1066,10 +1165,10 @@ cssom@~0.3.6: resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssstyle@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.2.0.tgz#e4c44debccd6b7911ed617a4395e5754bba59992" - integrity sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA== +cssstyle@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" @@ -1080,14 +1179,14 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" debug@^2.2.0, debug@^2.3.3: version "2.6.9" @@ -1108,6 +1207,11 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decimal.js@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" + integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -1160,17 +1264,22 @@ diff-sequences@^25.2.6: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== +diff-sequences@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.0.0.tgz#0760059a5c287637b842bd7085311db7060e88a6" + integrity sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== dependencies: - webidl-conversions "^4.0.2" + webidl-conversions "^5.0.0" ecc-jsbn@~0.1.1: version "0.1.2" @@ -1180,6 +1289,11 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +emittery@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.1.tgz#c02375a927a40948c0345cc903072597f5270451" + integrity sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -1192,15 +1306,27 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@^1.11.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" - integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escodegen@^1.14.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== dependencies: esprima "^4.0.1" estraverse "^4.2.0" @@ -1242,10 +1368,10 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^3.2.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" - integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== +execa@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2" + integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A== dependencies: cross-spawn "^7.0.0" get-stream "^5.0.0" @@ -1254,7 +1380,6 @@ execa@^3.2.0: merge-stream "^2.0.0" npm-run-path "^4.0.0" onetime "^5.1.0" - p-finally "^2.0.0" signal-exit "^3.0.2" strip-final-newline "^2.0.0" @@ -1276,17 +1401,17 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-25.3.0.tgz#5fd36e51befd05afb7184bc954f8a4792d184c71" - integrity sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg== +expect@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.2.0.tgz#0140dd9cc7376d7833852e9cda88c05414f1efba" + integrity sha512-8AMBQ9UVcoUXt0B7v+5/U5H6yiUR87L6eKCfjE3spx7Ya5lF+ebUo37MCFBML2OiLfkX1sxmQOZhIDonyVTkcw== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^26.2.0" ansi-styles "^4.0.0" - jest-get-type "^25.2.6" - jest-matcher-utils "^25.3.0" - jest-message-util "^25.3.0" - jest-regex-util "^25.2.6" + jest-get-type "^26.0.0" + jest-matcher-utils "^26.2.0" + jest-message-util "^26.2.0" + jest-regex-util "^26.0.0" extend-shallow@^2.0.1: version "2.0.1" @@ -1405,10 +1530,10 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fs-extra@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" - integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== +fs-extra@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== dependencies: at-least-node "^1.0.0" graceful-fs "^4.2.0" @@ -1478,11 +1603,16 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3: +graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +graceful-fs@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -1542,12 +1672,17 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== dependencies: - whatwg-encoding "^1.0.1" + whatwg-encoding "^1.0.5" html-escaper@^2.0.0: version "2.0.2" @@ -1620,6 +1755,11 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -1664,6 +1804,11 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" +is-docker@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + 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" @@ -1705,6 +1850,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-potential-custom-element-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" + integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -1725,10 +1875,12 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" - integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" isarray@1.0.0: version "1.0.0" @@ -1775,6 +1927,16 @@ istanbul-lib-instrument@^4.0.0: istanbul-lib-coverage "^3.0.0" semver "^6.3.0" +istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" @@ -1801,59 +1963,59 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.3.0.tgz#85d8de6f4bd13dafda9d7f1e3f2565fc0e183c78" - integrity sha512-eqd5hyLbUjIVvLlJ3vQ/MoPxsxfESVXG9gvU19XXjKzxr+dXmZIqCXiY0OiYaibwlHZBJl2Vebkc0ADEMzCXew== +jest-changed-files@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.2.0.tgz#b4946201defe0c919a2f3d601e9f98cb21dacc15" + integrity sha512-+RyJb+F1K/XBLIYiL449vo5D+CvlHv29QveJUWNPXuUicyZcq+tf1wNxmmFeRvAU1+TzhwqczSjxnCCFt7+8iA== dependencies: - "@jest/types" "^25.3.0" - execa "^3.2.0" + "@jest/types" "^26.2.0" + execa "^4.0.0" throat "^5.0.0" -jest-cli@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.3.0.tgz#d9e11f5700cc5946583cf0d01a9bdebceed448d2" - integrity sha512-XpNQPlW1tzpP7RGG8dxpkRegYDuLjzSiENu92+CYM87nEbmEPb3b4+yo8xcsHOnj0AG7DUt9b3uG8LuHI3MDzw== +jest-cli@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.2.2.tgz#4c273e5474baafac1eb15fd25aaafb4703f5ffbc" + integrity sha512-vVcly0n/ijZvdy6gPQiQt0YANwX2hLTPQZHtW7Vi3gcFdKTtif7YpI85F8R8JYy5DFSWz4x1OW0arnxlziu5Lw== dependencies: - "@jest/core" "^25.3.0" - "@jest/test-result" "^25.3.0" - "@jest/types" "^25.3.0" - chalk "^3.0.0" + "@jest/core" "^26.2.2" + "@jest/test-result" "^26.2.0" + "@jest/types" "^26.2.0" + chalk "^4.0.0" exit "^0.1.2" + graceful-fs "^4.2.4" import-local "^3.0.2" is-ci "^2.0.0" - jest-config "^25.3.0" - jest-util "^25.3.0" - jest-validate "^25.3.0" + jest-config "^26.2.2" + jest-util "^26.2.0" + jest-validate "^26.2.0" prompts "^2.0.1" - realpath-native "^2.0.0" yargs "^15.3.1" -jest-config@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.3.0.tgz#112b5e2f2e57dec4501dd2fe979044c06fb1317e" - integrity sha512-CmF1JnNWFmoCSPC4tnU52wnVBpuxHjilA40qH/03IHxIevkjUInSMwaDeE6ACfxMPTLidBGBCO3EbxvzPbo8wA== +jest-config@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.2.2.tgz#f3ebc7e2bc3f49de8ed3f8007152f345bb111917" + integrity sha512-2lhxH0y4YFOijMJ65usuf78m7+9/8+hAb1PZQtdRdgnQpAb4zP6KcVDDktpHEkspBKnc2lmFu+RQdHukUUbiTg== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^25.3.0" - "@jest/types" "^25.3.0" - babel-jest "^25.3.0" - chalk "^3.0.0" + "@jest/test-sequencer" "^26.2.2" + "@jest/types" "^26.2.0" + babel-jest "^26.2.2" + chalk "^4.0.0" deepmerge "^4.2.2" glob "^7.1.1" - jest-environment-jsdom "^25.3.0" - jest-environment-node "^25.3.0" - jest-get-type "^25.2.6" - jest-jasmine2 "^25.3.0" - jest-regex-util "^25.2.6" - jest-resolve "^25.3.0" - jest-util "^25.3.0" - jest-validate "^25.3.0" + graceful-fs "^4.2.4" + jest-environment-jsdom "^26.2.0" + jest-environment-node "^26.2.0" + jest-get-type "^26.0.0" + jest-jasmine2 "^26.2.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.2.2" + jest-util "^26.2.0" + jest-validate "^26.2.0" micromatch "^4.0.2" - pretty-format "^25.3.0" - realpath-native "^2.0.0" + pretty-format "^26.2.0" -jest-diff@^25.2.1, jest-diff@^25.3.0: +jest-diff@^25.2.1: version "25.3.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.3.0.tgz#0d7d6f5d6171e5dacde9e05be47b3615e147c26f" integrity sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w== @@ -1863,295 +2025,328 @@ jest-diff@^25.2.1, jest-diff@^25.3.0: jest-get-type "^25.2.6" pretty-format "^25.3.0" -jest-docblock@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.3.0.tgz#8b777a27e3477cd77a168c05290c471a575623ef" - integrity sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg== - dependencies: - detect-newline "^3.0.0" - -jest-each@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.3.0.tgz#a319eecf1f6076164ab86f99ca166a55b96c0bd4" - integrity sha512-aBfS4VOf/Qs95yUlX6d6WBv0szvOcTkTTyCIaLuQGj4bSHsT+Wd9dDngVHrCe5uytxpN8VM+NAloI6nbPjXfXw== +jest-diff@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.2.0.tgz#dee62c771adbb23ae585f3f1bd289a6e8ef4f298" + integrity sha512-Wu4Aopi2nzCsHWLBlD48TgRy3Z7OsxlwvHNd1YSnHc7q1NJfrmyCPoUXrTIrydQOG5ApaYpsAsdfnMbJqV1/wQ== dependencies: - "@jest/types" "^25.3.0" - chalk "^3.0.0" - jest-get-type "^25.2.6" - jest-util "^25.3.0" - pretty-format "^25.3.0" + chalk "^4.0.0" + diff-sequences "^26.0.0" + jest-get-type "^26.0.0" + pretty-format "^26.2.0" -jest-environment-jsdom@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.3.0.tgz#c493ab8c41f28001520c70ef67dd88b88be6af05" - integrity sha512-jdE4bQN+k2QEZ9sWOxsqDJvMzbdFSCN/4tw8X0TQaCqyzKz58PyEf41oIr4WO7ERdp7WaJGBSUKF7imR3UW1lg== +jest-docblock@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" + integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== dependencies: - "@jest/environment" "^25.3.0" - "@jest/fake-timers" "^25.3.0" - "@jest/types" "^25.3.0" - jest-mock "^25.3.0" - jest-util "^25.3.0" - jsdom "^15.2.1" + detect-newline "^3.0.0" -jest-environment-node@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.3.0.tgz#9845f0e63991e8498448cb0ae804935689533db9" - integrity sha512-XO09S29Nx1NU7TiMPHMoDIkxoGBuKSTbE+sHp0gXbeLDXhIdhysUI25kOqFFSD9AuDgvPvxWCXrvNqiFsOH33g== - dependencies: - "@jest/environment" "^25.3.0" - "@jest/fake-timers" "^25.3.0" - "@jest/types" "^25.3.0" - jest-mock "^25.3.0" - jest-util "^25.3.0" - semver "^6.3.0" +jest-each@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.2.0.tgz#aec8efa01d072d7982c900e74940863385fa884e" + integrity sha512-gHPCaho1twWHB5bpcfnozlc6mrMi+VAewVPNgmwf81x2Gzr6XO4dl+eOrwPWxbkYlgjgrYjWK2xgKnixbzH3Ew== + dependencies: + "@jest/types" "^26.2.0" + chalk "^4.0.0" + jest-get-type "^26.0.0" + jest-util "^26.2.0" + pretty-format "^26.2.0" + +jest-environment-jsdom@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.2.0.tgz#6443a6f3569297dcaa4371dddf93acaf167302dc" + integrity sha512-sDG24+5M4NuIGzkI3rJW8XUlrpkvIdE9Zz4jhD8OBnVxAw+Y1jUk9X+lAOD48nlfUTlnt3lbAI3k2Ox+WF3S0g== + dependencies: + "@jest/environment" "^26.2.0" + "@jest/fake-timers" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + jest-mock "^26.2.0" + jest-util "^26.2.0" + jsdom "^16.2.2" + +jest-environment-node@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.2.0.tgz#fee89e06bdd4bed3f75ee2978d73ede9bb57a681" + integrity sha512-4M5ExTYkJ19efBzkiXtBi74JqKLDciEk4CEsp5tTjWGYMrlKFQFtwIVG3tW1OGE0AlXhZjuHPwubuRYY4j4uOw== + dependencies: + "@jest/environment" "^26.2.0" + "@jest/fake-timers" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + jest-mock "^26.2.0" + jest-util "^26.2.0" jest-get-type@^25.2.6: version "25.2.6" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== -jest-haste-map@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.3.0.tgz#b7683031c9c9ddc0521d311564108b244b11e4c6" - integrity sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A== +jest-get-type@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.0.0.tgz#381e986a718998dbfafcd5ec05934be538db4039" + integrity sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg== + +jest-haste-map@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.2.2.tgz#6d4267b1903854bfdf6a871419f35a82f03ae71e" + integrity sha512-3sJlMSt+NHnzCB+0KhJ1Ut4zKJBiJOlbrqEYNdRQGlXTv8kqzZWjUKQRY3pkjmlf+7rYjAV++MQ4D6g4DhAyOg== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^26.2.0" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" - graceful-fs "^4.2.3" - jest-serializer "^25.2.6" - jest-util "^25.3.0" - jest-worker "^25.2.6" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.2.0" + jest-util "^26.2.0" + jest-worker "^26.2.1" micromatch "^4.0.2" sane "^4.0.3" walker "^1.0.7" - which "^2.0.2" optionalDependencies: fsevents "^2.1.2" -jest-jasmine2@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.3.0.tgz#16ae4f68adef65fb45001b26c864bcbcbf972830" - integrity sha512-NCYOGE6+HNzYFSui52SefgpsnIzvxjn6KAgqw66BdRp37xpMD/4kujDHLNW5bS5i53os5TcMn6jYrzQRO8VPrQ== +jest-jasmine2@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.2.2.tgz#d82b1721fac2b153a4f8b3f0c95e81e702812de2" + integrity sha512-Q8AAHpbiZMVMy4Hz9j1j1bg2yUmPa1W9StBvcHqRaKa9PHaDUMwds8LwaDyzP/2fkybcTQE4+pTMDOG9826tEw== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^25.3.0" - "@jest/source-map" "^25.2.6" - "@jest/test-result" "^25.3.0" - "@jest/types" "^25.3.0" - chalk "^3.0.0" + "@jest/environment" "^26.2.0" + "@jest/source-map" "^26.1.0" + "@jest/test-result" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + chalk "^4.0.0" co "^4.6.0" - expect "^25.3.0" + expect "^26.2.0" is-generator-fn "^2.0.0" - jest-each "^25.3.0" - jest-matcher-utils "^25.3.0" - jest-message-util "^25.3.0" - jest-runtime "^25.3.0" - jest-snapshot "^25.3.0" - jest-util "^25.3.0" - pretty-format "^25.3.0" + jest-each "^26.2.0" + jest-matcher-utils "^26.2.0" + jest-message-util "^26.2.0" + jest-runtime "^26.2.2" + jest-snapshot "^26.2.2" + jest-util "^26.2.0" + pretty-format "^26.2.0" throat "^5.0.0" -jest-leak-detector@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.3.0.tgz#5b6bf04903b35be56038915a55f47291771f769f" - integrity sha512-jk7k24dMIfk8LUSQQGN8PyOy9+J0NAfHZWiDmUDYVMctY8FLJQ1eQ8+PjMoN8PgwhLIggUqgYJnyRFvUz3jLRw== +jest-leak-detector@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.2.0.tgz#073ee6d8db7a9af043e7ce99d8eea17a4fb0cc50" + integrity sha512-aQdzTX1YiufkXA1teXZu5xXOJgy7wZQw6OJ0iH5CtQlOETe6gTSocaYKUNui1SzQ91xmqEUZ/WRavg9FD82rtQ== dependencies: - jest-get-type "^25.2.6" - pretty-format "^25.3.0" + jest-get-type "^26.0.0" + pretty-format "^26.2.0" -jest-matcher-utils@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.3.0.tgz#76765788a26edaa8bc5f0100aea52ae383559648" - integrity sha512-ZBUJ2fchNIZt+fyzkuCFBb8SKaU//Rln45augfUtbHaGyVxCO++ANARdBK9oPGXU3hEDgyy7UHnOP/qNOJXFUg== +jest-matcher-utils@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.2.0.tgz#b107af98c2b8c557ffd46c1adf06f794aa52d622" + integrity sha512-2cf/LW2VFb3ayPHrH36ZDjp9+CAeAe/pWBAwsV8t3dKcrINzXPVxq8qMWOxwt5BaeBCx4ZupVGH7VIgB8v66vQ== dependencies: - chalk "^3.0.0" - jest-diff "^25.3.0" - jest-get-type "^25.2.6" - pretty-format "^25.3.0" + chalk "^4.0.0" + jest-diff "^26.2.0" + jest-get-type "^26.0.0" + pretty-format "^26.2.0" -jest-message-util@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.3.0.tgz#e3836826fe5ca538a337b87d9bd2648190867f85" - integrity sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw== +jest-message-util@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.2.0.tgz#757fbc1323992297092bb9016a71a2eb12fd22ea" + integrity sha512-g362RhZaJuqeqG108n1sthz5vNpzTNy926eNDszo4ncRbmmcMRIUAZibnd6s5v2XSBCChAxQtCoN25gnzp7JbQ== dependencies: "@babel/code-frame" "^7.0.0" - "@jest/types" "^25.3.0" + "@jest/types" "^26.2.0" "@types/stack-utils" "^1.0.1" - chalk "^3.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" micromatch "^4.0.2" slash "^3.0.0" - stack-utils "^1.0.1" - -jest-mock@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.3.0.tgz#d72644509e40987a732a9a2534a1054f4649402c" - integrity sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ== - dependencies: - "@jest/types" "^25.3.0" + stack-utils "^2.0.2" -jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== - -jest-regex-util@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" - integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== - -jest-resolve-dependencies@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.3.0.tgz#b0e4ae053dd44ddacc18c6ee12b5b7c28e445a90" - integrity sha512-bDUlLYmHW+f7J7KgcY2lkq8EMRqKonRl0XoD4Wp5SJkgAxKJnsaIOlrrVNTfXYf+YOu3VCjm/Ac2hPF2nfsCIA== +jest-mock@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.2.0.tgz#a1b3303ab38c34aa1dbbc16ab57cdc1a59ed50d1" + integrity sha512-XeC7yWtWmWByoyVOHSsE7NYsbXJLtJNgmhD7z4MKumKm6ET0si81bsSLbQ64L5saK3TgsHo2B/UqG5KNZ1Sp/Q== dependencies: - "@jest/types" "^25.3.0" - jest-regex-util "^25.2.6" - jest-snapshot "^25.3.0" + "@jest/types" "^26.2.0" + "@types/node" "*" -jest-resolve@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.3.0.tgz#cb90a5bbea54a02eccdbbf4126a819595dcf91d6" - integrity sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ== - dependencies: - "@jest/types" "^25.3.0" - browser-resolve "^1.11.3" - chalk "^3.0.0" - jest-pnp-resolver "^1.2.1" - realpath-native "^2.0.0" - resolve "^1.15.1" +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + +jest-resolve-dependencies@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.2.2.tgz#2ad3cd9281730e9a5c487cd846984c5324e47929" + integrity sha512-S5vufDmVbQXnpP7435gr710xeBGUFcKNpNswke7RmFvDQtmqPjPVU/rCeMlEU0p6vfpnjhwMYeaVjKZAy5QYJA== + dependencies: + "@jest/types" "^26.2.0" + jest-regex-util "^26.0.0" + jest-snapshot "^26.2.2" + +jest-resolve@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.2.2.tgz#324a20a516148d61bffa0058ed0c77c510ecfd3e" + integrity sha512-ye9Tj/ILn/0OgFPE/3dGpQPUqt4dHwIocxt5qSBkyzxQD8PbL0bVxBogX2FHxsd3zJA7V2H/cHXnBnNyyT9YoQ== + dependencies: + "@jest/types" "^26.2.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^26.2.0" + read-pkg-up "^7.0.1" + resolve "^1.17.0" + slash "^3.0.0" -jest-runner@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.3.0.tgz#673ef2ac79d2810eb6b2c1a3f82398375a3d1174" - integrity sha512-csDqSC9qGHYWDrzrElzEgFbteztFeZJmKhSgY5jlCIcN0+PhActzRNku0DA1Xa1HxGOb0/AfbP1EGJlP4fGPtA== +jest-runner@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.2.2.tgz#6d03d057886e9c782e10b2cf37443f902fe0e39e" + integrity sha512-/qb6ptgX+KQ+aNMohJf1We695kaAfuu3u3ouh66TWfhTpLd9WbqcF6163d/tMoEY8GqPztXPLuyG0rHRVDLxCA== dependencies: - "@jest/console" "^25.3.0" - "@jest/environment" "^25.3.0" - "@jest/test-result" "^25.3.0" - "@jest/types" "^25.3.0" - chalk "^3.0.0" + "@jest/console" "^26.2.0" + "@jest/environment" "^26.2.0" + "@jest/test-result" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.7.1" exit "^0.1.2" - graceful-fs "^4.2.3" - jest-config "^25.3.0" - jest-docblock "^25.3.0" - jest-haste-map "^25.3.0" - jest-jasmine2 "^25.3.0" - jest-leak-detector "^25.3.0" - jest-message-util "^25.3.0" - jest-resolve "^25.3.0" - jest-runtime "^25.3.0" - jest-util "^25.3.0" - jest-worker "^25.2.6" + graceful-fs "^4.2.4" + jest-config "^26.2.2" + jest-docblock "^26.0.0" + jest-haste-map "^26.2.2" + jest-leak-detector "^26.2.0" + jest-message-util "^26.2.0" + jest-resolve "^26.2.2" + jest-runtime "^26.2.2" + jest-util "^26.2.0" + jest-worker "^26.2.1" source-map-support "^0.5.6" throat "^5.0.0" -jest-runtime@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.3.0.tgz#af4d40dbcc590fa5de9910cb6a120a13d131050b" - integrity sha512-gn5KYB1wxXRM3nfw8fVpthFu60vxQUCr+ShGq41+ZBFF3DRHZRKj3HDWVAVB4iTNBj2y04QeAo5cZ/boYaPg0w== - dependencies: - "@jest/console" "^25.3.0" - "@jest/environment" "^25.3.0" - "@jest/source-map" "^25.2.6" - "@jest/test-result" "^25.3.0" - "@jest/transform" "^25.3.0" - "@jest/types" "^25.3.0" +jest-runtime@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.2.2.tgz#2480ff79320680a643031dd21998d7c63d83ab68" + integrity sha512-a8VXM3DxCDnCIdl9+QucWFfQ28KdqmyVFqeKLigHdErtsx56O2ZIdQkhFSuP1XtVrG9nTNHbKxjh5XL1UaFDVQ== + dependencies: + "@jest/console" "^26.2.0" + "@jest/environment" "^26.2.0" + "@jest/fake-timers" "^26.2.0" + "@jest/globals" "^26.2.0" + "@jest/source-map" "^26.1.0" + "@jest/test-result" "^26.2.0" + "@jest/transform" "^26.2.2" + "@jest/types" "^26.2.0" "@types/yargs" "^15.0.0" - chalk "^3.0.0" + chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.3" - graceful-fs "^4.2.3" - jest-config "^25.3.0" - jest-haste-map "^25.3.0" - jest-message-util "^25.3.0" - jest-mock "^25.3.0" - jest-regex-util "^25.2.6" - jest-resolve "^25.3.0" - jest-snapshot "^25.3.0" - jest-util "^25.3.0" - jest-validate "^25.3.0" - realpath-native "^2.0.0" + graceful-fs "^4.2.4" + jest-config "^26.2.2" + jest-haste-map "^26.2.2" + jest-message-util "^26.2.0" + jest-mock "^26.2.0" + jest-regex-util "^26.0.0" + jest-resolve "^26.2.2" + jest-snapshot "^26.2.2" + jest-util "^26.2.0" + jest-validate "^26.2.0" slash "^3.0.0" strip-bom "^4.0.0" yargs "^15.3.1" -jest-serializer@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.2.6.tgz#3bb4cc14fe0d8358489dbbefbb8a4e708ce039b7" - integrity sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ== +jest-serializer@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.2.0.tgz#92dcae5666322410f4bf50211dd749274959ddac" + integrity sha512-V7snZI9IVmyJEu0Qy0inmuXgnMWDtrsbV2p9CRAcmlmPVwpC2ZM8wXyYpiugDQnwLHx0V4+Pnog9Exb3UO8M6Q== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" -jest-snapshot@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.3.0.tgz#d4feb457494f4aaedcc83fbbf1ca21808fc3df71" - integrity sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg== +jest-snapshot@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.2.2.tgz#9d2eda083a4a1017b157e351868749bd63211799" + integrity sha512-NdjD8aJS7ePu268Wy/n/aR1TUisG0BOY+QOW4f6h46UHEKOgYmmkvJhh2BqdVZQ0BHSxTMt04WpCf9njzx8KtA== dependencies: "@babel/types" "^7.0.0" - "@jest/types" "^25.3.0" - "@types/prettier" "^1.19.0" - chalk "^3.0.0" - expect "^25.3.0" - jest-diff "^25.3.0" - jest-get-type "^25.2.6" - jest-matcher-utils "^25.3.0" - jest-message-util "^25.3.0" - jest-resolve "^25.3.0" - make-dir "^3.0.0" + "@jest/types" "^26.2.0" + "@types/prettier" "^2.0.0" + chalk "^4.0.0" + expect "^26.2.0" + graceful-fs "^4.2.4" + jest-diff "^26.2.0" + jest-get-type "^26.0.0" + jest-haste-map "^26.2.2" + jest-matcher-utils "^26.2.0" + jest-message-util "^26.2.0" + jest-resolve "^26.2.2" natural-compare "^1.4.0" - pretty-format "^25.3.0" - semver "^6.3.0" + pretty-format "^26.2.0" + semver "^7.3.2" -jest-util@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.3.0.tgz#e3b0064165818f10d78514696fd25efba82cf049" - integrity sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA== +jest-util@26.x, jest-util@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.2.0.tgz#0597d2a27c559340957609f106c408c17c1d88ac" + integrity sha512-YmDwJxLZ1kFxpxPfhSJ0rIkiZOM0PQbRcfH0TzJOhqCisCAsI1WcmoQqO83My9xeVA2k4n+rzg2UuexVKzPpig== dependencies: - "@jest/types" "^25.3.0" - chalk "^3.0.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" is-ci "^2.0.0" - make-dir "^3.0.0" + micromatch "^4.0.2" -jest-validate@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.3.0.tgz#eb95fdee0039647bcd5d4be641b21e4a142a880c" - integrity sha512-3WuXgIZ4HXUvW6gk9twFFkT9j6zUorKnF2oEY8VEsHb7x5LGvVlN3WUsbqazVKuyXwvikO2zFJ/YTySMsMje2w== +jest-validate@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.2.0.tgz#97fedf3e7984b7608854cbf925b9ca6ebcbdb78a" + integrity sha512-8XKn3hM6VIVmLNuyzYLCPsRCT83o8jMZYhbieh4dAyKLc4Ypr36rVKC+c8WMpWkfHHpGnEkvWUjjIAyobEIY/Q== dependencies: - "@jest/types" "^25.3.0" - camelcase "^5.3.1" - chalk "^3.0.0" - jest-get-type "^25.2.6" + "@jest/types" "^26.2.0" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.0.0" leven "^3.1.0" - pretty-format "^25.3.0" + pretty-format "^26.2.0" -jest-watcher@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.3.0.tgz#fd03fd5ca52f02bd3161ab177466bf1bfdd34e5c" - integrity sha512-dtFkfidFCS9Ucv8azOg2hkiY3sgJEHeTLtGFHS+jfBEE7eRtrO6+2r1BokyDkaG2FOD7485r/SgpC1MFAENfeA== +jest-watcher@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.2.0.tgz#45bdf2fecadd19c0a501f3b071a474dca636825b" + integrity sha512-674Boco4Joe0CzgKPL6K4Z9LgyLx+ZvW2GilbpYb8rFEUkmDGgsZdv1Hv5rxsRpb1HLgKUOL/JfbttRCuFdZXQ== dependencies: - "@jest/test-result" "^25.3.0" - "@jest/types" "^25.3.0" + "@jest/test-result" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" ansi-escapes "^4.2.1" - chalk "^3.0.0" - jest-util "^25.3.0" - string-length "^3.1.0" + chalk "^4.0.0" + jest-util "^26.2.0" + string-length "^4.0.1" -jest-worker@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.6.tgz#d1292625326794ce187c38f51109faced3846c58" - integrity sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA== +jest-worker@^26.2.1: + version "26.2.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.2.1.tgz#5d630ab93f666b53f911615bc13e662b382bd513" + integrity sha512-+XcGMMJDTeEGncRb5M5Zq9P7K4sQ1sirhjdOxsN1462h6lFo9w59bl2LVQmdGEEeU3m+maZCkS2Tcc9SfCHO4A== dependencies: + "@types/node" "*" merge-stream "^2.0.0" supports-color "^7.0.0" -jest@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-25.3.0.tgz#7a5e59741d94b8662664c77a9f346246d6bf228b" - integrity sha512-iKd5ShQSHzFT5IL/6h5RZJhApgqXSoPxhp5HEi94v6OAw9QkF8T7X+liEU2eEHJ1eMFYTHmeWLrpBWulsDpaUg== +jest@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest/-/jest-26.2.2.tgz#a022303887b145147204c5f66e6a5c832333c7e7" + integrity sha512-EkJNyHiAG1+A8pqSz7cXttoVa34hOEzN/MrnJhYnfp5VHxflVcf2pu3oJSrhiy6LfIutLdWo+n6q63tjcoIeig== dependencies: - "@jest/core" "^25.3.0" + "@jest/core" "^26.2.2" import-local "^3.0.2" - jest-cli "^25.3.0" + jest-cli "^26.2.2" js-tokens@^4.0.0: version "4.0.0" @@ -2171,36 +2366,36 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^15.2.1: - version "15.2.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" - integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== - dependencies: - abab "^2.0.0" - acorn "^7.1.0" - acorn-globals "^4.3.2" - array-equal "^1.0.0" - cssom "^0.4.1" - cssstyle "^2.0.0" - data-urls "^1.1.0" - domexception "^1.0.1" - escodegen "^1.11.1" - html-encoding-sniffer "^1.0.2" +jsdom@^16.2.2: + version "16.3.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.3.0.tgz#75690b7dac36c67be49c336dcd7219bbbed0810c" + integrity sha512-zggeX5UuEknpdZzv15+MS1dPYG0J/TftiiNunOeNxSl3qr8Z6cIlQpN0IdJa44z9aFxZRIVqRncvEhQ7X5DtZg== + dependencies: + abab "^2.0.3" + acorn "^7.1.1" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.2.0" + data-urls "^2.0.0" + decimal.js "^10.2.0" + domexception "^2.0.1" + escodegen "^1.14.1" + html-encoding-sniffer "^2.0.1" + is-potential-custom-element-name "^1.0.0" nwsapi "^2.2.0" - parse5 "5.1.0" - pn "^1.1.0" - request "^2.88.0" - request-promise-native "^1.0.7" - saxes "^3.1.9" - symbol-tree "^3.2.2" + parse5 "5.1.1" + request "^2.88.2" + request-promise-native "^1.0.8" + saxes "^5.0.0" + symbol-tree "^3.2.4" tough-cookie "^3.0.1" - w3c-hr-time "^1.0.1" - w3c-xmlserializer "^1.1.2" - webidl-conversions "^4.0.2" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" - whatwg-url "^7.0.0" - ws "^7.0.0" + whatwg-url "^8.0.0" + ws "^7.2.3" xml-name-validator "^3.0.0" jsesc@^2.5.1: @@ -2208,6 +2403,11 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -2291,6 +2491,11 @@ 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= + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -2308,17 +2513,15 @@ 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.13, lodash@^4.17.15: +lodash@^4.17.13: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lolex@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" - integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== - dependencies: - "@sinonjs/commons" "^1.7.0" +lodash@^4.17.19: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== make-dir@^3.0.0: version "3.0.2" @@ -2356,14 +2559,6 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -micromatch@4.x, micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -2383,6 +2578,14 @@ micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + mime-db@1.43.0: version "1.43.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" @@ -2488,16 +2691,27 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= -node-notifier@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-6.0.0.tgz#cea319e06baa16deec8ce5cd7f133c4a46b68e12" - integrity sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw== +node-notifier@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-7.0.2.tgz#3a70b1b70aca5e919d0b1b022530697466d9c675" + integrity sha512-ux+n4hPVETuTL8+daJXTOC6uKLgMsl1RYfFv7DKRzyvzBapqco0rZZ9g72ZN8VS6V+gvNYHYa/ofcCY8fkJWsA== dependencies: growly "^1.3.0" - is-wsl "^2.1.1" - semver "^6.3.0" + is-wsl "^2.2.0" + semver "^7.3.2" shellwords "^0.1.1" - which "^1.3.1" + uuid "^8.2.0" + which "^2.0.2" + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" normalize-path@^2.1.1: version "2.1.1" @@ -2599,11 +2813,6 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-finally@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" - integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== - p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -2623,10 +2832,20 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -parse5@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" - integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== +parse-json@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.1.tgz#7cfe35c1ccd641bce3981467e6c2ece61b3b3878" + integrity sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ== + 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@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== pascalcase@^0.1.1: version "0.1.1" @@ -2682,11 +2901,6 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -2697,10 +2911,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@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.4.tgz#2d1bae173e355996ee355ec9830a7a1ee05457ef" - integrity sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w== +prettier@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" + integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== pretty-format@^25.2.1, pretty-format@^25.3.0: version "25.3.0" @@ -2712,6 +2926,16 @@ pretty-format@^25.2.1, pretty-format@^25.3.0: ansi-styles "^4.0.0" react-is "^16.12.0" +pretty-format@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.2.0.tgz#83ecc8d7de676ff224225055e72bd64821cec4f1" + integrity sha512-qi/8IuBu2clY9G7qCXgCdD1Bf9w+sXakdHTRToknzMtVy0g7c4MBWaZy7MfB7ndKZovRO6XRwJiAYqq+MC7SDA== + dependencies: + "@jest/types" "^26.2.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + prompts@^2.0.1: version "2.3.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" @@ -2748,10 +2972,24 @@ react-is@^16.12.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -realpath-native@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" - integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q== +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -2776,23 +3014,23 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -request-promise-core@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" - integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== dependencies: - lodash "^4.17.15" + lodash "^4.17.19" -request-promise-native@^1.0.7: - version "1.0.8" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" - integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== +request-promise-native@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== dependencies: - request-promise-core "1.1.3" + request-promise-core "1.1.4" stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.88.0: +request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -2845,12 +3083,14 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= +resolve@^1.10.0, resolve@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" -resolve@1.x, resolve@^1.15.1, resolve@^1.3.2: +resolve@^1.3.2: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== @@ -2911,23 +3151,28 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -saxes@^3.1.9: - version "3.1.11" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" - integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== +saxes@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: - xmlchars "^2.1.1" - -semver@6.x, semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + xmlchars "^2.2.0" -semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@7.x, semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -3056,6 +3301,32 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -3083,10 +3354,12 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== +stack-utils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593" + integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg== + dependencies: + escape-string-regexp "^2.0.0" static-extend@^0.1.1: version "0.1.2" @@ -3101,13 +3374,13 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= -string-length@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" - integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== +string-length@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" + integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== dependencies: - astral-regex "^1.0.0" - strip-ansi "^5.2.0" + char-regex "^1.0.2" + strip-ansi "^6.0.0" string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" @@ -3118,13 +3391,6 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - 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" @@ -3169,7 +3435,7 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" -symbol-tree@^3.2.2: +symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== @@ -3269,39 +3535,43 @@ tough-cookie@^3.0.1: psl "^1.1.28" punycode "^2.1.1" -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= +tr46@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== dependencies: - punycode "^2.1.0" + punycode "^2.1.1" -ts-jest@^25.3.1: - version "25.3.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-25.3.1.tgz#58e2ed3506e4e4487c0b9b532846a5cade9656ba" - integrity sha512-O53FtKguoMUByalAJW+NWEv7c4tus5ckmhfa7/V0jBb2z8v5rDSLFC1Ate7wLknYPC1euuhY6eJjQq4FtOZrkg== +ts-jest@^26.1.4: + version "26.1.4" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.1.4.tgz#87d41a96016a8efe4b8cc14501d3785459af6fa6" + integrity sha512-Nd7diUX6NZWfWq6FYyvcIPR/c7GbEF75fH1R6coOp3fbNzbRJBZZAn0ueVS0r8r9ral1VcrpneAFAwB3TsVS1Q== dependencies: bs-logger "0.x" buffer-from "1.x" fast-json-stable-stringify "2.x" + jest-util "26.x" json5 "2.x" lodash.memoize "4.x" make-error "1.x" - micromatch "4.x" mkdirp "1.x" - resolve "1.x" - semver "6.x" + semver "7.x" yargs-parser "18.x" -tslib@^1.10.0, tslib@^1.8.1: +tslib@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +tslib@^1.8.1: version "1.11.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== -tslint@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.1.tgz#ac03fbd17f85bfefaae348b353b25a88efe10cde" - integrity sha512-kd6AQ/IgPRpLn6g5TozqzPdGNZ0q0jtXW4//hRcj10qLYBaa3mTUU2y2MCG+RXZm8Zx+KZi0eA+YCrMyNlF4UA== +tslint@^6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" + integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== dependencies: "@babel/code-frame" "^7.0.0" builtin-modules "^1.1.1" @@ -3314,7 +3584,7 @@ tslint@^6.1.1: mkdirp "^0.5.3" resolve "^1.3.2" semver "^5.3.0" - tslib "^1.10.0" + tslib "^1.13.0" tsutils "^2.29.0" tsutils@^2.29.0: @@ -3353,6 +3623,16 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +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== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -3360,10 +3640,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^3.8.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" - integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== +typescript@^3.9.7: + version "3.9.7" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" + integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== union-value@^1.0.0: version "1.0.1" @@ -3410,15 +3690,28 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -v8-to-istanbul@^4.0.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz#22fe35709a64955f49a08a7c7c959f6520ad6f20" - integrity sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng== +uuid@^8.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea" + integrity sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ== + +v8-to-istanbul@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz#b97936f21c0e2d9996d4985e5c5156e9d4e49cd6" + integrity sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" source-map "^0.7.3" +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -3428,20 +3721,18 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -w3c-hr-time@^1.0.1: +w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: browser-process-hrtime "^1.0.0" -w3c-xmlserializer@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" - integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== dependencies: - domexception "^1.0.1" - webidl-conversions "^4.0.2" xml-name-validator "^3.0.0" walker@^1.0.7, walker@~1.0.5: @@ -3451,38 +3742,43 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: +whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: iconv-lite "0.4.24" -whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: +whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== +whatwg-url@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.1.0.tgz#c628acdcf45b82274ce7281ee31dd3c839791771" + integrity sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw== dependencies: lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" + tr46 "^2.0.2" + webidl-conversions "^5.0.0" which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9, which@^1.3.1: +which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -3525,17 +3821,17 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@^7.0.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" - integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== +ws@^7.2.3: + version "7.3.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" + integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xmlchars@^2.1.1: +xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== diff --git a/py_codegen/type_extractor/__tests__/test_class_of_generic_instance.py b/py_codegen/type_extractor/__tests__/test_class_of_generic_instance.py index 0e59557..00934e2 100644 --- a/py_codegen/type_extractor/__tests__/test_class_of_generic_instance.py +++ b/py_codegen/type_extractor/__tests__/test_class_of_generic_instance.py @@ -51,27 +51,13 @@ def test_class_of_generic_instance(): assert collected_types['SomeClass'] == some_class assert collected_types['some_func_with_generic_inst'] == FunctionFound( - name='some_func_with_generic_inst', - params={ - 'input': FixedGenericFound( - type_vars=[float, some_class], - origin=some_generic_class, - ) - }, - return_type=str, - ) - # - # assert collected_types == { - # 'SomeGenericClass': some_generic_class, - # 'SomeClass': some_class, - # 'some_func_with_generic_inst': FunctionFound( - # name='some_func_with_generic_inst', - # params={ - # 'input': FixedGenericFound( - # type_vars=[float, some_class], - # origin=some_generic_class, - # ) - # }, - # return_type=str, - # ) - # } \ No newline at end of file + name='some_func_with_generic_inst', + params={ + 'input': FixedGenericFound( + type_vars=[float, some_class], + origin=some_generic_class, + ) + }, + return_type=str, + ) + diff --git a/py_codegen/type_extractor/middlewares/fixed_generic_found.py b/py_codegen/type_extractor/middlewares/fixed_generic_found.py index 7019899..9e0034d 100644 --- a/py_codegen/type_extractor/middlewares/fixed_generic_found.py +++ b/py_codegen/type_extractor/middlewares/fixed_generic_found.py @@ -20,7 +20,8 @@ def fixed_generic_found_middleware( origin = typing_inspect.get_origin(typ) - if origin is typ: + if origin is typ \ + or origin is None: return None origin_node = type_extractor.rawtype_to_node(origin) @@ -31,4 +32,4 @@ def fixed_generic_found_middleware( return FixedGenericFound( type_vars=type_vars, origin=origin_node, - ) \ No newline at end of file + ) diff --git a/requirements.txt b/requirements.txt index 0956d6b..46a2265 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ setuptools>=43.0.0 -dataclasses>=0.7 +dataclasses>=0.6 extractor>=0.5 typing>=3.7.4.3 typing_inspect>=0.6.0 From f004c5b35e3d20c335c295cec80ba82d2604399c Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Fri, 7 Aug 2020 11:33:35 +0900 Subject: [PATCH 11/34] rename project to python type extractor --- .circleci/config.yml | 8 ++-- py_codegen/plugins/typescript/__base__.py | 46 ------------------- {py_codegen => py_type_extractor}/__init__.py | 0 .../plugins/__init__.py | 0 .../plugins/typescript/.gitignore | 0 .../plugins/typescript/.watchmanconfig | 0 .../plugins/typescript/Converter.py | 36 +++++++-------- .../plugins/typescript/__base__.py | 46 +++++++++++++++++++ .../plugins/typescript/__init__.py | 0 .../plugins/typescript/__tests__/__init__.py | 0 .../__tests__/generate_ts_definitions.py | 26 +++++------ .../plugins/typescript/__tests__/test.ts | 0 .../ts_fixtures/ClassWithUnionField.d.ts | 0 .../ts_fixtures/func_not_annotated.d.ts | 0 .../ts_fixtures/func_return_none.d.ts | 0 .../__tests__/ts_fixtures/func_with_dict.d.ts | 0 .../__tests__/ts_fixtures/func_with_list.d.ts | 0 .../ts_fixtures/func_with_literals.d.ts | 0 .../ts_fixtures/func_with_mapping.d.ts | 0 .../ts_fixtures/func_with_tuple.d.ts | 0 .../ts_fixtures/func_with_typed_dict.d.ts | 0 .../__tests__/ts_generated/.gitkeep | 0 .../plugins/typescript/__tests__/utils.ts | 0 .../plugins/typescript/jest.config.js | 0 .../typescript/middlewares/__base__.py | 6 +-- .../typescript/middlewares/__init__.py | 0 .../plugins/typescript/middlewares/classes.py | 8 ++-- .../typescript/middlewares/functions.py | 8 ++-- .../typescript/middlewares/typeddicts.py | 8 ++-- .../plugins/typescript/package.json | 0 .../plugins/typescript/tsconfig.json | 0 .../plugins/typescript/yarn.lock | 0 .../test_fixtures/__init__.py | 0 .../test_fixtures/class_with_methods.py | 0 .../test_fixtures/classes_with_inheritance.py | 0 .../test_fixtures/func_not_annotated.py | 0 .../test_fixtures/func_return_none.py | 0 .../func_with_builtin_type_args.py | 0 .../test_fixtures/func_with_dict.py | 0 .../test_fixtures/func_with_list.py | 0 .../test_fixtures/func_with_literals.py | 0 .../test_fixtures/func_with_mapping.py | 0 .../func_with_simple_generics.py | 0 .../test_fixtures/func_with_tuple.py | 0 .../test_fixtures/func_with_typed_dict.py | 0 .../test_fixtures/generic_classes.py | 0 .../test_fixtures/new_type.py | 0 .../test_fixtures/pydantic_classes.py | 0 .../test_fixtures/union_type_class.py | 0 .../test_fixtures/various_classes.py | 0 .../type_extractor/__base__.py | 2 +- .../type_extractor/__init__.py | 0 .../type_extractor/__tests__/__init__.py | 0 .../__tests__/test_circular_dep_classes.py | 0 .../test_class_of_generic_instance.py | 14 +++--- .../__tests__/test_class_of_generic_origin.py | 10 ++-- .../__tests__/test_class_with_union_field.py | 12 ++--- .../test_classes_with_inheritance.py | 10 ++-- .../__tests__/test_func_not_annotated.py | 10 ++-- .../__tests__/test_func_with_arg_class.py | 8 ++-- .../test_func_with_builtin_type_args.py | 8 ++-- .../__tests__/test_func_with_dict.py | 12 ++--- .../__tests__/test_func_with_list.py | 12 ++--- .../__tests__/test_func_with_literals.py | 12 ++--- .../__tests__/test_func_with_mapping.py | 10 ++-- .../test_func_with_nested_arg_class.py | 6 +-- .../__tests__/test_func_with_tuple.py | 10 ++-- .../__tests__/test_func_with_typed_dict.py | 12 ++--- .../type_extractor/__tests__/test_newtype.py | 14 +++--- .../__tests__/test_pydantic_classes.py | 10 ++-- .../__tests__/test_various_classes.py | 10 ++-- .../type_extractor/__tests__/utils.py | 16 +++---- .../errors/DuplicateNameFound.py | 2 +- .../type_extractor/errors/__init__.py | 0 .../type_extractor/middlewares/TypeVar.py | 8 ++-- .../type_extractor/middlewares/__common__.py | 0 .../type_extractor/middlewares/__init__.py | 0 .../type_extractor/middlewares/class_found.py | 8 ++-- .../type_extractor/middlewares/dict_found.py | 12 ++--- .../middlewares/fixed_generic_found.py | 6 +-- .../middlewares/function_found.py | 6 +-- .../type_extractor/middlewares/list_found.py | 10 ++-- .../middlewares/literal_found.py | 10 ++-- .../middlewares/mapping_found.py | 10 ++-- .../middlewares/newtype_found.py | 6 +-- .../type_extractor/middlewares/tuple_found.py | 10 ++-- .../type_extractor/middlewares/type_or.py | 10 ++-- .../middlewares/typeddict_found.py | 8 ++-- .../type_extractor/mock_type_extractor.py | 2 +- .../type_extractor/nodes/BaseNodeType.py | 0 .../type_extractor/nodes/ClassFound.py | 4 +- .../type_extractor/nodes/DictFound.py | 2 +- .../type_extractor/nodes/FixedGenericFound.py | 4 +- .../type_extractor/nodes/FunctionFound.py | 2 +- .../type_extractor/nodes/ListFound.py | 2 +- .../type_extractor/nodes/LiteralFound.py | 2 +- .../type_extractor/nodes/MappingFound.py | 2 +- .../type_extractor/nodes/NewType.py | 2 +- .../type_extractor/nodes/NoneNode.py | 2 +- .../type_extractor/nodes/TupleFound.py | 2 +- .../type_extractor/nodes/TypeOR.py | 0 .../type_extractor/nodes/TypeVarFound.py | 2 +- .../type_extractor/nodes/TypedDictFound.py | 2 +- .../type_extractor/nodes/UnknownFound.py | 0 .../type_extractor/nodes/__init__.py | 0 .../type_extractor/nodes/utils/__init__.py | 0 .../nodes/utils/strip_margin.py | 0 .../type_extractor/type_extractor.py | 32 ++++++------- .../type_extractor/utils.py | 0 setup.py | 2 +- 110 files changed, 280 insertions(+), 280 deletions(-) delete mode 100644 py_codegen/plugins/typescript/__base__.py rename {py_codegen => py_type_extractor}/__init__.py (100%) rename {py_codegen => py_type_extractor}/plugins/__init__.py (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/.gitignore (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/.watchmanconfig (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/Converter.py (70%) create mode 100644 py_type_extractor/plugins/typescript/__base__.py rename {py_codegen => py_type_extractor}/plugins/typescript/__init__.py (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/__tests__/__init__.py (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/__tests__/generate_ts_definitions.py (53%) rename {py_codegen => py_type_extractor}/plugins/typescript/__tests__/test.ts (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/__tests__/ts_fixtures/ClassWithUnionField.d.ts (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/__tests__/ts_fixtures/func_not_annotated.d.ts (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/__tests__/ts_fixtures/func_with_dict.d.ts (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/__tests__/ts_fixtures/func_with_list.d.ts (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/__tests__/ts_fixtures/func_with_mapping.d.ts (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/__tests__/ts_fixtures/func_with_tuple.d.ts (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/__tests__/ts_fixtures/func_with_typed_dict.d.ts (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/__tests__/ts_generated/.gitkeep (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/__tests__/utils.ts (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/jest.config.js (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/middlewares/__base__.py (70%) rename {py_codegen => py_type_extractor}/plugins/typescript/middlewares/__init__.py (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/middlewares/classes.py (77%) rename {py_codegen => py_type_extractor}/plugins/typescript/middlewares/functions.py (78%) rename {py_codegen => py_type_extractor}/plugins/typescript/middlewares/typeddicts.py (79%) rename {py_codegen => py_type_extractor}/plugins/typescript/package.json (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/tsconfig.json (100%) rename {py_codegen => py_type_extractor}/plugins/typescript/yarn.lock (100%) rename {py_codegen => py_type_extractor}/test_fixtures/__init__.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/class_with_methods.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/classes_with_inheritance.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/func_not_annotated.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/func_return_none.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/func_with_builtin_type_args.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/func_with_dict.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/func_with_list.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/func_with_literals.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/func_with_mapping.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/func_with_simple_generics.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/func_with_tuple.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/func_with_typed_dict.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/generic_classes.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/new_type.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/pydantic_classes.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/union_type_class.py (100%) rename {py_codegen => py_type_extractor}/test_fixtures/various_classes.py (100%) rename {py_codegen => py_type_extractor}/type_extractor/__base__.py (87%) rename {py_codegen => py_type_extractor}/type_extractor/__init__.py (100%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/__init__.py (100%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_circular_dep_classes.py (100%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_class_of_generic_instance.py (73%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_class_of_generic_origin.py (70%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_class_with_union_field.py (65%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_classes_with_inheritance.py (73%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_func_not_annotated.py (60%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_func_with_arg_class.py (74%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_func_with_builtin_type_args.py (67%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_func_with_dict.py (54%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_func_with_list.py (64%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_func_with_literals.py (76%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_func_with_mapping.py (57%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_func_with_nested_arg_class.py (82%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_func_with_tuple.py (58%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_func_with_typed_dict.py (72%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_newtype.py (64%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_pydantic_classes.py (70%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/test_various_classes.py (75%) rename {py_codegen => py_type_extractor}/type_extractor/__tests__/utils.py (84%) rename {py_codegen => py_type_extractor}/type_extractor/errors/DuplicateNameFound.py (66%) rename {py_codegen => py_type_extractor}/type_extractor/errors/__init__.py (100%) rename {py_codegen => py_type_extractor}/type_extractor/middlewares/TypeVar.py (61%) rename {py_codegen => py_type_extractor}/type_extractor/middlewares/__common__.py (100%) rename {py_codegen => py_type_extractor}/type_extractor/middlewares/__init__.py (100%) rename {py_codegen => py_type_extractor}/type_extractor/middlewares/class_found.py (87%) rename {py_codegen => py_type_extractor}/type_extractor/middlewares/dict_found.py (63%) rename {py_codegen => py_type_extractor}/type_extractor/middlewares/fixed_generic_found.py (76%) rename {py_codegen => py_type_extractor}/type_extractor/middlewares/function_found.py (85%) rename {py_codegen => py_type_extractor}/type_extractor/middlewares/list_found.py (50%) rename {py_codegen => py_type_extractor}/type_extractor/middlewares/literal_found.py (69%) rename {py_codegen => py_type_extractor}/type_extractor/middlewares/mapping_found.py (61%) rename {py_codegen => py_type_extractor}/type_extractor/middlewares/newtype_found.py (72%) rename {py_codegen => py_type_extractor}/type_extractor/middlewares/tuple_found.py (52%) rename {py_codegen => py_type_extractor}/type_extractor/middlewares/type_or.py (57%) rename {py_codegen => py_type_extractor}/type_extractor/middlewares/typeddict_found.py (71%) rename {py_codegen => py_type_extractor}/type_extractor/mock_type_extractor.py (79%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/BaseNodeType.py (100%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/ClassFound.py (88%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/DictFound.py (67%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/FixedGenericFound.py (56%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/FunctionFound.py (95%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/ListFound.py (67%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/LiteralFound.py (69%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/MappingFound.py (69%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/NewType.py (61%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/NoneNode.py (82%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/TupleFound.py (59%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/TypeOR.py (100%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/TypeVarFound.py (69%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/TypedDictFound.py (81%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/UnknownFound.py (100%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/__init__.py (100%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/utils/__init__.py (100%) rename {py_codegen => py_type_extractor}/type_extractor/nodes/utils/strip_margin.py (100%) rename {py_codegen => py_type_extractor}/type_extractor/type_extractor.py (62%) rename {py_codegen => py_type_extractor}/type_extractor/utils.py (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 25f9683..e1df1ce 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -47,16 +47,16 @@ jobs: - '~/.nvm' - restore_cache: - key: yarn-{{ .Branch }}-{{ checksum "py_codegen/plugins/typescript/yarn.lock" }} + key: yarn-{{ .Branch }}-{{ checksum "py_type_extractor/plugins/typescript/yarn.lock" }} - run: command: | source .circleci/nvm_env.sh cd py_codegen/plugins/typescript yarn - save_cache: - key: yarn-{{ .Branch }}-{{ checksum "py_codegen/plugins/typescript/yarn.lock" }} + key: yarn-{{ .Branch }}-{{ checksum "py_type_extractor/plugins/typescript/yarn.lock" }} paths: - - 'py_codegen/plugins/typescript/node_modules' + - 'py_type_extractor/plugins/typescript/node_modules' - run: command: | source venv/bin/activate @@ -91,4 +91,4 @@ workflows: branches: ignore: - /^dist*/ - - master \ No newline at end of file + - master diff --git a/py_codegen/plugins/typescript/__base__.py b/py_codegen/plugins/typescript/__base__.py deleted file mode 100644 index 44a3e05..0000000 --- a/py_codegen/plugins/typescript/__base__.py +++ /dev/null @@ -1,46 +0,0 @@ -from abc import ABC -from textwrap import dedent -from typing import ( - cast, - List, - Dict, - Callable) - -from textwrap import ( - indent, -) - -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.nodes.BaseNodeType import NodeType -from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.nodes.DictFound import DictFound -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -from py_codegen.type_extractor.nodes.ListFound import ListFound -from py_codegen.type_extractor.nodes.NoneNode import NoneNode -from py_codegen.type_extractor.nodes.TupleFound import TupleFound -from py_codegen.type_extractor.nodes.TypeOR import TypeOR -from py_codegen.type_extractor.nodes.TypedDictFound import TypedDictFound -from py_codegen.type_extractor.nodes.UnknownFound import unknown_found -from py_codegen.type_extractor.type_extractor import TypeExtractor, is_builtin - -MiddlewareType = Callable[ - [BaseTypeExtractor, 'BaseTypescriptConverter'], - List[str], -] - -class BaseTypescriptConverter(ABC): - extractor: TypeExtractor - - middlewares: List[MiddlewareType] - - def __init__( - self, - extractor: TypeExtractor, - ): - ... - - def get_identifier(self, node: NodeType) -> str: - ... - - - diff --git a/py_codegen/__init__.py b/py_type_extractor/__init__.py similarity index 100% rename from py_codegen/__init__.py rename to py_type_extractor/__init__.py diff --git a/py_codegen/plugins/__init__.py b/py_type_extractor/plugins/__init__.py similarity index 100% rename from py_codegen/plugins/__init__.py rename to py_type_extractor/plugins/__init__.py diff --git a/py_codegen/plugins/typescript/.gitignore b/py_type_extractor/plugins/typescript/.gitignore similarity index 100% rename from py_codegen/plugins/typescript/.gitignore rename to py_type_extractor/plugins/typescript/.gitignore diff --git a/py_codegen/plugins/typescript/.watchmanconfig b/py_type_extractor/plugins/typescript/.watchmanconfig similarity index 100% rename from py_codegen/plugins/typescript/.watchmanconfig rename to py_type_extractor/plugins/typescript/.watchmanconfig diff --git a/py_codegen/plugins/typescript/Converter.py b/py_type_extractor/plugins/typescript/Converter.py similarity index 70% rename from py_codegen/plugins/typescript/Converter.py rename to py_type_extractor/plugins/typescript/Converter.py index cbb799f..f621467 100644 --- a/py_codegen/plugins/typescript/Converter.py +++ b/py_type_extractor/plugins/typescript/Converter.py @@ -8,24 +8,24 @@ ) from typing_extensions import Protocol -from py_codegen.plugins.typescript.__base__ import MiddlewareType -from py_codegen.plugins.typescript.middlewares.classes import class_middleware -from py_codegen.plugins.typescript.middlewares.functions import functionfounds_middleware -from py_codegen.plugins.typescript.middlewares.typeddicts import typeddicts_middleware -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.nodes.BaseNodeType import NodeType -from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.nodes.DictFound import DictFound -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -from py_codegen.type_extractor.nodes.ListFound import ListFound -from py_codegen.type_extractor.nodes.LiteralFound import LiteralFound -from py_codegen.type_extractor.nodes.MappingFound import MappingFound -from py_codegen.type_extractor.nodes.NoneNode import NoneNode -from py_codegen.type_extractor.nodes.TupleFound import TupleFound -from py_codegen.type_extractor.nodes.TypeOR import TypeOR -from py_codegen.type_extractor.nodes.TypedDictFound import TypedDictFound -from py_codegen.type_extractor.nodes.UnknownFound import unknown_found -from py_codegen.type_extractor.type_extractor import TypeExtractor, is_builtin +from py_type_extractor.plugins.typescript.__base__ import MiddlewareType +from py_type_extractor.plugins.typescript.middlewares.classes import class_middleware +from py_type_extractor.plugins.typescript.middlewares.functions import functionfounds_middleware +from py_type_extractor.plugins.typescript.middlewares.typeddicts import typeddicts_middleware +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.DictFound import DictFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.ListFound import ListFound +from py_type_extractor.type_extractor.nodes.LiteralFound import LiteralFound +from py_type_extractor.type_extractor.nodes.MappingFound import MappingFound +from py_type_extractor.type_extractor.nodes.NoneNode import NoneNode +from py_type_extractor.type_extractor.nodes.TupleFound import TupleFound +from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR +from py_type_extractor.type_extractor.nodes.TypedDictFound import TypedDictFound +from py_type_extractor.type_extractor.nodes.UnknownFound import unknown_found +from py_type_extractor.type_extractor.type_extractor import TypeExtractor, is_builtin class LiteralConverterType(Protocol): diff --git a/py_type_extractor/plugins/typescript/__base__.py b/py_type_extractor/plugins/typescript/__base__.py new file mode 100644 index 0000000..3cf3a3f --- /dev/null +++ b/py_type_extractor/plugins/typescript/__base__.py @@ -0,0 +1,46 @@ +from abc import ABC +from textwrap import dedent +from typing import ( + cast, + List, + Dict, + Callable) + +from textwrap import ( + indent, +) + +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.DictFound import DictFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.ListFound import ListFound +from py_type_extractor.type_extractor.nodes.NoneNode import NoneNode +from py_type_extractor.type_extractor.nodes.TupleFound import TupleFound +from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR +from py_type_extractor.type_extractor.nodes.TypedDictFound import TypedDictFound +from py_type_extractor.type_extractor.nodes.UnknownFound import unknown_found +from py_type_extractor.type_extractor.type_extractor import TypeExtractor, is_builtin + +MiddlewareType = Callable[ + [BaseTypeExtractor, 'BaseTypescriptConverter'], + List[str], +] + +class BaseTypescriptConverter(ABC): + extractor: TypeExtractor + + middlewares: List[MiddlewareType] + + def __init__( + self, + extractor: TypeExtractor, + ): + ... + + def get_identifier(self, node: NodeType) -> str: + ... + + + diff --git a/py_codegen/plugins/typescript/__init__.py b/py_type_extractor/plugins/typescript/__init__.py similarity index 100% rename from py_codegen/plugins/typescript/__init__.py rename to py_type_extractor/plugins/typescript/__init__.py diff --git a/py_codegen/plugins/typescript/__tests__/__init__.py b/py_type_extractor/plugins/typescript/__tests__/__init__.py similarity index 100% rename from py_codegen/plugins/typescript/__tests__/__init__.py rename to py_type_extractor/plugins/typescript/__tests__/__init__.py diff --git a/py_codegen/plugins/typescript/__tests__/generate_ts_definitions.py b/py_type_extractor/plugins/typescript/__tests__/generate_ts_definitions.py similarity index 53% rename from py_codegen/plugins/typescript/__tests__/generate_ts_definitions.py rename to py_type_extractor/plugins/typescript/__tests__/generate_ts_definitions.py index 7968dd1..8b8f5bc 100644 --- a/py_codegen/plugins/typescript/__tests__/generate_ts_definitions.py +++ b/py_type_extractor/plugins/typescript/__tests__/generate_ts_definitions.py @@ -1,18 +1,18 @@ from typing import Callable -from py_codegen.plugins.typescript.Converter import TypescriptConverter - -from py_codegen.test_fixtures.union_type_class import ClassWithUnionField -from py_codegen.test_fixtures.func_with_dict import func_with_dict -from py_codegen.test_fixtures.func_with_list import func_with_list -from py_codegen.test_fixtures.func_with_typed_dict import func_with_typed_dict -from py_codegen.test_fixtures.func_not_annotated import func_not_annotated -from py_codegen.test_fixtures.func_return_none import func_return_none -from py_codegen.test_fixtures.func_with_tuple import func_with_tuple -from py_codegen.test_fixtures.func_with_literals import func_with_literals -from py_codegen.test_fixtures.func_with_mapping import func_with_mapping - -from py_codegen.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.plugins.typescript.Converter import TypescriptConverter + +from py_type_extractor.test_fixtures.union_type_class import ClassWithUnionField +from py_type_extractor.test_fixtures.func_with_dict import func_with_dict +from py_type_extractor.test_fixtures.func_with_list import func_with_list +from py_type_extractor.test_fixtures.func_with_typed_dict import func_with_typed_dict +from py_type_extractor.test_fixtures.func_not_annotated import func_not_annotated +from py_type_extractor.test_fixtures.func_return_none import func_return_none +from py_type_extractor.test_fixtures.func_with_tuple import func_with_tuple +from py_type_extractor.test_fixtures.func_with_literals import func_with_literals +from py_type_extractor.test_fixtures.func_with_mapping import func_with_mapping + +from py_type_extractor.type_extractor.type_extractor import TypeExtractor from os import path diff --git a/py_codegen/plugins/typescript/__tests__/test.ts b/py_type_extractor/plugins/typescript/__tests__/test.ts similarity index 100% rename from py_codegen/plugins/typescript/__tests__/test.ts rename to py_type_extractor/plugins/typescript/__tests__/test.ts diff --git a/py_codegen/plugins/typescript/__tests__/ts_fixtures/ClassWithUnionField.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/ClassWithUnionField.d.ts similarity index 100% rename from py_codegen/plugins/typescript/__tests__/ts_fixtures/ClassWithUnionField.d.ts rename to py_type_extractor/plugins/typescript/__tests__/ts_fixtures/ClassWithUnionField.d.ts diff --git a/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_not_annotated.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_not_annotated.d.ts similarity index 100% rename from py_codegen/plugins/typescript/__tests__/ts_fixtures/func_not_annotated.d.ts rename to py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_not_annotated.d.ts diff --git a/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts similarity index 100% rename from py_codegen/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts rename to py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts diff --git a/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_dict.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_dict.d.ts similarity index 100% rename from py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_dict.d.ts rename to py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_dict.d.ts diff --git a/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_list.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_list.d.ts similarity index 100% rename from py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_list.d.ts rename to py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_list.d.ts diff --git a/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts similarity index 100% rename from py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts rename to py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts diff --git a/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_mapping.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_mapping.d.ts similarity index 100% rename from py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_mapping.d.ts rename to py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_mapping.d.ts diff --git a/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_tuple.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_tuple.d.ts similarity index 100% rename from py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_tuple.d.ts rename to py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_tuple.d.ts diff --git a/py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_typed_dict.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_typed_dict.d.ts similarity index 100% rename from py_codegen/plugins/typescript/__tests__/ts_fixtures/func_with_typed_dict.d.ts rename to py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_typed_dict.d.ts diff --git a/py_codegen/plugins/typescript/__tests__/ts_generated/.gitkeep b/py_type_extractor/plugins/typescript/__tests__/ts_generated/.gitkeep similarity index 100% rename from py_codegen/plugins/typescript/__tests__/ts_generated/.gitkeep rename to py_type_extractor/plugins/typescript/__tests__/ts_generated/.gitkeep diff --git a/py_codegen/plugins/typescript/__tests__/utils.ts b/py_type_extractor/plugins/typescript/__tests__/utils.ts similarity index 100% rename from py_codegen/plugins/typescript/__tests__/utils.ts rename to py_type_extractor/plugins/typescript/__tests__/utils.ts diff --git a/py_codegen/plugins/typescript/jest.config.js b/py_type_extractor/plugins/typescript/jest.config.js similarity index 100% rename from py_codegen/plugins/typescript/jest.config.js rename to py_type_extractor/plugins/typescript/jest.config.js diff --git a/py_codegen/plugins/typescript/middlewares/__base__.py b/py_type_extractor/plugins/typescript/middlewares/__base__.py similarity index 70% rename from py_codegen/plugins/typescript/middlewares/__base__.py rename to py_type_extractor/plugins/typescript/middlewares/__base__.py index 35044a6..4952dd3 100644 --- a/py_codegen/plugins/typescript/middlewares/__base__.py +++ b/py_type_extractor/plugins/typescript/middlewares/__base__.py @@ -1,7 +1,7 @@ from typing import Dict, List -from py_codegen.plugins.typescript.__base__ import BaseTypescriptConverter -from py_codegen.type_extractor.nodes.BaseNodeType import NodeType +from py_type_extractor.plugins.typescript.__base__ import BaseTypescriptConverter +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType def convert_params_dict( @@ -15,4 +15,4 @@ def convert_params_dict( converted.append( f"\t{_field_name}: {converter.get_identifier(node)}{ending}" ) - return '\n'.join(converted) \ No newline at end of file + return '\n'.join(converted) diff --git a/py_codegen/plugins/typescript/middlewares/__init__.py b/py_type_extractor/plugins/typescript/middlewares/__init__.py similarity index 100% rename from py_codegen/plugins/typescript/middlewares/__init__.py rename to py_type_extractor/plugins/typescript/middlewares/__init__.py diff --git a/py_codegen/plugins/typescript/middlewares/classes.py b/py_type_extractor/plugins/typescript/middlewares/classes.py similarity index 77% rename from py_codegen/plugins/typescript/middlewares/classes.py rename to py_type_extractor/plugins/typescript/middlewares/classes.py index 76f3f53..7373e00 100644 --- a/py_codegen/plugins/typescript/middlewares/classes.py +++ b/py_type_extractor/plugins/typescript/middlewares/classes.py @@ -1,8 +1,8 @@ from typing import List -from py_codegen.plugins.typescript.__base__ import BaseTypescriptConverter -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.plugins.typescript.__base__ import BaseTypescriptConverter +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from .__base__ import ( convert_params_dict, @@ -38,4 +38,4 @@ def convert_class( f"export class {converter.get_identifier(class_found)} {{\n" f" {fields} \n" "}" - ) \ No newline at end of file + ) diff --git a/py_codegen/plugins/typescript/middlewares/functions.py b/py_type_extractor/plugins/typescript/middlewares/functions.py similarity index 78% rename from py_codegen/plugins/typescript/middlewares/functions.py rename to py_type_extractor/plugins/typescript/middlewares/functions.py index 6fd915d..561ff56 100644 --- a/py_codegen/plugins/typescript/middlewares/functions.py +++ b/py_type_extractor/plugins/typescript/middlewares/functions.py @@ -1,8 +1,8 @@ from typing import List -from py_codegen.plugins.typescript.__base__ import BaseTypescriptConverter -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.plugins.typescript.__base__ import BaseTypescriptConverter +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from .__base__ import ( convert_params_dict, @@ -38,4 +38,4 @@ def convert_functionfound( f"export function {converter.get_identifier(func_found)}(\n" f" {params}\n" f"): {converter.get_identifier(func_found.return_type)}" - ) \ No newline at end of file + ) diff --git a/py_codegen/plugins/typescript/middlewares/typeddicts.py b/py_type_extractor/plugins/typescript/middlewares/typeddicts.py similarity index 79% rename from py_codegen/plugins/typescript/middlewares/typeddicts.py rename to py_type_extractor/plugins/typescript/middlewares/typeddicts.py index fe2bb27..4fe6a55 100644 --- a/py_codegen/plugins/typescript/middlewares/typeddicts.py +++ b/py_type_extractor/plugins/typescript/middlewares/typeddicts.py @@ -1,9 +1,9 @@ from typing import List from textwrap import indent -from py_codegen.plugins.typescript.__base__ import BaseTypescriptConverter -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.nodes.TypedDictFound import TypedDictFound +from py_type_extractor.plugins.typescript.__base__ import BaseTypescriptConverter +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.nodes.TypedDictFound import TypedDictFound from .__base__ import ( convert_params_dict, @@ -40,4 +40,4 @@ def convert_typeddict( f"export interface {converter.get_identifier(typed_dict_found)} {{\n" f"{indent(annotations, tab)}\n" f"}}" - ) \ No newline at end of file + ) diff --git a/py_codegen/plugins/typescript/package.json b/py_type_extractor/plugins/typescript/package.json similarity index 100% rename from py_codegen/plugins/typescript/package.json rename to py_type_extractor/plugins/typescript/package.json diff --git a/py_codegen/plugins/typescript/tsconfig.json b/py_type_extractor/plugins/typescript/tsconfig.json similarity index 100% rename from py_codegen/plugins/typescript/tsconfig.json rename to py_type_extractor/plugins/typescript/tsconfig.json diff --git a/py_codegen/plugins/typescript/yarn.lock b/py_type_extractor/plugins/typescript/yarn.lock similarity index 100% rename from py_codegen/plugins/typescript/yarn.lock rename to py_type_extractor/plugins/typescript/yarn.lock diff --git a/py_codegen/test_fixtures/__init__.py b/py_type_extractor/test_fixtures/__init__.py similarity index 100% rename from py_codegen/test_fixtures/__init__.py rename to py_type_extractor/test_fixtures/__init__.py diff --git a/py_codegen/test_fixtures/class_with_methods.py b/py_type_extractor/test_fixtures/class_with_methods.py similarity index 100% rename from py_codegen/test_fixtures/class_with_methods.py rename to py_type_extractor/test_fixtures/class_with_methods.py diff --git a/py_codegen/test_fixtures/classes_with_inheritance.py b/py_type_extractor/test_fixtures/classes_with_inheritance.py similarity index 100% rename from py_codegen/test_fixtures/classes_with_inheritance.py rename to py_type_extractor/test_fixtures/classes_with_inheritance.py diff --git a/py_codegen/test_fixtures/func_not_annotated.py b/py_type_extractor/test_fixtures/func_not_annotated.py similarity index 100% rename from py_codegen/test_fixtures/func_not_annotated.py rename to py_type_extractor/test_fixtures/func_not_annotated.py diff --git a/py_codegen/test_fixtures/func_return_none.py b/py_type_extractor/test_fixtures/func_return_none.py similarity index 100% rename from py_codegen/test_fixtures/func_return_none.py rename to py_type_extractor/test_fixtures/func_return_none.py diff --git a/py_codegen/test_fixtures/func_with_builtin_type_args.py b/py_type_extractor/test_fixtures/func_with_builtin_type_args.py similarity index 100% rename from py_codegen/test_fixtures/func_with_builtin_type_args.py rename to py_type_extractor/test_fixtures/func_with_builtin_type_args.py diff --git a/py_codegen/test_fixtures/func_with_dict.py b/py_type_extractor/test_fixtures/func_with_dict.py similarity index 100% rename from py_codegen/test_fixtures/func_with_dict.py rename to py_type_extractor/test_fixtures/func_with_dict.py diff --git a/py_codegen/test_fixtures/func_with_list.py b/py_type_extractor/test_fixtures/func_with_list.py similarity index 100% rename from py_codegen/test_fixtures/func_with_list.py rename to py_type_extractor/test_fixtures/func_with_list.py diff --git a/py_codegen/test_fixtures/func_with_literals.py b/py_type_extractor/test_fixtures/func_with_literals.py similarity index 100% rename from py_codegen/test_fixtures/func_with_literals.py rename to py_type_extractor/test_fixtures/func_with_literals.py diff --git a/py_codegen/test_fixtures/func_with_mapping.py b/py_type_extractor/test_fixtures/func_with_mapping.py similarity index 100% rename from py_codegen/test_fixtures/func_with_mapping.py rename to py_type_extractor/test_fixtures/func_with_mapping.py diff --git a/py_codegen/test_fixtures/func_with_simple_generics.py b/py_type_extractor/test_fixtures/func_with_simple_generics.py similarity index 100% rename from py_codegen/test_fixtures/func_with_simple_generics.py rename to py_type_extractor/test_fixtures/func_with_simple_generics.py diff --git a/py_codegen/test_fixtures/func_with_tuple.py b/py_type_extractor/test_fixtures/func_with_tuple.py similarity index 100% rename from py_codegen/test_fixtures/func_with_tuple.py rename to py_type_extractor/test_fixtures/func_with_tuple.py diff --git a/py_codegen/test_fixtures/func_with_typed_dict.py b/py_type_extractor/test_fixtures/func_with_typed_dict.py similarity index 100% rename from py_codegen/test_fixtures/func_with_typed_dict.py rename to py_type_extractor/test_fixtures/func_with_typed_dict.py diff --git a/py_codegen/test_fixtures/generic_classes.py b/py_type_extractor/test_fixtures/generic_classes.py similarity index 100% rename from py_codegen/test_fixtures/generic_classes.py rename to py_type_extractor/test_fixtures/generic_classes.py diff --git a/py_codegen/test_fixtures/new_type.py b/py_type_extractor/test_fixtures/new_type.py similarity index 100% rename from py_codegen/test_fixtures/new_type.py rename to py_type_extractor/test_fixtures/new_type.py diff --git a/py_codegen/test_fixtures/pydantic_classes.py b/py_type_extractor/test_fixtures/pydantic_classes.py similarity index 100% rename from py_codegen/test_fixtures/pydantic_classes.py rename to py_type_extractor/test_fixtures/pydantic_classes.py diff --git a/py_codegen/test_fixtures/union_type_class.py b/py_type_extractor/test_fixtures/union_type_class.py similarity index 100% rename from py_codegen/test_fixtures/union_type_class.py rename to py_type_extractor/test_fixtures/union_type_class.py diff --git a/py_codegen/test_fixtures/various_classes.py b/py_type_extractor/test_fixtures/various_classes.py similarity index 100% rename from py_codegen/test_fixtures/various_classes.py rename to py_type_extractor/test_fixtures/various_classes.py diff --git a/py_codegen/type_extractor/__base__.py b/py_type_extractor/type_extractor/__base__.py similarity index 87% rename from py_codegen/type_extractor/__base__.py rename to py_type_extractor/type_extractor/__base__.py index df054f8..0c8cc10 100644 --- a/py_codegen/type_extractor/__base__.py +++ b/py_type_extractor/type_extractor/__base__.py @@ -1,7 +1,7 @@ from abc import ABC from typing import Dict, Union, List, Set, Optional -from py_codegen.type_extractor.nodes.BaseNodeType import NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType, BaseOption class BaseTypeExtractor(ABC): diff --git a/py_codegen/type_extractor/__init__.py b/py_type_extractor/type_extractor/__init__.py similarity index 100% rename from py_codegen/type_extractor/__init__.py rename to py_type_extractor/type_extractor/__init__.py diff --git a/py_codegen/type_extractor/__tests__/__init__.py b/py_type_extractor/type_extractor/__tests__/__init__.py similarity index 100% rename from py_codegen/type_extractor/__tests__/__init__.py rename to py_type_extractor/type_extractor/__tests__/__init__.py diff --git a/py_codegen/type_extractor/__tests__/test_circular_dep_classes.py b/py_type_extractor/type_extractor/__tests__/test_circular_dep_classes.py similarity index 100% rename from py_codegen/type_extractor/__tests__/test_circular_dep_classes.py rename to py_type_extractor/type_extractor/__tests__/test_circular_dep_classes.py diff --git a/py_codegen/type_extractor/__tests__/test_class_of_generic_instance.py b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py similarity index 73% rename from py_codegen/type_extractor/__tests__/test_class_of_generic_instance.py rename to py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py index 00934e2..d5de1ad 100644 --- a/py_codegen/type_extractor/__tests__/test_class_of_generic_instance.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py @@ -1,14 +1,14 @@ -from py_codegen.test_fixtures.generic_classes import ( +from py_type_extractor.test_fixtures.generic_classes import ( some_func_with_generic_inst, SomeTypeVarA, SomeTypeVarB, ) -from py_codegen.type_extractor.__tests__.utils import traverse, cleanup -from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.nodes.FixedGenericFound import FixedGenericFound -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -from py_codegen.type_extractor.nodes.TypeVarFound import TypeVarFound -from py_codegen.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound +from py_type_extractor.type_extractor.type_extractor import TypeExtractor # noinspection PyPep8Naming diff --git a/py_codegen/type_extractor/__tests__/test_class_of_generic_origin.py b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py similarity index 70% rename from py_codegen/type_extractor/__tests__/test_class_of_generic_origin.py rename to py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py index b0c23d9..de00e84 100644 --- a/py_codegen/type_extractor/__tests__/test_class_of_generic_origin.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py @@ -1,12 +1,12 @@ -from py_codegen.test_fixtures.generic_classes import ( +from py_type_extractor.test_fixtures.generic_classes import ( SomeGenericClass, SomeTypeVarA, SomeTypeVarB, ) -from py_codegen.type_extractor.__tests__.utils import traverse, cleanup -from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.nodes.TypeVarFound import TypeVarFound -from py_codegen.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound +from py_type_extractor.type_extractor.type_extractor import TypeExtractor def test_class_of_generic_origin(): diff --git a/py_codegen/type_extractor/__tests__/test_class_with_union_field.py b/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py similarity index 65% rename from py_codegen/type_extractor/__tests__/test_class_with_union_field.py rename to py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py index 0023944..deeb4d5 100644 --- a/py_codegen/type_extractor/__tests__/test_class_with_union_field.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py @@ -1,11 +1,11 @@ from dataclasses import dataclass -from py_codegen.test_fixtures.union_type_class import ClassWithUnionField -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption -from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.nodes.TypeOR import TypeOR -from py_codegen.type_extractor.__tests__.utils import traverse, cleanup -from py_codegen.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.test_fixtures.union_type_class import ClassWithUnionField +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +from py_type_extractor.type_extractor.type_extractor import TypeExtractor @dataclass(frozen=True) diff --git a/py_codegen/type_extractor/__tests__/test_classes_with_inheritance.py b/py_type_extractor/type_extractor/__tests__/test_classes_with_inheritance.py similarity index 73% rename from py_codegen/type_extractor/__tests__/test_classes_with_inheritance.py rename to py_type_extractor/type_extractor/__tests__/test_classes_with_inheritance.py index 0c14832..eaf6bda 100644 --- a/py_codegen/type_extractor/__tests__/test_classes_with_inheritance.py +++ b/py_type_extractor/type_extractor/__tests__/test_classes_with_inheritance.py @@ -1,8 +1,8 @@ -from py_codegen.test_fixtures.classes_with_inheritance import ChildClass +from py_type_extractor.test_fixtures.classes_with_inheritance import ChildClass -from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.__tests__.utils import traverse, cleanup -from py_codegen.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +from py_type_extractor.type_extractor.type_extractor import TypeExtractor def test_classes_with_inheritance(): @@ -41,4 +41,4 @@ def test_classes_with_inheritance(): ], ) } - print(type_extractor) \ No newline at end of file + print(type_extractor) diff --git a/py_codegen/type_extractor/__tests__/test_func_not_annotated.py b/py_type_extractor/type_extractor/__tests__/test_func_not_annotated.py similarity index 60% rename from py_codegen/type_extractor/__tests__/test_func_not_annotated.py rename to py_type_extractor/type_extractor/__tests__/test_func_not_annotated.py index e9cb623..d58f4b1 100644 --- a/py_codegen/type_extractor/__tests__/test_func_not_annotated.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_not_annotated.py @@ -1,8 +1,8 @@ -from py_codegen.type_extractor.__tests__.utils import cleanup, traverse -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -from py_codegen.type_extractor.nodes.UnknownFound import unknown_found -from py_codegen.type_extractor.type_extractor import TypeExtractor -from py_codegen.test_fixtures.func_not_annotated import func_not_annotated +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.UnknownFound import unknown_found +from py_type_extractor.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.test_fixtures.func_not_annotated import func_not_annotated def test_func_not_annotated(): diff --git a/py_codegen/type_extractor/__tests__/test_func_with_arg_class.py b/py_type_extractor/type_extractor/__tests__/test_func_with_arg_class.py similarity index 74% rename from py_codegen/type_extractor/__tests__/test_func_with_arg_class.py rename to py_type_extractor/type_extractor/__tests__/test_func_with_arg_class.py index b998c0a..af5fed8 100644 --- a/py_codegen/type_extractor/__tests__/test_func_with_arg_class.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_arg_class.py @@ -1,7 +1,7 @@ -from py_codegen.type_extractor.__tests__.utils import cleanup, traverse -from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -from py_codegen.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.type_extractor import TypeExtractor def test_func_with_arg_class(): diff --git a/py_codegen/type_extractor/__tests__/test_func_with_builtin_type_args.py b/py_type_extractor/type_extractor/__tests__/test_func_with_builtin_type_args.py similarity index 67% rename from py_codegen/type_extractor/__tests__/test_func_with_builtin_type_args.py rename to py_type_extractor/type_extractor/__tests__/test_func_with_builtin_type_args.py index 349864c..50268dc 100644 --- a/py_codegen/type_extractor/__tests__/test_func_with_builtin_type_args.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_builtin_type_args.py @@ -1,7 +1,7 @@ -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -from py_codegen.type_extractor.__tests__.utils import cleanup -from py_codegen.type_extractor.type_extractor import TypeExtractor -from py_codegen.test_fixtures.func_with_builtin_type_args \ +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.__tests__.utils import cleanup +from py_type_extractor.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.test_fixtures.func_with_builtin_type_args \ import func_with_builtin_args diff --git a/py_codegen/type_extractor/__tests__/test_func_with_dict.py b/py_type_extractor/type_extractor/__tests__/test_func_with_dict.py similarity index 54% rename from py_codegen/type_extractor/__tests__/test_func_with_dict.py rename to py_type_extractor/type_extractor/__tests__/test_func_with_dict.py index 9644d3a..2c720a0 100644 --- a/py_codegen/type_extractor/__tests__/test_func_with_dict.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_dict.py @@ -1,9 +1,9 @@ -from py_codegen.type_extractor.__tests__.utils import cleanup, traverse -from py_codegen.type_extractor.nodes.DictFound import DictFound -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -from py_codegen.type_extractor.nodes.UnknownFound import unknown_found -from py_codegen.type_extractor.type_extractor import TypeExtractor -from py_codegen.test_fixtures.func_with_dict import func_with_dict +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.type_extractor.nodes.DictFound import DictFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.UnknownFound import unknown_found +from py_type_extractor.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.test_fixtures.func_with_dict import func_with_dict def test_func_with_dict(): diff --git a/py_codegen/type_extractor/__tests__/test_func_with_list.py b/py_type_extractor/type_extractor/__tests__/test_func_with_list.py similarity index 64% rename from py_codegen/type_extractor/__tests__/test_func_with_list.py rename to py_type_extractor/type_extractor/__tests__/test_func_with_list.py index 57594bd..ba6c916 100644 --- a/py_codegen/type_extractor/__tests__/test_func_with_list.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_list.py @@ -1,11 +1,11 @@ from dataclasses import dataclass -from py_codegen.type_extractor.__tests__.utils import cleanup, traverse -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -from py_codegen.type_extractor.nodes.ListFound import ListFound -from py_codegen.type_extractor.type_extractor import TypeExtractor -from py_codegen.test_fixtures.func_with_list import func_with_list +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.ListFound import ListFound +from py_type_extractor.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.test_fixtures.func_with_list import func_with_list @dataclass(frozen=True) diff --git a/py_codegen/type_extractor/__tests__/test_func_with_literals.py b/py_type_extractor/type_extractor/__tests__/test_func_with_literals.py similarity index 76% rename from py_codegen/type_extractor/__tests__/test_func_with_literals.py rename to py_type_extractor/type_extractor/__tests__/test_func_with_literals.py index 01ee2ce..3fe2474 100644 --- a/py_codegen/type_extractor/__tests__/test_func_with_literals.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_literals.py @@ -1,9 +1,9 @@ -from py_codegen.type_extractor.__tests__.utils import cleanup, traverse -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -from py_codegen.type_extractor.nodes.LiteralFound import LiteralFound -from py_codegen.type_extractor.nodes.TypeOR import TypeOR -from py_codegen.type_extractor.type_extractor import TypeExtractor -from py_codegen.test_fixtures.func_with_literals import func_with_literals +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.LiteralFound import LiteralFound +from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR +from py_type_extractor.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.test_fixtures.func_with_literals import func_with_literals def test_func_with_list(): diff --git a/py_codegen/type_extractor/__tests__/test_func_with_mapping.py b/py_type_extractor/type_extractor/__tests__/test_func_with_mapping.py similarity index 57% rename from py_codegen/type_extractor/__tests__/test_func_with_mapping.py rename to py_type_extractor/type_extractor/__tests__/test_func_with_mapping.py index 1ce637a..80262af 100644 --- a/py_codegen/type_extractor/__tests__/test_func_with_mapping.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_mapping.py @@ -1,8 +1,8 @@ -from py_codegen.type_extractor.__tests__.utils import cleanup, traverse -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -from py_codegen.type_extractor.nodes.MappingFound import MappingFound -from py_codegen.type_extractor.type_extractor import TypeExtractor -from py_codegen.test_fixtures.func_with_mapping import func_with_mapping +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.MappingFound import MappingFound +from py_type_extractor.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.test_fixtures.func_with_mapping import func_with_mapping def test_func_with_tuple(): diff --git a/py_codegen/type_extractor/__tests__/test_func_with_nested_arg_class.py b/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py similarity index 82% rename from py_codegen/type_extractor/__tests__/test_func_with_nested_arg_class.py rename to py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py index 5af5a5f..7dd3497 100644 --- a/py_codegen/type_extractor/__tests__/test_func_with_nested_arg_class.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py @@ -1,8 +1,8 @@ from collections import OrderedDict -from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.__tests__.utils import traverse, cleanup -from py_codegen.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +from py_type_extractor.type_extractor.type_extractor import TypeExtractor def test_func_with_nested_arg_class(): diff --git a/py_codegen/type_extractor/__tests__/test_func_with_tuple.py b/py_type_extractor/type_extractor/__tests__/test_func_with_tuple.py similarity index 58% rename from py_codegen/type_extractor/__tests__/test_func_with_tuple.py rename to py_type_extractor/type_extractor/__tests__/test_func_with_tuple.py index f320041..ccbb27c 100644 --- a/py_codegen/type_extractor/__tests__/test_func_with_tuple.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_tuple.py @@ -1,8 +1,8 @@ -from py_codegen.type_extractor.__tests__.utils import cleanup, traverse -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -from py_codegen.type_extractor.nodes.TupleFound import TupleFound -from py_codegen.type_extractor.type_extractor import TypeExtractor -from py_codegen.test_fixtures.func_with_tuple import func_with_tuple +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.TupleFound import TupleFound +from py_type_extractor.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.test_fixtures.func_with_tuple import func_with_tuple def test_func_with_tuple(): diff --git a/py_codegen/type_extractor/__tests__/test_func_with_typed_dict.py b/py_type_extractor/type_extractor/__tests__/test_func_with_typed_dict.py similarity index 72% rename from py_codegen/type_extractor/__tests__/test_func_with_typed_dict.py rename to py_type_extractor/type_extractor/__tests__/test_func_with_typed_dict.py index d58ae14..b2ba87b 100644 --- a/py_codegen/type_extractor/__tests__/test_func_with_typed_dict.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_typed_dict.py @@ -1,9 +1,9 @@ -from py_codegen.test_fixtures.func_with_typed_dict import func_with_typed_dict -from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -from py_codegen.type_extractor.nodes.TypedDictFound import TypedDictFound -from py_codegen.type_extractor.type_extractor import TypeExtractor -from py_codegen.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.test_fixtures.func_with_typed_dict import func_with_typed_dict +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.TypedDictFound import TypedDictFound +from py_type_extractor.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse def test_func_with_typed_dict(): diff --git a/py_codegen/type_extractor/__tests__/test_newtype.py b/py_type_extractor/type_extractor/__tests__/test_newtype.py similarity index 64% rename from py_codegen/type_extractor/__tests__/test_newtype.py rename to py_type_extractor/type_extractor/__tests__/test_newtype.py index 4ad3cbb..5d02be1 100644 --- a/py_codegen/type_extractor/__tests__/test_newtype.py +++ b/py_type_extractor/type_extractor/__tests__/test_newtype.py @@ -1,13 +1,13 @@ -from py_codegen.test_fixtures.new_type import ( +from py_type_extractor.test_fixtures.new_type import ( name_by_id, SomeClassInNewType, ) -from py_codegen.type_extractor.__tests__.utils import traverse, cleanup -from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -from py_codegen.type_extractor.nodes.NewType import NewTypeFound -from py_codegen.type_extractor.nodes.TypeVarFound import TypeVarFound -from py_codegen.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.NewType import NewTypeFound +from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound +from py_type_extractor.type_extractor.type_extractor import TypeExtractor def test_newtype(): diff --git a/py_codegen/type_extractor/__tests__/test_pydantic_classes.py b/py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py similarity index 70% rename from py_codegen/type_extractor/__tests__/test_pydantic_classes.py rename to py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py index 83cd77c..db68de2 100644 --- a/py_codegen/type_extractor/__tests__/test_pydantic_classes.py +++ b/py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py @@ -1,10 +1,10 @@ from pydantic import BaseModel -from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.__tests__.utils import traverse, cleanup -from py_codegen.type_extractor.nodes.DictFound import DictFound -from py_codegen.type_extractor.type_extractor import TypeExtractor -from py_codegen.test_fixtures.pydantic_classes import ( +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +from py_type_extractor.type_extractor.nodes.DictFound import DictFound +from py_type_extractor.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.test_fixtures.pydantic_classes import ( SomePydanticDataClass, SomePydanticModelClass, ) diff --git a/py_codegen/type_extractor/__tests__/test_various_classes.py b/py_type_extractor/type_extractor/__tests__/test_various_classes.py similarity index 75% rename from py_codegen/type_extractor/__tests__/test_various_classes.py rename to py_type_extractor/type_extractor/__tests__/test_various_classes.py index 2862432..4bb9380 100644 --- a/py_codegen/type_extractor/__tests__/test_various_classes.py +++ b/py_type_extractor/type_extractor/__tests__/test_various_classes.py @@ -1,8 +1,8 @@ -from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.__tests__.utils import traverse, cleanup -from py_codegen.type_extractor.nodes.DictFound import DictFound -from py_codegen.type_extractor.type_extractor import TypeExtractor -from py_codegen.test_fixtures.various_classes import ( +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +from py_type_extractor.type_extractor.nodes.DictFound import DictFound +from py_type_extractor.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.test_fixtures.various_classes import ( SomeDataClass, SomeNamedTuple, SomeNormalClass, diff --git a/py_codegen/type_extractor/__tests__/utils.py b/py_type_extractor/type_extractor/__tests__/utils.py similarity index 84% rename from py_codegen/type_extractor/__tests__/utils.py rename to py_type_extractor/type_extractor/__tests__/utils.py index c4cb884..f6a603c 100644 --- a/py_codegen/type_extractor/__tests__/utils.py +++ b/py_type_extractor/type_extractor/__tests__/utils.py @@ -2,14 +2,14 @@ from copy import deepcopy, copy from typing import Callable -from py_codegen.type_extractor.nodes.BaseNodeType import NodeType -from py_codegen.type_extractor.nodes.FixedGenericFound import FixedGenericFound -from py_codegen.type_extractor.nodes.NewType import NewTypeFound -from py_codegen.type_extractor.nodes.TypeVarFound import TypeVarFound -from py_codegen.type_extractor.nodes.TypedDictFound import TypedDictFound -from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound -from py_codegen.type_extractor.nodes.TypeOR import TypeOR +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType +from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_type_extractor.type_extractor.nodes.NewType import NewTypeFound +from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound +from py_type_extractor.type_extractor.nodes.TypedDictFound import TypedDictFound +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR traverse_func_type = Callable[ diff --git a/py_codegen/type_extractor/errors/DuplicateNameFound.py b/py_type_extractor/type_extractor/errors/DuplicateNameFound.py similarity index 66% rename from py_codegen/type_extractor/errors/DuplicateNameFound.py rename to py_type_extractor/type_extractor/errors/DuplicateNameFound.py index 7b18b48..de74b85 100644 --- a/py_codegen/type_extractor/errors/DuplicateNameFound.py +++ b/py_type_extractor/type_extractor/errors/DuplicateNameFound.py @@ -1,4 +1,4 @@ -from py_codegen.type_extractor.nodes.BaseNodeType import NodeType +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType class DuplicateNameFound(Exception): diff --git a/py_codegen/type_extractor/errors/__init__.py b/py_type_extractor/type_extractor/errors/__init__.py similarity index 100% rename from py_codegen/type_extractor/errors/__init__.py rename to py_type_extractor/type_extractor/errors/__init__.py diff --git a/py_codegen/type_extractor/middlewares/TypeVar.py b/py_type_extractor/type_extractor/middlewares/TypeVar.py similarity index 61% rename from py_codegen/type_extractor/middlewares/TypeVar.py rename to py_type_extractor/type_extractor/middlewares/TypeVar.py index 04deff4..e98cb19 100644 --- a/py_codegen/type_extractor/middlewares/TypeVar.py +++ b/py_type_extractor/type_extractor/middlewares/TypeVar.py @@ -1,9 +1,9 @@ import typing_inspect from typing import Set -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption -from py_codegen.type_extractor.nodes.TypeVarFound import TypeVarFound +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound def typevar_found_middleware( @@ -17,4 +17,4 @@ def typevar_found_middleware( return TypeVarFound( name=_typevar.__name__, original=_typevar, - ) \ No newline at end of file + ) diff --git a/py_codegen/type_extractor/middlewares/__common__.py b/py_type_extractor/type_extractor/middlewares/__common__.py similarity index 100% rename from py_codegen/type_extractor/middlewares/__common__.py rename to py_type_extractor/type_extractor/middlewares/__common__.py diff --git a/py_codegen/type_extractor/middlewares/__init__.py b/py_type_extractor/type_extractor/middlewares/__init__.py similarity index 100% rename from py_codegen/type_extractor/middlewares/__init__.py rename to py_type_extractor/type_extractor/middlewares/__init__.py diff --git a/py_codegen/type_extractor/middlewares/class_found.py b/py_type_extractor/type_extractor/middlewares/class_found.py similarity index 87% rename from py_codegen/type_extractor/middlewares/class_found.py rename to py_type_extractor/type_extractor/middlewares/class_found.py index bbf05f6..937a0cb 100644 --- a/py_codegen/type_extractor/middlewares/class_found.py +++ b/py_type_extractor/type_extractor/middlewares/class_found.py @@ -6,10 +6,10 @@ from mypy_extensions import _TypedDictMeta # type: ignore from typing import Set, Dict, cast, List, Generic -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption -from py_codegen.type_extractor.nodes.ClassFound import ClassFound -from py_codegen.type_extractor.utils import is_builtin +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.utils import is_builtin def class_found_middleware( diff --git a/py_codegen/type_extractor/middlewares/dict_found.py b/py_type_extractor/type_extractor/middlewares/dict_found.py similarity index 63% rename from py_codegen/type_extractor/middlewares/dict_found.py rename to py_type_extractor/type_extractor/middlewares/dict_found.py index 50357c7..c2cc2df 100644 --- a/py_codegen/type_extractor/middlewares/dict_found.py +++ b/py_type_extractor/type_extractor/middlewares/dict_found.py @@ -1,10 +1,10 @@ from typing import Dict, Set -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption -from py_codegen.type_extractor.nodes.DictFound import DictFound -from py_codegen.type_extractor.nodes.UnknownFound import unknown_found +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.DictFound import DictFound +from py_type_extractor.type_extractor.nodes.UnknownFound import unknown_found def dict_found_middleware( @@ -28,4 +28,4 @@ def dict_found_middleware( return DictFound( key=processed_key_typ, value=processed_value_typ, - ) \ No newline at end of file + ) diff --git a/py_codegen/type_extractor/middlewares/fixed_generic_found.py b/py_type_extractor/type_extractor/middlewares/fixed_generic_found.py similarity index 76% rename from py_codegen/type_extractor/middlewares/fixed_generic_found.py rename to py_type_extractor/type_extractor/middlewares/fixed_generic_found.py index 9e0034d..87122f5 100644 --- a/py_codegen/type_extractor/middlewares/fixed_generic_found.py +++ b/py_type_extractor/type_extractor/middlewares/fixed_generic_found.py @@ -1,9 +1,9 @@ from typing import Dict, Set import typing_inspect -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.nodes.FixedGenericFound import FixedGenericFound -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption def fixed_generic_found_middleware( diff --git a/py_codegen/type_extractor/middlewares/function_found.py b/py_type_extractor/type_extractor/middlewares/function_found.py similarity index 85% rename from py_codegen/type_extractor/middlewares/function_found.py rename to py_type_extractor/type_extractor/middlewares/function_found.py index 38af3a5..9ecc0fc 100644 --- a/py_codegen/type_extractor/middlewares/function_found.py +++ b/py_type_extractor/type_extractor/middlewares/function_found.py @@ -2,9 +2,9 @@ from typing import Set -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption -from py_codegen.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound def func_found_middleware( diff --git a/py_codegen/type_extractor/middlewares/list_found.py b/py_type_extractor/type_extractor/middlewares/list_found.py similarity index 50% rename from py_codegen/type_extractor/middlewares/list_found.py rename to py_type_extractor/type_extractor/middlewares/list_found.py index 57a7ff4..508bc4d 100644 --- a/py_codegen/type_extractor/middlewares/list_found.py +++ b/py_type_extractor/type_extractor/middlewares/list_found.py @@ -1,9 +1,9 @@ from typing import List, Set -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption -from py_codegen.type_extractor.nodes.ListFound import ListFound +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.ListFound import ListFound def list_found_middleware( @@ -16,4 +16,4 @@ def list_found_middleware( return typ_args = get_typ_args(typ) processed_typ = type_extractor.rawtype_to_node(typ_args[0]) - return ListFound(typ=processed_typ) \ No newline at end of file + return ListFound(typ=processed_typ) diff --git a/py_codegen/type_extractor/middlewares/literal_found.py b/py_type_extractor/type_extractor/middlewares/literal_found.py similarity index 69% rename from py_codegen/type_extractor/middlewares/literal_found.py rename to py_type_extractor/type_extractor/middlewares/literal_found.py index cd9c297..8bf9eaa 100644 --- a/py_codegen/type_extractor/middlewares/literal_found.py +++ b/py_type_extractor/type_extractor/middlewares/literal_found.py @@ -1,11 +1,11 @@ from typing import Tuple, Set from typing_extensions import Literal -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption -from py_codegen.type_extractor.nodes.LiteralFound import LiteralFound -from py_codegen.type_extractor.nodes.TypeOR import TypeOR +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.LiteralFound import LiteralFound +from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR def __is_literal_typ(typ_origin): diff --git a/py_codegen/type_extractor/middlewares/mapping_found.py b/py_type_extractor/type_extractor/middlewares/mapping_found.py similarity index 61% rename from py_codegen/type_extractor/middlewares/mapping_found.py rename to py_type_extractor/type_extractor/middlewares/mapping_found.py index 8277cf9..623ca8a 100644 --- a/py_codegen/type_extractor/middlewares/mapping_found.py +++ b/py_type_extractor/type_extractor/middlewares/mapping_found.py @@ -1,10 +1,10 @@ from collections import abc from typing import Mapping, Set -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption -from py_codegen.type_extractor.nodes.MappingFound import MappingFound +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.MappingFound import MappingFound def mapping_found_middleware( @@ -22,4 +22,4 @@ def mapping_found_middleware( return MappingFound( key=type_key, value=type_value, - ) \ No newline at end of file + ) diff --git a/py_codegen/type_extractor/middlewares/newtype_found.py b/py_type_extractor/type_extractor/middlewares/newtype_found.py similarity index 72% rename from py_codegen/type_extractor/middlewares/newtype_found.py rename to py_type_extractor/type_extractor/middlewares/newtype_found.py index 7a86cdb..3ef8856 100644 --- a/py_codegen/type_extractor/middlewares/newtype_found.py +++ b/py_type_extractor/type_extractor/middlewares/newtype_found.py @@ -1,10 +1,10 @@ import inspect from typing import Set -from py_codegen.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption -from py_codegen.type_extractor.nodes.NewType import NewTypeFound +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.NewType import NewTypeFound def newtype_found_middleware( diff --git a/py_codegen/type_extractor/middlewares/tuple_found.py b/py_type_extractor/type_extractor/middlewares/tuple_found.py similarity index 52% rename from py_codegen/type_extractor/middlewares/tuple_found.py rename to py_type_extractor/type_extractor/middlewares/tuple_found.py index 51a6701..7b700e0 100644 --- a/py_codegen/type_extractor/middlewares/tuple_found.py +++ b/py_type_extractor/type_extractor/middlewares/tuple_found.py @@ -1,9 +1,9 @@ from typing import Tuple, Set -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption -from py_codegen.type_extractor.nodes.TupleFound import TupleFound +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.TupleFound import TupleFound def tuple_found_middleware( @@ -19,4 +19,4 @@ def tuple_found_middleware( type_extractor.rawtype_to_node(param) for param in typ_args ] - return TupleFound(types=processed_typ) \ No newline at end of file + return TupleFound(types=processed_typ) diff --git a/py_codegen/type_extractor/middlewares/type_or.py b/py_type_extractor/type_extractor/middlewares/type_or.py similarity index 57% rename from py_codegen/type_extractor/middlewares/type_or.py rename to py_type_extractor/type_extractor/middlewares/type_or.py index 8132492..1434d5c 100644 --- a/py_codegen/type_extractor/middlewares/type_or.py +++ b/py_type_extractor/type_extractor/middlewares/type_or.py @@ -1,9 +1,9 @@ from typing import Union, Set -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption -from py_codegen.type_extractor.nodes.TypeOR import TypeOR +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR def typeor_middleware( @@ -20,4 +20,4 @@ def typeor_middleware( return TypeOR( a=type_a, b=type_b, - ) \ No newline at end of file + ) diff --git a/py_codegen/type_extractor/middlewares/typeddict_found.py b/py_type_extractor/type_extractor/middlewares/typeddict_found.py similarity index 71% rename from py_codegen/type_extractor/middlewares/typeddict_found.py rename to py_type_extractor/type_extractor/middlewares/typeddict_found.py index 301e5a0..3debad3 100644 --- a/py_codegen/type_extractor/middlewares/typeddict_found.py +++ b/py_type_extractor/type_extractor/middlewares/typeddict_found.py @@ -1,9 +1,9 @@ from mypy_extensions import _TypedDictMeta # type: ignore from typing import Set -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.nodes.BaseNodeType import BaseOption -from py_codegen.type_extractor.nodes.TypedDictFound import TypedDictFound +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.TypedDictFound import TypedDictFound def typeddict_found_middleware( @@ -26,4 +26,4 @@ def typeddict_found_middleware( f"{typ.__qualname__}_{hash(typ)}" ] = typed_dict_found - return typed_dict_found \ No newline at end of file + return typed_dict_found diff --git a/py_codegen/type_extractor/mock_type_extractor.py b/py_type_extractor/type_extractor/mock_type_extractor.py similarity index 79% rename from py_codegen/type_extractor/mock_type_extractor.py rename to py_type_extractor/type_extractor/mock_type_extractor.py index 063b7a6..5979efc 100644 --- a/py_codegen/type_extractor/mock_type_extractor.py +++ b/py_type_extractor/type_extractor/mock_type_extractor.py @@ -1,4 +1,4 @@ -from py_codegen.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor class MockTypeExtractor(BaseTypeExtractor): diff --git a/py_codegen/type_extractor/nodes/BaseNodeType.py b/py_type_extractor/type_extractor/nodes/BaseNodeType.py similarity index 100% rename from py_codegen/type_extractor/nodes/BaseNodeType.py rename to py_type_extractor/type_extractor/nodes/BaseNodeType.py diff --git a/py_codegen/type_extractor/nodes/ClassFound.py b/py_type_extractor/type_extractor/nodes/ClassFound.py similarity index 88% rename from py_codegen/type_extractor/nodes/ClassFound.py rename to py_type_extractor/type_extractor/nodes/ClassFound.py index 8a1278a..739edde 100644 --- a/py_codegen/type_extractor/nodes/ClassFound.py +++ b/py_type_extractor/type_extractor/nodes/ClassFound.py @@ -7,8 +7,8 @@ Set, List, ) -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption -from py_codegen.type_extractor.nodes.TypeVarFound import TypeVarFound +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound @dataclass diff --git a/py_codegen/type_extractor/nodes/DictFound.py b/py_type_extractor/type_extractor/nodes/DictFound.py similarity index 67% rename from py_codegen/type_extractor/nodes/DictFound.py rename to py_type_extractor/type_extractor/nodes/DictFound.py index a28bd50..cbb8950 100644 --- a/py_codegen/type_extractor/nodes/DictFound.py +++ b/py_type_extractor/type_extractor/nodes/DictFound.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Set -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption @dataclass diff --git a/py_codegen/type_extractor/nodes/FixedGenericFound.py b/py_type_extractor/type_extractor/nodes/FixedGenericFound.py similarity index 56% rename from py_codegen/type_extractor/nodes/FixedGenericFound.py rename to py_type_extractor/type_extractor/nodes/FixedGenericFound.py index 6c3c0b1..4b01439 100644 --- a/py_codegen/type_extractor/nodes/FixedGenericFound.py +++ b/py_type_extractor/type_extractor/nodes/FixedGenericFound.py @@ -1,10 +1,10 @@ from dataclasses import dataclass from typing import List -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType @dataclass class FixedGenericFound(BaseNodeType): type_vars: List[NodeType] - origin: NodeType \ No newline at end of file + origin: NodeType diff --git a/py_codegen/type_extractor/nodes/FunctionFound.py b/py_type_extractor/type_extractor/nodes/FunctionFound.py similarity index 95% rename from py_codegen/type_extractor/nodes/FunctionFound.py rename to py_type_extractor/type_extractor/nodes/FunctionFound.py index 56fbf89..fe70f77 100644 --- a/py_codegen/type_extractor/nodes/FunctionFound.py +++ b/py_type_extractor/type_extractor/nodes/FunctionFound.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Callable, Any, Optional, Dict, Set -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption @dataclass diff --git a/py_codegen/type_extractor/nodes/ListFound.py b/py_type_extractor/type_extractor/nodes/ListFound.py similarity index 67% rename from py_codegen/type_extractor/nodes/ListFound.py rename to py_type_extractor/type_extractor/nodes/ListFound.py index 9dbaeef..60444e2 100644 --- a/py_codegen/type_extractor/nodes/ListFound.py +++ b/py_type_extractor/type_extractor/nodes/ListFound.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Set -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption @dataclass diff --git a/py_codegen/type_extractor/nodes/LiteralFound.py b/py_type_extractor/type_extractor/nodes/LiteralFound.py similarity index 69% rename from py_codegen/type_extractor/nodes/LiteralFound.py rename to py_type_extractor/type_extractor/nodes/LiteralFound.py index b666e17..8d311e0 100644 --- a/py_codegen/type_extractor/nodes/LiteralFound.py +++ b/py_type_extractor/type_extractor/nodes/LiteralFound.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Any, Set -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, BaseOption @dataclass diff --git a/py_codegen/type_extractor/nodes/MappingFound.py b/py_type_extractor/type_extractor/nodes/MappingFound.py similarity index 69% rename from py_codegen/type_extractor/nodes/MappingFound.py rename to py_type_extractor/type_extractor/nodes/MappingFound.py index 31b51e2..4dc7ccc 100644 --- a/py_codegen/type_extractor/nodes/MappingFound.py +++ b/py_type_extractor/type_extractor/nodes/MappingFound.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Set -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption @dataclass diff --git a/py_codegen/type_extractor/nodes/NewType.py b/py_type_extractor/type_extractor/nodes/NewType.py similarity index 61% rename from py_codegen/type_extractor/nodes/NewType.py rename to py_type_extractor/type_extractor/nodes/NewType.py index b53b471..8e89bda 100644 --- a/py_codegen/type_extractor/nodes/NewType.py +++ b/py_type_extractor/type_extractor/nodes/NewType.py @@ -1,7 +1,7 @@ from dataclasses import dataclass from typing import List -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType @dataclass diff --git a/py_codegen/type_extractor/nodes/NoneNode.py b/py_type_extractor/type_extractor/nodes/NoneNode.py similarity index 82% rename from py_codegen/type_extractor/nodes/NoneNode.py rename to py_type_extractor/type_extractor/nodes/NoneNode.py index 35beca4..efc33b0 100644 --- a/py_codegen/type_extractor/nodes/NoneNode.py +++ b/py_type_extractor/type_extractor/nodes/NoneNode.py @@ -1,6 +1,6 @@ from typing import Set -from py_codegen.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor from .BaseNodeType import BaseNodeType, BaseOption diff --git a/py_codegen/type_extractor/nodes/TupleFound.py b/py_type_extractor/type_extractor/nodes/TupleFound.py similarity index 59% rename from py_codegen/type_extractor/nodes/TupleFound.py rename to py_type_extractor/type_extractor/nodes/TupleFound.py index 53479a8..e1e0903 100644 --- a/py_codegen/type_extractor/nodes/TupleFound.py +++ b/py_type_extractor/type_extractor/nodes/TupleFound.py @@ -1,7 +1,7 @@ from dataclasses import dataclass from typing import List -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType @dataclass diff --git a/py_codegen/type_extractor/nodes/TypeOR.py b/py_type_extractor/type_extractor/nodes/TypeOR.py similarity index 100% rename from py_codegen/type_extractor/nodes/TypeOR.py rename to py_type_extractor/type_extractor/nodes/TypeOR.py diff --git a/py_codegen/type_extractor/nodes/TypeVarFound.py b/py_type_extractor/type_extractor/nodes/TypeVarFound.py similarity index 69% rename from py_codegen/type_extractor/nodes/TypeVarFound.py rename to py_type_extractor/type_extractor/nodes/TypeVarFound.py index d076049..35977ab 100644 --- a/py_codegen/type_extractor/nodes/TypeVarFound.py +++ b/py_type_extractor/type_extractor/nodes/TypeVarFound.py @@ -1,7 +1,7 @@ from dataclasses import dataclass from typing import Set, Dict, List, Optional, TypeVar, Any # -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption @dataclass diff --git a/py_codegen/type_extractor/nodes/TypedDictFound.py b/py_type_extractor/type_extractor/nodes/TypedDictFound.py similarity index 81% rename from py_codegen/type_extractor/nodes/TypedDictFound.py rename to py_type_extractor/type_extractor/nodes/TypedDictFound.py index 774587b..a3ec8e1 100644 --- a/py_codegen/type_extractor/nodes/TypedDictFound.py +++ b/py_type_extractor/type_extractor/nodes/TypedDictFound.py @@ -4,7 +4,7 @@ # from mypy_extensions import _TypedDictMeta # type: ignore -from py_codegen.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption @dataclass diff --git a/py_codegen/type_extractor/nodes/UnknownFound.py b/py_type_extractor/type_extractor/nodes/UnknownFound.py similarity index 100% rename from py_codegen/type_extractor/nodes/UnknownFound.py rename to py_type_extractor/type_extractor/nodes/UnknownFound.py diff --git a/py_codegen/type_extractor/nodes/__init__.py b/py_type_extractor/type_extractor/nodes/__init__.py similarity index 100% rename from py_codegen/type_extractor/nodes/__init__.py rename to py_type_extractor/type_extractor/nodes/__init__.py diff --git a/py_codegen/type_extractor/nodes/utils/__init__.py b/py_type_extractor/type_extractor/nodes/utils/__init__.py similarity index 100% rename from py_codegen/type_extractor/nodes/utils/__init__.py rename to py_type_extractor/type_extractor/nodes/utils/__init__.py diff --git a/py_codegen/type_extractor/nodes/utils/strip_margin.py b/py_type_extractor/type_extractor/nodes/utils/strip_margin.py similarity index 100% rename from py_codegen/type_extractor/nodes/utils/strip_margin.py rename to py_type_extractor/type_extractor/nodes/utils/strip_margin.py diff --git a/py_codegen/type_extractor/type_extractor.py b/py_type_extractor/type_extractor/type_extractor.py similarity index 62% rename from py_codegen/type_extractor/type_extractor.py rename to py_type_extractor/type_extractor/type_extractor.py index 345209e..f86e3b4 100644 --- a/py_codegen/type_extractor/type_extractor.py +++ b/py_type_extractor/type_extractor/type_extractor.py @@ -11,22 +11,22 @@ Any, Set, Optional) -from py_codegen.type_extractor.__base__ import BaseTypeExtractor -from py_codegen.type_extractor.middlewares.class_found import class_found_middleware -from py_codegen.type_extractor.middlewares.dict_found import dict_found_middleware -from py_codegen.type_extractor.middlewares.fixed_generic_found import fixed_generic_found_middleware -from py_codegen.type_extractor.middlewares.function_found import func_found_middleware -from py_codegen.type_extractor.middlewares.list_found import list_found_middleware -from py_codegen.type_extractor.middlewares.literal_found import literal_found_middleware -from py_codegen.type_extractor.middlewares.mapping_found import mapping_found_middleware -from py_codegen.type_extractor.middlewares.newtype_found import newtype_found_middleware -from py_codegen.type_extractor.middlewares.tuple_found import tuple_found_middleware -from py_codegen.type_extractor.middlewares.type_or import typeor_middleware -from py_codegen.type_extractor.nodes.BaseNodeType import NodeType, BaseNodeType, BaseOption -from py_codegen.type_extractor.nodes.NoneNode import none_node_middleware -from py_codegen.type_extractor.middlewares.typeddict_found import typeddict_found_middleware -from py_codegen.type_extractor.middlewares.TypeVar import typevar_found_middleware -from py_codegen.type_extractor.nodes.UnknownFound import unknown_found +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.middlewares.class_found import class_found_middleware +from py_type_extractor.type_extractor.middlewares.dict_found import dict_found_middleware +from py_type_extractor.type_extractor.middlewares.fixed_generic_found import fixed_generic_found_middleware +from py_type_extractor.type_extractor.middlewares.function_found import func_found_middleware +from py_type_extractor.type_extractor.middlewares.list_found import list_found_middleware +from py_type_extractor.type_extractor.middlewares.literal_found import literal_found_middleware +from py_type_extractor.type_extractor.middlewares.mapping_found import mapping_found_middleware +from py_type_extractor.type_extractor.middlewares.newtype_found import newtype_found_middleware +from py_type_extractor.type_extractor.middlewares.tuple_found import tuple_found_middleware +from py_type_extractor.type_extractor.middlewares.type_or import typeor_middleware +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType, BaseNodeType, BaseOption +from py_type_extractor.type_extractor.nodes.NoneNode import none_node_middleware +from py_type_extractor.type_extractor.middlewares.typeddict_found import typeddict_found_middleware +from py_type_extractor.type_extractor.middlewares.TypeVar import typevar_found_middleware +from py_type_extractor.type_extractor.nodes.UnknownFound import unknown_found def is_builtin(typ): diff --git a/py_codegen/type_extractor/utils.py b/py_type_extractor/type_extractor/utils.py similarity index 100% rename from py_codegen/type_extractor/utils.py rename to py_type_extractor/type_extractor/utils.py diff --git a/setup.py b/setup.py index e7bd26a..44ed453 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ long_description = fh.read() setuptools.setup( - name='py_codegen', + name='py_type_extractor', version='0.0.1', author="Dev Doomari", author_email="devdoomari@gmail.com", From fbacfe8137bac77eff41fbbab258f9f3e26db2c4 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Sat, 8 Aug 2020 21:25:51 +0900 Subject: [PATCH 12/34] use module names to prevent same name duplicate errors --- .../__tests__/test_class_of_generic_instance.py | 8 ++++++-- .../__tests__/test_class_of_generic_origin.py | 2 +- .../__tests__/test_class_with_union_field.py | 2 +- .../__tests__/test_classes_with_inheritance.py | 6 +++--- .../__tests__/test_func_with_nested_arg_class.py | 9 +++++++-- .../type_extractor/__tests__/test_newtype.py | 2 +- .../__tests__/test_pydantic_classes.py | 15 ++++++++------- .../__tests__/test_various_classes.py | 6 +++--- .../type_extractor/middlewares/class_found.py | 13 +++++++++---- 9 files changed, 39 insertions(+), 24 deletions(-) diff --git a/py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py index d5de1ad..2054368 100644 --- a/py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py @@ -46,9 +46,13 @@ def test_class_of_generic_instance(): 'some_property': int, } ) - assert collected_types['SomeGenericClass'] == some_generic_class + assert collected_types[ + 'py_type_extractor.test_fixtures.generic_classes.SomeGenericClass' + ] == some_generic_class - assert collected_types['SomeClass'] == some_class + assert collected_types[ + 'py_type_extractor.test_fixtures.generic_classes.SomeClass' + ] == some_class assert collected_types['some_func_with_generic_inst'] == FunctionFound( name='some_func_with_generic_inst', diff --git a/py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py index de00e84..0e501e4 100644 --- a/py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py @@ -26,7 +26,7 @@ def test_class_of_generic_origin(): original=SomeTypeVarB, ) assert classes == { - 'SomeGenericClass': ClassFound( + 'py_type_extractor.test_fixtures.generic_classes.SomeGenericClass': ClassFound( name='SomeGenericClass', fields={ 'a': typevar_A, diff --git a/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py b/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py index deeb4d5..377600b 100644 --- a/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py @@ -25,7 +25,7 @@ def test_class_with_union_field(): if isinstance(value, ClassFound) } assert classes == { - 'ClassWithUnionField': ClassFound( + 'py_type_extractor.test_fixtures.union_type_class.ClassWithUnionField': ClassFound( name='ClassWithUnionField', fields={ 'cwufField1': TypeOR( diff --git a/py_type_extractor/type_extractor/__tests__/test_classes_with_inheritance.py b/py_type_extractor/type_extractor/__tests__/test_classes_with_inheritance.py index eaf6bda..69d1734 100644 --- a/py_type_extractor/type_extractor/__tests__/test_classes_with_inheritance.py +++ b/py_type_extractor/type_extractor/__tests__/test_classes_with_inheritance.py @@ -28,9 +28,9 @@ def test_classes_with_inheritance(): }, ) assert classes == { - 'ParentClassA': parent_class_a, - 'ParentClassB': parent_class_b, - 'ChildClass': ClassFound( + 'py_type_extractor.test_fixtures.classes_with_inheritance.ParentClassA': parent_class_a, + 'py_type_extractor.test_fixtures.classes_with_inheritance.ParentClassB': parent_class_b, + 'py_type_extractor.test_fixtures.classes_with_inheritance.ChildClass': ClassFound( name='ChildClass', fields={ 'b': str, diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py b/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py index 7dd3497..96de46a 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py @@ -19,7 +19,12 @@ class ParentClass: def func_with_nested_arg_class(a: ParentClass) -> ParentClass: return a - cleanedup = traverse(type_collector.collected_types[ParentClass.__name__], cleanup) + cleanedup = traverse( + type_collector.collected_types[ + 'py_type_extractor.type_extractor.__tests__.test_func_with_nested_arg_class.ParentClass' + ], + cleanup, + ) child_class = ClassFound( name='ChildClass', @@ -45,4 +50,4 @@ def func_with_nested_arg_class(a: ParentClass) -> ParentClass: class_raw=ParentClass ) parent_cleaned = traverse(parent_class, cleanup) - assert(parent_cleaned == cleanedup) + assert (parent_cleaned == cleanedup) diff --git a/py_type_extractor/type_extractor/__tests__/test_newtype.py b/py_type_extractor/type_extractor/__tests__/test_newtype.py index 5d02be1..31de950 100644 --- a/py_type_extractor/type_extractor/__tests__/test_newtype.py +++ b/py_type_extractor/type_extractor/__tests__/test_newtype.py @@ -37,7 +37,7 @@ def test_newtype(): }, return_type=str, ), - 'SomeClass': some_class, + 'py_type_extractor.test_fixtures.new_type.SomeClass': some_class, 'SomeClassInNewType': NewTypeFound( name='SomeClassInNewType', actual=some_class, diff --git a/py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py b/py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py index db68de2..c02a985 100644 --- a/py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py +++ b/py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py @@ -1,8 +1,5 @@ -from pydantic import BaseModel - from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup -from py_type_extractor.type_extractor.nodes.DictFound import DictFound from py_type_extractor.type_extractor.type_extractor import TypeExtractor from py_type_extractor.test_fixtures.pydantic_classes import ( SomePydanticDataClass, @@ -10,7 +7,7 @@ ) -def test_various_classes(): +def test_pydantic_classes(): type_extractor = TypeExtractor() type_extractor.add(None)(SomePydanticModelClass) type_extractor.add(None)(SomePydanticDataClass) @@ -21,7 +18,9 @@ def test_various_classes(): for (key, value) in type_extractor.collected_types.items() if isinstance(value, ClassFound) } - assert classes['SomePydanticDataClass'] == ClassFound( + assert classes[ + 'py_type_extractor.test_fixtures.pydantic_classes.SomePydanticDataClass' + ] == ClassFound( name='SomePydanticDataClass', fields={ 'a': int, @@ -29,11 +28,13 @@ def test_various_classes(): }, ) - assert classes['SomePydanticModelClass'] == ClassFound( + assert classes[ + 'py_type_extractor.test_fixtures.pydantic_classes.SomePydanticModelClass' + ] == ClassFound( name='SomePydanticModelClass', fields={ 'c': int, 'something': float, }, - base_classes=[classes['BaseModel']], + base_classes=[classes['pydantic.main.BaseModel']], ) diff --git a/py_type_extractor/type_extractor/__tests__/test_various_classes.py b/py_type_extractor/type_extractor/__tests__/test_various_classes.py index 4bb9380..5bffc39 100644 --- a/py_type_extractor/type_extractor/__tests__/test_various_classes.py +++ b/py_type_extractor/type_extractor/__tests__/test_various_classes.py @@ -21,20 +21,20 @@ def test_various_classes(): if isinstance(value, ClassFound) } assert classes == { - 'SomeDataClass': ClassFound( + 'py_type_extractor.test_fixtures.various_classes.SomeDataClass': ClassFound( name='SomeDataClass', fields={ 'sdcArg1': int, 'sdcArg2': str, }, ), - 'SomeNormalClass': ClassFound( + 'py_type_extractor.test_fixtures.various_classes.SomeNormalClass': ClassFound( name='SomeNormalClass', fields={ 'checklist': DictFound(key=str, value=bool), }, ), - 'SomeNamedTuple': ClassFound( + 'py_type_extractor.test_fixtures.various_classes.SomeNamedTuple': ClassFound( name='SomeNamedTuple', fields={ 'sntArg1': int, diff --git a/py_type_extractor/type_extractor/middlewares/class_found.py b/py_type_extractor/type_extractor/middlewares/class_found.py index 937a0cb..348780b 100644 --- a/py_type_extractor/type_extractor/middlewares/class_found.py +++ b/py_type_extractor/type_extractor/middlewares/class_found.py @@ -23,7 +23,12 @@ def class_found_middleware( or isinstance(_class, _TypedDictMeta): return None - duplicate = type_extractor.collected_types.get(_class.__name__) + module = inspect.getmodule(_class) + module_name = module.__name__ + + name = _class.__name__ + + duplicate = type_extractor.collected_types.get(f"{module_name}.{name}") if duplicate is not None: assert isinstance(duplicate, ClassFound) \ and duplicate.class_raw == _class @@ -41,7 +46,7 @@ def class_found_middleware( ]) argspec = inspect.getfullargspec(_data_class) - module = inspect.getmodule(_class) + filename = module and module.__file__ annotations: Dict = getattr(_class, '__annotations__', argspec.annotations) fields = type_extractor.params_to_nodes(annotations, annotations.keys()) @@ -51,7 +56,7 @@ def class_found_middleware( list(typing_inspect.get_parameters(_class)) ] class_found = ClassFound( - name=_class.__name__, + name=name, class_raw=_class, filePath=filename, base_classes=base_classes, @@ -62,5 +67,5 @@ def class_found_middleware( type_vars=type_vars, ) - type_extractor.collected_types[class_found.name] = class_found + type_extractor.collected_types[f"{module_name}.{name}"] = class_found return class_found From 1eeb3f664b60e513ec5ff6b91ac20213e6f5b925 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Sat, 8 Aug 2020 22:58:54 +0900 Subject: [PATCH 13/34] use class.__qualname__ to prevent duplicate errors on nested classes with same names --- py_type_extractor/plugins/typescript/Converter.py | 4 ++-- .../__tests__/test_func_with_arg_class.py | 2 +- .../__tests__/test_func_with_nested_arg_class.py | 10 +++++++--- .../type_extractor/middlewares/class_found.py | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/py_type_extractor/plugins/typescript/Converter.py b/py_type_extractor/plugins/typescript/Converter.py index f621467..00e381a 100644 --- a/py_type_extractor/plugins/typescript/Converter.py +++ b/py_type_extractor/plugins/typescript/Converter.py @@ -76,9 +76,9 @@ def get_identifier(self, node: NodeType) -> str: if isinstance(node, NoneNode): return 'null' if isinstance(node, ClassFound): - return node.name + return node.name.replace('.', '__') if isinstance(node, FunctionFound): - return node.name + return node.name.replace('.', '__') if isinstance(node, TypedDictFound): return f"I{node.name}" if isinstance(node, TypeOR): diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_arg_class.py b/py_type_extractor/type_extractor/__tests__/test_func_with_arg_class.py index af5fed8..b215f1b 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_arg_class.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_arg_class.py @@ -20,7 +20,7 @@ def func_with_arg_class(a: ArgClass) -> ArgClass: cleanup, ) arg_class_found = ClassFound( - name='ArgClass', + name='test_func_with_arg_class.ArgClass', fields={ 'arg1': str, 'arg2': int, diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py b/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py index 96de46a..0491eed 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py @@ -21,13 +21,17 @@ def func_with_nested_arg_class(a: ParentClass) -> ParentClass: cleanedup = traverse( type_collector.collected_types[ - 'py_type_extractor.type_extractor.__tests__.test_func_with_nested_arg_class.ParentClass' + 'py_type_extractor.type_extractor' + '.__tests__' + '.test_func_with_nested_arg_class' + '.test_func_with_nested_arg_class' + '.ParentClass' ], cleanup, ) child_class = ClassFound( - name='ChildClass', + name='test_func_with_nested_arg_class.ChildClass', fields={ 'return': None, 'carg1': str, @@ -38,7 +42,7 @@ def func_with_nested_arg_class(a: ParentClass) -> ParentClass: class_raw=ChildClass, ) parent_class = ClassFound( - name="ParentClass", + name="test_func_with_nested_arg_class.ParentClass", fields={ 'return': None, 'parg1': str, diff --git a/py_type_extractor/type_extractor/middlewares/class_found.py b/py_type_extractor/type_extractor/middlewares/class_found.py index 348780b..8144df9 100644 --- a/py_type_extractor/type_extractor/middlewares/class_found.py +++ b/py_type_extractor/type_extractor/middlewares/class_found.py @@ -26,7 +26,7 @@ def class_found_middleware( module = inspect.getmodule(_class) module_name = module.__name__ - name = _class.__name__ + name = _class.__qualname__.replace('.', '') duplicate = type_extractor.collected_types.get(f"{module_name}.{name}") if duplicate is not None: From ceb6d82c71eb354ddf6b605911a9b22f9aeea279 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Tue, 11 Aug 2020 17:32:07 +0900 Subject: [PATCH 14/34] add default-args values on func-found --- .../test_fixtures/func_with_builtin_type_args.py | 3 ++- .../__tests__/test_func_with_builtin_type_args.py | 6 ++++-- .../type_extractor/middlewares/function_found.py | 11 +++++++++++ .../type_extractor/nodes/FunctionFound.py | 1 + 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/py_type_extractor/test_fixtures/func_with_builtin_type_args.py b/py_type_extractor/test_fixtures/func_with_builtin_type_args.py index 4a14cb2..d0ed383 100644 --- a/py_type_extractor/test_fixtures/func_with_builtin_type_args.py +++ b/py_type_extractor/test_fixtures/func_with_builtin_type_args.py @@ -1,2 +1,3 @@ -def func_with_builtin_args(a: int) -> int: +def func_with_builtin_args(a: int, b: str = 'hello') -> int: + print(b) return a + 1 diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_builtin_type_args.py b/py_type_extractor/type_extractor/__tests__/test_func_with_builtin_type_args.py index 50268dc..06e4380 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_builtin_type_args.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_builtin_type_args.py @@ -19,11 +19,13 @@ def test_func_with_builtin_type_args(): params={ 'return': int, 'a': int, + 'b': str, }, doc='', return_type=int, # func=None, - filePath=None, - raw_params=None, + default_values={ + 'b': 'hello', + }, )) diff --git a/py_type_extractor/type_extractor/middlewares/function_found.py b/py_type_extractor/type_extractor/middlewares/function_found.py index 9ecc0fc..349f62b 100644 --- a/py_type_extractor/type_extractor/middlewares/function_found.py +++ b/py_type_extractor/type_extractor/middlewares/function_found.py @@ -26,11 +26,22 @@ def func_found_middleware( module = inspect.getmodule(func) filename = module.__file__ params = type_extractor.params_to_nodes(argspec.annotations, argspec.args) + raw_default_values = { + key: getattr(signature.parameters.get(key), 'default', None) + + for key in argspec.args + } + default_values = { + key: value + for (key, value) in raw_default_values.items() + if value is not inspect._empty + } return_type = type_extractor.rawtype_to_node(signature.return_annotation) func_found = FunctionFound( name=func.__name__, filePath=filename, raw_params=argspec.annotations, + default_values=default_values, params=params, doc=func.__doc__ or '', func=func, diff --git a/py_type_extractor/type_extractor/nodes/FunctionFound.py b/py_type_extractor/type_extractor/nodes/FunctionFound.py index fe70f77..e91319f 100644 --- a/py_type_extractor/type_extractor/nodes/FunctionFound.py +++ b/py_type_extractor/type_extractor/nodes/FunctionFound.py @@ -10,6 +10,7 @@ class FunctionFound(BaseNodeType): params: Dict[str, NodeType] return_type: Any func: Optional[Callable] = None + default_values: Dict[str, Any] = field(default_factory=dict) raw_params: Dict[str, Any] = field(default_factory=dict) doc: str = '' filePath: str = '' From 3aea73224534432d80226c54da410a9c7073889e Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Tue, 11 Aug 2020 18:13:31 +0900 Subject: [PATCH 15/34] [ts plugin] func args with default values are treated as Nullable --- .../typescript/__tests__/generate_ts_definitions.py | 2 ++ py_type_extractor/plugins/typescript/__tests__/test.ts | 1 + .../__tests__/ts_fixtures/func_return_none.d.ts | 2 +- .../ts_fixtures/func_with_builtin_type_args.d.ts | 4 ++++ .../plugins/typescript/__tests__/utils.ts | 4 ++-- .../plugins/typescript/middlewares/functions.py | 10 ++++++++-- .../test_fixtures/func_with_builtin_type_args.py | 2 +- 7 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_builtin_type_args.d.ts diff --git a/py_type_extractor/plugins/typescript/__tests__/generate_ts_definitions.py b/py_type_extractor/plugins/typescript/__tests__/generate_ts_definitions.py index 8b8f5bc..48fe2aa 100644 --- a/py_type_extractor/plugins/typescript/__tests__/generate_ts_definitions.py +++ b/py_type_extractor/plugins/typescript/__tests__/generate_ts_definitions.py @@ -1,6 +1,7 @@ from typing import Callable from py_type_extractor.plugins.typescript.Converter import TypescriptConverter +from py_type_extractor.test_fixtures.func_with_builtin_type_args import func_with_builtin_type_args from py_type_extractor.test_fixtures.union_type_class import ClassWithUnionField from py_type_extractor.test_fixtures.func_with_dict import func_with_dict @@ -40,3 +41,4 @@ def __write_ts_definition__(name: str, definition_str: str): generate_and_write_ts_definition(func_with_tuple) generate_and_write_ts_definition(func_with_literals) generate_and_write_ts_definition(func_with_mapping) +generate_and_write_ts_definition(func_with_builtin_type_args) diff --git a/py_type_extractor/plugins/typescript/__tests__/test.ts b/py_type_extractor/plugins/typescript/__tests__/test.ts index 8090fe6..f81688d 100644 --- a/py_type_extractor/plugins/typescript/__tests__/test.ts +++ b/py_type_extractor/plugins/typescript/__tests__/test.ts @@ -22,6 +22,7 @@ function runTests() { runTest('func_return_none'); runTest('func_with_tuple'); runTest('func_with_literals') + runTest('func_with_builtin_type_args') } describe('pycodegen::typescript should...', () => { diff --git a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts index a8f46ba..d6c839f 100644 --- a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts +++ b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts @@ -1,4 +1,4 @@ export function func_return_none( some_input: string | null, some_input2: boolean | null, -): any \ No newline at end of file +): any diff --git a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_builtin_type_args.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_builtin_type_args.d.ts new file mode 100644 index 0000000..8944f0f --- /dev/null +++ b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_builtin_type_args.d.ts @@ -0,0 +1,4 @@ +export function func_with_builtin_type_args( + a: number, + b: string | null, +): number diff --git a/py_type_extractor/plugins/typescript/__tests__/utils.ts b/py_type_extractor/plugins/typescript/__tests__/utils.ts index 3522d33..171e82e 100644 --- a/py_type_extractor/plugins/typescript/__tests__/utils.ts +++ b/py_type_extractor/plugins/typescript/__tests__/utils.ts @@ -31,7 +31,7 @@ export async function getFixtureAST(name: string) { } export async function prepare() { - await exec('python -m py_codegen.plugins.typescript.__tests__.generate_ts_definitions', { + await exec('python -m py_type_extractor.plugins.typescript.__tests__.generate_ts_definitions', { cwd: PROJECT_ROOT, }) } @@ -43,4 +43,4 @@ export async function clean() { } // prepare() -// clean() \ No newline at end of file +// clean() diff --git a/py_type_extractor/plugins/typescript/middlewares/functions.py b/py_type_extractor/plugins/typescript/middlewares/functions.py index 561ff56..cf52d54 100644 --- a/py_type_extractor/plugins/typescript/middlewares/functions.py +++ b/py_type_extractor/plugins/typescript/middlewares/functions.py @@ -3,7 +3,8 @@ from py_type_extractor.plugins.typescript.__base__ import BaseTypescriptConverter from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound - +from py_type_extractor.type_extractor.nodes.NoneNode import none_node +from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR from .__base__ import ( convert_params_dict, ) @@ -29,9 +30,14 @@ def convert_functionfound( func_found: FunctionFound, converter: BaseTypescriptConverter, ): + raw_params = { + key: value if key not in func_found.default_values + else TypeOR(a=value, b=none_node) + for (key, value) in func_found.params.items() + } params = convert_params_dict( converter=converter, - node_dict=func_found.params, + node_dict=raw_params, ending=',', ) return ( diff --git a/py_type_extractor/test_fixtures/func_with_builtin_type_args.py b/py_type_extractor/test_fixtures/func_with_builtin_type_args.py index d0ed383..66f217e 100644 --- a/py_type_extractor/test_fixtures/func_with_builtin_type_args.py +++ b/py_type_extractor/test_fixtures/func_with_builtin_type_args.py @@ -1,3 +1,3 @@ -def func_with_builtin_args(a: int, b: str = 'hello') -> int: +def func_with_builtin_type_args(a: int, b: str = 'hello') -> int: print(b) return a + 1 From a293467de32e267e55cbd89ffd0e4864baea827b Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Tue, 11 Aug 2020 18:18:43 +0900 Subject: [PATCH 16/34] [ts plugin] nullable to null OR undefined --- py_type_extractor/plugins/typescript/Converter.py | 2 +- .../typescript/__tests__/ts_fixtures/func_return_none.d.ts | 4 ++-- .../__tests__/ts_fixtures/func_with_builtin_type_args.d.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/py_type_extractor/plugins/typescript/Converter.py b/py_type_extractor/plugins/typescript/Converter.py index 00e381a..4cc1d4e 100644 --- a/py_type_extractor/plugins/typescript/Converter.py +++ b/py_type_extractor/plugins/typescript/Converter.py @@ -74,7 +74,7 @@ def __init__( def get_identifier(self, node: NodeType) -> str: # TODO: sanitize names! if isinstance(node, NoneNode): - return 'null' + return 'null | undefined' if isinstance(node, ClassFound): return node.name.replace('.', '__') if isinstance(node, FunctionFound): diff --git a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts index d6c839f..458116b 100644 --- a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts +++ b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts @@ -1,4 +1,4 @@ export function func_return_none( - some_input: string | null, - some_input2: boolean | null, + some_input: string | null | undefined, + some_input2: boolean | null | undefined, ): any diff --git a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_builtin_type_args.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_builtin_type_args.d.ts index 8944f0f..c3800bb 100644 --- a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_builtin_type_args.d.ts +++ b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_builtin_type_args.d.ts @@ -1,4 +1,4 @@ export function func_with_builtin_type_args( a: number, - b: string | null, + b: string | null | undefined, ): number From e8e184f131cf8bc041c638852adf7065cb0e9046 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Tue, 15 Sep 2020 20:40:47 +0900 Subject: [PATCH 17/34] fix mypy type ignored (PEP561) --- py_type_extractor/py.typed | 0 setup.py | 3 +++ 2 files changed, 3 insertions(+) create mode 100644 py_type_extractor/py.typed diff --git a/py_type_extractor/py.typed b/py_type_extractor/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/setup.py b/setup.py index 44ed453..3788080 100644 --- a/setup.py +++ b/setup.py @@ -13,6 +13,9 @@ long_description_content_type="text/markdown", url="https://github.com/pypa/sampleproject", packages=setuptools.find_packages(), + package_data={ + "py_type_extractor": ["py.typed"] + }, classifiers=[ "Programming Language :: Python :: 3", "Operating System :: OS Independent", From c661f90daf0ad0dc804aff3f056de39b00160621 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Thu, 17 Sep 2020 18:41:00 +0900 Subject: [PATCH 18/34] make nodes hashable, prevent circular-refs --- py_type_extractor/test_fixtures/new_type.py | 2 +- py_type_extractor/type_extractor/__base__.py | 4 ++ .../__tests__/test_circular_dep_classes.py | 0 .../test_class_of_generic_instance.py | 37 +++++++---- .../__tests__/test_class_of_generic_origin.py | 24 ++++--- .../__tests__/test_class_with_union_field.py | 23 ++++--- .../test_classes_with_inheritance.py | 56 +++++++++++----- .../__tests__/test_func_not_annotated.py | 20 ++++-- .../__tests__/test_func_with_arg_class.py | 28 ++++---- .../test_func_with_builtin_type_args.py | 22 +++++-- .../__tests__/test_func_with_dict.py | 21 ++++-- .../__tests__/test_func_with_list.py | 22 +++++-- .../__tests__/test_func_with_literals.py | 21 ++++-- .../__tests__/test_func_with_mapping.py | 19 ++++-- .../test_func_with_nested_arg_class.py | 22 ++++--- .../__tests__/test_func_with_tuple.py | 20 ++++-- .../__tests__/test_func_with_typed_dict.py | 20 +++++- .../type_extractor/__tests__/test_newtype.py | 65 ++++++++++++------- .../__tests__/test_pydantic_classes.py | 36 +++++++--- .../__tests__/test_various_classes.py | 35 ++++++---- .../type_extractor/__tests__/utils.py | 8 +++ .../type_extractor/middlewares/class_found.py | 53 +++++++++++---- .../middlewares/function_found.py | 13 ++-- .../middlewares/newtype_found.py | 8 ++- .../middlewares/typeddict_found.py | 25 +++++-- .../type_extractor/nodes/ClassFound.py | 4 ++ .../type_extractor/nodes/FixedGenericFound.py | 5 ++ .../type_extractor/nodes/FunctionFound.py | 6 ++ .../type_extractor/nodes/MappingFound.py | 5 ++ .../type_extractor/nodes/NewType.py | 12 +++- .../type_extractor/nodes/NoneNode.py | 3 +- .../type_extractor/nodes/TupleFound.py | 3 + .../type_extractor/nodes/TypeVarFound.py | 2 +- .../type_extractor/nodes/TypedDictFound.py | 16 +++-- .../type_extractor/type_extractor.py | 1 + 35 files changed, 472 insertions(+), 189 deletions(-) delete mode 100644 py_type_extractor/type_extractor/__tests__/test_circular_dep_classes.py diff --git a/py_type_extractor/test_fixtures/new_type.py b/py_type_extractor/test_fixtures/new_type.py index 8061459..77021ec 100644 --- a/py_type_extractor/test_fixtures/new_type.py +++ b/py_type_extractor/test_fixtures/new_type.py @@ -1,4 +1,4 @@ -from typing import ( +from typing_extensions import ( NewType, ) diff --git a/py_type_extractor/type_extractor/__base__.py b/py_type_extractor/type_extractor/__base__.py index 0c8cc10..a95a85e 100644 --- a/py_type_extractor/type_extractor/__base__.py +++ b/py_type_extractor/type_extractor/__base__.py @@ -10,6 +10,10 @@ class BaseTypeExtractor(ABC): def __init__(self): self.collected_types = dict() + @staticmethod + def to_collected_types_key(module_name, typ_name): + return f"{module_name}___{typ_name}" + def params_to_nodes( self, params: Dict[str, Union[type, None]], diff --git a/py_type_extractor/type_extractor/__tests__/test_circular_dep_classes.py b/py_type_extractor/type_extractor/__tests__/test_circular_dep_classes.py deleted file mode 100644 index e69de29..0000000 diff --git a/py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py index 2054368..9fb8a4d 100644 --- a/py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py @@ -1,20 +1,17 @@ -from py_type_extractor.test_fixtures.generic_classes import ( - some_func_with_generic_inst, - SomeTypeVarA, - SomeTypeVarB, -) -from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +import py_type_extractor.test_fixtures.generic_classes as t +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound from py_type_extractor.type_extractor.type_extractor import TypeExtractor +module_name = t.__name__ # noinspection PyPep8Naming def test_class_of_generic_instance(): type_extractor = TypeExtractor() - type_extractor.add()(some_func_with_generic_inst) + type_extractor.add()(t.some_func_with_generic_inst) print(type_extractor) collected_types = { @@ -23,13 +20,14 @@ def test_class_of_generic_instance(): } some_typevar_A = TypeVarFound( name='SomeTypeVarA', - original=SomeTypeVarA, + original=t.SomeTypeVarA, ) some_typevar_B = TypeVarFound( name='SomeTypeVarB', - original=SomeTypeVarB, + original=t.SomeTypeVarB, ) some_generic_class = ClassFound( + module_name=module_name, name='SomeGenericClass', fields={ 'a': some_typevar_A, @@ -41,21 +39,34 @@ def test_class_of_generic_instance(): ], ) some_class = ClassFound( + module_name=module_name, name='SomeClass', fields={ 'some_property': int, } ) assert collected_types[ - 'py_type_extractor.test_fixtures.generic_classes.SomeGenericClass' + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeGenericClass.__qualname__, + ) ] == some_generic_class assert collected_types[ - 'py_type_extractor.test_fixtures.generic_classes.SomeClass' + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeClass.__qualname__, + ) ] == some_class - assert collected_types['some_func_with_generic_inst'] == FunctionFound( + assert collected_types[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.some_func_with_generic_inst.__qualname__, + ) + ] == FunctionFound( name='some_func_with_generic_inst', + module_name=module_name, params={ 'input': FixedGenericFound( type_vars=[float, some_class], @@ -65,3 +76,5 @@ def test_class_of_generic_instance(): return_type=str, ) + hash_test(type_extractor) + diff --git a/py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py index 0e501e4..026c2a2 100644 --- a/py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py @@ -1,17 +1,14 @@ -from py_type_extractor.test_fixtures.generic_classes import ( - SomeGenericClass, - SomeTypeVarA, - SomeTypeVarB, -) -from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +import py_type_extractor.test_fixtures.generic_classes as t +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound from py_type_extractor.type_extractor.type_extractor import TypeExtractor +module_name = t.__name__ def test_class_of_generic_origin(): type_extractor = TypeExtractor() - type_extractor.add()(SomeGenericClass) + type_extractor.add()(t.SomeGenericClass) classes = { key: traverse(value, cleanup) for (key, value) in type_extractor.collected_types.items() @@ -19,22 +16,29 @@ def test_class_of_generic_origin(): } typevar_A = TypeVarFound( name='SomeTypeVarA', - original=SomeTypeVarA, + original=t.SomeTypeVarA, ) typevar_B = TypeVarFound( name='SomeTypeVarB', - original=SomeTypeVarB, + original=t.SomeTypeVarB, + ) + collected_types_key = type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeGenericClass.__qualname__, ) assert classes == { - 'py_type_extractor.test_fixtures.generic_classes.SomeGenericClass': ClassFound( + collected_types_key: ClassFound( name='SomeGenericClass', fields={ 'a': typevar_A, 'b': typevar_B, 'some_int': int, }, + module_name=module_name, type_vars=[ typevar_A, typevar_B, ] ) } + + hash_test(type_extractor) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py b/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py index 377600b..81d94ea 100644 --- a/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py @@ -1,10 +1,10 @@ from dataclasses import dataclass -from py_type_extractor.test_fixtures.union_type_class import ClassWithUnionField +import py_type_extractor.test_fixtures.union_type_class as t from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR -from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test from py_type_extractor.type_extractor.type_extractor import TypeExtractor @@ -12,28 +12,35 @@ class SomeOption(BaseOption): some_var: int +module_name = t.__name__ def test_class_with_union_field(): type_collector = TypeExtractor() - type_collector.add(None)(ClassWithUnionField) - type_collector.add({SomeOption(some_var=1)})(ClassWithUnionField) + type_collector.add(None)(t.ClassWithUnionField) + type_collector.add({SomeOption(some_var=1)})(t.ClassWithUnionField) classes = { key: traverse(value, cleanup) for (key, value) in type_collector.collected_types.items() if isinstance(value, ClassFound) } - assert classes == { - 'py_type_extractor.test_fixtures.union_type_class.ClassWithUnionField': ClassFound( + key = type_collector.to_collected_types_key( + module_name, + t.ClassWithUnionField.__qualname__ + ) + to_compare = { + key: ClassFound( name='ClassWithUnionField', fields={ 'cwufField1': TypeOR( a=str, b=int ) }, + module_name=module_name, options={SomeOption(some_var=1)}, ) } - functions = type_collector.functions - assert functions == {} + assert to_compare == classes + + hash_test(type_collector) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_classes_with_inheritance.py b/py_type_extractor/type_extractor/__tests__/test_classes_with_inheritance.py index 69d1734..aeee341 100644 --- a/py_type_extractor/type_extractor/__tests__/test_classes_with_inheritance.py +++ b/py_type_extractor/type_extractor/__tests__/test_classes_with_inheritance.py @@ -1,14 +1,16 @@ -from py_type_extractor.test_fixtures.classes_with_inheritance import ChildClass +import py_type_extractor.test_fixtures.classes_with_inheritance as t from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound -from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test from py_type_extractor.type_extractor.type_extractor import TypeExtractor +module_name = t.__name__ + def test_classes_with_inheritance(): type_extractor = TypeExtractor() - type_extractor.add(None)(ChildClass) + type_extractor.add(None)(t.ChildClass) classes = { key: traverse(value, cleanup) @@ -16,29 +18,47 @@ def test_classes_with_inheritance(): if isinstance(value, ClassFound) } parent_class_a = ClassFound( + module_name=module_name, name='ParentClassA', fields={ 'from_parent_a': int, }, ) parent_class_b = ClassFound( + module_name=module_name, name='ParentClassB', fields={ 'from_parent_b': str, }, ) - assert classes == { - 'py_type_extractor.test_fixtures.classes_with_inheritance.ParentClassA': parent_class_a, - 'py_type_extractor.test_fixtures.classes_with_inheritance.ParentClassB': parent_class_b, - 'py_type_extractor.test_fixtures.classes_with_inheritance.ChildClass': ClassFound( - name='ChildClass', - fields={ - 'b': str, - }, - base_classes=[ - parent_class_a, - parent_class_b, - ], - ) - } - print(type_extractor) + assert classes[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.ParentClassA.__qualname__, + ) + ] == parent_class_a + + assert classes[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.ParentClassB.__qualname__, + ) + ] == parent_class_b + + assert classes[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.ChildClass.__qualname__, + ) + ] == ClassFound( + module_name=module_name, + name='ChildClass', + fields={ + 'b': str, + }, + base_classes=[ + parent_class_a, + parent_class_b, + ], + ) + hash_test(type_extractor) diff --git a/py_type_extractor/type_extractor/__tests__/test_func_not_annotated.py b/py_type_extractor/type_extractor/__tests__/test_func_not_annotated.py index d58f4b1..047b574 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_not_annotated.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_not_annotated.py @@ -1,23 +1,29 @@ -from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse, hash_test from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from py_type_extractor.type_extractor.nodes.UnknownFound import unknown_found from py_type_extractor.type_extractor.type_extractor import TypeExtractor -from py_type_extractor.test_fixtures.func_not_annotated import func_not_annotated +import py_type_extractor.test_fixtures.func_not_annotated as t +module_name = t.__name__ def test_func_not_annotated(): type_collector = TypeExtractor() - type_collector.add(None)(func_not_annotated) + type_collector.add(None)(t.func_not_annotated) # assert type_collector.classes == {} func_found_cleaned = cleanup( - type_collector.collected_types[func_not_annotated.__qualname__], + type_collector.collected_types[ + type_collector.to_collected_types_key( + module_name=module_name, + typ_name=t.func_not_annotated.__qualname__, + ) + ] ) - assert func_found_cleaned.return_type == unknown_found assert func_found_cleaned == traverse( FunctionFound( - name=func_not_annotated.__qualname__, + name=t.func_not_annotated.__qualname__, + module_name=module_name, params={ 'arg1': unknown_found, }, @@ -25,3 +31,5 @@ def test_func_not_annotated(): ), cleanup, ) + + hash_test(type_collector) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_arg_class.py b/py_type_extractor/type_extractor/__tests__/test_func_with_arg_class.py index b215f1b..577243a 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_arg_class.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_arg_class.py @@ -1,26 +1,26 @@ -from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +import py_type_extractor.test_fixtures.func_with_arg_class as t +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse, hash_test from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from py_type_extractor.type_extractor.type_extractor import TypeExtractor +module_name = t.__name__ def test_func_with_arg_class(): type_collector = TypeExtractor() - class ArgClass: - arg1: str - arg2: int - - @type_collector.add(None) - def func_with_arg_class(a: ArgClass) -> ArgClass: - return a - + type_collector.add(None)(t.func_with_arg_class) + collected_types_key = type_collector.to_collected_types_key( + module_name=module_name, + typ_name='func_with_arg_class', + ) func_found_cleaned = traverse( - type_collector.collected_types['func_with_arg_class'], + type_collector.collected_types[collected_types_key], cleanup, ) arg_class_found = ClassFound( - name='test_func_with_arg_class.ArgClass', + name='ArgClass', + module_name=module_name, fields={ 'arg1': str, 'arg2': int, @@ -29,15 +29,15 @@ def func_with_arg_class(a: ArgClass) -> ArgClass: assert func_found_cleaned == cleanup( FunctionFound( name='func_with_arg_class', + module_name=module_name, params={ - 'return': arg_class_found, 'a': arg_class_found, }, doc='', return_type=arg_class_found, # func=None, - filePath=None, - raw_params=None, ) ) + + hash_test(type_collector) diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_builtin_type_args.py b/py_type_extractor/type_extractor/__tests__/test_func_with_builtin_type_args.py index 06e4380..ed4a761 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_builtin_type_args.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_builtin_type_args.py @@ -1,21 +1,29 @@ from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound -from py_type_extractor.type_extractor.__tests__.utils import cleanup +from py_type_extractor.type_extractor.__tests__.utils import cleanup, hash_test from py_type_extractor.type_extractor.type_extractor import TypeExtractor -from py_type_extractor.test_fixtures.func_with_builtin_type_args \ - import func_with_builtin_args +import py_type_extractor.test_fixtures.func_with_builtin_type_args as t + + +module_name = t.__name__ def test_func_with_builtin_type_args(): type_collector = TypeExtractor() - type_collector.add(None)(func_with_builtin_args) + type_collector.add(None)(t.func_with_builtin_type_args) assert type_collector.classes == {} func_found_cleaned = cleanup( - type_collector.collected_types['func_with_builtin_args'], + type_collector.collected_types[ + type_collector.to_collected_types_key( + module_name=module_name, + typ_name=t.func_with_builtin_type_args.__qualname__, + ) + ] ) assert func_found_cleaned == cleanup(FunctionFound( - name='func_with_builtin_args', + name='func_with_builtin_type_args', + module_name=module_name, params={ 'return': int, 'a': int, @@ -29,3 +37,5 @@ def test_func_with_builtin_type_args(): 'b': 'hello', }, )) + + hash_test(type_collector) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_dict.py b/py_type_extractor/type_extractor/__tests__/test_func_with_dict.py index 2c720a0..ea2954d 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_dict.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_dict.py @@ -1,23 +1,32 @@ -from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse, hash_test from py_type_extractor.type_extractor.nodes.DictFound import DictFound from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from py_type_extractor.type_extractor.nodes.UnknownFound import unknown_found from py_type_extractor.type_extractor.type_extractor import TypeExtractor -from py_type_extractor.test_fixtures.func_with_dict import func_with_dict +import py_type_extractor.test_fixtures.func_with_dict as t + +module_name=t.__name__ def test_func_with_dict(): type_collector = TypeExtractor() - type_collector.add(None)(func_with_dict) + type_collector.add(None)(t.func_with_dict) func_found_cleaned = traverse( - type_collector.collected_types[func_with_dict.__qualname__], + # type_collector.collected_types[func_with_dict.__qualname__], + type_collector.collected_types[ + type_collector.to_collected_types_key( + module_name=module_name, + typ_name=t.func_with_dict.__qualname__, + ) + ], cleanup, ) assert func_found_cleaned == traverse( FunctionFound( - name=func_with_dict.__qualname__, + name=t.func_with_dict.__qualname__, + module_name=module_name, params={ 'input': DictFound(key=str, value=int), }, @@ -25,3 +34,5 @@ def test_func_with_dict(): ), cleanup, ) + + hash_test(type_collector) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_list.py b/py_type_extractor/type_extractor/__tests__/test_func_with_list.py index ba6c916..f607fb5 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_list.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_list.py @@ -5,7 +5,10 @@ from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from py_type_extractor.type_extractor.nodes.ListFound import ListFound from py_type_extractor.type_extractor.type_extractor import TypeExtractor -from py_type_extractor.test_fixtures.func_with_list import func_with_list +import py_type_extractor.test_fixtures.func_with_list as t + + +module_name = t.__name__ @dataclass(frozen=True) @@ -18,19 +21,26 @@ def test_func_with_list(): type_collector.add( options={SomeOption(some_var=3)} - )(func_with_list) + )(t.func_with_list) type_collector.add( options={SomeOption(some_var=5)} - )(func_with_list) + )(t.func_with_list) # assert type_collector.classes == {} func_found_cleaned = cleanup( - type_collector.collected_types[func_with_list.__qualname__], + type_collector.collected_types[ + type_collector + .to_collected_types_key( + module_name=module_name, + typ_name=t.func_with_list.__qualname__, + ) + ], ) assert func_found_cleaned == traverse( FunctionFound( - name=func_with_list.__qualname__, + name=t.func_with_list.__qualname__, + module_name=module_name, params={ 'input': ListFound(str), }, @@ -39,3 +49,5 @@ def test_func_with_list(): ), cleanup, ) + + hash(func_found_cleaned) diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_literals.py b/py_type_extractor/type_extractor/__tests__/test_func_with_literals.py index 3fe2474..6e2642a 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_literals.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_literals.py @@ -1,21 +1,30 @@ -from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse, hash_test from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from py_type_extractor.type_extractor.nodes.LiteralFound import LiteralFound from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR from py_type_extractor.type_extractor.type_extractor import TypeExtractor -from py_type_extractor.test_fixtures.func_with_literals import func_with_literals + +import py_type_extractor.test_fixtures.func_with_literals as t + +module_name = t.__name__ def test_func_with_list(): type_collector = TypeExtractor() - type_collector.add(None)(func_with_literals) + type_collector.add(None)(t.func_with_literals) - original_func_found = type_collector.collected_types[func_with_literals.__qualname__] + original_func_found = type_collector.collected_types[ + type_collector.to_collected_types_key( + module_name=module_name, + typ_name=t.func_with_literals.__qualname__, + ) + ] func_found_cleaned = cleanup(original_func_found) expected_func_found_cleaned = traverse( FunctionFound( - name=func_with_literals.__qualname__, + name=t.func_with_literals.__qualname__, + module_name=module_name, params={ 'input1': TypeOR( a=LiteralFound('a'), @@ -49,3 +58,5 @@ def test_func_with_list(): cleanup, ) assert func_found_cleaned == expected_func_found_cleaned + + hash_test(type_collector) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_mapping.py b/py_type_extractor/type_extractor/__tests__/test_func_with_mapping.py index 80262af..bf99ce9 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_mapping.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_mapping.py @@ -1,21 +1,28 @@ -from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse, hash_test from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from py_type_extractor.type_extractor.nodes.MappingFound import MappingFound from py_type_extractor.type_extractor.type_extractor import TypeExtractor -from py_type_extractor.test_fixtures.func_with_mapping import func_with_mapping +import py_type_extractor.test_fixtures.func_with_mapping as t +module_name = t.__name__ def test_func_with_tuple(): type_collector = TypeExtractor() - type_collector.add(None)(func_with_mapping) + type_collector.add(None)(t.func_with_mapping) func_found_cleaned = cleanup( - type_collector.collected_types[func_with_mapping.__qualname__], + type_collector.collected_types[ + type_collector.to_collected_types_key( + module_name=module_name, + typ_name=t.func_with_mapping.__qualname__, + ) + ], ) assert func_found_cleaned == traverse( FunctionFound( - name=func_with_mapping.__qualname__, + name=t.func_with_mapping.__qualname__, + module_name=module_name, params={ 'input': MappingFound(key=str, value=int), }, @@ -23,3 +30,5 @@ def test_func_with_tuple(): ), cleanup, ) + + hash_test(type_collector) diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py b/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py index 0491eed..2ad9403 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py @@ -1,11 +1,12 @@ from collections import OrderedDict from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound -from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test from py_type_extractor.type_extractor.type_extractor import TypeExtractor - +module_name = __name__ def test_func_with_nested_arg_class(): + type_collector = TypeExtractor() class ChildClass: @@ -19,19 +20,19 @@ class ParentClass: def func_with_nested_arg_class(a: ParentClass) -> ParentClass: return a + def to_collected_types_key(a): + return type_collector.to_collected_types_key( + module_name=module_name, + typ_name= f'test_func_with_nested_arg_class.{a.__name__}' + ) cleanedup = traverse( - type_collector.collected_types[ - 'py_type_extractor.type_extractor' - '.__tests__' - '.test_func_with_nested_arg_class' - '.test_func_with_nested_arg_class' - '.ParentClass' - ], + type_collector.collected_types[to_collected_types_key(ParentClass)], cleanup, ) child_class = ClassFound( name='test_func_with_nested_arg_class.ChildClass', + module_name=module_name, fields={ 'return': None, 'carg1': str, @@ -42,6 +43,7 @@ def func_with_nested_arg_class(a: ParentClass) -> ParentClass: class_raw=ChildClass, ) parent_class = ClassFound( + module_name=module_name, name="test_func_with_nested_arg_class.ParentClass", fields={ 'return': None, @@ -55,3 +57,5 @@ def func_with_nested_arg_class(a: ParentClass) -> ParentClass: ) parent_cleaned = traverse(parent_class, cleanup) assert (parent_cleaned == cleanedup) + + hash_test(type_collector) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_tuple.py b/py_type_extractor/type_extractor/__tests__/test_func_with_tuple.py index ccbb27c..5471688 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_tuple.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_tuple.py @@ -1,22 +1,30 @@ -from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse, hash_test from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from py_type_extractor.type_extractor.nodes.TupleFound import TupleFound from py_type_extractor.type_extractor.type_extractor import TypeExtractor -from py_type_extractor.test_fixtures.func_with_tuple import func_with_tuple +import py_type_extractor.test_fixtures.func_with_tuple as t + +module_name = t.__name__ def test_func_with_tuple(): type_collector = TypeExtractor() - type_collector.add(None)(func_with_tuple) + type_collector.add(None)(t.func_with_tuple) # assert type_collector.classes == {} func_found_cleaned = cleanup( - type_collector.collected_types[func_with_tuple.__qualname__], + type_collector.collected_types[ + type_collector.to_collected_types_key( + module_name=module_name, + typ_name=t.func_with_tuple.__qualname__, + ) + ], ) assert func_found_cleaned == traverse( FunctionFound( - name=func_with_tuple.__qualname__, + name=t.func_with_tuple.__qualname__, + module_name=module_name, params={ 'input': TupleFound([str, int]), }, @@ -24,3 +32,5 @@ def test_func_with_tuple(): ), cleanup, ) + + hash_test(type_collector) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_typed_dict.py b/py_type_extractor/type_extractor/__tests__/test_func_with_typed_dict.py index b2ba87b..94f2468 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_typed_dict.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_typed_dict.py @@ -1,35 +1,46 @@ from py_type_extractor.test_fixtures.func_with_typed_dict import func_with_typed_dict +import py_type_extractor.test_fixtures.func_with_typed_dict as t from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from py_type_extractor.type_extractor.nodes.TypedDictFound import TypedDictFound from py_type_extractor.type_extractor.type_extractor import TypeExtractor -from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse, hash_test +module_name = t.__name__ def test_func_with_typed_dict(): type_collector = TypeExtractor() type_collector.add(None)(func_with_typed_dict) - func = type_collector.collected_types['func_with_typed_dict'] + + collected_types_key = type_collector.to_collected_types_key( + module_name=module_name, + typ_name='func_with_typed_dict' + ) + func = type_collector.collected_types[collected_types_key] cleaned_func = traverse(func, cleanup) to_compare_func = traverse( FunctionFound( name=func_with_typed_dict.__qualname__, + module_name=module_name, params={ 'input': TypedDictFound( name='NestedTypedDict', + module_name=module_name, annotations={ 'child': TypedDictFound( name='SimpleTypedDict1', annotations={ 'a': str, }, + module_name=module_name, ) }, ) }, return_type=TypedDictFound( + module_name=module_name, annotations={ 'b': int, 'some thing': str, @@ -37,7 +48,8 @@ def test_func_with_typed_dict(): name='SomeClass', fields={ 'a': int, - } + }, + module_name=module_name, ) }, name='OutputType' @@ -46,3 +58,5 @@ def test_func_with_typed_dict(): cleanup, ) assert cleaned_func == to_compare_func + + hash_test(type_collector) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_newtype.py b/py_type_extractor/type_extractor/__tests__/test_newtype.py index 31de950..dea3eda 100644 --- a/py_type_extractor/type_extractor/__tests__/test_newtype.py +++ b/py_type_extractor/type_extractor/__tests__/test_newtype.py @@ -1,46 +1,61 @@ -from py_type_extractor.test_fixtures.new_type import ( - name_by_id, - SomeClassInNewType, -) -from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +import py_type_extractor.test_fixtures.new_type as t + +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from py_type_extractor.type_extractor.nodes.NewType import NewTypeFound -from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound from py_type_extractor.type_extractor.type_extractor import TypeExtractor +module_name = t.__name__ + def test_newtype(): type_extractor = TypeExtractor() - type_extractor.add()(name_by_id) - type_extractor.add()(SomeClassInNewType) + type_extractor.add()(t.name_by_id) + type_extractor.add()(t.SomeClassInNewType) cleaned_up = { key: traverse(value, cleanup) for (key, value) in type_extractor.collected_types.items() } user_id_newtype = NewTypeFound( - name='UserId', + name=t.UserId.__name__, actual=int, + original_ref=t.UserId, ) some_class = ClassFound( + module_name=module_name, name='SomeClass', fields={ 'a': int, } ) - assert cleaned_up == { - 'UserId': user_id_newtype, - 'name_by_id': FunctionFound( - name='name_by_id', - params={ - 'user_id': user_id_newtype, - }, - return_type=str, - ), - 'py_type_extractor.test_fixtures.new_type.SomeClass': some_class, - 'SomeClassInNewType': NewTypeFound( - name='SomeClassInNewType', - actual=some_class, - ), - } - print(1) + assert cleaned_up[t.UserId.__name__] == user_id_newtype + + assert cleaned_up[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.name_by_id.__qualname__, + ) + ] == FunctionFound( + module_name=module_name, + name='name_by_id', + params={ + 'user_id': user_id_newtype, + }, + return_type=str, + ) + + assert cleaned_up[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeClass.__qualname__, + ) + ] == some_class + + assert cleaned_up[t.SomeClassInNewType.__name__] == NewTypeFound( + name='SomeClassInNewType', + actual=some_class, + original_ref=t.SomeClassInNewType, + ) + + hash_test(type_extractor) diff --git a/py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py b/py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py index c02a985..b497080 100644 --- a/py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py +++ b/py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py @@ -1,16 +1,15 @@ from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound -from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test from py_type_extractor.type_extractor.type_extractor import TypeExtractor -from py_type_extractor.test_fixtures.pydantic_classes import ( - SomePydanticDataClass, - SomePydanticModelClass, -) +import py_type_extractor.test_fixtures.pydantic_classes as t + +module_name = t.__name__ def test_pydantic_classes(): type_extractor = TypeExtractor() - type_extractor.add(None)(SomePydanticModelClass) - type_extractor.add(None)(SomePydanticDataClass) + type_extractor.add(None)(t.SomePydanticModelClass) + type_extractor.add(None)(t.SomePydanticDataClass) print(type_extractor) classes = { @@ -19,9 +18,13 @@ def test_pydantic_classes(): if isinstance(value, ClassFound) } assert classes[ - 'py_type_extractor.test_fixtures.pydantic_classes.SomePydanticDataClass' + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomePydanticDataClass.__qualname__, + ) ] == ClassFound( name='SomePydanticDataClass', + module_name=module_name, fields={ 'a': int, 'b': str, @@ -29,12 +32,25 @@ def test_pydantic_classes(): ) assert classes[ - 'py_type_extractor.test_fixtures.pydantic_classes.SomePydanticModelClass' + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomePydanticModelClass.__qualname__, + ) ] == ClassFound( name='SomePydanticModelClass', + module_name=module_name, fields={ 'c': int, 'something': float, }, - base_classes=[classes['pydantic.main.BaseModel']], + base_classes=[ + classes[ + type_extractor.to_collected_types_key( + module_name='pydantic.main', + typ_name='BaseModel', + ) + ] + ] ) + + hash_test(type_extractor) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_various_classes.py b/py_type_extractor/type_extractor/__tests__/test_various_classes.py index 5bffc39..ecbb901 100644 --- a/py_type_extractor/type_extractor/__tests__/test_various_classes.py +++ b/py_type_extractor/type_extractor/__tests__/test_various_classes.py @@ -1,40 +1,49 @@ from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound -from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test from py_type_extractor.type_extractor.nodes.DictFound import DictFound from py_type_extractor.type_extractor.type_extractor import TypeExtractor -from py_type_extractor.test_fixtures.various_classes import ( - SomeDataClass, - SomeNamedTuple, - SomeNormalClass, -) +import py_type_extractor.test_fixtures.various_classes as t +module_name = t.__name__ def test_various_classes(): type_extractor = TypeExtractor() - type_extractor.add(None)(SomeDataClass) - type_extractor.add(None)(SomeNormalClass) - type_extractor.add(None)(SomeNamedTuple) + type_extractor.add(None)(t.SomeDataClass) + type_extractor.add(None)(t.SomeNormalClass) + type_extractor.add(None)(t.SomeNamedTuple) classes = { key: traverse(value, cleanup) for (key, value) in type_extractor.collected_types.items() if isinstance(value, ClassFound) } assert classes == { - 'py_type_extractor.test_fixtures.various_classes.SomeDataClass': ClassFound( + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeDataClass.__qualname__, + ): ClassFound( + module_name=module_name, name='SomeDataClass', fields={ 'sdcArg1': int, 'sdcArg2': str, }, ), - 'py_type_extractor.test_fixtures.various_classes.SomeNormalClass': ClassFound( + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeNormalClass.__qualname__, + ): ClassFound( + module_name=module_name, name='SomeNormalClass', fields={ 'checklist': DictFound(key=str, value=bool), }, ), - 'py_type_extractor.test_fixtures.various_classes.SomeNamedTuple': ClassFound( + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeNamedTuple.__qualname__, + ): ClassFound( + module_name=module_name, name='SomeNamedTuple', fields={ 'sntArg1': int, @@ -45,3 +54,5 @@ def test_various_classes(): functions = type_extractor.functions functions_list = functions.values() assert(functions_list.__len__() == 0) + + hash_test(type_extractor) diff --git a/py_type_extractor/type_extractor/__tests__/utils.py b/py_type_extractor/type_extractor/__tests__/utils.py index f6a603c..904b30b 100644 --- a/py_type_extractor/type_extractor/__tests__/utils.py +++ b/py_type_extractor/type_extractor/__tests__/utils.py @@ -2,6 +2,7 @@ from copy import deepcopy, copy from typing import Callable +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound from py_type_extractor.type_extractor.nodes.NewType import NewTypeFound @@ -112,3 +113,10 @@ def cleanup(node: NodeType): new_node.raw = None return new_node return node + +def hash_test(type_extractor: BaseTypeExtractor): + for (key, value) in type_extractor.collected_types.items(): + try: + hash(value) + except Exception as e: + raise RuntimeError(f"Hash failed -- couldn't hash {key} of {value}") \ No newline at end of file diff --git a/py_type_extractor/type_extractor/middlewares/class_found.py b/py_type_extractor/type_extractor/middlewares/class_found.py index 8144df9..47b6cb6 100644 --- a/py_type_extractor/type_extractor/middlewares/class_found.py +++ b/py_type_extractor/type_extractor/middlewares/class_found.py @@ -1,4 +1,6 @@ import inspect +import weakref + import typing_inspect from dataclasses import dataclass @@ -7,6 +9,7 @@ from typing import Set, Dict, cast, List, Generic from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.utils import is_builtin @@ -27,8 +30,11 @@ def class_found_middleware( module_name = module.__name__ name = _class.__qualname__.replace('.', '') - - duplicate = type_extractor.collected_types.get(f"{module_name}.{name}") + collected_types_key = type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=name, + ) + duplicate = type_extractor.collected_types.get(collected_types_key) if duplicate is not None: assert isinstance(duplicate, ClassFound) \ and duplicate.class_raw == _class @@ -48,24 +54,45 @@ def class_found_middleware( argspec = inspect.getfullargspec(_data_class) filename = module and module.__file__ - annotations: Dict = getattr(_class, '__annotations__', argspec.annotations) - fields = type_extractor.params_to_nodes(annotations, annotations.keys()) - type_vars = [ - type_extractor.rawtype_to_node(_typevar) - for _typevar in - list(typing_inspect.get_parameters(_class)) - ] + class_found = ClassFound( name=name, class_raw=_class, filePath=filename, base_classes=base_classes, raw_fields=argspec.annotations, - fields=fields, + fields={}, + type_vars=[], + module_name=module_name, + # fields=fields, doc=_class.__doc__, options=options, - type_vars=type_vars, + # type_vars=type_vars, + ) + + type_extractor.collected_types[collected_types_key] = class_found + + _annotations: Dict = getattr(_class, '__annotations__', argspec.annotations) + annotations = { + key: value if type(value) is not str + else getattr(module, value) + for (key, value) in _annotations.items() + } + + fields = type_extractor.params_to_nodes( + annotations, + cast(List[str], annotations.keys()), ) + type_vars = cast( + List[TypeVarFound], + [ + type_extractor.rawtype_to_node(_typevar) + for _typevar in + list(typing_inspect.get_parameters(_class)) + ] + ) + + class_found.fields = fields + class_found.type_vars = type_vars - type_extractor.collected_types[f"{module_name}.{name}"] = class_found - return class_found + return weakref.proxy(class_found) diff --git a/py_type_extractor/type_extractor/middlewares/function_found.py b/py_type_extractor/type_extractor/middlewares/function_found.py index 349f62b..b29632a 100644 --- a/py_type_extractor/type_extractor/middlewares/function_found.py +++ b/py_type_extractor/type_extractor/middlewares/function_found.py @@ -1,4 +1,5 @@ import inspect +import weakref from typing import Set @@ -15,7 +16,10 @@ def func_found_middleware( if not inspect.isfunction(func): return None try: - duplicate_func_found = type_extractor.collected_types.get(func.__name__) + module = inspect.getmodule(func) + module_name = module.__name__ + collected_types_key = f"{module_name}___{func.__qualname__}" + duplicate_func_found = type_extractor.collected_types.get(collected_types_key) if duplicate_func_found is not None: assert isinstance(duplicate_func_found, FunctionFound) and duplicate_func_found.func == func duplicate_func_found.options = duplicate_func_found.options.union(options) @@ -23,7 +27,7 @@ def func_found_middleware( argspec = inspect.getfullargspec(func) signature = inspect.signature(func) - module = inspect.getmodule(func) + filename = module.__file__ params = type_extractor.params_to_nodes(argspec.annotations, argspec.args) raw_default_values = { @@ -41,6 +45,7 @@ def func_found_middleware( name=func.__name__, filePath=filename, raw_params=argspec.annotations, + module_name=module_name, default_values=default_values, params=params, doc=func.__doc__ or '', @@ -49,7 +54,7 @@ def func_found_middleware( options=options, ) - type_extractor.collected_types[func_found.name] = func_found - return func_found + type_extractor.collected_types[collected_types_key] = func_found + return weakref.proxy(func_found) except Exception as e: raise e diff --git a/py_type_extractor/type_extractor/middlewares/newtype_found.py b/py_type_extractor/type_extractor/middlewares/newtype_found.py index 3ef8856..6ee1f95 100644 --- a/py_type_extractor/type_extractor/middlewares/newtype_found.py +++ b/py_type_extractor/type_extractor/middlewares/newtype_found.py @@ -2,6 +2,7 @@ from typing import Set from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +import typing_inspect from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption from py_type_extractor.type_extractor.nodes.NewType import NewTypeFound @@ -19,10 +20,15 @@ def newtype_found_middleware( if typ.__code__.co_name is not 'new_type': return None + already_found = type_extractor.collected_types.get(typ.__name__) + if already_found: + return already_found + newtype_found = NewTypeFound( name=typ.__name__, actual=type_extractor.rawtype_to_node(typ.__supertype__), + original_ref=typ, ) - type_extractor.collected_types[newtype_found.name] = newtype_found + type_extractor.collected_types[typ.__name__] = newtype_found return newtype_found diff --git a/py_type_extractor/type_extractor/middlewares/typeddict_found.py b/py_type_extractor/type_extractor/middlewares/typeddict_found.py index 3debad3..4e5d250 100644 --- a/py_type_extractor/type_extractor/middlewares/typeddict_found.py +++ b/py_type_extractor/type_extractor/middlewares/typeddict_found.py @@ -1,3 +1,6 @@ +import inspect +import weakref + from mypy_extensions import _TypedDictMeta # type: ignore from typing import Set @@ -13,17 +16,31 @@ def typeddict_found_middleware( ): if not isinstance(typ, _TypedDictMeta): return + + module = inspect.getmodule(typ) + module_name = module.__name__ + name = typ.__qualname__ + + collected_types_key = type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=name, + ) + + already_processed_node = type_extractor.collected_types.get(collected_types_key) + if already_processed_node: + return already_processed_node + annotations = { key: type_extractor.rawtype_to_node(value) for key, value in typ.__annotations__.items() } typed_dict_found = TypedDictFound( annotations=annotations, + module_name=module_name, name=typ.__qualname__, raw=typ, + options=options, ) - type_extractor.collected_types[ - f"{typ.__qualname__}_{hash(typ)}" - ] = typed_dict_found + type_extractor.collected_types[collected_types_key] = typed_dict_found - return typed_dict_found + return weakref.proxy(typed_dict_found) diff --git a/py_type_extractor/type_extractor/nodes/ClassFound.py b/py_type_extractor/type_extractor/nodes/ClassFound.py index 739edde..516b00f 100644 --- a/py_type_extractor/type_extractor/nodes/ClassFound.py +++ b/py_type_extractor/type_extractor/nodes/ClassFound.py @@ -16,6 +16,7 @@ class ClassFound(BaseNodeType): # type: ignore name: str fields: Dict[str, NodeType] filePath: str = field(default='') + module_name: str = field(default='') raw_fields: Dict[str, Any] = field(default_factory=dict) doc: str = field(default='') base_classes: List['ClassFound'] = field(default_factory=list) @@ -24,6 +25,9 @@ class ClassFound(BaseNodeType): # type: ignore INTERNAL_fields_extra: Optional[Dict[str, Any]] = None options: Set[BaseOption] = field(default_factory=set) + def __hash__(self): + return hash(id(ClassFound)) + hash(self.name) + hash(self.module_name) + def set_fields_extra(namespace: str): def __set_fields_extra( diff --git a/py_type_extractor/type_extractor/nodes/FixedGenericFound.py b/py_type_extractor/type_extractor/nodes/FixedGenericFound.py index 4b01439..4cc0b73 100644 --- a/py_type_extractor/type_extractor/nodes/FixedGenericFound.py +++ b/py_type_extractor/type_extractor/nodes/FixedGenericFound.py @@ -8,3 +8,8 @@ class FixedGenericFound(BaseNodeType): type_vars: List[NodeType] origin: NodeType + + def __hash__(self): + return hash(id(FixedGenericFound))\ + + hash(tuple(self.type_vars))\ + + hash(self.origin) diff --git a/py_type_extractor/type_extractor/nodes/FunctionFound.py b/py_type_extractor/type_extractor/nodes/FunctionFound.py index e91319f..eb02f12 100644 --- a/py_type_extractor/type_extractor/nodes/FunctionFound.py +++ b/py_type_extractor/type_extractor/nodes/FunctionFound.py @@ -12,12 +12,18 @@ class FunctionFound(BaseNodeType): func: Optional[Callable] = None default_values: Dict[str, Any] = field(default_factory=dict) raw_params: Dict[str, Any] = field(default_factory=dict) + module_name: str = field(default='') doc: str = '' filePath: str = '' INTERNAL_params_extra: Optional[Dict[str, Dict[str, Any]]] = None INTERNAL_return_extra: Optional[Dict[str, Any]] = None options: Set[BaseOption] = field(default_factory=set) + def __hash__(self): + return hash(FunctionFound)\ + + hash(self.name)\ + + hash(self.module_name) + def set_params_extra(namespace: str): def __set_fields_extra( diff --git a/py_type_extractor/type_extractor/nodes/MappingFound.py b/py_type_extractor/type_extractor/nodes/MappingFound.py index 4dc7ccc..500c30f 100644 --- a/py_type_extractor/type_extractor/nodes/MappingFound.py +++ b/py_type_extractor/type_extractor/nodes/MappingFound.py @@ -10,3 +10,8 @@ class MappingFound(BaseNodeType): # type: ignore value: NodeType options: Set[BaseOption] = field(default_factory=set) + + def __hash__(self): + return hash(MappingFound) \ + + hash(self.key)\ + + hash(self.value) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/nodes/NewType.py b/py_type_extractor/type_extractor/nodes/NewType.py index 8e89bda..8792b50 100644 --- a/py_type_extractor/type_extractor/nodes/NewType.py +++ b/py_type_extractor/type_extractor/nodes/NewType.py @@ -1,5 +1,5 @@ -from dataclasses import dataclass -from typing import List +from dataclasses import dataclass, field +from typing import List, Any from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType @@ -8,3 +8,11 @@ class NewTypeFound(BaseNodeType): name: str actual: NodeType + original_ref: Any = None + # TODO: bug in python? can't get module_name for NewType... + # module_name: str = field(default='') + + def __hash__(self): + return hash(id(NewTypeFound)) \ + + hash(self.name) \ + + hash(id(self.original_ref)) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/nodes/NoneNode.py b/py_type_extractor/type_extractor/nodes/NoneNode.py index efc33b0..8e3439e 100644 --- a/py_type_extractor/type_extractor/nodes/NoneNode.py +++ b/py_type_extractor/type_extractor/nodes/NoneNode.py @@ -5,7 +5,8 @@ class NoneNode(BaseNodeType): # type: ignore - pass + def __hash__(self): + return hash(id(NoneNode)) none_node = NoneNode() diff --git a/py_type_extractor/type_extractor/nodes/TupleFound.py b/py_type_extractor/type_extractor/nodes/TupleFound.py index e1e0903..68bdcd8 100644 --- a/py_type_extractor/type_extractor/nodes/TupleFound.py +++ b/py_type_extractor/type_extractor/nodes/TupleFound.py @@ -7,3 +7,6 @@ @dataclass class TupleFound(BaseNodeType): types: List[NodeType] + + def __hash__(self): + return hash(id(TupleFound)) + hash(tuple(self.types)) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/nodes/TypeVarFound.py b/py_type_extractor/type_extractor/nodes/TypeVarFound.py index 35977ab..91bb56d 100644 --- a/py_type_extractor/type_extractor/nodes/TypeVarFound.py +++ b/py_type_extractor/type_extractor/nodes/TypeVarFound.py @@ -7,5 +7,5 @@ @dataclass class TypeVarFound(BaseNodeType): name: str - original: TypeVar + original: TypeVar # type:ignore type_limits: Optional[List[NodeType]] = None diff --git a/py_type_extractor/type_extractor/nodes/TypedDictFound.py b/py_type_extractor/type_extractor/nodes/TypedDictFound.py index a3ec8e1..2920c73 100644 --- a/py_type_extractor/type_extractor/nodes/TypedDictFound.py +++ b/py_type_extractor/type_extractor/nodes/TypedDictFound.py @@ -1,8 +1,11 @@ from dataclasses import dataclass, field from typing import Dict, Optional, Set -from typing_extensions import _TypedDictMeta # type: ignore -# from mypy_extensions import _TypedDictMeta # type: ignore +try: + from typing_extensions import _TypedDictMeta # type: ignore +except: + from mypy_extensions import _TypedDictMeta # type: ignore + from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption @@ -10,6 +13,11 @@ @dataclass class TypedDictFound(BaseNodeType): # type: ignore annotations: Dict[str, NodeType] - name: str = '' - raw: Optional[_TypedDictMeta] = None + name: str = field(default='') + module_name: str = field(default='') + raw: Optional[_TypedDictMeta] = field(default=None) options: Set[BaseOption] = field(default_factory=set) + + def __hash__(self): + # exclude annotations: TypedDictA --> TypedDictB --> TypedDictA + return hash(id(TypedDictFound)) + hash(self.name) + hash(self.module_name) diff --git a/py_type_extractor/type_extractor/type_extractor.py b/py_type_extractor/type_extractor/type_extractor.py index f86e3b4..56c04c2 100644 --- a/py_type_extractor/type_extractor/type_extractor.py +++ b/py_type_extractor/type_extractor/type_extractor.py @@ -3,6 +3,7 @@ from collections import ( OrderedDict, ) +import weakref from typing import ( Callable, Dict, From 5ad0159fb6ca7b371f75acbad13e65b44ce2ee42 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Fri, 18 Sep 2020 19:24:17 +0900 Subject: [PATCH 19/34] fix inheritance with generics, add flatten_generics_inheritance_to --- .../test_fixtures/generic_classes.py | 5 +- .../test_class_of_generic_instance.py | 80 ------------------- .../type_extractor/middlewares/class_found.py | 29 +++++-- .../type_extractor/nodes/ClassFound.py | 5 +- .../type_extractor/nodes/TypeVarFound.py | 6 ++ .../{utils.py => utils/__init__.py} | 3 +- .../type_extractor/utils/generics.py | 46 +++++++++++ 7 files changed, 82 insertions(+), 92 deletions(-) delete mode 100644 py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py rename py_type_extractor/type_extractor/{utils.py => utils/__init__.py} (53%) create mode 100644 py_type_extractor/type_extractor/utils/generics.py diff --git a/py_type_extractor/test_fixtures/generic_classes.py b/py_type_extractor/test_fixtures/generic_classes.py index 96a3950..72399b9 100644 --- a/py_type_extractor/test_fixtures/generic_classes.py +++ b/py_type_extractor/test_fixtures/generic_classes.py @@ -4,6 +4,8 @@ SomeTypeVarB = TypeVar('SomeTypeVarB', int, str) +SomeTypeVarC = TypeVar('SomeTypeVarC') + class SomeGenericClass(Generic[SomeTypeVarA, SomeTypeVarB]): a: SomeTypeVarA @@ -28,7 +30,8 @@ class SomeClass: some_property: int + def some_func_with_generic_inst( - input: SomeGenericClass[float, SomeClass] + input: SomeGenericClass[float, SomeClass], ) -> str: return 'hello' diff --git a/py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py deleted file mode 100644 index 9fb8a4d..0000000 --- a/py_type_extractor/type_extractor/__tests__/test_class_of_generic_instance.py +++ /dev/null @@ -1,80 +0,0 @@ -import py_type_extractor.test_fixtures.generic_classes as t -from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test -from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound -from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound -from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound -from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound -from py_type_extractor.type_extractor.type_extractor import TypeExtractor - -module_name = t.__name__ - -# noinspection PyPep8Naming -def test_class_of_generic_instance(): - type_extractor = TypeExtractor() - type_extractor.add()(t.some_func_with_generic_inst) - print(type_extractor) - - collected_types = { - key: traverse(value, cleanup) - for (key, value) in type_extractor.collected_types.items() - } - some_typevar_A = TypeVarFound( - name='SomeTypeVarA', - original=t.SomeTypeVarA, - ) - some_typevar_B = TypeVarFound( - name='SomeTypeVarB', - original=t.SomeTypeVarB, - ) - some_generic_class = ClassFound( - module_name=module_name, - name='SomeGenericClass', - fields={ - 'a': some_typevar_A, - 'b': some_typevar_B, - 'some_int': int, - }, - type_vars=[ - some_typevar_A, some_typevar_B, - ], - ) - some_class = ClassFound( - module_name=module_name, - name='SomeClass', - fields={ - 'some_property': int, - } - ) - assert collected_types[ - type_extractor.to_collected_types_key( - module_name=module_name, - typ_name=t.SomeGenericClass.__qualname__, - ) - ] == some_generic_class - - assert collected_types[ - type_extractor.to_collected_types_key( - module_name=module_name, - typ_name=t.SomeClass.__qualname__, - ) - ] == some_class - - assert collected_types[ - type_extractor.to_collected_types_key( - module_name=module_name, - typ_name=t.some_func_with_generic_inst.__qualname__, - ) - ] == FunctionFound( - name='some_func_with_generic_inst', - module_name=module_name, - params={ - 'input': FixedGenericFound( - type_vars=[float, some_class], - origin=some_generic_class, - ) - }, - return_type=str, - ) - - hash_test(type_extractor) - diff --git a/py_type_extractor/type_extractor/middlewares/class_found.py b/py_type_extractor/type_extractor/middlewares/class_found.py index 47b6cb6..03acd0e 100644 --- a/py_type_extractor/type_extractor/middlewares/class_found.py +++ b/py_type_extractor/type_extractor/middlewares/class_found.py @@ -6,9 +6,10 @@ from dataclasses import dataclass from mypy_extensions import _TypedDictMeta # type: ignore -from typing import Set, Dict, cast, List, Generic +from typing import Set, Dict, cast, List, Generic, GenericMeta, Union from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound @@ -43,13 +44,25 @@ def class_found_middleware( _data_class = dataclass(_class) - base_classes = cast(List[ClassFound], [ - type_extractor.rawtype_to_node(base_cls) - for base_cls in list(_class.__bases__) - if base_cls is not object and - base_cls is not tuple and - base_cls is not Generic - ]) + base_classes_raw = typing_inspect.get_generic_bases(_class) + + base_classes = cast( + List[Union[ClassFound, FixedGenericFound]], + [ + type_extractor.rawtype_to_node(_parent_class) + for _parent_class in base_classes_raw + if typing_inspect.get_origin(_parent_class) is not Generic + ], + ) + + if len(base_classes_raw) == 0: + base_classes = cast(List[ClassFound], [ + type_extractor.rawtype_to_node(base_cls) + for base_cls in list(_class.__bases__) + if base_cls is not object and + base_cls is not tuple and + base_cls is not Generic + ]) argspec = inspect.getfullargspec(_data_class) diff --git a/py_type_extractor/type_extractor/nodes/ClassFound.py b/py_type_extractor/type_extractor/nodes/ClassFound.py index 516b00f..a11dc5a 100644 --- a/py_type_extractor/type_extractor/nodes/ClassFound.py +++ b/py_type_extractor/type_extractor/nodes/ClassFound.py @@ -4,10 +4,11 @@ Dict, Any, Callable, - Set, List, + Set, List, Union, ) from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound @@ -19,7 +20,7 @@ class ClassFound(BaseNodeType): # type: ignore module_name: str = field(default='') raw_fields: Dict[str, Any] = field(default_factory=dict) doc: str = field(default='') - base_classes: List['ClassFound'] = field(default_factory=list) + base_classes: List[Union[FixedGenericFound, 'ClassFound']] = field(default_factory=list) type_vars: List[TypeVarFound] = field(default_factory=list) class_raw: Optional[type] = None INTERNAL_fields_extra: Optional[Dict[str, Any]] = None diff --git a/py_type_extractor/type_extractor/nodes/TypeVarFound.py b/py_type_extractor/type_extractor/nodes/TypeVarFound.py index 91bb56d..139141d 100644 --- a/py_type_extractor/type_extractor/nodes/TypeVarFound.py +++ b/py_type_extractor/type_extractor/nodes/TypeVarFound.py @@ -9,3 +9,9 @@ class TypeVarFound(BaseNodeType): name: str original: TypeVar # type:ignore type_limits: Optional[List[NodeType]] = None + + def __hash__(self): + return hash(TypeVarFound)\ + + hash(self.name)\ + + hash(id(self.original)) \ + + hash(tuple(self.type_limits or [])) diff --git a/py_type_extractor/type_extractor/utils.py b/py_type_extractor/type_extractor/utils/__init__.py similarity index 53% rename from py_type_extractor/type_extractor/utils.py rename to py_type_extractor/type_extractor/utils/__init__.py index c96c0d9..5bd983b 100644 --- a/py_type_extractor/type_extractor/utils.py +++ b/py_type_extractor/type_extractor/utils/__init__.py @@ -3,4 +3,5 @@ def is_builtin(something): - return inspect.getmodule(something) is builtins \ No newline at end of file + return inspect.getmodule(something) is builtins + diff --git a/py_type_extractor/type_extractor/utils/generics.py b/py_type_extractor/type_extractor/utils/generics.py new file mode 100644 index 0000000..da04b30 --- /dev/null +++ b/py_type_extractor/type_extractor/utils/generics.py @@ -0,0 +1,46 @@ +from typing import Optional, Union, List, Set, Dict + +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound + + +def flatten_generics_inheritance_to( + from_typ: ClassFound, + to_typ: ClassFound, + given_types: List[NodeType] = [], +) -> List[FixedGenericFound]: + + if from_typ == to_typ: + return [ + FixedGenericFound( + type_vars=given_types, + origin=from_typ, + ), + ] + # given_types --> from_typ.type_vars + typevar_overrides: Dict[TypeVarFound, NodeType] = {} + for nth, type_var in enumerate(from_typ.type_vars): + # python doesn't have list.get(nth, fallback) -_- + try: + typevar_overrides[type_var] = given_types[nth] + except IndexError: + typevar_overrides[type_var] = type_var + + results: List[FixedGenericFound] = [] + for parent_cls in from_typ.base_classes: + if isinstance(parent_cls, FixedGenericFound) \ + and isinstance(parent_cls.origin, ClassFound): + override_types = [ + typevar_overrides[type_var] if isinstance(type_var, TypeVarFound) + else type_var + for type_var in parent_cls.type_vars + ] + results = results + flatten_generics_inheritance_to( + from_typ=parent_cls.origin, + to_typ=to_typ, + given_types=override_types, + ) + return results + From b98b9b7b3af329bb8d0e81817c94aabd7599ef9c Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Mon, 21 Sep 2020 16:26:07 +0900 Subject: [PATCH 20/34] fix python 3.7 error rel. to unused import --- .../type_extractor/middlewares/class_found.py | 8 +++----- .../type_extractor/middlewares/newtype_found.py | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/py_type_extractor/type_extractor/middlewares/class_found.py b/py_type_extractor/type_extractor/middlewares/class_found.py index 03acd0e..5541794 100644 --- a/py_type_extractor/type_extractor/middlewares/class_found.py +++ b/py_type_extractor/type_extractor/middlewares/class_found.py @@ -1,18 +1,16 @@ import inspect import weakref +from typing import Set, Dict, cast, List, Generic, Union import typing_inspect - from dataclasses import dataclass - from mypy_extensions import _TypedDictMeta # type: ignore -from typing import Set, Dict, cast, List, Generic, GenericMeta, Union from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound -from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound from py_type_extractor.type_extractor.utils import is_builtin diff --git a/py_type_extractor/type_extractor/middlewares/newtype_found.py b/py_type_extractor/type_extractor/middlewares/newtype_found.py index 6ee1f95..7078945 100644 --- a/py_type_extractor/type_extractor/middlewares/newtype_found.py +++ b/py_type_extractor/type_extractor/middlewares/newtype_found.py @@ -15,9 +15,9 @@ def newtype_found_middleware( ): if not inspect.isfunction(typ): return None - if typ.__module__ is not 'typing': + if typ.__module__ != 'typing': return None - if typ.__code__.co_name is not 'new_type': + if typ.__code__.co_name != 'new_type': return None already_found = type_extractor.collected_types.get(typ.__name__) From 083a9f878446ffcd611a2e9c3b5dd64f31e29dda Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Mon, 21 Sep 2020 20:04:58 +0900 Subject: [PATCH 21/34] add BaseNodeType.get_self for de-referencing weakref.proxy(node) --- py_type_extractor/type_extractor/nodes/BaseNodeType.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/py_type_extractor/type_extractor/nodes/BaseNodeType.py b/py_type_extractor/type_extractor/nodes/BaseNodeType.py index 3f6f865..9423591 100644 --- a/py_type_extractor/type_extractor/nodes/BaseNodeType.py +++ b/py_type_extractor/type_extractor/nodes/BaseNodeType.py @@ -9,6 +9,10 @@ class BaseOption: class BaseNodeType: options: Set[BaseOption] + # for de-referencing weakref.proxy + def get_self(self): + return self + NodeType = Union[BaseNodeType, type] From 122a27b0bef472f2201eef50ac48e08588391367 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Wed, 23 Sep 2020 17:33:25 +0900 Subject: [PATCH 22/34] add missing files due to git issues... --- .gitignore | 1 + py.typed | 0 .../test_fixtures/class_with_circular_deps.py | 10 ++ .../test_fixtures/func_with_arg_class.py | 7 + .../test_fixtures/generic_classes_extended.py | 34 ++++ .../test_class_with_circular_deps.py | 15 ++ ...s_with_generic_instance_and_inheritance.py | 155 ++++++++++++++++++ .../test_func_with_generic_instance.py | 80 +++++++++ .../nodes/utils/dedupe_nodes.py | 47 ++++++ 9 files changed, 349 insertions(+) create mode 100644 py.typed create mode 100644 py_type_extractor/test_fixtures/class_with_circular_deps.py create mode 100644 py_type_extractor/test_fixtures/func_with_arg_class.py create mode 100644 py_type_extractor/test_fixtures/generic_classes_extended.py create mode 100644 py_type_extractor/type_extractor/__tests__/test_class_with_circular_deps.py create mode 100644 py_type_extractor/type_extractor/__tests__/test_class_with_generic_instance_and_inheritance.py create mode 100644 py_type_extractor/type_extractor/__tests__/test_func_with_generic_instance.py create mode 100644 py_type_extractor/type_extractor/nodes/utils/dedupe_nodes.py diff --git a/.gitignore b/.gitignore index 82fea0c..1fbc27a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .mypy_cache __pycache__ +.ide .idea .pyre .python-version diff --git a/py.typed b/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/py_type_extractor/test_fixtures/class_with_circular_deps.py b/py_type_extractor/test_fixtures/class_with_circular_deps.py new file mode 100644 index 0000000..6f7f45d --- /dev/null +++ b/py_type_extractor/test_fixtures/class_with_circular_deps.py @@ -0,0 +1,10 @@ +from typing import Optional + + +class ClassA: + b: 'ClassB' + + +class ClassB: + a: Optional[ClassA] + diff --git a/py_type_extractor/test_fixtures/func_with_arg_class.py b/py_type_extractor/test_fixtures/func_with_arg_class.py new file mode 100644 index 0000000..20b09e3 --- /dev/null +++ b/py_type_extractor/test_fixtures/func_with_arg_class.py @@ -0,0 +1,7 @@ +class ArgClass: + arg1: str + arg2: int + + +def func_with_arg_class(a: ArgClass) -> ArgClass: + return a \ No newline at end of file diff --git a/py_type_extractor/test_fixtures/generic_classes_extended.py b/py_type_extractor/test_fixtures/generic_classes_extended.py new file mode 100644 index 0000000..b22099e --- /dev/null +++ b/py_type_extractor/test_fixtures/generic_classes_extended.py @@ -0,0 +1,34 @@ +import py_type_extractor.test_fixtures.generic_classes as t +from py_type_extractor.test_fixtures.generic_classes import ( + SomeTypeVarB +) + +from typing import TypeVar, Generic + +ExtendedTVar1 = TypeVar('ExtendedTVar1') +ExtendedTVar2 = TypeVar('ExtendedTVar2') +ExtendedTVar3 = TypeVar('ExtendedTVar3') + +ExtendedTVarA = TypeVar('ExtendedTVarA') + +class NotGenericClass: + a: int + +class SomeGenericInheritanceClass( + NotGenericClass, + t.SomeGenericClass[ExtendedTVar1, t.SomeTypeVarB], + Generic[ExtendedTVar1, ExtendedTVar2, SomeTypeVarB] +): + pass + + ''' + typing_inspect.get_parameters(t.SomeGenericClass) --> (~SomeTypeVarA, ~SomeTypeVarB) + + + ''' + +class SomeGenericInheritanceClassWithTypevarsSet( + SomeGenericInheritanceClass[float, ExtendedTVarA, str], + Generic[ExtendedTVarA] +): + pass \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_class_with_circular_deps.py b/py_type_extractor/type_extractor/__tests__/test_class_with_circular_deps.py new file mode 100644 index 0000000..159222e --- /dev/null +++ b/py_type_extractor/type_extractor/__tests__/test_class_with_circular_deps.py @@ -0,0 +1,15 @@ +from py_type_extractor.type_extractor.__tests__.utils import hash_test +from py_type_extractor.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.test_fixtures.class_with_circular_deps import ( + ClassA, +) + +def test_class_of_generic_origin(): + # TODO: make Lazy? + # hashing by: + type_extractor = TypeExtractor() + type_extractor.add()(ClassA) + print(type_extractor) + + # fixme: circular-dep hash + hash_test(type_extractor) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_class_with_generic_instance_and_inheritance.py b/py_type_extractor/type_extractor/__tests__/test_class_with_generic_instance_and_inheritance.py new file mode 100644 index 0000000..85016cc --- /dev/null +++ b/py_type_extractor/type_extractor/__tests__/test_class_with_generic_instance_and_inheritance.py @@ -0,0 +1,155 @@ +import py_type_extractor.test_fixtures.generic_classes_extended as t +import py_type_extractor.test_fixtures.generic_classes as t2 + +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound +from py_type_extractor.type_extractor.type_extractor import TypeExtractor +from py_type_extractor.type_extractor.utils.generics import flatten_generics_inheritance_to + +module_name = t.__name__ +module2_name = t2.__name__ + +# noinspection PyPep8Naming +def test_class_with_generic_instance_and_inheritance(): + type_extractor = TypeExtractor() + type_extractor.add()(t.SomeGenericInheritanceClass) + type_extractor.add()(t.SomeGenericInheritanceClassWithTypevarsSet) + + collected_types = { + key: traverse(value, cleanup) + for (key, value) in type_extractor.collected_types.items() + } + + not_generic_class = ClassFound( + module_name=module_name, + name=t.NotGenericClass.__qualname__, + fields={ + 'a': int, + } + ) + + + assert collected_types[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.NotGenericClass.__qualname__, + ) + ] == not_generic_class + + some_typevar_A = TypeVarFound( + name='SomeTypeVarA', + original=t2.SomeTypeVarA, + ) + some_typevar_B = TypeVarFound( + name='SomeTypeVarB', + original=t2.SomeTypeVarB, + ) + + some_generic_class = ClassFound( + module_name=module2_name, + name='SomeGenericClass', + fields={ + 'a': some_typevar_A, + 'b': some_typevar_B, + 'some_int': int, + }, + type_vars=[ + some_typevar_A, some_typevar_B, + ], + ) + + assert collected_types[ + type_extractor.to_collected_types_key( + module_name=module2_name, + typ_name=t2.SomeGenericClass.__qualname__, + ) + ] == some_generic_class + + some_generic_class = ClassFound( + module_name=module2_name, + name='SomeGenericClass', + fields={ + 'a': some_typevar_A, + 'b': some_typevar_B, + 'some_int': int, + }, + type_vars=[ + some_typevar_A, some_typevar_B, + ], + ) + + extended_tvar1 = TypeVarFound( + name='ExtendedTVar1', + original=t.ExtendedTVar1, + ) + extended_tvar2 = TypeVarFound( + name='ExtendedTVar2', + original=t.ExtendedTVar2, + ) + extended_tvar2 = TypeVarFound( + name='ExtendedTVar2', + original=t.ExtendedTVar2, + ) + some_generic_inheritance_class = ClassFound( + module_name=module_name, + name=t.SomeGenericInheritanceClass.__qualname__, + type_vars=[extended_tvar1, extended_tvar2, some_typevar_B], + fields={ + 'a': int, + }, + base_classes=[ + not_generic_class, + FixedGenericFound( + origin=some_generic_class, + type_vars=[extended_tvar1, some_typevar_B], + ) + ] + ) + + assert collected_types[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeGenericInheritanceClass.__qualname__, + ) + ] == some_generic_inheritance_class + + extended_tvarA = TypeVarFound( + name='ExtendedTVarA', + original=t.ExtendedTVarA, + ) + + some_generic_inheritance_class_with_typevarsSet = ClassFound( + module_name=module_name, + name=t.SomeGenericInheritanceClassWithTypevarsSet.__qualname__, + type_vars=[extended_tvarA], + fields={ + 'a': int, + }, + base_classes=[ + FixedGenericFound( + origin=some_generic_inheritance_class, + type_vars=[float, extended_tvarA, str], + ) + ], + ) + + assert collected_types[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeGenericInheritanceClassWithTypevarsSet.__qualname__, + ) + ] == some_generic_inheritance_class_with_typevarsSet + + flattened = flatten_generics_inheritance_to( + from_typ=some_generic_inheritance_class_with_typevarsSet, + to_typ=some_generic_class, + ) + assert flattened == [ + FixedGenericFound( + origin=some_generic_class, + type_vars=[float, str] + ) + ] diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_generic_instance.py b/py_type_extractor/type_extractor/__tests__/test_func_with_generic_instance.py new file mode 100644 index 0000000..b05b597 --- /dev/null +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_generic_instance.py @@ -0,0 +1,80 @@ +import py_type_extractor.test_fixtures.generic_classes as t +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound +from py_type_extractor.type_extractor.type_extractor import TypeExtractor + +module_name = t.__name__ + +# noinspection PyPep8Naming +def test_func_with_generic_instance(): + type_extractor = TypeExtractor() + type_extractor.add()(t.some_func_with_generic_inst) + print(type_extractor) + + collected_types = { + key: traverse(value, cleanup) + for (key, value) in type_extractor.collected_types.items() + } + some_typevar_A = TypeVarFound( + name='SomeTypeVarA', + original=t.SomeTypeVarA, + ) + some_typevar_B = TypeVarFound( + name='SomeTypeVarB', + original=t.SomeTypeVarB, + ) + some_generic_class = ClassFound( + module_name=module_name, + name='SomeGenericClass', + fields={ + 'a': some_typevar_A, + 'b': some_typevar_B, + 'some_int': int, + }, + type_vars=[ + some_typevar_A, some_typevar_B, + ], + ) + some_class = ClassFound( + module_name=module_name, + name='SomeClass', + fields={ + 'some_property': int, + } + ) + assert collected_types[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeGenericClass.__qualname__, + ) + ] == some_generic_class + + assert collected_types[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeClass.__qualname__, + ) + ] == some_class + + assert collected_types[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.some_func_with_generic_inst.__qualname__, + ) + ] == FunctionFound( + name='some_func_with_generic_inst', + module_name=module_name, + params={ + 'input': FixedGenericFound( + type_vars=[float, some_class], + origin=some_generic_class, + ) + }, + return_type=str, + ) + + hash_test(type_extractor) + diff --git a/py_type_extractor/type_extractor/nodes/utils/dedupe_nodes.py b/py_type_extractor/type_extractor/nodes/utils/dedupe_nodes.py new file mode 100644 index 0000000..86a617c --- /dev/null +++ b/py_type_extractor/type_extractor/nodes/utils/dedupe_nodes.py @@ -0,0 +1,47 @@ +# baseNode: BaseNodeType --> ( BaseNodeWithoutOptions, options ) +# Dict < +# Hash(BaseNodeWithoutOptions) , +# options +# > +from typing import List, Set + +from py_type_extractor.type_extractor.__tests__.test_class_with_union_field import SomeOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR + + +def dedupe_type( + node_list: List[NodeType], +) -> Set[NodeType]: + # Q. merging options? + result = set() + + +dedupe_type([ + ClassFound( + name='ClassWithUnionField', + fields={ + 'cwufField1': TypeOR( + a=str, b=int + ) + }, + options={SomeOption(some_var=1)}, + ), + ClassFound( + name='ClassWithUnionField', + fields={ + 'cwufField1': TypeOR( + a=str, b=int + ) + }, + options={}, + ), +]) + + +def a(ab: int): + print(ab) + + +a('aa') From 8f85a05e005813079ef41e0cfd592cea80d7ef43 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Wed, 23 Sep 2020 19:18:07 +0900 Subject: [PATCH 23/34] fix CI process --- .circleci/config.yml | 95 +++++++++++++++++++--------------------- .circleci/config_old.yml | 94 +++++++++++++++++++++++++++++++++++++++ setup.py | 1 + tox.ini | 9 ++++ 4 files changed, 149 insertions(+), 50 deletions(-) create mode 100644 .circleci/config_old.yml create mode 100644 tox.ini diff --git a/.circleci/config.yml b/.circleci/config.yml index e1df1ce..11a33e5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,44 +1,53 @@ version: 2 -user.email: devdoomari@gmail.com -user.name: devdoomari-circlei +workflows: + version: 2 + test: + jobs: + - test-3.6 + - test-3.7 + - test-3.8 jobs: - push_dist: + test-3.6: &test-template docker: - - image: circleci/python:3.6.9 + - image: circleci/python:3.6 + working_directory: ~/repo steps: - checkout - - run: - name: Set git username/email - command: 'mkdir -p ~/.git && git config --global user.email "devdoomari@gmail.com" && git config --global user.name "devdoomari.circleci"' - restore_cache: - key: deps2-{{ .Branch }}-{{ checksum "requirements.txt" }}-{{ checksum "requirements_dev.txt" }} + keys: v1-dependencies-{{ checksum "requirements.txt" }}-{{ checksum "requirements_dev.txt" }} - run: + name: install dependencies command: | python3 -m venv venv - source venv/bin/activate - pip install -r requirements.txt + . venv/bin/activate + pip install -e . pip install -r requirements_dev.txt + pip install coverage + pip install pytest + - save_cache: - key: deps2-{{ .Branch }}-{{ checksum "requirements.txt" }}-{{ checksum "requirements_dev.txt" }} paths: - - 'venv' + - ./venv + key: v1-dependencies-{{ checksum "requirements.txt" }}-{{ checksum "requirements_dev.txt" }} + - run: - name: test + name: run tests command: | - source venv/bin/activate - pytest + . venv/bin/activate + coverage run -m pytest + - restore_cache: name: Restore Yarn Package Cache key: nvm-{{ .Branch }}-{{ checksum ".circleci/config.yml" }}-{{ checksum ".circleci/nvm_env.sh" }} - run: command: | - wget https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh -O nvm.sh + wget https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh -O nvm.sh chmod +x nvm.sh ./nvm.sh - run: command: | source .circleci/nvm_env.sh - nvm install 10 + nvm install 12 nvm alias default node npm install -g yarn - save_cache: @@ -47,48 +56,34 @@ jobs: - '~/.nvm' - restore_cache: - key: yarn-{{ .Branch }}-{{ checksum "py_type_extractor/plugins/typescript/yarn.lock" }} + key: yarn-{{ .Branch }}-{{ checksum "~/repo/py_type_extractor/plugins/typescript/yarn.lock" }} - run: command: | source .circleci/nvm_env.sh - cd py_codegen/plugins/typescript + cd ~/repo/py_type_extractor/plugins/typescript yarn - save_cache: - key: yarn-{{ .Branch }}-{{ checksum "py_type_extractor/plugins/typescript/yarn.lock" }} + key: yarn-{{ .Branch }}-{{ checksum "~/repo/py_type_extractor/plugins/typescript/yarn.lock" }} paths: - - 'py_type_extractor/plugins/typescript/node_modules' + - '~/repo/py_type_extractor/plugins/typescript/node_modules' - run: command: | source venv/bin/activate source .circleci/nvm_env.sh - cd py_codegen/plugins/typescript + cd ~/repo/py_type_extractor/plugins/typescript yarn run test -# - restore_yarn_cache: -# name: Restore Yarn Package Cache -# keys: -# - yarn-packages-{{ .Branch }}-{{ checksum "yarn.lock" }} -# - yarn-packages-{{ .Branch }} -# - yarn-packages-master -# - yarn-packages- -# - run: -# name: Install Dependencies -# command: yarn install -# - save_cache: -# name: Save Yarn Package Cache -# key: yarn-packages-{{ .Branch }}-{{ checksum "yarn.lock" }} -# paths: -# - node_modules/ -# - run: -# name: build -# command: yarn build -workflows: - version: 2 - build_and_push: - jobs: - - push_dist: - filters: - branches: - ignore: - - /^dist*/ - - master + # store artifacts (for example logs, binaries, etc) + # to be available in the web app or through the API + - store_artifacts: + path: test-reports + + test-3.7: + <<: *test-template + docker: + - image: circleci/python:3.7 + + test-3.8: + <<: *test-template + docker: + - image: circleci/python:3.8 \ No newline at end of file diff --git a/.circleci/config_old.yml b/.circleci/config_old.yml new file mode 100644 index 0000000..e1df1ce --- /dev/null +++ b/.circleci/config_old.yml @@ -0,0 +1,94 @@ +version: 2 +user.email: devdoomari@gmail.com +user.name: devdoomari-circlei +jobs: + push_dist: + docker: + - image: circleci/python:3.6.9 + steps: + - checkout + - run: + name: Set git username/email + command: 'mkdir -p ~/.git && git config --global user.email "devdoomari@gmail.com" && git config --global user.name "devdoomari.circleci"' + - restore_cache: + key: deps2-{{ .Branch }}-{{ checksum "requirements.txt" }}-{{ checksum "requirements_dev.txt" }} + - run: + command: | + python3 -m venv venv + source venv/bin/activate + pip install -r requirements.txt + pip install -r requirements_dev.txt + - save_cache: + key: deps2-{{ .Branch }}-{{ checksum "requirements.txt" }}-{{ checksum "requirements_dev.txt" }} + paths: + - 'venv' + - run: + name: test + command: | + source venv/bin/activate + pytest + - restore_cache: + name: Restore Yarn Package Cache + key: nvm-{{ .Branch }}-{{ checksum ".circleci/config.yml" }}-{{ checksum ".circleci/nvm_env.sh" }} + - run: + command: | + wget https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh -O nvm.sh + chmod +x nvm.sh + ./nvm.sh + - run: + command: | + source .circleci/nvm_env.sh + nvm install 10 + nvm alias default node + npm install -g yarn + - save_cache: + key: nvm-{{ .Branch }}-{{ checksum ".circleci/config.yml" }}-{{ checksum ".circleci/nvm_env.sh" }} + paths: + - '~/.nvm' + + - restore_cache: + key: yarn-{{ .Branch }}-{{ checksum "py_type_extractor/plugins/typescript/yarn.lock" }} + - run: + command: | + source .circleci/nvm_env.sh + cd py_codegen/plugins/typescript + yarn + - save_cache: + key: yarn-{{ .Branch }}-{{ checksum "py_type_extractor/plugins/typescript/yarn.lock" }} + paths: + - 'py_type_extractor/plugins/typescript/node_modules' + - run: + command: | + source venv/bin/activate + source .circleci/nvm_env.sh + cd py_codegen/plugins/typescript + yarn run test +# - restore_yarn_cache: +# name: Restore Yarn Package Cache +# keys: +# - yarn-packages-{{ .Branch }}-{{ checksum "yarn.lock" }} +# - yarn-packages-{{ .Branch }} +# - yarn-packages-master +# - yarn-packages- +# - run: +# name: Install Dependencies +# command: yarn install +# - save_cache: +# name: Save Yarn Package Cache +# key: yarn-packages-{{ .Branch }}-{{ checksum "yarn.lock" }} +# paths: +# - node_modules/ +# - run: +# name: build +# command: yarn build + +workflows: + version: 2 + build_and_push: + jobs: + - push_dist: + filters: + branches: + ignore: + - /^dist*/ + - master diff --git a/setup.py b/setup.py index 3788080..c573752 100644 --- a/setup.py +++ b/setup.py @@ -24,5 +24,6 @@ "mypy", "mypy_extensions", "dataclasses", + "typing_inspect>=0.6.0", ], ) diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..31c6e0d --- /dev/null +++ b/tox.ini @@ -0,0 +1,9 @@ +[tox] +envlist = py36, py37, py38 + +[testenv] +deps = + -rrequirements.txt + -rrequirements_dev.txt + +commands = pytest \ No newline at end of file From 9b3e005066032807034ccf31667ad49d23eb7d7d Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Wed, 23 Sep 2020 14:03:01 +0900 Subject: [PATCH 24/34] add enum class --- py_type_extractor/test_fixtures/enum_class.py | 6 +++ .../__tests__/test_enum_class.py | 32 +++++++++++ .../__tests__/test_pydantic_classes.py | 16 +++--- .../type_extractor/__tests__/utils.py | 10 ++++ .../type_extractor/middlewares/class_found.py | 10 ++-- .../type_extractor/middlewares/enum_found.py | 54 +++++++++++++++++++ .../type_extractor/nodes/EnumFound.py | 51 ++++++++++++++++++ .../type_extractor/type_extractor.py | 2 + .../utils/items_view_to_iterable.py | 9 ++++ 9 files changed, 179 insertions(+), 11 deletions(-) create mode 100644 py_type_extractor/test_fixtures/enum_class.py create mode 100644 py_type_extractor/type_extractor/__tests__/test_enum_class.py create mode 100644 py_type_extractor/type_extractor/middlewares/enum_found.py create mode 100644 py_type_extractor/type_extractor/nodes/EnumFound.py create mode 100644 py_type_extractor/type_extractor/utils/items_view_to_iterable.py diff --git a/py_type_extractor/test_fixtures/enum_class.py b/py_type_extractor/test_fixtures/enum_class.py new file mode 100644 index 0000000..0f7790c --- /dev/null +++ b/py_type_extractor/test_fixtures/enum_class.py @@ -0,0 +1,6 @@ +import enum + + +class SomeEnumClass(enum.Enum): + AAAAA = enum.auto() + BBBBB = enum.auto() \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_enum_class.py b/py_type_extractor/type_extractor/__tests__/test_enum_class.py new file mode 100644 index 0000000..a9303cf --- /dev/null +++ b/py_type_extractor/type_extractor/__tests__/test_enum_class.py @@ -0,0 +1,32 @@ +import py_type_extractor.test_fixtures.enum_class as t + +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test +from py_type_extractor.type_extractor.nodes.EnumFound import EnumFound +from py_type_extractor.type_extractor.type_extractor import TypeExtractor + +module_name = t.__name__ + + +def test_enum_class(): + type_extractor = TypeExtractor() + + type_extractor.add(None)(t.SomeEnumClass) + + enums = { + key: traverse(value, cleanup) + for (key, value) in type_extractor.collected_types.items() + if isinstance(value, EnumFound) + } + assert enums[type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeEnumClass.__qualname__, + )] == EnumFound( + members={ + 'AAAAA': 1, + 'BBBBB': 2, + }, + doc='An enumeration.', + module_name=module_name, + name=t.SomeEnumClass.__qualname__, + ) + hash_test(type_extractor) diff --git a/py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py b/py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py index b497080..f586735 100644 --- a/py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py +++ b/py_type_extractor/type_extractor/__tests__/test_pydantic_classes.py @@ -1,3 +1,4 @@ +from typing import Dict, cast from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test from py_type_extractor.type_extractor.type_extractor import TypeExtractor @@ -12,15 +13,18 @@ def test_pydantic_classes(): type_extractor.add(None)(t.SomePydanticDataClass) print(type_extractor) - classes = { - key: traverse(value, cleanup) - for (key, value) in type_extractor.collected_types.items() - if isinstance(value, ClassFound) - } + classes = cast( + Dict[str, ClassFound], + { + key: traverse(value, cleanup) + for (key, value) in type_extractor.collected_types.items() + if isinstance(value, ClassFound) + }, + ) assert classes[ type_extractor.to_collected_types_key( module_name=module_name, - typ_name=t.SomePydanticDataClass.__qualname__, + typ_name=t.SomePydanticDataClass.__qualname__, # type: ignore ) ] == ClassFound( name='SomePydanticDataClass', diff --git a/py_type_extractor/type_extractor/__tests__/utils.py b/py_type_extractor/type_extractor/__tests__/utils.py index 904b30b..893ded3 100644 --- a/py_type_extractor/type_extractor/__tests__/utils.py +++ b/py_type_extractor/type_extractor/__tests__/utils.py @@ -4,6 +4,7 @@ from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType +from py_type_extractor.type_extractor.nodes.EnumFound import EnumFound from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound from py_type_extractor.type_extractor.nodes.NewType import NewTypeFound from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound @@ -20,6 +21,9 @@ def traverse(node: NodeType, func: traverse_func_type): + if isinstance(node, EnumFound): + enum_found_node = copy(node) + return func(enum_found_node) if isinstance(node, ClassFound): class_found_node = copy(node) class_found_node.fields = { @@ -93,6 +97,12 @@ def cleanup(node: NodeType): class_found_node.doc = '' return class_found_node + if isinstance(node, EnumFound): + enum_found_node = copy(node) + enum_found_node.enum_raw = None + enum_found_node.filePath = '' + return enum_found_node + if isinstance(node, FunctionFound): new_params = copy(node.params) diff --git a/py_type_extractor/type_extractor/middlewares/class_found.py b/py_type_extractor/type_extractor/middlewares/class_found.py index 5541794..a17b813 100644 --- a/py_type_extractor/type_extractor/middlewares/class_found.py +++ b/py_type_extractor/type_extractor/middlewares/class_found.py @@ -22,7 +22,7 @@ def class_found_middleware( if not inspect.isclass(_class) \ or is_builtin(_class) \ or _class is inspect._empty \ - or isinstance(_class, _TypedDictMeta): + or isinstance(_class, _TypedDictMeta): # type: ignore return None module = inspect.getmodule(_class) @@ -49,22 +49,22 @@ def class_found_middleware( [ type_extractor.rawtype_to_node(_parent_class) for _parent_class in base_classes_raw - if typing_inspect.get_origin(_parent_class) is not Generic + if typing_inspect.get_origin(_parent_class) is not Generic # type: ignore ], ) if len(base_classes_raw) == 0: - base_classes = cast(List[ClassFound], [ + base_classes = cast(List[Union[ClassFound, FixedGenericFound]], [ type_extractor.rawtype_to_node(base_cls) for base_cls in list(_class.__bases__) if base_cls is not object and base_cls is not tuple and - base_cls is not Generic + base_cls is not Generic # type: ignore ]) argspec = inspect.getfullargspec(_data_class) - filename = module and module.__file__ + filename = module and module.__file__ or '' class_found = ClassFound( name=name, diff --git a/py_type_extractor/type_extractor/middlewares/enum_found.py b/py_type_extractor/type_extractor/middlewares/enum_found.py new file mode 100644 index 0000000..bcd1531 --- /dev/null +++ b/py_type_extractor/type_extractor/middlewares/enum_found.py @@ -0,0 +1,54 @@ +import enum +import inspect +import weakref +from typing import Set, Dict + +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.EnumFound import EnumFound, EnumValueTypes +from py_type_extractor.type_extractor.utils.items_view_to_iterable import items_view_to_iterable + + +def enum_found_middleware( + _typ, + type_extractor: BaseTypeExtractor, + options: Set[BaseOption], +): + if not inspect.isclass(_typ) \ + or not issubclass(_typ, enum.Enum): + return None + + module = inspect.getmodule(_typ) + module_name = module.__name__ + + name = _typ.__qualname__.replace('.', '') + collected_types_key = type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=name, + ) + duplicate = type_extractor.collected_types.get(collected_types_key) + if duplicate is not None: + assert isinstance(duplicate, ClassFound) \ + and duplicate.class_raw == _typ + duplicate.options = duplicate.options.union(options) + return duplicate + + filename = (module and module.__file__) or '' + + members: Dict[str, EnumValueTypes] = { + key: enum_member.value + for (key, enum_member) in items_view_to_iterable(_typ.__members__.items()) + } + enum_found = EnumFound( + name=name, + enum_raw=_typ, + filePath=filename, + members=members, + module_name=module_name, + doc=_typ.__doc__, + options=options, + ) + + type_extractor.collected_types[collected_types_key] = enum_found + return weakref.proxy(enum_found) diff --git a/py_type_extractor/type_extractor/nodes/EnumFound.py b/py_type_extractor/type_extractor/nodes/EnumFound.py new file mode 100644 index 0000000..833e719 --- /dev/null +++ b/py_type_extractor/type_extractor/nodes/EnumFound.py @@ -0,0 +1,51 @@ +from dataclasses import dataclass, field +from typing import ( + Optional, + Dict, + Any, + Callable, + Set, List, Union, +) + +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound + +EnumValueTypes = Union[int, str] + +@dataclass +class EnumFound(BaseNodeType): # type: ignore + name: str + members: Dict[str, EnumValueTypes] + filePath: str = field(default='') + module_name: str = field(default='') + doc: str = field(default='') + enum_raw: Optional[type] = None + INTERNAL_fields_extra: Optional[Dict[str, Any]] = None + options: Set[BaseOption] = field(default_factory=set) + + def __hash__(self): + return hash(id(EnumFound)) + hash(self.name) + hash(self.module_name) + + +def set_fields_extra(namespace: str): + def __set_fields_extra( + enum_found: EnumFound, + extra: Dict[str, Any], + ): + enum_found.INTERNAL_fields_extra = \ + enum_found.INTERNAL_fields_extra or {} + + enum_found.INTERNAL_fields_extra[namespace] = \ + extra + return enum_found + return __set_fields_extra + + +def get_fields_extra( + namespace: str, +) -> Callable[[EnumFound], Optional[Dict[str, Any]]]: + def __get_fields_extra(enum_found: EnumFound): + return enum_found.INTERNAL_fields_extra \ + and enum_found.INTERNAL_fields_extra.get(namespace) + return __get_fields_extra diff --git a/py_type_extractor/type_extractor/type_extractor.py b/py_type_extractor/type_extractor/type_extractor.py index 56c04c2..991692e 100644 --- a/py_type_extractor/type_extractor/type_extractor.py +++ b/py_type_extractor/type_extractor/type_extractor.py @@ -15,6 +15,7 @@ from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor from py_type_extractor.type_extractor.middlewares.class_found import class_found_middleware from py_type_extractor.type_extractor.middlewares.dict_found import dict_found_middleware +from py_type_extractor.type_extractor.middlewares.enum_found import enum_found_middleware from py_type_extractor.type_extractor.middlewares.fixed_generic_found import fixed_generic_found_middleware from py_type_extractor.type_extractor.middlewares.function_found import func_found_middleware from py_type_extractor.type_extractor.middlewares.list_found import list_found_middleware @@ -46,6 +47,7 @@ class TypeExtractor(BaseTypeExtractor): BaseNodeType, ] ] = [ + enum_found_middleware, list_found_middleware, typeor_middleware, typeddict_found_middleware, diff --git a/py_type_extractor/type_extractor/utils/items_view_to_iterable.py b/py_type_extractor/type_extractor/utils/items_view_to_iterable.py new file mode 100644 index 0000000..f26d4d7 --- /dev/null +++ b/py_type_extractor/type_extractor/utils/items_view_to_iterable.py @@ -0,0 +1,9 @@ +from typing import Any, ItemsView, List, Tuple, TypeVar, cast + + +TKey = TypeVar('TKey') +TValue = TypeVar('TValue') + +# PyCharm temporary hack... +def items_view_to_iterable(a: ItemsView[TKey, TValue]) -> List[Tuple[TKey, TValue]]: + return cast(Any, a) \ No newline at end of file From 4a6b9369c85de8d752d56682d424ef490ddd33e4 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Tue, 6 Oct 2020 20:51:00 +0900 Subject: [PATCH 25/34] add 3.9 python testing --- .circleci/config.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 11a33e5..50a2f36 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,6 +6,7 @@ workflows: - test-3.6 - test-3.7 - test-3.8 + - test-3.9 jobs: test-3.6: &test-template docker: @@ -86,4 +87,9 @@ jobs: test-3.8: <<: *test-template docker: - - image: circleci/python:3.8 \ No newline at end of file + - image: circleci/python:3.8 + + test-3.9: + <<: *test-template + docker: + - image: circleci/python:3.9 \ No newline at end of file From b28fbaa991bc0da6e91ee26576b345874aa3221b Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Wed, 7 Oct 2020 13:48:05 +0900 Subject: [PATCH 26/34] improve test_various_classes diff view --- .../__tests__/test_various_classes.py | 80 ++++++++++--------- 1 file changed, 44 insertions(+), 36 deletions(-) diff --git a/py_type_extractor/type_extractor/__tests__/test_various_classes.py b/py_type_extractor/type_extractor/__tests__/test_various_classes.py index ecbb901..c748ab1 100644 --- a/py_type_extractor/type_extractor/__tests__/test_various_classes.py +++ b/py_type_extractor/type_extractor/__tests__/test_various_classes.py @@ -6,8 +6,8 @@ module_name = t.__name__ -def test_various_classes(): +def test_various_classes(): type_extractor = TypeExtractor() type_extractor.add(None)(t.SomeDataClass) type_extractor.add(None)(t.SomeNormalClass) @@ -17,42 +17,50 @@ def test_various_classes(): for (key, value) in type_extractor.collected_types.items() if isinstance(value, ClassFound) } - assert classes == { - type_extractor.to_collected_types_key( - module_name=module_name, - typ_name=t.SomeDataClass.__qualname__, - ): ClassFound( - module_name=module_name, - name='SomeDataClass', - fields={ - 'sdcArg1': int, - 'sdcArg2': str, - }, - ), - type_extractor.to_collected_types_key( - module_name=module_name, - typ_name=t.SomeNormalClass.__qualname__, - ): ClassFound( - module_name=module_name, - name='SomeNormalClass', - fields={ - 'checklist': DictFound(key=str, value=bool), - }, - ), - type_extractor.to_collected_types_key( - module_name=module_name, - typ_name=t.SomeNamedTuple.__qualname__, - ): ClassFound( - module_name=module_name, - name='SomeNamedTuple', - fields={ - 'sntArg1': int, - 'sntArg2': float, - }, - ) - } + assert classes[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeDataClass.__qualname__, + ) + ] == ClassFound( + module_name=module_name, + name='SomeDataClass', + fields={ + 'sdcArg1': int, + 'sdcArg2': str, + }, + ) + + assert classes[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeNormalClass.__qualname__, + ) + ] == ClassFound( + module_name=module_name, + name='SomeNormalClass', + fields={ + 'checklist': DictFound(key=str, value=bool), + }, + ) + + assert classes[ + type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.SomeNamedTuple.__qualname__, + ) + ] == ClassFound( + module_name=module_name, + name='SomeNamedTuple', + fields={ + 'sntArg1': int, + 'sntArg2': float, + }, + ) + assert len(classes) == 3 + functions = type_extractor.functions functions_list = functions.values() - assert(functions_list.__len__() == 0) + assert (functions_list.__len__() == 0) hash_test(type_extractor) From 34267ab6c956818bac4fdf474982db78964000b0 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Wed, 7 Oct 2020 14:17:42 +0900 Subject: [PATCH 27/34] remove py3.9 NamedTuple inside base_class for 3.6-3.8 consistency --- py_type_extractor/type_extractor/middlewares/class_found.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/py_type_extractor/type_extractor/middlewares/class_found.py b/py_type_extractor/type_extractor/middlewares/class_found.py index a17b813..e203936 100644 --- a/py_type_extractor/type_extractor/middlewares/class_found.py +++ b/py_type_extractor/type_extractor/middlewares/class_found.py @@ -1,6 +1,6 @@ import inspect import weakref -from typing import Set, Dict, cast, List, Generic, Union +from typing import Set, Dict, cast, List, Generic, Union, NamedTuple import typing_inspect from dataclasses import dataclass @@ -49,7 +49,8 @@ def class_found_middleware( [ type_extractor.rawtype_to_node(_parent_class) for _parent_class in base_classes_raw - if typing_inspect.get_origin(_parent_class) is not Generic # type: ignore + if typing_inspect.get_origin(_parent_class) is not Generic # type: ignore + and _parent_class is not NamedTuple ], ) From 08a43bed183057d6dac574b04e76d6eb5e6fcbf8 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Wed, 4 Nov 2020 19:20:46 +0900 Subject: [PATCH 28/34] fix installation fail for python >=3.7 (due to dataclasses) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c573752..783efb3 100644 --- a/setup.py +++ b/setup.py @@ -23,7 +23,7 @@ install_requires=[ "mypy", "mypy_extensions", - "dataclasses", + "dataclasses; python_version < '3.7.0'", "typing_inspect>=0.6.0", ], ) From 00c8b0f89f021ed8511d274f6fabff7a99f0f9f5 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Wed, 11 Nov 2020 23:59:18 +0900 Subject: [PATCH 29/34] add class method extraction, proper options handling (needs refactoring later) --- .../test_fixtures/class_with_methods.py | 3 + py_type_extractor/type_extractor/__base__.py | 14 +- .../__tests__/test_class_of_generic_origin.py | 7 +- .../test_class_with_circular_deps.py | 1 - ...s_with_generic_instance_and_inheritance.py | 7 +- .../__tests__/test_class_with_method.py | 52 +++++++ .../__tests__/test_class_with_union_field.py | 2 +- .../__tests__/test_func_with_list.py | 2 +- .../test_func_with_nested_arg_class.py | 2 - .../__tests__/test_func_with_typed_dict.py | 5 +- .../type_extractor/__tests__/utils.py | 132 ---------------- .../__tests__/utils/__init__.py | 5 + .../__tests__/utils/cleanup_node.py | 63 ++++++++ .../__tests__/utils/flags/KeepClassMethods.py | 11 ++ .../__tests__/utils/flags/__base__.py | 2 + .../__tests__/utils/flags/__init__.py | 0 .../__tests__/utils/hash_test.py | 10 ++ .../__tests__/utils/traverse_func_type.py | 9 ++ .../__tests__/utils/traverse_node.py | 146 ++++++++++++++++++ .../utils/traversed_or_traversing.py | 5 + .../type_extractor/middlewares/TypeVar.py | 2 +- .../type_extractor/middlewares/class_found.py | 35 ++++- .../type_extractor/middlewares/dict_found.py | 2 +- .../type_extractor/middlewares/enum_found.py | 2 +- .../middlewares/fixed_generic_found.py | 2 +- .../middlewares/function_found.py | 9 +- .../type_extractor/middlewares/list_found.py | 2 +- .../middlewares/literal_found.py | 2 +- .../middlewares/mapping_found.py | 2 +- .../middlewares/newtype_found.py | 2 +- .../type_extractor/middlewares/tuple_found.py | 2 +- .../type_extractor/middlewares/type_or.py | 2 +- .../middlewares/typeddict_found.py | 2 +- .../type_extractor/nodes/BaseNodeType.py | 5 +- .../type_extractor/nodes/BaseOption.py | 12 ++ .../nodes/BaseTraversableOption.py | 21 +++ .../type_extractor/nodes/ClassFound.py | 5 +- .../type_extractor/nodes/DictFound.py | 3 +- .../type_extractor/nodes/EnumFound.py | 3 +- .../type_extractor/nodes/FixedGenericFound.py | 6 +- .../type_extractor/nodes/FunctionFound.py | 5 +- .../type_extractor/nodes/ListFound.py | 3 +- .../type_extractor/nodes/LiteralFound.py | 3 +- .../type_extractor/nodes/MappingFound.py | 3 +- .../type_extractor/nodes/NewType.py | 5 +- .../type_extractor/nodes/NoneNode.py | 3 +- .../type_extractor/nodes/TupleFound.py | 6 +- .../type_extractor/nodes/TypeOR.py | 3 +- .../type_extractor/nodes/TypeVarFound.py | 6 +- .../type_extractor/nodes/TypedDictFound.py | 3 +- .../type_extractor/nodes/__flags.py | 10 ++ .../type_extractor/type_extractor.py | 3 +- 52 files changed, 463 insertions(+), 189 deletions(-) create mode 100644 py_type_extractor/type_extractor/__tests__/test_class_with_method.py delete mode 100644 py_type_extractor/type_extractor/__tests__/utils.py create mode 100644 py_type_extractor/type_extractor/__tests__/utils/__init__.py create mode 100644 py_type_extractor/type_extractor/__tests__/utils/cleanup_node.py create mode 100644 py_type_extractor/type_extractor/__tests__/utils/flags/KeepClassMethods.py create mode 100644 py_type_extractor/type_extractor/__tests__/utils/flags/__base__.py create mode 100644 py_type_extractor/type_extractor/__tests__/utils/flags/__init__.py create mode 100644 py_type_extractor/type_extractor/__tests__/utils/hash_test.py create mode 100644 py_type_extractor/type_extractor/__tests__/utils/traverse_func_type.py create mode 100644 py_type_extractor/type_extractor/__tests__/utils/traverse_node.py create mode 100644 py_type_extractor/type_extractor/__tests__/utils/traversed_or_traversing.py create mode 100644 py_type_extractor/type_extractor/nodes/BaseOption.py create mode 100644 py_type_extractor/type_extractor/nodes/BaseTraversableOption.py create mode 100644 py_type_extractor/type_extractor/nodes/__flags.py diff --git a/py_type_extractor/test_fixtures/class_with_methods.py b/py_type_extractor/test_fixtures/class_with_methods.py index e69de29..105fe42 100644 --- a/py_type_extractor/test_fixtures/class_with_methods.py +++ b/py_type_extractor/test_fixtures/class_with_methods.py @@ -0,0 +1,3 @@ +class ClassWithMethod: + def some_method(self, arg: int) -> int: + return id(self) + arg diff --git a/py_type_extractor/type_extractor/__base__.py b/py_type_extractor/type_extractor/__base__.py index a95a85e..afd549e 100644 --- a/py_type_extractor/type_extractor/__base__.py +++ b/py_type_extractor/type_extractor/__base__.py @@ -1,10 +1,11 @@ -from abc import ABC +import abc from typing import Dict, Union, List, Set, Optional -from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption -class BaseTypeExtractor(ABC): +class BaseTypeExtractor(metaclass=abc.ABCMeta): collected_types: Dict[str, NodeType] def __init__(self): @@ -14,6 +15,7 @@ def __init__(self): def to_collected_types_key(module_name, typ_name): return f"{module_name}___{typ_name}" + @abc.abstractmethod def params_to_nodes( self, params: Dict[str, Union[type, None]], @@ -21,7 +23,11 @@ def params_to_nodes( ) -> Dict[str, NodeType]: pass - def rawtype_to_node(self, typ) -> NodeType: + @abc.abstractmethod + def rawtype_to_node( + self, typ, + options: Optional[Set[BaseOption]] = None, + ) -> NodeType: pass def add( diff --git a/py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py index 026c2a2..f931829 100644 --- a/py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_of_generic_origin.py @@ -1,11 +1,14 @@ -import py_type_extractor.test_fixtures.generic_classes as t -from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test +import py_type_extractor.test_fixtures.generic_classes as t +from py_type_extractor.type_extractor.__tests__.utils.cleanup_node import cleanup +from py_type_extractor.type_extractor.__tests__.utils.hash_test import hash_test +from py_type_extractor.type_extractor.__tests__.utils.traverse_node import traverse from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound from py_type_extractor.type_extractor.type_extractor import TypeExtractor module_name = t.__name__ + def test_class_of_generic_origin(): type_extractor = TypeExtractor() type_extractor.add()(t.SomeGenericClass) diff --git a/py_type_extractor/type_extractor/__tests__/test_class_with_circular_deps.py b/py_type_extractor/type_extractor/__tests__/test_class_with_circular_deps.py index 159222e..b02d702 100644 --- a/py_type_extractor/type_extractor/__tests__/test_class_with_circular_deps.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_with_circular_deps.py @@ -11,5 +11,4 @@ def test_class_of_generic_origin(): type_extractor.add()(ClassA) print(type_extractor) - # fixme: circular-dep hash hash_test(type_extractor) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_class_with_generic_instance_and_inheritance.py b/py_type_extractor/type_extractor/__tests__/test_class_with_generic_instance_and_inheritance.py index 85016cc..d166051 100644 --- a/py_type_extractor/type_extractor/__tests__/test_class_with_generic_instance_and_inheritance.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_with_generic_instance_and_inheritance.py @@ -1,10 +1,9 @@ -import py_type_extractor.test_fixtures.generic_classes_extended as t import py_type_extractor.test_fixtures.generic_classes as t2 - -from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test +import py_type_extractor.test_fixtures.generic_classes_extended as t +from py_type_extractor.type_extractor.__tests__.utils.cleanup_node import cleanup +from py_type_extractor.type_extractor.__tests__.utils.traverse_node import traverse from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound -from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound from py_type_extractor.type_extractor.type_extractor import TypeExtractor from py_type_extractor.type_extractor.utils.generics import flatten_generics_inheritance_to diff --git a/py_type_extractor/type_extractor/__tests__/test_class_with_method.py b/py_type_extractor/type_extractor/__tests__/test_class_with_method.py new file mode 100644 index 0000000..028f160 --- /dev/null +++ b/py_type_extractor/type_extractor/__tests__/test_class_with_method.py @@ -0,0 +1,52 @@ +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup +from py_type_extractor.type_extractor.__tests__.utils.flags.KeepClassMethods import ( + keep_class_methods, +) +from py_type_extractor.type_extractor.__tests__.utils.hash_test import hash_test +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.__flags import FromMethod +from py_type_extractor.type_extractor.type_extractor import TypeExtractor +import py_type_extractor.test_fixtures.class_with_methods as t + +module_name = t.__name__ + +def test_class_with_method(): + type_extractor = TypeExtractor() + type_extractor.add()(t.ClassWithMethod) + + classes = { + key: traverse(value, cleanup, None, { keep_class_methods }) + for (key, value) in type_extractor.collected_types.items() + if isinstance(value, ClassFound) + } + + class_type_key = type_extractor.to_collected_types_key( + module_name=module_name, + typ_name=t.ClassWithMethod.__qualname__, + ) + some_method = FunctionFound( + name='some_method', + module_name=module_name, + params={ + 'arg': int, + }, + return_type=int, + ) + class_found = ClassFound( + methods={ + 'some_method': some_method, + }, + fields={}, + module_name=module_name, + name=t.ClassWithMethod.__qualname__, + ) + some_method.options = { + FromMethod( + method_name='some_method', + ) + } + assert classes[class_type_key] == class_found + print(type_extractor) + + hash_test(type_extractor) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py b/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py index 81d94ea..7c7b8b8 100644 --- a/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py @@ -1,7 +1,7 @@ from dataclasses import dataclass import py_type_extractor.test_fixtures.union_type_class as t -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_list.py b/py_type_extractor/type_extractor/__tests__/test_func_with_list.py index f607fb5..94e6d22 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_list.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_list.py @@ -1,7 +1,7 @@ from dataclasses import dataclass from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from py_type_extractor.type_extractor.nodes.ListFound import ListFound from py_type_extractor.type_extractor.type_extractor import TypeExtractor diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py b/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py index 2ad9403..3ab5897 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_nested_arg_class.py @@ -34,7 +34,6 @@ def to_collected_types_key(a): name='test_func_with_nested_arg_class.ChildClass', module_name=module_name, fields={ - 'return': None, 'carg1': str, }, doc='', @@ -46,7 +45,6 @@ def to_collected_types_key(a): module_name=module_name, name="test_func_with_nested_arg_class.ParentClass", fields={ - 'return': None, 'parg1': str, 'parg2': child_class, }, diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_typed_dict.py b/py_type_extractor/type_extractor/__tests__/test_func_with_typed_dict.py index 94f2468..9c2b041 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_typed_dict.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_typed_dict.py @@ -1,4 +1,3 @@ -from py_type_extractor.test_fixtures.func_with_typed_dict import func_with_typed_dict import py_type_extractor.test_fixtures.func_with_typed_dict as t from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound @@ -11,7 +10,7 @@ def test_func_with_typed_dict(): type_collector = TypeExtractor() - type_collector.add(None)(func_with_typed_dict) + type_collector.add(None)(t.func_with_typed_dict) collected_types_key = type_collector.to_collected_types_key( module_name=module_name, @@ -22,7 +21,7 @@ def test_func_with_typed_dict(): to_compare_func = traverse( FunctionFound( - name=func_with_typed_dict.__qualname__, + name=t.func_with_typed_dict.__qualname__, module_name=module_name, params={ 'input': TypedDictFound( diff --git a/py_type_extractor/type_extractor/__tests__/utils.py b/py_type_extractor/type_extractor/__tests__/utils.py deleted file mode 100644 index 893ded3..0000000 --- a/py_type_extractor/type_extractor/__tests__/utils.py +++ /dev/null @@ -1,132 +0,0 @@ -from collections import OrderedDict -from copy import deepcopy, copy -from typing import Callable - -from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType -from py_type_extractor.type_extractor.nodes.EnumFound import EnumFound -from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound -from py_type_extractor.type_extractor.nodes.NewType import NewTypeFound -from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound -from py_type_extractor.type_extractor.nodes.TypedDictFound import TypedDictFound -from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound -from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound -from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR - - -traverse_func_type = Callable[ - [NodeType], - NodeType, -] - - -def traverse(node: NodeType, func: traverse_func_type): - if isinstance(node, EnumFound): - enum_found_node = copy(node) - return func(enum_found_node) - if isinstance(node, ClassFound): - class_found_node = copy(node) - class_found_node.fields = { - key: traverse(value, func) - for (key, value) in node.fields.items() - } - class_found_node.base_classes = [ - traverse(base_class, func) - for base_class in node.base_classes - ] - return func(class_found_node) - if isinstance(node, FunctionFound): - function_found_node = copy(node) - function_found_node.params = OrderedDict([ - (key, traverse(value, func)) - for (key, value) in node.params.items() - ]) - function_found_node.return_type = traverse(node.return_type, func) - return func(function_found_node) - if isinstance(node, TypedDictFound): - typed_dict_node = copy(node) - typed_dict_node.annotations = { - key: traverse(value, func) - for (key, value) in node.annotations.items() - } - return func(typed_dict_node) - if isinstance(node, TypeOR): - typeor_node = copy(node) - typeor_node.a = traverse(node.a, func) - typeor_node.b = traverse(node.b, func) - return func(typeor_node) - - if isinstance(node, FixedGenericFound): - fixed_generic_node = copy(node) - fixed_generic_node.origin = traverse( - node.origin, func - ) - fixed_generic_node.type_vars = [ - traverse(node_type_vars, func) - for node_type_vars in node.type_vars - ] - return func(fixed_generic_node) - - if isinstance(node, TypeVarFound): - typevar_node = copy(node) - typevar_node.original = traverse( - node.original, func - ) - return func(typevar_node) - if isinstance(node, NewTypeFound): - newtype_found = copy(node) - newtype_found.actual = traverse( - node.actual, func - ) - return func(newtype_found) - return node - - -def cleanup(node: NodeType): - if isinstance(node, ClassFound): - class_found_node = copy(node) - class_found_node.raw_fields = {} - class_found_node.class_raw = None - class_found_node.fields = copy(node.fields) - - # for python < 3.7.2 compat. - # (python 3.7.2 adds 'return' on fields - class_found_node.fields.pop('return', None) - - class_found_node.filePath = '' - class_found_node.doc = '' - return class_found_node - - if isinstance(node, EnumFound): - enum_found_node = copy(node) - enum_found_node.enum_raw = None - enum_found_node.filePath = '' - return enum_found_node - - if isinstance(node, FunctionFound): - new_params = copy(node.params) - - # for python < 3.7.2 compat. - # (python 3.7.2 adds 'return' on fields - new_params.pop('return', None) - - func_found_node = copy(node) - func_found_node.filePath = '' - func_found_node.raw_params = {} - func_found_node.params = new_params - func_found_node.doc = '' - func_found_node.func = None - return func_found_node - - if isinstance(node, TypedDictFound): - new_node = copy(node) - new_node.raw = None - return new_node - return node - -def hash_test(type_extractor: BaseTypeExtractor): - for (key, value) in type_extractor.collected_types.items(): - try: - hash(value) - except Exception as e: - raise RuntimeError(f"Hash failed -- couldn't hash {key} of {value}") \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/utils/__init__.py b/py_type_extractor/type_extractor/__tests__/utils/__init__.py new file mode 100644 index 0000000..20020f3 --- /dev/null +++ b/py_type_extractor/type_extractor/__tests__/utils/__init__.py @@ -0,0 +1,5 @@ +from .cleanup_node import cleanup +from .hash_test import hash_test +from .traverse_node import ( + traverse, +) diff --git a/py_type_extractor/type_extractor/__tests__/utils/cleanup_node.py b/py_type_extractor/type_extractor/__tests__/utils/cleanup_node.py new file mode 100644 index 0000000..645e308 --- /dev/null +++ b/py_type_extractor/type_extractor/__tests__/utils/cleanup_node.py @@ -0,0 +1,63 @@ +from copy import copy +from typing import Set + +from py_type_extractor.type_extractor.__tests__.utils.flags.KeepClassMethods import KeepClassMethods, keep_class_methods +from py_type_extractor.type_extractor.__tests__.utils.flags.__base__ import BaseUtilFlag +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.EnumFound import EnumFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.TypedDictFound import TypedDictFound + + +def cleanup( + node: NodeType, + flags: Set[BaseUtilFlag] = None, +): + if flags is None: + flags = set() + + if isinstance(node, ClassFound): + class_found_node = copy(node) + class_found_node.raw_fields = {} + class_found_node.class_raw = None + class_found_node.fields = copy(node.fields) + if keep_class_methods in flags: + class_found_node.methods = copy(node.methods) + else: + class_found_node.methods = {} + + # for python < 3.7.2 compat. + # (python 3.7.2 adds 'return' on fields + class_found_node.fields.pop('return', None) + + class_found_node.filePath = '' + class_found_node.doc = '' + return class_found_node + + if isinstance(node, EnumFound): + enum_found_node = copy(node) + enum_found_node.enum_raw = None + enum_found_node.filePath = '' + return enum_found_node + + if isinstance(node, FunctionFound): + new_params = copy(node.params) + + # for python < 3.7.2 compat. + # (python 3.7.2 adds 'return' on fields + new_params.pop('return', None) + + func_found_node = copy(node) + func_found_node.filePath = '' + func_found_node.raw_params = {} + func_found_node.params = new_params + func_found_node.doc = '' + func_found_node.func = None + return func_found_node + + if isinstance(node, TypedDictFound): + new_node = copy(node) + new_node.raw = None + return new_node + return node \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/utils/flags/KeepClassMethods.py b/py_type_extractor/type_extractor/__tests__/utils/flags/KeepClassMethods.py new file mode 100644 index 0000000..91c7e57 --- /dev/null +++ b/py_type_extractor/type_extractor/__tests__/utils/flags/KeepClassMethods.py @@ -0,0 +1,11 @@ +from dataclasses import dataclass + +from py_type_extractor.type_extractor.__tests__.utils.flags.__base__ import BaseUtilFlag + + +@dataclass(frozen=True) +class KeepClassMethods(BaseUtilFlag): + pass + + +keep_class_methods = KeepClassMethods() diff --git a/py_type_extractor/type_extractor/__tests__/utils/flags/__base__.py b/py_type_extractor/type_extractor/__tests__/utils/flags/__base__.py new file mode 100644 index 0000000..3b143ed --- /dev/null +++ b/py_type_extractor/type_extractor/__tests__/utils/flags/__base__.py @@ -0,0 +1,2 @@ +class BaseUtilFlag: + pass \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/utils/flags/__init__.py b/py_type_extractor/type_extractor/__tests__/utils/flags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/py_type_extractor/type_extractor/__tests__/utils/hash_test.py b/py_type_extractor/type_extractor/__tests__/utils/hash_test.py new file mode 100644 index 0000000..99a7411 --- /dev/null +++ b/py_type_extractor/type_extractor/__tests__/utils/hash_test.py @@ -0,0 +1,10 @@ +from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor + + +def hash_test(type_extractor: BaseTypeExtractor): + for (key, value) in type_extractor.collected_types.items(): + try: + hashed = hash(value) + print(hashed) + except Exception as e: + raise RuntimeError(f"Hash failed -- couldn't hash {key} of {value}") \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/utils/traverse_func_type.py b/py_type_extractor/type_extractor/__tests__/utils/traverse_func_type.py new file mode 100644 index 0000000..0dcea14 --- /dev/null +++ b/py_type_extractor/type_extractor/__tests__/utils/traverse_func_type.py @@ -0,0 +1,9 @@ +from typing import Set, TypeVar, Callable + +from py_type_extractor.type_extractor.__tests__.utils.flags.__base__ import BaseUtilFlag +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType + +TNode = TypeVar('TNode', bound=NodeType) + + +TraverseFuncType = Callable[[TNode, Set[BaseUtilFlag]], TNode] diff --git a/py_type_extractor/type_extractor/__tests__/utils/traverse_node.py b/py_type_extractor/type_extractor/__tests__/utils/traverse_node.py new file mode 100644 index 0000000..199a409 --- /dev/null +++ b/py_type_extractor/type_extractor/__tests__/utils/traverse_node.py @@ -0,0 +1,146 @@ +from collections import OrderedDict +from copy import copy +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption +from typing import Any, Set, TypeVar, cast + +from py_type_extractor.type_extractor.__tests__.utils.traverse_func_type import TraverseFuncType +from py_type_extractor.type_extractor.__tests__.utils.flags.KeepClassMethods import keep_class_methods +from py_type_extractor.type_extractor.__tests__.utils.flags.__base__ import BaseUtilFlag +from py_type_extractor.type_extractor.__tests__.utils.traversed_or_traversing import TraversedOrTraversing +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType +from py_type_extractor.type_extractor.nodes.BaseTraversableOption import BaseTraversableOption +from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.EnumFound import EnumFound +from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.NewType import NewTypeFound +from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR +from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound +from py_type_extractor.type_extractor.nodes.TypedDictFound import TypedDictFound +from py_type_extractor.type_extractor.nodes.UnknownFound import INTERNAL___UnknownFound + + +TNode = TypeVar('TNode', bound=NodeType) + + +def traverse( + node: TNode, + func: TraverseFuncType, + already_traversed: TraversedOrTraversing = None, + flags: Set[BaseUtilFlag] = None, +) -> TNode: + if already_traversed is None: + already_traversed = dict() + if type(already_traversed) == set: + print('aaa') + if flags is None: + flags = set() + + if isinstance(node, INTERNAL___UnknownFound): + return node + + if not isinstance(node, BaseNodeType): + return node + # node = cast(BaseNodeType, node.get_self()) + node_id = id(node) + if node_id in already_traversed: + return cast( + Any, + already_traversed[node_id], + ) + + new_options: Set[BaseOption] = set([ + opt.traverse(func, already_traversed, flags) + if isinstance(opt, BaseTraversableOption) + else opt + for opt in list(node.options) + ]) + + if isinstance(node, EnumFound): + enum_found_node = func(copy(node), flags) + already_traversed[node_id] = enum_found_node + enum_found_node.options = new_options + return enum_found_node + if isinstance(node, ClassFound): + class_found_node = func(copy(node), flags) + already_traversed[node_id] = class_found_node + class_found_node.fields = { + key: traverse(value, func, already_traversed, flags) + for key, value in node.fields.items() + } + class_found_node.base_classes = [ + traverse(base_class, func, already_traversed, flags) + for base_class in node.base_classes + ] + class_found_node.options = new_options + if keep_class_methods in flags: + class_found_node.methods = { + key: traverse( + value, func, already_traversed, flags, + ) + for key, value in node.methods.items() + } + return class_found_node + if isinstance(node, FunctionFound): + function_found_node = func(copy(node), flags) + already_traversed[node_id] = function_found_node + function_found_node.params = OrderedDict([ + (key, traverse(value, func, already_traversed, flags)) + for (key, value) in node.params.items() + ]) + function_found_node.return_type = traverse( + node.return_type, + func, + already_traversed, + flags, + ) + function_found_node.options = new_options + return function_found_node + + if isinstance(node, TypedDictFound): + typed_dict_node = func(copy(node), flags) + already_traversed[node_id] = typed_dict_node + typed_dict_node.annotations = { + key: traverse(value, func, already_traversed, flags) + for (key, value) in node.annotations.items() + } + typed_dict_node.options = new_options + return typed_dict_node + + if isinstance(node, TypeOR): + typeor_node = func(copy(node), flags) + already_traversed[node_id] = typeor_node + typeor_node.a = traverse(node.a, func, already_traversed, flags) + typeor_node.b = traverse(node.b, func, already_traversed, flags) + typeor_node.options = new_options + return typeor_node + + if isinstance(node, FixedGenericFound): + fixed_generic_node = func(copy(node), flags) + already_traversed[node_id] = fixed_generic_node + fixed_generic_node.origin = traverse( + node.origin, func, already_traversed, flags, + ) + fixed_generic_node.type_vars = [ + traverse(node_type_vars, func, already_traversed, flags) + for node_type_vars in node.type_vars + ] + fixed_generic_node.options = new_options + return fixed_generic_node + + if isinstance(node, TypeVarFound): + typevar_node = func(copy(node), flags) + already_traversed[node_id] = typevar_node + typevar_node.options = new_options + return typevar_node + + if isinstance(node, NewTypeFound): + newtype_found = func(copy(node), flags) + already_traversed[node_id] = newtype_found + newtype_found.actual = traverse( + node.actual, func, already_traversed, flags, + ) + newtype_found.options = new_options + return newtype_found + return node \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/utils/traversed_or_traversing.py b/py_type_extractor/type_extractor/__tests__/utils/traversed_or_traversing.py new file mode 100644 index 0000000..f80dd63 --- /dev/null +++ b/py_type_extractor/type_extractor/__tests__/utils/traversed_or_traversing.py @@ -0,0 +1,5 @@ +from typing import Dict + +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType + +TraversedOrTraversing = Dict[int, NodeType] diff --git a/py_type_extractor/type_extractor/middlewares/TypeVar.py b/py_type_extractor/type_extractor/middlewares/TypeVar.py index e98cb19..782e4ae 100644 --- a/py_type_extractor/type_extractor/middlewares/TypeVar.py +++ b/py_type_extractor/type_extractor/middlewares/TypeVar.py @@ -2,7 +2,7 @@ from typing import Set from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound diff --git a/py_type_extractor/type_extractor/middlewares/class_found.py b/py_type_extractor/type_extractor/middlewares/class_found.py index e203936..725179b 100644 --- a/py_type_extractor/type_extractor/middlewares/class_found.py +++ b/py_type_extractor/type_extractor/middlewares/class_found.py @@ -1,19 +1,30 @@ import inspect import weakref -from typing import Set, Dict, cast, List, Generic, Union, NamedTuple +from typing import Set, Dict, cast, List, Generic, Union, NamedTuple, Tuple, Callable, Any +from optparse import OptionParser import typing_inspect from dataclasses import dataclass from mypy_extensions import _TypedDictMeta # type: ignore from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.__flags import FromMethod from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound from py_type_extractor.type_extractor.utils import is_builtin +def filter_builtin_methods(method: Tuple[str, Any]): + (name, maybe_func) = method + if name.startswith('__'): + return False + if not inspect.isfunction(maybe_func): + return False + return True + def class_found_middleware( _class, type_extractor: BaseTypeExtractor, @@ -67,12 +78,19 @@ def class_found_middleware( filename = module and module.__file__ or '' + # methods_raw = inspect.getmembers(_class, filter_builtin_methods) + raw_methods_with_builtins = cast( + List[Tuple[str, Callable]], + inspect.getmembers(_class, inspect.isfunction), + ) + class_found = ClassFound( name=name, class_raw=_class, filePath=filename, base_classes=base_classes, raw_fields=argspec.annotations, + methods={}, fields={}, type_vars=[], module_name=module_name, @@ -104,7 +122,20 @@ def class_found_middleware( ] ) + methods: Dict[str, FunctionFound] = { + method_name: type_extractor.rawtype_to_node( + func, { + FromMethod( + method_name=method_name, + ), + }, + ) + for method_name, func in raw_methods_with_builtins + if not method_name.startswith('__') + } + class_found.fields = fields class_found.type_vars = type_vars + class_found.methods = methods return weakref.proxy(class_found) diff --git a/py_type_extractor/type_extractor/middlewares/dict_found.py b/py_type_extractor/type_extractor/middlewares/dict_found.py index c2cc2df..606b72b 100644 --- a/py_type_extractor/type_extractor/middlewares/dict_found.py +++ b/py_type_extractor/type_extractor/middlewares/dict_found.py @@ -2,7 +2,7 @@ from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.DictFound import DictFound from py_type_extractor.type_extractor.nodes.UnknownFound import unknown_found diff --git a/py_type_extractor/type_extractor/middlewares/enum_found.py b/py_type_extractor/type_extractor/middlewares/enum_found.py index bcd1531..2973782 100644 --- a/py_type_extractor/type_extractor/middlewares/enum_found.py +++ b/py_type_extractor/type_extractor/middlewares/enum_found.py @@ -4,7 +4,7 @@ from typing import Set, Dict from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.nodes.EnumFound import EnumFound, EnumValueTypes from py_type_extractor.type_extractor.utils.items_view_to_iterable import items_view_to_iterable diff --git a/py_type_extractor/type_extractor/middlewares/fixed_generic_found.py b/py_type_extractor/type_extractor/middlewares/fixed_generic_found.py index 87122f5..78be70e 100644 --- a/py_type_extractor/type_extractor/middlewares/fixed_generic_found.py +++ b/py_type_extractor/type_extractor/middlewares/fixed_generic_found.py @@ -3,7 +3,7 @@ from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption def fixed_generic_found_middleware( diff --git a/py_type_extractor/type_extractor/middlewares/function_found.py b/py_type_extractor/type_extractor/middlewares/function_found.py index b29632a..d609a0a 100644 --- a/py_type_extractor/type_extractor/middlewares/function_found.py +++ b/py_type_extractor/type_extractor/middlewares/function_found.py @@ -1,10 +1,9 @@ import inspect import weakref - from typing import Set from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound @@ -17,7 +16,9 @@ def func_found_middleware( return None try: module = inspect.getmodule(func) - module_name = module.__name__ + module_name = module.__name__ if module else '' + filename = module.__file__ if module else '' + collected_types_key = f"{module_name}___{func.__qualname__}" duplicate_func_found = type_extractor.collected_types.get(collected_types_key) if duplicate_func_found is not None: @@ -28,7 +29,7 @@ def func_found_middleware( argspec = inspect.getfullargspec(func) signature = inspect.signature(func) - filename = module.__file__ + params = type_extractor.params_to_nodes(argspec.annotations, argspec.args) raw_default_values = { key: getattr(signature.parameters.get(key), 'default', None) diff --git a/py_type_extractor/type_extractor/middlewares/list_found.py b/py_type_extractor/type_extractor/middlewares/list_found.py index 508bc4d..5631d34 100644 --- a/py_type_extractor/type_extractor/middlewares/list_found.py +++ b/py_type_extractor/type_extractor/middlewares/list_found.py @@ -2,7 +2,7 @@ from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.ListFound import ListFound diff --git a/py_type_extractor/type_extractor/middlewares/literal_found.py b/py_type_extractor/type_extractor/middlewares/literal_found.py index 8bf9eaa..0c8abd8 100644 --- a/py_type_extractor/type_extractor/middlewares/literal_found.py +++ b/py_type_extractor/type_extractor/middlewares/literal_found.py @@ -3,7 +3,7 @@ from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.LiteralFound import LiteralFound from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR diff --git a/py_type_extractor/type_extractor/middlewares/mapping_found.py b/py_type_extractor/type_extractor/middlewares/mapping_found.py index 623ca8a..2681a48 100644 --- a/py_type_extractor/type_extractor/middlewares/mapping_found.py +++ b/py_type_extractor/type_extractor/middlewares/mapping_found.py @@ -3,7 +3,7 @@ from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.MappingFound import MappingFound diff --git a/py_type_extractor/type_extractor/middlewares/newtype_found.py b/py_type_extractor/type_extractor/middlewares/newtype_found.py index 7078945..7e6ef7c 100644 --- a/py_type_extractor/type_extractor/middlewares/newtype_found.py +++ b/py_type_extractor/type_extractor/middlewares/newtype_found.py @@ -4,7 +4,7 @@ from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor import typing_inspect -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.NewType import NewTypeFound diff --git a/py_type_extractor/type_extractor/middlewares/tuple_found.py b/py_type_extractor/type_extractor/middlewares/tuple_found.py index 7b700e0..260c838 100644 --- a/py_type_extractor/type_extractor/middlewares/tuple_found.py +++ b/py_type_extractor/type_extractor/middlewares/tuple_found.py @@ -2,7 +2,7 @@ from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.TupleFound import TupleFound diff --git a/py_type_extractor/type_extractor/middlewares/type_or.py b/py_type_extractor/type_extractor/middlewares/type_or.py index 1434d5c..27021dd 100644 --- a/py_type_extractor/type_extractor/middlewares/type_or.py +++ b/py_type_extractor/type_extractor/middlewares/type_or.py @@ -2,7 +2,7 @@ from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR diff --git a/py_type_extractor/type_extractor/middlewares/typeddict_found.py b/py_type_extractor/type_extractor/middlewares/typeddict_found.py index 4e5d250..003350b 100644 --- a/py_type_extractor/type_extractor/middlewares/typeddict_found.py +++ b/py_type_extractor/type_extractor/middlewares/typeddict_found.py @@ -5,7 +5,7 @@ from typing import Set from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseOption +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.TypedDictFound import TypedDictFound diff --git a/py_type_extractor/type_extractor/nodes/BaseNodeType.py b/py_type_extractor/type_extractor/nodes/BaseNodeType.py index 9423591..01384b9 100644 --- a/py_type_extractor/type_extractor/nodes/BaseNodeType.py +++ b/py_type_extractor/type_extractor/nodes/BaseNodeType.py @@ -1,9 +1,6 @@ -from dataclasses import dataclass, field from typing import Union, Set - -class BaseOption: - pass +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption class BaseNodeType: diff --git a/py_type_extractor/type_extractor/nodes/BaseOption.py b/py_type_extractor/type_extractor/nodes/BaseOption.py new file mode 100644 index 0000000..89ab689 --- /dev/null +++ b/py_type_extractor/type_extractor/nodes/BaseOption.py @@ -0,0 +1,12 @@ +import abc + + +class BaseOption(metaclass=abc.ABCMeta): + pass + + +class BaseTempOption( + BaseOption, + metaclass=abc.ABCMeta, +): + pass diff --git a/py_type_extractor/type_extractor/nodes/BaseTraversableOption.py b/py_type_extractor/type_extractor/nodes/BaseTraversableOption.py new file mode 100644 index 0000000..1d49b53 --- /dev/null +++ b/py_type_extractor/type_extractor/nodes/BaseTraversableOption.py @@ -0,0 +1,21 @@ +import abc +from typing import Optional, Set + +from py_type_extractor.type_extractor.__tests__.utils.traverse_func_type import TraverseFuncType +from py_type_extractor.type_extractor.__tests__.utils.flags.__base__ import BaseUtilFlag +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption + + +class BaseTraversableOption( + BaseOption, + metaclass=abc.ABCMeta, +): + from py_type_extractor.type_extractor.__tests__.utils.traversed_or_traversing import TraversedOrTraversing + @abc.abstractmethod + def traverse( + self, + func: TraverseFuncType, + already_traversed: TraversedOrTraversing = None, + flags: Optional[Set[BaseUtilFlag]] = None, + ) -> 'BaseTraversableOption': + pass \ No newline at end of file diff --git a/py_type_extractor/type_extractor/nodes/ClassFound.py b/py_type_extractor/type_extractor/nodes/ClassFound.py index a11dc5a..2d93b60 100644 --- a/py_type_extractor/type_extractor/nodes/ClassFound.py +++ b/py_type_extractor/type_extractor/nodes/ClassFound.py @@ -7,8 +7,10 @@ Set, List, Union, ) -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound +from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound @@ -19,6 +21,7 @@ class ClassFound(BaseNodeType): # type: ignore filePath: str = field(default='') module_name: str = field(default='') raw_fields: Dict[str, Any] = field(default_factory=dict) + methods: Dict[str, FunctionFound] = field(default_factory=dict) doc: str = field(default='') base_classes: List[Union[FixedGenericFound, 'ClassFound']] = field(default_factory=list) type_vars: List[TypeVarFound] = field(default_factory=list) diff --git a/py_type_extractor/type_extractor/nodes/DictFound.py b/py_type_extractor/type_extractor/nodes/DictFound.py index cbb8950..998b82a 100644 --- a/py_type_extractor/type_extractor/nodes/DictFound.py +++ b/py_type_extractor/type_extractor/nodes/DictFound.py @@ -1,7 +1,8 @@ from dataclasses import dataclass, field from typing import Set -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption @dataclass diff --git a/py_type_extractor/type_extractor/nodes/EnumFound.py b/py_type_extractor/type_extractor/nodes/EnumFound.py index 833e719..c88b428 100644 --- a/py_type_extractor/type_extractor/nodes/EnumFound.py +++ b/py_type_extractor/type_extractor/nodes/EnumFound.py @@ -7,7 +7,8 @@ Set, List, Union, ) -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound diff --git a/py_type_extractor/type_extractor/nodes/FixedGenericFound.py b/py_type_extractor/type_extractor/nodes/FixedGenericFound.py index 4cc0b73..33bfdee 100644 --- a/py_type_extractor/type_extractor/nodes/FixedGenericFound.py +++ b/py_type_extractor/type_extractor/nodes/FixedGenericFound.py @@ -1,13 +1,15 @@ -from dataclasses import dataclass -from typing import List +from dataclasses import dataclass, field +from typing import List, Set from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption @dataclass class FixedGenericFound(BaseNodeType): type_vars: List[NodeType] origin: NodeType + options: Set[BaseOption] = field(default_factory=set) def __hash__(self): return hash(id(FixedGenericFound))\ diff --git a/py_type_extractor/type_extractor/nodes/FunctionFound.py b/py_type_extractor/type_extractor/nodes/FunctionFound.py index eb02f12..76c87ee 100644 --- a/py_type_extractor/type_extractor/nodes/FunctionFound.py +++ b/py_type_extractor/type_extractor/nodes/FunctionFound.py @@ -1,7 +1,8 @@ from dataclasses import dataclass, field from typing import Callable, Any, Optional, Dict, Set -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption @dataclass @@ -66,3 +67,5 @@ def __get_return_type_extra(func_found: FunctionFound): return func_found.INTERNAL_return_extra and \ func_found.INTERNAL_return_extra.get(namespace) return __get_return_type_extra + + diff --git a/py_type_extractor/type_extractor/nodes/ListFound.py b/py_type_extractor/type_extractor/nodes/ListFound.py index 60444e2..61377cc 100644 --- a/py_type_extractor/type_extractor/nodes/ListFound.py +++ b/py_type_extractor/type_extractor/nodes/ListFound.py @@ -1,7 +1,8 @@ from dataclasses import dataclass, field from typing import Set -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption @dataclass diff --git a/py_type_extractor/type_extractor/nodes/LiteralFound.py b/py_type_extractor/type_extractor/nodes/LiteralFound.py index 8d311e0..0b9c282 100644 --- a/py_type_extractor/type_extractor/nodes/LiteralFound.py +++ b/py_type_extractor/type_extractor/nodes/LiteralFound.py @@ -1,7 +1,8 @@ from dataclasses import dataclass, field from typing import Any, Set -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption @dataclass diff --git a/py_type_extractor/type_extractor/nodes/MappingFound.py b/py_type_extractor/type_extractor/nodes/MappingFound.py index 500c30f..b9c0a0d 100644 --- a/py_type_extractor/type_extractor/nodes/MappingFound.py +++ b/py_type_extractor/type_extractor/nodes/MappingFound.py @@ -1,7 +1,8 @@ from dataclasses import dataclass, field from typing import Set -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption @dataclass diff --git a/py_type_extractor/type_extractor/nodes/NewType.py b/py_type_extractor/type_extractor/nodes/NewType.py index 8792b50..dd3adc2 100644 --- a/py_type_extractor/type_extractor/nodes/NewType.py +++ b/py_type_extractor/type_extractor/nodes/NewType.py @@ -1,7 +1,8 @@ from dataclasses import dataclass, field -from typing import List, Any +from typing import List, Any, Set from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption @dataclass @@ -9,6 +10,8 @@ class NewTypeFound(BaseNodeType): name: str actual: NodeType original_ref: Any = None + + options: Set[BaseOption] = field(default_factory=set) # TODO: bug in python? can't get module_name for NewType... # module_name: str = field(default='') diff --git a/py_type_extractor/type_extractor/nodes/NoneNode.py b/py_type_extractor/type_extractor/nodes/NoneNode.py index 8e3439e..a692e6d 100644 --- a/py_type_extractor/type_extractor/nodes/NoneNode.py +++ b/py_type_extractor/type_extractor/nodes/NoneNode.py @@ -1,7 +1,8 @@ from typing import Set from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from .BaseNodeType import BaseNodeType, BaseOption +from .BaseNodeType import BaseNodeType +from .BaseOption import BaseOption class NoneNode(BaseNodeType): # type: ignore diff --git a/py_type_extractor/type_extractor/nodes/TupleFound.py b/py_type_extractor/type_extractor/nodes/TupleFound.py index 68bdcd8..911b4b4 100644 --- a/py_type_extractor/type_extractor/nodes/TupleFound.py +++ b/py_type_extractor/type_extractor/nodes/TupleFound.py @@ -1,12 +1,14 @@ -from dataclasses import dataclass -from typing import List +from dataclasses import dataclass, field +from typing import List, Set from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption @dataclass class TupleFound(BaseNodeType): types: List[NodeType] + options: Set[BaseOption] = field(default_factory=set) def __hash__(self): return hash(id(TupleFound)) + hash(tuple(self.types)) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/nodes/TypeOR.py b/py_type_extractor/type_extractor/nodes/TypeOR.py index bf5b9a6..c8f34c3 100644 --- a/py_type_extractor/type_extractor/nodes/TypeOR.py +++ b/py_type_extractor/type_extractor/nodes/TypeOR.py @@ -1,7 +1,8 @@ from dataclasses import dataclass, field from typing import Set -from .BaseNodeType import BaseNodeType, NodeType, BaseOption +from .BaseNodeType import BaseNodeType, NodeType +from .BaseOption import BaseOption @dataclass diff --git a/py_type_extractor/type_extractor/nodes/TypeVarFound.py b/py_type_extractor/type_extractor/nodes/TypeVarFound.py index 139141d..42d5ed0 100644 --- a/py_type_extractor/type_extractor/nodes/TypeVarFound.py +++ b/py_type_extractor/type_extractor/nodes/TypeVarFound.py @@ -1,7 +1,8 @@ -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import Set, Dict, List, Optional, TypeVar, Any # -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption @dataclass @@ -9,6 +10,7 @@ class TypeVarFound(BaseNodeType): name: str original: TypeVar # type:ignore type_limits: Optional[List[NodeType]] = None + options: Set[BaseOption] = field(default_factory=set) def __hash__(self): return hash(TypeVarFound)\ diff --git a/py_type_extractor/type_extractor/nodes/TypedDictFound.py b/py_type_extractor/type_extractor/nodes/TypedDictFound.py index 2920c73..002b0c7 100644 --- a/py_type_extractor/type_extractor/nodes/TypedDictFound.py +++ b/py_type_extractor/type_extractor/nodes/TypedDictFound.py @@ -7,7 +7,8 @@ from mypy_extensions import _TypedDictMeta # type: ignore -from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption @dataclass diff --git a/py_type_extractor/type_extractor/nodes/__flags.py b/py_type_extractor/type_extractor/nodes/__flags.py new file mode 100644 index 0000000..3f45b37 --- /dev/null +++ b/py_type_extractor/type_extractor/nodes/__flags.py @@ -0,0 +1,10 @@ +from dataclasses import dataclass + +from py_type_extractor.type_extractor.nodes.BaseOption import BaseTempOption + + +@dataclass(frozen=True) +class FromMethod( + BaseTempOption, +): + method_name: str \ No newline at end of file diff --git a/py_type_extractor/type_extractor/type_extractor.py b/py_type_extractor/type_extractor/type_extractor.py index 991692e..035546c 100644 --- a/py_type_extractor/type_extractor/type_extractor.py +++ b/py_type_extractor/type_extractor/type_extractor.py @@ -24,7 +24,8 @@ from py_type_extractor.type_extractor.middlewares.newtype_found import newtype_found_middleware from py_type_extractor.type_extractor.middlewares.tuple_found import tuple_found_middleware from py_type_extractor.type_extractor.middlewares.type_or import typeor_middleware -from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType, BaseNodeType, BaseOption +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType, BaseNodeType +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.NoneNode import none_node_middleware from py_type_extractor.type_extractor.middlewares.typeddict_found import typeddict_found_middleware from py_type_extractor.type_extractor.middlewares.TypeVar import typevar_found_middleware From 091ad3b82ddd02251fe6ae3ae8de7acc6438d11d Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Thu, 12 Nov 2020 20:13:42 +0900 Subject: [PATCH 30/34] add proper options handling --- .../test_fixtures/class_with_methods.py | 8 +++++-- py_type_extractor/type_extractor/__base__.py | 1 + .../__tests__/test_class_with_method.py | 21 ++++++++++++------- .../type_extractor/middlewares/__common__.py | 12 +++++++++++ .../type_extractor/middlewares/class_found.py | 12 +++++------ .../type_extractor/middlewares/dict_found.py | 6 ++++-- .../type_extractor/middlewares/enum_found.py | 3 +-- .../middlewares/fixed_generic_found.py | 5 +++-- .../middlewares/function_found.py | 15 ++++++++++--- .../type_extractor/middlewares/list_found.py | 5 +++-- .../middlewares/literal_found.py | 13 ++++++------ .../middlewares/mapping_found.py | 14 ++++++++++--- .../middlewares/newtype_found.py | 5 ++++- .../type_extractor/nodes/ClassFound.py | 11 +++++++++- .../type_extractor/nodes/FunctionFound.py | 5 ++++- .../type_extractor/type_extractor.py | 2 ++ 16 files changed, 99 insertions(+), 39 deletions(-) diff --git a/py_type_extractor/test_fixtures/class_with_methods.py b/py_type_extractor/test_fixtures/class_with_methods.py index 105fe42..fbd9e58 100644 --- a/py_type_extractor/test_fixtures/class_with_methods.py +++ b/py_type_extractor/test_fixtures/class_with_methods.py @@ -1,3 +1,7 @@ +class SomeArgClass: + a: int + + class ClassWithMethod: - def some_method(self, arg: int) -> int: - return id(self) + arg + def some_method(self, arg: SomeArgClass) -> int: + return id(self) + arg.a diff --git a/py_type_extractor/type_extractor/__base__.py b/py_type_extractor/type_extractor/__base__.py index afd549e..8870f70 100644 --- a/py_type_extractor/type_extractor/__base__.py +++ b/py_type_extractor/type_extractor/__base__.py @@ -20,6 +20,7 @@ def params_to_nodes( self, params: Dict[str, Union[type, None]], param_names_list: List[str], + options: Optional[Set[BaseOption]] = None, ) -> Dict[str, NodeType]: pass diff --git a/py_type_extractor/type_extractor/__tests__/test_class_with_method.py b/py_type_extractor/type_extractor/__tests__/test_class_with_method.py index 028f160..dd28fd4 100644 --- a/py_type_extractor/type_extractor/__tests__/test_class_with_method.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_with_method.py @@ -25,15 +25,25 @@ def test_class_with_method(): module_name=module_name, typ_name=t.ClassWithMethod.__qualname__, ) + some_arg_class = ClassFound( + fields={ + 'a': int, + }, + module_name=module_name, + name=t.SomeArgClass.__qualname__, + ) some_method = FunctionFound( name='some_method', module_name=module_name, params={ - 'arg': int, + 'arg': some_arg_class, }, return_type=int, + options={ + FromMethod('some_method'), + } ) - class_found = ClassFound( + class_with_method = ClassFound( methods={ 'some_method': some_method, }, @@ -41,12 +51,7 @@ def test_class_with_method(): module_name=module_name, name=t.ClassWithMethod.__qualname__, ) - some_method.options = { - FromMethod( - method_name='some_method', - ) - } - assert classes[class_type_key] == class_found + assert classes[class_type_key] == class_with_method print(type_extractor) hash_test(type_extractor) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/middlewares/__common__.py b/py_type_extractor/type_extractor/middlewares/__common__.py index f253b12..c0c51bd 100644 --- a/py_type_extractor/type_extractor/middlewares/__common__.py +++ b/py_type_extractor/type_extractor/middlewares/__common__.py @@ -1,6 +1,18 @@ +from typing import Set + +from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption, BaseTempOption + + def get_typ_origin(typ): return getattr(typ, '__origin__', getattr(typ, '__class__', None)) def get_typ_args(typ): return getattr(typ, '__args__', getattr(typ, '__values__', None)) + + +def remove_temp_options(options: Set[BaseOption]) -> Set[BaseOption]: + return set([ + option for option in list(options) + if not isinstance(option, BaseTempOption) + ]) \ No newline at end of file diff --git a/py_type_extractor/type_extractor/middlewares/class_found.py b/py_type_extractor/type_extractor/middlewares/class_found.py index 725179b..1a5d3d1 100644 --- a/py_type_extractor/type_extractor/middlewares/class_found.py +++ b/py_type_extractor/type_extractor/middlewares/class_found.py @@ -8,6 +8,7 @@ from mypy_extensions import _TypedDictMeta # type: ignore from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.middlewares.__common__ import remove_temp_options from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound @@ -38,7 +39,7 @@ def class_found_middleware( module = inspect.getmodule(_class) module_name = module.__name__ - + child_options = remove_temp_options(options) name = _class.__qualname__.replace('.', '') collected_types_key = type_extractor.to_collected_types_key( module_name=module_name, @@ -58,7 +59,7 @@ def class_found_middleware( base_classes = cast( List[Union[ClassFound, FixedGenericFound]], [ - type_extractor.rawtype_to_node(_parent_class) + type_extractor.rawtype_to_node(_parent_class, options=child_options) for _parent_class in base_classes_raw if typing_inspect.get_origin(_parent_class) is not Generic # type: ignore and _parent_class is not NamedTuple @@ -67,7 +68,7 @@ def class_found_middleware( if len(base_classes_raw) == 0: base_classes = cast(List[Union[ClassFound, FixedGenericFound]], [ - type_extractor.rawtype_to_node(base_cls) + type_extractor.rawtype_to_node(base_cls, options=child_options) for base_cls in list(_class.__bases__) if base_cls is not object and base_cls is not tuple and @@ -116,15 +117,14 @@ def class_found_middleware( type_vars = cast( List[TypeVarFound], [ - type_extractor.rawtype_to_node(_typevar) + type_extractor.rawtype_to_node(_typevar, child_options) for _typevar in list(typing_inspect.get_parameters(_class)) ] ) - methods: Dict[str, FunctionFound] = { method_name: type_extractor.rawtype_to_node( - func, { + func, child_options | { FromMethod( method_name=method_name, ), diff --git a/py_type_extractor/type_extractor/middlewares/dict_found.py b/py_type_extractor/type_extractor/middlewares/dict_found.py index 606b72b..ca54fed 100644 --- a/py_type_extractor/type_extractor/middlewares/dict_found.py +++ b/py_type_extractor/type_extractor/middlewares/dict_found.py @@ -1,7 +1,7 @@ from typing import Dict, Set from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args, remove_temp_options from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.DictFound import DictFound from py_type_extractor.type_extractor.nodes.UnknownFound import unknown_found @@ -12,11 +12,12 @@ def dict_found_middleware( type_extractor: BaseTypeExtractor, options: Set[BaseOption], ): + child_options = remove_temp_options(options) if typ == Dict: # for `Dict` return DictFound( key=unknown_found, value=unknown_found, - options=options, + options=child_options, ) typ_origin = get_typ_origin(typ) if typ_origin is not dict and typ_origin is not Dict: @@ -28,4 +29,5 @@ def dict_found_middleware( return DictFound( key=processed_key_typ, value=processed_value_typ, + options=child_options, ) diff --git a/py_type_extractor/type_extractor/middlewares/enum_found.py b/py_type_extractor/type_extractor/middlewares/enum_found.py index 2973782..9876f48 100644 --- a/py_type_extractor/type_extractor/middlewares/enum_found.py +++ b/py_type_extractor/type_extractor/middlewares/enum_found.py @@ -7,7 +7,6 @@ from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound from py_type_extractor.type_extractor.nodes.EnumFound import EnumFound, EnumValueTypes -from py_type_extractor.type_extractor.utils.items_view_to_iterable import items_view_to_iterable def enum_found_middleware( @@ -38,7 +37,7 @@ def enum_found_middleware( members: Dict[str, EnumValueTypes] = { key: enum_member.value - for (key, enum_member) in items_view_to_iterable(_typ.__members__.items()) + for key, enum_member in _typ.__members__.items() } enum_found = EnumFound( name=name, diff --git a/py_type_extractor/type_extractor/middlewares/fixed_generic_found.py b/py_type_extractor/type_extractor/middlewares/fixed_generic_found.py index 78be70e..223bc37 100644 --- a/py_type_extractor/type_extractor/middlewares/fixed_generic_found.py +++ b/py_type_extractor/type_extractor/middlewares/fixed_generic_found.py @@ -1,9 +1,10 @@ -from typing import Dict, Set +from typing import Set + import typing_inspect from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption +from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound def fixed_generic_found_middleware( diff --git a/py_type_extractor/type_extractor/middlewares/function_found.py b/py_type_extractor/type_extractor/middlewares/function_found.py index d609a0a..8e2d916 100644 --- a/py_type_extractor/type_extractor/middlewares/function_found.py +++ b/py_type_extractor/type_extractor/middlewares/function_found.py @@ -3,6 +3,7 @@ from typing import Set from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.middlewares.__common__ import remove_temp_options from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound @@ -18,6 +19,7 @@ def func_found_middleware( module = inspect.getmodule(func) module_name = module.__name__ if module else '' filename = module.__file__ if module else '' + child_options = remove_temp_options(options) collected_types_key = f"{module_name}___{func.__qualname__}" duplicate_func_found = type_extractor.collected_types.get(collected_types_key) @@ -30,7 +32,11 @@ def func_found_middleware( signature = inspect.signature(func) - params = type_extractor.params_to_nodes(argspec.annotations, argspec.args) + params = type_extractor.params_to_nodes( + argspec.annotations, + argspec.args, + options=child_options, + ) raw_default_values = { key: getattr(signature.parameters.get(key), 'default', None) @@ -39,9 +45,12 @@ def func_found_middleware( default_values = { key: value for (key, value) in raw_default_values.items() - if value is not inspect._empty + if value is not inspect._empty # type:ignore } - return_type = type_extractor.rawtype_to_node(signature.return_annotation) + return_type = type_extractor.rawtype_to_node( + signature.return_annotation, + options=child_options, + ) func_found = FunctionFound( name=func.__name__, filePath=filename, diff --git a/py_type_extractor/type_extractor/middlewares/list_found.py b/py_type_extractor/type_extractor/middlewares/list_found.py index 5631d34..18796a6 100644 --- a/py_type_extractor/type_extractor/middlewares/list_found.py +++ b/py_type_extractor/type_extractor/middlewares/list_found.py @@ -1,7 +1,7 @@ from typing import List, Set from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args, remove_temp_options from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.ListFound import ListFound @@ -11,9 +11,10 @@ def list_found_middleware( type_extractor: BaseTypeExtractor, options: Set[BaseOption], ): + child_options = remove_temp_options(options) typ_origin = get_typ_origin(typ) if typ_origin is not list and typ_origin is not List: return typ_args = get_typ_args(typ) - processed_typ = type_extractor.rawtype_to_node(typ_args[0]) + processed_typ = type_extractor.rawtype_to_node(typ_args[0], child_options) return ListFound(typ=processed_typ) diff --git a/py_type_extractor/type_extractor/middlewares/literal_found.py b/py_type_extractor/type_extractor/middlewares/literal_found.py index 0c8abd8..dbe47fa 100644 --- a/py_type_extractor/type_extractor/middlewares/literal_found.py +++ b/py_type_extractor/type_extractor/middlewares/literal_found.py @@ -2,7 +2,7 @@ from typing_extensions import Literal from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args, remove_temp_options from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.LiteralFound import LiteralFound from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR @@ -21,16 +21,17 @@ def literal_found_middleware( type_extractor: BaseTypeExtractor, options: Set[BaseOption], ): + child_options = remove_temp_options(options) typ_origin = get_typ_origin(typ) if not __is_literal_typ(typ_origin): return - return __process_literal_args(get_typ_args(typ)) + return __process_literal_args(get_typ_args(typ), child_options) -def __process_literal_args(args: Tuple): - current = LiteralFound(args[0]) +def __process_literal_args(args: Tuple, options: Set[BaseOption]): + current = LiteralFound(args[0], options=options) if __is_literal_typ(get_typ_origin(args[0])): - current = __process_literal_args(get_typ_args(args[0])) + current = __process_literal_args(get_typ_args(args[0]), options) if len(args) == 1: return current - return TypeOR(current, __process_literal_args(args[1:])) + return TypeOR(current, __process_literal_args(args[1:], options)) diff --git a/py_type_extractor/type_extractor/middlewares/mapping_found.py b/py_type_extractor/type_extractor/middlewares/mapping_found.py index 2681a48..3ce3dfd 100644 --- a/py_type_extractor/type_extractor/middlewares/mapping_found.py +++ b/py_type_extractor/type_extractor/middlewares/mapping_found.py @@ -2,7 +2,7 @@ from typing import Mapping, Set from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args, remove_temp_options from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.MappingFound import MappingFound @@ -13,13 +13,21 @@ def mapping_found_middleware( options: Set[BaseOption], ): + child_options = remove_temp_options(options) typ_origin = get_typ_origin(typ) if typ_origin is not abc.Mapping and typ_origin is not Mapping: return typ_args = get_typ_args(typ) - type_key = type_extractor.rawtype_to_node(typ_args[0]) - type_value = type_extractor.rawtype_to_node(typ_args[1]) + type_key = type_extractor.rawtype_to_node( + typ_args[0], + options=child_options, + ) + type_value = type_extractor.rawtype_to_node( + typ_args[1], + options=child_options, + ) return MappingFound( key=type_key, value=type_value, + options=options, ) diff --git a/py_type_extractor/type_extractor/middlewares/newtype_found.py b/py_type_extractor/type_extractor/middlewares/newtype_found.py index 7e6ef7c..73c956c 100644 --- a/py_type_extractor/type_extractor/middlewares/newtype_found.py +++ b/py_type_extractor/type_extractor/middlewares/newtype_found.py @@ -4,6 +4,7 @@ from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor import typing_inspect +from py_type_extractor.type_extractor.middlewares.__common__ import remove_temp_options from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.NewType import NewTypeFound @@ -20,14 +21,16 @@ def newtype_found_middleware( if typ.__code__.co_name != 'new_type': return None + child_options = remove_temp_options(options) already_found = type_extractor.collected_types.get(typ.__name__) if already_found: return already_found newtype_found = NewTypeFound( name=typ.__name__, - actual=type_extractor.rawtype_to_node(typ.__supertype__), + actual=type_extractor.rawtype_to_node(typ.__supertype__, child_options), original_ref=typ, + options=options, ) type_extractor.collected_types[typ.__name__] = newtype_found diff --git a/py_type_extractor/type_extractor/nodes/ClassFound.py b/py_type_extractor/type_extractor/nodes/ClassFound.py index 2d93b60..b116f58 100644 --- a/py_type_extractor/type_extractor/nodes/ClassFound.py +++ b/py_type_extractor/type_extractor/nodes/ClassFound.py @@ -30,7 +30,16 @@ class ClassFound(BaseNodeType): # type: ignore options: Set[BaseOption] = field(default_factory=set) def __hash__(self): - return hash(id(ClassFound)) + hash(self.name) + hash(self.module_name) + methods_hash = hash(frozenset([ + (key, value.get_self()) + for key, value in self.methods.items() + ])) + return hash(id(ClassFound)) \ + + hash(self.name) \ + + hash(self.module_name) \ + + methods_hash \ + + hash(frozenset(self.options)) \ + + 1 def set_fields_extra(namespace: str): diff --git a/py_type_extractor/type_extractor/nodes/FunctionFound.py b/py_type_extractor/type_extractor/nodes/FunctionFound.py index 76c87ee..30e047b 100644 --- a/py_type_extractor/type_extractor/nodes/FunctionFound.py +++ b/py_type_extractor/type_extractor/nodes/FunctionFound.py @@ -21,9 +21,12 @@ class FunctionFound(BaseNodeType): options: Set[BaseOption] = field(default_factory=set) def __hash__(self): + print(frozenset(self.options)) return hash(FunctionFound)\ + hash(self.name)\ - + hash(self.module_name) + + hash(self.module_name)\ + + hash(frozenset(self.options))\ + + 1 def set_params_extra(namespace: str): diff --git a/py_type_extractor/type_extractor/type_extractor.py b/py_type_extractor/type_extractor/type_extractor.py index 035546c..d246e80 100644 --- a/py_type_extractor/type_extractor/type_extractor.py +++ b/py_type_extractor/type_extractor/type_extractor.py @@ -78,6 +78,7 @@ def params_to_nodes( self, params: Dict[str, Union[type, None]], param_names_list: List[str], + options: Optional[Set[BaseOption]] = None, ): processed_params: OrderedDict[str, NodeType] = OrderedDict() banned_words = [ @@ -87,6 +88,7 @@ def params_to_nodes( for param_name in _param_names_list: processed_params[param_name] = self.rawtype_to_node( params.get(param_name) or inspect._empty, # type: ignore + options=options, ) return processed_params From e9bdde0e37290fd9925c3dbcfc7dca9ad06a6d7c Mon Sep 17 00:00:00 2001 From: devdoomari3 <41351197+devdoomari3@users.noreply.github.com> Date: Tue, 24 Nov 2020 22:31:45 +0900 Subject: [PATCH 31/34] use sets for typeors and literals (#49) use sets for typeors and literals (#49) Co-authored-by: Dev doomari --- .../plugins/typescript/Converter.py | 10 ++++- .../ts_fixtures/ClassWithUnionField.d.ts | 5 ++- .../ts_fixtures/func_return_none.d.ts | 4 +- .../func_with_builtin_type_args.d.ts | 2 +- .../ts_fixtures/func_with_literals.d.ts | 4 +- .../typescript/middlewares/functions.py | 4 +- .../test_fixtures/union_type_class.py | 5 ++- .../__tests__/test_class_with_union_field.py | 41 +++++++++++-------- .../__tests__/test_func_with_literals.py | 38 +++++------------ .../__tests__/utils/traverse_node.py | 8 ++-- .../middlewares/literal_found.py | 25 +++++++---- .../type_extractor/middlewares/tuple_found.py | 2 +- .../type_extractor/middlewares/type_or.py | 24 ++++++++--- .../type_extractor/nodes/LiteralFound.py | 2 +- .../type_extractor/nodes/NoneNode.py | 8 +++- .../type_extractor/nodes/TypeOR.py | 3 +- 16 files changed, 108 insertions(+), 77 deletions(-) diff --git a/py_type_extractor/plugins/typescript/Converter.py b/py_type_extractor/plugins/typescript/Converter.py index 4cc1d4e..2890edc 100644 --- a/py_type_extractor/plugins/typescript/Converter.py +++ b/py_type_extractor/plugins/typescript/Converter.py @@ -82,7 +82,10 @@ def get_identifier(self, node: NodeType) -> str: if isinstance(node, TypedDictFound): return f"I{node.name}" if isinstance(node, TypeOR): - return f"{self.get_identifier(node.a)} | {self.get_identifier(node.b)}" + return ' | '.join( + sorted([self.get_identifier(node_item) + for node_item in node.nodes]) + ) # FIXME: need to handle type(key) == int / float / etc. if isinstance(node, DictFound): return f"{{ [id: string]: {self.get_identifier(node.value)} }}" @@ -93,7 +96,10 @@ def get_identifier(self, node: NodeType) -> str: if isinstance(node, TupleFound): return f"[{', '.join([self.get_identifier(typ) for typ in node.types])}]" if isinstance(node, LiteralFound): - return self.literal_converter(node.value) + return ' | '.join( + sorted([self.literal_converter(value) + for value in node.values]) + ) if node is unknown_found: return "any" diff --git a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/ClassWithUnionField.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/ClassWithUnionField.d.ts index 3cde509..ce5c3f6 100644 --- a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/ClassWithUnionField.d.ts +++ b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/ClassWithUnionField.d.ts @@ -1,3 +1,6 @@ export class ClassWithUnionField { - cwufField1: string | number; + cwufField1: SomeClass | null | undefined | number; +} +export class SomeClass { + } \ No newline at end of file diff --git a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts index 458116b..04b7ab9 100644 --- a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts +++ b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_return_none.d.ts @@ -1,4 +1,4 @@ export function func_return_none( - some_input: string | null | undefined, - some_input2: boolean | null | undefined, + some_input: null | undefined | string, + some_input2: boolean | null | undefined, ): any diff --git a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_builtin_type_args.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_builtin_type_args.d.ts index c3800bb..a369f78 100644 --- a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_builtin_type_args.d.ts +++ b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_builtin_type_args.d.ts @@ -1,4 +1,4 @@ export function func_with_builtin_type_args( a: number, - b: string | null | undefined, + b: null | undefined | string, ): number diff --git a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts index a439435..e8b82fc 100644 --- a/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts +++ b/py_type_extractor/plugins/typescript/__tests__/ts_fixtures/func_with_literals.d.ts @@ -1,4 +1,4 @@ export function func_with_literals( - input1: 'a' | 1 | 2 | 3 | true | 3, + input1: 'a' | 1 | 2 | 3, input2: 1 | null, -): true | 5 | 3 \ No newline at end of file +): 3 | 5 | true \ No newline at end of file diff --git a/py_type_extractor/plugins/typescript/middlewares/functions.py b/py_type_extractor/plugins/typescript/middlewares/functions.py index cf52d54..21be4a3 100644 --- a/py_type_extractor/plugins/typescript/middlewares/functions.py +++ b/py_type_extractor/plugins/typescript/middlewares/functions.py @@ -32,7 +32,9 @@ def convert_functionfound( ): raw_params = { key: value if key not in func_found.default_values - else TypeOR(a=value, b=none_node) + else TypeOR({ + value, none_node, + }) for (key, value) in func_found.params.items() } params = convert_params_dict( diff --git a/py_type_extractor/test_fixtures/union_type_class.py b/py_type_extractor/test_fixtures/union_type_class.py index d7335f0..aa63c59 100644 --- a/py_type_extractor/test_fixtures/union_type_class.py +++ b/py_type_extractor/test_fixtures/union_type_class.py @@ -1,5 +1,8 @@ from typing import Union +class SomeClass: + pass + class ClassWithUnionField: - cwufField1: Union[str, int] + cwufField1: Union[SomeClass, Union[int, None]] diff --git a/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py b/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py index 7c7b8b8..d7b5466 100644 --- a/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py @@ -1,10 +1,11 @@ from dataclasses import dataclass import py_type_extractor.test_fixtures.union_type_class as t +from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.ClassFound import ClassFound +from py_type_extractor.type_extractor.nodes.NoneNode import none_node from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR -from py_type_extractor.type_extractor.__tests__.utils import traverse, cleanup, hash_test from py_type_extractor.type_extractor.type_extractor import TypeExtractor @@ -12,35 +13,41 @@ class SomeOption(BaseOption): some_var: int + module_name = t.__name__ + def test_class_with_union_field(): type_collector = TypeExtractor() type_collector.add(None)(t.ClassWithUnionField) - type_collector.add({SomeOption(some_var=1)})(t.ClassWithUnionField) + type_collector.add({ + SomeOption(some_var=1), + })(t.ClassWithUnionField) classes = { key: traverse(value, cleanup) - for (key, value) in type_collector.collected_types.items() + for (key, value) + in type_collector.collected_types.items() if isinstance(value, ClassFound) } key = type_collector.to_collected_types_key( module_name, t.ClassWithUnionField.__qualname__ ) - to_compare = { - key: ClassFound( - name='ClassWithUnionField', - fields={ - 'cwufField1': TypeOR( - a=str, b=int - ) - }, - module_name=module_name, - options={SomeOption(some_var=1)}, - ) - } - assert to_compare == classes + assert classes[key] == ClassFound( + name=t.ClassWithUnionField.__qualname__, + fields={ + 'cwufField1': TypeOR({ + none_node, int, ClassFound( + name=t.SomeClass.__qualname__, + module_name=module_name, + fields={}, + ), + }), + }, + module_name=module_name, + options={SomeOption(some_var=1)}, + ) - hash_test(type_collector) \ No newline at end of file + hash_test(type_collector) diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_literals.py b/py_type_extractor/type_extractor/__tests__/test_func_with_literals.py index 6e2642a..885323c 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_literals.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_literals.py @@ -9,7 +9,7 @@ module_name = t.__name__ -def test_func_with_list(): +def test_func_with_literals(): type_collector = TypeExtractor() type_collector.add(None)(t.func_with_literals) @@ -26,34 +26,16 @@ def test_func_with_list(): name=t.func_with_literals.__qualname__, module_name=module_name, params={ - 'input1': TypeOR( - a=LiteralFound('a'), - b=TypeOR( - a=LiteralFound(1), - b=TypeOR( - a=TypeOR( - a=LiteralFound(2), - b=LiteralFound(3), - ), - b=TypeOR( - a=LiteralFound(True), - b=LiteralFound(3), - ), - ), - ), - ), - 'input2': TypeOR( - a=LiteralFound(1), - b=LiteralFound(None), - ), + 'input1': LiteralFound({ + 'a', 1, 2, 3, True, + }), + 'input2': LiteralFound({ + 1, None, + }), }, - return_type=TypeOR( - a=LiteralFound(True), - b=TypeOR( - a=LiteralFound(5), - b=LiteralFound(3), - ), - ) + return_type=LiteralFound({ + True, 3, 5, + }), ), cleanup, ) diff --git a/py_type_extractor/type_extractor/__tests__/utils/traverse_node.py b/py_type_extractor/type_extractor/__tests__/utils/traverse_node.py index 199a409..89ec480 100644 --- a/py_type_extractor/type_extractor/__tests__/utils/traverse_node.py +++ b/py_type_extractor/type_extractor/__tests__/utils/traverse_node.py @@ -54,7 +54,7 @@ def traverse( opt.traverse(func, already_traversed, flags) if isinstance(opt, BaseTraversableOption) else opt - for opt in list(node.options) + for opt in list(node.options or set()) ]) if isinstance(node, EnumFound): @@ -111,8 +111,10 @@ def traverse( if isinstance(node, TypeOR): typeor_node = func(copy(node), flags) already_traversed[node_id] = typeor_node - typeor_node.a = traverse(node.a, func, already_traversed, flags) - typeor_node.b = traverse(node.b, func, already_traversed, flags) + typeor_node.nodes = set([ + traverse(node_item, func, already_traversed, flags) + for node_item in list(node.nodes) + ]) typeor_node.options = new_options return typeor_node diff --git a/py_type_extractor/type_extractor/middlewares/literal_found.py b/py_type_extractor/type_extractor/middlewares/literal_found.py index dbe47fa..43cbede 100644 --- a/py_type_extractor/type_extractor/middlewares/literal_found.py +++ b/py_type_extractor/type_extractor/middlewares/literal_found.py @@ -1,11 +1,11 @@ from typing import Tuple, Set + from typing_extensions import Literal from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args, remove_temp_options from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.LiteralFound import LiteralFound -from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR def __is_literal_typ(typ_origin): @@ -28,10 +28,19 @@ def literal_found_middleware( return __process_literal_args(get_typ_args(typ), child_options) -def __process_literal_args(args: Tuple, options: Set[BaseOption]): - current = LiteralFound(args[0], options=options) - if __is_literal_typ(get_typ_origin(args[0])): - current = __process_literal_args(get_typ_args(args[0]), options) - if len(args) == 1: - return current - return TypeOR(current, __process_literal_args(args[1:], options)) +def __process_literal_args( + args: Tuple, + options: Set[BaseOption], +) -> LiteralFound: + values = set() + for typ in args: + typ_origin = get_typ_origin(typ) + if __is_literal_typ(typ_origin): + typ_literal_found = __process_literal_args( + get_typ_args(typ), + options, + ) + values.update(typ_literal_found.values) + else: + values.add(typ) + return LiteralFound(values, options) diff --git a/py_type_extractor/type_extractor/middlewares/tuple_found.py b/py_type_extractor/type_extractor/middlewares/tuple_found.py index 260c838..b00cb59 100644 --- a/py_type_extractor/type_extractor/middlewares/tuple_found.py +++ b/py_type_extractor/type_extractor/middlewares/tuple_found.py @@ -17,6 +17,6 @@ def tuple_found_middleware( typ_args = get_typ_args(typ) processed_typ = [ type_extractor.rawtype_to_node(param) - for param in typ_args + for param in typ_args or [] ] return TupleFound(types=processed_typ) diff --git a/py_type_extractor/type_extractor/middlewares/type_or.py b/py_type_extractor/type_extractor/middlewares/type_or.py index 27021dd..9156e60 100644 --- a/py_type_extractor/type_extractor/middlewares/type_or.py +++ b/py_type_extractor/type_extractor/middlewares/type_or.py @@ -1,7 +1,12 @@ from typing import Union, Set +import typing_inspect + from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor -from py_type_extractor.type_extractor.middlewares.__common__ import get_typ_origin, get_typ_args +from py_type_extractor.type_extractor.middlewares.__common__ import ( + get_typ_origin, +) +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType, BaseNodeType from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR @@ -14,10 +19,17 @@ def typeor_middleware( typ_origin = get_typ_origin(typ) if typ_origin is not Union: return - types = get_typ_args(typ) - type_a = type_extractor.rawtype_to_node(types[0]) - type_b = type_extractor.rawtype_to_node(types[1]) + + types = typing_inspect.get_args(typ) + nodes: Set[NodeType] = set() + for typ in types: + converted_typ = type_extractor.rawtype_to_node(typ, options) + if isinstance(converted_typ, BaseNodeType): + converted_typ = converted_typ.get_self() + if isinstance(converted_typ, TypeOR): + nodes.update(converted_typ.nodes) + else: + nodes.add(converted_typ) return TypeOR( - a=type_a, - b=type_b, + nodes=nodes, ) diff --git a/py_type_extractor/type_extractor/nodes/LiteralFound.py b/py_type_extractor/type_extractor/nodes/LiteralFound.py index 0b9c282..31eee5c 100644 --- a/py_type_extractor/type_extractor/nodes/LiteralFound.py +++ b/py_type_extractor/type_extractor/nodes/LiteralFound.py @@ -7,5 +7,5 @@ @dataclass class LiteralFound(BaseNodeType): # type: ignore - value: Any + values: Set[Any] # set of values options: Set[BaseOption] = field(default_factory=set) diff --git a/py_type_extractor/type_extractor/nodes/NoneNode.py b/py_type_extractor/type_extractor/nodes/NoneNode.py index a692e6d..bf576d8 100644 --- a/py_type_extractor/type_extractor/nodes/NoneNode.py +++ b/py_type_extractor/type_extractor/nodes/NoneNode.py @@ -1,4 +1,4 @@ -from typing import Set +from typing import Set, Optional from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor from .BaseNodeType import BaseNodeType @@ -6,6 +6,12 @@ class NoneNode(BaseNodeType): # type: ignore + def __init__( + self, + options: Optional[Set[BaseOption]] = None, + ): + self.options = options + def __hash__(self): return hash(id(NoneNode)) diff --git a/py_type_extractor/type_extractor/nodes/TypeOR.py b/py_type_extractor/type_extractor/nodes/TypeOR.py index c8f34c3..d52063b 100644 --- a/py_type_extractor/type_extractor/nodes/TypeOR.py +++ b/py_type_extractor/type_extractor/nodes/TypeOR.py @@ -7,7 +7,6 @@ @dataclass class TypeOR(BaseNodeType): # type: ignore - a: NodeType - b: NodeType + nodes: Set[NodeType] options: Set[BaseOption] = field(default_factory=set) From a207b19d879860b22077f344fcc165b361eab504 Mon Sep 17 00:00:00 2001 From: devdoomari3 <41351197+devdoomari3@users.noreply.github.com> Date: Sun, 6 Dec 2020 19:09:39 +0900 Subject: [PATCH 32/34] fix TypeExtractor.add return value (#50) Co-authored-by: Dev doomari --- py_type_extractor/type_extractor/type_extractor.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/py_type_extractor/type_extractor/type_extractor.py b/py_type_extractor/type_extractor/type_extractor.py index d246e80..155ab03 100644 --- a/py_type_extractor/type_extractor/type_extractor.py +++ b/py_type_extractor/type_extractor/type_extractor.py @@ -107,7 +107,6 @@ def add( options: Optional[Set[BaseOption]] = None, ): def add_decoration(typ): - if not is_builtin(typ): - self.rawtype_to_node(typ, options or set()) - return typ + return self.rawtype_to_node(typ, options or set()) + return add_decoration From 0c156d12acf70f2f3eea58c0d1ba353a0723c29e Mon Sep 17 00:00:00 2001 From: devdoomari3 <41351197+devdoomari3@users.noreply.github.com> Date: Sun, 6 Dec 2020 19:41:13 +0900 Subject: [PATCH 33/34] make hashtest recursive, fix hash errors on TypeOR, FixedGenericFound (#51) Co-authored-by: Dev doomari --- .../__tests__/test_class_with_union_field.py | 4 +++ .../test_func_with_generic_instance.py | 3 ++ .../__tests__/utils/hash_test.py | 34 ++++++++++++++++--- .../type_extractor/nodes/FixedGenericFound.py | 8 +++-- .../type_extractor/nodes/TypeOR.py | 5 +++ .../type_extractor/nodes/utils/get_self.py | 7 ++++ 6 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 py_type_extractor/type_extractor/nodes/utils/get_self.py diff --git a/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py b/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py index d7b5466..288735e 100644 --- a/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py +++ b/py_type_extractor/type_extractor/__tests__/test_class_with_union_field.py @@ -51,3 +51,7 @@ def test_class_with_union_field(): ) hash_test(type_collector) + + +if __name__ == '__main__': + test_class_with_union_field() \ No newline at end of file diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_generic_instance.py b/py_type_extractor/type_extractor/__tests__/test_func_with_generic_instance.py index b05b597..8c1e554 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_generic_instance.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_generic_instance.py @@ -78,3 +78,6 @@ def test_func_with_generic_instance(): hash_test(type_extractor) + +if __name__ == '__main__': + test_func_with_generic_instance() diff --git a/py_type_extractor/type_extractor/__tests__/utils/hash_test.py b/py_type_extractor/type_extractor/__tests__/utils/hash_test.py index 99a7411..c8a595f 100644 --- a/py_type_extractor/type_extractor/__tests__/utils/hash_test.py +++ b/py_type_extractor/type_extractor/__tests__/utils/hash_test.py @@ -1,10 +1,34 @@ +from typing import Dict, Set + from py_type_extractor.type_extractor.__base__ import BaseTypeExtractor +from py_type_extractor.type_extractor.__tests__.utils.traverse_node import traverse +from py_type_extractor.type_extractor.__tests__.utils.flags.__base__ import BaseUtilFlag +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType def hash_test(type_extractor: BaseTypeExtractor): for (key, value) in type_extractor.collected_types.items(): - try: - hashed = hash(value) - print(hashed) - except Exception as e: - raise RuntimeError(f"Hash failed -- couldn't hash {key} of {value}") \ No newline at end of file + traverse(value, _hash_test) + + +def _hash_test( + node: NodeType, + flags: Set[BaseUtilFlag] = None, +): + try: + hashed = hash(node) + print('hashing:', node) + print('output: ', hashed) + return node + except Exception as e: + raise RuntimeError(f"Hash failed -- couldn't hash ", node) +# +# def hash_test(type_extractor: BaseTypeExtractor): +# # maybe: do recursive-hash testing? +# +# for (key, value) in type_extractor.collected_types.items(): +# try: +# hashed = hash(value) +# print('hashed: ', value, 'output: ', hashed) +# except Exception as e: +# raise RuntimeError(f"Hash failed -- couldn't hash {key} of {value}") \ No newline at end of file diff --git a/py_type_extractor/type_extractor/nodes/FixedGenericFound.py b/py_type_extractor/type_extractor/nodes/FixedGenericFound.py index 33bfdee..083820d 100644 --- a/py_type_extractor/type_extractor/nodes/FixedGenericFound.py +++ b/py_type_extractor/type_extractor/nodes/FixedGenericFound.py @@ -3,6 +3,7 @@ from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption +from py_type_extractor.type_extractor.nodes.utils.get_self import get_self @dataclass @@ -13,5 +14,8 @@ class FixedGenericFound(BaseNodeType): def __hash__(self): return hash(id(FixedGenericFound))\ - + hash(tuple(self.type_vars))\ - + hash(self.origin) + + hash(frozenset([ + get_self(i) + for i in self.type_vars + ]))\ + + hash(get_self(self.origin)) diff --git a/py_type_extractor/type_extractor/nodes/TypeOR.py b/py_type_extractor/type_extractor/nodes/TypeOR.py index d52063b..efbc344 100644 --- a/py_type_extractor/type_extractor/nodes/TypeOR.py +++ b/py_type_extractor/type_extractor/nodes/TypeOR.py @@ -10,3 +10,8 @@ class TypeOR(BaseNodeType): # type: ignore nodes: Set[NodeType] options: Set[BaseOption] = field(default_factory=set) + + def __hash__(self): + return hash(TypeOR) \ + + hash(frozenset(self.nodes)) \ + + 0 diff --git a/py_type_extractor/type_extractor/nodes/utils/get_self.py b/py_type_extractor/type_extractor/nodes/utils/get_self.py new file mode 100644 index 0000000..6918250 --- /dev/null +++ b/py_type_extractor/type_extractor/nodes/utils/get_self.py @@ -0,0 +1,7 @@ +from py_type_extractor.type_extractor.nodes.BaseNodeType import NodeType, BaseNodeType + + +def get_self(node: NodeType): + if isinstance(node, BaseNodeType): + return node.get_self() + return node From 2787c2faf7cc14c71ff1248446ec64b188114ff4 Mon Sep 17 00:00:00 2001 From: Dev doomari Date: Sun, 6 Dec 2020 21:48:23 +0900 Subject: [PATCH 34/34] fix hash(ListFound) impl+test --- .../type_extractor/__tests__/test_func_with_list.py | 8 ++++++-- .../type_extractor/__tests__/utils/traverse_node.py | 11 +++++++++++ py_type_extractor/type_extractor/nodes/ListFound.py | 6 +++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/py_type_extractor/type_extractor/__tests__/test_func_with_list.py b/py_type_extractor/type_extractor/__tests__/test_func_with_list.py index 94e6d22..902ae2d 100644 --- a/py_type_extractor/type_extractor/__tests__/test_func_with_list.py +++ b/py_type_extractor/type_extractor/__tests__/test_func_with_list.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse +from py_type_extractor.type_extractor.__tests__.utils import cleanup, traverse, hash_test from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound from py_type_extractor.type_extractor.nodes.ListFound import ListFound @@ -50,4 +50,8 @@ def test_func_with_list(): cleanup, ) - hash(func_found_cleaned) + hash_test(type_collector) + + +if __name__ == '__main__': + test_func_with_list() diff --git a/py_type_extractor/type_extractor/__tests__/utils/traverse_node.py b/py_type_extractor/type_extractor/__tests__/utils/traverse_node.py index 89ec480..6b82072 100644 --- a/py_type_extractor/type_extractor/__tests__/utils/traverse_node.py +++ b/py_type_extractor/type_extractor/__tests__/utils/traverse_node.py @@ -14,6 +14,7 @@ from py_type_extractor.type_extractor.nodes.EnumFound import EnumFound from py_type_extractor.type_extractor.nodes.FixedGenericFound import FixedGenericFound from py_type_extractor.type_extractor.nodes.FunctionFound import FunctionFound +from py_type_extractor.type_extractor.nodes.ListFound import ListFound from py_type_extractor.type_extractor.nodes.NewType import NewTypeFound from py_type_extractor.type_extractor.nodes.TypeOR import TypeOR from py_type_extractor.type_extractor.nodes.TypeVarFound import TypeVarFound @@ -118,6 +119,16 @@ def traverse( typeor_node.options = new_options return typeor_node + if isinstance(node, ListFound): + list_node: ListFound = func(copy(node), flags) + already_traversed[node_id] = list_node + list_node.typ = traverse( + node=list_node.typ, + func=func, + already_traversed=already_traversed, + flags=flags, + ) + return list_node if isinstance(node, FixedGenericFound): fixed_generic_node = func(copy(node), flags) already_traversed[node_id] = fixed_generic_node diff --git a/py_type_extractor/type_extractor/nodes/ListFound.py b/py_type_extractor/type_extractor/nodes/ListFound.py index 61377cc..bc91149 100644 --- a/py_type_extractor/type_extractor/nodes/ListFound.py +++ b/py_type_extractor/type_extractor/nodes/ListFound.py @@ -3,6 +3,7 @@ from py_type_extractor.type_extractor.nodes.BaseNodeType import BaseNodeType, NodeType from py_type_extractor.type_extractor.nodes.BaseOption import BaseOption +from py_type_extractor.type_extractor.nodes.utils.get_self import get_self @dataclass @@ -11,4 +12,7 @@ class ListFound(BaseNodeType): # type: ignore options: Set[BaseOption] = field(default_factory=set) - + def __hash__(self): + return hash(get_self(self.typ)) \ + + hash(frozenset(self.options)) \ + + hash(ListFound)