{"id":35289937,"url":"https://github.com/Osedea/angular-osd-form","last_synced_at":"2026-04-08T12:02:30.831Z","repository":{"id":26114455,"uuid":"29558844","full_name":"Osedea/angular-osd-form","owner":"Osedea","description":"A form validation directive in AngularJS","archived":false,"fork":false,"pushed_at":"2020-07-29T20:42:59.000Z","size":55,"stargazers_count":8,"open_issues_count":2,"forks_count":2,"subscribers_count":26,"default_branch":"master","last_synced_at":"2026-04-01T07:56:04.436Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/Osedea.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":"2015-01-20T22:37:38.000Z","updated_at":"2017-01-13T20:02:02.000Z","dependencies_parsed_at":"2022-08-06T08:16:15.672Z","dependency_job_id":null,"html_url":"https://github.com/Osedea/angular-osd-form","commit_stats":null,"previous_names":["damacisaac/angular-osd-form"],"tags_count":27,"template":false,"template_full_name":null,"purl":"pkg:github/Osedea/angular-osd-form","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Osedea%2Fangular-osd-form","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Osedea%2Fangular-osd-form/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Osedea%2Fangular-osd-form/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Osedea%2Fangular-osd-form/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Osedea","download_url":"https://codeload.github.com/Osedea/angular-osd-form/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Osedea%2Fangular-osd-form/sbom","scorecard":{"id":106183,"data":{"date":"2025-08-11","repo":{"name":"github.com/Osedea/angular-osd-form","commit":"1a78beec21e7a180bd965826a65416b267b9b5e9"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"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":"Code-Review","score":0,"reason":"Found 0/30 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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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-15T11:08:17.589Z","repository_id":26114455,"created_at":"2025-08-15T11:08:17.589Z","updated_at":"2025-08-15T11:08:17.589Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31554110,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T10:21:54.569Z","status":"ssl_error","status_checked_at":"2026-04-08T10:21:38.171Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":[],"created_at":"2025-12-30T16:02:32.566Z","updated_at":"2026-04-08T12:02:30.814Z","avatar_url":"https://github.com/Osedea.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build Status](https://travis-ci.org/Osedea/angular-osd-form.svg?branch=master)](https://travis-ci.org/Osedea/angular-osd-form)\n\n# angular-osd-form\n\nThis module provides easy form validation in AngularJS. There are three directives included in the module:\n\n  - osd-submit (calls a given function if validation passes)\n  - osd-field (adds an error class if field is invalid)\n  - osd-error (displays error messages for invalid fields)\n\n### Version\n0.1.26\n\n### Installation and Setup\n\nThis package can be installed using bower:\n```sh\n$ bower install angular-osd-form\n```\n\nAdd the module to your app's module list:\n\n```js\nangular.module(\n            'app',\n            [\n                ...,\n                'osdForm',\n            ]\n    )\n```\n\nInclude a script tag for ng-lodash and osd-form (or add them to whatever you use to compile your js):\n```html\n\u003cscript src=\"path/to/bower_components/ng-lodash/build/ng-lodash.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"path/to/bower_components/angular-osd-form/angular-osd-form.min.js\"\u003e\u003c/script\u003e\n```\n\n### Example\n\nA registration form to be validated using angular-osd-form:\n\n```html\n\u003cform role=\"form\" name=\"regForm\" osd-submit=\"userCtrl.register()\" novalidate\u003e\n    \u003cosd-field attr=\"name\"\u003e\n        \u003clabel class=\"control-label\"\u003eName\u003c/label\u003e\n        \u003cinput type=\"text\" class=\"form-control\" name=\"name\"\n               ng-model=\"userCtrl.currentUser.name\" required=\"required\"\u003e\n        \u003cosd-error msg=\"Name required\"\u003e\u003c/osd-error\u003e\n    \u003c/osd-field\u003e\n\n    \u003cosd-field attr=\"email\"\u003e\n        \u003clabel class=\"control-label\"\u003eEmail\u003c/label\u003e\n        \u003cinput type=\"email\" class=\"form-control\" name=\"email\"\n               ng-model=\"userCtrl.currentUser.email\" required=\"required\"\u003e\n        \u003cosd-error msg=\"Email required\"\u003e\u003c/osd-error\u003e\n        \u003cosd-error error-type=\"email\" msg=\"Email must be valid\"\u003e\u003c/osd-error\u003e\n        \u003cosd-error validator=\"userCtrl.asyncEmailValidator()\" msg=\"Email already taken\"\u003e\u003c/osd-error\u003e\n    \u003c/osd-field\u003e\n\n    \u003cosd-field attr=\"password\"\u003e\n        \u003clabel class=\"control-label\"\u003ePassword\u003c/label\u003e\n        \u003cinput type=\"password\" class=\"form-control\" name=\"password\"\n               ng-model=\"userCtrl.currentUser.password\" required=\"required\"\u003e\n        \u003cosd-error msg=\"Password required\"\u003e\u003c/osd-error\u003e\n        \u003cosd-error validator=\"userCtrl.passwordsMatchValidator()\" msg=\"Passwords do not match\"\u003e\u003c/osd-error\u003e\n    \u003c/osd-field\u003e\n\n    \u003cosd-field attr=\"confirmation\"\u003e\n        \u003clabel class=\"control-label\"\u003ePassword Confirmation\u003c/label\u003e\n        \u003cinput type=\"password\" class=\"form-control\" name=\"confirmation\"\n               ng-model=\"userCtrl.currentUser.password_confirmation\" required=\"required\"\u003e\n        \u003cosd-error msg=\"Password confirmation required\"\u003e\u003c/osd-error\u003e\n    \u003c/osd-field\u003e\n\n    \u003cbutton type=\"submit\" class=\"btn\"\u003eContinue\u003c/button\u003e\n\u003c/form\u003e\n```\n\n### osd-submit\nThe osd-submit directive validates all fields and calls the given function if the form is valid. Validation only occurs when the form is submitted. A name attribute must be provided along witht the osd-submit directive.\n\n```js\n\u003cform role=\"form\" name=\"regForm\" osd-submit=\"userCtrl.register()\" novalidate\u003e\n```\n\nIf any field is invalid on submission, an event will be broadcasted on $rootScope, passing the Angular FormController:\n\n```js\n    $rootScope.$broadcast('osdInvalid', ngFormCtrl);\n```\n\nValidation can be forced using the 'osdValidate' event:\n```js\n    $scope.$broadcast('osdValidate');\n```\n\nThe form validation status can be reset with the 'osdReset' event:\n```js\n    $scope.$broadcast('osdReset');\n```\n\n### osd-field\nDefines the name of the field that will be validated and adds an error class if the field is invalid. There must be a form field with the same name, and an ng-model directive.\n\n```js\n\u003cosd-field attr=\"fieldToValidate\"\u003e\n    \u003cinput type=\"text\" name=\"fieldToValidate\" ng-model=\"fields.fieldToValidate\" required=\"required\"/\u003e\n\u003c/osd-field\u003e\n```\n\n### osd-error\nAccepts an error type, an error message, and an optional validator function. The error types are the same as those provided by Angular's FormController, with 'required' being the default. See https://docs.angularjs.org/api/ng/type/form.FormController for information on the available error types.\n\n```js\n\u003cosd-error error-type=\"email\" msg=\"Email must be valid\"\u003e\u003c/osd-error\u003e\n```\n\nIf a validator is given, the error-type is not required:\n\n```js\n\u003cosd-error validator=\"userCtrl.passwordsMatchValidator()\" msg=\"Passwords do not match\"\u003e\u003c/osd-error\u003e\n```\n\n### Default validators\nThe osdError directive comes with several default validators. These can be used in the same way as custom validators:\n\n```js\n\u003cosd-error validator=\"pastDateValidator()\" msg=\"Date must be in the past\"\u003e\u003c/osd-error\u003e\n```\n\nIn the example above, the validator will check that the field value is in the past.\n\nThe following default validators are available:\n - pastDateValidator()\n - futureDateValidator()\n\n### Multi-field validators\nThe osdError directive comes with several multi-field validators. These can be used to validate based on multiple fields in your form. The osdError directive accepts a built-in validator name and an array of attributes to check. The most common example is checking that the password confirmation field matches the password field:\n\n```js\n\u003cosd-error validator=\"strictMatchValidator()\" attrs=\"['password', 'passwordConfirmation']\" msg=\"Passwords do not match\"\u003e\u003c/osd-error\u003e\n```\n\nIn the example above, the validator will check that the password and passwordConfirmation fields are strictly equal.\n\nThe following multi-field validators are available:\n - strictMatchValidator()\n - strictIncreaseValidator()\n\n### Bootstrap vs. Semantic UI\nBy default the project supports Bootstrap but you can change to using Semantic UI by injecting the OsdFormConfigProvider into your app's config and calling:\n\n```js\nOsdFormConfigProvider.useSemanticUi();\n```\n\n\n### License\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 damacisaac\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOsedea%2Fangular-osd-form","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FOsedea%2Fangular-osd-form","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOsedea%2Fangular-osd-form/lists"}