mirror of
https://github.com/nuxt/nuxt.git
synced 2025-01-31 07:40:33 +00:00
feat(nuxi): invoke prepare
step for nuxi dev/build (#689)
This commit is contained in:
parent
5275624f2e
commit
06c1222e1f
@ -2,6 +2,7 @@ import { resolve } from 'pathe'
|
|||||||
import consola from 'consola'
|
import consola from 'consola'
|
||||||
import { importModule } from '../utils/cjs'
|
import { importModule } from '../utils/cjs'
|
||||||
|
|
||||||
|
import { writeTypes } from '../utils/prepare'
|
||||||
import { defineNuxtCommand } from './index'
|
import { defineNuxtCommand } from './index'
|
||||||
|
|
||||||
export default defineNuxtCommand({
|
export default defineNuxtCommand({
|
||||||
@ -18,6 +19,8 @@ export default defineNuxtCommand({
|
|||||||
|
|
||||||
const nuxt = await loadNuxt({ rootDir })
|
const nuxt = await loadNuxt({ rootDir })
|
||||||
|
|
||||||
|
await writeTypes(nuxt)
|
||||||
|
|
||||||
nuxt.hook('error', (err) => {
|
nuxt.hook('error', (err) => {
|
||||||
consola.error('Nuxt Build Error:', err)
|
consola.error('Nuxt Build Error:', err)
|
||||||
process.exit(1)
|
process.exit(1)
|
||||||
|
@ -6,6 +6,7 @@ import consola from 'consola'
|
|||||||
import { createServer, createLoadingHandler } from '../utils/server'
|
import { createServer, createLoadingHandler } from '../utils/server'
|
||||||
import { showBanner } from '../utils/banner'
|
import { showBanner } from '../utils/banner'
|
||||||
import { importModule } from '../utils/cjs'
|
import { importModule } from '../utils/cjs'
|
||||||
|
import { writeTypes } from '../utils/prepare'
|
||||||
import { defineNuxtCommand } from './index'
|
import { defineNuxtCommand } from './index'
|
||||||
|
|
||||||
export default defineNuxtCommand({
|
export default defineNuxtCommand({
|
||||||
@ -26,6 +27,8 @@ export default defineNuxtCommand({
|
|||||||
|
|
||||||
const { loadNuxt, buildNuxt } = await importModule('@nuxt/kit', rootDir) as typeof import('@nuxt/kit')
|
const { loadNuxt, buildNuxt } = await importModule('@nuxt/kit', rootDir) as typeof import('@nuxt/kit')
|
||||||
|
|
||||||
|
const prepare = debounce(nuxt => writeTypes(nuxt), 1000)
|
||||||
|
|
||||||
let currentNuxt: Nuxt
|
let currentNuxt: Nuxt
|
||||||
const load = async (isRestart: boolean, reason?: string) => {
|
const load = async (isRestart: boolean, reason?: string) => {
|
||||||
try {
|
try {
|
||||||
@ -38,6 +41,7 @@ export default defineNuxtCommand({
|
|||||||
await currentNuxt.close()
|
await currentNuxt.close()
|
||||||
}
|
}
|
||||||
const newNuxt = await loadNuxt({ rootDir, dev: true, ready: false })
|
const newNuxt = await loadNuxt({ rootDir, dev: true, ready: false })
|
||||||
|
prepare(newNuxt)
|
||||||
currentNuxt = newNuxt
|
currentNuxt = newNuxt
|
||||||
await currentNuxt.ready()
|
await currentNuxt.ready()
|
||||||
await buildNuxt(currentNuxt)
|
await buildNuxt(currentNuxt)
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
import { promises as fsp } from 'fs'
|
import { resolve } from 'pathe'
|
||||||
import { relative, resolve } from 'pathe'
|
import { importModule } from '../utils/cjs'
|
||||||
import { cyan } from 'colorette'
|
import { writeTypes } from '../utils/prepare'
|
||||||
import { TSReference } from '@nuxt/kit'
|
|
||||||
import consola from 'consola'
|
|
||||||
import { importModule, getModulePaths, getNearestPackage } from '../utils/cjs'
|
|
||||||
import { defineNuxtCommand } from './index'
|
import { defineNuxtCommand } from './index'
|
||||||
|
|
||||||
export default defineNuxtCommand({
|
export default defineNuxtCommand({
|
||||||
@ -19,48 +16,6 @@ export default defineNuxtCommand({
|
|||||||
const { loadNuxt } = await importModule('@nuxt/kit', rootDir) as typeof import('@nuxt/kit')
|
const { loadNuxt } = await importModule('@nuxt/kit', rootDir) as typeof import('@nuxt/kit')
|
||||||
const nuxt = await loadNuxt({ rootDir })
|
const nuxt = await loadNuxt({ rootDir })
|
||||||
|
|
||||||
const modulePaths = getModulePaths(nuxt.options.modulesDir)
|
await writeTypes(nuxt)
|
||||||
|
|
||||||
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}"` : ''
|
|
||||||
}
|
|
||||||
|
53
packages/nuxi/src/utils/prepare.ts
Normal file
53
packages/nuxi/src/utils/prepare.ts
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
import { promises as fsp } from 'fs'
|
||||||
|
import { relative, resolve } from 'pathe'
|
||||||
|
import { cyan } from 'colorette'
|
||||||
|
import { Nuxt, TSReference } from '@nuxt/kit'
|
||||||
|
import consola from 'consola'
|
||||||
|
import { getModulePaths, getNearestPackage } from './cjs'
|
||||||
|
|
||||||
|
export const writeTypes = async (nuxt: Nuxt) => {
|
||||||
|
const modulePaths = getModulePaths(nuxt.options.modulesDir)
|
||||||
|
const rootDir = nuxt.options.rootDir
|
||||||
|
|
||||||
|
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: Record<string, string>) {
|
||||||
|
return Object.entries(obj).map(e => renderAttr(e[0], e[1])).join(' ')
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderAttr (key: string, value: string) {
|
||||||
|
return value ? `${key}="${value}"` : ''
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user