joist-graphql-resolver-utils 1.33.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.
@@ -0,0 +1,3 @@
1
+
2
+ # joist-graphql-resolver-utils
3
+
@@ -0,0 +1,6 @@
1
+ import { EntityManager } from "joist-orm";
2
+ export declare type MaybePromise<T> = T | Promise<T>;
3
+ export declare type Resolver<R, A, T> = (root: R, args: A, ctx: any, info: any) => MaybePromise<T>;
4
+ export declare type Context = {
5
+ em: EntityManager;
6
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { AsyncProperty, Collection, Entity, EntityMetadata, IdOf, Reference } from "joist-orm";
2
+ import { Resolver } from "./context";
3
+ declare type GraphQLPrimitive = string | Date | boolean | number | null | undefined;
4
+ /**
5
+ * Maps properties like `Entity.firstName: string` to field resolver functions like `firstName(): Promise<string>`.
6
+ *
7
+ * Note that we don't necessarily know/care if `firstName` is in the `Entity` GraphQL type, we just map
8
+ * every field to a potential resolver, and then will let the `EntityResolvers` type-check effectively
9
+ * do the union of "what's defined on the ORM type vs. what's defined on the GraphQL type".
10
+ */
11
+ export declare type EntityResolver<T extends Entity> = {
12
+ [P in keyof T]: P extends "id" ? Resolver<T, Record<string, any>, IdOf<T>> : T[P] extends GraphQLPrimitive | GraphQLPrimitive[] ? Resolver<T, Record<string, any>, T[P]> : T[P] extends Collection<T, infer U> ? Resolver<T, Record<string, any>, U[]> : T[P] extends Reference<T, infer U, infer N> ? Resolver<T, Record<string, any>, U> : T[P] extends AsyncProperty<T, infer V> ? Resolver<T, Record<string, any>, V> : T[P] extends Promise<infer V> ? Resolver<T, Record<string, any>, V> : T[P] extends () => Promise<infer V> ? Resolver<T, Record<string, any>, V> : T[P] extends () => infer V ? Resolver<T, Record<string, any>, V> : Resolver<T, Record<string, any>, T[P]>;
13
+ };
14
+ /**
15
+ * Creates field resolvers for each of the fields on our entity.
16
+ */
17
+ export declare function entityResolver<T extends Entity, A extends Record<string, keyof T> = Record<string, any>>(entityMetadata: EntityMetadata<T>, aliases?: A): EntityResolver<T> & {
18
+ [K in keyof A]: EntityResolver<T>[A[K]];
19
+ };
20
+ export {};
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.entityResolver = void 0;
4
+ const joist_orm_1 = require("joist-orm");
5
+ /**
6
+ * Creates field resolvers for each of the fields on our entity.
7
+ */
8
+ function entityResolver(entityMetadata, aliases) {
9
+ const idResolver = (entity) => entity.idOrFail;
10
+ const primitiveResolvers = Object.values(entityMetadata.fields)
11
+ .filter((ormField) => !isPrimaryKeyField(ormField) && !isReferenceField(ormField) && !isCollectionField(ormField))
12
+ .map((ormField) => {
13
+ if (ormField.kind === "primitive" && ormField.derived === "async") {
14
+ return [ormField.fieldName, (entity) => entity[ormField.fieldName].get];
15
+ }
16
+ else {
17
+ // Currently, we only support primitives, i.e. strings/numbers/etc. and not collections.
18
+ return [ormField.fieldName, (entity) => entity[ormField.fieldName]];
19
+ }
20
+ });
21
+ const referenceResolvers = Object.values(entityMetadata.fields)
22
+ .filter((ormField) => isReferenceField(ormField))
23
+ .map((ormField) => [ormField.fieldName, (entity) => entity[ormField.fieldName].load()]);
24
+ const collectionResolvers = Object.values(entityMetadata.fields)
25
+ .filter((ormField) => isCollectionField(ormField))
26
+ .map((ormField) => [ormField.fieldName, (entity) => entity[ormField.fieldName].load()]);
27
+ const ormResolvers = Object.fromEntries([...primitiveResolvers, ...referenceResolvers, ...collectionResolvers]);
28
+ // Look for non-orm properties on the domain object's prototype
29
+ // and on an instance of the domain object itself to get
30
+ // non-prototype properties like CustomReferences
31
+ const ignoredKeys = Object.keys(ormResolvers);
32
+ const customProperties = (0, joist_orm_1.getProperties)(entityMetadata).filter((n) => !ignoredKeys.includes(n));
33
+ const customResolvers = customProperties.map((key) => [
34
+ key,
35
+ (entity) => {
36
+ const property = entity[key];
37
+ if (typeof property === "function") {
38
+ return property.apply(entity);
39
+ }
40
+ else if ((0, joist_orm_1.isReference)(property) || (0, joist_orm_1.isCollection)(property) || (0, joist_orm_1.isAsyncProperty)(property)) {
41
+ return property.load();
42
+ }
43
+ else {
44
+ return property;
45
+ }
46
+ },
47
+ ]);
48
+ let resolvers = {
49
+ id: idResolver,
50
+ ...ormResolvers,
51
+ ...Object.fromEntries(customResolvers),
52
+ };
53
+ if (aliases) {
54
+ Object.entries(aliases).forEach(([alias, field]) => {
55
+ resolvers[alias] = resolvers[field];
56
+ });
57
+ }
58
+ return resolvers;
59
+ }
60
+ exports.entityResolver = entityResolver;
61
+ function isReferenceField(ormField) {
62
+ return ormField.kind === "m2o" || ormField.kind === "o2o" || ormField.kind === "poly";
63
+ }
64
+ function isCollectionField(ormField) {
65
+ return ormField.kind === "o2m" || ormField.kind === "m2m";
66
+ }
67
+ function isPrimaryKeyField(ormField) {
68
+ return ormField.kind === "primaryKey";
69
+ }
70
+ //# sourceMappingURL=entityResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entityResolver.js","sourceRoot":"","sources":["../src/entityResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { entityResolver } from "./entityResolver";
2
+ export { makeRunInputMutation } from "./makeRunInputMutation";
3
+ export { makeRunObject } from "./makeRunObject";
4
+ export { makeRunObjectFields } from "./makeRunObjectFields";
5
+ export { makeRunQuery } from "./makeRunQuery";
6
+ export { saveEntities, saveEntity } from "./saveEntity";
package/build/index.js ADDED
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.saveEntity = exports.saveEntities = exports.makeRunQuery = exports.makeRunObjectFields = exports.makeRunObject = exports.makeRunInputMutation = exports.entityResolver = void 0;
4
+ var entityResolver_1 = require("./entityResolver");
5
+ Object.defineProperty(exports, "entityResolver", { enumerable: true, get: function () { return entityResolver_1.entityResolver; } });
6
+ var makeRunInputMutation_1 = require("./makeRunInputMutation");
7
+ Object.defineProperty(exports, "makeRunInputMutation", { enumerable: true, get: function () { return makeRunInputMutation_1.makeRunInputMutation; } });
8
+ var makeRunObject_1 = require("./makeRunObject");
9
+ Object.defineProperty(exports, "makeRunObject", { enumerable: true, get: function () { return makeRunObject_1.makeRunObject; } });
10
+ var makeRunObjectFields_1 = require("./makeRunObjectFields");
11
+ Object.defineProperty(exports, "makeRunObjectFields", { enumerable: true, get: function () { return makeRunObjectFields_1.makeRunObjectFields; } });
12
+ var makeRunQuery_1 = require("./makeRunQuery");
13
+ Object.defineProperty(exports, "makeRunQuery", { enumerable: true, get: function () { return makeRunQuery_1.makeRunQuery; } });
14
+ var saveEntity_1 = require("./saveEntity");
15
+ Object.defineProperty(exports, "saveEntities", { enumerable: true, get: function () { return saveEntity_1.saveEntities; } });
16
+ Object.defineProperty(exports, "saveEntity", { enumerable: true, get: function () { return saveEntity_1.saveEntity; } });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA;AAC7B,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAC5B,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,2CAAwD;AAA/C,0GAAA,YAAY,OAAA;AAAE,wGAAA,UAAU,OAAA"}
@@ -0,0 +1,13 @@
1
+ import { Context, Resolver } from "./context";
2
+ import { ResolverResult } from "./makeRunObject";
3
+ /**
4
+ * Creates a `run` method to invoke a mutation resolver that uses the `input` convention.
5
+ *
6
+ * Following our `mutation / foo` conventions, `resolver` will have a single `fooResolver.foo` method.
7
+ */
8
+ export declare function makeRunInputMutation<T>(resolver: T): RunInputMutationMethod<T>;
9
+ declare type RunInputMutationMethod<T> = <I extends MutationInput<T>, R = ResolverResult<T, keyof T>>(ctx: Context, input: I | (() => I)) => Promise<R>;
10
+ declare type MutationInput<T> = T[keyof T] extends Resolver<any, {
11
+ input: infer I;
12
+ }, any> ? I : never;
13
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeRunInputMutation = void 0;
4
+ const joist_test_utils_1 = require("joist-test-utils");
5
+ /**
6
+ * Creates a `run` method to invoke a mutation resolver that uses the `input` convention.
7
+ *
8
+ * Following our `mutation / foo` conventions, `resolver` will have a single `fooResolver.foo` method.
9
+ */
10
+ function makeRunInputMutation(resolver) {
11
+ return (ctx, args) => (0, joist_test_utils_1.run)(ctx, async (ctx) => {
12
+ const key = Object.keys(resolver)[0];
13
+ return resolver[key]({}, { input: args instanceof Function ? args() : args ?? {} }, ctx, undefined);
14
+ });
15
+ }
16
+ exports.makeRunInputMutation = makeRunInputMutation;
17
+ //# sourceMappingURL=makeRunInputMutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeRunInputMutation.js","sourceRoot":"","sources":["../src/makeRunInputMutation.ts"],"names":[],"mappings":";;;AAAA,uDAAuC;AAIvC;;;;GAIG;AACH,SAAgB,oBAAoB,CAAI,QAAW;IACjD,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CACnB,IAAA,sBAAG,EAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,OAAS,QAAgB,CAAC,GAAG,CAAS,CACpC,EAAE,EACF,EAAE,KAAK,EAAE,IAAI,YAAY,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,EACzD,GAAG,EACH,SAAU,CACX,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AAXD,oDAWC"}
@@ -0,0 +1,11 @@
1
+ import { Context, Resolver } from "./context";
2
+ export declare type ResolverRoot<T> = T extends {
3
+ [key in keyof T]: infer F;
4
+ } ? F extends Resolver<infer R, any, any> ? R : never : never;
5
+ export declare type ResolverArgs<T, K extends keyof T> = T[K] extends Resolver<any, infer U, any> ? U : never;
6
+ export declare type ResolverResult<T, K extends keyof T> = T[K] extends Resolver<any, any, infer U> ? U : never;
7
+ /** The return type of `makeRunObject`. */
8
+ declare type RunResolverMethod<T, R> = <K extends keyof T, A extends ResolverArgs<T, K>>(ctx: Context, root: R, key: K, args?: A | (() => A)) => Promise<ResolverResult<T, K>>;
9
+ /** Creates a `run` method to invoke a specific resolver key with that key's args. */
10
+ export declare function makeRunObject<T, R extends ResolverRoot<T>>(resolvers: T): RunResolverMethod<T, R>;
11
+ export {};
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeRunObject = void 0;
4
+ const joist_orm_1 = require("joist-orm");
5
+ const joist_test_utils_1 = require("joist-test-utils");
6
+ /** Creates a `run` method to invoke a specific resolver key with that key's args. */
7
+ function makeRunObject(resolvers) {
8
+ return (ctx, root, key, args) => (0, joist_test_utils_1.run)(ctx, async (ctx) => {
9
+ const _root = (0, joist_orm_1.isEntity)(root) ? await ctx.em.load(root.idOrFail) : root;
10
+ return resolvers[key](_root, args instanceof Function ? args() : args ?? {}, ctx, undefined);
11
+ });
12
+ }
13
+ exports.makeRunObject = makeRunObject;
14
+ //# sourceMappingURL=makeRunObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeRunObject.js","sourceRoot":"","sources":["../src/makeRunObject.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AACrC,uDAAuC;AAoBvC,qFAAqF;AACrF,SAAgB,aAAa,CAA+B,SAAY;IACtE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAC9B,IAAA,sBAAG,EAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,KAAK,GAAG,IAAA,oBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAE,IAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChF,OAAQ,SAAS,CAAC,GAAG,CAAS,CAAC,KAAK,EAAE,IAAI,YAAY,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,GAAG,EAAE,SAAU,CAAC,CAAC;IACzG,CAAC,CAAC,CAAC;AACP,CAAC;AAND,sCAMC"}
@@ -0,0 +1,8 @@
1
+ import { Context } from "./context";
2
+ import { ResolverResult, ResolverRoot } from "./makeRunObject";
3
+ /** Creates a `run` method that can invoke multiple keys against a resolver. */
4
+ export declare function makeRunObjectFields<T, R extends ResolverRoot<T>>(resolver: T): RunKeysResolverMethod<T, R>;
5
+ declare type RunKeysResolverMethod<T, R extends ResolverRoot<T>> = <K extends (keyof T)[]>(ctx: Context, root: R, keys: K) => Promise<{
6
+ [k in K[number]]: ResolverResult<T, k>;
7
+ }>;
8
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeRunObjectFields = void 0;
4
+ const joist_orm_1 = require("joist-orm");
5
+ const joist_test_utils_1 = require("joist-test-utils");
6
+ /** Creates a `run` method that can invoke multiple keys against a resolver. */
7
+ function makeRunObjectFields(resolver) {
8
+ return (ctx, root, keys) => {
9
+ return (0, joist_test_utils_1.run)(ctx, async (ctx) => {
10
+ const _root = (0, joist_orm_1.isEntity)(root) ? await ctx.em.load(root.idOrFail) : root;
11
+ // Build a result with each key, where keys might return a promise, so we `await` to make assertions easier
12
+ return Object.fromEntries(await Promise.all(keys.map(async (key) => [key, await resolver[key](_root, {}, ctx, undefined)])));
13
+ });
14
+ };
15
+ }
16
+ exports.makeRunObjectFields = makeRunObjectFields;
17
+ //# sourceMappingURL=makeRunObjectFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeRunObjectFields.js","sourceRoot":"","sources":["../src/makeRunObjectFields.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AACrC,uDAAuC;AAIvC,+EAA+E;AAC/E,SAAgB,mBAAmB,CAA+B,QAAW;IAC3E,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QACzB,OAAO,IAAA,sBAAG,EAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,KAAK,GAAG,IAAA,oBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAE,IAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAChF,2GAA2G;YAC3G,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAO,QAAQ,CAAC,GAAG,CAAS,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,SAAU,CAAC,CAAC,CAAC,CAAC,CAC5G,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAVD,kDAUC"}
@@ -0,0 +1,10 @@
1
+ import { Context } from "./context";
2
+ import { ResolverArgs, ResolverResult } from "./makeRunObject";
3
+ /**
4
+ * Creates a `run` method to invoke a query resolver.
5
+ *
6
+ * Following our `query / foo` conventions, `resolver` will have a single `fooResolver.foo` method.
7
+ */
8
+ export declare function makeRunQuery<T>(resolver: T): RunQueryMethod<T>;
9
+ declare type RunQueryMethod<T> = <A extends ResolverArgs<T, keyof T>>(ctx: Context, args?: A | (() => A)) => Promise<ResolverResult<T, keyof T>>;
10
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeRunQuery = void 0;
4
+ const joist_test_utils_1 = require("joist-test-utils");
5
+ /**
6
+ * Creates a `run` method to invoke a query resolver.
7
+ *
8
+ * Following our `query / foo` conventions, `resolver` will have a single `fooResolver.foo` method.
9
+ */
10
+ function makeRunQuery(resolver) {
11
+ return (ctx, args) => (0, joist_test_utils_1.run)(ctx, async (ctx) => {
12
+ const key = Object.keys(resolver)[0];
13
+ return resolver[key]({}, args instanceof Function ? args() : args ?? {}, ctx, undefined);
14
+ });
15
+ }
16
+ exports.makeRunQuery = makeRunQuery;
17
+ //# sourceMappingURL=makeRunQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeRunQuery.js","sourceRoot":"","sources":["../src/makeRunQuery.ts"],"names":[],"mappings":";;;AAAA,uDAAuC;AAIvC;;;;GAIG;AACH,SAAgB,YAAY,CAAI,QAAW;IACzC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CACnB,IAAA,sBAAG,EAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,OAAS,QAAgB,CAAC,GAAG,CAAS,CAAC,EAAE,EAAE,IAAI,YAAY,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,GAAG,EAAE,SAAU,CAAC,CAAC;IAC9G,CAAC,CAAC,CAAC;AACP,CAAC;AAND,oCAMC"}
@@ -0,0 +1,11 @@
1
+ import { BaseEntity, DeepPartialOrNull, EntityConstructor, OptsOf } from "joist-orm";
2
+ import { Context } from "./context";
3
+ /** Given an GraphQL input, creates-or-updates an entity of `type`. */
4
+ export declare function saveEntity<T extends BaseEntity>(ctx: Context, type: EntityConstructor<T>, input: DeepPartialOrNull<T>, opts?: {
5
+ flush?: boolean;
6
+ }): Promise<T>;
7
+ /** Given GraphQL inputs, creates-or-updates multiple entities of `type`. */
8
+ export declare function saveEntities<T extends BaseEntity>(ctx: Context, type: EntityConstructor<T>, input: readonly DeepPartialOrNull<T>[], opts?: {
9
+ flush?: boolean;
10
+ opts?: Partial<OptsOf<T>>;
11
+ }): Promise<T[]>;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.saveEntities = exports.saveEntity = void 0;
4
+ /** Given an GraphQL input, creates-or-updates an entity of `type`. */
5
+ async function saveEntity(ctx, type, input, opts = {}) {
6
+ return saveEntities(ctx, type, [input], opts).then((r) => r[0]);
7
+ }
8
+ exports.saveEntity = saveEntity;
9
+ /** Given GraphQL inputs, creates-or-updates multiple entities of `type`. */
10
+ async function saveEntities(ctx, type, input, opts = {}) {
11
+ const { em } = ctx;
12
+ const { opts: entityOpts = {}, flush = true } = opts;
13
+ const entities = await Promise.all(input.map((input) => em.createOrUpdatePartial(type, { ...entityOpts, ...input })));
14
+ if (flush) {
15
+ await ctx.em.flush();
16
+ }
17
+ return entities;
18
+ }
19
+ exports.saveEntities = saveEntities;
20
+ //# sourceMappingURL=saveEntity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saveEntity.js","sourceRoot":"","sources":["../src/saveEntity.ts"],"names":[],"mappings":";;;AAGA,sEAAsE;AAC/D,KAAK,UAAU,UAAU,CAC9B,GAAY,EACZ,IAA0B,EAC1B,KAA2B,EAC3B,OAA4B,EAAE;IAE9B,OAAO,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAPD,gCAOC;AAED,4EAA4E;AACrE,KAAK,UAAU,YAAY,CAChC,GAAY,EACZ,IAA0B,EAC1B,KAAsC,EACtC,OAAuD,EAAE;IAEzD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;IACnB,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,qBAAqB,CAAC,IAAI,EAAE,EAAE,GAAG,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACtH,IAAI,KAAK,EAAE;QACT,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;KACtB;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAbD,oCAaC"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "joist-graphql-resolver-utils",
3
+ "version": "1.33.0",
4
+ "license": "MIT",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/stephenh/joist-ts.git",
8
+ "directory": "packages/graphql-resolver-utils"
9
+ },
10
+ "main": "build/index.js",
11
+ "types": "build/index.d.ts",
12
+ "scripts": {
13
+ "format": "prettier --write '{schema,migrations,src}/**/*.{ts,js,tsx,jsx,graphql}'"
14
+ },
15
+ "files": [
16
+ "build"
17
+ ],
18
+ "dependencies": {
19
+ "graphql": "^16.6.0",
20
+ "joist-orm": "1.33.0",
21
+ "joist-test-utils": "1.33.0"
22
+ },
23
+ "devDependencies": {
24
+ "@swc/core": "^1.2.220",
25
+ "@swc/jest": "^0.2.22",
26
+ "@types/jest": "^28.1.6",
27
+ "@types/node": "^18.6.3",
28
+ "jest": "^28.1.3",
29
+ "prettier": "^2.7.1",
30
+ "prettier-plugin-organize-imports": "^3.0.0",
31
+ "tsconfig-paths": "^4.0.0",
32
+ "typescript": "^4.7.4"
33
+ }
34
+ }