Registry / storage / mercurius-upload

mercurius-upload

JSON →
library8.0.0jsnpmunverified

A Fastify plugin for handling GraphQL multipart upload requests in mercurius-based servers. Current stable version is 8.0.0, with regular releases aligned with mercurius. Uses graphql-upload-minimal under the hood. Key differentiators: native integration with Fastify/mercurius, full TypeScript support, and the ability to configure max file size and number via options. Requires graphql as peer dependency (^16.3.0).

npm install mercurius-upload
INSTALL
IMPORT
SIG · MERCURIUS-UPLOAD
M
mercurius-upload
storagejavascriptv8.0.0
harness data pending
Install & Compatibility
Where this runs

No compatibility data collected yet for this library.

Code
Verified usage

Verified import paths — ran on the pinned version, not inferred.

default
import MercuriusGQLUpload from 'mercurius-upload'
const MercuriusGQLUpload = require('mercurius-upload')
Plugin uses default export. CommonJS require works, but TypeScript might need esModuleInterop.
GraphQLUpload
import { GraphQLUpload } from 'graphql-upload-minimal'
import { GraphQLUpload } from 'mercurius-upload'
GraphQLUpload scalar is exported from graphql-upload-minimal package, not from mercurius-upload.
FastifyInstance.register
fastify.register(MercuriusGQLUpload, { maxFileSize: 5 * 1024 * 1024 })
fastify.use(MercuriusGQLUpload)
Must use register() method, not middleware pattern.

Shows how to set up a Fastify+Mercurius server with GraphQL file upload support using mercurius-upload and graphql-upload-minimal.

import Fastify from 'fastify'; import mercurius from 'mercurius'; import MercuriusGQLUpload from 'mercurius-upload'; import { GraphQLUpload } from 'graphql-upload-minimal'; import { writeFile, mkdir } from 'fs/promises'; import { join } from 'path'; import { v4 as uuidv4 } from 'uuid'; const schema = ` scalar Upload type Query { ping: String } type Mutation { uploadFile(file: Upload!): Boolean } `; const resolvers = { Upload: GraphQLUpload, Query: { ping: () => 'pong' }, Mutation: { uploadFile: async (_, { file }) => { const { filename, createReadStream } = await file; const stream = createReadStream(); const uploadDir = join(process.cwd(), 'uploads'); await mkdir(uploadDir, { recursive: true }); const path = join(uploadDir, `${uuidv4()}-${filename}`); await new Promise((resolve, reject) => { const writable = writeFile(path, ''); stream.pipe(writable); stream.on('end', resolve); stream.on('error', reject); }); return true; }, }, }; const app = Fastify(); app.register(MercuriusGQLUpload, { maxFileSize: 10 * 1024 * 1024 }); app.register(mercurius, { schema, resolvers, graphiql: true }); app.listen({ port: 4000 }, () => console.log('Server running on http://localhost:4000'));
Debug
Known issues
breakingv8.0.0 drops support for Fastify v4 and below; only Fastify v5 is supported.
fix
Upgrade to Fastify v5 or pin mercurius-upload to v7.x.
affects: >=8.0.0
breakingv7.0.0 migrated from graphql-upload to graphql-upload-minimal; options and behavior may differ.
fix
Use graphql-upload-minimal types and options; the old graphql-upload package is no longer supported.
affects: >=7.0.0
gotchaResolving the upload promise is awaited before accessing properties like createReadStream.
fix
Use `const stream = (await file).createReadStream()` or destructure after await.
affects: >=1.0.0
deprecatedUsing CommonJS require('mercurius-upload') may cause issues with TypeScript strict mode and ESM projects.
fix
Use ES module imports: import MercuriusGQLUpload from 'mercurius-upload'.
affects: >=5.0.0
gotchaThe GraphQLUpload scalar type must be imported from graphql-upload-minimal, not from mercurius-upload.
fix
Install graphql-upload-minimal and import { GraphQLUpload } from 'graphql-upload-minimal'.
affects: >=7.0.0
Errors
Common errors & fixes
FastifyError: the route 'POST /graphql' already exists
Registering mercurius-upload before mercurius or vice versa incorrectly.
fix
Ensure mercurius-upload is registered before mercurius: fastify.register(MercuriusGQLUpload); fastify.register(mercurius, {...});
TypeError: (intermediate value).createReadStream is not a function
Accessing createReadStream directly on the uploaded file promise without awaiting it.
fix
Use `const { createReadStream } = await file;` or `const stream = (await file).createReadStream();`
Cannot find module 'graphql-upload-minimal'
graphql-upload-minimal is not installed.
fix
Install graphql-upload-minimal: npm install graphql-upload-minimal
Argument of type 'typeof import(...)' is not assignable to parameter of type 'FastifyPluginAsync'
TypeScript issues with default import and module resolution.
fix
Ensure esModuleInterop is enabled in tsconfig.json, or use: import * as MercuriusGQLUpload from 'mercurius-upload'
Upgrade
Version history
8.0.0latest on npm
Audit
Dependencies
graphqlrequiredpeer dependency; required by mercurius and for GraphQL scalar handling
graphql-upload-minimalrequiredruntime dependency providing the upload processing logic
Agent activity
20 hits · last 30 days
node
20
Resources
mercurius-upload — npm install mercurius-upload · libregistry