{"id":30841855,"url":"https://github.com/dartoos-dev/well_formed","last_synced_at":"2025-09-06T20:10:14.749Z","repository":{"id":43009137,"uuid":"388204461","full_name":"dartoos-dev/well_formed","owner":"dartoos-dev","description":"A Flutter form field package designed to relieve developers of much of the form-related coding. It provides field masking, validation, smart trimming, and more.","archived":false,"fork":false,"pushed_at":"2024-08-24T20:43:22.000Z","size":328,"stargazers_count":7,"open_issues_count":1,"forks_count":5,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-08-25T19:44:10.598Z","etag":null,"topics":["flutter","form","form-fields","form-validation","input-mask","input-masking"],"latest_commit_sha":null,"homepage":"","language":"Dart","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/dartoos-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2021-07-21T18:02:40.000Z","updated_at":"2024-08-24T20:40:33.000Z","dependencies_parsed_at":"2023-02-19T01:45:57.143Z","dependency_job_id":null,"html_url":"https://github.com/dartoos-dev/well_formed","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/dartoos-dev/well_formed","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dartoos-dev%2Fwell_formed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dartoos-dev%2Fwell_formed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dartoos-dev%2Fwell_formed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dartoos-dev%2Fwell_formed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dartoos-dev","download_url":"https://codeload.github.com/dartoos-dev/well_formed/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dartoos-dev%2Fwell_formed/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273956236,"owners_count":25197587,"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-09-06T02:00:13.247Z","response_time":2576,"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":["flutter","form","form-fields","form-validation","input-mask","input-masking"],"created_at":"2025-09-06T20:10:10.584Z","updated_at":"2025-09-06T20:10:14.738Z","avatar_url":"https://github.com/dartoos-dev.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# well_formed\n\n\u003cimg\nsrc=\"https://user-images.githubusercontent.com/24878574/126539340-83d14f37-93e0-4fae-8029-f7ec9de71d88.png\"\nalt=\"EO-Color logo\" width=\"153\" height=\"153\"/\u003e\n\n[![EO principles respected\nhere](https://www.elegantobjects.org/badge.svg)](https://www.elegantobjects.org)\n[![DevOps By\nRultor.com](https://www.rultor.com/b/dartoos-dev/well_formed)](https://www.rultor.com/p/dartoos-dev/well_formed)\n\n[![pub](https://img.shields.io/pub/v/well_formed)](https://pub.dev/packages/well_formed)\n[![license](https://img.shields.io/badge/license-mit-green.svg)](https://github.com/dartoos-dev/well_formed/blob/master/LICENSE)\n[![PDD status](https://www.0pdd.com/svg?name=dartoos-dev/well_formed)](https://www.0pdd.com/p?name=dartoos-dev/well_formed)\n\n[![build](https://github.com/dartoos-dev/well_formed/actions/workflows/build.yml/badge.svg)](https://github.com/dartoos-dev/well_formed/actions/)\n[![codecov](https://codecov.io/gh/dartoos-dev/well_formed/branch/master/graph/badge.svg?token=W6spF0S796)](https://codecov.io/gh/dartoos-dev/well_formed)\n[![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/rafamizes/well_formed)](https://www.codefactor.io/repository/github/rafamizes/well_formed)\n[![style: lint](https://img.shields.io/badge/style-lint-4BC0F5.svg)](https://pub.dev/packages/lint)\n[![Hits-of-Code](https://hitsofcode.com/github/dartoos-dev/well_formed?branch=master)](https://hitsofcode.com/github/dartoos-dev/well_formed/view?branch=master)\n\n## Overview\n\nWell-**Form**ed is a form field package designed to relieve developers of much\nof the form-related coding. This is achieved by providing automatic field\nvalidation and masking, smart trimming, and more.\n\nIn addition, this package aims to:\n\n- help developers to always keep the users' data **well-formed**.\n- improve source code readability by providing form fields with **semantic\n  names**; that is, names that convey their purpose at first glance like\n  _EmailField_, _Ipv4Field_, _UrlField_, and so on.\n- automate the selection of the keyboard type according to the field's purpose.\n\nIn order to be a reliable package, every class is well-documented and fully\nunit-tested by a CI/CD pipeline with rigorous quality gates.\n\n## Contents\n\n- [Overview](#overview)\n- [Getting Started](#getting-started)\n  - [Form Field in Action](#form-field-in-action)\n- [List of Form Fields by Category](#list-of-form-fields)\n  - [Brazil](#brazil)\n    - [BrMobileField](#brmobilefield)\n    - [BrPhoneField](#brphonefield)\n    - [CepField](#cepfield)\n    - [CnpjField](#cnpjfield)\n    - [CpfField](#cpffield)\n  - [Core](#core)\n    - [BasicTextField](#basictextfield)\n    - [WellFormed](#wellformed)\n  - [Net](#net)\n    - [EmailField](#emailfield)\n  - [Numeric](#numeric)\n    - [DigitField](#digitfield)\n    - [HexField](#hexfield)\n    - [IntField](#intfield)\n    - [NumField](#numfield)\n- [Demo application](#demo-application)\n  - [Blank Field Error Messages](#blank-field-error-messages)\n  - [Invalid Inputs](#invalid-inputs)\n  - [Fields With Proper Values](#fields-with-proper-values)\n- [Left Out Properties](#left-out-properties)\n- [Contribute](#contribute)\n- [References](#references)\n\n\n## Getting Started\n\nMost of the form fields in this package are built on top of the\n[TextFormField](https://api.flutter.dev/flutter/material/TextFormField-class.html)\nwidget so that they remain **fully compatible** with the\n[Form](https://api.flutter.dev/flutter/widgets/Form-class.html) widget. This is\nimportant to avoid erroneous (buggy) behavior, such as when a field does not\nreset when its parent `Form` widget gets reset.\n\nBesides supporting most of the `TextFormField` properties, additional properties\nhave been introduced to facilitate the creation of \"Smarter\" form fields with\nstunning capabilities such as:\n\n- **Required fields**: any field can be made required by simply assigning\n  an error message to the field's `blank` property.\n- **Validation**: this is done automatically according to the field type. You\n  can use your own error messages by assigning them to properties like `blank`,\n  `malformed`, `long`, etc. In addition, you can pass extra validation steps to\n  the `validator` property.\n- **Field masking**: this is also performed automatically. For example, the\n  [CpfField](https://pub.dev/documentation/well_formed/latest/brazil/CpfField-class.html)\n  widget displays the mask _###.###.###-##_ (each '#' is a digit [0–9]) as the\n  user enters digits; therefore, if the user enters _12345678900_, the displayed\n  text will be _123.456.789-00_.\n- **Stripping**: it is the removal of non-digit characters from masked fields.\n  It is enabled by default; to disable it, simply set the `strip` property to\n  `false`.\n- **Smart trimming**: this is when trimming — the removal of leading and\n  trailing white-space characters — is also applied to the callback functions.\n  The affected callbacks are: `onSaved`,`onChanged`, `onFieldSubmitted`. To\n  enable it, simply set the `trim` property to `true`.\n- **Automatic keyboard type selection**: the most suitable keyboard type is\n  selected according to the field type. For example, the\n  [EmailField](https://pub.dev/documentation/well_formed/latest/net/EmailField-class.html)\n  widget sets the keyboard type to `TextInputType.emailAddress`, which is\n  optimized for entering email addresses.\n\n### Form Field in Action\n\nThe code below demonstrates how to use the\n[EmailField](https://pub.dev/documentation/well_formed/latest/net/EmailField-class.html)\nwidget with the `trim` property set to `true`. Thus, the entered value gets\ntrimmed before any validation takes place. Furthermore, this example also\nillustrates some important features:\n\n- auto validation.\n- custom error messages.\n- length constraint.\n\n```dart\n  …\n  // the form's mandatory state key\n  final formKey = GlobalKey\u003cFormState\u003e();\n  …\n  @override\n  Widget build(BuildContext context) {\n    return Form(\n      key: formKey,\n      child: Column(children: [\n        EmailField.len(\n          50, // limits the input length to up to 50 characters\n          trim: true, // trims the entered email\n          blank: 'Inform the email', // error message if the field is left blank\n          malformed: 'Invalid email', // error message if the email is invalid\n          long: 'The email is too long', // error message for long emails\n          decoration: const InputDecoration(\n            labelText: 'Enter an email with up to 50 characters',\n          ),\n        ),\n      ]),\n    );\n  }\n```\n\n## List of Form Fields\n\nThe complete list of form fields along with more detailed information about each\none (constructors, parameters, etc.):\n\n- [well_formed](https://pub.dev/documentation/well_formed/latest/).\n\n### Brazil\n\nForm fields related to\n[Brazil](https://pub.dev/documentation/well_formed/latest/brazil/brazil-library.html).\n\nMost form fields in this library are _masked fields_, so whenever you see a '#'\ncharacter in the documentation, you should think of it as a placeholder for a\nsingle digit [0-9].\n\n#### BrMobileField\n\n[BrMobileField](https://pub.dev/documentation/well_formed/latest/brazil/BrMobileField-class.html)\nis a masked _(##) #####-####_ form field for Brazilian mobile numbers.\n\n```dart\nBrMobileField(\n  strip: true, // remove non-digit characters when submitted/saved/changed.\n  blank: 'Please enter the mobile number', // the error message if the field is left blank\n  malformed: 'Invalid mobile number', // the error message if the number is malformed\n  decoration: InputDecoration(labelText: 'Enter a mobile number'),\n);\n```\n\n#### BrPhoneField\n\n[BrPhoneField](https://pub.dev/documentation/well_formed/latest/brazil/BrPhoneField-class.html)\nis a masked _(##) ####-####_ form field for Brazilian landline telephone\nnumbers.\n\n```dart\nBrPhoneField(\n  strip: true, // remove non-digit characters when submitted/saved/changed.\n  blank: 'Please enter the phone number', // the error message if the field is left blank\n  malformed: 'Invalid phone number', // the error message if the number is invalid\n  decoration: InputDecoration(labelText: 'Enter a phone number'),\n);\n```\n\n#### CepField\n\n[CepField](https://pub.dev/documentation/well_formed/latest/brazil/CepField-class.html)\nis a masked _#####-###_ form field for CEP (Código de Endereçamento Postal —\nBrazilian Postal Code).\n\n```dart\nCepField(\n  strip: true, // remove non-digit characters when submitted/saved/changed.\n  blank: 'Please enter the CEP', // the error message if the field is left blank\n  malformed: 'Invalid CEP', // the error message if the CEP is invalid\n  decoration: InputDecoration(labelText: 'Enter a CEP'),\n);\n```\n\n#### CnpjField\n\n[CnpjField](https://pub.dev/documentation/well_formed/latest/brazil/CnpjField-class.html)\nis a masked _##.###.###/####-##_ form field for CNPJ (Cadastro Nacional da\nPessoa Jurídica — Brazilian Company's Registered Number).\n\n```dart\nCnpjField(\n  strip: true, // remove non-digit characters when submitted/saved/changed.\n  blank: 'Please enter the CNPJ', // the error message if the field is left blank\n  malformed: 'Invalid CNPJ', // the error message if the CNPJ is invalid\n  decoration: InputDecoration(labelText: 'Enter a CNPJ'),\n);\n```\n\n#### CpfField\n\n[CpfField](https://pub.dev/documentation/well_formed/latest/brazil/CnpjField-class.html)\nis a masked _###.###.###-##_ form field for CPF (Cadastro da Pessoa Física; it\nis a kind of social security number).\n\n```dart\nCnpjField(\n  strip: true, // remove non-digit characters when submitted/saved/changed.\n  blank: 'Please enter the CPF', // the error message if the field is left blank\n  malformed: 'Invalid CPF', // the error message if the CPF is invalid\n  decoration: InputDecoration(labelText: 'Enter a CPF'),\n);\n```\n\n### Core\n\n[Core](https://pub.dev/documentation/formdator/latest/core/core-library.html)\ncomponents.\n\n#### BasicTextField\n\n[BasicTextField](https://pub.dev/documentation/well_formed/latest/core/BasicTextField-class.html)\nis a text form field that can be made required and/or have its input data\ntrimmed.\n\n```dart\nBasicTextField.max(\n  50, // limits the input length to 50 characters\n  trim: true, // trims the entered data when submitted/saved/changed\n  blank: 'Please enter your full name', // the error message if the field is left blank\n  long: 'The name is too long', // the error message if the input is longer than 50 characters\n  decoration: InputDecoration(labelText: 'Enter your full name (up to 50 chars)'),\n);\n```\n\n#### WellFormed\n\n[WellFormed](https://pub.dev/documentation/well_formed/latest/core/WellFormed-class.html)\nis a convenient and well-formed form widget! It builds a\n[Form](https://api.flutter.dev/flutter/widgets/Form-class.html) widget within a\nstructure consisting of a\n[SafeArea](https://api.flutter.dev/flutter/widgets/SafeArea-class.html) and a\n[Column](https://api.flutter.dev/flutter/widgets/Column-class.html).\n\n### Net\n\nInter[net](https://pub.dev/documentation/well_formed/latest/net/net-library.html)\nrelated form fields.\n\n#### EmailField\n\n[EmailField](https://pub.dev/documentation/well_formed/latest/net/EmailField-class.html)\nis a form field optimized for emails. You can limit the length of an email by\nusing the\n[EmailField.len](https://pub.dev/documentation/well_formed/latest/net/EmailField/EmailField.len.html)\nconstructor.\n\n```dart\nEmailField.len(\n  50, // limits the input length to up to 50 characters\n  trim: true, // trims the entered email\n  blank: 'Inform the email', // error message if the field is left blank\n  malformed: 'Invalid email', // error message if the email is malformed\n  long: 'The email is too long', // error message for long emails\n  decoration: InputDecoration(\n    labelText: 'Enter an email with up to 50 characters',\n  ),\n),\n```\n\n### Numeric\n\n[Numeric](https://pub.dev/documentation/formdator/latest/numeric/numeric-library.html):\nform fields related to numbers or digits. A few examples of numeric entries are:\n- a three-digit code\n- a six-digit password\n- a hexadecimal value\n- the Minimum Order Quantity of a product\n\n#### DigitField\n\n[DigitField](https://pub.dev/documentation/well_formed/latest/numeric/DigitField-class.html)\nis a digit-only form field. It is the ideal form field for verification codes,\nPIN numbers, etc. Examples of valid entries are: _0123_, _1111_, _090909_.\n\n```dart\nDigitField(\n  blank: 'Please enter the verification code', // the error message if the field is left blank\n  malformed:'non-digit character(s)' // the error message for malformed data.\n  decoration: InputDecoration(labelText: 'Verification code'),\n);\n```\n\nYou can constrain the range of allowed input values in various ways through the\nfollowing named constructors:\n\n- [DigitField.len](https://pub.dev/documentation/well_formed/latest/numeric/DigitField/DigitField.len.html)\n  for a fixed number of digits.\n- [DigitField.min](https://pub.dev/documentation/well_formed/latest/numeric/DigitField/DigitField.max.html)\n  for a minimum number of digits.\n- [DigitField.max](https://pub.dev/documentation/well_formed/latest/numeric/DigitField/DigitField.max.html)\n  for a maximum number of digits.\n- [DigitField.range](https://pub.dev/documentation/well_formed/latest/numeric/DigitField/DigitField.range.html)\n  for a range.\n\n#### HexField\n\n[HexField](https://pub.dev/documentation/well_formed/latest/numeric/HexField-class.html)\nis a hexadecimal form field. It accepts the digits _0123456789_ and the letters\n_AaBbCcDdEeFf_. Example of valid entries: _123_, _45fe_, _CafeBabe_.\n\n```dart\nHexField(\n  blank: 'Please enter the device hex number', // the error message if the field is left blank\n  malformed:'non-hex character(s)' // the error message for malformed data.\n  decoration: InputDecoration(labelText: 'Enter a device hex number'),\n);\n```\n\nYou can constrain the range of allowed input values in various ways through the\nfollowing named constructors:\n\n- [HexField.len](https://pub.dev/documentation/well_formed/latest/numeric/HexField/HexField.len.html)\n  for a fixed number of hex digits.\n- [HexField.min](https://pub.dev/documentation/well_formed/latest/numeric/HexField/HexField.min.html)\n  for a minimum number of hex digits.\n- [HexField.max](https://pub.dev/documentation/well_formed/latest/numeric/HexField/HexField.max.html)\n  for a maximum number of hex digits.\n- [HexField.range](https://pub.dev/documentation/well_formed/latest/numeric/HexField/HexField.max.html)\n  for a range.\n\n#### IntField\n\n[IntField](https://pub.dev/documentation/well_formed/latest/numeric/IntField-class.html)\nis the form field for integers. It is the ideal form field for entering the\nquantity of an item, the number of children, age, etc.\n\n```dart\nIntField(\n  blank: 'Please enter the number of items to purchase', // the error message if the field is left blank\n  malformed:'non-digit character(s)' // the error message for malformed data.\n  decoration: InputDecoration(labelText: 'Number of items'),\n);\n```\n\nYou can constrain the range of allowed input values in various ways through the\nfollowing named constructors:\n\n- [IntField.pos](https://pub.dev/documentation/well_formed/latest/numeric/IntField/IntField.pos.html)\n  for positive integers.\n- [IntField.neg](https://pub.dev/documentation/well_formed/latest/numeric/IntField/IntField.neg.html)\n  for negative integers.\n- [IntField.min](https://pub.dev/documentation/well_formed/latest/numeric/IntField/IntField.min.html)\n  for values greater than or equal to a minimum integer value\n- [IntField.max](https://pub.dev/documentation/well_formed/latest/numeric/IntField/IntField.max.html)\n  for values less than or equal to a maximum integer value.\n- [IntField.range](https://pub.dev/documentation/well_formed/latest/numeric/IntField/IntField.range.html)\n  for a range of integer values.\n\n#### NumField\n\n[NumField](https://pub.dev/documentation/well_formed/latest/numeric/NumField-class.html)\nis the floating-point form field. It is the ideal form field for displaying the\ntotal price of a shopping cart, getting an auction bid, etc.\n\n```dart\nNumField(\n  blank: 'Please enter your bid amount', // the error message if the field is left blank\n  malformed:'non-numeric character(s)' // the error message for malformed data.\n  decoration: InputDecoration(labelText: 'Enter your bid'),\n);\n```\n\nYou can constrain the range of allowed input values in various ways through the\nfollowing named constructors:\n\n- [NumField.pos](https://pub.dev/documentation/well_formed/latest/numeric/NumField/NumField.pos.html)\n  for positive numbers.\n- [NumField.neg](https://pub.dev/documentation/well_formed/latest/numeric/NumField/NumField.neg.html)\n  for negative numbers.\n- [NumField.min](https://pub.dev/documentation/well_formed/latest/numeric/NumField/NumField.min.html)\n  for values greater than or equal to a minimum numbers\n- [NumField.max](https://pub.dev/documentation/well_formed/latest/numeric/NumField/NumField.max.html)\n  for values less than or equal to a maximum numbers.\n- [NumField.range](https://pub.dev/documentation/well_formed/latest/numeric/NumField/NumField.range.html)\n  for a range.\n\n## Demo application\n\nThe demo application provides a fully working example, focused on demonstrating\nexactly five widgets in action — _WellFormed_, _DigitField_, _IntField_,\n_EmailField_, and _CpfField_. You can take the code in this demo and experiment\nwith it.\n\nTo run the demo application:\n\n```shell\ngit clone https://github.com/dartoos-dev/well_formed.git\ncd well_formed/example/\nflutter run -d chrome\n```\n\nThis should launch the demo application on Chrome in debug mode.\n\n![well_formed_demo_app](https://user-images.githubusercontent.com/24878574/129643495-1bbec3f3-bfc0-4940-9428-fb20c015a2ea.png)\n\n### Blank Field Error Messages\n\n![blank-fields](https://user-images.githubusercontent.com/24878574/129643680-111256a0-87a6-4018-a267-3f6525694801.png)\n\n### Invalid Inputs\n\n![invalid-inputs](https://user-images.githubusercontent.com/24878574/129644049-9a344cd2-101b-43f8-8878-302ac61e6973.png)\n\n### Fields With Proper Values\n\n![valid-inputs](https://user-images.githubusercontent.com/24878574/129644261-da1d2621-7f85-4835-8f6d-bf55ae3fd8f6.png)\n\n## Left Out Properties\n\nRegarding compatibility with the\n[TextFormField](https://api.flutter.dev/flutter/material/TextFormField-class.html)\nclass, some properties were left out for one of two reasons:\n\n- the property has been deprecated by the Flutter development team. This is the\n  case of the `autovalidate` and `maxLengthEnforced` properties.\n- the property has been considered too superfluous — it has little use in\n  the context of form fields. This is the case for the following properties:\n\n```Dart\nBrightness? keyboardAppearance,\nColor? cursorColor,\nFocusNode? focusNode,\nGestureTapCallback? onTap,\nInputCounterWidgetBuilder? buildCounter,\nIterable\u003cString\u003e? autofillHints,\nMaxLengthEnforcement? maxLengthEnforcement,\nRadius? cursorRadius,\nScrollController? scrollController,\nScrollPhysics? scrollPhysics,\nSmartDashesType? smartDashesType,\nSmartQuotesType? smartQuotesType,\nStrutStyle? strutStyle,\nTextAlignVertical? textAlignVertical,\nTextCapitalization textCapitalization,\nTextSelectionControls? selectionControls,\nToolbarOptions? toolbarOptions,\nbool autofocus,\nbool enableSuggestions,\nbool expands,\nbool? showCursor,\ndouble cursorWidth,\ndouble? cursorHeight,\nint? maxLines,\nint? minLines,\n```\n\n## Contribute\n\nContributors are welcome!\n\n1. Open an issue regarding an improvement, a bug you noticed, or ask to be\n   assigned to an existing one.\n2. If the issue is confirmed, fork the repository, do the changes on a separate\n   branch and make a _Pull Request_.\n3. After review and acceptance, the _Pull Request_ is merged and closed.\n\nMake sure the command below **passes** before making a Pull Request.\n\n```shell\n  flutter analyze \u0026\u0026 flutter test\n```\n\n## References\n\n- [TextFormField](https://api.flutter.dev/flutter/material/TextFormField-class.html)\n- [Build a Flutter form](https://flutter.dev/docs/cookbook/forms/validation)\n- [Mozilla input types](https://developer.mozilla.org/en-US/docs/Learn/Forms/HTML5_input_types)\n- [HTML Input Types](https://www.scaler.com/topics/html/html-forms/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdartoos-dev%2Fwell_formed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdartoos-dev%2Fwell_formed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdartoos-dev%2Fwell_formed/lists"}