@quasar/app-webpack
Version:
Quasar Framework App CLI with Webpack
114 lines (92 loc) • 3.57 kB
JavaScript
const { merge } = require('webpack-merge')
const { stringifyJSON } = require('confbox')
const { AppBuilder } = require('../../app-builder.js')
const { quasarSsrConfig } = require('./ssr-config.js')
const { cliPkg } = require('../../utils/cli-runtime.js')
const { getFixedDeps } = require('../../utils/get-fixed-deps.js')
const { getSsrHtmlTemplateFn } = require('../../utils/html-template.js')
const indexFile = `
const { startServer } = await import('./start.js')
const { app, listenResult, handler } = await startServer()
export { app, listenResult, handler }
`
module.exports.QuasarModeBuilder = class QuasarModeBuilder extends AppBuilder {
async build () {
await this.#buildWebserver()
await this.#copyWebserverFiles()
await this.#writePackageJson()
// also update pwa-builder.js when changing here
if (
this.quasarConf.ssr.pwa === true
&& this.quasarConf.pwa.workboxMode === 'InjectManifest'
) {
const esbuildConfig = await quasarSsrConfig.customSw(this.quasarConf)
await this.buildWithEsbuild('InjectManifest Custom SW', esbuildConfig)
}
const webpackClientConf = await quasarSsrConfig.webpackClient(this.quasarConf)
await this.buildWithWebpack('SSR Client-side', webpackClientConf)
await this.#writeRenderTemplate(this.quasarConf, webpackClientConf.output.path)
const webpackServerConf = await quasarSsrConfig.webpackServer(this.quasarConf)
await this.buildWithWebpack('SSR Server-side', webpackServerConf)
this.printSummary(this.quasarConf.build.distDir, true)
}
async #buildWebserver () {
const esbuildConfig = await quasarSsrConfig.webserver(this.quasarConf)
await this.buildWithEsbuild('SSR Webserver', esbuildConfig)
}
async #copyWebserverFiles () {
const patterns = [
'.npmrc',
'.yarnrc'
].map(filename => ({
from: filename,
to: '.'
}))
this.copyFiles(patterns)
this.writeFile('index.mjs', indexFile)
}
async #writePackageJson () {
const { appPkg } = this.ctx.pkg
const localAppPkg = merge({}, appPkg)
const appDeps = getFixedDeps(localAppPkg.dependencies || {}, this.ctx.appPaths.appDir)
const pkg = {
name: localAppPkg.name,
version: localAppPkg.version,
description: localAppPkg.description,
author: localAppPkg.author,
private: true,
type: 'commonjs',
main: 'index.mjs',
module: 'index.mjs',
scripts: {
start: 'node index.mjs'
},
dependencies: Object.assign(appDeps, {
'@quasar/ssr-helpers': cliPkg.dependencies[ '@quasar/ssr-helpers' ],
compression: cliPkg.dependencies.compression,
express: cliPkg.dependencies.express
}),
engines: localAppPkg.engines,
browserslist: localAppPkg.browserslist,
quasar: { ssr: true }
}
if (this.quasarConf.ssr.manualStoreSerialization !== true) {
pkg.dependencies[ 'serialize-javascript' ] = cliPkg.dependencies[ 'serialize-javascript' ]
}
if (typeof this.quasarConf.ssr.extendPackageJson === 'function') {
this.quasarConf.ssr.extendPackageJson(pkg)
}
this.writeFile('package.json', stringifyJSON(pkg, { indent: 2 }))
}
async #writeRenderTemplate () {
const htmlFile = this.ctx.appPaths.resolve.app(
this.quasarConf.sourceFiles.indexHtmlTemplate
)
const html = this.readFile(htmlFile)
const templateFn = await getSsrHtmlTemplateFn(html, this.quasarConf)
this.writeFile(
'render-template.js',
`module.exports=${ templateFn.source }`
)
}
}