1
0
silverbullet/plug-api/lib/settings_page.ts

81 lines
2.7 KiB
TypeScript
Raw Normal View History

import { readYamlPage } from "./yaml_page.ts";
import { notifyUser } from "./util.ts";
import * as YAML from "yaml";
2022-10-14 13:11:33 +00:00
import { space } from "$sb/silverbullet-syscall/mod.ts";
2022-07-18 08:51:28 +00:00
/**
* Convenience function to read a specific set of settings from the `SETTINGS` page as well as default values
* in case they are not specified.
* Example: `await readSettings({showPreview: false})` will return an object like `{showPreview: false}` (or `true`)
* in case this setting is specifically set in the `SETTINGS` page.
*
* @param settings object with settings to fetch and their default values
* @returns an object with the same shape as `settings` but with non-default values override based on `SETTINGS`
*/
const SETTINGS_PAGE = "SETTINGS";
export async function readSettings<T extends object>(settings: T): Promise<T> {
try {
2022-10-14 13:11:33 +00:00
const allSettings = (await readYamlPage(SETTINGS_PAGE, ["yaml"])) || {};
// TODO: I'm sure there's a better way to type this than "any"
2022-10-14 13:11:33 +00:00
const collectedSettings: any = {};
2022-10-25 16:50:07 +00:00
for (const [key, defaultVal] of Object.entries(settings)) {
if (key in allSettings) {
collectedSettings[key] = allSettings[key];
} else {
collectedSettings[key] = defaultVal;
}
}
return collectedSettings as T;
} catch (e: any) {
if (e.message === "Page not found") {
// No settings yet, return default values for all
return settings;
}
throw e;
}
}
export async function readSetting(
key: string,
defaultValue?: any,
): Promise<any> {
try {
const allSettings = (await readYamlPage(SETTINGS_PAGE, ["yaml"])) || {};
const val = allSettings[key];
return val === undefined ? defaultValue : val;
} catch (e: any) {
if (e.message === "Page not found") {
// No settings yet, return default values for all
return defaultValue;
}
throw e;
}
}
/**
* Convenience function to write a specific set of settings from the `SETTINGS` page.
* If the SETTiNGS page doesn't exist it will create it.
2022-09-13 06:41:01 +00:00
* @param settings
*/
export async function writeSettings<T extends object>(settings: T) {
let readSettings = {};
try {
readSettings = (await readYamlPage(SETTINGS_PAGE, ["yaml"])) || {};
2022-10-14 13:11:33 +00:00
} catch {
2022-07-25 18:52:05 +00:00
await notifyUser("Creating a new SETTINGS page...", "info");
}
2022-10-14 13:11:33 +00:00
const writeSettings: any = { ...readSettings, ...settings };
2022-09-13 06:41:01 +00:00
// const doc = new YAML.Document();
// doc.contents = writeSettings;
const contents =
`This page contains settings for configuring SilverBullet and its Plugs.\nAny changes outside of the yaml block will be overwritten.\n\`\`\`yaml\n${
YAML.stringify(
writeSettings,
)
}\n\`\`\``; // might need \r\n for windows?
2022-10-14 13:11:33 +00:00
await space.writePage(SETTINGS_PAGE, contents);
2022-09-13 06:41:01 +00:00
}