import { BuildOptions, ModuleNode, IndexHtmlTransformContext, splitVendorChunk, PluginOption } from 'vite';

type Prettify<T> = {
  [K in keyof T]: T[K]
} & {}

// #region Rollup 相关类型定义获取
type ExtractOutputOptions<T> = T extends (infer U)[] ? U : T extends undefined ? never : T
type OutputOptions = ExtractOutputOptions<Exclude<BuildOptions['rollupOptions'], undefined>['output']>

type ManualChunksOption = OutputOptions['manualChunks']

type ModuleInfo = Pick<
  Exclude<ModuleNode['info'], undefined>,
'id' | 'meta' | 'importers' | 'importedIds' | 'importedIdResolutions' | 'dynamicImporters' | 'dynamicallyImportedIds' | 'dynamicallyImportedIdResolutions'
> & { isMain?: boolean }

type GetManualChunk = ReturnType<typeof splitVendorChunk>
type ManualChunkMeta = Parameters<GetManualChunk>['1']

type OutputChunk = Exclude<IndexHtmlTransformContext['chunk'], undefined>
// #endregion

interface ISubPkgsInfo {
  root: string
  independent: boolean
}

interface IDtsOptions {
  /**
   * 是否开启类型定义文件生成（可选）
   *
   * @description 默认为true，即开启类型定义文件生成
   * @default true
   */
  enable?: boolean
  /**
   * 类型定义文件生成的基础路径（可选）
   *
   * @description 默认为项目根目录
   * @description 可以相对路径，也可以绝对路径
   * @default './'
   */
  base?: string
  /**
   * 类型定义文件名（可选）
   *
   * @description 默认为`async-import.d.ts`或`async-component.d.ts`
   * @default 'async-import.d.ts' | 'async-component.d.ts'
   */
  name?: string
  /**
   * 类型定义文件生成路径（可选）
   *
   * @description 默认为`${base}/${name}`
   * @description 但是如果指定了此`path`字段，则以`path`为准，优先级更高
   * @description 可以相对路径，也可以绝对路径
   * @default `${base}/${name}`
   */
  path?: string
}

type DtsType = false | { enable: boolean, path: string }

type Enable = 'optimization' | 'async-component' | 'async-import'

interface IOptions {
  /**
   * 插件功能开关（可选）
   *
   * @description 默认为true，即开启所有功能
   */
  enable?: boolean | Prettify<Partial<Record<Enable, boolean>>>
  /**
   * dts文件输出配置（可选）
   *
   * @description 默认为true，即在项目根目录生成类型定义文件
   */
  dts?: Prettify<Partial<Omit<IDtsOptions, 'name' | 'path'> & Record<Exclude<Enable, 'optimization'>, IDtsOptions | boolean>>> | boolean
  /**
   * log 控制，默认不启用，为false
   */
  logger?: Prettify<boolean | Enable[]>
}

declare const _default: (options?: IOptions) => PluginOption;

export { type DtsType, type IOptions, type ISubPkgsInfo, type ManualChunkMeta, type ManualChunksOption, type ModuleInfo, type OutputChunk, type OutputOptions, type Prettify, _default as default };
