// One of the JSDoc code examples contains `*/` escaped using `*\/`, see:
// https://github.com/gajus/eslint-plugin-jsdoc/issues/710
/* eslint-disable jsdoc/check-examples */
"use strict";
const { GraphQLScalarType, GraphQLError } = require("graphql");
const Upload = require("./Upload");
/**
* A GraphQL `Upload` scalar that can be used in a
* [`GraphQLSchema`](https://graphql.org/graphql-js/type/#graphqlschema).
* It’s value in resolvers is a promise that resolves
* [file upload details]{@link FileUpload} for processing and storage.
* @kind class
* @name GraphQLUpload
* @example
Ways to `import`.
* ```js
* import { GraphQLUpload } from "graphql-upload";
* ```
*
* ```js
* import GraphQLUpload from "graphql-upload/public/GraphQLUpload.js";
* ```
* @example Ways to `require`.
* ```js
* const { GraphQLUpload } = require("graphql-upload");
* ```
*
* ```js
* const GraphQLUpload = require("graphql-upload/public/GraphQLUpload.js");
* ```
* @example A schema built using [`makeExecutableSchema`](https://www.graphql-tools.com/docs/api/modules/schema#makeexecutableschema) from [`@graphql-tools/schema`](https://npm.im/@graphql-tools/schema).
* ```js
* const { makeExecutableSchema } = require("@graphql-tools/schema");
* const { GraphQLUpload } = require("graphql-upload");
*
* const schema = makeExecutableSchema({
* typeDefs: /* GraphQL *\/ `
* scalar Upload
* `,
* resolvers: {
* Upload: GraphQLUpload,
* },
* });
* ```
* @example A manually constructed schema with an image upload mutation.
* ```js
* const { GraphQLSchema, GraphQLObjectType, GraphQLBoolean } = require("graphql");
* const { GraphQLUpload } = require("graphql-upload");
*
* const schema = new GraphQLSchema({
* mutation: new GraphQLObjectType({
* name: "Mutation",
* fields: {
* uploadImage: {
* description: "Uploads an image.",
* type: GraphQLBoolean,
* args: {
* image: {
* description: "Image file.",
* type: GraphQLUpload,
* },
* },
* async resolve(parent, { image }) {
* const { filename, mimetype, createReadStream } = await image;
* const stream = createReadStream();
* // Promisify the stream and store the file, then…
* return true;
* },
* },
* },
* }),
* });
* ```
*/
module.exports = new GraphQLScalarType({
name: "Upload",
description: "The `Upload` scalar type represents a file upload.",
parseValue(value) {
if (value instanceof Upload) return value.promise;
throw new GraphQLError("Upload value invalid.");
},
parseLiteral(ast) {
throw new GraphQLError("Upload literal unsupported.", ast);
},
serialize() {
throw new GraphQLError("Upload serialization unsupported.");
},
});