@orion-js/graphql 3.2.5 → 3.2.7
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/lib/buildSchema/getMutation.d.ts +2 -4
- package/lib/buildSchema/getMutation.js +2 -2
- package/lib/buildSchema/getQuery.d.ts +2 -4
- package/lib/buildSchema/getQuery.js +2 -2
- package/lib/buildSchema/getResolvers/index.d.ts +2 -5
- package/lib/buildSchema/getResolvers/index.js +2 -1
- package/lib/buildSchema/getResolvers/index.test.js +2 -2
- package/lib/buildSchema/getSubscription.d.ts +2 -4
- package/lib/buildSchema/getSubscription.js +3 -3
- package/lib/buildSchema/getSubscriptions/index.d.ts +2 -4
- package/lib/buildSchema/getSubscriptions/index.js +2 -1
- package/lib/buildSchema/getSubscriptions/index.test.js +4 -4
- package/lib/buildSchema/getType/index.d.ts +2 -1
- package/lib/buildSchema/getType/index.js +9 -0
- package/lib/buildSchema/index.d.ts +2 -1
- package/lib/resolversSchemas/getModelLoadedResolvers.d.ts +3 -0
- package/lib/resolversSchemas/getModelLoadedResolvers.js +21 -0
- package/lib/service/global.d.ts +10 -0
- package/lib/service/global.js +51 -0
- package/lib/service/index.d.ts +2 -18
- package/lib/service/index.js +12 -81
- package/lib/service/index.test.js +5 -47
- package/lib/service/model.d.ts +14 -0
- package/lib/service/model.js +44 -0
- package/lib/service/model.test.d.ts +1 -0
- package/lib/service/model.test.js +126 -0
- package/lib/startGraphQL.test.js +2 -2
- package/lib/startWebsocket.test.js +3 -3
- package/lib/types/startGraphQL.d.ts +8 -1
- package/package.json +2 -2
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import { GraphQLObjectType } from 'graphql';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
resolvers: any;
|
|
5
|
-
}): Promise<GraphQLObjectType<any, any>>;
|
|
2
|
+
import { StartGraphQLOptions } from '../types/startGraphQL';
|
|
3
|
+
export default function (options: StartGraphQLOptions): Promise<GraphQLObjectType<any, any>>;
|
|
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const graphql_1 = require("graphql");
|
|
7
7
|
const getResolvers_1 = __importDefault(require("./getResolvers"));
|
|
8
8
|
const isEmpty_1 = __importDefault(require("lodash/isEmpty"));
|
|
9
|
-
async function default_1(
|
|
10
|
-
const fields = await (0, getResolvers_1.default)(
|
|
9
|
+
async function default_1(options) {
|
|
10
|
+
const fields = await (0, getResolvers_1.default)(options, true);
|
|
11
11
|
if ((0, isEmpty_1.default)(fields))
|
|
12
12
|
return null;
|
|
13
13
|
return new graphql_1.GraphQLObjectType({
|
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import { GraphQLObjectType } from 'graphql';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
resolvers: any;
|
|
5
|
-
}): Promise<GraphQLObjectType<any, any>>;
|
|
2
|
+
import { StartGraphQLOptions } from '../types/startGraphQL';
|
|
3
|
+
export default function (options: StartGraphQLOptions): Promise<GraphQLObjectType<any, any>>;
|
|
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const graphql_1 = require("graphql");
|
|
7
7
|
const getResolvers_1 = __importDefault(require("./getResolvers"));
|
|
8
8
|
const isEmpty_1 = __importDefault(require("lodash/isEmpty"));
|
|
9
|
-
async function default_1(
|
|
10
|
-
const fields = await (0, getResolvers_1.default)(
|
|
9
|
+
async function default_1(options) {
|
|
10
|
+
const fields = await (0, getResolvers_1.default)(options, false);
|
|
11
11
|
if ((0, isEmpty_1.default)(fields))
|
|
12
12
|
return null;
|
|
13
13
|
return new graphql_1.GraphQLObjectType({
|
|
@@ -1,6 +1,3 @@
|
|
|
1
1
|
import { GraphQLFieldConfig } from 'graphql';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
mutation: any;
|
|
5
|
-
options: any;
|
|
6
|
-
}): Promise<import("graphql/jsutils/ObjMap").ObjMap<GraphQLFieldConfig<any, any, any>>>;
|
|
2
|
+
import { StartGraphQLOptions } from '../../types/startGraphQL';
|
|
3
|
+
export default function (options: StartGraphQLOptions, mutation: boolean): Promise<import("graphql/jsutils/ObjMap").ObjMap<GraphQLFieldConfig<any, any, any>>>;
|
|
@@ -7,7 +7,8 @@ const getType_1 = __importDefault(require("../getType"));
|
|
|
7
7
|
const getArgs_1 = __importDefault(require("../getArgs"));
|
|
8
8
|
const errorHandler_1 = __importDefault(require("../../errorHandler"));
|
|
9
9
|
const resolversStore_1 = require("./resolversStore");
|
|
10
|
-
async function default_1(
|
|
10
|
+
async function default_1(options, mutation) {
|
|
11
|
+
const { resolvers } = options;
|
|
11
12
|
const filteredResolvers = Object.keys(resolvers)
|
|
12
13
|
.map(key => {
|
|
13
14
|
return {
|
|
@@ -52,8 +52,8 @@ describe('Test get resolvers schema', () => {
|
|
|
52
52
|
});
|
|
53
53
|
const resolvers = { globalResolver };
|
|
54
54
|
const mutation = false;
|
|
55
|
-
const options = {};
|
|
56
|
-
const schema = await (0, index_1.default)(
|
|
55
|
+
const options = { resolvers };
|
|
56
|
+
const schema = await (0, index_1.default)(options, mutation);
|
|
57
57
|
expect(schema.globalResolver.type.toString()).toEqual('TestModel');
|
|
58
58
|
expect(schema.globalResolver.args).toHaveProperty('userId');
|
|
59
59
|
expect(await schema.globalResolver.resolve(null, { userId: '1' })).toEqual({
|
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import { GraphQLObjectType } from 'graphql';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
subscriptions: any;
|
|
5
|
-
}): Promise<GraphQLObjectType<any, any>>;
|
|
2
|
+
import { StartGraphQLOptions } from '../types/startGraphQL';
|
|
3
|
+
export default function (options: StartGraphQLOptions): Promise<GraphQLObjectType>;
|
|
@@ -5,10 +5,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const graphql_1 = require("graphql");
|
|
7
7
|
const getSubscriptions_1 = __importDefault(require("./getSubscriptions"));
|
|
8
|
-
async function default_1(
|
|
9
|
-
if (!subscriptions)
|
|
8
|
+
async function default_1(options) {
|
|
9
|
+
if (!options.subscriptions)
|
|
10
10
|
return null;
|
|
11
|
-
const fields = await (0, getSubscriptions_1.default)(
|
|
11
|
+
const fields = await (0, getSubscriptions_1.default)(options);
|
|
12
12
|
return new graphql_1.GraphQLObjectType({
|
|
13
13
|
name: 'Subscription',
|
|
14
14
|
fields
|
|
@@ -5,7 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const getType_1 = __importDefault(require("../getType"));
|
|
7
7
|
const getArgs_1 = __importDefault(require("../getArgs"));
|
|
8
|
-
async function default_1(
|
|
8
|
+
async function default_1(options) {
|
|
9
|
+
const { subscriptions } = options;
|
|
9
10
|
const fields = {};
|
|
10
11
|
for (const key of Object.keys(subscriptions)) {
|
|
11
12
|
const subscription = subscriptions[key];
|
|
@@ -24,7 +24,7 @@ describe('Test get subscriptions schema', () => {
|
|
|
24
24
|
__metadata("design:type", String)
|
|
25
25
|
], TestParams.prototype, "userId", void 0);
|
|
26
26
|
TestParams = __decorate([
|
|
27
|
-
(0, typed_model_1.
|
|
27
|
+
(0, typed_model_1.TypedSchema)()
|
|
28
28
|
], TestParams);
|
|
29
29
|
let TestModel = class TestModel {
|
|
30
30
|
};
|
|
@@ -37,15 +37,15 @@ describe('Test get subscriptions schema', () => {
|
|
|
37
37
|
__metadata("design:type", Number)
|
|
38
38
|
], TestModel.prototype, "age", void 0);
|
|
39
39
|
TestModel = __decorate([
|
|
40
|
-
(0, typed_model_1.
|
|
40
|
+
(0, typed_model_1.TypedSchema)()
|
|
41
41
|
], TestModel);
|
|
42
42
|
const modelSub = (0, __1.subscription)({
|
|
43
43
|
params: TestParams,
|
|
44
44
|
returns: TestModel
|
|
45
45
|
});
|
|
46
46
|
const subscriptions = { modelSub };
|
|
47
|
-
const options = {};
|
|
48
|
-
const schema = await (0, index_1.default)(
|
|
47
|
+
const options = { subscriptions, resolvers: {} };
|
|
48
|
+
const schema = await (0, index_1.default)(options);
|
|
49
49
|
expect(schema.modelSub.type.toString()).toEqual('TestModel');
|
|
50
50
|
expect(schema.modelSub.args).toHaveProperty('userId');
|
|
51
51
|
});
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import { StartGraphQLOptions } from '../../types/startGraphQL';
|
|
2
|
+
export default function getGraphQLType(type: any, options: StartGraphQLOptions): any;
|
|
@@ -11,6 +11,7 @@ const getScalar_1 = __importDefault(require("./getScalar"));
|
|
|
11
11
|
const getTypeAsResolver_1 = __importDefault(require("./getTypeAsResolver"));
|
|
12
12
|
const getStaticFields_1 = require("../../resolversSchemas/getStaticFields");
|
|
13
13
|
const getDynamicFields_1 = require("../../resolversSchemas/getDynamicFields");
|
|
14
|
+
const getModelLoadedResolvers_1 = require("../../resolversSchemas/getModelLoadedResolvers");
|
|
14
15
|
function getGraphQLType(type, options) {
|
|
15
16
|
if (!type) {
|
|
16
17
|
throw new Error('Type is undefined');
|
|
@@ -63,6 +64,14 @@ function getGraphQLType(type, options) {
|
|
|
63
64
|
throw new Error(`Error getting resolver type for resolver "${resolver.key}": ${error.message}`);
|
|
64
65
|
}
|
|
65
66
|
}
|
|
67
|
+
for (const resolver of (0, getModelLoadedResolvers_1.getModelLoadedResolvers)(model, options)) {
|
|
68
|
+
try {
|
|
69
|
+
fields[resolver.key] = (0, getTypeAsResolver_1.default)({ resolver, getGraphQLType, options, model });
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
throw new Error(`Error getting resolver type for resolver "${resolver.key}": ${error.message}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
66
75
|
return fields;
|
|
67
76
|
}
|
|
68
77
|
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getModelLoadedResolvers = void 0;
|
|
4
|
+
function getModelLoadedResolvers(model, options) {
|
|
5
|
+
if (!options.modelsResolvers)
|
|
6
|
+
return [];
|
|
7
|
+
const resolvers = options.modelsResolvers[model.name];
|
|
8
|
+
if (!resolvers)
|
|
9
|
+
return [];
|
|
10
|
+
const keys = Object.keys(resolvers);
|
|
11
|
+
return keys
|
|
12
|
+
.map(key => {
|
|
13
|
+
const resolver = resolvers[key];
|
|
14
|
+
return {
|
|
15
|
+
...resolver,
|
|
16
|
+
key
|
|
17
|
+
};
|
|
18
|
+
})
|
|
19
|
+
.filter(resolver => !resolver.private);
|
|
20
|
+
}
|
|
21
|
+
exports.getModelLoadedResolvers = getModelLoadedResolvers;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { GlobalResolverResolve, ResolverOptions, Resolver } from '@orion-js/resolvers';
|
|
2
|
+
export declare function Resolvers(): ClassDecorator;
|
|
3
|
+
export interface GlobalResolverPropertyDescriptor extends Omit<PropertyDecorator, 'value'> {
|
|
4
|
+
value?: GlobalResolverResolve;
|
|
5
|
+
}
|
|
6
|
+
export declare function Query(options: Omit<ResolverOptions<any>, 'resolve' | 'mutation'>): (target: any, propertyKey: string, descriptor: GlobalResolverPropertyDescriptor) => void;
|
|
7
|
+
export declare function Mutation(options: Omit<ResolverOptions<any>, 'resolve' | 'mutation'>): (target: any, propertyKey: string, descriptor: GlobalResolverPropertyDescriptor) => void;
|
|
8
|
+
export declare function getServiceResolvers(target: any): {
|
|
9
|
+
[key: string]: Resolver<GlobalResolverResolve>;
|
|
10
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getServiceResolvers = exports.Mutation = exports.Query = exports.Resolvers = void 0;
|
|
4
|
+
const services_1 = require("@orion-js/services");
|
|
5
|
+
const resolvers_1 = require("@orion-js/resolvers");
|
|
6
|
+
const helpers_1 = require("@orion-js/helpers");
|
|
7
|
+
function Resolvers() {
|
|
8
|
+
return function (target) {
|
|
9
|
+
(0, services_1.Service)()(target);
|
|
10
|
+
target.prototype.service = target;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
exports.Resolvers = Resolvers;
|
|
14
|
+
function Query(options) {
|
|
15
|
+
return function (target, propertyKey, descriptor) {
|
|
16
|
+
if (!descriptor.value)
|
|
17
|
+
throw new Error(`You must pass resolver function to ${propertyKey}`);
|
|
18
|
+
target.resolvers = target.resolvers || {};
|
|
19
|
+
target.resolvers[propertyKey] = (0, resolvers_1.resolver)({
|
|
20
|
+
...options,
|
|
21
|
+
resolve: async (params, viewer) => {
|
|
22
|
+
const instance = (0, services_1.getInstance)(target.service);
|
|
23
|
+
return await instance[propertyKey](params, viewer);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
exports.Query = Query;
|
|
29
|
+
function Mutation(options) {
|
|
30
|
+
return function (target, propertyKey, descriptor) {
|
|
31
|
+
if (!descriptor.value)
|
|
32
|
+
throw new Error(`You must pass resolver function to ${propertyKey}`);
|
|
33
|
+
target.resolvers = target.resolvers || {};
|
|
34
|
+
target.resolvers[propertyKey] = (0, resolvers_1.resolver)({
|
|
35
|
+
...options,
|
|
36
|
+
mutation: true,
|
|
37
|
+
resolve: async (params, viewer) => {
|
|
38
|
+
const instance = (0, services_1.getInstance)(target.service);
|
|
39
|
+
return await instance[propertyKey](params, viewer);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
exports.Mutation = Mutation;
|
|
45
|
+
function getServiceResolvers(target) {
|
|
46
|
+
if (!target.prototype) {
|
|
47
|
+
throw new helpers_1.UserError('You must pass a class to getResolvers');
|
|
48
|
+
}
|
|
49
|
+
return target.prototype.resolvers || {};
|
|
50
|
+
}
|
|
51
|
+
exports.getServiceResolvers = getServiceResolvers;
|
package/lib/service/index.d.ts
CHANGED
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
value?: GlobalResolverResolve;
|
|
4
|
-
}
|
|
5
|
-
export declare function Query(options: Omit<ResolverOptions<any>, 'resolve' | 'mutation'>): (target: any, propertyKey: string, descriptor: GlobalResolverPropertyDescriptor) => void;
|
|
6
|
-
export declare function Mutation(options: Omit<ResolverOptions<any>, 'resolve' | 'mutation'>): (target: any, propertyKey: string, descriptor: GlobalResolverPropertyDescriptor) => void;
|
|
7
|
-
export declare function getServiceResolvers(target: any): {
|
|
8
|
-
[key: string]: Resolver<GlobalResolverResolve>;
|
|
9
|
-
};
|
|
10
|
-
export interface ModelResolverPropertyDescriptor extends Omit<PropertyDecorator, 'value'> {
|
|
11
|
-
value?: ModelResolverResolve;
|
|
12
|
-
}
|
|
13
|
-
export declare function ModelResolver(options: Omit<ResolverOptions<any>, 'resolve'>): (target: any, propertyKey: string, descriptor: ModelResolverPropertyDescriptor) => void;
|
|
14
|
-
export declare function getServiceModelResolvers(target: any): {
|
|
15
|
-
[key: string]: ModelResolver<GlobalResolverResolve>;
|
|
16
|
-
};
|
|
17
|
-
export declare function Resolvers(): ClassDecorator;
|
|
18
|
-
export declare function Model(typedSchema: any): ClassDecorator;
|
|
1
|
+
export * from './global';
|
|
2
|
+
export * from './model';
|
package/lib/service/index.js
CHANGED
|
@@ -1,83 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
2
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const resolvers_1 = require("@orion-js/resolvers");
|
|
6
|
-
const helpers_1 = require("@orion-js/helpers");
|
|
7
|
-
function Query(options) {
|
|
8
|
-
return function (target, propertyKey, descriptor) {
|
|
9
|
-
if (!descriptor.value)
|
|
10
|
-
throw new Error(`You must pass resolver function to ${propertyKey}`);
|
|
11
|
-
target.resolvers = target.resolvers || {};
|
|
12
|
-
target.resolvers[propertyKey] = (0, resolvers_1.resolver)({
|
|
13
|
-
...options,
|
|
14
|
-
resolve: async (params, viewer) => {
|
|
15
|
-
const instance = (0, services_1.getInstance)(target.service);
|
|
16
|
-
return await instance[propertyKey](params, viewer);
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
exports.Query = Query;
|
|
22
|
-
function Mutation(options) {
|
|
23
|
-
return function (target, propertyKey, descriptor) {
|
|
24
|
-
if (!descriptor.value)
|
|
25
|
-
throw new Error(`You must pass resolver function to ${propertyKey}`);
|
|
26
|
-
target.resolvers = target.resolvers || {};
|
|
27
|
-
target.resolvers[propertyKey] = (0, resolvers_1.resolver)({
|
|
28
|
-
...options,
|
|
29
|
-
mutation: true,
|
|
30
|
-
resolve: async (params, viewer) => {
|
|
31
|
-
const instance = (0, services_1.getInstance)(target.service);
|
|
32
|
-
return await instance[propertyKey](params, viewer);
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
exports.Mutation = Mutation;
|
|
38
|
-
function getServiceResolvers(target) {
|
|
39
|
-
if (!target.prototype) {
|
|
40
|
-
throw new helpers_1.UserError('You must pass a class to getResolvers');
|
|
41
|
-
}
|
|
42
|
-
return target.prototype.resolvers || {};
|
|
43
|
-
}
|
|
44
|
-
exports.getServiceResolvers = getServiceResolvers;
|
|
45
|
-
function ModelResolver(options) {
|
|
46
|
-
return function (target, propertyKey, descriptor) {
|
|
47
|
-
if (!descriptor.value)
|
|
48
|
-
throw new Error(`You must pass resolver function to ${propertyKey}`);
|
|
49
|
-
target.resolvers = target.resolvers || {};
|
|
50
|
-
target.resolvers[propertyKey] = (0, resolvers_1.modelResolver)({
|
|
51
|
-
...options,
|
|
52
|
-
resolve: async (item, params, viewer) => {
|
|
53
|
-
const instance = (0, services_1.getInstance)(target.service);
|
|
54
|
-
return await instance[propertyKey](item, params, viewer);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
exports.ModelResolver = ModelResolver;
|
|
60
|
-
function getServiceModelResolvers(target) {
|
|
61
|
-
if (!target.prototype) {
|
|
62
|
-
throw new helpers_1.UserError('You must pass a class to getResolvers');
|
|
63
|
-
}
|
|
64
|
-
return target.prototype.resolvers || {};
|
|
65
|
-
}
|
|
66
|
-
exports.getServiceModelResolvers = getServiceModelResolvers;
|
|
67
|
-
function Resolvers() {
|
|
68
|
-
return function (target) {
|
|
69
|
-
(0, services_1.Service)()(target);
|
|
70
|
-
target.prototype.service = target;
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
exports.Resolvers = Resolvers;
|
|
74
|
-
function Model(typedSchema) {
|
|
75
|
-
return function (target) {
|
|
76
|
-
(0, services_1.Service)()(target);
|
|
77
|
-
target.prototype.typedSchema = typedSchema;
|
|
78
|
-
target.prototype.service = target;
|
|
79
|
-
// @ts-expect-error this is a trick to make it work in resolvers without having to call getModelForClass
|
|
80
|
-
target.getModel = () => getModelForClass(target);
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
exports.Model = Model;
|
|
13
|
+
__exportStar(require("./global"), exports);
|
|
14
|
+
__exportStar(require("./model"), exports);
|
|
@@ -11,8 +11,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
require("reflect-metadata");
|
|
13
13
|
const services_1 = require("@orion-js/services");
|
|
14
|
-
const
|
|
15
|
-
const _1 = require(".");
|
|
14
|
+
const index_1 = require("./index");
|
|
16
15
|
describe('Resolvers with service injection', () => {
|
|
17
16
|
it('should allow to pass a service as resolve', async () => {
|
|
18
17
|
let ExampleRepo = class ExampleRepo {
|
|
@@ -39,7 +38,7 @@ describe('Resolvers with service injection', () => {
|
|
|
39
38
|
__metadata("design:type", ExampleRepo)
|
|
40
39
|
], ExampleResolverService.prototype, "repo", void 0);
|
|
41
40
|
__decorate([
|
|
42
|
-
(0,
|
|
41
|
+
(0, index_1.Query)({
|
|
43
42
|
params: { name: { type: 'string' } },
|
|
44
43
|
returns: String
|
|
45
44
|
}),
|
|
@@ -48,58 +47,17 @@ describe('Resolvers with service injection', () => {
|
|
|
48
47
|
__metadata("design:returntype", Promise)
|
|
49
48
|
], ExampleResolverService.prototype, "sayHi", null);
|
|
50
49
|
__decorate([
|
|
51
|
-
(0,
|
|
50
|
+
(0, index_1.Mutation)({ returns: String }),
|
|
52
51
|
__metadata("design:type", Function),
|
|
53
52
|
__metadata("design:paramtypes", []),
|
|
54
53
|
__metadata("design:returntype", Promise)
|
|
55
54
|
], ExampleResolverService.prototype, "setName", null);
|
|
56
55
|
ExampleResolverService = __decorate([
|
|
57
|
-
(0,
|
|
56
|
+
(0, index_1.Resolvers)()
|
|
58
57
|
], ExampleResolverService);
|
|
59
|
-
const resolvers = (0,
|
|
58
|
+
const resolvers = (0, index_1.getServiceResolvers)(ExampleResolverService);
|
|
60
59
|
expect(resolvers.sayHi).toBeDefined();
|
|
61
60
|
const result = await resolvers.sayHi.execute({ params: { name: 'Orion' } });
|
|
62
61
|
expect(result).toBe(`My name is Orion Lopez and I'm 100 years old`);
|
|
63
62
|
});
|
|
64
|
-
it('show allow to pass a service with resolvers to typed model', async () => {
|
|
65
|
-
let AgeRepo = class AgeRepo {
|
|
66
|
-
getAge(name) {
|
|
67
|
-
return `${name} is 100 years old`;
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
AgeRepo = __decorate([
|
|
71
|
-
(0, services_1.Service)()
|
|
72
|
-
], AgeRepo);
|
|
73
|
-
let PersonSchema = class PersonSchema {
|
|
74
|
-
};
|
|
75
|
-
__decorate([
|
|
76
|
-
(0, typed_model_1.Prop)(),
|
|
77
|
-
__metadata("design:type", String)
|
|
78
|
-
], PersonSchema.prototype, "name", void 0);
|
|
79
|
-
PersonSchema = __decorate([
|
|
80
|
-
(0, typed_model_1.TypedSchema)()
|
|
81
|
-
], PersonSchema);
|
|
82
|
-
let PersonModel = class PersonModel {
|
|
83
|
-
async getAge(person) {
|
|
84
|
-
const result = this.repo.getAge(person.name);
|
|
85
|
-
return result;
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
__decorate([
|
|
89
|
-
(0, services_1.Inject)(),
|
|
90
|
-
__metadata("design:type", AgeRepo)
|
|
91
|
-
], PersonModel.prototype, "repo", void 0);
|
|
92
|
-
__decorate([
|
|
93
|
-
(0, _1.ModelResolver)({ returns: String }),
|
|
94
|
-
__metadata("design:type", Function),
|
|
95
|
-
__metadata("design:paramtypes", [PersonSchema]),
|
|
96
|
-
__metadata("design:returntype", Promise)
|
|
97
|
-
], PersonModel.prototype, "getAge", null);
|
|
98
|
-
PersonModel = __decorate([
|
|
99
|
-
(0, _1.Model)(PersonSchema)
|
|
100
|
-
], PersonModel);
|
|
101
|
-
const model = (0, typed_model_1.getModelForClass)(PersonModel);
|
|
102
|
-
const item = model.initItem({ name: 'Orion' });
|
|
103
|
-
expect(await item.getAge()).toBe(`Orion is 100 years old`);
|
|
104
|
-
});
|
|
105
63
|
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { GlobalResolverResolve, ResolverOptions, ModelResolverResolve, ModelResolver } from '@orion-js/resolvers';
|
|
2
|
+
export interface ModelResolverPropertyDescriptor extends Omit<PropertyDecorator, 'value'> {
|
|
3
|
+
value?: ModelResolverResolve;
|
|
4
|
+
}
|
|
5
|
+
export declare function ModelResolver(options: Omit<ResolverOptions<any>, 'resolve'>): (target: any, propertyKey: string, descriptor: ModelResolverPropertyDescriptor) => void;
|
|
6
|
+
export interface ModelResolversOptions {
|
|
7
|
+
modelName?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function ModelResolvers(typedSchema: any, options?: ModelResolversOptions): ClassDecorator;
|
|
10
|
+
export declare function getServiceModelResolvers(target: any): {
|
|
11
|
+
[key: string]: {
|
|
12
|
+
[key: string]: ModelResolver<GlobalResolverResolve>;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getServiceModelResolvers = exports.ModelResolvers = exports.ModelResolver = void 0;
|
|
4
|
+
const services_1 = require("@orion-js/services");
|
|
5
|
+
const resolvers_1 = require("@orion-js/resolvers");
|
|
6
|
+
const helpers_1 = require("@orion-js/helpers");
|
|
7
|
+
function ModelResolver(options) {
|
|
8
|
+
return function (target, propertyKey, descriptor) {
|
|
9
|
+
if (!descriptor.value)
|
|
10
|
+
throw new Error(`You must pass resolver function to ${propertyKey}`);
|
|
11
|
+
target.resolvers = target.resolvers || {};
|
|
12
|
+
target.resolvers[propertyKey] = (0, resolvers_1.modelResolver)({
|
|
13
|
+
...options,
|
|
14
|
+
resolve: async (item, params, viewer) => {
|
|
15
|
+
const instance = (0, services_1.getInstance)(target.service);
|
|
16
|
+
return await instance[propertyKey](item, params, viewer);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
exports.ModelResolver = ModelResolver;
|
|
22
|
+
function ModelResolvers(typedSchema, options = {}) {
|
|
23
|
+
return function (target) {
|
|
24
|
+
(0, services_1.Service)()(target);
|
|
25
|
+
target.prototype.modelName = options.modelName || typedSchema.name;
|
|
26
|
+
if (!target.prototype.modelName) {
|
|
27
|
+
throw new Error(`The specified model has no name or is not a model`);
|
|
28
|
+
}
|
|
29
|
+
target.prototype.typedSchema = typedSchema;
|
|
30
|
+
target.prototype.service = target;
|
|
31
|
+
// @ts-expect-error this is a trick to make it work in resolvers without having to call getModelForClass
|
|
32
|
+
target.getModel = () => getModelForClass(target);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
exports.ModelResolvers = ModelResolvers;
|
|
36
|
+
function getServiceModelResolvers(target) {
|
|
37
|
+
if (!target.prototype) {
|
|
38
|
+
throw new helpers_1.UserError('You must pass a class to getResolvers');
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
[target.prototype.modelName]: target.prototype.resolvers || {}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
exports.getServiceModelResolvers = getServiceModelResolvers;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const services_1 = require("@orion-js/services");
|
|
16
|
+
const typed_model_1 = require("@orion-js/typed-model");
|
|
17
|
+
const model_1 = require("./model");
|
|
18
|
+
const http_1 = require("@orion-js/http");
|
|
19
|
+
const supertest_1 = __importDefault(require("supertest"));
|
|
20
|
+
const startGraphQL_1 = __importDefault(require("../startGraphQL"));
|
|
21
|
+
const cleanResolvers_1 = require("../cleanResolvers");
|
|
22
|
+
const global_1 = require("./global");
|
|
23
|
+
describe('Service with graphql models', () => {
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
(0, cleanResolvers_1.cleanResolvers)();
|
|
26
|
+
});
|
|
27
|
+
it('show allow to pass a service with resolvers to typed model', async () => {
|
|
28
|
+
let AgeRepo = class AgeRepo {
|
|
29
|
+
getAge(name) {
|
|
30
|
+
return `${name} is 100 years old`;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
AgeRepo = __decorate([
|
|
34
|
+
(0, services_1.Service)()
|
|
35
|
+
], AgeRepo);
|
|
36
|
+
let Person = class Person {
|
|
37
|
+
};
|
|
38
|
+
__decorate([
|
|
39
|
+
(0, typed_model_1.Prop)(),
|
|
40
|
+
__metadata("design:type", String)
|
|
41
|
+
], Person.prototype, "name", void 0);
|
|
42
|
+
Person = __decorate([
|
|
43
|
+
(0, typed_model_1.TypedSchema)()
|
|
44
|
+
], Person);
|
|
45
|
+
let PersonResolvers = class PersonResolvers {
|
|
46
|
+
async getAge(person) {
|
|
47
|
+
const result = this.repo.getAge(person.name);
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
__decorate([
|
|
52
|
+
(0, services_1.Inject)(),
|
|
53
|
+
__metadata("design:type", AgeRepo)
|
|
54
|
+
], PersonResolvers.prototype, "repo", void 0);
|
|
55
|
+
__decorate([
|
|
56
|
+
(0, model_1.ModelResolver)({ returns: String }),
|
|
57
|
+
__metadata("design:type", Function),
|
|
58
|
+
__metadata("design:paramtypes", [Person]),
|
|
59
|
+
__metadata("design:returntype", Promise)
|
|
60
|
+
], PersonResolvers.prototype, "getAge", null);
|
|
61
|
+
PersonResolvers = __decorate([
|
|
62
|
+
(0, model_1.ModelResolvers)(Person)
|
|
63
|
+
], PersonResolvers);
|
|
64
|
+
const data = (0, model_1.getServiceModelResolvers)(PersonResolvers);
|
|
65
|
+
const item = { name: 'Orion' };
|
|
66
|
+
const result = await data.Person.getAge.execute({ parent: item });
|
|
67
|
+
expect(result).toBe(`Orion is 100 years old`);
|
|
68
|
+
});
|
|
69
|
+
it('should startGraphQL and make a request', async () => {
|
|
70
|
+
let Person = class Person {
|
|
71
|
+
};
|
|
72
|
+
__decorate([
|
|
73
|
+
(0, typed_model_1.Prop)(),
|
|
74
|
+
__metadata("design:type", String)
|
|
75
|
+
], Person.prototype, "name", void 0);
|
|
76
|
+
Person = __decorate([
|
|
77
|
+
(0, typed_model_1.TypedSchema)()
|
|
78
|
+
], Person);
|
|
79
|
+
let PersonResolvers = class PersonResolvers {
|
|
80
|
+
async sayHi(person) {
|
|
81
|
+
return `My name is ${person.name}`;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
__decorate([
|
|
85
|
+
(0, model_1.ModelResolver)({ returns: String }),
|
|
86
|
+
__metadata("design:type", Function),
|
|
87
|
+
__metadata("design:paramtypes", [Person]),
|
|
88
|
+
__metadata("design:returntype", Promise)
|
|
89
|
+
], PersonResolvers.prototype, "sayHi", null);
|
|
90
|
+
PersonResolvers = __decorate([
|
|
91
|
+
(0, model_1.ModelResolvers)(Person)
|
|
92
|
+
], PersonResolvers);
|
|
93
|
+
let GlobalResolvers = class GlobalResolvers {
|
|
94
|
+
async person() {
|
|
95
|
+
return { name: 'Orion' };
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
__decorate([
|
|
99
|
+
(0, global_1.Query)({ returns: Person }),
|
|
100
|
+
__metadata("design:type", Function),
|
|
101
|
+
__metadata("design:paramtypes", []),
|
|
102
|
+
__metadata("design:returntype", Promise)
|
|
103
|
+
], GlobalResolvers.prototype, "person", null);
|
|
104
|
+
GlobalResolvers = __decorate([
|
|
105
|
+
(0, global_1.Resolvers)()
|
|
106
|
+
], GlobalResolvers);
|
|
107
|
+
const app = (0, http_1.express)();
|
|
108
|
+
await (0, startGraphQL_1.default)({
|
|
109
|
+
resolvers: (0, global_1.getServiceResolvers)(GlobalResolvers),
|
|
110
|
+
modelsResolvers: (0, model_1.getServiceModelResolvers)(PersonResolvers),
|
|
111
|
+
app
|
|
112
|
+
});
|
|
113
|
+
const response = await (0, supertest_1.default)(app)
|
|
114
|
+
.post('/graphql')
|
|
115
|
+
.send({
|
|
116
|
+
operationName: 'testOperation',
|
|
117
|
+
query: `query testOperation {
|
|
118
|
+
person {
|
|
119
|
+
sayHi
|
|
120
|
+
}
|
|
121
|
+
}`
|
|
122
|
+
});
|
|
123
|
+
expect(response.statusCode).toBe(200);
|
|
124
|
+
expect(response.body.data).toEqual({ person: { sayHi: 'My name is Orion' } });
|
|
125
|
+
});
|
|
126
|
+
});
|
package/lib/startGraphQL.test.js
CHANGED
|
@@ -116,7 +116,7 @@ describe('Test GraphQL Server', () => {
|
|
|
116
116
|
__metadata("design:type", String)
|
|
117
117
|
], Params.prototype, "userId", void 0);
|
|
118
118
|
Params = __decorate([
|
|
119
|
-
(0, typed_model_1.
|
|
119
|
+
(0, typed_model_1.TypedSchema)()
|
|
120
120
|
], Params);
|
|
121
121
|
let User = class User {
|
|
122
122
|
};
|
|
@@ -129,7 +129,7 @@ describe('Test GraphQL Server', () => {
|
|
|
129
129
|
__metadata("design:type", Number)
|
|
130
130
|
], User.prototype, "age", void 0);
|
|
131
131
|
User = __decorate([
|
|
132
|
-
(0, typed_model_1.
|
|
132
|
+
(0, typed_model_1.TypedSchema)()
|
|
133
133
|
], User);
|
|
134
134
|
const resolve = async ({ userId }) => {
|
|
135
135
|
if (userId !== '1')
|
|
@@ -73,7 +73,7 @@ const getStartServerOptions = async () => {
|
|
|
73
73
|
__metadata("design:type", String)
|
|
74
74
|
], TestParams.prototype, "userId", void 0);
|
|
75
75
|
TestParams = __decorate([
|
|
76
|
-
(0, typed_model_1.
|
|
76
|
+
(0, typed_model_1.TypedSchema)()
|
|
77
77
|
], TestParams);
|
|
78
78
|
let TestModel = class TestModel {
|
|
79
79
|
};
|
|
@@ -86,7 +86,7 @@ const getStartServerOptions = async () => {
|
|
|
86
86
|
__metadata("design:type", Number)
|
|
87
87
|
], TestModel.prototype, "age", void 0);
|
|
88
88
|
TestModel = __decorate([
|
|
89
|
-
(0, typed_model_1.
|
|
89
|
+
(0, typed_model_1.TypedSchema)()
|
|
90
90
|
], TestModel);
|
|
91
91
|
const modelSub = (0, _1.subscription)({
|
|
92
92
|
params: (0, typed_model_1.getModelForClass)(TestParams),
|
|
@@ -104,7 +104,7 @@ const getStartServerOptions = async () => {
|
|
|
104
104
|
resolvers,
|
|
105
105
|
subscriptions
|
|
106
106
|
});
|
|
107
|
-
return { apolloOptions, subscriptions };
|
|
107
|
+
return { apolloOptions, resolvers, subscriptions };
|
|
108
108
|
};
|
|
109
109
|
const gqClient = async () => {
|
|
110
110
|
// To make the point clear that we are not opening any ports here we use a randomized string that will not produce a correct port number.
|
|
@@ -1,14 +1,21 @@
|
|
|
1
|
-
import { GlobalResolversMap } from '@orion-js/models';
|
|
1
|
+
import { GlobalResolversMap, ModelResolversMap } from '@orion-js/models';
|
|
2
2
|
import { express } from '@orion-js/http';
|
|
3
3
|
import { SubscriptionMap } from './subscription';
|
|
4
4
|
import { GraphQLOptions } from 'apollo-server-core';
|
|
5
5
|
export declare type ExecuteGraphQLCache = (req: express.Request, res: express.Response, viewer: object, executeQuery: () => Promise<string>) => Promise<string>;
|
|
6
|
+
export interface ModelsResolversMap {
|
|
7
|
+
[key: string]: ModelResolversMap;
|
|
8
|
+
}
|
|
6
9
|
declare type SchemaOmits = 'schema' | 'schemaHash' | 'context' | 'useGraphiql';
|
|
7
10
|
export interface StartGraphQLOptions extends Omit<GraphQLOptions, SchemaOmits> {
|
|
8
11
|
/**
|
|
9
12
|
* A map with all the global resolvers
|
|
10
13
|
*/
|
|
11
14
|
resolvers: GlobalResolversMap;
|
|
15
|
+
/**
|
|
16
|
+
* A map with all the models resolvers. You must only add the models that you want to extend with resolvers.
|
|
17
|
+
*/
|
|
18
|
+
modelsResolvers?: ModelsResolversMap;
|
|
12
19
|
/**
|
|
13
20
|
* A Map with all global subscriptions
|
|
14
21
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orion-js/graphql",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.7",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"author": "nicolaslopezj",
|
|
6
6
|
"license": "MIT",
|
|
@@ -45,5 +45,5 @@
|
|
|
45
45
|
"publishConfig": {
|
|
46
46
|
"access": "public"
|
|
47
47
|
},
|
|
48
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "e46b899b76158da8ec8fedc6e9e39fdd728835d2"
|
|
49
49
|
}
|