@cloudcome/utils-core 0.0.0 → 1.1.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/dist/color/contrast.d.ts +10 -0
- 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/dist/color/hex-hsv.d.ts +20 -0
- package/dist/color/hex-hwb.d.ts +23 -0
- package/dist/color/hex-rgb.d.ts +18 -0
- package/dist/color/hsl-lighten.d.ts +10 -0
- package/dist/color/hsv-brighten.d.ts +12 -0
- package/dist/color/luminance.d.ts +10 -0
- package/dist/color/mix.d.ts +18 -0
- package/dist/color/rgb-hsl.d.ts +23 -0
- package/dist/color/rgb-hsv.d.ts +25 -0
- package/dist/color/rgb-hwb.d.ts +29 -0
- package/dist/color/rgb-lab.d.ts +25 -0
- package/dist/color/rgb-whiter.d.ts +12 -0
- package/dist/color/rgb-xyz.d.ts +22 -0
- package/dist/color/types.d.ts +83 -0
- package/dist/color/xyz-lab.d.ts +25 -0
- package/dist/color.cjs +250 -0
- package/dist/color.cjs.map +1 -0
- package/dist/color.d.ts +19 -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/dist/crypto.d.ts +44 -0
- 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/dist/date/is.d.ts +92 -0
- 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.d.ts +8 -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.d.ts +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/dist/env.d.ts +38 -0
- 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/dist/error.d.ts +22 -0
- 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 +11 -0
- package/dist/number.cjs.map +1 -0
- package/dist/number.d.ts +137 -0
- package/dist/number.mjs +11 -0
- package/dist/number.mjs.map +1 -0
- package/dist/object/each.d.ts +36 -0
- 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/dist/object/process.d.ts +46 -0
- package/dist/object.cjs +130 -0
- package/dist/object.cjs.map +1 -0
- package/dist/object.d.ts +5 -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/dist/promise.d.ts +50 -0
- 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/dist/qs.d.ts +62 -0
- 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 +147 -0
- package/dist/string2.cjs.map +1 -0
- package/dist/string2.mjs +148 -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.d.ts +2 -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/dist/timer.mjs +119 -0
- package/dist/timer.mjs.map +1 -0
- package/dist/tree.cjs +125 -0
- package/dist/tree.cjs.map +1 -0
- package/dist/tree.d.ts +210 -0
- 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/dist/type.d.ts +121 -0
- 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/dist/types.d.ts +57 -0
- 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 +1 -8
package/dist/regexp.cjs
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const specialRE = /[.*+?^=!:${}()|[\]/\\-]/g;
|
|
4
|
+
function regexpEscape(string) {
|
|
5
|
+
return string.replace(specialRE, "\\$&");
|
|
6
|
+
}
|
|
7
|
+
const EMAIL_RE = /^\w+[-+.\w]*@([a-z\d-]+\.)+[a-z]{2,5}$/i;
|
|
8
|
+
function isEmail(value) {
|
|
9
|
+
return EMAIL_RE.test(value);
|
|
10
|
+
}
|
|
11
|
+
const PHONE_RE = /^1\d{10}$/;
|
|
12
|
+
function isPhone(value) {
|
|
13
|
+
return PHONE_RE.test(value);
|
|
14
|
+
}
|
|
15
|
+
const IDNO_RE = /^(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|7[1]|8[1-2]|9[1])\d{4}(18|19|20)\d{2}[01]\d[0123]\d{4}[\dxX]$/;
|
|
16
|
+
function isIDNo(value) {
|
|
17
|
+
const isSameFormat = IDNO_RE.test(value);
|
|
18
|
+
if (!isSameFormat) return false;
|
|
19
|
+
const year = Number(value.slice(6, 10));
|
|
20
|
+
const month = Number(value.slice(10, 12));
|
|
21
|
+
const date = Number(value.slice(12, 14));
|
|
22
|
+
const d = new Date(year, month - 1, date);
|
|
23
|
+
const isSameDate = d.getFullYear() === year && d.getMonth() + 1 === month && d.getDate() === date;
|
|
24
|
+
if (!isSameDate) return false;
|
|
25
|
+
const coefficientList = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
|
|
26
|
+
const residueList = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"];
|
|
27
|
+
let sum = 0;
|
|
28
|
+
for (let start = 0; start < 17; start++) {
|
|
29
|
+
sum += Number(value.slice(start, start + 1)) * coefficientList[start];
|
|
30
|
+
}
|
|
31
|
+
return residueList[sum % 11] === value.slice(-1);
|
|
32
|
+
}
|
|
33
|
+
const URL_RE = /^https?:\/\/(([a-z\d-]+\.)+[a-z]{2,5}|(\d{1,3}\.){3}\d{1,3})(:[1-9]\d{0,4})?(\/|\/[\w#!:.?+=&%@'/()-]+)?$/i;
|
|
34
|
+
function isURL(value) {
|
|
35
|
+
return URL_RE.test(value);
|
|
36
|
+
}
|
|
37
|
+
const IPV4_RE = /^(?:(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$/;
|
|
38
|
+
function isIPV4(value) {
|
|
39
|
+
return IPV4_RE.test(value);
|
|
40
|
+
}
|
|
41
|
+
const INTEGER_RE = /^(-?[1-9]\d*|0)$/;
|
|
42
|
+
function isInteger(value) {
|
|
43
|
+
return INTEGER_RE.test(value);
|
|
44
|
+
}
|
|
45
|
+
const FLOAT_RE = /^-?([1-9]\d*|0)\.\d+$/;
|
|
46
|
+
function isFloat(value) {
|
|
47
|
+
return FLOAT_RE.test(value);
|
|
48
|
+
}
|
|
49
|
+
function isNumerical(value) {
|
|
50
|
+
return isInteger(value) || isFloat(value);
|
|
51
|
+
}
|
|
52
|
+
const DIGIT_RE = /^\d+$/;
|
|
53
|
+
function isDigit(value) {
|
|
54
|
+
return DIGIT_RE.test(value);
|
|
55
|
+
}
|
|
56
|
+
exports.isDigit = isDigit;
|
|
57
|
+
exports.isEmail = isEmail;
|
|
58
|
+
exports.isFloat = isFloat;
|
|
59
|
+
exports.isIDNo = isIDNo;
|
|
60
|
+
exports.isIPV4 = isIPV4;
|
|
61
|
+
exports.isInteger = isInteger;
|
|
62
|
+
exports.isNumerical = isNumerical;
|
|
63
|
+
exports.isPhone = isPhone;
|
|
64
|
+
exports.isURL = isURL;
|
|
65
|
+
exports.regexpEscape = regexpEscape;
|
|
66
|
+
//# sourceMappingURL=regexp.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regexp.cjs","sources":["../src/regexp.ts"],"sourcesContent":["const specialRE = /[.*+?^=!:${}()|[\\]/\\\\-]/g;\n\n/**\n * 编码处理正则表达式\n * @example\n * ```js\n * reEscape('/$')\n * // => '\\\\/\\\\$'\n * ```\n * @param {string} string\n * @returns {string}\n */\nexport function regexpEscape(string: string): string {\n return string.replace(specialRE, '\\\\$&');\n}\n\n// 邮箱\nconst EMAIL_RE = /^\\w+[-+.\\w]*@([a-z\\d-]+\\.)+[a-z]{2,5}$/i;\n/**\n * 判断字符串是否为邮箱格式,不对邮箱真实性做验证,如域名是否正确等\n * @param {string} value\n * @returns {boolean}\n */\nexport function isEmail(value: string): boolean {\n return EMAIL_RE.test(value);\n}\n\n// 手机号码\nconst PHONE_RE = /^1\\d{10}$/;\n/**\n * 判断字符串是否为宽松手机格式,即首位为 1 的 11 位数字都属于手机号\n * @param {string} value\n * @returns {boolean}\n */\nexport function isPhone(value: string): boolean {\n return PHONE_RE.test(value);\n}\n\n// 身份证号码\n// http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/\n// [\"北京市\", \"天津市\", \"河北省\", \"山西省\", \"内蒙古自治区\",\n// \"辽宁省\", \"吉林省\", \"黑龙江省\",\n// \"上海市\", \"江苏省\", \"浙江省\", \"安徽省\", \"福建省\", \"江西省\", \"山东省\",\n// \"河南省\", \"湖北省\", \"湖南省\", \"广东省\", \"广西壮族自治区\", \"海南省\",\n// \"重庆市\", \"四川省\", \"贵州省\", \"云南省\", \"西藏自治区\",\n// \"陕西省\", \"甘肃省\", \"青海省\",\"宁夏回族自治区\", \"新疆维吾尔自治区\",\n// \"台湾省\",\n// \"香港特别行政区\", \"澳门特别行政区\"]\n// [\"11\", \"12\", \"13\", \"14\", \"15\",\n// \"21\", \"22\", \"23\",\n// \"31\", \"32\", \"33\", \"34\", \"35\", \"36\", \"37\",\n// \"41\", \"42\", \"43\", \"44\", \"45\", \"46\",\n// \"50\", \"51\", \"52\", \"53\", \"54\",\n// \"61\", \"62\", \"63\", \"64\", \"65\",\n// \"71\",\n// \"81\", \"82\"]\n// 91 国外\nconst IDNO_RE =\n /^(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|7[1]|8[1-2]|9[1])\\d{4}(18|19|20)\\d{2}[01]\\d[0123]\\d{4}[\\dxX]$/;\n/**\n * 判断字符串是否为身份证号码格式\n * @param {string} value\n * @returns {boolean}\n */\nexport function isIDNo(value: string): boolean {\n const isSameFormat = IDNO_RE.test(value);\n\n if (!isSameFormat) return false;\n\n const year = Number(value.slice(6, 10));\n const month = Number(value.slice(10, 12));\n const date = Number(value.slice(12, 14));\n const d = new Date(year, month - 1, date);\n const isSameDate = d.getFullYear() === year && d.getMonth() + 1 === month && d.getDate() === date;\n\n if (!isSameDate) return false;\n\n // 将身份证号码前面的17位数分别乘以不同的系数;\n // 从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2\n // 将这17位数字和系数相乘的结果相加;\n // 用加出来和除以11,看余数是多少;\n // 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字;\n // 其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2\n // 通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。\n const coefficientList = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n const residueList = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n let sum = 0;\n\n for (let start = 0; start < 17; start++) {\n sum += Number(value.slice(start, start + 1)) * coefficientList[start];\n }\n\n return residueList[sum % 11] === value.slice(-1);\n}\n\n// url\nconst URL_RE =\n /^https?:\\/\\/(([a-z\\d-]+\\.)+[a-z]{2,5}|(\\d{1,3}\\.){3}\\d{1,3})(:[1-9]\\d{0,4})?(\\/|\\/[\\w#!:.?+=&%@'/()-]+)?$/i;\n/**\n * 判断字符串是否为 url 格式,仅支持 http 协议,支持域名或者 ipV4\n * @param {string} value\n * @returns {boolean}\n */\nexport function isURL(value: string): boolean {\n return URL_RE.test(value);\n}\n\n// ipv4\nconst IPV4_RE = /^(?:(?:\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])$/;\n/**\n * 判断字符串是否为 IPV4 格式,不对 ip 真实性做验证\n * @param {string} value\n * @returns {boolean}\n */\nexport function isIPV4(value: string): boolean {\n return IPV4_RE.test(value);\n}\n\nconst INTEGER_RE = /^(-?[1-9]\\d*|0)$/;\n/**\n * 判断字符串是否为整数(自然数),即 ...,-3,-2,-1,0,1,2,3,...\n * @param {string} value\n * @returns {boolean}\n */\nexport function isInteger(value: string): boolean {\n return INTEGER_RE.test(value);\n}\n\nconst FLOAT_RE = /^-?([1-9]\\d*|0)\\.\\d+$/;\n/**\n * 判断字符串是否为浮点数,即必须有小数点的有理数\n * @param {string} value\n * @returns {boolean}\n */\nexport function isFloat(value: string): boolean {\n return FLOAT_RE.test(value);\n}\n\n/**\n * 判断字符串是否为正确数值,包括整数和浮点数\n * @param {string} value\n * @returns {boolean}\n */\nexport function isNumerical(value: string): boolean {\n return isInteger(value) || isFloat(value);\n}\n\nconst DIGIT_RE = /^\\d+$/;\n/**\n * 判断字符串是否为数字,例如六位数字短信验证码(093031)\n * @param {string} value\n * @returns {boolean}\n */\nexport function isDigit(value: string): boolean {\n return DIGIT_RE.test(value);\n}\n"],"names":[],"mappings":";;AAAA,MAAM,YAAY;AAYX,SAAS,aAAa,QAAwB;AAC5C,SAAA,OAAO,QAAQ,WAAW,MAAM;AACzC;AAGA,MAAM,WAAW;AAMV,SAAS,QAAQ,OAAwB;AACvC,SAAA,SAAS,KAAK,KAAK;AAC5B;AAGA,MAAM,WAAW;AAMV,SAAS,QAAQ,OAAwB;AACvC,SAAA,SAAS,KAAK,KAAK;AAC5B;AAqBA,MAAM,UACJ;AAMK,SAAS,OAAO,OAAwB;AACvC,QAAA,eAAe,QAAQ,KAAK,KAAK;AAEnC,MAAA,CAAC,aAAqB,QAAA;AAE1B,QAAM,OAAO,OAAO,MAAM,MAAM,GAAG,EAAE,CAAC;AACtC,QAAM,QAAQ,OAAO,MAAM,MAAM,IAAI,EAAE,CAAC;AACxC,QAAM,OAAO,OAAO,MAAM,MAAM,IAAI,EAAE,CAAC;AACvC,QAAM,IAAI,IAAI,KAAK,MAAM,QAAQ,GAAG,IAAI;AACxC,QAAM,aAAa,EAAE,YAAY,MAAM,QAAQ,EAAE,SAAS,IAAI,MAAM,SAAS,EAAE,QAAc,MAAA;AAEzF,MAAA,CAAC,WAAmB,QAAA;AASxB,QAAM,kBAAkB,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AAC5E,QAAM,cAAc,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAC1E,MAAI,MAAM;AAEV,WAAS,QAAQ,GAAG,QAAQ,IAAI,SAAS;AAChC,WAAA,OAAO,MAAM,MAAM,OAAO,QAAQ,CAAC,CAAC,IAAI,gBAAgB,KAAK;AAAA,EAAA;AAGtE,SAAO,YAAY,MAAM,EAAE,MAAM,MAAM,MAAM,EAAE;AACjD;AAGA,MAAM,SACJ;AAMK,SAAS,MAAM,OAAwB;AACrC,SAAA,OAAO,KAAK,KAAK;AAC1B;AAGA,MAAM,UAAU;AAMT,SAAS,OAAO,OAAwB;AACtC,SAAA,QAAQ,KAAK,KAAK;AAC3B;AAEA,MAAM,aAAa;AAMZ,SAAS,UAAU,OAAwB;AACzC,SAAA,WAAW,KAAK,KAAK;AAC9B;AAEA,MAAM,WAAW;AAMV,SAAS,QAAQ,OAAwB;AACvC,SAAA,SAAS,KAAK,KAAK;AAC5B;AAOO,SAAS,YAAY,OAAwB;AAClD,SAAO,UAAU,KAAK,KAAK,QAAQ,KAAK;AAC1C;AAEA,MAAM,WAAW;AAMV,SAAS,QAAQ,OAAwB;AACvC,SAAA,SAAS,KAAK,KAAK;AAC5B;;;;;;;;;;;"}
|
package/dist/regexp.d.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 编码处理正则表达式
|
|
3
|
+
* @example
|
|
4
|
+
* ```js
|
|
5
|
+
* reEscape('/$')
|
|
6
|
+
* // => '\\/\\$'
|
|
7
|
+
* ```
|
|
8
|
+
* @param {string} string
|
|
9
|
+
* @returns {string}
|
|
10
|
+
*/
|
|
11
|
+
export declare function regexpEscape(string: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* 判断字符串是否为邮箱格式,不对邮箱真实性做验证,如域名是否正确等
|
|
14
|
+
* @param {string} value
|
|
15
|
+
* @returns {boolean}
|
|
16
|
+
*/
|
|
17
|
+
export declare function isEmail(value: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* 判断字符串是否为宽松手机格式,即首位为 1 的 11 位数字都属于手机号
|
|
20
|
+
* @param {string} value
|
|
21
|
+
* @returns {boolean}
|
|
22
|
+
*/
|
|
23
|
+
export declare function isPhone(value: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* 判断字符串是否为身份证号码格式
|
|
26
|
+
* @param {string} value
|
|
27
|
+
* @returns {boolean}
|
|
28
|
+
*/
|
|
29
|
+
export declare function isIDNo(value: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* 判断字符串是否为 url 格式,仅支持 http 协议,支持域名或者 ipV4
|
|
32
|
+
* @param {string} value
|
|
33
|
+
* @returns {boolean}
|
|
34
|
+
*/
|
|
35
|
+
export declare function isURL(value: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* 判断字符串是否为 IPV4 格式,不对 ip 真实性做验证
|
|
38
|
+
* @param {string} value
|
|
39
|
+
* @returns {boolean}
|
|
40
|
+
*/
|
|
41
|
+
export declare function isIPV4(value: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* 判断字符串是否为整数(自然数),即 ...,-3,-2,-1,0,1,2,3,...
|
|
44
|
+
* @param {string} value
|
|
45
|
+
* @returns {boolean}
|
|
46
|
+
*/
|
|
47
|
+
export declare function isInteger(value: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* 判断字符串是否为浮点数,即必须有小数点的有理数
|
|
50
|
+
* @param {string} value
|
|
51
|
+
* @returns {boolean}
|
|
52
|
+
*/
|
|
53
|
+
export declare function isFloat(value: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* 判断字符串是否为正确数值,包括整数和浮点数
|
|
56
|
+
* @param {string} value
|
|
57
|
+
* @returns {boolean}
|
|
58
|
+
*/
|
|
59
|
+
export declare function isNumerical(value: string): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* 判断字符串是否为数字,例如六位数字短信验证码(093031)
|
|
62
|
+
* @param {string} value
|
|
63
|
+
* @returns {boolean}
|
|
64
|
+
*/
|
|
65
|
+
export declare function isDigit(value: string): boolean;
|
package/dist/regexp.mjs
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const specialRE = /[.*+?^=!:${}()|[\]/\\-]/g;
|
|
2
|
+
function regexpEscape(string) {
|
|
3
|
+
return string.replace(specialRE, "\\$&");
|
|
4
|
+
}
|
|
5
|
+
const EMAIL_RE = /^\w+[-+.\w]*@([a-z\d-]+\.)+[a-z]{2,5}$/i;
|
|
6
|
+
function isEmail(value) {
|
|
7
|
+
return EMAIL_RE.test(value);
|
|
8
|
+
}
|
|
9
|
+
const PHONE_RE = /^1\d{10}$/;
|
|
10
|
+
function isPhone(value) {
|
|
11
|
+
return PHONE_RE.test(value);
|
|
12
|
+
}
|
|
13
|
+
const IDNO_RE = /^(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|7[1]|8[1-2]|9[1])\d{4}(18|19|20)\d{2}[01]\d[0123]\d{4}[\dxX]$/;
|
|
14
|
+
function isIDNo(value) {
|
|
15
|
+
const isSameFormat = IDNO_RE.test(value);
|
|
16
|
+
if (!isSameFormat) return false;
|
|
17
|
+
const year = Number(value.slice(6, 10));
|
|
18
|
+
const month = Number(value.slice(10, 12));
|
|
19
|
+
const date = Number(value.slice(12, 14));
|
|
20
|
+
const d = new Date(year, month - 1, date);
|
|
21
|
+
const isSameDate = d.getFullYear() === year && d.getMonth() + 1 === month && d.getDate() === date;
|
|
22
|
+
if (!isSameDate) return false;
|
|
23
|
+
const coefficientList = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
|
|
24
|
+
const residueList = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"];
|
|
25
|
+
let sum = 0;
|
|
26
|
+
for (let start = 0; start < 17; start++) {
|
|
27
|
+
sum += Number(value.slice(start, start + 1)) * coefficientList[start];
|
|
28
|
+
}
|
|
29
|
+
return residueList[sum % 11] === value.slice(-1);
|
|
30
|
+
}
|
|
31
|
+
const URL_RE = /^https?:\/\/(([a-z\d-]+\.)+[a-z]{2,5}|(\d{1,3}\.){3}\d{1,3})(:[1-9]\d{0,4})?(\/|\/[\w#!:.?+=&%@'/()-]+)?$/i;
|
|
32
|
+
function isURL(value) {
|
|
33
|
+
return URL_RE.test(value);
|
|
34
|
+
}
|
|
35
|
+
const IPV4_RE = /^(?:(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$/;
|
|
36
|
+
function isIPV4(value) {
|
|
37
|
+
return IPV4_RE.test(value);
|
|
38
|
+
}
|
|
39
|
+
const INTEGER_RE = /^(-?[1-9]\d*|0)$/;
|
|
40
|
+
function isInteger(value) {
|
|
41
|
+
return INTEGER_RE.test(value);
|
|
42
|
+
}
|
|
43
|
+
const FLOAT_RE = /^-?([1-9]\d*|0)\.\d+$/;
|
|
44
|
+
function isFloat(value) {
|
|
45
|
+
return FLOAT_RE.test(value);
|
|
46
|
+
}
|
|
47
|
+
function isNumerical(value) {
|
|
48
|
+
return isInteger(value) || isFloat(value);
|
|
49
|
+
}
|
|
50
|
+
const DIGIT_RE = /^\d+$/;
|
|
51
|
+
function isDigit(value) {
|
|
52
|
+
return DIGIT_RE.test(value);
|
|
53
|
+
}
|
|
54
|
+
export {
|
|
55
|
+
isDigit,
|
|
56
|
+
isEmail,
|
|
57
|
+
isFloat,
|
|
58
|
+
isIDNo,
|
|
59
|
+
isIPV4,
|
|
60
|
+
isInteger,
|
|
61
|
+
isNumerical,
|
|
62
|
+
isPhone,
|
|
63
|
+
isURL,
|
|
64
|
+
regexpEscape
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=regexp.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regexp.mjs","sources":["../src/regexp.ts"],"sourcesContent":["const specialRE = /[.*+?^=!:${}()|[\\]/\\\\-]/g;\n\n/**\n * 编码处理正则表达式\n * @example\n * ```js\n * reEscape('/$')\n * // => '\\\\/\\\\$'\n * ```\n * @param {string} string\n * @returns {string}\n */\nexport function regexpEscape(string: string): string {\n return string.replace(specialRE, '\\\\$&');\n}\n\n// 邮箱\nconst EMAIL_RE = /^\\w+[-+.\\w]*@([a-z\\d-]+\\.)+[a-z]{2,5}$/i;\n/**\n * 判断字符串是否为邮箱格式,不对邮箱真实性做验证,如域名是否正确等\n * @param {string} value\n * @returns {boolean}\n */\nexport function isEmail(value: string): boolean {\n return EMAIL_RE.test(value);\n}\n\n// 手机号码\nconst PHONE_RE = /^1\\d{10}$/;\n/**\n * 判断字符串是否为宽松手机格式,即首位为 1 的 11 位数字都属于手机号\n * @param {string} value\n * @returns {boolean}\n */\nexport function isPhone(value: string): boolean {\n return PHONE_RE.test(value);\n}\n\n// 身份证号码\n// http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/\n// [\"北京市\", \"天津市\", \"河北省\", \"山西省\", \"内蒙古自治区\",\n// \"辽宁省\", \"吉林省\", \"黑龙江省\",\n// \"上海市\", \"江苏省\", \"浙江省\", \"安徽省\", \"福建省\", \"江西省\", \"山东省\",\n// \"河南省\", \"湖北省\", \"湖南省\", \"广东省\", \"广西壮族自治区\", \"海南省\",\n// \"重庆市\", \"四川省\", \"贵州省\", \"云南省\", \"西藏自治区\",\n// \"陕西省\", \"甘肃省\", \"青海省\",\"宁夏回族自治区\", \"新疆维吾尔自治区\",\n// \"台湾省\",\n// \"香港特别行政区\", \"澳门特别行政区\"]\n// [\"11\", \"12\", \"13\", \"14\", \"15\",\n// \"21\", \"22\", \"23\",\n// \"31\", \"32\", \"33\", \"34\", \"35\", \"36\", \"37\",\n// \"41\", \"42\", \"43\", \"44\", \"45\", \"46\",\n// \"50\", \"51\", \"52\", \"53\", \"54\",\n// \"61\", \"62\", \"63\", \"64\", \"65\",\n// \"71\",\n// \"81\", \"82\"]\n// 91 国外\nconst IDNO_RE =\n /^(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|7[1]|8[1-2]|9[1])\\d{4}(18|19|20)\\d{2}[01]\\d[0123]\\d{4}[\\dxX]$/;\n/**\n * 判断字符串是否为身份证号码格式\n * @param {string} value\n * @returns {boolean}\n */\nexport function isIDNo(value: string): boolean {\n const isSameFormat = IDNO_RE.test(value);\n\n if (!isSameFormat) return false;\n\n const year = Number(value.slice(6, 10));\n const month = Number(value.slice(10, 12));\n const date = Number(value.slice(12, 14));\n const d = new Date(year, month - 1, date);\n const isSameDate = d.getFullYear() === year && d.getMonth() + 1 === month && d.getDate() === date;\n\n if (!isSameDate) return false;\n\n // 将身份证号码前面的17位数分别乘以不同的系数;\n // 从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2\n // 将这17位数字和系数相乘的结果相加;\n // 用加出来和除以11,看余数是多少;\n // 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字;\n // 其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2\n // 通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。\n const coefficientList = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n const residueList = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n let sum = 0;\n\n for (let start = 0; start < 17; start++) {\n sum += Number(value.slice(start, start + 1)) * coefficientList[start];\n }\n\n return residueList[sum % 11] === value.slice(-1);\n}\n\n// url\nconst URL_RE =\n /^https?:\\/\\/(([a-z\\d-]+\\.)+[a-z]{2,5}|(\\d{1,3}\\.){3}\\d{1,3})(:[1-9]\\d{0,4})?(\\/|\\/[\\w#!:.?+=&%@'/()-]+)?$/i;\n/**\n * 判断字符串是否为 url 格式,仅支持 http 协议,支持域名或者 ipV4\n * @param {string} value\n * @returns {boolean}\n */\nexport function isURL(value: string): boolean {\n return URL_RE.test(value);\n}\n\n// ipv4\nconst IPV4_RE = /^(?:(?:\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])$/;\n/**\n * 判断字符串是否为 IPV4 格式,不对 ip 真实性做验证\n * @param {string} value\n * @returns {boolean}\n */\nexport function isIPV4(value: string): boolean {\n return IPV4_RE.test(value);\n}\n\nconst INTEGER_RE = /^(-?[1-9]\\d*|0)$/;\n/**\n * 判断字符串是否为整数(自然数),即 ...,-3,-2,-1,0,1,2,3,...\n * @param {string} value\n * @returns {boolean}\n */\nexport function isInteger(value: string): boolean {\n return INTEGER_RE.test(value);\n}\n\nconst FLOAT_RE = /^-?([1-9]\\d*|0)\\.\\d+$/;\n/**\n * 判断字符串是否为浮点数,即必须有小数点的有理数\n * @param {string} value\n * @returns {boolean}\n */\nexport function isFloat(value: string): boolean {\n return FLOAT_RE.test(value);\n}\n\n/**\n * 判断字符串是否为正确数值,包括整数和浮点数\n * @param {string} value\n * @returns {boolean}\n */\nexport function isNumerical(value: string): boolean {\n return isInteger(value) || isFloat(value);\n}\n\nconst DIGIT_RE = /^\\d+$/;\n/**\n * 判断字符串是否为数字,例如六位数字短信验证码(093031)\n * @param {string} value\n * @returns {boolean}\n */\nexport function isDigit(value: string): boolean {\n return DIGIT_RE.test(value);\n}\n"],"names":[],"mappings":"AAAA,MAAM,YAAY;AAYX,SAAS,aAAa,QAAwB;AAC5C,SAAA,OAAO,QAAQ,WAAW,MAAM;AACzC;AAGA,MAAM,WAAW;AAMV,SAAS,QAAQ,OAAwB;AACvC,SAAA,SAAS,KAAK,KAAK;AAC5B;AAGA,MAAM,WAAW;AAMV,SAAS,QAAQ,OAAwB;AACvC,SAAA,SAAS,KAAK,KAAK;AAC5B;AAqBA,MAAM,UACJ;AAMK,SAAS,OAAO,OAAwB;AACvC,QAAA,eAAe,QAAQ,KAAK,KAAK;AAEnC,MAAA,CAAC,aAAqB,QAAA;AAE1B,QAAM,OAAO,OAAO,MAAM,MAAM,GAAG,EAAE,CAAC;AACtC,QAAM,QAAQ,OAAO,MAAM,MAAM,IAAI,EAAE,CAAC;AACxC,QAAM,OAAO,OAAO,MAAM,MAAM,IAAI,EAAE,CAAC;AACvC,QAAM,IAAI,IAAI,KAAK,MAAM,QAAQ,GAAG,IAAI;AACxC,QAAM,aAAa,EAAE,YAAY,MAAM,QAAQ,EAAE,SAAS,IAAI,MAAM,SAAS,EAAE,QAAc,MAAA;AAEzF,MAAA,CAAC,WAAmB,QAAA;AASxB,QAAM,kBAAkB,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AAC5E,QAAM,cAAc,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAC1E,MAAI,MAAM;AAEV,WAAS,QAAQ,GAAG,QAAQ,IAAI,SAAS;AAChC,WAAA,OAAO,MAAM,MAAM,OAAO,QAAQ,CAAC,CAAC,IAAI,gBAAgB,KAAK;AAAA,EAAA;AAGtE,SAAO,YAAY,MAAM,EAAE,MAAM,MAAM,MAAM,EAAE;AACjD;AAGA,MAAM,SACJ;AAMK,SAAS,MAAM,OAAwB;AACrC,SAAA,OAAO,KAAK,KAAK;AAC1B;AAGA,MAAM,UAAU;AAMT,SAAS,OAAO,OAAwB;AACtC,SAAA,QAAQ,KAAK,KAAK;AAC3B;AAEA,MAAM,aAAa;AAMZ,SAAS,UAAU,OAAwB;AACzC,SAAA,WAAW,KAAK,KAAK;AAC9B;AAEA,MAAM,WAAW;AAMV,SAAS,QAAQ,OAAwB;AACvC,SAAA,SAAS,KAAK,KAAK;AAC5B;AAOO,SAAS,YAAY,OAAwB;AAClD,SAAO,UAAU,KAAK,KAAK,QAAQ,KAAK;AAC1C;AAEA,MAAM,WAAW;AAMV,SAAS,QAAQ,OAAwB;AACvC,SAAA,SAAS,KAAK,KAAK;AAC5B;"}
|
package/dist/string.cjs
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const number = require("./string2.cjs");
|
|
4
|
+
require("./type.cjs");
|
|
5
|
+
exports.STRING_ARABIC_NUMERALS = number.STRING_ARABIC_NUMERALS;
|
|
6
|
+
exports.STRING_DICT = number.STRING_DICT;
|
|
7
|
+
exports.STRING_HEXADECIMALS = number.STRING_HEXADECIMALS;
|
|
8
|
+
exports.STRING_LOWERCASE_ALPHA = number.STRING_LOWERCASE_ALPHA;
|
|
9
|
+
exports.STRING_UPPERCASE_ALPHA = number.STRING_UPPERCASE_ALPHA;
|
|
10
|
+
exports.randomString = number.randomString;
|
|
11
|
+
exports.randomUUID4 = number.randomUUID4;
|
|
12
|
+
exports.stringCamelCase = number.stringCamelCase;
|
|
13
|
+
exports.stringFormat = number.stringFormat;
|
|
14
|
+
exports.stringKebabCase = number.stringKebabCase;
|
|
15
|
+
exports.stringify = number.stringify;
|
|
16
|
+
//# sourceMappingURL=string.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
|
package/dist/string.d.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export declare const STRING_ARABIC_NUMERALS = "0123456789";
|
|
2
|
+
export declare const STRING_HEXADECIMALS = "0123456789abcdef";
|
|
3
|
+
export declare const STRING_LOWERCASE_ALPHA = "abcdefghijklmnopqrstuvwxyz";
|
|
4
|
+
export declare const STRING_UPPERCASE_ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
5
|
+
export declare const STRING_DICT = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
6
|
+
/**
|
|
7
|
+
* 将字符串转换为驼峰格式
|
|
8
|
+
* @param {string} string - 要转换的字符串
|
|
9
|
+
* @param {boolean} [bigger] - 是否大写第一个字母,默认为 false
|
|
10
|
+
* @returns {string} - 转换后的驼峰格式字符串
|
|
11
|
+
*/
|
|
12
|
+
export declare function stringCamelCase(string: string, bigger?: boolean): string;
|
|
13
|
+
/**
|
|
14
|
+
* 将字符串转换为连字格式
|
|
15
|
+
* @param {string} string - 要转换的字符串
|
|
16
|
+
* @param {string} [separator] - 分隔符,默认是 "-"(短横线)
|
|
17
|
+
* @returns {string} - 转换后的连字格式字符串
|
|
18
|
+
*/
|
|
19
|
+
export declare function stringKebabCase(string: string, separator?: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* 生成随机字符串
|
|
22
|
+
* @param {number} length - 生成的随机字符串长度
|
|
23
|
+
* @param {string} [dict] - 用于生成随机字符串的字符字典,默认为数字、小写字母和大写字母的组合
|
|
24
|
+
* @returns {string} - 生成的随机字符串
|
|
25
|
+
* @example
|
|
26
|
+
* randomString(10); // 生成一个长度为 10 的随机字符串
|
|
27
|
+
* randomString(8, 'ABCDEF'); // 生成一个长度为 8 的随机字符串,仅包含字符 'ABCDEF'
|
|
28
|
+
*/
|
|
29
|
+
export declare function randomString(length: number, dict?: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* 简单的模板引擎,类似于 Python 的 `.format()` 方法
|
|
32
|
+
* 支持通过索引或对象/名称的方式传递变量
|
|
33
|
+
* 当使用对象/名称方式时,可以传递一个回退值作为第三个参数
|
|
34
|
+
*
|
|
35
|
+
* @category 字符串
|
|
36
|
+
* @example
|
|
37
|
+
* ```
|
|
38
|
+
* // 索引方式
|
|
39
|
+
* const result = stringFormat(
|
|
40
|
+
* '你好 {0}!我的名字是 {1}。',
|
|
41
|
+
* '张三',
|
|
42
|
+
* '李四'
|
|
43
|
+
* ); // 你好 张三!我的名字是 李四。
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```
|
|
48
|
+
* // 对象方式
|
|
49
|
+
* const result = stringFormat(
|
|
50
|
+
* '{greet}!我的名字是 {name}。',
|
|
51
|
+
* { greet: '你好', name: '王五' }
|
|
52
|
+
* ); // 你好!我的名字是 王五。
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```
|
|
57
|
+
* // 带回退值的对象方式
|
|
58
|
+
* const result = stringFormat(
|
|
59
|
+
* '{greet}!我的名字是 {name}。',
|
|
60
|
+
* { greet: '你好' }, // name 未传递,因此会使用回退值
|
|
61
|
+
* '未知'
|
|
62
|
+
* ); // 你好!我的名字是 未知。
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function stringFormat(str: string, object: Record<string | number, unknown>, fallback?: string | ((key: string) => string)): string;
|
|
66
|
+
export declare function stringFormat(str: string, ...args: (string | number | bigint | undefined | null)[]): string;
|
|
67
|
+
/**
|
|
68
|
+
* 生成符合 [RFC 4122](https://www.ietf.org/rfc/rfc4122.txt) 版本 4 的 UUID 字符串
|
|
69
|
+
* @returns {string} - 生成的 UUID 字符串
|
|
70
|
+
* @example
|
|
71
|
+
* const uuid = randomUUID4();
|
|
72
|
+
* console.log(uuid); // 输出类似 '123e4567-e89b-12d3-a456-426614174000' 的 UUID 字符串
|
|
73
|
+
*/
|
|
74
|
+
export declare function randomUUID4(): string;
|
|
75
|
+
/**
|
|
76
|
+
* 将值转换为字符串,若值为 null 或 undefined 则返回空字符串
|
|
77
|
+
* @param {unknown} value - 需要转换的值
|
|
78
|
+
* @returns {string} 转换后的字符串结果
|
|
79
|
+
*/
|
|
80
|
+
export declare function stringify(value: unknown): string;
|
package/dist/string.mjs
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { d, S, e, g, h, k, l, i, s, j, m } from "./string2.mjs";
|
|
2
|
+
import "./type.mjs";
|
|
3
|
+
export {
|
|
4
|
+
d as STRING_ARABIC_NUMERALS,
|
|
5
|
+
S as STRING_DICT,
|
|
6
|
+
e as STRING_HEXADECIMALS,
|
|
7
|
+
g as STRING_LOWERCASE_ALPHA,
|
|
8
|
+
h as STRING_UPPERCASE_ALPHA,
|
|
9
|
+
k as randomString,
|
|
10
|
+
l as randomUUID4,
|
|
11
|
+
i as stringCamelCase,
|
|
12
|
+
s as stringFormat,
|
|
13
|
+
j as stringKebabCase,
|
|
14
|
+
m as stringify
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=string.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
package/dist/string2.cjs
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const merge = require("./merge.cjs");
|
|
3
|
+
const type = require("./type.cjs");
|
|
4
|
+
function numberFixed(number, options) {
|
|
5
|
+
const { precision = 0, round = 0 } = options || {};
|
|
6
|
+
const scale = 10 ** precision;
|
|
7
|
+
if (round === 1) {
|
|
8
|
+
return Math.ceil(number * scale) / scale;
|
|
9
|
+
}
|
|
10
|
+
if (round === -1) {
|
|
11
|
+
return Math.floor(number * scale) / scale;
|
|
12
|
+
}
|
|
13
|
+
return Math.round(number * scale) / scale;
|
|
14
|
+
}
|
|
15
|
+
function randomNumber(min, max) {
|
|
16
|
+
const [minFinal, maxFinal] = min > max ? [max, min] : [min, max];
|
|
17
|
+
return Math.floor(Math.random() * (maxFinal - minFinal + 1) + minFinal);
|
|
18
|
+
}
|
|
19
|
+
function numberAbbr(number, units, options) {
|
|
20
|
+
const { base = 1e3, precision = 0 } = options || {};
|
|
21
|
+
const { length } = units;
|
|
22
|
+
if (length === 0) throw new Error("数字单位组不能为空");
|
|
23
|
+
let numberFinal = number;
|
|
24
|
+
let step = 0;
|
|
25
|
+
while (numberFinal >= base && step < length - 1) {
|
|
26
|
+
numberFinal = numberFinal / base;
|
|
27
|
+
step++;
|
|
28
|
+
}
|
|
29
|
+
const value = numberFixed(numberFinal, { precision, round: -1 });
|
|
30
|
+
const unit = units[step];
|
|
31
|
+
return `${value}${unit}`;
|
|
32
|
+
}
|
|
33
|
+
function fileSizeAbbr(number, precision = 0) {
|
|
34
|
+
return numberAbbr(number, ["B", "KB", "MB", "GB", "TB"], {
|
|
35
|
+
base: 1024,
|
|
36
|
+
precision
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function numberConvert(decimal, dict) {
|
|
40
|
+
const dictFinal = dict || STRING_DICT;
|
|
41
|
+
if (dictFinal.length < 2) throw new Error("进制转换字典长度不能小于 2");
|
|
42
|
+
let bigInt = BigInt(decimal);
|
|
43
|
+
const symbol = bigInt < 0n ? "-" : "";
|
|
44
|
+
bigInt = bigInt < 0n ? -bigInt : bigInt;
|
|
45
|
+
const result = [];
|
|
46
|
+
const { length } = dictFinal;
|
|
47
|
+
const bigLength = BigInt(length);
|
|
48
|
+
const calculate = () => {
|
|
49
|
+
const y = Number(bigInt % bigLength);
|
|
50
|
+
bigInt = bigInt / bigLength;
|
|
51
|
+
result.unshift(dictFinal[y]);
|
|
52
|
+
if (bigInt > 0) {
|
|
53
|
+
calculate();
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
calculate();
|
|
57
|
+
return symbol + result.join("");
|
|
58
|
+
}
|
|
59
|
+
function numberFormat(number, options) {
|
|
60
|
+
let optionsFinal = {
|
|
61
|
+
separator: ",",
|
|
62
|
+
step: 3
|
|
63
|
+
};
|
|
64
|
+
if (typeof options === "string") {
|
|
65
|
+
optionsFinal.separator = options;
|
|
66
|
+
} else if (typeof options === "number") {
|
|
67
|
+
optionsFinal.step = options;
|
|
68
|
+
} else {
|
|
69
|
+
optionsFinal = merge.objectDefaults(options || {}, optionsFinal);
|
|
70
|
+
}
|
|
71
|
+
const { separator, step } = optionsFinal;
|
|
72
|
+
const arr = String(number).split(".");
|
|
73
|
+
const re = new RegExp(`(\\d)(?=(\\d{${step}})+(?!\\d))`, "g");
|
|
74
|
+
const p1 = arr[0].replace(re, `$1${separator}`);
|
|
75
|
+
return p1 + (arr[1] ? `.${arr[1]}` : "");
|
|
76
|
+
}
|
|
77
|
+
const STRING_ARABIC_NUMERALS = "0123456789";
|
|
78
|
+
const STRING_HEXADECIMALS = "0123456789abcdef";
|
|
79
|
+
const STRING_LOWERCASE_ALPHA = "abcdefghijklmnopqrstuvwxyz";
|
|
80
|
+
const STRING_UPPERCASE_ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
81
|
+
const STRING_DICT = `${STRING_ARABIC_NUMERALS + STRING_UPPERCASE_ALPHA + STRING_LOWERCASE_ALPHA}`;
|
|
82
|
+
function stringCamelCase(string, bigger) {
|
|
83
|
+
const string2 = string.replace(/[\s_-](.)/g, (_, char) => char.toUpperCase());
|
|
84
|
+
return bigger ? string2.slice(0, 1).toUpperCase() + string2.slice(1) : string2;
|
|
85
|
+
}
|
|
86
|
+
function stringKebabCase(string, separator = "-") {
|
|
87
|
+
return string.replace(/[A-Z]/g, (origin) => `${separator}${origin.toLowerCase()}`);
|
|
88
|
+
}
|
|
89
|
+
function randomString(length, dict) {
|
|
90
|
+
const dictFinal = dict || STRING_DICT;
|
|
91
|
+
const dictLength = dictFinal.length;
|
|
92
|
+
let result = "";
|
|
93
|
+
for (let i = 0; i < length; i++) {
|
|
94
|
+
result += dictFinal.charAt(randomNumber(0, dictLength - 1));
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
function stringFormat(str, ...args) {
|
|
99
|
+
const [firstArg, fallback] = args;
|
|
100
|
+
if (type.isObject(firstArg) || type.isUndefined(firstArg)) {
|
|
101
|
+
const vars = firstArg || {};
|
|
102
|
+
return str.replace(/\{(\w+)\}/g, (_, key) => vars[key] ?? (type.isFunction(fallback) ? fallback(key) : fallback) ?? key);
|
|
103
|
+
}
|
|
104
|
+
return str.replace(/\{(\d+)\}/g, (_, key) => {
|
|
105
|
+
const index = Number(key);
|
|
106
|
+
if (Number.isNaN(index)) return key;
|
|
107
|
+
return args[index];
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
function randomUUID4() {
|
|
111
|
+
const template = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";
|
|
112
|
+
let result = "";
|
|
113
|
+
for (let i = 0; i < template.length; i++) {
|
|
114
|
+
const t = template[i];
|
|
115
|
+
if (t === "-" || t === "4") {
|
|
116
|
+
result += t;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (t === "y") {
|
|
120
|
+
result += randomString(1, "89ab");
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
result += randomString(1, STRING_HEXADECIMALS);
|
|
124
|
+
}
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
function stringify(value) {
|
|
128
|
+
return type.isNullish(value) ? "" : String(value);
|
|
129
|
+
}
|
|
130
|
+
exports.STRING_ARABIC_NUMERALS = STRING_ARABIC_NUMERALS;
|
|
131
|
+
exports.STRING_DICT = STRING_DICT;
|
|
132
|
+
exports.STRING_HEXADECIMALS = STRING_HEXADECIMALS;
|
|
133
|
+
exports.STRING_LOWERCASE_ALPHA = STRING_LOWERCASE_ALPHA;
|
|
134
|
+
exports.STRING_UPPERCASE_ALPHA = STRING_UPPERCASE_ALPHA;
|
|
135
|
+
exports.fileSizeAbbr = fileSizeAbbr;
|
|
136
|
+
exports.numberAbbr = numberAbbr;
|
|
137
|
+
exports.numberConvert = numberConvert;
|
|
138
|
+
exports.numberFixed = numberFixed;
|
|
139
|
+
exports.numberFormat = numberFormat;
|
|
140
|
+
exports.randomNumber = randomNumber;
|
|
141
|
+
exports.randomString = randomString;
|
|
142
|
+
exports.randomUUID4 = randomUUID4;
|
|
143
|
+
exports.stringCamelCase = stringCamelCase;
|
|
144
|
+
exports.stringFormat = stringFormat;
|
|
145
|
+
exports.stringKebabCase = stringKebabCase;
|
|
146
|
+
exports.stringify = stringify;
|
|
147
|
+
//# sourceMappingURL=string2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string2.cjs","sources":["../src/number.ts","../src/string.ts"],"sourcesContent":["import { objectDefaults } from './object';\nimport { STRING_DICT } from './string';\n\nexport type NumberFixedOptions = {\n /**\n * 保留的小数位数\n * @default 0\n */\n precision?: number;\n\n /**\n * 舍入方法,0 为四舍五入,1 为向上取整,-1 为向下取整\n * @default 0\n */\n round?: 0 | 1 | -1;\n};\n\n/**\n * 对数字进行精确小数位数处理并按规则舍入\n * @param number 需要处理的原始数值\n * @param options 可选配置参数\n * @returns 处理后的数值(number类型)\n * @example\n * // 四舍五入示例\n * numberFixed(3.1415, { precision: 2 }); // 3.14\n * // 向上取整示例\n * numberFixed(3.1415, { precision: 2, round: 1 }); // 3.15\n * // 向下取整示例\n * numberFixed(3.9999, { precision: 1, round: -1 }); // 3.9\n */\nexport function numberFixed(number: number, options?: NumberFixedOptions) {\n const { precision = 0, round = 0 } = options || {};\n const scale = 10 ** precision;\n\n if (round === 1) {\n return Math.ceil(number * scale) / scale;\n }\n\n if (round === -1) {\n return Math.floor(number * scale) / scale;\n }\n\n return Math.round(number * scale) / scale;\n}\n\n/**\n * 生成指定范围内的随机整数\n * @param {number} min - 随机数的最小值(包含)\n * @param {number} max - 随机数的最大值(包含)\n * @returns {number} - 生成的随机整数\n * @example\n * // 生成 1 到 10 之间的随机整数\n * randomNumber(1, 10); // 可能返回 7\n */\nexport function randomNumber(min: number, max: number): number {\n const [minFinal, maxFinal] = min > max ? [max, min] : [min, max];\n return Math.floor(Math.random() * (maxFinal - minFinal + 1) + minFinal);\n}\n\n/**\n * 数字缩写选项\n */\nexport type NumberAbbrOptions = {\n /**\n * 进制基数,用于计算单位进阶(如 1000 表示千进制)\n * @default 1000\n */\n base?: number;\n\n /**\n * 数值保留的小数位数\n * @default 0\n */\n precision?: number;\n};\n\n/**\n * 将数字转换为带单位缩写的字符串表示\n *\n * @param {number} number - 需要转换的原始数值\n * @param {Array<string>} units - 单位数组,按从小到大顺序排列(如['B','KB','MB']),不能为空\n * @param {NumberAbbrOptions} [options] - 可选配置参数\n * @returns {string} - 转换后的带单位字符串(如\"1.2KB\")\n * @example\n * // 基础用法\n * numberAbbr(1500, ['', 'K', 'M'], { base: 1000 }); // \"1.5K\"\n * @example\n * // 自定义小数位\n * numberAbbr(123456, ['B','KB','MB'], { precision: 1 }); // \"0.1MB\"\n * @example\n * // 处理不足基数的情况\n * numberAbbr(500, ['B','KB']); // \"500B\"\n */\nexport function numberAbbr(number: number, units: Array<string>, options?: NumberAbbrOptions): string {\n const { base = 1000, precision = 0 } = options || {};\n const { length } = units;\n\n if (length === 0) throw new Error('数字单位组不能为空');\n\n let numberFinal = number;\n let step = 0;\n\n while (numberFinal >= base && step < length - 1) {\n numberFinal = numberFinal / base;\n step++;\n }\n\n const value = numberFixed(numberFinal, { precision, round: -1 });\n const unit = units[step];\n\n return `${value}${unit}`;\n}\n\n/**\n * 将文件大小转换为带单位缩写的字符串表示\n *\n * @param {number} number - 需要转换的文件大小数值\n * @param {number} [precision=0] - 数值保留的小数位数\n * @returns {string} - 转换后的带单位字符串(如\"1.2KB\")\n * @example\n * // 基础用法\n * fileSizeAbbr(1024); // \"1KB\"\n * @example\n * // 自定义小数位\n * fileSizeAbbr(123456, 1); // \"0.1MB\"\n */\nexport function fileSizeAbbr(number: number, precision = 0) {\n return numberAbbr(number, ['B', 'KB', 'MB', 'GB', 'TB'], {\n base: 1024,\n precision,\n });\n}\n\n/**\n * 将十进制数转换为指定进制的字符串表示\n *\n * @param {number | bigint} decimal - 需要转换的十进制数,可以是任意长度的数字或大整数\n * @param {string} [dict] - 用于表示进制的字符字典,默认为数字、小写字母和大写字母的组合(62 进制)\n * @returns {string} - 转换后的指定进制字符串\n * @throws {Error} - 如果字符字典的长度小于 2,将抛出错误\n * @example\n * // 默认 62 进制\n * numberConvert(123456789); // \"8M0kX\"\n * @example\n * // 自定义 16 进制\n * numberConvert(255, '0123456789ABCDEF'); // \"FF\"\n * @example\n * // 处理大整数\n * numberConvert(9007199254740991n); // \"2gosa7pa2GV\"\n */\nexport function numberConvert(decimal: number | bigint, dict?: string): string {\n const dictFinal = dict || STRING_DICT;\n\n if (dictFinal.length < 2) throw new Error('进制转换字典长度不能小于 2');\n\n let bigInt = BigInt(decimal);\n const symbol = bigInt < 0n ? '-' : '';\n bigInt = bigInt < 0n ? -bigInt : bigInt;\n const result: Array<string> = [];\n const { length } = dictFinal;\n const bigLength = BigInt(length);\n const calculate = (): void => {\n const y = Number(bigInt % bigLength);\n\n bigInt = bigInt / bigLength;\n result.unshift(dictFinal[y]);\n\n if (bigInt > 0) {\n calculate();\n }\n };\n\n calculate();\n\n return symbol + result.join('');\n}\n\n/**\n * 数字格式化配置选项\n */\nexport type NumberFormatOptions = {\n /**\n * 分隔符字符,用于数字分隔\n * @default ','\n * @example 使用 '_' 分隔符时,123456 会格式化为 '123_456'\n */\n separator?: string;\n\n /**\n * 分隔步长,即每隔多少位添加分隔符\n * @default 3\n * @example 步长为 2 时,123456 会格式化为 '12,34,56'\n */\n step?: number;\n};\n\n/**\n * 数字格式化\n * @param [number] {number} 数字\n * @param options {NumberFormatOptions} 格式化配置\n * @returns {string} 分割后的字符串\n * @example\n * // 使用默认分隔符和步长\n * numberFormat(123456.789); // => \"123,456.789\"\n * // 自定义分隔符\n * numberFormat(123456.789, '_'); // => \"123_456.789\"\n * // 自定义步长\n * numberFormat(123456.789, 2); // => \"12,34,56.789\"\n * // 使用对象配置\n * numberFormat(123456.789, { separator: '.', step: 4 }); // => \"12.3456.789\"\n */\nexport function numberFormat(number: number, options: NumberFormatOptions): string;\nexport function numberFormat(number: number, separator: string): string;\nexport function numberFormat(number: number, step: number): string;\nexport function numberFormat(number: number): string;\nexport function numberFormat(number: number, options?: NumberFormatOptions | string | number) {\n let optionsFinal: Required<NumberFormatOptions> = {\n separator: ',',\n step: 3,\n };\n\n if (typeof options === 'string') {\n optionsFinal.separator = options;\n } else if (typeof options === 'number') {\n optionsFinal.step = options;\n } else {\n optionsFinal = objectDefaults(options || {}, optionsFinal) as Required<NumberFormatOptions>;\n }\n\n const { separator, step } = optionsFinal;\n const arr = String(number).split('.');\n const re = new RegExp(`(\\\\d)(?=(\\\\d{${step}})+(?!\\\\d))`, 'g');\n const p1 = arr[0].replace(re, `$1${separator}`);\n\n return p1 + (arr[1] ? `.${arr[1]}` : '');\n}\n","import { numberConvert, randomNumber } from './number';\nimport { isFunction, isNullish, isNumber, isObject, isString, isUndefined } from './type';\n\nexport const STRING_ARABIC_NUMERALS = '0123456789';\nexport const STRING_HEXADECIMALS = '0123456789abcdef';\nexport const STRING_LOWERCASE_ALPHA = 'abcdefghijklmnopqrstuvwxyz';\nexport const STRING_UPPERCASE_ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nexport const STRING_DICT = `${STRING_ARABIC_NUMERALS + STRING_UPPERCASE_ALPHA + STRING_LOWERCASE_ALPHA}`;\n\n/**\n * 将字符串转换为驼峰格式\n * @param {string} string - 要转换的字符串\n * @param {boolean} [bigger] - 是否大写第一个字母,默认为 false\n * @returns {string} - 转换后的驼峰格式字符串\n */\nexport function stringCamelCase(string: string, bigger?: boolean): string {\n const string2 = string.replace(/[\\s_-](.)/g, (_, char) => (char as string).toUpperCase());\n return bigger ? string2.slice(0, 1).toUpperCase() + string2.slice(1) : string2;\n}\n\n/**\n * 将字符串转换为连字格式\n * @param {string} string - 要转换的字符串\n * @param {string} [separator] - 分隔符,默认是 \"-\"(短横线)\n * @returns {string} - 转换后的连字格式字符串\n */\nexport function stringKebabCase(string: string, separator = '-'): string {\n return string.replace(/[A-Z]/g, (origin) => `${separator}${origin.toLowerCase()}`);\n}\n\n/**\n * 生成随机字符串\n * @param {number} length - 生成的随机字符串长度\n * @param {string} [dict] - 用于生成随机字符串的字符字典,默认为数字、小写字母和大写字母的组合\n * @returns {string} - 生成的随机字符串\n * @example\n * randomString(10); // 生成一个长度为 10 的随机字符串\n * randomString(8, 'ABCDEF'); // 生成一个长度为 8 的随机字符串,仅包含字符 'ABCDEF'\n */\nexport function randomString(length: number, dict?: string): string {\n const dictFinal = dict || STRING_DICT;\n const dictLength = dictFinal.length;\n\n let result = '';\n\n for (let i = 0; i < length; i++) {\n result += dictFinal.charAt(randomNumber(0, dictLength - 1));\n }\n\n return result;\n}\n\n/**\n * 简单的模板引擎,类似于 Python 的 `.format()` 方法\n * 支持通过索引或对象/名称的方式传递变量\n * 当使用对象/名称方式时,可以传递一个回退值作为第三个参数\n *\n * @category 字符串\n * @example\n * ```\n * // 索引方式\n * const result = stringFormat(\n * '你好 {0}!我的名字是 {1}。',\n * '张三',\n * '李四'\n * ); // 你好 张三!我的名字是 李四。\n * ```\n *\n * @example\n * ```\n * // 对象方式\n * const result = stringFormat(\n * '{greet}!我的名字是 {name}。',\n * { greet: '你好', name: '王五' }\n * ); // 你好!我的名字是 王五。\n * ```\n *\n * @example\n * ```\n * // 带回退值的对象方式\n * const result = stringFormat(\n * '{greet}!我的名字是 {name}。',\n * { greet: '你好' }, // name 未传递,因此会使用回退值\n * '未知'\n * ); // 你好!我的名字是 未知。\n * ```\n */\nexport function stringFormat(\n str: string,\n object: Record<string | number, unknown>,\n fallback?: string | ((key: string) => string),\n): string;\nexport function stringFormat(str: string, ...args: (string | number | bigint | undefined | null)[]): string;\nexport function stringFormat(str: string, ...args: unknown[]): string {\n const [firstArg, fallback] = args;\n\n if (isObject(firstArg) || isUndefined(firstArg)) {\n const vars = firstArg || {};\n return str.replace(/\\{(\\w+)\\}/g, (_, key) => vars[key] ?? (isFunction(fallback) ? fallback(key) : fallback) ?? key);\n }\n\n return str.replace(/\\{(\\d+)\\}/g, (_, key) => {\n const index = Number(key);\n if (Number.isNaN(index)) return key;\n return args[index];\n });\n}\n\n/**\n * 生成符合 [RFC 4122](https://www.ietf.org/rfc/rfc4122.txt) 版本 4 的 UUID 字符串\n * @returns {string} - 生成的 UUID 字符串\n * @example\n * const uuid = randomUUID4();\n * console.log(uuid); // 输出类似 '123e4567-e89b-12d3-a456-426614174000' 的 UUID 字符串\n */\nexport function randomUUID4(): string {\n const template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\n let result = '';\n\n for (let i = 0; i < template.length; i++) {\n const t = template[i];\n\n if (t === '-' || t === '4') {\n result += t;\n continue;\n }\n\n if (t === 'y') {\n result += randomString(1, '89ab');\n continue;\n }\n\n result += randomString(1, STRING_HEXADECIMALS);\n }\n\n return result;\n}\n\n/**\n * 将值转换为字符串,若值为 null 或 undefined 则返回空字符串\n * @param {unknown} value - 需要转换的值\n * @returns {string} 转换后的字符串结果\n */\nexport function stringify(value: unknown) {\n return isNullish(value) ? '' : String(value);\n}\n"],"names":["objectDefaults","isObject","isUndefined","isFunction","isNullish"],"mappings":"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"}
|