{"id":20816750,"url":"https://github.com/sformisano/vuetify-jet-validator","last_synced_at":"2026-03-06T18:38:30.488Z","repository":{"id":52808041,"uuid":"170316525","full_name":"sformisano/vuetify-jet-validator","owner":"sformisano","description":"A simple abstraction class that simplifies form validations with Vuetify.","archived":false,"fork":false,"pushed_at":"2021-04-15T09:47:11.000Z","size":13,"stargazers_count":8,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-09T18:50:16.752Z","etag":null,"topics":["form","forms","validation","validations","validator","vue","vuejs"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/sformisano.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}},"created_at":"2019-02-12T12:45:55.000Z","updated_at":"2021-04-05T17:23:53.000Z","dependencies_parsed_at":"2022-08-22T21:11:00.346Z","dependency_job_id":null,"html_url":"https://github.com/sformisano/vuetify-jet-validator","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sformisano/vuetify-jet-validator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sformisano%2Fvuetify-jet-validator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sformisano%2Fvuetify-jet-validator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sformisano%2Fvuetify-jet-validator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sformisano%2Fvuetify-jet-validator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sformisano","download_url":"https://codeload.github.com/sformisano/vuetify-jet-validator/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sformisano%2Fvuetify-jet-validator/sbom","scorecard":{"id":814130,"data":{"date":"2025-08-11","repo":{"name":"github.com/sformisano/vuetify-jet-validator","commit":"b7b29ce45e185941701d1a36594144b996cd3ae4"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.6,"checks":[{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/7 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-23T13:50:08.110Z","repository_id":52808041,"created_at":"2025-08-23T13:50:08.110Z","updated_at":"2025-08-23T13:50:08.110Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30191237,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T18:30:16.692Z","status":"ssl_error","status_checked_at":"2026-03-06T18:30:13.818Z","response_time":250,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["form","forms","validation","validations","validator","vue","vuejs"],"created_at":"2024-11-17T21:36:42.197Z","updated_at":"2026-03-06T18:38:30.467Z","avatar_url":"https://github.com/sformisano.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# VuetifyJetValidator - Validate Vuetify Forms Like a Champ!\n\nVuetifyJetValidator is a simple helper class that simplifies dealing with form fields validations if you're using the\nVuetify library.\n\n## Requirements\n\n* Your project must be built with Vue.js\n* The class is only tested with Vuetify and its standard form validation. While you may be able to use it to abstract\nother validation libraries with a similar api, that is not a supported use case.\n\n## Instructions\n\n1. Install the library: `npm install --save vuetify-jet-validator`\n\n2. In your component's reactive data object, create a validator instance and return it as a data property:\n```javascript\ndata() {\n  const validator = new VuetifyJetValidator();\n\n  return {\n    validator\n  }\n}\n\n```\n3. Create a validation rules object with properties for each field:\n```javascript\ndata() {\n  const that = this;\n  const validator = new VuetifyJetValidator();\n\n  // This is an example for a typical signup form.\n  return {\n    // I like keeping field value properties within their own fields object to keep things tidy.\n    fields: {\n      firstName: \"\",\n      lastName: \"\",\n      email: \"\",\n      password: \"\",\n      confirmPassword: \"\"\n    },\n    // These are the rules that will be hooked to fields in the form template.\n    rules: {\n      /*\n       * Each property here is an array of rules. Each rule function takes at least one argument,\n       * which is the message to display if the validation fails (for some rules it's optional\n       * as they have a default fallback message, for others it's required).\n       * A simple explanation of each method is available in the source code.\n       */\n      firstName: [validator.rules.required(\"First name is required.\")],\n      lastName: [validator.rules.required(\"Last name is required.\")],\n      email: [\n        validator.rules.required(\"E-mail is required.\"),\n        validator.rules.email(\"Invalid email.\"),\n        validator.rules.api(\"email-taken\", \"This email address is already in use by another account.\"),\n      ],\n      password: [\n        validator.rules.required(\"Password is required.\"),\n        validator.rules.minLength(6, \"Password should be at least 6 characters.\"),\n        validator.rules.maxLength(72, \"Password should not exceed 72 characters.\")\n      ],\n      confirmPassword: [\n        validator.rules.matches(that, \"fields.password\", \"Passwords must match.\")\n      ]\n    }\n  }\n}\n```\n\n4. Add the validation rules to the vuetify fields:\n\n```javascript\n\u003cv-form @submit.prevent=\"submitSignUpForm\" ref=\"signupForm\"\u003e\n  \u003cv-layout row\u003e\n    \u003cv-flex xs12\u003e\n      \u003cv-text-field\n          name=\"firstName\"\n          label=\"First Name\"\n          id=\"firstName\"\n          v-model=\"fields.firstName\"\n          type=\"text\"\n          :rules=\"rules.firstName\"\n      \u003e\u003c/v-text-field\u003e\n    \u003c/v-flex\u003e\n  \u003c/v-layout\u003e\n  \u003cv-layout row\u003e\n    \u003cv-flex xs12\u003e\n      \u003cv-text-field\n          name=\"lastName\"\n          label=\"Last Name\"\n          id=\"lastName\"\n          v-model=\"fields.lastName\"\n          type=\"text\"\n          :rules=\"rules.lastName\"\n      \u003e\u003c/v-text-field\u003e\n    \u003c/v-flex\u003e\n  \u003c/v-layout\u003e\n  \u003cv-layout row\u003e\n    \u003cv-flex xs12\u003e\n      \u003cv-text-field\n          name=\"email\"\n          label=\"Email\"\n          id=\"email\"\n          v-model=\"fields.email\"\n          type=\"email\"\n          :rules=\"rules.email\"\n      \u003e\u003c/v-text-field\u003e\n    \u003c/v-flex\u003e\n  \u003c/v-layout\u003e\n  \u003cv-layout row\u003e\n    \u003cv-flex xs12\u003e\n      \u003cv-text-field\n        name=\"password\"\n        type=\"password\"\n        label=\"Password\"\n        id=\"password\"\n        v-model=\"fields.password\"\n        :rules=\"rules.password\"\n      \u003e\u003c/v-text-field\u003e\n    \u003c/v-flex\u003e\n  \u003c/v-layout\u003e\n  \u003cv-layout row\u003e\n    \u003cv-flex xs12\u003e\n      \u003cv-text-field\n        name=\"confirmPassword\"\n        label=\"Confirm Password\"\n        id=\"confirmPassword\"\n        v-model=\"fields.confirmPassword\"\n        :rules=\"rules.confirmPassword\"\n      \u003e\u003c/v-text-field\u003e\n    \u003c/v-flex\u003e\n  \u003c/v-layout\u003e\n\u003c/v-form\u003e\n```\n\n5. In your form submission method, follow the pattern exemplified here:\n```javascript\nasync submitSignUpForm() {\n  // 1. Validate the form before the submission and return if the form is not valid.\n  // Errors will be automatically displayed next to each field with errors.\n  if (!this.validator.formIsValid(this.$refs.signupForm)) {\n    return false;\n  }\n\n  // 2. If the form is valid submit your async request (this example uses vuex but it's not a requirement)\n  try {\n    await this.$store.dispatch(\"your-signup-action\", {\n      firstName: this.fields.firstName,\n      lastName: this.fields.lastName,\n      email: this.fields.email,\n      password: this.fields.password\n    });\n    this.formIsLoading = false;\n    \n    // Do whatever you need to do after a successful signup\n    // (e.g. show a success message, redirect somewhere, send welcome email etc.)\n  } catch (err) {\n    // The request failed, pass whatever error code was sent back from your api to the validator.\n    // More on this is explained in the api rule description below.\n    this.validator.setRequestApiError(err.code);\n    this.formIsLoading = false;\n  }\n}\n```\n\nThat's it! Your form will now display errors on each field with errors, and it will also tie api errors\nto the appropriate field that triggered them.\n\n## The .api method\n\nWhile other methods are pretty straightforward, it may take a moment to realise what the .api is for, so here's a brief explanation.\n\nOne of the things you will likely need is a way to account for errors coming from the api that have to do\nwith a specific field. The simplest example is the \"email taken\" error: while you can make sure a valid email is\nbeing sent to your api, you can't know whether an account already exists for that email or not until you submit it.\n\nThis method allows you to resolve this problem in three simple steps:\n\n1. Have your api endpoint return an error code for the error you want to tie to a field, e.g. \"email-taken\".\n2. Add the .api() rule just like you've seen in the signup form example, with the error code triggered by the email.\n3. Make sure your form submission method uses the `setRequestApiError` just as shown in the example above.\n\nThese three simple steps will make sure the email taken error shows up next to the email field.\n\n## On error messages\n\nThe reason this class encourages you to inline error messages in your validations rather than just providing messages\nin the library itself is that this encourages better error messages and allows you to deal with things like i18n outside\nof this class (since i18n is well out of scope for this class).\n\n# Future TODOs\n\n* A standard way to deal with unrecognised or request wide api errors (i.e. errors that should not be displayed next to\na field but rather above the form as flash message).\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsformisano%2Fvuetify-jet-validator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsformisano%2Fvuetify-jet-validator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsformisano%2Fvuetify-jet-validator/lists"}