Nuxt/packages/nuxt3/src/builder/builder.ts

94 lines
2.6 KiB
TypeScript
Raw Normal View History

import { join, relative } from 'path'
2020-08-17 18:02:10 +00:00
import fsExtra from 'fs-extra'
import { debounce } from 'lodash'
2020-08-04 10:06:44 +00:00
import { BundleBuilder } from 'src/webpack'
import { Nuxt } from '../core'
import {
templateData,
compileTemplates,
scanTemplates,
NuxtTemplate
} from './template'
2020-08-17 18:02:10 +00:00
import { createWatcher } from './watch'
import { resolveApp, NuxtApp } from './app'
import Ignore from './ignore'
2020-07-02 13:02:35 +00:00
export class Builder {
2020-07-30 23:40:16 +00:00
nuxt: Nuxt
2020-08-18 17:08:06 +00:00
ignore: Ignore
app: NuxtApp
2020-08-17 18:02:10 +00:00
templates: NuxtTemplate[]
2020-08-04 10:26:22 +00:00
constructor (nuxt) {
2020-07-02 13:02:35 +00:00
this.nuxt = nuxt
2020-08-18 17:08:06 +00:00
this.ignore = new Ignore({
rootDir: nuxt.options.srcDir,
ignoreArray: nuxt.options.ignore.concat(
relative(nuxt.options.rootDir, nuxt.options.buildDir)
)
})
2020-07-02 13:02:35 +00:00
}
build () {
return build(this)
2020-07-02 13:02:35 +00:00
}
}
2020-07-02 13:02:35 +00:00
// Extends VueRouter
2020-08-17 18:45:32 +00:00
async function build (builder: Builder) {
const { nuxt } = builder
2020-07-02 13:02:35 +00:00
2020-08-17 18:02:10 +00:00
await generate(builder)
if (nuxt.options.dev) {
watch(builder)
}
2020-07-02 13:02:35 +00:00
await bundle(builder)
2020-07-02 13:02:35 +00:00
}
2020-08-17 18:45:32 +00:00
function watch (builder: Builder) {
2020-08-18 17:08:06 +00:00
const { nuxt, ignore } = builder
2020-08-17 18:02:10 +00:00
// Watch internal templates
const options = nuxt.options.watchers.chokidar
2020-08-18 17:08:06 +00:00
const nuxtAppWatcher = createWatcher(nuxt.options.appDir, { ...options, cwd: nuxt.options.appDir }, ignore)
nuxtAppWatcher.watchAll(debounce(() => compileTemplates(builder.templates, nuxt.options.buildDir), 100))
2020-08-17 18:02:10 +00:00
// Watch user app
2020-08-18 17:08:06 +00:00
const appPattern = `${builder.app.srcDir}/**/*.{${nuxt.options.extensions.join(',')}}`
const appWatcher = createWatcher(appPattern, { ...options, cwd: builder.app.srcDir }, ignore)
// appWatcher.debug('srcDir')
2020-08-18 17:08:06 +00:00
const refreshTemplates = debounce(() => generate(builder), 100)
// Watch for App.vue creation
appWatcher.watch(/^(A|a)pp\.[a-z]{2,3}/, refreshTemplates, ['add', 'unlink'])
// Watch for page changes
2020-08-18 17:08:06 +00:00
appWatcher.watch(new RegExp(`^${nuxt.options.dir.pages}/`), refreshTemplates, ['add', 'unlink'])
2020-08-17 18:02:10 +00:00
}
2020-08-17 18:45:32 +00:00
export async function generate (builder: Builder) {
2020-08-17 18:02:10 +00:00
const { nuxt } = builder
await fsExtra.mkdirp(nuxt.options.buildDir)
2020-08-18 17:08:06 +00:00
builder.app = await resolveApp(builder, nuxt.options.srcDir)
2020-08-17 18:02:10 +00:00
const templatesDir = join(builder.nuxt.options.appDir, '_templates')
const appTemplates = await scanTemplates(templatesDir, templateData(builder))
2020-08-17 18:02:10 +00:00
builder.templates = [...appTemplates]
2020-08-17 18:02:10 +00:00
await compileTemplates(builder.templates, nuxt.options.buildDir)
}
async function bundle ({ nuxt }: Builder) {
// TODO: get rid of this context and directly pass nuxt to BundleBuilder
const bundleBuilder = new BundleBuilder({
nuxt,
options: nuxt.options,
buildOptions: nuxt.options.build,
target: nuxt.options.target,
plugins: []
})
await bundleBuilder.build()
}