import { Plugin, PluginOptionAPI } from './plugin' // eslint-disable-next-line @typescript-eslint/no-explicit-any export interface OptionItem { value: Value name: string } // eslint-disable-next-line @typescript-eslint/no-explicit-any export interface Option { key: string items: OptionItem[] readonly values: Value[] appliedItems: OptionItem[] readonly appliedValues: Value[] readonly entries: [string, Value][] // eslint-disable-next-line @typescript-eslint/no-explicit-any apply: (...args: any[]) => void // eslint-disable-next-line @typescript-eslint/no-explicit-any syncApply: (...args: any[]) => void // eslint-disable-next-line @typescript-eslint/no-explicit-any pipeline: (input: any) => T } export interface AsyncOption extends Option { // eslint-disable-next-line @typescript-eslint/no-explicit-any apply: (...args: any[]) => Promise // eslint-disable-next-line @typescript-eslint/no-explicit-any asyncApply: (...args: any[]) => Promise // eslint-disable-next-line @typescript-eslint/no-explicit-any parallelApply: (...args: any[]) => Promise // eslint-disable-next-line @typescript-eslint/no-explicit-any pipeline: >(input: any) => T } // eslint-disable-next-line @typescript-eslint/no-explicit-any export interface NormalizedPlugin extends PluginOptionAPI { name: string shortcut: string | null enabled: boolean $$options: PluginOptions $$normalized: true } export interface PluginAPI { options: Record readonly enabledPlugins: (NormalizedPlugin & { enabled: true })[] readonly disabledPlugins: (NormalizedPlugin & { enabled: false })[] initialize: () => void // eslint-disable-next-line @typescript-eslint/no-explicit-any use: ( pluginRaw: Plugin, pluginOptions: PluginOptions ) => PluginAPI normalizePlugin: ( type: 'plugin' | 'theme', pluginRaw: Plugin, pluginOptions: PluginOptions ) => NormalizedPlugin useByPluginsConfig: (pluginConfig: PluginOptionAPI) => PluginAPI initializeOptions: () => void registerOption: (key: string, value: Option, pluginName: string) => PluginAPI applyPlugin: (plugin: NormalizedPlugin) => void // eslint-disable-next-line @typescript-eslint/no-explicit-any applySyncOption: (name: string, ...args: any[]) => PluginAPI // eslint-disable-next-line @typescript-eslint/no-explicit-any applyAsyncOption: (name: string, ...args: any[]) => Promise getOption: (name: string) => Option }