[skip ci] Improve typings for settings.withPrivateSettings

This commit is contained in:
V 2023-06-21 02:00:38 +02:00
parent bc0de3926c
commit 3020fcc9bb
No known key found for this signature in database
GPG Key ID: A1DC0CFB5615D905
2 changed files with 19 additions and 11 deletions

@ -254,8 +254,12 @@ export function migratePluginSettings(name: string, ...oldNames: string[]) {
} }
} }
export function definePluginSettings<D extends SettingsDefinition, C extends SettingsChecks<D>>(def: D, checks?: C) { export function definePluginSettings<
const definedSettings: DefinedSettings<D> = { Def extends SettingsDefinition,
Checks extends SettingsChecks<Def>,
PrivateSettings extends object = {}
>(def: Def, checks?: Checks) {
const definedSettings: DefinedSettings<Def, Checks, PrivateSettings> = {
get store() { get store() {
if (!definedSettings.pluginName) throw new Error("Cannot access settings before plugin is initialized"); if (!definedSettings.pluginName) throw new Error("Cannot access settings before plugin is initialized");
return Settings.plugins[definedSettings.pluginName] as any; return Settings.plugins[definedSettings.pluginName] as any;
@ -264,11 +268,11 @@ export function definePluginSettings<D extends SettingsDefinition, C extends Set
settings?.map(name => `plugins.${definedSettings.pluginName}.${name}`) as UseSettings<Settings>[] settings?.map(name => `plugins.${definedSettings.pluginName}.${name}`) as UseSettings<Settings>[]
).plugins[definedSettings.pluginName] as any, ).plugins[definedSettings.pluginName] as any,
def, def,
checks: checks ?? {}, checks: checks ?? {} as any,
pluginName: "", pluginName: "",
withPrivateSettings<T>() { withPrivateSettings<T extends object>() {
return this as DefinedSettings<D, C> & { store: T; }; return this as DefinedSettings<Def, Checks, T>;
} }
}; };

@ -260,25 +260,29 @@ type SettingsStore<D extends SettingsDefinition> = {
}; };
/** An instance of defined plugin settings */ /** An instance of defined plugin settings */
export interface DefinedSettings<D extends SettingsDefinition = SettingsDefinition, C extends SettingsChecks<D> = {}> { export interface DefinedSettings<
Def extends SettingsDefinition = SettingsDefinition,
Checks extends SettingsChecks<Def> = {},
PrivateSettings extends object = {}
> {
/** Shorthand for `Vencord.Settings.plugins.PluginName`, but with typings */ /** Shorthand for `Vencord.Settings.plugins.PluginName`, but with typings */
store: SettingsStore<D>; store: SettingsStore<Def> & PrivateSettings;
/** /**
* React hook for getting the settings for this plugin * React hook for getting the settings for this plugin
* @param filter optional filter to avoid rerenders for irrelavent settings * @param filter optional filter to avoid rerenders for irrelavent settings
*/ */
use<F extends Extract<keyof D, string>>(filter?: F[]): Pick<SettingsStore<D>, F>; use<F extends Extract<keyof Def | keyof PrivateSettings, string>>(filter?: F[]): Pick<SettingsStore<Def> & PrivateSettings, F>;
/** Definitions of each setting */ /** Definitions of each setting */
def: D; def: Def;
/** Setting methods with return values that could rely on other settings */ /** Setting methods with return values that could rely on other settings */
checks: C; checks: Checks;
/** /**
* Name of the plugin these settings belong to, * Name of the plugin these settings belong to,
* will be an empty string until plugin is initialized * will be an empty string until plugin is initialized
*/ */
pluginName: string; pluginName: string;
withPrivateSettings<T>(): this & { store: T; }; withPrivateSettings<T extends object>(): DefinedSettings<Def, Checks, T>;
} }
export type PartialExcept<T, R extends keyof T> = Partial<T> & Required<Pick<T, R>>; export type PartialExcept<T, R extends keyof T> = Partial<T> & Required<Pick<T, R>>;