import { CAC } from 'cac' import { Application } from 'express' import WebpackDevServer from 'webpack-dev-server' import Config from 'webpack-chain' import { PluginConfig } from './config' import { Context } from './context' import { Markdown } from './markdown' import { Page, PageOptions } from './page' import { PluginAPI } from './plugin-api' // eslint-disable-next-line @typescript-eslint/no-explicit-any export type Plugin = PluginOptionAPI | PluginFunction // eslint-disable-next-line @typescript-eslint/no-explicit-any export type PluginFunction = ( pluginOptions: Options, context: Context, pluginApi: PluginAPI ) => PluginOptionAPI export interface PluginGeneratedFile { name: string content: string } export type EnhanceAppFilesGeneratedFile = PluginGeneratedFile export type ClientDynamicModulesGeneratedFile = PluginGeneratedFile & { dirname?: string } export type PluginGeneratedFileTypes = | T | T[] | Promise | Promise export interface PluginOptionAPI { name?: string plugins?: PluginConfig[] chainWebpack?: (config: Config, isServer: boolean) => void define?: Record | (() => Record) alias?: Record beforeDevServer?: (app: Application, server: WebpackDevServer) => void afterDevServer?: (app: Application, server: WebpackDevServer) => void extendMarkdown?: (md: Markdown) => void // TODO: ask markdown-it-chain to add types definitions chainMarkdown?: (config: any) => void enhanceAppFiles?: | string | string[] | (() => | PluginGeneratedFileTypes | string | string[]) clientDynamicModules?: () => PluginGeneratedFileTypes< ClientDynamicModulesGeneratedFile > extendPageData?: (page: Page) => void | Promise clientRootMixin?: string additionalPages?: | Partial[] | (() => Promise[]>) globalUIComponents?: string | string[] extendCli?: (cli: CAC) => void multiple?: boolean // Life Cycle // https://vuepress.vuejs.org/plugin/life-cycle.html ready?: () => void | Promise updated?: () => void | Promise generated?: (pagePaths: string[]) => void | Promise }