128 lines
3.3 KiB
JavaScript
128 lines
3.3 KiB
JavaScript
const { appPackageFolder } = require("../createAppPackage")
|
|
const {
|
|
constants,
|
|
copyFile,
|
|
writeFile,
|
|
readFile,
|
|
writeJSON,
|
|
} = require("fs-extra")
|
|
const { join, resolve, dirname } = require("path")
|
|
const sqrl = require("squirrelly")
|
|
const { convertCssToFiles } = require("./convertCssToFiles")
|
|
const publicPath = require("./publicPath")
|
|
const deleteCodeMeta = require("./deleteCodeMeta")
|
|
|
|
module.exports = async (config, appname, pageName, pkg) => {
|
|
const appPath = appPackageFolder(config, appname)
|
|
|
|
pkg.screens = pkg.screens || []
|
|
|
|
await convertCssToFiles(publicPath(appPath, pageName), pkg)
|
|
|
|
await buildIndexHtml(config, appname, pageName, appPath, pkg)
|
|
|
|
await buildFrontendAppDefinition(config, appname, pageName, pkg, appPath)
|
|
|
|
await copyClientLib(appPath, pageName)
|
|
|
|
await savePageJson(appPath, pageName, pkg)
|
|
}
|
|
|
|
const rootPath = (config, appname) =>
|
|
config.useAppRootPath ? `/${appname}` : ""
|
|
|
|
const copyClientLib = async (appPath, pageName) => {
|
|
const sourcepath = require.resolve("@budibase/client")
|
|
const destPath = join(publicPath(appPath, pageName), "budibase-client.js")
|
|
|
|
await copyFile(sourcepath, destPath, constants.COPYFILE_FICLONE)
|
|
|
|
await copyFile(
|
|
sourcepath + ".map",
|
|
destPath + ".map",
|
|
constants.COPYFILE_FICLONE
|
|
)
|
|
}
|
|
|
|
const buildIndexHtml = async (config, appname, pageName, appPath, pkg) => {
|
|
const appPublicPath = publicPath(appPath, pageName)
|
|
const appRootPath = appname
|
|
|
|
const stylesheetUrl = s =>
|
|
s.startsWith("http") ? s : `/${rootPath(config, appname)}/${s}`
|
|
|
|
const templateObj = {
|
|
title: pkg.page.title || "Budibase App",
|
|
favicon: `${appRootPath}/${pkg.page.favicon || "/_shared/favicon.png"}`,
|
|
stylesheets: (pkg.page.stylesheets || []).map(stylesheetUrl),
|
|
screenStyles: pkg.screens.filter(s => s._css).map(s => s._css),
|
|
pageStyle: pkg.page._css,
|
|
appRootPath,
|
|
}
|
|
|
|
const indexHtmlTemplate = await readFile(
|
|
resolve(__dirname, "index.template.html"),
|
|
"utf8"
|
|
)
|
|
|
|
const indexHtmlPath = join(appPublicPath, "index.html")
|
|
|
|
const indexHtml = sqrl.Render(indexHtmlTemplate, templateObj)
|
|
|
|
await writeFile(indexHtmlPath, indexHtml, { flag: "w+" })
|
|
}
|
|
|
|
const buildFrontendAppDefinition = async (config, appname, pageName, pkg) => {
|
|
const appPath = appPackageFolder(config, appname)
|
|
const appPublicPath = publicPath(appPath, pageName)
|
|
const appRootPath = rootPath(config, appname)
|
|
|
|
const filename = join(appPublicPath, "clientFrontendDefinition.js")
|
|
|
|
if (pkg.page._css) {
|
|
delete pkg.page._css
|
|
}
|
|
|
|
for (let screen of pkg.screens) {
|
|
if (screen._css) {
|
|
delete pkg.page._css
|
|
}
|
|
}
|
|
|
|
const clientUiDefinition = JSON.stringify({
|
|
appRootPath: appRootPath,
|
|
page: pkg.page,
|
|
screens: pkg.screens,
|
|
})
|
|
|
|
await writeFile(
|
|
filename,
|
|
`
|
|
window['##BUDIBASE_FRONTEND_DEFINITION##'] = ${clientUiDefinition};
|
|
window['##BUDIBASE_FRONTEND_FUNCTIONS##'] = ${pkg.uiFunctions};
|
|
`
|
|
)
|
|
}
|
|
|
|
const savePageJson = async (appPath, pageName, pkg) => {
|
|
const pageFile = join(appPath, "pages", pageName, "page.json")
|
|
|
|
if (pkg.page._css) {
|
|
delete pkg.page._css
|
|
}
|
|
|
|
if (pkg.page.name) {
|
|
delete pkg.page.name
|
|
}
|
|
|
|
if (pkg.page._screens) {
|
|
delete pkg.page._screens
|
|
}
|
|
|
|
deleteCodeMeta(pkg.page.props)
|
|
|
|
await writeJSON(pageFile, pkg.page, {
|
|
spaces: 2,
|
|
})
|
|
}
|