@model-ts/graphql 0.0.0-stage → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +1280 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/Assembly.d.ts +24 -0
- package/dist/Assembly.d.ts.map +1 -0
- package/dist/Assembly.js +236 -0
- package/dist/Assembly.js.map +1 -0
- package/dist/Builder.d.ts +27 -0
- package/dist/Builder.d.ts.map +1 -0
- package/dist/Builder.js +40 -0
- package/dist/Builder.js.map +1 -0
- package/dist/Connections.d.ts +41 -0
- package/dist/Connections.d.ts.map +1 -0
- package/dist/Connections.js +243 -0
- package/dist/Connections.js.map +1 -0
- package/dist/Definitions.d.ts +139 -0
- package/dist/Definitions.d.ts.map +1 -0
- package/dist/Definitions.js +117 -0
- package/dist/Definitions.js.map +1 -0
- package/dist/Errors.d.ts +39 -0
- package/dist/Errors.d.ts.map +1 -0
- package/dist/Errors.js +103 -0
- package/dist/Errors.js.map +1 -0
- package/dist/Execution.d.ts +52 -0
- package/dist/Execution.d.ts.map +1 -0
- package/dist/Execution.js +174 -0
- package/dist/Execution.js.map +1 -0
- package/dist/FieldRuntime.d.ts +5 -0
- package/dist/FieldRuntime.d.ts.map +1 -0
- package/dist/FieldRuntime.js +27 -0
- package/dist/FieldRuntime.js.map +1 -0
- package/dist/FieldTypes.d.ts +232 -0
- package/dist/FieldTypes.d.ts.map +1 -0
- package/dist/FieldTypes.js +6 -0
- package/dist/FieldTypes.js.map +1 -0
- package/dist/Fields.d.ts +8 -0
- package/dist/Fields.d.ts.map +1 -0
- package/dist/Fields.js +72 -0
- package/dist/Fields.js.map +1 -0
- package/dist/Formatting.d.ts +25 -0
- package/dist/Formatting.d.ts.map +1 -0
- package/dist/Formatting.js +29 -0
- package/dist/Formatting.js.map +1 -0
- package/dist/GraphQL.d.ts +10 -0
- package/dist/GraphQL.d.ts.map +1 -0
- package/dist/GraphQL.js +5 -0
- package/dist/GraphQL.js.map +1 -0
- package/dist/InputTypes.d.ts +27 -0
- package/dist/InputTypes.d.ts.map +1 -0
- package/dist/InputTypes.js +203 -0
- package/dist/InputTypes.js.map +1 -0
- package/dist/Registry.d.ts +70 -0
- package/dist/Registry.d.ts.map +1 -0
- package/dist/Registry.js +3 -0
- package/dist/Registry.js.map +1 -0
- package/dist/Resolver.d.ts +30 -0
- package/dist/Resolver.d.ts.map +1 -0
- package/dist/Resolver.js +76 -0
- package/dist/Resolver.js.map +1 -0
- package/dist/Results.d.ts +20 -0
- package/dist/Results.d.ts.map +1 -0
- package/dist/Results.js +79 -0
- package/dist/Results.js.map +1 -0
- package/dist/ScalarBoundary.d.ts +9 -0
- package/dist/ScalarBoundary.d.ts.map +1 -0
- package/dist/ScalarBoundary.js +31 -0
- package/dist/ScalarBoundary.js.map +1 -0
- package/dist/Scalars.d.ts +9 -0
- package/dist/Scalars.d.ts.map +1 -0
- package/dist/Scalars.js +104 -0
- package/dist/Scalars.js.map +1 -0
- package/dist/SchemaTypes.d.ts +55 -0
- package/dist/SchemaTypes.d.ts.map +1 -0
- package/dist/SchemaTypes.js +47 -0
- package/dist/SchemaTypes.js.map +1 -0
- package/dist/Subscription.d.ts +6 -0
- package/dist/Subscription.d.ts.map +1 -0
- package/dist/Subscription.js +60 -0
- package/dist/Subscription.js.map +1 -0
- package/dist/Testing.d.ts +52 -0
- package/dist/Testing.d.ts.map +1 -0
- package/dist/Testing.js +74 -0
- package/dist/Testing.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/SubscriptionRule.d.ts +8 -0
- package/dist/internal/SubscriptionRule.d.ts.map +1 -0
- package/dist/internal/SubscriptionRule.js +73 -0
- package/dist/internal/SubscriptionRule.js.map +1 -0
- package/package.json +55 -4
- package/src/Assembly.ts +352 -0
- package/src/Builder.ts +110 -0
- package/src/Connections.ts +374 -0
- package/src/Definitions.ts +465 -0
- package/src/Errors.ts +188 -0
- package/src/Execution.ts +354 -0
- package/src/FieldRuntime.ts +32 -0
- package/src/FieldTypes.ts +667 -0
- package/src/Fields.ts +117 -0
- package/src/Formatting.ts +54 -0
- package/src/GraphQL.ts +50 -0
- package/src/InputTypes.ts +266 -0
- package/src/Registry.ts +157 -0
- package/src/Resolver.ts +176 -0
- package/src/Results.ts +128 -0
- package/src/ScalarBoundary.ts +30 -0
- package/src/Scalars.ts +143 -0
- package/src/SchemaTypes.ts +90 -0
- package/src/Subscription.ts +93 -0
- package/src/Testing.ts +144 -0
- package/src/index.ts +1 -0
- package/src/internal/SubscriptionRule.ts +90 -0
package/dist/Results.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { GraphQLObjectType, GraphQLNonNull, GraphQLUnionType, isOutputType, } from "graphql";
|
|
2
|
+
import { metadata, invalid } from "./SchemaTypes.js";
|
|
3
|
+
export const errorMember = Symbol("GraphQL error member");
|
|
4
|
+
export function errorName(error) {
|
|
5
|
+
const tag = error.fields._tag?.ast;
|
|
6
|
+
if (tag?._tag !== "Literal" || typeof tag.literal !== "string")
|
|
7
|
+
return invalid("Expected a Schema.TaggedError with a literal string _tag");
|
|
8
|
+
return tag.literal;
|
|
9
|
+
}
|
|
10
|
+
export function makeResultTypes(inputs, add, objectType, named) {
|
|
11
|
+
const errorTypes = new Map();
|
|
12
|
+
const errorType = (error) => {
|
|
13
|
+
const existing = errorTypes.get(error);
|
|
14
|
+
if (existing)
|
|
15
|
+
return existing;
|
|
16
|
+
const name = errorName(error);
|
|
17
|
+
const registered = named.get(name);
|
|
18
|
+
if (registered) {
|
|
19
|
+
if (!(registered instanceof GraphQLObjectType))
|
|
20
|
+
return invalid(`Result error ${name} must be an object; register its error boundary as an object`);
|
|
21
|
+
errorTypes.set(error, registered);
|
|
22
|
+
return registered;
|
|
23
|
+
}
|
|
24
|
+
const type = add(new GraphQLObjectType({
|
|
25
|
+
name,
|
|
26
|
+
fields: Object.fromEntries(Object.entries(error.fields)
|
|
27
|
+
.filter(([key]) => key !== "_tag")
|
|
28
|
+
.map(([key, field]) => [
|
|
29
|
+
key,
|
|
30
|
+
(() => {
|
|
31
|
+
const type = inputs.type(field.ast, `${name}.${key}`);
|
|
32
|
+
if (!isOutputType(type))
|
|
33
|
+
return invalid(`Error fields need an output scalar at ${name}.${key}`);
|
|
34
|
+
return { type, ...metadata(field.ast) };
|
|
35
|
+
})(),
|
|
36
|
+
])),
|
|
37
|
+
}));
|
|
38
|
+
errorTypes.set(error, type);
|
|
39
|
+
return type;
|
|
40
|
+
};
|
|
41
|
+
return (ref, errors, coordinate, options = {}, nullable = false) => {
|
|
42
|
+
const success = named.get(ref);
|
|
43
|
+
const successMembers = success instanceof GraphQLUnionType
|
|
44
|
+
? success.getTypes()
|
|
45
|
+
: [objectType(ref, coordinate)];
|
|
46
|
+
const [parent, field = parent] = coordinate.split(".");
|
|
47
|
+
// Mutation results keep the conventional <field>Result name; other parents
|
|
48
|
+
// are prefixed to avoid collisions across roots.
|
|
49
|
+
const prefix = parent === "Mutation" ? "" : parent;
|
|
50
|
+
const name = options.name ??
|
|
51
|
+
`${prefix}${field[0].toUpperCase()}${field.slice(1)}Result`;
|
|
52
|
+
const members = [...successMembers, ...errors.map(errorType)];
|
|
53
|
+
if (new Set(members).size !== members.length)
|
|
54
|
+
invalid(`Duplicate union member: ${name}`);
|
|
55
|
+
const type = add(new GraphQLUnionType({
|
|
56
|
+
name,
|
|
57
|
+
...(options.description === undefined
|
|
58
|
+
? {}
|
|
59
|
+
: { description: options.description }),
|
|
60
|
+
types: members,
|
|
61
|
+
resolveType: (value, context, info, abstractType) => {
|
|
62
|
+
if (typeof value === "object" &&
|
|
63
|
+
value !== null &&
|
|
64
|
+
errorMember in value)
|
|
65
|
+
return Reflect.get(value, errorMember);
|
|
66
|
+
if (success instanceof GraphQLUnionType) {
|
|
67
|
+
if (success.resolveType)
|
|
68
|
+
return success.resolveType(value, context, info, abstractType);
|
|
69
|
+
const tag = Reflect.get(Object(value), "__typename") ??
|
|
70
|
+
Reflect.get(Object(value), "_tag");
|
|
71
|
+
return typeof tag === "string" ? tag : undefined;
|
|
72
|
+
}
|
|
73
|
+
return ref;
|
|
74
|
+
},
|
|
75
|
+
}));
|
|
76
|
+
return nullable ? type : new GraphQLNonNull(type);
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=Results.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Results.js","sourceRoot":"","sources":["../src/Results.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { GraphQLScalarType } from "graphql";
|
|
2
|
+
/** Retain callback provenance even when graphql-js forwards a thrown GraphQLError unchanged. */
|
|
3
|
+
export declare class ScalarInputFailure extends Error {
|
|
4
|
+
readonly original: unknown;
|
|
5
|
+
constructor(original: unknown);
|
|
6
|
+
}
|
|
7
|
+
/** Clone adopted scalars so validation cannot mistake application exceptions for document diagnostics. */
|
|
8
|
+
export declare function guardScalar(type: GraphQLScalarType): GraphQLScalarType;
|
|
9
|
+
//# sourceMappingURL=ScalarBoundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScalarBoundary.d.ts","sourceRoot":"","sources":["../src/ScalarBoundary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAwB,MAAM,SAAS,CAAA;AAEjE,gGAAgG;AAChG,qBAAa,kBAAmB,SAAQ,KAAK;IAC/B,QAAQ,CAAC,QAAQ,EAAE,OAAO;IAAtC,YAAqB,QAAQ,EAAE,OAAO,EAErC;CACF;AAID,0GAA0G;AAC1G,wBAAgB,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,CAiBtE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { GraphQLScalarType, specifiedScalarTypes } from "graphql";
|
|
2
|
+
/** Retain callback provenance even when graphql-js forwards a thrown GraphQLError unchanged. */
|
|
3
|
+
export class ScalarInputFailure extends Error {
|
|
4
|
+
original;
|
|
5
|
+
constructor(original) {
|
|
6
|
+
super("Scalar input failed");
|
|
7
|
+
this.original = original;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const guarded = new WeakSet();
|
|
11
|
+
/** Clone adopted scalars so validation cannot mistake application exceptions for document diagnostics. */
|
|
12
|
+
export function guardScalar(type) {
|
|
13
|
+
if (specifiedScalarTypes.includes(type) || guarded.has(type))
|
|
14
|
+
return type;
|
|
15
|
+
const input = (evaluate) => {
|
|
16
|
+
try {
|
|
17
|
+
return evaluate();
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
throw new ScalarInputFailure(error);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const result = new GraphQLScalarType({
|
|
24
|
+
...type.toConfig(),
|
|
25
|
+
parseValue: (value) => input(() => type.parseValue(value)),
|
|
26
|
+
parseLiteral: (node, variables) => input(() => type.parseLiteral(node, variables)),
|
|
27
|
+
});
|
|
28
|
+
guarded.add(result);
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=ScalarBoundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScalarBoundary.js","sourceRoot":"","sources":["../src/ScalarBoundary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEjE,gGAAgG;AAChG,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACtB,QAAQ;IAA7B,YAAqB,QAAiB;QACpC,KAAK,CAAC,qBAAqB,CAAC,CAAA;wBADT,QAAQ;IAE7B,CAAC;CACF;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAqB,CAAA;AAEhD,0GAA0G;AAC1G,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,IAAI,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IACzE,MAAM,KAAK,GAAG,CAAI,QAAiB,EAAK,EAAE;QACxC,IAAI,CAAC;YACH,OAAO,QAAQ,EAAE,CAAA;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAA;QACrC,CAAC;IACH,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC;QACnC,GAAG,IAAI,CAAC,QAAQ,EAAE;QAClB,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC1D,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAChC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;KAClD,CAAC,CAAA;IACF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACnB,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { GraphQLScalarType, GraphQLEnumType } from "graphql";
|
|
3
|
+
export declare const date: (value: unknown) => Date;
|
|
4
|
+
export declare const dateTime: () => GraphQLScalarType<unknown, unknown>;
|
|
5
|
+
export declare function scalar<A, I>(name: string, codec: Schema.Codec<A, I>): GraphQLScalarType;
|
|
6
|
+
/** Like graphql-type-json, variables and outputs are deliberately unrestricted JS values. */
|
|
7
|
+
export declare const jsonScalar: () => GraphQLScalarType<unknown, unknown>;
|
|
8
|
+
export declare function enumeration(name: string, schema: Schema.Schema<string>): GraphQLEnumType;
|
|
9
|
+
//# sourceMappingURL=Scalars.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Scalars.d.ts","sourceRoot":"","sources":["../src/Scalars.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EACL,iBAAiB,EACjB,eAAe,EAIhB,MAAM,SAAS,CAAA;AAKhB,eAAO,MAAM,IAAI,UAAW,OAAO,SAOlC,CAAA;AAcD,eAAO,MAAM,QAAQ,2CAelB,CAAA;AAEH,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EACzB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GACxB,iBAAiB,CAkCnB;AAyBD,6FAA6F;AAC7F,eAAO,MAAM,UAAU,2CAUpB,CAAA;AAEH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAC5B,eAAe,CAcjB"}
|
package/dist/Scalars.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { GraphQLScalarType, GraphQLEnumType, valueFromASTUntyped, Kind, } from "graphql";
|
|
3
|
+
import { fieldError } from "./Errors.js";
|
|
4
|
+
import { guardScalar } from "./ScalarBoundary.js";
|
|
5
|
+
import { invalid, metadata, annotations } from "./SchemaTypes.js";
|
|
6
|
+
export const date = (value) => {
|
|
7
|
+
if (typeof value !== "string")
|
|
8
|
+
return invalid("DateTime expects an ISO string");
|
|
9
|
+
const result = new Date(value);
|
|
10
|
+
return Number.isFinite(result.getTime())
|
|
11
|
+
? result
|
|
12
|
+
: invalid("Invalid DateTime");
|
|
13
|
+
};
|
|
14
|
+
const invalidInput = (message) => {
|
|
15
|
+
throw fieldError(message, { code: "BAD_USER_INPUT" });
|
|
16
|
+
};
|
|
17
|
+
const dateInput = (value) => {
|
|
18
|
+
try {
|
|
19
|
+
return date(value).toISOString();
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return invalidInput("DateTime expects a valid ISO string");
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
export const dateTime = () => guardScalar(new GraphQLScalarType({
|
|
26
|
+
name: "DateTime",
|
|
27
|
+
description: "A valid DateTime value",
|
|
28
|
+
serialize: (value) => value instanceof Date && Number.isFinite(value.getTime())
|
|
29
|
+
? value.toISOString()
|
|
30
|
+
: date(value).toISOString(),
|
|
31
|
+
parseValue: dateInput,
|
|
32
|
+
parseLiteral: (node) => node.kind === Kind.STRING
|
|
33
|
+
? dateInput(node.value)
|
|
34
|
+
: invalidInput("DateTime expects a string literal"),
|
|
35
|
+
}));
|
|
36
|
+
export function scalar(name, codec) {
|
|
37
|
+
const decode = Schema.decodeUnknownSync(codec);
|
|
38
|
+
const encode = Schema.encodeUnknownSync(codec);
|
|
39
|
+
const decodeInput = (value) => {
|
|
40
|
+
try {
|
|
41
|
+
return decode(value);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (Schema.isSchemaError(error))
|
|
45
|
+
return invalidInput(`Invalid value for ${name}`);
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
return guardScalar(new GraphQLScalarType({
|
|
50
|
+
name,
|
|
51
|
+
...metadata(codec.ast),
|
|
52
|
+
specifiedByURL: annotations(codec.ast).specifiedByURL,
|
|
53
|
+
serialize: encode,
|
|
54
|
+
// Keep the encoded representation until the argument Struct converts it for the resolver.
|
|
55
|
+
parseValue: (value) => {
|
|
56
|
+
decodeInput(value);
|
|
57
|
+
return value;
|
|
58
|
+
},
|
|
59
|
+
parseLiteral: (node, variables) => {
|
|
60
|
+
if (node.kind === Kind.ENUM)
|
|
61
|
+
return invalidInput(`${name} cannot represent an enum literal; quote the value as a string`);
|
|
62
|
+
const value = valueFromASTUntyped(node, variables);
|
|
63
|
+
decodeInput(value);
|
|
64
|
+
return value;
|
|
65
|
+
},
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
function jsonLiteral(node, variables) {
|
|
69
|
+
switch (node.kind) {
|
|
70
|
+
case Kind.ENUM:
|
|
71
|
+
return invalidInput("JSON cannot represent an enum literal; quote the value as a string");
|
|
72
|
+
case Kind.OBJECT:
|
|
73
|
+
return Object.fromEntries(node.fields.map((field) => [
|
|
74
|
+
field.name.value,
|
|
75
|
+
jsonLiteral(field.value, variables),
|
|
76
|
+
]));
|
|
77
|
+
case Kind.LIST:
|
|
78
|
+
return node.values.map((value) => jsonLiteral(value, variables));
|
|
79
|
+
default:
|
|
80
|
+
return valueFromASTUntyped(node, variables);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Like graphql-type-json, variables and outputs are deliberately unrestricted JS values. */
|
|
84
|
+
export const jsonScalar = () => guardScalar(new GraphQLScalarType({
|
|
85
|
+
name: "JSON",
|
|
86
|
+
description: "The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf).",
|
|
87
|
+
serialize: (value) => value,
|
|
88
|
+
parseValue: (value) => value,
|
|
89
|
+
parseLiteral: jsonLiteral,
|
|
90
|
+
}));
|
|
91
|
+
export function enumeration(name, schema) {
|
|
92
|
+
const ast = schema.ast;
|
|
93
|
+
const values = ast._tag === "Union" ? ast.types : [ast];
|
|
94
|
+
return new GraphQLEnumType({
|
|
95
|
+
name,
|
|
96
|
+
...metadata(ast),
|
|
97
|
+
values: Object.fromEntries(values.map((value) => {
|
|
98
|
+
if (value._tag !== "Literal" || typeof value.literal !== "string")
|
|
99
|
+
return invalid(`${name}: enums require string Schema.Literals`);
|
|
100
|
+
return [value.literal, { value: value.literal, ...metadata(value) }];
|
|
101
|
+
})),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=Scalars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Scalars.js","sourceRoot":"","sources":["../src/Scalars.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { SchemaAST } from "effect";
|
|
2
|
+
import { Schema } from "effect";
|
|
3
|
+
import { type GraphQLOutputType, type GraphQLNullableType, type GraphQLInputType } from "graphql";
|
|
4
|
+
declare module "effect/Schema" {
|
|
5
|
+
namespace Annotations {
|
|
6
|
+
interface Annotations {
|
|
7
|
+
readonly specifiedByURL?: string;
|
|
8
|
+
readonly graphqlType?: string;
|
|
9
|
+
readonly graphqlDefault?: unknown;
|
|
10
|
+
readonly deprecationReason?: string;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export declare const ID: Schema.String;
|
|
15
|
+
export declare function id<S extends Schema.Top & Schema.Schema<string>>(schema: S): S["Rebuild"];
|
|
16
|
+
export declare const JSONValue: Schema.Unknown;
|
|
17
|
+
/** DateTime inputs decode to normalized ISO strings. */
|
|
18
|
+
export declare const DateTime: Schema.String;
|
|
19
|
+
export declare function input<S extends Schema.Top>(name: string, schema: S): S["Rebuild"];
|
|
20
|
+
export declare function defaulted<S extends Schema.Top & Schema.Codec<unknown, unknown>>(schema: S, value: NoInfer<S["Type"]>): S["Rebuild"];
|
|
21
|
+
export declare const invalid: (message: string) => never;
|
|
22
|
+
export declare const annotations: (ast: SchemaAST.AST) => {
|
|
23
|
+
[x: string]: unknown;
|
|
24
|
+
expected?: string | undefined;
|
|
25
|
+
title?: string | undefined;
|
|
26
|
+
description?: string | undefined;
|
|
27
|
+
documentation?: string | undefined;
|
|
28
|
+
readOnly?: boolean | undefined;
|
|
29
|
+
writeOnly?: boolean | undefined;
|
|
30
|
+
format?: string | undefined;
|
|
31
|
+
contentEncoding?: string | undefined;
|
|
32
|
+
contentMediaType?: string | undefined;
|
|
33
|
+
contentSchema?: Schema.Json | undefined;
|
|
34
|
+
default?: unknown;
|
|
35
|
+
examples?: readonly unknown[] | undefined;
|
|
36
|
+
messageMissingKey?: string | undefined;
|
|
37
|
+
message?: string | undefined;
|
|
38
|
+
messageUnexpectedKey?: string | undefined;
|
|
39
|
+
identifier?: string | undefined;
|
|
40
|
+
specifiedByURL?: string;
|
|
41
|
+
graphqlType?: string;
|
|
42
|
+
graphqlDefault?: unknown;
|
|
43
|
+
deprecationReason?: string;
|
|
44
|
+
};
|
|
45
|
+
export declare function descriptionOf(ast: SchemaAST.AST): string | undefined;
|
|
46
|
+
export declare function metadata(ast: SchemaAST.AST): {
|
|
47
|
+
description?: string | undefined;
|
|
48
|
+
deprecationReason?: string | undefined;
|
|
49
|
+
};
|
|
50
|
+
export declare function representation(node: {
|
|
51
|
+
readonly annotations?: Schema.Annotations.Annotations | undefined;
|
|
52
|
+
}): unknown;
|
|
53
|
+
export declare function unwrap(type: GraphQLOutputType): GraphQLOutputType & GraphQLNullableType;
|
|
54
|
+
export declare function unwrap(type: GraphQLInputType): GraphQLInputType & GraphQLNullableType;
|
|
55
|
+
//# sourceMappingURL=SchemaTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaTypes.d.ts","sourceRoot":"","sources":["../src/SchemaTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EAEtB,MAAM,SAAS,CAAA;AAEhB,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,WAAW,CAAC;QACpB,UAAU,WAAW;YACnB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;YAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;YAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;YACjC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;SACpC;KACF;CACF;AAED,eAAO,MAAM,EAAE,eAAgD,CAAA;AAE/D,wBAAgB,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAC7D,MAAM,EAAE,CAAC,GACR,CAAC,CAAC,SAAS,CAAC,CAEd;AAED,eAAO,MAAM,SAAS,gBAAmD,CAAA;AAEzE,wDAAwD;AACxD,eAAO,MAAM,QAAQ,eAAsD,CAAA;AAE3E,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EACxC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,GACR,CAAC,CAAC,SAAS,CAAC,CAGd;AAED,wBAAgB,SAAS,CACvB,CAAC,SAAS,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,EACrD,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAGpD;AAED,eAAO,MAAM,OAAO,YAAa,MAAM,KAAG,KAEzC,CAAA;AAED,eAAO,MAAM,WAAW,QAAS,SAAS,CAAC,GAAG;;;;;;;;;;;;;;;;;;qBAxCd,MAAM;kBACT,MAAM;qBACH,OAAO;wBACJ,MAAM;CAwCvC,CAAA;AAEF,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,GAAG,MAAM,GAAG,SAAS,CAOpE;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG;;;EAO1C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,WAAW,GAAG,SAAS,CAAA;CAClE,GAAG,OAAO,CAEV;AAED,wBAAgB,MAAM,CACpB,IAAI,EAAE,iBAAiB,GACtB,iBAAiB,GAAG,mBAAmB,CAAA;AAC1C,wBAAgB,MAAM,CACpB,IAAI,EAAE,gBAAgB,GACrB,gBAAgB,GAAG,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { isNonNullType, } from "graphql";
|
|
3
|
+
export const ID = Schema.String.annotate({ graphqlType: "ID" });
|
|
4
|
+
export function id(schema) {
|
|
5
|
+
return schema.annotate({ graphqlType: "ID" });
|
|
6
|
+
}
|
|
7
|
+
export const JSONValue = Schema.Unknown.annotate({ graphqlType: "JSON" });
|
|
8
|
+
/** DateTime inputs decode to normalized ISO strings. */
|
|
9
|
+
export const DateTime = Schema.String.annotate({ graphqlType: "DateTime" });
|
|
10
|
+
export function input(name, schema) {
|
|
11
|
+
// Schema annotations preserve the codec and its fields (including Schema classes).
|
|
12
|
+
return schema.annotate({ graphqlType: name });
|
|
13
|
+
}
|
|
14
|
+
export function defaulted(schema, value) {
|
|
15
|
+
Schema.decodeUnknownSync(Schema.toType(schema))(value);
|
|
16
|
+
return schema.annotate({ graphqlDefault: value });
|
|
17
|
+
}
|
|
18
|
+
export const invalid = (message) => {
|
|
19
|
+
throw new Error(message);
|
|
20
|
+
};
|
|
21
|
+
export const annotations = (ast) => ({
|
|
22
|
+
...Schema.resolveAnnotations(Schema.make(ast)),
|
|
23
|
+
...ast.context?.annotations,
|
|
24
|
+
});
|
|
25
|
+
export function descriptionOf(ast) {
|
|
26
|
+
const own = annotations(ast).description;
|
|
27
|
+
return typeof own === "string"
|
|
28
|
+
? own
|
|
29
|
+
: ast._tag === "Union"
|
|
30
|
+
? ast.types.map(descriptionOf).find((v) => v !== undefined)
|
|
31
|
+
: undefined;
|
|
32
|
+
}
|
|
33
|
+
export function metadata(ast) {
|
|
34
|
+
const description = descriptionOf(ast);
|
|
35
|
+
const deprecationReason = annotations(ast).deprecationReason;
|
|
36
|
+
return {
|
|
37
|
+
...(description === undefined ? {} : { description }),
|
|
38
|
+
...(deprecationReason === undefined ? {} : { deprecationReason }),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function representation(node) {
|
|
42
|
+
return Reflect.get(Object(node.annotations?.representation), "id");
|
|
43
|
+
}
|
|
44
|
+
export function unwrap(type) {
|
|
45
|
+
return isNonNullType(type) ? type.ofType : type;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=SchemaTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaTypes.js","sourceRoot":"","sources":["../src/SchemaTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ErrorPolicy } from "./Errors.ts";
|
|
2
|
+
import { type RuntimeRef, type Field } from "./FieldTypes.ts";
|
|
3
|
+
import { type AnyConfig } from "./Resolver.ts";
|
|
4
|
+
/** Setup and delivery share the resolver policy; authorization runs on every event. */
|
|
5
|
+
export declare const eventField: (policy: ErrorPolicy, ref: RuntimeRef, options: AnyConfig) => Field<unknown>;
|
|
6
|
+
//# sourceMappingURL=Subscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Subscription.d.ts","sourceRoot":"","sources":["../src/Subscription.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,WAAW,EAKjB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,KAAK,EAAqB,MAAM,iBAAiB,CAAA;AAEhF,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C,uFAAuF;AACvF,eAAO,MAAM,UAAU,WACb,WAAW,OACd,UAAU,WACN,SAAS,KACjB,KAAK,CAAC,OAAO,CA0Ed,CAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Effect, Stream } from "effect";
|
|
2
|
+
import { fieldError, forbidden, protect, recoverCause, } from "./Errors.js";
|
|
3
|
+
import { describe, normalize } from "./FieldRuntime.js";
|
|
4
|
+
import { fieldRequirements } from "./FieldTypes.js";
|
|
5
|
+
import { argumentDecoder, optionalNullMessage } from "./InputTypes.js";
|
|
6
|
+
import {} from "./Resolver.js";
|
|
7
|
+
/** Setup and delivery share the resolver policy; authorization runs on every event. */
|
|
8
|
+
export const eventField = (policy, ref, options) => ({
|
|
9
|
+
kind: "field",
|
|
10
|
+
[fieldRequirements]: undefined,
|
|
11
|
+
build(context, name) {
|
|
12
|
+
const decode = argumentDecoder(options.args ?? {});
|
|
13
|
+
return {
|
|
14
|
+
type: context.output(ref, name),
|
|
15
|
+
...describe(options),
|
|
16
|
+
args: Object.fromEntries(Object.entries(options.args ?? {}).map(([key, schema]) => [
|
|
17
|
+
key,
|
|
18
|
+
context.input.argument(schema, `${name}(${key})`),
|
|
19
|
+
])),
|
|
20
|
+
subscribe(source, raw, request, info) {
|
|
21
|
+
const coordinate = `${info.parentType.name}.${info.fieldName}`;
|
|
22
|
+
return request.stream(Stream.suspend(() => {
|
|
23
|
+
let decoded;
|
|
24
|
+
try {
|
|
25
|
+
decoded = decode(raw);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw fieldError(optionalNullMessage(options.args ?? {}, raw) ??
|
|
29
|
+
"Invalid arguments", { code: "BAD_USER_INPUT" });
|
|
30
|
+
}
|
|
31
|
+
if (!options.subscribe)
|
|
32
|
+
throw new Error("Subscription needs a stream");
|
|
33
|
+
return options.subscribe(source, decoded, request.context);
|
|
34
|
+
}).pipe(Stream.catchCause((cause) => Stream.fromEffect(recoverCause(cause, [], policy, {
|
|
35
|
+
coordinate,
|
|
36
|
+
phase: "subscribe",
|
|
37
|
+
})))));
|
|
38
|
+
},
|
|
39
|
+
resolve(value, raw, request, info) {
|
|
40
|
+
const coordinate = `${info.parentType.name}.${info.fieldName}`;
|
|
41
|
+
return request.run(protect(() => {
|
|
42
|
+
if (value instanceof Error)
|
|
43
|
+
return value;
|
|
44
|
+
const decoded = decode(raw);
|
|
45
|
+
return Effect.gen(function* () {
|
|
46
|
+
const allowed = yield* protect(() => options.authorize
|
|
47
|
+
? options.authorize(value, decoded, request.context)
|
|
48
|
+
: true, [], policy, { coordinate, phase: "authorize" });
|
|
49
|
+
if (allowed instanceof Error)
|
|
50
|
+
return allowed;
|
|
51
|
+
return allowed === true
|
|
52
|
+
? normalize(ref, value)
|
|
53
|
+
: forbidden(info.fieldName);
|
|
54
|
+
});
|
|
55
|
+
}, [], policy, { coordinate, phase: "resolve" }));
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=Subscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Subscription.js","sourceRoot":"","sources":["../src/Subscription.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** Test operations keep their Effect requirements so @effect/vitest can supply any layer. */
|
|
2
|
+
import { Effect, Stream } from "effect";
|
|
3
|
+
import { type BuiltSchema, type ContextArgument, type Request } from "./Execution.ts";
|
|
4
|
+
import { type FormattedExecutionResult as Result } from "./Formatting.ts";
|
|
5
|
+
export { snapshot } from "./Formatting.ts";
|
|
6
|
+
export type { FormattedExecutionResult as Result } from "./Formatting.ts";
|
|
7
|
+
export declare const execute: <R, C>(built: BuiltSchema<R, C>, request: Request, ...context: ContextArgument<NoInfer<C>>) => Effect.Effect<Result, never, R>;
|
|
8
|
+
export declare const subscribe: <R, C>(built: BuiltSchema<R, C>, request: Request, ...context: ContextArgument<NoInfer<C>>) => Stream.Stream<Result, never, R>;
|
|
9
|
+
/**
|
|
10
|
+
* Tags a GraphQL document for editor highlighting and removes ignored
|
|
11
|
+
* characters, so snapshots and error locations do not depend on indentation.
|
|
12
|
+
* String literals are kept verbatim. Like an editor, it reads backslash
|
|
13
|
+
* escapes as GraphQL escapes.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const QUERY = graphql`
|
|
17
|
+
* query List($id: ID!) { list(id: $id) { id name } }
|
|
18
|
+
* `
|
|
19
|
+
*/
|
|
20
|
+
export declare function graphql(strings: TemplateStringsArray, ...values: ReadonlyArray<string | number | boolean>): string;
|
|
21
|
+
export interface RequestOptions {
|
|
22
|
+
readonly variables?: {
|
|
23
|
+
readonly [name: string]: unknown;
|
|
24
|
+
};
|
|
25
|
+
readonly operationName?: string;
|
|
26
|
+
}
|
|
27
|
+
/** Request options are optional unless the context factory requires one. */
|
|
28
|
+
export type RequestArgument<O> = {} extends O ? [options?: O & RequestOptions] : [options: O & RequestOptions];
|
|
29
|
+
export interface ClientOptions<C, O, R> {
|
|
30
|
+
/** Builds each request's context from its options, as a value or an Effect. */
|
|
31
|
+
readonly context: (options: O) => C | Effect.Effect<C, never, R>;
|
|
32
|
+
}
|
|
33
|
+
/** A context factory is required whenever the schema has a request context. */
|
|
34
|
+
export type ClientArgument<C, O, R> = {} extends C ? [options?: ClientOptions<C, O, R>] : [options: ClientOptions<C, O, R>];
|
|
35
|
+
export interface Client<O, R> {
|
|
36
|
+
readonly request: (source: string, ...options: RequestArgument<O>) => Effect.Effect<Result, never, R>;
|
|
37
|
+
readonly subscribe: (source: string, ...options: RequestArgument<O>) => Stream.Stream<Result, never, R>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Binds a schema to a default request context so each test only states what
|
|
41
|
+
* differs, such as the identity.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* export const { request, subscribe } = Testing.client(schema, {
|
|
45
|
+
* context: (options: { identity?: Identity }) => ({
|
|
46
|
+
* requestId: "test",
|
|
47
|
+
* identity: options.identity ?? anonymous,
|
|
48
|
+
* }),
|
|
49
|
+
* })
|
|
50
|
+
*/
|
|
51
|
+
export declare const client: <R, C, O = {}, R2 = never>(built: BuiltSchema<R, C>, ...[options]: ClientArgument<NoInfer<C>, O, R2>) => Client<O, R | R2>;
|
|
52
|
+
//# sourceMappingURL=Testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Testing.d.ts","sourceRoot":"","sources":["../src/Testing.ts"],"names":[],"mappings":"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"}
|
package/dist/Testing.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/** Test operations keep their Effect requirements so @effect/vitest can supply any layer. */
|
|
2
|
+
import { Effect, Stream } from "effect";
|
|
3
|
+
import { GraphQLError, stripIgnoredCharacters } from "graphql";
|
|
4
|
+
import { execute as run, subscribe as events, } from "./Execution.js";
|
|
5
|
+
import { snapshot, } from "./Formatting.js";
|
|
6
|
+
export { snapshot } from "./Formatting.js";
|
|
7
|
+
export const execute = (built, request, ...context) => run(built, request, ...context).pipe(Effect.map(snapshot));
|
|
8
|
+
export const subscribe = (built, request, ...context) => events(built, request, ...context).pipe(Stream.map(snapshot));
|
|
9
|
+
/**
|
|
10
|
+
* Tags a GraphQL document for editor highlighting and removes ignored
|
|
11
|
+
* characters, so snapshots and error locations do not depend on indentation.
|
|
12
|
+
* String literals are kept verbatim. Like an editor, it reads backslash
|
|
13
|
+
* escapes as GraphQL escapes.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const QUERY = graphql`
|
|
17
|
+
* query List($id: ID!) { list(id: $id) { id name } }
|
|
18
|
+
* `
|
|
19
|
+
*/
|
|
20
|
+
export function graphql(strings, ...values) {
|
|
21
|
+
const source = String.raw({ raw: strings.raw }, ...values);
|
|
22
|
+
try {
|
|
23
|
+
return stripIgnoredCharacters(source);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
// Leave invalid documents to execution, which reports a located syntax error.
|
|
27
|
+
if (error instanceof GraphQLError)
|
|
28
|
+
return source;
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// A context is never itself an Effect, so Effect.isEffect separates the two
|
|
33
|
+
// cases exactly; TypeScript cannot exclude an Effect from a generic A.
|
|
34
|
+
const lift = (value) => Effect.isEffect(value)
|
|
35
|
+
? value
|
|
36
|
+
: Effect.succeed(value);
|
|
37
|
+
/**
|
|
38
|
+
* Binds a schema to a default request context so each test only states what
|
|
39
|
+
* differs, such as the identity.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* export const { request, subscribe } = Testing.client(schema, {
|
|
43
|
+
* context: (options: { identity?: Identity }) => ({
|
|
44
|
+
* requestId: "test",
|
|
45
|
+
* identity: options.identity ?? anonymous,
|
|
46
|
+
* }),
|
|
47
|
+
* })
|
|
48
|
+
*/
|
|
49
|
+
export const client = (built, ...[options]) => {
|
|
50
|
+
// RequestArgument and ClientArgument make an argument optional only when
|
|
51
|
+
// `{}` satisfies its type, and both ContextArgument branches accept [C].
|
|
52
|
+
// TypeScript cannot narrow these conditionals for generic O and C.
|
|
53
|
+
const prepare = (source, input) => {
|
|
54
|
+
const request = input ?? {};
|
|
55
|
+
const context = options
|
|
56
|
+
? lift(options.context(request))
|
|
57
|
+
: Effect.succeed({});
|
|
58
|
+
return Effect.map(context, (context) => ({
|
|
59
|
+
request: {
|
|
60
|
+
source,
|
|
61
|
+
...(request.variables ? { variableValues: request.variables } : {}),
|
|
62
|
+
...(request.operationName === undefined
|
|
63
|
+
? {}
|
|
64
|
+
: { operationName: request.operationName }),
|
|
65
|
+
},
|
|
66
|
+
context: [context],
|
|
67
|
+
}));
|
|
68
|
+
};
|
|
69
|
+
return {
|
|
70
|
+
request: (source, ...[input]) => Effect.flatMap(prepare(source, input), ({ request, context }) => execute(built, request, ...context)),
|
|
71
|
+
subscribe: (source, ...[input]) => Stream.unwrap(Effect.map(prepare(source, input), ({ request, context }) => subscribe(built, request, ...context))),
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=Testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Testing.js","sourceRoot":"","sources":["../src/Testing.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ValidationRule } from "graphql";
|
|
2
|
+
/**
|
|
3
|
+
* Replaces graphql-js's SingleFieldSubscriptionsRule, which evaluates root
|
|
4
|
+
* skip/include without variables and throws for a variable condition. Collect
|
|
5
|
+
* root response keys through fragments and reject root conditionals instead.
|
|
6
|
+
*/
|
|
7
|
+
export declare const singleRootFieldSubscriptionsRule: ValidationRule;
|
|
8
|
+
//# sourceMappingURL=SubscriptionRule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriptionRule.d.ts","sourceRoot":"","sources":["../../src/internal/SubscriptionRule.ts"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,cAAc,EACpB,MAAM,SAAS,CAAA;AAEhB;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,EAAE,cAuE7C,CAAA"}
|