diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..d23bd6a24 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +open_collective: "pikax" +custom: "https://paypal.me/pikaxdev" \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 2272d3c09..e74fedefb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,22 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. --- -## Changed +## Changes - [event][https://pikax.me/vue-composable/composable/event/event.html] - improve typing +- [path](https://pikax.me/vue-composable/composable/format/path) - Improve [array path access](https://pikax.me/vue-composable/composable/format/path.html#access) and add dev warnings +- [i18n](https://pikax.me/vue-composable/composable/i18n/i18n) - Allow to have factory based locale messages +- [i18n](https://pikax.me/vue-composable/composable/i18n/i18n) - Added console warnings when removing locales +- [i18n](https://pikax.me/vue-composable/composable/i18n/i18n) - Improve overriding locales +- [i18n](https://pikax.me/vue-composable/composable/i18n/i18n) - Setting new locale if the current locale is removed + +## Added + +- [i18n](https://pikax.me/vue-composable/composable/i18n/i18n) - Added `$tc`, same as `$t` but returns a string, sugar for usage in the template. + +## Fixes + +- [useValidation] - Fix tracking of `$value` when is not `ref` ## 1.0.0-dev.16 diff --git a/docs/composable/format/path.md b/docs/composable/format/path.md index cec4f5146..2c8d1f28e 100644 --- a/docs/composable/format/path.md +++ b/docs/composable/format/path.md @@ -35,6 +35,39 @@ const name = usePath({ user: { name: "test" } }, "user.name"); | ----- | -------- | ------------------------------------------------- | | name | `Ref` | Readonly `ref` with the object value for the path | +## Access + +```js +const o = { + a: { + a: 1, + b: [ + 2, + { + c: { + ["a-b-c-d"]: 3 + } + } + ] + } +}; + +usePath(o, "a[a]"); // result: 1 | equivalent: a.a +usePath(o, "[a]['a']"); // result: 1 | equivalent: a.a +usePath(o, '["a"][`b`][0]'); // result: 2 | equivalent: a.b["0"] +usePath(o, "a.b[1].c[a-b-c-d]"); // result: 3 | equivalent: a.b[1].c["a-b-c-d"] +``` + +## Limitations + +The access in `[]` is limited to this regex expression: + +```regex + /\[[`'"]?([^`'"\]]*)[`'"]?\]/g +``` + +If you want to improve this, please raise an [issue](https://github.com/pikax/vue-composable/issues/new) or create a [PR](https://github.com/pikax/vue-composable/pulls) + ## Example diff --git a/docs/composable/i18n/i18n.md b/docs/composable/i18n/i18n.md index b2215bb55..0f0d34e84 100644 --- a/docs/composable/i18n/i18n.md +++ b/docs/composable/i18n/i18n.md @@ -189,14 +189,15 @@ The `useI18n` function exposes the following methods: ```js import { useI18n } from "vue-composable"; -const { $t, addLocale, removeLocale } = useI18n(); +const { $t, $ts, addLocale, removeLocale } = useI18n(); ``` -| Signature | Description | -| ----------------------------- | -------------------------- | -| `$t(path, args?)` | Retrieve localised message | -| `addLocale(locale, messages)` | add new locale | -| `removeLocale(locale)` | remove locale | +| Signature | Description | +| ----------------------------- | -------------------------------------------------------- | +| `$t(path, args?)` | Retrieve localised message | +| `$ts(path, args?)` | Same as `$t` but returns string instead of `ref` | +| `addLocale(locale, messages)` | add new locale | +| `removeLocale(locale)` | remove locale | ## Example diff --git a/package.json b/package.json index c6d5b5df1..10e9002d5 100644 --- a/package.json +++ b/package.json @@ -63,35 +63,35 @@ ] }, "devDependencies": { - "@microsoft/api-extractor": "^7.7.10", + "@microsoft/api-extractor": "^7.7.12", "@rollup/plugin-json": "^4.0.2", "@rollup/plugin-node-resolve": "^7.1.1", "@rollup/plugin-replace": "^2.3.1", - "@types/jest": "^25.1.4", - "@types/node": "^13.9.4", + "@types/jest": "^25.1.5", + "@types/node": "^13.11.0", "@vue/composition-api": "^0.5.0", "@vuepress/plugin-back-to-top": "^1.4.0", "@vuepress/plugin-pwa": "^1.4.0", "axios": "^0.19.2", "brotli": "^1.3.2", - "chalk": "^3.0.0", + "chalk": "^4.0.0", "coveralls": "^3.0.11", "enquirer": "^2.3.4", "execa": "^4.0.0", "fs-extra": "^9.0.0", "husky": "^4.2.3", - "jest": "^25.2.3", + "jest": "^25.2.6", "jest-junit": "^10.0.0", "jest-websocket-mock": "^2.0.2", - "lint-staged": "^10.0.9", + "lint-staged": "^10.1.1", "lodash.camelcase": "^4.3.0", "minimist": "^1.2.5", "mock-socket": "^9.0.3", "rimraf": "^3.0.2", - "rollup": "^2.2.0", + "rollup": "^2.3.2", "rollup-plugin-terser": "^5.3.0", "rollup-plugin-typescript2": "^0.27.0", - "ts-jest": "^25.2.1", + "ts-jest": "^25.3.0", "tsd": "^0.11.0", "typescript": "^3.8.3", "vue": "^2.6.10", diff --git a/packages/axios/__tests__/axios.spec.ts b/packages/axios/__tests__/axios.spec.ts index 0feaf231d..5df7a4364 100644 --- a/packages/axios/__tests__/axios.spec.ts +++ b/packages/axios/__tests__/axios.spec.ts @@ -24,7 +24,7 @@ describe("axios", () => { }); it("should call axios", async () => { - const { exec, client } = useAxios(); + const { exec, client } = useAxios(false); const request: AxiosRequestConfig = { method: "GET", url: "./api/1" @@ -37,6 +37,20 @@ describe("axios", () => { ); }); + it("should call axios using string and options", async () => { + const url = "./api/1"; + const request: AxiosRequestConfig = { + method: "GET" + }; + const { exec, client } = useAxios(url, request); + + await exec(url); + + expect(client.value.request).toBeCalledWith( + expect.objectContaining({ url, ...request }) + ); + }); + it("should call axios using string", async () => { const { exec, client } = useAxios(); const url = "./api/1"; @@ -190,7 +204,7 @@ describe("axios", () => { const req: Partial = { url: "./api/1" }; - useAxios(req); + useAxios(req, false); expect(request).toBeCalledWith(expect.objectContaining(req)); }); @@ -206,4 +220,11 @@ describe("axios", () => { "Cannot cancel because no request has been made" ); }); + + it("should warn if cancel is called before any request has been made", () => { + const { cancel } = useAxios(true); + expect(cancel).toThrowError( + "Cannot cancel because no request has been made" + ); + }); }); diff --git a/packages/core/__tests__/format/path.spec.ts b/packages/core/__tests__/format/path.spec.ts index 0f0369448..d914d3bf5 100644 --- a/packages/core/__tests__/format/path.spec.ts +++ b/packages/core/__tests__/format/path.spec.ts @@ -1,4 +1,5 @@ import { usePath } from "../../src"; +import { ref } from "@vue/composition-api"; describe("path", () => { it("should return the object value", () => { @@ -35,4 +36,106 @@ describe("path", () => { expect(usePath(o, "array[1]").value).toBe(2); expect(usePath(o, "deep.x[1].a.b").value).toBe(1); }); + + describe("not found", () => { + const notFoundResolverMock = jest.fn().mockImplementation(() => "test"); + + const warnSpy = jest.spyOn(console, "warn"); + + beforeEach(() => { + notFoundResolverMock.mockClear(); + warnSpy.mockClear(); + }); + + test("source `undefined`", () => { + expect( + usePath(ref(undefined), "yey", undefined, notFoundResolverMock).value + ).toBe("test"); + expect(notFoundResolverMock).toHaveBeenLastCalledWith( + "yey", + undefined, + "yey", + undefined + ); + }); + + test("no path", () => { + const o = { + a: 1 + }; + expect(usePath(o, "", undefined, notFoundResolverMock).value).toBe(o); + expect(notFoundResolverMock).not.toBeCalled(); + }); + + test("first path not found", () => { + const o = { + a: 1 + }; + expect(usePath(o, "b", undefined, notFoundResolverMock).value).toBe( + "test" + ); + expect(notFoundResolverMock).toBeCalled(); + expect(warnSpy).toBeCalledWith(`Path "b" doesn't exist on:`, o); + }); + + test("deep path not found", () => { + const o = { + a: { + c: "hello" + } + }; + expect(usePath(o, "a.c.a", undefined, notFoundResolverMock).value).toBe( + "test" + ); + expect(notFoundResolverMock).toBeCalled(); + expect(warnSpy).toBeCalledWith(`Path "a.c.a" doesn't exist on:`, o); + }); + + test("if access with []", () => { + const o = {}; + expect(usePath(o, "[]", undefined, notFoundResolverMock).value).toBe( + "test" + ); + expect(warnSpy).toBeCalledWith(`Path "[]" doesn't exist on:`, o); + }); + + test("access with consecutive []", () => { + const o = { + a: { + a: 1, + b: [ + 2, + { + c: { + ["a-b-c-d"]: 3 + } + } + ] + } + }; + + expect(usePath(o, "a[a]").value).toBe(o.a.a); + expect(usePath(o, "[a]['a']").value).toBe(o.a.a); + expect(usePath(o, '["a"][`b`][0]').value).toBe(o.a.b[0]); + expect(usePath(o, "a.b[1].c[a-b-c-d]").value).toBe( + (o.a.b[1] as any).c["a-b-c-d"] + ); + }); + + test("invalid path parsing", () => { + expect(usePath({}, "a[a]o[a]").value).toBeUndefined(); + expect(warnSpy).toHaveBeenNthCalledWith( + 1, + `[usePath] invalid path "a[a]o[a]"` + ); + }); + + test("invalid array accessor", () => { + expect(usePath({}, "aa]").value).toBeUndefined(); + expect(warnSpy).toHaveBeenNthCalledWith( + 1, + `[usePath] invalid path provided "aa]"` + ); + }); + }); }); diff --git a/packages/core/__tests__/i18n/i18n.spec.ts b/packages/core/__tests__/i18n/i18n.spec.ts index 4b8b75da4..a753dee7d 100644 --- a/packages/core/__tests__/i18n/i18n.spec.ts +++ b/packages/core/__tests__/i18n/i18n.spec.ts @@ -1,8 +1,28 @@ -import { buildI18n } from "../../src"; +const provideSpy = jest.fn(); +const injectSpy = jest.fn(); +const buildI18nSpy = jest + .fn() + .mockImplementation(jest.requireActual("@vue/composition-api").buildI18n); +jest.mock("@vue/composition-api", () => ({ + ...jest.requireActual("@vue/composition-api"), + provide: provideSpy, + inject: injectSpy, + buildI18n: buildI18nSpy +})); + +// import Vue from "vue"; +import { buildI18n, promisedTimeout, setI18n, useI18n } from "../../src"; import { nextTick } from "../utils"; import { ref } from "@vue/composition-api"; describe("i18n", () => { + const warnSpy = jest.spyOn(console, "warn"); + const errorSpy = jest.spyOn(console, "error"); + beforeEach(() => { + warnSpy.mockReset(); + errorSpy.mockReset(); + }); + it("should work", async () => { const x = buildI18n({ locale: "en", @@ -66,6 +86,21 @@ describe("i18n", () => { }); describe("fallback", () => { + it("should return full path if not found", () => { + const x = buildI18n({ + locale: "en", + messages: { + en: { + hello: "hello world" + } + } + }); + + const path = "hello.moto.how.are.you"; + expect(x.$t(path).value).toBe(path); + expect(x.$ts(path)).toBe(path); + }); + it("should not fallback if no fallback is present", () => { const x = buildI18n({ locale: "pt", @@ -115,4 +150,269 @@ describe("i18n", () => { expect((x.i18n.value as any).hello).toBe("Hello"); }); + it("should resolve promise based", async () => { + const x = buildI18n({ + locale: "en", + fallback: "en", + messages: { + en: () => + Promise.resolve({ + hello: "hello world", + helloName: "Hello {name}", + version: "My version is", + ref: ref("Hey") + }), + pt: () => ({ + hello: "Olá mundo", + helloName: "Olá {name}", + ref: ref("Boas") + }) + } + }); + + await promisedTimeout(10); + + await nextTick(); + + expect(x.i18n.value).toMatchObject({ + hello: "hello world", + helloName: "Hello {name}", + version: "My version is", + ref: "Hey" + }); + + expect(x.$t("hello").value).toBe("hello world"); + expect(x.$t("helloName", { name: "pikax" }).value).toBe("Hello pikax"); + + expect(x.i18n.value.hello).toBe("hello world"); + expect(x.i18n.value.helloName).toBe("Hello {name}"); + expect(x.i18n.value.version).toBe("My version is"); + + x.locale.value = "pt"; + await nextTick(); + + expect(x.i18n.value).toMatchObject({ + hello: "Olá mundo", + helloName: "Olá {name}", + version: "My version is", + ref: "Boas" + }); + + expect(x.$t("hello").value).toBe("Olá mundo"); + expect(x.$t("helloName", { name: "pikax" }).value).toBe("Olá pikax"); + + x.locale.value = "en"; + await nextTick(); + x.locale.value = "pt"; + await nextTick(); + + expect(x.i18n.value).toMatchObject({ + hello: "Olá mundo", + helloName: "Olá {name}", + version: "My version is", + ref: "Boas" + }); + + expect(x.$t("hello").value).toBe("Olá mundo"); + expect(x.$t("helloName", { name: "pikax" }).value).toBe("Olá pikax"); + + x.locale.value = "empty" as any; + await nextTick(); + + expect(x.i18n.value).toMatchObject({ + hello: "hello world", + helloName: "Hello {name}", + version: "My version is", + ref: "Hey" + }); + }); + + it("should use provided resolve", () => { + const resolveMock = jest + .fn() + .mockImplementation((i18n, path, args) => `hello ${path} ${args.a}`); + const { $t } = buildI18n({ + locale: "en", + fallback: "en", + resolve: resolveMock as any, + messages: { + en: { + hello: "hello world", + helloName: "Hello {name}", + version: "My version is", + ref: ref("Hey") + }, + pt: { + hello: "Olá mundo", + helloName: "Olá {name}", + ref: ref("Boas") + } + } + }); + + expect($t("x", { a: 1 }).value).toBe("hello x 1"); + expect(resolveMock).toHaveBeenCalled(); + }); + + it("should add/remove locales", async () => { + const pt = { + hello: "Olá mundo", + helloName: "Olá {name}" + }; + const x = buildI18n({ + locale: "en", + fallback: "en", + messages: { + en: { + hello: "hello world", + helloName: "Hello {name}" + } + } + }); + + x.removeLocale("pt" as any); + expect(warnSpy).toHaveBeenLastCalledWith( + `[useI18n] Locale "pt" doesn't exist` + ); + + x.locale.value = "pt" as any; + + await nextTick(); + + expect(x.i18n.value).toMatchObject({ + hello: "hello world", + helloName: "Hello {name}" + }); + + x.addLocale("pt", pt); + expect(x.locales.value).toContain("pt"); + + await nextTick(); + + expect(x.i18n.value).toMatchObject(pt); + + const overridePT = { + hello: "Oi", + helloName: "Oi {name}" + }; + + x.addLocale("pt", overridePT); + expect(warnSpy).toHaveBeenLastCalledWith( + `[useI18n] Locale "pt" already exists, overriding it...` + ); + + expect(x.locales.value).toHaveLength(2); + expect(x.locales.value).toContain("pt"); + + await nextTick(); + expect(x.i18n.value).toMatchObject(overridePT); + + // if the current locale is removed it should go to fallback + + x.removeLocale("pt" as any); + expect(warnSpy).toHaveBeenLastCalledWith( + `[useI18n] removing current locale "pt", setting current locale to "en"` + ); + + await nextTick(); + expect(x.locale.value).toBe("en"); + + x.addLocale("pt", pt); + await nextTick(); + // removing simple + x.removeLocale("pt" as any); + await nextTick(); + + x.addLocale("pt", pt); + await nextTick(); + + warnSpy.mockReset(); + + x.removeLocale("en"); + await nextTick(); + + expect(warnSpy).toHaveBeenCalledTimes(2); + expect(warnSpy).toHaveBeenNthCalledWith( + 1, + '[useI18n] removing default fallback locale "en"' + ); + + expect(warnSpy).toHaveBeenNthCalledWith( + 2, + '[useI18n] removing current locale "en", setting current locale to "pt"' + ); + + expect(x.locale.value).toBe("pt"); + expect(x.locales.value).toHaveLength(1); + + x.removeLocale("pt" as any); + await nextTick(); + expect(x.locales.value).toHaveLength(0); + + expect(errorSpy).toHaveBeenCalledWith( + `[useI18n] No locales available to use` + ); + + expect(Object.keys(x.i18n.value)).toHaveLength(0); + }); + + describe("injection", () => { + beforeEach(() => { + buildI18nSpy.mockClear(); + provideSpy.mockClear(); + injectSpy.mockClear(); + }); + + it("should build i18n and provide it", () => { + const i18n: any = { + locale: "en", + fallback: "en", + messages: { + en: { + hello: "hello world", + helloName: "Hello {name}", + version: "My version is", + ref: ref("Hey") + } + } + }; + const x = setI18n(i18n); + + expect(x.i18n.value).toMatchObject({ + hello: "hello world", + helloName: "Hello {name}", + version: "My version is", + ref: "Hey" + }); + expect(provideSpy).toHaveBeenCalledWith(expect.anything(), x); + }); + + it("should return definition if passed", () => { + const x = useI18n({ + locale: "en", + fallback: "en", + messages: { + en: { + hello: "hello world", + helloName: "Hello {name}", + version: "My version is", + ref: ref("Hey") + } + } + }); + + expect(x.i18n.value).toMatchObject({ + hello: "hello world", + helloName: "Hello {name}", + version: "My version is", + ref: "Hey" + }); + expect(injectSpy).not.toHaveBeenCalled(); + }); + + it("should inject if no definition passed", () => { + useI18n(); + expect(injectSpy).toHaveBeenCalled(); + }); + }); }); diff --git a/packages/core/__tests__/validation/validation.spec.ts b/packages/core/__tests__/validation/validation.spec.ts index 73552d628..e98bf9ad5 100644 --- a/packages/core/__tests__/validation/validation.spec.ts +++ b/packages/core/__tests__/validation/validation.spec.ts @@ -157,6 +157,7 @@ describe("validation", () => { } }); + v.password.$value; expect(v.password.required.$pending).toBe(true); expect(v.password.required.$message).toBe("Err"); @@ -166,4 +167,26 @@ describe("validation", () => { expect(v.password.required.$pending).toBe(false); expect(v.password.required.$message).toBe("Err"); }); + + it("should test error ", async () => { + const v = useValidation({ + input: { + $value: "", + + required() { + throw Error("error 1"); + }, + match() { + throw Error("error 2"); + } + } + }); + v.input.$value = "1"; + await nextTick(); + + expect(v.input.$errors).toStrictEqual([ + new Error("error 1"), + new Error("error 2") + ]); + }); }); diff --git a/packages/core/src/format/format.ts b/packages/core/src/format/format.ts index 0b44d4497..a4a99222d 100644 --- a/packages/core/src/format/format.ts +++ b/packages/core/src/format/format.ts @@ -9,6 +9,11 @@ export interface FormatObject { [id: string]: FormatValue; } +export function useFormat( + format: RefTyped>, + obj?: RefTyped +): Readonly>; + export function useFormat( format: Readonly>, obj?: RefTyped @@ -24,6 +29,11 @@ export function useFormat( obj?: RefTyped | Array ): Readonly>; +export function useFormat( + format: RefTyped, + args: any +): Readonly>; + export function useFormat( format: RefTyped, args: any diff --git a/packages/core/src/format/path.ts b/packages/core/src/format/path.ts index bb79d8085..c12084daf 100644 --- a/packages/core/src/format/path.ts +++ b/packages/core/src/format/path.ts @@ -1,12 +1,12 @@ import { RefTyped, unwrap, isObject, NO_OP } from "../utils"; import { computed, Ref } from "@vue/composition-api"; -export type UsePathNotFoundReturn = ( +export type UsePathNotFoundReturn = ( path: string, source: any, fullPath: string, originalSource: any -) => any; +) => T; export function usePath( source: RefTyped, @@ -28,36 +28,98 @@ export function usePath( let c = s; for (let i = 0; i < fragments.length; i++) { let fragmentPath = fragments[i]; - let index: any = -1; if (fragmentPath[fragmentPath.length - 1] === "]") { - const m = fragmentPath.match(/\[(\d+)\]$/); - if (m && m[1]) { - index = +m[1]; + const r = /\[[`'"]?([^`'"\]]*)[`'"]?\]/g; + let path = fragmentPath; + let m = r.exec(path); - fragmentPath = fragmentPath.slice(0, -m[0].length); + if (m) { + let lastLen = m[0].length; + let lastIndex = m.index - lastLen; + let mi = 1; + + do { + if (lastIndex + lastLen !== m.index) { + // istanbul ignore else + if (__DEV__) { + console.warn(`[usePath] invalid path "${fragments[i]}"`); + } + } + lastIndex = m.index; + lastLen = m[0].length; + + fragmentPath = fragmentPath.slice(0, -m[0].length); + fragments.splice(i + mi, 0, m[1]); + + ++mi; + } while ((m = r.exec(path))); + + // if the fragmentPath is empty, eg: [1][1] + // we should continue until the next path + if (!fragmentPath && path[0] === "[" && path.length > 2) { + continue; + } + } else { + fragmentPath = ""; + console.warn(`[usePath] invalid path provided "${path}"`); } } if (isObject(c)) { - c = c[fragmentPath]; - - // array like: when using ref with and array, it becomes arraylike object - if (index >= 0) { - c = (c as any)[index]; + if (!fragmentPath) { + // istanbul ignore else + if (__DEV__) { + console.warn( + `Path "${fragments + .slice(0, i + 1) + .join(separator)}" doesn't exist on:`, + source + ); + } + return notFoundReturn( + fragments.slice(0, i + 1).join(separator), + c, + p, + s + ); } + + c = c[fragmentPath]; } else { + // istanbul ignore else if (__DEV__) { console.warn( - `Path "${fragments.slice(0, i).join(separator)}" doesn't exist on:`, + `Path "${fragments + .slice(0, i + 1) + .join(separator)}" doesn't exist on:`, source ); } - return notFoundReturn(fragments.slice(0, i).join(separator), c, p, s); + return notFoundReturn( + fragments.slice(0, i + 1).join(separator), + c, + p, + s + ); } if (!c) { - return notFoundReturn(fragments.slice(0, i).join(separator), c, p, s); + // istanbul ignore else + if (__DEV__) { + console.warn( + `Path "${fragments + .slice(0, i + 1) + .join(separator)}" doesn't exist on:`, + source + ); + } + return notFoundReturn( + fragments.slice(0, i + 1).join(separator), + c, + p, + s + ); } } diff --git a/packages/core/src/i18n/i18n.ts b/packages/core/src/i18n/i18n.ts index 1065e2da5..f76c63d7b 100644 --- a/packages/core/src/i18n/i18n.ts +++ b/packages/core/src/i18n/i18n.ts @@ -1,3 +1,4 @@ +import Vue from "vue"; import { Ref, ref, @@ -17,6 +18,7 @@ import { } from "../utils"; import { usePath, useFormat, FormatObject, FormatValue } from "../format"; +// istanbul ignore next const I18n_ACCESS_SYMBOL: InjectionKey { fallback?: keyof TMessage; - messages: { [K in keyof TMessage]: i18n | (() => Promise) }; + messages: { + [K in keyof TMessage]: i18n | (() => Promise) | (() => i18n); + }; /** * Resolves the translation for i18n @@ -78,10 +82,18 @@ interface i18nResult { $t(path: string, args?: object | Array): Readonly>; + $ts(path: string, args?: object | Array): string; + addLocale(locale: string, messages: TMessages): void; removeLocale(locale: TLocales): void; } +type PromiseResult = T extends Promise ? R : T; + +type I18nExtractLocale = T extends (...args: any[]) => any + ? PromiseResult> + : PromiseResult; + export function useI18n< T extends i18nDefinition, TMessage extends Record Promise)> @@ -96,7 +108,12 @@ export function useI18n(definition?: any): any { export function buildI18n< T extends i18nDefinition, TMessage extends Record Promise)> ->(definition: T): i18nResult { +>( + definition: T +): i18nResult< + keyof T["messages"], + I18nExtractLocale +> { const locales = ref>(Object.keys(definition.messages)); const localeMessages = ref< Record Promise)> @@ -109,7 +126,9 @@ export function buildI18n< const loadLocale = ( locale: string, - localeMessages: Ref Promise)>> + localeMessages: Ref< + Record Promise) | (() => i18n)> + > ): Ref | Promise> => { if (cache[locale]) { return cache[locale]; @@ -120,9 +139,16 @@ export function buildI18n< return ref({}); } + let m = isFunction(l) ? l() : l; + if (isPromise(m)) { + return m.then(x => (cache[locale] = wrap(x))); + } + + // if it was function we don't keep track on that if (isFunction(l)) { - return Promise.resolve(l()).then(x => (cache[locale] = wrap(x))); + return wrap(m); } + return (cache[locale] = computed(() => localeMessages.value[locale])); }; @@ -140,19 +166,25 @@ export function buildI18n< ); if (isPromise(fallbackI18n)) { fallbackI18n.then(x => { - fallback = x; + fallback.value = x.value; }); fallbackIsPromise = true; } else { - fallback = fallbackI18n; + fallback.value = fallbackI18n.value; } } else { fallback.value = {}; } - watch( - [locale, fallback], - async ([l, fb]: [keyof TMessage, i18n | undefined]) => { + const localeChangesCount = ref(0); + watch(localeMessages, () => localeChangesCount.value++, { + deep: true, + lazy: true + }); + + watch( + [locale, fallback, localeChangesCount], + async ([l, fb, _]: [keyof TMessage, i18n | undefined, any]) => { if (l === definition.fallback && shouldFallback) { i18n.value = fb!; } else { @@ -172,31 +204,81 @@ export function buildI18n< if (definition.resolve) { return wrap(definition.resolve(i18n.value, path, args)); } - return useFormat(usePath(i18n, path, ".", (_, _1, p) => p) as any, args); + return useFormat( + usePath(i18n, path, ".", (_, _1, p, _2) => p) as Ref, + args + ); + }; + + const $ts = ( + path: Readonly>, + args: RefTyped | Array | undefined + ): string => { + return $t(path, args).value; }; const addLocale = (l: string, m: any) => { if (locales.value.indexOf(l as any) >= 0) { + /* istanbul ignore else */ if (__DEV__) { - console.warn("Locale already exists, overriding it"); + console.warn( + `[useI18n] Locale "${l}" already exists, overriding it...` + ); } } else { locales.value.push(l as any); } delete cache[l]; - (localeMessages.value as Record)[l] = m; + + localeMessages.value = { + ...localeMessages.value, + [l]: m + }; + // Vue.set(localeMessages.value, l, m); + // (localeMessages.value as Record)[l] = m; }; const removeLocale = (l: keyof TMessage) => { const index = locales.value.indexOf(l); if (index >= 0) { + const nextLocale = [ + locale.value, + fallback.value && definition.fallback, + ...locales.value + ].find(x => x && x !== l); + + if (nextLocale) { + if (l === definition.fallback) { + /* istanbul ignore else */ + if (__DEV__) { + console.warn(`[useI18n] removing default fallback locale "${l}"`); + } + fallback.value = undefined; + } + if (l === locale.value) { + /* istanbul ignore else */ + if (__DEV__) { + console.warn( + `[useI18n] removing current locale "${l}", setting current locale to "${nextLocale}"` + ); + } + locale.value = nextLocale; + } + } else { + /* istanbul ignore else */ + if (__DEV__) { + console.error("[useI18n] No locales available to use"); + } + } locales.value.splice(index, 1); } else { + /* istanbul ignore else */ if (__DEV__) { - console.warn("Locale doesn't exist"); + console.warn(`[useI18n] Locale "${l}" doesn't exist`); } } - delete localeMessages.value[l]; + Vue.delete(localeMessages.value, l as string); + // delete localeMessages.value[l]; delete cache[l as string]; }; @@ -207,6 +289,7 @@ export function buildI18n< i18n, $t, + $ts, addLocale, removeLocale diff --git a/packages/core/src/validation/validation.ts b/packages/core/src/validation/validation.ts index 0a5a9cb7c..d05818c30 100644 --- a/packages/core/src/validation/validation.ts +++ b/packages/core/src/validation/validation.ts @@ -1,4 +1,11 @@ -import { UnwrapRef, isObject, isPromise, isBoolean, RefTyped } from "../utils"; +import { + UnwrapRef, + isObject, + isPromise, + isBoolean, + RefTyped, + wrap +} from "../utils"; import { ref, Ref, watch, computed, reactive } from "@vue/composition-api"; type ValidatorFunc = ( @@ -16,6 +23,8 @@ type Validator = ValidatorFunc | ValidatorObject>; interface ValidationValue { $value: UnwrapRef; $dirty: boolean; + $errors: Array; + $anyInvalid: boolean; } interface ValidatorResult { @@ -70,16 +79,17 @@ type ValidatorOutput, E = any> = T extends ValidatorFunc< // TODO variables started with $ are not treated as validators, not // sure how to do that on typescript :/ + +type ValidatorObjectOutput = { + [K in TK]: T[K] extends Validator ? ValidatorOutput : never; +}; + type ValidationOutput> = T extends { - $value: infer TValue; + $value: any; } ? ValidationValue & - { - [K in Exclude]: T[K] extends Validator - ? ValidatorOutput - : never; - } - : { [K in keyof T]: ValidationOutput & ValidationGroupResult }; + ValidatorObjectOutput> + : { [K in keyof T]: ValidationOutput }; /* /Output */ @@ -182,7 +192,7 @@ const buildValidation = ( handlers: Array ): Record> => { const r: Record> = {}; - const $value = isValidation(o) ? o.$value : undefined; + const $value: any | undefined = isValidation(o) ? wrap(o.$value) : undefined; for (const k of Object.keys(o)) { if (k[0] === "$") { if (k === "$value") { @@ -230,13 +240,9 @@ const buildValidation = ( const validations = Object.keys(validation) .filter(x => x[0] !== "$") .map(x => (validation[x] as any) as ValidatorResult); - $errors = computed(() => { - return validations - .map(x => x.$error) - .filter(x => - Boolean(x) && Array.isArray(x) ? x.some(Boolean) : x - ); - }) as Ref<[]>; + $errors = computed(() => + validations.map(x => x.$error).filter(Boolean) + ) as Ref<[]>; // $anyDirty = computed(() => validations.some(x => !!x)); $anyInvalid = computed(() => validations.some(x => !!x.$invalid)); } else { @@ -252,8 +258,7 @@ const buildValidation = ( $anyDirty = computed(() => validations.some( x => - (x.$anyDirty && x.$anyDirty) || - (isBoolean((x as any).$dirty) && (x as any).$dirty) + x.$anyDirty || (isBoolean((x as any).$dirty) && (x as any).$dirty) ) ); $anyInvalid = computed(() => validations.some(x => !!x.$anyInvalid)); diff --git a/yarn.lock b/yarn.lock index ade6498ed..242932b2a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -978,43 +978,43 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@jest/console@^25.2.3": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.2.3.tgz#38ac19b916ff61457173799239472659e1a67c39" - integrity sha512-k+37B1aSvOt9tKHWbZZSOy1jdgzesB0bj96igCVUG1nAH1W5EoUfgc5EXbBVU08KSLvkVdWopLXaO3xfVGlxtQ== +"@jest/console@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.2.6.tgz#f594847ec8aef3cf27f448abe97e76e491212e97" + integrity sha512-bGp+0PicZVCEhb+ifnW9wpKWONNdkhtJsRE7ap729hiAfTvCN6VhGx0s/l/V/skA2pnyqq+N/7xl9ZWfykDpsg== dependencies: - "@jest/source-map" "^25.2.1" + "@jest/source-map" "^25.2.6" chalk "^3.0.0" - jest-util "^25.2.3" + jest-util "^25.2.6" slash "^3.0.0" -"@jest/core@^25.2.3": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.2.3.tgz#2fd37ce0e6ad845e058dcd8245f2745490df1bc0" - integrity sha512-Ifz3aEkGvZhwijLMmWa7sloZVEMdxpzjFv3CKHv3eRYRShTN8no6DmyvvxaZBjLalOlRalJ7HDgc733J48tSuw== +"@jest/core@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.2.6.tgz#4bcb2919268d92c3813e1ff7c97443cde7a2873a" + integrity sha512-uMwUtpS4CWc7SadHcHEQ3VdrZ8A5u+UVbHIVUqhXcxlQ/bBC5+/T9IJGSu0o8e+/EXmFrTtl4zGr1nRPFq0Wlg== dependencies: - "@jest/console" "^25.2.3" - "@jest/reporters" "^25.2.3" - "@jest/test-result" "^25.2.3" - "@jest/transform" "^25.2.3" - "@jest/types" "^25.2.3" + "@jest/console" "^25.2.6" + "@jest/reporters" "^25.2.6" + "@jest/test-result" "^25.2.6" + "@jest/transform" "^25.2.6" + "@jest/types" "^25.2.6" ansi-escapes "^4.2.1" chalk "^3.0.0" exit "^0.1.2" graceful-fs "^4.2.3" - jest-changed-files "^25.2.3" - jest-config "^25.2.3" - jest-haste-map "^25.2.3" - jest-message-util "^25.2.3" - jest-regex-util "^25.2.1" - jest-resolve "^25.2.3" - jest-resolve-dependencies "^25.2.3" - jest-runner "^25.2.3" - jest-runtime "^25.2.3" - jest-snapshot "^25.2.3" - jest-util "^25.2.3" - jest-validate "^25.2.3" - jest-watcher "^25.2.3" + jest-changed-files "^25.2.6" + jest-config "^25.2.6" + jest-haste-map "^25.2.6" + jest-message-util "^25.2.6" + jest-regex-util "^25.2.6" + jest-resolve "^25.2.6" + jest-resolve-dependencies "^25.2.6" + jest-runner "^25.2.6" + jest-runtime "^25.2.6" + jest-snapshot "^25.2.6" + jest-util "^25.2.6" + jest-validate "^25.2.6" + jest-watcher "^25.2.6" micromatch "^4.0.2" p-each-series "^2.1.0" realpath-native "^2.0.0" @@ -1022,36 +1022,36 @@ slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^25.2.3": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.2.3.tgz#32b3f216355b03e9449b93b62584c18934a2cc4a" - integrity sha512-zRypAMQnNo8rD0rCbI9+5xf+Lu+uvunKZNBcIWjb3lTATSomKbgYO+GYewGDYn7pf+30XCNBc6SH1rnBUN1ioA== +"@jest/environment@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.2.6.tgz#8f7931e79abd81893ce88b7306f0cc4744835000" + integrity sha512-17WIw+wCb9drRNFw1hi8CHah38dXVdOk7ga9exThhGtXlZ9mK8xH4DjSB9uGDGXIWYSHmrxoyS6KJ7ywGr7bzg== dependencies: - "@jest/fake-timers" "^25.2.3" - "@jest/types" "^25.2.3" - jest-mock "^25.2.3" + "@jest/fake-timers" "^25.2.6" + "@jest/types" "^25.2.6" + jest-mock "^25.2.6" -"@jest/fake-timers@^25.2.3": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.2.3.tgz#808a8a761be3baac719311f8bde1362bd1861e65" - integrity sha512-B6Qxm86fl613MV8egfvh1mRTMu23hMNdOUjzPhKl/4Nm5cceHz6nwLn0nP0sJXI/ue1vu71aLbtkgVBCgc2hYA== +"@jest/fake-timers@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.2.6.tgz#239dbde3f56badf7d05bcf888f5d669296077cad" + integrity sha512-A6qtDIA2zg/hVgUJJYzQSHFBIp25vHdSxW/s4XmTJAYxER6eL0NQdQhe4+232uUSviKitubHGXXirt5M7blPiA== dependencies: - "@jest/types" "^25.2.3" - jest-message-util "^25.2.3" - jest-mock "^25.2.3" - jest-util "^25.2.3" + "@jest/types" "^25.2.6" + jest-message-util "^25.2.6" + jest-mock "^25.2.6" + jest-util "^25.2.6" lolex "^5.0.0" -"@jest/reporters@^25.2.3": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.2.3.tgz#824e922ea56686d0243c910559c36adacdd2081c" - integrity sha512-S0Zca5e7tTfGgxGRvBh6hktNdOBzqc6HthPzYHPRFYVW81SyzCqHTaNZydtDIVehb9s6NlyYZpcF/I2vco+lNw== +"@jest/reporters@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.2.6.tgz#6d87e40fb15adb69e22bb83aa02a4d88b2253b5f" + integrity sha512-DRMyjaxcd6ZKctiXNcuVObnPwB1eUs7xrUVu0J2V0p5/aZJei5UM9GL3s/bmN4hRV8Mt3zXh+/9X2o0Q4ClZIA== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^25.2.3" - "@jest/test-result" "^25.2.3" - "@jest/transform" "^25.2.3" - "@jest/types" "^25.2.3" + "@jest/console" "^25.2.6" + "@jest/test-result" "^25.2.6" + "@jest/transform" "^25.2.6" + "@jest/types" "^25.2.6" chalk "^3.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" @@ -1061,10 +1061,10 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.0.0" - jest-haste-map "^25.2.3" - jest-resolve "^25.2.3" - jest-util "^25.2.3" - jest-worker "^25.2.1" + jest-haste-map "^25.2.6" + jest-resolve "^25.2.6" + jest-util "^25.2.6" + jest-worker "^25.2.6" slash "^3.0.0" source-map "^0.6.0" string-length "^3.1.0" @@ -1073,51 +1073,50 @@ optionalDependencies: node-notifier "^6.0.0" -"@jest/source-map@^25.2.1": - version "25.2.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.2.1.tgz#b62ecf8ae76170b08eff8859b56eb7576df34ab8" - integrity sha512-PgScGJm1U27+9Te/cxP4oUFqJ2PX6NhBL2a6unQ7yafCgs8k02c0LSyjSIx/ao0AwcAdCczfAPDf5lJ7zoB/7A== +"@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.2.3" source-map "^0.6.0" -"@jest/test-result@^25.2.3": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.2.3.tgz#db6028427514702c739dda66528dfbcc7fb8cdf4" - integrity sha512-cNYidqERTcT+xqZZ5FPSvji7Bd2YYq9M/VJCEUmgTVRFZRPOPSu65crEzQJ4czcDChEJ9ovzZ65r3UBlajnh3w== +"@jest/test-result@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.2.6.tgz#f6082954955313eb96f6cabf9fb14f8017826916" + integrity sha512-gmGgcF4qz/pkBzyfJuVHo2DA24kIgVQ5Pf/VpW4QbyMLSegi8z+9foSZABfIt5se6k0fFj/3p/vrQXdaOgit0w== dependencies: - "@jest/console" "^25.2.3" - "@jest/transform" "^25.2.3" - "@jest/types" "^25.2.3" + "@jest/console" "^25.2.6" + "@jest/types" "^25.2.6" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^25.2.3": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.2.3.tgz#1400e0e994904844567e6e33c87062cbdf1f3e99" - integrity sha512-trHwV/wCrxWyZyNyNBUQExsaHyBVQxJwH3butpEcR+KBJPfaTUxtpXaxfs38IXXAhH68J4kPZgAaRRfkFTLunA== +"@jest/test-sequencer@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.2.6.tgz#62026007610b0323e646ad70db59c69c7ed4785c" + integrity sha512-6sHqVeXbEapfxoGb77NKCywNn9jc4WlIPtFqhwCKGhigGnpl42AuyLxclRWxbFx+V63ozzfjnemYxqHlkcoikQ== dependencies: - "@jest/test-result" "^25.2.3" - jest-haste-map "^25.2.3" - jest-runner "^25.2.3" - jest-runtime "^25.2.3" + "@jest/test-result" "^25.2.6" + jest-haste-map "^25.2.6" + jest-runner "^25.2.6" + jest-runtime "^25.2.6" -"@jest/transform@^25.2.3": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.2.3.tgz#f090bdd91f54b867631a76959f2b2fc566534ffe" - integrity sha512-w1nfAuYP4OAiEDprFkE/2iwU86jL/hK3j1ylMcYOA3my5VOHqX0oeBcBxS2fUKWse2V4izuO2jqes0yNTDMlzw== +"@jest/transform@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.2.6.tgz#007fd946dedf12d2a9eb5d4154faf1991d5f61ff" + integrity sha512-rZnjCjZf9avPOf9q/w9RUZ9Uc29JmB53uIXNJmNz04QbDMD5cR/VjfikiMKajBsXe2vnFl5sJ4RTt+9HPicauQ== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^25.2.3" + "@jest/types" "^25.2.6" 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.2.3" - jest-haste-map "^25.2.3" - jest-regex-util "^25.2.1" - jest-util "^25.2.3" + jest-haste-map "^25.2.6" + jest-regex-util "^25.2.6" + jest-util "^25.2.6" micromatch "^4.0.2" pirates "^4.0.1" realpath-native "^2.0.0" @@ -1144,43 +1143,43 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" -"@jest/types@^25.2.3": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.2.3.tgz#035c4fb94e2da472f359ff9a211915d59987f6b6" - integrity sha512-6oLQwO9mKif3Uph3RX5J1i3S7X7xtDHWBaaaoeKw8hOzV6YUd0qDcYcHZ6QXMHDIzSr7zzrEa51o2Ovlj6AtKQ== +"@jest/types@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.2.6.tgz#c12f44af9bed444438091e4b59e7ed05f8659cb6" + integrity sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^15.0.0" chalk "^3.0.0" -"@microsoft/api-extractor-model@7.7.9": - version "7.7.9" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.7.9.tgz#9a6ded46f63b6729b1c6630f6ef4e20c1396e177" - integrity sha512-WPN99HNlOYz9+pPC+tk7yoa2h1ueEVuYNhcw/5t9rQSHgHbxW6QVM8QPn/caGJ9pHVDzB8+0ySNX+1IZCpidBw== +"@microsoft/api-extractor-model@7.7.10": + version "7.7.10" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.7.10.tgz#52c661825f05a311b9d2dfdecd8d523c0c751b92" + integrity sha512-gMFDXwUgoQYz9TgatyNPALDdZN4xBC3Un3fGwlzME+vM13PoJ26pGuqI7kv/OlK9+q2sgrEdxWns8D3UnLf2TA== dependencies: - "@microsoft/tsdoc" "0.12.14" - "@rushstack/node-core-library" "3.19.5" + "@microsoft/tsdoc" "0.12.19" + "@rushstack/node-core-library" "3.19.6" -"@microsoft/api-extractor@^7.7.10": - version "7.7.10" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.7.10.tgz#cfc8db27ecfe54d07c504fc735e6169ec77aff8e" - integrity sha512-NT31W07KoPwIUrrLnASqHp+/cX6DSUMxYCy/v/qM6GEWRbsyWBUT39kOIM6Fl6DS5VFpOroTgL9oGz8blraYsA== +"@microsoft/api-extractor@^7.7.12": + version "7.7.12" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.7.12.tgz#1afc3fd9bc561d6962f2b7fe471a413bfdbe837c" + integrity sha512-RYMG/dIZs7VXWUgx8Cwk73Czlr9qMUMolxwStFKowy3yMluzHlAKB2srV6csoWlSms6J75tLq6z1c0LXZksWxg== dependencies: - "@microsoft/api-extractor-model" "7.7.9" - "@microsoft/tsdoc" "0.12.14" - "@rushstack/node-core-library" "3.19.5" - "@rushstack/ts-command-line" "4.3.12" + "@microsoft/api-extractor-model" "7.7.10" + "@microsoft/tsdoc" "0.12.19" + "@rushstack/node-core-library" "3.19.6" + "@rushstack/ts-command-line" "4.3.13" colors "~1.2.1" lodash "~4.17.15" resolve "1.8.1" source-map "~0.6.1" typescript "~3.7.2" -"@microsoft/tsdoc@0.12.14": - version "0.12.14" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.12.14.tgz#0e0810a0a174e50e22dfe8edb30599840712f22d" - integrity sha512-518yewjSga1jLdiLrcmpMFlaba5P+50b0TWNFUpC+SL9Yzf0kMi57qw+bMl+rQ08cGqH1vLx4eg9YFUbZXgZ0Q== +"@microsoft/tsdoc@0.12.19": + version "0.12.19" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.12.19.tgz#2173ccb92469aaf62031fa9499d21b16d07f9b57" + integrity sha512-IpgPxHrNxZiMNUSXqR1l/gePKPkfAmIKoDRP9hp7OwjU29ZR8WCJsOJ8iBKgw0Qk+pFwR+8Y1cy8ImLY6e9m4A== "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -1228,10 +1227,10 @@ dependencies: estree-walker "^1.0.1" -"@rushstack/node-core-library@3.19.5": - version "3.19.5" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.19.5.tgz#d6a303bc6feaa9eaf1272dbcb3b12d05894783e2" - integrity sha512-dWnA5n7RZNFhW0XeovTSA+K86dy6Nt+kqwxnW1hBZnreIm6vILAI4noOLF1N3bu5De6GC7QIwmBIu2L4MaxZrw== +"@rushstack/node-core-library@3.19.6": + version "3.19.6" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.19.6.tgz#da67dc9e93fb36b807007892ca6b699fc0c81e6d" + integrity sha512-1+FoymIdr9W9k0D8fdZBBPwi5YcMwh/RyESuL5bY29rLICFxSLOPK+ImVZ1OcWj9GEMsvDx5pNpJ311mHQk+MA== dependencies: "@types/node" "10.17.13" colors "~1.2.1" @@ -1241,10 +1240,10 @@ timsort "~0.3.0" z-schema "~3.18.3" -"@rushstack/ts-command-line@4.3.12": - version "4.3.12" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.3.12.tgz#35f4e96f5f6870d51dac0186da3992e658d97cf0" - integrity sha512-x+AHiWVy0Wx6OSFlzHmXkm2Z23kn4OVMd8/57hZpzeAn1iAIILGFW1L7uWQaAhnt+mZCFqgwRpggQbPQuZOT7w== +"@rushstack/ts-command-line@4.3.13": + version "4.3.13" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.3.13.tgz#f84cdfad2e50663419bcf4064acf6b9dbfc6e674" + integrity sha512-BUBbjYu67NJGQkpHu8aYm7kDoMFizL1qx78+72XE3mX/vDdXYJzw/FWS7TPcMJmY4kNlYs979v2B0Q0qa2wRiw== dependencies: "@types/argparse" "1.0.33" argparse "~1.0.9" @@ -1362,23 +1361,23 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/jest@^25.1.4": - version "25.1.4" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.1.4.tgz#9e9f1e59dda86d3fd56afce71d1ea1b331f6f760" - integrity sha512-QDDY2uNAhCV7TMCITrxz+MRk1EizcsevzfeS6LykIlq2V1E5oO4wXG8V2ZEd9w7Snxeeagk46YbMgZ8ESHx3sw== +"@types/jest@^25.1.5": + version "25.1.5" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.1.5.tgz#3c3c078b3cd19c6403e21277f1cfdc0ce5ebf9a9" + integrity sha512-FBmb9YZHoEOH56Xo/PIYtfuyTL0IzJLM3Hy0Sqc82nn5eqqXgefKcl/eMgChM8eSGVfoDee8cdlj7K74T8a6Yg== dependencies: - jest-diff "^25.1.0" - pretty-format "^25.1.0" + jest-diff "25.1.0" + pretty-format "25.1.0" "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/node@*", "@types/node@^13.9.4": - version "13.9.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.4.tgz#63c58e67999bfbfa688dd49ed84639b01b543606" - integrity sha512-uzaaDXey/NI2l7kU+xCgWu852Dh/zmf6ZKApc0YQEQpY4DaiZFmLN29E6SLHJfSedj3iNWAndSwfSBpEDadJfg== +"@types/node@*", "@types/node@^13.11.0": + version "13.11.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b" + integrity sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ== "@types/node@10.17.13": version "10.17.13" @@ -2386,16 +2385,16 @@ babel-extract-comments@^1.0.0: dependencies: babylon "^6.18.0" -babel-jest@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.2.3.tgz#8f1c088b1954963e8a5384be2e219dae00d053f4" - integrity sha512-03JjvEwuDrEz/A45K8oggAv+Vqay0xcOdNTJxYFxiuZvB5vlHKo1iZg9Pi5vQTHhNCKpGLb7L/jvUUafyh9j7g== +babel-jest@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.2.6.tgz#fe67ff4d0db3626ca8082da8881dd5e84e07ae75" + integrity sha512-MDJOAlwtIeIQiGshyX0d2PxTbV73xZMpNji40ivVTPQOm59OdRR9nYCkffqI7ugtsK4JR98HgNKbDbuVf4k5QQ== dependencies: - "@jest/transform" "^25.2.3" - "@jest/types" "^25.2.3" + "@jest/transform" "^25.2.6" + "@jest/types" "^25.2.6" "@types/babel__core" "^7.1.0" babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^25.2.1" + babel-preset-jest "^25.2.6" chalk "^3.0.0" slash "^3.0.0" @@ -2427,10 +2426,10 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.1.tgz#d0003a1f3d5caa281e1107fe03bbf16b799f9955" - integrity sha512-HysbCQfJhxLlyxDbKcB2ucGYV0LjqK4h6dBoI3RtFuOxTiTWK6XGZMsHb0tGh8iJdV4hC6Z2GCHzVvDeh9i0lQ== +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" @@ -2447,14 +2446,14 @@ babel-plugin-transform-object-rest-spread@^6.26.0: babel-plugin-syntax-object-rest-spread "^6.8.0" babel-runtime "^6.26.0" -babel-preset-jest@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.2.1.tgz#4ccd0e577f69aa11b71806edfe8b25a5c3ac93a2" - integrity sha512-zXHJBM5iR8oEO4cvdF83AQqqJf3tJrXy3x8nfu2Nlqvn4cneg4Ca8M7cQvC5S9BzDDy1O0tZ9iXru9J6E3ym+A== +babel-preset-jest@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.2.6.tgz#5d3f7c99e2a8508d61775c9d68506d143b7f71b5" + integrity sha512-Xh2eEAwaLY9+SyMt/xmGZDnXTW/7pSaBPG0EMo7EuhvosFKVWYB6CqwYD31DaEQuoTL090oDZ0FEqygffGRaSQ== dependencies: "@babel/plugin-syntax-bigint" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^25.2.1" + babel-plugin-jest-hoist "^25.2.6" babel-runtime@^6.26.0: version "6.26.0" @@ -3020,6 +3019,14 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" + integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + check-types@^8.0.3: version "8.0.3" resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" @@ -4073,10 +4080,10 @@ diff-sequences@^25.1.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.1.0.tgz#fd29a46f1c913fd66c22645dc75bffbe43051f32" integrity sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw== -diff-sequences@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.1.tgz#fcfe8aa07dd9b0c648396a478dabca8e76c6ab27" - integrity sha512-foe7dXnGlSh3jR1ovJmdv+77VQj98eKCHHwJPbZ2eEf0fHwKbkZicpPxEch9smZ+n2dnF6QFwkOQdLq9hpeJUg== +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== diffie-hellman@^5.0.0: version "5.0.3" @@ -4593,17 +4600,17 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/expect/-/expect-25.2.3.tgz#ee714f82bf33c43466fcef139ace0a57b3d0aa48" - integrity sha512-kil4jFRFAK2ySyCyXPqYrphc3EiiKKFd9BthrkKAyHcqr1B84xFTuj5kO8zL+eHRRjT2jQsOPExO0+1Q/fuUXg== +expect@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/expect/-/expect-25.2.6.tgz#85f022097e8ed3c5666c1bd7f9076d3a790a8a47" + integrity sha512-hMqqX3OX5Erw7CLoXXcawqi6xThhz/rYk+vEufhoCAyzDC2PW99ypYc/pvcgKjyuwbOB1wjqqClmwvlOL36Inw== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.2.6" ansi-styles "^4.0.0" - jest-get-type "^25.2.1" - jest-matcher-utils "^25.2.3" - jest-message-util "^25.2.3" - jest-regex-util "^25.2.1" + jest-get-type "^25.2.6" + jest-matcher-utils "^25.2.6" + jest-message-util "^25.2.6" + jest-regex-util "^25.2.6" express@^4.16.3, express@^4.17.1: version "4.17.1" @@ -6210,59 +6217,59 @@ javascript-stringify@^2.0.1: resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.0.1.tgz#6ef358035310e35d667c675ed63d3eb7c1aa19e5" integrity sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow== -jest-changed-files@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.2.3.tgz#ad19deef9e47ba37efb432d2c9a67dfd97cc78af" - integrity sha512-EFxy94dvvbqRB36ezIPLKJ4fDIC+jAdNs8i8uTwFpaXd6H3LVc3ova1lNS4ZPWk09OCR2vq5kSdSQgar7zMORg== +jest-changed-files@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.2.6.tgz#7d569cd6b265b1a84db3914db345d9c452f26b71" + integrity sha512-F7l2m5n55jFnJj4ItB9XbAlgO+6umgvz/mdK76BfTd2NGkvGf9x96hUXP/15a1K0k14QtVOoutwpRKl360msvg== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.2.6" execa "^3.2.0" throat "^5.0.0" -jest-cli@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.2.3.tgz#47e17240ce6d8ce824ca1a01468ea8824ec6b139" - integrity sha512-T7G0TOkFj0wr33ki5xoq3bxkKC+liwJfjV9SmYIKBozwh91W4YjL1o1dgVCUTB1+sKJa/DiAY0p+eXYE6v2RGw== +jest-cli@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.2.6.tgz#972356e70663e9b4faa07c507704441786e524e8" + integrity sha512-i31HkagK5veFOUg1ZqxxfP+ZeKDggmI5qZhK6/Cp0ohuaKFQdtS43AqqnXg13JWKCV0E38Nu/K0W4NsFlXLNEA== dependencies: - "@jest/core" "^25.2.3" - "@jest/test-result" "^25.2.3" - "@jest/types" "^25.2.3" + "@jest/core" "^25.2.6" + "@jest/test-result" "^25.2.6" + "@jest/types" "^25.2.6" chalk "^3.0.0" exit "^0.1.2" import-local "^3.0.2" is-ci "^2.0.0" - jest-config "^25.2.3" - jest-util "^25.2.3" - jest-validate "^25.2.3" + jest-config "^25.2.6" + jest-util "^25.2.6" + jest-validate "^25.2.6" prompts "^2.0.1" realpath-native "^2.0.0" yargs "^15.3.1" -jest-config@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.2.3.tgz#c304e91e2ba3763c04b38eafc26d30e5c41b48e8" - integrity sha512-UpTNxN8DgmLLCXFizGuvwIw+ZAPB0T3jbKaFEkzJdGqhSsQrVrk1lxhZNamaVIpWirM2ptYmqwUzvoobGCEkiQ== +jest-config@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.2.6.tgz#fecff70f9fb083db1a25e7a624c3cd3035d01546" + integrity sha512-R82bUaOHU/2nPSXmvrwLZtQRRr5x1V7qEXE0i4Pybv55XDqVl2/yKNBkYPneG3uSL3n5f6EJeP0/9HNxQu/SZg== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^25.2.3" - "@jest/types" "^25.2.3" - babel-jest "^25.2.3" + "@jest/test-sequencer" "^25.2.6" + "@jest/types" "^25.2.6" + babel-jest "^25.2.6" chalk "^3.0.0" deepmerge "^4.2.2" glob "^7.1.1" - jest-environment-jsdom "^25.2.3" - jest-environment-node "^25.2.3" - jest-get-type "^25.2.1" - jest-jasmine2 "^25.2.3" - jest-regex-util "^25.2.1" - jest-resolve "^25.2.3" - jest-util "^25.2.3" - jest-validate "^25.2.3" + jest-environment-jsdom "^25.2.6" + jest-environment-node "^25.2.6" + jest-get-type "^25.2.6" + jest-jasmine2 "^25.2.6" + jest-regex-util "^25.2.6" + jest-resolve "^25.2.6" + jest-util "^25.2.6" + jest-validate "^25.2.6" micromatch "^4.0.2" - pretty-format "^25.2.3" + pretty-format "^25.2.6" realpath-native "^2.0.0" -jest-diff@^25.1.0: +jest-diff@25.1.0: version "25.1.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.1.0.tgz#58b827e63edea1bc80c1de952b80cec9ac50e1ad" integrity sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw== @@ -6272,56 +6279,56 @@ jest-diff@^25.1.0: jest-get-type "^25.1.0" pretty-format "^25.1.0" -jest-diff@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.2.3.tgz#54d601a0a754ef26e808a8c8dbadd278c215aa3f" - integrity sha512-VtZ6LAQtaQpFsmEzps15dQc5ELbJxy4L2DOSo2Ev411TUEtnJPkAMD7JneVypeMJQ1y3hgxN9Ao13n15FAnavg== +jest-diff@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.2.6.tgz#a6d70a9ab74507715ea1092ac513d1ab81c1b5e7" + integrity sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg== dependencies: chalk "^3.0.0" - diff-sequences "^25.2.1" - jest-get-type "^25.2.1" - pretty-format "^25.2.3" + diff-sequences "^25.2.6" + jest-get-type "^25.2.6" + pretty-format "^25.2.6" -jest-docblock@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.2.3.tgz#ac45280c43d59e7139f9fbe5896c6e0320c01ebb" - integrity sha512-d3/tmjLLrH5fpRGmIm3oFa3vOaD/IjPxtXVOrfujpfJ9y1tCDB1x/tvunmdOVAyF03/xeMwburl6ITbiQT1mVA== +jest-docblock@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.2.6.tgz#4b09f1e7b7d6b3f39242ef3647ac7106770f722b" + integrity sha512-VAYrljEq0upq0oERfIaaNf28gC6p9gORndhHstCYF8NWGNQJnzoaU//S475IxfWMk4UjjVmS9rJKLe5Jjjbixw== dependencies: detect-newline "^3.0.0" -jest-each@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.2.3.tgz#64067ba1508ebbd07e9b126c173ab371e8e6309d" - integrity sha512-RTlmCjsBDK2c9T5oO4MqccA3/5Y8BUtiEy7OOQik1iyCgdnNdHbI0pNEpyapZPBG0nlvZ4mIu7aY6zNUvLraAQ== +jest-each@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.2.6.tgz#026f6dea2ccc443c35cea793265620aab1b278b6" + integrity sha512-OgQ01VINaRD6idWJOhCYwUc5EcgHBiFlJuw+ON2VgYr7HLtMFyCcuo+3mmBvuLUH4QudREZN7cDCZviknzsaJQ== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.2.6" chalk "^3.0.0" - jest-get-type "^25.2.1" - jest-util "^25.2.3" - pretty-format "^25.2.3" - -jest-environment-jsdom@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.2.3.tgz#f790f87c24878b219d1745f68343380c2d79ab01" - integrity sha512-TLg7nizxIYJafz6tOBAVSmO5Ekswf6Cf3Soseov+mgonXfdYi1I0OZlHlZMJb2fGyXem2ndYFCLrMkwcWPKAnQ== - dependencies: - "@jest/environment" "^25.2.3" - "@jest/fake-timers" "^25.2.3" - "@jest/types" "^25.2.3" - jest-mock "^25.2.3" - jest-util "^25.2.3" + jest-get-type "^25.2.6" + jest-util "^25.2.6" + pretty-format "^25.2.6" + +jest-environment-jsdom@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.2.6.tgz#b7ae41c6035905b8e58d63a8f63cf8eaa00af279" + integrity sha512-/o7MZIhGmLGIEG5j7r5B5Az0umWLCHU+F5crwfbm0BzC4ybHTJZOQTFQWhohBg+kbTCNOuftMcqHlVkVduJCQQ== + dependencies: + "@jest/environment" "^25.2.6" + "@jest/fake-timers" "^25.2.6" + "@jest/types" "^25.2.6" + jest-mock "^25.2.6" + jest-util "^25.2.6" jsdom "^15.2.1" -jest-environment-node@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.2.3.tgz#e50a7e84bf7c7555216aa41aea1e48f53773318f" - integrity sha512-Tu/wlGXfoLtBR4Ym+isz58z3TJkMYX4VnFTkrsxaTGYAxNLN7ArCwL51Ki0WrMd89v+pbCLDj/hDjrb4a2sOrw== +jest-environment-node@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.2.6.tgz#ad4398432867113f474d94fe37b071ed04b30f3d" + integrity sha512-D1Ihj14fxZiMHGeTtU/LunhzSI+UeBvlr/rcXMTNyRMUMSz2PEhuqGbB78brBY6Dk3FhJDk7Ta+8reVaGjLWhA== dependencies: - "@jest/environment" "^25.2.3" - "@jest/fake-timers" "^25.2.3" - "@jest/types" "^25.2.3" - jest-mock "^25.2.3" - jest-util "^25.2.3" + "@jest/environment" "^25.2.6" + "@jest/fake-timers" "^25.2.6" + "@jest/types" "^25.2.6" + jest-mock "^25.2.6" + jest-util "^25.2.6" semver "^6.3.0" jest-get-type@^24.9.0: @@ -6334,23 +6341,23 @@ jest-get-type@^25.1.0: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.1.0.tgz#1cfe5fc34f148dc3a8a3b7275f6b9ce9e2e8a876" integrity sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw== -jest-get-type@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.1.tgz#6c83de603c41b1627e6964da2f5454e6aa3c13a6" - integrity sha512-EYjTiqcDTCRJDcSNKbLTwn/LcDPEE7ITk8yRMNAOjEsN6yp+Uu+V1gx4djwnuj/DvWg0YGmqaBqPVGsPxlvE7w== +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.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.2.3.tgz#2649392b5af191f0167a27bfb62e5d96d7eaaade" - integrity sha512-pAP22OHtPr4qgZlJJFks2LLgoQUr4XtM1a+F5UaPIZNiCRnePA0hM3L7aiJ0gzwiNIYwMTfKRwG/S1L28J3A3A== +jest-haste-map@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.2.6.tgz#4aa6bcfa15310afccdb9ca77af58a98add8cedb8" + integrity sha512-nom0+fnY8jwzelSDQnrqaKAcDZczYQvMEwcBjeL3PQ4MlcsqeB7dmrsAniUw/9eLkngT5DE6FhnenypilQFsgA== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.2.6" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.3" - jest-serializer "^25.2.1" - jest-util "^25.2.3" - jest-worker "^25.2.1" + jest-serializer "^25.2.6" + jest-util "^25.2.6" + jest-worker "^25.2.6" micromatch "^4.0.2" sane "^4.0.3" walker "^1.0.7" @@ -6358,27 +6365,27 @@ jest-haste-map@^25.2.3: optionalDependencies: fsevents "^2.1.2" -jest-jasmine2@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.2.3.tgz#a824c5dbe383c63d243aab5e64cc85ab65f87598" - integrity sha512-x9PEGPFdnkSwJj1UG4QxG9JxFdyP8fuJ/UfKXd/eSpK8w9x7MP3VaQDuPQF0UQhCT0YeOITEPkQyqS+ptt0suA== +jest-jasmine2@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.2.6.tgz#f0de8e922de421444e34be23a66e8887fee9b2a1" + integrity sha512-0429YtThQjol9EElh0mLMsfMBB++yFCjWuGv3xNK4QPrvralJRlpHbuhfSVaOsHC91RrRBbKfM7jSA+FiVG+Jg== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^25.2.3" - "@jest/source-map" "^25.2.1" - "@jest/test-result" "^25.2.3" - "@jest/types" "^25.2.3" + "@jest/environment" "^25.2.6" + "@jest/source-map" "^25.2.6" + "@jest/test-result" "^25.2.6" + "@jest/types" "^25.2.6" chalk "^3.0.0" co "^4.6.0" - expect "^25.2.3" + expect "^25.2.6" is-generator-fn "^2.0.0" - jest-each "^25.2.3" - jest-matcher-utils "^25.2.3" - jest-message-util "^25.2.3" - jest-runtime "^25.2.3" - jest-snapshot "^25.2.3" - jest-util "^25.2.3" - pretty-format "^25.2.3" + jest-each "^25.2.6" + jest-matcher-utils "^25.2.6" + jest-message-util "^25.2.6" + jest-runtime "^25.2.6" + jest-snapshot "^25.2.6" + jest-util "^25.2.6" + pretty-format "^25.2.6" throat "^5.0.0" jest-junit@^10.0.0: @@ -6392,163 +6399,162 @@ jest-junit@^10.0.0: uuid "^3.3.3" xml "^1.0.1" -jest-leak-detector@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.2.3.tgz#4cf39f137925e0061c04c24ca65cae36465f0238" - integrity sha512-yblCMPE7NJKl7778Cf/73yyFWAas5St0iiEBwq7RDyaz6Xd4WPFnPz2j7yDb/Qce71A1IbDoLADlcwD8zT74Aw== +jest-leak-detector@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.2.6.tgz#68fbaf651142292b03e30641f33e15af9b8c62b1" + integrity sha512-n+aJUM+j/x1kIaPVxzerMqhAUuqTU1PL5kup46rXh+l9SP8H6LqECT/qD1GrnylE1L463/0StSPkH4fUpkuEjA== dependencies: - jest-get-type "^25.2.1" - pretty-format "^25.2.3" + jest-get-type "^25.2.6" + pretty-format "^25.2.6" -jest-matcher-utils@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.2.3.tgz#59285bd6d6c810debc9caa585ed985e46a3f28fd" - integrity sha512-ZmiXiwQRVM9MoKjGMP5YsGGk2Th5ncyRxfXKz5AKsmU8m43kgNZirckVzaP61MlSa9LKmXbevdYqVp1ZKAw2Rw== +jest-matcher-utils@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.2.6.tgz#a5156c1daa16e13ff6c55117f798b285a294a3e6" + integrity sha512-+6IbC98ZBw3X7hsfUvt+7VIYBdI0FEvhSBjWo9XTHOc1KAAHDsrSHdeyHH/Su0r/pf4OEGuWRRLPnjkhS2S19A== dependencies: chalk "^3.0.0" - jest-diff "^25.2.3" - jest-get-type "^25.2.1" - pretty-format "^25.2.3" + jest-diff "^25.2.6" + jest-get-type "^25.2.6" + pretty-format "^25.2.6" -jest-message-util@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.2.3.tgz#a911c4e3af06df851cc6065d9a3119fd2a3aa240" - integrity sha512-DcyDmdO5LVIeS0ngRvd7rk701XL60dAakUeQJ1tQRby27fyLYXD+V0nqVaC194W7fIlohjVQOZPHmKXIjn+Byw== +jest-message-util@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.2.6.tgz#9d5523bebec8cd9cdef75f0f3069d6ec9a2252df" + integrity sha512-Hgg5HbOssSqOuj+xU1mi7m3Ti2nwSQJQf/kxEkrz2r2rp2ZLO1pMeKkz2WiDUWgSR+APstqz0uMFcE5yc0qdcg== dependencies: "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^25.2.3" - "@jest/types" "^25.2.3" + "@jest/types" "^25.2.6" "@types/stack-utils" "^1.0.1" chalk "^3.0.0" micromatch "^4.0.2" slash "^3.0.0" stack-utils "^1.0.1" -jest-mock@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.2.3.tgz#b37a581f59d61bd91db27a99bf7eb8b3e5e993d5" - integrity sha512-xlf+pyY0j47zoCs8zGGOGfWyxxLximE8YFOfEK8s4FruR8DtM/UjNj61um+iDuMAFEBDe1bhCXkqiKoCmWjJzg== +jest-mock@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.2.6.tgz#8df66eaa55a713d0f2a7dfb4f14507289d24dfa3" + integrity sha512-vc4nibavi2RGPdj/MyZy/azuDjZhpYZLvpfgq1fxkhbyTpKVdG7CgmRVKJ7zgLpY5kuMjTzDYA6QnRwhsCU+tA== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.2.6" 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.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.1.tgz#db64b0d15cd3642c93b7b9627801d7c518600584" - integrity sha512-wroFVJw62LdqTdkL508ZLV82FrJJWVJMIuYG7q4Uunl1WAPTf4ftPKrqqfec4SvOIlvRZUdEX2TFpWR356YG/w== +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.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.3.tgz#cd4d9d068d5238dfbdfa45690f6e902b6413c2da" - integrity sha512-mcWlvjXLlNzgdE9EQxHuaeWICNxozanim87EfyvPwTY0ryWusFZbgF6F8u3E0syJ4FFSooEm0lQ6fgYcnPGAFw== +jest-resolve-dependencies@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.6.tgz#c42272ff49e6be83a8ed9366b4c6e563a1e5604c" + integrity sha512-SJeRBCDZzXVy/DjbwBH3KzjxPw5Q/j3foDkWZYu2GIa6SHqy34qVaw1mL7SJg9r6GApwjIoKP6fGwU6c/afg0A== dependencies: - "@jest/types" "^25.2.3" - jest-regex-util "^25.2.1" - jest-snapshot "^25.2.3" + "@jest/types" "^25.2.6" + jest-regex-util "^25.2.6" + jest-snapshot "^25.2.6" -jest-resolve@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.2.3.tgz#ababeaf2bb948cb6d2dea8453759116da0fb7842" - integrity sha512-1vZMsvM/DBH258PnpUNSXIgtzpYz+vCVCj9+fcy4akZl4oKbD+9hZSlfe9RIDpU0Fc28ozHQrmwX3EqFRRIHGg== +jest-resolve@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.2.6.tgz#84694ead5da13c2890ac04d4a78699ba937f3896" + integrity sha512-7O61GVdcAXkLz/vNGKdF+00A80/fKEAA47AEXVNcZwj75vEjPfZbXDaWFmAQCyXj4oo9y9dC9D+CLA11t8ieGw== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.2.6" 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-runner@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.2.3.tgz#88fb448a46cf4ee9194a3e3cf0adbc122e195adb" - integrity sha512-E+u2Zm2TmtTOFEbKs5jllLiV2fwiX77cYc08RdyYZNe/s06wQT3P47aV6a8Rv61L7E2Is7OmozLd0KI/DITRpg== +jest-runner@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.2.6.tgz#5ee1607e66890ccd798695cfaa708e322087c50b" + integrity sha512-sN45p3jxvpsG7UjeQFqyC+JR5+THLrIT9oXAHwQQIDWfpmZBFko2RROn1fvdQNWhuPzDeUf/oHykbhNRGo9eWg== dependencies: - "@jest/console" "^25.2.3" - "@jest/environment" "^25.2.3" - "@jest/test-result" "^25.2.3" - "@jest/types" "^25.2.3" + "@jest/console" "^25.2.6" + "@jest/environment" "^25.2.6" + "@jest/test-result" "^25.2.6" + "@jest/types" "^25.2.6" chalk "^3.0.0" exit "^0.1.2" graceful-fs "^4.2.3" - jest-config "^25.2.3" - jest-docblock "^25.2.3" - jest-haste-map "^25.2.3" - jest-jasmine2 "^25.2.3" - jest-leak-detector "^25.2.3" - jest-message-util "^25.2.3" - jest-resolve "^25.2.3" - jest-runtime "^25.2.3" - jest-util "^25.2.3" - jest-worker "^25.2.1" + jest-config "^25.2.6" + jest-docblock "^25.2.6" + jest-haste-map "^25.2.6" + jest-jasmine2 "^25.2.6" + jest-leak-detector "^25.2.6" + jest-message-util "^25.2.6" + jest-resolve "^25.2.6" + jest-runtime "^25.2.6" + jest-util "^25.2.6" + jest-worker "^25.2.6" source-map-support "^0.5.6" throat "^5.0.0" -jest-runtime@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.2.3.tgz#1f0e9ba878a66538c3e9d58be97a6a12c877ed13" - integrity sha512-PZRFeUVF08N24v2G73SDF0b0VpLG7cRNOJ3ggj5TnArBVHkkrWzM3z7txB9OupWu7OO8bH/jFogk6sSjnHLFXQ== - dependencies: - "@jest/console" "^25.2.3" - "@jest/environment" "^25.2.3" - "@jest/source-map" "^25.2.1" - "@jest/test-result" "^25.2.3" - "@jest/transform" "^25.2.3" - "@jest/types" "^25.2.3" +jest-runtime@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.2.6.tgz#417e8d548c92bd10e659393a3bd5aa8cbdd71e6d" + integrity sha512-u0iNjO7VvI46341igiQP/bnm1TwdXV6IjVEo7DMVqRbTDTz4teTNOUXChuSMdoyjQcfJ3zmI7/jVktUpjnZhYw== + dependencies: + "@jest/console" "^25.2.6" + "@jest/environment" "^25.2.6" + "@jest/source-map" "^25.2.6" + "@jest/test-result" "^25.2.6" + "@jest/transform" "^25.2.6" + "@jest/types" "^25.2.6" "@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.2.3" - jest-config "^25.2.3" - jest-haste-map "^25.2.3" - jest-message-util "^25.2.3" - jest-mock "^25.2.3" - jest-regex-util "^25.2.1" - jest-resolve "^25.2.3" - jest-snapshot "^25.2.3" - jest-util "^25.2.3" - jest-validate "^25.2.3" + jest-config "^25.2.6" + jest-haste-map "^25.2.6" + jest-message-util "^25.2.6" + jest-mock "^25.2.6" + jest-regex-util "^25.2.6" + jest-resolve "^25.2.6" + jest-snapshot "^25.2.6" + jest-util "^25.2.6" + jest-validate "^25.2.6" realpath-native "^2.0.0" slash "^3.0.0" strip-bom "^4.0.0" yargs "^15.3.1" -jest-serializer@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.2.1.tgz#51727a5fc04256f461abe0fa024a022ba165877a" - integrity sha512-fibDi7M5ffx6c/P66IkvR4FKkjG5ldePAK1WlbNoaU4GZmIAkS9Le/frAwRUFEX0KdnisSPWf+b1RC5jU7EYJQ== +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.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.2.3.tgz#2d432fcf9e7f1f7eb3e5012ffcce8035794b76ae" - integrity sha512-HlFVbE6vOZ541mtkwjuAe0rfx9EWhB+QXXneLNOP/s3LlHxGQtX7WFXY5OiH4CkAnCc6BpzLNYS9nfINNRb4Zg== +jest-snapshot@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.2.6.tgz#a3b99fa6fea4955b6a5fcb38c657e4daaba363f9" + integrity sha512-Zw/Ba6op5zInjPHoA2xGUrCw1G/iTHOGMhV02PzlrWhF9uTl2/jjk/bpOMkPaW8EyylmQbjQ2oj4jCfYwpDKng== dependencies: "@babel/types" "^7.0.0" - "@jest/types" "^25.2.3" + "@jest/types" "^25.2.6" "@types/prettier" "^1.19.0" chalk "^3.0.0" - expect "^25.2.3" - jest-diff "^25.2.3" - jest-get-type "^25.2.1" - jest-matcher-utils "^25.2.3" - jest-message-util "^25.2.3" - jest-resolve "^25.2.3" + expect "^25.2.6" + jest-diff "^25.2.6" + jest-get-type "^25.2.6" + jest-matcher-utils "^25.2.6" + jest-message-util "^25.2.6" + jest-resolve "^25.2.6" make-dir "^3.0.0" natural-compare "^1.4.0" - pretty-format "^25.2.3" + pretty-format "^25.2.6" semver "^6.3.0" -jest-util@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.2.3.tgz#0abf95a1d6b96f2de5a3ecd61b36c40a182dc256" - integrity sha512-7tWiMICVSo9lNoObFtqLt9Ezt5exdFlWs5fLe1G4XLY2lEbZc814cw9t4YHScqBkWMfzth8ASHKlYBxiX2rdCw== +jest-util@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.2.6.tgz#3c1c95cdfd653126728b0ed861a86610e30d569c" + integrity sha512-gpXy0H5ymuQ0x2qgl1zzHg7LYHZYUmDEq6F7lhHA8M0eIwDB2WteOcCnQsohl9c/vBKZ3JF2r4EseipCZz3s4Q== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.2.6" chalk "^3.0.0" is-ci "^2.0.0" make-dir "^3.0.0" @@ -6565,28 +6571,28 @@ jest-validate@^24.9.0: leven "^3.1.0" pretty-format "^24.9.0" -jest-validate@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.2.3.tgz#ecb0f093cf8ae71d15075fb48439b6f78f1fcb5a" - integrity sha512-GObn91jzU0B0Bv4cusAwjP6vnWy78hJUM8MOSz7keRfnac/ZhQWIsUjvk01IfeXNTemCwgR57EtdjQMzFZGREg== +jest-validate@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.2.6.tgz#ab3631fb97e242c42b09ca53127abe0b12e9125e" + integrity sha512-a4GN7hYbqQ3Rt9iHsNLFqQz7HDV7KiRPCwPgo5nqtTIWNZw7gnT8KchG+Riwh+UTSn8REjFCodGp50KX/fRNgQ== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.2.6" camelcase "^5.3.1" chalk "^3.0.0" - jest-get-type "^25.2.1" + jest-get-type "^25.2.6" leven "^3.1.0" - pretty-format "^25.2.3" + pretty-format "^25.2.6" -jest-watcher@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.2.3.tgz#a494fe3ddb62da62b0e697abfea457de8f388f1f" - integrity sha512-F6ERbdvJk8nbaRon9lLQVl4kp+vToCCHmy+uWW5QQ8/8/g2jkrZKJQnlQINrYQp0ewg31Bztkhs4nxsZMx6wDg== +jest-watcher@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.2.6.tgz#19fc571d27f89a238ef497b9e037d8d41cf4a204" + integrity sha512-yzv5DBeo03dQnSsSrn1mdOU1LSDd1tZaCTvSE5JYfcv6Z66PdDNhO9MNDdLKA/oQlJNj0S6TiYgLdOY5wL5cMA== dependencies: - "@jest/test-result" "^25.2.3" - "@jest/types" "^25.2.3" + "@jest/test-result" "^25.2.6" + "@jest/types" "^25.2.6" ansi-escapes "^4.2.1" chalk "^3.0.0" - jest-util "^25.2.3" + jest-util "^25.2.6" string-length "^3.1.0" jest-websocket-mock@^2.0.2: @@ -6610,22 +6616,22 @@ jest-worker@^25.1.0: merge-stream "^2.0.0" supports-color "^7.0.0" -jest-worker@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.1.tgz#209617015c768652646aa33a7828cc2ab472a18a" - integrity sha512-IHnpekk8H/hCUbBlfeaPZzU6v75bqwJp3n4dUrQuQOAgOneI4tx3jV2o8pvlXnDfcRsfkFIUD//HWXpCmR+evQ== +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 "^7.0.0" -jest@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-25.2.3.tgz#0cc9b35192f236fe1d5e76ed8eb3a54e7e0ee2e0" - integrity sha512-UbUmyGeZt0/sCIj/zsWOY0qFfQsx2qEFIZp0iEj8yVH6qASfR22fJOf12gFuSPsdSufam+llZBB0MdXWCg6EEQ== +jest@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest/-/jest-25.2.6.tgz#da597f3563dceba12913965ea398fe7f8804fb12" + integrity sha512-AA9U1qmYViBTfoKWzQBbBmck53Tsw8av7zRYdE4EUBU6r04mddPQaflpPBy/KC308HF7u8fLLxEJFt/LiFzYFQ== dependencies: - "@jest/core" "^25.2.3" + "@jest/core" "^25.2.6" import-local "^3.0.2" - jest-cli "^25.2.3" + jest-cli "^25.2.6" jju@~1.4.0: version "1.4.0" @@ -6901,10 +6907,10 @@ linkify-it@^2.0.0: dependencies: uc.micro "^1.0.1" -lint-staged@^10.0.9: - version "10.0.9" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.0.9.tgz#185aabb2432e9467c84add306c990f1c20da3cdb" - integrity sha512-NKJHYgRa8oI9c4Ic42ZtF2XA6Ps7lFbXwg3q0ZEP0r55Tw3YWykCW1RzW6vu+QIGqbsy7DxndvKu93Wtr5vPQw== +lint-staged@^10.1.1: + version "10.1.1" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.1.1.tgz#1c8569b66d684e6e3553cd760c03053f41fca152" + integrity sha512-wAeu/ePaBAOfwM2+cVbgPWDtn17B0Sxiv0NvNEqDAIvB8Yhvl60vafKFiK4grcYn87K1iK+a0zVoETvKbdT9/Q== dependencies: chalk "^3.0.0" commander "^4.0.1" @@ -7610,7 +7616,12 @@ mkdirp@0.3.0: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4= -mkdirp@0.x, mkdirp@^0.5.1, mkdirp@~0.5.1, mkdirp@~0.5.x: +mkdirp@1.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.3.tgz#4cf2e30ad45959dddea53ad97d518b6c8205e1ea" + integrity sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g== + +mkdirp@^0.5.1, mkdirp@~0.5.1, mkdirp@~0.5.x: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -8884,6 +8895,16 @@ pretty-error@^2.0.2: renderkid "^2.0.1" utila "~0.4" +pretty-format@25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.1.0.tgz#ed869bdaec1356fc5ae45de045e2c8ec7b07b0c8" + integrity sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ== + dependencies: + "@jest/types" "^25.1.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + pretty-format@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" @@ -8894,22 +8915,12 @@ pretty-format@^24.9.0: ansi-styles "^3.2.0" react-is "^16.8.4" -pretty-format@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.1.0.tgz#ed869bdaec1356fc5ae45de045e2c8ec7b07b0c8" - integrity sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ== - dependencies: - "@jest/types" "^25.1.0" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^16.12.0" - -pretty-format@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.2.3.tgz#ba6e9603a0d80fa2e470b1fed55de1f9bfd81421" - integrity sha512-IP4+5UOAVGoyqC/DiomOeHBUKN6q00gfyT2qpAsRH64tgOKB2yF7FHJXC18OCiU0/YFierACup/zdCOWw0F/0w== +pretty-format@^25.1.0, pretty-format@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.2.6.tgz#542a1c418d019bbf1cca2e3620443bc1323cb8d7" + integrity sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.2.6" ansi-regex "^5.0.0" ansi-styles "^4.0.0" react-is "^16.12.0" @@ -9547,10 +9558,10 @@ rollup-pluginutils@^2.8.2: dependencies: estree-walker "^0.6.1" -rollup@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.2.0.tgz#d82cfd6eda6d9561593a7e8a2fc0b72811a89b49" - integrity sha512-iAu/j9/WJ0i+zT0sAMuQnsEbmOKzdQ4Yxu5rbPs9aUCyqveI1Kw3H4Fi9NWfCOpb8luEySD2lDyFWL9CrLE8iw== +rollup@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.3.2.tgz#afa68e4f3325bcef4e150d082056bef450bcac60" + integrity sha512-p66+fbfaUUOGE84sHXAOgfeaYQMslgAazoQMp//nlR519R61213EPFgrMZa48j31jNacJwexSAR1Q8V/BwGKBA== optionalDependencies: fsevents "~2.1.2" @@ -9696,21 +9707,21 @@ semver-regex@^2.0.0: resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, 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.x, semver@^6.0.0, semver@^6.1.0, semver@^6.2.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== + semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.0.0, semver@^6.1.0, semver@^6.2.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== - semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -10681,10 +10692,10 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -ts-jest@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-25.2.1.tgz#49bf05da26a8b7fbfbc36b4ae2fcdc2fef35c85d" - integrity sha512-TnntkEEjuXq/Gxpw7xToarmHbAafgCaAzOpnajnFC6jI7oo1trMzAHA04eWpc3MhV6+yvhE8uUBAmN+teRJh0A== +ts-jest@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-25.3.0.tgz#c12d34573cbe34d49f10567940e44fd19d1c9178" + integrity sha512-qH/uhaC+AFDU9JfAueSr0epIFJkGMvUPog4FxSEVAtPOur1Oni5WBJMiQIkfHvc7PviVRsnlVLLY2I6221CQew== dependencies: bs-logger "0.x" buffer-from "1.x" @@ -10692,10 +10703,10 @@ ts-jest@^25.2.1: json5 "2.x" lodash.memoize "4.x" make-error "1.x" - mkdirp "0.x" + mkdirp "1.x" resolve "1.x" - semver "^5.5" - yargs-parser "^16.1.0" + semver "6.x" + yargs-parser "^18.1.1" ts-pnp@^1.1.2: version "1.1.5"