-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathresolvers.ts
111 lines (94 loc) · 2.37 KB
/
resolvers.ts
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// Copyright 2022-latest the graphqland authors. All rights reserved. MIT license.
// This module is browser compatible.
import {
createHttpError,
GraphQLRequestOptions,
GraphQLRequestParams,
HttpError,
isErr,
isNativeObject,
isObject,
json,
Result,
Status,
unsafe,
} from "./deps.ts";
import { validateRequestParams } from "./validate.ts";
type Raw = {
query?: json;
operationName?: json;
variables?: json;
extensions?: json;
};
export function validate(data: json): Result<
GraphQLRequestParams & GraphQLRequestOptions,
HttpError
> {
const result = validateRequestParams(data);
if (isErr(result)) {
return Result.err(
createHttpError(Status.BadRequest, result.value.message, {
expose: true,
}),
);
}
return result;
}
export function resolvePostParams(text: string): Result<Raw, HttpError> {
const result = unsafe<json, TypeError>(() => JSON.parse(text));
if (isErr(result)) {
return Result.err(
createHttpError(Status.BadRequest, "Invalid JSON format."),
);
}
const data = result.value;
if (!isObject(data) || !isNativeObject(data)) {
return Result.err(
createHttpError(Status.BadRequest, "JSON must be object."),
);
}
const { query, variables = null, operationName = null, extensions = null } =
data;
return Result.ok({
query,
variables,
operationName,
extensions,
});
}
export function resolveGetParams(
url: URL,
): Result<Raw, HttpError> {
const query = url.searchParams.get("query");
const operationName = url.searchParams.get("operationName");
const variables = url.searchParams.has("variables")
? unsafe<json, TypeError>(() =>
JSON.parse(url.searchParams.get("variables")!)
)
: Result.ok(null);
if (isErr(variables)) {
return Result.err(createHttpError(
Status.BadRequest,
`"variables" is invalid JSON format.`,
{ expose: true },
));
}
const extensions = url.searchParams.has("extensions")
? unsafe<json, TypeError>(() =>
JSON.parse(url.searchParams.get("extensions")!)
)
: Result.ok(null);
if (isErr(extensions)) {
return Result.err(createHttpError(
Status.BadRequest,
`"extensions" is invalid JSON format.`,
{ expose: true },
));
}
return Result.ok({
query,
operationName,
variables: variables.value,
extensions: extensions.value,
});
}