export type PropertiesJSON = { hintchars?: string; smoothscroll?: boolean; complete?: string; }; export type PropertyTypes = { hintchars: string; smoothscroll: string; complete: string; }; type PropertyName = "hintchars" | "smoothscroll" | "complete"; type PropertyDef = { name: PropertyName; description: string; defaultValue: string | number | boolean; type: "string" | "number" | "boolean"; }; const defs: PropertyDef[] = [ { name: "hintchars", description: "hint characters on follow mode", defaultValue: "abcdefghijklmnopqrstuvwxyz", type: "string", }, { name: "smoothscroll", description: "smooth scroll", defaultValue: false, type: "boolean", }, { name: "complete", description: "which are completed at the open page", defaultValue: "sbh", type: "string", }, ]; const defaultValues = { hintchars: "abcdefghijklmnopqrstuvwxyz", smoothscroll: false, complete: "sbh", }; export default class Properties { public hintchars: string; public smoothscroll: boolean; public complete: string; constructor({ hintchars, smoothscroll, complete, }: { hintchars?: string; smoothscroll?: boolean; complete?: string; } = {}) { this.hintchars = hintchars || defaultValues.hintchars; this.smoothscroll = smoothscroll || defaultValues.smoothscroll; this.complete = complete || defaultValues.complete; } static fromJSON(json: PropertiesJSON): Properties { return new Properties(json); } static types(): PropertyTypes { return { hintchars: "string", smoothscroll: "boolean", complete: "string", }; } static def(name: string): PropertyDef | undefined { return defs.find((p) => p.name === name); } static defs(): PropertyDef[] { return defs; } toJSON(): PropertiesJSON { return { hintchars: this.hintchars, smoothscroll: this.smoothscroll, complete: this.complete, }; } }