{"id":28714408,"url":"https://github.com/graphql-compose/graphql-compose-boilerplate-upload","last_synced_at":"2025-06-15T01:07:07.130Z","repository":{"id":66102778,"uuid":"139823402","full_name":"graphql-compose/graphql-compose-boilerplate-upload","owner":"graphql-compose","description":null,"archived":false,"fork":false,"pushed_at":"2018-07-05T09:05:31.000Z","size":53,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-11T13:34:25.175Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/graphql-compose.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-07-05T09:03:44.000Z","updated_at":"2019-04-28T19:33:43.000Z","dependencies_parsed_at":null,"dependency_job_id":"2ac19bc8-a53e-4c00-93a7-f09316453ae4","html_url":"https://github.com/graphql-compose/graphql-compose-boilerplate-upload","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/graphql-compose/graphql-compose-boilerplate-upload","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphql-compose%2Fgraphql-compose-boilerplate-upload","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphql-compose%2Fgraphql-compose-boilerplate-upload/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphql-compose%2Fgraphql-compose-boilerplate-upload/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphql-compose%2Fgraphql-compose-boilerplate-upload/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/graphql-compose","download_url":"https://codeload.github.com/graphql-compose/graphql-compose-boilerplate-upload/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphql-compose%2Fgraphql-compose-boilerplate-upload/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259906124,"owners_count":22929973,"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","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":"2025-06-15T01:07:06.570Z","updated_at":"2025-06-15T01:07:07.099Z","avatar_url":"https://github.com/graphql-compose.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# graphql-compose-boilerplate-upload\n\nAdd support for files upload in your graphql schema. Obtain any number of files in any resolvers at any field depth.\nWill be good if you get acquainted with [graphql-multipart-request-spec](https://github.com/jaydenseric/graphql-multipart-request-spec)\n\nTake a look at [commits](https://github.com/graphql-compose/graphql-compose-boilerplate-upload/commits/master) step by step, it will be easy to follow.\n\n## Demo\n\nMake proper `multipart/form-data` POST request with `operations` and `map` keys. And don't forget to provide files:\n\n**Request via CURL**\n```bash\ncurl localhost:4000/graphql \\\n  -F operations='{ \"query\": \"mutation ($poster: Upload) { createPost(id: 5, poster: $poster) { id } }\", \"variables\": { \"poster\": null } }' \\\n  -F map='{ \"0\": [\"variables.poster\"] }' \\\n  -F 0=@package.json\n```\n\n**Response from GraphQL server**\n```bash\n{\"data\":{\"createPost\":{\"id\":5}}}\n```\n\n**Request via POSTMAN**\n\u003cimg width=\"728\" alt=\"screen shot 2018-07-05 at 14 51 08\" src=\"https://user-images.githubusercontent.com/1946920/42312868-2dfda7dc-8063-11e8-8a93-13f5b170913b.png\"\u003e\n\n**Resolver code**\n```js\ncreatePost: {\n  type: 'Post',\n  args: {\n    id: 'Int!',\n    title: 'String',\n    authorId: 'Int',\n    images: '[Upload]',\n    poster: 'Upload',\n  },\n  resolve: async (_, { id, title, authorId, images, poster }) =\u003e {\n    const newPost = { id, title, authorId };\n\n    // somehow work with files\n    if (poster) {\n      console.log('Argument `poster` is a Promise:')\n      console.log(poster);\n\n      console.log(\"\\nIt's value is and object with FileStream:\");\n      console.log(await poster);\n    }\n\n    // somehow save a new record\n    posts.push(newPost);\n\n    return newPost;\n  },\n},\n```\n\n**Console log on the server side**\n```bash\nArgument `poster` is a Promise:\nPromise {\n  { stream:\n   FileStream {\n     _readableState: [Object],\n     readable: true,\n     domain: null,\n     _events: [Object],\n     _eventsCount: 2,\n     _maxListeners: undefined,\n\n     truncated: false,\n     _read: [Function] },\n  filename: 'package.json',\n  mimetype: 'application/octet-stream',\n  encoding: '7bit' } }\n\nIt's value is and object with FileStream:\n{ stream:\n   FileStream {\n     _readableState:\n      ReadableState {\n        objectMode: false,\n        highWaterMark: 16384,\n        buffer: [Object],\n        length: 1983,\n        pipes: null,\n        pipesCount: 0,\n        flowing: null,\n        ended: true,\n        endEmitted: false,\n        reading: false,\n        sync: false,\n        needReadable: false,\n        emittedReadable: true,\n        readableListening: false,\n        resumeScheduled: false,\n        destroyed: false,\n        defaultEncoding: 'utf8',\n        awaitDrain: 0,\n        readingMore: false,\n        decoder: null,\n        encoding: null },\n     readable: true,\n     domain: null,\n     _events: { end: [Array], limit: [Object] },\n     _eventsCount: 2,\n     _maxListeners: undefined,\n     truncated: false,\n     _read: [Function] },\n  filename: 'package.json',\n  mimetype: 'application/octet-stream',\n  encoding: '7bit' }\n```\n\n## Includes for Files Upload\n- [apollo-upload-server](https://github.com/jaydenseric/apollo-upload-server) for parsing `multipart/form-data` POST requests via [busboy](https://github.com/mscdex/busboy)\n\n## Includes from basic graphql-compose-boilerplate\n\n- Babel (ES6, babel-preset-env)\n- ESLint\n- Flowtype\n- express\n- express-graphql\n- graphql\n- graphql-compose\n- nodemon\n\n## Usage\n\n```bash\ngit clone https://github.com/graphql-compose/graphql-compose-boilerplate-upload\n\ncd graphql-compose-boilerplate\n\n# make it to your own\nrm -rf .git\n\nyarn install\n\n# start server with reloading on file changes\nyarn dev\n\n# OR start server\nyarn start\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraphql-compose%2Fgraphql-compose-boilerplate-upload","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgraphql-compose%2Fgraphql-compose-boilerplate-upload","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraphql-compose%2Fgraphql-compose-boilerplate-upload/lists"}