@cloudcome/utils-core 1.1.1 → 1.2.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/dist/array.cjs +129 -0
- package/dist/array.cjs.map +1 -0
- package/dist/array.d.ts +171 -0
- package/dist/array.mjs +129 -0
- package/dist/array.mjs.map +1 -0
- package/dist/async.cjs +219 -0
- package/dist/async.cjs.map +1 -0
- package/dist/async.d.ts +137 -0
- package/dist/async.mjs +219 -0
- package/dist/async.mjs.map +1 -0
- package/dist/base64.cjs +16 -0
- package/dist/base64.cjs.map +1 -0
- package/dist/base64.d.ts +7 -0
- package/dist/base64.mjs +16 -0
- package/dist/base64.mjs.map +1 -0
- package/dist/cache.cjs +79 -0
- package/dist/cache.cjs.map +1 -0
- package/dist/cache.d.ts +90 -0
- package/dist/cache.mjs +79 -0
- package/dist/cache.mjs.map +1 -0
- package/{src/color/contrast.ts → dist/color/contrast.d.ts} +2 -12
- package/dist/color/distance.d.ts +8 -0
- package/dist/color/helpers.d.ts +2 -0
- package/dist/color/hex-hsl.d.ts +3 -0
- package/{src/color/hex-hsv.ts → dist/color/hex-hsv.d.ts} +3 -11
- package/{src/color/hex-hwb.ts → dist/color/hex-hwb.d.ts} +3 -11
- package/dist/color/hex-rgb.d.ts +18 -0
- package/{src/color/hsl-lighten.ts → dist/color/hsl-lighten.d.ts} +2 -7
- package/{src/color/hsv-brighten.ts → dist/color/hsv-brighten.d.ts} +2 -7
- package/{src/color/luminance.ts → dist/color/luminance.d.ts} +2 -9
- package/{src/color/mix.ts → dist/color/mix.d.ts} +2 -10
- package/dist/color/rgb-hsl.d.ts +23 -0
- package/{src/color/rgb-hsv.ts → dist/color/rgb-hsv.d.ts} +3 -30
- package/dist/color/rgb-hwb.d.ts +29 -0
- package/{src/color/rgb-lab.ts → dist/color/rgb-lab.d.ts} +3 -11
- package/dist/color/rgb-whiter.d.ts +12 -0
- package/dist/color/rgb-xyz.d.ts +22 -0
- package/{src/color/types.ts → dist/color/types.d.ts} +30 -12
- package/{src/color/xyz-lab.ts → dist/color/xyz-lab.d.ts} +3 -32
- package/dist/color.cjs +250 -0
- package/dist/color.cjs.map +1 -0
- package/dist/color.mjs +250 -0
- package/dist/color.mjs.map +1 -0
- package/dist/const.cjs +14 -0
- package/dist/const.cjs.map +1 -0
- package/dist/const.mjs +15 -0
- package/dist/const.mjs.map +1 -0
- package/dist/core.cjs +250 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.mjs +251 -0
- package/dist/core.mjs.map +1 -0
- package/dist/crypto/md5.d.mts +1 -0
- package/dist/crypto/sha1.d.mts +1 -0
- package/dist/crypto/sha256.d.mts +1 -0
- package/dist/crypto/sha512.d.mts +1 -0
- package/dist/crypto.cjs +812 -0
- package/dist/crypto.cjs.map +1 -0
- package/{src/crypto.ts → dist/crypto.d.ts} +4 -20
- package/dist/crypto.mjs +812 -0
- package/dist/crypto.mjs.map +1 -0
- package/dist/date/const.d.ts +6 -0
- package/dist/date/core.d.ts +52 -0
- package/dist/date/days.d.ts +23 -0
- package/{src/date/is.ts → dist/date/is.d.ts} +8 -102
- package/dist/date/relative.d.ts +44 -0
- package/dist/date/start-end.d.ts +73 -0
- package/dist/date/timezone.d.ts +67 -0
- package/dist/date/weeks.d.ts +72 -0
- package/dist/date.cjs +239 -0
- package/dist/date.cjs.map +1 -0
- package/dist/date.mjs +241 -0
- package/dist/date.mjs.map +1 -0
- package/dist/dict.cjs +2 -0
- package/dist/dict.cjs.map +1 -0
- package/dist/dict.mjs +2 -0
- package/dist/dict.mjs.map +1 -0
- package/dist/each.cjs +18 -0
- package/dist/each.cjs.map +1 -0
- package/dist/each.mjs +19 -0
- package/dist/each.mjs.map +1 -0
- package/dist/easing.cjs +151 -0
- package/dist/easing.cjs.map +1 -0
- package/dist/easing.d.ts +46 -0
- package/dist/easing.mjs +151 -0
- package/dist/easing.mjs.map +1 -0
- package/dist/emitter.cjs +94 -0
- package/dist/emitter.cjs.map +1 -0
- package/dist/emitter.d.ts +68 -0
- package/dist/emitter.mjs +94 -0
- package/dist/emitter.mjs.map +1 -0
- package/dist/enum.cjs +58 -0
- package/dist/enum.cjs.map +1 -0
- package/dist/enum.d.ts +68 -0
- package/dist/enum.mjs +58 -0
- package/dist/enum.mjs.map +1 -0
- package/dist/env.cjs +28 -0
- package/dist/env.cjs.map +1 -0
- package/{src/env.ts → dist/env.d.ts} +6 -30
- package/dist/env.mjs +28 -0
- package/dist/env.mjs.map +1 -0
- package/dist/error.cjs +12 -0
- package/dist/error.cjs.map +1 -0
- package/{src/error.ts → dist/error.d.ts} +3 -12
- package/dist/error.mjs +12 -0
- package/dist/error.mjs.map +1 -0
- package/dist/exception.cjs +22 -0
- package/dist/exception.cjs.map +1 -0
- package/dist/exception.d.ts +31 -0
- package/dist/exception.mjs +22 -0
- package/dist/exception.mjs.map +1 -0
- package/dist/fn.cjs +76 -0
- package/dist/fn.cjs.map +1 -0
- package/dist/fn.d.ts +102 -0
- package/dist/fn.mjs +76 -0
- package/dist/fn.mjs.map +1 -0
- package/dist/index.cjs +5 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +5 -0
- package/dist/index.mjs.map +1 -0
- package/dist/merge.cjs +87 -0
- package/dist/merge.cjs.map +1 -0
- package/dist/merge.mjs +88 -0
- package/dist/merge.mjs.map +1 -0
- package/dist/number.cjs +14 -0
- package/dist/number.cjs.map +1 -0
- package/dist/number.d.ts +153 -0
- package/dist/number.mjs +14 -0
- package/dist/number.mjs.map +1 -0
- package/{src/object/each.ts → dist/object/each.d.ts} +3 -23
- package/dist/object/get-set.d.ts +111 -0
- package/dist/object/is.d.ts +32 -0
- package/dist/object/merge.d.ts +72 -0
- package/{src/object/process.ts → dist/object/process.d.ts} +4 -38
- package/dist/object.cjs +130 -0
- package/dist/object.cjs.map +1 -0
- package/dist/object.mjs +130 -0
- package/dist/object.mjs.map +1 -0
- package/dist/path.cjs +77 -0
- package/dist/path.cjs.map +1 -0
- package/dist/path.d.ts +82 -0
- package/dist/path.mjs +77 -0
- package/dist/path.mjs.map +1 -0
- package/dist/promise.cjs +62 -0
- package/dist/promise.cjs.map +1 -0
- package/{src/promise.ts → dist/promise.d.ts} +6 -67
- package/dist/promise.mjs +62 -0
- package/dist/promise.mjs.map +1 -0
- package/dist/qs.cjs +47 -0
- package/dist/qs.cjs.map +1 -0
- package/{src/qs.ts → dist/qs.d.ts} +3 -60
- package/dist/qs.mjs +47 -0
- package/dist/qs.mjs.map +1 -0
- package/dist/regexp.cjs +66 -0
- package/dist/regexp.cjs.map +1 -0
- package/dist/regexp.d.ts +65 -0
- package/dist/regexp.mjs +66 -0
- package/dist/regexp.mjs.map +1 -0
- package/dist/string.cjs +16 -0
- package/dist/string.cjs.map +1 -0
- package/dist/string.d.ts +80 -0
- package/dist/string.mjs +16 -0
- package/dist/string.mjs.map +1 -0
- package/dist/string2.cjs +157 -0
- package/dist/string2.cjs.map +1 -0
- package/dist/string2.mjs +158 -0
- package/dist/string2.mjs.map +1 -0
- package/dist/time/from.d.ts +14 -0
- package/dist/time/to.d.ts +38 -0
- package/dist/time.cjs +82 -0
- package/dist/time.cjs.map +1 -0
- package/dist/time.mjs +82 -0
- package/dist/time.mjs.map +1 -0
- package/dist/timer.cjs +119 -0
- package/dist/timer.cjs.map +1 -0
- package/dist/timer.d.ts +96 -0
- package/{src/timer.ts → dist/timer.mjs} +17 -124
- package/dist/timer.mjs.map +1 -0
- package/dist/tree.cjs +125 -0
- package/dist/tree.cjs.map +1 -0
- package/{src/tree.ts → dist/tree.d.ts} +41 -225
- package/dist/tree.mjs +125 -0
- package/dist/tree.mjs.map +1 -0
- package/dist/type.cjs +78 -0
- package/dist/type.cjs.map +1 -0
- package/{src/type.ts → dist/type.d.ts} +20 -96
- package/dist/type.mjs +78 -0
- package/dist/type.mjs.map +1 -0
- package/dist/types.cjs +2 -0
- package/dist/types.cjs.map +1 -0
- package/{src/types.ts → dist/types.d.ts} +12 -33
- package/dist/types.mjs +2 -0
- package/dist/types.mjs.map +1 -0
- package/dist/unique.cjs +46 -0
- package/dist/unique.cjs.map +1 -0
- package/dist/unique.d.ts +22 -0
- package/dist/unique.mjs +46 -0
- package/dist/unique.mjs.map +1 -0
- package/dist/url.cjs +37 -0
- package/dist/url.cjs.map +1 -0
- package/dist/url.d.ts +53 -0
- package/dist/url.mjs +37 -0
- package/dist/url.mjs.map +1 -0
- package/dist/version.cjs +33 -0
- package/dist/version.cjs.map +1 -0
- package/dist/version.d.ts +32 -0
- package/dist/version.mjs +33 -0
- package/dist/version.mjs.map +1 -0
- package/package.json +8 -2
- package/CHANGELOG.md +0 -52
- package/src/array.ts +0 -312
- package/src/async.ts +0 -379
- package/src/base64.ts +0 -20
- package/src/cache.ts +0 -146
- package/src/color/distance.ts +0 -28
- package/src/color/helpers.ts +0 -23
- package/src/color/hex-hsl.ts +0 -11
- package/src/color/hex-rgb.ts +0 -39
- package/src/color/rgb-hsl.ts +0 -53
- package/src/color/rgb-hwb.ts +0 -56
- package/src/color/rgb-whiter.ts +0 -22
- package/src/color/rgb-xyz.ts +0 -62
- package/src/crypto/md5.mjs +0 -357
- package/src/crypto/sha1.mjs +0 -300
- package/src/crypto/sha256.mjs +0 -310
- package/src/crypto/sha512.mjs +0 -459
- package/src/date/const.ts +0 -6
- package/src/date/core.ts +0 -162
- package/src/date/days.ts +0 -51
- package/src/date/relative.ts +0 -92
- package/src/date/start-end.ts +0 -246
- package/src/date/timezone.ts +0 -220
- package/src/date/weeks.ts +0 -100
- package/src/dts/global.d.ts +0 -27
- package/src/easing.ts +0 -166
- package/src/emitter.ts +0 -117
- package/src/enum.ts +0 -171
- package/src/exception.ts +0 -68
- package/src/fn.ts +0 -197
- package/src/index.ts +0 -1
- package/src/number.ts +0 -236
- package/src/object/get-set.ts +0 -273
- package/src/object/is.ts +0 -128
- package/src/object/merge.ts +0 -180
- package/src/path.ts +0 -188
- package/src/regexp.ts +0 -156
- package/src/string.ts +0 -146
- package/src/time/from.ts +0 -57
- package/src/time/to.ts +0 -106
- package/src/unique.ts +0 -77
- package/src/url.ts +0 -93
- package/src/version.ts +0 -71
- package/test/array.test.ts +0 -332
- package/test/async-real.test.ts +0 -39
- package/test/async.test.ts +0 -375
- package/test/base64.test.ts +0 -32
- package/test/cache.test.ts +0 -83
- package/test/color.test.ts +0 -163
- package/test/crypto.test.ts +0 -34
- package/test/date-tz.test.ts +0 -206
- package/test/date.test.ts +0 -353
- package/test/easing.test.ts +0 -33
- package/test/emitter.test.ts +0 -71
- package/test/enum.test.ts +0 -113
- package/test/env.test.ts +0 -69
- package/test/error.test.ts +0 -58
- package/test/exception.test.ts +0 -43
- package/test/fn.test.ts +0 -263
- package/test/helpers.ts +0 -23
- package/test/index.test.ts +0 -6
- package/test/number.test.ts +0 -213
- package/test/object.test.ts +0 -309
- package/test/path.test.ts +0 -156
- package/test/promise.test.ts +0 -199
- package/test/qs.test.ts +0 -79
- package/test/regexp.test.ts +0 -97
- package/test/string.test.ts +0 -150
- package/test/time.test.ts +0 -214
- package/test/timer.test.ts +0 -114
- package/test/tree.test.ts +0 -348
- package/test/type.test.ts +0 -226
- package/test/unique.test.ts +0 -71
- package/test/url.test.ts +0 -136
- package/test/version.test.ts +0 -52
- package/tsconfig.json +0 -31
- package/vite.config.mts +0 -114
- /package/{src/color.ts → dist/color.d.ts} +0 -0
- /package/{src/date.ts → dist/date.d.ts} +0 -0
- /package/{src/dict.ts → dist/dict.d.ts} +0 -0
- /package/{src/object.ts → dist/object.d.ts} +0 -0
- /package/{src/time.ts → dist/time.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.mjs","sources":["../src/color/luminance.ts","../src/color/contrast.ts","../src/color/distance.ts","../src/color/hex-rgb.ts","../src/color/helpers.ts","../src/color/rgb-hsl.ts","../src/color/hex-hsl.ts","../src/color/rgb-hsv.ts","../src/color/hex-hsv.ts","../src/color/rgb-hwb.ts","../src/color/hex-hwb.ts","../src/color/hsl-lighten.ts","../src/color/hsv-brighten.ts","../src/color/mix.ts","../src/color/rgb-xyz.ts","../src/color/xyz-lab.ts","../src/color/rgb-lab.ts","../src/color/rgb-whiter.ts"],"sourcesContent":["import type { RGB } from './types';\n\n/**\n * 计算RGB颜色的相对亮度(符合WCAG 2.1标准)\n * @param rgb RGB颜色对象(分量范围0-255)\n * @returns {number} 相对亮度值(0-1之间)\n * @see https://www.w3.org/TR/WCAG21/#dfn-relative-luminance\n * @example\n * luminance({r: 255, g: 255, b: 255}) // 返回1\n */\nexport function luminance({ r, g, b }: RGB) {\n const a = [r, g, b].map((v) => {\n const vFinal = v / 255;\n return vFinal <= 0.03928 ? vFinal / 12.92 : ((vFinal + 0.055) / 1.055) ** 2.4;\n });\n return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;\n}\n","import { luminance } from './luminance';\nimport type { RGB } from './types';\n\n/**\n * 计算两个颜色之间的对比度比率(符合WCAG 2.1标准)\n * @param rgb1 第一个RGB颜色对象(分量范围0-255)\n * @param rgb2 第二个RGB颜色对象(分量范围0-255)\n * @returns {number} 对比度比率,范围1-21(1:1 到 21:1)\n * @example\n * contrast({r: 0, g: 0, b: 0}, {r: 255, g: 255, b: 255}) // 返回21\n */\nexport function contrast(rgb1: RGB, rgb2: RGB) {\n const lum1 = luminance(rgb1);\n const lum2 = luminance(rgb2);\n\n const brightest = Math.max(lum1, lum2);\n const darkest = Math.min(lum1, lum2);\n\n return (brightest + 0.05) / (darkest + 0.05);\n}\n","import type { LAB } from './types';\n\n// calculate the perceptual distance between colors in CIELAB\n// https://github.com/THEjoezack/ColorMine/blob/master/ColorMine/ColorSpaces/Comparisons/Cie94Comparison.cs\n\n/**\n * 计算两个颜色之间的距离(距离越小相似度越高),值范围 [0, 1]\n * @param {LAB} labA\n * @param {LAB} labB\n * @returns {number}\n */\nexport function distance(labA: LAB, labB: LAB) {\n const deltaL = labA.l - labB.l;\n const deltaA = labA.a - labB.a;\n const deltaB = labA.b - labB.b;\n const c1 = Math.sqrt(labA.a * labA.a + labA.b * labA.b);\n const c2 = Math.sqrt(labB.a * labB.a + labB.b * labB.b);\n const deltaC = c1 - c2;\n let deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;\n deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);\n const sc = 1.0 + 0.045 * c1;\n const sh = 1.0 + 0.015 * c1;\n const deltaLKlsl = deltaL / 1.0;\n const deltaCkcsc = deltaC / sc;\n const deltaHkhsh = deltaH / sh;\n const i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;\n return (i < 0 ? 0 : Math.sqrt(i)) / 100;\n}\n","import type { HEX, RGB } from './types';\n\n/**\n * 将HEX颜色字符串转换为RGB颜色对象\n * @param hex HEX颜色字符串,支持3位或6位格式(例如#f00或#ff0000)\n * @returns {RGB} 对应的RGB颜色对象\n * @throws {SyntaxError} 当颜色格式不符合规范时抛出\n * @example\n * hexToRgb('#f00') // returns {r: 255, g: 0, b: 0}\n */\nexport function hexToRgb(hex: HEX): RGB {\n const reg = hex.length === 4 ? /^#(.)(.)(.)$/ : /^#(.{2})(.{2})(.{2})$/;\n const result = reg.exec(hex);\n\n if (!result) throw new SyntaxError(`颜色(${hex})表达式有误`);\n\n const [_, r, g, b] = result;\n\n return {\n r: Number.parseInt(r.padEnd(2, r), 16),\n g: Number.parseInt(g.padEnd(2, g), 16),\n b: Number.parseInt(b.padEnd(2, b), 16),\n };\n}\n\nfunction to16(n: number) {\n return Math.round(n).toString(16).padStart(2, '0');\n}\n\n/**\n * 将RGB颜色对象转换为HEX颜色字符串\n * @param rgb RGB颜色对象\n * @returns {HEX} 6位HEX颜色字符串(带#前缀)\n * @example\n * rgbToHex({r: 255, g: 0, b: 0}) // returns '#ff0000'\n */\nexport function rgbToHex(rgb: RGB): HEX {\n return `#${to16(rgb.r)}${to16(rgb.g)}${to16(rgb.b)}`;\n}\n","import type { RGB } from './types';\n\nconst { abs, min, max, round } = Math;\n\nexport function rgbToHue({ r, g, b }: RGB): [number, number, number, number] {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const rgbMax = max(r, g, b);\n const rgbMin = min(r, g, b);\n const rgbDiff = rgbMax - rgbMin;\n const h =\n rgbDiff === 0\n ? 0\n : rgbDiff && rgbMax === r\n ? (g - b) / rgbDiff\n : rgbMax === g\n ? 2 + (b - r) / rgbDiff\n : 4 + (r - g) / rgbDiff;\n\n return [60 * (h < 0 ? h + 6 : h), rgbMax, rgbMin, rgbDiff];\n}\n","// @ref https://www.w3schools.com/lib/w3color.js\nimport { rgbToHue } from './helpers';\nimport type { HSL, RGB } from './types';\n\nconst { abs, min, max, round } = Math;\n\n/**\n * 将RGB颜色转换为HSL颜色空间\n * @param rgb RGB颜色对象(分量范围0-255)\n * @returns {HSL} HSL颜色对象,其中:\n * h: 色相(0-360度)\n * s: 饱和度(0-100%)\n * l: 亮度(0-100%)\n * @example\n * rgbToHsl({r: 255, g: 0, b: 0}) // returns {h: 0, s: 100, l: 50}\n */\nexport function rgbToHsl(rgb: RGB): HSL {\n const [hue, max, min, diff] = rgbToHue(rgb);\n const l = (2 * max - diff) / 2;\n const s = min === max ? 0 : l < 0.5 ? (max - min) / (max + min) : (max - min) / (2 - max - min);\n\n return {\n h: hue,\n s: s * 100,\n l: l * 100,\n };\n}\n\n// @ref https://www.30secondsofcode.org/js/s/hsl-to-rgb/\n/**\n * 将HSL颜色转换回RGB颜色空间\n * @param hsl HSL颜色对象\n * @param hsl.h 色相(0-360度)\n * @param hsl.s 饱和度(0-100%)\n * @param hsl.l 亮度(0-100%)\n * @returns {RGB} RGB颜色对象(分量范围0-255)\n * @example\n * hslToRgb({h: 0, s: 100, l: 50}) // returns {r: 255, g: 0, b: 0}\n */\nexport function hslToRgb({ h, s, l }: HSL): RGB {\n s /= 100;\n l /= 100;\n\n const a = s * min(l, 1 - l);\n const k = (n: number) => (n + h / 30) % 12;\n const f = (n: number) => l - a * max(-1, min(k(n) - 3, min(9 - k(n), 1)));\n\n return {\n r: 255 * f(0),\n g: 255 * f(8),\n b: 255 * f(4),\n };\n}\n","import { hexToRgb, rgbToHex } from './hex-rgb';\nimport { hslToRgb, rgbToHsl } from './rgb-hsl';\nimport type { HEX, HSL } from './types';\n\nexport function hslToHex(hsl: HSL): HEX {\n return rgbToHex(hslToRgb(hsl));\n}\n\nexport function hexToHsl(hex: HEX): HSL {\n return rgbToHsl(hexToRgb(hex));\n}\n","import { rgbToHue } from './helpers';\nimport type { HSV, RGB } from './types';\n\nconst { abs, min, max, round } = Math;\n\n// @ref https://www.30secondsofcode.org/js/s/rgb-to-hsb/\n/**\n * 将RGB颜色转换为HSV颜色空间\n * @param rgb RGB颜色对象(分量范围0-255)\n * @returns {HSV} HSV颜色对象:\n * h: 色相(0-360度)\n * s: 饱和度(0-100%)\n * v: 明度(0-100%)\n * @see https://en.wikipedia.org/wiki/HSL_and_HSV\n * @example\n * rgbToHsv({r: 255, g: 0, b: 0}) // {h: 0, s: 100, v: 100}\n */\nexport function rgbToHsv(rgb: RGB): HSV {\n const [hue, max, min, diff] = rgbToHue(rgb);\n\n return {\n h: hue,\n s: max && (diff / max) * 100,\n v: max * 100,\n };\n}\n\n// @ref https://www.30secondsofcode.org/js/s/hsb-to-rgb/\n/**\n * 将HSV颜色转换回RGB颜色空间\n * @param hsv HSV颜色对象\n * @param hsv.h 色相(0-360度)\n * @param hsv.s 饱和度(0-100%)\n * @param hsv.v 明度(0-100%)\n * @returns {RGB} RGB颜色对象(分量范围0-255)\n * @see https://www.rapidtables.com/convert/color/hsv-to-rgb.html\n * @example\n * hsvToRgb({h: 0, s: 100, v: 100}) // {r: 255, g: 0, b: 0}\n */\nexport function hsvToRgb({ h, s, v }: HSV): RGB {\n s /= 100;\n v /= 100;\n\n const k = (n: number) => (n + h / 60) % 6;\n const f = (n: number) => v * (1 - s * max(0, min(k(n), 4 - k(n), 1)));\n\n return {\n r: 255 * f(5),\n g: 255 * f(3),\n b: 255 * f(1),\n };\n}\n","import { hexToRgb, rgbToHex } from './hex-rgb';\nimport { hsvToRgb, rgbToHsv } from './rgb-hsv';\nimport type { HEX, HSV } from './types';\n\n/**\n * 将HEX颜色转换为HSV颜色空间\n * @param hex HEX颜色字符串(支持3位或6位格式)\n * @returns {HSV} HSV颜色对象,包含:\n * h: 色相(0-360度)\n * s: 饱和度(0-100%)\n * v: 明度(0-100%)\n * @example\n * hexToHsv('#ff0000') // returns {h: 0, s: 100, v: 100}\n */\nexport function hexToHsv(hex: HEX): HSV {\n return rgbToHsv(hexToRgb(hex));\n}\n\n/**\n * 将HSV颜色转换回HEX字符串\n * @param hsv HSV颜色对象\n * @returns {HEX} 6位HEX颜色字符串(带#前缀)\n * @example\n * hsvToHex({h: 0, s: 100, v: 100}) // returns '#ff0000'\n */\nexport function hsvToHex(hsv: HSV): HEX {\n return rgbToHex(hsvToRgb(hsv));\n}\n","import { rgbToHue } from './helpers';\nimport { hslToRgb } from './rgb-hsl';\nimport type { HWB, RGB } from './types';\n\n/**\n * 将RGB颜色转换为HWB颜色空间\n * @param rgb RGB颜色对象(分量范围0-255)\n * @returns {HWB} HWB颜色对象:\n * h: 色相(0-360度)\n * w: 白度(0-100%)\n * b: 黑度(0-100%)\n * @see https://www.w3.org/TR/css-color-4/#hwb-to-rgb\n * @example\n * rgbToHwb({r: 255, g: 0, b: 0}) // {h: 0, w: 0, b: 0}\n */\nexport function rgbToHwb(rgb: RGB): HWB {\n const [hue, max, min, diff] = rgbToHue(rgb);\n return {\n h: hue,\n w: min * 100,\n b: (1 - max) * 100,\n };\n}\n\n// @ref https://www.w3schools.com/lib/w3color.js\n/**\n * 将HWB颜色转换回RGB颜色空间\n * @param hwb HWB颜色对象\n * @param hwb.h 色相(0-360度)\n * @param hwb.w 白度(0-100%)\n * @param hwb.b 黑度(0-100%)\n * @returns {RGB} RGB颜色对象(分量范围0-255)\n * @see https://en.wikipedia.org/wiki/HWB_color_model\n * @example\n * hwbToRgb({h: 0, w: 0, b: 0}) // {r: 255, g: 0, b: 0}\n */\nexport function hwbToRgb({ h, w: white, b: black }: HWB) {\n white /= 100;\n black /= 100;\n\n const { r, g, b } = hslToRgb({ h, s: 100, l: 50 });\n const tot = white + black;\n\n if (tot > 1) {\n white = white / tot;\n black = black / tot;\n }\n\n const f = (n: number) => ((n / 255) * (1 - white - black) + white) * 255;\n\n return {\n r: f(r),\n g: f(g),\n b: f(b),\n };\n}\n","import { hexToRgb, rgbToHex } from './hex-rgb';\nimport { hwbToRgb, rgbToHwb } from './rgb-hwb';\nimport type { HEX, HWB } from './types';\n\n/**\n * 将HWB颜色转换为HEX字符串\n * @param hwb HWB颜色对象\n * @param hwb.h 色相(0-360度)\n * @param hwb.w 白度(0-100%)\n * @param hwb.b 黑度(0-100%)\n * @returns {HEX} 6位HEX颜色字符串(带#前缀)\n * @example\n * hwbToHex({h: 0, w: 0, b: 0}) // returns '#ff0000'\n */\nexport function hwbToHex(hwb: HWB): HEX {\n return rgbToHex(hwbToRgb(hwb));\n}\n\n/**\n * 将HEX颜色转换为HWB颜色空间\n * @param hex HEX颜色字符串(支持3位或6位格式)\n * @returns {HWB} HWB颜色对象,包含:\n * h: 色相(0-360度)\n * w: 白度(0-100%)\n * b: 黑度(0-100%)\n * @example\n * hexToHwb('#ff0000') // returns {h: 0, w: 0, b: 0}\n */\nexport function hexToHwb(hex: HEX): HWB {\n return rgbToHwb(hexToRgb(hex));\n}\n","import type { HSL } from './types';\n\n/**\n * 通过HSL颜色空间调整颜色亮度\n * @param hsl 原始 HSL 颜色\n * @param value 亮度调整系数(0-1之间,0.1表示增加10%亮度)\n * @returns {HSL} 调整后的 HSL 颜色\n * @example\n * hslLighten({h: 300, s: 33, l: 44}, 0.2) // 返回亮度增加20%后的颜色\n */\nexport function hslLighten(hsl: HSL, value: number): HSL {\n const hslFinal = { ...hsl };\n hslFinal.l = hslFinal.l * (1 + value);\n return hslFinal;\n}\n","import type { HSV } from './types';\n\n/**\n * 通过HSV颜色空间调整颜色明度\n * @param hsv 原始HSV颜色对象\n * @param value 明度调整系数(-1到1之间):\n * - 正值增加明度(如0.2表示+20%)\n * - 负值降低明度(如-0.1表示-10%)\n * @returns {HSV} 调整后的HSV颜色对象(v值范围0-100%)\n * @example\n * hsvBrighten({h: 0, s: 100, v: 50}, 0.3) // 返回{h: 0, s: 100, v: 65}\n */\nexport function hsvBrighten(hsv: HSV, value: number): HSV {\n const hsvFinal = { ...hsv };\n hsvFinal.v = hsvFinal.v * (1 + value);\n return hsvFinal;\n}\n","import type { HSL, HSV, RGB } from './types';\n\n/**\n * 颜色混合函数(支持RGB/HSL/HSV色彩模型)\n * @template T 颜色类型,支持RGB、HSL或HSV对象\n * @param {T} a 第一个颜色对象\n * @param {T} b 第二个颜色对象\n * @param {number} [weight=0.5] 混合权重(0-1之间):\n * - 0 表示完全使用第一个颜色\n * - 1 表示完全使用第二个颜色\n * @returns {T} 线性混合后的新颜色对象\n * @example\n * // RGB混合示例\n * mix({r: 255, g: 0, b: 0}, {r: 0, g: 0, b: 255}, 0.5) // 返回紫色\n *\n * // HSL混合示例\n * mix({h: 0, s: 100, l: 50}, {h: 120, s: 100, l: 50}, 0.3)\n */\nexport function mix<T extends RGB | HSV | HSL>(a: T, b: T, weight = 0.5): T {\n return Object.keys(a).reduce((acc, key) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n acc[key] = (b[key] - a[key]) * weight + a[key];\n return acc;\n }, {} as T);\n}\n","// https://stackoverflow.com/a/73998199\n\nimport type { RGB, XYZ } from './types';\n\n/**\n * 将RGB颜色转换为CIE 1931 XYZ颜色空间(D65白点,2°观察者)\n * @param rgb RGB颜色对象(分量范围0-255)\n * @returns {XYZ} XYZ颜色对象:\n * x: 约0-95.047\n * y: 约0-100.0\n * z: 约0-108.883\n * @see https://en.wikipedia.org/wiki/CIE_1931_color_space\n * @example\n * rgbToXyz({r: 255, g: 255, b: 255}) // {x: 95.047, y: 100.0, z: 108.883}\n */\nexport function rgbToXyz(rgb: RGB): XYZ {\n const { r, g, b } = rgb;\n const [var_R, var_G, var_B] = [r, g, b]\n .map((x) => x / 255)\n .map((x) => (x > 0.04045 ? ((x + 0.055) / 1.055) ** 2.4 : x / 12.92))\n .map((x) => x * 100);\n\n return {\n // Observer. = 2°, Illuminant = D65\n x: var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805,\n y: var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722,\n z: var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505,\n };\n}\n\n/**\n * 将XYZ颜色转换回RGB颜色空间(可能超出常规范围)\n * @param xyz XYZ颜色对象\n * @returns {RGB} RGB颜色对象(分量可能超出0-255范围)\n * @see https://www.brucelindbloom.com/index.html?Eqn_XYZ_to_RGB.html\n * @example\n * xyzToRgb({x: 95.047, y: 100.0, z: 108.883}) // {r: 255, g: 255, b: 255}\n */\nexport function xyzToRgb(xyz: XYZ): RGB {\n const { x, y, z } = xyz;\n\n //X, Y and Z input refer to a D65/2° standard illuminant.\n //sR, sG and sB (standard RGB) output range = 0 ÷ 255\n\n const var_X = x / 100;\n const var_Y = y / 100;\n const var_Z = z / 100;\n\n const var_R = var_X * 3.2406 + var_Y * -1.5372 + var_Z * -0.4986;\n const var_G = var_X * -0.9689 + var_Y * 1.8758 + var_Z * 0.0415;\n const var_B = var_X * 0.0557 + var_Y * -0.204 + var_Z * 1.057;\n\n const [r, g, b] = [var_R, var_G, var_B]\n .map((n) => (n > 0.0031308 ? 1.055 * n ** (1 / 2.4) - 0.055 : 12.92 * n))\n .map((n) => n * 255);\n\n return {\n r,\n g,\n b,\n };\n}\n","// https://stackoverflow.com/a/73998199\n\nimport type { LAB, XYZ } from './types';\n\nconst ref_X = 95.047;\nconst ref_Y = 100.0;\nconst ref_Z = 108.883;\n\n/**\n * 将XYZ颜色转换为Lab颜色空间(CIE 1976 L*a*b*,D65白点)\n * @param xyz XYZ颜色对象(参考值:D65白点X=95.047,Y=100,Z=108.883)\n * @returns {LAB} Lab颜色对象:\n * l: 明度(0-100)\n * a: 绿-红分量(典型范围-128到127)\n * b: 蓝-黄分量(典型范围-128到127)\n * @see https://en.wikipedia.org/wiki/CIELAB_color_space\n * @example\n * xyzToLab({x: 95.047, y: 100.0, z: 108.883}) // {l: 100, a: 0, b: 0}\n */\nexport function xyzToLab(xyz: XYZ): LAB {\n const { x, y, z } = xyz;\n const [var_X, var_Y, var_Z] = [x / ref_X, y / ref_Y, z / ref_Z].map((a) =>\n a > 0.008856 ? a ** (1 / 3) : 7.787 * a + 16 / 116,\n );\n\n const l = 116 * var_Y - 16;\n const a = 500 * (var_X - var_Y);\n const b = 200 * (var_Y - var_Z);\n\n return { l, a, b };\n}\n\n/**\n * 将Lab颜色转换回XYZ颜色空间\n * @param lab Lab颜色对象\n * @param lab.l 明度(0-100)\n * @param lab.a 绿-红分量(典型范围-128到127)\n * @param lab.b 蓝-黄分量(典型范围-128到127)\n * @returns {XYZ} XYZ颜色对象(基于D65白点)\n * @see https://www.easyrgb.com/en/math.php\n * @example\n * labToXyz({l: 100, a: 0, b: 0}) // {x: 95.047, y: 100.0, z: 108.883}\n */\nexport function labToXyz(lab: LAB): XYZ {\n const { l, a, b } = lab;\n\n const var_Y = (l + 16) / 116;\n const var_X = a / 500 + var_Y;\n const var_Z = var_Y - b / 200;\n\n const [X, Y, Z] = [var_X, var_Y, var_Z].map((n) => (n ** 3 > 0.008856 ? n ** 3 : (n - 16 / 116) / 7.787));\n\n return { x: X * ref_X, y: Y * ref_Y, z: Z * ref_Z };\n}\n","import { rgbToXyz, xyzToRgb } from './rgb-xyz';\nimport type { LAB, RGB } from './types';\nimport { labToXyz, xyzToLab } from './xyz-lab';\n\n/**\n * 将RGB颜色转换为Lab颜色空间(CIE 1976标准)\n * @param rgb RGB颜色对象(分量范围0-255)\n * @returns {LAB} Lab颜色对象:\n * l: 明度(0-100)\n * a: 绿-红分量(-128到127)\n * b: 蓝-黄分量(-128到127)\n * @see https://en.wikipedia.org/wiki/CIELAB_color_space\n * @example\n * rgbToLab({r: 255, g: 0, b: 0}) // {l: 53.24, a: 80.09, b: 67.20}\n */\nexport function rgbToLab(rgb: RGB): LAB {\n return xyzToLab(rgbToXyz(rgb));\n}\n\n/**\n * 将Lab颜色转换回RGB颜色空间\n * @param lab Lab颜色对象\n * @param lab.l 明度(0-100)\n * @param lab.a 绿-红分量(-128到127)\n * @param lab.b 蓝-黄分量(-128到127)\n * @returns {RGB} RGB颜色对象(分量可能超出0-255范围)\n * @see https://www.easyrgb.com/en/math.php\n * @example\n * labToRgb({l: 53.24, a: 80.09, b: 67.20}) // {r: 255, g: 0, b: 0}\n */\nexport function labToRgb(lab: LAB): RGB {\n return xyzToRgb(labToXyz(lab));\n}\n","import { mix } from './mix';\nimport type { RGB } from './types';\n\nconst { abs, min, max, round } = Math;\n\nconst whiteRGB: RGB = { r: 0, g: 0, b: 0 };\nconst blackRGB: RGB = { r: 255, g: 255, b: 255 };\n\n/**\n * 通过混合颜色调整明暗度\n * @param rgb 原始RGB颜色对象\n * @param value 调整强度(-1到1之间):\n * - 正值时与黑色混合(增加暗度)\n * - 负值时与白色混合(增加亮度)\n * @returns {RGB} 调整后的RGB颜色对象\n * @example\n * rgbDarken({r: 100, g: 150, b: 200}, 0.2) // 变暗20%\n */\nexport function rgbWhiter(rgb: RGB, value: number): RGB {\n const rgb2: RGB = value > 0 ? whiteRGB : blackRGB;\n return mix(rgb, rgb2, abs(value));\n}\n"],"names":["min","max","a"],"mappings":"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"}
|
package/dist/const.cjs
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const DATE_SECOND_MS = 1e3;
|
|
3
|
+
const DATE_MINUTE_MS = 60 * DATE_SECOND_MS;
|
|
4
|
+
const DATE_HOUR_MS = 60 * DATE_MINUTE_MS;
|
|
5
|
+
const DATE_DAY_MS = 24 * DATE_HOUR_MS;
|
|
6
|
+
const DATE_MONTH_MS = 30 * DATE_DAY_MS;
|
|
7
|
+
const DATE_YEAR_MS = 365 * DATE_DAY_MS;
|
|
8
|
+
exports.DATE_DAY_MS = DATE_DAY_MS;
|
|
9
|
+
exports.DATE_HOUR_MS = DATE_HOUR_MS;
|
|
10
|
+
exports.DATE_MINUTE_MS = DATE_MINUTE_MS;
|
|
11
|
+
exports.DATE_MONTH_MS = DATE_MONTH_MS;
|
|
12
|
+
exports.DATE_SECOND_MS = DATE_SECOND_MS;
|
|
13
|
+
exports.DATE_YEAR_MS = DATE_YEAR_MS;
|
|
14
|
+
//# sourceMappingURL=const.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"const.cjs","sources":["../src/date/const.ts"],"sourcesContent":["export const DATE_SECOND_MS = 1000;\nexport const DATE_MINUTE_MS = 60 * DATE_SECOND_MS;\nexport const DATE_HOUR_MS = 60 * DATE_MINUTE_MS;\nexport const DATE_DAY_MS = 24 * DATE_HOUR_MS;\nexport const DATE_MONTH_MS = 30 * DATE_DAY_MS;\nexport const DATE_YEAR_MS = 365 * DATE_DAY_MS;\n"],"names":[],"mappings":";AAAO,MAAM,iBAAiB;AACvB,MAAM,iBAAiB,KAAK;AAC5B,MAAM,eAAe,KAAK;AAC1B,MAAM,cAAc,KAAK;AACzB,MAAM,gBAAgB,KAAK;AAC3B,MAAM,eAAe,MAAM;;;;;;;"}
|
package/dist/const.mjs
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const DATE_SECOND_MS = 1e3;
|
|
2
|
+
const DATE_MINUTE_MS = 60 * DATE_SECOND_MS;
|
|
3
|
+
const DATE_HOUR_MS = 60 * DATE_MINUTE_MS;
|
|
4
|
+
const DATE_DAY_MS = 24 * DATE_HOUR_MS;
|
|
5
|
+
const DATE_MONTH_MS = 30 * DATE_DAY_MS;
|
|
6
|
+
const DATE_YEAR_MS = 365 * DATE_DAY_MS;
|
|
7
|
+
export {
|
|
8
|
+
DATE_YEAR_MS as D,
|
|
9
|
+
DATE_MONTH_MS as a,
|
|
10
|
+
DATE_DAY_MS as b,
|
|
11
|
+
DATE_HOUR_MS as c,
|
|
12
|
+
DATE_MINUTE_MS as d,
|
|
13
|
+
DATE_SECOND_MS as e
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=const.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"const.mjs","sources":["../src/date/const.ts"],"sourcesContent":["export const DATE_SECOND_MS = 1000;\nexport const DATE_MINUTE_MS = 60 * DATE_SECOND_MS;\nexport const DATE_HOUR_MS = 60 * DATE_MINUTE_MS;\nexport const DATE_DAY_MS = 24 * DATE_HOUR_MS;\nexport const DATE_MONTH_MS = 30 * DATE_DAY_MS;\nexport const DATE_YEAR_MS = 365 * DATE_DAY_MS;\n"],"names":[],"mappings":"AAAO,MAAM,iBAAiB;AACvB,MAAM,iBAAiB,KAAK;AAC5B,MAAM,eAAe,KAAK;AAC1B,MAAM,cAAc,KAAK;AACzB,MAAM,gBAAgB,KAAK;AAC3B,MAAM,eAAe,MAAM;"}
|
package/dist/core.cjs
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __typeError = (msg) => {
|
|
3
|
+
throw TypeError(msg);
|
|
4
|
+
};
|
|
5
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
6
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
7
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
8
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
9
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
10
|
+
var _timestamp, _targetDate, _utcDate, _localTZOffset, _localTzOffsetMS, _targetTzOffset, _targetTzOffsetMS, _options, _TzDate_instances, updateTimestamp_fn;
|
|
11
|
+
const type = require("./type.cjs");
|
|
12
|
+
const TZ_OFFSET_MS = 60 * 1e3;
|
|
13
|
+
const _TzDate = class _TzDate {
|
|
14
|
+
constructor(options) {
|
|
15
|
+
__privateAdd(this, _TzDate_instances);
|
|
16
|
+
__privateAdd(this, _timestamp);
|
|
17
|
+
__privateAdd(this, _targetDate);
|
|
18
|
+
__privateAdd(this, _utcDate);
|
|
19
|
+
__privateAdd(this, _localTZOffset, _TzDate.getOffset());
|
|
20
|
+
__privateAdd(this, _localTzOffsetMS, __privateGet(this, _localTZOffset) * TZ_OFFSET_MS);
|
|
21
|
+
__privateAdd(this, _targetTzOffset, 0);
|
|
22
|
+
__privateAdd(this, _targetTzOffsetMS, 0);
|
|
23
|
+
__privateAdd(this, _options);
|
|
24
|
+
__privateSet(this, _options, (options instanceof _TzDate ? __privateGet(options, _options) : options) || {});
|
|
25
|
+
const { offset, timestamp, value } = __privateGet(this, _options);
|
|
26
|
+
__privateSet(this, _targetTzOffset, type.isNumber(offset) ? offset : __privateGet(this, _localTZOffset));
|
|
27
|
+
__privateSet(this, _targetTzOffsetMS, __privateGet(this, _targetTzOffset) * TZ_OFFSET_MS);
|
|
28
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
29
|
+
const [fullYear, month, day, hours, minutes, seconds, milliseconds] = value;
|
|
30
|
+
const timestamp2 = Date.UTC(
|
|
31
|
+
fullYear ?? 0,
|
|
32
|
+
month ?? 0,
|
|
33
|
+
day ?? 1,
|
|
34
|
+
hours ?? 0,
|
|
35
|
+
minutes ?? 0,
|
|
36
|
+
seconds ?? 0,
|
|
37
|
+
milliseconds ?? 0
|
|
38
|
+
);
|
|
39
|
+
__privateSet(this, _timestamp, timestamp2 + __privateGet(this, _targetTzOffsetMS));
|
|
40
|
+
} else {
|
|
41
|
+
__privateSet(this, _timestamp, timestamp || Date.now());
|
|
42
|
+
}
|
|
43
|
+
__privateSet(this, _targetDate, new Date(__privateGet(this, _timestamp) + __privateGet(this, _localTzOffsetMS) - __privateGet(this, _targetTzOffsetMS)));
|
|
44
|
+
__privateSet(this, _utcDate, new Date(__privateGet(this, _timestamp) + __privateGet(this, _localTzOffsetMS)));
|
|
45
|
+
}
|
|
46
|
+
getTimezoneOffset() {
|
|
47
|
+
return __privateGet(this, _targetTzOffset);
|
|
48
|
+
}
|
|
49
|
+
getTimezoneOrder() {
|
|
50
|
+
return _TzDate.getOrder(__privateGet(this, _targetTzOffset));
|
|
51
|
+
}
|
|
52
|
+
getFullYear() {
|
|
53
|
+
return __privateGet(this, _targetDate).getFullYear();
|
|
54
|
+
}
|
|
55
|
+
getMonth() {
|
|
56
|
+
return __privateGet(this, _targetDate).getMonth();
|
|
57
|
+
}
|
|
58
|
+
getDate() {
|
|
59
|
+
return __privateGet(this, _targetDate).getDate();
|
|
60
|
+
}
|
|
61
|
+
getHours() {
|
|
62
|
+
return __privateGet(this, _targetDate).getHours();
|
|
63
|
+
}
|
|
64
|
+
getMinutes() {
|
|
65
|
+
return __privateGet(this, _targetDate).getMinutes();
|
|
66
|
+
}
|
|
67
|
+
getSeconds() {
|
|
68
|
+
return __privateGet(this, _targetDate).getSeconds();
|
|
69
|
+
}
|
|
70
|
+
getMilliseconds() {
|
|
71
|
+
return __privateGet(this, _targetDate).getMilliseconds();
|
|
72
|
+
}
|
|
73
|
+
setFullYear(year, month, date) {
|
|
74
|
+
__privateGet(this, _targetDate).setFullYear(year);
|
|
75
|
+
__privateMethod(this, _TzDate_instances, updateTimestamp_fn).call(this);
|
|
76
|
+
if (type.isNumber(month)) this.setMonth(month);
|
|
77
|
+
if (type.isNumber(date)) this.setDate(date);
|
|
78
|
+
return this.getTime();
|
|
79
|
+
}
|
|
80
|
+
setMonth(month, date) {
|
|
81
|
+
__privateGet(this, _targetDate).setMonth(month);
|
|
82
|
+
__privateMethod(this, _TzDate_instances, updateTimestamp_fn).call(this);
|
|
83
|
+
if (type.isNumber(date)) this.setDate(date);
|
|
84
|
+
return this.getTime();
|
|
85
|
+
}
|
|
86
|
+
setDate(date) {
|
|
87
|
+
__privateGet(this, _targetDate).setDate(date);
|
|
88
|
+
__privateMethod(this, _TzDate_instances, updateTimestamp_fn).call(this);
|
|
89
|
+
return this.getTime();
|
|
90
|
+
}
|
|
91
|
+
setHours(hours, minutes, seconds, milliseconds) {
|
|
92
|
+
__privateGet(this, _targetDate).setHours(hours);
|
|
93
|
+
__privateMethod(this, _TzDate_instances, updateTimestamp_fn).call(this);
|
|
94
|
+
if (type.isNumber(minutes)) this.setMinutes(minutes);
|
|
95
|
+
if (type.isNumber(seconds)) this.setSeconds(seconds);
|
|
96
|
+
if (type.isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
97
|
+
return this.getTime();
|
|
98
|
+
}
|
|
99
|
+
setMinutes(minutes, seconds, milliseconds) {
|
|
100
|
+
__privateGet(this, _targetDate).setMinutes(minutes);
|
|
101
|
+
__privateMethod(this, _TzDate_instances, updateTimestamp_fn).call(this);
|
|
102
|
+
if (type.isNumber(seconds)) this.setSeconds(seconds);
|
|
103
|
+
if (type.isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
104
|
+
return this.getTime();
|
|
105
|
+
}
|
|
106
|
+
setSeconds(seconds, milliseconds) {
|
|
107
|
+
__privateGet(this, _targetDate).setSeconds(seconds);
|
|
108
|
+
__privateMethod(this, _TzDate_instances, updateTimestamp_fn).call(this);
|
|
109
|
+
if (type.isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
110
|
+
return this.getTime();
|
|
111
|
+
}
|
|
112
|
+
setMilliseconds(milliseconds) {
|
|
113
|
+
__privateGet(this, _targetDate).setMilliseconds(milliseconds);
|
|
114
|
+
__privateMethod(this, _TzDate_instances, updateTimestamp_fn).call(this);
|
|
115
|
+
return this.getTime();
|
|
116
|
+
}
|
|
117
|
+
getTime() {
|
|
118
|
+
return __privateGet(this, _timestamp);
|
|
119
|
+
}
|
|
120
|
+
getDay() {
|
|
121
|
+
return __privateGet(this, _targetDate).getDay();
|
|
122
|
+
}
|
|
123
|
+
toISOString() {
|
|
124
|
+
return dateFormat(__privateGet(this, _utcDate), "YYYY-MM-DDTHH:mm:ss.SSSZ");
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 创建一个 TzDate 对象
|
|
128
|
+
* @param td - 需要转换的日期对象
|
|
129
|
+
* @param offset - 目标时区分钟偏移量,默认为当前时区
|
|
130
|
+
* @returns 返回一个 TzDate 对象
|
|
131
|
+
* @example
|
|
132
|
+
* ```js
|
|
133
|
+
* const tzDate = TzDate.from(new TzDate());
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
static from(td, offset = _TzDate.getOffset()) {
|
|
137
|
+
return new _TzDate({
|
|
138
|
+
offset,
|
|
139
|
+
timestamp: td.getTime()
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 获取时区序号
|
|
144
|
+
* @param offset - 默认使用当前时区分钟偏移量
|
|
145
|
+
*/
|
|
146
|
+
static getOrder(offset = _TzDate.getOffset()) {
|
|
147
|
+
return offset / -60;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* 获取时区分钟偏移量
|
|
151
|
+
* @param gmtOrder - 默认使用当前时区序号
|
|
152
|
+
*/
|
|
153
|
+
static getOffset(gmtOrder) {
|
|
154
|
+
return type.isNumber(gmtOrder) ? gmtOrder * -60 : (/* @__PURE__ */ new Date()).getTimezoneOffset();
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
_timestamp = new WeakMap();
|
|
158
|
+
_targetDate = new WeakMap();
|
|
159
|
+
_utcDate = new WeakMap();
|
|
160
|
+
_localTZOffset = new WeakMap();
|
|
161
|
+
_localTzOffsetMS = new WeakMap();
|
|
162
|
+
_targetTzOffset = new WeakMap();
|
|
163
|
+
_targetTzOffsetMS = new WeakMap();
|
|
164
|
+
_options = new WeakMap();
|
|
165
|
+
_TzDate_instances = new WeakSet();
|
|
166
|
+
updateTimestamp_fn = function() {
|
|
167
|
+
__privateSet(this, _timestamp, __privateGet(this, _targetDate).getTime() + __privateGet(this, _targetTzOffsetMS) - __privateGet(this, _localTzOffsetMS));
|
|
168
|
+
__privateSet(this, _utcDate, new Date(__privateGet(this, _timestamp) + __privateGet(this, _localTzOffsetMS)));
|
|
169
|
+
};
|
|
170
|
+
let TzDate = _TzDate;
|
|
171
|
+
function isValidDate(unknown) {
|
|
172
|
+
return unknown instanceof Date && !Number.isNaN(unknown.getTime()) || unknown instanceof TzDate && !Number.isNaN(unknown.getTime());
|
|
173
|
+
}
|
|
174
|
+
function _guessDateSeparator(value) {
|
|
175
|
+
if (!type.isString(value)) return;
|
|
176
|
+
const value2 = value.replace(/-/g, "/");
|
|
177
|
+
return new Date(value2);
|
|
178
|
+
}
|
|
179
|
+
function _guessDateTimezone(value) {
|
|
180
|
+
if (!type.isString(value)) return;
|
|
181
|
+
const re = /([+-])(\d\d)(\d\d)$/;
|
|
182
|
+
const matches = re.exec(value);
|
|
183
|
+
if (!matches) return;
|
|
184
|
+
const value2 = value.replace(re, "Z");
|
|
185
|
+
const d = new Date(value2);
|
|
186
|
+
if (!isValidDate(d)) return;
|
|
187
|
+
const [, flag, hours, minutes] = matches;
|
|
188
|
+
const hours2 = Number.parseInt(hours, 10);
|
|
189
|
+
const minutes2 = Number.parseInt(minutes, 10);
|
|
190
|
+
const offset = (a, b) => flag === "+" ? a - b : a + b;
|
|
191
|
+
d.setHours(offset(d.getHours(), hours2));
|
|
192
|
+
d.setMinutes(offset(d.getMinutes(), minutes2));
|
|
193
|
+
return d;
|
|
194
|
+
}
|
|
195
|
+
function dateParse(dateValue) {
|
|
196
|
+
const d1 = type.isDate(dateValue) ? new Date(dateValue) : dateValue instanceof TzDate ? new TzDate(dateValue) : new Date(dateValue);
|
|
197
|
+
if (isValidDate(d1)) return d1;
|
|
198
|
+
const d2 = _guessDateSeparator(dateValue);
|
|
199
|
+
if (isValidDate(d2)) return d2;
|
|
200
|
+
const d3 = _guessDateTimezone(dateValue);
|
|
201
|
+
if (isValidDate(d3)) return d3;
|
|
202
|
+
throw new SyntaxError(`${dateValue.toString()} 不是一个合法的日期值`);
|
|
203
|
+
}
|
|
204
|
+
function _pad(num, len = 2) {
|
|
205
|
+
return `${num}`.padStart(len, "0");
|
|
206
|
+
}
|
|
207
|
+
const rules = [
|
|
208
|
+
[/Y{4}/gi, (date) => date.getFullYear()],
|
|
209
|
+
[/Y{2}/gi, (date) => date.getFullYear() % 100],
|
|
210
|
+
[/M{2}/g, (date) => _pad(date.getMonth() + 1)],
|
|
211
|
+
[/M{1}/g, (date) => date.getMonth() + 1],
|
|
212
|
+
[/D{2}/gi, (date) => _pad(date.getDate())],
|
|
213
|
+
[/D{1}/gi, (date) => date.getDate()],
|
|
214
|
+
[/H{2}/g, (date) => _pad(date.getHours())],
|
|
215
|
+
[/H{1}/g, (date) => date.getHours()],
|
|
216
|
+
[
|
|
217
|
+
/h{2}/g,
|
|
218
|
+
(date) => {
|
|
219
|
+
const h = date.getHours();
|
|
220
|
+
return _pad(h > 12 ? h - 12 : h);
|
|
221
|
+
}
|
|
222
|
+
],
|
|
223
|
+
[
|
|
224
|
+
/h{1}/g,
|
|
225
|
+
(date) => {
|
|
226
|
+
const h = date.getHours();
|
|
227
|
+
return h > 12 ? h - 12 : h;
|
|
228
|
+
}
|
|
229
|
+
],
|
|
230
|
+
[/m{2}/g, (date) => _pad(date.getMinutes())],
|
|
231
|
+
[/m{1}/g, (date) => date.getMinutes()],
|
|
232
|
+
[/s{2}/g, (date) => _pad(date.getSeconds())],
|
|
233
|
+
[/s{1}/g, (date) => date.getSeconds()],
|
|
234
|
+
[/S{3}/g, (date) => _pad(date.getMilliseconds(), 3)],
|
|
235
|
+
[/S{2}/g, (date) => _pad(date.getMilliseconds(), 2)],
|
|
236
|
+
[/S{1}/g, (date) => date.getMilliseconds()]
|
|
237
|
+
];
|
|
238
|
+
function dateFormat(dateValue, format = "YYYY-MM-DD HH:mm:ss") {
|
|
239
|
+
const date = dateParse(dateValue);
|
|
240
|
+
let result = format;
|
|
241
|
+
for (const rule of rules) {
|
|
242
|
+
result = result.replace(rule[0], String(rule[1](date)));
|
|
243
|
+
}
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
exports.TzDate = TzDate;
|
|
247
|
+
exports.dateFormat = dateFormat;
|
|
248
|
+
exports.dateParse = dateParse;
|
|
249
|
+
exports.isValidDate = isValidDate;
|
|
250
|
+
//# sourceMappingURL=core.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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 TTzDateOptions = {\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 * 时区偏移量,单位为分钟,默认为当前时区\n */\n offset?: number;\n};\n\nconst TZ_OFFSET_MS = 60 * 1000;\n\nexport class TzDate {\n #timestamp: number;\n #targetDate: Date;\n #utcDate: Date;\n\n #localTZOffset = TzDate.getOffset();\n #localTzOffsetMS = this.#localTZOffset * TZ_OFFSET_MS;\n\n #targetTzOffset = 0;\n #targetTzOffsetMS = 0;\n\n #options: TTzDateOptions;\n\n constructor(options?: TTzDateOptions | TzDate) {\n this.#options = (options instanceof TzDate ? options.#options : options) || {};\n const { offset, timestamp, value } = this.#options;\n this.#targetTzOffset = isNumber(offset) ? offset : this.#localTZOffset;\n this.#targetTzOffsetMS = this.#targetTzOffset * TZ_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.#targetTzOffsetMS;\n } else {\n this.#timestamp = timestamp || Date.now();\n }\n\n this.#targetDate = new Date(this.#timestamp + this.#localTzOffsetMS - this.#targetTzOffsetMS);\n this.#utcDate = new Date(this.#timestamp + this.#localTzOffsetMS);\n }\n\n #updateTimestamp() {\n this.#timestamp = this.#targetDate.getTime() + this.#targetTzOffsetMS - this.#localTzOffsetMS;\n this.#utcDate = new Date(this.#timestamp + this.#localTzOffsetMS);\n }\n\n getTimezoneOffset() {\n return this.#targetTzOffset;\n }\n\n getTimezoneOrder() {\n return TzDate.getOrder(this.#targetTzOffset);\n }\n\n getFullYear() {\n return this.#targetDate.getFullYear();\n }\n\n getMonth() {\n return this.#targetDate.getMonth();\n }\n\n getDate() {\n return this.#targetDate.getDate();\n }\n\n getHours() {\n return this.#targetDate.getHours();\n }\n\n getMinutes() {\n return this.#targetDate.getMinutes();\n }\n\n getSeconds() {\n return this.#targetDate.getSeconds();\n }\n\n getMilliseconds() {\n return this.#targetDate.getMilliseconds();\n }\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 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 setDate(date: number) {\n this.#targetDate.setDate(date);\n this.#updateTimestamp();\n\n return this.getTime();\n }\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 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 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 setMilliseconds(milliseconds: number) {\n this.#targetDate.setMilliseconds(milliseconds);\n this.#updateTimestamp();\n\n return this.getTime();\n }\n\n getTime() {\n return this.#timestamp;\n }\n\n getDay() {\n return this.#targetDate.getDay();\n }\n\n toISOString() {\n return dateFormat(this.#utcDate, 'YYYY-MM-DDTHH:mm:ss.SSSZ');\n }\n\n /**\n * 创建一个 TzDate 对象\n * @param td - 需要转换的日期对象\n * @param offset - 目标时区分钟偏移量,默认为当前时区\n * @returns 返回一个 TzDate 对象\n * @example\n * ```js\n * const tzDate = TzDate.from(new TzDate());\n * ```\n */\n static from(td: TzDate, offset = TzDate.getOffset()) {\n return new TzDate({\n offset: offset,\n timestamp: td.getTime(),\n });\n }\n\n /**\n * 获取时区序号\n * @param offset - 默认使用当前时区分钟偏移量\n */\n static getOrder(offset = TzDate.getOffset()) {\n return offset / -60;\n }\n\n /**\n * 获取时区分钟偏移量\n * @param gmtOrder - 默认使用当前时区序号\n */\n static getOffset(gmtOrder?: number) {\n return isNumber(gmtOrder) ? gmtOrder * -60 : new Date().getTimezoneOffset();\n }\n}\n","import { objectEach } from '@/object';\nimport { isDate, isString } from '@/type';\nimport { TzDate } 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 | TzDate {\n return (\n (unknown instanceof Date && !Number.isNaN(unknown.getTime())) ||\n (unknown instanceof TzDate && !Number.isNaN(unknown.getTime()))\n );\n}\n\nexport type TDateLike = Date | TzDate;\nexport type TDateValue = number | string | TDateLike;\n\nfunction _guessDateSeparator(value: TDateValue): 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: TDateValue): 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: TDateValue): TDateLike {\n // 传入的 Date 对象有 Date、TzDate\n // @ts-ignore\n const d1 = isDate(dateValue)\n ? new Date(dateValue)\n : dateValue instanceof TzDate\n ? new TzDate(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: TDateLike) => 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 > 12 ? h - 12 : h);\n },\n ],\n [\n /h{1}/g,\n (date) => {\n const h = date.getHours();\n return 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: TDateValue, 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
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
var __typeError = (msg) => {
|
|
2
|
+
throw TypeError(msg);
|
|
3
|
+
};
|
|
4
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
5
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
6
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
7
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
8
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
9
|
+
var _timestamp, _targetDate, _utcDate, _localTZOffset, _localTzOffsetMS, _targetTzOffset, _targetTzOffsetMS, _options, _TzDate_instances, updateTimestamp_fn;
|
|
10
|
+
import { isNumber, isDate, isString } from "./type.mjs";
|
|
11
|
+
const TZ_OFFSET_MS = 60 * 1e3;
|
|
12
|
+
const _TzDate = class _TzDate {
|
|
13
|
+
constructor(options) {
|
|
14
|
+
__privateAdd(this, _TzDate_instances);
|
|
15
|
+
__privateAdd(this, _timestamp);
|
|
16
|
+
__privateAdd(this, _targetDate);
|
|
17
|
+
__privateAdd(this, _utcDate);
|
|
18
|
+
__privateAdd(this, _localTZOffset, _TzDate.getOffset());
|
|
19
|
+
__privateAdd(this, _localTzOffsetMS, __privateGet(this, _localTZOffset) * TZ_OFFSET_MS);
|
|
20
|
+
__privateAdd(this, _targetTzOffset, 0);
|
|
21
|
+
__privateAdd(this, _targetTzOffsetMS, 0);
|
|
22
|
+
__privateAdd(this, _options);
|
|
23
|
+
__privateSet(this, _options, (options instanceof _TzDate ? __privateGet(options, _options) : options) || {});
|
|
24
|
+
const { offset, timestamp, value } = __privateGet(this, _options);
|
|
25
|
+
__privateSet(this, _targetTzOffset, isNumber(offset) ? offset : __privateGet(this, _localTZOffset));
|
|
26
|
+
__privateSet(this, _targetTzOffsetMS, __privateGet(this, _targetTzOffset) * TZ_OFFSET_MS);
|
|
27
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
28
|
+
const [fullYear, month, day, hours, minutes, seconds, milliseconds] = value;
|
|
29
|
+
const timestamp2 = Date.UTC(
|
|
30
|
+
fullYear ?? 0,
|
|
31
|
+
month ?? 0,
|
|
32
|
+
day ?? 1,
|
|
33
|
+
hours ?? 0,
|
|
34
|
+
minutes ?? 0,
|
|
35
|
+
seconds ?? 0,
|
|
36
|
+
milliseconds ?? 0
|
|
37
|
+
);
|
|
38
|
+
__privateSet(this, _timestamp, timestamp2 + __privateGet(this, _targetTzOffsetMS));
|
|
39
|
+
} else {
|
|
40
|
+
__privateSet(this, _timestamp, timestamp || Date.now());
|
|
41
|
+
}
|
|
42
|
+
__privateSet(this, _targetDate, new Date(__privateGet(this, _timestamp) + __privateGet(this, _localTzOffsetMS) - __privateGet(this, _targetTzOffsetMS)));
|
|
43
|
+
__privateSet(this, _utcDate, new Date(__privateGet(this, _timestamp) + __privateGet(this, _localTzOffsetMS)));
|
|
44
|
+
}
|
|
45
|
+
getTimezoneOffset() {
|
|
46
|
+
return __privateGet(this, _targetTzOffset);
|
|
47
|
+
}
|
|
48
|
+
getTimezoneOrder() {
|
|
49
|
+
return _TzDate.getOrder(__privateGet(this, _targetTzOffset));
|
|
50
|
+
}
|
|
51
|
+
getFullYear() {
|
|
52
|
+
return __privateGet(this, _targetDate).getFullYear();
|
|
53
|
+
}
|
|
54
|
+
getMonth() {
|
|
55
|
+
return __privateGet(this, _targetDate).getMonth();
|
|
56
|
+
}
|
|
57
|
+
getDate() {
|
|
58
|
+
return __privateGet(this, _targetDate).getDate();
|
|
59
|
+
}
|
|
60
|
+
getHours() {
|
|
61
|
+
return __privateGet(this, _targetDate).getHours();
|
|
62
|
+
}
|
|
63
|
+
getMinutes() {
|
|
64
|
+
return __privateGet(this, _targetDate).getMinutes();
|
|
65
|
+
}
|
|
66
|
+
getSeconds() {
|
|
67
|
+
return __privateGet(this, _targetDate).getSeconds();
|
|
68
|
+
}
|
|
69
|
+
getMilliseconds() {
|
|
70
|
+
return __privateGet(this, _targetDate).getMilliseconds();
|
|
71
|
+
}
|
|
72
|
+
setFullYear(year, month, date) {
|
|
73
|
+
__privateGet(this, _targetDate).setFullYear(year);
|
|
74
|
+
__privateMethod(this, _TzDate_instances, updateTimestamp_fn).call(this);
|
|
75
|
+
if (isNumber(month)) this.setMonth(month);
|
|
76
|
+
if (isNumber(date)) this.setDate(date);
|
|
77
|
+
return this.getTime();
|
|
78
|
+
}
|
|
79
|
+
setMonth(month, date) {
|
|
80
|
+
__privateGet(this, _targetDate).setMonth(month);
|
|
81
|
+
__privateMethod(this, _TzDate_instances, updateTimestamp_fn).call(this);
|
|
82
|
+
if (isNumber(date)) this.setDate(date);
|
|
83
|
+
return this.getTime();
|
|
84
|
+
}
|
|
85
|
+
setDate(date) {
|
|
86
|
+
__privateGet(this, _targetDate).setDate(date);
|
|
87
|
+
__privateMethod(this, _TzDate_instances, updateTimestamp_fn).call(this);
|
|
88
|
+
return this.getTime();
|
|
89
|
+
}
|
|
90
|
+
setHours(hours, minutes, seconds, milliseconds) {
|
|
91
|
+
__privateGet(this, _targetDate).setHours(hours);
|
|
92
|
+
__privateMethod(this, _TzDate_instances, updateTimestamp_fn).call(this);
|
|
93
|
+
if (isNumber(minutes)) this.setMinutes(minutes);
|
|
94
|
+
if (isNumber(seconds)) this.setSeconds(seconds);
|
|
95
|
+
if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
96
|
+
return this.getTime();
|
|
97
|
+
}
|
|
98
|
+
setMinutes(minutes, seconds, milliseconds) {
|
|
99
|
+
__privateGet(this, _targetDate).setMinutes(minutes);
|
|
100
|
+
__privateMethod(this, _TzDate_instances, updateTimestamp_fn).call(this);
|
|
101
|
+
if (isNumber(seconds)) this.setSeconds(seconds);
|
|
102
|
+
if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
103
|
+
return this.getTime();
|
|
104
|
+
}
|
|
105
|
+
setSeconds(seconds, milliseconds) {
|
|
106
|
+
__privateGet(this, _targetDate).setSeconds(seconds);
|
|
107
|
+
__privateMethod(this, _TzDate_instances, updateTimestamp_fn).call(this);
|
|
108
|
+
if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
109
|
+
return this.getTime();
|
|
110
|
+
}
|
|
111
|
+
setMilliseconds(milliseconds) {
|
|
112
|
+
__privateGet(this, _targetDate).setMilliseconds(milliseconds);
|
|
113
|
+
__privateMethod(this, _TzDate_instances, updateTimestamp_fn).call(this);
|
|
114
|
+
return this.getTime();
|
|
115
|
+
}
|
|
116
|
+
getTime() {
|
|
117
|
+
return __privateGet(this, _timestamp);
|
|
118
|
+
}
|
|
119
|
+
getDay() {
|
|
120
|
+
return __privateGet(this, _targetDate).getDay();
|
|
121
|
+
}
|
|
122
|
+
toISOString() {
|
|
123
|
+
return dateFormat(__privateGet(this, _utcDate), "YYYY-MM-DDTHH:mm:ss.SSSZ");
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 创建一个 TzDate 对象
|
|
127
|
+
* @param td - 需要转换的日期对象
|
|
128
|
+
* @param offset - 目标时区分钟偏移量,默认为当前时区
|
|
129
|
+
* @returns 返回一个 TzDate 对象
|
|
130
|
+
* @example
|
|
131
|
+
* ```js
|
|
132
|
+
* const tzDate = TzDate.from(new TzDate());
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
static from(td, offset = _TzDate.getOffset()) {
|
|
136
|
+
return new _TzDate({
|
|
137
|
+
offset,
|
|
138
|
+
timestamp: td.getTime()
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 获取时区序号
|
|
143
|
+
* @param offset - 默认使用当前时区分钟偏移量
|
|
144
|
+
*/
|
|
145
|
+
static getOrder(offset = _TzDate.getOffset()) {
|
|
146
|
+
return offset / -60;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* 获取时区分钟偏移量
|
|
150
|
+
* @param gmtOrder - 默认使用当前时区序号
|
|
151
|
+
*/
|
|
152
|
+
static getOffset(gmtOrder) {
|
|
153
|
+
return isNumber(gmtOrder) ? gmtOrder * -60 : (/* @__PURE__ */ new Date()).getTimezoneOffset();
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
_timestamp = new WeakMap();
|
|
157
|
+
_targetDate = new WeakMap();
|
|
158
|
+
_utcDate = new WeakMap();
|
|
159
|
+
_localTZOffset = new WeakMap();
|
|
160
|
+
_localTzOffsetMS = new WeakMap();
|
|
161
|
+
_targetTzOffset = new WeakMap();
|
|
162
|
+
_targetTzOffsetMS = new WeakMap();
|
|
163
|
+
_options = new WeakMap();
|
|
164
|
+
_TzDate_instances = new WeakSet();
|
|
165
|
+
updateTimestamp_fn = function() {
|
|
166
|
+
__privateSet(this, _timestamp, __privateGet(this, _targetDate).getTime() + __privateGet(this, _targetTzOffsetMS) - __privateGet(this, _localTzOffsetMS));
|
|
167
|
+
__privateSet(this, _utcDate, new Date(__privateGet(this, _timestamp) + __privateGet(this, _localTzOffsetMS)));
|
|
168
|
+
};
|
|
169
|
+
let TzDate = _TzDate;
|
|
170
|
+
function isValidDate(unknown) {
|
|
171
|
+
return unknown instanceof Date && !Number.isNaN(unknown.getTime()) || unknown instanceof TzDate && !Number.isNaN(unknown.getTime());
|
|
172
|
+
}
|
|
173
|
+
function _guessDateSeparator(value) {
|
|
174
|
+
if (!isString(value)) return;
|
|
175
|
+
const value2 = value.replace(/-/g, "/");
|
|
176
|
+
return new Date(value2);
|
|
177
|
+
}
|
|
178
|
+
function _guessDateTimezone(value) {
|
|
179
|
+
if (!isString(value)) return;
|
|
180
|
+
const re = /([+-])(\d\d)(\d\d)$/;
|
|
181
|
+
const matches = re.exec(value);
|
|
182
|
+
if (!matches) return;
|
|
183
|
+
const value2 = value.replace(re, "Z");
|
|
184
|
+
const d = new Date(value2);
|
|
185
|
+
if (!isValidDate(d)) return;
|
|
186
|
+
const [, flag, hours, minutes] = matches;
|
|
187
|
+
const hours2 = Number.parseInt(hours, 10);
|
|
188
|
+
const minutes2 = Number.parseInt(minutes, 10);
|
|
189
|
+
const offset = (a, b) => flag === "+" ? a - b : a + b;
|
|
190
|
+
d.setHours(offset(d.getHours(), hours2));
|
|
191
|
+
d.setMinutes(offset(d.getMinutes(), minutes2));
|
|
192
|
+
return d;
|
|
193
|
+
}
|
|
194
|
+
function dateParse(dateValue) {
|
|
195
|
+
const d1 = isDate(dateValue) ? new Date(dateValue) : dateValue instanceof TzDate ? new TzDate(dateValue) : new Date(dateValue);
|
|
196
|
+
if (isValidDate(d1)) return d1;
|
|
197
|
+
const d2 = _guessDateSeparator(dateValue);
|
|
198
|
+
if (isValidDate(d2)) return d2;
|
|
199
|
+
const d3 = _guessDateTimezone(dateValue);
|
|
200
|
+
if (isValidDate(d3)) return d3;
|
|
201
|
+
throw new SyntaxError(`${dateValue.toString()} 不是一个合法的日期值`);
|
|
202
|
+
}
|
|
203
|
+
function _pad(num, len = 2) {
|
|
204
|
+
return `${num}`.padStart(len, "0");
|
|
205
|
+
}
|
|
206
|
+
const rules = [
|
|
207
|
+
[/Y{4}/gi, (date) => date.getFullYear()],
|
|
208
|
+
[/Y{2}/gi, (date) => date.getFullYear() % 100],
|
|
209
|
+
[/M{2}/g, (date) => _pad(date.getMonth() + 1)],
|
|
210
|
+
[/M{1}/g, (date) => date.getMonth() + 1],
|
|
211
|
+
[/D{2}/gi, (date) => _pad(date.getDate())],
|
|
212
|
+
[/D{1}/gi, (date) => date.getDate()],
|
|
213
|
+
[/H{2}/g, (date) => _pad(date.getHours())],
|
|
214
|
+
[/H{1}/g, (date) => date.getHours()],
|
|
215
|
+
[
|
|
216
|
+
/h{2}/g,
|
|
217
|
+
(date) => {
|
|
218
|
+
const h = date.getHours();
|
|
219
|
+
return _pad(h > 12 ? h - 12 : h);
|
|
220
|
+
}
|
|
221
|
+
],
|
|
222
|
+
[
|
|
223
|
+
/h{1}/g,
|
|
224
|
+
(date) => {
|
|
225
|
+
const h = date.getHours();
|
|
226
|
+
return h > 12 ? h - 12 : h;
|
|
227
|
+
}
|
|
228
|
+
],
|
|
229
|
+
[/m{2}/g, (date) => _pad(date.getMinutes())],
|
|
230
|
+
[/m{1}/g, (date) => date.getMinutes()],
|
|
231
|
+
[/s{2}/g, (date) => _pad(date.getSeconds())],
|
|
232
|
+
[/s{1}/g, (date) => date.getSeconds()],
|
|
233
|
+
[/S{3}/g, (date) => _pad(date.getMilliseconds(), 3)],
|
|
234
|
+
[/S{2}/g, (date) => _pad(date.getMilliseconds(), 2)],
|
|
235
|
+
[/S{1}/g, (date) => date.getMilliseconds()]
|
|
236
|
+
];
|
|
237
|
+
function dateFormat(dateValue, format = "YYYY-MM-DD HH:mm:ss") {
|
|
238
|
+
const date = dateParse(dateValue);
|
|
239
|
+
let result = format;
|
|
240
|
+
for (const rule of rules) {
|
|
241
|
+
result = result.replace(rule[0], String(rule[1](date)));
|
|
242
|
+
}
|
|
243
|
+
return result;
|
|
244
|
+
}
|
|
245
|
+
export {
|
|
246
|
+
TzDate as T,
|
|
247
|
+
dateFormat as a,
|
|
248
|
+
dateParse as d,
|
|
249
|
+
isValidDate as i
|
|
250
|
+
};
|
|
251
|
+
//# sourceMappingURL=core.mjs.map
|