{"id":15462944,"url":"https://github.com/idiocc/form-data","last_synced_at":"2026-04-26T08:38:31.669Z","repository":{"id":57128734,"uuid":"194789493","full_name":"idiocc/form-data","owner":"idiocc","description":"Multipart/Form-Data And File Upload Middleware For Koa Written In ES6 And Optimised With JavaScript Compiler.","archived":false,"fork":false,"pushed_at":"2019-12-28T19:05:13.000Z","size":1771,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-09-27T22:55:18.401Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.idio.cc","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/idiocc.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-07-02T04:42:31.000Z","updated_at":"2019-12-28T19:05:16.000Z","dependencies_parsed_at":"2022-08-31T14:00:20.910Z","dependency_job_id":null,"html_url":"https://github.com/idiocc/form-data","commit_stats":null,"previous_names":["idiocc/multer"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/idiocc/form-data","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiocc%2Fform-data","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiocc%2Fform-data/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiocc%2Fform-data/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiocc%2Fform-data/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/idiocc","download_url":"https://codeload.github.com/idiocc/form-data/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiocc%2Fform-data/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32291333,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T08:29:33.829Z","status":"ssl_error","status_checked_at":"2026-04-26T08:29:18.366Z","response_time":129,"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":[],"created_at":"2024-10-02T00:06:14.066Z","updated_at":"2026-04-26T08:38:31.655Z","avatar_url":"https://github.com/idiocc.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# @multipart/form-data\n\n[![npm version](https://badge.fury.io/js/%40multipart%2Fform-data.svg)](https://www.npmjs.com/package/@multipart/form-data)\n\n`@multipart/form-data` is Multipart/Form-Data And File Upload Middleware For Koa Written In ES6 And Optimised With [JavaScript Compiler](https://compiler.page).\n\nOriginally, this was a [Multer](https://github.com/expressjs/multer) fork, however it was rewritten specifically for Koa2, and the interfaces were updated to be async rather than callbacks. Differences:\n\n - When the file size limit is reached, the next middleware is called, rather than waiting to drain the request stream. This can result in the client-side **EPIPE** (connection reset) errors when sending files larger than allowed. But ideally, _Node.JS_ applications should be run behind a proxy such as NginX to limit the upload size.\n - Removes the unnecessary `typeis` dependency that includes the `mime-type` database, just checks the _Content-Type_ to start with `multipart/form-data`.\n - Compiled with _Google Closure Compiler_ and has just 1 dependency ([`text-decoding`](https://github.com/idiocc/text-decoding)) to decode non-utf8 fields (e.g., when a form submitted had the [`accept-charset`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#Attributes) attribute).\n\n```sh\nyarn add @multipart/form-data\n```\n\n## Table Of Contents\n\n- [Table Of Contents](#table-of-contents)\n- [API](#api)\n- [`class FormData`](#class-formdata)\n  * [`FormData`](#type-formdata)\n  * [`FormDataConfig`](#type-formdataconfig)\n  * [\u003ccode\u003esingle(fieldname)\u003c/code\u003e](#singlefieldname)\n  * [\u003ccode\u003earray(fieldname, maxCount)\u003c/code\u003e](#arrayfieldname-maxcount)\n  * [\u003ccode\u003efields(Array\u0026lt;FormDataField\u0026gt;)\u003c/code\u003e](#fieldsarrayltformdatafieldgt)\n    * [`FormDataField`](#type-formdatafield)\n  * [\u003ccode\u003enone()\u003c/code\u003e](#none)\n  * [\u003ccode\u003eany()\u003c/code\u003e](#any)\n- [`FormDataFile`](#formdatafile)\n- [Copyright \u0026 License](#copyright--license)\n\n\u003cp align=\"center\"\u003e\u003ca href=\"#table-of-contents\"\u003e\n  \u003cimg src=\"/.documentary/section-breaks/0.svg?sanitize=true\"\u003e\n\u003c/a\u003e\u003c/p\u003e\n\n## API\n\nThe package is available by importing its default and named functions:\n\n```js\nimport FormData, {\n  diskStorage, memoryStorage, FormDataError,\n} from '@multipart/form-data'\n```\n\n\u003cp align=\"center\"\u003e\u003ca href=\"#table-of-contents\"\u003e\n  \u003cimg src=\"/.documentary/section-breaks/1.svg?sanitize=true\"\u003e\n\u003c/a\u003e\u003c/p\u003e\n\n## `class FormData`\n\nThis class is used to create middleware according to the required file upload strategy.\n\n__\u003ca name=\"type-formdata\"\u003e`FormData`\u003c/a\u003e__: An instance to create middleware.\n\u003ctable\u003e\n \u003cthead\u003e\u003ctr\u003e\n  \u003cth\u003eName\u003c/th\u003e\n  \u003cth\u003eType \u0026amp; Description\u003c/th\u003e\n \u003c/tr\u003e\u003c/thead\u003e\n \u003ctr\u003e\n  \u003ctd rowSpan=\"3\" align=\"center\"\u003e\u003cins\u003econstructor\u003c/ins\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003cem\u003enew (options?: \u003ca href=\"#type-formdataconfig\" title=\"The configuration for the instance.\"\u003e!FormDataConfig\u003c/a\u003e) =\u003e \u003ca href=\"#type-formdata\" title=\"An instance to create middleware.\"\u003eFormData\u003c/a\u003e\u003c/em\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\n   Creates a new form-data instance.\n  \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd rowSpan=\"3\" align=\"center\"\u003e\u003cins\u003esingle\u003c/ins\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003cem\u003e(name: string) =\u003e \u003ca href=\"#type-_goamiddleware\"\u003e!_goa.Middleware\u003c/a\u003e\u003c/em\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\n   Accept a single file.\n  \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd rowSpan=\"3\" align=\"center\"\u003e\u003cins\u003earray\u003c/ins\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003cem\u003e(name: string, maxFiles: string) =\u003e \u003ca href=\"#type-_goamiddleware\"\u003e!_goa.Middleware\u003c/a\u003e\u003c/em\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\n   Accept multiple files.\n  \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd rowSpan=\"3\" align=\"center\"\u003e\u003cins\u003efields\u003c/ins\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003cem\u003e(fields: !Array\u0026lt;\u003ca href=\"#type-formdatafield\" title=\"The item to use in the `.fields` method.\"\u003eFormDataField\u003c/a\u003e\u0026gt;) =\u003e \u003ca href=\"#type-_goamiddleware\"\u003e!_goa.Middleware\u003c/a\u003e\u003c/em\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\n   Accept files according to the configured fields.\n  \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd rowSpan=\"3\" align=\"center\"\u003e\u003cins\u003enone\u003c/ins\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003cem\u003e() =\u003e \u003ca href=\"#type-_goamiddleware\"\u003e!_goa.Middleware\u003c/a\u003e\u003c/em\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\n   Do not accept files, only fields.\n  \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd rowSpan=\"3\" align=\"center\"\u003e\u003cins\u003eany\u003c/ins\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003cem\u003e() =\u003e \u003ca href=\"#type-_goamiddleware\"\u003e!_goa.Middleware\u003c/a\u003e\u003c/em\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\n   Accept any fields and files.\n  \u003c/td\u003e\n \u003c/tr\u003e\n\u003c/table\u003e\n\nCreates a new instance according to the config. It is later used to access the middleware functions described below.\n\n\n__\u003ca name=\"type-formdataconfig\"\u003e`FormDataConfig`\u003c/a\u003e__: The configuration for the instance.\n\n\n|     Name     |                                                                 Type                                                                 |                                                                      Description                                                                      | Default |\n| ------------ | ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |\n| dest         | \u003cem\u003estring\u003c/em\u003e                                                                                                                      | The directory where to store the files using the `DiskStorage`. If not specified, files will be saved in the system's temp directory (`os.tmpdir()`). | -       |\n| storage      | \u003cem\u003eFormDataStorageEngine\u003c/em\u003e                                                                                                       | An _instance_ of a custom storage engine.                                                                                                             | -       |\n| fileFilter   | \u003cem\u003eFormDataFileFilter\u003c/em\u003e                                                                                                          | The file filter.                                                                                                                                      | -       |\n| limits       | \u003cem\u003e\u003ca href=\"https://github.com/idiocc/busboy#type-busboylimits\" title=\"Various limits on incoming data.\"\u003e_goa.BusBoyLimits\u003c/a\u003e\u003c/em\u003e | The limits of the uploaded data.                                                                                                                      | -       |\n| preservePath | \u003cem\u003eboolean\u003c/em\u003e                                                                                                                     | Whether to keep the full path of files instead of just the base name.                                                                                 | `false` |\n\n\u003ctable\u003e\n\u003ctr\u003e\u003ctd colspan=\"2\"\u003e\u003ch3\u003e\u003ca name=\"singlefieldname\"\u003e\u003ccode\u003esingle(fieldname)\u003c/code\u003e\u003c/a\u003e: Accept a single file.\u003c/h3\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\n\n```js\nimport Multipart from '@multipart/form-data'\nimport Goa from '@goa/koa'\n\nconst app = new Goa()\nconst multipart = new Multipart({\n  dest: 'temp',\n})\nconst middleware = multipart.single('file')\napp.use(middleware)\napp.use((ctx) =\u003e {\n  console.log('Fields: %O', ctx.req.body)\n  delete ctx.req.file.stream\n  console.log('File: %O', ctx.req.file)\n})\n```\n\u003c/td\u003e\n\u003ctd\u003e\n\n```js\nFields: { hello: 'world', name: 'multipart' }\nFile: { fieldname: 'file',\n  originalname: 'test.txt',\n  encoding: '7bit',\n  mimetype: 'application/octet-stream',\n  destination: 'temp',\n  filename: 'afb49cada5f721d7fa8337f072d03ec5',\n  path: 'temp/afb49cada5f721d7fa8337f072d03ec5',\n  size: 12 }\n```\n\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd colspan=\"2\"\u003e\u003ch3\u003e\u003ca name=\"arrayfieldname-maxcount\"\u003e\u003ccode\u003earray(fieldname, maxCount)\u003c/code\u003e\u003c/a\u003e: Accept multiple files under the same field name.\u003c/h3\u003e\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003e\n\n```js\nimport Multipart from '@multipart/form-data'\nimport Goa from '@goa/koa'\n\nconst app = new Goa()\nconst multipart = new Multipart({\n  dest: 'temp',\n  preservePath: true,\n})\nconst middleware = multipart.array('file', 2)\napp.use(middleware)\napp.use((ctx) =\u003e {\n  log('Fields', ctx.req.body)\n  log('Files', ctx.req.files)\n})\n```\n\u003c/td\u003e\n\u003ctd\u003e\n\n```js\nFields: { hello: 'world', name: 'multipart' }\nFiles: [ { fieldname: 'file',\n    originalname: 'test/fixture/test.txt',\n    encoding: '7bit',\n    mimetype: 'application/octet-stream',\n    destination: 'temp',\n    filename: '0fa202db40',\n    path: 'temp/0fa202db40',\n    size: 12 },\n  { fieldname: 'file',\n    originalname: 'test/fixture/test.txt',\n    encoding: '7bit',\n    mimetype: 'application/octet-stream',\n    destination: 'temp',\n    filename: '149e4b08d6',\n    path: 'temp/149e4b08d6',\n    size: 12 } ]\n```\n\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd colspan=\"2\"\u003e\n\u003ch3\u003e\u003ca name=\"fieldsarrayltformdatafieldgt\"\u003e\u003ccode\u003efields(Array\u0026lt;FormDataField\u0026gt;)\u003c/code\u003e\u003c/a\u003e: Accept files according to the configured fields and place them in a hashmap.\u003c/h3\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nClick to show the \u003cem\u003eFormDataField\u003c/em\u003e interface.\n\u003c/summary\u003e\n\n__\u003ca name=\"type-formdatafield\"\u003e`FormDataField`\u003c/a\u003e__: The item to use in the `.fields` method.\n\n|   Name    |      Type       |           Description           |\n| --------- | --------------- | ------------------------------- |\n| __name*__ | \u003cem\u003estring\u003c/em\u003e | The name of the field.          |\n| maxCount  | \u003cem\u003enumber\u003c/em\u003e | The maximum count of the field. |\n\u003c/details\u003e\n\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003e\n\n```js\nimport Multipart from '@multipart/form-data'\nimport Goa from '@goa/koa'\n\nconst app = new Goa()\nconst multipart = new Multipart({\n  dest: 'temp',\n})\nconst middleware = multipart.fields([\n  { name: 'file', maxCount: 2 },\n  { name: 'picture', maxCount: 1 },\n])\napp.use(middleware)\napp.use((ctx) =\u003e {\n  log('Fields', ctx.req.body)\n  log('Files', ctx.req.files)\n})\n```\n\u003c/td\u003e\n\u003ctd\u003e\n\n```js\nFields: { hello: 'world', name: 'multipart' }\nFiles: { file: \n   [ { fieldname: 'file',\n       originalname: 'test.txt',\n       encoding: '7bit',\n       mimetype: 'application/octet-stream',\n       destination: 'temp',\n       filename: '13093f0764',\n       path: 'temp/13093f0764',\n       size: 12 },\n     { fieldname: 'file',\n       originalname: 'test.txt',\n       encoding: '7bit',\n       mimetype: 'application/octet-stream',\n       destination: 'temp',\n       filename: '22e2e6e6f7',\n       path: 'temp/22e2e6e6f7',\n       size: 12 } ],\n  picture: \n   [ { fieldname: 'picture',\n       originalname: 'large.jpg',\n       encoding: '7bit',\n       mimetype: 'application/octet-stream',\n       destination: 'temp',\n       filename: '352a1aea6a',\n       path: 'temp/352a1aea6a',\n       size: 1592548 } ] }\n```\n\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd colspan=\"2\"\u003e\u003ch3\u003e\u003ca name=\"none\"\u003e\u003ccode\u003enone()\u003c/code\u003e\u003c/a\u003e: Do not accept files, only fields.\u003c/h3\u003e\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003e\n\n```js\nimport Multipart from '@multipart/form-data'\nimport Goa from '@goa/koa'\n\nconst app = new Goa()\nconst multipart = new Multipart({\n  dest: 'temp',\n})\nconst middleware = multipart.none()\napp.use(middleware)\napp.use((ctx) =\u003e {\n  log('Fields', ctx.req.body)\n  log('Files', ctx.req.files)\n})\n```\n\u003c/td\u003e\n\u003ctd\u003e\n\n```js\nFields: { hello: 'world', name: 'multipart' }\nFiles: undefined\n```\n\u003c/td\u003e\u003c/tr\u003e\n\n\n\n\u003ctr\u003e\u003ctd colspan=\"2\"\u003e\u003ch3\u003e\u003ca name=\"any\"\u003e\u003ccode\u003eany()\u003c/code\u003e\u003c/a\u003e: Accept all files and fields.\u003c/h3\u003e\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003e\n\n```js\nimport Multipart from '@multipart/form-data'\nimport Goa from '@goa/koa'\n\nconst app = new Goa()\nconst multipart = new Multipart({\n  dest: 'temp',\n})\nconst middleware = multipart.any()\napp.use(middleware)\napp.use((ctx) =\u003e {\n  log('Fields', ctx.req.body)\n  log('Files', ctx.req.files)\n})\n```\n\u003c/td\u003e\n\u003ctd\u003e\n\n```js\nFields: { hello: 'world', name: 'multipart' }\nFiles: [ { fieldname: 'file',\n    originalname: 'test.txt',\n    encoding: '7bit',\n    mimetype: 'application/octet-stream',\n    destination: 'temp',\n    filename: '7218bd891a',\n    path: 'temp/7218bd891a',\n    size: 12 },\n  { fieldname: 'picture',\n    originalname: 'large.jpg',\n    encoding: '7bit',\n    mimetype: 'application/octet-stream',\n    destination: 'temp',\n    filename: 'e7a8050980',\n    path: 'temp/e7a8050980',\n    size: 1592548 } ]\n```\n\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n\u003cp align=\"center\"\u003e\u003ca href=\"#table-of-contents\"\u003e\n  \u003cimg src=\"/.documentary/section-breaks/2.svg?sanitize=true\"\u003e\n\u003c/a\u003e\u003c/p\u003e\n\n## `FormDataFile`\n\n_MultipartFormData_ adds a `body` object and a `file` or `files` object to the request object. The `body` hashmap contains the values of the text fields of the form, the `file` or `files` object contains the files uploaded via the form.\n\n[`import('stream').Readable`](https://nodejs.org/api/stream.html#stream_readable_streams) __\u003ca name=\"type-streamreadable\"\u003e`stream.Readable`\u003c/a\u003e__: A stream that pushes data when it becomes available.\n\n__\u003ca name=\"type-formdatafile\"\u003e`FormDataFile`\u003c/a\u003e__: The information about each file.\n\n|       Name        |                                                           Type                                                           |                                               Description                                                |\n| ----------------- | ------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- |\n| __fieldname*__    | \u003cem\u003estring\u003c/em\u003e                                                                                                          | The field name specified in the form.                                                                    |\n| __originalname*__ | \u003cem\u003estring\u003c/em\u003e                                                                                                          | The name of the file on the user's computer.                                                             |\n| __encoding*__     | \u003cem\u003estring\u003c/em\u003e                                                                                                          | The encoding type of the file.                                                                           |\n| __mimetype*__     | \u003cem\u003estring\u003c/em\u003e                                                                                                          | The mime type of the file.                                                                               |\n| __size*__         | \u003cem\u003enumber\u003c/em\u003e                                                                                                          | The size of the file in bytes.                                                                           |\n| __destination*__  | \u003cem\u003estring\u003c/em\u003e                                                                                                          | The folder to which the file has been saved. Set by _DiskStorage_.                                       |\n| __filename*__     | \u003cem\u003estring\u003c/em\u003e                                                                                                          | The name of the file within the `destination`. Set by _DiskStorage_.                                     |\n| __path*__         | \u003cem\u003estring\u003c/em\u003e                                                                                                          | The full path to the uploaded file. Set by _DiskStorage_.                                                |\n| __buffer*__       | \u003cem\u003eBuffer\u003c/em\u003e                                                                                                          | The `Buffer` of the entire file. Set by _MemoryStorage_.                                                 |\n| __stream*__       | \u003cem\u003e\u003ca href=\"#type-streamreadable\" title=\"A stream that pushes data when it becomes available.\"\u003estream.Readable\u003c/a\u003e\u003c/em\u003e | The _Readable_ stream with the file data. This stream should not be read other than by a storage engine. |\n\n\u003cp align=\"center\"\u003e\u003ca href=\"#table-of-contents\"\u003e\n  \u003cimg src=\"/.documentary/section-breaks/3.svg?sanitize=true\"\u003e\n\u003c/a\u003e\u003c/p\u003e\n\n\n\n## Copyright \u0026 License\n\nGNU Affero General Public License v3.0\n\n[Original work](https://github.com/expressjs/multer) by Multer's contributors under MIT license found in [COPYING](COPYING).\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003e\n      \u003ca href=\"https://artd.eco\"\u003e\n        \u003cimg width=\"100\" src=\"https://raw.githubusercontent.com/wrote/wrote/master/images/artdeco.png\"\n          alt=\"Art Deco\"\u003e\n      \u003c/a\u003e\n    \u003c/th\u003e\n    \u003cth\u003e© \u003ca href=\"https://artd.eco\"\u003eArt Deco\u003c/a\u003e for \u003ca href=\"https://idio.cc\"\u003eIdio\u003c/a\u003e 2019\u003c/th\u003e\n    \u003cth\u003e\n      \u003ca href=\"https://idio.cc\"\u003e\n        \u003cimg src=\"https://avatars3.githubusercontent.com/u/40834161?s=100\" width=\"100\" alt=\"Idio\"\u003e\n      \u003c/a\u003e\n    \u003c/th\u003e\n    \u003cth\u003e\n      \u003ca href=\"https://www.technation.sucks\" title=\"Tech Nation Visa\"\u003e\n        \u003cimg width=\"100\" src=\"https://raw.githubusercontent.com/idiocc/cookies/master/wiki/arch4.jpg\"\n          alt=\"Tech Nation Visa\"\u003e\n      \u003c/a\u003e\n    \u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://www.technation.sucks\"\u003eTech Nation Visa Sucks\u003c/a\u003e\u003c/th\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003cp align=\"center\"\u003e\u003ca href=\"#table-of-contents\"\u003e\n  \u003cimg src=\"/.documentary/section-breaks/-1.svg?sanitize=true\"\u003e\n\u003c/a\u003e\u003c/p\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fidiocc%2Fform-data","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fidiocc%2Fform-data","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fidiocc%2Fform-data/lists"}