From 92d3a74588724ac40eb643e94e266e6bd4c12651 Mon Sep 17 00:00:00 2001 From: David McAfee Date: Wed, 23 Aug 2023 15:55:05 -0700 Subject: [PATCH] migrate generateClient code to 'next'; build config updates to allow V6 to work with 'next' --- .github/workflows/push-preid-release.yml | 1 + lerna.json | 5 +- packages/amplify-v6-types-package/index.ts | 77 ++++ packages/amplify-v6-types-package/index.v3.ts | 12 + .../amplify-v6-types-package/package.json | 30 ++ .../tsconfig.build.json | 4 + packages/api-graphql/package.json | 33 +- packages/api-graphql/src/internals/index.ts | 2 + packages/api-graphql/src/internals/v6.ts | 106 +++++ packages/api-graphql/src/types/index.ts | 214 ++++++++- packages/api/package.json | 25 +- packages/api/src/API.ts | 238 +++++++++- packages/api/src/internals/InternalAPI.ts | 11 +- yarn.lock | 424 +++++++++--------- 14 files changed, 929 insertions(+), 253 deletions(-) create mode 100644 packages/amplify-v6-types-package/index.ts create mode 100644 packages/amplify-v6-types-package/index.v3.ts create mode 100644 packages/amplify-v6-types-package/package.json create mode 100644 packages/amplify-v6-types-package/tsconfig.build.json create mode 100644 packages/api-graphql/src/internals/v6.ts diff --git a/.github/workflows/push-preid-release.yml b/.github/workflows/push-preid-release.yml index 9837290ed14..8c0c370f53d 100644 --- a/.github/workflows/push-preid-release.yml +++ b/.github/workflows/push-preid-release.yml @@ -10,6 +10,7 @@ on: branches: # Change this to your branch name where "example-preid" corresponds to the preid you want your changes released on - feat/example-preid-branch/main + - next-api-v6 jobs: e2e: diff --git a/lerna.json b/lerna.json index 84fc9ce0ddd..66f2f709123 100644 --- a/lerna.json +++ b/lerna.json @@ -6,7 +6,10 @@ "packages/auth", "packages/analytics", "packages/storage", - "packages/aws-amplify" + "packages/aws-amplify", + "packages/api", + "packages/api-graphql", + "packages/amplify-v6-types-package" ], "exact": true, "version": "independent", diff --git a/packages/amplify-v6-types-package/index.ts b/packages/amplify-v6-types-package/index.ts new file mode 100644 index 00000000000..03b133a94f9 --- /dev/null +++ b/packages/amplify-v6-types-package/index.ts @@ -0,0 +1,77 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +export declare const __modelMeta__: unique symbol; + +export type ExtractModelMeta> = + T[typeof __modelMeta__]; + +type Prettify = T extends object + ? { + [P in keyof T]: Prettify; + } + : T; + +// tslint gets confused by template literal types +// tslint:disable:semicolon +type FlattenKeys< + T extends Record = {}, + Key = keyof T +> = Key extends string + ? T[Key] extends Record + ? `${Key}.${FlattenKeys}` | `${Key}.*` + : `${Key}` + : never; + +type Model = Record; +type Joined< + M extends Model, + Paths extends Array> +> = Paths extends never[] + ? M + : Prettify< + { + [k in Paths[number] | keyof M as k extends `${infer A}.${string}` + ? A + : never]: k extends `${infer A}.${infer B}` + ? B extends `${string}.${string}` + ? Joined ? [B] : never> + : B extends `*` + ? M[A] + : Pick + : never; + } & { + [k in Paths[number] as k extends `${string}.${string}` + ? never + : k]: M[k]; + } + >; + +type ModelIdentifier> = Prettify< + Record +>; + +export type ModelTypes< + T extends Record, + ModelMeta extends Record = ExtractModelMeta +> = { + [K in keyof T]: K extends string + ? T[K] extends Record + ? { + create: (model: T[K]) => Promise; + update: ( + model: Prettify< + { + id: string; + } & Partial + > + ) => Promise; + delete: (identifier: ModelIdentifier) => Promise; + get: (identifier: ModelIdentifier) => Promise; + list[]>(obj?: { + selectionSet?: SS; + }): Promise>>; + } + : never + : never; +}; diff --git a/packages/amplify-v6-types-package/index.v3.ts b/packages/amplify-v6-types-package/index.v3.ts new file mode 100644 index 00000000000..bf518555dd5 --- /dev/null +++ b/packages/amplify-v6-types-package/index.v3.ts @@ -0,0 +1,12 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +export declare const __modelMeta__: unique symbol; + +export type ExtractModelMeta> = + T[typeof __modelMeta__]; + +export type ModelTypes< + T extends Record = never, + ModelMeta extends Record = any +> = any; diff --git a/packages/amplify-v6-types-package/package.json b/packages/amplify-v6-types-package/package.json new file mode 100644 index 00000000000..0e76ad8b0bd --- /dev/null +++ b/packages/amplify-v6-types-package/package.json @@ -0,0 +1,30 @@ +{ + "name": "@aws-amplify/types-package-alpha", + "version": "0.0.0", + "main": "./lib/index.js", + "module": "./lib-esm/index.js", + "types": "./lib-esm/index.d.ts", + "license": "UNLICENSED", + "typesVersions": { + "<5": { + "lib-esm/index.d.ts": [ + "index.v3.ts" + ] + } + }, + "publishConfig": { + "access": "public" + }, + "scripts": { + "lint": "eslint \"**/*.ts*\"", + "build:cjs": "rimraf lib && tsc -p ./tsconfig.build.json -m commonjs --outDir lib", + "build:esm": "rimraf lib-esm && tsc -p ./tsconfig.build.json -m esnext --outDir lib-esm", + "build": "npm run clean && npm run build:esm && npm run build:cjs", + "test": "echo \"No tests\"", + "clean": "npm run clean:size && rimraf lib-esm lib dist", + "clean:size": "rimraf dual-publish-tmp tmp*" + }, + "devDependencies": { + "typescript": "^5.1.6" + } +} diff --git a/packages/amplify-v6-types-package/tsconfig.build.json b/packages/amplify-v6-types-package/tsconfig.build.json new file mode 100644 index 00000000000..5fb01c19d51 --- /dev/null +++ b/packages/amplify-v6-types-package/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": {} +} diff --git a/packages/api-graphql/package.json b/packages/api-graphql/package.json index 93f0831cd60..f877ee496bd 100644 --- a/packages/api-graphql/package.json +++ b/packages/api-graphql/package.json @@ -1,7 +1,6 @@ { "name": "@aws-amplify/api-graphql", - "private": true, - "version": "4.0.0", + "version": "3.4.8", "description": "Api-graphql category of aws-amplify", "main": "./lib/index.js", "module": "./lib-esm/index.js", @@ -41,6 +40,9 @@ "url": "https://github.com/aws/aws-amplify/issues" }, "homepage": "https://aws-amplify.github.io/", + "devDependencies": { + "@types/zen-observable": "^0.8.0" + }, "files": [ "lib", "lib-esm", @@ -48,33 +50,28 @@ "internals" ], "dependencies": { - "@aws-amplify/api-rest": "4.0.0", - "@aws-amplify/auth": "6.0.0", - "@aws-amplify/pubsub": "6.0.0", + "@aws-amplify/api-rest": "3.5.2", + "@aws-amplify/auth": "5.6.2", + "@aws-amplify/cache": "5.1.8", + "@aws-amplify/core": "5.8.2", + "@aws-amplify/pubsub": "5.5.2", "graphql": "15.8.0", - "tslib": "^2.5.0", - "uuid": "^9.0.0", + "tslib": "^1.8.0", + "uuid": "^3.2.1", "zen-observable-ts": "0.8.19" }, - "peerDependencies": { - "@aws-amplify/core": "^6.0.0" - }, - "devDependencies": { - "@aws-amplify/core": "6.0.0", - "@types/zen-observable": "^0.8.0" - }, "size-limit": [ { "name": "API (GraphQL client)", "path": "./lib-esm/index.js", "import": "{ Amplify, GraphQLAPI }", - "limit": "90.35 kB" + "limit": "91.7 kB" } ], "jest": { "globals": { "ts-jest": { - "diagnostics": false, + "diagnostics": true, "tsConfig": { "lib": [ "es5", @@ -91,6 +88,10 @@ "^.+\\.(js|jsx|ts|tsx)$": "ts-jest" }, "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(tsx?|jsx?)$", + "testPathIgnorePatterns": [ + "__tests__/fixtures", + "__tests__/utils" + ], "moduleFileExtensions": [ "ts", "tsx", diff --git a/packages/api-graphql/src/internals/index.ts b/packages/api-graphql/src/internals/index.ts index 357172d36c0..eb382eac470 100644 --- a/packages/api-graphql/src/internals/index.ts +++ b/packages/api-graphql/src/internals/index.ts @@ -4,3 +4,5 @@ export { InternalGraphQLAPI, InternalGraphQLAPIClass, } from './InternalGraphQLAPI'; + +export { graphql } from './v6'; diff --git a/packages/api-graphql/src/internals/v6.ts b/packages/api-graphql/src/internals/v6.ts new file mode 100644 index 00000000000..6267d817195 --- /dev/null +++ b/packages/api-graphql/src/internals/v6.ts @@ -0,0 +1,106 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { GraphQLAPI } from '../GraphQLAPI'; +import { GraphQLOptionsV6, GraphQLResponseV6 } from '../types'; + +/** + * Invokes graphql operations against a graphql service, providing correct input and + * output types if Amplify-generated graphql from a recent version of the CLI/codegen + * are used *or* correct typing is provided via the type argument. + * + * Amplify-generated "branded" graphql queries will look similar to this: + * + * ```ts + * // + * // |-- branding + * // v + * export const getModel = `...` as GeneratedQuery< + * GetModelQueryVariables, + * GetModelQuery + * >; + * ``` + * + * If this branding is not in your generated graphql, update to a newer version of + * CLI/codegen and regenerate your graphql using `amplify codegen`. + * + * ## Using Amplify-generated graphql + * + * ```ts + * import * as queries from './graphql/queries'; + * + * // + * // |-- correctly typed graphql response containing a Widget + * // v + * const queryResult = await graphql({ + * query: queries.getWidget, + * variables: { + * id: "abc", // <-- type hinted/enforced + * }, + * }); + * + * // + * // |-- a correctly typed Widget + * // v + * const fetchedWidget = queryResult.data?.getWidget!; + * ``` + * + * ## Custom input + result types + * + * To provide input types (`variables`) and result types: + * + * ```ts + * type GetById_NameOnly = { + * variables: { + * id: string + * }, + * result: Promise<{ + * data: { getWidget: { name: string } } + * }> + * } + * + * // + * // |-- type is GetById_NameOnly["result"] + * // v + * const result = graphql({ + * query: "...", + * variables: { id: "abc" } // <-- type of GetById_NameOnly["variables"] + * }); + * ``` + * + * ## Custom result type only + * + * To specify result types only, use a type that is *not* in the `{variables, result}` shape: + * + * ```ts + * type MyResultType = Promise<{ + * data: { + * getWidget: { name: string } + * } + * }> + * + * // + * // |-- type is MyResultType + * // v + * const result = graphql({query: "..."}); + * ``` + * + * @param options + * @param additionalHeaders + */ +export function graphql< + FALLBACK_TYPES = unknown, + TYPED_GQL_STRING extends string = string +>( + options: GraphQLOptionsV6, + additionalHeaders?: { [key: string]: string } +): GraphQLResponseV6 { + /** + * The correctness of these typings depends on correct string branding or overrides. + * Neither of these can actually be validated at runtime. Hence, we don't perform + * any validation or type-guarding here. + */ + const result = GraphQLAPI.graphql(options, additionalHeaders); + return result as any; +} + +export { GraphQLOptionsV6, GraphQLResponseV6 }; diff --git a/packages/api-graphql/src/types/index.ts b/packages/api-graphql/src/types/index.ts index 16e30c2b820..9bd98a8f60d 100644 --- a/packages/api-graphql/src/types/index.ts +++ b/packages/api-graphql/src/types/index.ts @@ -1,11 +1,15 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { Source, DocumentNode, GraphQLError, OperationTypeNode } from 'graphql'; +import { Source, DocumentNode, GraphQLError } from 'graphql'; export { OperationTypeNode } from 'graphql'; import { GRAPHQL_AUTH_MODE } from '@aws-amplify/auth'; export { GRAPHQL_AUTH_MODE }; -import { CustomUserAgentDetails } from '@aws-amplify/core'; +import { Observable } from 'zen-observable-ts'; +import { AWSAppSyncRealTimeProvider } from '@aws-amplify/pubsub'; +/** + * Loose/Unknown options for raw GraphQLAPICategory `graphql()`. + */ export interface GraphQLOptions { query: string | DocumentNode; variables?: object; @@ -25,6 +29,59 @@ export interface GraphQLResult { }; } +// Opaque type used for determining the graphql query type +declare const queryType: unique symbol; + +export type GraphQLQuery = T & { readonly [queryType]: 'query' }; +export type GraphQLSubscription = T & { + readonly [queryType]: 'subscription'; +}; + +/** + * The return value from a `graphql({query})` call when `query` is a subscription. + * + * ```ts + * // |-- You are here + * // v + * const subResult: GraphqlSubscriptionResult = client.graphql({ + * query: onCreateWidget + * }); + * + * const sub = subResult.subscribe({ + * // + * // |-- You are here + * // v + * next(message: GraphqlSubscriptionMessage) { + * handle(message.value); // <-- type OnCreateWidgetSubscription + * } + * }) + * ``` + */ +export type GraphqlSubscriptionResult = Observable< + GraphqlSubscriptionMessage +>; + +/** + * The shape of messages passed to `next()` from a graphql subscription. E.g., + * + * ```ts + * const sub = client.graphql({ + * query: onCreateWidget, + * }).subscribe({ + * // + * // |-- You are here + * // v + * next(message: GraphqlSubscriptionMessage) { + * handle(message.value); // <-- type OnCreateWidgetSubscription + * } + * }) + * ``` + */ +export type GraphqlSubscriptionMessage = { + provider: AWSAppSyncRealTimeProvider; + value: { data?: T }; +}; + export enum GraphQLAuthError { NO_API_KEY = 'No api-key configured', NO_CURRENT_USER = 'No current user', @@ -38,3 +95,156 @@ export enum GraphQLAuthError { * @see: https://graphql.org/graphql-js/language/#parse */ export type GraphQLOperation = Source | string; + +/** + * API V6 `graphql({options})` type that can leverage branded graphql `query` + * objects and fallback types. + */ +export interface GraphQLOptionsV6< + FALLBACK_TYPES = unknown, + TYPED_GQL_STRING extends string = string +> { + query: TYPED_GQL_STRING | DocumentNode; + variables?: GraphQLVariablesV6; + authMode?: keyof typeof GRAPHQL_AUTH_MODE; + authToken?: string; + /** + * @deprecated This property should not be used + */ + userAgentSuffix?: string; // TODO: remove in v6 +} + +/** + * Result type for `graphql()` operations that don't include any specific + * type information. The result could be either a `Promise` or `Subscription`. + * + * Invoking code should either cast the result or use `?` and `!` operators to + * navigate the result objects. + */ +export type UnknownGraphQLResponse = + | Promise> + | GraphqlSubscriptionResult; + +/** + * The expected type for `variables` in a V6 `graphql()` operation with + * respect to the given `FALLBACK_TYPES` and `TYPED_GQL_STRING`. + */ +export type GraphQLVariablesV6< + FALLBACK_TYPES = unknown, + TYPED_GQL_STRING extends string = string +> = TYPED_GQL_STRING extends GeneratedQuery + ? IN + : TYPED_GQL_STRING extends GeneratedMutation + ? IN + : TYPED_GQL_STRING extends GeneratedSubscription + ? IN + : FALLBACK_TYPES extends GraphQLOperationType + ? IN + : any; + +/** + * The expected return type with respect to the given `FALLBACK_TYPE` + * and `TYPED_GQL_STRING`. + */ +export type GraphQLResponseV6< + FALLBACK_TYPE = unknown, + TYPED_GQL_STRING extends string = string +> = TYPED_GQL_STRING extends GeneratedQuery + ? Promise> + : TYPED_GQL_STRING extends GeneratedMutation + ? Promise> + : TYPED_GQL_STRING extends GeneratedSubscription + ? GraphqlSubscriptionResult + : FALLBACK_TYPE extends GraphQLQuery + ? Promise> + : FALLBACK_TYPE extends GraphQLSubscription + ? GraphqlSubscriptionResult + : FALLBACK_TYPE extends GraphQLOperationType + ? CUSTOM_OUT + : UnknownGraphQLResponse; + +/** + * The shape customers can use to provide `T` to `graphql()` to specify both + * `IN` and `OUT` types (the type of `variables` and the return type, respectively). + * + * I.E., + * + * ```ts + * type MyVariablesType = { ... }; + * type MyResultType = { ... }; + * type MyOperationType = { variables: MyVariablesType, result: MyResultType }; + * + * const result: MyResultType = graphql("graphql string", { + * variables: { + * // MyVariablesType + * } + * }) + * ``` + */ +export type GraphQLOperationType = { + variables: IN; + result: OUT; +}; + +/** + * Nominal type for branding generated graphql query operation strings with + * input and output types. + * + * E.g., + * + * ```ts + * export const getWidget = `...` as GeneratedQuery< + * GetWidgetQueryVariables, + * GetWidgetQuery + * >; + * ``` + * + * This allows `graphql()` to extract `InputType` and `OutputType` to correctly + * assign types to the `variables` and result objects. + */ +export type GeneratedQuery = string & { + __generatedQueryInput: InputType; + __generatedQueryOutput: OutputType; +}; + +/** + * Nominal type for branding generated graphql mutation operation strings with + * input and output types. + * + * E.g., + * + * ```ts + * export const createWidget = `...` as GeneratedQuery< + * CreateWidgetMutationVariables, + * CreateWidgetMutation + * >; + * ``` + * + * This allows `graphql()` to extract `InputType` and `OutputType` to correctly + * assign types to the `variables` and result objects. + */ +export type GeneratedMutation = string & { + __generatedMutationInput: InputType; + __generatedMutationOutput: OutputType; +}; + +/** + * Nominal type for branding generated graphql mutation operation strings with + * input and output types. + * + * E.g., + * + * ```ts + * export const createWidget = `...` as GeneratedMutation< + * CreateWidgetMutationVariables, + * CreateWidgetMutation + * >; + * ``` + * + * This allows `graphql()` to extract `InputType` and `OutputType` to correctly + * assign types to the `variables` and result objects. + */ +export type GeneratedSubscription = string & { + __generatedSubscriptionInput: InputType; + __generatedSubscriptionOutput: OutputType; +}; diff --git a/packages/api/package.json b/packages/api/package.json index ba233c8d0d2..6f142a83716 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,7 +1,6 @@ { "name": "@aws-amplify/api", - "private": true, - "version": "6.0.0", + "version": "5.4.2", "description": "Api category of aws-amplify", "main": "./lib/index.js", "module": "./lib-esm/index.js", @@ -36,7 +35,7 @@ "clean:size": "rimraf dual-publish-tmp tmp*", "format": "echo \"Not implemented\"", "lint": "tslint 'src/**/*.ts' && npm run ts-coverage", - "ts-coverage": "typescript-coverage-report -p ./tsconfig.build.json -t 91.93" + "ts-coverage": "typescript-coverage-report -p ./tsconfig.build.json -t 88" }, "repository": { "type": "git", @@ -48,6 +47,10 @@ "url": "https://github.com/aws/aws-amplify/issues" }, "homepage": "https://aws-amplify.github.io/", + "devDependencies": { + "@types/zen-observable": "^0.8.0", + "typescript": "5.1.6" + }, "files": [ "lib", "lib-esm", @@ -56,23 +59,17 @@ "internals" ], "dependencies": { - "@aws-amplify/api-graphql": "4.0.0", - "@aws-amplify/api-rest": "4.0.0", - "tslib": "^2.5.0" - }, - "peerDependencies": { - "@aws-amplify/core": "^6.0.0" - }, - "devDependencies": { - "@aws-amplify/core": "6.0.0", - "@types/zen-observable": "^0.8.0" + "@aws-amplify/api-graphql": "3.4.8", + "@aws-amplify/api-rest": "3.5.2", + "@aws-amplify/types-package-alpha": "0.0.0", + "tslib": "^2.6.1" }, "size-limit": [ { "name": "API (top-level class)", "path": "./lib-esm/index.js", "import": "{ Amplify, API }", - "limit": "91.12 kB" + "limit": "93.82 kB" } ], "jest": { diff --git a/packages/api/src/API.ts b/packages/api/src/API.ts index e2200841dfe..7463f8fd350 100644 --- a/packages/api/src/API.ts +++ b/packages/api/src/API.ts @@ -1,15 +1,21 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { AWSAppSyncRealTimeProvider } from '@aws-amplify/pubsub'; -import { GraphQLOptions, GraphQLResult } from '@aws-amplify/api-graphql'; +import { + GraphQLOptions, + GraphQLResult, + GraphQLQuery, + GraphQLSubscription, +} from '@aws-amplify/api-graphql'; +import { graphql as v6graphql } from '@aws-amplify/api-graphql/internals'; import { Amplify, ConsoleLogger as Logger } from '@aws-amplify/core'; import Observable from 'zen-observable-ts'; -import { GraphQLQuery, GraphQLSubscription } from './types'; import { InternalAPIClass } from './internals/InternalAPI'; +import type { ModelTypes } from '@aws-amplify/types-package-alpha'; const logger = new Logger('API'); /** - * @deprecated + * @deprecatedeiifccuhchvdfvcgl * Use RestApi or GraphQLAPI to reduce your application bundle size * Export Cloud Logic APIs */ @@ -42,7 +48,233 @@ export class APIClass extends InternalAPIClass { ): Promise> | Observable { return super.graphql(options, additionalHeaders); } + + /** + * Generates an API client that can work with models or raw GraphQL + */ + generateClient = never>(): V6Client { + const config = super.configure({}); + + const { modelIntrospection } = config; + + const client: V6Client = { + graphql: v6graphql, + models: {}, + }; + + for (const model of Object.values(modelIntrospection.models)) { + const { name } = model as any; + + client.models[name] = {} as any; + + Object.entries(graphQLOperationsInfo).forEach( + ([key, { operationPrefix }]) => { + const operation = key as ModelOperation; + + // e.g. clients.models.Todo.update + client.models[name][operationPrefix] = async (arg?: any) => { + const query = generateGraphQLDocument(model, operation); + const variables = buildGraphQLVariables(model, operation, arg); + + const res = (await this.graphql({ + query, + variables, + })) as any; + + // flatten response + if (res.data !== undefined) { + const [key] = Object.keys(res.data); + + if (res.data[key].items) { + return res.data[key].items; + } + + return res.data[key]; + } + + return res; + }; + } + ); + } + + return client as V6Client; + } +} + +const graphQLOperationsInfo = { + CREATE: { operationPrefix: 'create' as const, usePlural: false }, + READ: { operationPrefix: 'get' as const, usePlural: false }, + UPDATE: { operationPrefix: 'update' as const, usePlural: false }, + DELETE: { operationPrefix: 'delete' as const, usePlural: false }, + LIST: { operationPrefix: 'list' as const, usePlural: true }, +}; +type ModelOperation = keyof typeof graphQLOperationsInfo; +type OperationPrefix = + (typeof graphQLOperationsInfo)[ModelOperation]['operationPrefix']; + +const graphQLDocumentsCache = new Map>(); + +function generateGraphQLDocument( + modelDefinition: any, + modelOperation: ModelOperation +): string { + const { + name, + pluralName, + fields, + primaryKeyInfo: { + isCustomPrimaryKey, + primaryKeyFieldName, + sortKeyFieldNames, + }, + } = modelDefinition; + const { operationPrefix, usePlural } = graphQLOperationsInfo[modelOperation]; + + const fromCache = graphQLDocumentsCache.get(name)?.get(modelOperation); + + if (fromCache !== undefined) { + return fromCache; + } + + if (!graphQLDocumentsCache.has(name)) { + graphQLDocumentsCache.set(name, new Map()); + } + + const graphQLFieldName = `${operationPrefix}${usePlural ? pluralName : name}`; + let graphQLOperationType: 'mutation' | 'query' | undefined; + let graphQLSelectionSet: string | undefined; + let graphQLArguments: Record | undefined; + + const selectionSetFields = Object.values(fields) + .map(({ type, name }) => typeof type === 'string' && name) // Only scalars for now + .filter(Boolean) + .join(' '); + + switch (modelOperation) { + case 'CREATE': + case 'UPDATE': + case 'DELETE': + graphQLArguments ?? + (graphQLArguments = { + input: `${ + operationPrefix.charAt(0).toLocaleUpperCase() + + operationPrefix.slice(1) + }${name}Input!`, + }); + graphQLOperationType ?? (graphQLOperationType = 'mutation'); + case 'READ': + graphQLArguments ?? + (graphQLArguments = isCustomPrimaryKey + ? [primaryKeyFieldName, ...sortKeyFieldNames].reduce( + (acc, fieldName) => { + acc[fieldName] = fields[fieldName].type; + + return acc; + }, + {} + ) + : { + [primaryKeyFieldName]: `${fields[primaryKeyFieldName].type}!`, + }); + graphQLSelectionSet ?? (graphQLSelectionSet = selectionSetFields); + case 'LIST': + graphQLOperationType ?? (graphQLOperationType = 'query'); + graphQLSelectionSet ?? + (graphQLSelectionSet = `items { ${selectionSetFields} }`); + } + + const graphQLDocument = `${graphQLOperationType}${ + graphQLArguments + ? `(${Object.entries(graphQLArguments).map( + ([fieldName, type]) => `\$${fieldName}: ${type}` + )})` + : '' + } { ${graphQLFieldName}${ + graphQLArguments + ? `(${Object.keys(graphQLArguments).map( + fieldName => `${fieldName}: \$${fieldName}` + )})` + : '' + } { ${graphQLSelectionSet} } }`; + + graphQLDocumentsCache.get(name)?.set(modelOperation, graphQLDocument); + + return graphQLDocument; } +function buildGraphQLVariables( + modelDefinition: any, + operation: ModelOperation, + arg: any +): object { + const { + fields, + primaryKeyInfo: { + isCustomPrimaryKey, + primaryKeyFieldName, + sortKeyFieldNames, + }, + } = modelDefinition; + + let variables = {}; + + switch (operation) { + case 'CREATE': + variables = { input: arg }; + break; + case 'UPDATE': + // readonly fields are not updated + variables = { + input: Object.fromEntries( + Object.entries(arg).filter(([fieldName]) => { + const { isReadOnly } = fields[fieldName]; + + return !isReadOnly; + }) + ), + }; + break; + case 'READ': + case 'DELETE': + // only identifiers are sent + variables = isCustomPrimaryKey + ? [primaryKeyFieldName, ...sortKeyFieldNames].reduce( + (acc, fieldName) => { + acc[fieldName] = arg[fieldName]; + + return acc; + }, + {} + ) + : { [primaryKeyFieldName]: arg[primaryKeyFieldName] }; + + if (operation === 'DELETE') { + variables = { input: variables }; + } + break; + case 'LIST': + break; + default: + const exhaustiveCheck: never = operation; + throw new Error(`Unhandled operation case: ${exhaustiveCheck}`); + } + + return variables; +} + +type FilteredKeys = { + [P in keyof T]: T[P] extends never ? never : P; +}[keyof T]; +type ExcludeNeverFields = { + [K in FilteredKeys]: O[K]; +}; + +// If no T is passed, ExcludeNeverFields removes "models" from the client +declare type V6Client = never> = ExcludeNeverFields<{ + graphql: typeof v6graphql; + models: ModelTypes; +}>; + export const API = new APIClass(null); Amplify.register(API); diff --git a/packages/api/src/internals/InternalAPI.ts b/packages/api/src/internals/InternalAPI.ts index 085c6042429..6b28736466f 100644 --- a/packages/api/src/internals/InternalAPI.ts +++ b/packages/api/src/internals/InternalAPI.ts @@ -5,14 +5,16 @@ import { GraphQLOptions, GraphQLResult, OperationTypeNode, + GraphQLQuery, + GraphQLSubscription, } from '@aws-amplify/api-graphql'; import { InternalGraphQLAPIClass } from '@aws-amplify/api-graphql/internals'; import { RestAPIClass } from '@aws-amplify/api-rest'; -import { Auth } from '@aws-amplify/auth'; +import { InternalAuth } from '@aws-amplify/auth/internals'; +import { Cache } from '@aws-amplify/cache'; import { Amplify, ApiAction, - Cache, Category, Credentials, CustomUserAgentDetails, @@ -20,7 +22,6 @@ import { } from '@aws-amplify/core'; import { AWSAppSyncRealTimeProvider } from '@aws-amplify/pubsub'; import Observable from 'zen-observable-ts'; -import { GraphQLQuery, GraphQLSubscription } from '../types'; const logger = new Logger('API'); /** @@ -37,7 +38,7 @@ export class InternalAPIClass { private _restApi: RestAPIClass; private _graphqlApi: InternalGraphQLAPIClass; - Auth = Auth; + InternalAuth = InternalAuth; Cache = Cache; Credentials = Credentials; @@ -67,7 +68,7 @@ export class InternalAPIClass { // Share Amplify instance with client for SSR this._restApi.Credentials = this.Credentials; - this._graphqlApi.Auth = this.Auth; + this._graphqlApi.InternalAuth = this.InternalAuth; this._graphqlApi.Cache = this.Cache; this._graphqlApi.Credentials = this.Credentials; diff --git a/yarn.lock b/yarn.lock index 9acb95291b7..ee9ab54cf52 100644 --- a/yarn.lock +++ b/yarn.lock @@ -573,11 +573,11 @@ integrity sha512-4Dx3eRTrUHLxhFdLJL8zdNGzVsJfAxtxPYYGmIddUkO2Gj3WA1TGjdfG4XN/ClI6e1XonCHafQX3UYO/mgnH3g== "@aws-sdk/types@^3.1.0", "@aws-sdk/types@^3.110.0": - version "3.391.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.391.0.tgz#d49b0130943f0c60fd9bc99b2a47ec9720e2dd07" - integrity sha512-QpYVFKMOnzHz/JMj/b8wb18qxiT92U/5r5MmtRz2R3LOH6ooTO96k4ozXCrYr0qNed1PAnOj73rPrrH2wnCJKQ== + version "3.398.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.398.0.tgz#8ce02559536670f9188cddfce32e9dd12b4fe965" + integrity sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ== dependencies: - "@smithy/types" "^2.2.0" + "@smithy/types" "^2.2.2" tslib "^2.5.0" "@aws-sdk/url-parser@3.54.0": @@ -755,14 +755,14 @@ chokidar "^3.4.0" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.10.tgz#1c20e612b768fefa75f6e90d6ecb86329247f0a3" - integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: - "@babel/highlight" "^7.22.10" + "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== @@ -789,24 +789,24 @@ semver "^6.3.0" "@babel/core@^7.1.0", "@babel/core@^7.13.16", "@babel/core@^7.14.0": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.10.tgz#aad442c7bcd1582252cb4576747ace35bc122f35" - integrity sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.11.tgz#8033acaa2aa24c3f814edaaa057f3ce0ba559c24" + integrity sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.10" "@babel/generator" "^7.22.10" "@babel/helper-compilation-targets" "^7.22.10" "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.10" - "@babel/parser" "^7.22.10" + "@babel/helpers" "^7.22.11" + "@babel/parser" "^7.22.11" "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.10" - "@babel/types" "^7.22.10" + "@babel/traverse" "^7.22.11" + "@babel/types" "^7.22.11" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.2" + json5 "^2.2.3" semver "^6.3.1" "@babel/generator@^7.14.0", "@babel/generator@^7.17.0", "@babel/generator@^7.22.10", "@babel/generator@^7.4.0": @@ -844,10 +844,10 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.10", "@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz#dd2612d59eac45588021ac3d6fa976d08f4e95a3" - integrity sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz#4078686740459eeb4af3494a273ac09148dfb213" + integrity sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" @@ -999,28 +999,28 @@ "@babel/template" "^7.22.5" "@babel/types" "^7.22.10" -"@babel/helpers@^7.17.2", "@babel/helpers@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.10.tgz#ae6005c539dfbcb5cd71fb51bfc8a52ba63bc37a" - integrity sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw== +"@babel/helpers@^7.17.2", "@babel/helpers@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" + integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== dependencies: "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.10" - "@babel/types" "^7.22.10" + "@babel/traverse" "^7.22.11" + "@babel/types" "^7.22.11" -"@babel/highlight@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.10.tgz#02a3f6d8c1cb4521b2fd0ab0da8f4739936137d7" - integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== +"@babel/highlight@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" + integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== dependencies: "@babel/helper-validator-identifier" "^7.22.5" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.17.0", "@babel/parser@^7.20.7", "@babel/parser@^7.22.10", "@babel/parser@^7.22.5", "@babel/parser@^7.4.3": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.10.tgz#e37634f9a12a1716136c44624ef54283cabd3f55" - integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.17.0", "@babel/parser@^7.20.7", "@babel/parser@^7.22.11", "@babel/parser@^7.22.5", "@babel/parser@^7.4.3": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.13.tgz#23fb17892b2be7afef94f573031c2f4b42839a2b" + integrity sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": version "7.22.5" @@ -1258,9 +1258,9 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-async-generator-functions@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz#45946cd17f915b10e65c29b8ed18a0a50fc648c8" - integrity sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz#dbe3b1ff5a52e2e5edc4b19a60d325a675ed2649" + integrity sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" @@ -1299,11 +1299,11 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-class-static-block@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz#3e40c46f048403472d6f4183116d5e46b1bff5ba" - integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" @@ -1353,9 +1353,9 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-dynamic-import@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz#d6908a8916a810468c4edff73b5b75bda6ad393e" - integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" @@ -1369,9 +1369,9 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-export-namespace-from@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz#57c41cb1d0613d22f548fddd8b288eedb9973a5b" - integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" @@ -1401,9 +1401,9 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-json-strings@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz#14b64352fdf7e1f737eed68de1a1468bd2a77ec0" - integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-json-strings" "^7.8.3" @@ -1416,9 +1416,9 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-logical-assignment-operators@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz#66ae5f068fd5a9a5dc570df16f56c2a8462a9d6c" - integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -1438,22 +1438,22 @@ "@babel/helper-module-transforms" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" - integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.22.11", "@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz#d7991d3abad199c03b68ee66a64f216c47ffdfae" + integrity sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g== dependencies: - "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.9" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" "@babel/plugin-transform-modules-systemjs@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" - integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" + integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== dependencies: "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.9" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.5" @@ -1481,17 +1481,17 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz#f8872c65776e0b552e0849d7596cddd416c3e381" - integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-transform-numeric-separator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz#57226a2ed9e512b9b446517ab6fa2d17abb83f58" - integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" @@ -1504,12 +1504,12 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-object-rest-spread@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" - integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz#dbbb06ce783cd994a8f430d8cefa553e9b42ca62" + integrity sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw== dependencies: - "@babel/compat-data" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.10" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.22.5" @@ -1523,17 +1523,17 @@ "@babel/helper-replace-supers" "^7.22.5" "@babel/plugin-transform-optional-catch-binding@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz#842080be3076703be0eaf32ead6ac8174edee333" - integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-transform-optional-chaining@^7.22.10", "@babel/plugin-transform-optional-chaining@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz#076d28a7e074392e840d4ae587d83445bac0372a" - integrity sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g== + version "7.22.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz#d7ebf6a88cd2f4d307b0e000ab630acd8124b333" + integrity sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" @@ -1555,12 +1555,12 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-private-property-in-object@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz#07a77f28cbb251546a43d175a1dda4cf3ef83e32" - integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" @@ -1681,13 +1681,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typescript@^7.22.5", "@babel/plugin-transform-typescript@^7.5.0": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.10.tgz#aadd98fab871f0bb5717bcc24c31aaaa455af923" - integrity sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A== +"@babel/plugin-transform-typescript@^7.22.11", "@babel/plugin-transform-typescript@^7.5.0": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.11.tgz#9f27fb5e51585729374bb767ab6a6d9005a23329" + integrity sha512-0E4/L+7gfvHub7wsbTv03oRtD69X31LByy44fGmFzbZScpupFByMcgCJ0VbBTkzyjSJKuRoGN8tcijOWKTmqOA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.10" + "@babel/helper-create-class-features-plugin" "^7.22.11" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-typescript" "^7.22.5" @@ -1839,15 +1839,15 @@ "@babel/plugin-transform-react-pure-annotations" "^7.22.5" "@babel/preset-typescript@^7.13.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz#16367d8b01d640e9a507577ed4ee54e0101e51c8" - integrity sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.11.tgz#f218cd0345524ac888aa3dc32f029de5b064b575" + integrity sha512-tWY5wyCZYBGY7IlalfKI1rLiGlIfnwsRHZqlky0HVv8qviwQ1Uo/05M6+s+TcTCVa6Bmoo2uJW5TMFX6Wa4qVg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-option" "^7.22.5" "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.5" - "@babel/plugin-transform-typescript" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.11" + "@babel/plugin-transform-typescript" "^7.22.11" "@babel/register@^7.13.16": version "7.22.5" @@ -1866,9 +1866,9 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.1.2", "@babel/runtime@^7.8.4": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" - integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4" + integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== dependencies: regenerator-runtime "^0.14.0" @@ -1881,10 +1881,10 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.17.0", "@babel/traverse@^7.22.10", "@babel/traverse@^7.4.3": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.10.tgz#20252acb240e746d27c2e82b4484f199cf8141aa" - integrity sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.17.0", "@babel/traverse@^7.22.11", "@babel/traverse@^7.4.3": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" + integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== dependencies: "@babel/code-frame" "^7.22.10" "@babel/generator" "^7.22.10" @@ -1892,15 +1892,15 @@ "@babel/helper-function-name" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.10" - "@babel/types" "^7.22.10" + "@babel/parser" "^7.22.11" + "@babel/types" "^7.22.11" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.17.0", "@babel/types@^7.20.7", "@babel/types@^7.22.10", "@babel/types@^7.22.5", "@babel/types@^7.4.0", "@babel/types@^7.4.4": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03" - integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== +"@babel/types@^7.0.0", "@babel/types@^7.17.0", "@babel/types@^7.20.7", "@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.4.0", "@babel/types@^7.4.4": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" + integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== dependencies: "@babel/helper-string-parser" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.5" @@ -2525,9 +2525,9 @@ which "^3.0.0" "@nrwl/devkit@>=15.5.2 < 16": - version "15.9.5" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-15.9.5.tgz#fe662ae1e629aa6e5fb9042349078f0581369701" - integrity sha512-/hw72+d7+Rtuzu0V0RCOlimz6ZYAZYuQNDbEA6u2igDWtQeoAz1f7gx9+kg+LbbS0AXmgInO4v2TdpgAc4XAGQ== + version "15.9.6" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-15.9.6.tgz#3eee51bb3b2a357b8cbb747be4cb505dc5fa5548" + integrity sha512-+gPyrvcUmZMzyVadFSkgfQJItJV8xhydsPMNL1g+KBYu9EzsLG6bqlioJvsOFT8v3zcFrzvoF84imEDs/Cym9Q== dependencies: ejs "^3.1.7" ignore "^5.0.4" @@ -2740,9 +2740,9 @@ integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== "@react-native-async-storage/async-storage@^1.17.12": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.19.2.tgz#44f0af5927a04436b3f67aae67f028b888ff452c" - integrity sha512-7jTQKbT3BdhFHQMnfElsLeeyVqNICv72lPKbeNHnNgLP9eH3+Yk1GFMWWb7A8qRMYianSmwmx1cYofNe9H9hLQ== + version "1.19.3" + resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.19.3.tgz#ad5fe3ed0a82d4624aa4500321c1e09c02daeb46" + integrity sha512-CwGfoHCWdPOTPS+2fW6YRE1fFBpT9++ahLEroX5hkgwyoQ+TkmjOaUxixdEIoVua9Pz5EF2pGOIJzqOTMWfBlA== dependencies: merge-options "^3.0.4" @@ -3028,7 +3028,7 @@ nanoid "^3.3.6" webpack "^5.88.0" -"@smithy/types@^2.1.0", "@smithy/types@^2.2.0": +"@smithy/types@^2.1.0", "@smithy/types@^2.2.2": version "2.2.2" resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.2.2.tgz#bd8691eb92dd07ac33b83e0e1c45f283502b1bf7" integrity sha512-4PS0y1VxDnELGHGgBWlDksB2LJK8TG8lcvlWxIsgR+8vROI7Ms8h1P4FQUx+ftAX2QZv5g1CJCdhdRmQKyonyw== @@ -3068,10 +3068,10 @@ jora "^1.0.0-beta.7" semver "^7.3.7" -"@statoscope/report-writer@5.25.1": - version "5.25.1" - resolved "https://registry.yarnpkg.com/@statoscope/report-writer/-/report-writer-5.25.1.tgz#f013dd89cc259b2044db035fb0645f90197022b9" - integrity sha512-5rt2Zu9hfoZ0/zsrE1KaqdQCqLb2Fz6uRXzfaX7h5kgqoHlI24MxduTHJ3gHndBtACtvofT5r1F0G9zEXeWUyw== +"@statoscope/report-writer@5.27.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@statoscope/report-writer/-/report-writer-5.27.0.tgz#528b980b9ba761925e520f93f59f485053bc10e2" + integrity sha512-h4Xyy2JFmaDUXBwevC6w5BI86OU0ZMYNyhty5AguWHRUAifOhEfemLHdvz/RJQ9gVjnqZ135omAtHaq6JMersw== dependencies: "@discoveryjs/json-ext" "^0.5.7" "@types/pako" "^2.0.0" @@ -3085,101 +3085,101 @@ "@statoscope/helpers" "5.25.0" gzip-size "^6.0.0" -"@statoscope/stats-extension-custom-reports@5.25.0": - version "5.25.0" - resolved "https://registry.yarnpkg.com/@statoscope/stats-extension-custom-reports/-/stats-extension-custom-reports-5.25.0.tgz#78828cc06c7bab602eaa718fa1f71aca4d80a92c" - integrity sha512-7hjYbP+SJQyjpS3JmOr+dk2+r8g9ZixFbHYGfDVkXdfqjaYLPGRdWpKc44uZB9t1epg10YSI3Hi1w7PRZ7esBg== +"@statoscope/stats-extension-custom-reports@5.27.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@statoscope/stats-extension-custom-reports/-/stats-extension-custom-reports-5.27.0.tgz#09663221e0cb1708dea8923b2c954cc01f0ec339" + integrity sha512-X8NscKMfWWCwBNC1enq1s+TAIvcwHwTt5i6sy21xZgrwkK8QQ/lCIqGVwKoCQ9dD9Ip3YRqmXndzqoHiOYfZww== dependencies: "@statoscope/extensions" "5.14.1" "@statoscope/helpers" "5.25.0" "@statoscope/stats" "5.14.1" - "@statoscope/types" "5.22.0" + "@statoscope/types" "5.27.0" -"@statoscope/stats-extension-package-info@5.25.0": - version "5.25.0" - resolved "https://registry.yarnpkg.com/@statoscope/stats-extension-package-info/-/stats-extension-package-info-5.25.0.tgz#4e9e14819ecaf5ac06dbe101ec8c3f5cf2e2bd13" - integrity sha512-7pozFUq5pb9uAzyPXDW/fEIl/Ty0i/z4dhKbKS/c+/UDFIWBDo5WqUJY7Wa5u6XDc09ojICCpoysK86sdQxKFQ== +"@statoscope/stats-extension-package-info@5.27.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@statoscope/stats-extension-package-info/-/stats-extension-package-info-5.27.0.tgz#84787285bab5edb7baf167adf8d52ec876a9b054" + integrity sha512-73u1yo/nAef8nh1bwAZVWSf2ubcNHgqcNeIz2hp9mZC7YGb/eh6mV1eai6T4NgmCYGLy7KxpA67KaE+4sWX4Ew== dependencies: "@statoscope/helpers" "5.25.0" -"@statoscope/stats-extension-stats-validation-result@5.25.0": - version "5.25.0" - resolved "https://registry.yarnpkg.com/@statoscope/stats-extension-stats-validation-result/-/stats-extension-stats-validation-result-5.25.0.tgz#8731d76ddb7801cbc8d3f20e2acb47b42df6a91b" - integrity sha512-EBIXFINb3pD39oW89QDGuFR4ujxY9Ubik0HpxD+wh3Zw7ma4ZuTvByfT6I2P4v47lwLHG4J5cDT01eR93N0mYQ== +"@statoscope/stats-extension-stats-validation-result@5.27.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@statoscope/stats-extension-stats-validation-result/-/stats-extension-stats-validation-result-5.27.0.tgz#02a7b99d36a517df1399ee556013fcc2d29e62c6" + integrity sha512-frkPBCGhZdGXf+uE5Yr/N4YQOljbChV6KcTW1x/YUtl98j7cdQMZA3jiS65nqjUsYUwjlzuLYqw67AHXI3hnyg== dependencies: "@statoscope/extensions" "5.14.1" "@statoscope/helpers" "5.25.0" "@statoscope/stats" "5.14.1" - "@statoscope/types" "5.22.0" + "@statoscope/types" "5.27.0" "@statoscope/stats@5.14.1": version "5.14.1" resolved "https://registry.yarnpkg.com/@statoscope/stats/-/stats-5.14.1.tgz#728656629bc06aa4bf5634398662ac05287793d5" integrity sha512-Kz7kCKuT6DXaqAPfyTwp27xHMDUna9o6UlRSQXXBZ8Yyk7eYYvTNw+5ffRyqivL9IOzD7FQYDQ6VUBHh0UfyDw== -"@statoscope/types@5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@statoscope/types/-/types-5.22.0.tgz#2b5ccf134504294b9e365374e83625c20851df2b" - integrity sha512-FHgunU7M95v7c71pvQ2nr8bWy1QcTDOHSnkoFQErORH9RmxlK9oRkoWrO8BJpnxa55m/9ZHjFVmpLF4SsVGHoA== +"@statoscope/types@5.27.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@statoscope/types/-/types-5.27.0.tgz#b58b0c1e9a0a0c831bd2a6ee2b564d175ebb856f" + integrity sha512-3BWUmpoRRHU/b6NiHqnFjDeKBAjrUiFVsZPPZONFeOtHlfRI1CoVeVkmPocCQHuk7JyTWuiEaOT5OBycOYlExg== dependencies: "@statoscope/stats" "5.14.1" -"@statoscope/webpack-model@5.26.2": - version "5.26.2" - resolved "https://registry.yarnpkg.com/@statoscope/webpack-model/-/webpack-model-5.26.2.tgz#7236c83c425831764557a07ff93d565822b7aff4" - integrity sha512-b68Wjcf+6+9XBsHWKmHu5U7t+MEd+uo7BhHqI5Fp5IyWFl8GGwZb2KMfl0SLAqKI86P9q8i/u9dmtvDpwC+LRg== +"@statoscope/webpack-model@5.27.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@statoscope/webpack-model/-/webpack-model-5.27.0.tgz#9606c4d2942b73ffc8c8bfc358192ce1541e963f" + integrity sha512-tnQ4y7k7PM6oTUFt3tbqEDVWiI8JCAGjngoRgZUIGzR1ja9dQgVO6SR3r2uL5+FcPzsAcuxyoygpHl7DAH4Meg== dependencies: "@statoscope/extensions" "5.14.1" "@statoscope/helpers" "5.25.0" "@statoscope/stats" "5.14.1" "@statoscope/stats-extension-compressed" "5.25.0" - "@statoscope/stats-extension-custom-reports" "5.25.0" - "@statoscope/stats-extension-package-info" "5.25.0" - "@statoscope/stats-extension-stats-validation-result" "5.25.0" - "@statoscope/types" "5.22.0" + "@statoscope/stats-extension-custom-reports" "5.27.0" + "@statoscope/stats-extension-package-info" "5.27.0" + "@statoscope/stats-extension-stats-validation-result" "5.27.0" + "@statoscope/types" "5.27.0" md5 "^2.3.0" "@statoscope/webpack-plugin@^5.26.2": - version "5.26.2" - resolved "https://registry.yarnpkg.com/@statoscope/webpack-plugin/-/webpack-plugin-5.26.2.tgz#e288f8a2efb8087587b322525673cab5c6ae6d27" - integrity sha512-QqB4znt1TKfI3tPHmGmF3xiru+qwIaNze8SlsN2oJFyEiaZnEB1+iIf6eaAlxIQUqTuLePWv2VQTiS3Dd1Xjtw== + version "5.27.0" + resolved "https://registry.yarnpkg.com/@statoscope/webpack-plugin/-/webpack-plugin-5.27.0.tgz#0de0a1e257297e78b4927c59e62aaa11ddd62833" + integrity sha512-swEi0jgosJlI0ixa3JIMuBunkq43ycJnQd3aT+t7bl5QlGYdpvU4FsTeKcvNrin1V1Vq2D4Zvf+vCagg+1tIlg== dependencies: "@discoveryjs/json-ext" "^0.5.7" - "@statoscope/report-writer" "5.25.1" + "@statoscope/report-writer" "5.27.0" "@statoscope/stats" "5.14.1" "@statoscope/stats-extension-compressed" "5.25.0" - "@statoscope/stats-extension-custom-reports" "5.25.0" - "@statoscope/types" "5.22.0" - "@statoscope/webpack-model" "5.26.2" - "@statoscope/webpack-stats-extension-compressed" "5.26.2" - "@statoscope/webpack-stats-extension-package-info" "5.26.2" - "@statoscope/webpack-ui" "5.26.2" + "@statoscope/stats-extension-custom-reports" "5.27.0" + "@statoscope/types" "5.27.0" + "@statoscope/webpack-model" "5.27.0" + "@statoscope/webpack-stats-extension-compressed" "5.27.0" + "@statoscope/webpack-stats-extension-package-info" "5.27.0" + "@statoscope/webpack-ui" "5.27.0" open "^8.4.0" -"@statoscope/webpack-stats-extension-compressed@5.26.2": - version "5.26.2" - resolved "https://registry.yarnpkg.com/@statoscope/webpack-stats-extension-compressed/-/webpack-stats-extension-compressed-5.26.2.tgz#cf25136990923a8c713a0716e2e098775df44265" - integrity sha512-gDkWs3r/gKS9lOzM0Pz77fRHQdI2ot84wM1WwHUXYQCmKvxMazA2828i35XWsKS2DHsThCQ2qyBe9QrpNqR4GA== +"@statoscope/webpack-stats-extension-compressed@5.27.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@statoscope/webpack-stats-extension-compressed/-/webpack-stats-extension-compressed-5.27.0.tgz#3362344a56158edf62e90a6d8788ec455ec6b8b2" + integrity sha512-FXxvN9cYcig4bpb69lP7960CRiuDcwnaGgrIAZ7cYPu8vpCfUDadV2OMuL/EDfB4AWrqO5ytd6ZL+V79KCzyaA== dependencies: "@statoscope/stats" "5.14.1" "@statoscope/stats-extension-compressed" "5.25.0" - "@statoscope/webpack-model" "5.26.2" + "@statoscope/webpack-model" "5.27.0" -"@statoscope/webpack-stats-extension-package-info@5.26.2": - version "5.26.2" - resolved "https://registry.yarnpkg.com/@statoscope/webpack-stats-extension-package-info/-/webpack-stats-extension-package-info-5.26.2.tgz#2a09b77f870aac424e4f0dc30e39920b6e913bc2" - integrity sha512-mrv0Wz+f5Kx9YN4w7IalCwckCRSk5HTTgiaj+M95V1BF1DAptTqwyB+h1DFyGRwxD6Upb/wxyiYJ+wLxey0yMw== +"@statoscope/webpack-stats-extension-package-info@5.27.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@statoscope/webpack-stats-extension-package-info/-/webpack-stats-extension-package-info-5.27.0.tgz#753217b62937acf7f9e7e8ce7a1f2c8754a85533" + integrity sha512-4sx6HqBEypO3PrW1lvsw2MsI7vujIkm96TFQg/uAIUVVgRKdunKfLxXL7q4ZRC9s0nGNQApyCQgr9TxN21ENoQ== dependencies: "@statoscope/stats" "5.14.1" - "@statoscope/stats-extension-package-info" "5.25.0" - "@statoscope/webpack-model" "5.26.2" + "@statoscope/stats-extension-package-info" "5.27.0" + "@statoscope/webpack-model" "5.27.0" -"@statoscope/webpack-ui@5.26.2": - version "5.26.2" - resolved "https://registry.yarnpkg.com/@statoscope/webpack-ui/-/webpack-ui-5.26.2.tgz#7d306a2ad7898b1ab40ca911d80f82c4b3ef2138" - integrity sha512-01RYHyG2nrif9Y5i717EI6jUMqdypbrOMdqpNUBFlw2rmaEB5t21V35b5Vd0pZEgesKNijE3ULvP7EQ37jEbIg== +"@statoscope/webpack-ui@5.27.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@statoscope/webpack-ui/-/webpack-ui-5.27.0.tgz#82be4871697cb1847cb1d408e28917305182dfce" + integrity sha512-FIG84pD1RdBfgwEpNCUun+mK+pzRTyzLu7WqTsZRPisowyr1h0bPxXFpzwcDRhrGnIXBZO+kVX/hH3VOlvNkJw== dependencies: - "@statoscope/types" "5.22.0" + "@statoscope/types" "5.27.0" "@tootallnate/once@1": version "1.1.2" @@ -3361,9 +3361,9 @@ form-data "^3.0.0" "@types/node@*": - version "20.5.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.3.tgz#fa52c147f405d56b2f1dd8780d840aa87ddff629" - integrity sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA== + version "20.5.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" + integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== "@types/node@^8.9.5": version "8.10.66" @@ -3401,9 +3401,9 @@ "@types/node" "*" "@types/semver@^7.3.10": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + version "7.5.1" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" + integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== "@types/sinon@^7.5.1": version "7.5.2" @@ -4074,9 +4074,9 @@ aws4@^1.8.0: integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== axios@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" - integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.0.tgz#f02e4af823e2e46a9768cfc74691fdd0517ea267" + integrity sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" @@ -4559,9 +4559,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001517: - version "1.0.30001522" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz#44b87a406c901269adcdb834713e23582dd71856" - integrity sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg== + version "1.0.30001524" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz#1e14bce4f43c41a7deaeb5ebfe86664fe8dadb80" + integrity sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA== capture-exit@^2.0.0: version "2.0.0" @@ -5523,9 +5523,9 @@ ejs@^3.1.7: jake "^10.8.5" electron-to-chromium@^1.4.477: - version "1.4.499" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.499.tgz#dc36b67f4c8e273524e8d2080c5203a6a76987b6" - integrity sha512-0NmjlYBLKVHva4GABWAaHuPJolnDuL0AhV3h1hES6rcLCWEIbRL6/8TghfsVwkx6TEroQVdliX7+aLysUpKvjw== + version "1.4.504" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.504.tgz#975522945676cf2d55910988a169f07b83081488" + integrity sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ== emoji-regex@^7.0.1: version "7.0.3" @@ -5628,7 +5628,7 @@ errorhandler@^1.5.0: accepts "~1.3.7" escape-html "~1.0.3" -es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: +es-abstract@^1.20.4, es-abstract@^1.21.2, es-abstract@^1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== @@ -6191,9 +6191,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flow-parser@0.*: - version "0.215.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.215.0.tgz#9b153fa27ab238bcc0bb1ff73b63bdb15d3f277d" - integrity sha512-8bjwzy8vi+fNDy8YoTBNtQUSZa53i7UWJJTunJojOtjab9cMNhOCwohionuMgDQUU0y21QTTtPOX6OQEOQT72A== + version "0.215.1" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.215.1.tgz#a14007f404db46ac829bb6db3a22a7956d9e298f" + integrity sha512-qq3rdRToqwesrddyXf+Ml8Tuf7TdoJS+EMbJgC6fHAVoBCXjb4mHelNd3J+jD8ts0bSHX81FG3LN7Qn/dcl6pA== flow-parser@^0.121.0: version "0.121.0" @@ -6370,16 +6370,16 @@ function-bind@^1.1.1: integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" -functions-have-names@^1.2.2, functions-have-names@^1.2.3: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -8155,9 +8155,9 @@ jetifier@^1.6.2: integrity sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw== joi@^17.2.1: - version "17.9.2" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" - integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== + version "17.10.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.10.0.tgz#04e249daa24d48fada2d34046a8262e474b1326f" + integrity sha512-hrazgRSlhzacZ69LdcKfhi3Vu13z2yFfoAzmEov3yFIJlatTdVGUW6vle1zjH8qkzdCn/qGw8rapjqsObbYXAg== dependencies: "@hapi/hoek" "^9.0.0" "@hapi/topo" "^5.0.0" @@ -8314,7 +8314,7 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@2.x, json5@^2.1.2, json5@^2.2.2: +json5@2.x, json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -9558,16 +9558,16 @@ node-fetch@2.6.7: whatwg-url "^5.0.0" node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.13" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.13.tgz#a20acbbec73c2e09f9007de5cda17104122e0010" - integrity sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA== + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" node-gyp-build@^4.3.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" - integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" + integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== node-gyp@^9.0.0: version "9.4.0" @@ -12734,9 +12734,9 @@ type-check@~0.3.2: prelude-ls "~1.1.2" type-coverage-core@^2.17.2: - version "2.26.0" - resolved "https://registry.yarnpkg.com/type-coverage-core/-/type-coverage-core-2.26.0.tgz#65674366f3804962a89ea2136cc742d7fd26d439" - integrity sha512-/9VQ0ySU1CKbWd/BNnbVYMJ67oOt7qdXXxm4W5VIM07AUB5eelcDjrWG7qdIj0ZafnNkpv+v5qcD68ExOVK+Sw== + version "2.26.1" + resolved "https://registry.yarnpkg.com/type-coverage-core/-/type-coverage-core-2.26.1.tgz#a5a1adf78c628a5cb76e9a79ac8f48636a354864" + integrity sha512-KoGejLimF+LPr/JKdgo6fmaHIn5FJ74xCzUt3lSbcoPVDLDbqBGQQ3rizkQJmSV0R6/35iIbE16ln0atkwNE+g== dependencies: fast-glob "3" minimatch "6 || 7 || 8 || 9" @@ -13318,9 +13318,9 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: iconv-lite "0.4.24" whatwg-fetch@^3.0.0: - version "3.6.17" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz#009bbbfc122b227b74ba1ff31536b3a1a0e0e212" - integrity sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ== + version "3.6.18" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.18.tgz#2f640cdee315abced7daeaed2309abd1e44e62d4" + integrity sha512-ltN7j66EneWn5TFDO4L9inYC1D+Czsxlrw2SalgjMmEMkLfA5SIZxEFdE6QtHFiiM6Q7WL32c7AkI3w6yxM84Q== whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: version "2.3.0"