{"id":32087650,"url":"https://github.com/dmitriy-nz/nestjs-form-data","last_synced_at":"2025-10-19T15:03:32.893Z","repository":{"id":38018401,"uuid":"359213888","full_name":"dmitriy-nz/nestjs-form-data","owner":"dmitriy-nz","description":"NestJS middleware for handling multipart/form-data, which is primarily used for uploading files.","archived":false,"fork":false,"pushed_at":"2025-02-02T14:11:21.000Z","size":410,"stargazers_count":141,"open_issues_count":13,"forks_count":25,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-10-19T14:57:00.692Z","etag":null,"topics":["form-data","middleware","nestjs","nestjs-","nestjs-form-data","nestjs-middleware","nestjs-mide","nestjs-multipart"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/nestjs-form-data","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/dmitriy-nz.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-18T17:45:50.000Z","updated_at":"2025-10-19T05:16:03.000Z","dependencies_parsed_at":"2024-06-18T14:00:52.675Z","dependency_job_id":"bbacf7b6-efc7-43af-8ed5-495755f6a717","html_url":"https://github.com/dmitriy-nz/nestjs-form-data","commit_stats":{"total_commits":54,"total_committers":7,"mean_commits":7.714285714285714,"dds":"0.20370370370370372","last_synced_commit":"94b6bab9f596383d317e6b3962f592a0b9966c2e"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/dmitriy-nz/nestjs-form-data","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmitriy-nz%2Fnestjs-form-data","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmitriy-nz%2Fnestjs-form-data/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmitriy-nz%2Fnestjs-form-data/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmitriy-nz%2Fnestjs-form-data/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dmitriy-nz","download_url":"https://codeload.github.com/dmitriy-nz/nestjs-form-data/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmitriy-nz%2Fnestjs-form-data/sbom","scorecard":{"id":347908,"data":{"date":"2025-08-11","repo":{"name":"github.com/dmitriy-nz/nestjs-form-data","commit":"d06e07aaa6fe64eb523286033583a9039f9b22eb"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.6,"checks":[{"name":"Code-Review","score":1,"reason":"Found 4/24 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":["Warn: no topLevel permission defined: .github/workflows/npm-publish.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":"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":"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":"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/npm-publish.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/dmitriy-nz/nestjs-form-data/npm-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/dmitriy-nz/nestjs-form-data/npm-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/dmitriy-nz/nestjs-form-data/npm-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/dmitriy-nz/nestjs-form-data/npm-publish.yml/master?enable=pin","Info:   0 out of   4 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":"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":"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: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":"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":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 10 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":"15 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-cj7v-w2c7-cp7c","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-h452-7996-h45h","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-mg2h-6x62-wpwc","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-44fp-w29j-9vj5","Warn: Project is vulnerable to: GHSA-4pg4-qvpc-4q3h","Warn: Project is vulnerable to: GHSA-g5hg-p3ph-g8qg","Warn: Project is vulnerable to: GHSA-fjgf-rc76-4x9p","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw"],"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-18T07:34:44.762Z","repository_id":38018401,"created_at":"2025-08-18T07:34:44.763Z","updated_at":"2025-08-18T07:34:44.763Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279836364,"owners_count":26233665,"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-19T02:00:07.647Z","response_time":64,"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-data","middleware","nestjs","nestjs-","nestjs-form-data","nestjs-middleware","nestjs-mide","nestjs-multipart"],"created_at":"2025-10-19T15:03:29.143Z","updated_at":"2025-10-19T15:03:32.885Z","avatar_url":"https://github.com/dmitriy-nz.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![npm version](https://badge.fury.io/js/nestjs-form-data.svg)](https://badge.fury.io/js/nestjs-form-data)\n[![License](https://img.shields.io/badge/License-MIT-green.svg)](https://img.shields.io/badge/License-MIT-green.svg)\n\n\n\n\n# 💭 Description\nnestjs-form-data is a [NestJS](https://github.com/nestjs/nest) middleware for handling multipart/form-data, which is primarily used for uploading files.\n- Process files and strings, serialize form-data to object\n- Process files in nested objects\n- Integration with [class-validator](https://github.com/typestack/class-validator), validate files with validator decorator\n\nnestjs-form-data serializes the form-data request into an object and places it in the body of the request. \nThe files in the request are transformed into objects.  \n**Standard file storage types:**\n- Memory storage\n- File system storage\n\n[Changelog](CHANGELOG.md)\n\n## ⏳ Installation\n```sh\n# npm\nnpm install nestjs-form-data\n# yarn\nyarn add nestjs-form-data\n```\nThis module has `class-validator` and `class-transformer` as a **required** peed dependencies.  \nRead more about validation pipe in the [official docs page](https://docs.nestjs.com/techniques/validation#using-the-built-in-validationpipe).  \nMake sure that you already have these and enable global validation pipe:\n```sh\n# npm\nnpm install class-validator class-transformer\n# yarn\nyarn add class-validator class-transformer\n```\nRegister a global validation pipe in `main.ts` file inside `bootstrap` function:\n```ts\n//main.ts\napp.useGlobalPipes(\n  new ValidationPipe({\n    transform: true // Transform is recomended configuration for avoind issues with arrays of files transformations\n  })\n);\n```\n\nAdd the module to your application\n```ts\n@Module({\n  imports: [\n    NestjsFormDataModule,\n  ],\n})\nexport class AppModule {\n}\n```\n# 🪄 Usage\nApply `@FormDataRequest()` decorator to your controller method\n```ts\n@Controller()\nexport class NestjsFormDataController {\n\n\n  @Post('load')\n  @FormDataRequest()\n  getHello(@Body() testDto: FormDataTestDto): void {\n    console.log(testDto);\n  }\n}\n```\nIf you are using class-validator describe dto and specify validation rules\n```ts\nexport class FormDataTestDto {\n\n  @IsFile()\n  @MaxFileSize(1e6)\n  @HasMimeType(['image/jpeg', 'image/png'])\n  avatar: MemoryStoredFile;\n  \n}\n```\n## Fastify\n\nNeed to install [@fastify/multipart](https://www.npmjs.com/package/@fastify/multipart).\n\n```ts\n// main.ts\nimport { NestFactory } from '@nestjs/core';\nimport {\n  FastifyAdapter,\n  NestFastifyApplication,\n} from '@nestjs/platform-fastify';\nimport multipart from '@fastify/multipart'\n\nasync function bootstrap() {\n  const app = await NestFactory.create\u003cNestFastifyApplication\u003e(\n    AppModule,\n    new FastifyAdapter()\n  );\n\n  app.register(multipart);\n\n  await app.listen(3000);\n}\n\n```\n\n## Configuration\n### Static configuration \nYou can set the global configuration when connecting the module using the `NestjsFormDataModule.config` method:\n```ts\n@Module({\n  imports: [\n    NestjsFormDataModule.config({ storage: MemoryStoredFile }),\n  ],\n  controllers: [],\n  providers: [],\n})\nexport class AppModule {\n}\n```\n### Async configuration \nQuite often you might want to asynchronously pass your module options instead of passing them beforehand. \nIn such case, use `configAsync()` method, that provides a couple of various ways to deal with async data.\n\n##### 1. Use factory\n```ts\nNestjsFormDataModule.configAsync({\n  useFactory: () =\u003e ({\n    storage: MemoryStoredFile\n  })\n});\n```\nOur factory behaves like every other one (might be async and is able to inject dependencies through inject).\n```ts\nNestjsFormDataModule.configAsync({\n imports: [ConfigModule],\n  useFactory: async (configService: ConfigService)  =\u003e ({\n    storage: MemoryStoredFile,\n    limits: {\n      files: configService.get\u003cnumber\u003e('files'),\n    }\n  }),\n inject: [ConfigService],\n});\n```\n##### 2. Use class\n```ts\nNestjsFormDataModule.configAsync({\n  useClass: MyNestJsFormDataConfigService\n});\n```\nAbove construction will instantiate `MyNestJsFormDataConfigService` inside `NestjsFormDataModule` and will leverage it \nto create options object.\n```ts\nexport class MyNestJsFormDataConfigService implements NestjsFormDataConfigFactory {\n  configAsync(): Promise\u003cFormDataInterceptorConfig\u003e | FormDataInterceptorConfig {\n    return {\n      storage: FileSystemStoredFile,\n      fileSystemStoragePath: '/tmp/nestjs-fd',\n    };\n  }\n}\n```\n##### 3. Use existing\n```ts\nNestjsFormDataModule.configAsync({\n  imports: [MyNestJsFormDataConfigModule],\n  useExisting: MyNestJsFormDataConfigService\n});\n```\nIt works the same as useClass with one critical difference - `NestjsFormDataModule` will lookup imported modules to \nreuse already created `MyNestJsFormDataConfigService`, instead of instantiating it on its own.\n### Method level configuration\nOr pass the config object while using the decorator on the method\n```ts\n@Controller()\nexport class NestjsFormDataController {\n\n\n  @Post('load')\n  @FormDataRequest({storage: MemoryStoredFile})\n  getHello(@Body() testDto: FormDataTestDto): void {\n    console.log(testDto);\n  }\n}\n```\n### Configuration fields\n- `isGlobal` - If you want the module to be available globally. Once you import the module and configure it, it will be available globally\n- `storage` - The type of storage logic for the uploaded file  (Default MemoryStoredFile)\n- `fileSystemStoragePath` - The path to the directory for storing temporary files, used only for `storage: FileSystemStoredFile` (Default: /tmp/nestjs-tmp-storage)  \n- `cleanupAfterSuccessHandle` - If set to true, all processed and uploaded files will be deleted after successful processing by the final method. This means that the `delete` method will be called on all files (StoredFile)\n- `cleanupAfterFailedHandle` - If set to true, all processed and uploaded files will be deleted after unsuccessful processing by the final method. This means that the `delete` method will be called on all files (StoredFile)\n- `limits` - [busboy](https://www.npmjs.com/package/busboy#busboy-methods) limits configuration. Constraints in this declaration are handled at the serialization stage, so using these parameters is preferable for performance.\n## File storage types\n### Memory storage\n`MemoryStoredFile` The file is loaded into RAM, files with this storage type are very fast but not suitable for processing large files.\n### File system storage\n`FileSystemStoredFile` The file is loaded into a temporary directory (see configuration) and is available during the processing of the request. The file is automatically deleted after the request finishes\n### Custom storage types\nYou can define a custom type of file storage, for this, inherit your class from `StoredFile`, see examples in the storage directory\n## Validation\nBy default, several validators are available with which you can check the file  \nNote: If you need to validate an array of files for size or otherwise, use `each: true` property from `ValidationOptions`\n\n### IsFile\nChecks if the value is an uploaded file\n```ts\n@IsFile(validationOptions?: ValidationOptions)\n```\n\n### IsFiles\nChecks an array of files, the same as `@IsFile({ each: true })`  \nFor convenience\n```ts\n@IsFiles(validationOptions?: ValidationOptions)\n```\n\n### MaxFileSize\nMaximum allowed file size\n```ts\n@MaxFileSize(maxSizeBytes: number, validationOptions?: ValidationOptions)\n```\n\n### MinFileSize\nMinimum allowed file size\n```ts\n@MinFileSize(minSizeBytes: number, validationOptions?: ValidationOptions)\n```\n\n### HasMimeType\nCheck the mime type of the file  \nThe library uses two sources to get the mime type for the file:\n- [file-type](https://www.npmjs.com/package/file-type) library gets mime-type: gets the mime-type from the [magic number](https://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files) directly from the binary data, it is a reliable source because it checks the file itself but may not return values for some files\n- content type header from [busboy](https://www.npmjs.com/package/busboy: is a less trusted source because it can be tampered with  \n\n*Priority of receiving mime-type corresponds to the list*\n\nThe default is simple mode, which does not check the data source, but you can pass a second argument to strictly check the mime-type and data source.  \nYou can also get the mime type and data source via the `get mimeTypeWithSource():MetaFieldSource` getter on the `StoredFile`\n\n\n```ts\ntype AllowedMimeTypes = Array\u003cAllowedMimeType\u003e\ntype AllowedMimeType = string | RegExp;\n\n@HasMimeType(allowedMimeTypes: AllowedMimeTypes | AllowedMimeType, strictSource?: MetaSource | ValidationOptions, validationOptions?: ValidationOptions)\n```\n\nYou can also use partial matching, just pass the unimportant parameter as `*`, for example:\n```ts\n@HasMimeType('image/*')\n```\nalso as array:\n```ts\n@HasMimeType(['image/*', 'text/*'])\n```\n\n### HasExtension\nCheck the extension type of the file\nThe library uses two sources to get the extension for the file:\n- [file-type](https://www.npmjs.com/package/file-type) library gets mime-type: gets the extension from the [magic number](https://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files) directly from the binary data, it is a reliable source because it checks the file itself but may not return values for some files\n- value after the last dot in file name: is a less trusted source because it can be tampered with\n\n*Priority of receiving extension corresponds to the list*  \n\nThe default is simple mode, which does not check the data source, but you can pass a second argument to strictly check the extension and data source.  \nYou can also get the extension and data source via the `get extensionWithSource():MetaFieldSource` getter on the `StoredFile`\n\n```ts\n@HasExtension(allowedMimeTypes: string[] | string, strictSource?: MetaSource | ValidationOptions, validationOptions?: ValidationOptions)\n```\n\n## Examples\n### FileSystemStoredFile storage configuration\nController\n```ts\nimport { FileSystemStoredFile, FormDataRequest } from 'nestjs-form-data';\n\n@Controller()\nexport class NestjsFormDataController {\n\n\n  @Post('load')\n  @FormDataRequest({storage: FileSystemStoredFile})\n  getHello(@Body() testDto: FormDataTestDto): void {\n    console.log(testDto);\n  }\n}\n```\nDTO\n```ts\nimport { FileSystemStoredFile, HasMimeType, IsFile, MaxFileSize } from 'nestjs-form-data';\n\n\nexport class FormDataTestDto {\n\n  @IsFile()\n  @MaxFileSize(1e6)\n  @HasMimeType(['image/jpeg', 'image/png'])\n  avatar: FileSystemStoredFile;\n\n}\n```\n\nSend request (via Insomnia)  \n\n![image](https://user-images.githubusercontent.com/51157176/139556439-6b709fe8-8d62-41a2-9997-f9b7a2ff3d30.png)\n\n\n### Validate the array of file\n\nDTO\n\n```ts\nimport { FileSystemStoredFile, HasMimeType, IsFiles, MaxFileSize } from 'nestjs-form-data';\n\nexport class FormDataTestDto {\n\n  @IsFiles()\n  @MaxFileSize(1e6, { each: true })\n  @HasMimeType(['image/jpeg', 'image/png'], { each: true })\n  avatars: FileSystemStoredFile[];\n\n}\n```\nSend request (via Insomnia)  \n\n![image](https://user-images.githubusercontent.com/51157176/139556545-a8a1232d-3f1d-4325-9eff-98c294736d88.png)\n\n## License\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmitriy-nz%2Fnestjs-form-data","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdmitriy-nz%2Fnestjs-form-data","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmitriy-nz%2Fnestjs-form-data/lists"}