
Cat Kit
- 45 installs
- 3 repo stars
- Updated July 15, 2026
- cabinet-fe/cat-kit
Use this skill when working with cat kit.
About
Skill for working with cat kit. Use when you need cat kit functionality in your application.
- Specialized for cat kit
- Integrated with Claude Code
- Streamlines workflow
Cat Kit by the numbers
- 45 all-time installs (skills.sh)
- Ranked #1,337 of 2,245 Frontend Development skills by installs in the Skillselion catalog
- Data as of Jul 28, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cabinet-fe/cat-kit --skill cat-kitAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 45 |
|---|---|
| repo stars | ★ 3 |
| Last updated | July 15, 2026 |
| Repository | cabinet-fe/cat-kit ↗ |
What it does
Use this skill when working with cat kit.
Files
export { };{
"generatedAt": "2026-06-22T15:20:06.138Z",
"npmName": "@cat-kit/agent-context",
"version": "2.0.3",
"kind": "dts",
"artifactCount": 1
}本目录由脚本生成,勿手改。内容为 @cat-kit/agent-context 包 dist 下 .d.ts 的镜像(与 npm typings 对齐)。
- 入口:通常从
index.d.ts起读(若有)。 - 元数据:
manifest.json
//#region src/cache/file-cache.d.ts
/**
* 文件缓存选项
*/
interface FileCacheOptions {
/** 缓存目录路径 */
dir: string;
/**
* 默认过期时间(毫秒)
*/
ttl?: number;
/**
* 文件后缀
* @default '.json'
*/
extension?: string;
}
/**
* 基于文件系统的缓存实现
*
* 将缓存数据持久化到文件系统,支持 TTL 过期机制。
*
* @example
* ```typescript
* const cache = new FileCache<User>({
* dir: './cache',
* ttl: 3600000 // 1小时过期
* })
*
* await cache.set('user:1', user)
* const user = await cache.get('user:1')
* ```
*
* @template V 缓存值的类型
*/
declare class FileCache<V> {
private readonly dir;
private readonly ttl?;
private readonly extension;
/**
* 创建文件缓存实例
* @param options - 缓存选项
*/
constructor(options: FileCacheOptions);
private getFilePath;
private isExpired;
/**
* 获取缓存值
*
* 如果值已过期或不存在,返回 `undefined`。过期的缓存文件会被自动删除。
*
* @param key - 缓存键
* @returns 缓存值,如果不存在或已过期则返回 `undefined`
* @throws {Error} 当文件读取失败时抛出错误
*/
get(key: string): Promise<V | undefined>;
/**
* 设置缓存值
*
* 如果目录不存在会自动创建。值会被序列化为 JSON 并写入文件。
*
* @param key - 缓存键
* @param value - 缓存值
* @param ttl - 过期时间(毫秒),如果未指定则使用默认 TTL
* @throws {Error} 当文件写入失败时抛出错误
*/
set(key: string, value: V, ttl?: number): Promise<void>;
/**
* 删除指定的缓存项
*
* @param key - 要删除的缓存键
* @returns 如果键存在并成功删除返回 `true`,如果文件不存在返回 `false`
* @throws {Error} 当文件删除失败时抛出错误
*/
delete(key: string): Promise<boolean>;
/**
* 清空所有缓存项
*
* 删除整个缓存目录并重新创建。
*
* @throws {Error} 当目录操作失败时抛出错误
*/
clear(): Promise<void>;
}
//#endregion
export { FileCache, FileCacheOptions };//#region src/cache/lru-cache.d.ts
/**
* LRU 缓存选项
*/
interface LRUCacheOptions {
/**
* 最大缓存容量
* @default 100
*/
maxSize?: number;
/**
* 默认过期时间(毫秒)
*/
ttl?: number;
}
/**
* LRU(最近最少使用)缓存实现
*
* 自动淘汰最久未使用的项,支持 TTL(生存时间)过期机制
*
* @example
* ```typescript
* const cache = new LRUCache<string, User>({
* maxSize: 100,
* ttl: 3600000 // 1小时过期
* })
*
* cache.set('user:1', user)
* const user = cache.get('user:1')
* ```
*
* @template K 键的类型
* @template V 值的类型
*/
declare class LRUCache<K, V> {
private readonly cache;
private readonly maxSize;
private readonly ttl?;
/**
* 创建 LRU 缓存实例
* @param options - 缓存选项
*/
constructor(options?: LRUCacheOptions);
private isExpired;
private touch;
/**
* 获取缓存值
*
* 如果值已过期或不存在,返回 `undefined`。访问时会自动更新使用顺序。
*
* @param key - 缓存键
* @returns 缓存值,如果不存在或已过期则返回 `undefined`
*/
get(key: K): V | undefined;
/**
* 检查键是否存在且未过期
*
* @param key - 缓存键
* @returns 如果键存在且未过期返回 `true`,否则返回 `false`
*/
has(key: K): boolean;
/**
* 设置缓存值
*
* 如果缓存已满,会自动删除最久未使用的项。如果键已存在,会更新其值和使用时间。
*
* @param key - 缓存键
* @param value - 缓存值
* @param ttl - 过期时间(毫秒),如果未指定则使用默认 TTL
*/
set(key: K, value: V, ttl?: number): void;
/**
* 删除指定的缓存项
*
* @param key - 要删除的缓存键
* @returns 如果键存在并成功删除返回 `true`,否则返回 `false`
*/
delete(key: K): boolean;
/**
* 清空所有缓存项
*/
clear(): void;
/**
* 获取所有缓存键的迭代器
*
* @returns 键的迭代器
*/
keys(): IterableIterator<K>;
/**
* 获取所有缓存值的迭代器
*
* 只返回未过期的值。
*
* @returns 值的迭代器
*/
values(): IterableIterator<V>;
/**
* 获取当前缓存中的条目数量
* @returns 缓存条目数量
*/
get size(): number;
}
//#endregion
export { LRUCache, LRUCacheOptions };//#region src/cache/memoize.d.ts
/**
* 缓存适配器接口
*
* 用于自定义缓存实现,支持不同的缓存策略。
*
* @template K 键的类型
* @template V 值的类型
*/
interface CacheAdapter<K, V> {
/** 获取缓存值 */
get(key: K): V | undefined;
/** 设置缓存值 */
set(key: K, value: V, ttl?: number): void;
/** 检查键是否存在 */
has(key: K): boolean;
/** 删除缓存项 */
delete(key: K): boolean;
/** 清空所有缓存 */
clear(): void;
}
/**
* 函数记忆化选项
*
* @template F 函数类型
* @template K 缓存键类型
*/
interface MemoizeOptions<F extends (...args: any[]) => any, K> {
/** 自定义缓存实现,默认使用 LRUCache */
cache?: CacheAdapter<K, Awaited<ReturnType<F>>>;
/** 自定义键解析函数,默认使用 JSON.stringify */
resolver?: (...args: Parameters<F>) => K;
/** 默认过期时间(毫秒) */
ttl?: number;
}
/**
* 为函数添加缓存能力(记忆化)
*
* 自动缓存函数调用结果,相同参数的后续调用会直接返回缓存值。
* 支持同步和异步函数,异步函数会缓存 Promise 结果。
*
* @example
* ```typescript
* // 同步函数
* const expensiveFn = memoize((n: number) => {
* // 复杂计算
* return n * n
* })
*
* // 异步函数
* const fetchUser = memoize(async (id: number) => {
* return await api.getUser(id)
* }, { ttl: 3600000 })
*
* // 访问缓存
* expensiveFn.cache.get('1') // 获取缓存值
* expensiveFn.clear() // 清空缓存
* ```
*
* @param fn - 需要缓存的原函数
* @param options - 自定义缓存、键解析与过期时间
* @returns 带缓存功能的函数,并附带 `cache` 和 `clear` 属性
* @template F 函数类型
*/
declare function memoize<F extends (...args: any[]) => any>(fn: F, options?: MemoizeOptions<F, unknown>): F & {
cache: CacheAdapter<unknown, Awaited<ReturnType<F>>>;
clear(): void;
};
//#endregion
export { CacheAdapter, MemoizeOptions, memoize };//#region src/config/config.d.ts
/**
* 配置文件格式
*/
type ConfigFormat = 'json' | 'yaml' | 'toml';
/**
* 加载配置选项
*
* @template T 配置对象类型
*/
interface LoadConfigOptions<T extends Record<string, unknown>> {
/** 工作目录,默认使用 `process.cwd()` */
cwd?: string;
/** 配置文件格式,如果不指定会根据文件扩展名自动检测 */
format?: ConfigFormat;
/** 默认配置值,会与加载的配置合并 */
defaults?: Partial<T>;
/**
* 自定义解析器(覆盖 format)
*
* 如果提供了自定义解析器,将忽略 format 选项。
*/
parser?: (source: string) => T | Promise<T>;
/**
* 自定义校验逻辑
*
* 如果校验失败应抛出错误。
*/
validate?: (config: T) => void;
/**
* 是否与 defaults 深度合并
* @default true
*/
mergeDefaults?: boolean;
}
/**
* 加载并解析配置文件
*
* 支持 JSON、YAML 和 TOML 格式。YAML 和 TOML 需要安装对应的可选依赖:
* - YAML: `bun add js-yaml`
* - TOML: `bun add smol-toml`
*
* @example
* ```typescript
* // 加载 JSON 配置
* const config = await loadConfig<AppConfig>('./config.json', {
* defaults: { port: 3000 }
* })
*
* // 加载 YAML 配置
* const config = await loadConfig('./config.yaml', {
* validate: (c) => {
* if (!c.apiKey) throw new Error('apiKey is required')
* }
* })
* ```
*
* @param filePath - 配置文件路径(相对或绝对路径)
* @param options - 解析及合并选项
* @returns 解析后的配置对象
* @throws {PeerDependencyError} 当需要可选依赖但未安装时
* @throws {Error} 当文件读取失败或解析失败时
* @template T 配置对象类型
*/
declare function loadConfig<T extends Record<string, unknown> = Record<string, unknown>>(filePath: string, options?: LoadConfigOptions<T>): Promise<T>;
//#endregion
export { ConfigFormat, LoadConfigOptions, loadConfig };//#region src/config/env.d.ts
/**
* 环境变量记录类型
*/
type EnvRecord = Record<string, string>;
/**
* 加载环境变量选项
*/
interface LoadEnvOptions {
/** 工作目录,默认使用 `process.cwd()` */
cwd?: string;
/**
* 当前运行模式,如 development / production
*
* 会根据模式加载对应的 `.env.${mode}` 和 `.env.${mode}.local` 文件
*/
mode?: string;
/**
* 自定义加载顺序
*
* 如果不指定,默认加载顺序为:
* 1. `.env`
* 2. `.env.local`
* 3. `.env.${mode}` (如果指定了 mode)
* 4. `.env.${mode}.local` (如果指定了 mode)
*/
files?: string[];
/**
* 是否覆盖 process.env 中已有的值
* @default false
*/
override?: boolean;
/**
* 是否写入 process.env
* @default true
*/
injectToProcess?: boolean;
}
/**
* 将 .env 文件内容解析为键值对
*
* 支持以下格式:
* - `KEY=value`
* - `export KEY=value`
* - `KEY="quoted value"`
* - `KEY='quoted value'`
* - `# 注释行`
*
* @param content - 原始文件内容
* @returns 解析出的环境变量映射
*/
declare function parseEnvFile(content: string): EnvRecord;
/**
* 读取并解析 .env 文件集合
*
* 按照优先级顺序加载多个 .env 文件,后面的文件会覆盖前面的同名变量。
* 默认会将解析的环境变量注入到 `process.env` 中。
*
* @example
* ```typescript
* // 加载环境变量
* const env = await loadEnv({
* mode: 'production',
* override: false // 不覆盖已存在的环境变量
* })
*
* // 只解析不注入
* const env = await loadEnv({
* injectToProcess: false
* })
* ```
*
* @param options - 加载选项
* @returns 聚合后的环境变量映射
*/
declare function loadEnv(options?: LoadEnvOptions): Promise<EnvRecord>;
/**
* 环境变量值类型
*/
type EnvValueType = 'string' | 'number' | 'boolean' | 'json' | 'array';
/**
* 环境变量定义
*
* @template T 值的类型
*/
interface EnvDefinition<T> {
/**
* 值类型或自定义转换函数
*
* - `'string'`: 字符串(默认)
* - `'number'`: 数字
* - `'boolean'`: 布尔值('true', '1', 'yes', 'on' 为 true)
* - `'json'`: JSON 对象
* - `'array'`: 数组(使用 delimiter 分隔)
* - 函数: 自定义转换函数
*/
type?: EnvValueType | ((value: string | undefined, key: string) => T);
/** 默认值 */
default?: T;
/** 是否必填 */
required?: boolean;
/** 数组分隔符(当 type 为 'array' 时使用),默认 ',' */
delimiter?: string;
/** 值转换函数,在类型转换后执行 */
transform?: (value: T, key: string) => T;
}
/**
* 环境变量 Schema 类型
*
* @template T 配置对象类型
*/
type EnvSchema<T extends Record<string, any>> = { [K in keyof T]: EnvDefinition<T[K]> };
/**
* 根据 schema 校验并转换环境变量
*
* 支持类型转换、默认值、必填校验和自定义转换函数。
*
* @example
* ```typescript
* const config = parseEnv({
* port: { type: 'number', default: 3000 },
* debug: { type: 'boolean', default: false },
* apiKey: { type: 'string', required: true },
* hosts: { type: 'array', delimiter: ',' }
* })
* ```
*
* @param schema - 环境变量定义 schema
* @param source - 数据源,默认使用 `process.env`
* @returns 转换后的类型安全结果
* @throws {Error} 当 required 字段缺失或类型转换失败时抛出
* @template T 结果类型
*/
declare function parseEnv<T extends Record<string, any>>(schema: EnvSchema<T>, source?: Record<string, string | undefined>): T;
//#endregion
export { EnvDefinition, EnvRecord, EnvSchema, EnvValueType, LoadEnvOptions, loadEnv, parseEnv, parseEnvFile };//#region src/config/merge.d.ts
type Mergeable = Record<string, any>;
/**
* 深度合并多个配置对象
*
* 数组会被直接替换,对象会递归合并。返回新对象,不会修改原始对象。
*
* @example
* ```typescript
* const merged = mergeConfig(
* { a: 1, b: { c: 2 } },
* { b: { d: 3 }, e: 4 }
* )
* // { a: 1, b: { c: 2, d: 3 }, e: 4 }
* ```
*
* @param configs - 待合并的配置对象集合,后面的会覆盖前面的
* @returns 合并后的新对象
* @template T 配置对象类型
*/
declare function mergeConfig<T extends Mergeable>(...configs: Array<Partial<T>>): T;
//#endregion
export { mergeConfig };//#region src/fs/empty-dir.d.ts
/**
* 确保目录为空
*
* 如果目录不为空,则删除目录内容。如果目录不存在,则创建该目录。
* 目录本身不会被删除。
*
* @example
* ```typescript
* // 确保目录为空
* await emptyDir('./temp')
*
* // 清空缓存目录
* await emptyDir('./cache')
*
* // 如果目录不存在,会自动创建
* await emptyDir('./new-empty-dir')
* ```
*
* @param dirPath - 目标目录路径
* @throws {Error} 当路径存在但不是目录时抛出错误
* @throws {Error} 当目录操作失败时抛出错误
*/
declare function emptyDir(dirPath: string): Promise<void>;
//#endregion
export { emptyDir };//#region src/fs/ensure-dir.d.ts
/**
* 确保目录存在
*
* 如果目录不存在则创建,包括所有父目录。如果路径已存在但不是目录,会抛出错误。
*
* @example
* ```typescript
* // 确保目录存在
* await ensureDir('./logs/app')
*
* // 创建嵌套目录
* await ensureDir('./data/2024/01')
* ```
*
* @param dirPath - 目标目录路径
* @throws {Error} 当路径存在但不是目录时抛出错误
* @throws {Error} 当目录创建失败时抛出错误
*/
declare function ensureDir(dirPath: string): Promise<void>;
//#endregion
export { ensureDir };import { DirEntry, ReadDirOptions, readDir } from "./read-dir.js";
import { ensureDir } from "./ensure-dir.js";
import { ReadJsonOptions, WriteJsonOptions, readJson, writeJson } from "./json.js";
import { RemoveOptions, removePath } from "./remove.js";
import { WriteFileData, WriteFileOptions, writeFile as writeFile$1 } from "./write-file.js";
import { emptyDir } from "./empty-dir.js";
import { MoveOptions, movePath } from "./move.js";
import { copyFile, cp as cp$1, readFile as readFile$1 } from "node:fs/promises";
import { existsSync } from "node:fs";
export { copyFile, cp$1 as cp, existsSync, readFile$1 as readFile };//#region src/fs/json.d.ts
/**
* 读取 JSON 文件选项
*/
interface ReadJsonOptions {
/** 文件编码,默认 'utf8' */
encoding?: BufferEncoding;
/** JSON.parse 的 reviver 函数 */
reviver?: Parameters<typeof JSON.parse>[1];
}
/**
* 写入 JSON 文件选项
*/
interface WriteJsonOptions {
/** 文件编码,默认 'utf8' */
encoding?: BufferEncoding;
/** JSON.stringify 的 replacer 函数 */
replacer?: Parameters<typeof JSON.stringify>[1];
/** 缩进空格数,默认 2 */
space?: Parameters<typeof JSON.stringify>[2];
/** 文件末尾换行符,默认 '\n' */
eol?: string;
}
/**
* 读取 JSON 文件并解析为对象
*
* @example
* ```typescript
* // 读取配置文件
* const config = await readJson<AppConfig>('./config.json')
*
* // 使用 reviver 转换日期
* const data = await readJson('./data.json', {
* reviver: (key, value) => {
* if (key === 'date') return new Date(value)
* return value
* }
* })
* ```
*
* @param filePath - JSON 文件路径
* @param options - 读取编码与自定义 reviver
* @returns 解析后的数据
* @throws {Error} 当文件不存在或 JSON 格式错误时抛出错误
* @template T 返回数据类型
*/
declare function readJson<T = Record<string, any>>(filePath: string, options?: ReadJsonOptions): Promise<T>;
/**
* 将数据序列化为 JSON 文件
*
* 如果目录不存在会自动创建。文件末尾会自动添加换行符。
*
* @example
* ```typescript
* // 写入配置文件
* await writeJson('./config.json', {
* port: 3000,
* debug: false
* })
*
* // 自定义格式
* await writeJson('./data.json', data, {
* space: 4,
* eol: '\r\n'
* })
* ```
*
* @param filePath - 目标文件路径
* @param data - 待写入的数据
* @param options - 编码、replacer、缩进等选项
* @throws {Error} 当文件写入失败时抛出错误
*/
declare function writeJson(filePath: string, data: unknown, options?: WriteJsonOptions): Promise<void>;
//#endregion
export { ReadJsonOptions, WriteJsonOptions, readJson, writeJson };//#region src/fs/move.d.ts
/**
* 移动路径选项
*/
interface MoveOptions {
/**
* 如果目标路径已存在,是否覆盖
* @default false
*/
overwrite?: boolean;
}
/**
* 移动文件或目录到新位置
*
* 将源路径的文件或目录移动到目标路径。源路径和目标路径类型必须一致:
* 要么都是文件,要么都是目录。
*
* @example
* ```typescript
* // 移动文件
* await movePath('./old/file.txt', './new/file.txt')
*
* // 移动目录
* await movePath('./old-dir', './new-dir')
*
* // 覆盖已存在的目标
* await movePath('./source', './target', { overwrite: true })
* ```
*
* @param src - 源路径(文件或目录)
* @param dest - 目标路径(必须与源路径类型一致)
* @param options - 移动选项
* @throws {Error} 当源路径不存在时抛出错误
* @throws {Error} 当源路径和目标路径类型不一致时抛出错误
* @throws {Error} 当目标路径已存在且 overwrite 为 false 时抛出错误
*/
declare function movePath(src: string, dest: string, options?: MoveOptions): Promise<void>;
//#endregion
export { MoveOptions, movePath };//#region src/fs/read-dir.d.ts
/**
* 目录条目信息
*/
interface DirEntry {
/** 绝对路径 */
path: string;
/** 相对于根目录的路径 */
relativePath: string;
/** 文件名或目录名 */
name: string;
/** 目录深度(从根目录开始,根目录为 0) */
depth: number;
/** 是否为文件 */
isFile: boolean;
/** 是否为目录 */
isDirectory: boolean;
/** 是否为符号链接 */
isSymbolicLink: boolean;
}
/**
* 读取目录选项
*/
interface ReadDirOptions {
/**
* 是否递归读取子目录
* @default false
*/
recursive?: boolean;
/**
* 过滤函数,返回 `true` 表示保留该条目
*/
filter?: (entry: DirEntry) => boolean;
/**
* 是否只返回文件路径
*
* - 当为 `true` 时,返回文件路径数组(string[])
* - 当为 `false` 时,返回包含文件和目录的详细信息数组(DirEntry[])
*
* @default false
*/
onlyFiles?: boolean;
}
/**
* 读取目录内容
*
* 支持递归读取、过滤和多种返回格式。
*
* @example
* ```typescript
* // 返回文件路径数组
* const files = await readDir('./src', {
* recursive: true,
* onlyFiles: true,
* filter: entry => entry.name.endsWith('.ts')
* })
*
* // 返回包含文件和目录的详细信息数组
* const entries = await readDir('./src', {
* recursive: true
* })
* ```
*
* @param dir - 起始目录路径
* @param options - 过滤、递归和返回格式选项
* @returns 当 `onlyFiles` 为 `true` 时返回文件路径数组,否则返回包含元数据的条目数组
* @throws {Error} 当目录不存在或无法读取时抛出错误
*/
declare function readDir(dir: string, options?: ReadDirOptions & {
onlyFiles?: false;
}): Promise<DirEntry[]>;
declare function readDir(dir: string, options: ReadDirOptions & {
onlyFiles: true;
}): Promise<string[]>;
//#endregion
export { DirEntry, ReadDirOptions, readDir };//#region src/fs/remove.d.ts
interface RemoveOptions {
/**
* 是否忽略不存在的路径
* @default false
*/
force?: boolean;
}
/**
* 删除文件或目录
* @param targetPath - 要删除的路径
* @param options - 删除行为控制(是否忽略不存在)
*/
declare function removePath(targetPath: string, options?: RemoveOptions): Promise<void>;
//#endregion
export { RemoveOptions, removePath };import { Readable } from "node:stream";
//#region src/fs/write-file.d.ts
/**
* 写入文件选项
*/
interface WriteFileOptions {
/** 文件编码,默认 'utf8' */
encoding?: BufferEncoding;
/**
* 文件权限模式,默认 0o666
* @example 0o644
*/
mode?: number;
/**
* 文件系统标志
* - 'w': 写入(默认),如果文件存在则截断
* - 'a': 追加,如果文件不存在则创建
* - 'wx': 写入,如果文件存在则失败
* @default 'w'
*/
flag?: 'w' | 'a' | 'wx';
}
/**
* 支持的写入数据类型
*/
type WriteFileData = string | Buffer | NodeJS.ArrayBufferView | ReadableStream<Uint8Array> | Readable | AsyncIterable<string | Buffer | NodeJS.ArrayBufferView> | Iterable<string | Buffer | NodeJS.ArrayBufferView>;
/**
* 写入文件
*
* 相比 Node.js 原生 `fs.writeFile`,此函数提供以下增强功能:
* - 自动创建父目录(如果不存在)
* - 支持 Web ReadableStream(如 fetch 响应体)
* - 支持 Node.js Readable 流
* - 支持 AsyncIterable 和 Iterable
*
* @example
* ```typescript
* // 写入字符串
* await writeFile('./logs/app.log', 'Hello World')
*
* // 写入 Buffer
* await writeFile('./data/binary.dat', Buffer.from([0x00, 0x01, 0x02]))
*
* // 写入 Web ReadableStream(如 fetch 响应)
* const response = await fetch('https://example.com/file')
* await writeFile('./downloads/file.txt', response.body!)
*
* // 追加模式
* await writeFile('./logs/app.log', 'New line\n', { flag: 'a' })
*
* // 指定编码
* await writeFile('./data/utf16.txt', 'Unicode 文本', { encoding: 'utf16le' })
* ```
*
* @param filePath - 目标文件路径
* @param data - 要写入的数据
* @param options - 写入选项
* @throws {Error} 当写入失败时抛出错误
*/
declare function writeFile(filePath: string, data: WriteFileData, options?: WriteFileOptions): Promise<void>;
//#endregion
export { WriteFileData, WriteFileOptions, writeFile };import { DirEntry, ReadDirOptions, readDir } from "./fs/read-dir.js";
import { ensureDir } from "./fs/ensure-dir.js";
import { ReadJsonOptions, WriteJsonOptions, readJson, writeJson } from "./fs/json.js";
import { RemoveOptions, removePath } from "./fs/remove.js";
import { WriteFileData, WriteFileOptions, writeFile } from "./fs/write-file.js";
import { emptyDir } from "./fs/empty-dir.js";
import { MoveOptions, movePath } from "./fs/move.js";
import { copyFile, cp, existsSync, readFile } from "./fs/index.js";
import { EnvDefinition, EnvRecord, EnvSchema, EnvValueType, LoadEnvOptions, loadEnv, parseEnv, parseEnvFile } from "./config/env.js";
import { ConfigFormat, LoadConfigOptions, loadConfig } from "./config/config.js";
import { mergeConfig } from "./config/merge.js";
import { ConsoleTransport, ConsoleTransportOptions, FileTransport, FileTransportOptions, Transport } from "./logger/transports.js";
import { LogEntry, LogFormat, LogLevel, Logger, LoggerOptions, TextFormatConfig, TextFormatVars, TextFormatter } from "./logger/logger.js";
import { LRUCache, LRUCacheOptions } from "./cache/lru-cache.js";
import { FileCache, FileCacheOptions } from "./cache/file-cache.js";
import { CacheAdapter, MemoizeOptions, memoize } from "./cache/memoize.js";
import { PortCheckOptions, isPortAvailable } from "./net/port.js";
import { GetLocalIPOptions, getLocalIP } from "./net/ip.js";
import { CpuInfo, CpuUsage, getCpuInfo, getCpuUsage } from "./system/cpu.js";
import { MemoryInfo, getMemoryInfo } from "./system/memory.js";
import { DiskInfo, getDiskInfo } from "./system/disk.js";
import { GetNetworkInterfacesOptions, NetworkInterfaceInfo, getNetworkInterfaces } from "./system/network.js";
import { CronExpression, CronFieldConfig, parseCron } from "./scheduler/cron.js";
import { Scheduler, TaskFunction, TaskInfo } from "./scheduler/scheduler.js";
export { CacheAdapter, ConfigFormat, ConsoleTransport, ConsoleTransportOptions, CpuInfo, CpuUsage, CronExpression, CronFieldConfig, DirEntry, DiskInfo, EnvDefinition, EnvRecord, EnvSchema, EnvValueType, FileCache, FileCacheOptions, FileTransport, FileTransportOptions, GetLocalIPOptions, GetNetworkInterfacesOptions, LRUCache, LRUCacheOptions, LoadConfigOptions, LoadEnvOptions, LogEntry, LogFormat, LogLevel, Logger, LoggerOptions, MemoizeOptions, MemoryInfo, MoveOptions, NetworkInterfaceInfo, PortCheckOptions, ReadDirOptions, ReadJsonOptions, RemoveOptions, Scheduler, TaskFunction, TaskInfo, TextFormatConfig, TextFormatVars, TextFormatter, Transport, WriteFileData, WriteFileOptions, WriteJsonOptions, copyFile, cp, emptyDir, ensureDir, existsSync, getCpuInfo, getCpuUsage, getDiskInfo, getLocalIP, getMemoryInfo, getNetworkInterfaces, isPortAvailable, loadConfig, loadEnv, memoize, mergeConfig, movePath, parseCron, parseEnv, parseEnvFile, readDir, readFile, readJson, removePath, writeFile, writeJson };import { Transport } from "./transports.js";
//#region src/logger/logger.d.ts
/**
* 日志格式类型
*/
type LogFormat = 'text' | 'json';
/**
* 日志级别枚举
*/
declare enum LogLevel {
/** 调试信息 */
DEBUG = "debug",
/** 一般信息 */
INFO = "info",
/** 警告信息 */
WARN = "warn",
/** 错误信息 */
ERROR = "error"
}
/**
* 日志条目
*/
interface LogEntry {
/** 日志级别 */
level: LogLevel;
/** 日志消息 */
message: string;
/** 时间戳 */
timestamp: string;
/** 日志器名称 */
name?: string;
/** 附加元数据 */
meta?: Record<string, unknown>;
/** 错误信息(如果有) */
error?: {
message: string;
stack?: string;
};
}
/**
* Text 格式化变量
*/
interface TextFormatVars {
/** 时间戳 */
timestamp: string;
/** 日志级别 */
level: string;
/** 日志器名称 */
name?: string;
/** 日志消息 */
message: string;
/** 附加元数据 JSON */
meta?: string;
/** 错误信息 */
error?: string;
}
/**
* Text 格式化函数
*/
type TextFormatter = (vars: TextFormatVars, entry: LogEntry) => string;
/**
* Text 格式化配置
* - 字符串:使用 {} 引用变量,如 '{timestamp} [{level}] {message}'
* - 函数:回调函数,接收变量对象
*/
type TextFormatConfig = string | TextFormatter;
/**
* 日志器选项
*/
interface LoggerOptions {
/** 日志器名称 */
name?: string;
/** 最低日志级别,低于此级别的日志不会被输出 */
level?: LogLevel;
/** 日志格式,'text' 为文本格式,'json' 为 JSON 格式 */
format?: LogFormat;
/** 传输器列表,用于输出日志 */
transports?: Transport[];
/** 上下文信息,会附加到所有日志条目 */
context?: Record<string, unknown>;
/** 时间戳格式,默认 'yyyy-MM-dd HH:mm:ss' */
timestampFormat?: string;
/** 是否使用 UTC 时间,默认 false */
utc?: boolean;
/** Text 格式化配置(仅 format='text' 时生效) */
textFormat?: TextFormatConfig;
}
/**
* 结构化日志记录器
*
* 支持多级别日志、多种输出格式、多个传输器。
*
* @example
* ```typescript
* const logger = new Logger({
* name: 'app',
* level: LogLevel.INFO,
* format: 'json',
* transports: [
* new ConsoleTransport(),
* new FileTransport({ path: './logs' })
* ]
* })
*
* await logger.info('Server started', { port: 3000 })
* await logger.error('Failed to connect', error)
*
* // 使用自定义 text 格式
* const customLogger = new Logger({
* format: 'text',
* textFormat: '[{timestamp}] {level} - {message}'
* })
*
* // 使用函数格式化
* const fnLogger = new Logger({
* format: 'text',
* textFormat: (vars) => `${vars.timestamp} | ${vars.message}`
* })
* ```
*/
declare class Logger {
private readonly level;
private readonly format;
private readonly timestampFormat;
private readonly utc;
private readonly transports;
private readonly name?;
private readonly context?;
private readonly textFormat?;
/**
* 创建日志器实例
* @param options - 日志器选项
*/
constructor(options?: LoggerOptions);
/**
* 生成时间戳
*/
private getTimestamp;
private buildEntry;
private logInternal;
/**
* 记录日志
*
* @param level - 日志级别
* @param message - 日志消息
* @param meta - 附加元数据
* @param error - 错误对象(如果有)
*/
log(level: LogLevel, message: string, meta?: Record<string, unknown>, error?: Error): Promise<void>;
/**
* 记录 DEBUG 级别日志
* @param message - 日志消息
* @param meta - 附加元数据
*/
debug(message: string, meta?: Record<string, unknown>): Promise<void>;
/**
* 记录 INFO 级别日志
* @param message - 日志消息
* @param meta - 附加元数据
*/
info(message: string, meta?: Record<string, unknown>): Promise<void>;
/**
* 记录 WARN 级别日志
* @param message - 日志消息
* @param meta - 附加元数据
*/
warn(message: string, meta?: Record<string, unknown>): Promise<void>;
/**
* 记录 ERROR 级别日志
*
* @param message - 日志消息
* @param errorOrMeta - 错误对象或元数据
* @param meta - 附加元数据(当第一个参数是错误对象时使用)
*/
error(message: string, errorOrMeta?: Error | Record<string, unknown>, meta?: Record<string, unknown>): Promise<void>;
}
//#endregion
export { LogEntry, LogFormat, LogLevel, Logger, LoggerOptions, TextFormatConfig, TextFormatVars, TextFormatter };import { LogEntry, LogFormat, LogLevel } from "./logger.js";
//#region src/logger/transports.d.ts
/**
* 日志传输器接口
*
* 用于将日志输出到不同的目标(控制台、文件等)。
*/
interface Transport {
/** 最低日志级别,低于此级别的日志不会被输出 */
level?: LogLevel;
/**
* 写入日志条目
*
* @param entry - 日志条目
* @param formatted - 格式化后的日志字符串
* @param format - 日志格式
*/
write(entry: LogEntry, formatted: string, format: LogFormat): void | Promise<void>;
}
/**
* 控制台传输器选项
*/
interface ConsoleTransportOptions {
/** 是否使用颜色,默认 true */
useColors?: boolean;
/** 日志级别 */
level?: LogLevel;
}
/**
* 控制台日志传输器
*
* 将日志输出到控制台,支持颜色高亮。
*
* @example
* ```typescript
* const transport = new ConsoleTransport({ useColors: true })
* const logger = new Logger({ transports: [transport] })
* ```
*/
declare class ConsoleTransport implements Transport {
private readonly options;
level?: LogLevel;
/**
* 创建控制台传输器实例
* @param options - 传输器选项
*/
constructor(options?: ConsoleTransportOptions);
write(entry: LogEntry, formatted: string, format: LogFormat): void;
}
/**
* 文件传输器选项
*/
interface FileTransportOptions {
/**
* 日志路径,可以是目录或文件
* - 目录:日志文件按日期命名(如 2024-01-15.log)
* - 文件:直接写入该文件
*/
path: string;
/** 最大文件大小(字节),超过此大小会自动轮转或创建新文件 */
maxSize?: number;
/** 换行符,默认 '\n' */
newline?: string;
/** 日志级别 */
level?: LogLevel;
}
/**
* 文件日志传输器
*
* 将日志写入文件,支持文件大小轮转和目录模式。
*
* @example
* ```typescript
* // 文件模式:超过大小时轮转
* const transport = new FileTransport({
* path: './logs/app.log',
* maxSize: 10 * 1024 * 1024 // 10MB
* })
*
* // 目录模式:按日期创建新文件
* const transport = new FileTransport({
* path: './logs',
* maxSize: 10 * 1024 * 1024 // 10MB
* })
* ```
*/
declare class FileTransport implements Transport {
private readonly options;
level?: LogLevel;
private queue;
private isDirectory;
/**
* 创建文件传输器实例
* @param options - 传输器选项
*/
constructor(options: FileTransportOptions);
write(_: LogEntry, formatted: string, _format: LogFormat): Promise<void>;
/**
* 获取当前日志文件路径
*/
private getLogFilePath;
private writeInternal;
/**
* 处理文件大小限制
*/
private handleSizeLimit;
}
//#endregion
export { ConsoleTransport, ConsoleTransportOptions, FileTransport, FileTransportOptions, Transport };{
"generatedAt": "2026-06-22T15:20:06.138Z",
"npmName": "@cat-kit/be",
"version": "1.1.6",
"kind": "dts",
"artifactCount": 25
}//#region src/net/ip.d.ts
/**
* 获取本地 IP 地址选项
*/
interface GetLocalIPOptions {
/** IP 地址族,默认 'IPv4' */
family?: 'IPv4' | 'IPv6';
/** 是否包含内网地址,默认 false(只返回公网地址) */
includeInternal?: boolean;
}
/**
* 获取本机网卡的首个匹配 IP 地址
*
* 遍历所有网络接口,返回第一个匹配条件的 IP 地址。
*
* @example
* ```typescript
* // 获取公网 IPv4 地址
* const ip = getLocalIP({ family: 'IPv4' })
*
* // 获取包含内网的 IPv6 地址
* const ip = getLocalIP({ family: 'IPv6', includeInternal: true })
* ```
*
* @param options - 地址族与是否包含内网地址
* @returns 匹配到的 IP 地址,若不存在则为 `undefined`
*/
declare function getLocalIP(options?: GetLocalIPOptions): string | undefined;
//#endregion
export { GetLocalIPOptions, getLocalIP };//#region src/net/port.d.ts
/**
* 端口检查选项
*/
interface PortCheckOptions {
/** 主机地址,默认 '127.0.0.1' */
host?: string;
/** 超时时间(毫秒),默认 1000 */
timeout?: number;
}
/**
* 检查端口是否可用
*
* 通过尝试在该端口上创建服务器来判断端口是否被占用。
*
* @example
* ```typescript
* // 检查本地 3000 端口
* const available = await isPortAvailable(3000)
* if (available) {
* // 启动服务器
* }
*
* // 检查指定主机的端口
* const available = await isPortAvailable(8080, {
* host: '0.0.0.0',
* timeout: 2000
* })
* ```
*
* @param port - 目标端口号
* @param options - 主机地址和超时时间选项
* @returns 端口可用时返回 `true`,被占用或超时返回 `false`
*/
declare function isPortAvailable(port: number, options?: PortCheckOptions): Promise<boolean>;
//#endregion
export { PortCheckOptions, isPortAvailable };本目录由脚本生成,勿手改。内容为 @cat-kit/be 包 dist 下 .d.ts 的镜像(与 npm typings 对齐)。
- 入口:通常从
index.d.ts起读(若有)。 - 元数据:
manifest.json
//#region src/scheduler/cron.d.ts
/**
* Cron 字段配置
*/
interface CronFieldConfig {
/** 最小值 */
min: number;
/** 最大值 */
max: number;
}
/**
* Cron 表达式解析器
*
* 支持标准的 5 位 Cron 表达式格式:`分钟 小时 日 月 星期`
*
* @example
* ```typescript
* const cron = new CronExpression('0 2 * * *') // 每天凌晨 2 点
* const next = cron.getNextDate() // 获取下次执行时间
*
* // 支持范围、步长和列表
* const cron2 = new CronExpression('0 9-17 * * 1-5') // 工作日上午 9 点到下午 5 点
* const cron3 = new CronExpression('*\/5 * * * *') // 每 5 分钟
* ```
*/
declare class CronExpression {
private readonly minutes;
private readonly hours;
private readonly days;
private readonly months;
private readonly weekdays;
/**
* 创建 Cron 表达式实例
*
* @param expression - 5 位 Cron 表达式字符串
* @throws {Error} 当表达式格式不正确时抛出错误
*/
constructor(expression: string);
/**
* 获取下一次执行时间
*
* @param from - 起始时间,默认使用当前时间
* @returns 下一次执行时间,如果无法找到则返回 `null`
*/
getNextDate(from?: Date): Date | null;
}
/**
* 解析 Cron 表达式
*
* 便捷函数,等同于 `new CronExpression(expression)`。
*
* @param expression - 5 位 Cron 表达式字符串
* @returns CronExpression 实例
* @throws {Error} 当表达式格式不正确时抛出错误
*/
declare function parseCron(expression: string): CronExpression;
//#endregion
export { CronExpression, CronFieldConfig, parseCron };import { CronExpression } from "./cron.js";
//#region src/scheduler/scheduler.d.ts
/**
* 任务函数类型
*/
type TaskFunction = () => void | Promise<void>;
/**
* 任务类型
*/
type TaskType = 'cron' | 'timeout' | 'interval';
/**
* 任务信息
*/
interface TaskInfo {
/** 任务 ID */
id: string;
/** 任务类型 */
type: TaskType;
/** 下次执行时间 */
nextRun?: Date;
/** 是否正在运行 */
running: boolean;
}
/**
* 任务调度器
*
* 支持 Cron 表达式、延迟执行和定时执行三种任务类型。
*
* @example
* ```typescript
* const scheduler = new Scheduler()
*
* // Cron 任务
* scheduler.schedule('backup', '0 2 * * *', async () => {
* await backupDatabase()
* })
*
* // 延迟执行
* scheduler.once('cleanup', 3600000, () => {
* cleanupTempFiles()
* })
*
* // 定时执行
* scheduler.interval('heartbeat', 30000, () => {
* sendHeartbeat()
* })
*
* scheduler.start()
* ```
*/
declare class Scheduler {
private readonly tasks;
private running;
schedule(id: string, cron: string | CronExpression, task: TaskFunction): void;
/**
* 调度延迟执行任务(只执行一次)
*
* @param id - 任务唯一标识
* @param delay - 延迟时间(毫秒)
* @param task - 要执行的任务函数
* @throws {Error} 当 delay 小于 0 时抛出错误
*/
once(id: string, delay: number, task: TaskFunction): void;
/**
* 调度定时执行任务(重复执行)
*
* @param id - 任务唯一标识
* @param interval - 执行间隔(毫秒)
* @param task - 要执行的任务函数
* @throws {Error} 当 interval 小于等于 0 时抛出错误
*/
interval(id: string, interval: number, task: TaskFunction): void;
/**
* 取消任务
*
* @param id - 任务 ID
* @returns 如果任务存在并成功取消返回 `true`,否则返回 `false`
*/
cancel(id: string): boolean;
/**
* 启动调度器
*
* 开始执行所有已添加的任务。如果调度器已经在运行,则不会重复启动。
*/
start(): void;
/**
* 停止调度器
*
* 停止所有任务的执行,但不会删除任务。可以再次调用 `start()` 恢复执行。
*/
stop(): void;
/**
* 获取指定任务的信息
*
* @param id - 任务 ID
* @returns 任务信息,如果任务不存在返回 `undefined`
*/
getTask(id: string): TaskInfo | undefined;
/**
* 获取所有任务的信息
*
* @returns 所有任务的信息数组
*/
getTasks(): TaskInfo[];
private addTask;
private planTask;
private planCronTask;
private planTimeoutTask;
private planIntervalTask;
private executeTask;
}
//#endregion
export { Scheduler, TaskFunction, TaskInfo };//#region src/system/cpu.d.ts
/**
* CPU 基本信息
*/
interface CpuInfo {
/** CPU 型号 */
model: string;
/** CPU 核心数 */
cores: number;
/** CPU 主频(MHz) */
speed: number;
/** 系统平均负载(1分钟、5分钟、15分钟) */
loadAverage: [number, number, number];
}
/**
* CPU 使用情况
*/
interface CpuUsage {
/** 用户态时间(毫秒) */
user: number;
/** 系统态时间(毫秒) */
system: number;
/** 空闲时间(毫秒) */
idle: number;
/** 总时间(毫秒) */
total: number;
/** CPU 使用率(百分比) */
percent: number;
}
/**
* 获取 CPU 基本信息
*
* @returns CPU 型号、核心数、主频与平均负载
*/
declare function getCpuInfo(): CpuInfo;
/**
* 采样 CPU 使用情况
*
* 通过采样一段时间内的 CPU 时间来计算使用率。
*
* @param interval - 采样间隔(毫秒),默认 500ms
* @returns 采样区间内的 CPU 使用统计
*/
declare function getCpuUsage(interval?: number): Promise<CpuUsage>;
//#endregion
export { CpuInfo, CpuUsage, getCpuInfo, getCpuUsage };//#region src/system/disk.d.ts
/**
* 磁盘信息
*/
interface DiskInfo {
/** 磁盘路径 */
path: string;
/** 总容量(字节) */
total: number;
/** 空闲容量(字节) */
free: number;
/** 已用容量(字节) */
used: number;
/** 使用率(百分比) */
usedPercent: number;
}
/**
* 获取指定路径所在磁盘的容量信息
*
* 支持 Windows 和 Unix 系统。Windows 使用 PowerShell 查询,Unix 使用 `statfs`。
*
* @param path - 目标路径,默认使用当前工作目录
* @returns 磁盘容量、剩余与使用信息
* @throws {Error} 当无法获取磁盘信息时抛出错误
*/
declare function getDiskInfo(path?: string): Promise<DiskInfo>;
//#endregion
export { DiskInfo, getDiskInfo };//#region src/system/memory.d.ts
/**
* 内存信息
*/
interface MemoryInfo {
/** 总内存(字节) */
total: number;
/** 空闲内存(字节) */
free: number;
/** 已用内存(字节) */
used: number;
/** 内存使用率(百分比) */
usedPercent: number;
}
/**
* 获取系统内存使用情况
*
* @returns 总量、空闲、已用及使用率
*/
declare function getMemoryInfo(): MemoryInfo;
//#endregion
export { MemoryInfo, getMemoryInfo };//#region src/system/network.d.ts
/**
* 网络接口信息
*/
interface NetworkInterfaceInfo {
/** 接口名称 */
name: string;
/** IP 地址 */
address: string;
/** 地址族 */
family: 'IPv4' | 'IPv6';
/** MAC 地址 */
mac: string;
/** 是否为内网地址 */
internal: boolean;
/** 子网掩码 */
netmask: string;
/** CIDR 表示法(如果有) */
cidr?: string;
}
/**
* 获取网络接口选项
*/
interface GetNetworkInterfacesOptions {
/** 是否包含内网地址,默认 false */
includeInternal?: boolean;
}
/**
* 获取本机网络接口信息
*
* @param options - 控制是否包含内部地址
* @returns 网络接口列表
*/
declare function getNetworkInterfaces(options?: GetNetworkInterfacesOptions): NetworkInterfaceInfo[];
//#endregion
export { GetNetworkInterfacesOptions, NetworkInterfaceInfo, getNetworkInterfaces };export { };{
"generatedAt": "2026-06-22T15:20:06.138Z",
"npmName": "@cat-kit/cli",
"version": "1.0.6",
"kind": "dts",
"artifactCount": 1
}本目录由脚本生成,勿手改。内容为 @cat-kit/cli 包 dist 下 .d.ts 的镜像(与 npm typings 对齐)。
- 入口:通常从
index.d.ts起读(若有)。 - 元数据:
manifest.json
import { ITreeNode, TreeNode } from "./tree.js";
//#region src/data-structure/forest.d.ts
type Obj = Record<string, unknown>;
/**
* 森林节点接口
* @template T - 原始数据类型
* @template Self - 节点自身类型
*/
interface IForestNode<T extends Obj = Obj, Self = IForestNode<T, unknown>> extends ITreeNode<T, Self> {
/** 所属森林实例 */
forest: Forest<T, Self extends Obj ? Self : Obj>;
}
/**
* 森林节点类 - 支持根节点级别的移除操作
* @template T - 原始数据类型
* @template Self - 节点自身类型,用于继承时的类型推导
*
* @example
* class MyForestNode<T extends Obj> extends ForestNode<T, MyForestNode<T>> {
* selected = false
* }
*/
declare class ForestNode<T extends Obj = Obj, Self extends ForestNode<T, Self> = ForestNode<T, any>> extends TreeNode<T, Self> {
/** 索引签名,支持动态属性访问 */
[key: string]: unknown;
readonly forest: Forest<T, Self>;
constructor(data: T, index: number, depth: number, forest: Forest<T, Self>, parent?: Self);
remove(): void;
}
/**
* 节点创建函数类型
*/
type ForestNodeCreator<T extends Obj, Node extends Obj> = (data: T, index: number, depth: number, forest: Forest<T, Node>, parent: Node | undefined) => Node;
/**
* Forest 配置选项(基础)
*/
interface ForestOptionsBase<T extends Obj> {
data: T[];
childrenKey?: string;
}
/**
* Forest 配置选项(带 createNode)
*/
interface ForestOptionsWithCreator<T extends Obj, Node extends Obj> extends ForestOptionsBase<T> {
createNode: ForestNodeCreator<T, Node>;
}
/**
* 森林管理器 - 管理多棵树
* @template T - 原始数据类型
* @template Node - 节点类型
*
* @example
* // 使用自定义节点
* const forest = new Forest({
* data: [{ id: 1 }, { id: 2, children: [{ id: 3 }] }],
* createNode: (data, index, depth, forest, parent) => ({
* data,
* index,
* depth,
* forest,
* parent,
* get isLeaf() { return !data.children?.length }
* })
* })
*/
declare class Forest<T extends Obj, Node extends Obj = T> {
roots: Node[];
protected childrenKey: string;
protected nodeCreator?: ForestNodeCreator<T, Node>;
constructor(options: ForestOptionsBase<T>);
constructor(options: ForestOptionsWithCreator<T, Node>);
/**
* 构建单棵树
*/
protected buildTree(data: T, rootIndex: number): Node;
/**
* 深度优先遍历所有树
* @param callback - 回调函数,返回 true 时提前终止当前树的遍历
*/
dfs(callback: (node: Node, index: number, parent?: Node) => void | boolean): void;
/**
* 广度优先遍历所有树
* @param callback - 回调函数,返回 true 时提前终止当前树的遍历
*/
bfs(callback: (node: Node, index: number, parent?: Node) => void | boolean): void;
/**
* 扁平化所有树为数组
* @param filter - 可选的过滤函数
*/
flatten(filter?: (node: Node) => boolean): Node[];
/**
* 查找单个节点
* @param predicate - 匹配函数
* @returns 第一个符合条件的节点,未找到返回 null
*/
find(predicate: (node: Node) => boolean): Node | null;
/**
* 查找所有符合条件的节点
* @param predicate - 匹配函数
*/
findAll(predicate: (node: Node) => boolean): Node[];
/**
* 获取所有叶子节点
*/
getLeaves(): Node[];
/**
* 获取节点总数
*/
get size(): number;
/**
* 计算所有树的最大深度
*/
getMaxDepth(): number;
/**
* 获取节点的可见后代(用于虚拟滚动的增量更新)
*
* @param node - 目标节点
* @param isExpanded - 判断节点是否展开的函数
* @returns 可见后代节点数组(深度优先顺序)
*/
getVisibleDescendants(node: Node, isExpanded: (node: Node) => boolean): Node[];
/**
* 计算节点的可见后代数量(用于虚拟滚动的增量更新)
*
* @param node - 目标节点
* @param isExpanded - 判断节点是否展开的函数
* @returns 可见后代节点数量
*/
getVisibleDescendantCount(node: Node, isExpanded: (node: Node) => boolean): number;
/**
* 扁平化森林为数组(仅包含可见节点,用于虚拟滚动)
*
* @param isExpanded - 判断节点是否展开的函数
* @returns 可见节点数组(深度优先顺序)
*/
flattenVisible(isExpanded: (node: Node) => boolean): Node[];
}
//#endregion
export { Forest, ForestNode, ForestNodeCreator, ForestOptionsBase, ForestOptionsWithCreator, IForestNode };//#region src/data-structure/tree.d.ts
type Obj = Record<string, unknown>;
type Callback<Node extends Obj> = (node: Node, index: number, parent?: Node) => void | boolean;
/**
* 深度优先遍历
* @param data - 根节点
* @param cb - 回调函数,返回 true 时提前终止遍历
* @param childrenKey - 子节点属性名
* @returns 如果提前终止返回 true
*/
declare function dfs<T extends Obj>(data: T, cb: Callback<T>, childrenKey?: string): boolean | void;
/**
* 广度优先遍历
* @param data - 根节点
* @param cb - 回调函数,返回 true 时提前终止遍历
* @param childrenKey - 子节点属性名
* @returns 如果提前终止返回 true
*/
declare function bfs<T extends Obj>(data: T, cb: Callback<T>, childrenKey?: string): boolean | void;
/**
* 树节点接口
* @template T - 原始数据类型
* @template Self - 节点自身类型,用于 parent/children 的递归类型定义
*
* @example
* // 简单使用
* type Node = ITreeNode<DataItem>
*
* // 扩展使用 - 让 parent/children 类型与扩展后的接口一致
* interface MyNode extends ITreeNode<DataItem, MyNode> {
* extra: string
* }
*/
interface ITreeNode<T extends Obj = Obj, Self = ITreeNode<T, unknown>> {
data: T;
depth: number;
index: number;
isLeaf: boolean;
parent?: Self;
children?: Self[];
}
/**
* 树节点类 - 提供节点操作方法
* @template T - 原始数据类型
* @template Self - 节点自身类型,用于继承时的类型推导
*
* @example
* // 直接使用
* const node = new TreeNode(data, 0, 0)
*
* // 继承扩展
* class MyTreeNode<T extends Obj> extends TreeNode<T, MyTreeNode<T>> {
* extra: string = ''
* }
*/
declare class TreeNode<T extends Obj = Obj, Self extends TreeNode<T, Self> = TreeNode<T, any>> implements ITreeNode<T, Self> {
data: T;
/** 父节点 */
parent?: Self;
/** 子节点 */
children?: Self[];
/** 在树中的深度,从零开始 */
depth: number;
/** 在树中的索引 */
index: number;
get isLeaf(): boolean;
constructor(data: T, index: number, depth: number, parent?: Self);
/** 移除当前节点 */
remove(): void;
/**
* 插入子节点
* @param node - 要插入的节点
* @param index - 插入位置,默认追加到末尾
*/
insert(node: Self, index?: number): void;
/**
* 获取从根节点到当前节点的路径
* @returns 路径数组,从根节点到当前节点
*/
getPath(): Self[];
/**
* 获取所有祖先节点
* @returns 祖先节点数组,从父节点到根节点
*/
getAncestors(): Self[];
/**
* 检查是否为指定节点的祖先
*/
isAncestorOf(node: Self): boolean;
/**
* 检查是否为指定节点的后代
*/
isDescendantOf(node: Self): boolean;
/**
* 获取可见后代节点(用于虚拟滚动的增量更新)
* @param isExpanded - 判断节点是否展开的函数
* @returns 可见后代节点数组(深度优先顺序)
*
* @example
* // 展开节点时,获取需要插入的节点
* const descendants = node.getVisibleDescendants(n => n.expanded)
* flatList.splice(nodeIndex + 1, 0, ...descendants)
*/
getVisibleDescendants(isExpanded: (node: Self) => boolean): Self[];
/**
* 计算可见后代节点数量(用于虚拟滚动的增量更新)
* @param isExpanded - 判断节点是否展开的函数
* @returns 可见后代节点数量
*
* @example
* // 折叠节点时,计算需要移除的节点数量
* const count = node.getVisibleDescendantCount(n => n.expanded)
* flatList.splice(nodeIndex + 1, count)
*/
getVisibleDescendantCount(isExpanded: (node: Self) => boolean): number;
}
/**
* 节点创建函数类型
* @template T - 原始数据类型
* @template Node - 创建的节点类型
*/
type NodeCreator<T extends Obj, Node> = (data: T, index: number, depth: number, parent: Node | undefined) => Node;
/**
* TreeManager 配置选项(不带 createNode)
*/
interface TreeManagerOptionsBase {
childrenKey?: string;
}
/**
* TreeManager 配置选项(带 createNode)
*/
interface TreeManagerOptionsWithCreator<T extends Obj, Node> extends TreeManagerOptionsBase {
createNode: NodeCreator<T, Node>;
}
/**
* 树管理器 - 用于构建和管理树结构
* @template T - 原始数据类型
* @template Node - 节点类型
*
* @example
* // 不使用 createNode,直接使用原始数据
* const tree = new TreeManager(data)
*
* // 使用 createNode 创建自定义节点
* const tree = new TreeManager(data, {
* createNode: (data, index, depth, parent) => ({
* data,
* index,
* depth,
* get isLeaf() { return !data.children?.length },
* parent
* })
* })
*/
declare class TreeManager<T extends Obj, Node extends Obj = T> {
protected _root: Node;
get root(): Node;
protected nodeCreator?: NodeCreator<T, Node>;
protected childrenKey: string;
/**
* 构造函数 - 不使用 createNode
*/
constructor(data: T, options?: TreeManagerOptionsBase);
/**
* 构造函数 - 使用 createNode
*/
constructor(data: T, options: TreeManagerOptionsWithCreator<T, Node>);
/**
* 从原始数据构建节点树
*/
protected buildTree(data: T): Node;
/**
* 深度优先遍历
* @param callback - 回调函数,返回 true 时提前终止
*/
dfs(callback: (node: Node, index: number, parent?: Node) => void | boolean): void;
/**
* 广度优先遍历
* @param callback - 回调函数,返回 true 时提前终止
*/
bfs(callback: (node: Node, index: number, parent?: Node) => void | boolean): void;
/**
* 扁平化树为数组
* @param filter - 可选的过滤函数
* @returns 节点数组
*/
flatten(filter?: (node: Node) => boolean): Node[];
/**
* 查找单个节点
* @param predicate - 匹配函数
* @returns 第一个符合条件的节点,未找到返回 null
*/
find(predicate: (node: Node) => boolean): Node | null;
/**
* 查找所有符合条件的节点
* @param predicate - 匹配函数
* @returns 所有符合条件的节点数组
*/
findAll(predicate: (node: Node) => boolean): Node[];
/**
* 获取所有叶子节点
*/
getLeaves(): Node[];
/**
* 获取指定深度的所有节点
* @param depth - 目标深度
*/
getNodesAtDepth(depth: number): Node[];
/**
* 计算树的最大深度
*/
getMaxDepth(): number;
/**
* 获取节点的可见后代(用于虚拟滚动的增量更新)
*
* @param node - 目标节点
* @param isExpanded - 判断节点是否展开的函数
* @returns 可见后代节点数组(深度优先顺序)
*
* @example
* // 展开节点时,获取需要插入的节点
* const descendants = tree.getVisibleDescendants(node, n => n.expanded)
* flatList.splice(nodeIndex + 1, 0, ...descendants)
*/
getVisibleDescendants(node: Node, isExpanded: (node: Node) => boolean): Node[];
/**
* 计算节点的可见后代数量(用于虚拟滚动的增量更新)
*
* @param node - 目标节点
* @param isExpanded - 判断节点是否展开的函数
* @returns 可见后代节点数量
*
* @example
* // 折叠节点时,计算需要移除的节点数量
* const count = tree.getVisibleDescendantCount(node, n => n.expanded)
* flatList.splice(nodeIndex + 1, count)
*/
getVisibleDescendantCount(node: Node, isExpanded: (node: Node) => boolean): number;
/**
* 扁平化树为数组(仅包含可见节点,用于虚拟滚动)
*
* @param isExpanded - 判断节点是否展开的函数
* @returns 可见节点数组(深度优先顺序)
*
* @example
* // 初始化时获取可见节点列表
* const flatList = tree.flattenVisible(n => n.expanded)
*/
flattenVisible(isExpanded: (node: Node) => boolean): Node[];
}
//#endregion
export { ITreeNode, NodeCreator, TreeManager, TreeManagerOptionsBase, TreeManagerOptionsWithCreator, TreeNode, bfs, dfs };//#region src/data/array.d.ts
type Last<T> = T extends [...any, infer L] ? L : T extends (infer P)[] ? P : undefined;
/**
* 获取数组最后一位
* @param arr 数组
*/
declare function last<T extends any[]>(arr: [...T]): Last<T>;
declare function last<T extends any[]>(arr: readonly [...T]): Last<T>;
/**
* 合并多个数组并去重
* @param arrList 任意多个数组
*/
declare function union<T>(...arrList: T[][]): T[];
/**
* 合并多个对象数组,并指定去重字段
* @param key 按照这个字段进行去重
* @param arrList 任意多个数组
*/
declare function unionBy<T extends Record<string, any>>(key: string, ...arrList: T[][]): T[];
/**
* 数组从右到左的回调
* @param arr 数组
* @param cb 回调
*/
declare function eachRight<T>(arr: T[], cb: (v: T, i: number, arr: T[]) => void): void;
/**
* 丢弃数组中指定的索引的元素
* @param arr 数组
* @param indexes 索引或者索引列表
*/
declare function omitArr<T>(arr: T[], indexes: number | number[]): T[];
declare class Arr<T> {
private _source;
constructor(arr: T[]);
/**
* 从右往左遍历
* @param cb 回调
*/
eachRight(cb: (v: T, i: number, arr: T[]) => void): void;
/**
* 丢弃元素
* @param index 索引
* @returns
*/
omit(index: number | number[]): T[];
/**
* 查询
* @param condition 查询条件
* @returns
*/
find(condition: Record<string, any>): T | undefined;
/** 最后一个元素 */
get last(): T | undefined;
/**
* 移动元素至某个新的位置
* @param from 原索引
* @param to 目标索引
* @returns
*/
move(from: number, to: number): T[];
/**
* 分组,返回一个对象,key为分组的值,value为分组的元素
* @param cb 分组回调, 返回值为分组的值
* @returns 分组后的对象
*/
groupBy<K extends string | number>(cb: (item: T) => K): Record<K, T[]>;
}
declare function arr<T>(arr: T[]): Arr<T>;
//#endregion
export { arr, eachRight, last, omitArr, union, unionBy };import { CurrencyConfig } from "./number/format.js";
import { Num } from "./number/num.js";
//#region src/data/number.d.ts
/** 数字格式化选项 */
interface NumberFormatOptions {
/** 数字格式的样式 decimal:十进制, currency货币, percent百分比 */
style?: 'decimal' | 'currency' | 'percent';
/** 货币符号, 如果style为currency则默认CNY人民币 */
currency?: 'CNY' | 'USD' | 'JPY' | 'EUR';
/** 小数精度(小数点位数) */
precision?: number;
/** 最大小数位数, 默认3 */
maximumFractionDigits?: number;
/** 最小小数位数 */
minimumFractionDigits?: number;
/** 表现方法, standard: 标准, scientific: 科学计数法, engineering: 引擎, compact: 简洁计数 */
notation?: Intl.NumberFormatOptions['notation'];
}
/**
* 创建一个 Num 实例,用于链式调用
* @param n 数字
* @example n(1234.56).currency('CNY') // '1,234.56'
*/
declare function n(n: number): Num;
declare const $n: {
/**
* 创建数字格式化器
* @param options 格式化选项
*/
formatter(options: NumberFormatOptions): Intl.NumberFormat;
/**
* 依次相加 (解决浮点数精度问题)
* @param numbers 数字列表,支持 number 或 string(string 可避免大数精度丢失)
* @returns 相加结果
* @example $n.plus(0.1, 0.2) // 0.3
* @example $n.plus('1234567890123456.1', '0.1') // 1234567890123456.2
*/
plus(...numbers: (number | string)[]): number;
/**
* 依次相减 (解决浮点数精度问题)
* @param numbers 数字列表,支持 number 或 string
* @returns 相减结果
* @example $n.minus(1.0, 0.9) // 0.1
*/
minus(...numbers: (number | string)[]): number;
/**
* 两数相乘 (解决浮点数精度问题)
* @param num1 数字1
* @param num2 数字2
* @returns 相乘结果
* @example $n.mul(19.9, 100) // 1990
*/
mul(num1: number | string, num2: number | string): number;
/**
* 两数相除 (解决浮点数精度问题)
* @param num1 被除数
* @param num2 除数
* @returns 相除结果
* @example $n.div(0.3, 0.1) // 3
*/
div(num1: number | string, num2: number | string): number;
/**
* 求和 (同 plus)
* @param numbers 需要求和的数字
* @returns 总和
*/
sum(...numbers: (number | string)[]): number;
/**
* 计算表达式
* @param expr 表达式字符串, 如 '1 + 3 * (4 / 2)'
* @throws {Error} 如果表达式为空
*/
calc(expr: string): number;
};
//#endregion
export { $n, NumberFormatOptions, n };//#region src/data/number/format.d.ts
/** 货币格式化配置 */
type CurrencyConfig = {
/** 保留小数位数 */precision?: number; /** 最小小数位数 */
minPrecision?: number; /** 最大小数位数 */
maxPrecision?: number;
};
//#endregion
export { CurrencyConfig };import { CurrencyConfig } from "./format.js";
//#region src/data/number/num.d.ts
type CurrencyType = 'CNY' | 'CNY_HAN';
declare class Num {
private v;
constructor(n: number);
/**
* 数字转货币
* @param currencyType 货币类型 CNY人民币 CNY_HAN 人民币中文大写
* @param config 其他配置, 仅precision对CNY_HAN生效
* @returns 格式化后的货币字符串
* @example n(1234.56).currency('CNY') // '1,234.56'
*/
currency(currencyType: CurrencyType, config: CurrencyConfig): string;
currency(currencyType: CurrencyType, precision?: number): string;
/**
* 指定数字最大保留几位小数点
* @param precision 位数
* @returns 格式化后的字符串
* @example n(1.2345).fixed(2) // '1.23'
*/
fixed(precision: number | {
/** 最小精度 */minPrecision?: number; /** 最大精度 */
maxPrecision?: number;
}): string;
/**
* 遍历数字 (从 1 到 v)
* @param fn 回调函数
* @returns Num 实例
* @example n(3).each(i => console.log(i)) // 1, 2, 3
*/
each(fn: (n: number) => void): Num;
/**
* 大小区间 (限制在 min 和 max 之间)
* @param min 最小值
* @param max 最大值
* @returns 一个在指定范围内的值
* @example n(5).range(0, 10) // 5
* @example n(-5).range(0, 10) // 0
*/
range(min: number, max: number): number;
/**
* 限制最大值 (不超过 val)
* @param val 最大值
* @returns 一个不超过最大值的值
* @example n(10).max(5) // 5
*/
max(val: number): number;
/**
* 限制最小值 (不小于 val)
* @param val 最小值
* @returns 一个不小于最小值的值
* @example n(1).min(5) // 5
*/
min(val: number): number;
}
//#endregion
export { Num };//#region src/data/object.d.ts
declare class CatObject<O extends Record<string, any>, K extends keyof O = keyof O> {
readonly raw: O;
constructor(object: O);
/**
* 获取对象的所有键
* @returns 对象的键组成的元组类型
*/
keys(): string[];
/**
* 遍历对象
* @param callback 回调,第一个参数是对象key,第二个参数是key对应的value
* @returns 当前对象
*/
each(callback: (key: string, value: any) => void): CatObject<O, K>;
/**
* 挑选对象的key,生成新的对象
* @param keys 需要挑选的key
* @returns 新的对象
*/
pick<KK extends K>(keys: KK[]): Pick<O, KK>;
/**
* 忽略对象的key,生成新的对象
* @param keys 需要忽略的key
* @returns 新的对象
*/
omit<KK extends K>(keys: KK[]): Omit<O, KK>;
/**
* 从其他对象中继承属性,只继承当前对象中存在的属性
* @param source 继承的目标
* @returns 当前对象
*/
extend(source: Record<string, any>[] | Record<string, any>): O;
/**
* 从其他对象中深度继承属性,只继承当前对象中存在的属性
* @param source 继承的目标
* @returns 当前对象
*/
deepExtend(source: Record<string, any>[] | Record<string, any>): O;
/**
* 结构化拷贝
* @description 注意,如果对象中存在函数,则函数不会被拷贝
* @returns 新的对象
*/
copy(): O;
private static merge;
/**
* 将其他对象合并到当前对象
* @param source 需要合并的对象
* @returns 当前对象
*/
merge(source: Record<string, any>[] | Record<string, any>): O;
/**
* 获取对象的值
*
* @param prop 需要获取的属性, 可以是链式的属性或字符串数组
*
* @returns 值
*/
get<T extends any = any>(prop: string | string[]): T | undefined;
/**
* 设置对象的值
* @param prop 需要设置的属性
* @param value 需要设置的值
* @returns 当前对象
*/
set(prop: string, value: any): Record<string, any>;
}
declare function o<O extends Record<string, any>>(object: O): CatObject<O>;
//#endregion
export { o };//#region src/data/string.d.ts
declare class CatString {
private raw;
constructor(str: string);
/**
* 将字符串转换为驼峰命名
* @param type 驼峰类型:'lower'为小驼峰(lowerCamelCase),'upper'为大驼峰(UpperCamelCase)
* @returns 驼峰命名后的字符串
* @example
* ```ts
* str('hello-world').camelCase() // 'helloWorld'
* str('hello-world').camelCase('upper') // 'HelloWorld'
* ```
*/
camelCase(type?: 'lower' | 'upper'): string;
/**
* 将字符串转换为连字符命名(kebab-case)
* @returns 连字符命名后的字符串
* @example
* ```ts
* str('helloWorld').kebabCase() // 'hello-world'
* ```
*/
kebabCase(): string;
}
/**
* 创建一个字符串操作对象
* @param str 需要操作的字符串
* @returns 字符串操作对象
* @example
* ```ts
* const s = str('hello-world')
* s.camelCase() // 'helloWorld'
* s.kebabCase() // 'hello-world'
* ```
*/
declare function str(str: string): CatString;
declare const $str: {
/**
* 拼接URL路径
* @param firstPath 第一个路径
* @param paths 需要拼接的路径
* @returns 拼接后的路径
* @example
* ```ts
* $str.joinUrlPath('https://example.com', 'path', 'to', 'resource') // 'https://example.com/path/to/resource'
* ```
*/
joinUrlPath(firstPath: string, ...paths: string[]): string;
};
//#endregion
export { $str, str };//#region src/data/transform.d.ts
/** 定义转换方法的类型 */
type TransformMethod = (val: any) => any;
/**
* 将字符串转换为 Uint8Array
*
* 优先使用标准 `TextEncoder`;不可用时在 Node 回退到 `Buffer`,以统一跨环境入口。
* 与手写 `new TextEncoder().encode` 等价(在支持 `TextEncoder` 的环境下)。
*
* @param data 输入字符串
* @returns Uint8Array 类型的数据
* @throws 当环境不支持转换时抛出错误
*/
declare function str2u8a(data: string): Uint8Array;
/**
* 将 Uint8Array 转换为字符串
*
* 优先使用标准 `TextDecoder`;不可用时在 Node 回退到 `Buffer`,以统一跨环境入口。
*
* @param data Uint8Array 类型的数据
* @returns 转换后的字符串
* @throws 当环境不支持转换时抛出错误
*/
declare function u8a2str(data: Uint8Array): string;
/**
* 将 Uint8Array 转换为十六进制字符串
* @param u8a Uint8Array 类型的数据
* @returns 十六进制字符串
*/
declare function u8a2hex(u8a: Uint8Array): string;
/**
* 将十六进制字符串转换为 Uint8Array
* @param hex 十六进制字符串(可选 `0x` 前缀;忽略首尾空白)
* @returns 空串或仅空白时返回长度为 0 的 `Uint8Array`
* @throws 长度为奇数、或含非十六进制字符时抛出 `Error`
*/
declare function hex2u8a(hex: string): Uint8Array;
/**
* 将 Base64 字符串转换为 Uint8Array
* @param base64 Base64 字符串
* @returns Uint8Array 类型的数据
*/
declare function base642u8a(base64: string): Uint8Array;
/**
* 将 Uint8Array 转换为 Base64 字符串
* @param u8a Uint8Array 类型的数据
* @returns Base64 字符串
*/
declare function u8a2base64(u8a: Uint8Array): string;
/**
* 将对象转换为 URL 查询字符串
*
* **并非** `URLSearchParams` 的常规表单语义:空值与 `encodeURIComponent(JSON.stringify(value))` 序列化非原始值,
* 与原生查询串互操作前请先对照行为,避免误替换导致不一致。
*
* @param obj 要转换的对象
* @returns URL 查询字符串(不包含开头的 ?)
*/
declare function obj2query(obj: Record<string, any>): string;
/**
* 将 URL 查询字符串转换为对象
*
* 与 {@link obj2query} 成对:`JSON.parse` 可解析的值还原为对象/数组等,否则保留解码后的字符串。
* 与仅用 `URLSearchParams` 解析的键值对语义不同,勿与原生 API 混用假设。
*
* @param query URL 查询字符串(可以包含开头的 ?)
* @returns 转换后的对象
*/
declare function query2obj(query: string): Record<string, any>;
/**
* 数据转换
* @param data 需要转换的原始数据
* @param transformChain 转换链,按顺序执行
* @returns 转换后的数据
*/
declare function transform<T extends TransformMethod>(data: any, transformChain: [...TransformMethod[], T]): ReturnType<T>;
//#endregion
export { base642u8a, hex2u8a, obj2query, query2obj, str2u8a, transform, u8a2base64, u8a2hex, u8a2str };//#region src/data/type.d.ts
type DataType = 'object' | 'array' | 'string' | 'number' | 'blob' | 'date' | 'undefined' | 'function' | 'boolean' | 'file' | 'formdata' | 'symbol' | 'promise' | 'null' | 'arraybuffer';
/**
* 获取值对应的类型字符串
* @param value 值
* @returns 类型字符串
*/
declare function getDataType(value: any): DataType;
/**
* 是否是对象
* @param value 值
*/
declare function isObj(value: any): value is Record<string, any>;
/**
* 是否是数组。实现委托 `Array.isArray`,与原生「是否为数组」的结论一致(含跨 realm 等边界)。
* 若仅需布尔判断且不需要本包导出的类型守卫,可直接使用 `Array.isArray`。
* @param value 值
*/
declare function isArray(value: any): value is Array<any>;
/**
* 是否是字符串
* @param value 值
*/
declare function isString(value: any): value is string;
/**
* 是否是数字
* @param value 值
*/
declare function isNumber(value: any): value is number;
/**
* 是否是Blob
* @param value 值
*/
declare function isBlob(value: any): value is Blob;
/**
* 是否是
* @param value 值
*/
declare function isDate(value: any): value is Date;
/**
* 是否是函数
* @param value 值
*/
declare function isFunction(value: any): value is Function;
/**
* 是否是布尔值
* @param value 值
*/
declare function isBool(value: any): value is boolean;
/**
* 是否是文件
* @param value 值
*/
declare function isFile(value: any): value is File;
/**
* 是否是表单数据
* @param value 值
*/
declare function isFormData(value: any): value is FormData;
/**
* 是否是Symbol
* @param value 值
*/
declare function isSymbol(value: any): value is symbol;
/**
* 是否是Promise
* @param value 值
*/
declare function isPromise(value: any): value is Promise<any>;
/**
* 是否是ArrayBuffer
* @param value 值
*/
declare function isArrayBuffer(value: any): value is ArrayBuffer;
/**
* 是否是Uint8Array
* @param value 值
*/
declare function isUint8Array(value: any): value is Uint8Array;
/**
* 是否是Uint16Array
* @param value 值
*/
declare function isUint16Array(value: any): value is Uint16Array;
/**
* 是否是Uint32Array
* @param value 值
*/
declare function isUint32Array(value: any): value is Uint32Array;
/**
* 是否是Int8Array
* @param value 值
*/
declare function isInt8Array(value: any): value is Int8Array;
/**
* 是否是Int16Array
* @param value 值
*/
declare function isInt16Array(value: any): value is Int16Array;
/**
* 是否是Int32Array
* @param value 值
*/
declare function isInt32Array(value: any): value is Int32Array;
/**
* 是否是null
* @param value 值
*/
declare function isNull(value: any): value is null;
/**
* 是否是未定义
* @param value 值
*/
declare function isUndef(value: any): value is undefined;
/**
* 是否是空值, 当值为null或undefined时返回true
* @param value 值
*/
declare function isEmpty(value: any): boolean;
//#endregion
export { getDataType, isArray, isArrayBuffer, isBlob, isBool, isDate, isEmpty, isFile, isFormData, isFunction, isInt16Array, isInt32Array, isInt8Array, isNull, isNumber, isObj, isPromise, isString, isSymbol, isUint16Array, isUint32Array, isUint8Array, isUndef };//#region src/data/validator.d.ts
/**
* 校验问题描述
*/
interface ValidationIssue {
/**
* 问题路径(对象字段路径,使用 `.` 连接)
*
* @example
* - `name`
* - `profile.birthday`
* - `items.0.id`
*/
path: string;
/**
* 人类可读的错误信息
*/
message: string;
}
type SafeParseResult<T> = {
success: true;
data: T;
} | {
success: false;
issues: ValidationIssue[];
};
/**
* 解析器:将 unknown 解析为目标类型,失败时返回 issues
*/
type Parser<T> = (input: unknown) => SafeParseResult<T>;
/**
* 解析失败异常(用于 `parse()`)
*/
declare class ValidationError extends Error {
readonly issues: ReadonlyArray<ValidationIssue>;
constructor(issues: ValidationIssue[]);
}
interface Validator<T> {
/**
* 安全解析:失败不抛错,返回 issues
*/
safeParse(input: unknown): SafeParseResult<T>;
/**
* 解析:失败抛出 `ValidationError`
*/
parse(input: unknown): T;
}
/**
* 从 Parser 创建 Validator
*/
declare function createValidator<T>(parser: Parser<T>): Validator<T>;
type InferParser<P> = P extends Parser<infer T> ? T : never;
/**
* 从对象 schema 推断输出类型
*/
type InferObjectSchema<S extends Record<string, Parser<any>>> = { [K in keyof S]: InferParser<S[K]> };
/**
* 对象校验器:按字段 schema 校验并返回(会尽量收集所有字段错误)
*
* @example
* ```ts
* const user = object({
* id: number(),
* name: string(),
* age: optional(number())
* })
*
* const result = user.safeParse({ id: 1, name: 'cat' })
* if (result.success) {
* result.data.id // number
* }
* ```
*/
declare function object<S extends Record<string, Parser<any>>>(schema: S): Validator<InferObjectSchema<S>>;
interface OptionalOptions<T> {
/**
* 缺省值(当输入为 undefined 时生效)
*/
default?: T | (() => T);
}
/**
* 可选字段:当输入为 undefined 时通过(返回 undefined 或 default)
*/
declare function optional<T>(parser: Parser<T>, options?: OptionalOptions<T>): Parser<T | undefined>;
declare function vString(): Parser<string>;
declare function vNumber(): Parser<number>;
declare function vBoolean(): Parser<boolean>;
declare function vDate(): Parser<Date>;
declare function vArray<T>(item: Parser<T>): Parser<T[]>;
//#endregion
export { InferObjectSchema, OptionalOptions, Parser, SafeParseResult, ValidationError, ValidationIssue, Validator, createValidator, object, optional, vArray, vBoolean, vDate, vNumber, vString };//#region src/date/date.d.ts
type DateInput = number | string | Date | Dater;
type DateCompareReducer<R> = (timeDiff: number) => R;
type FormatOptions = {
utc?: boolean;
};
type DiffUnit = 'milliseconds' | 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months' | 'years';
type DiffOptions = {
absolute?: boolean;
float?: boolean;
};
type RangeInclusive = '()' | '[]' | '[)' | '(]';
type StartEndUnit = 'day' | 'week' | 'month' | 'year';
declare class Dater {
private date;
constructor(date: DateInput);
/** 原始日期对象 */
get raw(): Date;
private static matchers;
private getParts;
/** 时间戳 */
get timestamp(): number;
setTime(timestamp: number): Dater;
/** 年 */
get year(): number;
/**
* 设置年份
* @param year 年份
* @returns
*/
setYear(year: number): Dater;
/** 月 */
get month(): number;
/**
* 设置月份
* @param month 月份,从1开始
* @returns
*/
setMonth(month: number): Dater;
/** 周 */
get weekDay(): number;
/** 日 */
get day(): number;
/**
* 设置日
* @param day 日, 如果为0则表示上个月的最后一天
* @returns
*/
setDay(day: number): Dater;
/** 时 */
get hours(): number;
/**
* 设置小时
* @param hours 时
* @returns
*/
setHours(hours: number): Dater;
/** 分 */
get minutes(): number;
/**
* 设置分
* @param minutes 分
*/
setMinutes(minutes: number): Dater;
/** 秒 */
get seconds(): number;
/**
* 设置秒
* @param sec 秒
*/
setSeconds(sec: number): Dater;
/** 克隆当前日期 */
clone(): Dater;
/** 格式化日期 */
format(formatter?: string, options?: FormatOptions): string;
/**
* 计算相对此刻的日期
* @param timeStep 计算的日期, 负数表示之前的日期, 正数表示之后的日期
* @param type 时间步长类别, 默认以天为单位
*/
calc(timeStep: number, type?: 'days' | 'weeks' | 'months' | 'years'): Dater;
/** 不可变加减封装 */
addDays(days: number): Dater;
addWeeks(weeks: number): Dater;
addMonths(months: number): Dater;
addYears(years: number): Dater;
private resetTime;
/**
* 对齐到指定单位的开始
* @param unit 单位: day/week/month/year
*/
startOf(unit: StartEndUnit): Dater;
/**
* 对齐到指定单位的结束
* @param unit 单位: day/week/month/year
*/
endOf(unit: StartEndUnit): Dater;
/**
* 比较日期, 并返回天数差
* @param date 日期
* @returns 天数差
*/
compare(date: DateInput): number;
/**
* 比较日期, 返回自定义结果
* @param date 日期
* @param reducer 处理器
* @returns 自定义结果
*/
compare<R>(date: DateInput, reducer: DateCompareReducer<R>): R;
/**
* 计算差值
* @param date 对比日期
* @param unit 单位
* @param options absolute 为 true 时返回绝对值, float 为 true 时返回小数(仅限毫秒-周)
*/
diff(date: DateInput, unit?: DiffUnit, options?: DiffOptions): number;
/**
* 判断是否在区间内
* @param start 开始日期
* @param end 结束日期
* @param options inclusive: '[]' 闭区间, '()' 开区间, '[)' 左闭右开, '(]' 左开右闭
*/
isBetween(start: DateInput, end: DateInput, options?: {
inclusive?: RangeInclusive;
}): boolean;
isSameDay(date: DateInput): boolean;
isSameMonth(date: DateInput): boolean;
isSameYear(date: DateInput): boolean;
isWeekend(): boolean;
isLeapYear(): boolean;
/**
* 跳转至月尾
* @param offsetMonth 月份偏移量,默认为0,即当月
*/
toEndOfMonth(offsetMonth?: number): Dater;
/**
* 获取这个月的天数
*/
getDays(): number;
private static diffInCalendarMonths;
private static diffInCalendarYears;
private static escapeReg;
private static parseByFormat;
/**
* 解析日期字符串
* @param value 输入字符串
* @param format 可选格式化模板(使用 format 支持的占位符)
* @param options utc: 是否按 UTC 解析
*/
static parse(value: string, format?: string, options?: FormatOptions): Dater;
}
/** 日期 */
declare function date(d?: DateInput): Dater;
//#endregion
export { Dater, date };//#region src/env/env.d.ts
/**
* 获取当前运行环境
*
* 通过 `globalThis` 探测,避免直接引用未声明的全局。判定顺序:
* 1. 若存在 `globalThis.window`(含 `undefined` 以外的占位),视为 `browser`。
* 2. 否则若存在 `globalThis.process`,视为 `node`。
*
* 因此 Electron 等同时存在 `window` 与 Node `process` 时结果为 `browser`。若未来改为优先 `process`,属 breaking,须 major 与迁移说明。
*
* @returns 'browser' | 'node' | 'unknown'
*/
declare function getRuntime(): 'browser' | 'node' | 'unknown';
/**
* 判断是否在浏览器中运行
* @returns 是否在浏览器中运行
*/
declare function isInBrowser(): boolean;
/**
* 判断是否在node环境中运行
* @returns 是否在node环境中运行
*/
declare function isInNode(): boolean;
/**
* 操作系统类型
*/
type OSType = 'Windows' | 'Linux' | 'MacOS' | 'Android' | 'iOS' | 'Unknown';
/**
* 获取操作系统类型
* @returns 操作系统类型
*/
declare function getOSType(): OSType;
/**
* 设备类型
*/
type DeviceType = 'Mobile' | 'Desktop' | 'Tablet' | 'Unknown';
/**
* 获取设备类型
* @returns 设备类型
*/
declare function getDeviceType(): DeviceType;
/**
* 浏览器类型
*/
type BrowserType = 'Chrome' | 'Firefox' | 'Safari' | 'Edge' | 'IE' | 'Opera' | 'Unknown';
/**
* 获取浏览器类型
* @returns 浏览器类型
*/
declare function getBrowserType(): BrowserType;
/**
* 获取浏览器版本
* @returns 浏览器版本号或 null
*/
declare function getBrowserVersion(): string | null;
/**
* 检查是否为移动设备
* @returns 是否为移动设备
*/
declare function isMobile(): boolean;
/**
* 检查是否为平板设备
* @returns 是否为平板设备
*/
declare function isTablet(): boolean;
/**
* 检查是否为桌面设备
* @returns 是否为桌面设备
*/
declare function isDesktop(): boolean;
/**
* 检查是否支持触摸事件
* @returns 是否支持触摸事件
*/
declare function isTouchDevice(): boolean;
/**
* 获取 Node.js 版本
* @returns Node.js 版本或 null
*/
declare function getNodeVersion(): string | null;
type EnvironmentSummary = {
runtime: 'browser';
os: OSType;
browser: BrowserType;
browserVersion: string | null;
device: DeviceType;
touchSupported: boolean;
} | {
runtime: 'node';
os: OSType;
nodeVersion: string | null;
} | {
runtime: 'unknown';
os: OSType;
};
/**
* 获取环境信息摘要
* @returns 环境信息对象
*/
declare function getEnvironmentSummary(): EnvironmentSummary;
//#endregion
export { BrowserType, DeviceType, EnvironmentSummary, OSType, getBrowserType, getBrowserVersion, getDeviceType, getEnvironmentSummary, getNodeVersion, getOSType, getRuntime, isDesktop, isInBrowser, isInNode, isMobile, isTablet, isTouchDevice };import { getDataType, isArray, isArrayBuffer, isBlob, isBool, isDate, isEmpty, isFile, isFormData, isFunction, isInt16Array, isInt32Array, isInt8Array, isNull, isNumber, isObj, isPromise, isString, isSymbol, isUint16Array, isUint32Array, isUint8Array, isUndef } from "./data/type.js";
import { o } from "./data/object.js";
import { $str, str } from "./data/string.js";
import { arr, eachRight, last, omitArr, union, unionBy } from "./data/array.js";
import { CurrencyConfig } from "./data/number/format.js";
import { Num } from "./data/number/num.js";
import { $n, NumberFormatOptions, n } from "./data/number.js";
import { base642u8a, hex2u8a, obj2query, query2obj, str2u8a, transform, u8a2base64, u8a2hex, u8a2str } from "./data/transform.js";
import { InferObjectSchema, OptionalOptions, Parser, SafeParseResult, ValidationError, ValidationIssue, Validator, createValidator, object, optional, vArray, vBoolean, vDate, vNumber, vString } from "./data/validator.js";
import { Dater, date } from "./date/date.js";
import { BrowserType, DeviceType, EnvironmentSummary, OSType, getBrowserType, getBrowserVersion, getDeviceType, getEnvironmentSummary, getNodeVersion, getOSType, getRuntime, isDesktop, isInBrowser, isInNode, isMobile, isTablet, isTouchDevice } from "./env/env.js";
import { ParallelOptions, parallel } from "./optimize/parallel.js";
import { debounce, sleep, throttle } from "./optimize/timer.js";
import { safeRun } from "./optimize/safe.js";
import { Observable, ObserveOptions, PropHandler } from "./pattern/observer.js";
import { ITreeNode, NodeCreator, TreeManager, TreeManagerOptionsBase, TreeManagerOptionsWithCreator, TreeNode, bfs, dfs } from "./data-structure/tree.js";
import { Forest, ForestNode, ForestNodeCreator, ForestOptionsBase, ForestOptionsWithCreator, IForestNode } from "./data-structure/forest.js";
export { $n, $str, BrowserType, CurrencyConfig, Dater, DeviceType, EnvironmentSummary, Forest, ForestNode, ForestNodeCreator, ForestOptionsBase, ForestOptionsWithCreator, IForestNode, ITreeNode, InferObjectSchema, NodeCreator, Num, NumberFormatOptions, OSType, Observable, ObserveOptions, OptionalOptions, ParallelOptions, Parser, PropHandler, SafeParseResult, TreeManager, TreeManagerOptionsBase, TreeManagerOptionsWithCreator, TreeNode, ValidationError, ValidationIssue, Validator, arr, base642u8a, bfs, createValidator, date, debounce, dfs, eachRight, getBrowserType, getBrowserVersion, getDataType, getDeviceType, getEnvironmentSummary, getNodeVersion, getOSType, getRuntime, hex2u8a, isArray, isArrayBuffer, isBlob, isBool, isDate, isDesktop, isEmpty, isFile, isFormData, isFunction, isInBrowser, isInNode, isInt16Array, isInt32Array, isInt8Array, isMobile, isNull, isNumber, isObj, isPromise, isString, isSymbol, isTablet, isTouchDevice, isUint16Array, isUint32Array, isUint8Array, isUndef, last, n, o, obj2query, object, omitArr, optional, parallel, query2obj, safeRun, sleep, str, str2u8a, throttle, transform, u8a2base64, u8a2hex, u8a2str, union, unionBy, vArray, vBoolean, vDate, vNumber, vString };{
"generatedAt": "2026-06-22T15:20:06.138Z",
"npmName": "@cat-kit/core",
"version": "1.1.6",
"kind": "dts",
"artifactCount": 18
}//#region src/optimize/parallel.d.ts
interface ParallelOptions {
/**
* 并发上限
*
* - 不传:默认等于 tasks.length(尽可能并发)
* - 必须为正整数
*/
concurrency?: number;
}
/**
* 并发执行任务,并保持返回结果与任务顺序一致。
*
* 注意:该函数为异步函数,返回 Promise。
*
* @param tasks - 任务数组(每个任务可返回值或 Promise)
* @param options - 并发控制
* @returns 按任务顺序排列的结果数组
*/
declare function parallel<T>(tasks: ReadonlyArray<() => T | Promise<T>>, options?: ParallelOptions): Promise<T[]>;
//#endregion
export { ParallelOptions, parallel };//#region src/optimize/safe.d.ts
/**
* 安全运行
* @param fn 待执行的函数
*/
declare function safeRun<T>(fn: () => T): T | undefined;
/**
* 安全运行并提供默认返回值
* @param fn 待执行的函数
* @param defaultVal 指定的默认值
*/
declare function safeRun<T>(fn: () => T, defaultVal: T): T;
//#endregion
export { safeRun };//#region src/optimize/timer.d.ts
/**
* 防抖
* @param fn 要调用的目标函数
* @param delay 延迟时间
* @param immediate 是否立即调用一次, 默认true
* @returns
*/
declare function debounce<T extends any[]>(fn: (...args: T) => void, delay?: number, immediate?: boolean): (this: any, ...args: T) => void;
/**
* 节流
* @param fn 要调用的目标函数
* @param delay 间隔时间
* @param cb 结果回调
* @returns
*/
declare function throttle<T extends any[], R>(fn: (...args: T) => R, delay?: number, cb?: (v: R) => void): (this: any, ...args: T) => R;
/**
* 睡眠一定时间
* @param ms 毫秒数
* @returns
*/
declare function sleep(ms: number): Promise<void>;
//#endregion
export { debounce, sleep, throttle };//#region src/pattern/observer.d.ts
/**
* 属性处理器接口
*/
interface PropHandler {
/** 要观察的属性名数组 */
params: string[];
/** 属性变化时的回调函数 */
callback: (state: any) => void | Promise<void>;
/** 是否同步执行回调 */
sync?: boolean;
/** 是否只执行一次 */
once?: boolean;
}
/**
* 观察选项接口
*/
interface ObserveOptions {
/** 是否立即执行一次回调 */
immediate?: boolean;
/** 是否只执行一次 */
once?: boolean;
/** 是否同步执行回调 */
sync?: boolean;
}
/**
* 可观察对象类
* 用于创建可被观察的状态对象
*/
declare class Observable<S extends object, K extends keyof S> {
/** 可观察的状态对象 */
readonly state: S;
/** 属性处理器映射 */
private propsHandlers;
/** 是否正在等待微任务执行 */
private waitingMicrotask;
/** 微任务队列 */
private microtasks;
/** 是否暂停观察 */
private paused;
/**
* 构造函数
* @param data 初始状态对象
*/
constructor(data: S);
/**
* 执行微任务
*/
private runMicrotasks;
/**
* 触发属性变更事件
* @param prop 属性名
*/
trigger(prop: string | symbol): void;
/**
* 观察属性变化
* @param props 要观察的属性名数组
* @param callback 属性变化时的回调函数
* @param options 观察选项
* @returns 取消观察的函数
*/
observe<const P extends K[]>(props: P, callback: (values: { [key in keyof P]: S[P[key]] }) => void, options?: ObserveOptions): () => void;
/**
* 获取状态对象
* @returns 状态对象
*/
getState(): S;
/**
* 设置状态对象
* @param state 状态对象
*/
setState(state: Partial<S>): Observable<S, K>;
/**
* 取消观察处理器
* @param handler 要取消的处理器
*/
unobserveHandler(handler: PropHandler): void;
/**
* 取消观察特定属性
* @param props 要取消观察的属性名数组
* @param handler 要取消的处理器, 不填则取消所有处理器
*/
unobserve<const P extends K[]>(props: P, handler?: PropHandler): void;
/**
* 销毁所有观察者
*/
destroyAll(): void;
}
//#endregion
export { Observable, ObserveOptions, PropHandler };本目录由脚本生成,勿手改。内容为 @cat-kit/core 包 dist 下 .d.ts 的镜像(与 npm typings 对齐)。
- 入口:通常从
index.d.ts起读(若有)。 - 元数据:
manifest.json
import { customAlphabet, customRandom, nanoid, random, urlAlphabet } from "./nanoid.js";
export { customAlphabet, customRandom, nanoid, random, urlAlphabet };{
"generatedAt": "2026-06-22T15:20:06.138Z",
"npmName": "@cat-kit/crypto",
"version": "1.0.0",
"kind": "dts",
"artifactCount": 2
}//#region src/nanoid.d.ts
/*!
* Ported from nanoid v5.1.11:
* https://github.com/ai/nanoid/tree/main
* Source files: index.js, index.browser.js, url-alphabet/index.js
*/
declare const urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
declare function random(bytes: number): Uint8Array;
declare function customRandom(alphabet: string, defaultSize: number, getRandom: (bytes: number) => Uint8Array): (size?: number) => string;
declare function customAlphabet(alphabet: string, size?: number): (size?: number) => string;
declare function nanoid(size?: number): string;
//#endregion
export { customAlphabet, customRandom, nanoid, random, urlAlphabet };本目录由脚本生成,勿手改。内容为 @cat-kit/crypto 包 dist 下 .d.ts 的镜像(与 npm typings 对齐)。
- 入口:通常从
index.d.ts起读(若有)。 - 元数据:
manifest.json
//#region src/file/read.d.ts
interface ReadChunksOptions {
/** 每次读取的块大小,默认 10MB */
chunkSize?: number;
/** 开始读取的偏移量 */
offset?: number;
}
/**
* 分块读取文件,返回 AsyncGenerator
*
* 使用 Blob.slice() + arrayBuffer() 替代 FileReader,
* 支持 for-await-of 遍历、break 提前退出
*
* @param file 要读取的文件或 Blob 对象
* @param options 读取配置
*
* @example
* ```ts
* for await (const chunk of readChunks(file)) {
* hash.update(chunk)
* }
* ```
*
* @example
* ```ts
* // 手动控制
* const reader = readChunks(file, { chunkSize: 1024 * 1024 })
* const { value, done } = await reader.next()
* await reader.return(undefined)
* ```
*/
declare function readChunks(file: Blob | File, options?: ReadChunksOptions): AsyncGenerator<Uint8Array>;
//#endregion
export { ReadChunksOptions, readChunks };//#region src/file/saver.d.ts
/**
* 通过 Blob 保存文件
*
* 适用于小到中等大小的文件(通常 < 500MB)
* 使用传统的 Object URL + a[download] 方式
*
* @example
* ```ts
* const blob = new Blob(['Hello, World!'], { type: 'text/plain' })
* saveBlob(blob, 'hello.txt')
* ```
*/
declare function saveBlob(blob: Blob, filename: string): void;
//#endregion
export { saveBlob };import { EstimateSize, GetItemKey, VirtualAlign, VirtualItem, VirtualMeasurement, VirtualRange, VirtualScrollOptions, VirtualSnapshot, Virtualizer, VirtualizerOptions, VirtualizerSubscriber } from "./virtualizer/index.js";
import { Tween, TweenEasing, TweenFrame, TweenOptions, TweenScheduler, TweenState, tweenEasings } from "./tween.js";
import { ExtractStorageKey, StorageKey, storage, storageKey } from "./storage/storage.js";
import { CookieOptions, cookie } from "./storage/cookie.js";
import { WebPermissionName, queryPermission } from "./web-api/permission.js";
import { clipboard } from "./web-api/clipboard.js";
import { saveBlob } from "./file/saver.js";
import { ReadChunksOptions, readChunks } from "./file/read.js";
export { CookieOptions, EstimateSize, ExtractStorageKey, GetItemKey, ReadChunksOptions, StorageKey, Tween, TweenEasing, TweenFrame, TweenOptions, TweenScheduler, TweenState, VirtualAlign, VirtualItem, VirtualMeasurement, VirtualRange, VirtualScrollOptions, VirtualSnapshot, Virtualizer, VirtualizerOptions, VirtualizerSubscriber, WebPermissionName, clipboard, cookie, queryPermission, readChunks, saveBlob, storage, storageKey, tweenEasings };{
"generatedAt": "2026-06-22T15:20:06.138Z",
"npmName": "@cat-kit/fe",
"version": "1.1.6",
"kind": "dts",
"artifactCount": 9
}本目录由脚本生成,勿手改。内容为 @cat-kit/fe 包 dist 下 .d.ts 的镜像(与 npm typings 对齐)。
- 入口:通常从
index.d.ts起读(若有)。 - 元数据:
manifest.json
//#region src/storage/cookie.d.ts
/**
* Cookie操作选项接口
*/
interface CookieOptions {
/**
* Cookie过期时间(秒数或Date对象)
*/
expires?: number | Date;
/**
* Cookie路径
*/
path?: string;
/**
* Cookie域名
*/
domain?: string;
/**
* 是否仅通过HTTPS传输
*/
secure?: boolean;
/**
* 同站策略
*/
sameSite?: 'Strict' | 'Lax' | 'None';
}
/**
* Cookie操作工具类
*
* 提供了一系列简单易用的方法来操作浏览器 cookie。
* 支持设置、获取、删除、检查存在性等基本操作。
*
* @example
* ```typescript
* // 设置 cookie
* cookie.set('token', 'abc123', { expires: 7 * 24 * 3600 }); // 7天后过期
*
* // 获取 cookie
* const token = cookie.get('token');
*
* // 删除 cookie
* cookie.remove('token');
*
* // 检查是否存在
* if (cookie.has('token')) {
* // ...
* }
*
* // 获取所有 cookie
* const allCookies = cookie.getAll();
*
* // 清空所有 cookie
* cookie.clear();
* ```
*/
declare const cookie: {
/**
* 设置 cookie
* @param key - cookie 键名
* @param value - cookie 值
* @param options - 配置选项
*/
set(key: string, value: string, options?: CookieOptions): void;
/**
* 获取指定键名的 cookie 值
* @param key - cookie 键名
* @returns cookie 值,如果不存在则返回 null
*/
get(key: string): string | null;
/**
* 删除指定键名的 cookie
* @param key - cookie 键名
* @param options - 配置选项
*/
remove(key: string, options?: Pick<CookieOptions, "path" | "domain">): void;
/**
* 检查指定键名的 cookie 是否存在
* @param key - cookie 键名
* @returns 如果 cookie 存在返回 true,否则返回 false
*/
has(key: string): boolean;
/**
* 获取所有 cookie
* @returns 包含所有 cookie 的键值对对象
*/
getAll(): Record<string, string>;
/**
* 清空所有 cookie
* @remarks
* 此操作会删除当前域名下的所有 cookie
*/
clear(): void;
};
//#endregion
export { CookieOptions, cookie };//#region src/storage/storage.d.ts
type Callback<T = any> = (key: StorageKey<T>, value?: T, temp?: {
value: T;
exp: number;
}) => void;
type StorageKey<_> = {};
declare function storageKey<T>(str: string): StorageKey<T>;
type ExtractStorageKey<T> = T extends StorageKey<infer K> ? K : never;
declare class WebStorage {
static enabledType: Set<string>;
private storage;
callbacks: {
[key: string]: Callback[];
};
constructor(storage: Storage);
/**
* 往缓存里添加单条记录
* @param key 单个值的键
* @param value 单个值
* @param exp 单个值的过期时间, 单位秒
*/
set<T>(key: StorageKey<T>, value: T, exp?: number): WebStorage;
get<T>(key: StorageKey<T>): T | null;
get<T>(key: StorageKey<T>, defaultValue: T): T;
get<T extends [...any[]]>(keys: [...T]): { [I in keyof T]: ExtractStorageKey<T[I]> };
/**
* 获取字段过期时间
* @param key 字段名
*/
getExpire(key: StorageKey<any>): number;
/**
* 移除一个缓存值
* @param key 需要移除的值的键
*/
remove(key: StorageKey<any>): WebStorage;
/**
* 移除多个缓存值
* @param keys 需要移除的值的键的数组
*/
remove(keys: StorageKey<any>[]): WebStorage;
/**
* 清空缓存
*/
remove(): WebStorage;
/**
* 添加一个值改动的回调
* @param key 键
* @param callback 回调函数
*/
on(key: string, callback: Callback): void;
/**
* 移除多个回调
* @param keys 需要移除的回调的字符串数组
*/
off(keys: string[]): void;
/**
* 移除单个回调
* @param key 需要移除的记录的键
*/
off(key: string): void;
/**
* 移除所有回调
*/
off(): void;
}
declare const storage: {
readonly local: WebStorage;
readonly session: WebStorage;
};
//#endregion
export { ExtractStorageKey, StorageKey, storage, storageKey };//#region src/tween.d.ts
type TweenState = 'idle' | 'running' | 'paused' | 'finished' | 'cancelled';
type TweenEasing = (progress: number) => number;
interface TweenScheduler {
now(): number;
requestFrame(callback: FrameRequestCallback): number;
cancelFrame(handle: number): void;
}
interface TweenFrame {
elapsed: number;
progress: number;
easedProgress: number;
value: number;
state: TweenState;
}
interface TweenOptions {
from?: number;
to?: number;
duration?: number;
delay?: number;
easing?: TweenEasing;
autoplay?: boolean;
scheduler?: TweenScheduler;
onUpdate?: (frame: TweenFrame) => void;
onFinish?: (frame: TweenFrame) => void;
onCancel?: (frame: TweenFrame) => void;
}
declare const tweenEasings: {
linear: (progress: number) => number;
easeInQuad: (progress: number) => number;
easeOutQuad: (progress: number) => number;
easeInOutQuad: (progress: number) => number;
};
declare class Tween {
private from;
private to;
private duration;
private delay;
private easing;
private scheduler;
private onUpdate?;
private onFinish?;
private onCancel?;
private state;
private startedAt;
private pausedElapsed;
private handle;
private progress;
private value;
constructor(options?: TweenOptions);
getState(): TweenState;
getValue(): number;
getProgress(): number;
setOptions(options: TweenOptions): this;
play(): this;
pause(): this;
resume(): this;
cancel(): this;
reset(): this;
seek(progress: number): this;
private applyOptions;
private schedule;
private tick;
private currentElapsed;
private interpolate;
private createFrame;
private emitUpdate;
private cancelFrame;
}
//#endregion
export { Tween, TweenEasing, TweenFrame, TweenOptions, TweenScheduler, TweenState, tweenEasings };//#region src/virtualizer/index.d.ts
/**
* 未测项的尺寸估值函数。
*
* @param index - 项的索引。
* @returns 该项的预估像素尺寸(水平模式下为宽度,垂直模式下为高度)。负数会被 clamp 到 0。
*
* @remarks
* 函数应尽量**无副作用、可重入**:同一 index 在短时间内可能被调用多次。
* 若启用 `useMeasuredAverage`(默认),估值一旦有至少一个真实样本就会被「已测平均值」接管,
* `estimateSize` 仅作为冷启动兜底与关闭 `useMeasuredAverage` 时的唯一来源。
*/
type EstimateSize = (index: number) => number;
/**
* `scrollToIndex` 对齐方式。
*
* - `auto`:仅当目标项已在视口外才滚动,方向按最短路径(项在视口上方 → 对齐视口顶;下方 → 对齐视口底)
* - `start`:项顶部(或左侧,水平模式)对齐视口起点
* - `center`:项中线对齐视口中线
* - `end`:项底部(或右侧)对齐视口终点
*/
type VirtualAlign = 'auto' | 'start' | 'center' | 'end';
/**
* `subscribe` 回调签名:在**结构性**变化发生时收到当前快照。
*
* 「结构性」包含 `range` / `items` / `totalSize` / `viewportSize` / `horizontal` / `isScrolling`
* / `beforeSize` / `afterSize` 的变化;纯 `offset` 位移不会触发回调,请直接读容器 `scrollTop`。
*/
type VirtualizerSubscriber = (snapshot: VirtualSnapshot) => void;
/**
* 基于 index 返回稳定 key 的函数,用于把测量缓存按数据项身份(而非位置索引)存储。
*
* @param index - 项的索引,范围 `[0, count)`。
* @returns 该数据项的稳定 key。
*
* @remarks
* **约束**:必须在整个 Virtualizer 生命周期内对同一数据项保持稳定;
* 不要基于 `Math.random()`、当前时间或每次渲染新建的对象引用生成 key,
* 否则测量缓存无法被正确识别并复用。
*/
type GetItemKey = (index: number) => number | string;
/** Virtualizer 初始化参数。字段均可选,缺省时使用安全默认值。 */
interface VirtualizerOptions {
/** 虚拟项总数,默认 0 */
count?: number;
/** 可视区外额外保留的预渲染项数,默认 4 */
buffer?: number;
/** 是否为水平滚动(否则为垂直),默认 false */
horizontal?: boolean;
/** 列表首项前的固定内边距(px),默认 0 */
paddingStart?: number;
/** 列表末项后的固定内边距(px),默认 0 */
paddingEnd?: number;
/** 相邻两项之间的间距(px),语义与 CSS `gap` 对齐,默认 0 */
gap?: number;
/** 初始滚动偏移(px),默认 0 */
initialOffset?: number;
/** 未 connect 前使用的初始 viewport 尺寸(px),默认 0 */
initialViewport?: number;
/** 项预估尺寸函数,默认返回 36 */
estimateSize?: EstimateSize;
/**
* 未测项是否使用「已测项平均尺寸」作为估值。开启后首个样本产生即全面替换估值,
* 配合 scrollAdjustments 可显著缓解 estimateSize 与真实值偏差过大带来的滚动条抖动。
*
* @default true
*/
useMeasuredAverage?: boolean;
/**
* 基于 index 返回稳定 key,用于把测量缓存按数据项身份存储。
* 提供后列表前插 / 乱序 / 中段删除时,未变动项的真实测量值仍可被复用;
* 未提供时行为与旧版本一致(按 index 缓存)。
*/
getItemKey?: GetItemKey;
}
/** 单个虚拟项的位置与尺寸,所有数值都是 `px`,相对列表内容起点(不含 `paddingStart`)。 */
interface VirtualItem {
/** 项在数据源中的索引。 */
index: number;
/** 项起点到列表容器起点的距离。 */
start: number;
/** 项终点到列表容器起点的距离,等于 `start + size`。 */
end: number;
/** 项尺寸(高度 / 宽度)。 */
size: number;
}
/** 可视区命中的原始索引范围(不含 `buffer`)。当 `count === 0` 或 `viewportSize <= 0` 时为 `null`。 */
interface VirtualRange {
/** 视口首次命中的项索引。 */
startIndex: number;
/** 视口最后命中的项索引。 */
endIndex: number;
}
/**
* 虚拟列表快照,即真正渲染的列表内容
*/
interface VirtualSnapshot {
/** 当前应渲染的项列表(已包含 `buffer` 扩张)。 */
items: VirtualItem[];
/** 不含 `buffer` 的原始可视区命中范围。 */
range: VirtualRange | null;
/** 列表内容总尺寸(含 `paddingStart` / `paddingEnd`)。 */
totalSize: number;
/** `items[0]` 前需预留的占位空间(含 `paddingStart`),用于 spacer 布局。 */
beforeSize: number;
/** `items[items.length - 1]` 后需预留的占位空间(含 `paddingEnd`)。 */
afterSize: number;
/** 当前滚动偏移(像素)。 */
offset: number;
/** 当前容器视口尺寸。 */
viewportSize: number;
/** 是否水平滚动。 */
horizontal: boolean;
/** 是否处于滚动中(由 `scroll` / `scrollend` 事件与 120ms 兜底计时驱动)。 */
isScrolling: boolean;
}
interface VirtualScrollOptions {
/** 对齐方式,默认 `auto`。仅对 `scrollToIndex` 生效;`scrollToOffset` 始终按 `start` 语义。 */
align?: VirtualAlign;
/** 滚动行为,传 `'smooth'` 走浏览器原生平滑动画 + rAF 校准循环;默认 `'auto'`(同步跳转)。 */
behavior?: ScrollBehavior;
}
interface VirtualMeasurement {
/** 项的索引,范围 `[0, count)`;越界的测量会被静默忽略。 */
index: number;
/** 项的真实像素尺寸。 */
size: number;
}
declare class Virtualizer {
/** 虚拟项总数 */
private count;
private buffer;
private horizontal;
private paddingStart;
private paddingEnd;
private gap;
private estimateSize;
private useMeasuredAverage;
private getItemKey;
private offset;
private viewportSize;
private isScrolling;
/**
* 测量缓存,键为数据项的稳定 key,值为像素尺寸。
*/
private measuredByKey;
private measuredSum;
private averageEstimate;
private firstUnmeasured;
private starts;
private sizes;
private dirtyIndex;
private snapshot;
private subscribers;
private scrollElement;
private containerObserver;
private scrollEndTimer;
private scrollEndNative;
/** 已测量的元素集合 */
private mounted;
/** 尺寸测量器 */
private tracker;
/** 滚动矫正器 */
private reconciler;
/** 视口前方项尺寸变化的累积 delta,recompute 开头统一 flush 一次 DOM 写入。 */
private pendingScrollAdjust;
/**
* 创建一个 Virtualizer 实例。
*
* @example
* ```ts
* import { Virtualizer } from '@cat-kit/fe'
*
* const v = new Virtualizer({
* count: 10_000,
* buffer: 6,
* estimateSize: () => 44,
* getItemKey: (i) => rows[i].id
* })
* ```
*/
constructor(options?: VirtualizerOptions);
/**
* 批量更新选项。只传需要变更的字段,未传字段保持当前值。
*
* @param options - 需要更新的字段集合。
*
* @remarks
* - `initialOffset` / `initialViewport` 仅在构造时生效,这里传入会被忽略。
* - **同轮更新顺序**:`getItemKey` 始终先于 `count` 应用,保证 `count` 剪裁使用的是新 key 空间,
* 避免 `setOptions({ count, getItemKey })` 把数据重排后仍存活的测量误删。
* - **`getItemKey` 切换语义**:
* - `function → function`(keyed → keyed):保留 `measuredByKey`,旧 key 的真实测量值仍被复用(前插 / 乱序场景)。
* - `undefined ↔ function`(key 空间切换):清空 `measuredByKey` / `measuredSum` / `averageEstimate`,避免跨空间污染。
* - 任何触发「全量失效」的字段(`paddingStart` / `gap` / `estimateSize` / `useMeasuredAverage` / `getItemKey`)都会调用 `invalidate(0)` 重排所有项。
*
* @example
* ```ts
* v.setOptions({ count: 500, buffer: 8 })
* v.setOptions({ count: newRows.length, getItemKey: (i) => newRows[i].id })
* ```
*/
setOptions(options: VirtualizerOptions): this;
/**
* 更新虚拟项总数。
*
* @param count - 新的项数,负数会被 clamp 到 0,小数会被截断。
* @returns 自身,支持链式调用。
*
* @remarks
* - **收缩时**(`count < prevCount`):`[count, prevCount)` 范围的测量缓存会被剪裁
* (keyed 模式按新 key 空间构造 alive 集合);`mounted` 中同范围的元素会被 `unobserve`。
* - **扩张时**(`count > prevCount`):从 `prevCount` 起标记为待重算,后续渲染按 `estimateSize` / 已测平均值给出估值。
* - 数值未变化时为 no-op,不触发快照更新。
*/
setCount(count: number): this;
/**
* 设置可视区尺寸(px)。一般由 `connect` 后的 `ResizeObserver` 自动同步;
* 仅在手动布局(SSR、无 ResizeObserver 环境、测试)时直接调用。
*
* @param size - 新的视口尺寸,负数会被 clamp 到 0,小数会被四舍五入。
* @returns 自身,支持链式调用。
*
* @remarks `offset` 会按新视口重新 clamp,避免越界到 `totalSize - newViewport` 之外。
*/
setViewport(size: number): this;
/**
* 直接设置逻辑 offset(px),不会写 DOM。
*
* @param offset - 目标偏移量,会被 clamp 到 `[0, totalSize - viewportSize]`,小数会被四舍五入。
*
* @remarks
* 这是「只更新内部状态」的低阶入口,常用于 SSR 水合前恢复滚动位置;
* 要让 DOM 真正跳转请用 {@link Virtualizer.scrollToOffset}。
*/
setOffset(offset: number): this;
/**
* 绑定滚动容器。传入相同元素会触发一次 `syncFromElement` 但不重建事件监听;
* 传入不同元素会先 `disconnect` 旧容器再挂载新容器;传入 `null` 等价于 `disconnect()`。
*
* @param element - 滚动容器,需是可滚动元素(`overflow: auto/scroll`)。
* @returns 自身,支持链式调用。
*
* @remarks
* connect 会:
* 1. 订阅容器的 `scroll` 事件(passive)驱动 `offset` / `isScrolling`;支持原生 `scrollend` 时优先使用,否则 120ms 计时器兜底;
* 2. 订阅容器的 `ResizeObserver`(若可用)驱动 `viewportSize`;
* 3. 同步首帧:读取当前 `scrollTop` / `clientHeight` 写回到 `offset` / `viewportSize`。
*
* @example
* ```ts
* onMounted(() => virtualizer.connect(scrollRef.value))
* onBeforeUnmount(() => virtualizer.destroy())
* ```
*/
connect(element: HTMLElement | null): this;
/**
* 解绑当前滚动容器:取消 rAF 校准循环、卸下 `scroll` / `scrollend` / `ResizeObserver`、
* 清空 `mounted` 映射与 `ResizeTracker`。实例仍可被复用(再次 `connect` 到新容器)。
*
* @returns 自身,支持链式调用。
*
* @remarks 不清空测量缓存与订阅者。
*/
disconnect(): this;
/**
* 彻底销毁实例:`disconnect` + 释放 `ResizeTracker` 内部引用 + 清空订阅者。
* 销毁后不应再调用任何实例方法。
*
* @remarks 组件卸载时(Vue `onBeforeUnmount` / React `useEffect` cleanup)应调用此方法。
*/
destroy(): void;
/**
* 订阅虚拟化快照内容。
*
* @param listener - 回调函数,入参为当前虚拟化快照内容。
* @returns 取消订阅函数;多次调用幂等。
*/
subscribe(listener: VirtualizerSubscriber): () => void;
/**
* 上报单条真实测量。等价于 `measureMany([{ index, size }])`。
*
* @param index - 项的索引,范围 `[0, count)`;越界静默忽略。
* @param size - 真实像素尺寸,负数会被 clamp 到 0。
* @returns 自身,支持链式调用。
*
* @remarks
* 当数据层能直接提供真实行高 / 列宽(例如后端分页返回尺寸元信息)时使用;
* 若尺寸需由 DOM 推断,优先用 {@link Virtualizer.measureElement}。
*/
measure(index: number, size: number): this;
/**
* 批量上报真实测量。同批次内多条视口前方项的尺寸变化会被合并成**一次** `scrollTop` DOM 写入,
* 避免抖动。
*
* @param measurements - 可迭代的测量记录,每条包含 `{ index, size }`。
* @returns 自身,支持链式调用。
*
* @remarks
* 大数据量首屏优先路径:
* ```ts
* virtualizer.measureMany(rows.map((r, i) => ({ index: i, size: r.height })))
* ```
* 一次 `measureMany` 后全部项均被精确测量,后续远距离 `scrollToIndex` 不会再遇到 `totalSize` 跳变。
*/
measureMany(measurements: Iterable<VirtualMeasurement>): this;
/**
* 测量元素尺寸
*
* @param index - 项的索引,范围 `[0, count)`。
* @param element - 对应的 DOM 元素;传 `null` 表示卸载该 index(同步 `unobserve`)。
*
* @remarks
* - 支持 `ResizeObserver` 的浏览器走异步路径,避免滚动中新挂载项触发同步布局读取;
* 不支持时回退到 `getBoundingClientRect()` 并立即调用 `measure`。
* - 幂等:`measureElement(i, sameEl)` 不会重复 observe。
*
* @example
* ```html
* <div v-for="item in items" :ref="(el) => v.measureElement(item.index, el as Element)">
* ...
* </div>
* ```
*/
measureElement(index: number, element: Element | null): void;
/**
* 滚动到指定像素偏移。
*
* @param offset - 目标 offset(px),会被 clamp 到 `[0, totalSize - viewportSize]`。
* @param options - 可选 `behavior`(`'auto'` 默认 / `'smooth'`);`align` 字段对本方法无效。
* @returns 自身,支持链式调用。
*
* @remarks
* - `behavior: 'auto'`(默认):同步写 `scrollTop` + 同步 `recompute()`,`snapshot.offset` 立即等于目标值。
* - `behavior: 'smooth'`:浏览器原生平滑滚动 + rAF 校准;`snapshot.offset` 由 scroll 事件逐帧驱动,**不**预写为目标值。
* 用户在动画中手动滚动 / 再次调用 `scrollTo*` / `disconnect` 会立即终止校准,另有 5 秒硬性安全阀兜底。
* - 未绑定滚动容器时仍会更新逻辑 offset(`behavior: 'auto'`),但无 DOM 侧副作用。
*/
scrollToOffset(offset: number, options?: VirtualScrollOptions): this;
/**
* 滚动到指定项。
*
* @param index - 目标项索引,会被 clamp 到 `[0, count - 1]`,小数截断。
* @param options - 可选参数:`align` 对齐方式(默认 `'auto'`),`behavior` 滚动行为(默认 `'auto'`)。
* @returns 自身,支持链式调用。
*
* @remarks
* - `count === 0` 时为 no-op。
* - `behavior: 'smooth'` 走浏览器原生平滑滚动 + rAF 校准循环:动画中若测量更新导致目标漂移(例如 `buffer` 外的未测项在滚入视口时才拿到真实尺寸),
* 自动以 `behavior: 'auto'` 跳到修正后的目标位置。
* - smooth 期间**不要**在调用后立即同步读 `snapshot.offset`,该值由 scroll 事件驱动。
*/
scrollToIndex(index: number, options?: VirtualScrollOptions): this;
/**
* 清空所有测量缓存与位置缓存、取消 rAF 校准、把 `offset` 归零后重算快照。
*
* @returns 自身,支持链式调用。
*
* @remarks
* 常用于「数据源整体替换」(新的 `count` 与全新的数据项);
* 如果数据仅部分变化且能提供稳定 key,优先用 `getItemKey` 保留历史测量,而不是 `reset()` 全量清空。
* 不会解绑滚动容器,也不会清除订阅者。
*/
reset(): this;
/**
* 读取当前快照。同一对象引用在纯 `offset` 位移帧里会保留不变(仅就地改 `offset` / `isScrolling`),
* 因此**不要**用 `===` 判断是否需要重渲染;请对比结构字段(`range` / `totalSize` 等)或走 {@link Virtualizer.subscribe}。
*
* @returns 当前 {@link VirtualSnapshot}。
*/
getSnapshot(): VirtualSnapshot;
/**
* 读取某个 index 对应的虚拟项位置信息。会确保内部位置缓存已重算(懒计算)。
*
* @param index - 项的索引,必须落在 `[0, count)`。
* @returns 该项的 {@link VirtualItem}(包含 `start` / `end` / `size`)。
* @throws `RangeError` 当 `index` 超出 `[0, count)` 范围。
*
* @remarks 常用于业务侧计算「第 N 项是否可见」「第 N 项在视口内的相对位置」等;内部滚动对齐由 `scrollToIndex` 自动处理,无需手动调用此方法。
*/
getItem(index: number): VirtualItem;
private applyOptions;
/** 更新 count 并同步测量 / mounted 剪裁与 dirty 指针。返回是否发生变化。 */
private updateCount;
private keyOf;
/** 未测项估值:优先已测平均值(若启用),否则 estimateSize。 */
private estimate;
private pruneMeasured;
private pruneMounted;
/** 标记从指定索引开始的测量缓存已失效 */
private invalidate;
/**
* 应用测量:更新缓存、触发 invalidate、并在必要时做 scrollAdjustments 抑制抖动。
* 返回 true 表示发生了有效变化,调用方需 recompute。
*/
private applyMeasurement;
private syncAverageEstimate;
private shouldInvalidateAverage;
private advanceFirstUnmeasured;
private findNextUnmeasured;
private ensureMeasurements;
private recompute;
/** 只比较会影响视觉结构的字段;offset 变化不算"结构性差异"。 */
private isStructuralEqual;
private computeTotalSize;
private calculateRange;
private createItems;
/** 查找在指定偏移量下,第一个包含在可视区内的项的索引 */
private findStartIndex;
private findEndIndex;
private clampOffset;
private clampOffsetWithViewport;
/** align 换算:纯函数,不写 DOM;供 scrollToIndex 与 Reconciler 共用。 */
private getOffsetForIndex;
/**
* scroll 入口:non-smooth 同步写 + recompute;smooth 委托 Reconciler 的 rAF 校准循环
* 并不预写 this.offset(由 scroll 事件驱动)。
*/
private performScroll;
private syncFromElement;
private handleScroll;
private handleScrollEnd;
private kickScrollEndTimer;
private markScrollEnd;
}
//#endregion
export { EstimateSize, GetItemKey, VirtualAlign, VirtualItem, VirtualMeasurement, VirtualRange, VirtualScrollOptions, VirtualSnapshot, Virtualizer, VirtualizerOptions, VirtualizerSubscriber };//#region src/web-api/clipboard.d.ts
/** 剪切板 */
declare const clipboard: {
/**
* 将一段文本写入系统剪切板
* @param data 写入的数据
*/
copy(data: string | Blob | Array<string | Blob>): Promise<void>;
/**
* 从剪切板中读取纯文本数据
* @returns 读取到的文本数据
*/
read(): Promise<Blob[]>;
/**
* 读取文本内容
* @returns 剪切板中的文本内容
*/
readText(): Promise<string>;
};
//#endregion
export { clipboard };//#region src/web-api/permission.d.ts
type WebPermissionName = PermissionName | 'clipboard-read' | 'clipboard-write';
declare function queryPermission(name: WebPermissionName): Promise<boolean>;
//#endregion
export { WebPermissionName, queryPermission };import { AliasRequestConfig, ClientConfig, HTTPClientPlugin, HTTPResponse, IHTTPClient, RequestConfig } from "./types.js";
import { HttpEngine } from "./engine/engine.js";
//#region src/client.d.ts
/**
* 合并请求配置:headers / query 做对象级合并;标量类字段仅在 patch 显式传入且非 undefined 时覆盖。
* `undefined` 不用于清空已有配置。
*/
declare function mergeRequestConfig(base: RequestConfig, patch: RequestConfig): RequestConfig;
/**
* HTTP 请求客户端
*
* 提供了一个符合人体工学的,跨端(node 和浏览器)的 HTTP 请求客户端。
* 支持插件系统,可以灵活地组合和增强请求客户端。
*
* @example
* ```ts
* import { HTTPClient } from '@cat-kit/http'
*
* const http = new HTTPClient('/api', {
* origin: 'http://localhost:8080',
* timeout: 30 * 1000
* })
*
* // 发起请求
* http.request('/user', { method: 'get' }).then(res => {
* // ...do some things
* })
*
* // 请求别名
* http.get('/user', { query: { name: 'Zhang San' } }).then(res => {
* // ...do some things
* })
* ```
*/
declare class HTTPClient implements IHTTPClient {
/** 请求前缀 */
private prefix;
/** 客户端配置 */
private config;
/** 请求引擎 */
private engine;
/** 父 client(仅由 group() 内部赋值;根 client 为 undefined) */
private parent?;
/** 当前 client 自身持有的插件列表(不含父链继承) */
private ownPlugins;
/**
* 创建 HTTP 客户端实例
* @param prefix 请求前缀
* @param config 客户端配置
*/
constructor(prefix?: string, config?: ClientConfig);
/**
* 计算当前 client 在运行时生效的插件列表:父链在前、子在后
*/
private getEffectivePlugins;
getEngine(): HttpEngine;
/**
* 注册插件(运行时动态装配)
* - 插件必须拥有非空字符串 `name`,否则抛 HTTPError({ code: 'PLUGIN' })
* - 插件名在 client 自身及其父链范围内必须唯一,冲突时抛 HTTPError({ code: 'PLUGIN' })
*/
registerPlugin(plugin: HTTPClientPlugin): void;
/**
* 内部注册插件(不做 name 有效性校验,调用方保证已校验通过)
* - 校验插件名在整个生效链(父链+自身)中的唯一性,冲突时抛 HTTPError
*/
private registerPluginInternal;
/**
* 为同域请求自动附加 XSRF Token(通过 Cookie → Header 注入)
* - 不同域请求直接跳过
* - Cookie 不存在时跳过
*/
private applyXsrfHeader;
/**
* 拼接完整请求 URL:前缀 + origin + query 参数
* - 若 url 已是完整 URL 则跳过拼接,仅追加 query 参数
*/
private getRequestUrl;
/** 判断是否为完整 URL(含协议头或以 // 开头) */
private isAbsoluteUrl;
/**
* 将 config.query 序列化并拼接到 URL
* - 支持数组值(多 key 追加)、对象值(JSON 序列化)、null/undefined
*/
private appendQueryParams;
/**
* 获取请求配置, 合并 HTTPClient 实例配置和当前配置
* @param config 当前请求配置
* @returns 合并后的请求配置
*/
private getRequestConfig;
/**
* 依次执行插件 onError 钩子,取首个有效的恢复响应
* - 只有返回 HTTPResponse 时才视为恢复;后续插件仍会执行(用于副作用)
*/
private runOnErrorPlugins;
/**
* 执行单次请求的核心流程(含插件管道)
*/
private _executeRequest;
/**
* 发送 HTTP 请求
* @param url 请求地址
* @param config 请求配置
* @returns Promise<HTTPResponse>
*/
request<T = any>(url: string, config?: RequestConfig): Promise<HTTPResponse<T>>;
/**
* 发送 GET 请求
* @param url 请求地址
* @param config 请求选项
* @returns Promise<HTTPResponse>
*/
get<T>(url: string, config?: AliasRequestConfig): Promise<HTTPResponse<T>>;
/**
* 发送 POST 请求
* @param url 请求地址
* @param body 请求体
* @param config 请求选项
* @returns Promise<HTTPResponse>
*/
post<T = any>(url: string, body?: RequestConfig['body'], config?: Omit<RequestConfig, 'method' | 'body'>): Promise<HTTPResponse<T>>;
/**
* 发送 PUT 请求
* @param url 请求地址
* @param body 请求体
* @param config 请求选项
* @returns Promise<HTTPResponse>
*/
put<T = any>(url: string, body?: RequestConfig['body'], config?: Omit<RequestConfig, 'method' | 'body'>): Promise<HTTPResponse<T>>;
/**
* 发送 DELETE 请求
* @param url 请求地址
* @param config 请求选项
* @returns Promise<HTTPResponse>
*/
delete<T = any>(url: string, config?: Omit<RequestConfig, 'method'>): Promise<HTTPResponse<T>>;
/**
* 发送 PATCH 请求
* @param url 请求地址
* @param body 请求体
* @param config 请求选项
* @returns Promise<HTTPResponse>
*/
patch<T = any>(url: string, body?: RequestConfig['body'], config?: Omit<RequestConfig, 'method' | 'body'>): Promise<HTTPResponse<T>>;
/**
* 发送 HEAD 请求
* @param url 请求地址
* @param config 请求选项
* @returns Promise<HTTPResponse>
*/
head<T = any>(url: string, config?: Omit<RequestConfig, 'method'>): Promise<HTTPResponse<T>>;
/**
* 发送 OPTIONS 请求
* @param url 请求地址
* @param config 请求选项
* @returns Promise<HTTPResponse>
*/
options<T = any>(url: string, config?: Omit<RequestConfig, 'method'>): Promise<HTTPResponse<T>>;
/**
* 中止所有请求
*/
abort(): void;
/**
* 创建请求分组
* @param prefix 分组前缀
* @returns HTTPClient 新的客户端实例
*
* 插件继承语义:
* - 子 client 通过父链继承插件;父后续 `registerPlugin` 会自动反映到子(父影响子)
* - 子 `registerPlugin` 仅改动 `child.ownPlugins`(子不影响父)
* - 同名校验跨父子层级生效
*
* 注意:父子共享同一 `engine` 实例,`abort()` 会中止父或子任意一方触发该引擎的所有在途请求。
*
* @example
* ```ts
* const http = new HTTPClient()
* const userGroup = http.group('/user')
*
* // 等同于 http.get('/user/profile')
* userGroup.get('/profile')
*
* // 中止分组中的所有请求
* userGroup.abort()
* ```
*/
group(prefix: string): HTTPClient;
}
//#endregion
export { HTTPClient, mergeRequestConfig };import { HTTPResponse, RequestConfig } from "../types.js";
//#region src/engine/engine.d.ts
declare abstract class HttpEngine {
/**
* 发送 HTTP 请求
* @param url 请求 URL
* @param config 请求配置
*/
abstract request<T = any>(url: string, config: RequestConfig): Promise<HTTPResponse<T>>;
/**
* 中止 HTTP 请求
*/
abstract abort(): void;
}
//#endregion
export { HttpEngine };import { HTTPResponse, RequestConfig } from "../types.js";
import { HttpEngine } from "./engine.js";
//#region src/engine/fetch.d.ts
declare class FetchEngine extends HttpEngine {
private controllers;
request<T = any>(url: string, config?: RequestConfig): Promise<HTTPResponse<T>>;
/**
* 以流式方式读取响应体并透传下载进度回调
* - 分片累积后合并为完整 Uint8Array 再解码
*/
private parseResponseWithDownloadProgress;
/**
* 将文本解析为 JSON
* - 空文本返回 null
* - 解析失败抛 PARSE 错误(含响应上下文)
*/
private parseJSONBody;
/**
* 将原始字节数组按指定响应类型解码
* - arraybuffer: 返回 .buffer slice
* - blob: 构建 Blob 对象
* - text/json: 先 TextDecoder 解码,json 再调用 parseJSONBody
*/
private decodeBytes;
/**
* 从 Response 中按指定类型直接解析数据(非流式路径)
* - text: response.text()
* - blob: response.blob()
* - arraybuffer: response.arrayBuffer()
* - json(默认): 先 text() 再 JSON.parse
*/
private parseResponseData;
abort(): void;
}
//#endregion
export { FetchEngine };import { HTTPResponse, RequestConfig } from "../types.js";
import { HttpEngine } from "./engine.js";
//#region src/engine/xhr.d.ts
declare class XHREngine extends HttpEngine {
/** 请求中的实例 */
private xhrSets;
request<T = any>(url: string, config?: RequestConfig): Promise<HTTPResponse<T>>;
/**
* 解析响应头
* @param headerStr 响应头字符串
* @returns 解析后的响应头对象(同名多值以逗号+空格合并;set-cookie 以换行分隔)
*/
private parseHeaders;
/** 将 headers 设置到 XMLHttpRequest 实例 */
sendHeaders(xhr: XMLHttpRequest, headers: Record<string, string>): void;
abort(): void;
}
//#endregion
export { XHREngine };import { AliasRequestConfig, ClientConfig, ClientPlugin, HTTPClientPlugin, HTTPError, HTTPErrorOptions, HTTPResponse, HttpErrorCode, IHTTPClient, PluginHookResult, ProgressInfo, RequestConfig, RequestContext, RequestMethod } from "./types.js";
import { HttpEngine } from "./engine/engine.js";
import { HTTPClient, mergeRequestConfig } from "./client.js";
import { XHREngine } from "./engine/xhr.js";
import { FetchEngine } from "./engine/fetch.js";
import { HTTPMethodOverridePlugin, HTTPMethodOverridePluginOptions, MethodOverridePlugin, MethodOverridePluginOptions } from "./plugins/method-override.js";
import { HTTPTokenPlugin, HTTPTokenPluginOptions, TokenPlugin, TokenPluginOptions } from "./plugins/token.js";
export { AliasRequestConfig, ClientConfig, ClientPlugin, FetchEngine, HTTPClient, HTTPClientPlugin, HTTPError, HTTPErrorOptions, HTTPMethodOverridePlugin, HTTPMethodOverridePluginOptions, HTTPResponse, HTTPTokenPlugin, HTTPTokenPluginOptions, HttpEngine, HttpErrorCode, IHTTPClient, MethodOverridePlugin, MethodOverridePluginOptions, PluginHookResult, ProgressInfo, RequestConfig, RequestContext, RequestMethod, TokenPlugin, TokenPluginOptions, XHREngine, mergeRequestConfig };{
"generatedAt": "2026-06-22T15:20:06.138Z",
"npmName": "@cat-kit/http",
"version": "1.1.6",
"kind": "dts",
"artifactCount": 8
}import { HTTPClientPlugin, RequestMethod } from "../types.js";
//#region src/plugins/method-override.d.ts
/**
* 方法重写插件配置
*/
interface HTTPMethodOverridePluginOptions {
/**
* 需要被重写的请求方法
* - 默认为 ['DELETE', 'PUT', 'PATCH']
*/
methods?: RequestMethod[];
/**
* 重写后的请求方法
* - 默认为 'POST'
*/
overrideMethod?: RequestMethod;
/**
* 方法覆盖请求头名称
* - 默认为 'X-HTTP-Method-Override'
*/
headerName?: string;
}
type MethodOverridePluginOptions = HTTPMethodOverridePluginOptions;
/**
* 方法重写插件
*
* 用于绕过某些环境对特定 HTTP 方法的限制
*
* @example
* ```ts
* import { MethodOverridePlugin, HTTPClient } from '@cat-kit/http'
* const http = new HTTPClient('', {
* plugins: [
* MethodOverridePlugin()
* ]
* })
* ```
*/
declare function HTTPMethodOverridePlugin(options?: HTTPMethodOverridePluginOptions): HTTPClientPlugin;
declare const MethodOverridePlugin: typeof HTTPMethodOverridePlugin;
//#endregion
export { HTTPMethodOverridePlugin, HTTPMethodOverridePluginOptions, MethodOverridePlugin, MethodOverridePluginOptions };本目录由脚本生成,勿手改。内容为 @cat-kit/http 包 dist 下 .d.ts 的镜像(与 npm typings 对齐)。
- 入口:通常从
index.d.ts起读(若有)。 - 元数据:
manifest.json
{
"generatedAt": "2026-06-22T15:20:06.138Z",
"npmName": "@cat-kit/tsconfig",
"version": "2.0.1",
"kind": "json",
"artifactCount": 6
}本目录由脚本生成,勿手改。内容为 @cat-kit/tsconfig 包内与 npm files 一致的 JSON 预设与说明。
- 入口:通常从
index.d.ts起读(若有)。 - 元数据:
manifest.json
{
// Bun 侧脚本沿用通用配置,再根据运行时做小范围覆盖
"extends": "./tsconfig.json",
"compilerOptions": {
// 保持与根配置一致的产出目标,方便利用最新版 Bun 特性
"target": "ESNext",
// Bun 环境不需要 DOM 声明,精简到纯 ESNext
"lib": ["ESNext"],
// 自动注入 @types/bun,获得 fs、path 等 API 智能提示
"types": ["bun"]
}
}
{
// 浏览器端 Demo 的增量配置:补齐 DOM API
"extends": "./tsconfig.json",
"compilerOptions": {
// 面向现代浏览器,包含 DOM 与迭代器相关的声明
"lib": ["ESNext", "DOM", "DOM.Iterable"],
// 这里无需额外的全局类型,保留默认值即可
"types": []
}
}