{"id":24208811,"url":"https://github.com/alitajs/yaml-joi","last_synced_at":"2026-02-26T03:47:37.545Z","repository":{"id":57403036,"uuid":"194385785","full_name":"alitajs/yaml-joi","owner":"alitajs","description":"Parse string in yaml format into Joi validator.","archived":false,"fork":false,"pushed_at":"2023-07-11T00:26:32.000Z","size":512,"stargazers_count":2,"open_issues_count":4,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-05-19T02:44:18.340Z","etag":null,"topics":["joi","node","validate","validator","yaml"],"latest_commit_sha":null,"homepage":null,"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/alitajs.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":"2019-06-29T09:04:12.000Z","updated_at":"2019-08-25T14:01:37.000Z","dependencies_parsed_at":"2022-09-18T11:51:26.552Z","dependency_job_id":null,"html_url":"https://github.com/alitajs/yaml-joi","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/alitajs/yaml-joi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alitajs%2Fyaml-joi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alitajs%2Fyaml-joi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alitajs%2Fyaml-joi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alitajs%2Fyaml-joi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alitajs","download_url":"https://codeload.github.com/alitajs/yaml-joi/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alitajs%2Fyaml-joi/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260816484,"owners_count":23067313,"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":["joi","node","validate","validator","yaml"],"created_at":"2025-01-14T01:18:39.006Z","updated_at":"2026-02-26T03:47:32.522Z","avatar_url":"https://github.com/alitajs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# yaml-joi\n\n[![Alita](https://img.shields.io/badge/alitajs-yaml%20joi-blue.svg)](https://github.com/alitajs/yaml-joi)\n[![NPM version](https://img.shields.io/npm/v/yaml-joi.svg?style=flat)](https://npmjs.org/package/yaml-joi)\n[![NPM downloads](http://img.shields.io/npm/dm/yaml-joi.svg?style=flat)](https://npmjs.org/package/yaml-joi)\n[![Build Status](https://travis-ci.com/alitajs/yaml-joi.svg?branch=master)](https://travis-ci.com/alitajs/yaml-joi)\n[![Coverage Status](https://coveralls.io/repos/github/alitajs/yaml-joi/badge.svg?branch=master)](https://coveralls.io/github/alitajs/yaml-joi?branch=master)\n[![License](https://img.shields.io/npm/l/yaml-joi.svg)](https://npmjs.org/package/yaml-joi)\n\nParse string in [yaml](https://yaml.org/) format into [Joi](https://github.com/hapijs/joi) validator.\n\n## Install\n\n```bash\n$ npm install yaml-joi\nor\n$ yarn add yaml-joi\n```\n\n## Example\n\n```js\nimport yamlToJoi from 'yaml-joi';\n\nconst yamlLoadOpts = {};\nconst yamlSchema = `\ntype: string\nallowEmpty: true\nlimitation:\n  - min: 3\n  - max: 5\n  - regex: !!js/regexp /^(\\S*)$/\n`;\n\nconst validator = yamlToJoi(yamlSchema, yamlLoadOpts);\nvalidator.validate(null).error === null;\nvalidator.validate('a').error !== null;\nvalidator.validate('abc').error === null;\nvalidator.validate('a b c').error !== null;\nvalidator.validate('abcdef').error !== null;\n```\n\n```js\nimport yamlToJoi from 'yaml-joi';\n\nconst yamlSchema = `\ntype: object\nlimitation:\n  - keys:\n      name:\n        isSchema: true\n        type: string\n        allowEmpty: nothing\n        limitation:\n          - min: 5\n          - max: 24\n`;\n\nconst validator = yamlToJoi(yamlSchema);\nvalidator.validate({}).error === null;\nvalidator.validate({ name: 'str' }).error !== null;\nvalidator.validate({ name: 'Alita' }).error === null;\n```\n\nGet more at [cases.yml](https://github.com/alitajs/yaml-joi/blob/master/tests/cases.yml).\n\n### Used for model definition\n\n- Define: [alitajs/notification/app/model/chat.ts#L50-L86](https://github.com/alitajs/notification/blob/67f5130b6a7ec02c891f5934296eb7ae7ad498ad/app/model/chat.ts#L50-L86)\n\n```ts\nexport const DefineChat: DefineModel\u003cChat\u003e = {\n  Attr: {\n    chatId: {\n      type: CHAR(22),\n      allowNull: false,\n    },\n    ...\n  },\n  Sample: {\n    chatId: 'abcdefghijklmnopqrstuv',\n    ...\n  },\n  Validator: yamlJoi(`\n    type: object\n    isSchema: true\n    limitation:\n      - keys:\n          chatId:\n            type: string\n            isSchema: true\n            limitation:\n              - length: 22\n              - token: []\n          ...\n```\n\n- Utils: [alitajs/notification/app/utils/index.ts#L80-L92](https://github.com/alitajs/notification/blob/67f5130b6a7ec02c891f5934296eb7ae7ad498ad/app/utils/index.ts#L80-L92)\n\n```ts\nexport function validate\u003cT\u003e(instance: T, validator: Schema): T {\n  const { error, value } = validator.validate(instance);\n  if (error) throw error;\n  return value;\n}\n\nexport function validateModel\u003cT\u003e(define: DefineModel\u003cT\u003e, attrs: Partial\u003cT\u003e): T {\n  return validate({ ...define.Sample, ...attrs }, define.Validator);\n}\n\nexport function validateAttr\u003cT, U\u003e(define: DefineModel\u003cT\u003e, attrs: U): U {\n  return pick(validateModel(define, attrs), ...Object.keys(attrs)) as U;\n}\n```\n\n- Validate attributes: [alitajs/notification/app/service/chat.ts#L27-L28](https://github.com/alitajs/notification/blob/master/app/service/chat.ts#L27-L28)\n\n```ts\nexport default class ChatService extends Service {\n  ...\n  public getAllAccountChats(accountId: string) {\n    const where = validateAttr(DefineChat, { accountId });\n    return this.ctx.model.Chat.findAll({ where });\n  }\n  ...\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falitajs%2Fyaml-joi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falitajs%2Fyaml-joi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falitajs%2Fyaml-joi/lists"}