├── .gitignore ├── src ├── creational │ ├── abstract │ │ ├── abstract.ts │ │ └── abstract.test.ts │ ├── singleton │ │ ├── singleton.test.ts │ │ └── singleton.ts │ ├── builder │ │ ├── builder.test.ts │ │ └── builder.ts │ ├── factory │ │ ├── factory.test.ts │ │ ├── route.ts │ │ └── factory.ts │ └── prototype │ │ ├── prototype.test.ts │ │ └── prototype.ts ├── structural │ ├── adapter │ │ ├── external-pkg.ts │ │ ├── adapter.test.ts │ │ └── adapter.ts │ ├── flyweight │ │ ├── flyweight.test.ts │ │ └── flyweight.ts │ ├── facade │ │ ├── facade-fn.test.ts │ │ ├── facade-fn.ts │ │ ├── facade.test.ts │ │ └── facade.ts │ ├── bridge │ │ ├── bridge.test.ts │ │ └── bridge.ts │ ├── composite │ │ ├── composite.test.ts │ │ └── composite.ts │ ├── proxy │ │ ├── proxy.ts │ │ └── proxy.test.ts │ └── decorator │ │ ├── decorator.test.ts │ │ └── decorator.ts ├── behavioral │ └── command │ │ ├── command.test.ts │ │ └── command.ts └── architectural │ └── circuit-breaker │ ├── circuit-breaker.test.ts │ └── circuit-breaker.ts ├── .vscode └── extensions.json ├── jest.config.js ├── tsconfig.json ├── package.json ├── LICENSE ├── README.md └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /src/creational/abstract/abstract.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/creational/abstract/abstract.test.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "orta.vscode-jest", 4 | "firsttris.vscode-jest-runner", 5 | "andys8.jest-snippets", 6 | "aaron-bond.better-comments" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | preset: "ts-jest", 3 | testEnvironment: "node", 4 | testMatch: ["**/?(*.)+(spec|test).+(ts|js)"], 5 | transform: { 6 | "^.+\\.(ts)$": "ts-jest", 7 | }, 8 | moduleNameMapper: { 9 | "@/(.*)": "/src/$1", 10 | }, 11 | }; 12 | -------------------------------------------------------------------------------- /src/structural/adapter/external-pkg.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * There is an external package to post on Instragram, 3 | * and we want to adapt it to out design. 4 | */ 5 | export class ExternalInstagramPackage { 6 | constructor() {} 7 | 8 | postWithDifferentName(): void { 9 | console.log(`Posting to Insagram...`); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "commonjs", 5 | "sourceMap": true, 6 | "strict": true, 7 | "esModuleInterop": true, 8 | "skipLibCheck": true, 9 | "forceConsistentCasingInFileNames": true, 10 | "baseUrl": "./", 11 | "paths": { 12 | "@/*": ["src/*"] 13 | } 14 | }, 15 | "exclude": ["node_modules"] 16 | } 17 | -------------------------------------------------------------------------------- /src/structural/flyweight/flyweight.test.ts: -------------------------------------------------------------------------------- 1 | import { LetterFactory } from "./flyweight"; 2 | 3 | describe("Flyweight Pattern", () => { 4 | let letterFactory: LetterFactory; 5 | 6 | beforeEach(() => { 7 | letterFactory = new LetterFactory(); 8 | }); 9 | 10 | it("creates letters and ensure reuse", () => { 11 | letterFactory.createLetter("h").draw(0, 0); 12 | letterFactory.createLetter("e").draw(0, 1); 13 | letterFactory.createLetter("l").draw(0, 2); 14 | letterFactory.createLetter("l").draw(0, 3); 15 | letterFactory.createLetter("o").draw(0, 4); 16 | 17 | 18 | // hello lenght is 5 but it takse a `l` from the cache, 19 | // so the letter count is 4 20 | expect(letterFactory.getLetterCount()).toBe(4); 21 | expect(letterFactory.getLetters()).toEqual(["h", "e", "l", "o"]); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "patterns", 3 | "version": "1.0.0", 4 | "description": "TypeScript design patterns", 5 | "type": "module", 6 | "types": "dist/index.d.ts", 7 | "main": "dist/index.js", 8 | "scripts": { 9 | "build": "tsc", 10 | "lint": "eslint ./src --ext .ts", 11 | "prettier": "prettier \"**/*.+(json|ts)\"", 12 | "format:check": "npm run prettier -- --check", 13 | "format:fix": "npm run prettier -- --write", 14 | "test": "jest" 15 | }, 16 | "keywords": [ 17 | "patterns", 18 | "design-patterns", 19 | "typescript" 20 | ], 21 | "author": "Behzad Ali Mohammad Zad", 22 | "license": "MIT", 23 | "devDependencies": { 24 | "@types/jest": "^29.5.12", 25 | "eslint": "^9.9.0", 26 | "jest": "^29.7.0", 27 | "ts-jest": "^29.2.4", 28 | "typescript": "^5.5.4" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/structural/facade/facade-fn.test.ts: -------------------------------------------------------------------------------- 1 | import { facade, ServiceA, ServiceB, ServiceC } from "./facade-fn"; 2 | 3 | describe("Facade Pattern (Function)", () => { 4 | let serviceA: ServiceA; 5 | let serviceB: ServiceB; 6 | let serviceC: ServiceC; 7 | let facadeInstance: ReturnType; 8 | 9 | beforeEach(() => { 10 | serviceA = { methodA: jest.fn() }; 11 | serviceB = { methodB: jest.fn() }; 12 | serviceC = { methodC: jest.fn() }; 13 | facadeInstance = facade(serviceA, serviceB, serviceC); 14 | }); 15 | 16 | afterEach(() => { 17 | jest.clearAllMocks(); 18 | }); 19 | 20 | it("calls all service methods when execute is called", () => { 21 | facadeInstance.execute(); 22 | 23 | expect(serviceA.methodA).toHaveBeenCalledTimes(1); 24 | expect(serviceB.methodB).toHaveBeenCalledTimes(1); 25 | expect(serviceC.methodC).toHaveBeenCalledTimes(1); 26 | }); 27 | }); 28 | -------------------------------------------------------------------------------- /src/creational/singleton/singleton.test.ts: -------------------------------------------------------------------------------- 1 | import { Singleton } from "./singleton"; 2 | 3 | describe("Singleton", () => { 4 | class TestClass1 {} 5 | class TestClass2 {} 6 | 7 | it("creates only one instance of a class", () => { 8 | const instance1 = Singleton.getInstance(TestClass1); 9 | const instance2 = Singleton.getInstance(TestClass1); 10 | expect(instance1).toBe(instance2); 11 | }); 12 | 13 | it("creates different instances for different classes", () => { 14 | const instance1 = Singleton.getInstance(TestClass1); 15 | const instance2 = Singleton.getInstance(TestClass2); 16 | expect(instance1).not.toBe(instance2); 17 | }); 18 | 19 | it("creates instances of the correct type", () => { 20 | const instance1 = Singleton.getInstance(TestClass1); 21 | const instance2 = Singleton.getInstance(TestClass2); 22 | expect(instance1).toBeInstanceOf(TestClass1); 23 | expect(instance2).toBeInstanceOf(TestClass2); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/structural/bridge/bridge.test.ts: -------------------------------------------------------------------------------- 1 | import { Circle, DrawingAPI1, DrawingAPI2 } from "./bridge"; 2 | describe("Bridge Pattern", () => { 3 | let consoleLogSpy: jest.SpyInstance; 4 | 5 | beforeEach(() => { 6 | consoleLogSpy = jest.spyOn(console, "log").mockImplementation(); 7 | }); 8 | 9 | afterEach(() => { 10 | consoleLogSpy.mockRestore(); 11 | }); 12 | 13 | it("draws a circle using DrawingAPI1", () => { 14 | const drawingAPI = new DrawingAPI1(); 15 | const circle = new Circle(10, 20, 5, drawingAPI); 16 | circle.draw(); 17 | expect(consoleLogSpy).toHaveBeenCalledWith( 18 | "Drawing a circle at (10, 20) with radius 5 V1" 19 | ); 20 | }); 21 | 22 | it("draws a circle using DrawingAPI2", () => { 23 | const drawingAPI = new DrawingAPI2(); 24 | const circle = new Circle(15, 25, 8, drawingAPI); 25 | circle.draw(); 26 | expect(consoleLogSpy).toHaveBeenCalledWith( 27 | "Drawing a circle at (15, 25) with radius 8 V2" 28 | ); 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /src/creational/builder/builder.test.ts: -------------------------------------------------------------------------------- 1 | import { DialogBuilder } from "./builder"; 2 | 3 | describe("Builder Pattern", () => { 4 | const mockOnOpen = jest.fn(); 5 | const mockOnClose = jest.fn(); 6 | 7 | it("creates a dialog with the correct title and description", () => { 8 | const dialogBuilder = new DialogBuilder(); 9 | const dialog = dialogBuilder 10 | .setTitle("My Dialog") 11 | .setDescription("This is my dialog") 12 | .setModal(true) 13 | .onOpen(mockOnOpen) 14 | .onClose(mockOnClose) 15 | .build(); 16 | 17 | expect(dialog.options.title).toBe("My Dialog"); 18 | expect(dialog.options.description).toBe("This is my dialog"); 19 | expect(dialog.options.modal).toBe(true); 20 | 21 | dialog.open(); 22 | expect(mockOnOpen).toHaveBeenCalled(); 23 | 24 | dialog.close(); 25 | expect(mockOnClose).toHaveBeenCalled(); 26 | 27 | expect(dialog.toString()).toBe( 28 | "Title: My Dialog, Description: This is my dialog, Modal: true" 29 | ); 30 | }); 31 | }); 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Behzad Ali Mohammad Zad 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/structural/facade/facade-fn.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Represents a service with a `methodA` function that performs some operation. 3 | */ 4 | type ServiceA = { 5 | methodA: () => void; 6 | }; 7 | 8 | /** 9 | * Represents a service with a `methodB` function that performs some operation. 10 | */ 11 | type ServiceB = { 12 | methodB: () => void; 13 | }; 14 | 15 | /** 16 | * Represents a service with a `methodC` function that performs some operation. 17 | */ 18 | type ServiceC = { 19 | methodC: () => void; 20 | }; 21 | 22 | /** 23 | * Facade Pattern (Function) 24 | * This pattern is useful for providing a high-level API that hides the complexity of the underlying system. 25 | */ 26 | function facade(serviceA: ServiceA, serviceB: ServiceB, serviceC: ServiceC) { 27 | return { 28 | execute: () => { 29 | serviceA.methodA(); 30 | serviceB.methodB(); 31 | serviceC.methodC(); 32 | }, 33 | }; 34 | } 35 | 36 | // Example usage: 37 | // const facadeInstance = facade( 38 | // { methodA: () => console.log("Method A") }, 39 | // { methodB: () => console.log("Method B") }, 40 | // { methodC: () => console.log("Method C") } 41 | // ); 42 | // facadeInstance.execute(); 43 | 44 | export { facade }; 45 | export type { ServiceA, ServiceB, ServiceC }; 46 | -------------------------------------------------------------------------------- /src/creational/factory/factory.test.ts: -------------------------------------------------------------------------------- 1 | import { Param, RouteFactory, RouteType } from "./factory"; 2 | import { FastestRouteAlgorithm, LatLng, ScenicRouteAlgorithm, ShortestRouteAlgorithm } from "./route"; 3 | 4 | describe("RouteFactory", () => { 5 | let routeFactory: RouteFactory; 6 | const from: LatLng = { lat: 0, lng: 0 }; 7 | const to: LatLng = { lat: 1, lng: 1 }; 8 | 9 | beforeEach(() => { 10 | routeFactory = new RouteFactory(); 11 | }); 12 | 13 | it("creates a ShortestRouteAlgorithm when type is Shortest", () => { 14 | const params: Param = { type: RouteType.Shortest, from, to }; 15 | const result = routeFactory.create(params); 16 | expect(result).toBeInstanceOf(ShortestRouteAlgorithm); 17 | }); 18 | 19 | it("creates a FastestRouteAlgorithm when type is Fastest", () => { 20 | const params: Param = { type: RouteType.Fastest, from, to }; 21 | const result = routeFactory.create(params); 22 | expect(result).toBeInstanceOf(FastestRouteAlgorithm); 23 | }); 24 | 25 | it("creates a ScenicRouteAlgorithm when type is Scenic", () => { 26 | const params: Param = { type: RouteType.Scenic, from, to }; 27 | const result = routeFactory.create(params); 28 | expect(result).toBeInstanceOf(ScenicRouteAlgorithm); 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /src/structural/composite/composite.test.ts: -------------------------------------------------------------------------------- 1 | import { MenuComposite, MenuImage, MenuItem, MenuSeparator } from "./composite"; 2 | 3 | describe("Composite Pattern", () => { 4 | let menuComposite: MenuComposite; 5 | let consoleSpy: jest.SpyInstance; 6 | 7 | beforeEach(() => { 8 | menuComposite = new MenuComposite("Main Menu", []); 9 | consoleSpy = jest.spyOn(console, "log"); 10 | }); 11 | 12 | afterEach(() => { 13 | consoleSpy.mockRestore(); 14 | }); 15 | 16 | it("handles mixed menu items", () => { 17 | const menuItem = new MenuItem("Food Item", "Delicious food"); 18 | const menuSeparator = new MenuSeparator(); 19 | const menuImage = new MenuImage("Food Image", "food.jpg"); 20 | 21 | menuComposite.add(menuItem); 22 | menuComposite.add(menuSeparator); 23 | menuComposite.add(menuImage); 24 | 25 | menuComposite.display(); 26 | 27 | expect(consoleSpy).toHaveBeenCalledTimes(4); 28 | expect(consoleSpy).toHaveBeenNthCalledWith(1, "- Main Menu"); 29 | expect(consoleSpy).toHaveBeenNthCalledWith( 30 | 2, 31 | "- Food Item: Delicious food" 32 | ); 33 | expect(consoleSpy).toHaveBeenNthCalledWith(3, "-------------------"); 34 | expect(consoleSpy).toHaveBeenNthCalledWith(4, "- Food Image: food.jpg"); 35 | }); 36 | }); 37 | -------------------------------------------------------------------------------- /src/structural/adapter/adapter.test.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ExternalInstagramPackage, 3 | Facebook, 4 | InstagramAdapter, 5 | LinkeIn, 6 | Scheduler, 7 | } from "./adapter"; 8 | 9 | describe("Adapter Pattern", () => { 10 | let consoleSpy: jest.SpyInstance; 11 | 12 | beforeEach(() => { 13 | consoleSpy = jest.spyOn(console, "log").mockImplementation(); 14 | }); 15 | 16 | afterEach(() => { 17 | consoleSpy.mockRestore(); 18 | }); 19 | 20 | it("schedules posts for different social media platforms", () => { 21 | const scheduler = new Scheduler(); 22 | const facebook = new Facebook(); 23 | const linkedIn = new LinkeIn(); 24 | const instagramAdapter = new InstagramAdapter( 25 | new ExternalInstagramPackage() 26 | ); 27 | 28 | scheduler.schedule(facebook); 29 | scheduler.schedule(linkedIn); 30 | scheduler.schedule(instagramAdapter); 31 | 32 | expect(consoleSpy).toHaveBeenNthCalledWith(1, "Posting to social media..."); 33 | expect(consoleSpy).toHaveBeenNthCalledWith(2, "Posting to Facebook..."); 34 | expect(consoleSpy).toHaveBeenNthCalledWith(3, "Posting to social media..."); 35 | expect(consoleSpy).toHaveBeenNthCalledWith(4, "Posting to LinkeIn..."); 36 | expect(consoleSpy).toHaveBeenNthCalledWith(5, "Posting to social media..."); 37 | }); 38 | }); 39 | -------------------------------------------------------------------------------- /src/creational/singleton/singleton.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * For a reqular Singleton pattern you should write a new class for each type you want to have a singleton of. 3 | * 4 | * @example 5 | * ```ts 6 | * class Singleton { 7 | * private static instance: Singleton | null = null; 8 | * private constructor() {} 9 | * 10 | * public static getInstance(): Singleton { 11 | * if (!Singleton.instance) { 12 | * Singleton.instance = new Singleton(); 13 | * } 14 | * return Singleton.instance; 15 | * } 16 | * } 17 | * 18 | * 19 | * const singleton1 = Singleton.getInstance(); 20 | * const singleton2 = Singleton.getInstance(); 21 | * console.log(singleton1 === singleton2); // Output: true 22 | * 23 | * ``` 24 | * However, for the sake of simplicity, we will use the same class for all types. 25 | * In TypeScript we can't do it: 26 | * ```ts 27 | * class Singleton { 28 | * // We get error here: 29 | * private static instance: T | null = null; 30 | * } 31 | */ 32 | export class Singleton { 33 | private static instances: Map = new Map(); 34 | private constructor() {} 35 | 36 | public static getInstance(type: new () => T): T { 37 | if (!Singleton.instances.has(type)) { 38 | Singleton.instances.set(type, new type()); 39 | } 40 | return Singleton.instances.get(type); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/structural/facade/facade.test.ts: -------------------------------------------------------------------------------- 1 | import { UserFacade } from "./facade"; 2 | 3 | describe("UserFacade Pattern", () => { 4 | let userFacade: UserFacade; 5 | let authServiceMock: jest.SpyInstance; 6 | let emailServiceMock: jest.SpyInstance; 7 | let smsServiceMock: jest.SpyInstance; 8 | let historyServiceMock: jest.SpyInstance; 9 | 10 | beforeEach(() => { 11 | userFacade = new UserFacade(); 12 | authServiceMock = jest.spyOn(userFacade["authService"], "login"); 13 | emailServiceMock = jest.spyOn(userFacade["emailService"], "sendEmail"); 14 | smsServiceMock = jest.spyOn(userFacade["smsService"], "sendSms"); 15 | historyServiceMock = jest.spyOn(userFacade["historyService"], "log"); 16 | }); 17 | 18 | afterEach(() => { 19 | jest.clearAllMocks(); 20 | }); 21 | 22 | it("calls all services when login is successful", () => { 23 | authServiceMock.mockReturnValue(true); 24 | 25 | const result = userFacade.login("testuser", "password123"); 26 | 27 | expect(result).toBe(true); 28 | expect(authServiceMock).toHaveBeenCalledWith("testuser", "password123"); 29 | expect(emailServiceMock).toHaveBeenCalledWith( 30 | "testuser", 31 | "Login successful" 32 | ); 33 | expect(smsServiceMock).toHaveBeenCalledWith("testuser", "Login successful"); 34 | expect(historyServiceMock).toHaveBeenCalledWith( 35 | "testuser", 36 | "Login successful" 37 | ); 38 | }); 39 | }); 40 | -------------------------------------------------------------------------------- /src/structural/proxy/proxy.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Defines an interface for an object storage system that can load objects by key. 3 | */ 4 | interface ObjectStorage { 5 | load(key: string): string | null; 6 | } 7 | 8 | /** 9 | * Provides a remote object storage implementation that loads objects from a remote server. 10 | * TODO: This must be implemented 11 | */ 12 | class RemoteObjectStorage implements ObjectStorage { 13 | constructor(private readonly key: string) {} 14 | // Load from a remote server 15 | load(key: string): string | null { 16 | return `Image URL For: (${this.key})`; 17 | } 18 | } 19 | 20 | /** 21 | * Provides a caching proxy for an ObjectStorage implementation, 22 | * loading objects from a remote storage and caching the results, 23 | * instead of loading them from the remote storage every time. 24 | */ 25 | class CachedObjectStorage implements ObjectStorage { 26 | private cached: Map = new Map(); 27 | constructor(private readonly remote: ObjectStorage) {} 28 | 29 | load(key: string): string | null { 30 | // If the key is in the cache, return it 31 | if (this.cached.has(key)) { 32 | return this.cached.get(key)!; 33 | } 34 | // If the key is not in the cache, load it from the remote storage 35 | const value = this.remote.load(key); 36 | this.cached.set(key, value); 37 | return value; 38 | } 39 | } 40 | 41 | export { CachedObjectStorage, ObjectStorage }; 42 | -------------------------------------------------------------------------------- /src/structural/proxy/proxy.test.ts: -------------------------------------------------------------------------------- 1 | import { CachedObjectStorage, ObjectStorage } from "./proxy"; 2 | 3 | describe("Proxy Pattern", () => { 4 | let remoteStorage: jest.Mocked; 5 | let cachedStorage: CachedObjectStorage; 6 | 7 | beforeEach(() => { 8 | remoteStorage = { 9 | load: jest.fn(), 10 | }; 11 | cachedStorage = new CachedObjectStorage(remoteStorage); 12 | }); 13 | 14 | it("loads from remote storage when key is not cached", () => { 15 | // Mock the remote storage to return a value 16 | remoteStorage.load.mockReturnValue("Remote Value"); 17 | // Load the value 18 | const result = cachedStorage.load("key1"); 19 | // The result should be the value returned by the remote storage 20 | expect(result).toBe("Remote Value"); 21 | // The remote storage should have been called once 22 | expect(remoteStorage.load).toHaveBeenCalledWith("key1"); 23 | }); 24 | 25 | it("returns cached value when key is already cached", () => { 26 | // Mock the remote storage to return a value 27 | remoteStorage.load.mockReturnValue("Remote Value"); 28 | // Load the value once 29 | cachedStorage.load("key1"); 30 | // The second call to load should not call the remote storage 31 | const result = cachedStorage.load("key1"); 32 | // The result should be the value returned by the remote storage 33 | expect(result).toBe("Remote Value"); 34 | // The remote storage should have been called once 35 | expect(remoteStorage.load).toHaveBeenCalledTimes(1); 36 | }); 37 | }); 38 | -------------------------------------------------------------------------------- /src/creational/prototype/prototype.test.ts: -------------------------------------------------------------------------------- 1 | import { Note, TextDocument } from "./prototype"; 2 | 3 | describe("Prototype Pattern", () => { 4 | it("clones a TextDocument with its notes correctly", () => { 5 | const originalDocument = new TextDocument("Original text", [ 6 | new Note("Note 1"), 7 | new Note("Note 2"), 8 | ]); 9 | const clonedDocument = originalDocument.clone(); 10 | 11 | // Check if the cloned document is an instance of TextDocument 12 | expect(clonedDocument).toBeInstanceOf(TextDocument); 13 | // Check if the cloned document is not the same instance as the original 14 | expect(clonedDocument).not.toBe(originalDocument); 15 | // Check if the cloned document has the same text as the original 16 | expect(clonedDocument["text"]).toBe(originalDocument["text"]); 17 | // Check if the cloned document has the same number of notes as the original 18 | expect(clonedDocument["notes"]).toHaveLength( 19 | originalDocument["notes"].length 20 | ); 21 | 22 | // Check if the notes are cloned correctly 23 | expect(clonedDocument["notes"][0]).not.toBe(originalDocument["notes"][0]); 24 | expect(clonedDocument["notes"][1]).not.toBe(originalDocument["notes"][1]); 25 | 26 | // Check if the cloned notes have the same content as the original notes 27 | expect(clonedDocument["notes"][0].message).toBe( 28 | originalDocument["notes"][0].message 29 | ); 30 | expect(clonedDocument["notes"][1].message).toBe( 31 | originalDocument["notes"][1].message 32 | ); 33 | }); 34 | }); 35 | -------------------------------------------------------------------------------- /src/structural/flyweight/flyweight.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Represents a character that can be drawn on the screen. 3 | */ 4 | interface Letter { 5 | draw(row: number, col: number): void; 6 | getChar(): string; 7 | } 8 | 9 | /** 10 | * Represents a single character that can be drawn on the screen. 11 | * This class implements the `Letter` interface to provide a consistent 12 | * drawing API for characters. 13 | */ 14 | class Character implements Letter { 15 | private char: string; 16 | constructor(char: string) { 17 | this.char = char; 18 | } 19 | 20 | draw(row: number, col: number): void { 21 | console.log(`Drawing ${this.char} at ${row}, ${col}`); 22 | } 23 | 24 | getChar(): string { 25 | return this.char; 26 | } 27 | } 28 | 29 | /** 30 | * A factory class that manages the creation and reuse of `Letter` objects. 31 | * This class implements the Flyweight pattern to optimize memory usage by 32 | * sharing common `Letter` instances. 33 | */ 34 | class LetterFactory { 35 | private letters: { [key: string]: Letter } = {}; 36 | constructor() {} 37 | 38 | createLetter(char: string): Letter { 39 | if (!this.letters[char]) { 40 | this.letters[char] = new Character(char); 41 | } 42 | return this.letters[char]; 43 | } 44 | 45 | getLetterCount(): number { 46 | return Object.keys(this.letters).length; 47 | } 48 | 49 | getLetters(): string[] { 50 | return Object.values(this.letters).map((letter) => letter.getChar()); 51 | } 52 | 53 | //... Other APIs 54 | } 55 | 56 | export { Character, Letter, LetterFactory }; 57 | -------------------------------------------------------------------------------- /src/structural/bridge/bridge.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Defines an interface for shapes that can be drawn. 3 | */ 4 | interface Shape { 5 | draw(): void; 6 | } 7 | 8 | /** 9 | * Defines an interface for drawing with different implementations. 10 | */ 11 | interface DrawingAPI { 12 | drawCircle(x: number, y: number, radius: number): void; 13 | } 14 | 15 | /** 16 | * Version 1 of the drawing API. 17 | */ 18 | class DrawingAPI1 implements DrawingAPI { 19 | drawCircle(x: number, y: number, radius: number): void { 20 | console.log(`Drawing a circle at (${x}, ${y}) with radius ${radius} V1`); 21 | } 22 | } 23 | 24 | /** 25 | * Version 2 of the drawing API. 26 | */ 27 | class DrawingAPI2 implements DrawingAPI { 28 | drawCircle(x: number, y: number, radius: number): void { 29 | console.log(`Drawing a circle at (${x}, ${y}) with radius ${radius} V2`); 30 | } 31 | } 32 | 33 | /** 34 | * Represents a circle shape that can be drawn using a specific drawing API. 35 | */ 36 | class Circle implements Shape { 37 | private x: number; 38 | private y: number; 39 | private radius: number; 40 | /** 41 | * Holds the drawing API implementation that will be used to draw the circle. 42 | */ 43 | private drawingAPI: DrawingAPI; 44 | constructor(x: number, y: number, radius: number, drawingAPI: DrawingAPI) { 45 | this.x = x; 46 | this.y = y; 47 | this.radius = radius; 48 | this.drawingAPI = drawingAPI; 49 | } 50 | 51 | draw(): void { 52 | this.drawingAPI.drawCircle(this.x, this.y, this.radius); 53 | } 54 | } 55 | 56 | export { Circle, DrawingAPI, DrawingAPI1, DrawingAPI2, Shape }; 57 | -------------------------------------------------------------------------------- /src/structural/decorator/decorator.test.ts: -------------------------------------------------------------------------------- 1 | import { DataSourceWithMeasureDecorator, FileDataSource } from "./decorator"; 2 | 3 | describe("Decorator Pattern", () => { 4 | let consoleLogSpy: jest.SpyInstance; 5 | let performanceNowSpy: jest.SpyInstance; 6 | 7 | beforeEach(() => { 8 | consoleLogSpy = jest.spyOn(console, "log").mockImplementation(); 9 | performanceNowSpy = jest.spyOn(performance, "now").mockReturnValue(0); 10 | }); 11 | 12 | afterEach(() => { 13 | consoleLogSpy.mockRestore(); 14 | performanceNowSpy.mockRestore(); 15 | }); 16 | 17 | it("measures read time", () => { 18 | const fileDataSource = new FileDataSource("test.txt"); 19 | const decoratedDataSource = new DataSourceWithMeasureDecorator( 20 | fileDataSource 21 | ); 22 | 23 | performanceNowSpy.mockReturnValueOnce(0).mockReturnValueOnce(100); 24 | 25 | const result = decoratedDataSource.readData(); 26 | 27 | expect(result).toBe("Reading data from test.txt"); 28 | expect(consoleLogSpy).toHaveBeenCalledWith("Read time: 100 ms"); 29 | }); 30 | 31 | it("measures write time", () => { 32 | const fileDataSource = new FileDataSource("test.txt"); 33 | const decoratedDataSource = new DataSourceWithMeasureDecorator( 34 | fileDataSource 35 | ); 36 | 37 | performanceNowSpy.mockReturnValueOnce(0).mockReturnValueOnce(50); 38 | 39 | decoratedDataSource.writeData("Test data"); 40 | 41 | expect(consoleLogSpy).toHaveBeenCalledWith( 42 | "Writing data to test.txt: Test data" 43 | ); 44 | expect(consoleLogSpy).toHaveBeenCalledWith("Write time: 50 ms"); 45 | }); 46 | }); 47 | -------------------------------------------------------------------------------- /src/structural/decorator/decorator.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Defines the contract for a data source that can read and write data. 3 | */ 4 | interface DataSource { 5 | readData(): string; 6 | writeData(data: string): void; 7 | } 8 | 9 | /** 10 | * Implements the `DataSource` interface by reading and writing data to a file. 11 | */ 12 | class FileDataSource implements DataSource { 13 | private filename: string; 14 | constructor(filename: string) { 15 | this.filename = filename; 16 | } 17 | readData(): string { 18 | return `Reading data from ${this.filename}`; 19 | } 20 | writeData(data: string): void { 21 | console.log(`Writing data to ${this.filename}: ${data}`); 22 | } 23 | } 24 | 25 | /** 26 | * Decorator that measures the time it takes to read and write data using the wrapped `DataSource`. 27 | * This decorator can be used to add performance measurement capabilities to any `DataSource` implementation. 28 | */ 29 | class DataSourceWithMeasureDecorator implements DataSource { 30 | protected wrappee: DataSource; 31 | constructor(source: DataSource) { 32 | this.wrappee = source; 33 | } 34 | 35 | readData(): string { 36 | const startTime = performance.now(); 37 | const result = this.wrappee.readData(); 38 | const endTime = performance.now(); 39 | const measure = endTime - startTime; 40 | console.log(`Read time: ${measure} ms`); 41 | return result; 42 | } 43 | 44 | writeData(data: string): void { 45 | const startTime = performance.now(); 46 | this.wrappee.writeData(data); 47 | const endTime = performance.now(); 48 | const measure = endTime - startTime; 49 | console.log(`Write time: ${measure} ms`); 50 | } 51 | } 52 | 53 | export { DataSource, DataSourceWithMeasureDecorator, FileDataSource }; 54 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TypeScript Design Patterns 2 | 3 | A curated collection of TypeScript design patterns, implemented and explained for easy understanding and implementation. 4 | 5 | ## Introduction 6 | 7 | This repository provides practical examples of common design patterns in TypeScript. Each pattern includes a detailed explanation, code implementation, and usage scenarios. 8 | 9 | ## Patterns Included 10 | 11 | - Creational Patterns 12 | - [Factory Method](src/creational/factory/factory.ts) 13 | - Abstract Factory 14 | - [Singleton](src/creational/singleton/singleton.ts) 15 | - [Builder](src/creational/builder/builder.ts) 16 | - [Prototype](src/creational/prototype/prototype.ts) 17 | - Structural Patterns 18 | - [Adapter](src/structural/adapter/adapter.ts) 19 | - [Bridge](src/structural/bridge/bridge.ts) 20 | - [Composite](src/structural/composite/composite.ts) 21 | - [Decorator](src/structural/decorator/decorator.ts) 22 | - [Facade](src/structural/facade/facade.ts) 23 | - [P5.js Example Live](https://editor.p5js.org/behzad.am/full/Z_cxjFuwt) 24 | - [Flyweight](src/structural/flyweight/flyweight.ts) 25 | - [P5.js Example Live](https://editor.p5js.org/behzad.am/full/eTARZLkof) 26 | - [Proxy](src/structural/proxy/proxy.ts) 27 | - Behavioral Patterns 28 | - Strategy 29 | - Observer 30 | - Iterator 31 | - Template Method 32 | - [Command](src/behavioral/command/command.ts) 33 | - [P5.js Example Live](https://editor.p5js.org/behzad.am/sketches/Nu8dD-p9a) 34 | - Chain of Responsibility 35 | - Mediator 36 | - State 37 | - Visitor 38 | 39 | ## License 40 | 41 | This project is licensed under the MIT License. 42 | 43 | ## Acknowledgments 44 | 45 | Behzad Ali Mohammad Zad for creating and maintaining this repository. 46 | 47 | Enjoy exploring and learning TypeScript design patterns! 48 | -------------------------------------------------------------------------------- /src/creational/prototype/prototype.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Represents a cloneable object that can create a deep copy of itself. 3 | */ 4 | interface DeepCloneable> { 5 | clone(): Type; 6 | } 7 | 8 | /** 9 | * Represents a note that can be cloned. 10 | */ 11 | class Note implements DeepCloneable { 12 | constructor(public readonly message: string) {} 13 | 14 | clone(): Note { 15 | return new Note(this.message); 16 | } 17 | } 18 | 19 | /** 20 | * Imagine, we want to clone a text document with its notes. 21 | * We want to make sure for a deep clone, then we can use the prototype pattern. 22 | */ 23 | class TextDocument implements DeepCloneable { 24 | private readonly text: string; 25 | private readonly notes: Note[]; 26 | 27 | /** 28 | * Constructs a new `TextDocument` instance with the provided text and optional notes. 29 | * 30 | * @param text - The text content of the document. 31 | * @param notes - An optional array of `Note` instances to be associated with the document. 32 | * @throws {Error} If the `text` parameter is empty. 33 | */ 34 | constructor(text: string, notes: Note[] = []) { 35 | if (!text) { 36 | throw new Error("Text cannot be empty"); 37 | } 38 | 39 | this.text = text; 40 | this.notes = notes; 41 | } 42 | 43 | /** 44 | * Creates a deep clone of the current `TextDocument` instance. 45 | * 46 | * This method creates a new `TextDocument` instance with a cloned array of `Note` instances. 47 | * The `Note` instances are cloned using the `clone()` method of the `Note` class. 48 | * 49 | * @returns A new `TextDocument` instance that is a deep clone of the current instance. 50 | */ 51 | clone(): TextDocument { 52 | const clonedNotes = this.notes.map((note) => note.clone()); 53 | return new TextDocument(this.text, clonedNotes); 54 | } 55 | } 56 | 57 | export { Note, TextDocument }; 58 | -------------------------------------------------------------------------------- /src/creational/factory/route.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * The lat/long type 3 | */ 4 | type LatLng = { 5 | lat: number; 6 | lng: number; 7 | }; 8 | 9 | /** 10 | * A path is a collection of points and a distance. 11 | */ 12 | type Path = { 13 | distance: number; 14 | points: LatLng[]; 15 | }; 16 | 17 | /** 18 | * The base class for route algorithms. 19 | */ 20 | abstract class RouteAlgorithm { 21 | constructor(public from: LatLng, public to: LatLng) { 22 | this.from = from; 23 | this.to = to; 24 | } 25 | abstract getDirection(): Path; 26 | } 27 | 28 | /** 29 | * Implementations of the shortest route algorithm. 30 | */ 31 | class ShortestRouteAlgorithm extends RouteAlgorithm { 32 | constructor(from: LatLng, to: LatLng) { 33 | super(from, to); 34 | } 35 | 36 | getDirection(): Path { 37 | return { 38 | distance: 10, 39 | points: [ 40 | { lat: 1, lng: 2 }, 41 | { lat: 3, lng: 4 }, 42 | ], 43 | }; 44 | } 45 | } 46 | 47 | /** 48 | * Implementations of the fastest route algorithm. 49 | */ 50 | class FastestRouteAlgorithm extends RouteAlgorithm { 51 | constructor(from: LatLng, to: LatLng) { 52 | super(from, to); 53 | } 54 | 55 | getDirection(): Path { 56 | return { 57 | distance: 14, 58 | points: [ 59 | { lat: 3, lng: 3 }, 60 | { lat: 3, lng: 5 }, 61 | ], 62 | }; 63 | } 64 | } 65 | 66 | /** 67 | * Implementations of the scenic route algorithm. 68 | */ 69 | class ScenicRouteAlgorithm extends RouteAlgorithm { 70 | constructor(from: LatLng, to: LatLng) { 71 | super(from, to); 72 | } 73 | 74 | getDirection(): Path { 75 | return { 76 | distance: 12, 77 | points: [ 78 | { lat: 2, lng: 2 }, 79 | { lat: 2, lng: 4 }, 80 | ], 81 | }; 82 | } 83 | } 84 | 85 | export { FastestRouteAlgorithm, ScenicRouteAlgorithm, ShortestRouteAlgorithm }; 86 | export type { LatLng, Path, RouteAlgorithm }; 87 | -------------------------------------------------------------------------------- /src/structural/adapter/adapter.ts: -------------------------------------------------------------------------------- 1 | import { ExternalInstagramPackage } from "./external-pkg"; 2 | 3 | 4 | /** 5 | * Represents a generic social media platform that can be used to post content. 6 | */ 7 | abstract class Social { 8 | abstract post(): void; 9 | } 10 | 11 | 12 | /** 13 | * Schedules posting to various social media platforms. 14 | */ 15 | class Scheduler { 16 | constructor() {} 17 | 18 | schedule(social: Social) { 19 | console.log(`Posting to social media...`); 20 | social.post(); 21 | } 22 | } 23 | 24 | 25 | /** 26 | * Our class to post to Facebook. 27 | */ 28 | class Facebook extends Social { 29 | post(): void { 30 | console.log(`Posting to Facebook...`); 31 | } 32 | } 33 | 34 | /** 35 | * Our class to post to LinkedIn 36 | */ 37 | class LinkeIn extends Social { 38 | post(): void { 39 | console.log(`Posting to LinkeIn...`); 40 | } 41 | } 42 | 43 | /** 44 | * We can create a wrapper class to adapt the external package to our design. 45 | * The example of using the adapter. 46 | * 47 | * @example 48 | * ```ts 49 | * function main() { 50 | * const facebook = new Facebook(); 51 | * const linkedIn = new LinkeIn(); 52 | * // We use the adapter instead of the external package diectly. 53 | * const instagram = new InstagramAdapter(new ExternalInstagramPackage()); 54 | * 55 | * // We can use the scheduler to post to different social media. 56 | * const scheduler = new Scheduler(); 57 | * scheduler.schedule(facebook); 58 | * scheduler.schedule(linkedIn); 59 | * scheduler.schedule(instagram); 60 | * } 61 | * ``` 62 | */ 63 | class InstagramAdapter extends Social { 64 | constructor(private instagram: ExternalInstagramPackage) { 65 | super(); 66 | } 67 | 68 | post(): void { 69 | this.instagram.postWithDifferentName(); 70 | } 71 | } 72 | 73 | export { 74 | ExternalInstagramPackage, 75 | Facebook, 76 | InstagramAdapter, 77 | LinkeIn, 78 | Scheduler, 79 | Social, 80 | }; 81 | -------------------------------------------------------------------------------- /src/behavioral/command/command.test.ts: -------------------------------------------------------------------------------- 1 | import { DrawCircleCommand, Invoker } from "./command"; 2 | 3 | describe("Command Pattern", () => { 4 | let invoker: Invoker; 5 | let spy: jest.SpyInstance; 6 | 7 | const CIRCLE_COORDS = [ 8 | { x: 5, y: 5 }, 9 | { x: 15, y: 15 }, 10 | { x: 25, y: 25 }, 11 | ]; 12 | 13 | function setupCircles(): DrawCircleCommand[] { 14 | return CIRCLE_COORDS.map(({ x, y }) => new DrawCircleCommand(x, y)); 15 | } 16 | 17 | beforeEach(() => { 18 | invoker = new Invoker(); 19 | spy = jest.spyOn(console, "log"); 20 | }); 21 | 22 | afterEach(() => { 23 | spy.mockRestore(); 24 | }); 25 | 26 | it("executes multiple draw commands", () => { 27 | const circles: DrawCircleCommand[] = setupCircles(); 28 | 29 | for (const circle of circles) { 30 | invoker.execute(circle); 31 | invoker.draw(); 32 | } 33 | 34 | CIRCLE_COORDS.forEach(({ x, y }) => { 35 | expect(spy).toHaveBeenCalledWith(`Circle drawn at (${x}, ${y})`); 36 | }); 37 | }); 38 | 39 | it("undoes the last draw command", () => { 40 | const circles: DrawCircleCommand[] = setupCircles(); 41 | 42 | for (const circle of circles) { 43 | invoker.execute(circle); 44 | invoker.draw(); 45 | } 46 | 47 | invoker.undo(); 48 | const lastCoord = CIRCLE_COORDS[CIRCLE_COORDS.length - 1]; 49 | expect(spy).toHaveBeenCalledWith( 50 | `Undone: DrawCircleCommand at (${lastCoord.x}, ${lastCoord.y})` 51 | ); 52 | }); 53 | 54 | it("redoes the last undone command", () => { 55 | const circles: DrawCircleCommand[] = setupCircles(); 56 | for (const circle of circles) { 57 | invoker.execute(circle); 58 | invoker.draw(); 59 | } 60 | invoker.undo(); 61 | invoker.redo(); 62 | const lastCoord = CIRCLE_COORDS[CIRCLE_COORDS.length - 1]; 63 | expect(spy).toHaveBeenCalledWith( 64 | `Redone: DrawCircleCommand at (${lastCoord.x}, ${lastCoord.y})` 65 | ); 66 | }); 67 | }); 68 | -------------------------------------------------------------------------------- /src/creational/factory/factory.ts: -------------------------------------------------------------------------------- 1 | import { 2 | FastestRouteAlgorithm, 3 | ScenicRouteAlgorithm, 4 | ShortestRouteAlgorithm, 5 | } from "./route"; 6 | 7 | import type { LatLng, RouteAlgorithm } from "./route"; 8 | 9 | 10 | /** 11 | * Defines the different types of route algorithms that can be created by the `RouteFactory`. 12 | */ 13 | enum RouteType { 14 | Shortest, 15 | Fastest, 16 | Scenic, 17 | } 18 | 19 | 20 | /** 21 | * Defines the parameters required to create a route algorithm. 22 | */ 23 | type Param = { 24 | type: RouteType; 25 | from: LatLng; 26 | to: LatLng; 27 | }; 28 | 29 | 30 | /** 31 | * Defines the contract for a route factory that can create instances of different 32 | * route algorithms based on the specified route type. 33 | */ 34 | interface RouteFactoryType { 35 | create(params: Param): RouteAlgorithm; 36 | } 37 | 38 | 39 | /** 40 | * The RouteFactory class is responsible for creating instances of 41 | * different route algorithms based on the specified route type. 42 | * 43 | * @param {RouteType} params.type - The type of route algorithm to create. 44 | * @param {LatLng} params.from - The starting location for the route. 45 | * @param {LatLng} params.to - The destination location for the route. 46 | * @returns {RouteAlgorithm} - The created route algorithm instance. 47 | * @throws {Error} - Throws an error if the specified route type is invalid. 48 | */ 49 | class RouteFactory implements RouteFactoryType { 50 | create({ type, from, to }: Param): RouteAlgorithm { 51 | switch (type) { 52 | case RouteType.Shortest: 53 | return new ShortestRouteAlgorithm(from, to); 54 | case RouteType.Fastest: 55 | return new FastestRouteAlgorithm(from, to); 56 | case RouteType.Scenic: 57 | return new ScenicRouteAlgorithm(from, to); 58 | default: 59 | throw new Error("Invalid route type"); 60 | } 61 | } 62 | } 63 | 64 | export { RouteFactory, RouteType }; 65 | export type { Param, RouteFactoryType }; 66 | -------------------------------------------------------------------------------- /src/architectural/circuit-breaker/circuit-breaker.test.ts: -------------------------------------------------------------------------------- 1 | import { CircuitBreaker } from "./circuit-breaker"; 2 | 3 | describe("CircuitBreaker", () => { 4 | const successFn = jest.fn().mockResolvedValue("Success"); 5 | const errorFn = jest.fn().mockRejectedValue(new Error("Test error")); 6 | 7 | let breaker: CircuitBreaker; 8 | 9 | beforeEach(() => { 10 | jest.clearAllMocks(); 11 | breaker = new CircuitBreaker({ 12 | failureThreshold: 3, 13 | durationOfBreak: 100, // Short duration for testing 14 | samplingDuration: 2, 15 | }); 16 | }); 17 | 18 | it("handles closed state - allows successful execution", async () => { 19 | // Test successful execution (circuit closed) 20 | const result = await breaker.execute(successFn); 21 | expect(result).toBe("Success"); 22 | expect(successFn).toHaveBeenCalledTimes(1); 23 | }); 24 | 25 | it("handles open state - blocks execution after failures", async () => { 26 | // Trigger failures to open the circuit 27 | for (let i = 0; i < 3; i++) { 28 | await expect(breaker.execute(errorFn)).rejects.toThrow("Test error"); 29 | } 30 | 31 | // Circuit should be open now 32 | await expect(breaker.execute(successFn)).rejects.toThrow( 33 | "Circuit is open. Try later." 34 | ); 35 | }); 36 | 37 | it("handles half-open state - allows execution after break duration", async () => { 38 | // First open the circuit 39 | for (let i = 0; i < 3; i++) { 40 | await expect(breaker.execute(errorFn)).rejects.toThrow("Test error"); 41 | } 42 | 43 | // Mock time to simulate waiting for the break duration 44 | const originalDateNow = Date.now; 45 | Date.now = jest.fn(() => originalDateNow() + 200); 46 | 47 | try { 48 | // Circuit should be half-open and allow the call 49 | const halfOpenResult = await breaker.execute(successFn); 50 | expect(halfOpenResult).toBe("Success"); 51 | 52 | // Another successful call should return the circuit to closed 53 | const finalResult = await breaker.execute(successFn); 54 | expect(finalResult).toBe("Success"); 55 | } finally { 56 | // Restore original Date.now 57 | Date.now = originalDateNow; 58 | } 59 | }); 60 | }); 61 | -------------------------------------------------------------------------------- /src/structural/facade/facade.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * The `AuthenticationService` class provides methods for authenticating users. 3 | */ 4 | class AuthenticationService { 5 | public login(username: string, password: string): boolean { 6 | return true; 7 | } 8 | } 9 | 10 | /** 11 | * The `EmailService` class provides methods for sending emails. 12 | */ 13 | class EmailService { 14 | public sendEmail(email: string, content: string): void { 15 | console.log("Sending email to" + email + "with content" + content); 16 | } 17 | } 18 | 19 | /** 20 | * The `SMSService` class provides methods for sending SMS messages. 21 | */ 22 | class SMSService { 23 | public sendSms(phone: string, content: string): void { 24 | console.log("Sending sms to" + phone + "with content" + content); 25 | } 26 | } 27 | 28 | /** 29 | * The `HistoryService` class provides methods for logging user actions. 30 | */ 31 | class HistoryService { 32 | public log(user: string, action: string): void { 33 | console.log("Logging action" + action + "by user" + user); 34 | } 35 | } 36 | 37 | /** 38 | * The `UserFacade` class provides a simplified interface for interacting with various services 39 | * related to user authentication, email, SMS, and logging. 40 | * 41 | * The `login` method handles the entire login process, including: 42 | * - Authenticating the user using the `AuthenticationService` 43 | * - Sending an email notification using the `EmailService` 44 | * - Sending an SMS notification using the `SMSService` 45 | * - Logging the successful login using the `HistoryService` 46 | * 47 | * This facade pattern helps to simplify the usage of these underlying services and provide a more cohesive and user-friendly API. 48 | */ 49 | class UserFacade { 50 | private authService: AuthenticationService; 51 | private emailService: EmailService; 52 | private smsService: SMSService; 53 | private historyService: HistoryService; 54 | constructor() { 55 | this.authService = new AuthenticationService(); 56 | this.emailService = new EmailService(); 57 | this.smsService = new SMSService(); 58 | this.historyService = new HistoryService(); 59 | } 60 | public login(username: string, password: string): boolean { 61 | if (this.authService.login(username, password)) { 62 | this.emailService.sendEmail(username, "Login successful"); 63 | this.smsService.sendSms(username, "Login successful"); 64 | this.historyService.log(username, "Login successful"); 65 | return true; 66 | } 67 | return false; 68 | } 69 | } 70 | 71 | export { UserFacade }; 72 | -------------------------------------------------------------------------------- /src/architectural/circuit-breaker/circuit-breaker.ts: -------------------------------------------------------------------------------- 1 | type CircuitState = "CLOSED" | "OPEN" | "HALF_OPEN"; 2 | 3 | interface CircuitBreakerOptions { 4 | /** 5 | * The number of failures allowed before opening the circuit 6 | */ 7 | failureThreshold: number; 8 | /** 9 | * The duration the circuit will stay open before resetting 10 | */ 11 | durationOfBreak: number; 12 | /** 13 | * The number of successful calls required to close the circuit 14 | */ 15 | samplingDuration?: number; 16 | } 17 | 18 | class CircuitBreaker { 19 | // State tracking 20 | private state: CircuitState = "CLOSED"; 21 | private failureCount: number = 0; 22 | private successCount: number = 0; 23 | private lastFailureTime: number = 0; 24 | 25 | // Configuration properties 26 | private readonly failureThreshold: number; 27 | private readonly durationOfBreak: number; 28 | private readonly samplingDuration: number; 29 | 30 | constructor(options: CircuitBreakerOptions) { 31 | const { 32 | failureThreshold, 33 | durationOfBreak, 34 | samplingDuration = 30000, 35 | } = options; 36 | 37 | this.failureThreshold = failureThreshold; 38 | this.durationOfBreak = durationOfBreak; 39 | this.samplingDuration = samplingDuration; 40 | } 41 | 42 | async execute(fn: () => Promise): Promise { 43 | if (this.state === "OPEN") { 44 | if (Date.now() > this.lastFailureTime) { 45 | this.state = "HALF_OPEN"; 46 | } else { 47 | throw new Error("Circuit is open. Try later."); 48 | } 49 | } 50 | try { 51 | const result = await fn(); 52 | this.onSuccess(); 53 | return result; 54 | } catch (error) { 55 | this.onFailure(); 56 | throw error; 57 | } 58 | } 59 | 60 | private onSuccess() { 61 | if (this.state === "HALF_OPEN") { 62 | this.successCount++; 63 | if (this.successCount > this.samplingDuration) { 64 | this.reset(); 65 | } 66 | } else { 67 | this.reset(); 68 | } 69 | } 70 | 71 | private onFailure() { 72 | this.failureCount++; 73 | if (this.failureCount >= this.failureThreshold) { 74 | this.trip(); 75 | } 76 | } 77 | 78 | private trip() { 79 | this.state = "OPEN"; 80 | this.lastFailureTime = Date.now() + this.durationOfBreak; 81 | this.failureCount = 0; 82 | this.successCount = 0; 83 | } 84 | 85 | private reset() { 86 | this.state = "CLOSED"; 87 | this.failureCount = 0; 88 | this.successCount = 0; 89 | } 90 | } 91 | export { CircuitBreaker, type CircuitBreakerOptions }; 92 | -------------------------------------------------------------------------------- /src/structural/composite/composite.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * The `Menu` class is an abstract base class that defines the common interface for all menu items. 3 | * Concrete subclasses of `Menu` represent different types of menu items, such as `MenuItem`, `MenuSeparator`, and `MenuComposite`. 4 | */ 5 | abstract class Menu { 6 | public abstract display(): void; 7 | } 8 | 9 | /** 10 | * Represents a menu item with a name and description. 11 | */ 12 | class MenuItem extends Menu { 13 | constructor(public name: string, public description: string) { 14 | super(); 15 | } 16 | 17 | public display(): void { 18 | console.log(`- ${this.name}: ${this.description}`); 19 | } 20 | } 21 | 22 | /** 23 | * Represents a menu separator, which is a visual divider between menu items. 24 | */ 25 | class MenuSeparator extends Menu { 26 | public display(): void { 27 | console.log("-------------------"); 28 | } 29 | } 30 | 31 | /** 32 | * Represents a menu item that displays an image. 33 | */ 34 | class MenuImage extends Menu { 35 | constructor(public name: string, public image: string) { 36 | super(); 37 | } 38 | public display(): void { 39 | console.log(`- ${this.name}: ${this.image}`); 40 | } 41 | } 42 | 43 | /** 44 | * Represents a composite menu item that can contain other menu items. 45 | * The `MenuComposite` class allows for the creation of hierarchical menu structures, 46 | * where a menu can contain other menus, menu items, and other composite elements. 47 | */ 48 | class MenuComposite extends Menu { 49 | private children: Menu[] = []; 50 | public name: string; 51 | 52 | /** 53 | * Constructs a new `MenuComposite` instance with the given name and an array of menu items. 54 | * 55 | * @param name - The name of the menu composite. 56 | * @param menuItems - An array of `Menu` instances that will be the children of this composite. 57 | */ 58 | constructor(name: string, menuItems: Menu[]) { 59 | super(); 60 | this.name = name; 61 | this.children = menuItems; 62 | } 63 | 64 | /** 65 | * Adds the given `Menu` instance as a child of this `MenuComposite`. 66 | * 67 | * @param child - The `Menu` instance to add as a child. 68 | */ 69 | public add(child: Menu): void { 70 | this.children.push(child); 71 | } 72 | 73 | /** 74 | * Displays the name of the menu composite and recursively displays all of its child menu items. 75 | */ 76 | public display(): void { 77 | console.log(`- ${this.name}`); 78 | this.children.forEach((child) => child.display()); 79 | } 80 | } 81 | 82 | export { Menu, MenuComposite, MenuImage, MenuItem, MenuSeparator }; 83 | -------------------------------------------------------------------------------- /src/behavioral/command/command.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * The `Command` interface defines the contract for executing, undoing, and drawing commands. 3 | */ 4 | interface Command { 5 | execute: () => void; 6 | undo: () => void; 7 | redo: () => void; 8 | // We usually need a loop in graphical applications and then the draw method is needed. 9 | draw: () => void; 10 | } 11 | 12 | /** 13 | * The `Invoker` class is responsible for executing, drawing, and undoing `Command` objects. 14 | */ 15 | class Invoker { 16 | private drawingHistory: Command[]; 17 | private undoHistory: Command[]; 18 | constructor() { 19 | this.drawingHistory = []; 20 | this.undoHistory = []; 21 | } 22 | 23 | /** 24 | * Executes the provided `Command` object, and adds it to the command history. 25 | */ 26 | execute(command: Command): void { 27 | command.execute(); 28 | this.drawingHistory.push(command); 29 | } 30 | 31 | /** 32 | * Draws all the commands in the command history. 33 | */ 34 | draw() { 35 | for (const command of this.drawingHistory) { 36 | command.draw(); 37 | } 38 | } 39 | 40 | /** 41 | * Undoes the most recent command executed by the Invoker. 42 | */ 43 | undo() { 44 | if (this.drawingHistory.length > 0) { 45 | const removedCommand = this.drawingHistory.pop(); 46 | if (removedCommand) { 47 | removedCommand.undo(); 48 | this.undoHistory.push(removedCommand); 49 | } 50 | } 51 | } 52 | 53 | redo() { 54 | if (this.undoHistory.length > 0) { 55 | const removedCommand = this.undoHistory.pop(); 56 | if (removedCommand) { 57 | removedCommand.redo(); 58 | this.drawingHistory.push(removedCommand); 59 | } 60 | } 61 | } 62 | } 63 | 64 | /** 65 | * The `DrawCircleCommand` class implements the `Command` interface and represents a command to draw a circle. 66 | */ 67 | class DrawCircleCommand implements Command { 68 | private circle?: Circle; 69 | constructor(private x: number, private y: number) {} 70 | 71 | /** 72 | * Executes the command by creating a new `Circle` instance with the provided x and y coordinates. 73 | */ 74 | execute() { 75 | this.circle = new Circle(this.x, this.y); 76 | } 77 | 78 | /** 79 | * Undoes the most recent `DrawCircleCommand` by removing the associated `Circle` instance. 80 | */ 81 | undo() { 82 | console.log(`Undone: DrawCircleCommand at (${this.x}, ${this.y})`); 83 | this.circle = undefined; 84 | } 85 | 86 | redo() { 87 | console.log(`Redone: DrawCircleCommand at (${this.x}, ${this.y})`); 88 | this.execute(); 89 | } 90 | 91 | /** 92 | * Draws the circle represented by this command. 93 | */ 94 | draw() { 95 | if (this.circle) { 96 | this.circle.draw(); 97 | } 98 | } 99 | } 100 | 101 | /** 102 | * Represents a circle with an x and y coordinate. 103 | */ 104 | class Circle { 105 | constructor(private x: number, private y: number) {} 106 | draw() { 107 | console.log(`Circle drawn at (${this.x}, ${this.y})`); 108 | } 109 | } 110 | 111 | export { Circle, Command, DrawCircleCommand, Invoker }; 112 | -------------------------------------------------------------------------------- /src/creational/builder/builder.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Defines the options for a Dialog component. 3 | */ 4 | interface DialogOptions { 5 | title: string; 6 | description: string; 7 | modal?: boolean; 8 | /** 9 | * Defines optional callback functions to be invoked when the dialog is opened or closed. 10 | */ 11 | onClose?: () => void; 12 | onOpen?: () => void; 13 | } 14 | 15 | /** 16 | * Represents a Dialog component with configurable options. 17 | */ 18 | class Dialog { 19 | constructor(public options: DialogOptions) {} 20 | 21 | /** 22 | * Returns a string representation of the Dialog options, including the title, description, and modal status. 23 | * @returns {string} A string representation of the Dialog options. 24 | */ 25 | toString() { 26 | return `Title: ${this.options.title}, Description: ${this.options.description}, Modal: ${this.options.modal}`; 27 | } 28 | 29 | /** 30 | * Opens the dialog and invokes the `onOpen` callback if it is defined. 31 | */ 32 | open() { 33 | if (this.options.onOpen) { 34 | this.options.onOpen(); 35 | } 36 | } 37 | 38 | /** 39 | * Closes the dialog and invokes the `onClose` callback if it is defined. 40 | */ 41 | close() { 42 | if (this.options.onClose) { 43 | this.options.onClose(); 44 | } 45 | } 46 | } 47 | 48 | /** 49 | * Provides a fluent interface for building a `Dialog` component with configurable options. 50 | */ 51 | class DialogBuilder { 52 | private options: DialogOptions = { 53 | title: "", 54 | description: "", 55 | }; 56 | 57 | /** 58 | * Sets the title of the dialog. 59 | * @param title - The title of the dialog. 60 | * @returns The DialogBuilder instance, for chaining. 61 | */ 62 | setTitle(title: string) { 63 | this.options.title = title; 64 | return this; 65 | } 66 | 67 | /** 68 | * Sets the description of the dialog. 69 | * @param description - The description of the dialog. 70 | * @returns The DialogBuilder instance, for chaining. 71 | */ 72 | setDescription(description: string) { 73 | this.options.description = description; 74 | return this; 75 | } 76 | 77 | /** 78 | * Sets whether the dialog should be displayed as a modal. 79 | * @param value - `true` to display the dialog as a modal, `false` to display it as a regular dialog. 80 | * @returns The `DialogBuilder` instance, for chaining. 81 | */ 82 | setModal(value: boolean) { 83 | this.options.modal = value; 84 | return this; 85 | } 86 | 87 | /** 88 | * Sets the callback function to be invoked when the dialog is closed. 89 | * @param callback - The function to be called when the dialog is closed. 90 | * @returns The `DialogBuilder` instance, for chaining. 91 | */ 92 | onClose(callback: () => void) { 93 | this.options.onClose = callback; 94 | return this; 95 | } 96 | 97 | /** 98 | * Sets the callback function to be invoked when the dialog is opened. 99 | * @param callback - The function to be called when the dialog is opened. 100 | * @returns The `DialogBuilder` instance, for chaining. 101 | */ 102 | onOpen(callback: () => void) { 103 | this.options.onOpen = callback; 104 | return this; 105 | } 106 | 107 | /** 108 | * Builds a new `Dialog` instance with the configured options. 109 | * @returns A new `Dialog` instance with the configured options. 110 | */ 111 | build() { 112 | return new Dialog(this.options); 113 | } 114 | } 115 | 116 | export { Dialog, DialogBuilder }; 117 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@types/jest': 12 | specifier: ^29.5.12 13 | version: 29.5.12 14 | eslint: 15 | specifier: ^9.9.0 16 | version: 9.9.0 17 | jest: 18 | specifier: ^29.7.0 19 | version: 29.7.0(@types/node@22.4.2) 20 | ts-jest: 21 | specifier: ^29.2.4 22 | version: 29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@22.4.2))(typescript@5.5.4) 23 | typescript: 24 | specifier: ^5.5.4 25 | version: 5.5.4 26 | 27 | packages: 28 | 29 | '@ampproject/remapping@2.3.0': 30 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 31 | engines: {node: '>=6.0.0'} 32 | 33 | '@babel/code-frame@7.24.7': 34 | resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} 35 | engines: {node: '>=6.9.0'} 36 | 37 | '@babel/compat-data@7.25.2': 38 | resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} 39 | engines: {node: '>=6.9.0'} 40 | 41 | '@babel/core@7.25.2': 42 | resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} 43 | engines: {node: '>=6.9.0'} 44 | 45 | '@babel/generator@7.25.0': 46 | resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} 47 | engines: {node: '>=6.9.0'} 48 | 49 | '@babel/helper-compilation-targets@7.25.2': 50 | resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} 51 | engines: {node: '>=6.9.0'} 52 | 53 | '@babel/helper-module-imports@7.24.7': 54 | resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} 55 | engines: {node: '>=6.9.0'} 56 | 57 | '@babel/helper-module-transforms@7.25.2': 58 | resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} 59 | engines: {node: '>=6.9.0'} 60 | peerDependencies: 61 | '@babel/core': ^7.0.0 62 | 63 | '@babel/helper-plugin-utils@7.24.8': 64 | resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} 65 | engines: {node: '>=6.9.0'} 66 | 67 | '@babel/helper-simple-access@7.24.7': 68 | resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} 69 | engines: {node: '>=6.9.0'} 70 | 71 | '@babel/helper-string-parser@7.24.8': 72 | resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} 73 | engines: {node: '>=6.9.0'} 74 | 75 | '@babel/helper-validator-identifier@7.24.7': 76 | resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} 77 | engines: {node: '>=6.9.0'} 78 | 79 | '@babel/helper-validator-option@7.24.8': 80 | resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} 81 | engines: {node: '>=6.9.0'} 82 | 83 | '@babel/helpers@7.25.0': 84 | resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} 85 | engines: {node: '>=6.9.0'} 86 | 87 | '@babel/highlight@7.24.7': 88 | resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} 89 | engines: {node: '>=6.9.0'} 90 | 91 | '@babel/parser@7.25.3': 92 | resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} 93 | engines: {node: '>=6.0.0'} 94 | hasBin: true 95 | 96 | '@babel/plugin-syntax-async-generators@7.8.4': 97 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 98 | peerDependencies: 99 | '@babel/core': ^7.0.0-0 100 | 101 | '@babel/plugin-syntax-bigint@7.8.3': 102 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 103 | peerDependencies: 104 | '@babel/core': ^7.0.0-0 105 | 106 | '@babel/plugin-syntax-class-properties@7.12.13': 107 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 108 | peerDependencies: 109 | '@babel/core': ^7.0.0-0 110 | 111 | '@babel/plugin-syntax-class-static-block@7.14.5': 112 | resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} 113 | engines: {node: '>=6.9.0'} 114 | peerDependencies: 115 | '@babel/core': ^7.0.0-0 116 | 117 | '@babel/plugin-syntax-import-attributes@7.24.7': 118 | resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} 119 | engines: {node: '>=6.9.0'} 120 | peerDependencies: 121 | '@babel/core': ^7.0.0-0 122 | 123 | '@babel/plugin-syntax-import-meta@7.10.4': 124 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 125 | peerDependencies: 126 | '@babel/core': ^7.0.0-0 127 | 128 | '@babel/plugin-syntax-json-strings@7.8.3': 129 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 130 | peerDependencies: 131 | '@babel/core': ^7.0.0-0 132 | 133 | '@babel/plugin-syntax-jsx@7.24.7': 134 | resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} 135 | engines: {node: '>=6.9.0'} 136 | peerDependencies: 137 | '@babel/core': ^7.0.0-0 138 | 139 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4': 140 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 141 | peerDependencies: 142 | '@babel/core': ^7.0.0-0 143 | 144 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': 145 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 146 | peerDependencies: 147 | '@babel/core': ^7.0.0-0 148 | 149 | '@babel/plugin-syntax-numeric-separator@7.10.4': 150 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 151 | peerDependencies: 152 | '@babel/core': ^7.0.0-0 153 | 154 | '@babel/plugin-syntax-object-rest-spread@7.8.3': 155 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 156 | peerDependencies: 157 | '@babel/core': ^7.0.0-0 158 | 159 | '@babel/plugin-syntax-optional-catch-binding@7.8.3': 160 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 161 | peerDependencies: 162 | '@babel/core': ^7.0.0-0 163 | 164 | '@babel/plugin-syntax-optional-chaining@7.8.3': 165 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 166 | peerDependencies: 167 | '@babel/core': ^7.0.0-0 168 | 169 | '@babel/plugin-syntax-private-property-in-object@7.14.5': 170 | resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} 171 | engines: {node: '>=6.9.0'} 172 | peerDependencies: 173 | '@babel/core': ^7.0.0-0 174 | 175 | '@babel/plugin-syntax-top-level-await@7.14.5': 176 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 177 | engines: {node: '>=6.9.0'} 178 | peerDependencies: 179 | '@babel/core': ^7.0.0-0 180 | 181 | '@babel/plugin-syntax-typescript@7.24.7': 182 | resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} 183 | engines: {node: '>=6.9.0'} 184 | peerDependencies: 185 | '@babel/core': ^7.0.0-0 186 | 187 | '@babel/template@7.25.0': 188 | resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} 189 | engines: {node: '>=6.9.0'} 190 | 191 | '@babel/traverse@7.25.3': 192 | resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} 193 | engines: {node: '>=6.9.0'} 194 | 195 | '@babel/types@7.25.2': 196 | resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} 197 | engines: {node: '>=6.9.0'} 198 | 199 | '@bcoe/v8-coverage@0.2.3': 200 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 201 | 202 | '@eslint-community/eslint-utils@4.4.0': 203 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 204 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 205 | peerDependencies: 206 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 207 | 208 | '@eslint-community/regexpp@4.11.0': 209 | resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} 210 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 211 | 212 | '@eslint/config-array@0.17.1': 213 | resolution: {integrity: sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==} 214 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 215 | 216 | '@eslint/eslintrc@3.1.0': 217 | resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} 218 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 219 | 220 | '@eslint/js@9.9.0': 221 | resolution: {integrity: sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==} 222 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 223 | 224 | '@eslint/object-schema@2.1.4': 225 | resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} 226 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 227 | 228 | '@humanwhocodes/module-importer@1.0.1': 229 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 230 | engines: {node: '>=12.22'} 231 | 232 | '@humanwhocodes/retry@0.3.0': 233 | resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} 234 | engines: {node: '>=18.18'} 235 | 236 | '@istanbuljs/load-nyc-config@1.1.0': 237 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 238 | engines: {node: '>=8'} 239 | 240 | '@istanbuljs/schema@0.1.3': 241 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 242 | engines: {node: '>=8'} 243 | 244 | '@jest/console@29.7.0': 245 | resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} 246 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 247 | 248 | '@jest/core@29.7.0': 249 | resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} 250 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 251 | peerDependencies: 252 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 253 | peerDependenciesMeta: 254 | node-notifier: 255 | optional: true 256 | 257 | '@jest/environment@29.7.0': 258 | resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} 259 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 260 | 261 | '@jest/expect-utils@29.7.0': 262 | resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} 263 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 264 | 265 | '@jest/expect@29.7.0': 266 | resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} 267 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 268 | 269 | '@jest/fake-timers@29.7.0': 270 | resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} 271 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 272 | 273 | '@jest/globals@29.7.0': 274 | resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} 275 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 276 | 277 | '@jest/reporters@29.7.0': 278 | resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} 279 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 280 | peerDependencies: 281 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 282 | peerDependenciesMeta: 283 | node-notifier: 284 | optional: true 285 | 286 | '@jest/schemas@29.6.3': 287 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 288 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 289 | 290 | '@jest/source-map@29.6.3': 291 | resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} 292 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 293 | 294 | '@jest/test-result@29.7.0': 295 | resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} 296 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 297 | 298 | '@jest/test-sequencer@29.7.0': 299 | resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} 300 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 301 | 302 | '@jest/transform@29.7.0': 303 | resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} 304 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 305 | 306 | '@jest/types@29.6.3': 307 | resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} 308 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 309 | 310 | '@jridgewell/gen-mapping@0.3.5': 311 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 312 | engines: {node: '>=6.0.0'} 313 | 314 | '@jridgewell/resolve-uri@3.1.2': 315 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 316 | engines: {node: '>=6.0.0'} 317 | 318 | '@jridgewell/set-array@1.2.1': 319 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 320 | engines: {node: '>=6.0.0'} 321 | 322 | '@jridgewell/sourcemap-codec@1.5.0': 323 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 324 | 325 | '@jridgewell/trace-mapping@0.3.25': 326 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 327 | 328 | '@nodelib/fs.scandir@2.1.5': 329 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 330 | engines: {node: '>= 8'} 331 | 332 | '@nodelib/fs.stat@2.0.5': 333 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 334 | engines: {node: '>= 8'} 335 | 336 | '@nodelib/fs.walk@1.2.8': 337 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 338 | engines: {node: '>= 8'} 339 | 340 | '@sinclair/typebox@0.27.8': 341 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 342 | 343 | '@sinonjs/commons@3.0.1': 344 | resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} 345 | 346 | '@sinonjs/fake-timers@10.3.0': 347 | resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 348 | 349 | '@types/babel__core@7.20.5': 350 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 351 | 352 | '@types/babel__generator@7.6.8': 353 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 354 | 355 | '@types/babel__template@7.4.4': 356 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 357 | 358 | '@types/babel__traverse@7.20.6': 359 | resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} 360 | 361 | '@types/graceful-fs@4.1.9': 362 | resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} 363 | 364 | '@types/istanbul-lib-coverage@2.0.6': 365 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 366 | 367 | '@types/istanbul-lib-report@3.0.3': 368 | resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} 369 | 370 | '@types/istanbul-reports@3.0.4': 371 | resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} 372 | 373 | '@types/jest@29.5.12': 374 | resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} 375 | 376 | '@types/node@22.4.2': 377 | resolution: {integrity: sha512-nAvM3Ey230/XzxtyDcJ+VjvlzpzoHwLsF7JaDRfoI0ytO0mVheerNmM45CtA0yOILXwXXxOrcUWH3wltX+7PSw==} 378 | 379 | '@types/stack-utils@2.0.3': 380 | resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} 381 | 382 | '@types/yargs-parser@21.0.3': 383 | resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} 384 | 385 | '@types/yargs@17.0.33': 386 | resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} 387 | 388 | acorn-jsx@5.3.2: 389 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 390 | peerDependencies: 391 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 392 | 393 | acorn@8.12.1: 394 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} 395 | engines: {node: '>=0.4.0'} 396 | hasBin: true 397 | 398 | ajv@6.12.6: 399 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 400 | 401 | ansi-escapes@4.3.2: 402 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 403 | engines: {node: '>=8'} 404 | 405 | ansi-regex@5.0.1: 406 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 407 | engines: {node: '>=8'} 408 | 409 | ansi-styles@3.2.1: 410 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 411 | engines: {node: '>=4'} 412 | 413 | ansi-styles@4.3.0: 414 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 415 | engines: {node: '>=8'} 416 | 417 | ansi-styles@5.2.0: 418 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 419 | engines: {node: '>=10'} 420 | 421 | anymatch@3.1.3: 422 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 423 | engines: {node: '>= 8'} 424 | 425 | argparse@1.0.10: 426 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 427 | 428 | argparse@2.0.1: 429 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 430 | 431 | async@3.2.6: 432 | resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} 433 | 434 | babel-jest@29.7.0: 435 | resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} 436 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 437 | peerDependencies: 438 | '@babel/core': ^7.8.0 439 | 440 | babel-plugin-istanbul@6.1.1: 441 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 442 | engines: {node: '>=8'} 443 | 444 | babel-plugin-jest-hoist@29.6.3: 445 | resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} 446 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 447 | 448 | babel-preset-current-node-syntax@1.1.0: 449 | resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} 450 | peerDependencies: 451 | '@babel/core': ^7.0.0 452 | 453 | babel-preset-jest@29.6.3: 454 | resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} 455 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 456 | peerDependencies: 457 | '@babel/core': ^7.0.0 458 | 459 | balanced-match@1.0.2: 460 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 461 | 462 | brace-expansion@1.1.11: 463 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 464 | 465 | brace-expansion@2.0.1: 466 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 467 | 468 | braces@3.0.3: 469 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 470 | engines: {node: '>=8'} 471 | 472 | browserslist@4.23.3: 473 | resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} 474 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 475 | hasBin: true 476 | 477 | bs-logger@0.2.6: 478 | resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} 479 | engines: {node: '>= 6'} 480 | 481 | bser@2.1.1: 482 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 483 | 484 | buffer-from@1.1.2: 485 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 486 | 487 | callsites@3.1.0: 488 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 489 | engines: {node: '>=6'} 490 | 491 | camelcase@5.3.1: 492 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 493 | engines: {node: '>=6'} 494 | 495 | camelcase@6.3.0: 496 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 497 | engines: {node: '>=10'} 498 | 499 | caniuse-lite@1.0.30001651: 500 | resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} 501 | 502 | chalk@2.4.2: 503 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 504 | engines: {node: '>=4'} 505 | 506 | chalk@4.1.2: 507 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 508 | engines: {node: '>=10'} 509 | 510 | char-regex@1.0.2: 511 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 512 | engines: {node: '>=10'} 513 | 514 | ci-info@3.9.0: 515 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 516 | engines: {node: '>=8'} 517 | 518 | cjs-module-lexer@1.3.1: 519 | resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} 520 | 521 | cliui@8.0.1: 522 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 523 | engines: {node: '>=12'} 524 | 525 | co@4.6.0: 526 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 527 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 528 | 529 | collect-v8-coverage@1.0.2: 530 | resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} 531 | 532 | color-convert@1.9.3: 533 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 534 | 535 | color-convert@2.0.1: 536 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 537 | engines: {node: '>=7.0.0'} 538 | 539 | color-name@1.1.3: 540 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 541 | 542 | color-name@1.1.4: 543 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 544 | 545 | concat-map@0.0.1: 546 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 547 | 548 | convert-source-map@2.0.0: 549 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 550 | 551 | create-jest@29.7.0: 552 | resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} 553 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 554 | hasBin: true 555 | 556 | cross-spawn@7.0.3: 557 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 558 | engines: {node: '>= 8'} 559 | 560 | debug@4.3.6: 561 | resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} 562 | engines: {node: '>=6.0'} 563 | peerDependencies: 564 | supports-color: '*' 565 | peerDependenciesMeta: 566 | supports-color: 567 | optional: true 568 | 569 | dedent@1.5.3: 570 | resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} 571 | peerDependencies: 572 | babel-plugin-macros: ^3.1.0 573 | peerDependenciesMeta: 574 | babel-plugin-macros: 575 | optional: true 576 | 577 | deep-is@0.1.4: 578 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 579 | 580 | deepmerge@4.3.1: 581 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 582 | engines: {node: '>=0.10.0'} 583 | 584 | detect-newline@3.1.0: 585 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 586 | engines: {node: '>=8'} 587 | 588 | diff-sequences@29.6.3: 589 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 590 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 591 | 592 | ejs@3.1.10: 593 | resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} 594 | engines: {node: '>=0.10.0'} 595 | hasBin: true 596 | 597 | electron-to-chromium@1.5.13: 598 | resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} 599 | 600 | emittery@0.13.1: 601 | resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} 602 | engines: {node: '>=12'} 603 | 604 | emoji-regex@8.0.0: 605 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 606 | 607 | error-ex@1.3.2: 608 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 609 | 610 | escalade@3.1.2: 611 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 612 | engines: {node: '>=6'} 613 | 614 | escape-string-regexp@1.0.5: 615 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 616 | engines: {node: '>=0.8.0'} 617 | 618 | escape-string-regexp@2.0.0: 619 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 620 | engines: {node: '>=8'} 621 | 622 | escape-string-regexp@4.0.0: 623 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 624 | engines: {node: '>=10'} 625 | 626 | eslint-scope@8.0.2: 627 | resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} 628 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 629 | 630 | eslint-visitor-keys@3.4.3: 631 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 632 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 633 | 634 | eslint-visitor-keys@4.0.0: 635 | resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} 636 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 637 | 638 | eslint@9.9.0: 639 | resolution: {integrity: sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==} 640 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 641 | hasBin: true 642 | peerDependencies: 643 | jiti: '*' 644 | peerDependenciesMeta: 645 | jiti: 646 | optional: true 647 | 648 | espree@10.1.0: 649 | resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} 650 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 651 | 652 | esprima@4.0.1: 653 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 654 | engines: {node: '>=4'} 655 | hasBin: true 656 | 657 | esquery@1.6.0: 658 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 659 | engines: {node: '>=0.10'} 660 | 661 | esrecurse@4.3.0: 662 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 663 | engines: {node: '>=4.0'} 664 | 665 | estraverse@5.3.0: 666 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 667 | engines: {node: '>=4.0'} 668 | 669 | esutils@2.0.3: 670 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 671 | engines: {node: '>=0.10.0'} 672 | 673 | execa@5.1.1: 674 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 675 | engines: {node: '>=10'} 676 | 677 | exit@0.1.2: 678 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 679 | engines: {node: '>= 0.8.0'} 680 | 681 | expect@29.7.0: 682 | resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} 683 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 684 | 685 | fast-deep-equal@3.1.3: 686 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 687 | 688 | fast-json-stable-stringify@2.1.0: 689 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 690 | 691 | fast-levenshtein@2.0.6: 692 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 693 | 694 | fastq@1.17.1: 695 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 696 | 697 | fb-watchman@2.0.2: 698 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 699 | 700 | file-entry-cache@8.0.0: 701 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 702 | engines: {node: '>=16.0.0'} 703 | 704 | filelist@1.0.4: 705 | resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} 706 | 707 | fill-range@7.1.1: 708 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 709 | engines: {node: '>=8'} 710 | 711 | find-up@4.1.0: 712 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 713 | engines: {node: '>=8'} 714 | 715 | find-up@5.0.0: 716 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 717 | engines: {node: '>=10'} 718 | 719 | flat-cache@4.0.1: 720 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 721 | engines: {node: '>=16'} 722 | 723 | flatted@3.3.1: 724 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 725 | 726 | fs.realpath@1.0.0: 727 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 728 | 729 | fsevents@2.3.3: 730 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 731 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 732 | os: [darwin] 733 | 734 | function-bind@1.1.2: 735 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 736 | 737 | gensync@1.0.0-beta.2: 738 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 739 | engines: {node: '>=6.9.0'} 740 | 741 | get-caller-file@2.0.5: 742 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 743 | engines: {node: 6.* || 8.* || >= 10.*} 744 | 745 | get-package-type@0.1.0: 746 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 747 | engines: {node: '>=8.0.0'} 748 | 749 | get-stream@6.0.1: 750 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 751 | engines: {node: '>=10'} 752 | 753 | glob-parent@6.0.2: 754 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 755 | engines: {node: '>=10.13.0'} 756 | 757 | glob@7.2.3: 758 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 759 | deprecated: Glob versions prior to v9 are no longer supported 760 | 761 | globals@11.12.0: 762 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 763 | engines: {node: '>=4'} 764 | 765 | globals@14.0.0: 766 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 767 | engines: {node: '>=18'} 768 | 769 | graceful-fs@4.2.11: 770 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 771 | 772 | has-flag@3.0.0: 773 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 774 | engines: {node: '>=4'} 775 | 776 | has-flag@4.0.0: 777 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 778 | engines: {node: '>=8'} 779 | 780 | hasown@2.0.2: 781 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 782 | engines: {node: '>= 0.4'} 783 | 784 | html-escaper@2.0.2: 785 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 786 | 787 | human-signals@2.1.0: 788 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 789 | engines: {node: '>=10.17.0'} 790 | 791 | ignore@5.3.2: 792 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 793 | engines: {node: '>= 4'} 794 | 795 | import-fresh@3.3.0: 796 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 797 | engines: {node: '>=6'} 798 | 799 | import-local@3.2.0: 800 | resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} 801 | engines: {node: '>=8'} 802 | hasBin: true 803 | 804 | imurmurhash@0.1.4: 805 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 806 | engines: {node: '>=0.8.19'} 807 | 808 | inflight@1.0.6: 809 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 810 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 811 | 812 | inherits@2.0.4: 813 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 814 | 815 | is-arrayish@0.2.1: 816 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 817 | 818 | is-core-module@2.15.0: 819 | resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} 820 | engines: {node: '>= 0.4'} 821 | 822 | is-extglob@2.1.1: 823 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 824 | engines: {node: '>=0.10.0'} 825 | 826 | is-fullwidth-code-point@3.0.0: 827 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 828 | engines: {node: '>=8'} 829 | 830 | is-generator-fn@2.1.0: 831 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 832 | engines: {node: '>=6'} 833 | 834 | is-glob@4.0.3: 835 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 836 | engines: {node: '>=0.10.0'} 837 | 838 | is-number@7.0.0: 839 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 840 | engines: {node: '>=0.12.0'} 841 | 842 | is-path-inside@3.0.3: 843 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 844 | engines: {node: '>=8'} 845 | 846 | is-stream@2.0.1: 847 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 848 | engines: {node: '>=8'} 849 | 850 | isexe@2.0.0: 851 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 852 | 853 | istanbul-lib-coverage@3.2.2: 854 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 855 | engines: {node: '>=8'} 856 | 857 | istanbul-lib-instrument@5.2.1: 858 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 859 | engines: {node: '>=8'} 860 | 861 | istanbul-lib-instrument@6.0.3: 862 | resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} 863 | engines: {node: '>=10'} 864 | 865 | istanbul-lib-report@3.0.1: 866 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 867 | engines: {node: '>=10'} 868 | 869 | istanbul-lib-source-maps@4.0.1: 870 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 871 | engines: {node: '>=10'} 872 | 873 | istanbul-reports@3.1.7: 874 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 875 | engines: {node: '>=8'} 876 | 877 | jake@10.9.2: 878 | resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} 879 | engines: {node: '>=10'} 880 | hasBin: true 881 | 882 | jest-changed-files@29.7.0: 883 | resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} 884 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 885 | 886 | jest-circus@29.7.0: 887 | resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} 888 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 889 | 890 | jest-cli@29.7.0: 891 | resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} 892 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 893 | hasBin: true 894 | peerDependencies: 895 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 896 | peerDependenciesMeta: 897 | node-notifier: 898 | optional: true 899 | 900 | jest-config@29.7.0: 901 | resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} 902 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 903 | peerDependencies: 904 | '@types/node': '*' 905 | ts-node: '>=9.0.0' 906 | peerDependenciesMeta: 907 | '@types/node': 908 | optional: true 909 | ts-node: 910 | optional: true 911 | 912 | jest-diff@29.7.0: 913 | resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} 914 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 915 | 916 | jest-docblock@29.7.0: 917 | resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} 918 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 919 | 920 | jest-each@29.7.0: 921 | resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} 922 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 923 | 924 | jest-environment-node@29.7.0: 925 | resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} 926 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 927 | 928 | jest-get-type@29.6.3: 929 | resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} 930 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 931 | 932 | jest-haste-map@29.7.0: 933 | resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} 934 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 935 | 936 | jest-leak-detector@29.7.0: 937 | resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} 938 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 939 | 940 | jest-matcher-utils@29.7.0: 941 | resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} 942 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 943 | 944 | jest-message-util@29.7.0: 945 | resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} 946 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 947 | 948 | jest-mock@29.7.0: 949 | resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} 950 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 951 | 952 | jest-pnp-resolver@1.2.3: 953 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 954 | engines: {node: '>=6'} 955 | peerDependencies: 956 | jest-resolve: '*' 957 | peerDependenciesMeta: 958 | jest-resolve: 959 | optional: true 960 | 961 | jest-regex-util@29.6.3: 962 | resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} 963 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 964 | 965 | jest-resolve-dependencies@29.7.0: 966 | resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} 967 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 968 | 969 | jest-resolve@29.7.0: 970 | resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} 971 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 972 | 973 | jest-runner@29.7.0: 974 | resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} 975 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 976 | 977 | jest-runtime@29.7.0: 978 | resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} 979 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 980 | 981 | jest-snapshot@29.7.0: 982 | resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} 983 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 984 | 985 | jest-util@29.7.0: 986 | resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} 987 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 988 | 989 | jest-validate@29.7.0: 990 | resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} 991 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 992 | 993 | jest-watcher@29.7.0: 994 | resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} 995 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 996 | 997 | jest-worker@29.7.0: 998 | resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} 999 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1000 | 1001 | jest@29.7.0: 1002 | resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} 1003 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1004 | hasBin: true 1005 | peerDependencies: 1006 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 1007 | peerDependenciesMeta: 1008 | node-notifier: 1009 | optional: true 1010 | 1011 | js-tokens@4.0.0: 1012 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1013 | 1014 | js-yaml@3.14.1: 1015 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 1016 | hasBin: true 1017 | 1018 | js-yaml@4.1.0: 1019 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1020 | hasBin: true 1021 | 1022 | jsesc@2.5.2: 1023 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 1024 | engines: {node: '>=4'} 1025 | hasBin: true 1026 | 1027 | json-buffer@3.0.1: 1028 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1029 | 1030 | json-parse-even-better-errors@2.3.1: 1031 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1032 | 1033 | json-schema-traverse@0.4.1: 1034 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1035 | 1036 | json-stable-stringify-without-jsonify@1.0.1: 1037 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1038 | 1039 | json5@2.2.3: 1040 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1041 | engines: {node: '>=6'} 1042 | hasBin: true 1043 | 1044 | keyv@4.5.4: 1045 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1046 | 1047 | kleur@3.0.3: 1048 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 1049 | engines: {node: '>=6'} 1050 | 1051 | leven@3.1.0: 1052 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 1053 | engines: {node: '>=6'} 1054 | 1055 | levn@0.4.1: 1056 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1057 | engines: {node: '>= 0.8.0'} 1058 | 1059 | lines-and-columns@1.2.4: 1060 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1061 | 1062 | locate-path@5.0.0: 1063 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1064 | engines: {node: '>=8'} 1065 | 1066 | locate-path@6.0.0: 1067 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1068 | engines: {node: '>=10'} 1069 | 1070 | lodash.memoize@4.1.2: 1071 | resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} 1072 | 1073 | lodash.merge@4.6.2: 1074 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1075 | 1076 | lru-cache@5.1.1: 1077 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1078 | 1079 | make-dir@4.0.0: 1080 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 1081 | engines: {node: '>=10'} 1082 | 1083 | make-error@1.3.6: 1084 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 1085 | 1086 | makeerror@1.0.12: 1087 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 1088 | 1089 | merge-stream@2.0.0: 1090 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1091 | 1092 | micromatch@4.0.7: 1093 | resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} 1094 | engines: {node: '>=8.6'} 1095 | 1096 | mimic-fn@2.1.0: 1097 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1098 | engines: {node: '>=6'} 1099 | 1100 | minimatch@3.1.2: 1101 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1102 | 1103 | minimatch@5.1.6: 1104 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 1105 | engines: {node: '>=10'} 1106 | 1107 | ms@2.1.2: 1108 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1109 | 1110 | natural-compare@1.4.0: 1111 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1112 | 1113 | node-int64@0.4.0: 1114 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 1115 | 1116 | node-releases@2.0.18: 1117 | resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} 1118 | 1119 | normalize-path@3.0.0: 1120 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1121 | engines: {node: '>=0.10.0'} 1122 | 1123 | npm-run-path@4.0.1: 1124 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1125 | engines: {node: '>=8'} 1126 | 1127 | once@1.4.0: 1128 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1129 | 1130 | onetime@5.1.2: 1131 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1132 | engines: {node: '>=6'} 1133 | 1134 | optionator@0.9.4: 1135 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1136 | engines: {node: '>= 0.8.0'} 1137 | 1138 | p-limit@2.3.0: 1139 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1140 | engines: {node: '>=6'} 1141 | 1142 | p-limit@3.1.0: 1143 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1144 | engines: {node: '>=10'} 1145 | 1146 | p-locate@4.1.0: 1147 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1148 | engines: {node: '>=8'} 1149 | 1150 | p-locate@5.0.0: 1151 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1152 | engines: {node: '>=10'} 1153 | 1154 | p-try@2.2.0: 1155 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1156 | engines: {node: '>=6'} 1157 | 1158 | parent-module@1.0.1: 1159 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1160 | engines: {node: '>=6'} 1161 | 1162 | parse-json@5.2.0: 1163 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1164 | engines: {node: '>=8'} 1165 | 1166 | path-exists@4.0.0: 1167 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1168 | engines: {node: '>=8'} 1169 | 1170 | path-is-absolute@1.0.1: 1171 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1172 | engines: {node: '>=0.10.0'} 1173 | 1174 | path-key@3.1.1: 1175 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1176 | engines: {node: '>=8'} 1177 | 1178 | path-parse@1.0.7: 1179 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1180 | 1181 | picocolors@1.0.1: 1182 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 1183 | 1184 | picomatch@2.3.1: 1185 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1186 | engines: {node: '>=8.6'} 1187 | 1188 | pirates@4.0.6: 1189 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1190 | engines: {node: '>= 6'} 1191 | 1192 | pkg-dir@4.2.0: 1193 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 1194 | engines: {node: '>=8'} 1195 | 1196 | prelude-ls@1.2.1: 1197 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1198 | engines: {node: '>= 0.8.0'} 1199 | 1200 | pretty-format@29.7.0: 1201 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 1202 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1203 | 1204 | prompts@2.4.2: 1205 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 1206 | engines: {node: '>= 6'} 1207 | 1208 | punycode@2.3.1: 1209 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1210 | engines: {node: '>=6'} 1211 | 1212 | pure-rand@6.1.0: 1213 | resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} 1214 | 1215 | queue-microtask@1.2.3: 1216 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1217 | 1218 | react-is@18.3.1: 1219 | resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} 1220 | 1221 | require-directory@2.1.1: 1222 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1223 | engines: {node: '>=0.10.0'} 1224 | 1225 | resolve-cwd@3.0.0: 1226 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 1227 | engines: {node: '>=8'} 1228 | 1229 | resolve-from@4.0.0: 1230 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1231 | engines: {node: '>=4'} 1232 | 1233 | resolve-from@5.0.0: 1234 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1235 | engines: {node: '>=8'} 1236 | 1237 | resolve.exports@2.0.2: 1238 | resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} 1239 | engines: {node: '>=10'} 1240 | 1241 | resolve@1.22.8: 1242 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1243 | hasBin: true 1244 | 1245 | reusify@1.0.4: 1246 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1247 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1248 | 1249 | run-parallel@1.2.0: 1250 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1251 | 1252 | semver@6.3.1: 1253 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1254 | hasBin: true 1255 | 1256 | semver@7.6.3: 1257 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1258 | engines: {node: '>=10'} 1259 | hasBin: true 1260 | 1261 | shebang-command@2.0.0: 1262 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1263 | engines: {node: '>=8'} 1264 | 1265 | shebang-regex@3.0.0: 1266 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1267 | engines: {node: '>=8'} 1268 | 1269 | signal-exit@3.0.7: 1270 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1271 | 1272 | sisteransi@1.0.5: 1273 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 1274 | 1275 | slash@3.0.0: 1276 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1277 | engines: {node: '>=8'} 1278 | 1279 | source-map-support@0.5.13: 1280 | resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} 1281 | 1282 | source-map@0.6.1: 1283 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1284 | engines: {node: '>=0.10.0'} 1285 | 1286 | sprintf-js@1.0.3: 1287 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1288 | 1289 | stack-utils@2.0.6: 1290 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 1291 | engines: {node: '>=10'} 1292 | 1293 | string-length@4.0.2: 1294 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 1295 | engines: {node: '>=10'} 1296 | 1297 | string-width@4.2.3: 1298 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1299 | engines: {node: '>=8'} 1300 | 1301 | strip-ansi@6.0.1: 1302 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1303 | engines: {node: '>=8'} 1304 | 1305 | strip-bom@4.0.0: 1306 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 1307 | engines: {node: '>=8'} 1308 | 1309 | strip-final-newline@2.0.0: 1310 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1311 | engines: {node: '>=6'} 1312 | 1313 | strip-json-comments@3.1.1: 1314 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1315 | engines: {node: '>=8'} 1316 | 1317 | supports-color@5.5.0: 1318 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1319 | engines: {node: '>=4'} 1320 | 1321 | supports-color@7.2.0: 1322 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1323 | engines: {node: '>=8'} 1324 | 1325 | supports-color@8.1.1: 1326 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1327 | engines: {node: '>=10'} 1328 | 1329 | supports-preserve-symlinks-flag@1.0.0: 1330 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1331 | engines: {node: '>= 0.4'} 1332 | 1333 | test-exclude@6.0.0: 1334 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 1335 | engines: {node: '>=8'} 1336 | 1337 | text-table@0.2.0: 1338 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1339 | 1340 | tmpl@1.0.5: 1341 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 1342 | 1343 | to-fast-properties@2.0.0: 1344 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1345 | engines: {node: '>=4'} 1346 | 1347 | to-regex-range@5.0.1: 1348 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1349 | engines: {node: '>=8.0'} 1350 | 1351 | ts-jest@29.2.4: 1352 | resolution: {integrity: sha512-3d6tgDyhCI29HlpwIq87sNuI+3Q6GLTTCeYRHCs7vDz+/3GCMwEtV9jezLyl4ZtnBgx00I7hm8PCP8cTksMGrw==} 1353 | engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} 1354 | hasBin: true 1355 | peerDependencies: 1356 | '@babel/core': '>=7.0.0-beta.0 <8' 1357 | '@jest/transform': ^29.0.0 1358 | '@jest/types': ^29.0.0 1359 | babel-jest: ^29.0.0 1360 | esbuild: '*' 1361 | jest: ^29.0.0 1362 | typescript: '>=4.3 <6' 1363 | peerDependenciesMeta: 1364 | '@babel/core': 1365 | optional: true 1366 | '@jest/transform': 1367 | optional: true 1368 | '@jest/types': 1369 | optional: true 1370 | babel-jest: 1371 | optional: true 1372 | esbuild: 1373 | optional: true 1374 | 1375 | type-check@0.4.0: 1376 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1377 | engines: {node: '>= 0.8.0'} 1378 | 1379 | type-detect@4.0.8: 1380 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 1381 | engines: {node: '>=4'} 1382 | 1383 | type-fest@0.21.3: 1384 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 1385 | engines: {node: '>=10'} 1386 | 1387 | typescript@5.5.4: 1388 | resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} 1389 | engines: {node: '>=14.17'} 1390 | hasBin: true 1391 | 1392 | undici-types@6.19.8: 1393 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 1394 | 1395 | update-browserslist-db@1.1.0: 1396 | resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} 1397 | hasBin: true 1398 | peerDependencies: 1399 | browserslist: '>= 4.21.0' 1400 | 1401 | uri-js@4.4.1: 1402 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1403 | 1404 | v8-to-istanbul@9.3.0: 1405 | resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} 1406 | engines: {node: '>=10.12.0'} 1407 | 1408 | walker@1.0.8: 1409 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 1410 | 1411 | which@2.0.2: 1412 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1413 | engines: {node: '>= 8'} 1414 | hasBin: true 1415 | 1416 | word-wrap@1.2.5: 1417 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1418 | engines: {node: '>=0.10.0'} 1419 | 1420 | wrap-ansi@7.0.0: 1421 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1422 | engines: {node: '>=10'} 1423 | 1424 | wrappy@1.0.2: 1425 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1426 | 1427 | write-file-atomic@4.0.2: 1428 | resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} 1429 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1430 | 1431 | y18n@5.0.8: 1432 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1433 | engines: {node: '>=10'} 1434 | 1435 | yallist@3.1.1: 1436 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1437 | 1438 | yargs-parser@21.1.1: 1439 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1440 | engines: {node: '>=12'} 1441 | 1442 | yargs@17.7.2: 1443 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1444 | engines: {node: '>=12'} 1445 | 1446 | yocto-queue@0.1.0: 1447 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1448 | engines: {node: '>=10'} 1449 | 1450 | snapshots: 1451 | 1452 | '@ampproject/remapping@2.3.0': 1453 | dependencies: 1454 | '@jridgewell/gen-mapping': 0.3.5 1455 | '@jridgewell/trace-mapping': 0.3.25 1456 | 1457 | '@babel/code-frame@7.24.7': 1458 | dependencies: 1459 | '@babel/highlight': 7.24.7 1460 | picocolors: 1.0.1 1461 | 1462 | '@babel/compat-data@7.25.2': {} 1463 | 1464 | '@babel/core@7.25.2': 1465 | dependencies: 1466 | '@ampproject/remapping': 2.3.0 1467 | '@babel/code-frame': 7.24.7 1468 | '@babel/generator': 7.25.0 1469 | '@babel/helper-compilation-targets': 7.25.2 1470 | '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) 1471 | '@babel/helpers': 7.25.0 1472 | '@babel/parser': 7.25.3 1473 | '@babel/template': 7.25.0 1474 | '@babel/traverse': 7.25.3 1475 | '@babel/types': 7.25.2 1476 | convert-source-map: 2.0.0 1477 | debug: 4.3.6 1478 | gensync: 1.0.0-beta.2 1479 | json5: 2.2.3 1480 | semver: 6.3.1 1481 | transitivePeerDependencies: 1482 | - supports-color 1483 | 1484 | '@babel/generator@7.25.0': 1485 | dependencies: 1486 | '@babel/types': 7.25.2 1487 | '@jridgewell/gen-mapping': 0.3.5 1488 | '@jridgewell/trace-mapping': 0.3.25 1489 | jsesc: 2.5.2 1490 | 1491 | '@babel/helper-compilation-targets@7.25.2': 1492 | dependencies: 1493 | '@babel/compat-data': 7.25.2 1494 | '@babel/helper-validator-option': 7.24.8 1495 | browserslist: 4.23.3 1496 | lru-cache: 5.1.1 1497 | semver: 6.3.1 1498 | 1499 | '@babel/helper-module-imports@7.24.7': 1500 | dependencies: 1501 | '@babel/traverse': 7.25.3 1502 | '@babel/types': 7.25.2 1503 | transitivePeerDependencies: 1504 | - supports-color 1505 | 1506 | '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': 1507 | dependencies: 1508 | '@babel/core': 7.25.2 1509 | '@babel/helper-module-imports': 7.24.7 1510 | '@babel/helper-simple-access': 7.24.7 1511 | '@babel/helper-validator-identifier': 7.24.7 1512 | '@babel/traverse': 7.25.3 1513 | transitivePeerDependencies: 1514 | - supports-color 1515 | 1516 | '@babel/helper-plugin-utils@7.24.8': {} 1517 | 1518 | '@babel/helper-simple-access@7.24.7': 1519 | dependencies: 1520 | '@babel/traverse': 7.25.3 1521 | '@babel/types': 7.25.2 1522 | transitivePeerDependencies: 1523 | - supports-color 1524 | 1525 | '@babel/helper-string-parser@7.24.8': {} 1526 | 1527 | '@babel/helper-validator-identifier@7.24.7': {} 1528 | 1529 | '@babel/helper-validator-option@7.24.8': {} 1530 | 1531 | '@babel/helpers@7.25.0': 1532 | dependencies: 1533 | '@babel/template': 7.25.0 1534 | '@babel/types': 7.25.2 1535 | 1536 | '@babel/highlight@7.24.7': 1537 | dependencies: 1538 | '@babel/helper-validator-identifier': 7.24.7 1539 | chalk: 2.4.2 1540 | js-tokens: 4.0.0 1541 | picocolors: 1.0.1 1542 | 1543 | '@babel/parser@7.25.3': 1544 | dependencies: 1545 | '@babel/types': 7.25.2 1546 | 1547 | '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': 1548 | dependencies: 1549 | '@babel/core': 7.25.2 1550 | '@babel/helper-plugin-utils': 7.24.8 1551 | 1552 | '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2)': 1553 | dependencies: 1554 | '@babel/core': 7.25.2 1555 | '@babel/helper-plugin-utils': 7.24.8 1556 | 1557 | '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': 1558 | dependencies: 1559 | '@babel/core': 7.25.2 1560 | '@babel/helper-plugin-utils': 7.24.8 1561 | 1562 | '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': 1563 | dependencies: 1564 | '@babel/core': 7.25.2 1565 | '@babel/helper-plugin-utils': 7.24.8 1566 | 1567 | '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2)': 1568 | dependencies: 1569 | '@babel/core': 7.25.2 1570 | '@babel/helper-plugin-utils': 7.24.8 1571 | 1572 | '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': 1573 | dependencies: 1574 | '@babel/core': 7.25.2 1575 | '@babel/helper-plugin-utils': 7.24.8 1576 | 1577 | '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': 1578 | dependencies: 1579 | '@babel/core': 7.25.2 1580 | '@babel/helper-plugin-utils': 7.24.8 1581 | 1582 | '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': 1583 | dependencies: 1584 | '@babel/core': 7.25.2 1585 | '@babel/helper-plugin-utils': 7.24.8 1586 | 1587 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': 1588 | dependencies: 1589 | '@babel/core': 7.25.2 1590 | '@babel/helper-plugin-utils': 7.24.8 1591 | 1592 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': 1593 | dependencies: 1594 | '@babel/core': 7.25.2 1595 | '@babel/helper-plugin-utils': 7.24.8 1596 | 1597 | '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': 1598 | dependencies: 1599 | '@babel/core': 7.25.2 1600 | '@babel/helper-plugin-utils': 7.24.8 1601 | 1602 | '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': 1603 | dependencies: 1604 | '@babel/core': 7.25.2 1605 | '@babel/helper-plugin-utils': 7.24.8 1606 | 1607 | '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': 1608 | dependencies: 1609 | '@babel/core': 7.25.2 1610 | '@babel/helper-plugin-utils': 7.24.8 1611 | 1612 | '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': 1613 | dependencies: 1614 | '@babel/core': 7.25.2 1615 | '@babel/helper-plugin-utils': 7.24.8 1616 | 1617 | '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': 1618 | dependencies: 1619 | '@babel/core': 7.25.2 1620 | '@babel/helper-plugin-utils': 7.24.8 1621 | 1622 | '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': 1623 | dependencies: 1624 | '@babel/core': 7.25.2 1625 | '@babel/helper-plugin-utils': 7.24.8 1626 | 1627 | '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2)': 1628 | dependencies: 1629 | '@babel/core': 7.25.2 1630 | '@babel/helper-plugin-utils': 7.24.8 1631 | 1632 | '@babel/template@7.25.0': 1633 | dependencies: 1634 | '@babel/code-frame': 7.24.7 1635 | '@babel/parser': 7.25.3 1636 | '@babel/types': 7.25.2 1637 | 1638 | '@babel/traverse@7.25.3': 1639 | dependencies: 1640 | '@babel/code-frame': 7.24.7 1641 | '@babel/generator': 7.25.0 1642 | '@babel/parser': 7.25.3 1643 | '@babel/template': 7.25.0 1644 | '@babel/types': 7.25.2 1645 | debug: 4.3.6 1646 | globals: 11.12.0 1647 | transitivePeerDependencies: 1648 | - supports-color 1649 | 1650 | '@babel/types@7.25.2': 1651 | dependencies: 1652 | '@babel/helper-string-parser': 7.24.8 1653 | '@babel/helper-validator-identifier': 7.24.7 1654 | to-fast-properties: 2.0.0 1655 | 1656 | '@bcoe/v8-coverage@0.2.3': {} 1657 | 1658 | '@eslint-community/eslint-utils@4.4.0(eslint@9.9.0)': 1659 | dependencies: 1660 | eslint: 9.9.0 1661 | eslint-visitor-keys: 3.4.3 1662 | 1663 | '@eslint-community/regexpp@4.11.0': {} 1664 | 1665 | '@eslint/config-array@0.17.1': 1666 | dependencies: 1667 | '@eslint/object-schema': 2.1.4 1668 | debug: 4.3.6 1669 | minimatch: 3.1.2 1670 | transitivePeerDependencies: 1671 | - supports-color 1672 | 1673 | '@eslint/eslintrc@3.1.0': 1674 | dependencies: 1675 | ajv: 6.12.6 1676 | debug: 4.3.6 1677 | espree: 10.1.0 1678 | globals: 14.0.0 1679 | ignore: 5.3.2 1680 | import-fresh: 3.3.0 1681 | js-yaml: 4.1.0 1682 | minimatch: 3.1.2 1683 | strip-json-comments: 3.1.1 1684 | transitivePeerDependencies: 1685 | - supports-color 1686 | 1687 | '@eslint/js@9.9.0': {} 1688 | 1689 | '@eslint/object-schema@2.1.4': {} 1690 | 1691 | '@humanwhocodes/module-importer@1.0.1': {} 1692 | 1693 | '@humanwhocodes/retry@0.3.0': {} 1694 | 1695 | '@istanbuljs/load-nyc-config@1.1.0': 1696 | dependencies: 1697 | camelcase: 5.3.1 1698 | find-up: 4.1.0 1699 | get-package-type: 0.1.0 1700 | js-yaml: 3.14.1 1701 | resolve-from: 5.0.0 1702 | 1703 | '@istanbuljs/schema@0.1.3': {} 1704 | 1705 | '@jest/console@29.7.0': 1706 | dependencies: 1707 | '@jest/types': 29.6.3 1708 | '@types/node': 22.4.2 1709 | chalk: 4.1.2 1710 | jest-message-util: 29.7.0 1711 | jest-util: 29.7.0 1712 | slash: 3.0.0 1713 | 1714 | '@jest/core@29.7.0': 1715 | dependencies: 1716 | '@jest/console': 29.7.0 1717 | '@jest/reporters': 29.7.0 1718 | '@jest/test-result': 29.7.0 1719 | '@jest/transform': 29.7.0 1720 | '@jest/types': 29.6.3 1721 | '@types/node': 22.4.2 1722 | ansi-escapes: 4.3.2 1723 | chalk: 4.1.2 1724 | ci-info: 3.9.0 1725 | exit: 0.1.2 1726 | graceful-fs: 4.2.11 1727 | jest-changed-files: 29.7.0 1728 | jest-config: 29.7.0(@types/node@22.4.2) 1729 | jest-haste-map: 29.7.0 1730 | jest-message-util: 29.7.0 1731 | jest-regex-util: 29.6.3 1732 | jest-resolve: 29.7.0 1733 | jest-resolve-dependencies: 29.7.0 1734 | jest-runner: 29.7.0 1735 | jest-runtime: 29.7.0 1736 | jest-snapshot: 29.7.0 1737 | jest-util: 29.7.0 1738 | jest-validate: 29.7.0 1739 | jest-watcher: 29.7.0 1740 | micromatch: 4.0.7 1741 | pretty-format: 29.7.0 1742 | slash: 3.0.0 1743 | strip-ansi: 6.0.1 1744 | transitivePeerDependencies: 1745 | - babel-plugin-macros 1746 | - supports-color 1747 | - ts-node 1748 | 1749 | '@jest/environment@29.7.0': 1750 | dependencies: 1751 | '@jest/fake-timers': 29.7.0 1752 | '@jest/types': 29.6.3 1753 | '@types/node': 22.4.2 1754 | jest-mock: 29.7.0 1755 | 1756 | '@jest/expect-utils@29.7.0': 1757 | dependencies: 1758 | jest-get-type: 29.6.3 1759 | 1760 | '@jest/expect@29.7.0': 1761 | dependencies: 1762 | expect: 29.7.0 1763 | jest-snapshot: 29.7.0 1764 | transitivePeerDependencies: 1765 | - supports-color 1766 | 1767 | '@jest/fake-timers@29.7.0': 1768 | dependencies: 1769 | '@jest/types': 29.6.3 1770 | '@sinonjs/fake-timers': 10.3.0 1771 | '@types/node': 22.4.2 1772 | jest-message-util: 29.7.0 1773 | jest-mock: 29.7.0 1774 | jest-util: 29.7.0 1775 | 1776 | '@jest/globals@29.7.0': 1777 | dependencies: 1778 | '@jest/environment': 29.7.0 1779 | '@jest/expect': 29.7.0 1780 | '@jest/types': 29.6.3 1781 | jest-mock: 29.7.0 1782 | transitivePeerDependencies: 1783 | - supports-color 1784 | 1785 | '@jest/reporters@29.7.0': 1786 | dependencies: 1787 | '@bcoe/v8-coverage': 0.2.3 1788 | '@jest/console': 29.7.0 1789 | '@jest/test-result': 29.7.0 1790 | '@jest/transform': 29.7.0 1791 | '@jest/types': 29.6.3 1792 | '@jridgewell/trace-mapping': 0.3.25 1793 | '@types/node': 22.4.2 1794 | chalk: 4.1.2 1795 | collect-v8-coverage: 1.0.2 1796 | exit: 0.1.2 1797 | glob: 7.2.3 1798 | graceful-fs: 4.2.11 1799 | istanbul-lib-coverage: 3.2.2 1800 | istanbul-lib-instrument: 6.0.3 1801 | istanbul-lib-report: 3.0.1 1802 | istanbul-lib-source-maps: 4.0.1 1803 | istanbul-reports: 3.1.7 1804 | jest-message-util: 29.7.0 1805 | jest-util: 29.7.0 1806 | jest-worker: 29.7.0 1807 | slash: 3.0.0 1808 | string-length: 4.0.2 1809 | strip-ansi: 6.0.1 1810 | v8-to-istanbul: 9.3.0 1811 | transitivePeerDependencies: 1812 | - supports-color 1813 | 1814 | '@jest/schemas@29.6.3': 1815 | dependencies: 1816 | '@sinclair/typebox': 0.27.8 1817 | 1818 | '@jest/source-map@29.6.3': 1819 | dependencies: 1820 | '@jridgewell/trace-mapping': 0.3.25 1821 | callsites: 3.1.0 1822 | graceful-fs: 4.2.11 1823 | 1824 | '@jest/test-result@29.7.0': 1825 | dependencies: 1826 | '@jest/console': 29.7.0 1827 | '@jest/types': 29.6.3 1828 | '@types/istanbul-lib-coverage': 2.0.6 1829 | collect-v8-coverage: 1.0.2 1830 | 1831 | '@jest/test-sequencer@29.7.0': 1832 | dependencies: 1833 | '@jest/test-result': 29.7.0 1834 | graceful-fs: 4.2.11 1835 | jest-haste-map: 29.7.0 1836 | slash: 3.0.0 1837 | 1838 | '@jest/transform@29.7.0': 1839 | dependencies: 1840 | '@babel/core': 7.25.2 1841 | '@jest/types': 29.6.3 1842 | '@jridgewell/trace-mapping': 0.3.25 1843 | babel-plugin-istanbul: 6.1.1 1844 | chalk: 4.1.2 1845 | convert-source-map: 2.0.0 1846 | fast-json-stable-stringify: 2.1.0 1847 | graceful-fs: 4.2.11 1848 | jest-haste-map: 29.7.0 1849 | jest-regex-util: 29.6.3 1850 | jest-util: 29.7.0 1851 | micromatch: 4.0.7 1852 | pirates: 4.0.6 1853 | slash: 3.0.0 1854 | write-file-atomic: 4.0.2 1855 | transitivePeerDependencies: 1856 | - supports-color 1857 | 1858 | '@jest/types@29.6.3': 1859 | dependencies: 1860 | '@jest/schemas': 29.6.3 1861 | '@types/istanbul-lib-coverage': 2.0.6 1862 | '@types/istanbul-reports': 3.0.4 1863 | '@types/node': 22.4.2 1864 | '@types/yargs': 17.0.33 1865 | chalk: 4.1.2 1866 | 1867 | '@jridgewell/gen-mapping@0.3.5': 1868 | dependencies: 1869 | '@jridgewell/set-array': 1.2.1 1870 | '@jridgewell/sourcemap-codec': 1.5.0 1871 | '@jridgewell/trace-mapping': 0.3.25 1872 | 1873 | '@jridgewell/resolve-uri@3.1.2': {} 1874 | 1875 | '@jridgewell/set-array@1.2.1': {} 1876 | 1877 | '@jridgewell/sourcemap-codec@1.5.0': {} 1878 | 1879 | '@jridgewell/trace-mapping@0.3.25': 1880 | dependencies: 1881 | '@jridgewell/resolve-uri': 3.1.2 1882 | '@jridgewell/sourcemap-codec': 1.5.0 1883 | 1884 | '@nodelib/fs.scandir@2.1.5': 1885 | dependencies: 1886 | '@nodelib/fs.stat': 2.0.5 1887 | run-parallel: 1.2.0 1888 | 1889 | '@nodelib/fs.stat@2.0.5': {} 1890 | 1891 | '@nodelib/fs.walk@1.2.8': 1892 | dependencies: 1893 | '@nodelib/fs.scandir': 2.1.5 1894 | fastq: 1.17.1 1895 | 1896 | '@sinclair/typebox@0.27.8': {} 1897 | 1898 | '@sinonjs/commons@3.0.1': 1899 | dependencies: 1900 | type-detect: 4.0.8 1901 | 1902 | '@sinonjs/fake-timers@10.3.0': 1903 | dependencies: 1904 | '@sinonjs/commons': 3.0.1 1905 | 1906 | '@types/babel__core@7.20.5': 1907 | dependencies: 1908 | '@babel/parser': 7.25.3 1909 | '@babel/types': 7.25.2 1910 | '@types/babel__generator': 7.6.8 1911 | '@types/babel__template': 7.4.4 1912 | '@types/babel__traverse': 7.20.6 1913 | 1914 | '@types/babel__generator@7.6.8': 1915 | dependencies: 1916 | '@babel/types': 7.25.2 1917 | 1918 | '@types/babel__template@7.4.4': 1919 | dependencies: 1920 | '@babel/parser': 7.25.3 1921 | '@babel/types': 7.25.2 1922 | 1923 | '@types/babel__traverse@7.20.6': 1924 | dependencies: 1925 | '@babel/types': 7.25.2 1926 | 1927 | '@types/graceful-fs@4.1.9': 1928 | dependencies: 1929 | '@types/node': 22.4.2 1930 | 1931 | '@types/istanbul-lib-coverage@2.0.6': {} 1932 | 1933 | '@types/istanbul-lib-report@3.0.3': 1934 | dependencies: 1935 | '@types/istanbul-lib-coverage': 2.0.6 1936 | 1937 | '@types/istanbul-reports@3.0.4': 1938 | dependencies: 1939 | '@types/istanbul-lib-report': 3.0.3 1940 | 1941 | '@types/jest@29.5.12': 1942 | dependencies: 1943 | expect: 29.7.0 1944 | pretty-format: 29.7.0 1945 | 1946 | '@types/node@22.4.2': 1947 | dependencies: 1948 | undici-types: 6.19.8 1949 | 1950 | '@types/stack-utils@2.0.3': {} 1951 | 1952 | '@types/yargs-parser@21.0.3': {} 1953 | 1954 | '@types/yargs@17.0.33': 1955 | dependencies: 1956 | '@types/yargs-parser': 21.0.3 1957 | 1958 | acorn-jsx@5.3.2(acorn@8.12.1): 1959 | dependencies: 1960 | acorn: 8.12.1 1961 | 1962 | acorn@8.12.1: {} 1963 | 1964 | ajv@6.12.6: 1965 | dependencies: 1966 | fast-deep-equal: 3.1.3 1967 | fast-json-stable-stringify: 2.1.0 1968 | json-schema-traverse: 0.4.1 1969 | uri-js: 4.4.1 1970 | 1971 | ansi-escapes@4.3.2: 1972 | dependencies: 1973 | type-fest: 0.21.3 1974 | 1975 | ansi-regex@5.0.1: {} 1976 | 1977 | ansi-styles@3.2.1: 1978 | dependencies: 1979 | color-convert: 1.9.3 1980 | 1981 | ansi-styles@4.3.0: 1982 | dependencies: 1983 | color-convert: 2.0.1 1984 | 1985 | ansi-styles@5.2.0: {} 1986 | 1987 | anymatch@3.1.3: 1988 | dependencies: 1989 | normalize-path: 3.0.0 1990 | picomatch: 2.3.1 1991 | 1992 | argparse@1.0.10: 1993 | dependencies: 1994 | sprintf-js: 1.0.3 1995 | 1996 | argparse@2.0.1: {} 1997 | 1998 | async@3.2.6: {} 1999 | 2000 | babel-jest@29.7.0(@babel/core@7.25.2): 2001 | dependencies: 2002 | '@babel/core': 7.25.2 2003 | '@jest/transform': 29.7.0 2004 | '@types/babel__core': 7.20.5 2005 | babel-plugin-istanbul: 6.1.1 2006 | babel-preset-jest: 29.6.3(@babel/core@7.25.2) 2007 | chalk: 4.1.2 2008 | graceful-fs: 4.2.11 2009 | slash: 3.0.0 2010 | transitivePeerDependencies: 2011 | - supports-color 2012 | 2013 | babel-plugin-istanbul@6.1.1: 2014 | dependencies: 2015 | '@babel/helper-plugin-utils': 7.24.8 2016 | '@istanbuljs/load-nyc-config': 1.1.0 2017 | '@istanbuljs/schema': 0.1.3 2018 | istanbul-lib-instrument: 5.2.1 2019 | test-exclude: 6.0.0 2020 | transitivePeerDependencies: 2021 | - supports-color 2022 | 2023 | babel-plugin-jest-hoist@29.6.3: 2024 | dependencies: 2025 | '@babel/template': 7.25.0 2026 | '@babel/types': 7.25.2 2027 | '@types/babel__core': 7.20.5 2028 | '@types/babel__traverse': 7.20.6 2029 | 2030 | babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.2): 2031 | dependencies: 2032 | '@babel/core': 7.25.2 2033 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) 2034 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) 2035 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) 2036 | '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) 2037 | '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) 2038 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) 2039 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) 2040 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) 2041 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) 2042 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) 2043 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) 2044 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) 2045 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) 2046 | '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) 2047 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) 2048 | 2049 | babel-preset-jest@29.6.3(@babel/core@7.25.2): 2050 | dependencies: 2051 | '@babel/core': 7.25.2 2052 | babel-plugin-jest-hoist: 29.6.3 2053 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) 2054 | 2055 | balanced-match@1.0.2: {} 2056 | 2057 | brace-expansion@1.1.11: 2058 | dependencies: 2059 | balanced-match: 1.0.2 2060 | concat-map: 0.0.1 2061 | 2062 | brace-expansion@2.0.1: 2063 | dependencies: 2064 | balanced-match: 1.0.2 2065 | 2066 | braces@3.0.3: 2067 | dependencies: 2068 | fill-range: 7.1.1 2069 | 2070 | browserslist@4.23.3: 2071 | dependencies: 2072 | caniuse-lite: 1.0.30001651 2073 | electron-to-chromium: 1.5.13 2074 | node-releases: 2.0.18 2075 | update-browserslist-db: 1.1.0(browserslist@4.23.3) 2076 | 2077 | bs-logger@0.2.6: 2078 | dependencies: 2079 | fast-json-stable-stringify: 2.1.0 2080 | 2081 | bser@2.1.1: 2082 | dependencies: 2083 | node-int64: 0.4.0 2084 | 2085 | buffer-from@1.1.2: {} 2086 | 2087 | callsites@3.1.0: {} 2088 | 2089 | camelcase@5.3.1: {} 2090 | 2091 | camelcase@6.3.0: {} 2092 | 2093 | caniuse-lite@1.0.30001651: {} 2094 | 2095 | chalk@2.4.2: 2096 | dependencies: 2097 | ansi-styles: 3.2.1 2098 | escape-string-regexp: 1.0.5 2099 | supports-color: 5.5.0 2100 | 2101 | chalk@4.1.2: 2102 | dependencies: 2103 | ansi-styles: 4.3.0 2104 | supports-color: 7.2.0 2105 | 2106 | char-regex@1.0.2: {} 2107 | 2108 | ci-info@3.9.0: {} 2109 | 2110 | cjs-module-lexer@1.3.1: {} 2111 | 2112 | cliui@8.0.1: 2113 | dependencies: 2114 | string-width: 4.2.3 2115 | strip-ansi: 6.0.1 2116 | wrap-ansi: 7.0.0 2117 | 2118 | co@4.6.0: {} 2119 | 2120 | collect-v8-coverage@1.0.2: {} 2121 | 2122 | color-convert@1.9.3: 2123 | dependencies: 2124 | color-name: 1.1.3 2125 | 2126 | color-convert@2.0.1: 2127 | dependencies: 2128 | color-name: 1.1.4 2129 | 2130 | color-name@1.1.3: {} 2131 | 2132 | color-name@1.1.4: {} 2133 | 2134 | concat-map@0.0.1: {} 2135 | 2136 | convert-source-map@2.0.0: {} 2137 | 2138 | create-jest@29.7.0(@types/node@22.4.2): 2139 | dependencies: 2140 | '@jest/types': 29.6.3 2141 | chalk: 4.1.2 2142 | exit: 0.1.2 2143 | graceful-fs: 4.2.11 2144 | jest-config: 29.7.0(@types/node@22.4.2) 2145 | jest-util: 29.7.0 2146 | prompts: 2.4.2 2147 | transitivePeerDependencies: 2148 | - '@types/node' 2149 | - babel-plugin-macros 2150 | - supports-color 2151 | - ts-node 2152 | 2153 | cross-spawn@7.0.3: 2154 | dependencies: 2155 | path-key: 3.1.1 2156 | shebang-command: 2.0.0 2157 | which: 2.0.2 2158 | 2159 | debug@4.3.6: 2160 | dependencies: 2161 | ms: 2.1.2 2162 | 2163 | dedent@1.5.3: {} 2164 | 2165 | deep-is@0.1.4: {} 2166 | 2167 | deepmerge@4.3.1: {} 2168 | 2169 | detect-newline@3.1.0: {} 2170 | 2171 | diff-sequences@29.6.3: {} 2172 | 2173 | ejs@3.1.10: 2174 | dependencies: 2175 | jake: 10.9.2 2176 | 2177 | electron-to-chromium@1.5.13: {} 2178 | 2179 | emittery@0.13.1: {} 2180 | 2181 | emoji-regex@8.0.0: {} 2182 | 2183 | error-ex@1.3.2: 2184 | dependencies: 2185 | is-arrayish: 0.2.1 2186 | 2187 | escalade@3.1.2: {} 2188 | 2189 | escape-string-regexp@1.0.5: {} 2190 | 2191 | escape-string-regexp@2.0.0: {} 2192 | 2193 | escape-string-regexp@4.0.0: {} 2194 | 2195 | eslint-scope@8.0.2: 2196 | dependencies: 2197 | esrecurse: 4.3.0 2198 | estraverse: 5.3.0 2199 | 2200 | eslint-visitor-keys@3.4.3: {} 2201 | 2202 | eslint-visitor-keys@4.0.0: {} 2203 | 2204 | eslint@9.9.0: 2205 | dependencies: 2206 | '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0) 2207 | '@eslint-community/regexpp': 4.11.0 2208 | '@eslint/config-array': 0.17.1 2209 | '@eslint/eslintrc': 3.1.0 2210 | '@eslint/js': 9.9.0 2211 | '@humanwhocodes/module-importer': 1.0.1 2212 | '@humanwhocodes/retry': 0.3.0 2213 | '@nodelib/fs.walk': 1.2.8 2214 | ajv: 6.12.6 2215 | chalk: 4.1.2 2216 | cross-spawn: 7.0.3 2217 | debug: 4.3.6 2218 | escape-string-regexp: 4.0.0 2219 | eslint-scope: 8.0.2 2220 | eslint-visitor-keys: 4.0.0 2221 | espree: 10.1.0 2222 | esquery: 1.6.0 2223 | esutils: 2.0.3 2224 | fast-deep-equal: 3.1.3 2225 | file-entry-cache: 8.0.0 2226 | find-up: 5.0.0 2227 | glob-parent: 6.0.2 2228 | ignore: 5.3.2 2229 | imurmurhash: 0.1.4 2230 | is-glob: 4.0.3 2231 | is-path-inside: 3.0.3 2232 | json-stable-stringify-without-jsonify: 1.0.1 2233 | levn: 0.4.1 2234 | lodash.merge: 4.6.2 2235 | minimatch: 3.1.2 2236 | natural-compare: 1.4.0 2237 | optionator: 0.9.4 2238 | strip-ansi: 6.0.1 2239 | text-table: 0.2.0 2240 | transitivePeerDependencies: 2241 | - supports-color 2242 | 2243 | espree@10.1.0: 2244 | dependencies: 2245 | acorn: 8.12.1 2246 | acorn-jsx: 5.3.2(acorn@8.12.1) 2247 | eslint-visitor-keys: 4.0.0 2248 | 2249 | esprima@4.0.1: {} 2250 | 2251 | esquery@1.6.0: 2252 | dependencies: 2253 | estraverse: 5.3.0 2254 | 2255 | esrecurse@4.3.0: 2256 | dependencies: 2257 | estraverse: 5.3.0 2258 | 2259 | estraverse@5.3.0: {} 2260 | 2261 | esutils@2.0.3: {} 2262 | 2263 | execa@5.1.1: 2264 | dependencies: 2265 | cross-spawn: 7.0.3 2266 | get-stream: 6.0.1 2267 | human-signals: 2.1.0 2268 | is-stream: 2.0.1 2269 | merge-stream: 2.0.0 2270 | npm-run-path: 4.0.1 2271 | onetime: 5.1.2 2272 | signal-exit: 3.0.7 2273 | strip-final-newline: 2.0.0 2274 | 2275 | exit@0.1.2: {} 2276 | 2277 | expect@29.7.0: 2278 | dependencies: 2279 | '@jest/expect-utils': 29.7.0 2280 | jest-get-type: 29.6.3 2281 | jest-matcher-utils: 29.7.0 2282 | jest-message-util: 29.7.0 2283 | jest-util: 29.7.0 2284 | 2285 | fast-deep-equal@3.1.3: {} 2286 | 2287 | fast-json-stable-stringify@2.1.0: {} 2288 | 2289 | fast-levenshtein@2.0.6: {} 2290 | 2291 | fastq@1.17.1: 2292 | dependencies: 2293 | reusify: 1.0.4 2294 | 2295 | fb-watchman@2.0.2: 2296 | dependencies: 2297 | bser: 2.1.1 2298 | 2299 | file-entry-cache@8.0.0: 2300 | dependencies: 2301 | flat-cache: 4.0.1 2302 | 2303 | filelist@1.0.4: 2304 | dependencies: 2305 | minimatch: 5.1.6 2306 | 2307 | fill-range@7.1.1: 2308 | dependencies: 2309 | to-regex-range: 5.0.1 2310 | 2311 | find-up@4.1.0: 2312 | dependencies: 2313 | locate-path: 5.0.0 2314 | path-exists: 4.0.0 2315 | 2316 | find-up@5.0.0: 2317 | dependencies: 2318 | locate-path: 6.0.0 2319 | path-exists: 4.0.0 2320 | 2321 | flat-cache@4.0.1: 2322 | dependencies: 2323 | flatted: 3.3.1 2324 | keyv: 4.5.4 2325 | 2326 | flatted@3.3.1: {} 2327 | 2328 | fs.realpath@1.0.0: {} 2329 | 2330 | fsevents@2.3.3: 2331 | optional: true 2332 | 2333 | function-bind@1.1.2: {} 2334 | 2335 | gensync@1.0.0-beta.2: {} 2336 | 2337 | get-caller-file@2.0.5: {} 2338 | 2339 | get-package-type@0.1.0: {} 2340 | 2341 | get-stream@6.0.1: {} 2342 | 2343 | glob-parent@6.0.2: 2344 | dependencies: 2345 | is-glob: 4.0.3 2346 | 2347 | glob@7.2.3: 2348 | dependencies: 2349 | fs.realpath: 1.0.0 2350 | inflight: 1.0.6 2351 | inherits: 2.0.4 2352 | minimatch: 3.1.2 2353 | once: 1.4.0 2354 | path-is-absolute: 1.0.1 2355 | 2356 | globals@11.12.0: {} 2357 | 2358 | globals@14.0.0: {} 2359 | 2360 | graceful-fs@4.2.11: {} 2361 | 2362 | has-flag@3.0.0: {} 2363 | 2364 | has-flag@4.0.0: {} 2365 | 2366 | hasown@2.0.2: 2367 | dependencies: 2368 | function-bind: 1.1.2 2369 | 2370 | html-escaper@2.0.2: {} 2371 | 2372 | human-signals@2.1.0: {} 2373 | 2374 | ignore@5.3.2: {} 2375 | 2376 | import-fresh@3.3.0: 2377 | dependencies: 2378 | parent-module: 1.0.1 2379 | resolve-from: 4.0.0 2380 | 2381 | import-local@3.2.0: 2382 | dependencies: 2383 | pkg-dir: 4.2.0 2384 | resolve-cwd: 3.0.0 2385 | 2386 | imurmurhash@0.1.4: {} 2387 | 2388 | inflight@1.0.6: 2389 | dependencies: 2390 | once: 1.4.0 2391 | wrappy: 1.0.2 2392 | 2393 | inherits@2.0.4: {} 2394 | 2395 | is-arrayish@0.2.1: {} 2396 | 2397 | is-core-module@2.15.0: 2398 | dependencies: 2399 | hasown: 2.0.2 2400 | 2401 | is-extglob@2.1.1: {} 2402 | 2403 | is-fullwidth-code-point@3.0.0: {} 2404 | 2405 | is-generator-fn@2.1.0: {} 2406 | 2407 | is-glob@4.0.3: 2408 | dependencies: 2409 | is-extglob: 2.1.1 2410 | 2411 | is-number@7.0.0: {} 2412 | 2413 | is-path-inside@3.0.3: {} 2414 | 2415 | is-stream@2.0.1: {} 2416 | 2417 | isexe@2.0.0: {} 2418 | 2419 | istanbul-lib-coverage@3.2.2: {} 2420 | 2421 | istanbul-lib-instrument@5.2.1: 2422 | dependencies: 2423 | '@babel/core': 7.25.2 2424 | '@babel/parser': 7.25.3 2425 | '@istanbuljs/schema': 0.1.3 2426 | istanbul-lib-coverage: 3.2.2 2427 | semver: 6.3.1 2428 | transitivePeerDependencies: 2429 | - supports-color 2430 | 2431 | istanbul-lib-instrument@6.0.3: 2432 | dependencies: 2433 | '@babel/core': 7.25.2 2434 | '@babel/parser': 7.25.3 2435 | '@istanbuljs/schema': 0.1.3 2436 | istanbul-lib-coverage: 3.2.2 2437 | semver: 7.6.3 2438 | transitivePeerDependencies: 2439 | - supports-color 2440 | 2441 | istanbul-lib-report@3.0.1: 2442 | dependencies: 2443 | istanbul-lib-coverage: 3.2.2 2444 | make-dir: 4.0.0 2445 | supports-color: 7.2.0 2446 | 2447 | istanbul-lib-source-maps@4.0.1: 2448 | dependencies: 2449 | debug: 4.3.6 2450 | istanbul-lib-coverage: 3.2.2 2451 | source-map: 0.6.1 2452 | transitivePeerDependencies: 2453 | - supports-color 2454 | 2455 | istanbul-reports@3.1.7: 2456 | dependencies: 2457 | html-escaper: 2.0.2 2458 | istanbul-lib-report: 3.0.1 2459 | 2460 | jake@10.9.2: 2461 | dependencies: 2462 | async: 3.2.6 2463 | chalk: 4.1.2 2464 | filelist: 1.0.4 2465 | minimatch: 3.1.2 2466 | 2467 | jest-changed-files@29.7.0: 2468 | dependencies: 2469 | execa: 5.1.1 2470 | jest-util: 29.7.0 2471 | p-limit: 3.1.0 2472 | 2473 | jest-circus@29.7.0: 2474 | dependencies: 2475 | '@jest/environment': 29.7.0 2476 | '@jest/expect': 29.7.0 2477 | '@jest/test-result': 29.7.0 2478 | '@jest/types': 29.6.3 2479 | '@types/node': 22.4.2 2480 | chalk: 4.1.2 2481 | co: 4.6.0 2482 | dedent: 1.5.3 2483 | is-generator-fn: 2.1.0 2484 | jest-each: 29.7.0 2485 | jest-matcher-utils: 29.7.0 2486 | jest-message-util: 29.7.0 2487 | jest-runtime: 29.7.0 2488 | jest-snapshot: 29.7.0 2489 | jest-util: 29.7.0 2490 | p-limit: 3.1.0 2491 | pretty-format: 29.7.0 2492 | pure-rand: 6.1.0 2493 | slash: 3.0.0 2494 | stack-utils: 2.0.6 2495 | transitivePeerDependencies: 2496 | - babel-plugin-macros 2497 | - supports-color 2498 | 2499 | jest-cli@29.7.0(@types/node@22.4.2): 2500 | dependencies: 2501 | '@jest/core': 29.7.0 2502 | '@jest/test-result': 29.7.0 2503 | '@jest/types': 29.6.3 2504 | chalk: 4.1.2 2505 | create-jest: 29.7.0(@types/node@22.4.2) 2506 | exit: 0.1.2 2507 | import-local: 3.2.0 2508 | jest-config: 29.7.0(@types/node@22.4.2) 2509 | jest-util: 29.7.0 2510 | jest-validate: 29.7.0 2511 | yargs: 17.7.2 2512 | transitivePeerDependencies: 2513 | - '@types/node' 2514 | - babel-plugin-macros 2515 | - supports-color 2516 | - ts-node 2517 | 2518 | jest-config@29.7.0(@types/node@22.4.2): 2519 | dependencies: 2520 | '@babel/core': 7.25.2 2521 | '@jest/test-sequencer': 29.7.0 2522 | '@jest/types': 29.6.3 2523 | babel-jest: 29.7.0(@babel/core@7.25.2) 2524 | chalk: 4.1.2 2525 | ci-info: 3.9.0 2526 | deepmerge: 4.3.1 2527 | glob: 7.2.3 2528 | graceful-fs: 4.2.11 2529 | jest-circus: 29.7.0 2530 | jest-environment-node: 29.7.0 2531 | jest-get-type: 29.6.3 2532 | jest-regex-util: 29.6.3 2533 | jest-resolve: 29.7.0 2534 | jest-runner: 29.7.0 2535 | jest-util: 29.7.0 2536 | jest-validate: 29.7.0 2537 | micromatch: 4.0.7 2538 | parse-json: 5.2.0 2539 | pretty-format: 29.7.0 2540 | slash: 3.0.0 2541 | strip-json-comments: 3.1.1 2542 | optionalDependencies: 2543 | '@types/node': 22.4.2 2544 | transitivePeerDependencies: 2545 | - babel-plugin-macros 2546 | - supports-color 2547 | 2548 | jest-diff@29.7.0: 2549 | dependencies: 2550 | chalk: 4.1.2 2551 | diff-sequences: 29.6.3 2552 | jest-get-type: 29.6.3 2553 | pretty-format: 29.7.0 2554 | 2555 | jest-docblock@29.7.0: 2556 | dependencies: 2557 | detect-newline: 3.1.0 2558 | 2559 | jest-each@29.7.0: 2560 | dependencies: 2561 | '@jest/types': 29.6.3 2562 | chalk: 4.1.2 2563 | jest-get-type: 29.6.3 2564 | jest-util: 29.7.0 2565 | pretty-format: 29.7.0 2566 | 2567 | jest-environment-node@29.7.0: 2568 | dependencies: 2569 | '@jest/environment': 29.7.0 2570 | '@jest/fake-timers': 29.7.0 2571 | '@jest/types': 29.6.3 2572 | '@types/node': 22.4.2 2573 | jest-mock: 29.7.0 2574 | jest-util: 29.7.0 2575 | 2576 | jest-get-type@29.6.3: {} 2577 | 2578 | jest-haste-map@29.7.0: 2579 | dependencies: 2580 | '@jest/types': 29.6.3 2581 | '@types/graceful-fs': 4.1.9 2582 | '@types/node': 22.4.2 2583 | anymatch: 3.1.3 2584 | fb-watchman: 2.0.2 2585 | graceful-fs: 4.2.11 2586 | jest-regex-util: 29.6.3 2587 | jest-util: 29.7.0 2588 | jest-worker: 29.7.0 2589 | micromatch: 4.0.7 2590 | walker: 1.0.8 2591 | optionalDependencies: 2592 | fsevents: 2.3.3 2593 | 2594 | jest-leak-detector@29.7.0: 2595 | dependencies: 2596 | jest-get-type: 29.6.3 2597 | pretty-format: 29.7.0 2598 | 2599 | jest-matcher-utils@29.7.0: 2600 | dependencies: 2601 | chalk: 4.1.2 2602 | jest-diff: 29.7.0 2603 | jest-get-type: 29.6.3 2604 | pretty-format: 29.7.0 2605 | 2606 | jest-message-util@29.7.0: 2607 | dependencies: 2608 | '@babel/code-frame': 7.24.7 2609 | '@jest/types': 29.6.3 2610 | '@types/stack-utils': 2.0.3 2611 | chalk: 4.1.2 2612 | graceful-fs: 4.2.11 2613 | micromatch: 4.0.7 2614 | pretty-format: 29.7.0 2615 | slash: 3.0.0 2616 | stack-utils: 2.0.6 2617 | 2618 | jest-mock@29.7.0: 2619 | dependencies: 2620 | '@jest/types': 29.6.3 2621 | '@types/node': 22.4.2 2622 | jest-util: 29.7.0 2623 | 2624 | jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): 2625 | optionalDependencies: 2626 | jest-resolve: 29.7.0 2627 | 2628 | jest-regex-util@29.6.3: {} 2629 | 2630 | jest-resolve-dependencies@29.7.0: 2631 | dependencies: 2632 | jest-regex-util: 29.6.3 2633 | jest-snapshot: 29.7.0 2634 | transitivePeerDependencies: 2635 | - supports-color 2636 | 2637 | jest-resolve@29.7.0: 2638 | dependencies: 2639 | chalk: 4.1.2 2640 | graceful-fs: 4.2.11 2641 | jest-haste-map: 29.7.0 2642 | jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) 2643 | jest-util: 29.7.0 2644 | jest-validate: 29.7.0 2645 | resolve: 1.22.8 2646 | resolve.exports: 2.0.2 2647 | slash: 3.0.0 2648 | 2649 | jest-runner@29.7.0: 2650 | dependencies: 2651 | '@jest/console': 29.7.0 2652 | '@jest/environment': 29.7.0 2653 | '@jest/test-result': 29.7.0 2654 | '@jest/transform': 29.7.0 2655 | '@jest/types': 29.6.3 2656 | '@types/node': 22.4.2 2657 | chalk: 4.1.2 2658 | emittery: 0.13.1 2659 | graceful-fs: 4.2.11 2660 | jest-docblock: 29.7.0 2661 | jest-environment-node: 29.7.0 2662 | jest-haste-map: 29.7.0 2663 | jest-leak-detector: 29.7.0 2664 | jest-message-util: 29.7.0 2665 | jest-resolve: 29.7.0 2666 | jest-runtime: 29.7.0 2667 | jest-util: 29.7.0 2668 | jest-watcher: 29.7.0 2669 | jest-worker: 29.7.0 2670 | p-limit: 3.1.0 2671 | source-map-support: 0.5.13 2672 | transitivePeerDependencies: 2673 | - supports-color 2674 | 2675 | jest-runtime@29.7.0: 2676 | dependencies: 2677 | '@jest/environment': 29.7.0 2678 | '@jest/fake-timers': 29.7.0 2679 | '@jest/globals': 29.7.0 2680 | '@jest/source-map': 29.6.3 2681 | '@jest/test-result': 29.7.0 2682 | '@jest/transform': 29.7.0 2683 | '@jest/types': 29.6.3 2684 | '@types/node': 22.4.2 2685 | chalk: 4.1.2 2686 | cjs-module-lexer: 1.3.1 2687 | collect-v8-coverage: 1.0.2 2688 | glob: 7.2.3 2689 | graceful-fs: 4.2.11 2690 | jest-haste-map: 29.7.0 2691 | jest-message-util: 29.7.0 2692 | jest-mock: 29.7.0 2693 | jest-regex-util: 29.6.3 2694 | jest-resolve: 29.7.0 2695 | jest-snapshot: 29.7.0 2696 | jest-util: 29.7.0 2697 | slash: 3.0.0 2698 | strip-bom: 4.0.0 2699 | transitivePeerDependencies: 2700 | - supports-color 2701 | 2702 | jest-snapshot@29.7.0: 2703 | dependencies: 2704 | '@babel/core': 7.25.2 2705 | '@babel/generator': 7.25.0 2706 | '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) 2707 | '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) 2708 | '@babel/types': 7.25.2 2709 | '@jest/expect-utils': 29.7.0 2710 | '@jest/transform': 29.7.0 2711 | '@jest/types': 29.6.3 2712 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) 2713 | chalk: 4.1.2 2714 | expect: 29.7.0 2715 | graceful-fs: 4.2.11 2716 | jest-diff: 29.7.0 2717 | jest-get-type: 29.6.3 2718 | jest-matcher-utils: 29.7.0 2719 | jest-message-util: 29.7.0 2720 | jest-util: 29.7.0 2721 | natural-compare: 1.4.0 2722 | pretty-format: 29.7.0 2723 | semver: 7.6.3 2724 | transitivePeerDependencies: 2725 | - supports-color 2726 | 2727 | jest-util@29.7.0: 2728 | dependencies: 2729 | '@jest/types': 29.6.3 2730 | '@types/node': 22.4.2 2731 | chalk: 4.1.2 2732 | ci-info: 3.9.0 2733 | graceful-fs: 4.2.11 2734 | picomatch: 2.3.1 2735 | 2736 | jest-validate@29.7.0: 2737 | dependencies: 2738 | '@jest/types': 29.6.3 2739 | camelcase: 6.3.0 2740 | chalk: 4.1.2 2741 | jest-get-type: 29.6.3 2742 | leven: 3.1.0 2743 | pretty-format: 29.7.0 2744 | 2745 | jest-watcher@29.7.0: 2746 | dependencies: 2747 | '@jest/test-result': 29.7.0 2748 | '@jest/types': 29.6.3 2749 | '@types/node': 22.4.2 2750 | ansi-escapes: 4.3.2 2751 | chalk: 4.1.2 2752 | emittery: 0.13.1 2753 | jest-util: 29.7.0 2754 | string-length: 4.0.2 2755 | 2756 | jest-worker@29.7.0: 2757 | dependencies: 2758 | '@types/node': 22.4.2 2759 | jest-util: 29.7.0 2760 | merge-stream: 2.0.0 2761 | supports-color: 8.1.1 2762 | 2763 | jest@29.7.0(@types/node@22.4.2): 2764 | dependencies: 2765 | '@jest/core': 29.7.0 2766 | '@jest/types': 29.6.3 2767 | import-local: 3.2.0 2768 | jest-cli: 29.7.0(@types/node@22.4.2) 2769 | transitivePeerDependencies: 2770 | - '@types/node' 2771 | - babel-plugin-macros 2772 | - supports-color 2773 | - ts-node 2774 | 2775 | js-tokens@4.0.0: {} 2776 | 2777 | js-yaml@3.14.1: 2778 | dependencies: 2779 | argparse: 1.0.10 2780 | esprima: 4.0.1 2781 | 2782 | js-yaml@4.1.0: 2783 | dependencies: 2784 | argparse: 2.0.1 2785 | 2786 | jsesc@2.5.2: {} 2787 | 2788 | json-buffer@3.0.1: {} 2789 | 2790 | json-parse-even-better-errors@2.3.1: {} 2791 | 2792 | json-schema-traverse@0.4.1: {} 2793 | 2794 | json-stable-stringify-without-jsonify@1.0.1: {} 2795 | 2796 | json5@2.2.3: {} 2797 | 2798 | keyv@4.5.4: 2799 | dependencies: 2800 | json-buffer: 3.0.1 2801 | 2802 | kleur@3.0.3: {} 2803 | 2804 | leven@3.1.0: {} 2805 | 2806 | levn@0.4.1: 2807 | dependencies: 2808 | prelude-ls: 1.2.1 2809 | type-check: 0.4.0 2810 | 2811 | lines-and-columns@1.2.4: {} 2812 | 2813 | locate-path@5.0.0: 2814 | dependencies: 2815 | p-locate: 4.1.0 2816 | 2817 | locate-path@6.0.0: 2818 | dependencies: 2819 | p-locate: 5.0.0 2820 | 2821 | lodash.memoize@4.1.2: {} 2822 | 2823 | lodash.merge@4.6.2: {} 2824 | 2825 | lru-cache@5.1.1: 2826 | dependencies: 2827 | yallist: 3.1.1 2828 | 2829 | make-dir@4.0.0: 2830 | dependencies: 2831 | semver: 7.6.3 2832 | 2833 | make-error@1.3.6: {} 2834 | 2835 | makeerror@1.0.12: 2836 | dependencies: 2837 | tmpl: 1.0.5 2838 | 2839 | merge-stream@2.0.0: {} 2840 | 2841 | micromatch@4.0.7: 2842 | dependencies: 2843 | braces: 3.0.3 2844 | picomatch: 2.3.1 2845 | 2846 | mimic-fn@2.1.0: {} 2847 | 2848 | minimatch@3.1.2: 2849 | dependencies: 2850 | brace-expansion: 1.1.11 2851 | 2852 | minimatch@5.1.6: 2853 | dependencies: 2854 | brace-expansion: 2.0.1 2855 | 2856 | ms@2.1.2: {} 2857 | 2858 | natural-compare@1.4.0: {} 2859 | 2860 | node-int64@0.4.0: {} 2861 | 2862 | node-releases@2.0.18: {} 2863 | 2864 | normalize-path@3.0.0: {} 2865 | 2866 | npm-run-path@4.0.1: 2867 | dependencies: 2868 | path-key: 3.1.1 2869 | 2870 | once@1.4.0: 2871 | dependencies: 2872 | wrappy: 1.0.2 2873 | 2874 | onetime@5.1.2: 2875 | dependencies: 2876 | mimic-fn: 2.1.0 2877 | 2878 | optionator@0.9.4: 2879 | dependencies: 2880 | deep-is: 0.1.4 2881 | fast-levenshtein: 2.0.6 2882 | levn: 0.4.1 2883 | prelude-ls: 1.2.1 2884 | type-check: 0.4.0 2885 | word-wrap: 1.2.5 2886 | 2887 | p-limit@2.3.0: 2888 | dependencies: 2889 | p-try: 2.2.0 2890 | 2891 | p-limit@3.1.0: 2892 | dependencies: 2893 | yocto-queue: 0.1.0 2894 | 2895 | p-locate@4.1.0: 2896 | dependencies: 2897 | p-limit: 2.3.0 2898 | 2899 | p-locate@5.0.0: 2900 | dependencies: 2901 | p-limit: 3.1.0 2902 | 2903 | p-try@2.2.0: {} 2904 | 2905 | parent-module@1.0.1: 2906 | dependencies: 2907 | callsites: 3.1.0 2908 | 2909 | parse-json@5.2.0: 2910 | dependencies: 2911 | '@babel/code-frame': 7.24.7 2912 | error-ex: 1.3.2 2913 | json-parse-even-better-errors: 2.3.1 2914 | lines-and-columns: 1.2.4 2915 | 2916 | path-exists@4.0.0: {} 2917 | 2918 | path-is-absolute@1.0.1: {} 2919 | 2920 | path-key@3.1.1: {} 2921 | 2922 | path-parse@1.0.7: {} 2923 | 2924 | picocolors@1.0.1: {} 2925 | 2926 | picomatch@2.3.1: {} 2927 | 2928 | pirates@4.0.6: {} 2929 | 2930 | pkg-dir@4.2.0: 2931 | dependencies: 2932 | find-up: 4.1.0 2933 | 2934 | prelude-ls@1.2.1: {} 2935 | 2936 | pretty-format@29.7.0: 2937 | dependencies: 2938 | '@jest/schemas': 29.6.3 2939 | ansi-styles: 5.2.0 2940 | react-is: 18.3.1 2941 | 2942 | prompts@2.4.2: 2943 | dependencies: 2944 | kleur: 3.0.3 2945 | sisteransi: 1.0.5 2946 | 2947 | punycode@2.3.1: {} 2948 | 2949 | pure-rand@6.1.0: {} 2950 | 2951 | queue-microtask@1.2.3: {} 2952 | 2953 | react-is@18.3.1: {} 2954 | 2955 | require-directory@2.1.1: {} 2956 | 2957 | resolve-cwd@3.0.0: 2958 | dependencies: 2959 | resolve-from: 5.0.0 2960 | 2961 | resolve-from@4.0.0: {} 2962 | 2963 | resolve-from@5.0.0: {} 2964 | 2965 | resolve.exports@2.0.2: {} 2966 | 2967 | resolve@1.22.8: 2968 | dependencies: 2969 | is-core-module: 2.15.0 2970 | path-parse: 1.0.7 2971 | supports-preserve-symlinks-flag: 1.0.0 2972 | 2973 | reusify@1.0.4: {} 2974 | 2975 | run-parallel@1.2.0: 2976 | dependencies: 2977 | queue-microtask: 1.2.3 2978 | 2979 | semver@6.3.1: {} 2980 | 2981 | semver@7.6.3: {} 2982 | 2983 | shebang-command@2.0.0: 2984 | dependencies: 2985 | shebang-regex: 3.0.0 2986 | 2987 | shebang-regex@3.0.0: {} 2988 | 2989 | signal-exit@3.0.7: {} 2990 | 2991 | sisteransi@1.0.5: {} 2992 | 2993 | slash@3.0.0: {} 2994 | 2995 | source-map-support@0.5.13: 2996 | dependencies: 2997 | buffer-from: 1.1.2 2998 | source-map: 0.6.1 2999 | 3000 | source-map@0.6.1: {} 3001 | 3002 | sprintf-js@1.0.3: {} 3003 | 3004 | stack-utils@2.0.6: 3005 | dependencies: 3006 | escape-string-regexp: 2.0.0 3007 | 3008 | string-length@4.0.2: 3009 | dependencies: 3010 | char-regex: 1.0.2 3011 | strip-ansi: 6.0.1 3012 | 3013 | string-width@4.2.3: 3014 | dependencies: 3015 | emoji-regex: 8.0.0 3016 | is-fullwidth-code-point: 3.0.0 3017 | strip-ansi: 6.0.1 3018 | 3019 | strip-ansi@6.0.1: 3020 | dependencies: 3021 | ansi-regex: 5.0.1 3022 | 3023 | strip-bom@4.0.0: {} 3024 | 3025 | strip-final-newline@2.0.0: {} 3026 | 3027 | strip-json-comments@3.1.1: {} 3028 | 3029 | supports-color@5.5.0: 3030 | dependencies: 3031 | has-flag: 3.0.0 3032 | 3033 | supports-color@7.2.0: 3034 | dependencies: 3035 | has-flag: 4.0.0 3036 | 3037 | supports-color@8.1.1: 3038 | dependencies: 3039 | has-flag: 4.0.0 3040 | 3041 | supports-preserve-symlinks-flag@1.0.0: {} 3042 | 3043 | test-exclude@6.0.0: 3044 | dependencies: 3045 | '@istanbuljs/schema': 0.1.3 3046 | glob: 7.2.3 3047 | minimatch: 3.1.2 3048 | 3049 | text-table@0.2.0: {} 3050 | 3051 | tmpl@1.0.5: {} 3052 | 3053 | to-fast-properties@2.0.0: {} 3054 | 3055 | to-regex-range@5.0.1: 3056 | dependencies: 3057 | is-number: 7.0.0 3058 | 3059 | ts-jest@29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@22.4.2))(typescript@5.5.4): 3060 | dependencies: 3061 | bs-logger: 0.2.6 3062 | ejs: 3.1.10 3063 | fast-json-stable-stringify: 2.1.0 3064 | jest: 29.7.0(@types/node@22.4.2) 3065 | jest-util: 29.7.0 3066 | json5: 2.2.3 3067 | lodash.memoize: 4.1.2 3068 | make-error: 1.3.6 3069 | semver: 7.6.3 3070 | typescript: 5.5.4 3071 | yargs-parser: 21.1.1 3072 | optionalDependencies: 3073 | '@babel/core': 7.25.2 3074 | '@jest/transform': 29.7.0 3075 | '@jest/types': 29.6.3 3076 | babel-jest: 29.7.0(@babel/core@7.25.2) 3077 | 3078 | type-check@0.4.0: 3079 | dependencies: 3080 | prelude-ls: 1.2.1 3081 | 3082 | type-detect@4.0.8: {} 3083 | 3084 | type-fest@0.21.3: {} 3085 | 3086 | typescript@5.5.4: {} 3087 | 3088 | undici-types@6.19.8: {} 3089 | 3090 | update-browserslist-db@1.1.0(browserslist@4.23.3): 3091 | dependencies: 3092 | browserslist: 4.23.3 3093 | escalade: 3.1.2 3094 | picocolors: 1.0.1 3095 | 3096 | uri-js@4.4.1: 3097 | dependencies: 3098 | punycode: 2.3.1 3099 | 3100 | v8-to-istanbul@9.3.0: 3101 | dependencies: 3102 | '@jridgewell/trace-mapping': 0.3.25 3103 | '@types/istanbul-lib-coverage': 2.0.6 3104 | convert-source-map: 2.0.0 3105 | 3106 | walker@1.0.8: 3107 | dependencies: 3108 | makeerror: 1.0.12 3109 | 3110 | which@2.0.2: 3111 | dependencies: 3112 | isexe: 2.0.0 3113 | 3114 | word-wrap@1.2.5: {} 3115 | 3116 | wrap-ansi@7.0.0: 3117 | dependencies: 3118 | ansi-styles: 4.3.0 3119 | string-width: 4.2.3 3120 | strip-ansi: 6.0.1 3121 | 3122 | wrappy@1.0.2: {} 3123 | 3124 | write-file-atomic@4.0.2: 3125 | dependencies: 3126 | imurmurhash: 0.1.4 3127 | signal-exit: 3.0.7 3128 | 3129 | y18n@5.0.8: {} 3130 | 3131 | yallist@3.1.1: {} 3132 | 3133 | yargs-parser@21.1.1: {} 3134 | 3135 | yargs@17.7.2: 3136 | dependencies: 3137 | cliui: 8.0.1 3138 | escalade: 3.1.2 3139 | get-caller-file: 2.0.5 3140 | require-directory: 2.1.1 3141 | string-width: 4.2.3 3142 | y18n: 5.0.8 3143 | yargs-parser: 21.1.1 3144 | 3145 | yocto-queue@0.1.0: {} 3146 | --------------------------------------------------------------------------------