{"id":18814446,"url":"https://github.com/jsoon/front-utils","last_synced_at":"2025-10-09T00:08:50.674Z","repository":{"id":169236178,"uuid":"645129525","full_name":"JSoon/front-utils","owner":"JSoon","description":null,"archived":false,"fork":false,"pushed_at":"2025-08-25T08:45:57.000Z","size":565,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-09T00:06:46.094Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JSoon.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-05-25T01:50:07.000Z","updated_at":"2025-08-25T08:46:01.000Z","dependencies_parsed_at":"2025-08-25T10:22:47.987Z","dependency_job_id":"9d89f502-8441-44f1-8318-b1df0a2bb0c5","html_url":"https://github.com/JSoon/front-utils","commit_stats":null,"previous_names":["jsoon/front-utils"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/JSoon/front-utils","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JSoon%2Ffront-utils","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JSoon%2Ffront-utils/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JSoon%2Ffront-utils/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JSoon%2Ffront-utils/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JSoon","download_url":"https://codeload.github.com/JSoon/front-utils/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JSoon%2Ffront-utils/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000745,"owners_count":26082879,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-07T23:41:00.833Z","updated_at":"2025-10-09T00:08:50.657Z","avatar_url":"https://github.com/JSoon.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# front-utils\n\n工具类函数: 与业务无关, 包括且不限于: 公共方法, 正则表达式等工具类API.\n\n## Contents\n\n- [front-utils](#front-utils)\n  - [Contents](#contents)\n  - [Installation](#installation)\n    - [配置仓库地址到 `.npmrc` 或者 `.yarnrc` 安装](#配置仓库地址到-npmrc-或者-yarnrc-安装)\n    - [命令行直接安装](#命令行直接安装)\n  - [Usage](#usage)\n    - [Browser](#browser)\n    - [ES Module](#es-module)\n  - [API](#api)\n    - [enums](#enums)\n      - [FileExtMimeMap](#fileextmimemap)\n    - [regexp](#regexp)\n      - [regexp.emailExp](#regexpemailexp)\n      - [regexp.normalPlateRegExp](#regexpnormalplateregexp)\n      - [regexp.newEnergyPlateRegExp](#regexpnewenergyplateregexp)\n      - [regexp.mobileRegExp](#regexpmobileregexp)\n      - [regexp.IDCardNoRegExp](#regexpidcardnoregexp)\n      - [regexp.strongPasswordExp](#regexpstrongpasswordexp)\n      - [regexp.positiveRN2DExp](#regexppositivern2dexp)\n      - [regexp.positiveRN3DExp](#regexppositivern3dexp)\n      - [regexp.fileExtExp](#regexpfileextexp)\n    - [validator](#validator)\n      - [validator.checkEmail()](#validatorcheckemail)\n      - [validator.checkNumberPlate()](#validatorchecknumberplate)\n      - [validator.checkMobile()](#validatorcheckmobile)\n      - [validator.checkIDCardNo()](#validatorcheckidcardno)\n      - [validator.checkStrongPassword()](#validatorcheckstrongpassword)\n      - [validator.checkPositiveRN2Exp()](#validatorcheckpositivern2exp)\n      - [validator.checkPositiveRN3Exp()](#validatorcheckpositivern3exp)\n      - [validator.checkNumberString()](#validatorchecknumberstring)\n      - [validator.checkIPv4()](#validatorcheckipv4)\n      - [validator.checkIPv6()](#validatorcheckipv6)\n      - [validator.checkURL()](#validatorcheckurl)\n    - [formatter](#formatter)\n      - [formatter.formatDatetime()](#formatterformatdatetime)\n      - [formatter.formatThousandSeparator()](#formatterformatthousandseparator)\n      - [formatter.formatMilliseconds()](#formatterformatmilliseconds)\n    - [getter](#getter)\n      - [getter.getFilename()](#gettergetfilename)\n      - [getter.getFileExtension()](#gettergetfileextension)\n      - [getter.getMimeByFileExtension()](#gettergetmimebyfileextension)\n      - [getter.getFlatObjectArray()](#gettergetflatobjectarray)\n    - [detector](#detector)\n      - [detector.isElectron](#detectoriselectron)\n      - [detector.isWindows](#detectoriswindows)\n      - [detector.isMacOS](#detectorismacos)\n  - [Test](#test)\n  - [Compabilities](#compabilities)\n    - [Runtime Environment](#runtime-environment)\n    - [Browser Support](#browser-support)\n  - [Changelog](#changelog)\n\n## Installation\n\n### 配置仓库地址到 `.npmrc` 或者 `.yarnrc` 安装\n\n\u003e 推荐通过这种方式进行安装.\n\n```bash\n# .npmrc / .yarnrc\n@financial-freedom:registry=https://registry.npmmirror.com\n```\n\n再执行命令行:\n\n```bash\n# pnpm\npnpm add @financial-freedom/front-utils\n\n# yarn\nyarn add @financial-freedom/front-utils\n\n# npm\nnpm i @financial-freedom/front-utils\n```\n\n### 命令行直接安装\n\n```bash\n# pnpm\npnpm add --registry https://registry.npmmirror.com @financial-freedom/front-utils\n\n# yarn\nyarn add --registry https://registry.npmmirror.com @financial-freedom/front-utils\n\n# npm\nnpm i --registry https://registry.npmmirror.com @financial-freedom/front-utils\n```\n\n## Usage\n\n### Browser\n\n```html\n\u003cscript src=\"path/to/dist/front_utils.umd.js\"\u003e\u003c/script\u003e\n\n\u003cscript\u003e\n  front_utils.validator.checkEmail('a.b@qq.com');\n\u003c/script\u003e\n```\n\n### ES Module\n\n```js\nimport * as front_utils from '@financial-freedom/front-utils'\n\nfront_utils.validator.checkEmail('a.b@qq.com');\n```\n\n或者，\n\n```js\nimport { validator } from '@financial-freedom/front-utils'\n\nvalidator.checkEmail('a.b@qq.com');\n```\n\n## API\n\n### enums\n\n常量枚举\n\n#### FileExtMimeMap\n- Example\n```js\nenums.FileExtMimeMap['jpg']; // image/jpeg\nenums.FileExtMimeMap['ppt']; // application/vnd.ms-powerpoint\n```\n\n### regexp\n\n正则表达式\n\n#### regexp.emailExp\n- Example\n```js\nregexp.emailExp.test('a.b@qq.com');\n```\n\n#### regexp.normalPlateRegExp\n- Example\n```js\nregexp.normalPlateRegExp.test('川ALC351');\n```\n\n#### regexp.newEnergyPlateRegExp\n- Example\n```js\nregexp.newEnergyPlateRegExp.test('川AD12345');\n```\n\n#### regexp.mobileRegExp\n- Example\n```js\nregexp.mobileRegExp.test('13012345678');\n```\n\n#### regexp.IDCardNoRegExp\n- Example\n```js\nregexp.IDCardNoRegExp.test('11010519491231002X');\n```\n\n#### regexp.strongPasswordExp\n- Example\n```js\nregexp.strongPasswordExp.test('!qa@ws#ed%tG123');\n```\n\n#### regexp.positiveRN2DExp\n- Example\n```js\nregexp.positiveRN2DExp.test('1.23');\n```\n\n#### regexp.positiveRN3DExp\n- Example\n```js\nregexp.positiveRN3DExp.test('1.234');\n```\n\n#### regexp.fileExtExp\n- Example\n```js\nregexp.fileExtExp.exec('file.jpg')[1]; // jpg\n```\n\n### validator\n\n验证器函数\n\n#### validator.checkEmail()\n- Type\n```js\n/**\n * 校验电子邮箱地址是否合法\n * @param email 电子邮箱地址\n */\nfunction checkEmail(email: string): boolean;\n```\n- Example\n```js\nvalidator.checkEmail('a.b@qq.com'); // true\n```\n\n#### validator.checkNumberPlate()\n- Type\n```js\n/**\n * 校验车牌号码是否合法\n * @param numberPlate 车牌号码\n */\nfunction checkNumberPlate(numberPlate: string): boolean;\n```\n- Example\n```js\nvalidator.checkNumberPlate('川ALC351'); // true\nvalidator.checkNumberPlate('川A123456'); // false\n```\n\n#### validator.checkMobile()\n- Type\n```js\n/**\n * 校验手机号码是否合法\n * @param mobile 手机号码\n */\nfunction checkMobile(mobile: string): boolean;\n```\n- Example\n```js\nvalidator.checkMobile('+8613687654321'); // true\n```\n\n#### validator.checkIDCardNo()\n- Type\n```js\n/**\n * 校验身份证号码是否合法\n * @param idCardNo 身份证号码\n */\nfunction checkIDCardNo(idCardNo: string): boolean;\n```\n- Example\n```js\nvalidator.checkIDCardNo('11010519491231002X'); // true\nvalidator.checkIDCardNo('01010519491231002X'); // false\n```\n\n#### validator.checkStrongPassword()\n- Type\n```js\n/**\n * 校验是否为强密码\n * @param password 密码\n */\nfunction checkStrongPassword(password: string): boolean;\n```\n- Example\n```js\nvalidator.checkStrongPassword('!qa@ws#ed%tG123'); // true\nvalidator.checkStrongPassword('123qweQWE~!@#$%^\u0026*'); // false\nvalidator.checkStrongPassword('12345678'); // false\n```\n\n#### validator.checkPositiveRN2Exp()\n- Type\n```js\n/**\n * 校验是否为正有理数(最多2位小数)\n * @param numberString 数字字符串\n */\nfunction checkPositiveRN2Exp(numberString: string): boolean;\n```\n- Example\n```js\nvalidator.checkPositiveRN2Exp('123.45'); // true\nvalidator.checkPositiveRN2Exp('123.456'); // false\n```\n\n#### validator.checkPositiveRN3Exp()\n- Type\n```js\n/**\n * 校验是否为正有理数(最多3位小数)\n * @param numberString 数字字符串\n */\nfunction checkPositiveRN3Exp(numberString: string): boolean;\n```\n- Example\n```js\nvalidator.checkPositiveRN3Exp('123.456'); // true\nvalidator.checkPositiveRN3Exp('123.4567'); // false\n```\n\n#### validator.checkNumberString()\n- Type\n```js\n/**\n * 校验是否是数字字符串\n * @param numberString 数字字符串\n * @param maxLength 最大长度\n */\nfunction checkNumberString(numberString: string, maxLength?: number): boolean;\n```\n- Example\n```js\ncheckNumberString('1234567890'); // true\ncheckNumberString('12345', 5); // true\ncheckNumberString('123.'); // false\n```\n\n#### validator.checkIPv4()\n- Type\n```js\n/**\n * 校验是否是ipv4地址\n * @param ipAddress IP地址字符串\n */\nfunction checkIPv4(ipAddress: string): boolean;\n```\n- Example\n```js\ncheckIPv4('253.123.61.198'); // true\ncheckIPv4('128.145.158.124'); // true\ncheckIPv4('a.b.c.100'); // false\n```\n\n#### validator.checkIPv6()\n- Type\n```js\n/**\n * 校验是否是ipv6地址\n * @param ipAddress IP地址字符串\n */\nfunction checkIPv6(ipAddress: string): boolean;\n```\n- Example\n```js\ncheckIPv6('91a7:742d:805d:03a7:f413:b182:7de9:adea'); // true\ncheckIPv6('::ffff:808:808'); // true\ncheckIPv6('230.222.192.224'); // false\n```\n\n#### validator.checkURL()\n- Type\n```js\n/**\n * 校验是否是URL地址\n * @param url URL地址字符串\n */\nfunction checkURL(url: string): boolean;\n```\n- Example\n```js\ncheckURL('http://foo.com/blah_blah'); // true\ncheckURL('http://142.42.1.1/'); // true\ncheckURL('foo.com'); // true\ncheckURL('http://../'); // false\n```\n\n### formatter\n\n格式化函数\n\n#### formatter.formatDatetime()\n- Type\n```js\n/**\n * 日期时间格式化\n * @param datetime  日期时间值\n * @param format    日期时间格式\n * @returns 格式化日期字符串, 默认: YYYY-MM-DD HH:mm:ss\n * \n * @see {@link https://day.js.org/docs/en/display/format#list-of-all-available-formats}\n */\nfunction formatDatetime({ datetime, format, }?: {\n    datetime?: dayjs.ConfigType;\n    format?: string;\n}): string;\n```\n- Example\n```js\n// 2022-07-10 22:00:10\nformatter.formatDatetime({\n  datetime: new Date('2022/07/10 22:00:10'),\n  format: 'YYYY-MM-DD HH:mm:ss',\n});\n// 2022-07-18 00:00:00\nformatter.formatDatetime({\n  datetime: new Date(2022, 6, 18),\n});\n```\n\n#### formatter.formatThousandSeparator()\n- Type\n```js\n/**\n * 数字千分位表示法\n *\n * @description 由于本质上调用的是 Number.prototype.toLocaleString(), 所以 toLocaleString 支持的格式化都能实现\n *\n * @param number  数字或数字字符串\n * @param options 格式化配置\n * @returns 格式化千分位数字, 如: 1,234,567\n *\n * @see {@link https://docs.oracle.com/cd/E19455-01/806-0169/overview-9/index.html}\n * @see {@link https://stackoverflow.com/a/17663871/2630689}\n */\nfunction formatThousandSeparator(number?: number | string, options?: Intl.NumberFormatOptions): string;\n```\n- Example\n```js\nformatter.formatThousandSeparator(123456789.01); // 123,456,789.01\nformatter.formatThousandSeparator(123456789.23456, { maximumFractionDigits: 3, }); // 123,456,789.235\n```\n\n#### formatter.formatMilliseconds()\n- Type\n```js\n/**\n * 毫秒数格式化，最多显示到天\n * @param ms 毫秒数\n * @returns 格式化后的时间字符串，如：1分钟30秒\n */\nfunction formatMilliseconds(ms: number): string;\n```\n- Example\n```js\nformatMilliseconds(500); // 500毫秒\nformatMilliseconds(2500); // 2秒\n```\n\n### getter\n\n获取函数\n\n#### getter.getFilename()\n- Type\n```js\n/**\n * 从URI获取文件名\n * @param filePath  文件路径\n * @returns         文件名, 如: xxx.jpg\n */\nfunction getFilename(filePath: string): string;\n```\n- Example\n```js\ngetFilename(''); // ''\ngetFilename('https://dss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/weather/icons/a2.png'); // a2.png\ngetFilename('file.name.with.dots.txt'); // file.name.with.dots.txt\ngetFilename('file-with-no-extention'); // file-with-no-extention\n```\n\n#### getter.getFileExtension()\n- Type\n```js\n/**\n * 获取文件后缀名\n * @param filePath  文件路径\n * @returns         文件后缀名, 如: jpg, ppt, etc. 若未获取到, 则返回 undefined\n */\nfunction getFileExtension(filePath: string): string;\n```\n- Example\n```js\ngetter.getFileExtension('file.name.with.dots.txt'); // txt\ngetter.getFileExtension('file-with-no-extention'); // undefined\n```\n\n#### getter.getMimeByFileExtension()\n- Type\n```js\n/**\n * 获取文件MIME类型\n * @param ext 文件后缀名\n * @returns   MIME\n */\nfunction getMimeByFileExtension(ext: string): string;\n```\n- Example\n```js\ngetter.getMimeByFileExtension('pptx'); // application/vnd.openxmlformats-officedocument.presentationml.presentation\ngetter.getMimeByFileExtension('graffle'); // undefined\n```\n\n#### getter.getFlatObjectArray()\n- Type\n```js\n/**\n * 将嵌套结构对象数组，转换为单层结构对象数组\n * @param nestedArray 嵌套对象数组\n * @param key         需要转换的对象属性名称\n * @example\n * [\n *    {\n *       name: 'foo',\n *       age: 10,\n *       children: [{\n *         name: 'bar',\n *         age: 20\n *       }]\n *    },\n *    {\n *       name: 'zoo',\n *       age: 12\n *    }\n * ]\n * 转换为:\n * [\n *    {\n *       name: 'foo',\n *       age: 10\n *    },\n *    {\n *       name: 'bar',\n *       age: 20\n *    },\n *    {\n *       name: 'zoo',\n *       age: 12\n *    }\n * ]\n * @see {@link https://www.techighness.com/post/javascript-flatten-deeply-nested-array-of-objects-into-single-level-array/}\n */\nfunction getFlatObjectArray(nestedArray: Record\u003cstring, any\u003e[], key?: string): any[];\n```\n- Example\n```js\ngetFlatObjectArray([\n  { name: 'Jisoo', age: 28, children: [{ name: 'Jennie', age: 27, }, { name: 'Rose', age: 26, }], },\n  { name: 'Lisa', age: 26, }\n]); // [{ name: 'Jisoo', age: 28, }, { name: 'Jennie', age: 27, }, { name: 'Rose', age: 26, }, { name: 'Lisa', age: 26, }]\n```\n\n### detector\n\n运行环境检测器\n\n#### detector.isElectron\n- Type\n```js\n/**\n * 是否是Electron应用\n *\n * @see {@link https://github.com/electron/electron/issues/2288#issuecomment-337858978}\n */\nconst isElectron: boolean;\n```\n\n#### detector.isWindows\n- Type\n```js\n/**\n * 是否是Windows操作系统\n *\n * @see {@link https://en.wikipedia.org/wiki/Windows_NT}\n */\nconst isWindows: boolean;\n```\n\n#### detector.isMacOS\n- Type\n```js\n/**\n * 是否是MacOS操作系统\n *\n * @see {@link https://en.wikipedia.org/wiki/Macintosh}\n */\nconst isMacOS: boolean;\n```\n\n## Test\n\n```bash\n# 单元测试\npnpm run test\n\n# 覆盖性测试\npnpm run coverage\n```\n\n## Compabilities\n\n兼容性\n\n### Runtime Environment\n\n```\nAll\n```\n\n### Browser Support\n\n[浏览器兼容性](https://github.com/JSoon/front-utils/blob/main/.browserslistrc)\n\n```browserslist\n# 完整格式请参考 https://github.com/browserslist/browserslist\ndefaults\nie \u003e= 10\n```\n\n## Changelog\n\n[更新日志](https://github.com/JSoon/front-utils/tags)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjsoon%2Ffront-utils","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjsoon%2Ffront-utils","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjsoon%2Ffront-utils/lists"}