2020-02-03 10:24:25 +01:00
|
|
|
const { appPackageFolder, appsFolder } = require("../createAppPackage")
|
|
|
|
const {
|
|
|
|
readJSON,
|
|
|
|
writeJSON,
|
|
|
|
readdir,
|
|
|
|
ensureDir,
|
|
|
|
rename,
|
|
|
|
unlink,
|
|
|
|
rmdir,
|
|
|
|
} = require("fs-extra")
|
|
|
|
const { join, dirname } = require("path")
|
|
|
|
const { $ } = require("@budibase/core").common
|
2020-02-10 22:35:51 +01:00
|
|
|
const { intersection, map, values, flatten } = require("lodash/fp")
|
2020-02-03 10:24:25 +01:00
|
|
|
const { merge } = require("lodash")
|
|
|
|
|
|
|
|
const { componentLibraryInfo } = require("./componentLibraryInfo")
|
2020-02-10 16:51:09 +01:00
|
|
|
const buildPage = require("./buildPage")
|
2020-02-10 22:35:51 +01:00
|
|
|
const getPages = require("./getPages")
|
|
|
|
const listScreens = require("./listScreens")
|
|
|
|
const saveBackend = require("./saveBackend")
|
2020-02-18 13:29:38 +01:00
|
|
|
const deleteCodeMeta = require("./deleteCodeMeta")
|
2020-02-03 10:24:25 +01:00
|
|
|
|
2020-02-10 22:35:51 +01:00
|
|
|
module.exports.buildPage = buildPage
|
|
|
|
module.exports.listScreens = listScreens
|
|
|
|
module.exports.saveBackend = saveBackend
|
2020-02-03 10:24:25 +01:00
|
|
|
|
|
|
|
const getAppDefinition = async appPath =>
|
|
|
|
await readJSON(`${appPath}/appDefinition.json`)
|
2019-09-29 07:40:06 +02:00
|
|
|
|
2019-07-13 11:35:57 +02:00
|
|
|
module.exports.getPackageForBuilder = async (config, appname) => {
|
2020-02-03 10:24:25 +01:00
|
|
|
const appPath = appPackageFolder(config, appname)
|
2019-07-26 16:13:15 +02:00
|
|
|
|
2020-02-03 10:24:25 +01:00
|
|
|
const pages = await getPages(appPath)
|
2019-07-26 16:13:15 +02:00
|
|
|
|
2020-02-03 10:24:25 +01:00
|
|
|
return {
|
|
|
|
appDefinition: await getAppDefinition(appPath),
|
2019-07-13 11:35:57 +02:00
|
|
|
|
2020-02-03 10:24:25 +01:00
|
|
|
accessLevels: await readJSON(`${appPath}/access_levels.json`),
|
2019-07-25 08:31:54 +02:00
|
|
|
|
2020-02-03 10:24:25 +01:00
|
|
|
pages,
|
2019-07-26 16:13:15 +02:00
|
|
|
|
2020-02-18 16:41:44 +01:00
|
|
|
components: await getComponentDefinitions(appPath, pages),
|
2020-02-03 10:24:25 +01:00
|
|
|
}
|
2019-07-13 11:35:57 +02:00
|
|
|
}
|
|
|
|
|
2019-10-11 18:14:23 +02:00
|
|
|
module.exports.getApps = async (config, master) => {
|
2020-02-03 10:24:25 +01:00
|
|
|
const dirs = await readdir(appsFolder(config))
|
2019-10-11 18:14:23 +02:00
|
|
|
|
2020-02-03 10:24:25 +01:00
|
|
|
return $(master.listApplications(), [map(a => a.name), intersection(dirs)])
|
2019-10-11 18:14:23 +02:00
|
|
|
}
|
2019-07-14 08:46:36 +02:00
|
|
|
|
2020-02-10 16:51:09 +01:00
|
|
|
const screenPath = (appPath, pageName, name) =>
|
|
|
|
join(appPath, "pages", pageName, "screens", name + ".json")
|
2019-07-26 18:08:59 +02:00
|
|
|
|
2020-02-10 16:51:09 +01:00
|
|
|
module.exports.saveScreen = async (config, appname, pagename, screen) => {
|
|
|
|
const appPath = appPackageFolder(config, appname)
|
|
|
|
const compPath = screenPath(appPath, pagename, screen.name)
|
2020-02-03 10:24:25 +01:00
|
|
|
await ensureDir(dirname(compPath))
|
2020-02-10 16:51:09 +01:00
|
|
|
if (screen._css) {
|
|
|
|
delete screen._css
|
|
|
|
}
|
2020-02-18 13:29:38 +01:00
|
|
|
|
|
|
|
deleteCodeMeta(screen.props)
|
|
|
|
|
2020-02-10 16:51:09 +01:00
|
|
|
await writeJSON(compPath, screen, {
|
2020-02-03 10:24:25 +01:00
|
|
|
encoding: "utf8",
|
|
|
|
flag: "w",
|
|
|
|
spaces: 2,
|
|
|
|
})
|
2020-02-18 13:29:38 +01:00
|
|
|
return screen
|
2019-07-26 18:08:59 +02:00
|
|
|
}
|
|
|
|
|
2020-02-10 16:51:09 +01:00
|
|
|
module.exports.renameScreen = async (
|
|
|
|
config,
|
|
|
|
appname,
|
|
|
|
pagename,
|
|
|
|
oldName,
|
|
|
|
newName
|
|
|
|
) => {
|
2020-02-03 10:24:25 +01:00
|
|
|
const appPath = appPackageFolder(config, appname)
|
2019-07-26 18:08:59 +02:00
|
|
|
|
2020-02-10 16:51:09 +01:00
|
|
|
const oldComponentPath = screenPath(appPath, pagename, oldName)
|
2019-07-26 18:08:59 +02:00
|
|
|
|
2020-02-10 16:51:09 +01:00
|
|
|
const newComponentPath = screenPath(appPath, pagename, newName)
|
2019-07-26 18:08:59 +02:00
|
|
|
|
2020-02-03 10:24:25 +01:00
|
|
|
await ensureDir(dirname(newComponentPath))
|
|
|
|
await rename(oldComponentPath, newComponentPath)
|
2019-07-26 18:08:59 +02:00
|
|
|
}
|
|
|
|
|
2020-02-10 16:51:09 +01:00
|
|
|
module.exports.deleteScreen = async (config, appname, pagename, name) => {
|
2020-02-03 10:24:25 +01:00
|
|
|
const appPath = appPackageFolder(config, appname)
|
2020-02-10 16:51:09 +01:00
|
|
|
const componentFile = screenPath(appPath, pagename, name)
|
2020-02-03 10:24:25 +01:00
|
|
|
await unlink(componentFile)
|
|
|
|
|
|
|
|
const dir = dirname(componentFile)
|
|
|
|
if ((await readdir(dir)).length === 0) {
|
|
|
|
await rmdir(dir)
|
|
|
|
}
|
2019-07-26 18:08:59 +02:00
|
|
|
}
|
|
|
|
|
2020-02-10 16:51:09 +01:00
|
|
|
module.exports.savePage = async (config, appname, pagename, page) => {
|
|
|
|
const appPath = appPackageFolder(config, appname)
|
|
|
|
const pageDir = join(appPath, "pages", pagename)
|
|
|
|
|
|
|
|
await ensureDir(pageDir)
|
|
|
|
await writeJSON(join(pageDir, "page.json"), page, {
|
|
|
|
encoding: "utf8",
|
|
|
|
flag: "w",
|
|
|
|
space: 2,
|
|
|
|
})
|
|
|
|
const appDefinition = await getAppDefinition(appPath)
|
|
|
|
await buildPage(config, appname, appDefinition, pagename, page)
|
|
|
|
}
|
|
|
|
|
2020-02-25 16:21:23 +01:00
|
|
|
module.exports.componentLibraryInfo = async (
|
|
|
|
config,
|
|
|
|
appname,
|
|
|
|
componentLibrary
|
|
|
|
) => {
|
2020-02-03 10:24:25 +01:00
|
|
|
const appPath = appPackageFolder(config, appname)
|
2020-02-18 16:41:44 +01:00
|
|
|
return await componentLibraryInfo(appPath, componentLibrary)
|
2020-02-03 10:24:25 +01:00
|
|
|
}
|
2019-08-19 22:18:23 +02:00
|
|
|
|
2020-02-18 16:41:44 +01:00
|
|
|
/**
|
|
|
|
* @param {string} appPath - path to a budibase application
|
2020-02-25 16:21:23 +01:00
|
|
|
* @param {Array} pages - a list of budibase application pages
|
2020-02-18 16:41:44 +01:00
|
|
|
* @param {string} componentLibrary - component library to fetch components for
|
|
|
|
* @returns {object} - an object containing component definitions namespaced by their component library
|
|
|
|
*/
|
|
|
|
const getComponentDefinitions = async (appPath, pages, componentLibrary) => {
|
|
|
|
let componentLibraries
|
|
|
|
if (!componentLibrary) {
|
2020-02-10 16:51:09 +01:00
|
|
|
pages = pages || (await getPages(appPath))
|
2019-08-19 22:18:23 +02:00
|
|
|
|
2020-02-10 16:51:09 +01:00
|
|
|
if (!pages) return []
|
2019-07-25 08:31:54 +02:00
|
|
|
|
2020-02-19 22:38:21 +01:00
|
|
|
componentLibraries = $(pages, [
|
|
|
|
values,
|
|
|
|
map(p => p.componentLibraries),
|
|
|
|
flatten,
|
|
|
|
])
|
2020-02-03 10:24:25 +01:00
|
|
|
} else {
|
2020-02-18 16:41:44 +01:00
|
|
|
componentLibraries = [componentLibrary]
|
2020-02-03 10:24:25 +01:00
|
|
|
}
|
2019-07-25 08:31:54 +02:00
|
|
|
|
2020-02-03 10:24:25 +01:00
|
|
|
const components = {}
|
2020-02-19 22:38:21 +01:00
|
|
|
const templates = {}
|
2019-07-25 08:31:54 +02:00
|
|
|
|
2020-02-18 16:41:44 +01:00
|
|
|
for (let library of componentLibraries) {
|
|
|
|
const info = await componentLibraryInfo(appPath, library)
|
2020-02-03 10:24:25 +01:00
|
|
|
merge(components, info.components)
|
2020-02-19 22:38:21 +01:00
|
|
|
merge(templates, info.templates)
|
2020-02-03 10:24:25 +01:00
|
|
|
}
|
2019-10-07 07:03:41 +02:00
|
|
|
|
2020-02-03 10:24:25 +01:00
|
|
|
if (components._lib) delete components._lib
|
2020-02-19 22:38:21 +01:00
|
|
|
if (templates._lib) delete templates._lib
|
2019-07-26 16:13:15 +02:00
|
|
|
|
2020-02-19 22:38:21 +01:00
|
|
|
return { components, templates }
|
2019-07-26 16:13:15 +02:00
|
|
|
}
|
|
|
|
|
2020-02-18 16:41:44 +01:00
|
|
|
module.exports.getComponentDefinitions = getComponentDefinitions
|