{"id":16995040,"url":"https://github.com/jalik/js-form-parser","last_synced_at":"2025-10-09T05:38:46.522Z","repository":{"id":46940872,"uuid":"110653138","full_name":"jalik/js-form-parser","owner":"jalik","description":"A utility to parse complex forms with minimum effort.","archived":false,"fork":false,"pushed_at":"2024-04-29T23:36:45.000Z","size":2436,"stargazers_count":8,"open_issues_count":3,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-20T05:52:21.457Z","etag":null,"topics":["form","parser"],"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/jalik.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-11-14T07:01:51.000Z","updated_at":"2025-05-13T14:19:00.000Z","dependencies_parsed_at":"2024-02-26T21:30:31.172Z","dependency_job_id":"b20c35af-c2a4-45d7-9939-73712010393d","html_url":"https://github.com/jalik/js-form-parser","commit_stats":{"total_commits":152,"total_committers":1,"mean_commits":152.0,"dds":0.0,"last_synced_commit":"cb83e9476f581ad29b240eff5418281ba727e255"},"previous_names":["jalik/jk-form-parser"],"tags_count":31,"template":false,"template_full_name":null,"purl":"pkg:github/jalik/js-form-parser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jalik%2Fjs-form-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jalik%2Fjs-form-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jalik%2Fjs-form-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jalik%2Fjs-form-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jalik","download_url":"https://codeload.github.com/jalik/js-form-parser/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jalik%2Fjs-form-parser/sbom","scorecard":{"id":503205,"data":{"date":"2025-08-11","repo":{"name":"github.com/jalik/js-form-parser","commit":"10559168a7c2f626378557b62f73aa163969fb59"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"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":"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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/node.js.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":"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":"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":"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":"Pinned-Dependencies","score":3,"reason":"dependency not pinned by hash detected -- score normalized to 3","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node.js.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/jalik/js-form-parser/node.js.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node.js.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/jalik/js-form-parser/node.js.yml/main?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of   1 npmCommand 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":"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":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt: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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"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":"Vulnerabilities","score":1,"reason":"9 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"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-19T22:33:17.463Z","repository_id":46940872,"created_at":"2025-08-19T22:33:17.463Z","updated_at":"2025-08-19T22:33:17.463Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000739,"owners_count":26082932,"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","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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","parser"],"created_at":"2024-10-14T03:47:24.843Z","updated_at":"2025-10-09T05:38:46.474Z","avatar_url":"https://github.com/jalik.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# @jalik/form-parser\n\n![GitHub package.json version](https://img.shields.io/github/package-json/v/jalik/js-form-parser.svg)\n![Build Status](https://github.com/jalik/js-form-parser/actions/workflows/node.js.yml/badge.svg)\n![Last commit](https://img.shields.io/github/last-commit/jalik/js-form-parser.svg)\n[![GitHub issues](https://img.shields.io/github/issues/jalik/js-form-parser.svg)](https://github.com/jalik/js-form-parser/issues)\n![GitHub](https://img.shields.io/github/license/jalik/js-form-parser.svg)\n![npm](https://img.shields.io/npm/dt/@jalik/form-parser.svg)\n\n## Features\n\n- Collect and parse form values in one line\n- Parse values based on field type (ex: `type=\"number\"`) or data-type (ex: `data-type=\"boolean\"`)\n- Use custom parser with `data-type`\n- Build arrays and objects based on field name\n- Trim and nullify values\n- Filter values using a custom function\n- Clean values using a custom function\n- Framework-agnostic\n- TypeScript declarations ♥\n\n## Sandbox\n\nPlay with the lib here: https://codesandbox.io/s/jalik-form-parser-demo-r29grh?file=/src/index.js\n\n## Installing\n\n```shell\nnpm i -P @jalik/form-parser\n```\n```shell\nyarn add @jalik/form-parser\n```\n\n## Getting started\n\nLet's start with the form below :\n\n```html\n\u003cform id=\"my-form\"\u003e\n  \u003cinput name=\"username\" value=\"jalik\"\u003e\n  \u003cinput name=\"password\" value=\"secret\"\u003e\n  \u003cinput name=\"age\" type=\"number\" value=\"35\"\u003e\n  \u003cinput name=\"gender\" type=\"radio\" value=\"male\" checked\u003e\n  \u003cinput name=\"gender\" type=\"radio\" value=\"female\"\u003e\n  \u003cinput name=\"email\" type=\"email\" value=\"jalik@mail.com\"\u003e\n  \u003cinput name=\"phone\" type=\"tel\" data-type=\"string\" value=\"067123456\"\u003e\n  \u003cinput name=\"subscribe\" type=\"checkbox\" data-type=\"boolean\" value=\"true\" checked\u003e\n  \u003cinput name=\"token\" type=\"hidden\" value=\"aZ7hYkl12mPx\"\u003e\n  \u003cbutton type=\"submit\"\u003eSubmit\u003c/button\u003e\n\u003c/form\u003e\n```\n\nYou can collect and parse fields with `parseForm(form, options)`.\n\n```js\nimport { parseForm } from '@jalik/form-parser'\n\n// Get an existing HTML form element\nconst form = document.getElementById('my-form')\n\n// Parse form values with default options\nconst fields = parseForm(form)\n```\n\nThe `fields` object will look like this :\n\n```json\n{\n  \"username\": \"jalik\",\n  \"password\": \"secret\",\n  \"age\": 35,\n  \"gender\": \"male\",\n  \"email\": \"jalik@mail.com\",\n  \"phone\": \"067123456\",\n  \"subscribe\": true,\n  \"token\": \"aZ7hYkl12mPx\"\n}\n```\n\nBelow is a more complete form example, with a lot of different cases to help you understand the\nbehavior of the parsing function (pay attention to comments, values and attributes).\n\n```html\n\n\u003cform id=\"my-form\"\u003e\n  \u003c!-- Fields without name are ignored --\u003e\n  \u003cinput type=\"text\" value=\"aaa\"\u003e\n\n  \u003c!-- Disabled fields are always ignored --\u003e\n  \u003cinput name=\"disabled_field\" value=\"hello\" disabled\u003e\n\n  \u003c!-- Buttons are always ignored --\u003e\n  \u003cinput name=\"input_button\" type=\"button\" value=\"Click me\"\u003e\n  \u003cinput name=\"input_reset\" type=\"reset\" value=\"Reset\"\u003e\n  \u003cinput name=\"input_submit\" type=\"submit\" value=\"Submit\"\u003e\n  \u003cbutton name=\"button\" type=\"button\" value=\"Click me\"\u003e\u003c/button\u003e\n  \u003cbutton name=\"reset\" type=\"reset\" value=\"Reset\"\u003e\u003c/button\u003e\n  \u003cbutton name=\"submit\" type=\"submit\" value=\"Submit\"\u003e\u003c/button\u003e\n\n  \u003c!-- These fields will be parsed to booleans --\u003e\n  \n  \u003c!-- boolean = false --\u003e\n  \u003cinput name=\"boolean\" type=\"radio\" data-type=\"boolean\" value=\"true\"\u003e\n  \u003cinput name=\"boolean\" type=\"radio\" data-type=\"boolean\" value=\"false\" checked\u003e\n  \u003c!-- hidden_boolean = true --\u003e\n  \u003cinput name=\"hidden_boolean\" type=\"hidden\" data-type=\"auto\" value=\"true\"\u003e\n\n  \u003c!-- These fields will be parsed to numbers --\u003e\n  \n  \u003c!-- hidden_float = 9.99 --\u003e\n  \u003cinput name=\"hidden_float\" type=\"hidden\" data-type=\"number\" value=\"09.99\"\u003e\n  \u003c!-- text_integer = 1 --\u003e\n  \u003cinput name=\"text_integer\" type=\"text\" data-type=\"number\" value=\"01\"\u003e\n  \u003c!-- select_number = 30 --\u003e\n  \u003cselect name=\"select_number\" data-type=\"number\"\u003e\n    \u003coption\u003e10\u003c/option\u003e\n    \u003coption\u003e20\u003c/option\u003e\n    \u003coption selected\u003e30\u003c/option\u003e\n  \u003c/select\u003e\n  \u003c!-- float = 9.99 --\u003e\n  \u003cinput name=\"float\" type=\"number\" value=\"09.99\"\u003e\n  \u003c!-- integer = 1 --\u003e\n  \u003cinput name=\"integer\" type=\"number\" value=\"01\"\u003e\n  \u003c!-- range = 0118 --\u003e\n  \u003cinput name=\"range\" type=\"range\" value=\"0118\"\u003e\n\n  \u003c!-- These fields will be parsed to strings --\u003e\n  \n  \u003c!-- number_text = '0123' --\u003e\n  \u003cinput name=\"number_text\" type=\"number\" data-type=\"string\" value=\"0123\"\u003e\n  \u003c!-- date = '2017-11-14' --\u003e\n  \u003cinput name=\"date\" type=\"date\" value=\"2017-11-14\"\u003e\n  \u003c!-- file = 'file://path/to/file.txt' --\u003e\n  \u003cinput name=\"file\" type=\"file\" value=\"file://path/to/file.txt\"\u003e\n  \u003c!-- hidden_text = 'shadowed' --\u003e\n  \u003cinput name=\"hidden_text\" type=\"hidden\" value=\"shadowed\"\u003e\n  \u003c!-- month = '2017-11' --\u003e\n  \u003cinput name=\"month\" type=\"month\" value=\"2017-11\"\u003e\n  \u003c!-- text = 'Hello' --\u003e\n  \u003cinput name=\"text\" type=\"text\" value=\"Hello\"\u003e\n  \u003c!-- url = 'http://www.github.com/' --\u003e\n  \u003cinput name=\"url\" type=\"url\" value=\"http://www.github.com/\"\u003e\n  \u003c!-- week = '2017-W16' --\u003e\n  \u003cinput name=\"week\" type=\"week\" value=\"2017-W16\"\u003e\n  \u003c!-- textarea = 'Hello' --\u003e\n  \u003ctextarea name=\"textarea\"\u003eHello\u003c/textarea\u003e\n\n  \u003c!-- Passwords are never altered or parsed (\"data-type\" is ignored) --\u003e\n  \n  \u003c!-- password = ' 1337 ' --\u003e\n  \u003cinput name=\"password\" type=\"password\" data-type=\"number\" value=\" 1337 \"\u003e\n\n  \u003c!-- These fields will be parsed as array --\u003e\n  \n  \u003c!-- select_multiple = [20, 30] --\u003e\n  \u003cselect name=\"select_multiple\" data-type=\"number\" multiple\u003e\n    \u003coption\u003e10\u003c/option\u003e\n    \u003coption selected\u003e20\u003c/option\u003e\n    \u003coption selected\u003e30\u003c/option\u003e\n  \u003c/select\u003e\n  \u003c!-- array = ['A', 'B'] --\u003e\n  \u003cinput name=\"array[]\" type=\"checkbox\" value=\"A\" checked\u003e\n  \u003cinput name=\"array[]\" type=\"checkbox\" value=\"B\" checked\u003e\n\u003c/form\u003e\n```\n\nTo get form fields :\n\n```js\nimport { parseForm } from '@jalik/form-parser'\n\n// Get an existing HTML form element\nconst form = document.getElementById('my-form')\n\n// Parse form values using default options\nconst fields = parseForm(form)\n```\n\nThe `fields` object will look like this :\n\n```json\n{\n  \"boolean\": false,\n  \"hidden_boolean\": true,\n  \"float\": 9.99,\n  \"hidden_float\": 9.99,\n  \"text_integer\": 1,\n  \"integer\": 1,\n  \"range\": 118,\n  \"select_number\": 30,\n  \"date\": \"2017-11-14\",\n  \"file\": \"file://path/to/file.txt\",\n  \"hidden_text\": \"shadowed\",\n  \"month\": \"2017-11\",\n  \"number_text\": \"0123\",\n  \"text\": \"Hello\",\n  \"url\": \"http://www.github.com/\",\n  \"textarea\": \"Hello\",\n  \"password\": \" 1337 \",\n  \"array\": [\n    \"A\",\n    \"B\"\n  ],\n  \"select_multiple\": [\n    20,\n    30\n  ]\n}\n```\n\n## Building arrays\n\nTo get an array of values, append `[]` to a field name:\n\n```html\n\u003cform id=\"my-form\"\u003e\n  \u003c!-- This will create an array with checked values --\u003e\n  \u003cinput name=\"array[]\" type=\"checkbox\" value=\"A\"\u003e\n  \u003cinput name=\"array[]\" type=\"checkbox\" value=\"B\" checked\u003e\n  \u003cinput name=\"array[]\" type=\"checkbox\" value=\"C\" checked\u003e\n\n  \u003c!-- This will create an array with checked values (indexed) --\u003e\n  \u003cinput name=\"colors[2]\" type=\"checkbox\" value=\"red\" checked\u003e\n  \u003cinput name=\"colors[1]\" type=\"checkbox\" value=\"blue\"\u003e\n  \u003cinput name=\"colors[0]\" type=\"checkbox\" value=\"white\" checked\u003e\n\u003c/form\u003e \n```\n\nGet fields values :\n\n```js\nimport { parseForm } from '@jalik/form-parser'\n\n// Get an existing HTML form element\nconst form = document.getElementById('my-form')\n\n// Parse form values using default options\nconst fields = parseForm(form)\n```\n\nThe `fields` object will look like this :\n\n```json\n{\n  \"array\": [\n    \"B\",\n    \"C\"\n  ],\n  \"colors\": [\n    \"white\",\n    undefined,\n    \"red\"\n  ]\n}\n```\n\n## Building objects\n\nTo get an object, write attributes like `[attribute]`:\n\n```html\n\u003cform id=\"my-form\"\u003e\n  \u003c!-- This will create an object with those attributes --\u003e\n  \u003cinput name=\"address[street]\" value=\"Av. Pouvanaa a Oopa\"\u003e\n  \u003cinput name=\"address[city]\" value=\"Papeete\"\u003e\n\u003c/form\u003e \n```\n\nGet fields values :\n\n```js\nimport { parseForm } from '@jalik/form-parser'\n\n// Get an existing HTML form element\nconst form = document.getElementById('my-form')\n\n// Parse form values using default options\nconst fields = parseForm(form)\n```\n\nThe `fields` object will look like this :\n\n```json\n{\n  \"address\": {\n    \"street\": \"Av. Pouvanaa a Oopa\",\n    \"city\": \"Papeete\"\n  }\n}\n```\n\n### Using numbers as keys in objects (since v2.0.6)\n\nIf you need to create an object with numbers as attributes, use single or double quotes to force the\nparser to interpret it as a string and then creating an object instead of an array.\n\n```html\n\u003cform id=\"my-form\"\u003e\n  \u003c!-- This will create an object with those attributes --\u003e\n  \u003cinput name=\"elements['0']\" value=\"Zero\"\u003e\n  \u003cinput name=\"elements['1']\" value=\"One\"\u003e\n  \u003cinput name=\"elements['2']\" value=\"Two\"\u003e\n\u003c/form\u003e \n```\n\nWill give this :\n\n```json\n{\n  \"elements\": {\n    \"0\": \"Zero\",\n    \"1\": \"One\",\n    \"2\": \"Two\"\n  }\n}\n```\n\nInstead of :\n\n```json\n{\n  \"elements\": [\n    \"Zero\",\n    \"One\",\n    \"Two\"\n  ]\n}\n```\n\n## Parsing fields\n\nTo define the type of field, you can use the attribute `data-type` or `type`.  \nThe attribute `data-type` takes precedence over `type` if both of are defined.\n\nWhen using `data-type` attribute, the value can be:\n* `auto` to convert the value to the best guess type (ex: `123` =\u003e `number`, `true` =\u003e `boolean`)\n* `boolean` to convert the value to a boolean (ex: `true`, `1`, `yes`, `on`, `false`, `0`, `no`, `off`)\n* `number` to convert the value to a number\n\nWhen using `type` attribute on `\u003cinput\u003e`, only `number` and `range` are parsed to numbers.\n\n```html\n\u003c!-- This will parse \"true\" as a boolean --\u003e\n\u003cinput name=\"boolean\" type=\"text\" data-type=\"boolean\" value=\"true\"\u003e\n\n\u003c!-- This will parse \"01\" as a number --\u003e\n\u003cinput name=\"integer\" type=\"text\" data-type=\"number\" value=\"01\"\u003e\n\u003c!-- This will parse \"09.99\" as a number --\u003e\n\u003cinput name=\"float\" type=\"text\" data-type=\"number\" value=\"09.99\"\u003e\n\n\u003c!-- This will parse \"0963\" as a string --\u003e\n\u003cinput name=\"string\" type=\"text\" data-type=\"string\" value=\"0963\"\u003e\n\n\u003c!-- This will parse \"13.37\" as a number --\u003e\n\u003cinput name=\"anything\" type=\"text\" data-type=\"auto\" value=\"13.37\"\u003e\n\u003c!-- This will parse \"false\" as a boolean --\u003e\n\u003cinput name=\"anything_2\" type=\"text\" data-type=\"auto\" value=\"false\"\u003e\n```\n\n## Using a custom parser\n\nYou may want to create your own `data-type`, it is possible since the `v3.1.0` by passing the `parser` option to `parseForm()` or `parseField()`.\n\n```html\n\u003cform id=\"my-form\"\u003e\n  \u003cinput name=\"phone\" data-type=\"phone\" value=\"689.12345678\" /\u003e\n\u003c/form\u003e\n```\n\n```js\nimport { parseForm } from '@jalik/form-parser'\n\nconst form = document.getElementById('my-form')\nconst fields = parseForm(form, {\n  parser: (value, dataType, field) =\u003e {\n    if (dataType === 'phone') {\n      const [code, number] = value.split(/\\./)\n      return {\n        code,\n        number,\n      }\n    }\n    return null\n  },\n})\n```\n\n```json\n{\n  \"phone\": {\n    \"code\": \"689\",\n    \"number\": \"12345678\"\n  }\n}\n```\n\n## Parsing complex forms with nested fields\n\nIt is possible to reconstruct an object corresponding to the form structure, so it can\nparse complex forms containing nested arrays and objects.\n\n```html\n\u003cform id=\"my-form\"\u003e\n  \u003cinput name=\"phones[0][code]\" type=\"number\" data-type=\"string\" value=\"689\"\u003e\n  \u003cinput name=\"phones[0][number]\" type=\"number\" data-type=\"string\" value=\"87218910\"\u003e\n  \u003cinput name=\"phones[1][code]\" type=\"number\" data-type=\"string\" value=\"689\"\u003e\n  \u003cinput name=\"phones[1][number]\" type=\"number\" data-type=\"string\" value=\"87218910\"\u003e\n  \n  \u003c!-- A useless deep nested field value --\u003e\n  \u003cinput name=\"deep_1[][deep_2][0][][deep_3]\" value=\"DEEP\"\u003e\n\u003c/form\u003e \n```\n\nTo get fields :\n\n```js\nimport { parseForm } from '@jalik/form-parser'\n\n// Get an existing HTML form element\nconst form = document.getElementById('my-form')\n\n// Parse form values using default options\nconst fields = parseForm(form)\n```\n\nThe `fields` object will look like this :\n\n```json\n{\n  \"phones\": [\n    {\n      \"code\": \"689\",\n      \"number\": \"87218910\"\n    },\n    {\n      \"code\": \"689\",\n      \"number\": \"87218910\"\n    }\n  ],\n  \"deep_1\": [\n    {\n      \"deep_2\": [\n        [\n          {\n            \"deep_3\": \"DEEP\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n```\n\n## Filtering\n\nWhen parsing a form, you can filter values with `filterFunction(field, parsedValue)` option in the `parseForm(form, options)`.  \nThe filter function must return `true` to return the field.\n\n```js\nimport { parseForm } from '@jalik/form-parser'\n\n// Get an existing HTML form element\nconst form = document.getElementById('my-form')\n\nconst fields = parseForm(form, {\n  // returns only text fields\n  filterFunction: (field, parsedValue) =\u003e field.type === 'text'\n});\n```\n\n## Cleaning\n\nValues can be cleaned by passing `cleanFunction(value, field)` to `parseForm(form, options)`.  \nNote that only strings are passed to this function and that password fields are ignored.\n\n```js\nimport { parseForm } from '@jalik/form-parser'\n\n// Get an existing HTML form element\nconst form = document.getElementById('my-form')\n\n// Parse form values using default options\nconst fields = parseForm(form, {\n  cleanFunction: (value, field) =\u003e {\n    // Apply uppercase to lastName field\n    if (field.name === 'lastName' || /name/gi.test(field.name)) {\n      value = value.toUpperCase()\n    }\n    // Remove HTML code from all fields\n    return value.replace(/\u003c\\/?[^\u003e]+\u003e/gm, '')\n  }\n})\n```\n\n## API\n\n### parseField(field, options)\n\nTo parse a single field.\n\n```html\n\u003cform\u003e\n  \u003cselect data-type=\"number\" name=\"values\" multiple\u003e\n    \u003coption\u003e1\u003c/option\u003e\n    \u003coption selected\u003e2\u003c/option\u003e\n    \u003coption selected\u003e3\u003c/option\u003e\n  \u003c/select\u003e\n\u003c/form\u003e\n```\n\n```js\nimport { parseField } from '@jalik/form-parser'\n\nconst field = document.getElementById('values')\nconst values = parseField(field)\n// values = [2, 3]\n```\n\n### parseForm(form, options)\n\nTo parse a form with all fields.\n\n```html\n\u003cform id=\"my-form\"\u003e\n  \u003cinput type=\"number\" name=\"age\" value=\"35\" /\u003e\n  \u003cselect data-type=\"number\" name=\"values\" multiple\u003e\n    \u003coption\u003e1\u003c/option\u003e\n    \u003coption selected\u003e2\u003c/option\u003e\n    \u003coption selected\u003e3\u003c/option\u003e\n  \u003c/select\u003e\n\u003c/form\u003e\n```\n\n```js\nimport { parseForm } from '@jalik/form-parser'\n\n// Get an existing HTML form element\nconst form = document.getElementById('my-form')\n\nconst fields = parseForm(form, {\n  // Cleans parsed values\n  cleanFunction(value, field) {\n    return typeof value === 'string' ? stripTags(value) : value\n  },\n  // Only returns fields that matches the condition\n  filterFunction(field) {\n    return field.type === 'text'\n  },\n  // Replace empty strings with null\n  nullify: true,\n  // Set parsing mode.\n  // - none: disable parsing\n  // - type: enable parsing based on \"type\" attribute (ex: type=\"number\")\n  // - data-type: enable parsing based on \"data-type\" attribute (ex: data-type=\"number\")\n  // - auto: enable parsing based on data-type and type (in this order)\n  parsing: 'none' | 'type' | 'data-type' | 'auto',\n  // Remove extra spaces\n  trim: true\n})\n```\n\n## Changelog\n\nHistory of releases is in the [changelog](./CHANGELOG.md).\n\n## License\n\nThe code is released under the [MIT License](http://www.opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjalik%2Fjs-form-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjalik%2Fjs-form-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjalik%2Fjs-form-parser/lists"}