From 26952e5d0df4c9baa46f7eff0606c8c1f5cd706c Mon Sep 17 00:00:00 2001 From: Duncan McPherson Date: Mon, 1 Jan 2024 20:23:33 -0700 Subject: [PATCH 1/6] added methods and documentation for autoMocker (base) --- .npmrc | 1 + package-lock.json | 42 ++- package.json | 13 +- src/@types/index.ts | 7 + src/autoMocker.ts | 799 +++++++++++++++++++++++++++++++++++++++++++ src/index.ts | 0 src/setup-package.ts | 1 + tsconfig.json | 2 +- 8 files changed, 856 insertions(+), 9 deletions(-) create mode 100644 src/@types/index.ts create mode 100644 src/autoMocker.ts create mode 100644 src/index.ts diff --git a/.npmrc b/.npmrc index e69de29..bd3327a 100644 --- a/.npmrc +++ b/.npmrc @@ -0,0 +1 @@ +//registry.npmjs.org/:_authToken=${NPM_TOKEN} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8c49f4b..a492aa8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,22 @@ { "name": "@ez-budgets/karma-test-utils", - "version": "0.0.0", + "version": "0.0.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ez-budgets/karma-test-utils", - "version": "0.0.0", + "version": "0.0.5", "license": "MIT", "dependencies": { - "jasmine": "^5.1.0" + "jasmine": "^5.1.0", + "lodash-es": "^4.17.21", + "rxjs": "^7.8.1" }, "devDependencies": { "@types/ejs": "^3.1.5", "@types/jasmine": "^5.1.4", + "@types/lodash-es": "^4.17.12", "ejs": "^3.1.9", "husky": "^8.0.0", "istanbul": "^0.4.5", @@ -121,6 +124,21 @@ "integrity": "sha512-px7OMFO/ncXxixDe1zR13V1iycqWae0MxTaw62RpFlksUi5QuNWgQJFkTQjIOvrmutJbI7Fp2Y2N1F6D2R4G6w==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "dev": true + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "dev": true, + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/node": { "version": "20.10.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", @@ -779,6 +797,11 @@ "node": ">= 0.8.0" } }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "node_modules/lru-cache": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", @@ -925,6 +948,14 @@ "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", "dev": true }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1117,6 +1148,11 @@ } } }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", diff --git a/package.json b/package.json index 9e30669..140f592 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ez-budgets/karma-test-utils", - "version": "0.0.5", + "version": "0.0.6", "description": "", "main": "dist/index.js", "files": [ @@ -25,17 +25,20 @@ }, "homepage": "https://github.com/duncanmcpherson/karma-test-utils#readme", "devDependencies": { - "@types/jasmine": "^5.1.4", "@types/ejs": "^3.1.5", + "@types/jasmine": "^5.1.4", + "@types/lodash-es": "^4.17.12", "ejs": "^3.1.9", + "husky": "^8.0.0", "istanbul": "^0.4.5", "jasmine-reporters": "^2.5.2", "jasmine-spec-reporter": "^7.0.0", "ts-node": "^10.9.2", - "typescript": "^5.3.3", - "husky": "^8.0.0" + "typescript": "^5.3.3" }, "dependencies": { - "jasmine": "^5.1.0" + "jasmine": "^5.1.0", + "lodash-es": "^4.17.21", + "rxjs": "^7.8.1" } } \ No newline at end of file diff --git a/src/@types/index.ts b/src/@types/index.ts new file mode 100644 index 0000000..20248de --- /dev/null +++ b/src/@types/index.ts @@ -0,0 +1,7 @@ +import { Observable } from "rxjs" +export type Accessor = "get" | "set"; +export type Constructor = new(...args: any[]) => T; + +export type ObservablePropertyNames = { + [K in keyof T]: T[K] extends Observable ? K : never; +}[keyof T]; \ No newline at end of file diff --git a/src/autoMocker.ts b/src/autoMocker.ts new file mode 100644 index 0000000..36337de --- /dev/null +++ b/src/autoMocker.ts @@ -0,0 +1,799 @@ +// noinspection JSValidateJSDoc + +import isEmpty from "lodash-es/isEmpty"; +import uniq from "lodash-es/uniq"; +import { Accessor, Constructor } from "./@types"; + +/** + * Represents the data structure for member data of a given type. + * @interface + * @template T - The type of the member data. + */ +interface IMemberData { + /** + * An array containing the names of methods in the given object type. + * + * @type {readonly (keyof T)[]} + */ + readonly methodNames: readonly (keyof T)[]; + /** + * Represents an array of defined property data. Property data is limited to getters and setters. + * @name definedPropertiesData + * @type {ReadonlyArray>} + * @readonly + * @memberof YourNamespace + */ + readonly definedPropertiesData: readonly IDefinedPropertyData[]; +} + +/** + * Represents defined property data. + * @interface + * @template T - The type of the target object. + */ +interface IDefinedPropertyData { + /** + * Represents the name of a property in an object. + * + * @readonly + * @type {keyof T} + */ + readonly propertyName: keyof T; + /** + * Flag indicating whether the variable has a setter method or not. + * @type {boolean} + * @readonly + */ + readonly hasSet: boolean; + /** + * Flag indicating whether the variable has a getter method or not. + * + * @type {boolean} + * @readonly + */ + readonly hasGet: boolean; +} + +/** + * Interface representing options for mocking a class. + */ +export interface IMockClassOptions { + /** + * Additional methods to be mocked as part of the mocked class. + * Examples would be private or protected methods that aren't normally available. + * + * Default value: ``` [] ``` + */ + readonly additionalMethodsToMock: readonly (keyof T)[]; + /** + * Getters and Setters that you would like to have an undefined implementation of. + * + * Default value: ``` [] ``` + */ + readonly ignoredProperties: readonly (keyof T)[] + /** + * Ignore all Getters and Setters + * + * Default value: ``` false ``` + */ + readonly ignoreAllProperties: boolean; +} + +const mockClassOptionsDefaults: IMockClassOptions = { + additionalMethodsToMock: [], + ignoredProperties: [], + ignoreAllProperties: false +} + + +export class AutoMocker { + + constructor(private readonly maxDepth: number = 1) {} + + /** + * Creates a mock object of a given class with the specified options. + * + * @param {Constructor} ctor - The class constructor to mock. + * @param {Partial>} [options] - The options for mocking the class. + * @return {T} - The mock object. + */ + public mockClass( + ctor: Constructor, + options?: Partial> + ): T { + const appliedOptions = { + ...mockClassOptionsDefaults as IMockClassOptions, + ...options + }; + + const memberData = this.getMemberData(ctor); + const allMethodsToMock: readonly (keyof T)[] = uniq([ + ...memberData.methodNames, + ...appliedOptions.additionalMethodsToMock + ]); + + const mock = isEmpty(allMethodsToMock) + ? ({} as T) + : jasmine.createSpyObj( + ctor.prototype.constructor.name, + allMethodsToMock as jasmine.SpyObjMethodNames + ); + + if (!appliedOptions.ignoreAllProperties) { + memberData.definedPropertiesData + .filter( + (propertyData) => + !appliedOptions.ignoredProperties.includes(propertyData.propertyName) + ) + .forEach((propertyData) => { + this.addMockDefinedProperty(mock, propertyData) + }); + } + + return mock; + } + + /** + * Mocks an object by replacing its properties and methods with mock implementations. + * + * @param {string} objectName - The name of the object to mock. + * @param {T} objectToMock - The object to mock. + * @param {number} [maxDepth] - The maximum depth to traverse when mocking nested objects. Defaults to the maximum depth defined in the MockingService instance. + * + * @return {void} + */ + public mock(objectName: string, objectToMock: T, maxDepth?: number): void { + if (!!objectToMock && this.isObject(objectToMock) || this.isFunction(objectToMock)) { + this.mockObject(objectName, objectToMock, 0, maxDepth || this.maxDepth); + } + } + + /** + * Sets up a spy to call a fake function instead of the original function when it is called. + * + * @param {Function} spy - The spy to set up with a fake function. + * @param {Function} fakeFunction - The fake function to be called instead of the original function. + * @param {string} [spyName] - Optional name of the spy. + * @return {void} + */ + public withCallFake any>( + spy: TFunction, + fakeFunction: (...params: Parameters) => ReturnType, + spyName?: string + ): void { + if (this.isSpyLike(spy)) { + spy.and.callFake(fakeFunction); + return; + } + this.throwNotASpyError(spyName); + } + + /** + * Sets up a spy function to return specific values based on the first argument. + * + * @param {Function} spy - The spy function to set up. + * @param {Object} returnMap - An object that maps first argument values to return values. + * @param {any} defaultReturn - The default return value if the first argument does not have a mapping. + * @param {string} [spyName] - The name of the spy function for error messaging purposes. + * @returns {void} + */ + public withFirstArgMappedReturn( + spy: (arg1: string | number, ...args: any[]) => T, + returnMap: Record, + defaultReturn: T = undefined, + spyName?: string + ): void { + if (this.isSpyLike(spy)) { + spy.and.callFake((key) => + Object.prototype.hasOwnProperty.call(returnMap, key) + ? returnMap[key] + : defaultReturn + ) + } + this.throwNotASpyError(spyName) + } + + /** + * Applies original implementation functionality to a spy. + * + * @param {Function} spy - The spy to apply the callThrough functionality to. + * @param {string} [spyName] - The name of the spy. Optional. + * @return {void} + * @throws {TypeError} Throws a TypeError if the argument is not a spy. + */ + public withCallThrough(spy: Function, spyName?: string): void { + if (this.isSpyLike(spy)) { + spy.and.callThrough(); + return; + } + this.throwNotASpyError(spyName); + } + + /** + * Sets the return value for a spy function. + * + * @param {function} spy - The spy function. + * @param {any} returnValue - The return value to be set. + * @param {string} [spyName] - Optional name of the spy. + * + * @returns {void} + */ + public withReturnValue(spy: (...args: any[]) => T, returnValue: T, spyName?: string): void { + if (this.isSpyLike(spy)) { + spy.and.returnValue(returnValue); + return; + } + this.throwNotASpyError(spyName); + } + + /** + * Sets up a spy to return a specified value for a given set of arguments. + * + * @param {Function} spy - The spy function to set up. + * @param {Array} args - An array of arguments to be used when calling the spy function. + * @param {any} returnValue - The value to be returned when the spy function is called with the specified arguments. + * @param {string} [spyName] - An optional name for the spy function. + * @returns {void} + */ + public withReturnForArguments any>( + spy: TFunction, + args: [...Parameters], + returnValue: ReturnType, + spyName?: string + ): void { + if (!this.isSpyLike(spy)) { + this.throwNotASpyError(spyName); + } + spy.withArgs(...args).and.returnValue(returnValue); + } + + /** + * Sets the return values for the given spy function. Values will be returned in the order passed. + * + * @param {Function} spy - The spy function. + * @param {Array} returnValues - An array of return values for the spy function. + * @param {string} [spyName] - Optional name of the spy function. + * @return {void} + */ + public withReturnValues( + spy: (...args: any) => T, + returnValues: T[], + spyName?: string + ): void { + if (this.isSpyLike(spy)) { + spy.and.returnValues(returnValues); + return; + } + + this.throwNotASpyError(spyName); + } + + /** + * Sets up a spy to throw an error when called. + * + * @param {Function} spy - The spy to set up. + * @param {string} [message] - The error message to throw. + * @param {string} [spyName] - The name of the*/ + public withThrows(spy: Function, message?: string, spyName?: string): void { + if (this.isSpyLike(spy)) { + spy.and.throwError(message); + return; + } + + this.throwNotASpyError(spyName); + } + + /** + * Resets the call count and other state of the spy object. + * + * @param {Function} spy - The spy object to reset. + * @param {string} [spyName] - The name of the spy object (optional). + * @return {void} + */ + public resetSpy(spy: Function, spyName?: string): void { + if (this.isSpyLike(spy)) { + spy.calls.reset(); + return; + } + + this.throwNotASpyError(spyName); + } + + /** + * Overrides a property accessor on an object with a fake function for testing purposes. + * + * @param {Object} obj - The object containing the property. + * @param {string} key - The key of the property. + * @param {Accessor} accessor - The type of accessor (get or set). + * @param {Function} fakeFunction - The fake function to be used as the property accessor. + * @param {string} [spyName] - An optional name for the spy. + * + * @return {void} + */ + public withCallAccessorFake( + obj: T, + key: keyof T, + accessor: Accessor, + fakeFunction: (params: any[]) => any, + spyName?: string + ): void { + this.withCallFake(this.getPropertyAccessorSpy(obj, key, accessor), fakeFunction, spyName); + } + + /** + * Executes the specified accessor method on the given object with the provided key. + * + * @param {T} obj - The object on which to call the accessor method. + * @param {keyof T} key - The key for the accessor method. + * @param {Accessor} accessor - The accessor method to call. + * @param {string} [spyName] - The name of the spy to log for testing purposes. + * + * @return {void} + */ + public withCallAccessorThrough( + obj: T, + key: keyof T, + accessor: Accessor, + spyName?: string + ): void { + this.withCallThrough(this.getPropertyAccessorSpy(obj, key, accessor), spyName); + } + + /** + * Sets the return value for calls to the specified getter. + * + * @param {object} obj - The object on which the getter is defined. + * @param {string} key - The key/name of the property to set. + * @param {*} returnValue - The expected return value of the property getter. + * @param {string} [spyName] - The name of the spy function used for assertion. + * @returns {void} + */ + public withReturnGetterValue( + obj: T, + key: K, + returnValue: T[K], + spyName?: string + ): void { + this.withReturnValue(this.getPropertyAccessorSpy(obj, key, "get"), returnValue, spyName); + } + + /** + * Sets up a spy function on the given object's getter method, which will return the specified values. + * + * @param {object} obj - The object to set up the spy on. + * @param {string} key - The name of the getter method to spy on. + * @param {Array} returnValues - The array of values to be returned by the spy function. + * @param {string} [spyName] - Optional name for the spy function. + * @return {void} + */ + public withReturnGetterValues( + obj: T, + key: K, + returnValues: T[K][], + spyName?: string + ): void { + this.withReturnValues(this.getPropertyAccessorSpy(obj, key, "get"), returnValues, spyName); + } + + /** + * Sets up an accessor to throw an error. + * + * @param {T} obj - The object on which to set up the spy. + * @param {K} key - The key of the property on which to execute the accessor function. + * @param {Accessor} [accessor] - An optional function that accesses the given property on the object. + * @param {string} [message] - An optional error message to be thrown if the accessor fails. + * @param {string} [spyName] - An optional name for the spy function that represents the accessor. + * @returns {void} + */ + public withAccessorThrows( + obj: T, + key: K, + accessor?: Accessor, + message?: string, + spyName?: string + ): void { + this.withThrows(this.getPropertyAccessorSpy(obj, key, accessor), message, spyName); + } + + /** + * Resets the accessor spy for a given object and key. + * + * @param {Object} obj - The object to reset the spy for. + * @param {string} key - The key of the property to reset the spy for. + * @param {Accessor} [accessor] - The accessor type of the property. Defaults to undefined. + * @param {string} [spyName] - The name of the spy to reset. Defaults to undefined. + * @returns {void} + */ + public resetAccessorSpy( + obj: T, + key: K, + accessor?: Accessor, + spyName?: string + ): void { + this.resetSpy(this.getPropertyAccessorSpy(obj, key, accessor), spyName); + } + + /** + * Retrieves the arguments for a specific call made to a spy function. + * + * @param {TFunction} spy - The spy function. + * @param {number} callIndex - The index of the call for which to retrieve the arguments. Default value is 0. + * @param {string} [spyName] - The name of the spy function. Optional parameter used for error reporting. + * @returns {Array} - An array containing the arguments of the specified call. + */ + public getCallArgs any>( + spy: TFunction, + callIndex: number = 0, + spyName?: string + ): Parameters { + if (this.isSpyLike(spy)) { + return spy.calls.argsFor(callIndex) as Parameters; + } + + this.throwNotASpyError(spyName); + } + + /** + * Retrieves the number of times a spy has been called. + * + * @param {Function} spy - The spy function to get the call count for. + * @param {string} [spyName] - Optional name for the spy function. + * @returns {number} - The number of times the spy function has been called. + */ + public getCallCount any>( + spy: TFunction, + spyName?: string + ): number { + if (!this.isSpyLike(spy)) { + this.throwNotASpyError(spyName); + } + + return spy.calls.all().length; + } + + /** + * Retrieves member data for the given constructor. + * + * @template T + * @param {Constructor} ctor - The constructor to retrieve member data for. + * @private + * @returns {IMemberData} The member data. + */ + private getMemberData(ctor: Constructor): IMemberData { + const methodNames: (keyof T)[] = []; + const definedPropertiesData: IDefinedPropertyData[] = []; + + let currentPrototype: any = ctor.prototype; + do { + if (currentPrototype.constructor.name === "Object") { + break; + } + + (Object.getOwnPropertyNames(currentPrototype) as (keyof T)[]).forEach((memberName) => { + if (memberName === "constructor") { + return; + } + + const propertyData = this.getDefinedPropertyData(currentPrototype, memberName); + if (propertyData && (propertyData.hasGet || propertyData.hasSet)) { + definedPropertiesData.push(propertyData); + return; + } + + if (this.isFunction(currentPrototype[memberName])) { + methodNames.push(memberName); + return; + } + }) + } while ((currentPrototype = Object.getPrototypeOf(currentPrototype))); + + return { + methodNames, + definedPropertiesData + }; + } + + /** + * Gets the defined property data of an object. + * + * @param {T} obj - The object to get the property data from. + * @param {keyof T} propertyName - The name of the property. + * @returns {IDefinedPropertyData} - The defined property data. + * @private + */ + private getDefinedPropertyData(obj: T, propertyName: keyof T): IDefinedPropertyData { + try { + const descriptor = Object.getOwnPropertyDescriptor(obj, propertyName); + return { + propertyName: propertyName, + hasSet: descriptor && this.isFunction(descriptor.set), + hasGet: descriptor && this.isFunction(descriptor.get) + }; + } catch { + return null; + } + } + + /** + * Adds a defined property to the given mock object. + * + * @param {T} mock - The mock object. + * @param {IDefinedPropertyData} propertyData - The data for the property. + * @private + * @returns {void} + */ + private addMockDefinedProperty(mock: T, propertyData: IDefinedPropertyData): void { + const attributes = { + get: propertyData.hasGet ? () => {} : undefined, + set: propertyData.hasSet ? () => {} : undefined, + configurable: true + }; + Object.defineProperty(mock, propertyData.propertyName, attributes); + this.mockAsProperty(mock, propertyData.propertyName); + } + + /** + * Mocks properties of an object recursively up to a maximum depth. + * + * @param {string} objectName - The name of the object being mocked. + * @param {Object} objectToMock - The object to be mocked. + * @param {number} depth - The current depth of recursion. + * @param {number} maxDepth - The maximum depth of recursion. + * @private + * @returns {void} + */ + private mockObject( + objectName: string, + objectToMock: T, + depth: number, + maxDepth: number + ): void { + // noinspection JSDeprecatedSymbols + if (objectToMock.constructor === HTMLDocument) { + return; + } + + const objectKeys = this.getInstancePropertyNames(objectToMock); + objectKeys.forEach((key: keyof T & string) => { + try { + if (!this.mockAsProperty(objectToMock, key)) { + objectToMock[key] = this.mockValue( + objectName, + objectToMock, + key, + depth++, + maxDepth + ) + } + } catch (e) { + console.error( + `Unable to mock ${objectName}.${key} with preexisting value of ${objectToMock[key]}` + ) + } + }) + } + + /** + * Retrieves the instance property names of the given object. + * + * @param {T} objectToMock - The object to retrieve property names from. + * @returns {string[]} - An array of instance property names. + * @private + */ + private getInstancePropertyNames(objectToMock: T): string[] { + let names: Set = new Set(); + let proto = objectToMock; + while (proto && proto !== Object.prototype) { + Object.getOwnPropertyNames(proto).forEach((name) => { + if (name !== "constructor") { + names.add(name); + } + }); + proto = Object.getPrototypeOf(proto); + } + return Array.from(names); + } + + /** + * Mocks a property on an object for testing purposes. + * + * @param {object} objectToMock - The object to mock the property on. + * @param {string} key - The key of the property to mock. + * @returns {boolean} - `true` if the property was successfully mocked, `false` otherwise. + * @private + */ + private mockAsProperty(objectToMock: T, key: keyof T): boolean { + let descriptor: PropertyDescriptor; + do { + descriptor = Object.getOwnPropertyDescriptor(objectToMock, key); + } while (!descriptor && (objectToMock = Object.getPrototypeOf(objectToMock))); + + if (descriptor && (descriptor.get || descriptor.set)) { + if (descriptor.get && !this.isSpyLike(descriptor.get)) { + spyOnProperty(objectToMock, key, "get").and.callThrough(); + } + if (descriptor.set && !this.isSpyLike(descriptor.set)) { + spyOnProperty(objectToMock, key, "set"); + } + return true; + } + return false; + } + + /** + * Mocks a value for a given object property. + * + * @param {string} objectName - The name of the object. + * @param {T} objectToMock - The object to mock. + * @param {keyof T} key - The key of the property to mock. + * @param {number} depth - The current depth of recursion. + * @param {number} maxDepth - The maximum depth of recursion. + * @returns {any} - The mocked value. + * @private + */ + private mockValue( + objectName: string, + objectToMock: T, + key: keyof T, + depth: number, + maxDepth: number + ): any { + const value = objectToMock[key]; + + if (this.isUndefined(value) || value === null) { + return value; + } + + if (Array.isArray(value)) { + return depth < maxDepth + ? value.map((item, i) => + this.mockValue(`${objectName}[${i}]`, value, i as any, depth++, maxDepth) + ) : value; + } + if (this.isFunction(value)) { + return this.isSpyLike(value) + ? value + : spyOn(objectToMock, key as T[keyof T] extends Function ? keyof T : never) + } + if (this.isObject(value)) { + return depth < maxDepth + ? this.mockObject(`${objectName}.${String(key)}`, value, depth++, maxDepth) + : value; + } + if (this.isString(value)) { + return `${objectName}.${String(key)}` + this.generateNumber().toString(); + } + if (this.isDate(value)) { + return new Date(2000, 1, 1, 1, 1, 1, 1); + } + if (this.isNumber(value)) { + return this.generateNumber(); + } + return value; + } + + /** + * Returns a Jasmine spy for the specified property accessor of an object. + * If the object or its prototype chain does not contain the specified property, null is returned. + * + * @param {T} obj - The object to inspect. + * @param {keyof T} key - The key of the property. + * @param {Accessor} accessor - The type of accessor to spy on (e.g., "get" or "set"). + * @returns {jasmine.Spy|null} - A Jasmine spy for the specified property accessor or null if not found. + * @private + */ + private getPropertyAccessorSpy( + obj: T, + key: keyof T, + accessor: Accessor + ): jasmine.Spy { + let descriptor: PropertyDescriptor; + do { + descriptor = Object.getOwnPropertyDescriptor(obj, key); + } while (!descriptor && (obj = Object.getPrototypeOf(obj))); + + if (!descriptor) { + return null; + } + + return descriptor[accessor] as jasmine.Spy; + } + + /** + * Throws an error if the provided spy is not an actual spy. + * + * @param {string} spyName - The name of the spy. Default value is "[spyName not provided]" if not provided. + * @protected + * @throws {Error} - Throws an error with the message "{caller name}: Provided spy {spyName} is not an actual spy." + * @returns {never} - This function does not return any value. + */ + protected throwNotASpyError(spyName: string = "[spyName not provided]"): never { + throw new Error(`${this.throwNotASpyError.caller.name}: Provided spy ${spyName} is not an actual spy.`) + } + + /** + * Generates a random number between 0 and 999. + * + * @private + * @returns {number} The generated random number. + */ + private generateNumber(): number { + return Math.floor(Math.random() * 1000); + } + + /** + * Checks if a value is a function. + * + * @param {any} value - The value to check. + * @return {boolean} - true if the value is a function, false otherwise. + * @private + */ + private isFunction(value: any): value is Function { + return typeof value === "function"; + } + + /** + * Check if a value is an object. + * + * @param {*} value - The value to check. + * @returns {boolean} - Returns true if the value is an object, otherwise returns false. + * @private + */ + private isObject(value: any): value is Object { + return value !== null && typeof value === 'object'; + } + + /** + * Checks if a given value is a Date object. + * + * @param {any} value - The value to be checked. + * @returns {boolean} - Returns true if the value is a Date object, otherwise returns false. + * @private + */ + private isDate(value: any): value is Date { + return toString.call(value) === "[object Date]"; + } + + /** + * Checks if the given value is a number. + * + * @param {any} value - The value to check. + * @private + * @return {boolean} - True if the value is a number, false otherwise. + */ + private isNumber(value: any): value is number { + return typeof value === "number"; + } + + /** + * Checks if the given value is a string. + * + * @param {*} value - The value to be checked. + * @returns {boolean} - Returns true if the value is a string, false otherwise. + */ + private isString(value: any): value is string { + return typeof value === "string"; + } + + /** + * Checks if a value is undefined. + * + * @param {any} value - The value to check. + * @returns {boolean} Returns true if the value is undefined, else false. + * @private + */ + private isUndefined(value: any): boolean { + return typeof value === "undefined"; + } + + /** + * Checks if the given value is spy-like. + * + * @param {any} value - The value to be checked. + * @protected + * @return {boolean} - Returns true if the value is spy-like, false otherwise. + */ + protected isSpyLike(value: any): value is jasmine.Spy { + return value && !!value.calls; + } +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/setup-package.ts b/src/setup-package.ts index a97f84f..895dde7 100644 --- a/src/setup-package.ts +++ b/src/setup-package.ts @@ -13,6 +13,7 @@ function main() { } fs.writeFileSync(path.join(__dirname + "/package.json"), Buffer.from(JSON.stringify(sourceObj, null, 2), "utf-8")); fs.copyFileSync(path.join(__dirname, "..", ".npmignore"), path.join(__dirname, "..", "dist", ".npmignore")); + fs.copyFileSync(path.join(__dirname, '..', '.npmrc'), path.join(__dirname, '..', 'dist', '.npmrc')) } main() \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 4a2ff23..bfa08f3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "sourceMap": true, "rootDir": "./src", "outDir": "dist", - "strict": true, /* Enable all strict type-checking options. */ + "strict": false, /* Enable all strict type-checking options. */ "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */ }, From 4691fffa9de5ccc3bfa6dde9ea3e3495db87c03c Mon Sep 17 00:00:00 2001 From: Duncan McPherson Date: Mon, 1 Jan 2024 20:25:05 -0700 Subject: [PATCH 2/6] export IMockClassOptions --- package.json | 2 +- src/index.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 140f592..ca7c81b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ez-budgets/karma-test-utils", - "version": "0.0.6", + "version": "0.0.7", "description": "", "main": "dist/index.js", "files": [ diff --git a/src/index.ts b/src/index.ts index e69de29..3368214 100644 --- a/src/index.ts +++ b/src/index.ts @@ -0,0 +1 @@ +export { IMockClassOptions } from "./autoMocker"; \ No newline at end of file From 13d2b67bbc62449721814d59498f91e0fbd9eccf Mon Sep 17 00:00:00 2001 From: Duncan McPherson Date: Tue, 2 Jan 2024 21:39:30 -0700 Subject: [PATCH 3/6] finally got specs working with no coverage --- .gitignore | 3 +- babel.config.js | 5 + package-lock.json | 2879 ++++++++++++++++++++++++++++++- package.json | 15 +- spec/auto-mocker.spec.js | 16 + spec/auto-mocker.spec.js.map | 1 + spec/auto-mocker.spec.ts | 16 + spec/support/jasmine-plain.json | 10 + spec/support/jasmine-tests.js | 20 +- spec/temp.spec.ts | 14 - src/autoMocker.ts | 39 +- tsconfig.json | 13 +- tsconfig.spec.json | 23 + 13 files changed, 2981 insertions(+), 73 deletions(-) create mode 100644 babel.config.js create mode 100644 spec/auto-mocker.spec.js create mode 100644 spec/auto-mocker.spec.js.map create mode 100644 spec/auto-mocker.spec.ts create mode 100644 spec/support/jasmine-plain.json delete mode 100644 spec/temp.spec.ts create mode 100644 tsconfig.spec.json diff --git a/.gitignore b/.gitignore index e937f4d..aecb73e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ node_modules/ dist/ **/*.tgz test-results/ -coverage/ \ No newline at end of file +coverage/ +build-test/ \ No newline at end of file diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..689a2e9 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + ['@babel/preset-env'] + ] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a492aa8..336b25d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,31 +1,1942 @@ { "name": "@ez-budgets/karma-test-utils", - "version": "0.0.5", + "version": "0.0.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ez-budgets/karma-test-utils", - "version": "0.0.5", + "version": "0.0.7", "license": "MIT", "dependencies": { "jasmine": "^5.1.0", - "lodash-es": "^4.17.21", + "lodash": "^4.17.21", "rxjs": "^7.8.1" }, "devDependencies": { + "@babel/cli": "^7.23.4", + "@babel/core": "^7.23.7", + "@babel/preset-env": "^7.23.7", + "@babel/register": "^7.23.7", "@types/ejs": "^3.1.5", "@types/jasmine": "^5.1.4", - "@types/lodash-es": "^4.17.12", + "@types/lodash": "^4.14.202", "ejs": "^3.1.9", "husky": "^8.0.0", "istanbul": "^0.4.5", "jasmine-reporters": "^2.5.2", "jasmine-spec-reporter": "^7.0.0", "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", "typescript": "^5.3.3" } }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/cli": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz", + "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "commander": "^4.0.1", + "convert-source-map": "^2.0.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + }, + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/cli/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@babel/cli/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", + "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", + "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", + "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", + "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.7.tgz", + "integrity": "sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.7", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.5", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/register": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz", + "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.6", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", + "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -54,6 +1965,20 @@ "node": ">=12" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", @@ -63,6 +1988,15 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -79,6 +2013,13 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -130,15 +2071,6 @@ "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", "dev": true }, - "node_modules/@types/lodash-es": { - "version": "4.17.12", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", - "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", - "dev": true, - "dependencies": { - "@types/lodash": "*" - } - }, "node_modules/@types/node": { "version": "20.10.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", @@ -220,6 +2152,20 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -241,11 +2187,60 @@ "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", "dev": true }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", + "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", + "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -256,6 +2251,77 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001572", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz", + "integrity": "sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -293,6 +2359,48 @@ "node": ">=8" } }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -318,12 +2426,46 @@ "node": ">=0.1.90" } }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", + "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", + "dev": true, + "dependencies": { + "browserslist": "^4.22.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -357,6 +2499,23 @@ "node": ">= 8" } }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -392,11 +2551,35 @@ "node": ">=0.10.0" } }, + "node_modules/electron-to-chromium": { + "version": "1.4.616", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz", + "integrity": "sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==", + "dev": true + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/escodegen": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", @@ -486,6 +2669,45 @@ "node": ">=10" } }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/foreground-child": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -501,6 +2723,50 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", @@ -517,6 +2783,28 @@ "node": "*" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -556,6 +2844,18 @@ "node": ">=0.10.0" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/husky": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", @@ -587,6 +2887,41 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -595,11 +2930,55 @@ "node": ">=8" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "optional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/istanbul": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", @@ -758,6 +3137,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -784,6 +3169,39 @@ "node": ">=4" } }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -797,10 +3215,29 @@ "node": ">= 0.8.0" } }, - "node_modules/lodash-es": { + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true }, "node_modules/lru-cache": { "version": "10.1.0", @@ -810,6 +3247,28 @@ "node": "14 || >=16.14" } }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -857,12 +3316,24 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, "node_modules/nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -875,6 +3346,16 @@ "nopt": "bin/nopt.js" } }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -901,6 +3382,51 @@ "node": ">= 0.8.0" } }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -918,6 +3444,12 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, "node_modules/path-scurry": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", @@ -933,6 +3465,55 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -942,6 +3523,90 @@ "node": ">= 0.8.0" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, "node_modules/resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -956,6 +3621,27 @@ "tslib": "^2.1.0" } }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -986,6 +3672,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/source-map": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", @@ -999,6 +3694,25 @@ "node": ">=0.8.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -1093,6 +3807,15 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -1105,6 +3828,40 @@ "node": ">=0.8.0" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -1148,6 +3905,20 @@ } } }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -1198,6 +3969,76 @@ "dev": true, "peer": true }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -1318,6 +4159,12 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index ca7c81b..8d38425 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "@ez-budgets/karma-test-utils", - "version": "0.0.7", + "version": "0.0.8", "description": "", "main": "dist/index.js", "files": [ "./**/*" ], "scripts": { - "test": "jasmine --config=spec/support/jasmine-tests.js", - "posttest": "istanbul cover --include-all-sources spec/support/istanbul.js && istanbul check-coverage", + "pretest": "tsc --project tsconfig.spec.json", + "test": "node spec/support/jasmine-tests.js", "prepare": "husky install", "build": "tsc", "presetup-package": "npm run build", @@ -25,20 +25,25 @@ }, "homepage": "https://github.com/duncanmcpherson/karma-test-utils#readme", "devDependencies": { + "@babel/cli": "^7.23.4", + "@babel/core": "^7.23.7", + "@babel/preset-env": "^7.23.7", + "@babel/register": "^7.23.7", "@types/ejs": "^3.1.5", "@types/jasmine": "^5.1.4", - "@types/lodash-es": "^4.17.12", + "@types/lodash": "^4.14.202", "ejs": "^3.1.9", "husky": "^8.0.0", "istanbul": "^0.4.5", "jasmine-reporters": "^2.5.2", "jasmine-spec-reporter": "^7.0.0", "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", "typescript": "^5.3.3" }, "dependencies": { "jasmine": "^5.1.0", - "lodash-es": "^4.17.21", + "lodash": "^4.17.21", "rxjs": "^7.8.1" } } \ No newline at end of file diff --git a/spec/auto-mocker.spec.js b/spec/auto-mocker.spec.js new file mode 100644 index 0000000..97b21a0 --- /dev/null +++ b/spec/auto-mocker.spec.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const autoMocker_1 = require("../src/autoMocker"); +class TestAutoMocker { +} +describe("AutoMocker", () => { + let autoMocker; + beforeEach(() => { + autoMocker = new autoMocker_1.AutoMocker(); + }); + it("should mock a class", () => { + const mockClass = autoMocker.mockClass(TestAutoMocker); + expect(mockClass).toBeDefined(); + }); +}); +//# sourceMappingURL=auto-mocker.spec.js.map \ No newline at end of file diff --git a/spec/auto-mocker.spec.js.map b/spec/auto-mocker.spec.js.map new file mode 100644 index 0000000..8978c75 --- /dev/null +++ b/spec/auto-mocker.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"auto-mocker.spec.js","sourceRoot":"","sources":["auto-mocker.spec.ts"],"names":[],"mappings":";;AAAA,kDAA+C;AAE/C,MAAM,cAAc;CAAG;AAEvB,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC3B,IAAI,UAAsB,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACZ,UAAU,GAAG,IAAI,uBAAU,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC3B,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/spec/auto-mocker.spec.ts b/spec/auto-mocker.spec.ts new file mode 100644 index 0000000..32e7060 --- /dev/null +++ b/spec/auto-mocker.spec.ts @@ -0,0 +1,16 @@ +import { AutoMocker } from '../src/autoMocker'; + +class TestAutoMocker {} + +describe("AutoMocker", () => { + let autoMocker: AutoMocker; + + beforeEach(() => { + autoMocker = new AutoMocker(); + }); + + it("should mock a class", () => { + const mockClass = autoMocker.mockClass(TestAutoMocker); + expect(mockClass).toBeDefined(); + }); +}) \ No newline at end of file diff --git a/spec/support/jasmine-plain.json b/spec/support/jasmine-plain.json new file mode 100644 index 0000000..65974d0 --- /dev/null +++ b/spec/support/jasmine-plain.json @@ -0,0 +1,10 @@ +{ + "spec_dir": "build-test", + "spec_files": [ + "**/*[sS]pec.*js" + ], + "env": { + "stopSpecOnExpectationFailure": false, + "random": true + } +} \ No newline at end of file diff --git a/spec/support/jasmine-tests.js b/spec/support/jasmine-tests.js index eb8aeff..71cd775 100644 --- a/spec/support/jasmine-tests.js +++ b/spec/support/jasmine-tests.js @@ -1,16 +1,8 @@ +const Jasmine = require("jasmine"); +const jasmine = new Jasmine(); const SpecReporter = require('jasmine-reporters').JUnitXmlReporter; -module.exports = { - "spec_dir": "spec", - "spec_files": [ - "**/*[sS]pec.ts" - ], - "env": { - "stopSpecOnExpectationFailure": false, - "random": true - } -} -const reporter = new SpecReporter({savePath: 'test-results'}) -const env = jasmine.getEnv(); -env.addReporter(reporter); -env.execute(); +const reporter = new SpecReporter({savePath: 'test-results'}); +jasmine.loadConfigFile("spec/support/jasmine-plain.json") +jasmine.addReporter(reporter); +jasmine.execute(); diff --git a/spec/temp.spec.ts b/spec/temp.spec.ts deleted file mode 100644 index aa8dba3..0000000 --- a/spec/temp.spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -// import { SpecReporter } from "@ez-budgets/jasmine-junit-reporter"; -// -describe("Temporary", () => { - // beforeAll(() => { - // const specReporter = new SpecReporter({ - // fileName: 'jasmine.xml', - // dirName: './test-results' - // }); - // jasmine.getEnv().addReporter(specReporter); - // }) - it("should pass", () => { - expect(true).toBeTrue(); - }) -}) \ No newline at end of file diff --git a/src/autoMocker.ts b/src/autoMocker.ts index 36337de..ef7b7a1 100644 --- a/src/autoMocker.ts +++ b/src/autoMocker.ts @@ -1,8 +1,8 @@ // noinspection JSValidateJSDoc -import isEmpty from "lodash-es/isEmpty"; -import uniq from "lodash-es/uniq"; -import { Accessor, Constructor } from "./@types"; +import isEmpty from "lodash/isEmpty"; +import uniq from "lodash/uniq"; +import { Accessor, Constructor } from "@types-local"; /** * Represents the data structure for member data of a given type. @@ -165,7 +165,7 @@ export class AutoMocker { spy.and.callFake(fakeFunction); return; } - this.throwNotASpyError(spyName); + this.throwNotASpyError('withCallFake', spyName); } /** @@ -190,7 +190,7 @@ export class AutoMocker { : defaultReturn ) } - this.throwNotASpyError(spyName) + this.throwNotASpyError('withFirstArgMappedReturn', spyName) } /** @@ -206,7 +206,7 @@ export class AutoMocker { spy.and.callThrough(); return; } - this.throwNotASpyError(spyName); + this.throwNotASpyError('withCallThrough', spyName); } /** @@ -223,7 +223,7 @@ export class AutoMocker { spy.and.returnValue(returnValue); return; } - this.throwNotASpyError(spyName); + this.throwNotASpyError('withReturnValue', spyName); } /** @@ -242,7 +242,7 @@ export class AutoMocker { spyName?: string ): void { if (!this.isSpyLike(spy)) { - this.throwNotASpyError(spyName); + this.throwNotASpyError('withReturnForArguments', spyName); } spy.withArgs(...args).and.returnValue(returnValue); } @@ -265,7 +265,7 @@ export class AutoMocker { return; } - this.throwNotASpyError(spyName); + this.throwNotASpyError('withReturnValues', spyName); } /** @@ -280,7 +280,7 @@ export class AutoMocker { return; } - this.throwNotASpyError(spyName); + this.throwNotASpyError('withThrows', spyName); } /** @@ -296,7 +296,7 @@ export class AutoMocker { return; } - this.throwNotASpyError(spyName); + this.throwNotASpyError('resetSpy', spyName); } /** @@ -430,7 +430,7 @@ export class AutoMocker { return spy.calls.argsFor(callIndex) as Parameters; } - this.throwNotASpyError(spyName); + this.throwNotASpyError('getCallArgs', spyName); } /** @@ -445,7 +445,7 @@ export class AutoMocker { spyName?: string ): number { if (!this.isSpyLike(spy)) { - this.throwNotASpyError(spyName); + this.throwNotASpyError('getCallCount', spyName); } return spy.calls.all().length; @@ -700,15 +700,16 @@ export class AutoMocker { } /** - * Throws an error if the provided spy is not an actual spy. + * Throws an error indicating that the provided spy is not an actual spy. + * + * @param {string} caller - The name of the calling function or component. + * @param {string} [spyName="[spyName not provided]"] - The name of the spy. * - * @param {string} spyName - The name of the spy. Default value is "[spyName not provided]" if not provided. * @protected - * @throws {Error} - Throws an error with the message "{caller name}: Provided spy {spyName} is not an actual spy." - * @returns {never} - This function does not return any value. + * @returns {never} - This function does not return a value. */ - protected throwNotASpyError(spyName: string = "[spyName not provided]"): never { - throw new Error(`${this.throwNotASpyError.caller.name}: Provided spy ${spyName} is not an actual spy.`) + protected throwNotASpyError(caller: string, spyName: string = "[spyName not provided]"): never { + throw new Error(`${caller}: Provided spy ${spyName} is not an actual spy.`) } /** diff --git a/tsconfig.json b/tsconfig.json index bfa08f3..8640018 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,8 @@ { "compilerOptions": { + "baseUrl": ".", "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - "module": "commonjs", /* Specify what module code is generated. */ + "module": "CommonJS", "lib": ["ES2016", "DOM"], "allowJs": true, "sourceMap": true, @@ -9,10 +10,14 @@ "outDir": "dist", "strict": false, /* Enable all strict type-checking options. */ "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ - "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + "paths": { + "@types-local": ["src/@types/index.ts"] + } }, "include": ["src/**/*"], "exclude": [ - "**/*.spec.*" - ] + "**/*.spec.*", + "src/update-version.cjs" + ], } diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 0000000..c7269da --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "target": "es2016", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "lib": ["ES2016", "DOM"], + "allowJs": true, + "sourceMap": true, + "rootDir": ".", + "outDir": "build-test", + "strict": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "paths": { + "@types-local": ["src/@types/index.ts"] + } + }, + "include": ["src/**/*.ts", "spec/**/*.spec.ts"], + "exclude": [ + "src/update-version.cjs" + ], +} From d8919b3f6a1b4e1d3f50aa8fe70dadf31580d1ae Mon Sep 17 00:00:00 2001 From: Duncan McPherson Date: Fri, 5 Jan 2024 22:06:38 -0700 Subject: [PATCH 4/6] a ton of tests --- .istanbul.yml | 12 + babel.config.js | 5 - package.json | 4 +- spec/auto-mocker.spec.ts | 457 ++++++++++++++++++++++++++++- spec/support/istanbul-jasmine.json | 4 +- src/autoMocker.ts | 26 +- 6 files changed, 481 insertions(+), 27 deletions(-) create mode 100644 .istanbul.yml delete mode 100644 babel.config.js diff --git a/.istanbul.yml b/.istanbul.yml new file mode 100644 index 0000000..faabced --- /dev/null +++ b/.istanbul.yml @@ -0,0 +1,12 @@ +check: + global: + statements: 95 + lines: 95 + branches: 95 + functions: 95 +reporting: + watermarks: + statements: [75, 95] + lines: [75, 95] + functions: [75, 95] + branches: [75, 95] \ No newline at end of file diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index 689a2e9..0000000 --- a/babel.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - presets: [ - ['@babel/preset-env'] - ] -} \ No newline at end of file diff --git a/package.json b/package.json index 8d38425..97d81c1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ez-budgets/karma-test-utils", - "version": "0.0.8", + "version": "0.0.9", "description": "", "main": "dist/index.js", "files": [ @@ -9,6 +9,8 @@ "scripts": { "pretest": "tsc --project tsconfig.spec.json", "test": "node spec/support/jasmine-tests.js", + "precover": "tsc --project tsconfig.spec.json", + "cover": "istanbul cover spec/support/istanbul.js --exclude dist/*,spec/**/* && istanbul check-coverage", "prepare": "husky install", "build": "tsc", "presetup-package": "npm run build", diff --git a/spec/auto-mocker.spec.ts b/spec/auto-mocker.spec.ts index 32e7060..a331989 100644 --- a/spec/auto-mocker.spec.ts +++ b/spec/auto-mocker.spec.ts @@ -1,16 +1,455 @@ import { AutoMocker } from '../src/autoMocker'; +import isEmpty from "lodash/isEmpty"; -class TestAutoMocker {} +class TestEmptyAutoMocker { +} + +class TestAutoMocker { + private _value: number = 4; + + public add(num1: number, num2: number): number { + return num1 + num2; + } + + public get Value(): number { + return this._value; + } + + public set Value(value: number) { + this._value = value; + } + + public get Values(): number { + return this._value + } + + public set UpdateValues(value: number) { + this._value = value; + } +} describe("AutoMocker", () => { let autoMocker: AutoMocker; - beforeEach(() => { - autoMocker = new AutoMocker(); - }); + beforeEach(() => { + autoMocker = new AutoMocker(); + }); + + it("should create", () => { + expect(autoMocker).toBeTruthy(); + }); + + describe("mockClass", () => { + it("should create an empty mock class", () => { + const mock = autoMocker.mockClass(TestEmptyAutoMocker); + expect(mock).toBeTruthy(); + expect(isEmpty(mock)).toBe(true); + }); + + it("should create a mock with at least 1 mocked method", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + expect(mock).toBeTruthy(); + expect(mock.add).toBeInstanceOf(Function); + expect(Object.keys(mock).length).toBeGreaterThanOrEqual(1); + }); + + it("should create a mock with at least 1 mocked property", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + expect(mock).toBeTruthy(); + const propertyNames = Object.getOwnPropertyNames(mock); + expect(propertyNames.includes("Value")).toEqual(true); + // Expect to be undefined because we don't call the actual constructor + expect(mock.Value).toBeUndefined(); + }); + + it("should not define Value property if ignore all properties is true", () => { + const mock = autoMocker.mockClass(TestAutoMocker, {ignoreAllProperties: true}) + expect(Object.keys(mock).includes("Value")).toBeFalse() + expect(mock).toBeTruthy(); + }); + }); + + describe("mock", () => { + it("should mock an object", () => { + const fn = { + prop: 25, + method: () => 45 + }; + autoMocker.mock("fn", fn); + expect(fn).toBeDefined(); + expect(fn.prop).toBeDefined(); + expect((fn.method as jasmine.Spy).calls).toBeDefined(); + }); + + // TODO: need to understand why this doesn't work + xit("should mock a function", () => { + let fn = () => 123; + autoMocker.mock("fn", fn); + console.log(fn) + expect((fn as jasmine.Spy).calls).toBeDefined(); + }); + }); + + describe("withCallFake", () => { + it("should replace a spy with a fake function", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + autoMocker.withCallFake(mock.add, (num1, num2) => num1 * num2); + const result = mock.add(2, 3); + expect(result).toBe(6); + }); + + it('should throw an error when method is not a spy', () => { + const fn = () => { + }; + expect(() => autoMocker.withCallFake(fn, () => { + })).toThrowError(); + }); + }); + + describe("withFirstArgMappedReturn", () => { + let mock: TestAutoMocker; + beforeEach(() => { + mock = autoMocker.mockClass(TestAutoMocker) + }); + + it('should return the proper response when called', () => { + autoMocker.withFirstArgMappedReturn(mock.add, {2: 10, 3: 20}, 30); + const result = mock.add(2, 3); + const res2 = mock.add(3, 4); + const res3 = mock.add(4, 5); + expect(result).toBe(10); + expect(res2).toBe(20); + expect(res3).toBe(30); + }); + + it('should throw error when method is not a spy', () => { + expect(() => autoMocker.withFirstArgMappedReturn(() => { + }, {}, null)).toThrowError(); + }); + }); + + describe("withCallThrough", () => { + let mock: TestAutoMocker; + + beforeEach(() => { + mock = autoMocker.mockClass(TestAutoMocker); + }); + + it("should call the spy function and return undefined when called", () => { + autoMocker.withCallThrough(mock.add); + const num1 = Math.floor(Math.random() * 10), num2 = Math.floor(Math.random() * 10); + const result = mock.add(num1, num2); + expect(result).toBeUndefined(); + }); + + it('should throw an error when method is not a spy', () => { + expect(() => autoMocker.withCallThrough(() => { + }, "notASpy")).toThrowError(); + }); + }); + + describe("withReturnValue", () => { + let mock: TestAutoMocker; + + beforeEach(() => { + mock = autoMocker.mockClass(TestAutoMocker); + }); + + it("should return the correct value when called", () => { + const returnValue = Math.floor(Math.random() * 10); + autoMocker.withReturnValue(mock.add, returnValue); + const result = mock.add(2, 3); + expect(result).toBe(returnValue); + }); + + it("should throw error when method is not a spy", () => { + expect(() => autoMocker.withReturnValue(() => { + }, void 0)).toThrowError(); + }); + }); + + describe("withReturnForArguments", () => { + it('should throw error when method is not a spy', () => { + expect(() => autoMocker.withReturnForArguments(() => { + }, [], null)).toThrowError(); + }); + + it("should return the correct value for different sets of args", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + autoMocker.withReturnForArguments(mock.add, [2, 3], 10); + autoMocker.withReturnForArguments(mock.add, [3, 4], 20); + autoMocker.withReturnForArguments(mock.add, [4, 5], 30); + + expect(mock.add(2, 3)).toBe(10); + expect(mock.add(3, 4)).toBe(20); + expect(mock.add(4, 5)).toBe(30); + }); + }); + + describe('withReturnValues', () => { + it("should return the correct values in order when called multiple times", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + autoMocker.withReturnValues(mock.add, [10, 20, 30]); + expect(mock.add(2, 3)).toBe(10); + expect(mock.add(3, 4)).toBe(20); + expect(mock.add(4, 5)).toBe(30); + }); + + it("should return undefined when called more times than there are return values", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + autoMocker.withReturnValues(mock.add, [10, 20]); + expect(mock.add(2, 3)).toBe(10); + expect(mock.add(3, 4)).toBe(20); + expect(mock.add(4, 5)).toBeUndefined(); + }); + + it('should throw an error when method is not a spy', () => { + expect(() => autoMocker.withReturnValues(() => { + }, [])).toThrowError(); + }); + }); + + describe("withThrows", () => { + it("should throw not a spy error when method is not a spy", () => { + try { + autoMocker.withThrows(() => { + }); + fail('Should have thrown an error'); + } catch (e) { + expect((e as Error).message.includes('not an actual spy')).toBeTrue(); + } + }); + + it('should throw correct error when method is called', () => { + const mock = autoMocker.mockClass(TestAutoMocker); + autoMocker.withThrows(mock.add, "Test error"); + + try { + const res = mock.add(2, 3); + fail(`Should have thrown an error instead of receiving value: ${res}`); + } catch (e) { + expect((e as Error).message).toBe("Test error"); + } + }); + }); + + describe("resetSpy", () => { + it("should reset the spy", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + mock.add(1, 2); + expect((mock.add as jasmine.Spy).calls.all().length).toEqual(1); + autoMocker.resetSpy(mock.add); + expect((mock.add as jasmine.Spy).calls.all().length).toEqual(0); + }); + + it("should throw error when method is not a spy", () => { + expect(() => autoMocker.resetSpy(() => { + })).toThrowError(); + }); + }) + + describe("withCallAccessorFake", () => { + describe("get", () => { + it("should return the proper value when accessing the property", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + autoMocker.withCallAccessorFake(mock, "Value", "get", () => 10); + const result = mock.Value; + expect(result).toBe(10); + }); + }); + + describe("set", () => { + it("should call the fake when called", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + let wasCalled = false; + autoMocker.withCallAccessorFake(mock, "Value", "set", (_) => { + wasCalled = true; + }); + mock.Value = 5; + expect(wasCalled).toBe(true); + }); + }); + }); + + describe("withCallAccessorThrough", () => { + it("should track call counts", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + + autoMocker.withCallAccessorThrough(mock, "Value", "get"); + + let descriptor = Object.getOwnPropertyDescriptor(mock, "Value"); + expect(autoMocker.getCallCount(descriptor.get)).toEqual(0); + mock.Value; + expect(autoMocker.getCallCount(descriptor.get)).toEqual(1); + }); + }); + + describe("withReturnGetterValue", () => { + it("should return the proper value when called", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + + autoMocker.withReturnGetterValue(mock, "Value", 123); + const result = mock.Value; + expect(result).toEqual(123); + }); + }); + + describe("withReturnGetterValues", () => { + it("should return the proper values for each call", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + const expected = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + + autoMocker.withReturnGetterValues(mock, "Value", expected); + for (let i = 0; i < expected.length; i++) { + const result = mock.Value; + expect(result).toEqual(expected[i]); + } + }); + }); + + describe("withAccessorThrows", () => { + it("get should throw an error when called", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + autoMocker.withAccessorThrows(mock, "Value", "get", "Test error"); + expect(() => mock.Value).toThrowError("Test error"); + }); + + it("set should throw error when called", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + autoMocker.withAccessorThrows(mock, "Value", "set", "I'm a test"); + expect(() => { + mock.Value = 15 + }).toThrowError("I'm a test"); + }); + }); + + describe("resetAccessorSpy", () => { + it("should reset the call count on the spy", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + const descriptor = Object.getOwnPropertyDescriptor(mock, "Value"); + expect(autoMocker.getCallCount(descriptor.get)).toEqual(0); + mock.Value; + expect(autoMocker.getCallCount(descriptor.get)).toEqual(1); + autoMocker.resetAccessorSpy(mock, "Value", "get"); + expect(autoMocker.getCallCount(descriptor.get)).toEqual(0) + }); + }); + + describe("getCallArgs", () => { + it("should return the arguments that were passed for the call to the method", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + autoMocker.withCallThrough(mock.add); + + mock.add(1, 2); + const params = autoMocker.getCallArgs(mock.add); + + expect(params).toEqual([1, 2]) + }); + + it("should throw an error when method is not a spy", () => { + expect(() => autoMocker.getCallArgs(() => { + })).toThrowError(); + }); + }); + + describe("getCallCount", () => { + it("should return the correct call count", () => { + const mock = autoMocker.mockClass(TestAutoMocker); + autoMocker.withCallThrough(mock.add); + + let callCount = autoMocker.getCallCount(mock.add); + expect(callCount).toEqual(0); + mock.add(1, 2); + callCount = autoMocker.getCallCount(mock.add); + expect(callCount).toEqual(1); + }); + + it("should throw error if method is not a spy", () => { + expect(() => autoMocker.getCallCount(() => { + })).toThrowError(); + }); + }); + + describe("[private] mockValue", () => { + let methodUnderTest: (objectName: string, objectToMock: T, key: keyof T, depth: number, maxDepth: number) => T; + const testObject = { + undefVal: undefined, + arrayVal: [1, 2, 3], + func: () => console.log("test func"), + objVal: { + key1: "test", + key2: "keys" + }, + deepObjVal: { + nestedObj: { + num: 12 + }, + str: "test" + }, + strVal: "test string", + dateVal: new Date(), + numVal: 12345, + boolVal: true + } + + beforeEach(() => { + methodUnderTest = autoMocker["mockValue"]; + }); + + it("should return undefined", () => { + const res = methodUnderTest.call(autoMocker,"testObject", testObject, "undefVal", 0, 1); + expect(res).toBeUndefined(); + }); + + it("should return an array", () => { + const res = methodUnderTest.call(autoMocker, "testObject", testObject, "arrayVal", 0, 1); + expect(res.length).toEqual(3); + }); + + it("should return original value when depth is equal to maxDepth", () => { + const res = methodUnderTest.call(autoMocker, "testObject", testObject, "arrayVal", 0, 0); + expect(res).toEqual(testObject.arrayVal); + }); + + it("should make function a spy", () => { + const res = methodUnderTest.call(autoMocker, "testObject", testObject, "func", 0, 1) + }) + }); +}); + +// this is only for coverage and coverage errors +describe("TestAutoMocker", () => { + it("should create", () => { + const mock = new TestAutoMocker(); + expect(mock).toBeTruthy(); + }); + + it("should add", () => { + const mock = new TestAutoMocker(); + const res = mock.add(1, 2); + expect(res).toEqual(3); + }); + + it("should get _value", () => { + const mock = new TestAutoMocker(); + const res = mock.Value; + expect(res).toEqual(4); + }); + + it("should set _value", () => { + const mock = new TestAutoMocker(); + mock.Value = 123; + expect(mock.Value).toEqual(123); + }); + + it("should get _value from get only property", () => { + const mock = new TestAutoMocker(); + expect(mock.Values).toEqual(4); + }); - it("should mock a class", () => { - const mockClass = autoMocker.mockClass(TestAutoMocker); - expect(mockClass).toBeDefined(); - }); -}) \ No newline at end of file + it("should set _value from set only property", () => { + const mock = new TestAutoMocker(); + mock.UpdateValues = 123; + expect(mock.Value).toEqual(123); + }) +}) diff --git a/spec/support/istanbul-jasmine.json b/spec/support/istanbul-jasmine.json index 61d4796..183426d 100644 --- a/spec/support/istanbul-jasmine.json +++ b/spec/support/istanbul-jasmine.json @@ -1,7 +1,7 @@ { - "spec_dir": "spec", + "spec_dir": "build-test", "spec_files": [ - "**/*[sS]pec.ts" + "**/*[sS]pec.js" ], "env": { "stopSpecOnExpectationFailure": false, diff --git a/src/autoMocker.ts b/src/autoMocker.ts index ef7b7a1..f26651d 100644 --- a/src/autoMocker.ts +++ b/src/autoMocker.ts @@ -143,7 +143,8 @@ export class AutoMocker { * @return {void} */ public mock(objectName: string, objectToMock: T, maxDepth?: number): void { - if (!!objectToMock && this.isObject(objectToMock) || this.isFunction(objectToMock)) { + /* istanbul ignore else */ + if (!!objectToMock && this.isObject(objectToMock) || /* istanbul ignore next */ this.isFunction(objectToMock)) { this.mockObject(objectName, objectToMock, 0, maxDepth || this.maxDepth); } } @@ -189,12 +190,13 @@ export class AutoMocker { ? returnMap[key] : defaultReturn ) + return; } this.throwNotASpyError('withFirstArgMappedReturn', spyName) } /** - * Applies original implementation functionality to a spy. + * Applies spy functionality to the target spy. Calling the spy will always return undefined * * @param {Function} spy - The spy to apply the callThrough functionality to. * @param {string} [spyName] - The name of the spy. Optional. @@ -261,7 +263,7 @@ export class AutoMocker { spyName?: string ): void { if (this.isSpyLike(spy)) { - spy.and.returnValues(returnValues); + spy.and.returnValues(...returnValues); return; } @@ -479,7 +481,7 @@ export class AutoMocker { definedPropertiesData.push(propertyData); return; } - + /* istanbul ignore else: Not a possible situation */ if (this.isFunction(currentPrototype[memberName])) { methodNames.push(memberName); return; @@ -510,6 +512,7 @@ export class AutoMocker { hasGet: descriptor && this.isFunction(descriptor.get) }; } catch { + /* istanbul ignore next */ return null; } } @@ -524,8 +527,8 @@ export class AutoMocker { */ private addMockDefinedProperty(mock: T, propertyData: IDefinedPropertyData): void { const attributes = { - get: propertyData.hasGet ? () => {} : undefined, - set: propertyData.hasSet ? () => {} : undefined, + get: propertyData.hasGet ? () => {} : /* istanbul ignore next */ undefined, + set: propertyData.hasSet ? () => {} : /* istanbul ignore next */ undefined, configurable: true }; Object.defineProperty(mock, propertyData.propertyName, attributes); @@ -548,14 +551,15 @@ export class AutoMocker { depth: number, maxDepth: number ): void { - // noinspection JSDeprecatedSymbols - if (objectToMock.constructor === HTMLDocument) { + /* istanbul ignore if: will need to revisit this */ + if (this.isFunction(objectToMock)) { + objectToMock = (jasmine.createSpy("fn", objectToMock as unknown as jasmine.Func).and.callThrough() as unknown as T); return; } - const objectKeys = this.getInstancePropertyNames(objectToMock); objectKeys.forEach((key: keyof T & string) => { try { + /* istanbul ignore else */ if (!this.mockAsProperty(objectToMock, key)) { objectToMock[key] = this.mockValue( objectName, @@ -566,6 +570,7 @@ export class AutoMocker { ) } } catch (e) { + /* istanbul ignore next */ console.error( `Unable to mock ${objectName}.${key} with preexisting value of ${objectToMock[key]}` ) @@ -585,6 +590,7 @@ export class AutoMocker { let proto = objectToMock; while (proto && proto !== Object.prototype) { Object.getOwnPropertyNames(proto).forEach((name) => { + /* istanbul ignore else */ if (name !== "constructor") { names.add(name); } @@ -606,7 +612,7 @@ export class AutoMocker { let descriptor: PropertyDescriptor; do { descriptor = Object.getOwnPropertyDescriptor(objectToMock, key); - } while (!descriptor && (objectToMock = Object.getPrototypeOf(objectToMock))); + } while (!descriptor && /* istanbul ignore next */ (objectToMock = Object.getPrototypeOf(objectToMock))); if (descriptor && (descriptor.get || descriptor.set)) { if (descriptor.get && !this.isSpyLike(descriptor.get)) { From 920234affb8d497b85f9c5643c06e158de2d0640 Mon Sep 17 00:00:00 2001 From: Duncan McPherson Date: Mon, 22 Jan 2024 08:53:59 -0700 Subject: [PATCH 5/6] finalizing tests --- .istanbul.yml | 2 +- package.json | 2 +- spec/auto-mocker.spec.ts | 43 ++++++++++++++++++++++++++++++++++------ src/autoMocker.ts | 24 ++++++++++++++-------- 4 files changed, 55 insertions(+), 16 deletions(-) diff --git a/.istanbul.yml b/.istanbul.yml index faabced..9a0a6ba 100644 --- a/.istanbul.yml +++ b/.istanbul.yml @@ -9,4 +9,4 @@ reporting: statements: [75, 95] lines: [75, 95] functions: [75, 95] - branches: [75, 95] \ No newline at end of file + branches: [75, 90] \ No newline at end of file diff --git a/package.json b/package.json index 97d81c1..bb419f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ez-budgets/karma-test-utils", - "version": "0.0.9", + "version": "0.0.10", "description": "", "main": "dist/index.js", "files": [ diff --git a/spec/auto-mocker.spec.ts b/spec/auto-mocker.spec.ts index a331989..0a5c250 100644 --- a/spec/auto-mocker.spec.ts +++ b/spec/auto-mocker.spec.ts @@ -82,12 +82,12 @@ describe("AutoMocker", () => { }); // TODO: need to understand why this doesn't work - xit("should mock a function", () => { - let fn = () => 123; - autoMocker.mock("fn", fn); - console.log(fn) - expect((fn as jasmine.Spy).calls).toBeDefined(); - }); + // xit("should mock a function", () => { + // let fn = () => 123; + // autoMocker.mock("fn", fn); + // console.log(fn) + // expect((fn as jasmine.Spy).calls).toBeDefined(); + // }); }); describe("withCallFake", () => { @@ -214,6 +214,7 @@ describe("AutoMocker", () => { try { autoMocker.withThrows(() => { }); + /* istanbul ignore next */ fail('Should have thrown an error'); } catch (e) { expect((e as Error).message.includes('not an actual spy')).toBeTrue(); @@ -226,6 +227,7 @@ describe("AutoMocker", () => { try { const res = mock.add(2, 3); + /* istanbul ignore next */ fail(`Should have thrown an error instead of receiving value: ${res}`); } catch (e) { expect((e as Error).message).toBe("Test error"); @@ -393,6 +395,7 @@ describe("AutoMocker", () => { } beforeEach(() => { + // @ts-ignore methodUnderTest = autoMocker["mockValue"]; }); @@ -413,6 +416,34 @@ describe("AutoMocker", () => { it("should make function a spy", () => { const res = methodUnderTest.call(autoMocker, "testObject", testObject, "func", 0, 1) + expect((res as jasmine.Spy).calls).toBeDefined(); + }); + + it("should return the spy if method is a spy", () => { + const spy = jasmine.createSpy("func", testObject.func); + testObject.func = spy + const res = methodUnderTest.call(autoMocker, "test", testObject, "func", 0, 1); + expect(res).toEqual(spy); + }); + + it("should return the object", () => { + const res = methodUnderTest.call(autoMocker, "test", testObject, "objVal", 0, 0) + expect(res).toEqual(testObject.objVal); + }); + + it("should return a truncated object", () => { + const res = methodUnderTest.call(autoMocker, "test", testObject, "deepObjVal", 0, 1); + expect(res).toBeTruthy(); + }); + + it("should return a string", () => { + const res = methodUnderTest.call(autoMocker, "test", testObject, "strVal", 0, 1); + expect(res).toBeTruthy(); + }); + + it("should return a date", () => { + const res = methodUnderTest.call(autoMocker, "test", testObject, "dateVal", 0, 0); + expect(typeof res).toEqual("object"); }) }); }); diff --git a/src/autoMocker.ts b/src/autoMocker.ts index f26651d..a0fedbb 100644 --- a/src/autoMocker.ts +++ b/src/autoMocker.ts @@ -543,14 +543,14 @@ export class AutoMocker { * @param {number} depth - The current depth of recursion. * @param {number} maxDepth - The maximum depth of recursion. * @private - * @returns {void} + * @returns {T[keyof T]} */ private mockObject( objectName: string, objectToMock: T, depth: number, maxDepth: number - ): void { + ): T { /* istanbul ignore if: will need to revisit this */ if (this.isFunction(objectToMock)) { objectToMock = (jasmine.createSpy("fn", objectToMock as unknown as jasmine.Func).and.callThrough() as unknown as T); @@ -567,7 +567,7 @@ export class AutoMocker { key, depth++, maxDepth - ) + ); } } catch (e) { /* istanbul ignore next */ @@ -575,7 +575,8 @@ export class AutoMocker { `Unable to mock ${objectName}.${key} with preexisting value of ${objectToMock[key]}` ) } - }) + }); + return objectToMock; } /** @@ -634,7 +635,7 @@ export class AutoMocker { * @param {keyof T} key - The key of the property to mock. * @param {number} depth - The current depth of recursion. * @param {number} maxDepth - The maximum depth of recursion. - * @returns {any} - The mocked value. + * @returns {T[keyof T & string]} - The mocked value. * @private */ private mockValue( @@ -643,36 +644,43 @@ export class AutoMocker { key: keyof T, depth: number, maxDepth: number - ): any { + ): T[keyof T & string] { const value = objectToMock[key]; if (this.isUndefined(value) || value === null) { + // @ts-ignore return value; } if (Array.isArray(value)) { + // @ts-ignore return depth < maxDepth ? value.map((item, i) => this.mockValue(`${objectName}[${i}]`, value, i as any, depth++, maxDepth) ) : value; } if (this.isFunction(value)) { + // @ts-ignore return this.isSpyLike(value) ? value : spyOn(objectToMock, key as T[keyof T] extends Function ? keyof T : never) } if (this.isObject(value)) { + // @ts-ignore return depth < maxDepth - ? this.mockObject(`${objectName}.${String(key)}`, value, depth++, maxDepth) + ? this.mockObject(`${objectName}.${String(key)}`, value, ++depth, maxDepth) : value; } if (this.isString(value)) { + // @ts-ignore return `${objectName}.${String(key)}` + this.generateNumber().toString(); } if (this.isDate(value)) { + // @ts-ignore return new Date(2000, 1, 1, 1, 1, 1, 1); } if (this.isNumber(value)) { + // @ts-ignore return this.generateNumber(); } return value; @@ -747,7 +755,7 @@ export class AutoMocker { * @private */ private isObject(value: any): value is Object { - return value !== null && typeof value === 'object'; + return value !== null && typeof value === 'object'; } /** From 743d8eccaf66e4e0a1c17006b5e2c4a3a8e8a2ca Mon Sep 17 00:00:00 2001 From: Duncan McPherson Date: Mon, 22 Jan 2024 08:58:23 -0700 Subject: [PATCH 6/6] removing extra files --- .gitignore | 4 +++- package.json | 2 +- spec/auto-mocker.spec.js | 16 ---------------- spec/auto-mocker.spec.js.map | 1 - 4 files changed, 4 insertions(+), 19 deletions(-) delete mode 100644 spec/auto-mocker.spec.js delete mode 100644 spec/auto-mocker.spec.js.map diff --git a/.gitignore b/.gitignore index aecb73e..49562a7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ dist/ **/*.tgz test-results/ coverage/ -build-test/ \ No newline at end of file +build-test/ + +**/*.map \ No newline at end of file diff --git a/package.json b/package.json index bb419f7..42b7fc2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ez-budgets/karma-test-utils", - "version": "0.0.10", + "version": "0.1.0", "description": "", "main": "dist/index.js", "files": [ diff --git a/spec/auto-mocker.spec.js b/spec/auto-mocker.spec.js deleted file mode 100644 index 97b21a0..0000000 --- a/spec/auto-mocker.spec.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const autoMocker_1 = require("../src/autoMocker"); -class TestAutoMocker { -} -describe("AutoMocker", () => { - let autoMocker; - beforeEach(() => { - autoMocker = new autoMocker_1.AutoMocker(); - }); - it("should mock a class", () => { - const mockClass = autoMocker.mockClass(TestAutoMocker); - expect(mockClass).toBeDefined(); - }); -}); -//# sourceMappingURL=auto-mocker.spec.js.map \ No newline at end of file diff --git a/spec/auto-mocker.spec.js.map b/spec/auto-mocker.spec.js.map deleted file mode 100644 index 8978c75..0000000 --- a/spec/auto-mocker.spec.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"auto-mocker.spec.js","sourceRoot":"","sources":["auto-mocker.spec.ts"],"names":[],"mappings":";;AAAA,kDAA+C;AAE/C,MAAM,cAAc;CAAG;AAEvB,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC3B,IAAI,UAAsB,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACZ,UAAU,GAAG,IAAI,uBAAU,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC3B,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAA"} \ No newline at end of file