@contract-case/case-entities-internal
Advanced tools
Comparing version 0.15.7 to 0.16.0
/*! | ||
* ContractCase | ||
* ContractCase Entities | ||
* Copyright(c) 2022-2024 Timothy Jones (TLJ) | ||
@@ -4,0 +4,0 @@ * BSD-3-Clause license |
"use strict"; | ||
/*! | ||
* ContractCase | ||
* ContractCase Entities | ||
* Copyright(c) 2022-2024 Timothy Jones (TLJ) | ||
@@ -5,0 +5,0 @@ * BSD-3-Clause license |
@@ -1,2 +0,3 @@ | ||
import { HTTP_STATUS_CODE_MATCHER_TYPE, HTTP_REQUEST_MATCHER_TYPE, HTTP_RESPONSE_MATCHER_TYPE, URL_ENCODED_STRING_TYPE, HTTP_BASIC_AUTH_TYPE } from './http/constants.types'; | ||
import { HTTP_STATUS_CODE_MATCHER_TYPE, HTTP_REQUEST_MATCHER_TYPE, HTTP_RESPONSE_MATCHER_TYPE, URL_ENCODED_STRING_TYPE, HTTP_BASIC_AUTH_TYPE } from '@contract-case/case-core-plugin-http-dsl'; | ||
import { LOOKUP_MATCHER_TYPE } from '@contract-case/case-plugin-base'; | ||
export declare const ARRAY_LENGTH_PARAMETER_INFINITE: "unlimited"; | ||
@@ -7,3 +8,2 @@ export declare const CASCADING_CONTEXT_MATCHER_TYPE: "_case:CascadingContext"; | ||
export declare const OBJECT_KEYS_MATCH_TYPE: "_case:ObjectKeysMatch"; | ||
export declare const LOOKUP_MATCHER_TYPE: "_case:Lookup"; | ||
export declare const CONTEXT_VARIABLE_TYPE: "_case:ContextVariable"; | ||
@@ -10,0 +10,0 @@ export declare const NUMBER_MATCHER_TYPE: "_case:MatchNumber"; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.JSON_STRINGIFIED_TYPE = exports.BASE64_ENCODED_TYPE = exports.STRING_SUFFIX_TYPE = exports.STRING_PREFIX_TYPE = exports.STRING_CONTAINS_TYPE = exports.INTEGER_MATCH_TYPE = exports.COMBINE_MATCHERS_TYPE = exports.ARRAY_CONTAINS_TYPE = exports.ARRAY_EACH_ENTRY_MATCHES_TYPE = exports.ARRAY_LENGTH_MATCHER_TYPE = exports.SHAPED_ARRAY_MATCHER_TYPE = exports.BOOLEAN_MATCHER_TYPE = exports.NULL_MATCHER_TYPE = exports.STRING_MATCHER_TYPE = exports.NUMBER_MATCHER_TYPE = exports.CONTEXT_VARIABLE_TYPE = exports.LOOKUP_MATCHER_TYPE = exports.OBJECT_KEYS_MATCH_TYPE = exports.OBJECT_VALUES_MATCH_TYPE = exports.SHAPED_OBJECT_MATCHER_TYPE = exports.CASCADING_CONTEXT_MATCHER_TYPE = exports.ARRAY_LENGTH_PARAMETER_INFINITE = void 0; | ||
exports.JSON_STRINGIFIED_TYPE = exports.BASE64_ENCODED_TYPE = exports.STRING_SUFFIX_TYPE = exports.STRING_PREFIX_TYPE = exports.STRING_CONTAINS_TYPE = exports.INTEGER_MATCH_TYPE = exports.COMBINE_MATCHERS_TYPE = exports.ARRAY_CONTAINS_TYPE = exports.ARRAY_EACH_ENTRY_MATCHES_TYPE = exports.ARRAY_LENGTH_MATCHER_TYPE = exports.SHAPED_ARRAY_MATCHER_TYPE = exports.BOOLEAN_MATCHER_TYPE = exports.NULL_MATCHER_TYPE = exports.STRING_MATCHER_TYPE = exports.NUMBER_MATCHER_TYPE = exports.CONTEXT_VARIABLE_TYPE = exports.OBJECT_KEYS_MATCH_TYPE = exports.OBJECT_VALUES_MATCH_TYPE = exports.SHAPED_OBJECT_MATCHER_TYPE = exports.CASCADING_CONTEXT_MATCHER_TYPE = exports.ARRAY_LENGTH_PARAMETER_INFINITE = void 0; | ||
/* Parameters */ | ||
@@ -11,3 +11,2 @@ exports.ARRAY_LENGTH_PARAMETER_INFINITE = 'unlimited'; | ||
exports.OBJECT_KEYS_MATCH_TYPE = '_case:ObjectKeysMatch'; | ||
exports.LOOKUP_MATCHER_TYPE = '_case:Lookup'; | ||
exports.CONTEXT_VARIABLE_TYPE = '_case:ContextVariable'; | ||
@@ -14,0 +13,0 @@ exports.NUMBER_MATCHER_TYPE = '_case:MatchNumber'; |
@@ -1,3 +0,4 @@ | ||
import { NUMBER_MATCHER_TYPE, STRING_MATCHER_TYPE, BOOLEAN_MATCHER_TYPE, CASCADING_CONTEXT_MATCHER_TYPE, NULL_MATCHER_TYPE, SHAPED_ARRAY_MATCHER_TYPE, SHAPED_OBJECT_MATCHER_TYPE, ARRAY_LENGTH_MATCHER_TYPE, COMBINE_MATCHERS_TYPE, ARRAY_EACH_ENTRY_MATCHES_TYPE, OBJECT_VALUES_MATCH_TYPE, OBJECT_KEYS_MATCH_TYPE, ARRAY_CONTAINS_TYPE, INTEGER_MATCH_TYPE, STRING_CONTAINS_TYPE, STRING_PREFIX_TYPE, STRING_SUFFIX_TYPE, CONTEXT_VARIABLE_TYPE, BASE64_ENCODED_TYPE, JSON_STRINGIFIED_TYPE, AnyCaseNodeType, LOOKUP_MATCHER_TYPE, ARRAY_LENGTH_PARAMETER_INFINITE } from './constants.types'; | ||
import { HTTP_BASIC_AUTH_TYPE, HTTP_REQUEST_MATCHER_TYPE, HTTP_RESPONSE_MATCHER_TYPE, HTTP_STATUS_CODE_MATCHER_TYPE, URL_ENCODED_STRING_TYPE } from './http/constants.types'; | ||
import { CoreHttpStatusCodeMatcher, CoreUrlEncodedStringMatcher, CoreHttpBasicAuthValueMatcher, CoreHttpRequestMatcher, CoreHttpResponseMatcher } from '@contract-case/case-core-plugin-http-dsl'; | ||
import { AnyCaseMatcherOrData, LookupableMatcher } from '@contract-case/case-plugin-base'; | ||
import { NUMBER_MATCHER_TYPE, STRING_MATCHER_TYPE, BOOLEAN_MATCHER_TYPE, CASCADING_CONTEXT_MATCHER_TYPE, NULL_MATCHER_TYPE, SHAPED_ARRAY_MATCHER_TYPE, SHAPED_OBJECT_MATCHER_TYPE, ARRAY_LENGTH_MATCHER_TYPE, COMBINE_MATCHERS_TYPE, ARRAY_EACH_ENTRY_MATCHES_TYPE, OBJECT_VALUES_MATCH_TYPE, OBJECT_KEYS_MATCH_TYPE, ARRAY_CONTAINS_TYPE, INTEGER_MATCH_TYPE, STRING_CONTAINS_TYPE, STRING_PREFIX_TYPE, STRING_SUFFIX_TYPE, CONTEXT_VARIABLE_TYPE, BASE64_ENCODED_TYPE, JSON_STRINGIFIED_TYPE, AnyCaseNodeType, ARRAY_LENGTH_PARAMETER_INFINITE } from './constants.types'; | ||
export interface MatchContextByType { | ||
@@ -92,3 +93,3 @@ '_case:context:matchBy': 'type'; | ||
'_case:matcher:type': typeof STRING_SUFFIX_TYPE; | ||
'_case:matcher:prefix': string | AnyCaseStringMatcher; | ||
'_case:matcher:prefix': string | AnyCaseMatcher; | ||
'_case:matcher:suffix': string; | ||
@@ -103,3 +104,3 @@ '_case:matcher:resolvesTo': 'string'; | ||
'_case:matcher:type': typeof BASE64_ENCODED_TYPE; | ||
'_case:matcher:child': AnyCaseStringMatcher; | ||
'_case:matcher:child': AnyCaseMatcherOrData; | ||
'_case:matcher:resolvesTo': 'string'; | ||
@@ -112,43 +113,2 @@ } | ||
} | ||
export interface LookupableMatcher { | ||
'_case:matcher:type': typeof LOOKUP_MATCHER_TYPE; | ||
'_case:matcher:uniqueName': string; | ||
'_case:matcher:child'?: AnyCaseMatcherOrData; | ||
} | ||
export interface CoreUrlEncodedStringMatcher { | ||
'_case:matcher:type': typeof URL_ENCODED_STRING_TYPE; | ||
'_case:matcher:child': AnyCaseMatcherOrData; | ||
'_case:matcher:accepts': 'string'; | ||
'_case:matcher:resolvesTo': 'string'; | ||
} | ||
export interface CoreHttpStatusCodeMatcher { | ||
'_case:matcher:type': typeof HTTP_STATUS_CODE_MATCHER_TYPE; | ||
'_case:matcher:rule': string | Array<string>; | ||
'_case:matcher:example': number; | ||
'_case:matcher:resolvesTo': 'HttpStatusCode'; | ||
} | ||
export interface CoreHttpBasicAuthValueMatcher { | ||
'_case:matcher:type': typeof HTTP_BASIC_AUTH_TYPE; | ||
'_case:matcher:username': AnyCaseMatcherOrData; | ||
'_case:matcher:password': AnyCaseMatcherOrData; | ||
'_case:matcher:resolvesTo': 'string'; | ||
} | ||
export interface CoreHttpRequestMatcher { | ||
'_case:matcher:type': typeof HTTP_REQUEST_MATCHER_TYPE; | ||
'_case:matcher:uniqueName'?: string; | ||
uniqueName?: string; | ||
path: AnyCaseStringMatcher | string; | ||
method: AnyCaseStringMatcher | string; | ||
body?: AnyCaseMatcherOrData; | ||
headers?: AnyCaseMatcherOrData | Record<string, AnyCaseMatcherOrData>; | ||
query?: AnyCaseMatcherOrData; | ||
} | ||
export interface CoreHttpResponseMatcher { | ||
'_case:matcher:type': typeof HTTP_RESPONSE_MATCHER_TYPE; | ||
'_case:matcher:uniqueName'?: string; | ||
uniqueName?: string; | ||
status: number | CoreHttpStatusCodeMatcher; | ||
body?: AnyCaseMatcherOrData; | ||
headers?: AnyCaseMatcherOrData | Record<string, AnyCaseMatcherOrData>; | ||
} | ||
export type NumberMatcher = CoreNumberMatcher & MatchContextByType; | ||
@@ -161,19 +121,3 @@ export type StringMatcher = CoreStringMatcher & MatchContextByType; | ||
export type AnyCaseMatcher = AnyLeafMatcher | CoreCascadingMatcher | CoreShapedArrayMatcher | CoreShapedObjectMatcher | LookupableMatcher | CoreArrayLengthMatcher | CoreAndCombinationMatcher | CoreArrayEachEntryMatches | CoreObjectValuesMatch | CoreHttpStatusCodeMatcher | CoreUrlEncodedStringMatcher | CoreHttpBasicAuthValueMatcher | CoreHttpRequestMatcher | CoreHttpResponseMatcher | CoreObjectKeysMatcher | CoreArrayContainsMatcher | CoreStringSuffixMatcher | CoreStringPrefixMatcher | CoreContextVariableMatcher | CoreBase64EncodedMatcher | CoreJsonStringifiedMatcher; | ||
export type ResolvesTo<T extends string> = { | ||
'_case:matcher:resolvesTo': T; | ||
}; | ||
export type AnyCaseMatcherOrData = AnyCaseMatcher | AnyData | AnyLeafOrStructure; | ||
export type AnyCaseStringMatcher = Extract<AnyCaseMatcher, ResolvesTo<'string'>> | (AnyCaseMatcher & ResolvesTo<'string'>); | ||
type JsonSerialisablePrimitive = boolean | number | string | null; | ||
export type AnyLeafOrStructure = JsonSerialisablePrimitive | JsonOrMatcherArray | JsonOrMatcherMap; | ||
export interface JsonOrMatcherMap { | ||
[key: string]: AnyCaseMatcherOrData; | ||
} | ||
export type JsonOrMatcherArray = Array<AnyCaseMatcherOrData>; | ||
interface JsonMap { | ||
[key: string]: AnyData; | ||
} | ||
type JsonArray = Array<AnyData>; | ||
export type AnyData = JsonSerialisablePrimitive | JsonMap | JsonArray; | ||
export {}; | ||
//# sourceMappingURL=definitions.types.d.ts.map |
@@ -1,6 +0,4 @@ | ||
export * from './http'; | ||
export * from './constants.types'; | ||
export * from './definitions.types'; | ||
export * from './guards.types'; | ||
export * from './utility.types'; | ||
//# sourceMappingURL=index.d.ts.map |
@@ -17,7 +17,5 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
__exportStar(require("./http"), exports); | ||
__exportStar(require("./constants.types"), exports); | ||
__exportStar(require("./definitions.types"), exports); | ||
__exportStar(require("./guards.types"), exports); | ||
__exportStar(require("./utility.types"), exports); | ||
//# sourceMappingURL=index.js.map |
@@ -0,6 +1,8 @@ | ||
import { AnyLeafOrStructure } from '@contract-case/case-plugin-base'; | ||
import { AnyCaseNodeType } from './constants.types'; | ||
import { AnyCaseMatcher, AnyLeafOrStructure } from './definitions.types'; | ||
import { AnyCaseMatcher } from './definitions.types'; | ||
export type HasExample<T extends AnyCaseMatcher> = T & { | ||
'_case:matcher:example': unknown; | ||
'_case:matcher:example': AnyCaseMatcherOrData; | ||
}; | ||
export declare const hasExample: <T extends AnyCaseMatcher>(maybeMatcher: unknown) => maybeMatcher is HasExample<T>; | ||
interface IsCaseNodeForType<T extends AnyCaseNodeType> { | ||
@@ -11,3 +13,4 @@ '_case:matcher:type': T; | ||
export type DataOrCaseNodeFor<T extends AnyCaseNodeType> = CaseNodeFor<T> | AnyLeafOrStructure; | ||
export type AnyCaseMatcherOrData = AnyLeafOrStructure | AnyCaseMatcher; | ||
export {}; | ||
//# sourceMappingURL=utility.types.d.ts.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.hasExample = void 0; | ||
const hasExample = (maybeMatcher) => typeof maybeMatcher === 'object' && | ||
maybeMatcher !== null && | ||
'_case:matcher:example' in maybeMatcher; | ||
exports.hasExample = hasExample; | ||
//# sourceMappingURL=utility.types.js.map |
@@ -1,59 +0,8 @@ | ||
import { AnyCaseMatcher } from '../matchers/definitions.types'; | ||
export type AnyMockDescriptorType = typeof MOCK_HTTP_SERVER | typeof MOCK_HTTP_CLIENT; | ||
export declare const MOCK_HTTP_SERVER: "_case:MockHttpServer"; | ||
export declare const MOCK_HTTP_CLIENT: "_case:MockHttpClient"; | ||
export interface InternalContractCaseCoreBehaviour { | ||
type: AnyMockDescriptorType; | ||
stateVariables: 'state' | 'default'; | ||
triggers: 'provided' | 'generated'; | ||
} | ||
export interface InternalContractCaseCoreSetup { | ||
/** | ||
* Defines how the ContractCase core will behave when writing (ie, defining) an Example of this type. | ||
*/ | ||
write: InternalContractCaseCoreBehaviour; | ||
/** | ||
* Defines how the ContractCase core will behave when reading (ie, verifying) a Example of this type. | ||
*/ | ||
read: InternalContractCaseCoreBehaviour; | ||
} | ||
export interface HasTypeForMockDescriptor<T extends AnyMockDescriptorType> { | ||
'_case:mock:type': T; | ||
'_case:run:context:setup': InternalContractCaseCoreSetup; | ||
} | ||
export declare const isCaseMock: (maybeMock: unknown) => maybeMock is AnyMockDescriptor; | ||
export type AnyMockDescriptor = ConsumeHttpResponse | ProduceHttpResponse; | ||
import { MOCK_FUNCTION_CALLER, MOCK_FUNCTION_EXECUTION, MockFunctionCallerDescriptor, MockFunctionExecutionDescriptor } from '@contract-case/case-core-plugin-function-dsl'; | ||
import { MOCK_HTTP_SERVER, MOCK_HTTP_CLIENT, ConsumeHttpResponse, ProduceHttpResponse, AllHttpMockSetupInfo } from '@contract-case/case-core-plugin-http-dsl'; | ||
import { HasTypeForMockDescriptor } from '@contract-case/case-plugin-base'; | ||
export type AnyMockDescriptorType = typeof MOCK_HTTP_SERVER | typeof MOCK_HTTP_CLIENT | typeof MOCK_FUNCTION_CALLER | typeof MOCK_FUNCTION_EXECUTION; | ||
export type AnyMockDescriptor = ConsumeHttpResponse | ProduceHttpResponse | MockFunctionCallerDescriptor | MockFunctionExecutionDescriptor; | ||
export type CaseMockDescriptorFor<T extends AnyMockDescriptorType> = Extract<AnyMockDescriptor, HasTypeForMockDescriptor<T>>; | ||
export interface CoreHttpRequestResponseMatcherPair { | ||
request: AnyCaseMatcher; | ||
response: AnyCaseMatcher; | ||
} | ||
export interface ConsumeHttpResponse extends HasTypeForMockDescriptor<typeof MOCK_HTTP_SERVER>, CoreHttpRequestResponseMatcherPair { | ||
'_case:run:context:setup': { | ||
write: { | ||
type: typeof MOCK_HTTP_SERVER; | ||
stateVariables: 'default'; | ||
triggers: 'provided'; | ||
}; | ||
read: { | ||
type: typeof MOCK_HTTP_CLIENT; | ||
stateVariables: 'state'; | ||
triggers: 'generated'; | ||
}; | ||
}; | ||
} | ||
export interface ProduceHttpResponse extends HasTypeForMockDescriptor<typeof MOCK_HTTP_CLIENT>, CoreHttpRequestResponseMatcherPair { | ||
'_case:run:context:setup': { | ||
write: { | ||
type: typeof MOCK_HTTP_CLIENT; | ||
stateVariables: 'state'; | ||
triggers: 'generated'; | ||
}; | ||
read: { | ||
type: typeof MOCK_HTTP_SERVER; | ||
stateVariables: 'default'; | ||
triggers: 'provided'; | ||
}; | ||
}; | ||
} | ||
export type AllMockSetupInfos = AllHttpMockSetupInfo; | ||
//# sourceMappingURL=mock.types.d.ts.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.isCaseMock = exports.MOCK_HTTP_CLIENT = exports.MOCK_HTTP_SERVER = void 0; | ||
exports.MOCK_HTTP_SERVER = '_case:MockHttpServer'; | ||
exports.MOCK_HTTP_CLIENT = '_case:MockHttpClient'; | ||
const isCaseMock = (maybeMock) => typeof maybeMock === 'object' && | ||
maybeMock != null && | ||
'_case:mock:type' in maybeMock; | ||
exports.isCaseMock = isCaseMock; | ||
//# sourceMappingURL=mock.types.js.map |
@@ -1,16 +0,2 @@ | ||
import { AnyCaseMatcherOrData } from '../matchers'; | ||
export declare const SETUP_NAMED_STATE: "_case:NamedState"; | ||
export declare const SETUP_VARIABLE_STATE: "_case:StateWithVariables"; | ||
export type NameOnlyState = HasTypeForState<typeof SETUP_NAMED_STATE> & { | ||
readonly stateName: string; | ||
}; | ||
export type StateWithVariables = HasTypeForState<typeof SETUP_VARIABLE_STATE> & { | ||
readonly stateName: string; | ||
readonly variables: Record<string, AnyCaseMatcherOrData>; | ||
}; | ||
export type AnyStateType = typeof SETUP_NAMED_STATE | typeof SETUP_VARIABLE_STATE; | ||
export type AnyState = NameOnlyState | StateWithVariables; | ||
export type HasTypeForState<T extends AnyStateType> = { | ||
'_case:state:type': T; | ||
}; | ||
import { AnyCaseMatcherOrData } from '@contract-case/case-plugin-base'; | ||
export type PromiseOrRaw<T> = Promise<T> | T; | ||
@@ -17,0 +3,0 @@ type SetupFunction = () => PromiseOrRaw<Record<string, AnyCaseMatcherOrData> | void>; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.isSetupFunction = exports.SETUP_VARIABLE_STATE = exports.SETUP_NAMED_STATE = void 0; | ||
exports.SETUP_NAMED_STATE = '_case:NamedState'; | ||
exports.SETUP_VARIABLE_STATE = '_case:StateWithVariables'; | ||
exports.isSetupFunction = void 0; | ||
const isSetupFunction = (f) => typeof f === 'function'; | ||
exports.isSetupFunction = isSetupFunction; | ||
//# sourceMappingURL=states.types.js.map |
{ | ||
"name": "@contract-case/case-entities-internal", | ||
"version": "0.15.7", | ||
"version": "0.16.0", | ||
"description": "Shared types for ContractCase modules", | ||
@@ -51,4 +51,4 @@ "keywords": [ | ||
"devDependencies": { | ||
"@contract-case/case-maintainer-config": "0.0.4", | ||
"@contract-case/eslint-config-case-maintainer": "0.1.0", | ||
"@contract-case/case-maintainer-config": "0.1.0", | ||
"@contract-case/eslint-config-case-maintainer": "0.1.1", | ||
"@types/current-git-branch": "^1.1.6", | ||
@@ -58,14 +58,19 @@ "@types/express": "^4.17.14", | ||
"@types/jest": "^29.5.12", | ||
"@types/qs": "^6.9.15", | ||
"@types/slug": "^5.0.7", | ||
"@types/qs": "^6.9.16", | ||
"@types/slug": "^5.0.9", | ||
"body-parser": "^1.20.2", | ||
"eslint": "^8.57.0", | ||
"eslint": "^8.57.1", | ||
"jest": "^29.7.0", | ||
"prettier": "3.2.5", | ||
"rimraf": "^5.0.1", | ||
"ts-jest": "^29.1.2", | ||
"prettier": "3.3.3", | ||
"rimraf": "^6.0.1", | ||
"ts-jest": "^29.1.5", | ||
"ts-node": "^10.9.2", | ||
"typescript": "5.4.2" | ||
"typescript": "5.5.4" | ||
}, | ||
"gitHead": "6e4d0291562476cd6da39007894fcf54a0cfd65e" | ||
"dependencies": { | ||
"@contract-case/case-core-plugin-function-dsl": "0.16.0", | ||
"@contract-case/case-core-plugin-http-dsl": "0.16.0", | ||
"@contract-case/case-plugin-base": "0.16.0" | ||
}, | ||
"gitHead": "9e2ece21628b51ef750bc07f0d44b865324054d4" | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
91779
3
40
315
+ Added@contract-case/case-core-plugin-function-dsl@0.16.0(transitive)
+ Added@contract-case/case-core-plugin-http-dsl@0.16.0(transitive)
+ Added@contract-case/case-plugin-base@0.16.0(transitive)
+ Added@jest/schemas@29.6.3(transitive)
+ Added@sinclair/typebox@0.27.8(transitive)
+ Addedansi-styles@5.2.0(transitive)
+ Addedpretty-format@29.7.0(transitive)
+ Addedreact-is@18.3.1(transitive)