From e6e741a179f3b463e2b8a6777b1f339f311e9578 Mon Sep 17 00:00:00 2001 From: arashsheyda Date: Thu, 11 May 2023 01:49:09 +0300 Subject: [PATCH 1/5] fix: uninstall modules --- packages/devtools-kit/src/_types/rpc.ts | 1 + .../client/components/ModuleInstallList.vue | 31 +++++++---- packages/devtools/client/composables/state.ts | 38 ++++++++++++- .../devtools/client/pages/modules/modules.vue | 28 +--------- packages/devtools/src/server-rpc/npm.ts | 53 ++++++++++++++++++- 5 files changed, 112 insertions(+), 39 deletions(-) diff --git a/packages/devtools-kit/src/_types/rpc.ts b/packages/devtools-kit/src/_types/rpc.ts index 3c9a31103..9b12da3aa 100644 --- a/packages/devtools-kit/src/_types/rpc.ts +++ b/packages/devtools-kit/src/_types/rpc.ts @@ -50,6 +50,7 @@ export interface ServerFunctions { openInEditor(filepath: string): Promise restartNuxt(hard?: boolean): Promise installNuxtModule(name: string, dry?: boolean): Promise + unInstallNuxtModule(name: string, dry?: boolean): Promise } export interface ClientFunctions { diff --git a/packages/devtools/client/components/ModuleInstallList.vue b/packages/devtools/client/components/ModuleInstallList.vue index 58e13df1e..eeb282ae9 100644 --- a/packages/devtools/client/components/ModuleInstallList.vue +++ b/packages/devtools/client/components/ModuleInstallList.vue @@ -4,9 +4,16 @@ import { RecycleScroller } from 'vue-virtual-scroller' import type { InstallModuleReturn, ModuleStaticInfo } from '@nuxt/devtools-kit/types' import Fuse from 'fuse.js' -const Dialog = createTemplatePromise() +const Dialog = createTemplatePromise() const collection = await useModulesInfo() -const nuxt3only = collection.filter(i => i.compatibility.nuxt.includes('^3')) +const { packageModules } = useModules() +const nuxt3only = collection.map((module) => { + const installed = packageModules.value.find(m => m.entryPath.includes(module.name)) + return { + ...module, + installed, + } +}) const config = useServerConfig() const router = useRouter() @@ -26,17 +33,18 @@ const items = computed(() => { return fuse.value.search(search.value).map(r => r.item) }) -async function install(item: ModuleStaticInfo) { - const result = await rpc.installNuxtModule(item.npm, true) +async function action(item: ModuleStaticInfo, type: 'install' | 'uninstall') { + const method = type === 'install' ? rpc.installNuxtModule : rpc.unInstallNuxtModule + const result = await method(item.npm, true) if (!result.commands) return - if (!await Dialog.start(item, result)) + if (!await Dialog.start(item, result, type)) return router.push(`/modules/terminals?id=${encodeURIComponent(result.processId)}`) - await rpc.installNuxtModule(item.npm, false) + await method(item.npm, false) } const openInEditor = useOpenInEditor() @@ -71,8 +79,11 @@ const openInEditor = useOpenInEditor() role="button" :info="item" mb2 h-full class="hover:bg-active!" + :class="{ + 'text-green border-green': item.installed, + }" :compact="true" - @click="install(item)" + @click="action(item, item.installed ? 'uninstall' : 'install')" /> @@ -83,7 +94,7 @@ const openInEditor = useOpenInEditor()

- Installing {{ args[0].name }} module? + {{ args[2] }} {{ args[0].name }} module?

@@ -114,8 +125,8 @@ const openInEditor = useOpenInEditor() Cancel - - Install + + {{ args[2] }}

diff --git a/packages/devtools/client/composables/state.ts b/packages/devtools/client/composables/state.ts index 1c1ac9ce9..67a43eae4 100644 --- a/packages/devtools/client/composables/state.ts +++ b/packages/devtools/client/composables/state.ts @@ -5,14 +5,50 @@ import { objectPick } from '@antfu/utils' import type { HookInfo, ModuleBuiltinTab, ModuleCustomTab, ModuleStaticInfo, RouteInfo, TabCategory } from '../../src/types' let modules: Promise | undefined +const ignores = [ + 'pages', + 'meta', + 'components', + 'imports', + 'nuxt-config-schema', + '@nuxt/devtools', + '@nuxt/telemetry', +] export async function useModulesInfo() { if (modules) return modules - modules = $fetch('https://cdn.jsdelivr.net/npm/@nuxt/modules@latest/modules.json') + modules = $fetch('https://cdn.jsdelivr.net/npm/@nuxt/modules@latest/modules.json').then((res) => { + return res.filter((m: any) => !ignores.includes(m.npm)) + }) return modules } +export function useModules() { + const config = useServerConfig() + const modules = computed(() => config.value?._installedModules || []) + const packageModules = ref([]) + const userModules = ref([]) + + watchEffect(() => { + packageModules.value.length = 0 + userModules.value.length = 0 + for (const m of modules.value) { + if (ignores.includes(m.meta?.name)) + continue + if (m.entryPath && isNodeModulePath(m.entryPath)) + packageModules.value.push(m) + else + userModules.value.push(m) + } + }) + + return { + packageModules, + userModules, + } +} + export function useComponents() { const client = useClient() const serverComponents = useAsyncState('getComponents', () => rpc.getComponents()) diff --git a/packages/devtools/client/pages/modules/modules.vue b/packages/devtools/client/pages/modules/modules.vue index c0be111c0..2bf1ab166 100644 --- a/packages/devtools/client/pages/modules/modules.vue +++ b/packages/devtools/client/pages/modules/modules.vue @@ -5,35 +5,9 @@ definePageMeta({ order: 4, }) -const ignores = [ - 'pages', - 'meta', - 'components', - 'imports', - 'nuxt-config-schema', - '@nuxt/devtools', - '@nuxt/telemetry', -] - -const config = useServerConfig() -const modules = computed(() => config.value?._installedModules || []) -const packageModules = ref([]) -const userModules = ref([]) const installModuleOpen = ref(false) const { showExperimentalFeatures } = useDevToolsSettings() - -watchEffect(() => { - packageModules.value.length = 0 - userModules.value.length = 0 - for (const m of modules.value) { - if (ignores.includes(m.meta?.name)) - continue - if (m.entryPath && isNodeModulePath(m.entryPath)) - packageModules.value.push(m) - else - userModules.value.push(m) - } -}) +const { packageModules, userModules } = useModules() +
diff --git a/packages/devtools/client/components/ModuleItemBase.vue b/packages/devtools/client/components/ModuleItemBase.vue index d11962406..2e11b135b 100644 --- a/packages/devtools/client/components/ModuleItemBase.vue +++ b/packages/devtools/client/components/ModuleItemBase.vue @@ -39,7 +39,7 @@ const openInEditor = useOpenInEditor()
-
+
+
diff --git a/packages/devtools/client/composables/state.ts b/packages/devtools/client/composables/state.ts index 67a43eae4..ec4dd970d 100644 --- a/packages/devtools/client/composables/state.ts +++ b/packages/devtools/client/composables/state.ts @@ -2,7 +2,7 @@ import type { Component } from 'nuxt/schema' import { $fetch } from 'ofetch' import type { Ref } from 'vue' import { objectPick } from '@antfu/utils' -import type { HookInfo, ModuleBuiltinTab, ModuleCustomTab, ModuleStaticInfo, RouteInfo, TabCategory } from '../../src/types' +import type { HookInfo, InstallModuleReturn, ModuleBuiltinTab, ModuleCustomTab, ModuleStaticInfo, RouteInfo, TabCategory } from '../../src/types' let modules: Promise | undefined const ignores = [ @@ -49,6 +49,25 @@ export function useModules() { } } +type ModuleActionType = 'install' | 'uninstall' + +export const ModuleDialog = createTemplatePromise() + +export async function useModuleAction(item: ModuleStaticInfo, type: ModuleActionType) { + const router = useRouter() + const method = type === 'install' ? rpc.installNuxtModule : rpc.uninstallNuxtModule + const result = await method(item.npm, true) + + if (!result.commands) + return + + if (!await ModuleDialog.start(item, result, type)) + return + + router.push(`/modules/terminals?id=${encodeURIComponent(result.processId)}`) + await method(item.npm, false) +} + export function useComponents() { const client = useClient() const serverComponents = useAsyncState('getComponents', () => rpc.getComponents()) diff --git a/packages/devtools/client/pages/modules/modules.vue b/packages/devtools/client/pages/modules/modules.vue index 2bf1ab166..bd994d425 100644 --- a/packages/devtools/client/pages/modules/modules.vue +++ b/packages/devtools/client/pages/modules/modules.vue @@ -80,6 +80,7 @@ const { packageModules, userModules } = useModules()
+
diff --git a/packages/devtools/src/server-rpc/npm.ts b/packages/devtools/src/server-rpc/npm.ts index 5247e9a9d..d68d7ce1c 100644 --- a/packages/devtools/src/server-rpc/npm.ts +++ b/packages/devtools/src/server-rpc/npm.ts @@ -102,7 +102,7 @@ export function setupNpmRPC({ nuxt }: NuxtDevtoolsServerContext) { processId, } }, - async unInstallNuxtModule(name: string, dry = true) { + async uninstallNuxtModule(name: string, dry = true) { const commands = (await getNpmCommand('uninstall', name))! const filepath = nuxt.options._nuxtConfigFile From 241b5d4b2ec77e677f3713ef301b9807f3e0b800 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Thu, 11 May 2023 20:38:41 +0200 Subject: [PATCH 3/5] chore: update --- .../devtools-kit/src/_types/integrations.ts | 10 +++ .../src/components/NDropdown.vue | 2 +- .../client/components/ModuleActionDialog.vue | 5 +- .../client/components/ModuleInstallList.vue | 17 ++--- .../devtools/client/components/ModuleItem.vue | 30 +-------- .../client/components/ModuleItemBase.vue | 5 +- .../client/components/ModuleItemInstall.vue | 36 ++++++++++ packages/devtools/client/composables/state.ts | 67 ++++++++++--------- .../devtools/client/pages/modules/modules.vue | 5 +- 9 files changed, 99 insertions(+), 78 deletions(-) create mode 100644 packages/devtools/client/components/ModuleItemInstall.vue diff --git a/packages/devtools-kit/src/_types/integrations.ts b/packages/devtools-kit/src/_types/integrations.ts index 5d131a673..9e0609cb3 100644 --- a/packages/devtools-kit/src/_types/integrations.ts +++ b/packages/devtools-kit/src/_types/integrations.ts @@ -81,6 +81,16 @@ export interface BasicModuleInfo { } } +export interface InstalledModuleInfo { + name?: string + isPackageModule: boolean + info?: ModuleStaticInfo + entryPath?: string + meta?: { + name?: string + } +} + export interface ModuleStaticInfo { name: string description: string diff --git a/packages/devtools-ui-kit/src/components/NDropdown.vue b/packages/devtools-ui-kit/src/components/NDropdown.vue index 80c17c012..4f5eed00f 100644 --- a/packages/devtools-ui-kit/src/components/NDropdown.vue +++ b/packages/devtools-ui-kit/src/components/NDropdown.vue @@ -15,7 +15,7 @@ onClickOutside(el, () => { - diff --git a/packages/devtools/client/components/ModuleItemBase.vue b/packages/devtools/client/components/ModuleItemBase.vue index 2e11b135b..113540013 100644 --- a/packages/devtools/client/components/ModuleItemBase.vue +++ b/packages/devtools/client/components/ModuleItemBase.vue @@ -38,9 +38,7 @@ const openInEditor = useOpenInEditor()