{"id":13520459,"url":"https://github.com/serverscom/recoil-form","last_synced_at":"2026-02-16T00:05:28.725Z","repository":{"id":42836386,"uuid":"264184049","full_name":"serverscom/recoil-form","owner":"serverscom","description":"Blazing fast React forms build on top of Recoil","archived":false,"fork":false,"pushed_at":"2023-01-07T18:12:29.000Z","size":1109,"stargazers_count":45,"open_issues_count":14,"forks_count":5,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-08-16T16:09:35.577Z","etag":null,"topics":[],"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/serverscom.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":"2020-05-15T12:09:20.000Z","updated_at":"2024-01-21T00:38:57.000Z","dependencies_parsed_at":"2023-02-07T20:00:51.356Z","dependency_job_id":null,"html_url":"https://github.com/serverscom/recoil-form","commit_stats":null,"previous_names":["afitiskin/recoil-form"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/serverscom/recoil-form","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serverscom%2Frecoil-form","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serverscom%2Frecoil-form/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serverscom%2Frecoil-form/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serverscom%2Frecoil-form/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/serverscom","download_url":"https://codeload.github.com/serverscom/recoil-form/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serverscom%2Frecoil-form/sbom","scorecard":{"id":812973,"data":{"date":"2025-08-11","repo":{"name":"github.com/serverscom/recoil-form","commit":"aa352accc5abd033948bc39baa032d89f0496c0f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"Code-Review","score":1,"reason":"Found 1/9 approved changesets -- score normalized to 1","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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:28","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:29","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/main.yml:1","Info: no jobLevel write permissions found"],"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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/serverscom/recoil-form/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/serverscom/recoil-form/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/serverscom/recoil-form/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/serverscom/recoil-form/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/serverscom/recoil-form/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/serverscom/recoil-form/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/serverscom/recoil-form/main.yml/master?enable=pin","Info:   0 out of   7 GitHub-owned GitHubAction dependencies pinned"],"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":"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":"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":"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":"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"}},{"name":"SAST","score":7,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 0 commits out of 22 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"59 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw","Warn: Project is vulnerable to: GHSA-257v-vj4p-3w2h","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-434g-2637-qmqr","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-7r28-3m3f-r2pr","Warn: Project is vulnerable to: GHSA-r8j5-h5cx-65gg","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-92xj-mqp7-vmcj","Warn: Project is vulnerable to: GHSA-wxgw-qj99-44c2","Warn: Project is vulnerable to: GHSA-5rrq-pxf6-6jx5","Warn: Project is vulnerable to: GHSA-8fr3-hfg3-gpgp","Warn: Project is vulnerable to: GHSA-gf8q-jrpm-jvxq","Warn: Project is vulnerable to: GHSA-2r2c-g63r-vccr","Warn: Project is vulnerable to: GHSA-cfm4-qjh2-4765","Warn: Project is vulnerable to: GHSA-x4jg-mjrx-434g","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-566m-qj78-rww5","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-hwj9-h5mp-3pm3","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-4wf5-vphf-c2xc","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-6fc8-4gx4-v693","Warn: Project is vulnerable to: GHSA-5fw9-fq32-wv5p","Warn: Project is vulnerable to: GHSA-gcx4-mw62-g8wm","Warn: Project is vulnerable to: GHSA-44c6-4v22-4mhx","Warn: Project is vulnerable to: GHSA-4x5v-gmq8-25ch","Warn: Project is vulnerable to: GHSA-hxcc-f52p-wc94","Warn: Project is vulnerable to: GHSA-4rq4-32rv-6wp6","Warn: Project is vulnerable to: GHSA-64g7-mvw6-v9qj","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-jgrx-mgxx-jf9v","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T13:35:45.384Z","repository_id":42836386,"created_at":"2025-08-23T13:35:45.384Z","updated_at":"2025-08-23T13:35:45.384Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29494291,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-16T00:00:57.352Z","status":"ssl_error","status_checked_at":"2026-02-15T23:56:34.338Z","response_time":118,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":"2024-08-01T05:02:21.371Z","updated_at":"2026-02-16T00:05:28.708Z","avatar_url":"https://github.com/serverscom.png","language":"TypeScript","funding_links":[],"categories":["TypeScript","Libraries"],"sub_categories":["Typescript"],"readme":"# `recoil-form`: blazing fast React forms build on top of Recoil\n\n## Installation\n```\nnpm install --save recoil-form recoil\n// or\nyarn add recoil-form recoil\n```\n\n## Work in progress\n\nThis project is currently in \"Work in progress\" status\n\n## API and Usage\n\n### `Form` component\n\nUse `Form` component as a main container for your form. This component creates a special form context, so all other components may only be used inside the `Form` component.\n\n#### Props\n\n##### `initialValues: { [name: string]: any | Promise\u003cany\u003e }`\n\nInitial field values of the form. If promise is passed as an initial value of the field, then field is suspended until promise is resolved and resolved promise value will be used as a field value. See `Field` for more details.\n\n##### `onSubmit: (values, { setErrors, setValues, resetForm }) =\u003e void | Promise\u003cvoid\u003e`\n\nYour form submission handler. It is passed your forms values and special methods to change form state:\n\n* `setErrors: ({ [name: string]: any }) =\u003e void` – set form errors by passing errors object. Key is used as field name and value is used as an error value.\n* `setErrors: (name: key, value: any, ...) =\u003e void` – set form errors by passing name-value pairs\n* `setValues: ({ [name: string]: any }) =\u003e void` – set form values by passing values object (similar to `initialValues`).\n* `setValues: (name: key, value: any, ...) =\u003e void` – set form values by passing name-value pairs\n* `resetForm: () =\u003e void` – reset form to initial state (clear form values, errors and touched states)\n\n### `Field` component\n\nUse `Field` component to add a new field to your form. `Field` component may represent default `input` or `select` components or any other custom component.\n\n#### Props\n\n##### `name: string`\n\nField name. The name is used as main field identifier and as a key in `values` object in `onSubmit` form handler.\n\n##### `type?: string`\n\nField type. Used only if `as` property is not set. `type` defines which default underlying component will be used to represent the field. See supported types below.\n\n##### `value?: any`\n\nField value. Used for `checkbox` and `radio` components. We do not use `event.target.value` internally, so you may use the value of any type. See more details below.\n\n##### `as: ElementType`\n\nReact component which is used to render the field. Default is `'input'`.\n\n##### `fallback: ReactNode`\n\nIf you pass a `Promise` as a field value or initial value, this promise will be used with `React.Suspense`. Component will be suspended with `fallback` until promise is resolved. Once resolved, promise value will be used as field value or initial value.\n\n#### Supported types\n\n##### Default behaviour (`as=\"input\"` or `as={undefined}` or missed `as` prop)\n\nRenders default input field (except cases when `type` is `\"checkbox\"`, `\"radio\"` or `\"file\"` which are described below)\n\n* `name: string` – the name of the field\n* `defaultValue?: string` - field's initial value\n* all other props except `value` are passed down to underlying `input` component. `value` is just ignored.\n\n##### `type=\"checkbox\"` (works only with `as=\"input\"` or `as={undefined}` or missed `as` prop)\n\nRenders default checkbox field.\n\n* `name: string` – the name of the field\n* `value?: any` - value used when checkbox checked. Default is `true`\n* `uncheckedValue?: any` - value used when checkbox unchecked. Default is `undefined`\n* `defaultChecked?: boolean` - if current checkbox checked or not. If `defaultChecked={true}` then initial value for the field set in `Form.initialValues` is always overridden with `value`.\n* all other props are passed down to underlying `input` component.\n\n##### `type=\"radio\"` (works only with `as=\"input\"` or `as={undefined}` or missed `as` prop)\n\nRenders default radio button.\n\n* `name: string` – the name of the field\n* `value: any` - value used when radio button checked.\n* `defaultChecked?: boolean` - if current radio button checked or not. If `defaultChecked={true}` then initial value for the field set in `Form.initialValues` is overridden with `value`. Keep in mind the case, when more than one radio button has `defaultChecked={true}`. In such case last rendered radio button will be checked and it's value will be used as an initial value for the field.\n* all other props are passed down to underlying `input` component.\n\n##### `type=\"file\"`\n\nNot supported yet. WIP.\n\n##### `as=\"select\"`\n\nNot supported yet. WIP.\n\n##### Custom components via `as={MyCustomComponent}`\n\nNot supported yet. WIP.\n\n### `ErrorMessage` component\n\nUse `ErrorMessage` component to render error message related to the field. Error message is only shown for `touched` fields which has an truthy error value.\n\n#### Props\n\n##### `name: string`\n\nThe name of the field to which current error message is related.\n\n##### `as: ElementType`\n\nReact component which is used to render the error message. Default is `'small'`.\n\n### `FieldArray` component\n\nNot ready yet. WIP\n\n### `useForm` hook\n\nNot ready yet. WIP\n\n### `useFormState` hook\n\n`useFormState` is a custom hook to retrieve current form state. Either `'ready'` or `'submitting'` is returned from this hook\n\n#### Reference\n\n`useFormState(): 'ready' | 'submitting'`\n\n### `useFormValues` hook\n\n`useFormValues` is a custom hook to retrieve current form values.\n\n#### Reference\n\n`useFormValues(): any`\n\n### `useField` hook\n\n`useField` is a custom React hook that will help you hook up inputs to `recoil-form`. You can use it to build your own custom input or input-related component.\n\n#### Reference\n\n##### `useField\u003cTValue = any\u003e(name: string, initialValue?: string): [FieldInputProps\u003cTValue\u003e, FieldMetaProps, FieldHelperProps]`\n\nA custom React Hook that returns a 3-tuple (an array with three elements) containing `FieldProps`, `FieldMetaProps` and `FieldHelperProps`. It accepts a string of a field `name` and optional `initialValue`.\n\n##### `FieldInputProps\u003cValue\u003e`\n\n* `name: string` - The name of the field\n* `value: TValue` - The field's value\n* `onBlur: (event: React.FocusEvent) =\u003e void` - A blur event handler\n* `onChange: (event: React.ChangeEvent\u003cany\u003e) =\u003e void` - A change event handler\n\n##### `FieldMetaProps\u003cValue\u003e`\n\nWIP\n\n##### `FieldHelperProps`\n\nAn object that contains helper functions which you can use to imperatively change the value, error value or touched status for the field in question. This is useful for components which need to change a field's status directly, without triggering change or blur events.\n\n* `setValue(value: any): void` - A function to change the field's value\n* `setTouched(value: boolean): void` - A function to change the field's touched status\n* `setError(value: any): void` - A function to change the field's error value\n\n### `useErrorMessage` / `useFieldError` hook\n`useErrorMessage` (or it's alias `useFieldError`) is a custom react hook that will allow you to get the field error. Your component will be automatically re-rendered when error is changed.\n\n#### Reference\n\n##### `useFieldError\u003cTValue = any\u003e(name: string): TValue | null`\n\n### `useFieldValue` hook\n\n`useFieldValue` is a custom react hook that will allow you to get the current field value. Your component will be automatically re-rendered when value is changed.\n\n### `useSetFieldError` hook\n\n`useSetFieldError` is a custom React hook that will allow you to get error updater function without subscription to field's error state.\n\n### `useSetFieldValue` hook\n\n`useSetFieldValue` is a custom React hook that will allow you to get value updater function without subscription to field's value state.\n\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fserverscom%2Frecoil-form","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fserverscom%2Frecoil-form","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fserverscom%2Frecoil-form/lists"}