budibase/packages/server/utilities/builder.js

116 lines
2.8 KiB
JavaScript

const {
appPackageFolder,
appsFolder
} = require("./createAppPackage");
const {
writeFile,
readFile,
readdir,
exists
} = require("./fsawait");
const { resolve } = require("path");
const { $ } = require("budibase-core").common;
const {
keys,
reduce,
map,
flatten,
some
} = require("lodash/fp");
module.exports.getPackageForBuilder = async (config, appname) => {
const appPath = appPackageFolder(config, appname);
return ({
appDefinition: JSON.parse(await readFile(
`${appPath}/appDefinition.json`,
"utf8")),
accessLevels: JSON.parse(await readFile(
`${appPath}/access_levels.json`,
"utf8")),
pages: JSON.parse(await readFile(
`${appPath}/pages.json`,
"utf8"))
})
}
module.exports.savePackage = async (config, appname, pkg) => {
const appPath = appPackageFolder(config, appname);
await writeFile(
`${appPath}/appDefinition.json`,
JSON.stringify(pkg.appDefinition),
"utf8");
await writeFile(
`${appPath}/access_levels.json`,
JSON.stringify(pkg.accessLevels),
"utf8");
await writeFile(
`${appPath}/pages.json`,
JSON.stringify(pkg.accessLevels),
"utf8");
}
module.exports.getApps = async (config) =>
await readdir(appsFolder(config));
module.exports.getComponents = async (config, appname, lib) => {
const componentsInLibrary = (libname) => {
const isRelative = some(c => c === libname.substring(0,1))
("./~\\".split(""));
const componentsPath = isRelative
? resolve(appPath, libname, "components.json")
: resolve(libname, "components.json");
if(!await exists(componentsPath)) {
const e = new Error(`could not find components definition file at ${componentsPath}`);
e.statusCode = 404;
throw e;
}
let components;
try {
components = JSON.parse(
readFile(componentsPath, "utf8"));
} catch(e) {
const e = new Error(`could not parse JSON - ${componentsPath} `);
throw e;
}
return $(components, [
keys,
reduce((obj, k) => {
obj[`${libname}/${k}`] = components[k]
return obj;
}, {})
])
}
let libs;
if(!lib) {
const appPath = appPackageFolder(config, appname);
const pages = JSON.parse(await readFile(
`${appPath}/pages.json`,
"utf8"));
if(!pages.componentLibraries) return [];
libs = pages.componentLibraries;
} else {
libs = [lib];
}
return $(libs, [
map(componentsInLibrary),
flatten
]);
}