@brix-sdk/platform-shared 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/debounce.ts","../src/utils/index.ts","../src/utils/guards.ts","../src/utils/clone.ts","../src/utils/format.ts","../src/utils/timing.ts","../src/utils/validators.ts"],"names":["delay"],"mappings":"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","file":"chunk-OGZE7TFO.js","sourcesContent":["/**\r\n * Copyright 2026 Brix Platform Authors\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @file Debounce and throttle utilities\r\n * @description Provides debounce and throttle functions\r\n * @module @brix/platform-shared/utils/debounce\r\n * @version 3.0.0\r\n */\r\n\r\n/**\r\n * Debounce function\r\n * \r\n * Delays function execution until stopped calling for a period of time.\r\n * \r\n * @param fn - Function to debounce\r\n * @param delay - Delay in milliseconds\r\n * @returns Debounced function\r\n * \r\n * @example\r\n * ```typescript\r\n * const debouncedSearch = debounce((query: string) => {\r\n * search(query);\r\n * }, 300);\r\n * \r\n * input.addEventListener('input', (e) => {\r\n * debouncedSearch(e.target.value);\r\n * });\r\n * ```\r\n */\r\nexport function debounce<T extends (...args: unknown[]) => unknown>(\r\n fn: T,\r\n delay: number\r\n): (this: ThisParameterType<T>, ...args: Parameters<T>) => void {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n \r\n return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n }\r\n const context = this;\r\n timeoutId = setTimeout(() => {\r\n fn.apply(context, args);\r\n timeoutId = null;\r\n }, delay);\r\n };\r\n}\r\n\r\n/**\r\n * Throttle function\r\n * \r\n * Limits function execution frequency to execute only once within specified time.\r\n * \r\n * @param fn - Function to throttle\r\n * @param limit - Limit in milliseconds\r\n * @returns Throttled function\r\n * \r\n * @example\r\n * ```typescript\r\n * const throttledScroll = throttle(() => {\r\n * updatePosition();\r\n * }, 100);\r\n * \r\n * window.addEventListener('scroll', throttledScroll);\r\n * ```\r\n */\r\nexport function throttle<T extends (...args: unknown[]) => unknown>(\r\n fn: T,\r\n limit: number\r\n): (this: ThisParameterType<T>, ...args: Parameters<T>) => void {\r\n let inThrottle = false;\r\n let lastArgs: Parameters<T> | null = null;\r\n let lastContext: ThisParameterType<T> | null = null;\r\n \r\n return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\r\n if (!inThrottle) {\r\n fn.apply(this, args);\r\n inThrottle = true;\r\n \r\n setTimeout(() => {\r\n inThrottle = false;\r\n if (lastArgs !== null && lastContext !== null) {\r\n fn.apply(lastContext, lastArgs);\r\n lastArgs = null;\r\n lastContext = null;\r\n }\r\n }, limit);\r\n } else {\r\n lastArgs = args;\r\n lastContext = this;\r\n }\r\n };\r\n}\r\n","/**\r\n * Copyright 2026 Brix Platform Authors\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @file Utility functions export\r\n * @description Export all utility functions\r\n * @module @brix/platform-shared/utils\r\n * @version 3.0.0\r\n */\r\n\r\nexport { debounce, throttle } from './debounce';\r\nexport { \r\n generateUUID, \r\n isValidUUID,\r\n // 短 ID 和 Nano ID\r\n generateShortId,\r\n generateNanoId,\r\n // 时间戳 ID\r\n generateTimestampId,\r\n extractTimestampFromId,\r\n // 雪花 ID\r\n SimpleSnowflake,\r\n generateSnowflakeId,\r\n // 序列 ID 生成器\r\n createSequenceIdGenerator,\r\n createDailySequenceIdGenerator,\r\n} from './id';\r\nexport {\r\n isNullOrUndefined,\r\n isNotNullOrUndefined,\r\n isString,\r\n isNumber,\r\n isBoolean,\r\n isFunction,\r\n isObject,\r\n isArray,\r\n isPromise,\r\n assertNotNull,\r\n assert,\r\n} from './guards';\r\nexport { deepClone, deepMerge } from './clone';\r\n\r\n// ============================================================\r\n// Format utilities\r\n// ============================================================\r\n\r\nexport {\r\n formatDate,\r\n formatRelativeTime,\r\n formatCurrency,\r\n formatNumber,\r\n formatPercent,\r\n formatFileSize,\r\n parseFileSize,\r\n formatDuration,\r\n capitalize,\r\n truncate,\r\n kebabCase,\r\n camelCase,\r\n} from './format';\r\n\r\n// ============================================================\r\n// Timing utilities\r\n// ============================================================\r\n\r\nexport {\r\n delay,\r\n delayWith,\r\n cancelableDelay,\r\n withTimeout,\r\n nextTick,\r\n requestIdleCallback,\r\n} from './timing';\r\n\r\n// Note: debounce and throttle are exported above from './debounce'\r\n// The './timing' module has additional debounce/throttle variants\r\n\r\n// ============================================================\r\n// Validator utilities\r\n// ============================================================\r\n\r\nexport {\r\n isValidEmail,\r\n isValidPhone,\r\n isValidUrl,\r\n isValidIPv4,\r\n isValidJSON,\r\n isValidIdCard,\r\n isValidUnifiedCreditCode,\r\n isValidBankCard,\r\n checkPasswordStrength,\r\n isEmpty,\r\n isNumeric,\r\n isInteger,\r\n isPositive,\r\n isInRange,\r\n type PasswordStrength,\r\n type PasswordStrengthResult,\r\n} from './validators';\r\n","/**\r\n * Copyright 2026 Brix Platform Authors\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @file Type guard utilities\r\n * @description Provides type guards and assertion functions\r\n * @module @brix/platform-shared/utils/guards\r\n * @version 3.0.0\r\n */\r\n\r\n/**\r\n * Check if value is null or undefined\r\n * \r\n * @param value - Value to check\r\n * @returns Whether value is null or undefined\r\n */\r\nexport function isNullOrUndefined(value: unknown): value is null | undefined {\r\n return value === null || value === undefined;\r\n}\r\n\r\n/**\r\n * Check if value is non-null and non-undefined\r\n * \r\n * @param value - Value to check\r\n * @returns Whether value is non-null\r\n */\r\nexport function isNotNullOrUndefined<T>(value: T): value is NonNullable<T> {\r\n return value !== null && value !== undefined;\r\n}\r\n\r\n/**\r\n * Check if value is a string\r\n * \r\n * @param value - Value to check\r\n * @returns Whether value is a string\r\n */\r\nexport function isString(value: unknown): value is string {\r\n return typeof value === 'string';\r\n}\r\n\r\n/**\r\n * Check if value is a number\r\n * \r\n * @param value - Value to check\r\n * @returns Whether value is a number\r\n */\r\nexport function isNumber(value: unknown): value is number {\r\n return typeof value === 'number' && !Number.isNaN(value);\r\n}\r\n\r\n/**\r\n * Check if value is a boolean\r\n * \r\n * @param value - Value to check\r\n * @returns Whether value is a boolean\r\n */\r\nexport function isBoolean(value: unknown): value is boolean {\r\n return typeof value === 'boolean';\r\n}\r\n\r\n/**\r\n * Check if value is a function\r\n * \r\n * @param value - Value to check\r\n * @returns Whether value is a function\r\n */\r\nexport function isFunction(value: unknown): value is (...args: unknown[]) => unknown {\r\n return typeof value === 'function';\r\n}\r\n\r\n/**\r\n * Check if value is an object\r\n * \r\n * @param value - Value to check\r\n * @returns Whether value is an object\r\n */\r\nexport function isObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n}\r\n\r\n/**\r\n * Check if value is an array\r\n * \r\n * @param value - Value to check\r\n * @returns Whether value is an array\r\n */\r\nexport function isArray(value: unknown): value is unknown[] {\r\n return Array.isArray(value);\r\n}\r\n\r\n/**\r\n * Check if value is a Promise\r\n * \r\n * @param value - Value to check\r\n * @returns Whether value is a Promise\r\n */\r\nexport function isPromise(value: unknown): value is Promise<unknown> {\r\n return value instanceof Promise || (\r\n isObject(value) &&\r\n isFunction((value as Record<string, unknown>).then) &&\r\n isFunction((value as Record<string, unknown>).catch)\r\n );\r\n}\r\n\r\n/**\r\n * Assert value is non-null\r\n * \r\n * @param value - Value to assert\r\n * @param message - Error message\r\n */\r\nexport function assertNotNull<T>(\r\n value: T,\r\n message = 'Value is null or undefined'\r\n): asserts value is NonNullable<T> {\r\n if (isNullOrUndefined(value)) {\r\n throw new Error(message);\r\n }\r\n}\r\n\r\n/**\r\n * Assert condition is true\r\n * \r\n * @param condition - Condition to assert\r\n * @param message - Error message\r\n */\r\nexport function assert(\r\n condition: boolean,\r\n message = 'Assertion failed'\r\n): asserts condition {\r\n if (!condition) {\r\n throw new Error(message);\r\n }\r\n}\r\n","/**\r\n * Copyright 2026 Brix Platform Authors\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @file Deep clone utility\r\n * @description Provides deep clone functions\r\n * @module @brix/platform-shared/utils/clone\r\n * @version 3.0.0\r\n */\r\n\r\n/**\r\n * Deep clone an object\r\n * \r\n * Supports Date, RegExp, Map, Set, and other types.\r\n * \r\n * @param obj - Object to clone\r\n * @returns Cloned object\r\n */\r\nexport function deepClone<T>(obj: T): T {\r\n if (obj === null || typeof obj !== 'object') {\r\n return obj;\r\n }\r\n \r\n // Date\r\n if (obj instanceof Date) {\r\n return new Date(obj.getTime()) as unknown as T;\r\n }\r\n \r\n // RegExp\r\n if (obj instanceof RegExp) {\r\n return new RegExp(obj.source, obj.flags) as unknown as T;\r\n }\r\n \r\n // Map\r\n if (obj instanceof Map) {\r\n const clonedMap = new Map();\r\n obj.forEach((value, key) => {\r\n clonedMap.set(deepClone(key), deepClone(value));\r\n });\r\n return clonedMap as unknown as T;\r\n }\r\n \r\n // Set\r\n if (obj instanceof Set) {\r\n const clonedSet = new Set();\r\n obj.forEach((value) => {\r\n clonedSet.add(deepClone(value));\r\n });\r\n return clonedSet as unknown as T;\r\n }\r\n \r\n // Array\r\n if (Array.isArray(obj)) {\r\n return obj.map((item) => deepClone(item)) as unknown as T;\r\n }\r\n \r\n // Object\r\n const clonedObj: Record<string, unknown> = {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n clonedObj[key] = deepClone((obj as Record<string, unknown>)[key]);\r\n }\r\n }\r\n \r\n return clonedObj as T;\r\n}\r\n\r\n/**\r\n * Deep merge objects\r\n * \r\n * @param target - Target object\r\n * @param sources - Source objects array\r\n * @returns Merged object\r\n */\r\nexport function deepMerge<T extends Record<string, unknown>>(\r\n target: T,\r\n ...sources: Partial<T>[]\r\n): T {\r\n if (!sources.length) {\r\n return target;\r\n }\r\n \r\n const source = sources.shift();\r\n \r\n if (source === undefined) {\r\n return target;\r\n }\r\n \r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n const targetValue = target[key];\r\n const sourceValue = source[key];\r\n \r\n if (\r\n typeof sourceValue === 'object' &&\r\n sourceValue !== null &&\r\n !Array.isArray(sourceValue) &&\r\n typeof targetValue === 'object' &&\r\n targetValue !== null &&\r\n !Array.isArray(targetValue)\r\n ) {\r\n target[key] = deepMerge(\r\n targetValue as Record<string, unknown>,\r\n sourceValue as Record<string, unknown>\r\n ) as T[Extract<keyof T, string>];\r\n } else if (sourceValue !== undefined) {\r\n target[key] = deepClone(sourceValue) as T[Extract<keyof T, string>];\r\n }\r\n }\r\n }\r\n \r\n return deepMerge(target, ...sources);\r\n}\r\n","/**\r\n * @file format.ts\r\n * @description 格式化工具函数集\r\n * @module @brix/utils/format\r\n * @version 3.0.0\r\n * \r\n * 【模块说明】\r\n * 提供各种数据格式化工具,包括文件大小、日期时间、数字、货币、字符串等。\r\n * 这些函数遵循中国大陆的常用格式习惯,同时支持国际化配置。\r\n * \r\n * 【使用场景】\r\n * - 文件大小:上传下载、存储空间显示\r\n * - 日期格式化:时间显示、相对时间、倒计时\r\n * - 数字格式化:金额、百分比、统计数据\r\n * - 字符串处理:截断、大小写转换\r\n * \r\n * @license Apache-2.0\r\n */\r\n\r\n// ============================================================\r\n// 文件大小格式化\r\n// ============================================================\r\n\r\n/**\r\n * 格式化文件大小\r\n * \r\n * 【功能说明】\r\n * 将字节数转换为人类可读的文件大小格式。\r\n * 自动选择合适的单位(B、KB、MB、GB 等)。\r\n * \r\n * @param bytes 字节数\r\n * @param decimals 小数位数(默认 2)\r\n * @returns 格式化后的字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * formatFileSize(0); // '0 B'\r\n * formatFileSize(1024); // '1 KB'\r\n * formatFileSize(1048576); // '1 MB'\r\n * formatFileSize(1073741824); // '1 GB'\r\n * formatFileSize(1536, 1); // '1.5 KB'\r\n * ```\r\n */\r\nexport function formatFileSize(bytes: number, decimals: number = 2): string {\r\n if (bytes === 0) return '0 B';\r\n if (bytes < 0) return '-' + formatFileSize(-bytes, decimals);\r\n\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n const index = Math.min(i, sizes.length - 1);\r\n\r\n return `${parseFloat((bytes / Math.pow(k, index)).toFixed(decimals))} ${sizes[index]}`;\r\n}\r\n\r\n/**\r\n * 解析文件大小字符串为字节数\r\n * \r\n * 【功能说明】\r\n * 将文件大小字符串(如 '1 MB', '500KB')解析为字节数。\r\n * 支持各种常见格式,大小写不敏感。\r\n * \r\n * @param sizeStr 文件大小字符串\r\n * @returns 字节数(解析失败返回 0)\r\n * \r\n * @example\r\n * ```typescript\r\n * parseFileSize('1 KB'); // 1024\r\n * parseFileSize('1.5MB'); // 1572864\r\n * parseFileSize('2 GB'); // 2147483648\r\n * parseFileSize('invalid'); // 0\r\n * ```\r\n */\r\nexport function parseFileSize(sizeStr: string): number {\r\n const units: Record<string, number> = {\r\n B: 1,\r\n KB: 1024,\r\n MB: 1024 ** 2,\r\n GB: 1024 ** 3,\r\n TB: 1024 ** 4,\r\n PB: 1024 ** 5,\r\n };\r\n\r\n const match = sizeStr.trim().toUpperCase().match(/^([\\d.]+)\\s*([A-Z]+)$/);\r\n if (!match) return 0;\r\n\r\n const [, value, unit] = match;\r\n return parseFloat(value) * (units[unit] || 1);\r\n}\r\n\r\n// ============================================================\r\n// 日期格式化\r\n// ============================================================\r\n\r\n/**\r\n * 格式化日期\r\n * \r\n * 【功能说明】\r\n * 将日期格式化为指定格式的字符串。\r\n * 支持常用的占位符,如 YYYY、MM、DD、HH、mm、ss 等。\r\n * \r\n * 【支持的占位符】\r\n * - YYYY: 四位年份\r\n * - YY: 两位年份\r\n * - MM: 两位月份(01-12)\r\n * - M: 月份(1-12)\r\n * - DD: 两位日期(01-31)\r\n * - D: 日期(1-31)\r\n * - HH: 两位小时(00-23)\r\n * - H: 小时(0-23)\r\n * - mm: 两位分钟(00-59)\r\n * - m: 分钟(0-59)\r\n * - ss: 两位秒(00-59)\r\n * - s: 秒(0-59)\r\n * - SSS: 毫秒\r\n * \r\n * @param date 日期(Date 对象、时间戳或日期字符串)\r\n * @param format 格式字符串(默认 'YYYY-MM-DD HH:mm:ss')\r\n * @returns 格式化后的日期字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * formatDate(new Date(), 'YYYY-MM-DD'); // '2024-01-01'\r\n * formatDate(Date.now(), 'YYYY-MM-DD HH:mm:ss'); // '2024-01-01 12:00:00'\r\n * formatDate(new Date(), 'YYYY年MM月DD日'); // '2024年01月01日'\r\n * formatDate(new Date(), 'MM/DD/YYYY'); // '01/01/2024'\r\n * ```\r\n */\r\nexport function formatDate(\r\n date: Date | number | string,\r\n format: string = 'YYYY-MM-DD HH:mm:ss'\r\n): string {\r\n const d = new Date(date);\r\n\r\n if (isNaN(d.getTime())) {\r\n return 'Invalid Date';\r\n }\r\n\r\n const replacements: Record<string, string> = {\r\n YYYY: d.getFullYear().toString(),\r\n YY: d.getFullYear().toString().slice(-2),\r\n MM: (d.getMonth() + 1).toString().padStart(2, '0'),\r\n M: (d.getMonth() + 1).toString(),\r\n DD: d.getDate().toString().padStart(2, '0'),\r\n D: d.getDate().toString(),\r\n HH: d.getHours().toString().padStart(2, '0'),\r\n H: d.getHours().toString(),\r\n mm: d.getMinutes().toString().padStart(2, '0'),\r\n m: d.getMinutes().toString(),\r\n ss: d.getSeconds().toString().padStart(2, '0'),\r\n s: d.getSeconds().toString(),\r\n SSS: d.getMilliseconds().toString().padStart(3, '0'),\r\n };\r\n\r\n let result = format;\r\n // 按长度降序排列,避免 MM 被 M 替换\r\n const keys = Object.keys(replacements).sort((a, b) => b.length - a.length);\r\n for (const key of keys) {\r\n result = result.replace(new RegExp(key, 'g'), replacements[key]);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 格式化相对时间\r\n * \r\n * 【功能说明】\r\n * 将日期转换为相对于当前时间的描述,如\"3分钟前\"、\"2天后\"。\r\n * 使用中文描述,适合中国用户的阅读习惯。\r\n * \r\n * @param date 日期(Date 对象、时间戳或日期字符串)\r\n * @param now 当前时间戳(默认 Date.now())\r\n * @returns 相对时间字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * formatRelativeTime(Date.now() - 30000); // '30秒前'\r\n * formatRelativeTime(Date.now() - 3600000); // '1小时前'\r\n * formatRelativeTime(Date.now() - 86400000); // '1天前'\r\n * formatRelativeTime(Date.now() + 86400000); // '1天后'\r\n * formatRelativeTime(Date.now() - 5000); // '刚刚'\r\n * ```\r\n */\r\nexport function formatRelativeTime(\r\n date: Date | number | string,\r\n now: number = Date.now()\r\n): string {\r\n const d = new Date(date);\r\n const diff = now - d.getTime();\r\n const absDiff = Math.abs(diff);\r\n const suffix = diff > 0 ? '前' : '后';\r\n\r\n const seconds = Math.floor(absDiff / 1000);\r\n const minutes = Math.floor(seconds / 60);\r\n const hours = Math.floor(minutes / 60);\r\n const days = Math.floor(hours / 24);\r\n const months = Math.floor(days / 30);\r\n const years = Math.floor(days / 365);\r\n\r\n if (seconds < 60) {\r\n return seconds <= 10 ? '刚刚' : `${seconds}秒${suffix}`;\r\n }\r\n if (minutes < 60) {\r\n return `${minutes}分钟${suffix}`;\r\n }\r\n if (hours < 24) {\r\n return `${hours}小时${suffix}`;\r\n }\r\n if (days < 30) {\r\n return `${days}天${suffix}`;\r\n }\r\n if (months < 12) {\r\n return `${months}个月${suffix}`;\r\n }\r\n return `${years}年${suffix}`;\r\n}\r\n\r\n/**\r\n * 格式化时长\r\n * \r\n * 【功能说明】\r\n * 将毫秒数格式化为时长字符串。\r\n * 支持短格式(1:01:01)和长格式(1小时1分钟1秒)两种风格。\r\n * \r\n * @param ms 毫秒数\r\n * @param options 格式选项\r\n * @param options.style 格式风格:'short'(默认)或 'long'\r\n * @returns 格式化后的时长字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * formatDuration(3661000); // '1:01:01'\r\n * formatDuration(3661000, { style: 'long' }); // '1小时1分钟1秒'\r\n * formatDuration(65000); // '1:05'\r\n * formatDuration(90061000); // '1d 1:01:01'\r\n * ```\r\n */\r\nexport function formatDuration(\r\n ms: number,\r\n options: { style?: 'short' | 'long' } = {}\r\n): string {\r\n const { style = 'short' } = options;\r\n\r\n const seconds = Math.floor((ms / 1000) % 60);\r\n const minutes = Math.floor((ms / (1000 * 60)) % 60);\r\n const hours = Math.floor((ms / (1000 * 60 * 60)) % 24);\r\n const days = Math.floor(ms / (1000 * 60 * 60 * 24));\r\n\r\n if (style === 'long') {\r\n const parts: string[] = [];\r\n if (days > 0) parts.push(`${days}天`);\r\n if (hours > 0) parts.push(`${hours}小时`);\r\n if (minutes > 0) parts.push(`${minutes}分钟`);\r\n if (seconds > 0 || parts.length === 0) parts.push(`${seconds}秒`);\r\n return parts.join('');\r\n }\r\n\r\n if (days > 0) {\r\n return `${days}d ${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\r\n }\r\n if (hours > 0) {\r\n return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\r\n }\r\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\r\n}\r\n\r\n// ============================================================\r\n// 数字格式化\r\n// ============================================================\r\n\r\n/**\r\n * 格式化数字为千分位\r\n * \r\n * 【功能说明】\r\n * 将数字格式化为带千分位分隔符的字符串。\r\n * 可指定小数位数。\r\n * \r\n * @param num 数字\r\n * @param decimals 小数位数(可选)\r\n * @returns 格式化后的字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * formatNumber(1234567); // '1,234,567'\r\n * formatNumber(1234567.89, 2); // '1,234,567.89'\r\n * formatNumber(1000, 2); // '1,000.00'\r\n * formatNumber(NaN); // 'NaN'\r\n * formatNumber(Infinity); // '∞'\r\n * ```\r\n */\r\nexport function formatNumber(num: number, decimals?: number): string {\r\n if (isNaN(num)) return 'NaN';\r\n if (!isFinite(num)) return num > 0 ? '∞' : '-∞';\r\n\r\n const fixed = decimals !== undefined ? num.toFixed(decimals) : num.toString();\r\n const [intPart, decPart] = fixed.split('.');\r\n\r\n const formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\r\n\r\n return decPart ? `${formattedInt}.${decPart}` : formattedInt;\r\n}\r\n\r\n/**\r\n * 格式化百分比\r\n * \r\n * 【功能说明】\r\n * 将数值格式化为百分比字符串。\r\n * 支持将比率(0-1)或百分比值转换为显示格式。\r\n * \r\n * @param value 数值\r\n * @param decimals 小数位数(默认 2)\r\n * @param asRatio 值是否为比率(0-1),默认 true\r\n * @returns 格式化后的百分比字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * formatPercent(0.1234); // '12.34%'\r\n * formatPercent(0.1234, 1); // '12.3%'\r\n * formatPercent(12.34, 2, false); // '12.34%'\r\n * formatPercent(1); // '100.00%'\r\n * ```\r\n */\r\nexport function formatPercent(\r\n value: number,\r\n decimals: number = 2,\r\n asRatio: boolean = true\r\n): string {\r\n const percent = asRatio ? value * 100 : value;\r\n return `${percent.toFixed(decimals)}%`;\r\n}\r\n\r\n/**\r\n * 格式化货币\r\n * \r\n * 【功能说明】\r\n * 将金额格式化为货币字符串。\r\n * 使用 Intl.NumberFormat 实现,支持国际化。\r\n * \r\n * @param amount 金额\r\n * @param currency 货币代码(默认 'CNY')\r\n * @param locale 地区(默认 'zh-CN')\r\n * @returns 格式化后的货币字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * formatCurrency(1234.56); // '¥1,234.56'\r\n * formatCurrency(1234.56, 'USD', 'en-US'); // '$1,234.56'\r\n * formatCurrency(1234.56, 'EUR', 'de-DE'); // '1.234,56 €'\r\n * formatCurrency(1234.56, 'JPY', 'ja-JP'); // '¥1,235'\r\n * ```\r\n */\r\nexport function formatCurrency(\r\n amount: number,\r\n currency: string = 'CNY',\r\n locale: string = 'zh-CN'\r\n): string {\r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency,\r\n }).format(amount);\r\n}\r\n\r\n// ============================================================\r\n// 字符串格式化\r\n// ============================================================\r\n\r\n/**\r\n * 截断字符串\r\n * \r\n * 【功能说明】\r\n * 将超长字符串截断并添加后缀。\r\n * 常用于显示标题、描述等需要限制长度的文本。\r\n * \r\n * @param str 原字符串\r\n * @param maxLength 最大长度\r\n * @param suffix 截断后缀(默认 '...')\r\n * @returns 截断后的字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * truncate('这是一段很长的文字', 5); // '这是...'\r\n * truncate('短文本', 10); // '短文本'\r\n * truncate('Hello World', 8, '…'); // 'Hello W…'\r\n * ```\r\n */\r\nexport function truncate(\r\n str: string,\r\n maxLength: number,\r\n suffix: string = '...'\r\n): string {\r\n if (str.length <= maxLength) return str;\r\n return str.slice(0, maxLength - suffix.length) + suffix;\r\n}\r\n\r\n/**\r\n * 首字母大写\r\n * \r\n * 【功能说明】\r\n * 将字符串的首字母转为大写,其余保持不变。\r\n * \r\n * @param str 原字符串\r\n * @returns 首字母大写的字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * capitalize('hello'); // 'Hello'\r\n * capitalize('WORLD'); // 'WORLD'\r\n * capitalize(''); // ''\r\n * ```\r\n */\r\nexport function capitalize(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\n/**\r\n * 驼峰转短横线(kebab-case)\r\n * \r\n * 【功能说明】\r\n * 将驼峰命名转换为短横线命名。\r\n * 常用于 CSS 类名、URL 路径等场景。\r\n * \r\n * @param str 驼峰命名的字符串\r\n * @returns 短横线命名的字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * kebabCase('backgroundColor'); // 'background-color'\r\n * kebabCase('myComponent'); // 'my-component'\r\n * kebabCase('XMLHttpRequest'); // 'x-m-l-http-request'\r\n * ```\r\n */\r\nexport function kebabCase(str: string): string {\r\n return str\r\n .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n .replace(/[\\s_]+/g, '-')\r\n .toLowerCase();\r\n}\r\n\r\n/**\r\n * 短横线转驼峰(camelCase)\r\n * \r\n * 【功能说明】\r\n * 将短横线命名转换为驼峰命名。\r\n * 常用于将 CSS 属性名转换为 JavaScript 属性名。\r\n * \r\n * @param str 短横线命名的字符串\r\n * @returns 驼峰命名的字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * camelCase('background-color'); // 'backgroundColor'\r\n * camelCase('my-component'); // 'myComponent'\r\n * camelCase('font-size'); // 'fontSize'\r\n * ```\r\n */\r\nexport function camelCase(str: string): string {\r\n return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\r\n}\r\n","/**\r\n * @file timing.ts\r\n * @description 时间控制工具函数集\r\n * @module @brix/utils/timing\r\n * @version 3.0.0\r\n * \r\n * 【模块说明】\r\n * 提供各种时间控制相关的工具函数,包括防抖、节流、延迟、超时等。\r\n * 这些函数是前端开发中最常用的性能优化工具。\r\n * \r\n * 【使用场景】\r\n * - 防抖:搜索输入、表单校验、窗口调整\r\n * - 节流:滚动事件、按钮点击、拖拽操作\r\n * - 延迟:动画间隔、轮询等待、用户反馈\r\n * - 超时:网络请求、长时任务控制\r\n * \r\n * @license Apache-2.0\r\n */\r\n\r\n// ============================================================\r\n// 防抖(Debounce)\r\n// ============================================================\r\n\r\n/**\r\n * 防抖函数\r\n * \r\n * 【功能说明】\r\n * 延迟执行目标函数,在延迟期间如果再次调用则重新计时。\r\n * 适用于搜索输入、窗口调整等高频触发场景。\r\n * \r\n * 【工作原理】\r\n * 1. 每次调用时清除之前的定时器\r\n * 2. 设置新的定时器\r\n * 3. 仅当定时器到期后才真正执行函数\r\n * \r\n * @template T 函数类型\r\n * @param func 需要防抖的函数\r\n * @param wait 延迟时间(毫秒)\r\n * @param immediate 是否立即执行首次调用(默认 false)\r\n * @returns 防抖后的函数\r\n * \r\n * @example\r\n * ```typescript\r\n * // 基础用法:搜索防抖\r\n * const debouncedSearch = debounce((text: string) => {\r\n * searchApi(text);\r\n * }, 300);\r\n * \r\n * input.addEventListener('input', (e) => {\r\n * debouncedSearch(e.target.value);\r\n * });\r\n * \r\n * // 立即执行模式:按钮防连点\r\n * const debouncedClick = debounce(() => {\r\n * submitForm();\r\n * }, 1000, true);\r\n * ```\r\n */\r\nexport function debounce<T extends (...args: Parameters<T>) => ReturnType<T>>(\r\n func: T,\r\n wait: number,\r\n immediate: boolean = false\r\n): (...args: Parameters<T>) => void {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return function (this: unknown, ...args: Parameters<T>): void {\r\n const callNow = immediate && !timeoutId;\r\n\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n\r\n timeoutId = setTimeout(() => {\r\n timeoutId = null;\r\n if (!immediate) {\r\n func.apply(this, args);\r\n }\r\n }, wait);\r\n\r\n if (callNow) {\r\n func.apply(this, args);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * 带取消和刷新功能的防抖函数接口\r\n * \r\n * @template T 原函数类型\r\n */\r\nexport interface DebouncedFunction<T extends (...args: Parameters<T>) => ReturnType<T>> {\r\n /** 调用防抖函数 */\r\n (...args: Parameters<T>): void;\r\n /** 取消待执行的调用 */\r\n cancel: () => void;\r\n /** 立即执行待执行的调用 */\r\n flush: () => void;\r\n}\r\n\r\n/**\r\n * 创建可取消的防抖函数\r\n * \r\n * 【功能说明】\r\n * 扩展版防抖函数,支持取消和立即刷新。\r\n * 适用于需要手动控制防抖行为的场景。\r\n * \r\n * @template T 函数类型\r\n * @param func 需要防抖的函数\r\n * @param wait 延迟时间(毫秒)\r\n * @returns 带取消功能的防抖函数\r\n * \r\n * @example\r\n * ```typescript\r\n * const debouncedSave = debounceWithCancel((data) => {\r\n * saveToServer(data);\r\n * }, 1000);\r\n * \r\n * // 正常调用\r\n * debouncedSave(formData);\r\n * \r\n * // 组件卸载时取消\r\n * onUnmount(() => {\r\n * debouncedSave.cancel();\r\n * });\r\n * \r\n * // 离开页面前立即保存\r\n * onBeforeUnload(() => {\r\n * debouncedSave.flush();\r\n * });\r\n * ```\r\n */\r\nexport function debounceWithCancel<T extends (...args: Parameters<T>) => ReturnType<T>>(\r\n func: T,\r\n wait: number\r\n): DebouncedFunction<T> {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n let lastArgs: Parameters<T> | null = null;\r\n let lastThis: unknown = null;\r\n\r\n const debounced = function (this: unknown, ...args: Parameters<T>): void {\r\n lastArgs = args;\r\n lastThis = this;\r\n\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n\r\n timeoutId = setTimeout(() => {\r\n timeoutId = null;\r\n if (lastArgs) {\r\n func.apply(lastThis, lastArgs);\r\n lastArgs = null;\r\n lastThis = null;\r\n }\r\n }, wait);\r\n } as DebouncedFunction<T>;\r\n\r\n debounced.cancel = () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n timeoutId = null;\r\n }\r\n lastArgs = null;\r\n lastThis = null;\r\n };\r\n\r\n debounced.flush = () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n timeoutId = null;\r\n }\r\n if (lastArgs) {\r\n func.apply(lastThis, lastArgs);\r\n lastArgs = null;\r\n lastThis = null;\r\n }\r\n };\r\n\r\n return debounced;\r\n}\r\n\r\n// ============================================================\r\n// 节流(Throttle)\r\n// ============================================================\r\n\r\n/**\r\n * 节流函数\r\n * \r\n * 【功能说明】\r\n * 限制函数在指定时间内只能执行一次。\r\n * 适用于滚动事件、按钮点击等需要限制频率的场景。\r\n * \r\n * 【工作原理】\r\n * 1. 记录上次执行时间\r\n * 2. 如果距离上次执行超过限制时间,则执行函数\r\n * 3. 否则忽略本次调用\r\n * \r\n * @template T 函数类型\r\n * @param func 需要节流的函数\r\n * @param limit 时间限制(毫秒)\r\n * @returns 节流后的函数\r\n * \r\n * @example\r\n * ```typescript\r\n * // 滚动事件节流\r\n * const throttledScroll = throttle(() => {\r\n * updateScrollIndicator();\r\n * }, 100);\r\n * \r\n * window.addEventListener('scroll', throttledScroll);\r\n * \r\n * // 按钮点击节流\r\n * const throttledSubmit = throttle(() => {\r\n * submitForm();\r\n * }, 2000);\r\n * ```\r\n */\r\nexport function throttle<T extends (...args: Parameters<T>) => ReturnType<T>>(\r\n func: T,\r\n limit: number\r\n): (...args: Parameters<T>) => void {\r\n let inThrottle = false;\r\n\r\n return function (this: unknown, ...args: Parameters<T>): void {\r\n if (!inThrottle) {\r\n func.apply(this, args);\r\n inThrottle = true;\r\n setTimeout(() => {\r\n inThrottle = false;\r\n }, limit);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * 带尾调用的节流函数\r\n * \r\n * 【功能说明】\r\n * 在节流期间的最后一次调用会在节流结束后执行。\r\n * 确保最终状态能够被正确更新。\r\n * \r\n * @template T 函数类型\r\n * @param func 需要节流的函数\r\n * @param limit 时间限制(毫秒)\r\n * @returns 节流后的函数\r\n * \r\n * @example\r\n * ```typescript\r\n * // 拖拽事件:既要及时响应,又要确保最终位置正确\r\n * const throttledDrag = throttleWithTrailing((position) => {\r\n * updateElementPosition(position);\r\n * }, 16); // 约 60fps\r\n * ```\r\n */\r\nexport function throttleWithTrailing<T extends (...args: Parameters<T>) => ReturnType<T>>(\r\n func: T,\r\n limit: number\r\n): (...args: Parameters<T>) => void {\r\n let inThrottle = false;\r\n let lastArgs: Parameters<T> | null = null;\r\n let lastThis: unknown = null;\r\n\r\n return function (this: unknown, ...args: Parameters<T>): void {\r\n if (!inThrottle) {\r\n func.apply(this, args);\r\n inThrottle = true;\r\n setTimeout(() => {\r\n inThrottle = false;\r\n if (lastArgs) {\r\n func.apply(lastThis, lastArgs);\r\n lastArgs = null;\r\n lastThis = null;\r\n }\r\n }, limit);\r\n } else {\r\n lastArgs = args;\r\n lastThis = this;\r\n }\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 延迟(Delay)\r\n// ============================================================\r\n\r\n/**\r\n * 延迟执行\r\n * \r\n * 【功能说明】\r\n * 返回一个在指定时间后解决的 Promise。\r\n * 用于 async/await 语法中实现等待效果。\r\n * \r\n * @param ms 延迟时间(毫秒)\r\n * @returns Promise<void>\r\n * \r\n * @example\r\n * ```typescript\r\n * // 基础用法\r\n * await delay(1000);\r\n * console.log('1秒后执行');\r\n * \r\n * // 动画间隔\r\n * for (const item of items) {\r\n * await fadeIn(item);\r\n * await delay(200);\r\n * }\r\n * ```\r\n */\r\nexport function delay(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\n/**\r\n * 带返回值的延迟\r\n * \r\n * 【功能说明】\r\n * 延迟指定时间后返回指定的值。\r\n * 适用于需要延迟返回特定值的场景。\r\n * \r\n * @template T 返回值类型\r\n * @param ms 延迟时间(毫秒)\r\n * @param value 返回值\r\n * @returns Promise<T>\r\n * \r\n * @example\r\n * ```typescript\r\n * // 延迟返回默认值\r\n * const result = await delayWith(1000, { status: 'ready' });\r\n * \r\n * // Promise.race 超时降级\r\n * const data = await Promise.race([\r\n * fetchData(),\r\n * delayWith(5000, defaultData),\r\n * ]);\r\n * ```\r\n */\r\nexport function delayWith<T>(ms: number, value: T): Promise<T> {\r\n return new Promise((resolve) => setTimeout(() => resolve(value), ms));\r\n}\r\n\r\n/**\r\n * 可取消延迟接口\r\n */\r\nexport interface CancelableDelay {\r\n /** 延迟 Promise */\r\n promise: Promise<void>;\r\n /** 取消延迟 */\r\n cancel: () => void;\r\n}\r\n\r\n/**\r\n * 创建可取消的延迟\r\n * \r\n * 【功能说明】\r\n * 创建一个可以被手动取消的延迟。\r\n * 适用于需要中断等待的场景,如组件卸载时。\r\n * \r\n * @param ms 延迟时间(毫秒)\r\n * @returns 可取消的延迟对象\r\n * \r\n * @example\r\n * ```typescript\r\n * const { promise, cancel } = cancelableDelay(5000);\r\n * \r\n * // 设置取消条件\r\n * button.onclick = cancel;\r\n * \r\n * try {\r\n * await promise;\r\n * showMessage('操作完成');\r\n * } catch (e) {\r\n * showMessage('操作已取消');\r\n * }\r\n * ```\r\n */\r\nexport function cancelableDelay(ms: number): CancelableDelay {\r\n let timeoutId: ReturnType<typeof setTimeout>;\r\n let rejectFn: (reason?: unknown) => void;\r\n\r\n const promise = new Promise<void>((resolve, reject) => {\r\n rejectFn = reject;\r\n timeoutId = setTimeout(resolve, ms);\r\n });\r\n\r\n return {\r\n promise,\r\n cancel: () => {\r\n clearTimeout(timeoutId);\r\n rejectFn(new Error('Delay cancelled'));\r\n },\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 超时(Timeout)\r\n// ============================================================\r\n\r\n/**\r\n * 带超时的 Promise 包装\r\n * \r\n * 【功能说明】\r\n * 为任意 Promise 添加超时限制,超时后抛出错误。\r\n * 适用于网络请求、长时间操作等需要超时控制的场景。\r\n * \r\n * @template T Promise 解析类型\r\n * @param promise 原始 Promise\r\n * @param ms 超时时间(毫秒)\r\n * @param message 超时错误消息(可选)\r\n * @returns Promise<T>\r\n * @throws Error 超时时抛出错误\r\n * \r\n * @example\r\n * ```typescript\r\n * // API 请求超时\r\n * try {\r\n * const data = await withTimeout(\r\n * fetch('/api/data'),\r\n * 5000,\r\n * '请求超时,请检查网络'\r\n * );\r\n * } catch (e) {\r\n * if (e.message.includes('超时')) {\r\n * showRetryDialog();\r\n * }\r\n * }\r\n * \r\n * // 文件上传超时\r\n * await withTimeout(uploadFile(file), 60000, '上传超时');\r\n * ```\r\n */\r\nexport function withTimeout<T>(\r\n promise: Promise<T>,\r\n ms: number,\r\n message: string = 'Operation timed out'\r\n): Promise<T> {\r\n let timeoutId: ReturnType<typeof setTimeout>;\r\n\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n timeoutId = setTimeout(() => {\r\n reject(new Error(message));\r\n }, ms);\r\n });\r\n\r\n return Promise.race([promise, timeoutPromise]).finally(() => {\r\n clearTimeout(timeoutId);\r\n });\r\n}\r\n\r\n// ============================================================\r\n// 调度(Scheduling)\r\n// ============================================================\r\n\r\n/**\r\n * 在下一个宏任务中执行\r\n * \r\n * 【功能说明】\r\n * 将函数调度到下一个事件循环执行。\r\n * 类似于 Vue 的 nextTick,但更简单。\r\n * \r\n * @param fn 要执行的函数\r\n * \r\n * @example\r\n * ```typescript\r\n * // 确保 DOM 更新后执行\r\n * element.innerHTML = newContent;\r\n * nextTick(() => {\r\n * element.querySelector('.new-element').focus();\r\n * });\r\n * ```\r\n */\r\nexport function nextTick(fn: () => void): void {\r\n setTimeout(fn, 0);\r\n}\r\n\r\n/**\r\n * 请求空闲回调(带降级)\r\n * \r\n * 【功能说明】\r\n * 在浏览器空闲时执行任务,支持不兼容浏览器的降级处理。\r\n * 适用于低优先级的后台任务。\r\n * \r\n * @param fn 要执行的函数\r\n * @param options 配置选项\r\n * @param options.timeout 超时时间(毫秒)\r\n * @returns 请求 ID\r\n * \r\n * @example\r\n * ```typescript\r\n * // 空闲时发送分析数据\r\n * requestIdleCallback(() => {\r\n * sendAnalytics(analyticsData);\r\n * }, { timeout: 5000 });\r\n * \r\n * // 空闲时预加载资源\r\n * requestIdleCallback(() => {\r\n * preloadNextPageResources();\r\n * });\r\n * ```\r\n */\r\nexport function requestIdleCallback(\r\n fn: () => void,\r\n options?: { timeout?: number }\r\n): number {\r\n if (typeof window !== 'undefined' && 'requestIdleCallback' in window) {\r\n return (window as Window & { requestIdleCallback: (cb: () => void, opts?: { timeout?: number }) => number }).requestIdleCallback(fn, options);\r\n }\r\n // 降级到 setTimeout\r\n return setTimeout(fn, options?.timeout ?? 1) as unknown as number;\r\n}\r\n","/**\r\n * @file validators.ts\r\n * @description 验证工具函数集\r\n * @module @brix/utils/validators\r\n * @version 3.0.0\r\n * \r\n * 【模块说明】\r\n * 提供各种数据验证工具函数,包括基础格式验证、中国特有证件验证、密码强度检查等。\r\n * 验证函数均返回布尔值,不抛出异常,便于条件判断使用。\r\n * \r\n * 【使用场景】\r\n * - 表单验证:邮箱、手机号、密码等\r\n * - 证件验证:身份证、统一社会信用代码、银行卡等\r\n * - 数据校验:URL、IP、JSON 格式等\r\n * - 类型检查:空值、数字、范围等\r\n * \r\n * @license Apache-2.0\r\n */\r\n\r\n// ============================================================\r\n// 基础验证\r\n// ============================================================\r\n\r\n/**\r\n * 验证邮箱格式\r\n * \r\n * 【功能说明】\r\n * 验证字符串是否为有效的邮箱地址格式。\r\n * 使用 RFC 5322 简化版正则表达式。\r\n * \r\n * @param email 邮箱地址\r\n * @returns 是否为有效邮箱格式\r\n * \r\n * @example\r\n * ```typescript\r\n * isValidEmail('user@example.com'); // true\r\n * isValidEmail('user.name@domain.cn'); // true\r\n * isValidEmail('invalid-email'); // false\r\n * isValidEmail('user@'); // false\r\n * isValidEmail(''); // false\r\n * ```\r\n */\r\nexport function isValidEmail(email: string): boolean {\r\n if (!email || typeof email !== 'string') return false;\r\n // RFC 5322 简化版\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return emailRegex.test(email.trim());\r\n}\r\n\r\n/**\r\n * 验证中国大陆手机号\r\n * \r\n * 【功能说明】\r\n * 验证字符串是否为有效的中国大陆手机号码。\r\n * 支持目前所有运营商号段(13x、14x、15x、16x、17x、18x、19x)。\r\n * \r\n * 【验证规则】\r\n * - 11位数字\r\n * - 以1开头\r\n * - 第二位为3-9\r\n * \r\n * @param phone 手机号\r\n * @returns 是否为有效手机号\r\n * \r\n * @example\r\n * ```typescript\r\n * isValidPhone('13800138000'); // true\r\n * isValidPhone('19912345678'); // true\r\n * isValidPhone('12345678901'); // false(第二位不符合)\r\n * isValidPhone('1380013800'); // false(位数不足)\r\n * isValidPhone('138 0013 8000'); // false(含空格)\r\n * ```\r\n */\r\nexport function isValidPhone(phone: string): boolean {\r\n if (!phone || typeof phone !== 'string') return false;\r\n // 中国大陆手机号:1开头,第二位3-9,共11位\r\n const phoneRegex = /^1[3-9]\\d{9}$/;\r\n return phoneRegex.test(phone.trim());\r\n}\r\n\r\n/**\r\n * 验证 URL 格式\r\n * \r\n * 【功能说明】\r\n * 验证字符串是否为有效的 HTTP/HTTPS URL。\r\n * 使用原生 URL API 进行解析验证。\r\n * \r\n * @param url URL 字符串\r\n * @returns 是否为有效 URL\r\n * \r\n * @example\r\n * ```typescript\r\n * isValidUrl('https://example.com'); // true\r\n * isValidUrl('http://example.com/path'); // true\r\n * isValidUrl('ftp://example.com'); // false(不支持 FTP)\r\n * isValidUrl('not-a-url'); // false\r\n * isValidUrl(''); // false\r\n * ```\r\n */\r\nexport function isValidUrl(url: string): boolean {\r\n if (!url || typeof url !== 'string') return false;\r\n try {\r\n const parsed = new URL(url);\r\n return ['http:', 'https:'].includes(parsed.protocol);\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * 验证 IPv4 地址\r\n * \r\n * 【功能说明】\r\n * 验证字符串是否为有效的 IPv4 地址格式。\r\n * \r\n * 【验证规则】\r\n * - 四段数字,用点分隔\r\n * - 每段范围 0-255\r\n * - 不允许前导零(如 01.02.03.04)\r\n * \r\n * @param ip IP 地址字符串\r\n * @returns 是否为有效 IPv4 地址\r\n * \r\n * @example\r\n * ```typescript\r\n * isValidIPv4('192.168.1.1'); // true\r\n * isValidIPv4('0.0.0.0'); // true\r\n * isValidIPv4('255.255.255.255'); // true\r\n * isValidIPv4('256.1.1.1'); // false(超出范围)\r\n * isValidIPv4('01.02.03.04'); // false(前导零)\r\n * isValidIPv4('192.168.1'); // false(不完整)\r\n * ```\r\n */\r\nexport function isValidIPv4(ip: string): boolean {\r\n if (!ip || typeof ip !== 'string') return false;\r\n const parts = ip.split('.');\r\n if (parts.length !== 4) return false;\r\n return parts.every((part) => {\r\n const num = parseInt(part, 10);\r\n return num >= 0 && num <= 255 && part === num.toString();\r\n });\r\n}\r\n\r\n/**\r\n * 验证 JSON 字符串\r\n * \r\n * 【功能说明】\r\n * 验证字符串是否为有效的 JSON 格式。\r\n * \r\n * @param str 待验证字符串\r\n * @returns 是否为有效 JSON\r\n * \r\n * @example\r\n * ```typescript\r\n * isValidJSON('{\"name\":\"test\"}'); // true\r\n * isValidJSON('[1, 2, 3]'); // true\r\n * isValidJSON('true'); // true\r\n * isValidJSON('{invalid}'); // false\r\n * isValidJSON(''); // false\r\n * ```\r\n */\r\nexport function isValidJSON(str: string): boolean {\r\n try {\r\n JSON.parse(str);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 中国特有验证\r\n// ============================================================\r\n\r\n/**\r\n * 验证中国大陆身份证号\r\n * \r\n * 【功能说明】\r\n * 验证字符串是否为有效的中国大陆居民身份证号。\r\n * 支持18位(新版)和15位(老版)两种格式。\r\n * 18位身份证会进行校验码验证。\r\n * \r\n * 【18位身份证结构】\r\n * - 前6位:地区码\r\n * - 7-14位:出生日期(YYYYMMDD)\r\n * - 15-17位:顺序码(第17位奇数为男,偶数为女)\r\n * - 第18位:校验码(0-9 或 X)\r\n * \r\n * @param idCard 身份证号\r\n * @returns 是否为有效身份证号\r\n * \r\n * @example\r\n * ```typescript\r\n * isValidIdCard('110101199001011234'); // 需验证校验码\r\n * isValidIdCard('110101900101123'); // 15位老版身份证\r\n * isValidIdCard('12345678901234567'); // false(校验码错误)\r\n * isValidIdCard(''); // false\r\n * ```\r\n */\r\nexport function isValidIdCard(idCard: string): boolean {\r\n if (!idCard || typeof idCard !== 'string') return false;\r\n \r\n const id = idCard.trim().toUpperCase();\r\n \r\n // 18位身份证\r\n if (id.length === 18) {\r\n // 前17位必须是数字\r\n if (!/^\\d{17}[\\dX]$/.test(id)) return false;\r\n \r\n // 校验码验证\r\n const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\r\n const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\r\n \r\n let sum = 0;\r\n for (let i = 0; i < 17; i++) {\r\n sum += parseInt(id[i], 10) * weights[i];\r\n }\r\n \r\n return id[17] === checkCodes[sum % 11];\r\n }\r\n \r\n // 15位身份证(老版)\r\n if (id.length === 15) {\r\n return /^\\d{15}$/.test(id);\r\n }\r\n \r\n return false;\r\n}\r\n\r\n/**\r\n * 验证中国大陆统一社会信用代码\r\n * \r\n * 【功能说明】\r\n * 验证字符串是否为有效的统一社会信用代码(企业信用代码)。\r\n * \r\n * 【代码结构】\r\n * - 第1位:登记管理部门代码(1位)\r\n * - 第2位:机构类别代码(1位)\r\n * - 第3-8位:登记管理机关行政区划码(6位数字)\r\n * - 第9-17位:主体标识码(组织机构代码)\r\n * - 第18位:校验码\r\n * \r\n * @param code 统一社会信用代码\r\n * @returns 是否为有效代码\r\n * \r\n * @example\r\n * ```typescript\r\n * isValidUnifiedCreditCode('91110000MA0ABCDE12'); // 需验证格式\r\n * isValidUnifiedCreditCode(''); // false\r\n * ```\r\n */\r\nexport function isValidUnifiedCreditCode(code: string): boolean {\r\n if (!code || typeof code !== 'string') return false;\r\n // 18位,由数字和大写字母组成(不含I、O、Z、S、V)\r\n const regex = /^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/;\r\n return regex.test(code.trim().toUpperCase());\r\n}\r\n\r\n/**\r\n * 验证中国大陆银行卡号(Luhn算法)\r\n * \r\n * 【功能说明】\r\n * 验证字符串是否为有效的银行卡号。\r\n * 使用 Luhn 算法进行校验。\r\n * \r\n * 【Luhn 算法】\r\n * 1. 从右向左,偶数位乘2,若结果大于9则减9\r\n * 2. 所有位数求和\r\n * 3. 能被10整除则有效\r\n * \r\n * @param cardNumber 银行卡号\r\n * @returns 是否为有效银行卡号\r\n * \r\n * @example\r\n * ```typescript\r\n * isValidBankCard('6222020200010001234'); // 需验证Luhn算法\r\n * isValidBankCard('1234 5678 9012 3456'); // 支持带空格\r\n * isValidBankCard('123'); // false(位数不足)\r\n * ```\r\n */\r\nexport function isValidBankCard(cardNumber: string): boolean {\r\n if (!cardNumber || typeof cardNumber !== 'string') return false;\r\n \r\n const cleaned = cardNumber.replace(/\\s/g, '');\r\n if (!/^\\d{13,19}$/.test(cleaned)) return false;\r\n \r\n // Luhn 算法\r\n let sum = 0;\r\n let isEven = false;\r\n \r\n for (let i = cleaned.length - 1; i >= 0; i--) {\r\n let digit = parseInt(cleaned[i], 10);\r\n \r\n if (isEven) {\r\n digit *= 2;\r\n if (digit > 9) digit -= 9;\r\n }\r\n \r\n sum += digit;\r\n isEven = !isEven;\r\n }\r\n \r\n return sum % 10 === 0;\r\n}\r\n\r\n// ============================================================\r\n// 密码强度验证\r\n// ============================================================\r\n\r\n/**\r\n * 密码强度等级\r\n */\r\nexport type PasswordStrength = 'weak' | 'medium' | 'strong' | 'very-strong';\r\n\r\n/**\r\n * 密码强度检查结果\r\n */\r\nexport interface PasswordStrengthResult {\r\n /** 强度等级 */\r\n strength: PasswordStrength;\r\n /** 强度分数(0-10) */\r\n score: number;\r\n /** 改进建议列表 */\r\n suggestions: string[];\r\n}\r\n\r\n/**\r\n * 检查密码强度\r\n * \r\n * 【功能说明】\r\n * 综合评估密码强度,返回强度等级、分数和改进建议。\r\n * \r\n * 【评分规则】\r\n * - 长度:8位及以上 +1,12位及以上 +1,16位及以上 +1\r\n * - 小写字母:+1\r\n * - 大写字母:+1\r\n * - 数字:+1\r\n * - 特殊字符:+2\r\n * - 常见模式:-2\r\n * \r\n * 【强度等级】\r\n * - weak:分数 <= 2\r\n * - medium:分数 3-4\r\n * - strong:分数 5-6\r\n * - very-strong:分数 >= 7\r\n * \r\n * @param password 密码\r\n * @returns 强度检查结果\r\n * \r\n * @example\r\n * ```typescript\r\n * checkPasswordStrength('123456');\r\n * // { strength: 'weak', score: 0, suggestions: ['密码长度至少8位', ...] }\r\n * \r\n * checkPasswordStrength('MyP@ssw0rd');\r\n * // { strength: 'strong', score: 7, suggestions: [] }\r\n * \r\n * checkPasswordStrength('VeryStr0ng!P@ssw0rd');\r\n * // { strength: 'very-strong', score: 9, suggestions: [] }\r\n * ```\r\n */\r\nexport function checkPasswordStrength(password: string): PasswordStrengthResult {\r\n const suggestions: string[] = [];\r\n let score = 0;\r\n\r\n if (!password) {\r\n return { strength: 'weak', score: 0, suggestions: ['请输入密码'] };\r\n }\r\n\r\n // 长度检查\r\n if (password.length >= 8) score += 1;\r\n else suggestions.push('密码长度至少8位');\r\n \r\n if (password.length >= 12) score += 1;\r\n if (password.length >= 16) score += 1;\r\n\r\n // 包含小写字母\r\n if (/[a-z]/.test(password)) score += 1;\r\n else suggestions.push('建议包含小写字母');\r\n\r\n // 包含大写字母\r\n if (/[A-Z]/.test(password)) score += 1;\r\n else suggestions.push('建议包含大写字母');\r\n\r\n // 包含数字\r\n if (/\\d/.test(password)) score += 1;\r\n else suggestions.push('建议包含数字');\r\n\r\n // 包含特殊字符\r\n if (/[!@#$%^&*(),.?\":{}|<>]/.test(password)) score += 2;\r\n else suggestions.push('建议包含特殊字符');\r\n\r\n // 避免常见密码模式\r\n const commonPatterns = [\r\n /^123/,\r\n /password/i,\r\n /qwerty/i,\r\n /^abc/i,\r\n ];\r\n if (commonPatterns.some((p) => p.test(password))) {\r\n score -= 2;\r\n suggestions.push('避免使用常见密码模式');\r\n }\r\n\r\n // 确定强度等级\r\n let strength: PasswordStrength;\r\n if (score <= 2) strength = 'weak';\r\n else if (score <= 4) strength = 'medium';\r\n else if (score <= 6) strength = 'strong';\r\n else strength = 'very-strong';\r\n\r\n return { strength, score: Math.max(0, score), suggestions };\r\n}\r\n\r\n// ============================================================\r\n// 类型检查\r\n// ============================================================\r\n\r\n/**\r\n * 检查是否为空值\r\n * \r\n * 【功能说明】\r\n * 检查值是否为\"空\"。支持多种类型:\r\n * - null/undefined:空\r\n * - 字符串:空字符串或纯空白为空\r\n * - 数组:空数组为空\r\n * - 对象:空对象为空\r\n * \r\n * @param value 待检查的值\r\n * @returns 是否为空\r\n * \r\n * @example\r\n * ```typescript\r\n * isEmpty(null); // true\r\n * isEmpty(undefined); // true\r\n * isEmpty(''); // true\r\n * isEmpty(' '); // true\r\n * isEmpty([]); // true\r\n * isEmpty({}); // true\r\n * isEmpty(0); // false\r\n * isEmpty(false); // false\r\n * isEmpty('hello'); // false\r\n * ```\r\n */\r\nexport function isEmpty(value: unknown): boolean {\r\n if (value === null || value === undefined) return true;\r\n if (typeof value === 'string') return value.trim() === '';\r\n if (Array.isArray(value)) return value.length === 0;\r\n if (typeof value === 'object') return Object.keys(value).length === 0;\r\n return false;\r\n}\r\n\r\n/**\r\n * 检查是否为数字\r\n * \r\n * 【功能说明】\r\n * 检查值是否为有效数字(包括数字类型和可解析的数字字符串)。\r\n * 排除 NaN 和 Infinity。\r\n * \r\n * @param value 待检查的值\r\n * @returns 是否为有效数字\r\n * \r\n * @example\r\n * ```typescript\r\n * isNumeric(123); // true\r\n * isNumeric('123'); // true\r\n * isNumeric('12.34'); // true\r\n * isNumeric('-100'); // true\r\n * isNumeric(NaN); // false\r\n * isNumeric(Infinity); // false\r\n * isNumeric('abc'); // false\r\n * isNumeric(''); // false\r\n * ```\r\n */\r\nexport function isNumeric(value: unknown): boolean {\r\n if (typeof value === 'number') return !isNaN(value) && isFinite(value);\r\n if (typeof value === 'string') return !isNaN(parseFloat(value)) && isFinite(parseFloat(value));\r\n return false;\r\n}\r\n\r\n/**\r\n * 检查是否为整数\r\n * \r\n * @param value 待检查的值\r\n * @returns 是否为整数\r\n * \r\n * @example\r\n * ```typescript\r\n * isInteger(123); // true\r\n * isInteger(-100); // true\r\n * isInteger(12.34); // false\r\n * isInteger('123'); // false(需为数字类型)\r\n * ```\r\n */\r\nexport function isInteger(value: unknown): boolean {\r\n return Number.isInteger(value);\r\n}\r\n\r\n/**\r\n * 检查是否为正数\r\n * \r\n * @param value 待检查的数字\r\n * @returns 是否为正数\r\n * \r\n * @example\r\n * ```typescript\r\n * isPositive(1); // true\r\n * isPositive(0.001); // true\r\n * isPositive(0); // false\r\n * isPositive(-1); // false\r\n * ```\r\n */\r\nexport function isPositive(value: number): boolean {\r\n return typeof value === 'number' && value > 0;\r\n}\r\n\r\n/**\r\n * 检查是否在范围内\r\n * \r\n * @param value 待检查的数字\r\n * @param min 最小值(包含)\r\n * @param max 最大值(包含)\r\n * @returns 是否在范围内\r\n * \r\n * @example\r\n * ```typescript\r\n * isInRange(5, 1, 10); // true\r\n * isInRange(1, 1, 10); // true(包含边界)\r\n * isInRange(10, 1, 10); // true(包含边界)\r\n * isInRange(0, 1, 10); // false\r\n * isInRange(11, 1, 10); // false\r\n * ```\r\n */\r\nexport function isInRange(value: number, min: number, max: number): boolean {\r\n return typeof value === 'number' && value >= min && value <= max;\r\n}\r\n"]}
@@ -0,0 +1,325 @@
1
+ /**
2
+ * Copyright 2026 Brix Platform Authors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ /**
17
+ * @file Platform constants definitions
18
+ * @description Cross-platform shared platform constants
19
+ * @module @brix-sdk/platform-shared/constants/platform
20
+ * @version 3.0.0
21
+ */
22
+ /**
23
+ * Platform version number
24
+ */
25
+ declare const PLATFORM_VERSION = "3.0.0";
26
+ /**
27
+ * Capability type prefix
28
+ */
29
+ declare const CAPABILITY_PREFIX = "brix";
30
+ /**
31
+ * Default timeout in milliseconds
32
+ */
33
+ declare const DEFAULT_TIMEOUT = 30000;
34
+ /**
35
+ * Default retry count
36
+ */
37
+ declare const DEFAULT_RETRY_COUNT = 3;
38
+ /**
39
+ * Default retry delay in milliseconds
40
+ */
41
+ declare const DEFAULT_RETRY_DELAY = 1000;
42
+ /**
43
+ * Maximum event history record count
44
+ */
45
+ declare const MAX_EVENT_HISTORY = 100;
46
+ /**
47
+ * Storage key prefix
48
+ */
49
+ declare const STORAGE_KEY_PREFIX = "shinwa:";
50
+ /**
51
+ * Storage keys
52
+ */
53
+ declare const STORAGE_KEYS: {
54
+ /**
55
+ * Locale setting
56
+ */
57
+ readonly LOCALE: "shinwa:locale";
58
+ /**
59
+ * Theme setting
60
+ */
61
+ readonly THEME: "shinwa:theme";
62
+ /**
63
+ * User preferences
64
+ */
65
+ readonly PREFERENCES: "shinwa:preferences";
66
+ /**
67
+ * Authentication token
68
+ */
69
+ readonly AUTH_TOKEN: "shinwa:auth:token";
70
+ /**
71
+ * Refresh token
72
+ */
73
+ readonly REFRESH_TOKEN: "shinwa:auth:refresh";
74
+ };
75
+ /**
76
+ * HTTP methods
77
+ */
78
+ declare const HTTP_METHODS: {
79
+ readonly GET: "GET";
80
+ readonly POST: "POST";
81
+ readonly PUT: "PUT";
82
+ readonly PATCH: "PATCH";
83
+ readonly DELETE: "DELETE";
84
+ readonly HEAD: "HEAD";
85
+ readonly OPTIONS: "OPTIONS";
86
+ };
87
+ /**
88
+ * HTTP status codes
89
+ */
90
+ declare const HTTP_STATUS: {
91
+ readonly OK: 200;
92
+ readonly CREATED: 201;
93
+ readonly NO_CONTENT: 204;
94
+ readonly BAD_REQUEST: 400;
95
+ readonly UNAUTHORIZED: 401;
96
+ readonly FORBIDDEN: 403;
97
+ readonly NOT_FOUND: 404;
98
+ readonly CONFLICT: 409;
99
+ readonly UNPROCESSABLE_ENTITY: 422;
100
+ readonly TOO_MANY_REQUESTS: 429;
101
+ readonly INTERNAL_SERVER_ERROR: 500;
102
+ readonly BAD_GATEWAY: 502;
103
+ readonly SERVICE_UNAVAILABLE: 503;
104
+ };
105
+
106
+ /**
107
+ * Copyright 2026 Brix Platform Authors
108
+ *
109
+ * Licensed under the Apache License, Version 2.0 (the "License");
110
+ * you may not use this file except in compliance with the License.
111
+ * You may obtain a copy of the License at
112
+ *
113
+ * http://www.apache.org/licenses/LICENSE-2.0
114
+ *
115
+ * Unless required by applicable law or agreed to in writing, software
116
+ * distributed under the License is distributed on an "AS IS" BASIS,
117
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
118
+ * See the License for the specific language governing permissions and
119
+ * limitations under the License.
120
+ */
121
+ /**
122
+ * @file Error code definitions
123
+ * @description Cross-platform shared error code constants
124
+ * @module @brix-sdk/platform-shared/constants/errors
125
+ * @version 3.0.0
126
+ */
127
+ /**
128
+ * Common error codes
129
+ */
130
+ declare const COMMON_ERROR_CODES: {
131
+ /**
132
+ * Unknown error
133
+ */
134
+ readonly UNKNOWN: "ERR_UNKNOWN";
135
+ /**
136
+ * Invalid parameters
137
+ */
138
+ readonly INVALID_PARAMS: "ERR_INVALID_PARAMS";
139
+ /**
140
+ * Operation timeout
141
+ */
142
+ readonly TIMEOUT: "ERR_TIMEOUT";
143
+ /**
144
+ * Network error
145
+ */
146
+ readonly NETWORK: "ERR_NETWORK";
147
+ /**
148
+ * Operation cancelled
149
+ */
150
+ readonly CANCELLED: "ERR_CANCELLED";
151
+ /**
152
+ * Resource not found
153
+ */
154
+ readonly NOT_FOUND: "ERR_NOT_FOUND";
155
+ /**
156
+ * Resource already exists
157
+ */
158
+ readonly ALREADY_EXISTS: "ERR_ALREADY_EXISTS";
159
+ };
160
+ /**
161
+ * Authentication error codes
162
+ */
163
+ declare const AUTH_ERROR_CODES: {
164
+ /**
165
+ * Not authenticated
166
+ */
167
+ readonly UNAUTHENTICATED: "ERR_AUTH_UNAUTHENTICATED";
168
+ /**
169
+ * Unauthorized
170
+ */
171
+ readonly UNAUTHORIZED: "ERR_AUTH_UNAUTHORIZED";
172
+ /**
173
+ * Invalid token
174
+ */
175
+ readonly INVALID_TOKEN: "ERR_AUTH_INVALID_TOKEN";
176
+ /**
177
+ * Token expired
178
+ */
179
+ readonly TOKEN_EXPIRED: "ERR_AUTH_TOKEN_EXPIRED";
180
+ /**
181
+ * Session expired
182
+ */
183
+ readonly SESSION_EXPIRED: "ERR_AUTH_SESSION_EXPIRED";
184
+ /**
185
+ * Refresh token failed
186
+ */
187
+ readonly REFRESH_FAILED: "ERR_AUTH_REFRESH_FAILED";
188
+ };
189
+ /**
190
+ * Navigation error codes
191
+ */
192
+ declare const NAVIGATION_ERROR_CODES: {
193
+ /**
194
+ * Page not found
195
+ */
196
+ readonly PAGE_NOT_FOUND: "ERR_NAV_PAGE_NOT_FOUND";
197
+ /**
198
+ * Navigation blocked
199
+ */
200
+ readonly NAVIGATION_BLOCKED: "ERR_NAV_BLOCKED";
201
+ /**
202
+ * Permission denied
203
+ */
204
+ readonly PERMISSION_DENIED: "ERR_NAV_PERMISSION_DENIED";
205
+ /**
206
+ * Invalid page ID
207
+ */
208
+ readonly INVALID_PAGE_ID: "ERR_NAV_INVALID_PAGE_ID";
209
+ };
210
+ /**
211
+ * Plugin error codes
212
+ */
213
+ declare const PLUGIN_ERROR_CODES: {
214
+ /**
215
+ * Plugin load failed
216
+ */
217
+ readonly LOAD_FAILED: "ERR_PLUGIN_LOAD_FAILED";
218
+ /**
219
+ * Plugin initialization failed
220
+ */
221
+ readonly INIT_FAILED: "ERR_PLUGIN_INIT_FAILED";
222
+ /**
223
+ * Plugin not found
224
+ */
225
+ readonly NOT_FOUND: "ERR_PLUGIN_NOT_FOUND";
226
+ /**
227
+ * Plugin version incompatible
228
+ */
229
+ readonly VERSION_MISMATCH: "ERR_PLUGIN_VERSION_MISMATCH";
230
+ /**
231
+ * Plugin dependency missing
232
+ */
233
+ readonly MISSING_DEPENDENCY: "ERR_PLUGIN_MISSING_DEPENDENCY";
234
+ };
235
+ /**
236
+ * All error codes
237
+ */
238
+ declare const ERROR_CODES: {
239
+ /**
240
+ * Plugin load failed
241
+ */
242
+ readonly LOAD_FAILED: "ERR_PLUGIN_LOAD_FAILED";
243
+ /**
244
+ * Plugin initialization failed
245
+ */
246
+ readonly INIT_FAILED: "ERR_PLUGIN_INIT_FAILED";
247
+ /**
248
+ * Plugin not found
249
+ */
250
+ readonly NOT_FOUND: "ERR_PLUGIN_NOT_FOUND";
251
+ /**
252
+ * Plugin version incompatible
253
+ */
254
+ readonly VERSION_MISMATCH: "ERR_PLUGIN_VERSION_MISMATCH";
255
+ /**
256
+ * Plugin dependency missing
257
+ */
258
+ readonly MISSING_DEPENDENCY: "ERR_PLUGIN_MISSING_DEPENDENCY";
259
+ /**
260
+ * Page not found
261
+ */
262
+ readonly PAGE_NOT_FOUND: "ERR_NAV_PAGE_NOT_FOUND";
263
+ /**
264
+ * Navigation blocked
265
+ */
266
+ readonly NAVIGATION_BLOCKED: "ERR_NAV_BLOCKED";
267
+ /**
268
+ * Permission denied
269
+ */
270
+ readonly PERMISSION_DENIED: "ERR_NAV_PERMISSION_DENIED";
271
+ /**
272
+ * Invalid page ID
273
+ */
274
+ readonly INVALID_PAGE_ID: "ERR_NAV_INVALID_PAGE_ID";
275
+ /**
276
+ * Not authenticated
277
+ */
278
+ readonly UNAUTHENTICATED: "ERR_AUTH_UNAUTHENTICATED";
279
+ /**
280
+ * Unauthorized
281
+ */
282
+ readonly UNAUTHORIZED: "ERR_AUTH_UNAUTHORIZED";
283
+ /**
284
+ * Invalid token
285
+ */
286
+ readonly INVALID_TOKEN: "ERR_AUTH_INVALID_TOKEN";
287
+ /**
288
+ * Token expired
289
+ */
290
+ readonly TOKEN_EXPIRED: "ERR_AUTH_TOKEN_EXPIRED";
291
+ /**
292
+ * Session expired
293
+ */
294
+ readonly SESSION_EXPIRED: "ERR_AUTH_SESSION_EXPIRED";
295
+ /**
296
+ * Refresh token failed
297
+ */
298
+ readonly REFRESH_FAILED: "ERR_AUTH_REFRESH_FAILED";
299
+ /**
300
+ * Unknown error
301
+ */
302
+ readonly UNKNOWN: "ERR_UNKNOWN";
303
+ /**
304
+ * Invalid parameters
305
+ */
306
+ readonly INVALID_PARAMS: "ERR_INVALID_PARAMS";
307
+ /**
308
+ * Operation timeout
309
+ */
310
+ readonly TIMEOUT: "ERR_TIMEOUT";
311
+ /**
312
+ * Network error
313
+ */
314
+ readonly NETWORK: "ERR_NETWORK";
315
+ /**
316
+ * Operation cancelled
317
+ */
318
+ readonly CANCELLED: "ERR_CANCELLED";
319
+ /**
320
+ * Resource already exists
321
+ */
322
+ readonly ALREADY_EXISTS: "ERR_ALREADY_EXISTS";
323
+ };
324
+
325
+ export { AUTH_ERROR_CODES, CAPABILITY_PREFIX, COMMON_ERROR_CODES, DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY, DEFAULT_TIMEOUT, ERROR_CODES, HTTP_METHODS, HTTP_STATUS, MAX_EVENT_HISTORY, NAVIGATION_ERROR_CODES, PLATFORM_VERSION, PLUGIN_ERROR_CODES, STORAGE_KEYS, STORAGE_KEY_PREFIX };
@@ -0,0 +1,4 @@
1
+ export { AUTH_ERROR_CODES, CAPABILITY_PREFIX, COMMON_ERROR_CODES, DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY, DEFAULT_TIMEOUT, ERROR_CODES, HTTP_METHODS, HTTP_STATUS, MAX_EVENT_HISTORY, NAVIGATION_ERROR_CODES, PLATFORM_VERSION, PLUGIN_ERROR_CODES, STORAGE_KEYS, STORAGE_KEY_PREFIX } from '../chunk-5CQ3FANY.js';
2
+ import '../chunk-4CV4JOE5.js';
3
+ //# sourceMappingURL=index.js.map
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1 @@
1
+ export { CacheOptions, DEFAULT_CACHE_OPTIONS, DEFAULT_RETRY_OPTIONS, HttpError, HttpErrorCode, HttpErrorCodeType, HttpMethod, InterceptorManager, RETRYABLE_NETWORK_ERRORS, RETRYABLE_STATUS_CODES, RequestConfig, RequestInterceptor, ResponseInterceptor, RetryOptions, SimpleCache, calculateBackoffDelay, createRetryable, delay, generateCacheKey, shouldRetry, withCache, withRetry } from '@brix-sdk/infra-adapter-http-web';
@@ -0,0 +1,4 @@
1
+ export { DEFAULT_CACHE_OPTIONS, DEFAULT_RETRY_OPTIONS, HttpError, HttpErrorCode, RETRYABLE_NETWORK_ERRORS, RETRYABLE_STATUS_CODES, SimpleCache, calculateBackoffDelay, createRetryable, delay, generateCacheKey, shouldRetry, withCache, withRetry } from '../chunk-GNCIKXWI.js';
2
+ import '../chunk-4CV4JOE5.js';
3
+ //# sourceMappingURL=index.js.map
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,57 @@
1
+ export { S as SimpleSnowflake, c as createDailySequenceIdGenerator, a as createSequenceIdGenerator, e as extractTimestampFromId, g as generateNanoId, b as generateShortId, d as generateSnowflakeId, f as generateTimestampId, h as generateUUID, i as isValidUUID } from '../id-BFKGN254.js';
2
+
3
+ /**
4
+ * @file ID 生成器模块入�? * @description 独立�?ID 生成器子�?- 提供各种 ID 生成策略
5
+ * @module @brix-sdk/platform-shared/id
6
+ * @version 3.1.0
7
+ *
8
+ * 【模块说明�? * 本模块从 @brix-sdk/platform-shared/utils 拆分而来�? * 提供独立�?ID 生成器子包,支持更好�?tree-shaking�? *
9
+ * 【选择建议�? * - UUID:需要全球唯一且标准格式时使用
10
+ * - ShortId:用�?URL、临时标识等需要短 ID 的场�? * - NanoId:URL 安全的短 ID,比 ShortId 更随�? * - TimestampId:需要按时间排序的场�? * - SnowflakeId:高并发分布式系统(需配合节点 ID�? *
11
+ * 【使用方式�? * ```typescript
12
+ * // 推荐:直接从子包导入(更好的 tree-shaking�? * import { generateUUID, SnowflakeIdGenerator } from '@brix-sdk/platform-shared/id';
13
+ *
14
+ * // 兼容:从主包导入(会加载所有工具)
15
+ * import { generateUUID } from '@brix-sdk/platform-shared';
16
+ * ```
17
+ *
18
+ * @license Apache-2.0
19
+ */
20
+
21
+ /**
22
+ * ID 生成策略类型
23
+ */
24
+ type IdStrategy = 'uuid' | 'short' | 'nano' | 'timestamp' | 'snowflake';
25
+ /**
26
+ * ID 生成器配�? */
27
+ interface IdGeneratorConfig {
28
+ /** ID 生成策略 */
29
+ strategy: IdStrategy;
30
+ /** ID 前缀(可选) */
31
+ prefix?: string;
32
+ /** �?ID 长度(默�?8�?*/
33
+ shortIdLength?: number;
34
+ /** NanoID 长度(默�?21�?*/
35
+ nanoIdLength?: number;
36
+ }
37
+ /**
38
+ * 创建配置化的 ID 生成�? *
39
+ * 【功能说明�? * 根据配置创建 ID 生成器函数,支持多种 ID 策略�? *
40
+ * @param config ID 生成器配�? * @returns ID 生成函数
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * // 创建 UUID 生成�? * const genUUID = createIdGenerator({ strategy: 'uuid' });
45
+ * genUUID(); // 'f47ac10b-58cc-4372-a567-0e02b2c3d479'
46
+ *
47
+ * // 创建带前缀的短 ID 生成�? * const genOrderId = createIdGenerator({
48
+ * strategy: 'short',
49
+ * prefix: 'ORD-',
50
+ * shortIdLength: 12,
51
+ * });
52
+ * genOrderId(); // 'ORD-a1B2c3D4e5F6'
53
+ * ```
54
+ */
55
+ declare function createIdGenerator(config: IdGeneratorConfig): () => string;
56
+
57
+ export { type IdGeneratorConfig, type IdStrategy, createIdGenerator };
@@ -0,0 +1,64 @@
1
+ import { init_id, id_exports } from '../chunk-DJX6ASLI.js';
2
+ export { SimpleSnowflake, createDailySequenceIdGenerator, createSequenceIdGenerator, extractTimestampFromId, generateNanoId, generateShortId, generateSnowflakeId, generateTimestampId, generateUUID, isValidUUID } from '../chunk-DJX6ASLI.js';
3
+ import { __toCommonJS } from '../chunk-4CV4JOE5.js';
4
+
5
+ // src/id/index.ts
6
+ init_id();
7
+ function createIdGenerator(config) {
8
+ const { strategy, prefix = "", shortIdLength = 8, nanoIdLength = 21 } = config;
9
+ const {
10
+ generateUUID: generateUUID2,
11
+ generateShortId: generateShortId2,
12
+ generateNanoId: generateNanoId2,
13
+ generateTimestampId: generateTimestampId2,
14
+ SnowflakeIdGenerator
15
+ } = (init_id(), __toCommonJS(id_exports));
16
+ switch (strategy) {
17
+ case "uuid":
18
+ return () => `${prefix}${generateUUID2()}`;
19
+ case "short":
20
+ return () => `${prefix}${generateShortId2(shortIdLength)}`;
21
+ case "nano":
22
+ return () => `${prefix}${generateNanoId2(nanoIdLength)}`;
23
+ case "timestamp":
24
+ return () => `${prefix}${generateTimestampId2()}`;
25
+ case "snowflake": {
26
+ const generator = new SnowflakeIdGenerator();
27
+ return () => `${prefix}${generator.nextId()}`;
28
+ }
29
+ default:
30
+ throw new Error(`Unknown ID strategy: ${strategy}`);
31
+ }
32
+ }
33
+ /**
34
+ * @file ID 生成器模块入口
35
+ * @description 独立的 ID 生成器子包 - 提供各种 ID 生成策略
36
+ * @module @brix/platform-shared/id
37
+ * @version 3.1.0
38
+ *
39
+ * 【模块说明】
40
+ * 本模块从 @brix/platform-shared/utils 拆分而来,
41
+ * 提供独立的 ID 生成器子包,支持更好的 tree-shaking。
42
+ *
43
+ * 【选择建议】
44
+ * - UUID:需要全球唯一且标准格式时使用
45
+ * - ShortId:用于 URL、临时标识等需要短 ID 的场景
46
+ * - NanoId:URL 安全的短 ID,比 ShortId 更随机
47
+ * - TimestampId:需要按时间排序的场景
48
+ * - SnowflakeId:高并发分布式系统(需配合节点 ID)
49
+ *
50
+ * 【使用方式】
51
+ * ```typescript
52
+ * // 推荐:直接从子包导入(更好的 tree-shaking)
53
+ * import { generateUUID, SnowflakeIdGenerator } from '@brix/platform-shared/id';
54
+ *
55
+ * // 兼容:从主包导入(会加载所有工具)
56
+ * import { generateUUID } from '@brix/platform-shared';
57
+ * ```
58
+ *
59
+ * @license Apache-2.0
60
+ */
61
+
62
+ export { createIdGenerator };
63
+ //# sourceMappingURL=index.js.map
64
+ //# sourceMappingURL=index.js.map