UNPKG

takin

Version:

Front end engineering base toolchain and scaffold

318 lines (317 loc) 8.72 kB
import { SupportConfigExtensions } from './constants'; import { Environment } from './environment'; import { Logger } from './logger'; import type { Plugin } from './plugin'; import type { Json, JsonArray, ObjectValues, UserConfig } from './types'; export declare type UserConfigFn = () => UserConfig | Promise<UserConfig>; export declare type UserConfigExport = UserConfig | Promise<UserConfig> | UserConfigFn; /** * 支持的插件类型 */ export declare type PluginOption = Plugin | [string, Json] | string; /** * 插件类型 */ export declare enum PluginTypes { /** * 通过 npm 自动载入的 */ auto = "auto", /** * 通过 use 方法传入 */ use = "use", /** * 通过 Runner.run 方法直接指定 */ runner = "runner", /** * 通过 userConfig 传入 */ config = "config", /** * 通过 命令行选项 传入 */ cli = "cli" } export declare type UsedPluginsMap = Map<string, { plugin: Plugin; pluginType: PluginTypes; version: string; }>; /** * 配置文件过滤条件类型 */ export declare type ConfigFilterType = string[] | string | undefined; /** * 支持的配置文件后缀名类型 */ export declare type SupportConfigExtensionTypes = ObjectValues<typeof SupportConfigExtensions>; /** * 多配置选项 */ export interface MultipleConfigOptions { /** * 多配置字段名称 */ by: string; } /** * 用户配置支持 * 1. 支持自定义 配置 配置文件的名称 * 2. 支持 js、ts、mjs、json 四种配置文件方式 * 3. 不同的文件使用不同的方式载入 * 4. 支持用户自定义配置文件名称, 并指定配置文件的支持类型 * 5. 支持通过插件注册配置字段和校验schema * 6. 支持 开启配置数组, 并通过用户指定的 字段来区分 * 7. 支持配置合并 */ export declare class Config { /** * 配置基础名称 */ private _name; /** * option 名称 */ optionName: string; /** * option 别名 */ optionNameAlias?: string; /** * 是否开启多配置支持 * 默认为 `false` * 多配置支持示例: `[{ name: 'config-one' }, { name: 'config-two' }]` */ multipleConfigEnabled: boolean; /** * 是否开启通过 package.json 读取配置 * 如: `{ takin: {} }` */ packageJsonConfigEnabled: boolean; /** * 是否开启了 env 支持 */ env: Environment; /** * 多配置名称字段 * 默认为 `name` */ multipleConfigNameField?: string; /** * 允许自定义支持的配置文件类型 */ supportConfigExtensions: (".ts" | ".js" | ".mjs" | ".json" | ".jsonc" | ".json5")[]; /** * 支持设置用户配置文件名称, 不包含后缀设置 * 默认为 `takin.config` */ supportConfigNames: string[]; /** * 当前项目 package.json 内容 */ pkg?: Json; /** * 当前项目的 package.json 路径 */ pkgPath: string; /** * 用户配置文件内容 */ userConfig?: UserConfig[]; /** * 用户配置文件地址 */ userConfigFilePath?: string; /** * 已使用的插件 */ usedPlugins: UsedPluginsMap; /** * 配置专用 logger */ logger: Logger; /** * 插件动态载入规则配置, 支持一组正则 */ private pluginAutoLoadPatterns; /** * 项目执行文件根目录, 默认为 `process.cwd()` */ cwd: string; /** * 缓存文件夹 */ private cacheDir?; /** * 临时文件夹 */ private tempDir?; /** * 初始化时使用的配置文件名称 * @param name - 配置文件名称 */ constructor(name: string); /** * 设置全局名称 * @param name - 命令行全局名称 * @return this */ setName(name: string): this; /** * 获取 cli 全局名称 */ get name(): string; /** * 设置 option 名称和别名, 用于命令行 * @param name - 名称 * @param alias - 别名 * @return this */ setOptionName(name: string, alias?: string): this; /** * 配置支持的配置文件名称 * @param names - 文件名称, 如 `['takin.config']` * @return this */ setSupportConfigFileNames(names: string[]): this; /** * 配置支持的配置文件名称 * @param extensions - 后缀名, 如 `['.js']` * @return this */ setSupportConfigFileExtensions(extensions: SupportConfigExtensionTypes[]): this; /** * 开启通过 package.json 读取用户配置 * @return this */ enablePackageJsonConfig(): this; /** * 关闭通过 package.json 读取用户配置 * @return this */ disablePackageJsonConfig(): this; /** * 开启多配置支持 * @param opts - 多配置支持选项 * @return this */ enableMultipleConfig(opts?: MultipleConfigOptions): this; /** * 关闭多配置支持 * @return this */ disableMultipleConfig(): this; /** * 设置插件自动加载规则 * @param patterns - 规则 * @return this */ setPluginAutoLoadPatterns(patterns: RegExp[]): this; /** * 从 package.json 的 dependencies 和 devDependencies 中基于规则自动载入插件- */ autoLoadPlugins(): Promise<void>; /** * @private * 设置内部插件 */ usePlugins(plugins: PluginOption[], pluginType: PluginTypes): void; /** * @private * 警告插件重复 * @returns true 为 重复, false 为不重复 */ warnDuplicatePlugin(plugins: UsedPluginsMap, pluginName: string, version: string): boolean; /** * @private * 加载用户 插件列表, 并执行 * 支持的格式 * ``` * plugins: [ * 'plugin_name', * ['plugin_name', { somePluginOption: 1 }], * new Plugin({}), * ] * ``` * @param plugins - 插件列表 * @param invokeOnUse - 是否触发插件 onUse 回调 * @param pluginType - 插件调用类型 */ resolveUserPlugins(plugins: PluginOption[], invokeOnUse: boolean, pluginType: PluginTypes): UsedPluginsMap; /** * 对用户使用的插件进行排序 * plugin.enforce 属性只处理 pre 和 post 两个值, 其他值会忽略 * 原则上除了将部分插件提前或置后之外, 不改变用户自行设定的插件顺序 * plugin.enforce = 'pre' 会排在所有插件最前面 * plugin.enforce = 'post' 会排在所有插件最后面 * @param plugins - 插件列表 */ sortUserPlugins(plugins: (Plugin | Plugin[])[] | undefined): [Plugin[], Plugin[], Plugin[]]; /** * 解析配置过滤条件 * @param filters - 过滤条件 * @returns 解析后的过滤条件 */ parseFilter(filters?: ConfigFilterType): Set<string> | undefined; /** * 过滤用户配置 * @param filters - 过滤条件 * @param userConfigs - 需要过滤的用户配置 * @returns 过滤后的用户配置 */ protected filterBy(filters?: ConfigFilterType, userConfigs?: UserConfig[]): UserConfig[]; /** * 载入和返回 package.json 的内容, 并存储在 this.pkg 中 * @returns */ private loadPackageJson; /** * 载入用户配置文件 * @param configFile - 配置文件地址 * @returns 配置文件内容 */ loadConfigFromFile(configFile?: string): Promise<JsonArray | null>; /** * 获取临时目录文件夹 * @returns 当前 cwd 下的临时文件夹, 通常为 .[name] 文件夹 */ getTempDir(): string; /** * 设置临时文件夹 */ setTempDir(tempDir: string): void; /** * 清空临时文件夹 */ clearTempDir(): void; /** * 清空缓存文件夹 */ clearCacheDir(): void; /** * 写入到 cache 文件夹 * @param fileName - 文件名称 * @param content - 文件内容 * @returns 缓存文件完整路径 */ writeToCacheDir(fileName: string, content: string): string; /** * 读取缓存文件 * @param fileName - 文件名称 * @returns 文件内容 */ loadCachedFile(fileName: string): Promise<string | undefined>; /** * 根据文件名称, 获取缓存文件完整地址 * @param fileName - 文件名称 * @returns 缓存文件完整地址 */ getCachedFilePath(fileName: string): string; /** * 获取 缓存 文件夹 * @returns 文件夹地址 */ getCacheDir(): string; }