Files
TrueGrowth/packages/utils
jiam 5119ac0ef8
Some checks failed
CI / main (push) Has been cancelled
CI / release-e2e (push) Has been cancelled
Sync latest TrueGrowth updates
2026-07-08 02:03:18 +08:00
..
2026-07-08 02:03:18 +08:00
2026-07-07 09:36:36 +08:00
2026-07-07 09:36:36 +08:00
2026-07-07 09:36:36 +08:00
2026-07-07 09:36:36 +08:00

@aitu/utils

Opentu 项目的共享工具函数库,提供常用的工具函数和格式化方法。

功能模块

函数工具 (Function)

debounce

防抖函数,延迟执行函数调用。

import { debounce } from '@aitu/utils';

const debouncedFn = debounce((value: string) => {
  console.log(value);
}, 300);

debouncedFn('hello'); // 300ms 后执行

throttle

节流函数,限制函数调用频率。

import { throttle } from '@aitu/utils';

const throttledFn = throttle((event: MouseEvent) => {
  console.log(event);
}, 100);

window.addEventListener('scroll', throttledFn);

格式化工具 (Format)

formatFileSize

格式化文件大小为人类可读格式。

import { formatFileSize } from '@aitu/utils';

formatFileSize(1024); // "1 KB"
formatFileSize(1048576); // "1 MB"
formatFileSize(1073741824); // "1 GB"

formatDate

格式化时间戳为 YYYY-MM-DD HH:mm:ss 格式。

import { formatDate } from '@aitu/utils';

formatDate(Date.now()); // "2026-01-06 20:30:45"
formatDate(1704556800000); // "2024-01-06 20:00:00"

formatDuration

格式化毫秒数为可读的时长字符串。

import { formatDuration } from '@aitu/utils';

formatDuration(1000); // "1s"
formatDuration(65000); // "1m 5s"
formatDuration(3665000); // "1h 1m 5s"

字符串工具 (String)

sanitizeFilename

清理字符串使其适合作为文件名。

import { sanitizeFilename } from '@aitu/utils';

sanitizeFilename('Hello World! 你好世界'); // "Hello-World-你好世界"
sanitizeFilename('file@#$%name.txt', 20); // "filename.txt"

truncate

截断字符串到指定长度并添加省略号。

import { truncate } from '@aitu/utils';

truncate('Hello World', 5); // "Hello..."
truncate('Hello World', 20); // "Hello World"
truncate('Hello World', 8, '…'); // "Hello W…"

capitalize

首字母大写。

import { capitalize } from '@aitu/utils';

capitalize('hello world'); // "Hello world"
capitalize('HELLO'); // "HELLO"

toKebabCase

转换为 kebab-case 格式。

import { toKebabCase } from '@aitu/utils';

toKebabCase('HelloWorld'); // "hello-world"
toKebabCase('hello_world'); // "hello-world"
toKebabCase('Hello World'); // "hello-world"

toCamelCase

转换为 camelCase 格式。

import { toCamelCase } from '@aitu/utils';

toCamelCase('hello-world'); // "helloWorld"
toCamelCase('hello_world'); // "helloWorld"
toCamelCase('Hello World'); // "helloWorld"

颜色工具 (Color)

提供纯函数的颜色处理工具,支持 hex 颜色转换和透明度计算。

import {
  applyOpacityToHex,
  hexAlphaToOpacity,
  removeHexAlpha,
  isValidColor,
  TRANSPARENT,
  NO_COLOR,
  WHITE
} from '@aitu/utils';

// 应用不透明度到 hex 颜色
applyOpacityToHex('#FF0000', 50); // "#FF000080" (50% 不透明度)

// 提取 hex 颜色的不透明度
hexAlphaToOpacity('#FF000080'); // 50

// 移除 alpha 通道
removeHexAlpha('#FF0000FF'); // "#FF0000"

// 颜色常量
console.log(TRANSPARENT); // "TRANSPARENT"
console.log(NO_COLOR); // "NO_COLOR"
console.log(WHITE); // "#FFFFFF"

日志工具 (Logger)

提供环境感知的日志工具,开发环境显示调试信息,生产环境仅显示警告和错误。

import { createLogger, logger } from '@aitu/utils';

// 创建命名空间日志器
const moduleLogger = createLogger('MyModule');
moduleLogger.debug('调试信息'); // 仅开发环境
moduleLogger.info('普通信息'); // 仅开发环境
moduleLogger.warn('警告信息'); // 始终显示
moduleLogger.error('错误信息'); // 始终显示

// 使用默认日志器
logger.debug('调试消息');
logger.error('发生错误');

异步工具 (Async)

Promise 和事件处理相关的工具函数。

import { isPromiseLike, composeEventHandlers } from '@aitu/utils';

// 类型守卫:检查值是否为 Promise
const value: unknown = fetchData();
if (isPromiseLike(value)) {
  value.then(data => console.log(data));
}

// 组合多个事件处理器
const userHandler = (e) => console.log('用户处理');
const libHandler = (e) => console.log('库处理');
const composed = composeEventHandlers(userHandler, libHandler);
button.addEventListener('click', composed);

数组工具 (Array)

数组操作和转换的工具函数。

import { splitRows, chunk } from '@aitu/utils';

// 将数组分割为指定大小的行
const items = [1, 2, 3, 4, 5, 6, 7];
splitRows(items, 3); // [[1, 2, 3], [4, 5, 6], [7]]

// chunk 是 splitRows 的别名
chunk(items, 2); // [[1, 2], [3, 4], [5, 6], [7]]

TypeScript 类型工具 (Types)

TypeScript 类型推断辅助类型。

import type { ResolutionType, ValueOf } from '@aitu/utils';

// 提取 Promise 解析类型
async function fetchUser() {
  return { id: 1, name: 'Alice' };
}
type User = ResolutionType<typeof fetchUser>; // { id: number; name: string }

// 提取对象值类型
const colors = {
  red: '#FF0000',
  blue: '#0000FF',
} as const;
type ColorValue = ValueOf<typeof colors>; // '#FF0000' | '#0000FF'

编码工具 (Encoding)

数据编码和格式转换工具。

import { base64ToBlob } from '@aitu/utils';

// 将 base64 data URL 转换为 Blob
const dataUrl = 'data:image/png;base64,iVBORw0KGgo...';
const blob = base64ToBlob(dataUrl);

// 使用 Blob 进行文件下载、上传等操作
const url = URL.createObjectURL(blob);

URL 工具 (URL)

URL 解析、域名检查和文件扩展名检测工具。

import {
  isDomainMatch,
  isVolcesDomain,
  getFileExtension,
  getHostname,
  isDataURL,
  isAbsoluteURL,
} from '@aitu/utils';

// 检查 URL 是否匹配特定域名模式
isDomainMatch('https://cdn.example.com/file.jpg', ['.example.com']);
// true

// 检查是否为火山引擎域名(专用函数)
isVolcesDomain('https://cdn.volces.com/video.mp4');
// true

// 从 URL 或 MIME 类型获取文件扩展名
getFileExtension('https://example.com/image.jpg');
// "jpg"
getFileExtension('data:image/svg+xml;base64,...');
// "svg"
getFileExtension('https://api.example.com/download/123', 'video/mp4');
// "mp4"

// 提取主机名
getHostname('https://www.example.com/path');
// "www.example.com"

// 检查是否为 data URL
isDataURL('data:image/png;base64,...');
// true

// 检查是否为绝对 URL
isAbsoluteURL('https://example.com/path');
// true

开发

# 安装依赖
pnpm install

# 类型检查
pnpm exec tsc --noEmit -p packages/utils

# 代码检查
pnpm exec eslint packages/utils/src

# 构建
pnpm exec nx build utils

# 运行测试
pnpm exec nx test utils

# 运行测试并生成覆盖率报告
cd packages/utils && pnpm exec vitest run --coverage

License

MIT