diff --git a/packages/hoppscotch-common/locales/en.json b/packages/hoppscotch-common/locales/en.json index 2ab5f041c..f0e894e08 100644 --- a/packages/hoppscotch-common/locales/en.json +++ b/packages/hoppscotch-common/locales/en.json @@ -1027,7 +1027,8 @@ "personal": "Personal Workspace", "other_workspaces": "My Workspaces", "team": "Workspace", - "title": "Workspaces" + "title": "Workspaces", + "no_workspace": "No Workspace" }, "site_protection": { "login_to_continue": "Login to continue", diff --git a/packages/hoppscotch-common/src/components.d.ts b/packages/hoppscotch-common/src/components.d.ts index b1ab7c333..c6e1563b6 100644 --- a/packages/hoppscotch-common/src/components.d.ts +++ b/packages/hoppscotch-common/src/components.d.ts @@ -181,6 +181,10 @@ declare module 'vue' { LensesRenderersVideoLensRenderer: typeof import('./components/lenses/renderers/VideoLensRenderer.vue')['default'] LensesRenderersXMLLensRenderer: typeof import('./components/lenses/renderers/XMLLensRenderer.vue')['default'] LensesResponseBodyRenderer: typeof import('./components/lenses/ResponseBodyRenderer.vue')['default'] + NewCollections: typeof import('./components/new-collections/index.vue')['default'] + NewCollectionsRest: typeof import('./components/new-collections/rest/index.vue')['default'] + NewCollectionsRestCollection: typeof import('./components/new-collections/rest/Collection.vue')['default'] + NewCollectionsRestRequest: typeof import('./components/new-collections/rest/Request.vue')['default'] ProfileUserDelete: typeof import('./components/profile/UserDelete.vue')['default'] RealtimeCommunication: typeof import('./components/realtime/Communication.vue')['default'] RealtimeConnectionConfig: typeof import('./components/realtime/ConnectionConfig.vue')['default'] @@ -212,6 +216,8 @@ declare module 'vue' { TeamsTeam: typeof import('./components/teams/Team.vue')['default'] Tippy: typeof import('vue-tippy')['Tippy'] WorkspaceCurrent: typeof import('./components/workspace/Current.vue')['default'] + WorkspacePersonalWorkspaceSelector: typeof import('./components/workspace/PersonalWorkspaceSelector.vue')['default'] WorkspaceSelector: typeof import('./components/workspace/Selector.vue')['default'] + WorkspaceTestWorkspaceSelector: typeof import('./components/workspace/TestWorkspaceSelector.vue')['default'] } } diff --git a/packages/hoppscotch-common/src/components/app/Header.vue b/packages/hoppscotch-common/src/components/app/Header.vue index e43782267..f557e889f 100644 --- a/packages/hoppscotch-common/src/components/app/Header.vue +++ b/packages/hoppscotch-common/src/components/app/Header.vue @@ -2,74 +2,73 @@
-
- -
+
-
- -
-
-
- - -
-
+ + + +
+
+
+
+
1 @@ -80,142 +79,145 @@ @handle-click="handleTeamEdit()" />
-
- - -
+ + +
+ + + + + - - - + + - - - - - - -
+
- + + !!platform.platformFeatureFlags.workspaceSwitcherLogin?.value -) - /** * Once the PWA code is initialized, this holds a method * that can be called to show the user the installation @@ -296,11 +294,10 @@ const bannerContent = computed(() => banner.content.value?.content) let bannerID: number | null = null const offlineBanner: BannerContent = { - type: "warning", + type: "info", text: (t) => t("helpers.offline"), alternateText: (t) => t("helpers.offline_short"), score: BANNER_PRIORITY_HIGH, - dismissible: true, } const network = reactive(useNetwork()) @@ -317,8 +314,6 @@ watch(isOnline, () => { } }) -const dismissOfflineBanner = () => banner.removeBanner(bannerID!) - const currentUser = useReadonlyStream( platform.auth.getProbableUserStream(), platform.auth.getProbableUser() @@ -336,12 +331,6 @@ const myTeams = useReadonlyStream(teamListAdapter.teamList$, null) const workspace = workspaceService.currentWorkspace -const workspaceName = computed(() => { - return workspace.value.type === "personal" - ? t("workspace.personal") - : workspace.value.teamName -}) - const refetchTeams = () => { teamListAdapter.fetchList() } @@ -376,6 +365,20 @@ watch( } ) +const newWorkspaceService = useService(NewWorkspaceService) + +const activeWorkspaceName = computed(() => { + if (newWorkspaceService.activeWorkspaceHandle.value?.value.type === "ok") { + return newWorkspaceService.activeWorkspaceHandle.value?.value.data.name + } + + return t("workspace.no_workspace") +}) + +const activeWorkspaceIcon = computed(() => { + return newWorkspaceService.activeWorkspaceDecor.value?.value.headerCurrentIcon +}) + const showModalInvite = ref(false) const showModalEdit = ref(false) diff --git a/packages/hoppscotch-common/src/components/http/Request.vue b/packages/hoppscotch-common/src/components/http/Request.vue index 4b6e91f15..1f7263ee7 100644 --- a/packages/hoppscotch-common/src/components/http/Request.vue +++ b/packages/hoppscotch-common/src/components/http/Request.vue @@ -35,7 +35,7 @@ :key="`method-${index}`" :label="method" :style="{ - color: getMethodLabelColor(method), + color: getMethodLabelColorClassOf({ method }), }" @click=" () => { @@ -263,7 +263,7 @@ import { InterceptorService } from "~/services/interceptor.service" import { HoppTab } from "~/services/tab" import { HoppRESTDocument } from "~/helpers/rest/document" import { RESTTabService } from "~/services/tab/rest" -import { getMethodLabelColor } from "~/helpers/rest/labelColoring" +import { getMethodLabelColorClassOf } from "~/helpers/rest/labelColoring" import { WorkspaceService } from "~/services/workspace.service" const t = useI18n() diff --git a/packages/hoppscotch-common/src/components/http/Sidebar.vue b/packages/hoppscotch-common/src/components/http/Sidebar.vue index a29e8b518..0fc840975 100644 --- a/packages/hoppscotch-common/src/components/http/Sidebar.vue +++ b/packages/hoppscotch-common/src/components/http/Sidebar.vue @@ -10,7 +10,8 @@ :icon="IconFolder" :label="`${t('tab.collections')}`" > - + + - - - @@ -40,7 +34,6 @@ import IconClock from "~icons/lucide/clock" import IconLayers from "~icons/lucide/layers" import IconFolder from "~icons/lucide/folder" -import IconShare2 from "~icons/lucide/share-2" import { ref } from "vue" import { useI18n } from "@composables/i18n" diff --git a/packages/hoppscotch-common/src/components/new-collections/index.vue b/packages/hoppscotch-common/src/components/new-collections/index.vue new file mode 100644 index 000000000..99aae8090 --- /dev/null +++ b/packages/hoppscotch-common/src/components/new-collections/index.vue @@ -0,0 +1,46 @@ + + + diff --git a/packages/hoppscotch-common/src/components/new-collections/rest/Collection.vue b/packages/hoppscotch-common/src/components/new-collections/rest/Collection.vue new file mode 100644 index 000000000..14560a263 --- /dev/null +++ b/packages/hoppscotch-common/src/components/new-collections/rest/Collection.vue @@ -0,0 +1,177 @@ + + + diff --git a/packages/hoppscotch-common/src/components/new-collections/rest/Request.vue b/packages/hoppscotch-common/src/components/new-collections/rest/Request.vue new file mode 100644 index 000000000..c2705e6ca --- /dev/null +++ b/packages/hoppscotch-common/src/components/new-collections/rest/Request.vue @@ -0,0 +1,144 @@ + + + diff --git a/packages/hoppscotch-common/src/components/new-collections/rest/index.vue b/packages/hoppscotch-common/src/components/new-collections/rest/index.vue new file mode 100644 index 000000000..fa541bd0c --- /dev/null +++ b/packages/hoppscotch-common/src/components/new-collections/rest/index.vue @@ -0,0 +1,141 @@ + + + diff --git a/packages/hoppscotch-common/src/components/workspace/Current.vue b/packages/hoppscotch-common/src/components/workspace/Current.vue index 5b3d01ae1..1158b8be9 100644 --- a/packages/hoppscotch-common/src/components/workspace/Current.vue +++ b/packages/hoppscotch-common/src/components/workspace/Current.vue @@ -3,7 +3,7 @@ class="flex items-center overflow-x-auto whitespace-nowrap border-b border-dividerLight px-4 py-2 text-tiny text-secondaryLight" > - {{ currentWorkspace }} + {{ workspaceName ?? t("workspace.no_workspace") }} {{ section }} @@ -14,29 +14,22 @@ import { computed } from "vue" import { useI18n } from "~/composables/i18n" import { useService } from "dioc/vue" -import { WorkspaceService } from "~/services/workspace.service" +import { NewWorkspaceService } from "~/services/new-workspace" -const props = defineProps<{ +defineProps<{ section?: string - isOnlyPersonal?: boolean }>() const t = useI18n() -const workspaceService = useService(WorkspaceService) -const workspace = workspaceService.currentWorkspace +const workspaceService = useService(NewWorkspaceService) +const activeWorkspaceHandle = workspaceService.activeWorkspaceHandle -const currentWorkspace = computed(() => { - if (props.isOnlyPersonal || workspace.value.type === "personal") { - return t("workspace.personal") +const workspaceName = computed(() => { + if (activeWorkspaceHandle.value?.value.type === "ok") { + return activeWorkspaceHandle.value.value.data.name } - return teamWorkspaceName.value -}) -const teamWorkspaceName = computed(() => { - if (workspace.value.type === "team" && workspace.value.teamName) { - return workspace.value.teamName - } - return `${t("workspace.team")}` + return undefined }) diff --git a/packages/hoppscotch-common/src/components/workspace/PersonalWorkspaceSelector.vue b/packages/hoppscotch-common/src/components/workspace/PersonalWorkspaceSelector.vue new file mode 100644 index 000000000..67dabb385 --- /dev/null +++ b/packages/hoppscotch-common/src/components/workspace/PersonalWorkspaceSelector.vue @@ -0,0 +1,53 @@ + + + diff --git a/packages/hoppscotch-common/src/components/workspace/Selector.vue b/packages/hoppscotch-common/src/components/workspace/Selector.vue index 5ac3d7b65..128134f1a 100644 --- a/packages/hoppscotch-common/src/components/workspace/Selector.vue +++ b/packages/hoppscotch-common/src/components/workspace/Selector.vue @@ -1,198 +1,36 @@ diff --git a/packages/hoppscotch-common/src/components/workspace/TestWorkspaceSelector.vue b/packages/hoppscotch-common/src/components/workspace/TestWorkspaceSelector.vue new file mode 100644 index 000000000..175d1f258 --- /dev/null +++ b/packages/hoppscotch-common/src/components/workspace/TestWorkspaceSelector.vue @@ -0,0 +1,64 @@ + + + diff --git a/packages/hoppscotch-common/src/helpers/adapters/WorkspaceRESTCollectionTreeAdapter.ts b/packages/hoppscotch-common/src/helpers/adapters/WorkspaceRESTCollectionTreeAdapter.ts new file mode 100644 index 000000000..fbb8cf8aa --- /dev/null +++ b/packages/hoppscotch-common/src/helpers/adapters/WorkspaceRESTCollectionTreeAdapter.ts @@ -0,0 +1,129 @@ +import { + ChildrenResult, + SmartTreeAdapter, +} from "@hoppscotch/ui/dist/src/helpers/treeAdapter" +import { Ref, computed, ref, watchEffect } from "vue" +import { NewWorkspaceService } from "~/services/new-workspace" +import { HandleRef } from "~/services/new-workspace/handle" +import { + RESTCollectionViewCollection, + RESTCollectionViewRequest, +} from "~/services/new-workspace/view" +import { Workspace } from "~/services/new-workspace/workspace" +import * as E from "fp-ts/Either" + +type WorkspaceRESTCollectionListNode = + | { type: "collection"; value: RESTCollectionViewCollection } + | { type: "request"; value: RESTCollectionViewRequest } + +export class WorkspaceRESTCollectionTreeAdapter + implements SmartTreeAdapter +{ + constructor( + private workspaceHandle: HandleRef, + private workspaceService: NewWorkspaceService + ) {} + + public getChildren( + nodeID: string | null + ): Ref> { + if (this.workspaceHandle.value.type !== "ok") { + throw new Error("Cannot issue children with invalid workspace handle") + } + + const result = ref>({ + status: "loading", + }) + + if (nodeID !== null) { + ;(async () => { + const collectionHandleResult = + await this.workspaceService.getCollectionHandle( + this.workspaceHandle, + nodeID + ) + + // TODO: Better error handling + if (E.isLeft(collectionHandleResult)) { + throw new Error(JSON.stringify(collectionHandleResult.left.error)) + } + + const collectionHandle = collectionHandleResult.right + + const collectionChildrenResult = + await this.workspaceService.getRESTCollectionChildrenView( + collectionHandle + ) + + // TODO: Better error handling + if (E.isLeft(collectionChildrenResult)) { + throw new Error(JSON.stringify(collectionChildrenResult.left.error)) + } + + const collectionChildrenViewHandle = collectionChildrenResult.right + + watchEffect(() => { + if (collectionChildrenViewHandle.value.type !== "ok") return + + if (collectionChildrenViewHandle.value.data.loading.value) { + result.value = { + status: "loading", + } + } else { + result.value = { + status: "loaded", + data: collectionChildrenViewHandle.value.data.content.value.map( + (item) => ({ + id: + item.type === "request" + ? item.value.requestID + : item.value.collectionID, + + data: item, + }) + ), + } + } + }) + })() + } else { + ;(async () => { + const viewResult = + await this.workspaceService.getRESTRootCollectionView( + this.workspaceHandle + ) + + // TODO: Better error handling + if (E.isLeft(viewResult)) { + throw new Error(JSON.stringify(viewResult.left.error)) + } + + const viewHandle = viewResult.right + + watchEffect(() => { + if (viewHandle.value.type !== "ok") return + + if (viewHandle.value.data.loading.value) { + result.value = { + status: "loading", + } + } else { + result.value = { + status: "loaded", + data: viewHandle.value.data.collections.value.map((coll) => ({ + id: coll.collectionID, + + data: { + type: "collection", + value: coll, + }, + })), + } + } + }) + })() + } + + return result + } +} diff --git a/packages/hoppscotch-common/src/helpers/rest/labelColoring.ts b/packages/hoppscotch-common/src/helpers/rest/labelColoring.ts index a2bbf45a3..092b76dc6 100644 --- a/packages/hoppscotch-common/src/helpers/rest/labelColoring.ts +++ b/packages/hoppscotch-common/src/helpers/rest/labelColoring.ts @@ -1,17 +1,13 @@ import { pipe } from "fp-ts/function" import * as O from "fp-ts/Option" import * as RR from "fp-ts/ReadonlyRecord" -import { HoppRESTRequest } from "@hoppscotch/data" export const REQUEST_METHOD_LABEL_COLORS = { - get: "var(--method-get-color)", - post: "var(--method-post-color)", - put: "var(--method-put-color)", - patch: "var(--method-patch-color)", - delete: "var(--method-delete-color)", - head: "var(--method-head-color)", - options: "var(--method-options-color)", - default: "var(--method-default-color)", + get: "var(--success-color)", + post: "var(--warning-color)", + put: "var(--blue-color)", + delete: "var(--cl-error-color)", + default: "#6b7280", } as const /** @@ -19,18 +15,10 @@ export const REQUEST_METHOD_LABEL_COLORS = { * @param request The HoppRESTRequest object to get the value for * @returns The class value for the given HTTP VERB, if not, a generic verb class */ -export function getMethodLabelColorClassOf(request: HoppRESTRequest) { +export function getMethodLabelColorClassOf(request: { method: string }) { return pipe( REQUEST_METHOD_LABEL_COLORS, RR.lookup(request.method.toLowerCase()), O.getOrElseW(() => REQUEST_METHOD_LABEL_COLORS.default) ) } - -export function getMethodLabelColor(method: string) { - return pipe( - REQUEST_METHOD_LABEL_COLORS, - RR.lookup(method.toLowerCase()), - O.getOrElseW(() => REQUEST_METHOD_LABEL_COLORS.default) - ) -} diff --git a/packages/hoppscotch-common/src/index.ts b/packages/hoppscotch-common/src/index.ts index db618d9ad..a4db8641d 100644 --- a/packages/hoppscotch-common/src/index.ts +++ b/packages/hoppscotch-common/src/index.ts @@ -3,18 +3,22 @@ import { createApp } from "vue" import { initializeApp } from "./helpers/app" import { initBackendGQLClient } from "./helpers/backend/GQLClient" import { performMigrations } from "./helpers/migrations" +import { getService } from "./modules/dioc" import { PlatformDef, setPlatformDef } from "./platform" +import { PersonalWorkspaceProviderService } from "./services/new-workspace/providers/personal.workspace" +import { TestWorkspaceProviderService } from "./services/new-workspace/providers/test.workspace" +import { PersistenceService } from "./services/persistence" + +import "@fontsource-variable/inter" +import "@fontsource-variable/material-symbols-rounded" +import "@fontsource-variable/roboto-mono" +import "nprogress/nprogress.css" +import "../assets/scss/styles.scss" import "../assets/scss/tailwind.scss" import "../assets/themes/themes.scss" -import "../assets/scss/styles.scss" -import "nprogress/nprogress.css" - -import "unfonts.css" import App from "./App.vue" -import { getService } from "./modules/dioc" -import { PersistenceService } from "./services/persistence" export function createHoppApp(el: string | Element, platformDef: PlatformDef) { setPlatformDef(platformDef) @@ -24,15 +28,18 @@ export function createHoppApp(el: string | Element, platformDef: PlatformDef) { // Some basic work that needs to be done before module inits even initBackendGQLClient() initializeApp() - - HOPP_MODULES.forEach((mod) => mod.onVueAppInit?.(app)) - platformDef.addedHoppModules?.forEach((mod) => mod.onVueAppInit?.(app)) - // TODO: Explore possibilities of moving this invocation to the service constructor // `toast` was coming up as `null` in the previous attempts getService(PersistenceService).setupLocalPersistence() performMigrations() + // TODO: Remove this + getService(TestWorkspaceProviderService) + getService(PersonalWorkspaceProviderService) + + HOPP_MODULES.forEach((mod) => mod.onVueAppInit?.(app)) + platformDef.addedHoppModules?.forEach((mod) => mod.onVueAppInit?.(app)) + app.mount(el) console.info( diff --git a/packages/hoppscotch-common/src/services/new-workspace/handle.ts b/packages/hoppscotch-common/src/services/new-workspace/handle.ts new file mode 100644 index 000000000..e7529ab3a --- /dev/null +++ b/packages/hoppscotch-common/src/services/new-workspace/handle.ts @@ -0,0 +1,5 @@ +import { Ref } from "vue" + +export type HandleRef = Ref< + { type: "ok"; data: T } | { type: "invalid"; reason: InvalidateReason } +> diff --git a/packages/hoppscotch-common/src/services/new-workspace/index.ts b/packages/hoppscotch-common/src/services/new-workspace/index.ts new file mode 100644 index 000000000..60331f88a --- /dev/null +++ b/packages/hoppscotch-common/src/services/new-workspace/index.ts @@ -0,0 +1,276 @@ +import { Service } from "dioc" +import { + Component, + Ref, + computed, + markRaw, + shallowReactive, + shallowRef, + watch, +} from "vue" +import { WorkspaceProvider } from "./provider" +import { HandleRef } from "./handle" +import * as E from "fp-ts/Either" +import { Workspace, WorkspaceCollection } from "./workspace" +import { RESTCollectionChildrenView, RootRESTCollectionView } from "./view" + +export type WorkspaceError = + | { type: "SERVICE_ERROR"; error: ServiceErr } + | { type: "PROVIDER_ERROR"; error: unknown } + +export class NewWorkspaceService extends Service { + public static readonly ID = "NEW_WORKSPACE_SERVICE" + + private registeredProviders = shallowReactive( + new Map() + ) + + public activeWorkspaceHandle: Ref | undefined> = + shallowRef() + + public activeWorkspaceDecor = computed(() => { + if (this.activeWorkspaceHandle.value?.value.type !== "ok") { + return undefined + } + + return this.registeredProviders.get( + this.activeWorkspaceHandle.value.value.data.providerID + )!.workspaceDecor + }) + + public workspaceSelectorComponents = computed(() => { + const items: Component[] = [] + + const sortedProviders = Array.from(this.registeredProviders.values()).sort( + (a, b) => + (b.workspaceDecor?.value.workspaceSelectorPriority ?? 0) - + (a.workspaceDecor?.value.workspaceSelectorPriority ?? 0) + ) + + for (const workspace of sortedProviders) { + if (workspace.workspaceDecor?.value?.workspaceSelectorComponent) { + items.push(workspace.workspaceDecor.value.workspaceSelectorComponent) + } + } + + return items + }) + + constructor() { + super() + + // Watch for situations where the handle is invalidated + // so the active workspace handle definition can be invalidated + watch( + () => { + return this.activeWorkspaceHandle.value + ? [ + this.activeWorkspaceHandle.value, + this.activeWorkspaceHandle.value.value, + ] + : [this.activeWorkspaceHandle.value] + }, + () => { + if (!this.activeWorkspaceHandle.value) return + + if (this.activeWorkspaceHandle.value.value.type === "invalid") { + this.activeWorkspaceHandle.value = undefined + } + }, + { deep: true } + ) + } + + public async getWorkspaceHandle( + providerID: string, + workspaceID: string + ): Promise< + E.Either, HandleRef> + > { + const provider = this.registeredProviders.get(providerID) + + if (!provider) { + return Promise.resolve( + E.left({ type: "SERVICE_ERROR", error: "INVALID_PROVIDER" as const }) + ) + } + + const handleResult = await provider.getWorkspaceHandle(workspaceID) + + if (E.isLeft(handleResult)) { + return E.left({ type: "PROVIDER_ERROR", error: handleResult.left }) + } + + return E.right(handleResult.right) + } + + public async getCollectionHandle( + workspaceHandle: HandleRef, + collectionID: string + ): Promise< + E.Either< + WorkspaceError<"INVALID_HANDLE" | "INVALID_PROVIDER">, + HandleRef + > + > { + if (workspaceHandle.value.type === "invalid") { + return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) + } + + const provider = this.registeredProviders.get( + workspaceHandle.value.data.providerID + ) + + if (!provider) { + return E.left({ type: "SERVICE_ERROR", error: "INVALID_PROVIDER" }) + } + + const result = await provider.getCollectionHandle( + workspaceHandle, + collectionID + ) + + if (E.isLeft(result)) { + return E.left({ type: "PROVIDER_ERROR", error: result.left }) + } + + return E.right(result.right) + } + + public async createRESTRootCollection( + workspaceHandle: HandleRef, + collectionName: string + ): Promise< + E.Either< + WorkspaceError<"INVALID_HANDLE" | "INVALID_PROVIDER">, + HandleRef + > + > { + if (workspaceHandle.value.type === "invalid") { + return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) + } + + const provider = this.registeredProviders.get( + workspaceHandle.value.data.providerID + ) + + if (!provider) { + return E.left({ type: "SERVICE_ERROR", error: "INVALID_PROVIDER" }) + } + + const result = await provider.createRESTRootCollection( + workspaceHandle, + collectionName + ) + + if (E.isLeft(result)) { + return E.left({ type: "PROVIDER_ERROR", error: result.left }) + } + + return E.right(result.right) + } + + public async createRESTChildCollection( + parentCollHandle: HandleRef, + collectionName: string + ): Promise< + E.Either< + WorkspaceError<"INVALID_HANDLE" | "INVALID_PROVIDER">, + HandleRef + > + > { + if (parentCollHandle.value.type === "invalid") { + return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) + } + + const provider = this.registeredProviders.get( + parentCollHandle.value.data.providerID + ) + + if (!provider) { + return E.left({ type: "SERVICE_ERROR", error: "INVALID_PROVIDER" }) + } + + const result = await provider.createRESTChildCollection( + parentCollHandle, + collectionName + ) + + if (E.isLeft(result)) { + return E.left({ type: "PROVIDER_ERROR", error: result.left }) + } + + return E.right(result.right) + } + + public async getRESTCollectionChildrenView( + collectionHandle: HandleRef + ): Promise< + E.Either< + WorkspaceError<"INVALID_HANDLE" | "INVALID_PROVIDER">, + HandleRef + > + > { + if (collectionHandle.value.type === "invalid") { + return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) + } + + const provider = this.registeredProviders.get( + collectionHandle.value.data.providerID + ) + + if (!provider) { + return E.left({ type: "SERVICE_ERROR", error: "INVALID_PROVIDER" }) + } + + const result = + await provider.getRESTCollectionChildrenView(collectionHandle) + + if (E.isLeft(result)) { + return E.left({ type: "PROVIDER_ERROR", error: result.left }) + } + + return E.right(result.right) + } + + public async getRESTRootCollectionView( + workspaceHandle: HandleRef + ): Promise< + E.Either< + WorkspaceError<"INVALID_HANDLE" | "INVALID_PROVIDER">, + HandleRef + > + > { + if (workspaceHandle.value.type === "invalid") { + return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) + } + + const provider = this.registeredProviders.get( + workspaceHandle.value.data.providerID + ) + + if (!provider) { + return E.left({ type: "SERVICE_ERROR", error: "INVALID_PROVIDER" }) + } + + const result = await provider.getRESTRootCollectionView(workspaceHandle) + + if (E.isLeft(result)) { + return E.left({ type: "PROVIDER_ERROR", error: result.left }) + } + + return E.right(result.right) + } + + public registerWorkspaceProvider(provider: WorkspaceProvider) { + if (this.registeredProviders.has(provider.providerID)) { + console.warn( + "Ignoring attempt to re-register workspace provider that is already existing:", + provider + ) + return + } + + this.registeredProviders.set(provider.providerID, markRaw(provider)) + } +} diff --git a/packages/hoppscotch-common/src/services/new-workspace/provider.ts b/packages/hoppscotch-common/src/services/new-workspace/provider.ts new file mode 100644 index 000000000..5ad1ad1fc --- /dev/null +++ b/packages/hoppscotch-common/src/services/new-workspace/provider.ts @@ -0,0 +1,35 @@ +import { Ref } from "vue" +import * as E from "fp-ts/Either" +import { HandleRef } from "./handle" +import { Workspace, WorkspaceCollection, WorkspaceDecor } from "./workspace" +import { RESTCollectionChildrenView, RootRESTCollectionView } from "./view" + +export interface WorkspaceProvider { + providerID: string + + workspaceDecor?: Ref + + getWorkspaceHandle( + workspaceID: string + ): Promise>> + getCollectionHandle( + workspaceHandle: HandleRef, + collectionID: string + ): Promise>> + + getRESTRootCollectionView( + workspaceHandle: HandleRef + ): Promise>> + getRESTCollectionChildrenView( + collectionHandle: HandleRef + ): Promise>> + + createRESTRootCollection( + workspaceHandle: HandleRef, + collectionName: string + ): Promise>> + createRESTChildCollection( + parentCollHandle: HandleRef, + collectionName: string + ): Promise>> +} diff --git a/packages/hoppscotch-common/src/services/new-workspace/providers/personal.workspace.ts b/packages/hoppscotch-common/src/services/new-workspace/providers/personal.workspace.ts new file mode 100644 index 000000000..81353d5b1 --- /dev/null +++ b/packages/hoppscotch-common/src/services/new-workspace/providers/personal.workspace.ts @@ -0,0 +1,400 @@ +import { + HoppCollection, + HoppRESTRequest, + makeCollection, +} from "@hoppscotch/data" +import { Service } from "dioc" +import * as E from "fp-ts/Either" +import { get } from "lodash-es" +import { v4 as uuid } from "uuid" +import { Ref, computed, markRaw, ref, shallowReactive, shallowRef } from "vue" + +import PersonalWorkspaceSelector from "~/components/workspace/PersonalWorkspaceSelector.vue" +import { useStreamStatic } from "~/composables/stream" + +import { addRESTCollection, restCollectionStore } from "~/newstore/collections" +import { platform } from "~/platform" + +import { HandleRef } from "~/services/new-workspace/handle" +import { WorkspaceProvider } from "~/services/new-workspace/provider" +import { + RESTCollectionChildrenView, + RESTCollectionViewItem, + RootRESTCollectionView, +} from "~/services/new-workspace/view" +import { + Workspace, + WorkspaceCollection, + WorkspaceDecor, +} from "~/services/new-workspace/workspace" + +import IconUser from "~icons/lucide/user" +import { NewWorkspaceService } from ".." + +export class PersonalWorkspaceProviderService + extends Service + implements WorkspaceProvider +{ + public static readonly ID = "PERSONAL_WORKSPACE_PROVIDER_SERVICE" + + public readonly providerID = "PERSONAL_WORKSPACE_PROVIDER" + + private workspaceService = this.bind(NewWorkspaceService) + + public workspaceDecor: Ref = ref({ + headerCurrentIcon: IconUser, + workspaceSelectorComponent: PersonalWorkspaceSelector, + workspaceSelectorPriority: 100, + }) + + private restCollectionState: Ref<{ state: HoppCollection[] }> + + public constructor() { + super() + + this.restCollectionState = useStreamStatic( + restCollectionStore.subject$, + { state: [] }, + () => { + /* noop */ + } + )[0] + + this.workspaceService.registerWorkspaceProvider(this) + } + + private collectionIDMap = shallowReactive( + new WeakMap() + ) + + private reqIDMap = shallowReactive(new WeakMap()) + + private collectionIDPathMap = shallowReactive(new Map()) + + private generatedUUIDs = new Set() + + private generateUniqueUUID() { + let id = uuid() + + while (this.generatedUUIDs.has(id)) { + id = uuid() + } + + this.generatedUUIDs.add(id) + + return id + } + + private resolvePathFromCollectionID(id: string): number[] | undefined { + return this.collectionIDPathMap.get(id) + } + + private resolveCollectionFromCollectionID( + id: string + ): HoppCollection | undefined { + const path = this.resolvePathFromCollectionID(id) + + if (path === undefined) return + + const collPath = path.flatMap((x, i) => + i === 0 ? [x.toString()] : ["folders", x.toString()] + ) + + const coll = get(this.restCollectionState.value.state, collPath) as + | HoppCollection + | undefined + + return coll + } + + private getIssuedInstanceIDForCollection( + coll: HoppCollection, + location: number[] + ) { + const id = this.collectionIDMap.has(coll) + ? this.collectionIDMap.get(coll)! + : this.generateUniqueUUID() + + this.collectionIDPathMap.set(id, location) + this.collectionIDMap.set(coll, id) + + return id + } + + private getIssuedInstanceIDForRequest(req: HoppRESTRequest) { + const id = this.reqIDMap.get(req) ?? this.generateUniqueUUID() + + this.reqIDMap.set(req, id) + + return id + } + + public createRESTChildCollection( + parentCollHandle: HandleRef, + collectionName: string + ): Promise>> { + throw new Error("TODO: Method not implemented.") + } + + public createRESTRootCollection( + workspaceHandle: HandleRef, + collectionName: string + ): Promise>> { + if ( + workspaceHandle.value.type !== "ok" || + workspaceHandle.value.data.providerID !== this.providerID || + workspaceHandle.value.data.workspaceID !== "personal" + ) { + return Promise.resolve(E.left("INVALID_WORKSPACE_HANDLE" as const)) + } + + return Promise.resolve( + E.right( + computed(() => { + if ( + workspaceHandle.value.type !== "ok" || + workspaceHandle.value.data.providerID !== this.providerID || + workspaceHandle.value.data.workspaceID !== "personal" + ) { + return { + type: "invalid", + reason: "WORKSPACE_INVALIDATED" as const, + } + } + + addRESTCollection( + makeCollection({ + name: collectionName, + folders: [], + requests: [], + headers: [], + auth: { + authType: "inherit", + authActive: false, + }, + }) + ) + + platform.analytics?.logEvent({ + type: "HOPP_CREATE_COLLECTION", + platform: "rest", + workspaceType: "personal", + isRootCollection: true, + }) + + return { + type: "ok", + data: { + providerID: this.providerID, + workspaceID: workspaceHandle.value.data.workspaceID, + collectionID: "", + name: collectionName, + }, + } + }) + ) + ) + } + + public getCollectionHandle( + workspaceHandle: HandleRef, + collectionID: string + ): Promise< + E.Either<"INVALID_WORKSPACE_HANDLE", HandleRef> + > { + if ( + workspaceHandle.value.type !== "ok" || + workspaceHandle.value.data.providerID !== this.providerID || + workspaceHandle.value.data.workspaceID !== "personal" + ) { + return Promise.resolve(E.left("INVALID_WORKSPACE_HANDLE" as const)) + } + + return Promise.resolve( + E.right( + computed(() => { + if ( + workspaceHandle.value.type !== "ok" || + workspaceHandle.value.data.providerID !== this.providerID || + workspaceHandle.value.data.workspaceID !== "personal" + ) { + return { + type: "invalid", + reason: "WORKSPACE_INVALIDATED" as const, + } + } + + // TODO: The way the IDs are issued, this will make it so we need a view + // before the ID is issued correctly + const coll = this.resolveCollectionFromCollectionID(collectionID) + + if (coll === undefined) { + return { + type: "invalid", + reason: "INVALID_COLL_ID" as const, + } + } + + return { + type: "ok", + data: { + providerID: this.providerID, + workspaceID: workspaceHandle.value.data.workspaceID, + collectionID, + name: coll.name, + }, + } + }) + ) + ) + } + + public getRESTCollectionChildrenView( + collectionHandle: HandleRef + ): Promise>> { + return Promise.resolve( + E.right( + computed(() => { + if ( + collectionHandle.value.type === "invalid" || + collectionHandle.value.data.providerID !== this.providerID || + collectionHandle.value.data.workspaceID !== "personal" + ) { + return { + type: "invalid" as const, + reason: "INVALID_COLLECTION_HANDLE" as const, + } + } + + const collectionID = collectionHandle.value.data.collectionID + + return markRaw({ + type: "ok" as const, + data: { + providerID: this.providerID, + workspaceID: collectionHandle.value.data.workspaceID, + collectionID: collectionHandle.value.data.collectionID, + + loading: ref(false), + mayHaveMoreContent: ref(false), + + content: computed(() => { + const path = this.resolvePathFromCollectionID(collectionID) + const coll = + this.resolveCollectionFromCollectionID(collectionID) + + if (coll === undefined || path === undefined) { + console.warn("Collection against ID was not resolvable") + + return [] + } + + const collections = coll.folders.map((childColl, i) => { + const id = this.getIssuedInstanceIDForCollection(childColl, [ + ...path, + i, + ]) + + return { + type: "collection", + value: { + collectionID: id, + name: coll.name, + }, + } + }) + + const requests = coll.requests.map((req, i) => { + const id = this.getIssuedInstanceIDForRequest(req) + + return { + type: "request", + value: { + requestID: id, + name: req.name, + method: req.method, + }, + } + }) + + return [...collections, ...requests] + }), + loadMore() { + return Promise.resolve() + }, + }, + }) + }) + ) + ) + } + + public getRESTRootCollectionView( + workspaceHandle: HandleRef + ): Promise>> { + return Promise.resolve( + E.right( + computed(() => { + if ( + workspaceHandle.value.type === "invalid" || + workspaceHandle.value.data.providerID !== this.providerID || + workspaceHandle.value.data.workspaceID !== "personal" + ) { + return { + type: "invalid" as const, + reason: "INVALID_WORKSPACE_HANDLE" as const, + } + } + + return markRaw({ + type: "ok" as const, + data: { + providerID: this.providerID, + workspaceID: workspaceHandle.value.data.workspaceID, + + loading: ref(false), + mayHaveMoreContent: ref(false), + + collections: computed(() => { + return this.restCollectionState.value.state.map((coll, i) => { + const id = this.getIssuedInstanceIDForCollection(coll, [i]) + + return { + collectionID: id, + name: coll.name, + } + }) + }), + loadMore() { + return Promise.resolve() + }, + }, + }) + }) + ) + ) + } + + public getWorkspaceHandle( + workspaceID: string + ): Promise>> { + if (workspaceID !== "personal") { + return Promise.resolve(E.left("INVALID_WORKSPACE_ID" as const)) + } + + return Promise.resolve(E.right(this.getPersonalWorkspaceHandle())) + } + + public getPersonalWorkspaceHandle(): HandleRef { + return shallowRef({ + type: "ok" as const, + data: { + providerID: this.providerID, + workspaceID: "personal", + + name: "Personal Workspace", + collectionsAreReadonly: false, + }, + }) + } +} diff --git a/packages/hoppscotch-common/src/services/new-workspace/providers/test.workspace.ts b/packages/hoppscotch-common/src/services/new-workspace/providers/test.workspace.ts new file mode 100644 index 000000000..bd7e236f6 --- /dev/null +++ b/packages/hoppscotch-common/src/services/new-workspace/providers/test.workspace.ts @@ -0,0 +1,321 @@ +import { computed, markRaw, reactive, ref } from "vue" +import { useTimestamp } from "@vueuse/core" +import { Service } from "dioc" +import { WorkspaceProvider } from "../provider" +import * as E from "fp-ts/Either" +import { HandleRef } from "../handle" +import { Workspace, WorkspaceCollection } from "../workspace" +import { NewWorkspaceService } from ".." +import TestWorkspaceSelector from "~/components/workspace/TestWorkspaceSelector.vue" +import { RESTCollectionChildrenView, RootRESTCollectionView } from "../view" +import IconUser from "~icons/lucide/user" +import { get } from "lodash-es" + +type TestReqDef = { + name: string +} + +type TestCollDef = { + name: string + collections: TestCollDef[] + requests: TestReqDef[] +} + +const timestamp = useTimestamp({ interval: 3000 }) +// const timestamp = ref(Date.now()) + +const testData = reactive({ + workspaceA: { + name: computed(() => `Workspace A: ${timestamp.value}`), + collections: [ + { + name: "Collection A", + collections: [ + { + name: "Collection B", + collections: [ + { name: "Collection C", collections: [], requests: [] }, + ], + requests: [], + }, + ], + requests: [{ name: "Request C" }], + }, + ], + }, + workspaceB: { + name: "Workspace B", + collections: [ + { + name: "Collection D", + collections: [{ name: "Collection E", collections: [], requests: [] }], + requests: [{ name: "Request F" }], + }, + ], + }, +}) + +;(window as any).testData = testData + +export class TestWorkspaceProviderService + extends Service + implements WorkspaceProvider +{ + public static readonly ID = "TEST_WORKSPACE_PROVIDER_SERVICE" + + public providerID = "TEST_WORKSPACE_PROVIDER" + + public workspaceDecor = ref({ + workspaceSelectorComponent: markRaw(TestWorkspaceSelector), + headerCurrentIcon: markRaw(IconUser), + workspaceSelectorPriority: 10, + }) + + private readonly workspaceService = this.bind(NewWorkspaceService) + + constructor() { + super() + + this.workspaceService.registerWorkspaceProvider(this) + } + + public createRESTRootCollection( + workspaceHandle: HandleRef, + collectionName: string + ): Promise< + E.Either<"INVALID_WORKSPACE_HANDLE", HandleRef> + > { + if (workspaceHandle.value.type !== "ok") { + return Promise.resolve(E.left("INVALID_WORKSPACE_HANDLE" as const)) + } + + const workspaceID = workspaceHandle.value.data.workspaceID + + const newCollID = + testData[workspaceID as keyof typeof testData].collections.length + + testData[workspaceID as keyof typeof testData].collections.push({ + name: collectionName, + collections: [], + requests: [], + }) + + return this.getCollectionHandle(workspaceHandle, newCollID.toString()) + } + + public createRESTChildCollection( + parentCollHandle: HandleRef, + collectionName: string + ): Promise>> { + // TODO: Implement + throw new Error("Method not implemented.") + } + + public getWorkspaceHandle( + workspaceID: string + ): Promise>> { + return Promise.resolve( + E.right( + computed(() => { + if (!(workspaceID in testData)) { + return { + type: "invalid", + reason: "WORKSPACE_WENT_OUT" as const, + } + } + + return { + type: "ok", + data: { + providerID: this.providerID, + workspaceID, + name: testData[workspaceID as keyof typeof testData].name, + collectionsAreReadonly: false, + }, + } + }) + ) + ) + } + + public getCollectionHandle( + workspaceHandle: HandleRef, + collectionID: string + ): Promise< + E.Either<"INVALID_WORKSPACE_HANDLE", HandleRef> + > { + return Promise.resolve( + E.right( + computed(() => { + if (workspaceHandle.value.type !== "ok") { + return { + type: "invalid", + reason: "WORKSPACE_INVALIDATED" as const, + } + } + + const workspaceID = workspaceHandle.value.data.workspaceID + const collectionPath = collectionID + .split("/") + .flatMap((x) => ["collections", x]) + + const result: TestCollDef | undefined = get( + testData[workspaceID as keyof typeof testData], + collectionPath + ) + + if (!result) { + return { + type: "invalid", + reason: "INVALID_COLL_ID", + } + } + + return { + type: "ok", + data: { + providerID: this.providerID, + workspaceID, + collectionID, + name: result.name, + }, + } + }) + ) + ) + } + + public getRESTCollectionChildrenView( + collectionHandle: HandleRef + ): Promise>> { + return Promise.resolve( + E.right( + computed(() => { + if (collectionHandle.value.type === "invalid") { + return { + type: "invalid", + reason: "COLL_HANDLE_IS_INVALID" as const, + } + } + + const workspaceID = collectionHandle.value.data.workspaceID + const collectionID = collectionHandle.value.data.collectionID + + if (!(workspaceID in testData)) { + return { + type: "invalid", + reason: "WORKSPACE_NOT_PRESENT" as const, + } + } + + const collectionPath = collectionID + .split("/") + .flatMap((x) => ["collections", x]) + + return markRaw({ + type: "ok", + data: { + providerID: this.providerID, + workspaceID, + collectionID, + + mayHaveMoreContent: ref(false), + loading: ref(false), + + content: computed(() => [ + ...( + get(testData[workspaceID as keyof typeof testData], [ + ...collectionPath, + "collections", + ]) as TestCollDef[] + ).map((item, i) => ({ + type: "collection" as const, + value: { + collectionID: `${collectionID}/${i}`, + name: item.name, + }, + })), + ...( + get(testData[workspaceID as keyof typeof testData], [ + ...collectionPath, + "requests", + ]) as TestReqDef[] + ).map((item, i) => ({ + type: "request" as const, + value: { + requestID: `${collectionID}/${i}`, + name: item.name, + method: "get", + }, + })), + ]), + + loadMore(_count: number) { + return Promise.resolve() + }, + }, + }) + }) + ) + ) + } + + public getRESTRootCollectionView( + workspaceHandle: HandleRef + ): Promise>> { + return Promise.resolve( + E.right( + computed(() => { + if (workspaceHandle.value.type === "invalid") { + return { + type: "invalid", + reason: "WORKSPACE_IS_INVALID" as const, + } + } + + const workspaceID = workspaceHandle.value.data.workspaceID + + if (!(workspaceID in testData)) { + return { + type: "invalid", + reason: "WORKSPACE_NOT_PRESENT" as const, + } + } + + return markRaw({ + type: "ok", + data: { + providerID: this.providerID, + workspaceID, + + mayHaveMoreContent: ref(false), + loading: ref(false), + + collections: computed(() => { + return testData[ + workspaceID as keyof typeof testData + ].collections.map((x, i) => ({ + collectionID: i.toString(), + name: x.name, + })) + }), + + loadMore() { + return Promise.resolve() + }, + }, + }) + }) + ) + ) + } + + public getWorkspaceCandidates() { + return computed(() => + Object.keys(testData).map((workspaceID) => ({ + id: workspaceID, + name: testData[workspaceID as keyof typeof testData].name, + })) + ) + } +} diff --git a/packages/hoppscotch-common/src/services/new-workspace/view.ts b/packages/hoppscotch-common/src/services/new-workspace/view.ts new file mode 100644 index 000000000..e735c0532 --- /dev/null +++ b/packages/hoppscotch-common/src/services/new-workspace/view.ts @@ -0,0 +1,42 @@ +import { Ref } from "vue" + +export type RESTCollectionViewCollection = { + collectionID: string + name: string +} + +export type RESTCollectionViewRequest = { + requestID: string + + name: string + method: string +} + +export type RESTCollectionViewItem = + | { type: "collection"; value: RESTCollectionViewCollection } + | { type: "request"; value: RESTCollectionViewRequest } + +export interface RootRESTCollectionView { + providerID: string + workspaceID: string + + mayHaveMoreContent: Ref + loading: Ref + + collections: Ref + + loadMore(count: number): Promise +} + +export interface RESTCollectionChildrenView { + providerID: string + workspaceID: string + collectionID: string + + mayHaveMoreContent: Ref + loading: Ref + + content: Ref + + loadMore(count: number): Promise +} diff --git a/packages/hoppscotch-common/src/services/new-workspace/workspace.ts b/packages/hoppscotch-common/src/services/new-workspace/workspace.ts new file mode 100644 index 000000000..8eb3043c5 --- /dev/null +++ b/packages/hoppscotch-common/src/services/new-workspace/workspace.ts @@ -0,0 +1,27 @@ +import { Component } from "vue" + +export type Workspace = { + providerID: string + workspaceID: string + + name: string + + collectionsAreReadonly: boolean +} + +export type WorkspaceCollection = { + providerID: string + workspaceID: string + collectionID: string + + name: string +} + +export type WorkspaceDecor = { + headerComponent?: Component + + headerCurrentIcon?: Component | object + + workspaceSelectorComponent?: Component + workspaceSelectorPriority?: number +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 89b5cc689..0129837a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -477,7 +477,7 @@ importers: version: 16.8.1 graphql-language-service-interface: specifier: 2.10.2 - version: 2.10.2(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) + version: 2.10.2(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) graphql-tag: specifier: 2.12.6 version: 2.12.6(graphql@16.8.1) @@ -763,7 +763,7 @@ importers: version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0) vite-plugin-checker: specifier: 0.6.2 - version: 0.6.2(eslint@8.57.0)(optionator@0.9.3)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(vue-tsc@1.8.24(typescript@5.3.2)) + version: 0.6.2(eslint@8.57.0)(meow@8.1.2)(optionator@0.9.3)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(vue-tsc@1.8.24(typescript@5.3.2)) vite-plugin-fonts: specifier: 0.7.0 version: 0.7.0(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0)) @@ -882,7 +882,7 @@ importers: version: 2.8.4 ts-jest: specifier: 27.1.5 - version: 27.1.5(@babel/core@7.23.9)(@types/jest@27.5.2)(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5) + version: 27.1.5(@babel/core@7.23.9)(@types/jest@27.5.2)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 @@ -1051,10 +1051,10 @@ importers: version: 1.1.1(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0)) unplugin-icons: specifier: 0.14.9 - version: 0.14.9(@vue/compiler-sfc@3.3.10)(esbuild@0.20.0)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(vue-template-compiler@2.7.14)(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) + version: 0.14.9(@vue/compiler-sfc@3.3.10)(esbuild@0.20.0)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(vue-template-compiler@2.7.14)(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) unplugin-vue-components: specifier: 0.21.0 - version: 0.21.0(@babel/parser@7.23.9)(esbuild@0.20.0)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) + version: 0.21.0(@babel/parser@7.23.9)(esbuild@0.20.0)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) vite: specifier: 4.5.0 version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0) @@ -1063,7 +1063,7 @@ importers: version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0)) vite-plugin-inspect: specifier: 0.7.38 - version: 0.7.38(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0)) + version: 0.7.38(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0)) vite-plugin-pages: specifier: 0.26.0 version: 0.26.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0)) @@ -1220,7 +1220,7 @@ importers: version: 0.17.4(@vue/compiler-sfc@3.3.10)(vue-template-compiler@2.7.14) unplugin-vue-components: specifier: 0.25.2 - version: 0.25.2(@babel/parser@7.23.9)(rollup@2.79.1)(vue@3.3.9(typescript@5.3.2)) + version: 0.25.2(@babel/parser@7.23.9)(rollup@3.29.4)(vue@3.3.9(typescript@5.3.2)) vite: specifier: 4.5.0 version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0) @@ -1232,7 +1232,7 @@ importers: version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0)) vite-plugin-inspect: specifier: 0.7.42 - version: 0.7.42(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0)) + version: 0.7.42(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0)) vite-plugin-pages: specifier: 0.31.0 version: 0.31.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0)) @@ -1274,7 +1274,7 @@ importers: version: 0.1.0(vue@3.3.9(typescript@4.9.3)) '@intlify/unplugin-vue-i18n': specifier: 1.2.0 - version: 1.2.0(rollup@2.79.1)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3))) + version: 1.2.0(rollup@3.29.4)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3))) '@types/cors': specifier: 2.8.13 version: 2.8.13 @@ -1337,10 +1337,10 @@ importers: version: 2.0.0(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@4.9.3) unplugin-icons: specifier: 0.14.9 - version: 0.14.9(@vue/compiler-sfc@3.2.45)(esbuild@0.20.0)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(vue-template-compiler@2.7.14)(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) + version: 0.14.9(@vue/compiler-sfc@3.2.45)(esbuild@0.20.0)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(vue-template-compiler@2.7.14)(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) unplugin-vue-components: specifier: 0.21.0 - version: 0.21.0(@babel/parser@7.23.9)(esbuild@0.20.0)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) + version: 0.21.0(@babel/parser@7.23.9)(esbuild@0.20.0)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) vue: specifier: 3.3.9 version: 3.3.9(typescript@4.9.3) @@ -3514,8 +3514,8 @@ packages: resolution: {integrity: sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==} engines: {node: '>= 14'} - '@intlify/message-compiler@10.0.0-alpha.3': - resolution: {integrity: sha512-WjM1KAl5enpOfprfVAJ3FzwACmizZFPgyV0sn+QXoWH8BG2ahVkf7uVEqQH0mvUr2rKKaScwpzhH3wZ5F7ZdPw==} + '@intlify/message-compiler@10.0.0-alpha.5': + resolution: {integrity: sha512-8Fr+1EsuxaCRWrrj3ZQ22DQU4vQzBxDHMMlLcN/6uM3R3kObTc0+Ip6EFrHXTsNm5LGETxlJlpi328U1dth/aA==} engines: {node: '>= 16'} '@intlify/message-compiler@9.2.2': @@ -3530,8 +3530,8 @@ packages: resolution: {integrity: sha512-McnYWhcoYmDJvssVu6QGR0shqlkJuL1HHdi5lK7fNqvQqRYaQ4lSLjYmZxwc8tRNMdIe9/KUKfyPxU9M6yCtNQ==} engines: {node: '>= 16'} - '@intlify/shared@10.0.0-alpha.3': - resolution: {integrity: sha512-fi2q48i+C6sSCAt3vOj/9LD3tkr1wcvLt+ifZEHrpPiwHCyKLDYGp5qBNUHUBBA/iqFTeWdtHUbHE9z9OeTXkw==} + '@intlify/shared@10.0.0-alpha.5': + resolution: {integrity: sha512-uCXI2IM9B2fwR7whGJ+DNBGxI02cSgD4E0ItY1ls++Vubrt92rD86o/9AUb9S/6jyK2hy3kFaTzublQIylMAsA==} engines: {node: '>= 16'} '@intlify/shared@9.2.2': @@ -15519,8 +15519,8 @@ snapshots: '@intlify/bundle-utils@3.4.0(vue-i18n@9.8.0(vue@3.3.9(typescript@5.3.2)))': dependencies: - '@intlify/message-compiler': 10.0.0-alpha.3 - '@intlify/shared': 10.0.0-alpha.3 + '@intlify/message-compiler': 10.0.0-alpha.5 + '@intlify/shared': 10.0.0-alpha.5 jsonc-eslint-parser: 1.4.1 source-map: 0.6.1 yaml-eslint-parser: 0.3.2 @@ -15573,9 +15573,9 @@ snapshots: dependencies: '@intlify/shared': 9.2.2 - '@intlify/message-compiler@10.0.0-alpha.3': + '@intlify/message-compiler@10.0.0-alpha.5': dependencies: - '@intlify/shared': 10.0.0-alpha.3 + '@intlify/shared': 10.0.0-alpha.5 source-map-js: 1.0.2 '@intlify/message-compiler@9.2.2': @@ -15593,7 +15593,7 @@ snapshots: '@intlify/shared': 9.8.0 source-map-js: 1.0.2 - '@intlify/shared@10.0.0-alpha.3': {} + '@intlify/shared@10.0.0-alpha.5': {} '@intlify/shared@9.2.2': {} @@ -15601,11 +15601,11 @@ snapshots: '@intlify/shared@9.8.0': {} - '@intlify/unplugin-vue-i18n@1.2.0(rollup@2.79.1)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3)))': + '@intlify/unplugin-vue-i18n@1.2.0(rollup@3.29.4)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3)))': dependencies: '@intlify/bundle-utils': 7.4.0(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3))) '@intlify/shared': 9.8.0 - '@rollup/pluginutils': 5.1.0(rollup@2.79.1) + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) '@vue/compiler-sfc': 3.3.10 debug: 4.3.4(supports-color@9.2.2) fast-glob: 3.3.2 @@ -15624,7 +15624,7 @@ snapshots: '@intlify/vite-plugin-vue-i18n@6.0.1(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(vue-i18n@9.8.0(vue@3.3.9(typescript@4.9.5)))': dependencies: '@intlify/bundle-utils': 7.0.0(vue-i18n@9.8.0(vue@3.3.9(typescript@4.9.5))) - '@intlify/shared': 10.0.0-alpha.3 + '@intlify/shared': 10.0.0-alpha.5 '@rollup/pluginutils': 4.2.1 debug: 4.3.4(supports-color@9.2.2) fast-glob: 3.3.2 @@ -15638,7 +15638,7 @@ snapshots: '@intlify/vite-plugin-vue-i18n@7.0.0(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(vue-i18n@9.8.0(vue@3.3.9(typescript@5.3.2)))': dependencies: '@intlify/bundle-utils': 3.4.0(vue-i18n@9.8.0(vue@3.3.9(typescript@5.3.2))) - '@intlify/shared': 10.0.0-alpha.3 + '@intlify/shared': 10.0.0-alpha.5 '@rollup/pluginutils': 4.2.1 debug: 4.3.4(supports-color@9.2.2) fast-glob: 3.3.2 @@ -16464,14 +16464,6 @@ snapshots: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/pluginutils@5.1.0(rollup@2.79.1)': - dependencies: - '@types/estree': 1.0.5 - estree-walker: 2.0.2 - picomatch: 2.3.1 - optionalDependencies: - rollup: 2.79.1 - '@rollup/pluginutils@5.1.0(rollup@3.29.4)': dependencies: '@types/estree': 1.0.5 @@ -19143,10 +19135,10 @@ snapshots: ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@4.9.3) typescript: 4.9.3 - cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2): + cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2): dependencies: '@types/node': 18.18.8 - cosmiconfig: 7.0.1 + cosmiconfig: 8.2.0 ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2) typescript: 5.3.2 optional: true @@ -21021,7 +21013,7 @@ snapshots: - encoding - utf-8-validate - graphql-config@4.4.1(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1): + graphql-config@4.4.1(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1): dependencies: '@graphql-tools/graphql-file-loader': 7.5.16(graphql@16.8.1) '@graphql-tools/json-file-loader': 7.4.17(graphql@16.8.1) @@ -21035,7 +21027,7 @@ snapshots: string-env-interpolation: 1.0.1 tslib: 2.6.2 optionalDependencies: - cosmiconfig-typescript-loader: 4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2) + cosmiconfig-typescript-loader: 4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2) transitivePeerDependencies: - '@types/node' - bufferutil @@ -21062,13 +21054,13 @@ snapshots: - encoding - utf-8-validate - graphql-language-service-interface@2.10.2(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1): + graphql-language-service-interface@2.10.2(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1): dependencies: graphql: 16.8.1 - graphql-config: 4.4.1(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) - graphql-language-service-parser: 1.10.4(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) - graphql-language-service-types: 1.8.7(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) - graphql-language-service-utils: 2.7.1(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) + graphql-config: 4.4.1(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) + graphql-language-service-parser: 1.10.4(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) + graphql-language-service-types: 1.8.7(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) + graphql-language-service-utils: 2.7.1(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) vscode-languageserver-types: 3.17.2 transitivePeerDependencies: - '@types/node' @@ -21078,10 +21070,10 @@ snapshots: - encoding - utf-8-validate - graphql-language-service-parser@1.10.4(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1): + graphql-language-service-parser@1.10.4(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1): dependencies: graphql: 16.8.1 - graphql-language-service-types: 1.8.7(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) + graphql-language-service-types: 1.8.7(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) transitivePeerDependencies: - '@types/node' - bufferutil @@ -21090,10 +21082,10 @@ snapshots: - encoding - utf-8-validate - graphql-language-service-types@1.8.7(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1): + graphql-language-service-types@1.8.7(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1): dependencies: graphql: 16.8.1 - graphql-config: 4.4.1(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) + graphql-config: 4.4.1(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) vscode-languageserver-types: 3.17.2 transitivePeerDependencies: - '@types/node' @@ -21103,11 +21095,11 @@ snapshots: - encoding - utf-8-validate - graphql-language-service-utils@2.7.1(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1): + graphql-language-service-utils@2.7.1(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1): dependencies: '@types/json-schema': 7.0.9 graphql: 16.8.1 - graphql-language-service-types: 1.8.7(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@7.0.1)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) + graphql-language-service-types: 1.8.7(@types/node@18.18.8)(cosmiconfig-typescript-loader@4.3.0(@types/node@18.18.8)(cosmiconfig@8.2.0)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2))(typescript@5.3.2))(graphql@16.8.1) nullthrows: 1.1.1 transitivePeerDependencies: - '@types/node' @@ -25405,7 +25397,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@27.1.5(@babel/core@7.23.9)(@types/jest@27.5.2)(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5): + ts-jest@27.1.5(@babel/core@7.23.9)(@types/jest@27.5.2)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -25420,6 +25412,7 @@ snapshots: optionalDependencies: '@babel/core': 7.23.9 '@types/jest': 27.5.2 + babel-jest: 29.7.0(@babel/core@7.23.9) ts-jest@29.0.5(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.4.1(@types/node@18.11.10)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.11.10)(typescript@4.9.3)))(typescript@4.9.3): dependencies: @@ -25841,7 +25834,7 @@ snapshots: unplugin: 1.5.1 vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0) - unplugin-icons@0.14.9(@vue/compiler-sfc@3.2.45)(esbuild@0.20.0)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(vue-template-compiler@2.7.14)(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): + unplugin-icons@0.14.9(@vue/compiler-sfc@3.2.45)(esbuild@0.20.0)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(vue-template-compiler@2.7.14)(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): dependencies: '@antfu/install-pkg': 0.1.1 '@antfu/utils': 0.5.2 @@ -25849,7 +25842,7 @@ snapshots: debug: 4.3.4(supports-color@9.2.2) kolorist: 1.8.0 local-pkg: 0.4.3 - unplugin: 0.9.5(esbuild@0.20.0)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) + unplugin: 0.9.5(esbuild@0.20.0)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) optionalDependencies: '@vue/compiler-sfc': 3.2.45 vue-template-compiler: 2.7.14 @@ -25860,7 +25853,7 @@ snapshots: - vite - webpack - unplugin-icons@0.14.9(@vue/compiler-sfc@3.3.10)(esbuild@0.20.0)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(vue-template-compiler@2.7.14)(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): + unplugin-icons@0.14.9(@vue/compiler-sfc@3.3.10)(esbuild@0.20.0)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(vue-template-compiler@2.7.14)(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): dependencies: '@antfu/install-pkg': 0.1.1 '@antfu/utils': 0.5.2 @@ -25868,7 +25861,7 @@ snapshots: debug: 4.3.4(supports-color@9.2.2) kolorist: 1.8.0 local-pkg: 0.4.3 - unplugin: 0.9.5(esbuild@0.20.0)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) + unplugin: 0.9.5(esbuild@0.20.0)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) optionalDependencies: '@vue/compiler-sfc': 3.3.10 vue-template-compiler: 2.7.14 @@ -25894,7 +25887,7 @@ snapshots: transitivePeerDependencies: - supports-color - unplugin-vue-components@0.21.0(@babel/parser@7.23.9)(esbuild@0.20.0)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): + unplugin-vue-components@0.21.0(@babel/parser@7.23.9)(esbuild@0.20.0)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): dependencies: '@antfu/utils': 0.5.2 '@rollup/pluginutils': 4.2.1 @@ -25905,7 +25898,7 @@ snapshots: magic-string: 0.26.7 minimatch: 5.1.6 resolve: 1.22.8 - unplugin: 0.7.1(esbuild@0.20.0)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) + unplugin: 0.7.1(esbuild@0.20.0)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) vue: 3.3.9(typescript@4.9.3) optionalDependencies: '@babel/parser': 7.23.9 @@ -25916,7 +25909,7 @@ snapshots: - vite - webpack - unplugin-vue-components@0.21.0(@babel/parser@7.23.9)(esbuild@0.20.0)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): + unplugin-vue-components@0.21.0(@babel/parser@7.23.9)(esbuild@0.20.0)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): dependencies: '@antfu/utils': 0.5.2 '@rollup/pluginutils': 4.2.1 @@ -25927,7 +25920,7 @@ snapshots: magic-string: 0.26.7 minimatch: 5.1.6 resolve: 1.22.8 - unplugin: 0.7.1(esbuild@0.20.0)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) + unplugin: 0.7.1(esbuild@0.20.0)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)) vue: 3.3.9(typescript@4.9.5) optionalDependencies: '@babel/parser': 7.23.9 @@ -25938,10 +25931,10 @@ snapshots: - vite - webpack - unplugin-vue-components@0.25.2(@babel/parser@7.23.9)(rollup@2.79.1)(vue@3.3.9(typescript@5.3.2)): + unplugin-vue-components@0.25.2(@babel/parser@7.23.9)(rollup@3.29.4)(vue@3.3.9(typescript@5.3.2)): dependencies: '@antfu/utils': 0.7.6 - '@rollup/pluginutils': 5.1.0(rollup@2.79.1) + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) chokidar: 3.5.3 debug: 4.3.4(supports-color@9.2.2) fast-glob: 3.3.2 @@ -25976,7 +25969,7 @@ snapshots: - rollup - supports-color - unplugin@0.7.1(esbuild@0.20.0)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): + unplugin@0.7.1(esbuild@0.20.0)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): dependencies: acorn: 8.11.3 chokidar: 3.5.3 @@ -25984,11 +25977,11 @@ snapshots: webpack-virtual-modules: 0.4.4 optionalDependencies: esbuild: 0.20.0 - rollup: 2.79.1 + rollup: 3.29.4 vite: 3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0) webpack: 5.90.0(@swc/core@1.4.2)(esbuild@0.20.0) - unplugin@0.7.1(esbuild@0.20.0)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): + unplugin@0.7.1(esbuild@0.20.0)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): dependencies: acorn: 8.11.3 chokidar: 3.5.3 @@ -25996,11 +25989,11 @@ snapshots: webpack-virtual-modules: 0.4.4 optionalDependencies: esbuild: 0.20.0 - rollup: 2.79.1 + rollup: 3.29.4 vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0) webpack: 5.90.0(@swc/core@1.4.2)(esbuild@0.20.0) - unplugin@0.9.5(esbuild@0.20.0)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): + unplugin@0.9.5(esbuild@0.20.0)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): dependencies: acorn: 8.11.3 chokidar: 3.5.3 @@ -26008,11 +26001,11 @@ snapshots: webpack-virtual-modules: 0.4.4 optionalDependencies: esbuild: 0.20.0 - rollup: 2.79.1 + rollup: 3.29.4 vite: 3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.27.0) webpack: 5.90.0(@swc/core@1.4.2)(esbuild@0.20.0) - unplugin@0.9.5(esbuild@0.20.0)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): + unplugin@0.9.5(esbuild@0.20.0)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(webpack@5.90.0(@swc/core@1.4.2)(esbuild@0.20.0)): dependencies: acorn: 8.11.3 chokidar: 3.5.3 @@ -26020,7 +26013,7 @@ snapshots: webpack-virtual-modules: 0.4.4 optionalDependencies: esbuild: 0.20.0 - rollup: 2.79.1 + rollup: 3.29.4 vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0) webpack: 5.90.0(@swc/core@1.4.2)(esbuild@0.20.0) @@ -26154,7 +26147,7 @@ snapshots: - supports-color - terser - vite-plugin-checker@0.6.2(eslint@8.57.0)(optionator@0.9.3)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(vue-tsc@1.8.24(typescript@5.3.2)): + vite-plugin-checker@0.6.2(eslint@8.57.0)(meow@8.1.2)(optionator@0.9.3)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0))(vue-tsc@1.8.24(typescript@5.3.2)): dependencies: '@babel/code-frame': 7.23.5 ansi-escapes: 4.3.2 @@ -26176,6 +26169,7 @@ snapshots: vscode-uri: 3.0.7 optionalDependencies: eslint: 8.57.0 + meow: 8.1.2 optionator: 0.9.3 typescript: 5.3.2 vue-tsc: 1.8.24(typescript@5.3.2) @@ -26221,10 +26215,10 @@ snapshots: dependencies: vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0) - vite-plugin-inspect@0.7.38(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0)): + vite-plugin-inspect@0.7.38(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0)): dependencies: '@antfu/utils': 0.7.6 - '@rollup/pluginutils': 5.1.0(rollup@2.79.1) + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) debug: 4.3.4(supports-color@9.2.2) error-stack-parser-es: 0.1.1 fs-extra: 11.1.1 @@ -26236,10 +26230,10 @@ snapshots: - rollup - supports-color - vite-plugin-inspect@0.7.42(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0)): + vite-plugin-inspect@0.7.42(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.27.0)): dependencies: '@antfu/utils': 0.7.6 - '@rollup/pluginutils': 5.1.0(rollup@2.79.1) + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) debug: 4.3.4(supports-color@9.2.2) error-stack-parser-es: 0.1.1 fs-extra: 11.1.1