From 957641fb0fa1ede5b305cfce29b4d3132c486001 Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Tue, 12 Dec 2023 15:39:10 +0530 Subject: [PATCH] chore: move dioc out of monorepo --- packages/dioc/.gitignore | 24 - packages/dioc/README.md | 141 ----- packages/dioc/index.d.ts | 2 - packages/dioc/lib/container.ts | 147 ----- packages/dioc/lib/main.ts | 2 - packages/dioc/lib/service.ts | 65 -- packages/dioc/lib/testing.ts | 33 - packages/dioc/lib/vue.ts | 34 -- packages/dioc/package.json | 54 -- packages/dioc/test/container.spec.ts | 262 -------- packages/dioc/test/service.spec.ts | 66 -- packages/dioc/test/test-container.spec.ts | 92 --- packages/dioc/testing.d.ts | 2 - packages/dioc/tsconfig.json | 21 - packages/dioc/vite.config.ts | 16 - packages/dioc/vitest.config.ts | 7 - packages/dioc/vue.d.ts | 2 - packages/hoppscotch-common/package.json | 4 +- .../searchers/interceptor.searcher.ts | 4 +- .../hoppscotch-selfhost-desktop/package.json | 2 +- pnpm-lock.yaml | 571 +----------------- 21 files changed, 23 insertions(+), 1528 deletions(-) delete mode 100644 packages/dioc/.gitignore delete mode 100644 packages/dioc/README.md delete mode 100644 packages/dioc/index.d.ts delete mode 100644 packages/dioc/lib/container.ts delete mode 100644 packages/dioc/lib/main.ts delete mode 100644 packages/dioc/lib/service.ts delete mode 100644 packages/dioc/lib/testing.ts delete mode 100644 packages/dioc/lib/vue.ts delete mode 100644 packages/dioc/package.json delete mode 100644 packages/dioc/test/container.spec.ts delete mode 100644 packages/dioc/test/service.spec.ts delete mode 100644 packages/dioc/test/test-container.spec.ts delete mode 100644 packages/dioc/testing.d.ts delete mode 100644 packages/dioc/tsconfig.json delete mode 100644 packages/dioc/vite.config.ts delete mode 100644 packages/dioc/vitest.config.ts delete mode 100644 packages/dioc/vue.d.ts diff --git a/packages/dioc/.gitignore b/packages/dioc/.gitignore deleted file mode 100644 index a547bf36d..000000000 --- a/packages/dioc/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/packages/dioc/README.md b/packages/dioc/README.md deleted file mode 100644 index 506faa656..000000000 --- a/packages/dioc/README.md +++ /dev/null @@ -1,141 +0,0 @@ -# dioc - -A small and lightweight dependency injection / inversion of control system. - -### About - -`dioc` is a really simple **DI/IOC** system where you write services (which are singletons per container) that can depend on each other and emit events that can be listened upon. - -### Demo - -```ts -import { Service, Container } from "dioc" - -// Here is a simple service, which you can define by extending the Service class -// and providing an ID static field (of type string) -export class PersistenceService extends Service { - // This should be unique for each container - public static ID = "PERSISTENCE_SERVICE" - - public read(key: string): string | undefined { - // ... - } - - public write(key: string, value: string) { - // ... - } -} - -type TodoServiceEvent = - | { type: "TODO_CREATED"; index: number } - | { type: "TODO_DELETED"; index: number } - -// Services have a built in event system -// Define the generic argument to say what are the possible emitted values -export class TodoService extends Service { - public static ID = "TODO_SERVICE" - - // Inject persistence service into this service - private readonly persistence = this.bind(PersistenceService) - - public todos = [] - - // Service constructors cannot have arguments - constructor() { - super() - - this.todos = JSON.parse(this.persistence.read("todos") ?? "[]") - } - - public addTodo(text: string) { - // ... - - // You can access services via the bound fields - this.persistence.write("todos", JSON.stringify(this.todos)) - - // This is how you emit an event - this.emit({ - type: "TODO_CREATED", - index, - }) - } - - public removeTodo(index: number) { - // ... - - this.emit({ - type: "TODO_DELETED", - index, - }) - } -} - -// Services need a container to run in -const container = new Container() - -// You can initialize and get services using Container#bind -// It will automatically initialize the service (and its dependencies) -const todoService = container.bind(TodoService) // Returns an instance of TodoService -``` - -### Demo (Unit Test) - -`dioc/testing` contains `TestContainer` which lets you bind mocked services to the container. - -```ts -import { TestContainer } from "dioc/testing" -import { TodoService, PersistenceService } from "./demo.ts" // The above demo code snippet -import { describe, it, expect, vi } from "vitest" - -describe("TodoService", () => { - it("addTodo writes to persistence", () => { - const container = new TestContainer() - - const writeFn = vi.fn() - - // The first parameter is the service to mock and the second parameter - // is the mocked service fields and functions - container.bindMock(PersistenceService, { - read: () => undefined, // Not really important for this test - write: writeFn, - }) - - // the peristence service bind in TodoService will now use the - // above defined mocked implementation - const todoService = container.bind(TodoService) - - todoService.addTodo("sup") - - expect(writeFn).toHaveBeenCalledOnce() - expect(writeFn).toHaveBeenCalledWith("todos", JSON.stringify(["sup"])) - }) -}) -``` - -### Demo (Vue) - -`dioc/vue` contains a Vue Plugin and a `useService` composable that allows Vue components to use the defined services. - -In the app entry point: - -```ts -import { createApp } from "vue" -import { diocPlugin } from "dioc/vue" - -const app = createApp() - -app.use(diocPlugin, { - container: new Container(), // You can pass in the container you want to provide to the components here -}) -``` - -In your Vue components: - -```vue - -``` diff --git a/packages/dioc/index.d.ts b/packages/dioc/index.d.ts deleted file mode 100644 index bbb9d0161..000000000 --- a/packages/dioc/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default } from "./dist/main.d.ts" -export * from "./dist/main.d.ts" diff --git a/packages/dioc/lib/container.ts b/packages/dioc/lib/container.ts deleted file mode 100644 index bad74f3f5..000000000 --- a/packages/dioc/lib/container.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { Service } from "./service" -import { Observable, Subject } from 'rxjs' - -/** - * Stores the current container instance in the current operating context. - * - * NOTE: This should not be used outside of dioc library code - */ -export let currentContainer: Container | null = null - -/** - * The events emitted by the container - * - * `SERVICE_BIND` - emitted when a service is bound to the container directly or as a dependency to another service - * `SERVICE_INIT` - emitted when a service is initialized - */ -export type ContainerEvent = - | { - type: 'SERVICE_BIND'; - - /** The Service ID of the service being bounded (the dependency) */ - boundeeID: string; - - /** - * The Service ID of the bounder that is binding the boundee (the dependent) - * - * NOTE: This will be undefined if the service is bound directly to the container - */ - bounderID: string | undefined - } - | { - type: 'SERVICE_INIT'; - - /** The Service ID of the service being initialized */ - serviceID: string - } - -/** - * The dependency injection container, allows for services to be initialized and maintains the dependency trees. - */ -export class Container { - /** Used during the `bind` operation to detect circular dependencies */ - private bindStack: string[] = [] - - /** The map of bound services to their IDs */ - protected boundMap = new Map>() - - /** The RxJS observable representing the event stream */ - protected event$ = new Subject() - - /** - * Returns whether a container has the given service bound - * @param service The service to check for - */ - public hasBound< - T extends typeof Service & { ID: string } - >(service: T): boolean { - return this.boundMap.has(service.ID) - } - - /** - * Returns the service bound to the container with the given ID or if not found, undefined. - * - * NOTE: This is an advanced method and should not be used as much as possible. - * - * @param serviceID The ID of the service to get - */ - public getBoundServiceWithID(serviceID: string): Service | undefined { - return this.boundMap.get(serviceID) - } - - /** - * Binds a service to the container. This is equivalent to marking a service as a dependency. - * @param service The class reference of a service to bind - * @param bounder The class reference of the service that is binding the service (if bound directly to the container, this should be undefined) - */ - public bind & { ID: string }>( - service: T, - bounder: ((typeof Service) & { ID: string }) | undefined = undefined - ): InstanceType { - // We need to store the current container in a variable so that we can restore it after the bind operation - const oldCurrentContainer = currentContainer; - currentContainer = this; - - // If the service is already bound, return the existing instance - if (this.hasBound(service)) { - this.event$.next({ - type: 'SERVICE_BIND', - boundeeID: service.ID, - bounderID: bounder?.ID // Return the bounder ID if it is defined, else assume its the container - }) - - return this.boundMap.get(service.ID) as InstanceType // Casted as InstanceType because service IDs and types are expected to match - } - - // Detect circular dependency and throw error - if (this.bindStack.findIndex((serviceID) => serviceID === service.ID) !== -1) { - const circularServices = `${this.bindStack.join(' -> ')} -> ${service.ID}` - - throw new Error(`Circular dependency detected.\nChain: ${circularServices}`) - } - - // Push the service ID onto the bind stack to detect circular dependencies - this.bindStack.push(service.ID) - - // Initialize the service and emit events - - // NOTE: We need to cast the service to any as TypeScript thinks that the service is abstract - const instance: Service = new (service as any)() - - this.boundMap.set(service.ID, instance) - - this.bindStack.pop() - - this.event$.next({ - type: 'SERVICE_INIT', - serviceID: service.ID, - }) - - this.event$.next({ - type: 'SERVICE_BIND', - boundeeID: service.ID, - bounderID: bounder?.ID - }) - - - // Restore the current container - currentContainer = oldCurrentContainer; - - // We expect the return type to match the service definition - return instance as InstanceType - } - - /** - * Returns an iterator of the currently bound service IDs and their instances - */ - public getBoundServices(): IterableIterator<[string, Service]> { - return this.boundMap.entries() - } - - /** - * Returns the public container event stream - */ - public getEventStream(): Observable { - return this.event$.asObservable() - } -} diff --git a/packages/dioc/lib/main.ts b/packages/dioc/lib/main.ts deleted file mode 100644 index a6882c575..000000000 --- a/packages/dioc/lib/main.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./container" -export * from "./service" diff --git a/packages/dioc/lib/service.ts b/packages/dioc/lib/service.ts deleted file mode 100644 index 1e9cb6b8f..000000000 --- a/packages/dioc/lib/service.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Observable, Subject } from 'rxjs' -import { Container, currentContainer } from './container' - -/** - * A Dioc service that can bound to a container and can bind dependency services. - * - * NOTE: Services cannot have a constructor that takes arguments. - * - * @template EventDef The type of events that can be emitted by the service. These will be accessible by event streams - */ -export abstract class Service { - - /** - * The internal event stream of the service - */ - private event$ = new Subject() - - /** The container the service is bound to */ - #container: Container - - constructor() { - if (!currentContainer) { - throw new Error( - `Tried to initialize service with no container (ID: ${ (this.constructor as any).ID })` - ) - } - - this.#container = currentContainer - } - - /** - * Binds a dependency service into this service. - * @param service The class reference of the service to bind - */ - protected bind & { ID: string }>(service: T): InstanceType { - if (!currentContainer) { - throw new Error('No currentContainer defined.') - } - - return currentContainer.bind(service, this.constructor as typeof Service & { ID: string }) - } - - /** - * Returns the container the service is bound to - */ - protected getContainer(): Container { - return this.#container - } - - /** - * Emits an event on the service's event stream - * @param event The event to emit - */ - protected emit(event: EventDef) { - this.event$.next(event) - } - - /** - * Returns the event stream of the service - */ - public getEventStream(): Observable { - - return this.event$.asObservable() - } -} diff --git a/packages/dioc/lib/testing.ts b/packages/dioc/lib/testing.ts deleted file mode 100644 index 0464f036b..000000000 --- a/packages/dioc/lib/testing.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Container, Service } from "./main"; - -/** - * A container that can be used for writing tests, contains additional methods - * for binding suitable for writing tests. (see `bindMock`). - */ -export class TestContainer extends Container { - - /** - * Binds a mock service to the container. - * - * @param service - * @param mock - */ - public bindMock< - T extends typeof Service & { ID: string }, - U extends Partial> - >(service: T, mock: U): U { - if (this.boundMap.has(service.ID)) { - throw new Error(`Service '${service.ID}' already bound to container. Did you already call bindMock on this ?`) - } - - this.boundMap.set(service.ID, mock as any) - - this.event$.next({ - type: "SERVICE_BIND", - boundeeID: service.ID, - bounderID: undefined, - }) - - return mock - } -} diff --git a/packages/dioc/lib/vue.ts b/packages/dioc/lib/vue.ts deleted file mode 100644 index 1342010f4..000000000 --- a/packages/dioc/lib/vue.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Plugin, inject } from "vue" -import { Container } from "./container" -import { Service } from "./service" - -const VUE_CONTAINER_KEY = Symbol() - -// TODO: Some Vue version issue with plugin generics is breaking type checking -/** - * The Vue Dioc Plugin, this allows the composables to work and access the container - * - * NOTE: Make sure you add `vue` as dependency to be able to use this plugin (duh) - */ -export const diocPlugin: Plugin = { - install(app, { container }) { - app.provide(VUE_CONTAINER_KEY, container) - } -} - -/** - * A composable that binds a service to a Vue Component - * - * @param service The class reference of the service to bind - */ -export function useService< - T extends typeof Service & { ID: string } ->(service: T): InstanceType { - const container = inject(VUE_CONTAINER_KEY) as Container | undefined | null - - if (!container) { - throw new Error("Container not found, did you forget to install the dioc plugin?") - } - - return container.bind(service) -} diff --git a/packages/dioc/package.json b/packages/dioc/package.json deleted file mode 100644 index 0a0f4634c..000000000 --- a/packages/dioc/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "dioc", - "private": true, - "version": "0.1.0", - "type": "module", - "files": [ - "dist", - "index.d.ts" - ], - "main": "./dist/counter.umd.cjs", - "module": "./dist/counter.js", - "types": "./index.d.ts", - "exports": { - ".": { - "types": "./dist/main.d.ts", - "require": "./dist/index.cjs", - "import": "./dist/index.js" - }, - "./vue": { - "types": "./dist/vue.d.ts", - "require": "./dist/vue.cjs", - "import": "./dist/vue.js" - }, - "./testing": { - "types": "./dist/testing.d.ts", - "require": "./dist/testing.cjs", - "import": "./dist/testing.js" - } - }, - "scripts": { - "dev": "vite", - "build": "vite build && tsc --emitDeclarationOnly", - "prepare": "pnpm run build", - "test": "vitest run", - "do-test": "pnpm run test", - "test:watch": "vitest" - }, - "devDependencies": { - "typescript": "^4.9.4", - "vite": "^4.0.4", - "vitest": "^0.29.3" - }, - "dependencies": { - "rxjs": "^7.8.1" - }, - "peerDependencies": { - "vue": "^3.2.25" - }, - "peerDependenciesMeta": { - "vue": { - "optional": true - } - } -} diff --git a/packages/dioc/test/container.spec.ts b/packages/dioc/test/container.spec.ts deleted file mode 100644 index f70e6e677..000000000 --- a/packages/dioc/test/container.spec.ts +++ /dev/null @@ -1,262 +0,0 @@ -import { it, expect, describe, vi } from "vitest" -import { Service } from "../lib/service" -import { Container, currentContainer, ContainerEvent } from "../lib/container" - -class TestServiceA extends Service { - public static ID = "TestServiceA" -} - -class TestServiceB extends Service { - public static ID = "TestServiceB" - - // Marked public to allow for testing - public readonly serviceA = this.bind(TestServiceA) -} - -describe("Container", () => { - describe("getBoundServiceWithID", () => { - it("returns the service instance if it is bound to the container", () => { - const container = new Container() - - const service = container.bind(TestServiceA) - - expect(container.getBoundServiceWithID(TestServiceA.ID)).toBe(service) - }) - - it("returns undefined if the service is not bound to the container", () => { - const container = new Container() - - expect(container.getBoundServiceWithID(TestServiceA.ID)).toBeUndefined() - }) - }) - - describe("bind", () => { - it("correctly binds the service to it", () => { - const container = new Container() - - const service = container.bind(TestServiceA) - - // @ts-expect-error getContainer is defined as a protected property, but we are leveraging it here to check - expect(service.getContainer()).toBe(container) - }) - - it("after bind, the current container is set back to its previous value", () => { - const originalValue = currentContainer - - const container = new Container() - container.bind(TestServiceA) - - expect(currentContainer).toBe(originalValue) - }) - - it("dependent services are registered in the same container", () => { - const container = new Container() - - const serviceB = container.bind(TestServiceB) - - // @ts-expect-error getContainer is defined as a protected property, but we are leveraging it here to check - expect(serviceB.serviceA.getContainer()).toBe(container) - }) - - it("binding an already initialized service returns the initialized instance (services are singletons)", () => { - const container = new Container() - - const serviceA = container.bind(TestServiceA) - const serviceA2 = container.bind(TestServiceA) - - expect(serviceA).toBe(serviceA2) - }) - - it("binding a service which is a dependency of another service returns the same instance created from the dependency resolution (services are singletons)", () => { - const container = new Container() - - const serviceB = container.bind(TestServiceB) - const serviceA = container.bind(TestServiceA) - - expect(serviceB.serviceA).toBe(serviceA) - }) - - it("binding an initialized service as a dependency returns the same instance", () => { - const container = new Container() - - const serviceA = container.bind(TestServiceA) - const serviceB = container.bind(TestServiceB) - - expect(serviceB.serviceA).toBe(serviceA) - }) - - it("container emits an init event when an uninitialized service is initialized via bind and event only called once", () => { - const container = new Container() - - const serviceFunc = vi.fn< - [ContainerEvent & { type: "SERVICE_INIT" }], - void - >() - - container.getEventStream().subscribe((ev) => { - if (ev.type === "SERVICE_INIT") { - serviceFunc(ev) - } - }) - - const instance = container.bind(TestServiceA) - - expect(serviceFunc).toHaveBeenCalledOnce() - expect(serviceFunc).toHaveBeenCalledWith({ - type: "SERVICE_INIT", - serviceID: TestServiceA.ID, - }) - }) - - it("the bind event emitted has an undefined bounderID when the service is bound directly to the container", () => { - const container = new Container() - - const serviceFunc = vi.fn< - [ContainerEvent & { type: "SERVICE_BIND" }], - void - >() - - container.getEventStream().subscribe((ev) => { - if (ev.type === "SERVICE_BIND") { - serviceFunc(ev) - } - }) - - container.bind(TestServiceA) - - expect(serviceFunc).toHaveBeenCalledOnce() - expect(serviceFunc).toHaveBeenCalledWith({ - type: "SERVICE_BIND", - boundeeID: TestServiceA.ID, - bounderID: undefined, - }) - }) - - it("the bind event emitted has the correct bounderID when the service is bound to another service", () => { - const container = new Container() - - const serviceFunc = vi.fn< - [ContainerEvent & { type: "SERVICE_BIND" }], - void - >() - - container.getEventStream().subscribe((ev) => { - // We only care about the bind event of TestServiceA - if (ev.type === "SERVICE_BIND" && ev.boundeeID === TestServiceA.ID) { - serviceFunc(ev) - } - }) - - container.bind(TestServiceB) - - expect(serviceFunc).toHaveBeenCalledOnce() - expect(serviceFunc).toHaveBeenCalledWith({ - type: "SERVICE_BIND", - boundeeID: TestServiceA.ID, - bounderID: TestServiceB.ID, - }) - }) - }) - - describe("hasBound", () => { - it("returns true if the given service is bound to the container", () => { - const container = new Container() - - container.bind(TestServiceA) - - expect(container.hasBound(TestServiceA)).toEqual(true) - }) - - it("returns false if the given service is not bound to the container", () => { - const container = new Container() - - expect(container.hasBound(TestServiceA)).toEqual(false) - }) - - it("returns true when the service is bound because it is a dependency of another service", () => { - const container = new Container() - - container.bind(TestServiceB) - - expect(container.hasBound(TestServiceA)).toEqual(true) - }) - }) - - describe("getEventStream", () => { - it("returns an observable which emits events correctly when services are initialized", () => { - const container = new Container() - - const serviceFunc = vi.fn< - [ContainerEvent & { type: "SERVICE_INIT" }], - void - >() - - container.getEventStream().subscribe((ev) => { - if (ev.type === "SERVICE_INIT") { - serviceFunc(ev) - } - }) - - container.bind(TestServiceB) - - expect(serviceFunc).toHaveBeenCalledTimes(2) - expect(serviceFunc).toHaveBeenNthCalledWith(1, { - type: "SERVICE_INIT", - serviceID: TestServiceA.ID, - }) - expect(serviceFunc).toHaveBeenNthCalledWith(2, { - type: "SERVICE_INIT", - serviceID: TestServiceB.ID, - }) - }) - - it("returns an observable which emits events correctly when services are bound", () => { - const container = new Container() - - const serviceFunc = vi.fn< - [ContainerEvent & { type: "SERVICE_BIND" }], - void - >() - - container.getEventStream().subscribe((ev) => { - if (ev.type === "SERVICE_BIND") { - serviceFunc(ev) - } - }) - - container.bind(TestServiceB) - - expect(serviceFunc).toHaveBeenCalledTimes(2) - expect(serviceFunc).toHaveBeenNthCalledWith(1, { - type: "SERVICE_BIND", - boundeeID: TestServiceA.ID, - bounderID: TestServiceB.ID, - }) - expect(serviceFunc).toHaveBeenNthCalledWith(2, { - type: "SERVICE_BIND", - boundeeID: TestServiceB.ID, - bounderID: undefined, - }) - }) - }) - - describe("getBoundServices", () => { - it("returns an iterator over all services bound to the container in the format [service id, service instance]", () => { - const container = new Container() - - const instanceB = container.bind(TestServiceB) - const instanceA = instanceB.serviceA - - expect(Array.from(container.getBoundServices())).toEqual([ - [TestServiceA.ID, instanceA], - [TestServiceB.ID, instanceB], - ]) - }) - - it("returns an empty iterator if no services are bound", () => { - const container = new Container() - - expect(Array.from(container.getBoundServices())).toEqual([]) - }) - }) -}) diff --git a/packages/dioc/test/service.spec.ts b/packages/dioc/test/service.spec.ts deleted file mode 100644 index e25524086..000000000 --- a/packages/dioc/test/service.spec.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { describe, expect, it, vi } from "vitest" -import { Service, Container } from "../lib/main" - -class TestServiceA extends Service { - public static ID = "TestServiceA" -} - -class TestServiceB extends Service<"test"> { - public static ID = "TestServiceB" - - // Marked public to allow for testing - public readonly serviceA = this.bind(TestServiceA) - - public emitTestEvent() { - this.emit("test") - } -} - -describe("Service", () => { - describe("constructor", () => { - it("throws an error if the service is initialized without a container", () => { - expect(() => new TestServiceA()).toThrowError( - "Tried to initialize service with no container (ID: TestServiceA)" - ) - }) - }) - - describe("bind", () => { - it("correctly binds the dependency service using the container", () => { - const container = new Container() - - const serviceA = container.bind(TestServiceA) - - const serviceB = container.bind(TestServiceB) - expect(serviceB.serviceA).toBe(serviceA) - }) - }) - - describe("getContainer", () => { - it("returns the container the service is bound to", () => { - const container = new Container() - - const serviceA = container.bind(TestServiceA) - - // @ts-expect-error getContainer is a protected member, we are just using it to help with testing - expect(serviceA.getContainer()).toBe(container) - }) - }) - - describe("getEventStream", () => { - it("returns the valid event stream of the service", () => { - const container = new Container() - - const serviceB = container.bind(TestServiceB) - - const serviceFunc = vi.fn() - - serviceB.getEventStream().subscribe(serviceFunc) - - serviceB.emitTestEvent() - - expect(serviceFunc).toHaveBeenCalledOnce() - expect(serviceFunc).toHaveBeenCalledWith("test") - }) - }) -}) diff --git a/packages/dioc/test/test-container.spec.ts b/packages/dioc/test/test-container.spec.ts deleted file mode 100644 index b51914d19..000000000 --- a/packages/dioc/test/test-container.spec.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { describe, expect, it, vi } from "vitest" -import { TestContainer } from "../lib/testing" -import { Service } from "../lib/service" -import { ContainerEvent } from "../lib/container" - -class TestServiceA extends Service { - public static ID = "TestServiceA" - - public test() { - return "real" - } -} - -class TestServiceB extends Service { - public static ID = "TestServiceB" - - // declared public to help with testing - public readonly serviceA = this.bind(TestServiceA) - - public test() { - return this.serviceA.test() - } -} - -describe("TestContainer", () => { - describe("bindMock", () => { - it("returns the fake service defined", () => { - const container = new TestContainer() - - const fakeService = { - test: () => "fake", - } - - const result = container.bindMock(TestServiceA, fakeService) - - expect(result).toBe(fakeService) - }) - - it("new services bound to the container get the mock service", () => { - const container = new TestContainer() - - const fakeServiceA = { - test: () => "fake", - } - - container.bindMock(TestServiceA, fakeServiceA) - - const serviceB = container.bind(TestServiceB) - - expect(serviceB.serviceA).toBe(fakeServiceA) - }) - - it("container emits SERVICE_BIND event", () => { - const container = new TestContainer() - - const fakeServiceA = { - test: () => "fake", - } - - const serviceFunc = vi.fn<[ContainerEvent, void]>() - - container.getEventStream().subscribe((ev) => { - serviceFunc(ev) - }) - - container.bindMock(TestServiceA, fakeServiceA) - - expect(serviceFunc).toHaveBeenCalledOnce() - expect(serviceFunc).toHaveBeenCalledWith({ - type: "SERVICE_BIND", - boundeeID: TestServiceA.ID, - bounderID: undefined, - }) - }) - - it("throws if service already bound", () => { - const container = new TestContainer() - - const fakeServiceA = { - test: () => "fake", - } - - container.bindMock(TestServiceA, fakeServiceA) - - expect(() => { - container.bindMock(TestServiceA, fakeServiceA) - }).toThrowError( - "Service 'TestServiceA' already bound to container. Did you already call bindMock on this ?" - ) - }) - }) -}) diff --git a/packages/dioc/testing.d.ts b/packages/dioc/testing.d.ts deleted file mode 100644 index f0219165a..000000000 --- a/packages/dioc/testing.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default } from "./dist/testing.d.ts" -export * from "./dist/testing.d.ts" diff --git a/packages/dioc/tsconfig.json b/packages/dioc/tsconfig.json deleted file mode 100644 index 8033b856e..000000000 --- a/packages/dioc/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "lib": ["ESNext", "DOM"], - "moduleResolution": "Node", - "strict": true, - "declaration": true, - "sourceMap": true, - "outDir": "dist", - "resolveJsonModule": true, - "isolatedModules": true, - "esModuleInterop": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "skipLibCheck": true - }, - "include": ["lib"] -} diff --git a/packages/dioc/vite.config.ts b/packages/dioc/vite.config.ts deleted file mode 100644 index 51388192e..000000000 --- a/packages/dioc/vite.config.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { defineConfig } from 'vite' - -export default defineConfig({ - build: { - lib: { - entry: { - index: './lib/main.ts', - vue: './lib/vue.ts', - testing: './lib/testing.ts', - }, - }, - rollupOptions: { - external: ['vue'], - } - }, -}) diff --git a/packages/dioc/vitest.config.ts b/packages/dioc/vitest.config.ts deleted file mode 100644 index 1d45d7226..000000000 --- a/packages/dioc/vitest.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from "vitest/config" - -export default defineConfig({ - test: { - - } -}) diff --git a/packages/dioc/vue.d.ts b/packages/dioc/vue.d.ts deleted file mode 100644 index 63ea4bff4..000000000 --- a/packages/dioc/vue.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default } from "./dist/vue.d.ts" -export * from "./dist/vue.d.ts" diff --git a/packages/hoppscotch-common/package.json b/packages/hoppscotch-common/package.json index 09f331daa..52227144e 100644 --- a/packages/hoppscotch-common/package.json +++ b/packages/hoppscotch-common/package.json @@ -50,7 +50,7 @@ "axios": "^1.6.2", "buffer": "^6.0.3", "cookie-es": "^1.0.0", - "dioc": "workspace:^", + "dioc": "^1.0.1", "esprima": "^4.0.1", "events": "^3.3.0", "fp-ts": "^2.16.1", @@ -164,4 +164,4 @@ "vitest": "^0.34.6", "vue-tsc": "^1.8.22" } -} \ No newline at end of file +} diff --git a/packages/hoppscotch-common/src/services/spotlight/searchers/interceptor.searcher.ts b/packages/hoppscotch-common/src/services/spotlight/searchers/interceptor.searcher.ts index f2f6c9959..95490122d 100644 --- a/packages/hoppscotch-common/src/services/spotlight/searchers/interceptor.searcher.ts +++ b/packages/hoppscotch-common/src/services/spotlight/searchers/interceptor.searcher.ts @@ -8,7 +8,6 @@ import { } from ".." import { Service } from "dioc" -import { useService } from "dioc/vue" import MiniSearch from "minisearch" import IconCheckCircle from "~/components/app/spotlight/entry/IconSelected.vue" import { InterceptorService } from "~/services/interceptor.service" @@ -30,6 +29,7 @@ export class InterceptorSpotlightSearcherService public searcherSectionTitle = this.t("settings.interceptor") private readonly spotlight = this.bind(SpotlightService) + private interceptorService = this.bind(InterceptorService) constructor() { super() @@ -37,8 +37,6 @@ export class InterceptorSpotlightSearcherService this.spotlight.registerSearcher(this) } - private interceptorService = useService(InterceptorService) - createSearchSession( query: Readonly> ): [Ref, () => void] { diff --git a/packages/hoppscotch-selfhost-desktop/package.json b/packages/hoppscotch-selfhost-desktop/package.json index 2da17df87..a65ec9652 100644 --- a/packages/hoppscotch-selfhost-desktop/package.json +++ b/packages/hoppscotch-selfhost-desktop/package.json @@ -20,7 +20,7 @@ "@vueuse/core": "^10.4.1", "axios": "^0.21.4", "buffer": "^6.0.3", - "dioc": "workspace:^", + "dioc": "^1.0.1", "environments.api": "link:@platform/environments/environments.api", "event": "link:@tauri-apps/api/event", "fp-ts": "^2.16.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index baafe992c..12c132e86 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,25 +66,6 @@ importers: specifier: ^5.2.2 version: 5.2.2 - packages/dioc: - dependencies: - rxjs: - specifier: ^7.8.1 - version: 7.8.1 - vue: - specifier: 3.3.9 - version: 3.3.9(typescript@4.9.4) - devDependencies: - typescript: - specifier: ^4.9.4 - version: 4.9.4 - vite: - specifier: ^4.0.4 - version: 4.0.4(@types/node@17.0.27) - vitest: - specifier: ^0.29.3 - version: 0.29.8 - packages/hoppscotch-backend: dependencies: '@apollo/server': @@ -458,8 +439,8 @@ importers: specifier: ^1.0.0 version: 1.0.0 dioc: - specifier: workspace:^ - version: link:../dioc + specifier: ^1.0.1 + version: 1.0.1(vue@3.3.9) esprima: specifier: ^4.0.1 version: 4.0.1 @@ -914,8 +895,8 @@ importers: specifier: ^6.0.3 version: 6.0.3 dioc: - specifier: workspace:^ - version: link:../dioc + specifier: ^1.0.1 + version: 1.0.1(vue@3.3.9) environments.api: specifier: link:@platform/environments/environments.api version: link:@platform/environments/environments.api @@ -4773,15 +4754,6 @@ packages: rollup-plugin-node-polyfills: 0.2.1 dev: true - /@esbuild/android-arm64@0.16.17: - resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -4807,15 +4779,6 @@ packages: requiresBuild: true optional: true - /@esbuild/android-arm@0.16.17: - resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.18.20: resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} @@ -4833,15 +4796,6 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.16.17: - resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.18.20: resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -4859,15 +4813,6 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.16.17: - resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.18.20: resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -4885,15 +4830,6 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.16.17: - resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.18.20: resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -4911,15 +4847,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.16.17: - resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.18.20: resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -4937,15 +4864,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.16.17: - resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.18.20: resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -4963,15 +4881,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.16.17: - resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.18.20: resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -4989,15 +4898,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.16.17: - resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.18.20: resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -5015,15 +4915,6 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.16.17: - resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.18.20: resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -5049,15 +4940,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-loong64@0.16.17: - resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.18.20: resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} @@ -5075,15 +4957,6 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.16.17: - resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.18.20: resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -5101,15 +4974,6 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.16.17: - resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.18.20: resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -5127,15 +4991,6 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.16.17: - resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.18.20: resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -5153,15 +5008,6 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.16.17: - resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.18.20: resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -5179,15 +5025,6 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.16.17: - resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.18.20: resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -5205,15 +5042,6 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.16.17: - resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.18.20: resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -5231,15 +5059,6 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.16.17: - resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.18.20: resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -5257,15 +5076,6 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.16.17: - resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.18.20: resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -5283,15 +5093,6 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.16.17: - resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.18.20: resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -5309,15 +5110,6 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.16.17: - resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.18.20: resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -5335,15 +5127,6 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.16.17: - resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.18.20: resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} @@ -10366,10 +10149,6 @@ packages: resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} dev: true - /@types/node@18.17.6: - resolution: {integrity: sha512-fGmT/P7z7ecA6bv/ia5DlaWCH4YeZvAQMNpUhrJjtAhOhZfoxS1VLUgU2pdk63efSjQaOJWdXMuAJsws+8I6dg==} - dev: true - /@types/node@18.18.8: resolution: {integrity: sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==} dependencies: @@ -11444,14 +11223,6 @@ packages: vue: 3.3.9(typescript@5.3.2) dev: true - /@vitest/expect@0.29.8: - resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} - dependencies: - '@vitest/spy': 0.29.8 - '@vitest/utils': 0.29.8 - chai: 4.3.7 - dev: true - /@vitest/expect@0.34.6: resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} dependencies: @@ -11460,14 +11231,6 @@ packages: chai: 4.3.10 dev: true - /@vitest/runner@0.29.8: - resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} - dependencies: - '@vitest/utils': 0.29.8 - p-limit: 4.0.0 - pathe: 1.1.0 - dev: true - /@vitest/runner@0.34.6: resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} dependencies: @@ -11484,27 +11247,12 @@ packages: pretty-format: 29.7.0 dev: true - /@vitest/spy@0.29.8: - resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} - dependencies: - tinyspy: 1.1.1 - dev: true - /@vitest/spy@0.34.6: resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} dependencies: tinyspy: 2.1.1 dev: true - /@vitest/utils@0.29.8: - resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} - dependencies: - cli-truncate: 3.1.0 - diff: 5.1.0 - loupe: 2.3.6 - pretty-format: 27.5.1 - dev: true - /@vitest/utils@0.34.6: resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} dependencies: @@ -11965,7 +11713,7 @@ packages: dependencies: '@vue/compiler-ssr': 3.3.9 '@vue/shared': 3.3.9 - vue: 3.3.9(typescript@4.9.4) + vue: 3.3.9(typescript@4.9.5) /@vue/shared@3.2.45: resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==} @@ -13440,19 +13188,6 @@ packages: type-detect: 4.0.8 dev: true - /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.6 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -13546,10 +13281,6 @@ packages: engines: {node: '>=4.0.0'} dev: false - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - dev: true - /check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: @@ -14548,10 +14279,17 @@ packages: engines: {node: '>=0.3.1'} dev: true - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: true + /dioc@1.0.1(vue@3.3.9): + resolution: {integrity: sha512-G3T8ThO2WehWJFrKp687wpXU//WLueJA6t5L7yirhWN/jn7BFNRKwskbJn0LEEd6gqI6rwiQE48f2Zqt5jvYVw==} + peerDependencies: + vue: 3.3.9 + peerDependenciesMeta: + vue: + optional: true + dependencies: + rxjs: 7.8.1 + vue: 3.3.9(typescript@5.3.2) + dev: false /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -15387,36 +15125,6 @@ packages: esbuild-windows-64: 0.15.15 esbuild-windows-arm64: 0.15.15 - /esbuild@0.16.17: - resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.16.17 - '@esbuild/android-arm64': 0.16.17 - '@esbuild/android-x64': 0.16.17 - '@esbuild/darwin-arm64': 0.16.17 - '@esbuild/darwin-x64': 0.16.17 - '@esbuild/freebsd-arm64': 0.16.17 - '@esbuild/freebsd-x64': 0.16.17 - '@esbuild/linux-arm': 0.16.17 - '@esbuild/linux-arm64': 0.16.17 - '@esbuild/linux-ia32': 0.16.17 - '@esbuild/linux-loong64': 0.16.17 - '@esbuild/linux-mips64el': 0.16.17 - '@esbuild/linux-ppc64': 0.16.17 - '@esbuild/linux-riscv64': 0.16.17 - '@esbuild/linux-s390x': 0.16.17 - '@esbuild/linux-x64': 0.16.17 - '@esbuild/netbsd-x64': 0.16.17 - '@esbuild/openbsd-x64': 0.16.17 - '@esbuild/sunos-x64': 0.16.17 - '@esbuild/win32-arm64': 0.16.17 - '@esbuild/win32-ia32': 0.16.17 - '@esbuild/win32-x64': 0.16.17 - dev: true - /esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -18060,6 +17768,7 @@ packages: resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} dependencies: has: 1.0.3 + dev: false /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -21381,15 +21090,6 @@ packages: engines: {node: '>=10'} hasBin: true - /mlly@1.2.0: - resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} - dependencies: - acorn: 8.11.2 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.2.0 - dev: true - /mlly@1.4.0: resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} dependencies: @@ -22241,10 +21941,6 @@ packages: resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} dev: true - /pathe@1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} - dev: true - /pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} @@ -22398,15 +22094,6 @@ packages: /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - /postcss@8.4.21: - resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - /postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -23265,6 +22952,7 @@ packages: is-core-module: 2.9.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + dev: false /resolve@1.22.4: resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} @@ -24760,21 +24448,11 @@ packages: engines: {node: '>=14.0.0'} dev: true - /tinypool@0.4.0: - resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} - engines: {node: '>=14.0.0'} - dev: true - /tinypool@0.7.0: resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} engines: {node: '>=14.0.0'} dev: true - /tinyspy@1.1.1: - resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} - engines: {node: '>=14.0.0'} - dev: true - /tinyspy@2.1.1: resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} engines: {node: '>=14.0.0'} @@ -25389,11 +25067,6 @@ packages: engines: {node: '>=4.2.0'} hasBin: true - /typescript@4.9.4: - resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} - engines: {node: '>=4.2.0'} - hasBin: true - /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} @@ -26222,28 +25895,6 @@ packages: - terser dev: true - /vite-node@0.29.8(@types/node@18.17.6): - resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} - engines: {node: '>=v14.16.0'} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4(supports-color@9.2.2) - mlly: 1.2.0 - pathe: 1.1.0 - picocolors: 1.0.0 - vite: 4.5.0(@types/node@18.17.6) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /vite-node@0.34.6(@types/node@18.18.8)(sass@1.69.5)(terser@5.24.0): resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} engines: {node: '>=v14.18.0'} @@ -26870,74 +26521,6 @@ packages: optionalDependencies: fsevents: 2.3.3 - /vite@4.0.4(@types/node@17.0.27): - resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 17.0.27 - esbuild: 0.16.17 - postcss: 8.4.21 - resolve: 1.22.1 - rollup: 3.29.4 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /vite@4.0.4(@types/node@18.17.6): - resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.17.6 - esbuild: 0.16.17 - postcss: 8.4.21 - resolve: 1.22.1 - rollup: 3.29.4 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /vite@4.5.0(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0): resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -27006,49 +26589,13 @@ packages: dependencies: '@types/node': 17.0.27 esbuild: 0.18.20 - postcss: 8.4.31 + postcss: 8.4.32 rollup: 3.29.4 sass: 1.69.5 terser: 5.24.0 optionalDependencies: fsevents: 2.3.3 - /vite@4.5.0(@types/node@18.17.6): - resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.17.6 - esbuild: 0.18.20 - postcss: 8.4.32 - rollup: 3.29.4 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.24.0): resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -27123,71 +26670,6 @@ packages: fsevents: 2.3.3 dev: true - /vitest@0.29.8: - resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} - engines: {node: '>=v14.16.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - dependencies: - '@types/chai': 4.3.5 - '@types/chai-subset': 1.3.3 - '@types/node': 18.17.6 - '@vitest/expect': 0.29.8 - '@vitest/runner': 0.29.8 - '@vitest/spy': 0.29.8 - '@vitest/utils': 0.29.8 - acorn: 8.10.0 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - debug: 4.3.4(supports-color@9.2.2) - local-pkg: 0.4.3 - pathe: 1.1.1 - picocolors: 1.0.0 - source-map: 0.6.1 - std-env: 3.4.0 - strip-literal: 1.3.0 - tinybench: 2.5.0 - tinypool: 0.4.0 - tinyspy: 1.1.1 - vite: 4.0.4(@types/node@18.17.6) - vite-node: 0.29.8(@types/node@18.17.6) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /vitest@0.34.6(sass@1.69.5)(terser@5.24.0): resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} engines: {node: '>=v14.18.0'} @@ -27703,21 +27185,6 @@ packages: '@vue/shared': 3.3.9 typescript: 4.9.3 - /vue@3.3.9(typescript@4.9.4): - resolution: {integrity: sha512-sy5sLCTR8m6tvUk1/ijri3Yqzgpdsmxgj6n6yl7GXXCXqVbmW2RCXe9atE4cEI6Iv7L89v5f35fZRRr5dChP9w==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@vue/compiler-dom': 3.3.9 - '@vue/compiler-sfc': 3.3.9 - '@vue/runtime-dom': 3.3.9 - '@vue/server-renderer': 3.3.9(vue@3.3.9) - '@vue/shared': 3.3.9 - typescript: 4.9.4 - /vue@3.3.9(typescript@4.9.5): resolution: {integrity: sha512-sy5sLCTR8m6tvUk1/ijri3Yqzgpdsmxgj6n6yl7GXXCXqVbmW2RCXe9atE4cEI6Iv7L89v5f35fZRRr5dChP9w==} peerDependencies: