{"id":23532885,"url":"https://github.com/zenser/dvalidator","last_synced_at":"2025-10-28T20:35:13.074Z","repository":{"id":46936263,"uuid":"138249022","full_name":"Zenser/dvalidator","owner":"Zenser","description":"✅ A pure, extendable, very useful, asynchronous validator base Promise and Decorator","archived":false,"fork":false,"pushed_at":"2023-01-03T15:16:02.000Z","size":768,"stargazers_count":4,"open_issues_count":7,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-19T11:22:45.783Z","etag":null,"topics":["asynchronous","decorator","promise","validate","validator"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Zenser.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-06-22T03:14:40.000Z","updated_at":"2022-08-24T13:44:01.000Z","dependencies_parsed_at":"2023-02-01T07:01:05.831Z","dependency_job_id":null,"html_url":"https://github.com/Zenser/dvalidator","commit_stats":null,"previous_names":["zenser/vulidate"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Zenser%2Fdvalidator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Zenser%2Fdvalidator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Zenser%2Fdvalidator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Zenser%2Fdvalidator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Zenser","download_url":"https://codeload.github.com/Zenser/dvalidator/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250337306,"owners_count":21414093,"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","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":["asynchronous","decorator","promise","validate","validator"],"created_at":"2024-12-25T23:13:01.468Z","updated_at":"2025-10-28T20:35:08.033Z","avatar_url":"https://github.com/Zenser.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Dvalidator](logo.jpg)\n\n[English edition](README_en.md)\n\n\u003e Dvalidator 是一个纯净、可扩展、非常有用的校验工具，它基于 Promise 和 Decorator 实现。\n\n它有以下特性：\n\n- \u003cb\u003eCompatibility\u003c/b\u003e : 同时支持最新版 Decorator 用法和老版用法\n- \u003cb\u003eAsynchronous\u003c/b\u003e : 支持传递异步函数\n- \u003cb\u003eOrdered\u003c/b\u003e : 根据你定义的顺序，有序校验\n- \u003cb\u003eSmall\u003c/b\u003e : 小巧，源码不超过 200 行\n- \u003cb\u003eEasy\u003c/b\u003e : 使用简单，仅仅只有 2 个 Api\n\n## 起步\n\n```bash\nnpm install dvalidator --save\n```\n\n```bash\nnpm install @babel/plugin-proposal-decorators --save-dev\n```\n\n配置 babel.config.js\n\n```js\nplugins: [\n  [\n    '@babel/plugin-proposal-decorators',\n    {\n      // Dvalidator 支持最新的 Decorator 提案（legacy: false）\n      // 同样也支持旧版的 (legacy: true)，Decorator 可以作用于字面量对象\n      // 按照你的喜好设置，推荐使用最新的提案\n    }\n  ]\n];\n```\n\n## 使用\n\n假设我们有这样一个需求，我们将校验一个 user 对象，昵称和手机号是必选的，并且手机号需要发起一个服务端远程校验。\n\n使用 Dvalidator，我们可以这样写：\n\n```js\n// common.js\nimport dvalidator from 'dvalidator';\n\nconst requiredRule = {\n  validator: val =\u003e val != null \u0026\u0026 val !== '',\n  message: 'required'\n};\nconst required = dvalidator(requiredRule);\nconst checkPhone = dvalidator(value =\u003e fetch(`xxx/${value}`));\n\n// user-signup.js\nclass User {\n  @required('nickname is required')\n  nickname = '';\n  @checkPhone('phone valid fail')\n  @required\n  phone = '';\n}\nconst user = new User();\n\nuser\n  .$validate()\n  .then(/* success */)\n  .catch(({ errors, fields }) =\u003e {\n    /* fail */\n    alert(errors[0].message);\n    // errors 包含每个属性的错误信息，结构一致，嵌套对象会拍平\n    // fields 以对象形式获取错误信息，一般用于展示表单中每一栏的错误信息\n  });\n```\n\n你可以把校验规则做一下封装，写在单独的文件里，这样业务代码会非常简洁。\n\n## Api\n\n#### dvalidator(rule: string | Function | Rule): Dvalidator\n\n\u003csmall\u003e一个类柯里化函数，你可以调用无限次去丰富规则或者覆盖规则。\u003c/small\u003e\n\n你需要传递规则进来，规则可以是一个函数（校验方法），字符串（错误信息），对象（包含以上两者的集合）。\n\n例如：\n\n```js\ndvalidator({\n  validator: val =\u003e {\n    // 你的校验部分代码\n    // 可以返回 Boolean（同步校验） 或者 Promise（异步校验）\n  },\n  // 校验出错时会返回给你\n  message: ''\n});\n```\n\n一个校验规则想要返回不同错误信息：\n\n```js\n// 传递不同的 message\ndvalidator(checkPhone)('msg1');\ndvalidator(checkPhone)('msg2');\n```\n\n```js\n// 也可以动态返回错误信息\ndvalidator(() =\u003e {\n  return Promise.reject(x ? 'msg1' : 'msg2');\n});\n```\n\n#### \\$validate(filter?: Function): Promise\u003cValidateError | void\u003e\n\n把装饰器加入到对象上后，对象就是属于 “可校验对象”，你可以此方法进行数据校验。filter 是一个用来过滤属性的方法，我们可以用它做一些动态校验。\n\n```js\n// 返回 Promise\nuser\n  .$validate(fieldKey =\u003e {\n    // 这里可以定义你的过滤逻辑\n    // 如果是嵌套的对象，那么 fieldKey 会做拼接\n    // 例如 user: { like: { game: 'lol' } }，只想校验 like.game 的时候，你可以这样写\n    return /^like\\.game/.test(fieldKey);\n  })\n  .catch(({ errors, fields }) =\u003e {\n    // xxx\n  });\n```\n\n## 接口声明文件\n\n从这里可以看到更详细的结构信息！\n[index.d.ts](lib/index.d.ts)\n\n## And More\n\nEnjoy it!","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzenser%2Fdvalidator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzenser%2Fdvalidator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzenser%2Fdvalidator/lists"}