takin
Version:
Front end engineering base toolchain and scaffold
318 lines (317 loc) • 8.72 kB
TypeScript
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;
}