mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-16 19:04:48 +00:00
67 lines
2.0 KiB
TypeScript
67 lines
2.0 KiB
TypeScript
import { promises as fsp } from 'fs'
|
|
import { relative, resolve } from 'pathe'
|
|
import { cyan } from 'colorette'
|
|
import { TSReference } from '@nuxt/kit'
|
|
import consola from 'consola'
|
|
import { importModule, getModulePaths, getNearestPackage } from '../utils/cjs'
|
|
import { defineNuxtCommand } from './index'
|
|
|
|
export default defineNuxtCommand({
|
|
meta: {
|
|
name: 'prepare',
|
|
usage: 'npx nuxi prepare',
|
|
description: 'Prepare nuxt for development/build'
|
|
},
|
|
async invoke (args) {
|
|
process.env.NODE_ENV = process.env.NODE_ENV || 'production'
|
|
const rootDir = resolve(args._[0] || '.')
|
|
|
|
const { loadNuxt } = await importModule('@nuxt/kit', rootDir) as typeof import('@nuxt/kit')
|
|
const nuxt = await loadNuxt({ rootDir })
|
|
|
|
const modulePaths = getModulePaths(nuxt.options.modulesDir)
|
|
|
|
const references: TSReference[] = [
|
|
...nuxt.options.buildModules,
|
|
...nuxt.options.modules,
|
|
...nuxt.options._modules
|
|
]
|
|
.filter(f => typeof f === 'string')
|
|
.map(id => ({ types: getNearestPackage(id, modulePaths)?.name || id }))
|
|
|
|
const declarations: string[] = []
|
|
|
|
await nuxt.callHook('builder:generateApp')
|
|
await nuxt.callHook('prepare:types', { references, declarations })
|
|
|
|
const declarationPath = resolve(`${rootDir}/nuxt.d.ts`)
|
|
|
|
const declaration = [
|
|
'// This file is auto generated by `nuxt prepare`',
|
|
'// Please do not manually modify this file.',
|
|
'',
|
|
...references.map((ref) => {
|
|
if ('path' in ref) {
|
|
ref.path = relative(rootDir, ref.path)
|
|
}
|
|
return `/// <reference ${renderAttrs(ref)} />`
|
|
}),
|
|
...declarations,
|
|
'export {}',
|
|
''
|
|
].join('\n')
|
|
|
|
await fsp.writeFile(declarationPath, declaration)
|
|
|
|
consola.success('Generated', cyan(relative(process.cwd(), declarationPath)))
|
|
}
|
|
})
|
|
|
|
function renderAttrs (obj) {
|
|
return Object.entries(obj).map(e => renderAttr(e[0], e[1])).join(' ')
|
|
}
|
|
|
|
function renderAttr (key, value) {
|
|
return value ? `${key}="${value}"` : ''
|
|
}
|