2022-10-10 12:50:21 +00:00
|
|
|
import { readYamlPage } from "./yaml_page.ts";
|
|
|
|
import { notifyUser } from "./util.ts";
|
|
|
|
import * as YAML from "yaml";
|
|
|
|
|
|
|
|
import { writePage } from "../../syscall/silverbullet-syscall/space.ts";
|
2022-07-15 09:17:02 +00:00
|
|
|
|
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`
|
|
|
|
*/
|
|
|
|
|
2022-07-23 17:18:03 +00:00
|
|
|
const SETTINGS_PAGE = "SETTINGS";
|
|
|
|
|
2022-07-15 09:17:02 +00:00
|
|
|
export async function readSettings<T extends object>(settings: T): Promise<T> {
|
|
|
|
try {
|
2022-07-23 17:18:03 +00:00
|
|
|
let allSettings = (await readYamlPage(SETTINGS_PAGE, ["yaml"])) || {};
|
2022-07-15 09:17:02 +00:00
|
|
|
// TODO: I'm sure there's a better way to type this than "any"
|
|
|
|
let collectedSettings: any = {};
|
|
|
|
for (let [key, defaultVal] of Object.entries(settings)) {
|
2022-07-23 17:18:03 +00:00
|
|
|
if (key in allSettings) {
|
2022-07-15 09:17:02 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
2022-07-23 17:18:03 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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
|
2022-07-23 17:18:03 +00:00
|
|
|
*/
|
|
|
|
export async function writeSettings<T extends object>(settings: T) {
|
|
|
|
let readSettings = {};
|
|
|
|
try {
|
|
|
|
readSettings = (await readYamlPage(SETTINGS_PAGE, ["yaml"])) || {};
|
|
|
|
} catch (e: any) {
|
2022-07-25 18:52:05 +00:00
|
|
|
await notifyUser("Creating a new SETTINGS page...", "info");
|
2022-07-23 17:18:03 +00:00
|
|
|
}
|
2022-09-13 06:41:01 +00:00
|
|
|
const writeSettings = { ...readSettings, ...settings };
|
|
|
|
// const doc = new YAML.Document();
|
|
|
|
// doc.contents = writeSettings;
|
2022-10-10 12:50:21 +00:00
|
|
|
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-09-13 06:41:01 +00:00
|
|
|
await writePage(SETTINGS_PAGE, contents);
|
|
|
|
}
|