Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add multiple modules at once #233

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
132 changes: 76 additions & 56 deletions src/commands/module/add.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,15 @@ import {
import { satisfies } from 'semver'
import { colors } from 'consola/utils'

type ResolvedModule = {
nuxtModule?: NuxtModule
pkg: string
pkgName: string
pkgVersion: string
}
type UnresolvedModule = false
type ModuleResolution = ResolvedModule | UnresolvedModule

export default defineCommand({
meta: {
name: 'module',
Expand All @@ -36,61 +45,80 @@ export default defineCommand({
},
async setup(ctx) {
const cwd = resolve(ctx.args.cwd || '.')
const modules = ctx.args._

const r = await resolveModule(ctx.args.moduleName, cwd)
if (r === false) {
return
}

// Add npm dependency
if (!ctx.args.skipInstall) {
consola.info(`Installing dev dependency \`${r.pkg}\``)
const res = await addDependency(r.pkg, { cwd, dev: true }).catch(
(error) => {
consola.error(error)
return consola.prompt(
`Install failed for ${colors.cyan(
r.pkg,
)}. Do you want to continue adding the module to ${colors.cyan(
'nuxt.config',
)}?`,
{
type: 'confirm',
initial: false,
},
)
},
)
if (res === false) {
for (const moduleName of modules) {
const moduleResolution = await resolveModule(moduleName, cwd)
if (moduleResolution === false) {
return
}
}

// Update nuxt.config.ts
if (!ctx.args.skipConfig) {
await updateNuxtConfig(cwd, (config) => {
if (!config.modules) {
config.modules = []
}
for (let i = 0; i < config.modules.length; i++) {
if (config.modules[i] === r.pkgName) {
consola.info(`\`${r.pkgName}\` is already in the \`modules\``)
return
}
}
consola.info(`Adding \`${r.pkgName}\` to the \`modules\``)
config.modules.push(r.pkgName)
}).catch((err) => {
consola.error(err)
consola.error(
`Please manually add \`${r.pkgName}\` to the \`modules\` in \`nuxt.config.ts\``,
)
})
consola.info(`${moduleName} has been resolved. Adding module...`)
await addModule(
moduleResolution,
ctx.args.skipInstall,
ctx.args.skipConfig,
cwd,
)
}
},
})

// -- Internal Utils --
async function addModule(
resolvedModule: ResolvedModule,
skipInstall: boolean,
skipConfig: boolean,
cwd: string,
) {
// Add npm dependency
if (!skipInstall) {
consola.info(`Installing dev dependency \`${resolvedModule.pkg}\``)
const res = await addDependency(resolvedModule.pkg, {
cwd,
dev: true,
}).catch((error) => {
consola.error(error)
return consola.prompt(
`Install failed for ${colors.cyan(
resolvedModule.pkg,
)}. Do you want to continue adding the module to ${colors.cyan(
'nuxt.config',
)}?`,
{
type: 'confirm',
initial: false,
},
)
})
if (res === false) {
return
}
}

// Update nuxt.config.ts
if (!skipConfig) {
await updateNuxtConfig(cwd, (config) => {
if (!config.modules) {
config.modules = []
}
for (let i = 0; i < config.modules.length; i++) {
if (config.modules[i] === resolvedModule.pkgName) {
consola.info(
`\`${resolvedModule.pkgName}\` is already in the \`modules\``,
)
return
}
}
consola.info(`Adding \`${resolvedModule.pkgName}\` to the \`modules\``)
config.modules.push(resolvedModule.pkgName)
}).catch((err) => {
consola.error(err)
consola.error(
`Please manually add \`${resolvedModule.pkgName}\` to the \`modules\` in \`nuxt.config.ts\``,
)
})
}
}

async function updateNuxtConfig(
rootDir: string,
Expand Down Expand Up @@ -133,15 +161,7 @@ const packageRegex =
async function resolveModule(
moduleName: string,
cwd: string,
): Promise<
| false
| {
nuxtModule?: NuxtModule
pkg: string
pkgName: string
pkgVersion: string
}
> {
): Promise<ModuleResolution> {
let pkgName = moduleName
let pkgVersion: string | undefined

Expand Down