-
-
Notifications
You must be signed in to change notification settings - Fork 132
/
GraphQLUpload.mjs
87 lines (82 loc) · 2.66 KB
/
GraphQLUpload.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// @ts-check
import { GraphQLError, GraphQLScalarType } from "graphql";
import Upload from "./Upload.mjs";
/** @typedef {import("./processRequest.mjs").FileUpload} FileUpload */
/**
* A GraphQL scalar `Upload` that can be used in a
* [`GraphQLSchema`](https://graphql.org/graphql-js/type/#graphqlschema). It’s
* value in resolvers is a promise that resolves
* {@link FileUpload file upload details} for processing and storage.
* @example
* A schema built using the function
* [`makeExecutableSchema`](https://www.graphql-tools.com/docs/api/modules/schema_src#makeexecutableschema)
* from [`@graphql-tools/schema`](https://npm.im/@graphql-tools/schema):
*
* ```js
* import { makeExecutableSchema } from "@graphql-tools/schema/makeExecutableSchema";
* import GraphQLUpload from "graphql-upload/GraphQLUpload.mjs";
*
* const schema = makeExecutableSchema({
* typeDefs: `
* scalar Upload
* `,
* resolvers: {
* Upload: GraphQLUpload,
* },
* });
* ```
* @example
* A manually constructed schema with an image upload mutation:
*
* ```js
* import { GraphQLBoolean, GraphQLObjectType, GraphQLSchema } from "graphql";
* import GraphQLUpload from "graphql-upload/GraphQLUpload.mjs";
*
* 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;
* },
* },
* },
* }),
* });
* ```
* @example
* In a [TypeScript](https://typescriptlang.org) module, how to import the type
* for the {@link FileUpload file upload details} that the
* {@linkcode GraphQLUpload} scalar resolver value promise resolves:
*
* ```ts
* import type { FileUpload } from "graphql-upload/processRequest.mjs";
* ```
*/
const GraphQLUpload = 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(node) {
throw new GraphQLError("Upload literal unsupported.", { nodes: node });
},
serialize() {
throw new GraphQLError("Upload serialization unsupported.");
},
});
export default GraphQLUpload;