a2bei4-utils 1.0.9 → 1.0.11
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.
- package/dist/a2bei4.utils.cjs.js +193 -2
- package/dist/a2bei4.utils.cjs.js.map +1 -1
- package/dist/a2bei4.utils.cjs.min.js +1 -1
- package/dist/a2bei4.utils.cjs.min.js.map +1 -1
- package/dist/a2bei4.utils.esm.js +191 -2
- package/dist/a2bei4.utils.esm.js.map +1 -1
- package/dist/a2bei4.utils.esm.min.js +1 -1
- package/dist/a2bei4.utils.esm.min.js.map +1 -1
- package/dist/a2bei4.utils.umd.js +193 -2
- package/dist/a2bei4.utils.umd.js.map +1 -1
- package/dist/a2bei4.utils.umd.min.js +1 -1
- package/dist/a2bei4.utils.umd.min.js.map +1 -1
- package/dist/arr.cjs.map +1 -1
- package/dist/arr.js.map +1 -1
- package/dist/audio.cjs.map +1 -1
- package/dist/audio.js.map +1 -1
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/common.cjs.map +1 -1
- package/dist/common.js.map +1 -1
- package/dist/date.cjs.map +1 -1
- package/dist/date.js.map +1 -1
- package/dist/download.cjs.map +1 -1
- package/dist/download.js.map +1 -1
- package/dist/evt.cjs.map +1 -1
- package/dist/evt.js.map +1 -1
- package/dist/id.cjs.map +1 -1
- package/dist/id.js.map +1 -1
- package/dist/menu.cjs.map +1 -1
- package/dist/menu.js.map +1 -1
- package/dist/timer.cjs +14 -0
- package/dist/timer.cjs.map +1 -1
- package/dist/timer.js +14 -0
- package/dist/timer.js.map +1 -1
- package/dist/tree.cjs +177 -0
- package/dist/tree.cjs.map +1 -1
- package/dist/tree.js +176 -1
- package/dist/tree.js.map +1 -1
- package/dist/webSocket.cjs.map +1 -1
- package/dist/webSocket.js.map +1 -1
- package/package.json +5 -5
- package/types/index.d.ts +186 -2
- package/types/timer.d.ts +4 -0
- package/types/tree.d.ts +182 -1
package/dist/date.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.cjs","sources":["../src/source/date.js"],"sourcesContent":["function getLocales_TimePeriod() {\r\n return {\r\n earlyMorning: \"凌晨\",\r\n morning: \"上午\",\r\n noon: \"中午\",\r\n afternoon: \"下午\",\r\n evening: \"晚上\"\r\n };\r\n}\r\n\r\n/**\r\n * 将任意值安全转换为 Date 对象。\r\n * - 数字/数字字符串:视为时间戳\r\n * - 字符串:尝试按 ISO/RFC 格式解析\r\n * - 对象:优先 valueOf(),再 toString()\r\n * - null / undefined / 无效值:返回 null\r\n *\r\n * @param {*} val - 待转换值\r\n * @returns {Date | null} 有效 Date 或 null\r\n */\r\nexport function toDate(val) {\r\n if (val == null) return null; // null / undefined\r\n if (val instanceof Date) return isNaN(val) ? null : val; // 已是 Date,但需排除 Invalid Date\r\n\r\n // 1. 数字或数字字符串 → 时间戳\r\n if (typeof val === \"number\" || (typeof val === \"string\" && /^-?\\d+(\\.\\d+)?$/.test(val.trim()))) {\r\n const d = new Date(+val);\r\n return isNaN(d) ? null : d;\r\n }\r\n\r\n // 2. 标准 ISO 8601 / RFC 2825 等合法字符串\r\n if (typeof val === \"string\") {\r\n const d = new Date(val);\r\n return isNaN(d) ? null : d; // 非法格式返回 null\r\n }\r\n\r\n // 3. 对象带 valueOf / toString\r\n if (typeof val === \"object\") {\r\n // 优先调用 valueOf(期望返回数字时间戳)\r\n const prim = val.valueOf ? val.valueOf() : Object.prototype.valueOf.call(val);\r\n if (typeof prim === \"number\" && !isNaN(prim)) {\r\n const d = new Date(prim);\r\n return isNaN(d) ? null : d;\r\n }\r\n // 兜底用字符串\r\n const str = val.toString ? val.toString() : String(val);\r\n const d = new Date(str);\r\n return isNaN(d) ? null : d;\r\n }\r\n\r\n // 4. 其余情况\r\n return null;\r\n}\r\n\r\n/**\r\n * 在闭区间 [date1, date2] 内随机生成一个日期(含首尾)。\r\n * 若顺序相反则自动交换。\r\n *\r\n * @param {Date} date1 - 起始日期\r\n * @param {Date} date2 - 结束日期\r\n * @returns {Date} 随机日期\r\n */\r\nexport function randomDateInRange(date1, date2) {\r\n let v1 = date1.getTime(),\r\n v2 = date2.getTime();\r\n if (v1 > v2) [v1, v2] = [v2, v1];\r\n return new Date(v1 + Math.floor(Math.random() * (v2 - v1 + 1)));\r\n}\r\n\r\n//#region 持续时间相关\r\n\r\n/**\r\n * 时间持续对象(完整版本,包含年月日时分秒毫秒)\r\n * @typedef {Object} DurationObject\r\n * @property {number} years - 年数\r\n * @property {number} months - 月数(0-11)\r\n * @property {number} days - 天数(0-29,取决于 monthDays)\r\n * @property {number} hours - 小时数(0-23)\r\n * @property {number} minutes - 分钟数(0-59)\r\n * @property {number} seconds - 秒数(0-59)\r\n * @property {number} milliseconds - 毫秒数(0-999)\r\n */\r\n\r\n/**\r\n * 时间持续对象(最大单位为天)\r\n * @typedef {Object} DurationMaxDayObject\r\n * @property {number} days - 天数\r\n * @property {number} hours - 小时数(0-23)\r\n * @property {number} minutes - 分钟数(0-59)\r\n * @property {number} seconds - 秒数(0-59)\r\n * @property {number} milliseconds - 毫秒数(0-999)\r\n */\r\n\r\n/**\r\n * 时间持续对象(最大单位为小时)\r\n * @typedef {Object} DurationMaxHourObject\r\n * @property {number} hours - 小时数\r\n * @property {number} minutes - 分钟数(0-59)\r\n * @property {number} seconds - 秒数(0-59)\r\n * @property {number} milliseconds - 毫秒数(0-999)\r\n */\r\n\r\n/**\r\n * 将毫秒转换为时间持续对象。\r\n *\r\n * @param {number} milliseconds - 毫秒数(非负整数)\r\n * @param {Object} [options] - 选项对象。\r\n * @param {number} [options.yearDays=365] - 一年的天数。\r\n * @param {number} [options.monthDays=30] - 一月的天数。\r\n * @returns {DurationObject} 时间持续对象\r\n * @throws {TypeError} 当 milliseconds 不是有效数字\r\n * @throws {RangeError} 当 milliseconds 为负数\r\n * @throws {RangeError} 当 yearDays 或 monthDays 不是正整数\r\n *\r\n * @example\r\n * // 基本用法\r\n * millisecond2Duration(42070000500);\r\n * // 返回: { years: 1, months: 4, days: 1, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n */\r\nexport function millisecond2Duration(milliseconds, options = { yearDays: 365, monthDays: 30 }) {\r\n // 参数验证\r\n if (typeof milliseconds !== \"number\" || isNaN(milliseconds)) {\r\n throw new TypeError(\"milliseconds must be a valid number\");\r\n }\r\n if (milliseconds < 0) {\r\n throw new RangeError(\"milliseconds must be a non-negative number\");\r\n }\r\n\r\n // 默认选项\r\n const { yearDays = 365, monthDays = 30 } = options;\r\n\r\n // 选项验证\r\n if (!Number.isInteger(yearDays) || yearDays <= 0) {\r\n throw new RangeError(\"yearDays must be a positive integer\");\r\n }\r\n if (!Number.isInteger(monthDays) || monthDays <= 0) {\r\n throw new RangeError(\"monthDays must be a positive integer\");\r\n }\r\n\r\n const totalMilliseconds = Math.floor(milliseconds);\r\n const ms = totalMilliseconds % 1000;\r\n const diffSeconds = Math.floor(totalMilliseconds / 1000);\r\n\r\n const seconds = diffSeconds % 60;\r\n const minutes = Math.floor(diffSeconds / 60) % 60;\r\n const hours = Math.floor(diffSeconds / 3600) % 24;\r\n\r\n // 计算年、月、日\r\n const totalDays = Math.floor(diffSeconds / 3600 / 24);\r\n const years = Math.floor(totalDays / yearDays);\r\n const remainingDays = totalDays % yearDays;\r\n const months = Math.floor(remainingDays / monthDays);\r\n const days = remainingDays % monthDays;\r\n\r\n return { years, months, days, hours, minutes, seconds, milliseconds: ms };\r\n}\r\n\r\n/**\r\n * 将毫秒转换为时间持续对象(最大单位为天)。\r\n * @param {number} milliseconds - 毫秒数(非负整数)\r\n * @returns {DurationMaxDayObject} 包含天、小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 milliseconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 milliseconds 为负数时抛出\r\n * @example\r\n * // 返回 { days: 486, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * millisecond2DurationMaxDay(42070000500);\r\n */\r\nexport function millisecond2DurationMaxDay(milliseconds) {\r\n if (typeof milliseconds !== \"number\" || isNaN(milliseconds)) {\r\n throw new TypeError(\"milliseconds must be a valid number\");\r\n }\r\n if (milliseconds < 0) {\r\n throw new RangeError(\"milliseconds must be a non-negative number\");\r\n }\r\n\r\n const totalMilliseconds = Math.floor(milliseconds);\r\n const ms = totalMilliseconds % 1000;\r\n const diffSeconds = Math.floor(totalMilliseconds / 1000);\r\n\r\n const seconds = diffSeconds % 60;\r\n const minutes = Math.floor(diffSeconds / 60) % 60;\r\n const hours = Math.floor(diffSeconds / 3600) % 24;\r\n const days = Math.floor(diffSeconds / 3600 / 24);\r\n\r\n return { days, hours, minutes, seconds, milliseconds: ms };\r\n}\r\n\r\n/**\r\n * 将毫秒转换为时间持续对象(最大单位为小时)。\r\n * @param {number} milliseconds - 毫秒数(非负整数)\r\n * @returns {DurationMaxHourObject} 包含小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 milliseconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 milliseconds 为负数时抛出\r\n * @example\r\n * // 返回 { hours: 11686, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * millisecond2DurationMaxHour(42070000500);\r\n */\r\nexport function millisecond2DurationMaxHour(milliseconds) {\r\n if (typeof milliseconds !== \"number\" || isNaN(milliseconds)) {\r\n throw new TypeError(\"milliseconds must be a valid number\");\r\n }\r\n if (milliseconds < 0) {\r\n throw new RangeError(\"milliseconds must be a non-negative number\");\r\n }\r\n\r\n const totalMilliseconds = Math.floor(milliseconds);\r\n const ms = totalMilliseconds % 1000;\r\n const diffSeconds = Math.floor(totalMilliseconds / 1000);\r\n\r\n const seconds = diffSeconds % 60;\r\n const minutes = Math.floor(diffSeconds / 60) % 60;\r\n const hours = Math.floor(diffSeconds / 3600);\r\n\r\n return { hours, minutes, seconds, milliseconds: ms };\r\n}\r\n\r\n/**\r\n * 将秒转换为时间持续对象。\r\n *\r\n * @param {number} seconds - 秒数(非负整数)\r\n * @param {Object} [options] - 选项对象。\r\n * @param {number} [options.yearDays=365] - 一年的天数。\r\n * @param {number} [options.monthDays=30] - 一月的天数。\r\n * @returns {DurationObject} 时间持续对象\r\n * @throws {TypeError} 当 seconds 不是有效数字\r\n * @throws {RangeError} 当 seconds 为负数\r\n * @throws {RangeError} 当 yearDays 或 monthDays 不是正整数\r\n *\r\n * @example\r\n * // 基本用法\r\n * second2Duration(42070000.5);\r\n * // 返回: { years: 1, months: 4, days: 1, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n */\r\nexport function second2Duration(seconds, options = { yearDays: 365, monthDays: 30 }) {\r\n if (typeof seconds !== \"number\" || isNaN(seconds)) {\r\n throw new TypeError(\"seconds must be a valid number\");\r\n }\r\n if (seconds < 0) {\r\n throw new RangeError(\"seconds must be a non-negative number\");\r\n }\r\n return millisecond2Duration(seconds * 1000, options);\r\n}\r\n\r\n/**\r\n * 将秒转换为时间持续对象(最大单位为天)。\r\n * @param {number} seconds - 秒数(非负整数)\r\n * @returns {DurationMaxDayObject} 包含天、小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 seconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 seconds 为负数时抛出\r\n * @example\r\n * // 返回 { days: 486, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * second2DurationMaxDay(42070000.5);\r\n */\r\nexport function second2DurationMaxDay(seconds) {\r\n if (typeof seconds !== \"number\" || isNaN(seconds)) {\r\n throw new TypeError(\"seconds must be a valid number\");\r\n }\r\n if (seconds < 0) {\r\n throw new RangeError(\"seconds must be a non-negative number\");\r\n }\r\n return millisecond2DurationMaxDay(seconds * 1000);\r\n}\r\n\r\n/**\r\n * 将秒转换为时间持续对象(最大单位为小时)。\r\n * @param {number} seconds - 秒数(非负整数)\r\n * @returns {DurationMaxHourObject} 包含小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 seconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 seconds 为负数时抛出\r\n * @example\r\n * // 返回 { hours: 11686, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * second2DurationMaxHour(42070000.5);\r\n */\r\nexport function second2DurationMaxHour(seconds) {\r\n if (typeof seconds !== \"number\" || isNaN(seconds)) {\r\n throw new TypeError(\"seconds must be a valid number\");\r\n }\r\n if (seconds < 0) {\r\n throw new RangeError(\"seconds must be a non-negative number\");\r\n }\r\n return millisecond2DurationMaxHour(seconds * 1000);\r\n}\r\n\r\n//#endregion\r\n\r\n/**\r\n * 根据小时数返回对应的时间段名称。\r\n *\r\n * @param {number} hour - 24 小时制的小时(0-23)\r\n * @param {object} [locales] - 自定义时段文案\r\n * @param {string} [locales.earlyMorning=\"凌晨\"] - 00-05\r\n * @param {string} [locales.morning=\"上午\"] - 06-11\r\n * @param {string} [locales.noon=\"中午\"] - 12-13\r\n * @param {string} [locales.afternoon=\"下午\"] - 14-17\r\n * @param {string} [locales.evening=\"晚上\"] - 18-23\r\n * @returns {string} 时段名称\r\n * @throws {RangeError} 当 hour 不在 0-23 范围时抛出\r\n */\r\nexport function getTimePeriodName(hour, locales = getLocales_TimePeriod()) {\r\n if (!Number.isInteger(hour) || hour < 0 || hour > 23) {\r\n throw new RangeError(\"hour 必须是 0-23 的整数\");\r\n }\r\n if (hour >= 0 && hour < 6) return locales.earlyMorning;\r\n if (hour < 12) return locales.morning;\r\n if (hour < 14) return locales.noon;\r\n if (hour < 18) return locales.afternoon;\r\n return locales.evening;\r\n}\r\n\r\n/**\r\n * 格式化时间戳为本地化的时间字符串。\r\n *\r\n * @param {number} timestamp - 要格式化的时间戳(毫秒)。\r\n * @param {Object} [locales] - 本地化配置对象,包含时间相关的本地化字符串。\r\n * @param {string} [locales.justNow='刚刚'] - 表示刚刚过去的时间。\r\n * @param {string} [locales.today='今天'] - 表示今天。\r\n * @param {string} [locales.yesterday='昨天'] - 表示昨天。\r\n * @param {string} [locales.beforeYesterday='前天'] - 表示前天。\r\n * @param {string} [locales.year='年'] - 年的单位。\r\n * @param {string} [locales.month='月'] - 月的单位。\r\n * @param {string} [locales.day='日'] - 日的单位。\r\n * @param {Object} [locales.timePeriod] - 一天中不同时间段的本地化字符串。\r\n * @param {string} [locales.timePeriod.earlyMorning='凌晨'] - 凌晨。\r\n * @param {string} [locales.timePeriod.morning='上午'] - 上午。\r\n * @param {string} [locales.timePeriod.noon='中午'] - 中午。\r\n * @param {string} [locales.timePeriod.afternoon='下午'] - 下午。\r\n * @param {string} [locales.timePeriod.evening='晚上'] - 晚上。\r\n * @param {Array<string>} [locales.weekDays=['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']] - 星期几的本地化字符串数组。\r\n *\r\n * @returns {string} - 格式化后的时间字符串。\r\n */\r\nexport function formatTimeForLocale(\r\n timestamp,\r\n locales = {\r\n justNow: \"刚刚\",\r\n today: \"今天\",\r\n yesterday: \"昨天\",\r\n beforeYesterday: \"前天\",\r\n year: \"年\",\r\n month: \"月\",\r\n day: \"日\",\r\n timePeriod: getLocales_TimePeriod(),\r\n weekDays: [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"]\r\n }\r\n) {\r\n const now = new Date();\r\n const messageDate = new Date(timestamp);\r\n\r\n const nowTime = now.getTime();\r\n const msgTime = messageDate.getTime();\r\n const diff = nowTime - msgTime;\r\n const diffMinutes = Math.floor(diff / (1000 * 60));\r\n\r\n const year = messageDate.getFullYear();\r\n const month = messageDate.getMonth() + 1;\r\n const day = messageDate.getDate();\r\n const hour = messageDate.getHours();\r\n const minute = messageDate.getMinutes().toString().padStart(2, \"0\");\r\n\r\n // 刚刚:1分钟内\r\n if (diffMinutes < 1) {\r\n return locales.justNow;\r\n }\r\n\r\n // 计算自然天数差(按日期而非时间差)\r\n const nowDate = new Date(now.getFullYear(), now.getMonth(), now.getDate());\r\n const msgDate = new Date(year, month - 1, day);\r\n const diffDays = Math.floor((nowDate.getTime() - msgDate.getTime()) / (1000 * 60 * 60 * 24));\r\n\r\n const period = getTimePeriodName(hour, locales.timePeriod);\r\n const timeStr = `${hour}:${minute}`;\r\n\r\n // 今天\r\n if (diffDays === 0) {\r\n return `${locales.today} ${period}${timeStr}`;\r\n }\r\n\r\n // 昨天\r\n if (diffDays === 1) {\r\n return `${locales.yesterday} ${period}${timeStr}`;\r\n }\r\n\r\n // 前天\r\n if (diffDays === 2) {\r\n return `${locales.beforeYesterday} ${period}${timeStr}`;\r\n }\r\n\r\n // 本周内(周一到周日,且不是今天/昨天/前天)\r\n // 获取本周一的日期\r\n const nowDay = now.getDay() || 7; // 周日转为7\r\n const msgDay = messageDate.getDay() || 7;\r\n const mondayOfThisWeek = new Date(nowDate.getTime() - (nowDay - 1) * 24 * 60 * 60 * 1000);\r\n const mondayOfThatWeek = new Date(msgDate.getTime() - (msgDay - 1) * 24 * 60 * 60 * 1000);\r\n\r\n if (mondayOfThisWeek.getTime() === mondayOfThatWeek.getTime() && diffDays < 7) {\r\n const weekDayName = locales.weekDays[messageDate.getDay()];\r\n return `${weekDayName}${period} ${timeStr}`;\r\n }\r\n\r\n // 本月内(非本周)\r\n const nowYear = now.getFullYear();\r\n const nowMonth = now.getMonth();\r\n if (year === nowYear && messageDate.getMonth() === nowMonth) {\r\n return `${month}${locales.month}${day}${locales.day} ${period}${timeStr}`;\r\n }\r\n\r\n // 本年内(非本月)\r\n if (year === nowYear) {\r\n return `${month}${locales.month}${day}${locales.day} ${period}${timeStr}`;\r\n }\r\n\r\n // 其他(非本年)\r\n return `${year}${locales.year}${month}${locales.month}${day}${locales.day} ${period}${timeStr}`;\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"date.cjs","sources":["../src/source/date.js"],"sourcesContent":["function getLocales_TimePeriod() {\r\n return {\r\n earlyMorning: \"凌晨\",\r\n morning: \"上午\",\r\n noon: \"中午\",\r\n afternoon: \"下午\",\r\n evening: \"晚上\"\r\n };\r\n}\r\n\r\n/**\r\n * 将任意值安全转换为 Date 对象。\r\n * - 数字/数字字符串:视为时间戳\r\n * - 字符串:尝试按 ISO/RFC 格式解析\r\n * - 对象:优先 valueOf(),再 toString()\r\n * - null / undefined / 无效值:返回 null\r\n *\r\n * @param {*} val - 待转换值\r\n * @returns {Date | null} 有效 Date 或 null\r\n */\r\nexport function toDate(val) {\r\n if (val == null) return null; // null / undefined\r\n if (val instanceof Date) return isNaN(val) ? null : val; // 已是 Date,但需排除 Invalid Date\r\n\r\n // 1. 数字或数字字符串 → 时间戳\r\n if (typeof val === \"number\" || (typeof val === \"string\" && /^-?\\d+(\\.\\d+)?$/.test(val.trim()))) {\r\n const d = new Date(+val);\r\n return isNaN(d) ? null : d;\r\n }\r\n\r\n // 2. 标准 ISO 8601 / RFC 2825 等合法字符串\r\n if (typeof val === \"string\") {\r\n const d = new Date(val);\r\n return isNaN(d) ? null : d; // 非法格式返回 null\r\n }\r\n\r\n // 3. 对象带 valueOf / toString\r\n if (typeof val === \"object\") {\r\n // 优先调用 valueOf(期望返回数字时间戳)\r\n const prim = val.valueOf ? val.valueOf() : Object.prototype.valueOf.call(val);\r\n if (typeof prim === \"number\" && !isNaN(prim)) {\r\n const d = new Date(prim);\r\n return isNaN(d) ? null : d;\r\n }\r\n // 兜底用字符串\r\n const str = val.toString ? val.toString() : String(val);\r\n const d = new Date(str);\r\n return isNaN(d) ? null : d;\r\n }\r\n\r\n // 4. 其余情况\r\n return null;\r\n}\r\n\r\n/**\r\n * 在闭区间 [date1, date2] 内随机生成一个日期(含首尾)。\r\n * 若顺序相反则自动交换。\r\n *\r\n * @param {Date} date1 - 起始日期\r\n * @param {Date} date2 - 结束日期\r\n * @returns {Date} 随机日期\r\n */\r\nexport function randomDateInRange(date1, date2) {\r\n let v1 = date1.getTime(),\r\n v2 = date2.getTime();\r\n if (v1 > v2) [v1, v2] = [v2, v1];\r\n return new Date(v1 + Math.floor(Math.random() * (v2 - v1 + 1)));\r\n}\r\n\r\n//#region 持续时间相关\r\n\r\n/**\r\n * 时间持续对象(完整版本,包含年月日时分秒毫秒)\r\n * @typedef {Object} DurationObject\r\n * @property {number} years - 年数\r\n * @property {number} months - 月数(0-11)\r\n * @property {number} days - 天数(0-29,取决于 monthDays)\r\n * @property {number} hours - 小时数(0-23)\r\n * @property {number} minutes - 分钟数(0-59)\r\n * @property {number} seconds - 秒数(0-59)\r\n * @property {number} milliseconds - 毫秒数(0-999)\r\n */\r\n\r\n/**\r\n * 时间持续对象(最大单位为天)\r\n * @typedef {Object} DurationMaxDayObject\r\n * @property {number} days - 天数\r\n * @property {number} hours - 小时数(0-23)\r\n * @property {number} minutes - 分钟数(0-59)\r\n * @property {number} seconds - 秒数(0-59)\r\n * @property {number} milliseconds - 毫秒数(0-999)\r\n */\r\n\r\n/**\r\n * 时间持续对象(最大单位为小时)\r\n * @typedef {Object} DurationMaxHourObject\r\n * @property {number} hours - 小时数\r\n * @property {number} minutes - 分钟数(0-59)\r\n * @property {number} seconds - 秒数(0-59)\r\n * @property {number} milliseconds - 毫秒数(0-999)\r\n */\r\n\r\n/**\r\n * 将毫秒转换为时间持续对象。\r\n *\r\n * @param {number} milliseconds - 毫秒数(非负整数)\r\n * @param {Object} [options] - 选项对象。\r\n * @param {number} [options.yearDays=365] - 一年的天数。\r\n * @param {number} [options.monthDays=30] - 一月的天数。\r\n * @returns {DurationObject} 时间持续对象\r\n * @throws {TypeError} 当 milliseconds 不是有效数字\r\n * @throws {RangeError} 当 milliseconds 为负数\r\n * @throws {RangeError} 当 yearDays 或 monthDays 不是正整数\r\n *\r\n * @example\r\n * // 基本用法\r\n * millisecond2Duration(42070000500);\r\n * // 返回: { years: 1, months: 4, days: 1, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n */\r\nexport function millisecond2Duration(milliseconds, options = { yearDays: 365, monthDays: 30 }) {\r\n // 参数验证\r\n if (typeof milliseconds !== \"number\" || isNaN(milliseconds)) {\r\n throw new TypeError(\"milliseconds must be a valid number\");\r\n }\r\n if (milliseconds < 0) {\r\n throw new RangeError(\"milliseconds must be a non-negative number\");\r\n }\r\n\r\n // 默认选项\r\n const { yearDays = 365, monthDays = 30 } = options;\r\n\r\n // 选项验证\r\n if (!Number.isInteger(yearDays) || yearDays <= 0) {\r\n throw new RangeError(\"yearDays must be a positive integer\");\r\n }\r\n if (!Number.isInteger(monthDays) || monthDays <= 0) {\r\n throw new RangeError(\"monthDays must be a positive integer\");\r\n }\r\n\r\n const totalMilliseconds = Math.floor(milliseconds);\r\n const ms = totalMilliseconds % 1000;\r\n const diffSeconds = Math.floor(totalMilliseconds / 1000);\r\n\r\n const seconds = diffSeconds % 60;\r\n const minutes = Math.floor(diffSeconds / 60) % 60;\r\n const hours = Math.floor(diffSeconds / 3600) % 24;\r\n\r\n // 计算年、月、日\r\n const totalDays = Math.floor(diffSeconds / 3600 / 24);\r\n const years = Math.floor(totalDays / yearDays);\r\n const remainingDays = totalDays % yearDays;\r\n const months = Math.floor(remainingDays / monthDays);\r\n const days = remainingDays % monthDays;\r\n\r\n return { years, months, days, hours, minutes, seconds, milliseconds: ms };\r\n}\r\n\r\n/**\r\n * 将毫秒转换为时间持续对象(最大单位为天)。\r\n * @param {number} milliseconds - 毫秒数(非负整数)\r\n * @returns {DurationMaxDayObject} 包含天、小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 milliseconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 milliseconds 为负数时抛出\r\n * @example\r\n * // 返回 { days: 486, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * millisecond2DurationMaxDay(42070000500);\r\n */\r\nexport function millisecond2DurationMaxDay(milliseconds) {\r\n if (typeof milliseconds !== \"number\" || isNaN(milliseconds)) {\r\n throw new TypeError(\"milliseconds must be a valid number\");\r\n }\r\n if (milliseconds < 0) {\r\n throw new RangeError(\"milliseconds must be a non-negative number\");\r\n }\r\n\r\n const totalMilliseconds = Math.floor(milliseconds);\r\n const ms = totalMilliseconds % 1000;\r\n const diffSeconds = Math.floor(totalMilliseconds / 1000);\r\n\r\n const seconds = diffSeconds % 60;\r\n const minutes = Math.floor(diffSeconds / 60) % 60;\r\n const hours = Math.floor(diffSeconds / 3600) % 24;\r\n const days = Math.floor(diffSeconds / 3600 / 24);\r\n\r\n return { days, hours, minutes, seconds, milliseconds: ms };\r\n}\r\n\r\n/**\r\n * 将毫秒转换为时间持续对象(最大单位为小时)。\r\n * @param {number} milliseconds - 毫秒数(非负整数)\r\n * @returns {DurationMaxHourObject} 包含小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 milliseconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 milliseconds 为负数时抛出\r\n * @example\r\n * // 返回 { hours: 11686, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * millisecond2DurationMaxHour(42070000500);\r\n */\r\nexport function millisecond2DurationMaxHour(milliseconds) {\r\n if (typeof milliseconds !== \"number\" || isNaN(milliseconds)) {\r\n throw new TypeError(\"milliseconds must be a valid number\");\r\n }\r\n if (milliseconds < 0) {\r\n throw new RangeError(\"milliseconds must be a non-negative number\");\r\n }\r\n\r\n const totalMilliseconds = Math.floor(milliseconds);\r\n const ms = totalMilliseconds % 1000;\r\n const diffSeconds = Math.floor(totalMilliseconds / 1000);\r\n\r\n const seconds = diffSeconds % 60;\r\n const minutes = Math.floor(diffSeconds / 60) % 60;\r\n const hours = Math.floor(diffSeconds / 3600);\r\n\r\n return { hours, minutes, seconds, milliseconds: ms };\r\n}\r\n\r\n/**\r\n * 将秒转换为时间持续对象。\r\n *\r\n * @param {number} seconds - 秒数(非负整数)\r\n * @param {Object} [options] - 选项对象。\r\n * @param {number} [options.yearDays=365] - 一年的天数。\r\n * @param {number} [options.monthDays=30] - 一月的天数。\r\n * @returns {DurationObject} 时间持续对象\r\n * @throws {TypeError} 当 seconds 不是有效数字\r\n * @throws {RangeError} 当 seconds 为负数\r\n * @throws {RangeError} 当 yearDays 或 monthDays 不是正整数\r\n *\r\n * @example\r\n * // 基本用法\r\n * second2Duration(42070000.5);\r\n * // 返回: { years: 1, months: 4, days: 1, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n */\r\nexport function second2Duration(seconds, options = { yearDays: 365, monthDays: 30 }) {\r\n if (typeof seconds !== \"number\" || isNaN(seconds)) {\r\n throw new TypeError(\"seconds must be a valid number\");\r\n }\r\n if (seconds < 0) {\r\n throw new RangeError(\"seconds must be a non-negative number\");\r\n }\r\n return millisecond2Duration(seconds * 1000, options);\r\n}\r\n\r\n/**\r\n * 将秒转换为时间持续对象(最大单位为天)。\r\n * @param {number} seconds - 秒数(非负整数)\r\n * @returns {DurationMaxDayObject} 包含天、小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 seconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 seconds 为负数时抛出\r\n * @example\r\n * // 返回 { days: 486, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * second2DurationMaxDay(42070000.5);\r\n */\r\nexport function second2DurationMaxDay(seconds) {\r\n if (typeof seconds !== \"number\" || isNaN(seconds)) {\r\n throw new TypeError(\"seconds must be a valid number\");\r\n }\r\n if (seconds < 0) {\r\n throw new RangeError(\"seconds must be a non-negative number\");\r\n }\r\n return millisecond2DurationMaxDay(seconds * 1000);\r\n}\r\n\r\n/**\r\n * 将秒转换为时间持续对象(最大单位为小时)。\r\n * @param {number} seconds - 秒数(非负整数)\r\n * @returns {DurationMaxHourObject} 包含小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 seconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 seconds 为负数时抛出\r\n * @example\r\n * // 返回 { hours: 11686, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * second2DurationMaxHour(42070000.5);\r\n */\r\nexport function second2DurationMaxHour(seconds) {\r\n if (typeof seconds !== \"number\" || isNaN(seconds)) {\r\n throw new TypeError(\"seconds must be a valid number\");\r\n }\r\n if (seconds < 0) {\r\n throw new RangeError(\"seconds must be a non-negative number\");\r\n }\r\n return millisecond2DurationMaxHour(seconds * 1000);\r\n}\r\n\r\n//#endregion\r\n\r\n/**\r\n * 根据小时数返回对应的时间段名称。\r\n *\r\n * @param {number} hour - 24 小时制的小时(0-23)\r\n * @param {object} [locales] - 自定义时段文案\r\n * @param {string} [locales.earlyMorning=\"凌晨\"] - 00-05\r\n * @param {string} [locales.morning=\"上午\"] - 06-11\r\n * @param {string} [locales.noon=\"中午\"] - 12-13\r\n * @param {string} [locales.afternoon=\"下午\"] - 14-17\r\n * @param {string} [locales.evening=\"晚上\"] - 18-23\r\n * @returns {string} 时段名称\r\n * @throws {RangeError} 当 hour 不在 0-23 范围时抛出\r\n */\r\nexport function getTimePeriodName(hour, locales = getLocales_TimePeriod()) {\r\n if (!Number.isInteger(hour) || hour < 0 || hour > 23) {\r\n throw new RangeError(\"hour 必须是 0-23 的整数\");\r\n }\r\n if (hour >= 0 && hour < 6) return locales.earlyMorning;\r\n if (hour < 12) return locales.morning;\r\n if (hour < 14) return locales.noon;\r\n if (hour < 18) return locales.afternoon;\r\n return locales.evening;\r\n}\r\n\r\n/**\r\n * 格式化时间戳为本地化的时间字符串。\r\n *\r\n * @param {number} timestamp - 要格式化的时间戳(毫秒)。\r\n * @param {Object} [locales] - 本地化配置对象,包含时间相关的本地化字符串。\r\n * @param {string} [locales.justNow='刚刚'] - 表示刚刚过去的时间。\r\n * @param {string} [locales.today='今天'] - 表示今天。\r\n * @param {string} [locales.yesterday='昨天'] - 表示昨天。\r\n * @param {string} [locales.beforeYesterday='前天'] - 表示前天。\r\n * @param {string} [locales.year='年'] - 年的单位。\r\n * @param {string} [locales.month='月'] - 月的单位。\r\n * @param {string} [locales.day='日'] - 日的单位。\r\n * @param {Object} [locales.timePeriod] - 一天中不同时间段的本地化字符串。\r\n * @param {string} [locales.timePeriod.earlyMorning='凌晨'] - 凌晨。\r\n * @param {string} [locales.timePeriod.morning='上午'] - 上午。\r\n * @param {string} [locales.timePeriod.noon='中午'] - 中午。\r\n * @param {string} [locales.timePeriod.afternoon='下午'] - 下午。\r\n * @param {string} [locales.timePeriod.evening='晚上'] - 晚上。\r\n * @param {Array<string>} [locales.weekDays=['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']] - 星期几的本地化字符串数组。\r\n *\r\n * @returns {string} - 格式化后的时间字符串。\r\n */\r\nexport function formatTimeForLocale(\r\n timestamp,\r\n locales = {\r\n justNow: \"刚刚\",\r\n today: \"今天\",\r\n yesterday: \"昨天\",\r\n beforeYesterday: \"前天\",\r\n year: \"年\",\r\n month: \"月\",\r\n day: \"日\",\r\n timePeriod: getLocales_TimePeriod(),\r\n weekDays: [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"]\r\n }\r\n) {\r\n const now = new Date();\r\n const messageDate = new Date(timestamp);\r\n\r\n const nowTime = now.getTime();\r\n const msgTime = messageDate.getTime();\r\n const diff = nowTime - msgTime;\r\n const diffMinutes = Math.floor(diff / (1000 * 60));\r\n\r\n const year = messageDate.getFullYear();\r\n const month = messageDate.getMonth() + 1;\r\n const day = messageDate.getDate();\r\n const hour = messageDate.getHours();\r\n const minute = messageDate.getMinutes().toString().padStart(2, \"0\");\r\n\r\n // 刚刚:1分钟内\r\n if (diffMinutes < 1) {\r\n return locales.justNow;\r\n }\r\n\r\n // 计算自然天数差(按日期而非时间差)\r\n const nowDate = new Date(now.getFullYear(), now.getMonth(), now.getDate());\r\n const msgDate = new Date(year, month - 1, day);\r\n const diffDays = Math.floor((nowDate.getTime() - msgDate.getTime()) / (1000 * 60 * 60 * 24));\r\n\r\n const period = getTimePeriodName(hour, locales.timePeriod);\r\n const timeStr = `${hour}:${minute}`;\r\n\r\n // 今天\r\n if (diffDays === 0) {\r\n return `${locales.today} ${period}${timeStr}`;\r\n }\r\n\r\n // 昨天\r\n if (diffDays === 1) {\r\n return `${locales.yesterday} ${period}${timeStr}`;\r\n }\r\n\r\n // 前天\r\n if (diffDays === 2) {\r\n return `${locales.beforeYesterday} ${period}${timeStr}`;\r\n }\r\n\r\n // 本周内(周一到周日,且不是今天/昨天/前天)\r\n // 获取本周一的日期\r\n const nowDay = now.getDay() || 7; // 周日转为7\r\n const msgDay = messageDate.getDay() || 7;\r\n const mondayOfThisWeek = new Date(nowDate.getTime() - (nowDay - 1) * 24 * 60 * 60 * 1000);\r\n const mondayOfThatWeek = new Date(msgDate.getTime() - (msgDay - 1) * 24 * 60 * 60 * 1000);\r\n\r\n if (mondayOfThisWeek.getTime() === mondayOfThatWeek.getTime() && diffDays < 7) {\r\n const weekDayName = locales.weekDays[messageDate.getDay()];\r\n return `${weekDayName}${period} ${timeStr}`;\r\n }\r\n\r\n // 本月内(非本周)\r\n const nowYear = now.getFullYear();\r\n const nowMonth = now.getMonth();\r\n if (year === nowYear && messageDate.getMonth() === nowMonth) {\r\n return `${month}${locales.month}${day}${locales.day} ${period}${timeStr}`;\r\n }\r\n\r\n // 本年内(非本月)\r\n if (year === nowYear) {\r\n return `${month}${locales.month}${day}${locales.day} ${period}${timeStr}`;\r\n }\r\n\r\n // 其他(非本年)\r\n return `${year}${locales.year}${month}${locales.month}${day}${locales.day} ${period}${timeStr}`;\r\n}\r\n"],"names":[],"mappings":"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"}
|
package/dist/date.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.js","sources":["../src/source/date.js"],"sourcesContent":["function getLocales_TimePeriod() {\r\n return {\r\n earlyMorning: \"凌晨\",\r\n morning: \"上午\",\r\n noon: \"中午\",\r\n afternoon: \"下午\",\r\n evening: \"晚上\"\r\n };\r\n}\r\n\r\n/**\r\n * 将任意值安全转换为 Date 对象。\r\n * - 数字/数字字符串:视为时间戳\r\n * - 字符串:尝试按 ISO/RFC 格式解析\r\n * - 对象:优先 valueOf(),再 toString()\r\n * - null / undefined / 无效值:返回 null\r\n *\r\n * @param {*} val - 待转换值\r\n * @returns {Date | null} 有效 Date 或 null\r\n */\r\nexport function toDate(val) {\r\n if (val == null) return null; // null / undefined\r\n if (val instanceof Date) return isNaN(val) ? null : val; // 已是 Date,但需排除 Invalid Date\r\n\r\n // 1. 数字或数字字符串 → 时间戳\r\n if (typeof val === \"number\" || (typeof val === \"string\" && /^-?\\d+(\\.\\d+)?$/.test(val.trim()))) {\r\n const d = new Date(+val);\r\n return isNaN(d) ? null : d;\r\n }\r\n\r\n // 2. 标准 ISO 8601 / RFC 2825 等合法字符串\r\n if (typeof val === \"string\") {\r\n const d = new Date(val);\r\n return isNaN(d) ? null : d; // 非法格式返回 null\r\n }\r\n\r\n // 3. 对象带 valueOf / toString\r\n if (typeof val === \"object\") {\r\n // 优先调用 valueOf(期望返回数字时间戳)\r\n const prim = val.valueOf ? val.valueOf() : Object.prototype.valueOf.call(val);\r\n if (typeof prim === \"number\" && !isNaN(prim)) {\r\n const d = new Date(prim);\r\n return isNaN(d) ? null : d;\r\n }\r\n // 兜底用字符串\r\n const str = val.toString ? val.toString() : String(val);\r\n const d = new Date(str);\r\n return isNaN(d) ? null : d;\r\n }\r\n\r\n // 4. 其余情况\r\n return null;\r\n}\r\n\r\n/**\r\n * 在闭区间 [date1, date2] 内随机生成一个日期(含首尾)。\r\n * 若顺序相反则自动交换。\r\n *\r\n * @param {Date} date1 - 起始日期\r\n * @param {Date} date2 - 结束日期\r\n * @returns {Date} 随机日期\r\n */\r\nexport function randomDateInRange(date1, date2) {\r\n let v1 = date1.getTime(),\r\n v2 = date2.getTime();\r\n if (v1 > v2) [v1, v2] = [v2, v1];\r\n return new Date(v1 + Math.floor(Math.random() * (v2 - v1 + 1)));\r\n}\r\n\r\n//#region 持续时间相关\r\n\r\n/**\r\n * 时间持续对象(完整版本,包含年月日时分秒毫秒)\r\n * @typedef {Object} DurationObject\r\n * @property {number} years - 年数\r\n * @property {number} months - 月数(0-11)\r\n * @property {number} days - 天数(0-29,取决于 monthDays)\r\n * @property {number} hours - 小时数(0-23)\r\n * @property {number} minutes - 分钟数(0-59)\r\n * @property {number} seconds - 秒数(0-59)\r\n * @property {number} milliseconds - 毫秒数(0-999)\r\n */\r\n\r\n/**\r\n * 时间持续对象(最大单位为天)\r\n * @typedef {Object} DurationMaxDayObject\r\n * @property {number} days - 天数\r\n * @property {number} hours - 小时数(0-23)\r\n * @property {number} minutes - 分钟数(0-59)\r\n * @property {number} seconds - 秒数(0-59)\r\n * @property {number} milliseconds - 毫秒数(0-999)\r\n */\r\n\r\n/**\r\n * 时间持续对象(最大单位为小时)\r\n * @typedef {Object} DurationMaxHourObject\r\n * @property {number} hours - 小时数\r\n * @property {number} minutes - 分钟数(0-59)\r\n * @property {number} seconds - 秒数(0-59)\r\n * @property {number} milliseconds - 毫秒数(0-999)\r\n */\r\n\r\n/**\r\n * 将毫秒转换为时间持续对象。\r\n *\r\n * @param {number} milliseconds - 毫秒数(非负整数)\r\n * @param {Object} [options] - 选项对象。\r\n * @param {number} [options.yearDays=365] - 一年的天数。\r\n * @param {number} [options.monthDays=30] - 一月的天数。\r\n * @returns {DurationObject} 时间持续对象\r\n * @throws {TypeError} 当 milliseconds 不是有效数字\r\n * @throws {RangeError} 当 milliseconds 为负数\r\n * @throws {RangeError} 当 yearDays 或 monthDays 不是正整数\r\n *\r\n * @example\r\n * // 基本用法\r\n * millisecond2Duration(42070000500);\r\n * // 返回: { years: 1, months: 4, days: 1, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n */\r\nexport function millisecond2Duration(milliseconds, options = { yearDays: 365, monthDays: 30 }) {\r\n // 参数验证\r\n if (typeof milliseconds !== \"number\" || isNaN(milliseconds)) {\r\n throw new TypeError(\"milliseconds must be a valid number\");\r\n }\r\n if (milliseconds < 0) {\r\n throw new RangeError(\"milliseconds must be a non-negative number\");\r\n }\r\n\r\n // 默认选项\r\n const { yearDays = 365, monthDays = 30 } = options;\r\n\r\n // 选项验证\r\n if (!Number.isInteger(yearDays) || yearDays <= 0) {\r\n throw new RangeError(\"yearDays must be a positive integer\");\r\n }\r\n if (!Number.isInteger(monthDays) || monthDays <= 0) {\r\n throw new RangeError(\"monthDays must be a positive integer\");\r\n }\r\n\r\n const totalMilliseconds = Math.floor(milliseconds);\r\n const ms = totalMilliseconds % 1000;\r\n const diffSeconds = Math.floor(totalMilliseconds / 1000);\r\n\r\n const seconds = diffSeconds % 60;\r\n const minutes = Math.floor(diffSeconds / 60) % 60;\r\n const hours = Math.floor(diffSeconds / 3600) % 24;\r\n\r\n // 计算年、月、日\r\n const totalDays = Math.floor(diffSeconds / 3600 / 24);\r\n const years = Math.floor(totalDays / yearDays);\r\n const remainingDays = totalDays % yearDays;\r\n const months = Math.floor(remainingDays / monthDays);\r\n const days = remainingDays % monthDays;\r\n\r\n return { years, months, days, hours, minutes, seconds, milliseconds: ms };\r\n}\r\n\r\n/**\r\n * 将毫秒转换为时间持续对象(最大单位为天)。\r\n * @param {number} milliseconds - 毫秒数(非负整数)\r\n * @returns {DurationMaxDayObject} 包含天、小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 milliseconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 milliseconds 为负数时抛出\r\n * @example\r\n * // 返回 { days: 486, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * millisecond2DurationMaxDay(42070000500);\r\n */\r\nexport function millisecond2DurationMaxDay(milliseconds) {\r\n if (typeof milliseconds !== \"number\" || isNaN(milliseconds)) {\r\n throw new TypeError(\"milliseconds must be a valid number\");\r\n }\r\n if (milliseconds < 0) {\r\n throw new RangeError(\"milliseconds must be a non-negative number\");\r\n }\r\n\r\n const totalMilliseconds = Math.floor(milliseconds);\r\n const ms = totalMilliseconds % 1000;\r\n const diffSeconds = Math.floor(totalMilliseconds / 1000);\r\n\r\n const seconds = diffSeconds % 60;\r\n const minutes = Math.floor(diffSeconds / 60) % 60;\r\n const hours = Math.floor(diffSeconds / 3600) % 24;\r\n const days = Math.floor(diffSeconds / 3600 / 24);\r\n\r\n return { days, hours, minutes, seconds, milliseconds: ms };\r\n}\r\n\r\n/**\r\n * 将毫秒转换为时间持续对象(最大单位为小时)。\r\n * @param {number} milliseconds - 毫秒数(非负整数)\r\n * @returns {DurationMaxHourObject} 包含小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 milliseconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 milliseconds 为负数时抛出\r\n * @example\r\n * // 返回 { hours: 11686, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * millisecond2DurationMaxHour(42070000500);\r\n */\r\nexport function millisecond2DurationMaxHour(milliseconds) {\r\n if (typeof milliseconds !== \"number\" || isNaN(milliseconds)) {\r\n throw new TypeError(\"milliseconds must be a valid number\");\r\n }\r\n if (milliseconds < 0) {\r\n throw new RangeError(\"milliseconds must be a non-negative number\");\r\n }\r\n\r\n const totalMilliseconds = Math.floor(milliseconds);\r\n const ms = totalMilliseconds % 1000;\r\n const diffSeconds = Math.floor(totalMilliseconds / 1000);\r\n\r\n const seconds = diffSeconds % 60;\r\n const minutes = Math.floor(diffSeconds / 60) % 60;\r\n const hours = Math.floor(diffSeconds / 3600);\r\n\r\n return { hours, minutes, seconds, milliseconds: ms };\r\n}\r\n\r\n/**\r\n * 将秒转换为时间持续对象。\r\n *\r\n * @param {number} seconds - 秒数(非负整数)\r\n * @param {Object} [options] - 选项对象。\r\n * @param {number} [options.yearDays=365] - 一年的天数。\r\n * @param {number} [options.monthDays=30] - 一月的天数。\r\n * @returns {DurationObject} 时间持续对象\r\n * @throws {TypeError} 当 seconds 不是有效数字\r\n * @throws {RangeError} 当 seconds 为负数\r\n * @throws {RangeError} 当 yearDays 或 monthDays 不是正整数\r\n *\r\n * @example\r\n * // 基本用法\r\n * second2Duration(42070000.5);\r\n * // 返回: { years: 1, months: 4, days: 1, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n */\r\nexport function second2Duration(seconds, options = { yearDays: 365, monthDays: 30 }) {\r\n if (typeof seconds !== \"number\" || isNaN(seconds)) {\r\n throw new TypeError(\"seconds must be a valid number\");\r\n }\r\n if (seconds < 0) {\r\n throw new RangeError(\"seconds must be a non-negative number\");\r\n }\r\n return millisecond2Duration(seconds * 1000, options);\r\n}\r\n\r\n/**\r\n * 将秒转换为时间持续对象(最大单位为天)。\r\n * @param {number} seconds - 秒数(非负整数)\r\n * @returns {DurationMaxDayObject} 包含天、小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 seconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 seconds 为负数时抛出\r\n * @example\r\n * // 返回 { days: 486, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * second2DurationMaxDay(42070000.5);\r\n */\r\nexport function second2DurationMaxDay(seconds) {\r\n if (typeof seconds !== \"number\" || isNaN(seconds)) {\r\n throw new TypeError(\"seconds must be a valid number\");\r\n }\r\n if (seconds < 0) {\r\n throw new RangeError(\"seconds must be a non-negative number\");\r\n }\r\n return millisecond2DurationMaxDay(seconds * 1000);\r\n}\r\n\r\n/**\r\n * 将秒转换为时间持续对象(最大单位为小时)。\r\n * @param {number} seconds - 秒数(非负整数)\r\n * @returns {DurationMaxHourObject} 包含小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 seconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 seconds 为负数时抛出\r\n * @example\r\n * // 返回 { hours: 11686, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * second2DurationMaxHour(42070000.5);\r\n */\r\nexport function second2DurationMaxHour(seconds) {\r\n if (typeof seconds !== \"number\" || isNaN(seconds)) {\r\n throw new TypeError(\"seconds must be a valid number\");\r\n }\r\n if (seconds < 0) {\r\n throw new RangeError(\"seconds must be a non-negative number\");\r\n }\r\n return millisecond2DurationMaxHour(seconds * 1000);\r\n}\r\n\r\n//#endregion\r\n\r\n/**\r\n * 根据小时数返回对应的时间段名称。\r\n *\r\n * @param {number} hour - 24 小时制的小时(0-23)\r\n * @param {object} [locales] - 自定义时段文案\r\n * @param {string} [locales.earlyMorning=\"凌晨\"] - 00-05\r\n * @param {string} [locales.morning=\"上午\"] - 06-11\r\n * @param {string} [locales.noon=\"中午\"] - 12-13\r\n * @param {string} [locales.afternoon=\"下午\"] - 14-17\r\n * @param {string} [locales.evening=\"晚上\"] - 18-23\r\n * @returns {string} 时段名称\r\n * @throws {RangeError} 当 hour 不在 0-23 范围时抛出\r\n */\r\nexport function getTimePeriodName(hour, locales = getLocales_TimePeriod()) {\r\n if (!Number.isInteger(hour) || hour < 0 || hour > 23) {\r\n throw new RangeError(\"hour 必须是 0-23 的整数\");\r\n }\r\n if (hour >= 0 && hour < 6) return locales.earlyMorning;\r\n if (hour < 12) return locales.morning;\r\n if (hour < 14) return locales.noon;\r\n if (hour < 18) return locales.afternoon;\r\n return locales.evening;\r\n}\r\n\r\n/**\r\n * 格式化时间戳为本地化的时间字符串。\r\n *\r\n * @param {number} timestamp - 要格式化的时间戳(毫秒)。\r\n * @param {Object} [locales] - 本地化配置对象,包含时间相关的本地化字符串。\r\n * @param {string} [locales.justNow='刚刚'] - 表示刚刚过去的时间。\r\n * @param {string} [locales.today='今天'] - 表示今天。\r\n * @param {string} [locales.yesterday='昨天'] - 表示昨天。\r\n * @param {string} [locales.beforeYesterday='前天'] - 表示前天。\r\n * @param {string} [locales.year='年'] - 年的单位。\r\n * @param {string} [locales.month='月'] - 月的单位。\r\n * @param {string} [locales.day='日'] - 日的单位。\r\n * @param {Object} [locales.timePeriod] - 一天中不同时间段的本地化字符串。\r\n * @param {string} [locales.timePeriod.earlyMorning='凌晨'] - 凌晨。\r\n * @param {string} [locales.timePeriod.morning='上午'] - 上午。\r\n * @param {string} [locales.timePeriod.noon='中午'] - 中午。\r\n * @param {string} [locales.timePeriod.afternoon='下午'] - 下午。\r\n * @param {string} [locales.timePeriod.evening='晚上'] - 晚上。\r\n * @param {Array<string>} [locales.weekDays=['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']] - 星期几的本地化字符串数组。\r\n *\r\n * @returns {string} - 格式化后的时间字符串。\r\n */\r\nexport function formatTimeForLocale(\r\n timestamp,\r\n locales = {\r\n justNow: \"刚刚\",\r\n today: \"今天\",\r\n yesterday: \"昨天\",\r\n beforeYesterday: \"前天\",\r\n year: \"年\",\r\n month: \"月\",\r\n day: \"日\",\r\n timePeriod: getLocales_TimePeriod(),\r\n weekDays: [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"]\r\n }\r\n) {\r\n const now = new Date();\r\n const messageDate = new Date(timestamp);\r\n\r\n const nowTime = now.getTime();\r\n const msgTime = messageDate.getTime();\r\n const diff = nowTime - msgTime;\r\n const diffMinutes = Math.floor(diff / (1000 * 60));\r\n\r\n const year = messageDate.getFullYear();\r\n const month = messageDate.getMonth() + 1;\r\n const day = messageDate.getDate();\r\n const hour = messageDate.getHours();\r\n const minute = messageDate.getMinutes().toString().padStart(2, \"0\");\r\n\r\n // 刚刚:1分钟内\r\n if (diffMinutes < 1) {\r\n return locales.justNow;\r\n }\r\n\r\n // 计算自然天数差(按日期而非时间差)\r\n const nowDate = new Date(now.getFullYear(), now.getMonth(), now.getDate());\r\n const msgDate = new Date(year, month - 1, day);\r\n const diffDays = Math.floor((nowDate.getTime() - msgDate.getTime()) / (1000 * 60 * 60 * 24));\r\n\r\n const period = getTimePeriodName(hour, locales.timePeriod);\r\n const timeStr = `${hour}:${minute}`;\r\n\r\n // 今天\r\n if (diffDays === 0) {\r\n return `${locales.today} ${period}${timeStr}`;\r\n }\r\n\r\n // 昨天\r\n if (diffDays === 1) {\r\n return `${locales.yesterday} ${period}${timeStr}`;\r\n }\r\n\r\n // 前天\r\n if (diffDays === 2) {\r\n return `${locales.beforeYesterday} ${period}${timeStr}`;\r\n }\r\n\r\n // 本周内(周一到周日,且不是今天/昨天/前天)\r\n // 获取本周一的日期\r\n const nowDay = now.getDay() || 7; // 周日转为7\r\n const msgDay = messageDate.getDay() || 7;\r\n const mondayOfThisWeek = new Date(nowDate.getTime() - (nowDay - 1) * 24 * 60 * 60 * 1000);\r\n const mondayOfThatWeek = new Date(msgDate.getTime() - (msgDay - 1) * 24 * 60 * 60 * 1000);\r\n\r\n if (mondayOfThisWeek.getTime() === mondayOfThatWeek.getTime() && diffDays < 7) {\r\n const weekDayName = locales.weekDays[messageDate.getDay()];\r\n return `${weekDayName}${period} ${timeStr}`;\r\n }\r\n\r\n // 本月内(非本周)\r\n const nowYear = now.getFullYear();\r\n const nowMonth = now.getMonth();\r\n if (year === nowYear && messageDate.getMonth() === nowMonth) {\r\n return `${month}${locales.month}${day}${locales.day} ${period}${timeStr}`;\r\n }\r\n\r\n // 本年内(非本月)\r\n if (year === nowYear) {\r\n return `${month}${locales.month}${day}${locales.day} ${period}${timeStr}`;\r\n }\r\n\r\n // 其他(非本年)\r\n return `${year}${locales.year}${month}${locales.month}${day}${locales.day} ${period}${timeStr}`;\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"date.js","sources":["../src/source/date.js"],"sourcesContent":["function getLocales_TimePeriod() {\r\n return {\r\n earlyMorning: \"凌晨\",\r\n morning: \"上午\",\r\n noon: \"中午\",\r\n afternoon: \"下午\",\r\n evening: \"晚上\"\r\n };\r\n}\r\n\r\n/**\r\n * 将任意值安全转换为 Date 对象。\r\n * - 数字/数字字符串:视为时间戳\r\n * - 字符串:尝试按 ISO/RFC 格式解析\r\n * - 对象:优先 valueOf(),再 toString()\r\n * - null / undefined / 无效值:返回 null\r\n *\r\n * @param {*} val - 待转换值\r\n * @returns {Date | null} 有效 Date 或 null\r\n */\r\nexport function toDate(val) {\r\n if (val == null) return null; // null / undefined\r\n if (val instanceof Date) return isNaN(val) ? null : val; // 已是 Date,但需排除 Invalid Date\r\n\r\n // 1. 数字或数字字符串 → 时间戳\r\n if (typeof val === \"number\" || (typeof val === \"string\" && /^-?\\d+(\\.\\d+)?$/.test(val.trim()))) {\r\n const d = new Date(+val);\r\n return isNaN(d) ? null : d;\r\n }\r\n\r\n // 2. 标准 ISO 8601 / RFC 2825 等合法字符串\r\n if (typeof val === \"string\") {\r\n const d = new Date(val);\r\n return isNaN(d) ? null : d; // 非法格式返回 null\r\n }\r\n\r\n // 3. 对象带 valueOf / toString\r\n if (typeof val === \"object\") {\r\n // 优先调用 valueOf(期望返回数字时间戳)\r\n const prim = val.valueOf ? val.valueOf() : Object.prototype.valueOf.call(val);\r\n if (typeof prim === \"number\" && !isNaN(prim)) {\r\n const d = new Date(prim);\r\n return isNaN(d) ? null : d;\r\n }\r\n // 兜底用字符串\r\n const str = val.toString ? val.toString() : String(val);\r\n const d = new Date(str);\r\n return isNaN(d) ? null : d;\r\n }\r\n\r\n // 4. 其余情况\r\n return null;\r\n}\r\n\r\n/**\r\n * 在闭区间 [date1, date2] 内随机生成一个日期(含首尾)。\r\n * 若顺序相反则自动交换。\r\n *\r\n * @param {Date} date1 - 起始日期\r\n * @param {Date} date2 - 结束日期\r\n * @returns {Date} 随机日期\r\n */\r\nexport function randomDateInRange(date1, date2) {\r\n let v1 = date1.getTime(),\r\n v2 = date2.getTime();\r\n if (v1 > v2) [v1, v2] = [v2, v1];\r\n return new Date(v1 + Math.floor(Math.random() * (v2 - v1 + 1)));\r\n}\r\n\r\n//#region 持续时间相关\r\n\r\n/**\r\n * 时间持续对象(完整版本,包含年月日时分秒毫秒)\r\n * @typedef {Object} DurationObject\r\n * @property {number} years - 年数\r\n * @property {number} months - 月数(0-11)\r\n * @property {number} days - 天数(0-29,取决于 monthDays)\r\n * @property {number} hours - 小时数(0-23)\r\n * @property {number} minutes - 分钟数(0-59)\r\n * @property {number} seconds - 秒数(0-59)\r\n * @property {number} milliseconds - 毫秒数(0-999)\r\n */\r\n\r\n/**\r\n * 时间持续对象(最大单位为天)\r\n * @typedef {Object} DurationMaxDayObject\r\n * @property {number} days - 天数\r\n * @property {number} hours - 小时数(0-23)\r\n * @property {number} minutes - 分钟数(0-59)\r\n * @property {number} seconds - 秒数(0-59)\r\n * @property {number} milliseconds - 毫秒数(0-999)\r\n */\r\n\r\n/**\r\n * 时间持续对象(最大单位为小时)\r\n * @typedef {Object} DurationMaxHourObject\r\n * @property {number} hours - 小时数\r\n * @property {number} minutes - 分钟数(0-59)\r\n * @property {number} seconds - 秒数(0-59)\r\n * @property {number} milliseconds - 毫秒数(0-999)\r\n */\r\n\r\n/**\r\n * 将毫秒转换为时间持续对象。\r\n *\r\n * @param {number} milliseconds - 毫秒数(非负整数)\r\n * @param {Object} [options] - 选项对象。\r\n * @param {number} [options.yearDays=365] - 一年的天数。\r\n * @param {number} [options.monthDays=30] - 一月的天数。\r\n * @returns {DurationObject} 时间持续对象\r\n * @throws {TypeError} 当 milliseconds 不是有效数字\r\n * @throws {RangeError} 当 milliseconds 为负数\r\n * @throws {RangeError} 当 yearDays 或 monthDays 不是正整数\r\n *\r\n * @example\r\n * // 基本用法\r\n * millisecond2Duration(42070000500);\r\n * // 返回: { years: 1, months: 4, days: 1, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n */\r\nexport function millisecond2Duration(milliseconds, options = { yearDays: 365, monthDays: 30 }) {\r\n // 参数验证\r\n if (typeof milliseconds !== \"number\" || isNaN(milliseconds)) {\r\n throw new TypeError(\"milliseconds must be a valid number\");\r\n }\r\n if (milliseconds < 0) {\r\n throw new RangeError(\"milliseconds must be a non-negative number\");\r\n }\r\n\r\n // 默认选项\r\n const { yearDays = 365, monthDays = 30 } = options;\r\n\r\n // 选项验证\r\n if (!Number.isInteger(yearDays) || yearDays <= 0) {\r\n throw new RangeError(\"yearDays must be a positive integer\");\r\n }\r\n if (!Number.isInteger(monthDays) || monthDays <= 0) {\r\n throw new RangeError(\"monthDays must be a positive integer\");\r\n }\r\n\r\n const totalMilliseconds = Math.floor(milliseconds);\r\n const ms = totalMilliseconds % 1000;\r\n const diffSeconds = Math.floor(totalMilliseconds / 1000);\r\n\r\n const seconds = diffSeconds % 60;\r\n const minutes = Math.floor(diffSeconds / 60) % 60;\r\n const hours = Math.floor(diffSeconds / 3600) % 24;\r\n\r\n // 计算年、月、日\r\n const totalDays = Math.floor(diffSeconds / 3600 / 24);\r\n const years = Math.floor(totalDays / yearDays);\r\n const remainingDays = totalDays % yearDays;\r\n const months = Math.floor(remainingDays / monthDays);\r\n const days = remainingDays % monthDays;\r\n\r\n return { years, months, days, hours, minutes, seconds, milliseconds: ms };\r\n}\r\n\r\n/**\r\n * 将毫秒转换为时间持续对象(最大单位为天)。\r\n * @param {number} milliseconds - 毫秒数(非负整数)\r\n * @returns {DurationMaxDayObject} 包含天、小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 milliseconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 milliseconds 为负数时抛出\r\n * @example\r\n * // 返回 { days: 486, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * millisecond2DurationMaxDay(42070000500);\r\n */\r\nexport function millisecond2DurationMaxDay(milliseconds) {\r\n if (typeof milliseconds !== \"number\" || isNaN(milliseconds)) {\r\n throw new TypeError(\"milliseconds must be a valid number\");\r\n }\r\n if (milliseconds < 0) {\r\n throw new RangeError(\"milliseconds must be a non-negative number\");\r\n }\r\n\r\n const totalMilliseconds = Math.floor(milliseconds);\r\n const ms = totalMilliseconds % 1000;\r\n const diffSeconds = Math.floor(totalMilliseconds / 1000);\r\n\r\n const seconds = diffSeconds % 60;\r\n const minutes = Math.floor(diffSeconds / 60) % 60;\r\n const hours = Math.floor(diffSeconds / 3600) % 24;\r\n const days = Math.floor(diffSeconds / 3600 / 24);\r\n\r\n return { days, hours, minutes, seconds, milliseconds: ms };\r\n}\r\n\r\n/**\r\n * 将毫秒转换为时间持续对象(最大单位为小时)。\r\n * @param {number} milliseconds - 毫秒数(非负整数)\r\n * @returns {DurationMaxHourObject} 包含小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 milliseconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 milliseconds 为负数时抛出\r\n * @example\r\n * // 返回 { hours: 11686, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * millisecond2DurationMaxHour(42070000500);\r\n */\r\nexport function millisecond2DurationMaxHour(milliseconds) {\r\n if (typeof milliseconds !== \"number\" || isNaN(milliseconds)) {\r\n throw new TypeError(\"milliseconds must be a valid number\");\r\n }\r\n if (milliseconds < 0) {\r\n throw new RangeError(\"milliseconds must be a non-negative number\");\r\n }\r\n\r\n const totalMilliseconds = Math.floor(milliseconds);\r\n const ms = totalMilliseconds % 1000;\r\n const diffSeconds = Math.floor(totalMilliseconds / 1000);\r\n\r\n const seconds = diffSeconds % 60;\r\n const minutes = Math.floor(diffSeconds / 60) % 60;\r\n const hours = Math.floor(diffSeconds / 3600);\r\n\r\n return { hours, minutes, seconds, milliseconds: ms };\r\n}\r\n\r\n/**\r\n * 将秒转换为时间持续对象。\r\n *\r\n * @param {number} seconds - 秒数(非负整数)\r\n * @param {Object} [options] - 选项对象。\r\n * @param {number} [options.yearDays=365] - 一年的天数。\r\n * @param {number} [options.monthDays=30] - 一月的天数。\r\n * @returns {DurationObject} 时间持续对象\r\n * @throws {TypeError} 当 seconds 不是有效数字\r\n * @throws {RangeError} 当 seconds 为负数\r\n * @throws {RangeError} 当 yearDays 或 monthDays 不是正整数\r\n *\r\n * @example\r\n * // 基本用法\r\n * second2Duration(42070000.5);\r\n * // 返回: { years: 1, months: 4, days: 1, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n */\r\nexport function second2Duration(seconds, options = { yearDays: 365, monthDays: 30 }) {\r\n if (typeof seconds !== \"number\" || isNaN(seconds)) {\r\n throw new TypeError(\"seconds must be a valid number\");\r\n }\r\n if (seconds < 0) {\r\n throw new RangeError(\"seconds must be a non-negative number\");\r\n }\r\n return millisecond2Duration(seconds * 1000, options);\r\n}\r\n\r\n/**\r\n * 将秒转换为时间持续对象(最大单位为天)。\r\n * @param {number} seconds - 秒数(非负整数)\r\n * @returns {DurationMaxDayObject} 包含天、小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 seconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 seconds 为负数时抛出\r\n * @example\r\n * // 返回 { days: 486, hours: 22, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * second2DurationMaxDay(42070000.5);\r\n */\r\nexport function second2DurationMaxDay(seconds) {\r\n if (typeof seconds !== \"number\" || isNaN(seconds)) {\r\n throw new TypeError(\"seconds must be a valid number\");\r\n }\r\n if (seconds < 0) {\r\n throw new RangeError(\"seconds must be a non-negative number\");\r\n }\r\n return millisecond2DurationMaxDay(seconds * 1000);\r\n}\r\n\r\n/**\r\n * 将秒转换为时间持续对象(最大单位为小时)。\r\n * @param {number} seconds - 秒数(非负整数)\r\n * @returns {DurationMaxHourObject} 包含小时、分钟、秒、毫秒的时间持续对象\r\n * @throws {TypeError} 当 seconds 不是有效数字时抛出\r\n * @throws {RangeError} 当 seconds 为负数时抛出\r\n * @example\r\n * // 返回 { hours: 11686, minutes: 6, seconds: 40, milliseconds: 500 }\r\n * second2DurationMaxHour(42070000.5);\r\n */\r\nexport function second2DurationMaxHour(seconds) {\r\n if (typeof seconds !== \"number\" || isNaN(seconds)) {\r\n throw new TypeError(\"seconds must be a valid number\");\r\n }\r\n if (seconds < 0) {\r\n throw new RangeError(\"seconds must be a non-negative number\");\r\n }\r\n return millisecond2DurationMaxHour(seconds * 1000);\r\n}\r\n\r\n//#endregion\r\n\r\n/**\r\n * 根据小时数返回对应的时间段名称。\r\n *\r\n * @param {number} hour - 24 小时制的小时(0-23)\r\n * @param {object} [locales] - 自定义时段文案\r\n * @param {string} [locales.earlyMorning=\"凌晨\"] - 00-05\r\n * @param {string} [locales.morning=\"上午\"] - 06-11\r\n * @param {string} [locales.noon=\"中午\"] - 12-13\r\n * @param {string} [locales.afternoon=\"下午\"] - 14-17\r\n * @param {string} [locales.evening=\"晚上\"] - 18-23\r\n * @returns {string} 时段名称\r\n * @throws {RangeError} 当 hour 不在 0-23 范围时抛出\r\n */\r\nexport function getTimePeriodName(hour, locales = getLocales_TimePeriod()) {\r\n if (!Number.isInteger(hour) || hour < 0 || hour > 23) {\r\n throw new RangeError(\"hour 必须是 0-23 的整数\");\r\n }\r\n if (hour >= 0 && hour < 6) return locales.earlyMorning;\r\n if (hour < 12) return locales.morning;\r\n if (hour < 14) return locales.noon;\r\n if (hour < 18) return locales.afternoon;\r\n return locales.evening;\r\n}\r\n\r\n/**\r\n * 格式化时间戳为本地化的时间字符串。\r\n *\r\n * @param {number} timestamp - 要格式化的时间戳(毫秒)。\r\n * @param {Object} [locales] - 本地化配置对象,包含时间相关的本地化字符串。\r\n * @param {string} [locales.justNow='刚刚'] - 表示刚刚过去的时间。\r\n * @param {string} [locales.today='今天'] - 表示今天。\r\n * @param {string} [locales.yesterday='昨天'] - 表示昨天。\r\n * @param {string} [locales.beforeYesterday='前天'] - 表示前天。\r\n * @param {string} [locales.year='年'] - 年的单位。\r\n * @param {string} [locales.month='月'] - 月的单位。\r\n * @param {string} [locales.day='日'] - 日的单位。\r\n * @param {Object} [locales.timePeriod] - 一天中不同时间段的本地化字符串。\r\n * @param {string} [locales.timePeriod.earlyMorning='凌晨'] - 凌晨。\r\n * @param {string} [locales.timePeriod.morning='上午'] - 上午。\r\n * @param {string} [locales.timePeriod.noon='中午'] - 中午。\r\n * @param {string} [locales.timePeriod.afternoon='下午'] - 下午。\r\n * @param {string} [locales.timePeriod.evening='晚上'] - 晚上。\r\n * @param {Array<string>} [locales.weekDays=['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']] - 星期几的本地化字符串数组。\r\n *\r\n * @returns {string} - 格式化后的时间字符串。\r\n */\r\nexport function formatTimeForLocale(\r\n timestamp,\r\n locales = {\r\n justNow: \"刚刚\",\r\n today: \"今天\",\r\n yesterday: \"昨天\",\r\n beforeYesterday: \"前天\",\r\n year: \"年\",\r\n month: \"月\",\r\n day: \"日\",\r\n timePeriod: getLocales_TimePeriod(),\r\n weekDays: [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"]\r\n }\r\n) {\r\n const now = new Date();\r\n const messageDate = new Date(timestamp);\r\n\r\n const nowTime = now.getTime();\r\n const msgTime = messageDate.getTime();\r\n const diff = nowTime - msgTime;\r\n const diffMinutes = Math.floor(diff / (1000 * 60));\r\n\r\n const year = messageDate.getFullYear();\r\n const month = messageDate.getMonth() + 1;\r\n const day = messageDate.getDate();\r\n const hour = messageDate.getHours();\r\n const minute = messageDate.getMinutes().toString().padStart(2, \"0\");\r\n\r\n // 刚刚:1分钟内\r\n if (diffMinutes < 1) {\r\n return locales.justNow;\r\n }\r\n\r\n // 计算自然天数差(按日期而非时间差)\r\n const nowDate = new Date(now.getFullYear(), now.getMonth(), now.getDate());\r\n const msgDate = new Date(year, month - 1, day);\r\n const diffDays = Math.floor((nowDate.getTime() - msgDate.getTime()) / (1000 * 60 * 60 * 24));\r\n\r\n const period = getTimePeriodName(hour, locales.timePeriod);\r\n const timeStr = `${hour}:${minute}`;\r\n\r\n // 今天\r\n if (diffDays === 0) {\r\n return `${locales.today} ${period}${timeStr}`;\r\n }\r\n\r\n // 昨天\r\n if (diffDays === 1) {\r\n return `${locales.yesterday} ${period}${timeStr}`;\r\n }\r\n\r\n // 前天\r\n if (diffDays === 2) {\r\n return `${locales.beforeYesterday} ${period}${timeStr}`;\r\n }\r\n\r\n // 本周内(周一到周日,且不是今天/昨天/前天)\r\n // 获取本周一的日期\r\n const nowDay = now.getDay() || 7; // 周日转为7\r\n const msgDay = messageDate.getDay() || 7;\r\n const mondayOfThisWeek = new Date(nowDate.getTime() - (nowDay - 1) * 24 * 60 * 60 * 1000);\r\n const mondayOfThatWeek = new Date(msgDate.getTime() - (msgDay - 1) * 24 * 60 * 60 * 1000);\r\n\r\n if (mondayOfThisWeek.getTime() === mondayOfThatWeek.getTime() && diffDays < 7) {\r\n const weekDayName = locales.weekDays[messageDate.getDay()];\r\n return `${weekDayName}${period} ${timeStr}`;\r\n }\r\n\r\n // 本月内(非本周)\r\n const nowYear = now.getFullYear();\r\n const nowMonth = now.getMonth();\r\n if (year === nowYear && messageDate.getMonth() === nowMonth) {\r\n return `${month}${locales.month}${day}${locales.day} ${period}${timeStr}`;\r\n }\r\n\r\n // 本年内(非本月)\r\n if (year === nowYear) {\r\n return `${month}${locales.month}${day}${locales.day} ${period}${timeStr}`;\r\n }\r\n\r\n // 其他(非本年)\r\n return `${year}${locales.year}${month}${locales.month}${day}${locales.day} ${period}${timeStr}`;\r\n}\r\n"],"names":[],"mappings":"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"}
|
package/dist/download.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.cjs","sources":["../src/source/download.js"],"sourcesContent":["/**\r\n * 通过动态创建 `<a>` 标签触发浏览器下载。\r\n * 注意:此方法可能无法强制下载浏览器原生支持的文件(如图片、PDF),浏览器可能会选择直接打开。\r\n *\r\n * @param {string} url - 任意可下载地址(同源或允许跨域)\r\n * @param {string} [fileName] - 保存到本地的文件名;不传时使用时间戳\r\n */\r\nexport function downloadByUrl(url, fileName) {\r\n const a = document.createElement(\"a\");\r\n a.style.display = \"none\";\r\n a.rel = \"noopener\";\r\n a.href = url;\r\n a.download = fileName || Date.now();\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n}\r\n\r\n/**\r\n * 把 Blob 转成临时 URL 并触发下载,下载完成后立即释放内存。\r\n *\r\n * @param {Blob} blob - 待下载的 Blob(含 File)\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadByBlob(blob, fileName) {\r\n const url = URL.createObjectURL(blob);\r\n downloadByUrl(url, fileName);\r\n setTimeout(() => URL.revokeObjectURL(url), 0);\r\n}\r\n\r\n/**\r\n * 将任意数据包装成 Blob 并下载。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - 要写入文件的数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n * @param {string} [mimeType] - MIME 类型;默认 `application/octet-stream`\r\n */\r\nexport function downloadByData(data, fileName, mimeType = \"application/octet-stream\") {\r\n downloadByBlob(new Blob([data], { type: mimeType }), fileName);\r\n}\r\n\r\n/**\r\n * 快捷下载 Excel 文件(MIME 已固定)。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - Excel 二进制或字符串内容\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadExcel(data, fileName) {\r\n downloadByData(data, fileName, \"application/vnd.ms-excel\");\r\n}\r\n\r\n/**\r\n * 快捷下载 JSON 文件(MIME 已固定)。\r\n * 若传入非字符串数据,会自行 `JSON.stringify`。\r\n *\r\n * @param {any} data - 要序列化的 JSON 数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadJSON(data, fileName) {\r\n // downloadByData(typeof data === \"string\" ? data : JSON.stringify(data, null, 4), fileName, \"application/json\");\r\n downloadByData(data, fileName, \"application/json\");\r\n}\r\n\r\n/**\r\n * 通过 `fetch` 获取资源并强制下载,避免浏览器直接打开文件。\r\n * 此方法适用于下载图片、PDF 等浏览器默认会打开的文件类型。\r\n * 如果 `fetch` 失败(如 CORS 策略阻止),会回退到 `downloadByUrl` 方法作为备选方案。\r\n *\r\n * @param {string} url - 文件的 URL 地址\r\n * @param {string} [fileName] - 保存到本地的文件名。如果不提供,会尝试从 URL 中自动提取\r\n * @returns {Promise<void>} 返回一个 Promise,在下载开始或失败后 resolve\r\n */\r\nexport async function fetchOrDownloadByUrl(url, fileName) {\r\n // 如果未提供文件名,尝试从 URL 路径中提取\r\n if (!fileName) {\r\n try {\r\n const urlPathname = new URL(url).pathname;\r\n // 获取路径的最后一部分作为文件名,并移除可能的查询参数\r\n fileName = urlPathname.substring(urlPathname.lastIndexOf(\"/\") + 1).split(\"?\")[0];\r\n if (fileName) {\r\n fileName = decodeURIComponent(fileName);\r\n }\r\n } catch (e) {}\r\n // 如果提取后文件名为空(例如 URL 以 '/' 结尾),也使用时间戳\r\n if (!fileName) {\r\n fileName = Date.now().toString();\r\n }\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n mode: \"cors\",\r\n cache: \"no-cache\"\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const blob = await response.blob();\r\n downloadByBlob(blob, fileName);\r\n } catch (error) {\r\n downloadByUrl(url, fileName);\r\n }\r\n}\r\n"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"download.cjs","sources":["../src/source/download.js"],"sourcesContent":["/**\r\n * 通过动态创建 `<a>` 标签触发浏览器下载。\r\n * 注意:此方法可能无法强制下载浏览器原生支持的文件(如图片、PDF),浏览器可能会选择直接打开。\r\n *\r\n * @param {string} url - 任意可下载地址(同源或允许跨域)\r\n * @param {string} [fileName] - 保存到本地的文件名;不传时使用时间戳\r\n */\r\nexport function downloadByUrl(url, fileName) {\r\n const a = document.createElement(\"a\");\r\n a.style.display = \"none\";\r\n a.rel = \"noopener\";\r\n a.href = url;\r\n a.download = fileName || Date.now();\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n}\r\n\r\n/**\r\n * 把 Blob 转成临时 URL 并触发下载,下载完成后立即释放内存。\r\n *\r\n * @param {Blob} blob - 待下载的 Blob(含 File)\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadByBlob(blob, fileName) {\r\n const url = URL.createObjectURL(blob);\r\n downloadByUrl(url, fileName);\r\n setTimeout(() => URL.revokeObjectURL(url), 0);\r\n}\r\n\r\n/**\r\n * 将任意数据包装成 Blob 并下载。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - 要写入文件的数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n * @param {string} [mimeType] - MIME 类型;默认 `application/octet-stream`\r\n */\r\nexport function downloadByData(data, fileName, mimeType = \"application/octet-stream\") {\r\n downloadByBlob(new Blob([data], { type: mimeType }), fileName);\r\n}\r\n\r\n/**\r\n * 快捷下载 Excel 文件(MIME 已固定)。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - Excel 二进制或字符串内容\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadExcel(data, fileName) {\r\n downloadByData(data, fileName, \"application/vnd.ms-excel\");\r\n}\r\n\r\n/**\r\n * 快捷下载 JSON 文件(MIME 已固定)。\r\n * 若传入非字符串数据,会自行 `JSON.stringify`。\r\n *\r\n * @param {any} data - 要序列化的 JSON 数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadJSON(data, fileName) {\r\n // downloadByData(typeof data === \"string\" ? data : JSON.stringify(data, null, 4), fileName, \"application/json\");\r\n downloadByData(data, fileName, \"application/json\");\r\n}\r\n\r\n/**\r\n * 通过 `fetch` 获取资源并强制下载,避免浏览器直接打开文件。\r\n * 此方法适用于下载图片、PDF 等浏览器默认会打开的文件类型。\r\n * 如果 `fetch` 失败(如 CORS 策略阻止),会回退到 `downloadByUrl` 方法作为备选方案。\r\n *\r\n * @param {string} url - 文件的 URL 地址\r\n * @param {string} [fileName] - 保存到本地的文件名。如果不提供,会尝试从 URL 中自动提取\r\n * @returns {Promise<void>} 返回一个 Promise,在下载开始或失败后 resolve\r\n */\r\nexport async function fetchOrDownloadByUrl(url, fileName) {\r\n // 如果未提供文件名,尝试从 URL 路径中提取\r\n if (!fileName) {\r\n try {\r\n const urlPathname = new URL(url).pathname;\r\n // 获取路径的最后一部分作为文件名,并移除可能的查询参数\r\n fileName = urlPathname.substring(urlPathname.lastIndexOf(\"/\") + 1).split(\"?\")[0];\r\n if (fileName) {\r\n fileName = decodeURIComponent(fileName);\r\n }\r\n } catch (e) {}\r\n // 如果提取后文件名为空(例如 URL 以 '/' 结尾),也使用时间戳\r\n if (!fileName) {\r\n fileName = Date.now().toString();\r\n }\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n mode: \"cors\",\r\n cache: \"no-cache\"\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const blob = await response.blob();\r\n downloadByBlob(blob, fileName);\r\n } catch (error) {\r\n downloadByUrl(url, fileName);\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|
package/dist/download.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.js","sources":["../src/source/download.js"],"sourcesContent":["/**\r\n * 通过动态创建 `<a>` 标签触发浏览器下载。\r\n * 注意:此方法可能无法强制下载浏览器原生支持的文件(如图片、PDF),浏览器可能会选择直接打开。\r\n *\r\n * @param {string} url - 任意可下载地址(同源或允许跨域)\r\n * @param {string} [fileName] - 保存到本地的文件名;不传时使用时间戳\r\n */\r\nexport function downloadByUrl(url, fileName) {\r\n const a = document.createElement(\"a\");\r\n a.style.display = \"none\";\r\n a.rel = \"noopener\";\r\n a.href = url;\r\n a.download = fileName || Date.now();\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n}\r\n\r\n/**\r\n * 把 Blob 转成临时 URL 并触发下载,下载完成后立即释放内存。\r\n *\r\n * @param {Blob} blob - 待下载的 Blob(含 File)\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadByBlob(blob, fileName) {\r\n const url = URL.createObjectURL(blob);\r\n downloadByUrl(url, fileName);\r\n setTimeout(() => URL.revokeObjectURL(url), 0);\r\n}\r\n\r\n/**\r\n * 将任意数据包装成 Blob 并下载。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - 要写入文件的数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n * @param {string} [mimeType] - MIME 类型;默认 `application/octet-stream`\r\n */\r\nexport function downloadByData(data, fileName, mimeType = \"application/octet-stream\") {\r\n downloadByBlob(new Blob([data], { type: mimeType }), fileName);\r\n}\r\n\r\n/**\r\n * 快捷下载 Excel 文件(MIME 已固定)。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - Excel 二进制或字符串内容\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadExcel(data, fileName) {\r\n downloadByData(data, fileName, \"application/vnd.ms-excel\");\r\n}\r\n\r\n/**\r\n * 快捷下载 JSON 文件(MIME 已固定)。\r\n * 若传入非字符串数据,会自行 `JSON.stringify`。\r\n *\r\n * @param {any} data - 要序列化的 JSON 数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadJSON(data, fileName) {\r\n // downloadByData(typeof data === \"string\" ? data : JSON.stringify(data, null, 4), fileName, \"application/json\");\r\n downloadByData(data, fileName, \"application/json\");\r\n}\r\n\r\n/**\r\n * 通过 `fetch` 获取资源并强制下载,避免浏览器直接打开文件。\r\n * 此方法适用于下载图片、PDF 等浏览器默认会打开的文件类型。\r\n * 如果 `fetch` 失败(如 CORS 策略阻止),会回退到 `downloadByUrl` 方法作为备选方案。\r\n *\r\n * @param {string} url - 文件的 URL 地址\r\n * @param {string} [fileName] - 保存到本地的文件名。如果不提供,会尝试从 URL 中自动提取\r\n * @returns {Promise<void>} 返回一个 Promise,在下载开始或失败后 resolve\r\n */\r\nexport async function fetchOrDownloadByUrl(url, fileName) {\r\n // 如果未提供文件名,尝试从 URL 路径中提取\r\n if (!fileName) {\r\n try {\r\n const urlPathname = new URL(url).pathname;\r\n // 获取路径的最后一部分作为文件名,并移除可能的查询参数\r\n fileName = urlPathname.substring(urlPathname.lastIndexOf(\"/\") + 1).split(\"?\")[0];\r\n if (fileName) {\r\n fileName = decodeURIComponent(fileName);\r\n }\r\n } catch (e) {}\r\n // 如果提取后文件名为空(例如 URL 以 '/' 结尾),也使用时间戳\r\n if (!fileName) {\r\n fileName = Date.now().toString();\r\n }\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n mode: \"cors\",\r\n cache: \"no-cache\"\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const blob = await response.blob();\r\n downloadByBlob(blob, fileName);\r\n } catch (error) {\r\n downloadByUrl(url, fileName);\r\n }\r\n}\r\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE;AAC7C,IAAI,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAC1C,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC7B,IAAI,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC;AACvB,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;AACjB,IAAI,CAAC,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;AACxC,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACjC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;AACd,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE;AAC/C,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AAC1C,IAAI,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACjC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,0BAA0B,EAAE;AACtF,IAAI,cAAc,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AACnE,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE;AAC9C,IAAI,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,0BAA0B,CAAC,CAAC;AAC/D,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE;AAC7C;AACA,IAAI,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AACvD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAe,oBAAoB,CAAC,GAAG,EAAE,QAAQ,EAAE;AAC1D;AACA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACnB,QAAQ,IAAI;AACZ,YAAY,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;AACtD;AACA,YAAY,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7F,YAAY,IAAI,QAAQ,EAAE;AAC1B,gBAAgB,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AACxD,YAAY,CAAC;AACb,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACtB;AACA,QAAQ,IAAI,CAAC,QAAQ,EAAE;AACvB,YAAY,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;AAC7C,QAAQ,CAAC;AACT,IAAI,CAAC;AACL;AACA,IAAI,IAAI;AACR,QAAQ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;AAC1C,YAAY,MAAM,EAAE,KAAK;AACzB,YAAY,IAAI,EAAE,MAAM;AACxB,YAAY,KAAK,EAAE,UAAU;AAC7B,SAAS,CAAC,CAAC;AACX;AACA,QAAQ,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAC1B,YAAY,MAAM,IAAI,KAAK,CAAC,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACtF,QAAQ,CAAC;AACT;AACA,QAAQ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC3C,QAAQ,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACvC,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE;AACpB,QAAQ,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACrC,IAAI,CAAC;AACL
|
|
1
|
+
{"version":3,"file":"download.js","sources":["../src/source/download.js"],"sourcesContent":["/**\r\n * 通过动态创建 `<a>` 标签触发浏览器下载。\r\n * 注意:此方法可能无法强制下载浏览器原生支持的文件(如图片、PDF),浏览器可能会选择直接打开。\r\n *\r\n * @param {string} url - 任意可下载地址(同源或允许跨域)\r\n * @param {string} [fileName] - 保存到本地的文件名;不传时使用时间戳\r\n */\r\nexport function downloadByUrl(url, fileName) {\r\n const a = document.createElement(\"a\");\r\n a.style.display = \"none\";\r\n a.rel = \"noopener\";\r\n a.href = url;\r\n a.download = fileName || Date.now();\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n}\r\n\r\n/**\r\n * 把 Blob 转成临时 URL 并触发下载,下载完成后立即释放内存。\r\n *\r\n * @param {Blob} blob - 待下载的 Blob(含 File)\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadByBlob(blob, fileName) {\r\n const url = URL.createObjectURL(blob);\r\n downloadByUrl(url, fileName);\r\n setTimeout(() => URL.revokeObjectURL(url), 0);\r\n}\r\n\r\n/**\r\n * 将任意数据包装成 Blob 并下载。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - 要写入文件的数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n * @param {string} [mimeType] - MIME 类型;默认 `application/octet-stream`\r\n */\r\nexport function downloadByData(data, fileName, mimeType = \"application/octet-stream\") {\r\n downloadByBlob(new Blob([data], { type: mimeType }), fileName);\r\n}\r\n\r\n/**\r\n * 快捷下载 Excel 文件(MIME 已固定)。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - Excel 二进制或字符串内容\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadExcel(data, fileName) {\r\n downloadByData(data, fileName, \"application/vnd.ms-excel\");\r\n}\r\n\r\n/**\r\n * 快捷下载 JSON 文件(MIME 已固定)。\r\n * 若传入非字符串数据,会自行 `JSON.stringify`。\r\n *\r\n * @param {any} data - 要序列化的 JSON 数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadJSON(data, fileName) {\r\n // downloadByData(typeof data === \"string\" ? data : JSON.stringify(data, null, 4), fileName, \"application/json\");\r\n downloadByData(data, fileName, \"application/json\");\r\n}\r\n\r\n/**\r\n * 通过 `fetch` 获取资源并强制下载,避免浏览器直接打开文件。\r\n * 此方法适用于下载图片、PDF 等浏览器默认会打开的文件类型。\r\n * 如果 `fetch` 失败(如 CORS 策略阻止),会回退到 `downloadByUrl` 方法作为备选方案。\r\n *\r\n * @param {string} url - 文件的 URL 地址\r\n * @param {string} [fileName] - 保存到本地的文件名。如果不提供,会尝试从 URL 中自动提取\r\n * @returns {Promise<void>} 返回一个 Promise,在下载开始或失败后 resolve\r\n */\r\nexport async function fetchOrDownloadByUrl(url, fileName) {\r\n // 如果未提供文件名,尝试从 URL 路径中提取\r\n if (!fileName) {\r\n try {\r\n const urlPathname = new URL(url).pathname;\r\n // 获取路径的最后一部分作为文件名,并移除可能的查询参数\r\n fileName = urlPathname.substring(urlPathname.lastIndexOf(\"/\") + 1).split(\"?\")[0];\r\n if (fileName) {\r\n fileName = decodeURIComponent(fileName);\r\n }\r\n } catch (e) {}\r\n // 如果提取后文件名为空(例如 URL 以 '/' 结尾),也使用时间戳\r\n if (!fileName) {\r\n fileName = Date.now().toString();\r\n }\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n mode: \"cors\",\r\n cache: \"no-cache\"\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const blob = await response.blob();\r\n downloadByBlob(blob, fileName);\r\n } catch (error) {\r\n downloadByUrl(url, fileName);\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|
package/dist/evt.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evt.cjs","sources":["../src/source/evt.js"],"sourcesContent":["/**\r\n * 简单、高性能的通用事件总线。\r\n * - 支持命名空间事件\r\n * - 支持一次性监听器\r\n * - 返回唯一 flag,用于精确卸载\r\n * - emit 时可选自定义 this 指向\r\n */\r\nexport class MyEvent {\r\n constructor() {\r\n this.evtPool = new Map();\r\n }\r\n\r\n /**\r\n * 注册事件监听器。\r\n * @param {string} name - 事件名\r\n * @param {Function} fn - 回调函数\r\n * @returns {string} flag - 唯一标识,用于 off\r\n */\r\n on(name, fn) {\r\n let flag = Date.now() + \"_\" + parseInt(Math.random() * 1e8);\r\n const evtItem = {\r\n flag,\r\n fn\r\n };\r\n if (this.evtPool.has(name)) {\r\n this.evtPool.get(name).push(evtItem);\r\n } else {\r\n this.evtPool.set(name, [evtItem]);\r\n }\r\n return flag;\r\n }\r\n\r\n /**\r\n * 注册一次性监听器,触发后自动移除。\r\n * @param {string} name - 事件名\r\n * @param {Function} fn - 回调函数\r\n * @returns {string} flag - 唯一标识\r\n */\r\n once(name, fn) {\r\n const _this = this;\r\n let wrapper;\r\n wrapper = function (data) {\r\n _this.off(name, wrapper);\r\n fn.call(this, data);\r\n };\r\n return this.on(name, wrapper);\r\n }\r\n\r\n /**\r\n * 移除指定事件监听器。\r\n * @param {string} name - 事件名\r\n * @param {Function|string} fnOrFlag - 回调函数或 flag\r\n */\r\n off(name, fnOrFlag) {\r\n if (!this.evtPool.has(name)) return;\r\n const evtItems = this.evtPool.get(name);\r\n const filtered = evtItems.filter((item) => item.fn !== fnOrFlag && item.flag !== fnOrFlag);\r\n if (filtered.length === 0) {\r\n this.evtPool.delete(name);\r\n } else {\r\n this.evtPool.set(name, filtered);\r\n }\r\n }\r\n\r\n /**\r\n * 触发事件(同步执行)。\r\n * @param {string} name - 事件名\r\n * @param {*} [data] - 任意载荷\r\n * @param {*} [fnThis] - 回调内部 this 指向,默认 undefined\r\n */\r\n emit(name, data, fnThis) {\r\n if (!this.evtPool.has(name)) return;\r\n const evtItems = this.evtPool.get(name);\r\n evtItems.forEach((item) => {\r\n try {\r\n item.fn.call(fnThis, data);\r\n } catch (err) {\r\n console.error(`Error in event listener for \"${name}\":`, err);\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * 跨页通信插件:通过 localStorage + storage 事件将当前实例的 emit 广播到其他同源页面。\r\n * 支持节流、命名空间隔离。\r\n */\r\nexport const MyEvent_CrossPagePlugin = (() => {\r\n const INSTALLED = new WeakSet(); // 防止重复安装\r\n\r\n return {\r\n /**\r\n * 为指定 MyEvent 实例安装跨页插件。\r\n * @param {MyEvent} bus - 事件总线实例\r\n * @param {Options} [opts] - 配置项\r\n */\r\n install(bus, opts = {}) {\r\n if (INSTALLED.has(bus)) return;\r\n INSTALLED.add(bus);\r\n\r\n const ns = `___my-event-cross-page-${opts.namespace || \"default\"}___`;\r\n const delay = opts.throttle || 16;\r\n let last = 0;\r\n\r\n // 1、重写 emit\r\n const rawEmit = bus.emit;\r\n bus.emit = function (name, data, fnThis) {\r\n rawEmit.call(bus, name, data, fnThis); // 本地先执行\r\n const now = Date.now();\r\n if (now - last < delay) return;\r\n last = now;\r\n const key = ns + name;\r\n try {\r\n localStorage.setItem(key, JSON.stringify({ name, data, ts: now }));\r\n localStorage.removeItem(key); // 触发 storage 事件\r\n } catch (e) {}\r\n };\r\n\r\n // 2、监听其他页广播\r\n function onStorageHandler(e) {\r\n if (!e.key || !e.key.startsWith(ns)) return;\r\n let payload;\r\n try {\r\n payload = JSON.parse(e.newValue || \"{}\");\r\n } catch {\r\n return;\r\n }\r\n if (!payload.ts || payload.ts <= last) return;\r\n rawEmit.call(bus, e.key.slice(ns.length), payload.data); // 仅本地\r\n }\r\n addEventListener(\"storage\", onStorageHandler);\r\n\r\n // 3、保存卸载器\r\n bus._uninstallCrossPage = () => {\r\n removeEventListener(\"storage\", onStorageHandler);\r\n bus.emit = rawEmit;\r\n INSTALLED.delete(bus);\r\n };\r\n },\r\n\r\n /**\r\n * 卸载插件,恢复原始 emit 并停止监听。\r\n * @param {MyEvent} bus - 事件总线实例\r\n */\r\n uninstall(bus) {\r\n if (typeof bus._uninstallCrossPage === \"function\") bus._uninstallCrossPage();\r\n }\r\n };\r\n})();\r\n"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"evt.cjs","sources":["../src/source/evt.js"],"sourcesContent":["/**\r\n * 简单、高性能的通用事件总线。\r\n * - 支持命名空间事件\r\n * - 支持一次性监听器\r\n * - 返回唯一 flag,用于精确卸载\r\n * - emit 时可选自定义 this 指向\r\n */\r\nexport class MyEvent {\r\n constructor() {\r\n this.evtPool = new Map();\r\n }\r\n\r\n /**\r\n * 注册事件监听器。\r\n * @param {string} name - 事件名\r\n * @param {Function} fn - 回调函数\r\n * @returns {string} flag - 唯一标识,用于 off\r\n */\r\n on(name, fn) {\r\n let flag = Date.now() + \"_\" + parseInt(Math.random() * 1e8);\r\n const evtItem = {\r\n flag,\r\n fn\r\n };\r\n if (this.evtPool.has(name)) {\r\n this.evtPool.get(name).push(evtItem);\r\n } else {\r\n this.evtPool.set(name, [evtItem]);\r\n }\r\n return flag;\r\n }\r\n\r\n /**\r\n * 注册一次性监听器,触发后自动移除。\r\n * @param {string} name - 事件名\r\n * @param {Function} fn - 回调函数\r\n * @returns {string} flag - 唯一标识\r\n */\r\n once(name, fn) {\r\n const _this = this;\r\n let wrapper;\r\n wrapper = function (data) {\r\n _this.off(name, wrapper);\r\n fn.call(this, data);\r\n };\r\n return this.on(name, wrapper);\r\n }\r\n\r\n /**\r\n * 移除指定事件监听器。\r\n * @param {string} name - 事件名\r\n * @param {Function|string} fnOrFlag - 回调函数或 flag\r\n */\r\n off(name, fnOrFlag) {\r\n if (!this.evtPool.has(name)) return;\r\n const evtItems = this.evtPool.get(name);\r\n const filtered = evtItems.filter((item) => item.fn !== fnOrFlag && item.flag !== fnOrFlag);\r\n if (filtered.length === 0) {\r\n this.evtPool.delete(name);\r\n } else {\r\n this.evtPool.set(name, filtered);\r\n }\r\n }\r\n\r\n /**\r\n * 触发事件(同步执行)。\r\n * @param {string} name - 事件名\r\n * @param {*} [data] - 任意载荷\r\n * @param {*} [fnThis] - 回调内部 this 指向,默认 undefined\r\n */\r\n emit(name, data, fnThis) {\r\n if (!this.evtPool.has(name)) return;\r\n const evtItems = this.evtPool.get(name);\r\n evtItems.forEach((item) => {\r\n try {\r\n item.fn.call(fnThis, data);\r\n } catch (err) {\r\n console.error(`Error in event listener for \"${name}\":`, err);\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * 跨页通信插件:通过 localStorage + storage 事件将当前实例的 emit 广播到其他同源页面。\r\n * 支持节流、命名空间隔离。\r\n */\r\nexport const MyEvent_CrossPagePlugin = (() => {\r\n const INSTALLED = new WeakSet(); // 防止重复安装\r\n\r\n return {\r\n /**\r\n * 为指定 MyEvent 实例安装跨页插件。\r\n * @param {MyEvent} bus - 事件总线实例\r\n * @param {Options} [opts] - 配置项\r\n */\r\n install(bus, opts = {}) {\r\n if (INSTALLED.has(bus)) return;\r\n INSTALLED.add(bus);\r\n\r\n const ns = `___my-event-cross-page-${opts.namespace || \"default\"}___`;\r\n const delay = opts.throttle || 16;\r\n let last = 0;\r\n\r\n // 1、重写 emit\r\n const rawEmit = bus.emit;\r\n bus.emit = function (name, data, fnThis) {\r\n rawEmit.call(bus, name, data, fnThis); // 本地先执行\r\n const now = Date.now();\r\n if (now - last < delay) return;\r\n last = now;\r\n const key = ns + name;\r\n try {\r\n localStorage.setItem(key, JSON.stringify({ name, data, ts: now }));\r\n localStorage.removeItem(key); // 触发 storage 事件\r\n } catch (e) {}\r\n };\r\n\r\n // 2、监听其他页广播\r\n function onStorageHandler(e) {\r\n if (!e.key || !e.key.startsWith(ns)) return;\r\n let payload;\r\n try {\r\n payload = JSON.parse(e.newValue || \"{}\");\r\n } catch {\r\n return;\r\n }\r\n if (!payload.ts || payload.ts <= last) return;\r\n rawEmit.call(bus, e.key.slice(ns.length), payload.data); // 仅本地\r\n }\r\n addEventListener(\"storage\", onStorageHandler);\r\n\r\n // 3、保存卸载器\r\n bus._uninstallCrossPage = () => {\r\n removeEventListener(\"storage\", onStorageHandler);\r\n bus.emit = rawEmit;\r\n INSTALLED.delete(bus);\r\n };\r\n },\r\n\r\n /**\r\n * 卸载插件,恢复原始 emit 并停止监听。\r\n * @param {MyEvent} bus - 事件总线实例\r\n */\r\n uninstall(bus) {\r\n if (typeof bus._uninstallCrossPage === \"function\") bus._uninstallCrossPage();\r\n }\r\n };\r\n})();\r\n"],"names":[],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,OAAO,CAAC;AACrB,IAAI,WAAW,GAAG;AAClB,QAAQ,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;AACjC,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE;AACjB,QAAQ,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;AACpE,QAAQ,MAAM,OAAO,GAAG;AACxB,YAAY,IAAI;AAChB,YAAY,EAAE;AACd,SAAS,CAAC;AACV,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACpC,YAAY,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjD,QAAQ,CAAC,MAAM;AACf,YAAY,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9C,QAAQ,CAAC;AACT,QAAQ,OAAO,IAAI,CAAC;AACpB,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE;AACnB,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC;AAC3B,QAAQ,IAAI,OAAO,CAAC;AACpB,QAAQ,OAAO,GAAG,UAAU,IAAI,EAAE;AAClC,YAAY,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,YAAY,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAChC,QAAQ,CAAC,CAAC;AACV,QAAQ,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACtC,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE;AACxB,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO;AAC5C,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChD,QAAQ,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AACnG,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACnC,YAAY,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACtC,QAAQ,CAAC,MAAM;AACf,YAAY,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7C,QAAQ,CAAC;AACT,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;AAC7B,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO;AAC5C,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChD,QAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK;AACnC,YAAY,IAAI;AAChB,gBAAgB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC3C,YAAY,CAAC,CAAC,OAAO,GAAG,EAAE;AAC1B,gBAAgB,OAAO,CAAC,KAAK,CAAC,CAAC,6BAA6B,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7E,YAAY,CAAC;AACb,QAAQ,CAAC,CAAC,CAAC;AACX,IAAI,CAAC;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACY,MAAC,uBAAuB,GAAG,CAAC,MAAM;AAC9C,IAAI,MAAM,SAAS,GAAG,IAAI,OAAO,EAAE,CAAC;AACpC;AACA,IAAI,OAAO;AACX;AACA;AACA;AACA;AACA;AACA,QAAQ,OAAO,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE;AAChC,YAAY,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO;AAC3C,YAAY,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC/B;AACA,YAAY,MAAM,EAAE,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;AAClF,YAAY,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC9C,YAAY,IAAI,IAAI,GAAG,CAAC,CAAC;AACzB;AACA;AACA,YAAY,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;AACrC,YAAY,GAAG,CAAC,IAAI,GAAG,UAAU,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;AACrD,gBAAgB,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACtD,gBAAgB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACvC,gBAAgB,IAAI,GAAG,GAAG,IAAI,GAAG,KAAK,EAAE,OAAO;AAC/C,gBAAgB,IAAI,GAAG,GAAG,CAAC;AAC3B,gBAAgB,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;AACtC,gBAAgB,IAAI;AACpB,oBAAoB,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AACvF,oBAAoB,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACjD,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC9B,YAAY,CAAC,CAAC;AACd;AACA;AACA,YAAY,SAAS,gBAAgB,CAAC,CAAC,EAAE;AACzC,gBAAgB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,OAAO;AAC5D,gBAAgB,IAAI,OAAO,CAAC;AAC5B,gBAAgB,IAAI;AACpB,oBAAoB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;AAC7D,gBAAgB,CAAC,CAAC,MAAM;AACxB,oBAAoB,OAAO;AAC3B,gBAAgB,CAAC;AACjB,gBAAgB,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,IAAI,IAAI,EAAE,OAAO;AAC9D,gBAAgB,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AACxE,YAAY,CAAC;AACb,YAAY,gBAAgB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAC1D;AACA;AACA,YAAY,GAAG,CAAC,mBAAmB,GAAG,MAAM;AAC5C,gBAAgB,mBAAmB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;AACjE,gBAAgB,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;AACnC,gBAAgB,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACtC,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ,SAAS,CAAC,GAAG,EAAE;AACvB,YAAY,IAAI,OAAO,GAAG,CAAC,mBAAmB,KAAK,UAAU,EAAE,GAAG,CAAC,mBAAmB,EAAE,CAAC;AACzF,QAAQ,CAAC;AACT,KAAK,CAAC;AACN,CAAC;;;"}
|
package/dist/evt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evt.js","sources":["../src/source/evt.js"],"sourcesContent":["/**\r\n * 简单、高性能的通用事件总线。\r\n * - 支持命名空间事件\r\n * - 支持一次性监听器\r\n * - 返回唯一 flag,用于精确卸载\r\n * - emit 时可选自定义 this 指向\r\n */\r\nexport class MyEvent {\r\n constructor() {\r\n this.evtPool = new Map();\r\n }\r\n\r\n /**\r\n * 注册事件监听器。\r\n * @param {string} name - 事件名\r\n * @param {Function} fn - 回调函数\r\n * @returns {string} flag - 唯一标识,用于 off\r\n */\r\n on(name, fn) {\r\n let flag = Date.now() + \"_\" + parseInt(Math.random() * 1e8);\r\n const evtItem = {\r\n flag,\r\n fn\r\n };\r\n if (this.evtPool.has(name)) {\r\n this.evtPool.get(name).push(evtItem);\r\n } else {\r\n this.evtPool.set(name, [evtItem]);\r\n }\r\n return flag;\r\n }\r\n\r\n /**\r\n * 注册一次性监听器,触发后自动移除。\r\n * @param {string} name - 事件名\r\n * @param {Function} fn - 回调函数\r\n * @returns {string} flag - 唯一标识\r\n */\r\n once(name, fn) {\r\n const _this = this;\r\n let wrapper;\r\n wrapper = function (data) {\r\n _this.off(name, wrapper);\r\n fn.call(this, data);\r\n };\r\n return this.on(name, wrapper);\r\n }\r\n\r\n /**\r\n * 移除指定事件监听器。\r\n * @param {string} name - 事件名\r\n * @param {Function|string} fnOrFlag - 回调函数或 flag\r\n */\r\n off(name, fnOrFlag) {\r\n if (!this.evtPool.has(name)) return;\r\n const evtItems = this.evtPool.get(name);\r\n const filtered = evtItems.filter((item) => item.fn !== fnOrFlag && item.flag !== fnOrFlag);\r\n if (filtered.length === 0) {\r\n this.evtPool.delete(name);\r\n } else {\r\n this.evtPool.set(name, filtered);\r\n }\r\n }\r\n\r\n /**\r\n * 触发事件(同步执行)。\r\n * @param {string} name - 事件名\r\n * @param {*} [data] - 任意载荷\r\n * @param {*} [fnThis] - 回调内部 this 指向,默认 undefined\r\n */\r\n emit(name, data, fnThis) {\r\n if (!this.evtPool.has(name)) return;\r\n const evtItems = this.evtPool.get(name);\r\n evtItems.forEach((item) => {\r\n try {\r\n item.fn.call(fnThis, data);\r\n } catch (err) {\r\n console.error(`Error in event listener for \"${name}\":`, err);\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * 跨页通信插件:通过 localStorage + storage 事件将当前实例的 emit 广播到其他同源页面。\r\n * 支持节流、命名空间隔离。\r\n */\r\nexport const MyEvent_CrossPagePlugin = (() => {\r\n const INSTALLED = new WeakSet(); // 防止重复安装\r\n\r\n return {\r\n /**\r\n * 为指定 MyEvent 实例安装跨页插件。\r\n * @param {MyEvent} bus - 事件总线实例\r\n * @param {Options} [opts] - 配置项\r\n */\r\n install(bus, opts = {}) {\r\n if (INSTALLED.has(bus)) return;\r\n INSTALLED.add(bus);\r\n\r\n const ns = `___my-event-cross-page-${opts.namespace || \"default\"}___`;\r\n const delay = opts.throttle || 16;\r\n let last = 0;\r\n\r\n // 1、重写 emit\r\n const rawEmit = bus.emit;\r\n bus.emit = function (name, data, fnThis) {\r\n rawEmit.call(bus, name, data, fnThis); // 本地先执行\r\n const now = Date.now();\r\n if (now - last < delay) return;\r\n last = now;\r\n const key = ns + name;\r\n try {\r\n localStorage.setItem(key, JSON.stringify({ name, data, ts: now }));\r\n localStorage.removeItem(key); // 触发 storage 事件\r\n } catch (e) {}\r\n };\r\n\r\n // 2、监听其他页广播\r\n function onStorageHandler(e) {\r\n if (!e.key || !e.key.startsWith(ns)) return;\r\n let payload;\r\n try {\r\n payload = JSON.parse(e.newValue || \"{}\");\r\n } catch {\r\n return;\r\n }\r\n if (!payload.ts || payload.ts <= last) return;\r\n rawEmit.call(bus, e.key.slice(ns.length), payload.data); // 仅本地\r\n }\r\n addEventListener(\"storage\", onStorageHandler);\r\n\r\n // 3、保存卸载器\r\n bus._uninstallCrossPage = () => {\r\n removeEventListener(\"storage\", onStorageHandler);\r\n bus.emit = rawEmit;\r\n INSTALLED.delete(bus);\r\n };\r\n },\r\n\r\n /**\r\n * 卸载插件,恢复原始 emit 并停止监听。\r\n * @param {MyEvent} bus - 事件总线实例\r\n */\r\n uninstall(bus) {\r\n if (typeof bus._uninstallCrossPage === \"function\") bus._uninstallCrossPage();\r\n }\r\n };\r\n})();\r\n"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"evt.js","sources":["../src/source/evt.js"],"sourcesContent":["/**\r\n * 简单、高性能的通用事件总线。\r\n * - 支持命名空间事件\r\n * - 支持一次性监听器\r\n * - 返回唯一 flag,用于精确卸载\r\n * - emit 时可选自定义 this 指向\r\n */\r\nexport class MyEvent {\r\n constructor() {\r\n this.evtPool = new Map();\r\n }\r\n\r\n /**\r\n * 注册事件监听器。\r\n * @param {string} name - 事件名\r\n * @param {Function} fn - 回调函数\r\n * @returns {string} flag - 唯一标识,用于 off\r\n */\r\n on(name, fn) {\r\n let flag = Date.now() + \"_\" + parseInt(Math.random() * 1e8);\r\n const evtItem = {\r\n flag,\r\n fn\r\n };\r\n if (this.evtPool.has(name)) {\r\n this.evtPool.get(name).push(evtItem);\r\n } else {\r\n this.evtPool.set(name, [evtItem]);\r\n }\r\n return flag;\r\n }\r\n\r\n /**\r\n * 注册一次性监听器,触发后自动移除。\r\n * @param {string} name - 事件名\r\n * @param {Function} fn - 回调函数\r\n * @returns {string} flag - 唯一标识\r\n */\r\n once(name, fn) {\r\n const _this = this;\r\n let wrapper;\r\n wrapper = function (data) {\r\n _this.off(name, wrapper);\r\n fn.call(this, data);\r\n };\r\n return this.on(name, wrapper);\r\n }\r\n\r\n /**\r\n * 移除指定事件监听器。\r\n * @param {string} name - 事件名\r\n * @param {Function|string} fnOrFlag - 回调函数或 flag\r\n */\r\n off(name, fnOrFlag) {\r\n if (!this.evtPool.has(name)) return;\r\n const evtItems = this.evtPool.get(name);\r\n const filtered = evtItems.filter((item) => item.fn !== fnOrFlag && item.flag !== fnOrFlag);\r\n if (filtered.length === 0) {\r\n this.evtPool.delete(name);\r\n } else {\r\n this.evtPool.set(name, filtered);\r\n }\r\n }\r\n\r\n /**\r\n * 触发事件(同步执行)。\r\n * @param {string} name - 事件名\r\n * @param {*} [data] - 任意载荷\r\n * @param {*} [fnThis] - 回调内部 this 指向,默认 undefined\r\n */\r\n emit(name, data, fnThis) {\r\n if (!this.evtPool.has(name)) return;\r\n const evtItems = this.evtPool.get(name);\r\n evtItems.forEach((item) => {\r\n try {\r\n item.fn.call(fnThis, data);\r\n } catch (err) {\r\n console.error(`Error in event listener for \"${name}\":`, err);\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * 跨页通信插件:通过 localStorage + storage 事件将当前实例的 emit 广播到其他同源页面。\r\n * 支持节流、命名空间隔离。\r\n */\r\nexport const MyEvent_CrossPagePlugin = (() => {\r\n const INSTALLED = new WeakSet(); // 防止重复安装\r\n\r\n return {\r\n /**\r\n * 为指定 MyEvent 实例安装跨页插件。\r\n * @param {MyEvent} bus - 事件总线实例\r\n * @param {Options} [opts] - 配置项\r\n */\r\n install(bus, opts = {}) {\r\n if (INSTALLED.has(bus)) return;\r\n INSTALLED.add(bus);\r\n\r\n const ns = `___my-event-cross-page-${opts.namespace || \"default\"}___`;\r\n const delay = opts.throttle || 16;\r\n let last = 0;\r\n\r\n // 1、重写 emit\r\n const rawEmit = bus.emit;\r\n bus.emit = function (name, data, fnThis) {\r\n rawEmit.call(bus, name, data, fnThis); // 本地先执行\r\n const now = Date.now();\r\n if (now - last < delay) return;\r\n last = now;\r\n const key = ns + name;\r\n try {\r\n localStorage.setItem(key, JSON.stringify({ name, data, ts: now }));\r\n localStorage.removeItem(key); // 触发 storage 事件\r\n } catch (e) {}\r\n };\r\n\r\n // 2、监听其他页广播\r\n function onStorageHandler(e) {\r\n if (!e.key || !e.key.startsWith(ns)) return;\r\n let payload;\r\n try {\r\n payload = JSON.parse(e.newValue || \"{}\");\r\n } catch {\r\n return;\r\n }\r\n if (!payload.ts || payload.ts <= last) return;\r\n rawEmit.call(bus, e.key.slice(ns.length), payload.data); // 仅本地\r\n }\r\n addEventListener(\"storage\", onStorageHandler);\r\n\r\n // 3、保存卸载器\r\n bus._uninstallCrossPage = () => {\r\n removeEventListener(\"storage\", onStorageHandler);\r\n bus.emit = rawEmit;\r\n INSTALLED.delete(bus);\r\n };\r\n },\r\n\r\n /**\r\n * 卸载插件,恢复原始 emit 并停止监听。\r\n * @param {MyEvent} bus - 事件总线实例\r\n */\r\n uninstall(bus) {\r\n if (typeof bus._uninstallCrossPage === \"function\") bus._uninstallCrossPage();\r\n }\r\n };\r\n})();\r\n"],"names":[],"mappings":"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"}
|
package/dist/id.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id.cjs","sources":["../src/source/id.js"],"sourcesContent":["/**\r\n * 生成 RFC4122 版本 4 的 GUID/UUID。\r\n * 收集来源:《基于mvc的javascript web富应用开发》 书中介绍是Robert Kieffer写的,还留了网址 http://goo.gl/0b0hu ,但实际访问不了。\r\n * 格式:`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`\r\n *\r\n * @returns {string} 36 位大写 GUID\r\n *\r\n * @example\r\n * // A2E0F340-6C3B-4D7F-B8C1-1E4F6A8B9C0D\r\n * console.log(getGUID())\r\n */\r\nexport function getGUID() {\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\r\n let r = (Math.random() * 16) | 0,\r\n v = c == \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16).toUpperCase();\r\n });\r\n}\r\n\r\n/**\r\n * 分布式短 ID 生成器。\r\n * 格式:`${timestamp}${flag}${serial}`,其中:\r\n * - timestamp:毫秒级时间戳\r\n * - flag:客户端标识串(自定义)\r\n * - serial:同一毫秒内的序号,左补零到固定长度\r\n */\r\nexport class MyId {\r\n #ts = Date.now(); //\t时间戳\r\n #sn = 0; //\t序号(保证同一客户端之间的唯一项)\r\n #flag = \"\"; //\t客户端标识(保证不同客户端之间的唯一项)\r\n #len = 5; //\t序号位长度(我的电脑测试,同一时间戳内可以for循环执行了1000次左右,没有一次超过3k,所以5位应该够用了)\r\n // 测试代码\r\n // let obj = {[Date.now()]:[]}; try { for (let i = 0; i < 100000; i++) { obj[Date.now()].push(i); } } catch { console.log(obj[Object.getOwnPropertyNames(obj)[0]].length); }\r\n\r\n /**\r\n * @param {object} [option]\r\n * @param {string} [option.flag] - 客户端标识,默认空串\r\n * @param {number} [option.len=5] - 序号位长度(位数),安全范围 ≥0\r\n */\r\n constructor(option = {}) {\r\n if (option) {\r\n if (typeof option.flag === \"string\") {\r\n this.#flag = option.flag;\r\n }\r\n if (Number.isSafeInteger(option.len) && len >= 0) {\r\n this.#len = option.len;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 生成下一个全局唯一字符串 ID。\r\n * 同一毫秒序号自动递增;序号溢出时会在控制台警告。\r\n * @returns {string}\r\n */\r\n nextId() {\r\n let ts = Date.now();\r\n if (ts === this.#ts) {\r\n this.#sn++;\r\n if (this.#sn >= 10 ** this.#len) {\r\n console.log(\"长度不够用了!!!\");\r\n }\r\n } else {\r\n this.#sn = 0;\r\n this.#ts = ts;\r\n }\r\n return ts.toString() + this.#flag + this.#sn.toString().padStart(this.#len, \"0\");\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,OAAO,GAAG;AAC1B,IAAI,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK;AAC1E,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;AACxC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC;AAC/C,QAAQ,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5C,IAAI,CAAC,CAAC,CAAC;AACP,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,IAAI,CAAC;AAClB,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACrB,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,IAAI,KAAK,GAAG,EAAE,CAAC;AACf,IAAI,IAAI,GAAG,CAAC,CAAC;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE,EAAE;AAC7B,QAAQ,IAAI,MAAM,EAAE;AACpB,YAAY,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;AACjD,gBAAgB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;AACzC,YAAY,CAAC;AACb,YAAY,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;AAC9D,gBAAgB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC;AACvC,YAAY,CAAC;AACb,QAAQ,CAAC;AACT,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,GAAG;AACb,QAAQ,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC5B,QAAQ,IAAI,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE;AAC7B,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC;AACvB,YAAY,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE;AAC7C,gBAAgB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACzC,YAAY,CAAC;AACb,QAAQ,CAAC,MAAM;AACf,YAAY,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;AACzB,YAAY,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;AAC1B,QAAQ,CAAC;AACT,QAAQ,OAAO,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACzF,IAAI,CAAC;AACL
|
|
1
|
+
{"version":3,"file":"id.cjs","sources":["../src/source/id.js"],"sourcesContent":["/**\r\n * 生成 RFC4122 版本 4 的 GUID/UUID。\r\n * 收集来源:《基于mvc的javascript web富应用开发》 书中介绍是Robert Kieffer写的,还留了网址 http://goo.gl/0b0hu ,但实际访问不了。\r\n * 格式:`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`\r\n *\r\n * @returns {string} 36 位大写 GUID\r\n *\r\n * @example\r\n * // A2E0F340-6C3B-4D7F-B8C1-1E4F6A8B9C0D\r\n * console.log(getGUID())\r\n */\r\nexport function getGUID() {\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\r\n let r = (Math.random() * 16) | 0,\r\n v = c == \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16).toUpperCase();\r\n });\r\n}\r\n\r\n/**\r\n * 分布式短 ID 生成器。\r\n * 格式:`${timestamp}${flag}${serial}`,其中:\r\n * - timestamp:毫秒级时间戳\r\n * - flag:客户端标识串(自定义)\r\n * - serial:同一毫秒内的序号,左补零到固定长度\r\n */\r\nexport class MyId {\r\n #ts = Date.now(); //\t时间戳\r\n #sn = 0; //\t序号(保证同一客户端之间的唯一项)\r\n #flag = \"\"; //\t客户端标识(保证不同客户端之间的唯一项)\r\n #len = 5; //\t序号位长度(我的电脑测试,同一时间戳内可以for循环执行了1000次左右,没有一次超过3k,所以5位应该够用了)\r\n // 测试代码\r\n // let obj = {[Date.now()]:[]}; try { for (let i = 0; i < 100000; i++) { obj[Date.now()].push(i); } } catch { console.log(obj[Object.getOwnPropertyNames(obj)[0]].length); }\r\n\r\n /**\r\n * @param {object} [option]\r\n * @param {string} [option.flag] - 客户端标识,默认空串\r\n * @param {number} [option.len=5] - 序号位长度(位数),安全范围 ≥0\r\n */\r\n constructor(option = {}) {\r\n if (option) {\r\n if (typeof option.flag === \"string\") {\r\n this.#flag = option.flag;\r\n }\r\n if (Number.isSafeInteger(option.len) && len >= 0) {\r\n this.#len = option.len;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 生成下一个全局唯一字符串 ID。\r\n * 同一毫秒序号自动递增;序号溢出时会在控制台警告。\r\n * @returns {string}\r\n */\r\n nextId() {\r\n let ts = Date.now();\r\n if (ts === this.#ts) {\r\n this.#sn++;\r\n if (this.#sn >= 10 ** this.#len) {\r\n console.log(\"长度不够用了!!!\");\r\n }\r\n } else {\r\n this.#sn = 0;\r\n this.#ts = ts;\r\n }\r\n return ts.toString() + this.#flag + this.#sn.toString().padStart(this.#len, \"0\");\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,OAAO,GAAG;AAC1B,IAAI,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK;AAC1E,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;AACxC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC;AAC/C,QAAQ,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5C,IAAI,CAAC,CAAC,CAAC;AACP,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,IAAI,CAAC;AAClB,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACrB,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,IAAI,KAAK,GAAG,EAAE,CAAC;AACf,IAAI,IAAI,GAAG,CAAC,CAAC;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE,EAAE;AAC7B,QAAQ,IAAI,MAAM,EAAE;AACpB,YAAY,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;AACjD,gBAAgB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;AACzC,YAAY,CAAC;AACb,YAAY,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;AAC9D,gBAAgB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC;AACvC,YAAY,CAAC;AACb,QAAQ,CAAC;AACT,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,GAAG;AACb,QAAQ,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC5B,QAAQ,IAAI,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE;AAC7B,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC;AACvB,YAAY,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE;AAC7C,gBAAgB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACzC,YAAY,CAAC;AACb,QAAQ,CAAC,MAAM;AACf,YAAY,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;AACzB,YAAY,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;AAC1B,QAAQ,CAAC;AACT,QAAQ,OAAO,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACzF,IAAI,CAAC;AACL;;;"}
|
package/dist/id.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id.js","sources":["../src/source/id.js"],"sourcesContent":["/**\r\n * 生成 RFC4122 版本 4 的 GUID/UUID。\r\n * 收集来源:《基于mvc的javascript web富应用开发》 书中介绍是Robert Kieffer写的,还留了网址 http://goo.gl/0b0hu ,但实际访问不了。\r\n * 格式:`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`\r\n *\r\n * @returns {string} 36 位大写 GUID\r\n *\r\n * @example\r\n * // A2E0F340-6C3B-4D7F-B8C1-1E4F6A8B9C0D\r\n * console.log(getGUID())\r\n */\r\nexport function getGUID() {\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\r\n let r = (Math.random() * 16) | 0,\r\n v = c == \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16).toUpperCase();\r\n });\r\n}\r\n\r\n/**\r\n * 分布式短 ID 生成器。\r\n * 格式:`${timestamp}${flag}${serial}`,其中:\r\n * - timestamp:毫秒级时间戳\r\n * - flag:客户端标识串(自定义)\r\n * - serial:同一毫秒内的序号,左补零到固定长度\r\n */\r\nexport class MyId {\r\n #ts = Date.now(); //\t时间戳\r\n #sn = 0; //\t序号(保证同一客户端之间的唯一项)\r\n #flag = \"\"; //\t客户端标识(保证不同客户端之间的唯一项)\r\n #len = 5; //\t序号位长度(我的电脑测试,同一时间戳内可以for循环执行了1000次左右,没有一次超过3k,所以5位应该够用了)\r\n // 测试代码\r\n // let obj = {[Date.now()]:[]}; try { for (let i = 0; i < 100000; i++) { obj[Date.now()].push(i); } } catch { console.log(obj[Object.getOwnPropertyNames(obj)[0]].length); }\r\n\r\n /**\r\n * @param {object} [option]\r\n * @param {string} [option.flag] - 客户端标识,默认空串\r\n * @param {number} [option.len=5] - 序号位长度(位数),安全范围 ≥0\r\n */\r\n constructor(option = {}) {\r\n if (option) {\r\n if (typeof option.flag === \"string\") {\r\n this.#flag = option.flag;\r\n }\r\n if (Number.isSafeInteger(option.len) && len >= 0) {\r\n this.#len = option.len;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 生成下一个全局唯一字符串 ID。\r\n * 同一毫秒序号自动递增;序号溢出时会在控制台警告。\r\n * @returns {string}\r\n */\r\n nextId() {\r\n let ts = Date.now();\r\n if (ts === this.#ts) {\r\n this.#sn++;\r\n if (this.#sn >= 10 ** this.#len) {\r\n console.log(\"长度不够用了!!!\");\r\n }\r\n } else {\r\n this.#sn = 0;\r\n this.#ts = ts;\r\n }\r\n return ts.toString() + this.#flag + this.#sn.toString().padStart(this.#len, \"0\");\r\n }\r\n}\r\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,OAAO,GAAG;AAC1B,IAAI,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK;AAC1E,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;AACxC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC;AAC/C,QAAQ,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5C,IAAI,CAAC,CAAC,CAAC;AACP,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,IAAI,CAAC;AAClB,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACrB,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,IAAI,KAAK,GAAG,EAAE,CAAC;AACf,IAAI,IAAI,GAAG,CAAC,CAAC;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE,EAAE;AAC7B,QAAQ,IAAI,MAAM,EAAE;AACpB,YAAY,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;AACjD,gBAAgB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;AACzC,YAAY,CAAC;AACb,YAAY,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;AAC9D,gBAAgB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC;AACvC,YAAY,CAAC;AACb,QAAQ,CAAC;AACT,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,GAAG;AACb,QAAQ,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC5B,QAAQ,IAAI,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE;AAC7B,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC;AACvB,YAAY,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE;AAC7C,gBAAgB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACzC,YAAY,CAAC;AACb,QAAQ,CAAC,MAAM;AACf,YAAY,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;AACzB,YAAY,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;AAC1B,QAAQ,CAAC;AACT,QAAQ,OAAO,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACzF,IAAI,CAAC;AACL
|
|
1
|
+
{"version":3,"file":"id.js","sources":["../src/source/id.js"],"sourcesContent":["/**\r\n * 生成 RFC4122 版本 4 的 GUID/UUID。\r\n * 收集来源:《基于mvc的javascript web富应用开发》 书中介绍是Robert Kieffer写的,还留了网址 http://goo.gl/0b0hu ,但实际访问不了。\r\n * 格式:`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`\r\n *\r\n * @returns {string} 36 位大写 GUID\r\n *\r\n * @example\r\n * // A2E0F340-6C3B-4D7F-B8C1-1E4F6A8B9C0D\r\n * console.log(getGUID())\r\n */\r\nexport function getGUID() {\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\r\n let r = (Math.random() * 16) | 0,\r\n v = c == \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16).toUpperCase();\r\n });\r\n}\r\n\r\n/**\r\n * 分布式短 ID 生成器。\r\n * 格式:`${timestamp}${flag}${serial}`,其中:\r\n * - timestamp:毫秒级时间戳\r\n * - flag:客户端标识串(自定义)\r\n * - serial:同一毫秒内的序号,左补零到固定长度\r\n */\r\nexport class MyId {\r\n #ts = Date.now(); //\t时间戳\r\n #sn = 0; //\t序号(保证同一客户端之间的唯一项)\r\n #flag = \"\"; //\t客户端标识(保证不同客户端之间的唯一项)\r\n #len = 5; //\t序号位长度(我的电脑测试,同一时间戳内可以for循环执行了1000次左右,没有一次超过3k,所以5位应该够用了)\r\n // 测试代码\r\n // let obj = {[Date.now()]:[]}; try { for (let i = 0; i < 100000; i++) { obj[Date.now()].push(i); } } catch { console.log(obj[Object.getOwnPropertyNames(obj)[0]].length); }\r\n\r\n /**\r\n * @param {object} [option]\r\n * @param {string} [option.flag] - 客户端标识,默认空串\r\n * @param {number} [option.len=5] - 序号位长度(位数),安全范围 ≥0\r\n */\r\n constructor(option = {}) {\r\n if (option) {\r\n if (typeof option.flag === \"string\") {\r\n this.#flag = option.flag;\r\n }\r\n if (Number.isSafeInteger(option.len) && len >= 0) {\r\n this.#len = option.len;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 生成下一个全局唯一字符串 ID。\r\n * 同一毫秒序号自动递增;序号溢出时会在控制台警告。\r\n * @returns {string}\r\n */\r\n nextId() {\r\n let ts = Date.now();\r\n if (ts === this.#ts) {\r\n this.#sn++;\r\n if (this.#sn >= 10 ** this.#len) {\r\n console.log(\"长度不够用了!!!\");\r\n }\r\n } else {\r\n this.#sn = 0;\r\n this.#ts = ts;\r\n }\r\n return ts.toString() + this.#flag + this.#sn.toString().padStart(this.#len, \"0\");\r\n }\r\n}\r\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,OAAO,GAAG;AAC1B,IAAI,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK;AAC1E,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;AACxC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC;AAC/C,QAAQ,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5C,IAAI,CAAC,CAAC,CAAC;AACP,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,IAAI,CAAC;AAClB,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACrB,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,IAAI,KAAK,GAAG,EAAE,CAAC;AACf,IAAI,IAAI,GAAG,CAAC,CAAC;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE,EAAE;AAC7B,QAAQ,IAAI,MAAM,EAAE;AACpB,YAAY,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;AACjD,gBAAgB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;AACzC,YAAY,CAAC;AACb,YAAY,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;AAC9D,gBAAgB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC;AACvC,YAAY,CAAC;AACb,QAAQ,CAAC;AACT,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,GAAG;AACb,QAAQ,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC5B,QAAQ,IAAI,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE;AAC7B,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC;AACvB,YAAY,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE;AAC7C,gBAAgB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACzC,YAAY,CAAC;AACb,QAAQ,CAAC,MAAM;AACf,YAAY,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;AACzB,YAAY,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;AAC1B,QAAQ,CAAC;AACT,QAAQ,OAAO,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACzF,IAAI,CAAC;AACL;;"}
|
package/dist/menu.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.cjs","sources":["../src/source/menu.js"],"sourcesContent":["/**\r\n * 处理数据库菜单项,生成 UI 菜单树和路由配置。\r\n *\r\n * @param {Array<Object>} menuItems - 原始菜单项数组,树形结构\r\n * @param {Object} [options] - 配置选项\r\n * @param {string} [options.idKey='id'] - 数据源 ID 键名\r\n * @param {string} [options.codeKey='code'] - 数据源编码键名, 用于拼接路由名称和路由路径\r\n * @param {string} [options.labelKey='text'] - 数据源标签键名\r\n * @param {string} [options.childrenKey='children'] - 数据源子节点键名\r\n * @param {string} [options.extendKey='extend'] - 数据源扩展对象键名\r\n * @param {string} [options.menuIdKey='key'] - 输出菜单 ID 键名\r\n * @param {string} [options.menuLabelKey='label'] - 输出菜单标签键名\r\n * @param {string} [options.menuChildrenKey='children'] - 输出菜单子节点键名\r\n * @param {string} [options.menuExtendKey='extend'] - 输出菜单扩展对象键名\r\n * @param {string} [options.routeNameKey='name'] - 路由名称键名\r\n * @param {string} [options.routePathKey='path'] - 路由路径键名\r\n * @param {string} [options.routeMetaKey='meta'] - 路由元数据键名\r\n * @param {Function} [options.handleNodeItem] - 节点处理钩子,参数:(nodeSimple) => void\r\n * @param {Function} [options.handleMenuItem] - 菜单项处理钩子,参数:(uiMenuItem, nodeSimple) => void\r\n * @param {Function} [options.handleRouteItem] - 路由项处理钩子,参数:(routeItem, nodeSimple) => void\r\n *\r\n * @returns {Object} 处理结果\r\n * @returns {Array<Object>} returns.uiMenuItems - UI 菜单树形结构数组\r\n * @returns {Array<Object>} returns.routeItems - 扁平化路由配置数组\r\n * @returns {Map<string, Object>} returns.nodeMap - 节点 ID 到节点数据的映射表\r\n *\r\n * @example\r\n * const menuItems = [\r\n * { id: '1', code: 'system', text: '系统管理', children: [\r\n * { id: '1-1', code: 'user', text: '用户管理' }\r\n * ]}\r\n * ];\r\n *\r\n * const result = handleDbMenuItems(menuItems, {\r\n * handleRouteItem: (route, node) => {\r\n * route.component = () => import(`./views/${node.code}.vue`);\r\n * }\r\n * });\r\n *\r\n * // result.uiMenuItems: [{ key: '1', label: '系统管理', children: [...] }]\r\n * // result.routeItems: [{ name: 'system.user', path: '/system/user', meta: { id: '1-1' } }]\r\n * // result.nodeMap: Map { '1' => {...}, '1-1' => {...} }\r\n */\r\nexport function handleDbMenuItems(menuItems, options = {}) {\r\n // 1. 统一配置项,简化调用\r\n const {\r\n // 数据源键名\r\n idKey = \"id\",\r\n codeKey = \"code\",\r\n labelKey = \"text\",\r\n childrenKey = \"children\",\r\n extendKey = \"extend\",\r\n\r\n // 输出目标键名\r\n menuIdKey = \"key\",\r\n menuLabelKey = \"label\",\r\n menuChildrenKey = \"children\",\r\n menuExtendKey = \"extend\",\r\n\r\n routeNameKey = \"name\",\r\n routePathKey = \"path\",\r\n routeMetaKey = \"meta\",\r\n\r\n // 钩子函数\r\n handleNodeItem,\r\n handleMenuItem,\r\n handleRouteItem\r\n } = options;\r\n\r\n const uiMenuItems = [];\r\n const routeItems = [];\r\n const nodeMap = new Map(); // id -> node (纯净的节点数据)\r\n const nodePathMap = new Map(); // id -> [{ code, id }] (仅存储路径计算所需的轻量数据)\r\n\r\n /* ---------- 1. 建立索引:扁平化节点 & 构建路径索引 ---------- */\r\n // 使用栈进行深度优先遍历,记录路径\r\n const stack = [];\r\n if (Array.isArray(menuItems)) {\r\n menuItems.forEach((n) => stack.push({ node: n, parentPath: [] }));\r\n }\r\n\r\n while (stack.length) {\r\n const { node, parentPath } = stack.pop();\r\n const idValue = node[idKey];\r\n\r\n // 构建当前节点的路径片段\r\n const currentPathSegment = { [idKey]: idValue };\r\n const fullPath = [...parentPath, currentPathSegment];\r\n\r\n // 存储路径信息用于后续路由生成\r\n nodePathMap.set(idValue, fullPath);\r\n\r\n // 创建轻量级的节点对象存入 nodeMap\r\n // 注意:这里先创建基础结构,路由信息在第二步补充\r\n const nodeSimple = {\r\n ...node,\r\n [extendKey]: {}, // 初始化扩展对象\r\n [childrenKey]: null // 去除原始 children,避免引用污染\r\n };\r\n nodeMap.set(idValue, nodeSimple);\r\n\r\n // 处理子节点\r\n const childrenNodes = node[childrenKey];\r\n if (Array.isArray(childrenNodes)) {\r\n // 逆序压栈,保持原序\r\n for (let i = childrenNodes.length - 1; i >= 0; i--) {\r\n stack.push({ node: childrenNodes[i], parentPath: fullPath });\r\n }\r\n }\r\n }\r\n\r\n /* ---------- 2. 构建树形结构 & 生成路由 ---------- */\r\n const buildStack = [];\r\n if (Array.isArray(menuItems)) {\r\n for (let i = menuItems.length - 1; i >= 0; i--) {\r\n buildStack.push({ node: menuItems[i], parentUi: undefined });\r\n }\r\n }\r\n\r\n while (buildStack.length) {\r\n const { node, parentUi } = buildStack.pop();\r\n const idValue = node[idKey];\r\n\r\n // 从 Map 中取出之前创建好的节点对象\r\n const nodeSimple = nodeMap.get(idValue);\r\n\r\n // 2.1 构建 UI 菜单项\r\n const uiMenuItem = {\r\n [menuIdKey]: idValue,\r\n [menuLabelKey]: node[labelKey],\r\n [menuExtendKey]: {} // UI 菜单专用扩展\r\n };\r\n\r\n // 处理子节点\r\n const childrenNodes = node[childrenKey];\r\n const hasChildren = Array.isArray(childrenNodes) && childrenNodes.length > 0;\r\n\r\n if (hasChildren) {\r\n // 有子节点 -> 继续压栈,传递当前 uiMenuItem 作为父级\r\n for (let i = childrenNodes.length - 1; i >= 0; i--) {\r\n buildStack.push({ node: childrenNodes[i], parentUi: uiMenuItem });\r\n }\r\n } else {\r\n // 2.2 无子节点 -> 生成路由配置\r\n\r\n // 提取 code 和 id 数组\r\n const codePaths = [],\r\n keyPaths = [];\r\n nodePathMap.get(idValue).forEach((item) => {\r\n const idValue = item[idKey];\r\n const nodeSimple = nodeMap.get(idValue);\r\n keyPaths.push(idValue);\r\n codePaths.push(nodeSimple[codeKey]);\r\n });\r\n\r\n const routeName = codePaths.join(\".\");\r\n const routePath = \"/\" + codePaths.join(\"/\");\r\n\r\n const routeItem = {\r\n [routeNameKey]: routeName,\r\n [routePathKey]: routePath,\r\n [routeMetaKey]: { [idKey]: idValue }\r\n };\r\n\r\n // 执行路由钩子\r\n if (typeof handleRouteItem === \"function\") {\r\n handleRouteItem(routeItem, nodeSimple);\r\n }\r\n routeItems.push(routeItem);\r\n\r\n // 补充扩展信息\r\n uiMenuItem[menuExtendKey].routeName = routeName;\r\n uiMenuItem[menuExtendKey].keyPaths = keyPaths;\r\n\r\n nodeSimple[extendKey].routeName = routeName;\r\n nodeSimple[extendKey].keyPaths = keyPaths;\r\n }\r\n\r\n // 2.3 挂载到父级 UI 或根数组\r\n if (parentUi) {\r\n // 逻辑赋值,确保 children 数组存在\r\n (parentUi[menuChildrenKey] || (parentUi[menuChildrenKey] = [])).push(uiMenuItem);\r\n } else {\r\n if (typeof handleMenuItem === \"function\") {\r\n handleMenuItem(uiMenuItem, nodeSimple);\r\n }\r\n uiMenuItems.push(uiMenuItem);\r\n }\r\n\r\n // 执行节点钩子\r\n if (typeof handleNodeItem === \"function\") {\r\n handleNodeItem(nodeSimple);\r\n }\r\n }\r\n\r\n return { uiMenuItems, routeItems, nodeMap };\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"menu.cjs","sources":["../src/source/menu.js"],"sourcesContent":["/**\r\n * 处理数据库菜单项,生成 UI 菜单树和路由配置。\r\n *\r\n * @param {Array<Object>} menuItems - 原始菜单项数组,树形结构\r\n * @param {Object} [options] - 配置选项\r\n * @param {string} [options.idKey='id'] - 数据源 ID 键名\r\n * @param {string} [options.codeKey='code'] - 数据源编码键名, 用于拼接路由名称和路由路径\r\n * @param {string} [options.labelKey='text'] - 数据源标签键名\r\n * @param {string} [options.childrenKey='children'] - 数据源子节点键名\r\n * @param {string} [options.extendKey='extend'] - 数据源扩展对象键名\r\n * @param {string} [options.menuIdKey='key'] - 输出菜单 ID 键名\r\n * @param {string} [options.menuLabelKey='label'] - 输出菜单标签键名\r\n * @param {string} [options.menuChildrenKey='children'] - 输出菜单子节点键名\r\n * @param {string} [options.menuExtendKey='extend'] - 输出菜单扩展对象键名\r\n * @param {string} [options.routeNameKey='name'] - 路由名称键名\r\n * @param {string} [options.routePathKey='path'] - 路由路径键名\r\n * @param {string} [options.routeMetaKey='meta'] - 路由元数据键名\r\n * @param {Function} [options.handleNodeItem] - 节点处理钩子,参数:(nodeSimple) => void\r\n * @param {Function} [options.handleMenuItem] - 菜单项处理钩子,参数:(uiMenuItem, nodeSimple) => void\r\n * @param {Function} [options.handleRouteItem] - 路由项处理钩子,参数:(routeItem, nodeSimple) => void\r\n *\r\n * @returns {Object} 处理结果\r\n * @returns {Array<Object>} returns.uiMenuItems - UI 菜单树形结构数组\r\n * @returns {Array<Object>} returns.routeItems - 扁平化路由配置数组\r\n * @returns {Map<string, Object>} returns.nodeMap - 节点 ID 到节点数据的映射表\r\n *\r\n * @example\r\n * const menuItems = [\r\n * { id: '1', code: 'system', text: '系统管理', children: [\r\n * { id: '1-1', code: 'user', text: '用户管理' }\r\n * ]}\r\n * ];\r\n *\r\n * const result = handleDbMenuItems(menuItems, {\r\n * handleRouteItem: (route, node) => {\r\n * route.component = () => import(`./views/${node.code}.vue`);\r\n * }\r\n * });\r\n *\r\n * // result.uiMenuItems: [{ key: '1', label: '系统管理', children: [...] }]\r\n * // result.routeItems: [{ name: 'system.user', path: '/system/user', meta: { id: '1-1' } }]\r\n * // result.nodeMap: Map { '1' => {...}, '1-1' => {...} }\r\n */\r\nexport function handleDbMenuItems(menuItems, options = {}) {\r\n // 1. 统一配置项,简化调用\r\n const {\r\n // 数据源键名\r\n idKey = \"id\",\r\n codeKey = \"code\",\r\n labelKey = \"text\",\r\n childrenKey = \"children\",\r\n extendKey = \"extend\",\r\n\r\n // 输出目标键名\r\n menuIdKey = \"key\",\r\n menuLabelKey = \"label\",\r\n menuChildrenKey = \"children\",\r\n menuExtendKey = \"extend\",\r\n\r\n routeNameKey = \"name\",\r\n routePathKey = \"path\",\r\n routeMetaKey = \"meta\",\r\n\r\n // 钩子函数\r\n handleNodeItem,\r\n handleMenuItem,\r\n handleRouteItem\r\n } = options;\r\n\r\n const uiMenuItems = [];\r\n const routeItems = [];\r\n const nodeMap = new Map(); // id -> node (纯净的节点数据)\r\n const nodePathMap = new Map(); // id -> [{ code, id }] (仅存储路径计算所需的轻量数据)\r\n\r\n /* ---------- 1. 建立索引:扁平化节点 & 构建路径索引 ---------- */\r\n // 使用栈进行深度优先遍历,记录路径\r\n const stack = [];\r\n if (Array.isArray(menuItems)) {\r\n menuItems.forEach((n) => stack.push({ node: n, parentPath: [] }));\r\n }\r\n\r\n while (stack.length) {\r\n const { node, parentPath } = stack.pop();\r\n const idValue = node[idKey];\r\n\r\n // 构建当前节点的路径片段\r\n const currentPathSegment = { [idKey]: idValue };\r\n const fullPath = [...parentPath, currentPathSegment];\r\n\r\n // 存储路径信息用于后续路由生成\r\n nodePathMap.set(idValue, fullPath);\r\n\r\n // 创建轻量级的节点对象存入 nodeMap\r\n // 注意:这里先创建基础结构,路由信息在第二步补充\r\n const nodeSimple = {\r\n ...node,\r\n [extendKey]: {}, // 初始化扩展对象\r\n [childrenKey]: null // 去除原始 children,避免引用污染\r\n };\r\n nodeMap.set(idValue, nodeSimple);\r\n\r\n // 处理子节点\r\n const childrenNodes = node[childrenKey];\r\n if (Array.isArray(childrenNodes)) {\r\n // 逆序压栈,保持原序\r\n for (let i = childrenNodes.length - 1; i >= 0; i--) {\r\n stack.push({ node: childrenNodes[i], parentPath: fullPath });\r\n }\r\n }\r\n }\r\n\r\n /* ---------- 2. 构建树形结构 & 生成路由 ---------- */\r\n const buildStack = [];\r\n if (Array.isArray(menuItems)) {\r\n for (let i = menuItems.length - 1; i >= 0; i--) {\r\n buildStack.push({ node: menuItems[i], parentUi: undefined });\r\n }\r\n }\r\n\r\n while (buildStack.length) {\r\n const { node, parentUi } = buildStack.pop();\r\n const idValue = node[idKey];\r\n\r\n // 从 Map 中取出之前创建好的节点对象\r\n const nodeSimple = nodeMap.get(idValue);\r\n\r\n // 2.1 构建 UI 菜单项\r\n const uiMenuItem = {\r\n [menuIdKey]: idValue,\r\n [menuLabelKey]: node[labelKey],\r\n [menuExtendKey]: {} // UI 菜单专用扩展\r\n };\r\n\r\n // 处理子节点\r\n const childrenNodes = node[childrenKey];\r\n const hasChildren = Array.isArray(childrenNodes) && childrenNodes.length > 0;\r\n\r\n if (hasChildren) {\r\n // 有子节点 -> 继续压栈,传递当前 uiMenuItem 作为父级\r\n for (let i = childrenNodes.length - 1; i >= 0; i--) {\r\n buildStack.push({ node: childrenNodes[i], parentUi: uiMenuItem });\r\n }\r\n } else {\r\n // 2.2 无子节点 -> 生成路由配置\r\n\r\n // 提取 code 和 id 数组\r\n const codePaths = [],\r\n keyPaths = [];\r\n nodePathMap.get(idValue).forEach((item) => {\r\n const idValue = item[idKey];\r\n const nodeSimple = nodeMap.get(idValue);\r\n keyPaths.push(idValue);\r\n codePaths.push(nodeSimple[codeKey]);\r\n });\r\n\r\n const routeName = codePaths.join(\".\");\r\n const routePath = \"/\" + codePaths.join(\"/\");\r\n\r\n const routeItem = {\r\n [routeNameKey]: routeName,\r\n [routePathKey]: routePath,\r\n [routeMetaKey]: { [idKey]: idValue }\r\n };\r\n\r\n // 执行路由钩子\r\n if (typeof handleRouteItem === \"function\") {\r\n handleRouteItem(routeItem, nodeSimple);\r\n }\r\n routeItems.push(routeItem);\r\n\r\n // 补充扩展信息\r\n uiMenuItem[menuExtendKey].routeName = routeName;\r\n uiMenuItem[menuExtendKey].keyPaths = keyPaths;\r\n\r\n nodeSimple[extendKey].routeName = routeName;\r\n nodeSimple[extendKey].keyPaths = keyPaths;\r\n }\r\n\r\n // 2.3 挂载到父级 UI 或根数组\r\n if (parentUi) {\r\n // 逻辑赋值,确保 children 数组存在\r\n (parentUi[menuChildrenKey] || (parentUi[menuChildrenKey] = [])).push(uiMenuItem);\r\n } else {\r\n if (typeof handleMenuItem === \"function\") {\r\n handleMenuItem(uiMenuItem, nodeSimple);\r\n }\r\n uiMenuItems.push(uiMenuItem);\r\n }\r\n\r\n // 执行节点钩子\r\n if (typeof handleNodeItem === \"function\") {\r\n handleNodeItem(nodeSimple);\r\n }\r\n }\r\n\r\n return { uiMenuItems, routeItems, nodeMap };\r\n}\r\n"],"names":[],"mappings":"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"}
|