2022-07-25 18:52:05 +00:00
import { readYamlPage } from "./yaml_page" ;
import { notifyUser } from "./util" ;
import YAML from "yaml" ;
import { writePage } from "@silverbulletmd/plugos-silverbullet-syscall/space" ;
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 .
* @param settings
* /
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
}
const writeSettings = { . . . readSettings , . . . settings } ;
2022-07-25 18:52:05 +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 ${ doc . toString ( ) } \ n \` \` \` ` ; // might need \r\n for windows?
await writePage ( SETTINGS_PAGE , contents )
2022-07-23 17:18:03 +00:00
}