@cloudcome/utils-core 1.19.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/array.cjs +181 -125
- package/dist/array.cjs.map +1 -1
- package/dist/array.mjs +181 -133
- package/dist/array.mjs.map +1 -1
- package/dist/async.cjs +181 -171
- package/dist/async.cjs.map +1 -1
- package/dist/async.mjs +181 -174
- package/dist/async.mjs.map +1 -1
- package/dist/base64.cjs +16 -12
- package/dist/base64.cjs.map +1 -1
- package/dist/base64.mjs +17 -14
- package/dist/base64.mjs.map +1 -1
- package/dist/cache.cjs +79 -67
- package/dist/cache.cjs.map +1 -1
- package/dist/cache.d.ts +3 -3
- package/dist/cache.mjs +80 -71
- package/dist/cache.mjs.map +1 -1
- package/dist/color.cjs +478 -167
- package/dist/color.cjs.map +1 -1
- package/dist/color.d.ts +3 -3
- package/dist/color.mjs +480 -197
- package/dist/color.mjs.map +1 -1
- package/dist/crypto.cjs +474 -687
- package/dist/crypto.cjs.map +1 -1
- package/dist/crypto.mjs +476 -693
- package/dist/crypto.mjs.map +1 -1
- package/dist/date.cjs +972 -161
- package/dist/date.cjs.map +1 -1
- package/dist/date.d.ts +2 -2
- package/dist/date.mjs +962 -191
- package/dist/date.mjs.map +1 -1
- package/dist/dict.cjs +90 -52
- package/dist/dict.cjs.map +1 -1
- package/dist/dict.d.ts +1 -1
- package/dist/dict.mjs +91 -54
- package/dist/dict.mjs.map +1 -1
- package/dist/easing.cjs +105 -103
- package/dist/easing.cjs.map +1 -1
- package/dist/easing.mjs +106 -133
- package/dist/easing.mjs.map +1 -1
- package/dist/emitter.cjs +101 -96
- package/dist/emitter.cjs.map +1 -1
- package/dist/emitter.mjs +101 -97
- package/dist/emitter.mjs.map +1 -1
- package/dist/env.cjs +43 -9
- package/dist/env.cjs.map +1 -1
- package/dist/env.d.ts +1 -1
- package/dist/env.mjs +43 -15
- package/dist/env.mjs.map +1 -1
- package/dist/error.cjs +26 -5
- package/dist/error.cjs.map +1 -1
- package/dist/error.mjs +26 -7
- package/dist/error.mjs.map +1 -1
- package/dist/exception.cjs +38 -20
- package/dist/exception.cjs.map +1 -1
- package/dist/exception.d.ts +5 -5
- package/dist/exception.mjs +38 -21
- package/dist/exception.mjs.map +1 -1
- package/dist/function.cjs +128 -68
- package/dist/function.cjs.map +1 -1
- package/dist/function.mjs +128 -72
- package/dist/function.mjs.map +1 -1
- package/dist/index.cjs +8 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +9 -5
- package/dist/index.mjs.map +1 -1
- package/dist/number.cjs +10 -14
- package/dist/number.mjs +2 -15
- package/dist/object/get-set.d.ts +27 -3
- package/dist/object/merge.d.ts +2 -2
- package/dist/object.cjs +369 -106
- package/dist/object.cjs.map +1 -1
- package/dist/object.mjs +366 -115
- package/dist/object.mjs.map +1 -1
- package/dist/path.cjs +144 -55
- package/dist/path.cjs.map +1 -1
- package/dist/path.mjs +144 -62
- package/dist/path.mjs.map +1 -1
- package/dist/promise.cjs +84 -43
- package/dist/promise.cjs.map +1 -1
- package/dist/promise.mjs +85 -50
- package/dist/promise.mjs.map +1 -1
- package/dist/qs.cjs +63 -39
- package/dist/qs.cjs.map +1 -1
- package/dist/qs.mjs +64 -42
- package/dist/qs.mjs.map +1 -1
- package/dist/regexp.cjs +118 -35
- package/dist/regexp.cjs.map +1 -1
- package/dist/regexp.mjs +119 -46
- package/dist/regexp.mjs.map +1 -1
- package/dist/string.cjs +12 -15
- package/dist/string.mjs +2 -16
- package/dist/string2.cjs +378 -142
- package/dist/string2.cjs.map +1 -1
- package/dist/string2.mjs +259 -143
- package/dist/string2.mjs.map +1 -1
- package/dist/time.cjs +136 -59
- package/dist/time.cjs.map +1 -1
- package/dist/time.mjs +136 -65
- package/dist/time.mjs.map +1 -1
- package/dist/timer.cjs +122 -112
- package/dist/timer.cjs.map +1 -1
- package/dist/timer.mjs +123 -115
- package/dist/timer.mjs.map +1 -1
- package/dist/tree.cjs +207 -112
- package/dist/tree.cjs.map +1 -1
- package/dist/tree.mjs +207 -116
- package/dist/tree.mjs.map +1 -1
- package/dist/try/curry.d.ts +1 -1
- package/dist/try.cjs +36 -37
- package/dist/try.cjs.map +1 -1
- package/dist/try.mjs +35 -37
- package/dist/try.mjs.map +1 -1
- package/dist/type.cjs +126 -24
- package/dist/type.cjs.map +1 -1
- package/dist/type.d.ts +2 -2
- package/dist/type.mjs +128 -45
- package/dist/type.mjs.map +1 -1
- package/dist/types.cjs +0 -2
- package/dist/types.d.ts +2 -2
- package/dist/types.mjs +0 -2
- package/dist/unique.cjs +41 -38
- package/dist/unique.cjs.map +1 -1
- package/dist/unique.mjs +42 -41
- package/dist/unique.mjs.map +1 -1
- package/dist/url.cjs +39 -30
- package/dist/url.cjs.map +1 -1
- package/dist/url.mjs +40 -33
- package/dist/url.mjs.map +1 -1
- package/dist/version.cjs +51 -33
- package/dist/version.cjs.map +1 -1
- package/dist/version.mjs +51 -35
- package/dist/version.mjs.map +1 -1
- package/package.json +104 -105
- package/dist/const.cjs +0 -14
- package/dist/const.cjs.map +0 -1
- package/dist/const.mjs +0 -15
- package/dist/const.mjs.map +0 -1
- package/dist/core.cjs +0 -362
- package/dist/core.cjs.map +0 -1
- package/dist/core.mjs +0 -363
- package/dist/core.mjs.map +0 -1
- package/dist/crypto/md5.d.mts +0 -1
- package/dist/crypto/sha1.d.mts +0 -1
- package/dist/crypto/sha256.d.mts +0 -1
- package/dist/crypto/sha512.d.mts +0 -1
- package/dist/each.cjs +0 -18
- package/dist/each.cjs.map +0 -1
- package/dist/each.mjs +0 -19
- package/dist/each.mjs.map +0 -1
- package/dist/merge.cjs +0 -87
- package/dist/merge.cjs.map +0 -1
- package/dist/merge.mjs +0 -88
- package/dist/merge.mjs.map +0 -1
- package/dist/number.cjs.map +0 -1
- package/dist/number.mjs.map +0 -1
- package/dist/string.cjs.map +0 -1
- package/dist/string.mjs.map +0 -1
- package/dist/types.cjs.map +0 -1
- package/dist/types.mjs.map +0 -1
package/dist/core.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"core.cjs","sources":["../src/date/timezone.ts","../src/date/core.ts"],"sourcesContent":["import { isNumber } from '../type';\nimport { dateFormat } from './core';\n\nexport type TimezoneDateOptions = {\n /**\n * 时间戳\n * @default Date.now()\n */\n timestamp?: number;\n\n /**\n * 日期值\n */\n value?: readonly [\n year?: number,\n month?: number,\n day?: number,\n hours?: number,\n minutes?: number,\n seconds?: number,\n milliseconds?: number,\n ];\n\n /**\n * UTC 时区,支持负数和小数,例如:\n * - 8 表示 UTC+8\n * - -12 表示 UTC-12\n * - 0 表示 UTC 时间\n * - 12.5 表示 UTC+12:30\n */\n utcOffset?: number;\n};\n\n/**\n * 时区偏移量毫秒常量(1分钟 = 60 * 1000 毫秒)\n */\nconst TIMEZONE_OFFSET_MS = 60 * 1000;\n\n/**\n * 时区日期类,用于处理不同时区的日期时间\n */\nexport class TimezoneDate {\n /**\n * 内部时间戳\n */\n #timestamp: number;\n\n /**\n * 目标时区的日期对象\n */\n #targetDate: Date;\n\n /**\n * UTC 日期对象\n */\n #utcDate: Date;\n\n /**\n * 本地时区偏移量(分钟)\n */\n #localTimezoneOffset = TimezoneDate.getTimezoneOffset();\n\n /**\n * 本地时区偏移量(毫秒)\n */\n #localTimezoneOffsetMS = this.#localTimezoneOffset * TIMEZONE_OFFSET_MS;\n\n /**\n * 目标时区偏移量(分钟)\n */\n #targetTimezoneOffset = 0;\n\n /**\n * 目标时区偏移量(毫秒)\n */\n #targetTimezoneOffsetMS = 0;\n\n /**\n * 构造函数选项\n */\n #options: TimezoneDateOptions;\n\n /**\n * 构造一个 TimezoneDate 实例\n * @param options - 配置选项\n */\n constructor(options?: TimezoneDateOptions | TimezoneDate) {\n this.#options =\n (options instanceof TimezoneDate\n ? {\n timestamp: options.getTime(),\n utcOffset: options.getUTCOffset(),\n }\n : options) || {};\n const { utcOffset, timestamp, value } = this.#options;\n this.#targetTimezoneOffset = isNumber(utcOffset)\n ? TimezoneDate.getTimezoneOffset(utcOffset)\n : this.#localTimezoneOffset;\n this.#targetTimezoneOffsetMS = this.#targetTimezoneOffset * TIMEZONE_OFFSET_MS;\n\n if (Array.isArray(value) && value.length > 0) {\n const [fullYear, month, day, hours, minutes, seconds, milliseconds] = value;\n const timestamp = Date.UTC(\n fullYear ?? 0,\n month ?? 0,\n day ?? 1,\n hours ?? 0,\n minutes ?? 0,\n seconds ?? 0,\n milliseconds ?? 0,\n );\n\n this.#timestamp = timestamp + this.#targetTimezoneOffsetMS;\n } else {\n this.#timestamp = timestamp || Date.now();\n }\n\n this.#targetDate = new Date(this.#timestamp + this.#localTimezoneOffsetMS - this.#targetTimezoneOffsetMS);\n this.#utcDate = new Date(this.#timestamp + this.#localTimezoneOffsetMS);\n }\n\n /**\n * 更新内部时间戳\n */\n #updateTimestamp() {\n this.#timestamp = this.#targetDate.getTime() + this.#targetTimezoneOffsetMS - this.#localTimezoneOffsetMS;\n this.#utcDate = new Date(this.#timestamp + this.#localTimezoneOffsetMS);\n }\n\n /**\n * 获取时区偏移量(分钟)\n * @returns 时区偏移量\n */\n getTimezoneOffset() {\n return this.#targetTimezoneOffset;\n }\n\n /**\n * 获取时区偏移量(UTC)\n * @returns 时区序号\n */\n getUTCOffset() {\n return TimezoneDate.getUTCOffset(this.#targetTimezoneOffset);\n }\n\n /**\n * 获取年份\n * @returns 年份\n */\n getFullYear() {\n return this.#targetDate.getFullYear();\n }\n\n /**\n * 获取月份\n * @returns 月份 (0-11)\n */\n getMonth() {\n return this.#targetDate.getMonth();\n }\n\n /**\n * 获取日期\n * @returns 日期 (1-31)\n */\n getDate() {\n return this.#targetDate.getDate();\n }\n\n /**\n * 获取小时\n * @returns 小时 (0-23)\n */\n getHours() {\n return this.#targetDate.getHours();\n }\n\n /**\n * 获取分钟\n * @returns 分钟 (0-59)\n */\n getMinutes() {\n return this.#targetDate.getMinutes();\n }\n\n /**\n * 获取秒数\n * @returns 秒数 (0-59)\n */\n getSeconds() {\n return this.#targetDate.getSeconds();\n }\n\n /**\n * 获取毫秒\n * @returns 毫秒 (0-999)\n */\n getMilliseconds() {\n return this.#targetDate.getMilliseconds();\n }\n\n /**\n * 设置年份\n * @param year - 年份\n * @param month - 月份\n * @param date - 日期\n * @returns 时间戳\n */\n setFullYear(year: number, month?: number, date?: number) {\n this.#targetDate.setFullYear(year);\n this.#updateTimestamp();\n\n if (isNumber(month)) this.setMonth(month);\n if (isNumber(date)) this.setDate(date);\n\n return this.getTime();\n }\n\n /**\n * 设置月份\n * @param month - 月份\n * @param date - 日期\n * @returns 时间戳\n */\n setMonth(month: number, date?: number) {\n this.#targetDate.setMonth(month);\n this.#updateTimestamp();\n\n if (isNumber(date)) this.setDate(date);\n\n return this.getTime();\n }\n\n /**\n * 设置日期\n * @param date - 日期\n * @returns 时间戳\n */\n setDate(date: number) {\n this.#targetDate.setDate(date);\n this.#updateTimestamp();\n\n return this.getTime();\n }\n\n /**\n * 设置小时\n * @param hours - 小时\n * @param minutes - 分钟\n * @param seconds - 秒数\n * @param milliseconds - 毫秒\n * @returns 时间戳\n */\n setHours(hours: number, minutes?: number, seconds?: number, milliseconds?: number) {\n this.#targetDate.setHours(hours);\n this.#updateTimestamp();\n\n if (isNumber(minutes)) this.setMinutes(minutes);\n if (isNumber(seconds)) this.setSeconds(seconds);\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n /**\n * 设置分钟\n * @param minutes - 分钟\n * @param seconds - 秒数\n * @param milliseconds - 毫秒\n * @returns 时间戳\n */\n setMinutes(minutes: number, seconds?: number, milliseconds?: number) {\n this.#targetDate.setMinutes(minutes);\n this.#updateTimestamp();\n\n if (isNumber(seconds)) this.setSeconds(seconds);\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n /**\n * 设置秒数\n * @param seconds - 秒数\n * @param milliseconds - 毫秒\n * @returns 时间戳\n */\n setSeconds(seconds: number, milliseconds?: number) {\n this.#targetDate.setSeconds(seconds);\n this.#updateTimestamp();\n\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n /**\n * 设置毫秒\n * @param milliseconds - 毫秒\n * @returns 时间戳\n */\n setMilliseconds(milliseconds: number) {\n this.#targetDate.setMilliseconds(milliseconds);\n this.#updateTimestamp();\n\n return this.getTime();\n }\n\n /**\n * 获取时间戳\n * @returns 时间戳\n */\n getTime() {\n return this.#timestamp;\n }\n\n /**\n * 获取星期几\n * @returns 星期几 (0-6, 0表示周日)\n */\n getDay() {\n return this.#targetDate.getDay();\n }\n\n /**\n * 转换为 ISO 格式的字符串\n * @returns ISO 格式的时间字符串\n */\n toISOString() {\n return dateFormat(this.#utcDate, 'YYYY-MM-DDTHH:mm:ss.SSSZ');\n }\n\n /**\n * 转换为指定时区的 TimezoneDate 对象\n * @param td - 需要转换的日期对象\n * @param offset - 目标时区分钟偏移量,默认为当前时区\n * @returns 返回一个 TimezoneDate 对象\n * @example\n * ```js\n * // 转换为 UTC 时间\n * const utc0Td = TimezoneDate.changeUtcOffset(new TimezoneDate(), 0);\n *\n * // 转换为东八区时间\n * const utc8Td = TimezoneDate.changeUtcOffset(new TimezoneDate(), 8);\n * ```\n */\n static changeUtcOffset(td: TimezoneDate, utcOffset: number) {\n return new TimezoneDate({\n utcOffset,\n timestamp: td.getTime(),\n });\n }\n\n /**\n * 获取时区分钟偏移量\n * @param utcOffset - 默认使用当前时区\n * @returns 时区分钟偏移量\n */\n static getTimezoneOffset(utcOffset?: number) {\n return isNumber(utcOffset) ? utcOffset * -60 : new Date().getTimezoneOffset();\n }\n\n /**\n * 获取时区序号\n * @param timezoneOffset - 默认使用当前时区分钟偏移量\n * @returns 时区序号\n */\n static getUTCOffset(timezoneOffset = TimezoneDate.getTimezoneOffset()) {\n return timezoneOffset / -60;\n }\n}\n","import { objectEach } from '@/object';\nimport { isDate, isString } from '@/type';\nimport { TimezoneDate } from './timezone';\n\n/**\n * 判断一个值是否为有效的日期对象\n * @param unknown - 需要判断的值\n * @returns 如果值是有效的日期对象则返回 true,否则返回 false\n * @example\n * ```typescript\n * isValidDate(new Date()); // true\n * isValidDate('2023-01-01'); // false\n * isValidDate(NaN); // false\n * ```\n */\nexport function isValidDate(unknown: unknown): unknown is Date | TimezoneDate {\n return (\n (unknown instanceof Date && !Number.isNaN(unknown.getTime())) ||\n (unknown instanceof TimezoneDate && !Number.isNaN(unknown.getTime()))\n );\n}\n\nexport type DateLike = Date | TimezoneDate;\nexport type DateValue = number | string | DateLike;\n\nfunction _guessDateSeparator(value: DateValue): Date | undefined {\n if (!isString(value)) return;\n\n const value2 = value.replace(/-/g, '/');\n\n return new Date(value2);\n}\n\nfunction _guessDateTimezone(value: DateValue): Date | undefined {\n if (!isString(value)) return;\n\n const re = /([+-])(\\d\\d)(\\d\\d)$/;\n\n const matches = re.exec(value);\n\n if (!matches) return;\n\n const value2 = value.replace(re, 'Z');\n const d = new Date(value2);\n\n if (!isValidDate(d)) return;\n\n const [, flag, hours, minutes] = matches;\n const hours2 = Number.parseInt(hours, 10);\n const minutes2 = Number.parseInt(minutes, 10);\n const offset = (a: number, b: number): number => (flag === '+' ? a - b : a + b);\n\n d.setHours(offset(d.getHours(), hours2));\n d.setMinutes(offset(d.getMinutes(), minutes2));\n\n return d;\n}\n\n/**\n * 解析为Date对象\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 解析后的 Date 对象\n * @throws {SyntaxError} 如果无法解析为有效的日期对象,则抛出错误\n * @example\n * ```typescript\n * dateParse('2023-01-01'); // Date对象\n * dateParse(1672531200000); // Date对象\n * dateParse(new Date()); // Date对象\n * dateParse('invalid date'); // 抛出 SyntaxError\n * ```\n */\nexport function dateParse(dateValue: DateValue): DateLike {\n // 传入的 Date 对象有 Date、TimezoneDate\n // @ts-ignore\n const d1 = isDate(dateValue)\n ? new Date(dateValue)\n : dateValue instanceof TimezoneDate\n ? new TimezoneDate(dateValue)\n : new Date(dateValue);\n if (isValidDate(d1)) return d1;\n\n // safari 浏览器的日期解析有问题\n // new Date('2020-06-26 18:06:15') 返回值是一个非法日期对象\n const d2 = _guessDateSeparator(dateValue);\n if (isValidDate(d2)) return d2;\n\n // safari 浏览器的日期解析有问题\n // new Date('2020-06-26T18:06:15.000+0800') 返回值是一个非法日期对象\n const d3 = _guessDateTimezone(dateValue);\n if (isValidDate(d3)) return d3;\n\n throw new SyntaxError(`${dateValue.toString()} 不是一个合法的日期值`);\n}\n\nfunction _pad(num: number, len = 2) {\n return `${num}`.padStart(len, '0');\n}\n\nconst rules: [RegExp, (date: DateLike) => number | string][] = [\n [/Y{4}/gi, (date) => date.getFullYear()],\n [/Y{2}/gi, (date) => date.getFullYear() % 100],\n [/M{2}/g, (date) => _pad(date.getMonth() + 1)],\n [/M{1}/g, (date) => date.getMonth() + 1],\n [/D{2}/gi, (date) => _pad(date.getDate())],\n [/D{1}/gi, (date) => date.getDate()],\n [/H{2}/g, (date) => _pad(date.getHours())],\n [/H{1}/g, (date) => date.getHours()],\n [\n /h{2}/g,\n (date) => {\n const h = date.getHours();\n return _pad(h === 0 ? 12 : h > 12 ? h - 12 : h);\n },\n ],\n [\n /h{1}/g,\n (date) => {\n const h = date.getHours();\n return h === 0 ? 12 : h > 12 ? h - 12 : h;\n },\n ],\n [/m{2}/g, (date) => _pad(date.getMinutes())],\n [/m{1}/g, (date) => date.getMinutes()],\n [/s{2}/g, (date) => _pad(date.getSeconds())],\n [/s{1}/g, (date) => date.getSeconds()],\n [/S{3}/g, (date) => _pad(date.getMilliseconds(), 3)],\n [/S{2}/g, (date) => _pad(date.getMilliseconds(), 2)],\n [/S{1}/g, (date) => date.getMilliseconds()],\n];\n\n/**\n * 格式化为日期字符串(带自定义格式化模板)\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param format - 模板,默认是 'YYYY-MM-DD HH:mm:ss',模板字符:\n * - YYYY:年\n * - yyyy: 年\n * - MM:月\n * - DD:日\n * - dd: 日\n * - HH:时(24 小时制)\n * - hh:时(12 小时制)\n * - mm:分\n * - ss:秒\n * - SSS:毫秒\n * @returns 格式化后的日期字符串\n * @example\n * ```typescript\n * dateFormat(new Date(), 'YYYY-MM-DD'); // '2023-01-01'\n * dateFormat(1672531200000, 'YYYY/MM/DD HH:mm:ss'); // '2023/01/01 00:00:00'\n * dateFormat('2023-01-01', 'YYYY年MM月DD日'); // '2023年01月01日'\n * ```\n */\nexport function dateFormat(dateValue: DateValue, format = 'YYYY-MM-DD HH:mm:ss'): string {\n const date = dateParse(dateValue);\n let result = format;\n\n for (const rule of rules) {\n result = result.replace(rule[0], String(rule[1](date)));\n }\n\n return result;\n}\n"],"names":["isNumber","timestamp","isString","isDate"],"mappings":"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"}
|
package/dist/core.mjs
DELETED
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
import { isNumber, isDate, isString } from "./type.mjs";
|
|
2
|
-
const TIMEZONE_OFFSET_MS = 60 * 1e3;
|
|
3
|
-
class TimezoneDate {
|
|
4
|
-
/**
|
|
5
|
-
* 内部时间戳
|
|
6
|
-
*/
|
|
7
|
-
#timestamp;
|
|
8
|
-
/**
|
|
9
|
-
* 目标时区的日期对象
|
|
10
|
-
*/
|
|
11
|
-
#targetDate;
|
|
12
|
-
/**
|
|
13
|
-
* UTC 日期对象
|
|
14
|
-
*/
|
|
15
|
-
#utcDate;
|
|
16
|
-
/**
|
|
17
|
-
* 本地时区偏移量(分钟)
|
|
18
|
-
*/
|
|
19
|
-
#localTimezoneOffset = TimezoneDate.getTimezoneOffset();
|
|
20
|
-
/**
|
|
21
|
-
* 本地时区偏移量(毫秒)
|
|
22
|
-
*/
|
|
23
|
-
#localTimezoneOffsetMS = this.#localTimezoneOffset * TIMEZONE_OFFSET_MS;
|
|
24
|
-
/**
|
|
25
|
-
* 目标时区偏移量(分钟)
|
|
26
|
-
*/
|
|
27
|
-
#targetTimezoneOffset = 0;
|
|
28
|
-
/**
|
|
29
|
-
* 目标时区偏移量(毫秒)
|
|
30
|
-
*/
|
|
31
|
-
#targetTimezoneOffsetMS = 0;
|
|
32
|
-
/**
|
|
33
|
-
* 构造函数选项
|
|
34
|
-
*/
|
|
35
|
-
#options;
|
|
36
|
-
/**
|
|
37
|
-
* 构造一个 TimezoneDate 实例
|
|
38
|
-
* @param options - 配置选项
|
|
39
|
-
*/
|
|
40
|
-
constructor(options) {
|
|
41
|
-
this.#options = (options instanceof TimezoneDate ? {
|
|
42
|
-
timestamp: options.getTime(),
|
|
43
|
-
utcOffset: options.getUTCOffset()
|
|
44
|
-
} : options) || {};
|
|
45
|
-
const { utcOffset, timestamp, value } = this.#options;
|
|
46
|
-
this.#targetTimezoneOffset = isNumber(utcOffset) ? TimezoneDate.getTimezoneOffset(utcOffset) : this.#localTimezoneOffset;
|
|
47
|
-
this.#targetTimezoneOffsetMS = this.#targetTimezoneOffset * TIMEZONE_OFFSET_MS;
|
|
48
|
-
if (Array.isArray(value) && value.length > 0) {
|
|
49
|
-
const [fullYear, month, day, hours, minutes, seconds, milliseconds] = value;
|
|
50
|
-
const timestamp2 = Date.UTC(
|
|
51
|
-
fullYear ?? 0,
|
|
52
|
-
month ?? 0,
|
|
53
|
-
day ?? 1,
|
|
54
|
-
hours ?? 0,
|
|
55
|
-
minutes ?? 0,
|
|
56
|
-
seconds ?? 0,
|
|
57
|
-
milliseconds ?? 0
|
|
58
|
-
);
|
|
59
|
-
this.#timestamp = timestamp2 + this.#targetTimezoneOffsetMS;
|
|
60
|
-
} else {
|
|
61
|
-
this.#timestamp = timestamp || Date.now();
|
|
62
|
-
}
|
|
63
|
-
this.#targetDate = new Date(this.#timestamp + this.#localTimezoneOffsetMS - this.#targetTimezoneOffsetMS);
|
|
64
|
-
this.#utcDate = new Date(this.#timestamp + this.#localTimezoneOffsetMS);
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* 更新内部时间戳
|
|
68
|
-
*/
|
|
69
|
-
#updateTimestamp() {
|
|
70
|
-
this.#timestamp = this.#targetDate.getTime() + this.#targetTimezoneOffsetMS - this.#localTimezoneOffsetMS;
|
|
71
|
-
this.#utcDate = new Date(this.#timestamp + this.#localTimezoneOffsetMS);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* 获取时区偏移量(分钟)
|
|
75
|
-
* @returns 时区偏移量
|
|
76
|
-
*/
|
|
77
|
-
getTimezoneOffset() {
|
|
78
|
-
return this.#targetTimezoneOffset;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* 获取时区偏移量(UTC)
|
|
82
|
-
* @returns 时区序号
|
|
83
|
-
*/
|
|
84
|
-
getUTCOffset() {
|
|
85
|
-
return TimezoneDate.getUTCOffset(this.#targetTimezoneOffset);
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* 获取年份
|
|
89
|
-
* @returns 年份
|
|
90
|
-
*/
|
|
91
|
-
getFullYear() {
|
|
92
|
-
return this.#targetDate.getFullYear();
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* 获取月份
|
|
96
|
-
* @returns 月份 (0-11)
|
|
97
|
-
*/
|
|
98
|
-
getMonth() {
|
|
99
|
-
return this.#targetDate.getMonth();
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* 获取日期
|
|
103
|
-
* @returns 日期 (1-31)
|
|
104
|
-
*/
|
|
105
|
-
getDate() {
|
|
106
|
-
return this.#targetDate.getDate();
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* 获取小时
|
|
110
|
-
* @returns 小时 (0-23)
|
|
111
|
-
*/
|
|
112
|
-
getHours() {
|
|
113
|
-
return this.#targetDate.getHours();
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* 获取分钟
|
|
117
|
-
* @returns 分钟 (0-59)
|
|
118
|
-
*/
|
|
119
|
-
getMinutes() {
|
|
120
|
-
return this.#targetDate.getMinutes();
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* 获取秒数
|
|
124
|
-
* @returns 秒数 (0-59)
|
|
125
|
-
*/
|
|
126
|
-
getSeconds() {
|
|
127
|
-
return this.#targetDate.getSeconds();
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* 获取毫秒
|
|
131
|
-
* @returns 毫秒 (0-999)
|
|
132
|
-
*/
|
|
133
|
-
getMilliseconds() {
|
|
134
|
-
return this.#targetDate.getMilliseconds();
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* 设置年份
|
|
138
|
-
* @param year - 年份
|
|
139
|
-
* @param month - 月份
|
|
140
|
-
* @param date - 日期
|
|
141
|
-
* @returns 时间戳
|
|
142
|
-
*/
|
|
143
|
-
setFullYear(year, month, date) {
|
|
144
|
-
this.#targetDate.setFullYear(year);
|
|
145
|
-
this.#updateTimestamp();
|
|
146
|
-
if (isNumber(month)) this.setMonth(month);
|
|
147
|
-
if (isNumber(date)) this.setDate(date);
|
|
148
|
-
return this.getTime();
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* 设置月份
|
|
152
|
-
* @param month - 月份
|
|
153
|
-
* @param date - 日期
|
|
154
|
-
* @returns 时间戳
|
|
155
|
-
*/
|
|
156
|
-
setMonth(month, date) {
|
|
157
|
-
this.#targetDate.setMonth(month);
|
|
158
|
-
this.#updateTimestamp();
|
|
159
|
-
if (isNumber(date)) this.setDate(date);
|
|
160
|
-
return this.getTime();
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* 设置日期
|
|
164
|
-
* @param date - 日期
|
|
165
|
-
* @returns 时间戳
|
|
166
|
-
*/
|
|
167
|
-
setDate(date) {
|
|
168
|
-
this.#targetDate.setDate(date);
|
|
169
|
-
this.#updateTimestamp();
|
|
170
|
-
return this.getTime();
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* 设置小时
|
|
174
|
-
* @param hours - 小时
|
|
175
|
-
* @param minutes - 分钟
|
|
176
|
-
* @param seconds - 秒数
|
|
177
|
-
* @param milliseconds - 毫秒
|
|
178
|
-
* @returns 时间戳
|
|
179
|
-
*/
|
|
180
|
-
setHours(hours, minutes, seconds, milliseconds) {
|
|
181
|
-
this.#targetDate.setHours(hours);
|
|
182
|
-
this.#updateTimestamp();
|
|
183
|
-
if (isNumber(minutes)) this.setMinutes(minutes);
|
|
184
|
-
if (isNumber(seconds)) this.setSeconds(seconds);
|
|
185
|
-
if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
186
|
-
return this.getTime();
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* 设置分钟
|
|
190
|
-
* @param minutes - 分钟
|
|
191
|
-
* @param seconds - 秒数
|
|
192
|
-
* @param milliseconds - 毫秒
|
|
193
|
-
* @returns 时间戳
|
|
194
|
-
*/
|
|
195
|
-
setMinutes(minutes, seconds, milliseconds) {
|
|
196
|
-
this.#targetDate.setMinutes(minutes);
|
|
197
|
-
this.#updateTimestamp();
|
|
198
|
-
if (isNumber(seconds)) this.setSeconds(seconds);
|
|
199
|
-
if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
200
|
-
return this.getTime();
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* 设置秒数
|
|
204
|
-
* @param seconds - 秒数
|
|
205
|
-
* @param milliseconds - 毫秒
|
|
206
|
-
* @returns 时间戳
|
|
207
|
-
*/
|
|
208
|
-
setSeconds(seconds, milliseconds) {
|
|
209
|
-
this.#targetDate.setSeconds(seconds);
|
|
210
|
-
this.#updateTimestamp();
|
|
211
|
-
if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
212
|
-
return this.getTime();
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* 设置毫秒
|
|
216
|
-
* @param milliseconds - 毫秒
|
|
217
|
-
* @returns 时间戳
|
|
218
|
-
*/
|
|
219
|
-
setMilliseconds(milliseconds) {
|
|
220
|
-
this.#targetDate.setMilliseconds(milliseconds);
|
|
221
|
-
this.#updateTimestamp();
|
|
222
|
-
return this.getTime();
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* 获取时间戳
|
|
226
|
-
* @returns 时间戳
|
|
227
|
-
*/
|
|
228
|
-
getTime() {
|
|
229
|
-
return this.#timestamp;
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* 获取星期几
|
|
233
|
-
* @returns 星期几 (0-6, 0表示周日)
|
|
234
|
-
*/
|
|
235
|
-
getDay() {
|
|
236
|
-
return this.#targetDate.getDay();
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* 转换为 ISO 格式的字符串
|
|
240
|
-
* @returns ISO 格式的时间字符串
|
|
241
|
-
*/
|
|
242
|
-
toISOString() {
|
|
243
|
-
return dateFormat(this.#utcDate, "YYYY-MM-DDTHH:mm:ss.SSSZ");
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* 转换为指定时区的 TimezoneDate 对象
|
|
247
|
-
* @param td - 需要转换的日期对象
|
|
248
|
-
* @param offset - 目标时区分钟偏移量,默认为当前时区
|
|
249
|
-
* @returns 返回一个 TimezoneDate 对象
|
|
250
|
-
* @example
|
|
251
|
-
* ```js
|
|
252
|
-
* // 转换为 UTC 时间
|
|
253
|
-
* const utc0Td = TimezoneDate.changeUtcOffset(new TimezoneDate(), 0);
|
|
254
|
-
*
|
|
255
|
-
* // 转换为东八区时间
|
|
256
|
-
* const utc8Td = TimezoneDate.changeUtcOffset(new TimezoneDate(), 8);
|
|
257
|
-
* ```
|
|
258
|
-
*/
|
|
259
|
-
static changeUtcOffset(td, utcOffset) {
|
|
260
|
-
return new TimezoneDate({
|
|
261
|
-
utcOffset,
|
|
262
|
-
timestamp: td.getTime()
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* 获取时区分钟偏移量
|
|
267
|
-
* @param utcOffset - 默认使用当前时区
|
|
268
|
-
* @returns 时区分钟偏移量
|
|
269
|
-
*/
|
|
270
|
-
static getTimezoneOffset(utcOffset) {
|
|
271
|
-
return isNumber(utcOffset) ? utcOffset * -60 : (/* @__PURE__ */ new Date()).getTimezoneOffset();
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* 获取时区序号
|
|
275
|
-
* @param timezoneOffset - 默认使用当前时区分钟偏移量
|
|
276
|
-
* @returns 时区序号
|
|
277
|
-
*/
|
|
278
|
-
static getUTCOffset(timezoneOffset = TimezoneDate.getTimezoneOffset()) {
|
|
279
|
-
return timezoneOffset / -60;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
function isValidDate(unknown) {
|
|
283
|
-
return unknown instanceof Date && !Number.isNaN(unknown.getTime()) || unknown instanceof TimezoneDate && !Number.isNaN(unknown.getTime());
|
|
284
|
-
}
|
|
285
|
-
function _guessDateSeparator(value) {
|
|
286
|
-
if (!isString(value)) return;
|
|
287
|
-
const value2 = value.replace(/-/g, "/");
|
|
288
|
-
return new Date(value2);
|
|
289
|
-
}
|
|
290
|
-
function _guessDateTimezone(value) {
|
|
291
|
-
if (!isString(value)) return;
|
|
292
|
-
const re = /([+-])(\d\d)(\d\d)$/;
|
|
293
|
-
const matches = re.exec(value);
|
|
294
|
-
if (!matches) return;
|
|
295
|
-
const value2 = value.replace(re, "Z");
|
|
296
|
-
const d = new Date(value2);
|
|
297
|
-
if (!isValidDate(d)) return;
|
|
298
|
-
const [, flag, hours, minutes] = matches;
|
|
299
|
-
const hours2 = Number.parseInt(hours, 10);
|
|
300
|
-
const minutes2 = Number.parseInt(minutes, 10);
|
|
301
|
-
const offset = (a, b) => flag === "+" ? a - b : a + b;
|
|
302
|
-
d.setHours(offset(d.getHours(), hours2));
|
|
303
|
-
d.setMinutes(offset(d.getMinutes(), minutes2));
|
|
304
|
-
return d;
|
|
305
|
-
}
|
|
306
|
-
function dateParse(dateValue) {
|
|
307
|
-
const d1 = isDate(dateValue) ? new Date(dateValue) : dateValue instanceof TimezoneDate ? new TimezoneDate(dateValue) : new Date(dateValue);
|
|
308
|
-
if (isValidDate(d1)) return d1;
|
|
309
|
-
const d2 = _guessDateSeparator(dateValue);
|
|
310
|
-
if (isValidDate(d2)) return d2;
|
|
311
|
-
const d3 = _guessDateTimezone(dateValue);
|
|
312
|
-
if (isValidDate(d3)) return d3;
|
|
313
|
-
throw new SyntaxError(`${dateValue.toString()} 不是一个合法的日期值`);
|
|
314
|
-
}
|
|
315
|
-
function _pad(num, len = 2) {
|
|
316
|
-
return `${num}`.padStart(len, "0");
|
|
317
|
-
}
|
|
318
|
-
const rules = [
|
|
319
|
-
[/Y{4}/gi, (date) => date.getFullYear()],
|
|
320
|
-
[/Y{2}/gi, (date) => date.getFullYear() % 100],
|
|
321
|
-
[/M{2}/g, (date) => _pad(date.getMonth() + 1)],
|
|
322
|
-
[/M{1}/g, (date) => date.getMonth() + 1],
|
|
323
|
-
[/D{2}/gi, (date) => _pad(date.getDate())],
|
|
324
|
-
[/D{1}/gi, (date) => date.getDate()],
|
|
325
|
-
[/H{2}/g, (date) => _pad(date.getHours())],
|
|
326
|
-
[/H{1}/g, (date) => date.getHours()],
|
|
327
|
-
[
|
|
328
|
-
/h{2}/g,
|
|
329
|
-
(date) => {
|
|
330
|
-
const h = date.getHours();
|
|
331
|
-
return _pad(h === 0 ? 12 : h > 12 ? h - 12 : h);
|
|
332
|
-
}
|
|
333
|
-
],
|
|
334
|
-
[
|
|
335
|
-
/h{1}/g,
|
|
336
|
-
(date) => {
|
|
337
|
-
const h = date.getHours();
|
|
338
|
-
return h === 0 ? 12 : h > 12 ? h - 12 : h;
|
|
339
|
-
}
|
|
340
|
-
],
|
|
341
|
-
[/m{2}/g, (date) => _pad(date.getMinutes())],
|
|
342
|
-
[/m{1}/g, (date) => date.getMinutes()],
|
|
343
|
-
[/s{2}/g, (date) => _pad(date.getSeconds())],
|
|
344
|
-
[/s{1}/g, (date) => date.getSeconds()],
|
|
345
|
-
[/S{3}/g, (date) => _pad(date.getMilliseconds(), 3)],
|
|
346
|
-
[/S{2}/g, (date) => _pad(date.getMilliseconds(), 2)],
|
|
347
|
-
[/S{1}/g, (date) => date.getMilliseconds()]
|
|
348
|
-
];
|
|
349
|
-
function dateFormat(dateValue, format = "YYYY-MM-DD HH:mm:ss") {
|
|
350
|
-
const date = dateParse(dateValue);
|
|
351
|
-
let result = format;
|
|
352
|
-
for (const rule of rules) {
|
|
353
|
-
result = result.replace(rule[0], String(rule[1](date)));
|
|
354
|
-
}
|
|
355
|
-
return result;
|
|
356
|
-
}
|
|
357
|
-
export {
|
|
358
|
-
TimezoneDate as T,
|
|
359
|
-
dateFormat as a,
|
|
360
|
-
dateParse as d,
|
|
361
|
-
isValidDate as i
|
|
362
|
-
};
|
|
363
|
-
//# sourceMappingURL=core.mjs.map
|
package/dist/core.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"core.mjs","sources":["../src/date/timezone.ts","../src/date/core.ts"],"sourcesContent":["import { isNumber } from '../type';\nimport { dateFormat } from './core';\n\nexport type TimezoneDateOptions = {\n /**\n * 时间戳\n * @default Date.now()\n */\n timestamp?: number;\n\n /**\n * 日期值\n */\n value?: readonly [\n year?: number,\n month?: number,\n day?: number,\n hours?: number,\n minutes?: number,\n seconds?: number,\n milliseconds?: number,\n ];\n\n /**\n * UTC 时区,支持负数和小数,例如:\n * - 8 表示 UTC+8\n * - -12 表示 UTC-12\n * - 0 表示 UTC 时间\n * - 12.5 表示 UTC+12:30\n */\n utcOffset?: number;\n};\n\n/**\n * 时区偏移量毫秒常量(1分钟 = 60 * 1000 毫秒)\n */\nconst TIMEZONE_OFFSET_MS = 60 * 1000;\n\n/**\n * 时区日期类,用于处理不同时区的日期时间\n */\nexport class TimezoneDate {\n /**\n * 内部时间戳\n */\n #timestamp: number;\n\n /**\n * 目标时区的日期对象\n */\n #targetDate: Date;\n\n /**\n * UTC 日期对象\n */\n #utcDate: Date;\n\n /**\n * 本地时区偏移量(分钟)\n */\n #localTimezoneOffset = TimezoneDate.getTimezoneOffset();\n\n /**\n * 本地时区偏移量(毫秒)\n */\n #localTimezoneOffsetMS = this.#localTimezoneOffset * TIMEZONE_OFFSET_MS;\n\n /**\n * 目标时区偏移量(分钟)\n */\n #targetTimezoneOffset = 0;\n\n /**\n * 目标时区偏移量(毫秒)\n */\n #targetTimezoneOffsetMS = 0;\n\n /**\n * 构造函数选项\n */\n #options: TimezoneDateOptions;\n\n /**\n * 构造一个 TimezoneDate 实例\n * @param options - 配置选项\n */\n constructor(options?: TimezoneDateOptions | TimezoneDate) {\n this.#options =\n (options instanceof TimezoneDate\n ? {\n timestamp: options.getTime(),\n utcOffset: options.getUTCOffset(),\n }\n : options) || {};\n const { utcOffset, timestamp, value } = this.#options;\n this.#targetTimezoneOffset = isNumber(utcOffset)\n ? TimezoneDate.getTimezoneOffset(utcOffset)\n : this.#localTimezoneOffset;\n this.#targetTimezoneOffsetMS = this.#targetTimezoneOffset * TIMEZONE_OFFSET_MS;\n\n if (Array.isArray(value) && value.length > 0) {\n const [fullYear, month, day, hours, minutes, seconds, milliseconds] = value;\n const timestamp = Date.UTC(\n fullYear ?? 0,\n month ?? 0,\n day ?? 1,\n hours ?? 0,\n minutes ?? 0,\n seconds ?? 0,\n milliseconds ?? 0,\n );\n\n this.#timestamp = timestamp + this.#targetTimezoneOffsetMS;\n } else {\n this.#timestamp = timestamp || Date.now();\n }\n\n this.#targetDate = new Date(this.#timestamp + this.#localTimezoneOffsetMS - this.#targetTimezoneOffsetMS);\n this.#utcDate = new Date(this.#timestamp + this.#localTimezoneOffsetMS);\n }\n\n /**\n * 更新内部时间戳\n */\n #updateTimestamp() {\n this.#timestamp = this.#targetDate.getTime() + this.#targetTimezoneOffsetMS - this.#localTimezoneOffsetMS;\n this.#utcDate = new Date(this.#timestamp + this.#localTimezoneOffsetMS);\n }\n\n /**\n * 获取时区偏移量(分钟)\n * @returns 时区偏移量\n */\n getTimezoneOffset() {\n return this.#targetTimezoneOffset;\n }\n\n /**\n * 获取时区偏移量(UTC)\n * @returns 时区序号\n */\n getUTCOffset() {\n return TimezoneDate.getUTCOffset(this.#targetTimezoneOffset);\n }\n\n /**\n * 获取年份\n * @returns 年份\n */\n getFullYear() {\n return this.#targetDate.getFullYear();\n }\n\n /**\n * 获取月份\n * @returns 月份 (0-11)\n */\n getMonth() {\n return this.#targetDate.getMonth();\n }\n\n /**\n * 获取日期\n * @returns 日期 (1-31)\n */\n getDate() {\n return this.#targetDate.getDate();\n }\n\n /**\n * 获取小时\n * @returns 小时 (0-23)\n */\n getHours() {\n return this.#targetDate.getHours();\n }\n\n /**\n * 获取分钟\n * @returns 分钟 (0-59)\n */\n getMinutes() {\n return this.#targetDate.getMinutes();\n }\n\n /**\n * 获取秒数\n * @returns 秒数 (0-59)\n */\n getSeconds() {\n return this.#targetDate.getSeconds();\n }\n\n /**\n * 获取毫秒\n * @returns 毫秒 (0-999)\n */\n getMilliseconds() {\n return this.#targetDate.getMilliseconds();\n }\n\n /**\n * 设置年份\n * @param year - 年份\n * @param month - 月份\n * @param date - 日期\n * @returns 时间戳\n */\n setFullYear(year: number, month?: number, date?: number) {\n this.#targetDate.setFullYear(year);\n this.#updateTimestamp();\n\n if (isNumber(month)) this.setMonth(month);\n if (isNumber(date)) this.setDate(date);\n\n return this.getTime();\n }\n\n /**\n * 设置月份\n * @param month - 月份\n * @param date - 日期\n * @returns 时间戳\n */\n setMonth(month: number, date?: number) {\n this.#targetDate.setMonth(month);\n this.#updateTimestamp();\n\n if (isNumber(date)) this.setDate(date);\n\n return this.getTime();\n }\n\n /**\n * 设置日期\n * @param date - 日期\n * @returns 时间戳\n */\n setDate(date: number) {\n this.#targetDate.setDate(date);\n this.#updateTimestamp();\n\n return this.getTime();\n }\n\n /**\n * 设置小时\n * @param hours - 小时\n * @param minutes - 分钟\n * @param seconds - 秒数\n * @param milliseconds - 毫秒\n * @returns 时间戳\n */\n setHours(hours: number, minutes?: number, seconds?: number, milliseconds?: number) {\n this.#targetDate.setHours(hours);\n this.#updateTimestamp();\n\n if (isNumber(minutes)) this.setMinutes(minutes);\n if (isNumber(seconds)) this.setSeconds(seconds);\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n /**\n * 设置分钟\n * @param minutes - 分钟\n * @param seconds - 秒数\n * @param milliseconds - 毫秒\n * @returns 时间戳\n */\n setMinutes(minutes: number, seconds?: number, milliseconds?: number) {\n this.#targetDate.setMinutes(minutes);\n this.#updateTimestamp();\n\n if (isNumber(seconds)) this.setSeconds(seconds);\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n /**\n * 设置秒数\n * @param seconds - 秒数\n * @param milliseconds - 毫秒\n * @returns 时间戳\n */\n setSeconds(seconds: number, milliseconds?: number) {\n this.#targetDate.setSeconds(seconds);\n this.#updateTimestamp();\n\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n /**\n * 设置毫秒\n * @param milliseconds - 毫秒\n * @returns 时间戳\n */\n setMilliseconds(milliseconds: number) {\n this.#targetDate.setMilliseconds(milliseconds);\n this.#updateTimestamp();\n\n return this.getTime();\n }\n\n /**\n * 获取时间戳\n * @returns 时间戳\n */\n getTime() {\n return this.#timestamp;\n }\n\n /**\n * 获取星期几\n * @returns 星期几 (0-6, 0表示周日)\n */\n getDay() {\n return this.#targetDate.getDay();\n }\n\n /**\n * 转换为 ISO 格式的字符串\n * @returns ISO 格式的时间字符串\n */\n toISOString() {\n return dateFormat(this.#utcDate, 'YYYY-MM-DDTHH:mm:ss.SSSZ');\n }\n\n /**\n * 转换为指定时区的 TimezoneDate 对象\n * @param td - 需要转换的日期对象\n * @param offset - 目标时区分钟偏移量,默认为当前时区\n * @returns 返回一个 TimezoneDate 对象\n * @example\n * ```js\n * // 转换为 UTC 时间\n * const utc0Td = TimezoneDate.changeUtcOffset(new TimezoneDate(), 0);\n *\n * // 转换为东八区时间\n * const utc8Td = TimezoneDate.changeUtcOffset(new TimezoneDate(), 8);\n * ```\n */\n static changeUtcOffset(td: TimezoneDate, utcOffset: number) {\n return new TimezoneDate({\n utcOffset,\n timestamp: td.getTime(),\n });\n }\n\n /**\n * 获取时区分钟偏移量\n * @param utcOffset - 默认使用当前时区\n * @returns 时区分钟偏移量\n */\n static getTimezoneOffset(utcOffset?: number) {\n return isNumber(utcOffset) ? utcOffset * -60 : new Date().getTimezoneOffset();\n }\n\n /**\n * 获取时区序号\n * @param timezoneOffset - 默认使用当前时区分钟偏移量\n * @returns 时区序号\n */\n static getUTCOffset(timezoneOffset = TimezoneDate.getTimezoneOffset()) {\n return timezoneOffset / -60;\n }\n}\n","import { objectEach } from '@/object';\nimport { isDate, isString } from '@/type';\nimport { TimezoneDate } from './timezone';\n\n/**\n * 判断一个值是否为有效的日期对象\n * @param unknown - 需要判断的值\n * @returns 如果值是有效的日期对象则返回 true,否则返回 false\n * @example\n * ```typescript\n * isValidDate(new Date()); // true\n * isValidDate('2023-01-01'); // false\n * isValidDate(NaN); // false\n * ```\n */\nexport function isValidDate(unknown: unknown): unknown is Date | TimezoneDate {\n return (\n (unknown instanceof Date && !Number.isNaN(unknown.getTime())) ||\n (unknown instanceof TimezoneDate && !Number.isNaN(unknown.getTime()))\n );\n}\n\nexport type DateLike = Date | TimezoneDate;\nexport type DateValue = number | string | DateLike;\n\nfunction _guessDateSeparator(value: DateValue): Date | undefined {\n if (!isString(value)) return;\n\n const value2 = value.replace(/-/g, '/');\n\n return new Date(value2);\n}\n\nfunction _guessDateTimezone(value: DateValue): Date | undefined {\n if (!isString(value)) return;\n\n const re = /([+-])(\\d\\d)(\\d\\d)$/;\n\n const matches = re.exec(value);\n\n if (!matches) return;\n\n const value2 = value.replace(re, 'Z');\n const d = new Date(value2);\n\n if (!isValidDate(d)) return;\n\n const [, flag, hours, minutes] = matches;\n const hours2 = Number.parseInt(hours, 10);\n const minutes2 = Number.parseInt(minutes, 10);\n const offset = (a: number, b: number): number => (flag === '+' ? a - b : a + b);\n\n d.setHours(offset(d.getHours(), hours2));\n d.setMinutes(offset(d.getMinutes(), minutes2));\n\n return d;\n}\n\n/**\n * 解析为Date对象\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 解析后的 Date 对象\n * @throws {SyntaxError} 如果无法解析为有效的日期对象,则抛出错误\n * @example\n * ```typescript\n * dateParse('2023-01-01'); // Date对象\n * dateParse(1672531200000); // Date对象\n * dateParse(new Date()); // Date对象\n * dateParse('invalid date'); // 抛出 SyntaxError\n * ```\n */\nexport function dateParse(dateValue: DateValue): DateLike {\n // 传入的 Date 对象有 Date、TimezoneDate\n // @ts-ignore\n const d1 = isDate(dateValue)\n ? new Date(dateValue)\n : dateValue instanceof TimezoneDate\n ? new TimezoneDate(dateValue)\n : new Date(dateValue);\n if (isValidDate(d1)) return d1;\n\n // safari 浏览器的日期解析有问题\n // new Date('2020-06-26 18:06:15') 返回值是一个非法日期对象\n const d2 = _guessDateSeparator(dateValue);\n if (isValidDate(d2)) return d2;\n\n // safari 浏览器的日期解析有问题\n // new Date('2020-06-26T18:06:15.000+0800') 返回值是一个非法日期对象\n const d3 = _guessDateTimezone(dateValue);\n if (isValidDate(d3)) return d3;\n\n throw new SyntaxError(`${dateValue.toString()} 不是一个合法的日期值`);\n}\n\nfunction _pad(num: number, len = 2) {\n return `${num}`.padStart(len, '0');\n}\n\nconst rules: [RegExp, (date: DateLike) => number | string][] = [\n [/Y{4}/gi, (date) => date.getFullYear()],\n [/Y{2}/gi, (date) => date.getFullYear() % 100],\n [/M{2}/g, (date) => _pad(date.getMonth() + 1)],\n [/M{1}/g, (date) => date.getMonth() + 1],\n [/D{2}/gi, (date) => _pad(date.getDate())],\n [/D{1}/gi, (date) => date.getDate()],\n [/H{2}/g, (date) => _pad(date.getHours())],\n [/H{1}/g, (date) => date.getHours()],\n [\n /h{2}/g,\n (date) => {\n const h = date.getHours();\n return _pad(h === 0 ? 12 : h > 12 ? h - 12 : h);\n },\n ],\n [\n /h{1}/g,\n (date) => {\n const h = date.getHours();\n return h === 0 ? 12 : h > 12 ? h - 12 : h;\n },\n ],\n [/m{2}/g, (date) => _pad(date.getMinutes())],\n [/m{1}/g, (date) => date.getMinutes()],\n [/s{2}/g, (date) => _pad(date.getSeconds())],\n [/s{1}/g, (date) => date.getSeconds()],\n [/S{3}/g, (date) => _pad(date.getMilliseconds(), 3)],\n [/S{2}/g, (date) => _pad(date.getMilliseconds(), 2)],\n [/S{1}/g, (date) => date.getMilliseconds()],\n];\n\n/**\n * 格式化为日期字符串(带自定义格式化模板)\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param format - 模板,默认是 'YYYY-MM-DD HH:mm:ss',模板字符:\n * - YYYY:年\n * - yyyy: 年\n * - MM:月\n * - DD:日\n * - dd: 日\n * - HH:时(24 小时制)\n * - hh:时(12 小时制)\n * - mm:分\n * - ss:秒\n * - SSS:毫秒\n * @returns 格式化后的日期字符串\n * @example\n * ```typescript\n * dateFormat(new Date(), 'YYYY-MM-DD'); // '2023-01-01'\n * dateFormat(1672531200000, 'YYYY/MM/DD HH:mm:ss'); // '2023/01/01 00:00:00'\n * dateFormat('2023-01-01', 'YYYY年MM月DD日'); // '2023年01月01日'\n * ```\n */\nexport function dateFormat(dateValue: DateValue, format = 'YYYY-MM-DD HH:mm:ss'): string {\n const date = dateParse(dateValue);\n let result = format;\n\n for (const rule of rules) {\n result = result.replace(rule[0], String(rule[1](date)));\n }\n\n return result;\n}\n"],"names":["timestamp"],"mappings":"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"}
|
package/dist/crypto/md5.d.mts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function hex_md5(s: any): string;
|
package/dist/crypto/sha1.d.mts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function hex_sha1(s: any): string;
|
package/dist/crypto/sha256.d.mts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function hex_sha256(s: any): string;
|
package/dist/crypto/sha512.d.mts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function hex_sha512(s: any): string;
|
package/dist/each.cjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
function objectEach(obj, iterator) {
|
|
3
|
-
for (const [key, val] of Object.entries(obj)) {
|
|
4
|
-
if (iterator.call(obj, val, key) === false) {
|
|
5
|
-
break;
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
async function objectEachAsync(obj, iterator) {
|
|
10
|
-
for (const [key, val] of Object.entries(obj)) {
|
|
11
|
-
if (await iterator.call(obj, val, key) === false) {
|
|
12
|
-
break;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
exports.objectEach = objectEach;
|
|
17
|
-
exports.objectEachAsync = objectEachAsync;
|
|
18
|
-
//# sourceMappingURL=each.cjs.map
|
package/dist/each.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"each.cjs","sources":["../src/object/each.ts"],"sourcesContent":["import type { AnyObject, MaybePromise } from '@/types';\n\n/**\n * 遍历对象的每个键值对,并对每个键值对执行提供的回调函数。\n *\n * @param obj - 要遍历的对象。\n * @param iterator - 对每个键值对执行的回调函数。如果回调函数返回 false,则提前终止遍历。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const results: [string, number][] = [];\n * objectEach(obj, (val, key) => {\n * results.push([key, val]);\n * });\n * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]\n * ```\n */\nexport function objectEach<O extends AnyObject, K extends keyof O & (string | number)>(\n obj: O,\n iterator: (this: O, val: O[K], key: K) => false | unknown,\n): void {\n for (const [key, val] of Object.entries(obj)) {\n if (iterator.call(obj, val as O[K], key as K) === false) {\n break;\n }\n }\n}\n\n/**\n * 异步遍历对象的每个键值对,并对每个键值对执行提供的回调函数。\n *\n * @param obj - 要遍历的对象。\n * @param iterator - 对每个键值对执行的异步回调函数。如果回调函数返回 false,则提前终止遍历。\n * @returns 返回一个 Promise,当所有异步操作完成后,Promise 会被 resolve。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const results: [string, number][] = [];\n * await objectEachAsync(obj, async (val, key) => {\n * results.push([key, val]);\n * });\n * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]\n * ```\n */\nexport async function objectEachAsync<O extends AnyObject, K extends keyof O & (string | number)>(\n obj: O,\n iterator: (this: O, val: O[K], key: K) => MaybePromise<false | unknown>,\n): Promise<void> {\n for (const [key, val] of Object.entries(obj)) {\n if ((await iterator.call(obj, val as O[K], key as K)) === false) {\n break;\n }\n }\n}\n"],"names":[],"mappings":";AAkBgB,SAAA,WACd,KACA,UACM;AACN,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,QAAI,SAAS,KAAK,KAAK,KAAa,GAAQ,MAAM,OAAO;AACvD;AAAA,IAAA;AAAA,EACF;AAEJ;AAmBsB,eAAA,gBACpB,KACA,UACe;AACf,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,QAAK,MAAM,SAAS,KAAK,KAAK,KAAa,GAAQ,MAAO,OAAO;AAC/D;AAAA,IAAA;AAAA,EACF;AAEJ;;;"}
|
package/dist/each.mjs
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
function objectEach(obj, iterator) {
|
|
2
|
-
for (const [key, val] of Object.entries(obj)) {
|
|
3
|
-
if (iterator.call(obj, val, key) === false) {
|
|
4
|
-
break;
|
|
5
|
-
}
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
async function objectEachAsync(obj, iterator) {
|
|
9
|
-
for (const [key, val] of Object.entries(obj)) {
|
|
10
|
-
if (await iterator.call(obj, val, key) === false) {
|
|
11
|
-
break;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
export {
|
|
16
|
-
objectEachAsync as a,
|
|
17
|
-
objectEach as o
|
|
18
|
-
};
|
|
19
|
-
//# sourceMappingURL=each.mjs.map
|
package/dist/each.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"each.mjs","sources":["../src/object/each.ts"],"sourcesContent":["import type { AnyObject, MaybePromise } from '@/types';\n\n/**\n * 遍历对象的每个键值对,并对每个键值对执行提供的回调函数。\n *\n * @param obj - 要遍历的对象。\n * @param iterator - 对每个键值对执行的回调函数。如果回调函数返回 false,则提前终止遍历。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const results: [string, number][] = [];\n * objectEach(obj, (val, key) => {\n * results.push([key, val]);\n * });\n * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]\n * ```\n */\nexport function objectEach<O extends AnyObject, K extends keyof O & (string | number)>(\n obj: O,\n iterator: (this: O, val: O[K], key: K) => false | unknown,\n): void {\n for (const [key, val] of Object.entries(obj)) {\n if (iterator.call(obj, val as O[K], key as K) === false) {\n break;\n }\n }\n}\n\n/**\n * 异步遍历对象的每个键值对,并对每个键值对执行提供的回调函数。\n *\n * @param obj - 要遍历的对象。\n * @param iterator - 对每个键值对执行的异步回调函数。如果回调函数返回 false,则提前终止遍历。\n * @returns 返回一个 Promise,当所有异步操作完成后,Promise 会被 resolve。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const results: [string, number][] = [];\n * await objectEachAsync(obj, async (val, key) => {\n * results.push([key, val]);\n * });\n * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]\n * ```\n */\nexport async function objectEachAsync<O extends AnyObject, K extends keyof O & (string | number)>(\n obj: O,\n iterator: (this: O, val: O[K], key: K) => MaybePromise<false | unknown>,\n): Promise<void> {\n for (const [key, val] of Object.entries(obj)) {\n if ((await iterator.call(obj, val as O[K], key as K)) === false) {\n break;\n }\n }\n}\n"],"names":[],"mappings":"AAkBgB,SAAA,WACd,KACA,UACM;AACN,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,QAAI,SAAS,KAAK,KAAK,KAAa,GAAQ,MAAM,OAAO;AACvD;AAAA,IAAA;AAAA,EACF;AAEJ;AAmBsB,eAAA,gBACpB,KACA,UACe;AACf,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,QAAK,MAAM,SAAS,KAAK,KAAK,KAAa,GAAQ,MAAO,OAAO;AAC/D;AAAA,IAAA;AAAA,EACF;AAEJ;"}
|
package/dist/merge.cjs
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
const type = require("./type.cjs");
|
|
3
|
-
const each = require("./each.cjs");
|
|
4
|
-
function _objectMerge(mergeRule, target, ...sources) {
|
|
5
|
-
const seen = /* @__PURE__ */ new WeakMap();
|
|
6
|
-
const { assign, next } = mergeRule;
|
|
7
|
-
const align = (target2, source) => {
|
|
8
|
-
const targetType = type.typeIs(target2);
|
|
9
|
-
const sourceType = type.typeIs(source);
|
|
10
|
-
if (targetType === sourceType) {
|
|
11
|
-
return target2;
|
|
12
|
-
}
|
|
13
|
-
return sourceType === "array" ? [] : {};
|
|
14
|
-
};
|
|
15
|
-
const each$1 = (source, iterator) => {
|
|
16
|
-
if (type.isObject(source)) {
|
|
17
|
-
each.objectEach(source, iterator);
|
|
18
|
-
} else {
|
|
19
|
-
source.forEach(iterator);
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
const merge = (target2, source) => {
|
|
23
|
-
if (seen.has(source)) {
|
|
24
|
-
return seen.get(source);
|
|
25
|
-
}
|
|
26
|
-
const merged = align(target2, source);
|
|
27
|
-
seen.set(source, merged);
|
|
28
|
-
each$1(source, (value, key) => {
|
|
29
|
-
if (!next({ target: merged, source, key })) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
if (type.isObject(value) || type.isArray(value)) {
|
|
33
|
-
merged[key] = assign({
|
|
34
|
-
target: merged,
|
|
35
|
-
source,
|
|
36
|
-
key,
|
|
37
|
-
// @ts-expect-error
|
|
38
|
-
merge: () => merge(merged[key], value)
|
|
39
|
-
});
|
|
40
|
-
} else {
|
|
41
|
-
merged[key] = assign({
|
|
42
|
-
target: merged,
|
|
43
|
-
source,
|
|
44
|
-
key,
|
|
45
|
-
merge: () => value
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
return merged;
|
|
50
|
-
};
|
|
51
|
-
let returnTarget = target;
|
|
52
|
-
for (const source of sources) {
|
|
53
|
-
returnTarget = merge(target, source);
|
|
54
|
-
}
|
|
55
|
-
return returnTarget;
|
|
56
|
-
}
|
|
57
|
-
function objectMerge(target, ...sources) {
|
|
58
|
-
return _objectMerge(
|
|
59
|
-
{
|
|
60
|
-
next() {
|
|
61
|
-
return true;
|
|
62
|
-
},
|
|
63
|
-
assign({ merge }) {
|
|
64
|
-
return merge();
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
target,
|
|
68
|
-
...sources
|
|
69
|
-
);
|
|
70
|
-
}
|
|
71
|
-
function objectDefaults(target, defaults) {
|
|
72
|
-
return _objectMerge(
|
|
73
|
-
{
|
|
74
|
-
next({ target: target2, source, key }) {
|
|
75
|
-
return target2[key] === void 0 || type.isObject(target2[key]) || type.isArray(target2[key]);
|
|
76
|
-
},
|
|
77
|
-
assign({ merge }) {
|
|
78
|
-
return merge();
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
|
-
target,
|
|
82
|
-
defaults
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
exports.objectDefaults = objectDefaults;
|
|
86
|
-
exports.objectMerge = objectMerge;
|
|
87
|
-
//# sourceMappingURL=merge.cjs.map
|
package/dist/merge.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"merge.cjs","sources":["../src/object/merge.ts"],"sourcesContent":["import { isArray, isObject, typeIs } from '@/type';\nimport type { AnyArray, AnyObject } from '@/types';\nimport { objectEach } from './each';\n\nexport type ObjectMergeRule = {\n /**\n * 处理冲突\n * @param target - 目标对象\n * @param source - 源对象\n * @param key - 键名\n * @returns 返回 true 表示继续处理,否则返回 false\n */\n next: (info: {\n target: AnyObject | AnyArray;\n source: AnyObject | AnyArray;\n key: string | number;\n }) => boolean;\n\n /**\n * 处理赋值\n * @param target - 目标对象\n * @param source - 源对象\n * @param key - 键名\n * @returns 返回处理后的值\n */\n assign: (info: {\n target: AnyObject | AnyArray;\n source: AnyObject | AnyArray;\n key: string | number;\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n merge: () => any;\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n }) => any;\n};\n\nfunction _objectMerge(mergeRule: ObjectMergeRule, target: AnyObject | AnyArray, ...sources: (AnyObject | AnyArray)[]) {\n const seen = new WeakMap<AnyObject | AnyArray, AnyObject | AnyArray>();\n const { assign, next } = mergeRule;\n const align = (target: AnyObject | AnyArray, source: AnyObject | AnyArray) => {\n const targetType = typeIs(target);\n const sourceType = typeIs(source);\n\n if (targetType === sourceType) {\n return target;\n }\n\n return sourceType === 'array' ? [] : {};\n };\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n const each = (source: AnyObject | AnyArray, iterator: (val: any, key: string | number) => void) => {\n if (isObject(source)) {\n objectEach(source, iterator);\n } else {\n source.forEach(iterator);\n }\n };\n\n const merge = (target: AnyObject | AnyArray, source: AnyObject | AnyArray): AnyObject | AnyArray => {\n // 如果循环引用了,则直接返回目标对象\n if (seen.has(source)) {\n // biome-ignore lint/style/noNonNullAssertion: <explanation>\n return seen.get(source)!;\n }\n\n // 对齐目标对象和源对象\n const merged = align(target, source);\n\n // 存储循环引用\n seen.set(source, merged);\n\n // 遍历源对象\n each(source, (value, key) => {\n if (!next({ target: merged, source, key })) {\n return;\n }\n\n if (isObject(value) || isArray(value)) {\n // @ts-expect-error\n merged[key] = assign({\n target: merged,\n source,\n key,\n // @ts-expect-error\n merge: () => merge(merged[key], value),\n });\n } else {\n // @ts-expect-error\n merged[key] = assign({\n target: merged,\n source,\n key,\n merge: () => value,\n });\n }\n });\n\n return merged;\n };\n\n let returnTarget = target;\n\n for (const source of sources) {\n returnTarget = merge(target, source);\n }\n\n return returnTarget;\n}\n\n/**\n * 合并多个对象或数组。如果遇到循环引用,则直接返回目标对象。\n *\n * @param target - 目标对象或数组。\n * @param sources - 要合并的源对象或数组。\n * @returns 合并后的对象或数组。\n *\n * @example\n * ```typescript\n * const obj1 = { a: 1, b: { x: 10 } };\n * const obj2 = { b: { y: 20 }, c: 3 };\n * const merged = objectMerge(obj1, obj2);\n * console.log(merged); // { a: 1, b: { x: 10, y: 20 }, c: 3 }\n * ```\n */\nexport function objectMerge(target: AnyObject | AnyArray, ...sources: (AnyObject | AnyArray)[]) {\n return _objectMerge(\n {\n next() {\n return true;\n },\n assign({ merge }) {\n return merge();\n },\n },\n target,\n ...sources,\n );\n}\n\n/**\n * 为对象设置默认值。如果目标对象中的属性为 `undefined`,则使用默认对象中的属性值。\n * 支持多个默认对象,优先级从左到右依次降低。\n * 如果目标对象中的属性已经是对象或数组,则递归地设置默认值。\n *\n * @param target - 目标对象或数组。\n * @param defaults - 默认对象或数组。\n * @returns 合并后的对象或数组。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: undefined };\n * const defaults = { a: 4, b: 2, c: 3 };\n * const result = objectDefaults(obj, defaults);\n * console.log(result); // { a: 1, b: 2, c: 3 }\n *\n * const obj2 = { a: 1, b: 2 };\n * const defaults2 = { a: 5, b: 3, c: 4 };\n * const result2 = objectDefaults(obj2, defaults2);\n * console.log(result2); // { a: 1, b: 2, c: 4 }\n *\n * const obj3 = { a: { x: 1 }, b: undefined };\n * const defaults3 = { a: { x: 4, z: 3 }, b: { y: 2 } };\n * const result3 = objectDefaults(obj3, defaults3);\n * console.log(result3); // { a: { x: 1, z: 3 }, b: { y: 2 } }\n * ```\n */\nexport function objectDefaults<T extends AnyObject | AnyArray>(target: T, defaults: T): T {\n return _objectMerge(\n {\n next({ target, source, key }) {\n // @ts-expect-error\n return target[key] === undefined || isObject(target[key]) || isArray(target[key]);\n },\n assign({ merge }) {\n return merge();\n },\n },\n target,\n defaults,\n ) as T;\n}\n"],"names":["target","typeIs","each","isObject","objectEach","isArray"],"mappings":";;;AAmCA,SAAS,aAAa,WAA4B,WAAiC,SAAmC;AAC9G,QAAA,2BAAW,QAAoD;AAC/D,QAAA,EAAE,QAAQ,KAAA,IAAS;AACnB,QAAA,QAAQ,CAACA,SAA8B,WAAiC;AACtE,UAAA,aAAaC,YAAOD,OAAM;AAC1B,UAAA,aAAaC,YAAO,MAAM;AAEhC,QAAI,eAAe,YAAY;AACtBD,aAAAA;AAAAA,IAAA;AAGT,WAAO,eAAe,UAAU,CAAA,IAAK,CAAC;AAAA,EACxC;AAEM,QAAAE,SAAO,CAAC,QAA8B,aAAuD;AAC7F,QAAAC,KAAAA,SAAS,MAAM,GAAG;AACpBC,WAAA,WAAW,QAAQ,QAAQ;AAAA,IAAA,OACtB;AACL,aAAO,QAAQ,QAAQ;AAAA,IAAA;AAAA,EAE3B;AAEM,QAAA,QAAQ,CAACJ,SAA8B,WAAuD;AAE9F,QAAA,KAAK,IAAI,MAAM,GAAG;AAEb,aAAA,KAAK,IAAI,MAAM;AAAA,IAAA;AAIlB,UAAA,SAAS,MAAMA,SAAQ,MAAM;AAG9B,SAAA,IAAI,QAAQ,MAAM;AAGlBE,WAAA,QAAQ,CAAC,OAAO,QAAQ;AACvB,UAAA,CAAC,KAAK,EAAE,QAAQ,QAAQ,QAAQ,IAAA,CAAK,GAAG;AAC1C;AAAA,MAAA;AAGF,UAAIC,KAAS,SAAA,KAAK,KAAKE,KAAA,QAAQ,KAAK,GAAG;AAE9B,eAAA,GAAG,IAAI,OAAO;AAAA,UACnB,QAAQ;AAAA,UACR;AAAA,UACA;AAAA;AAAA,UAEA,OAAO,MAAM,MAAM,OAAO,GAAG,GAAG,KAAK;AAAA,QAAA,CACtC;AAAA,MAAA,OACI;AAEE,eAAA,GAAG,IAAI,OAAO;AAAA,UACnB,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA,OAAO,MAAM;AAAA,QAAA,CACd;AAAA,MAAA;AAAA,IACH,CACD;AAEM,WAAA;AAAA,EACT;AAEA,MAAI,eAAe;AAEnB,aAAW,UAAU,SAAS;AACb,mBAAA,MAAM,QAAQ,MAAM;AAAA,EAAA;AAG9B,SAAA;AACT;AAiBgB,SAAA,YAAY,WAAiC,SAAmC;AACvF,SAAA;AAAA,IACL;AAAA,MACE,OAAO;AACE,eAAA;AAAA,MACT;AAAA,MACA,OAAO,EAAE,SAAS;AAChB,eAAO,MAAM;AAAA,MAAA;AAAA,IAEjB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL;AACF;AA6BgB,SAAA,eAA+C,QAAW,UAAgB;AACjF,SAAA;AAAA,IACL;AAAA,MACE,KAAK,EAAE,QAAAL,SAAQ,QAAQ,OAAO;AAE5B,eAAOA,QAAO,GAAG,MAAM,UAAaG,KAAAA,SAASH,QAAO,GAAG,CAAC,KAAKK,KAAAA,QAAQL,QAAO,GAAG,CAAC;AAAA,MAClF;AAAA,MACA,OAAO,EAAE,SAAS;AAChB,eAAO,MAAM;AAAA,MAAA;AAAA,IAEjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;"}
|