[skip ci] Improve typings for settings.withPrivateSettings
This commit is contained in:
parent
bc0de3926c
commit
3020fcc9bb
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>>;
|
||||||
|
|
Loading…
Reference in a new issue