@orion-js/resolvers 3.0.0-alpha.20 → 3.0.6

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/index.d.ts CHANGED
@@ -1,3 +1,7 @@
1
- import resolver from './resolver';
1
+ import { resolver, modelResolver } from './resolver';
2
2
  export * from './resolver/types';
3
- export { resolver };
3
+ import checkPermissions from './resolver/getExecute/checkPermissions';
4
+ import { addPermissionChecker } from './resolver/permisionsCheckers';
5
+ import cleanParams from './resolver/cleanParams';
6
+ import cleanReturns from './resolver/cleanReturns';
7
+ export { resolver, modelResolver, checkPermissions, addPermissionChecker, cleanParams, cleanReturns };
package/lib/index.js CHANGED
@@ -13,7 +13,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
13
  return (mod && mod.__esModule) ? mod : { "default": mod };
14
14
  };
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.resolver = void 0;
17
- const resolver_1 = __importDefault(require("./resolver"));
18
- exports.resolver = resolver_1.default;
16
+ exports.cleanReturns = exports.cleanParams = exports.addPermissionChecker = exports.checkPermissions = exports.modelResolver = exports.resolver = void 0;
17
+ const resolver_1 = require("./resolver");
18
+ Object.defineProperty(exports, "resolver", { enumerable: true, get: function () { return resolver_1.resolver; } });
19
+ Object.defineProperty(exports, "modelResolver", { enumerable: true, get: function () { return resolver_1.modelResolver; } });
19
20
  __exportStar(require("./resolver/types"), exports);
21
+ const checkPermissions_1 = __importDefault(require("./resolver/getExecute/checkPermissions"));
22
+ exports.checkPermissions = checkPermissions_1.default;
23
+ const permisionsCheckers_1 = require("./resolver/permisionsCheckers");
24
+ Object.defineProperty(exports, "addPermissionChecker", { enumerable: true, get: function () { return permisionsCheckers_1.addPermissionChecker; } });
25
+ const cleanParams_1 = __importDefault(require("./resolver/cleanParams"));
26
+ exports.cleanParams = cleanParams_1.default;
27
+ const cleanReturns_1 = __importDefault(require("./resolver/cleanReturns"));
28
+ exports.cleanReturns = cleanReturns_1.default;
@@ -7,6 +7,10 @@ const clone_1 = __importDefault(require("lodash/clone"));
7
7
  function default_1(rawParams) {
8
8
  if (!rawParams)
9
9
  return;
10
+ // for typed model
11
+ if (rawParams.getModel) {
12
+ rawParams = rawParams.getModel();
13
+ }
10
14
  if (rawParams.__isModel) {
11
15
  rawParams = rawParams.getSchema();
12
16
  }
@@ -0,0 +1 @@
1
+ export default function (rawReturns: any): any;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function default_1(rawReturns) {
4
+ if (!rawReturns)
5
+ return;
6
+ // for typed model
7
+ if (rawReturns.getModel) {
8
+ return rawReturns.getModel();
9
+ }
10
+ return rawReturns;
11
+ }
12
+ exports.default = default_1;
@@ -0,0 +1,9 @@
1
+ export declare const getArgs: (...args: any[]) => {
2
+ parent: any;
3
+ params: any;
4
+ viewer: any;
5
+ } | {
6
+ params: any;
7
+ viewer: any;
8
+ parent?: undefined;
9
+ };
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getArgs = void 0;
4
+ const getArgs = function getArgs(...args) {
5
+ if (args.length === 3) {
6
+ return {
7
+ parent: args[0],
8
+ params: args[1] || {},
9
+ viewer: args[2] || {}
10
+ };
11
+ }
12
+ else if (args.length < 3) {
13
+ return {
14
+ params: args[0] || {},
15
+ viewer: args[1] || {}
16
+ };
17
+ }
18
+ else {
19
+ throw new Error('A resolver must be called with 2 parameters only');
20
+ }
21
+ };
22
+ exports.getArgs = getArgs;
@@ -6,9 +6,11 @@ async function default_1(executeOptions, options) {
6
6
  const { parent, params, viewer } = executeOptions;
7
7
  if (viewer.app)
8
8
  return;
9
- await (0, permisionsCheckers_1.checkPermissions)(options.permissionsOptions, viewer, {
9
+ await (0, permisionsCheckers_1.checkPermissions)({
10
+ resolver: options,
10
11
  parent,
11
- params
12
+ params,
13
+ viewer
12
14
  });
13
15
  if (options.checkPermission) {
14
16
  const execute = async () => {
@@ -1,2 +1,2 @@
1
1
  import { ResolverOptions, Execute } from '../types';
2
- export default function (options: ResolverOptions): Execute<any>;
2
+ export default function (options: ResolverOptions): Execute<import("../types").Params, any, undefined>;
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const isArray_1 = __importDefault(require("lodash/isArray"));
7
7
  const isNil_1 = __importDefault(require("lodash/isNil"));
8
8
  function default_1(options, result) {
9
- const { returns } = options;
9
+ let { returns } = options;
10
10
  if (returns) {
11
11
  if ((0, isArray_1.default)(returns) && returns[0].__isModel) {
12
12
  if ((0, isNil_1.default)(result)) {
@@ -1,3 +1,5 @@
1
1
  import { CreateResolver } from './types';
2
+ import { CreateModelResolver } from '..';
2
3
  declare const resolver: CreateResolver;
3
- export default resolver;
4
+ declare const modelResolver: CreateModelResolver;
5
+ export { resolver, modelResolver };
@@ -3,24 +3,36 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.modelResolver = exports.resolver = void 0;
6
7
  const getExecute_1 = __importDefault(require("./getExecute"));
7
8
  const cleanParams_1 = __importDefault(require("./cleanParams"));
8
9
  const helpers_1 = require("@orion-js/helpers");
9
10
  const cache_1 = require("@orion-js/cache");
10
- const resolver = function (options) {
11
+ const cleanReturns_1 = __importDefault(require("./cleanReturns"));
12
+ const getArgs_1 = require("./getArgs");
13
+ const createResolver = function (options) {
11
14
  options.params = (0, cleanParams_1.default)(options.params);
15
+ options.returns = (0, cleanReturns_1.default)(options.returns);
12
16
  if (!options.cacheProvider) {
13
17
  options.cacheProvider = cache_1.defaultCache;
14
18
  }
15
19
  if (!options.resolverId) {
16
20
  options.resolverId = (0, helpers_1.generateId)();
17
21
  }
18
- const resolve = options.resolve;
22
+ const execute = (0, getExecute_1.default)(options);
23
+ const resolve = async (...args) => {
24
+ let { parent, params, viewer } = (0, getArgs_1.getArgs)(...args);
25
+ const executeOptions = { parent, params, viewer };
26
+ return await execute(executeOptions);
27
+ };
19
28
  const resolver = {
20
29
  ...options,
21
30
  resolve,
22
- execute: (0, getExecute_1.default)(options)
31
+ execute
23
32
  };
24
33
  return resolver;
25
34
  };
26
- exports.default = resolver;
35
+ const resolver = createResolver;
36
+ exports.resolver = resolver;
37
+ const modelResolver = createResolver;
38
+ exports.modelResolver = modelResolver;
@@ -1,21 +1,19 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const index_1 = __importDefault(require("./index"));
3
+ const index_1 = require("./index");
7
4
  it('should return a function with a resolver id', () => {
8
- const resolver = (0, index_1.default)({
5
+ const resolver = (0, index_1.resolver)({
9
6
  params: {},
10
7
  returns: String,
11
8
  async resolve(params, viewer) { }
12
9
  });
13
10
  expect(typeof resolver).toBe('object');
11
+ expect(typeof resolver.resolve).toBe('function');
14
12
  expect(typeof resolver.execute).toBe('function');
15
13
  expect(typeof resolver.resolverId).toBe('string');
16
14
  });
17
15
  it('should execute the function', async () => {
18
- const resolver = (0, index_1.default)({
16
+ const resolver = (0, index_1.resolver)({
19
17
  params: {
20
18
  value: {
21
19
  type: Number
@@ -31,7 +29,7 @@ it('should execute the function', async () => {
31
29
  });
32
30
  it('should get from cache', async () => {
33
31
  let index = 1;
34
- const resolver = (0, index_1.default)({
32
+ const resolver = (0, index_1.resolver)({
35
33
  params: {
36
34
  value: {
37
35
  type: Number
@@ -55,39 +53,35 @@ it('should get from cache', async () => {
55
53
  expect(result5).toBe(3);
56
54
  });
57
55
  it('should create typed resolvers', async () => {
58
- const resolve = async (params) => {
59
- return params.value * 2;
60
- };
61
- const resolver = (0, index_1.default)({
56
+ const resolver = (0, index_1.resolver)({
62
57
  params: {
63
58
  value: {
64
59
  type: Number
65
60
  }
66
61
  },
67
62
  returns: Number,
68
- resolve
63
+ resolve: async (params, viewer) => {
64
+ return params.value * 2;
65
+ }
69
66
  });
70
- const result = await resolver.execute({ params: { value: 2 } });
71
- expect(result).toBe(4);
67
+ const result1 = await resolver.resolve({
68
+ value: 2
69
+ });
70
+ const result2 = await resolver.execute({
71
+ params: { value: 2 }
72
+ });
73
+ expect(result1).toBe(4);
74
+ expect(result2).toBe(4);
72
75
  });
73
76
  it('should create typed model resolvers', async () => {
74
- const resolver = (0, index_1.default)({
75
- params: {
76
- value: {
77
- type: Number
78
- }
79
- },
77
+ const resolver = (0, index_1.modelResolver)({
80
78
  returns: Number,
81
- resolve: async function (model, params) {
79
+ resolve: async function (model, params, viewer) {
82
80
  return model.value * 2;
83
81
  }
84
82
  });
85
- const inModel = resolver.resolve;
86
- const inModelResult = await inModel({ value: 2 });
87
- /**
88
- * We are testing the typescript removes one argument on the resolve function.
89
- */
90
- expect(inModelResult).toBe(4);
83
+ resolver.resolve({}, { value: '' });
84
+ const inModel = resolver.modelResolve;
91
85
  });
92
86
  it('should accept a model as params', async () => {
93
87
  const aModel = {
@@ -99,27 +93,73 @@ it('should accept a model as params', async () => {
99
93
  type: 'string'
100
94
  }
101
95
  };
96
+ },
97
+ initItem(item) {
98
+ return item;
102
99
  }
103
100
  };
104
- const resolver = (0, index_1.default)({
105
- params: aModel,
101
+ class TypedParams {
102
+ static getModel() {
103
+ return aModel;
104
+ }
105
+ }
106
+ const resolver = (0, index_1.modelResolver)({
107
+ params: TypedParams,
106
108
  returns: Number,
107
- resolve: async function (params) {
109
+ resolve: async function (item, params, viewer) {
108
110
  return params.value * 2;
109
111
  }
110
112
  });
111
- const inModel = resolver.resolve;
112
- const inModelResult = await inModel({ value: 2 });
113
- /**
114
- * We are testing the typescript removes one argument on the resolve function.
115
- */
116
- expect(inModelResult).toBe(4);
113
+ const inModel = resolver.modelResolve;
114
+ });
115
+ it('should accept a model as returns', async () => {
116
+ const aModel = {
117
+ __isModel: true,
118
+ name: 'Returns',
119
+ getSchema() {
120
+ return {
121
+ value: {
122
+ type: 'string'
123
+ }
124
+ };
125
+ },
126
+ initItem(item) {
127
+ return item;
128
+ }
129
+ };
130
+ class Returns {
131
+ static getModel() {
132
+ return aModel;
133
+ }
134
+ }
135
+ const resolver = (0, index_1.resolver)({
136
+ returns: Returns,
137
+ resolve: async (params, viewer) => {
138
+ return { value: 2 };
139
+ }
140
+ });
141
+ const result = await resolver.resolve({});
142
+ expect(result.value).toBe(2);
117
143
  });
118
144
  it('should correctly clean params when no params are passed', async () => {
119
- const resolver = (0, index_1.default)({
145
+ const resolver = (0, index_1.resolver)({
120
146
  resolve: async ({ title }) => {
121
147
  return `${title}`;
122
148
  }
123
149
  });
124
150
  expect(await resolver.execute({ params: { title: 'test' } })).toBe('test');
125
151
  });
152
+ it('should allow calling resolver.resolve', async () => {
153
+ const resolver = (0, index_1.resolver)({
154
+ resolve: async ({ title }) => {
155
+ return `${title}`;
156
+ }
157
+ });
158
+ const modelResolver = (0, index_1.modelResolver)({
159
+ resolve: async ({ title }) => {
160
+ return `${title}`;
161
+ }
162
+ });
163
+ expect(await resolver.resolve({ title: 'test' })).toBe('test');
164
+ expect(await modelResolver.resolve({ title: 'test' })).toBe('test');
165
+ });
@@ -1,2 +1,3 @@
1
- export declare const addPermissionChecker: (func: any) => void;
2
- export declare const checkPermissions: (...args: any[]) => Promise<void>;
1
+ import { PermissionChecker, PermissionCheckerOptions } from './types';
2
+ export declare const addPermissionChecker: (func: PermissionChecker) => void;
3
+ export declare const checkPermissions: (options: PermissionCheckerOptions) => Promise<void>;
@@ -2,14 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.checkPermissions = exports.addPermissionChecker = void 0;
4
4
  const helpers_1 = require("@orion-js/helpers");
5
- const checkers = [];
5
+ global.checkers = [];
6
6
  const addPermissionChecker = function (func) {
7
- checkers.push(func);
7
+ global.checkers.push(func);
8
8
  };
9
9
  exports.addPermissionChecker = addPermissionChecker;
10
- const checkPermissions = async function (...args) {
11
- for (const checker of checkers) {
12
- const errorMessage = await checker(...args);
10
+ const checkPermissions = async function (options) {
11
+ for (const checker of global.checkers) {
12
+ const errorMessage = await checker(options);
13
13
  if (errorMessage) {
14
14
  throw new helpers_1.PermissionsError(errorMessage);
15
15
  }
@@ -1,6 +1,6 @@
1
1
  import { OrionCache } from '@orion-js/cache';
2
- export declare type GlobalResolve<T = Promise<any>> = (params: any, viewer: any) => T;
3
- export declare type ModelResolve<T = Promise<any>> = (parent: any, params: any, viewer?: any) => T;
2
+ export declare type GlobalResolverResolve<ParamsType = any, ReturnType = any> = (params?: ParamsType, viewer?: any) => Promise<ReturnType>;
3
+ export declare type ModelResolverResolve<ModelType = any, ParamsType = any, ReturnType = any> = (item: ModelType, params?: ParamsType, viewer?: any) => Promise<ReturnType>;
4
4
  export declare type GlobalCheckPermissions = (params: any, viewer: any) => Promise<string>;
5
5
  export declare type ModelCheckPermissions = (parent: any, params: any, viewer: any) => Promise<string>;
6
6
  export declare type GlobalGetCacheKey = (params: any, viewer: any) => Promise<any>;
@@ -13,15 +13,15 @@ export interface ExecuteOptions {
13
13
  viewer: any;
14
14
  parent?: any;
15
15
  }
16
- export interface ExecuteParams {
17
- params?: Params;
16
+ export interface ExecuteParams<ParamsType extends Params = Params, ModelType = undefined> {
17
+ params?: ParamsType;
18
18
  viewer?: any;
19
- parent?: any;
19
+ parent?: ModelType;
20
20
  }
21
- export declare type Execute<ReturnType = any> = (executeOptions: ExecuteParams) => Promise<ReturnType>;
21
+ export declare type Execute<ParamsType = Params, ReturnType = any, ModelType = undefined> = (executeOptions: ExecuteParams<ParamsType, ModelType>) => Promise<ReturnType>;
22
22
  export interface SharedResolverOptions {
23
23
  resolverId?: string;
24
- params?: Params;
24
+ params?: any;
25
25
  returns?: any;
26
26
  mutation?: boolean;
27
27
  private?: boolean;
@@ -31,15 +31,24 @@ export interface SharedResolverOptions {
31
31
  cacheProvider?: OrionCache;
32
32
  permissionsOptions?: any;
33
33
  }
34
- export interface ResolverOptions extends SharedResolverOptions {
35
- resolve: GlobalResolve | ModelResolve;
34
+ export interface ResolverOptions<ParamsType extends Params = Params, ReturnType = any, ModelType = undefined> extends SharedResolverOptions {
35
+ resolve: ModelType extends undefined ? GlobalResolverResolve<ParamsType, ReturnType> : ModelResolverResolve<ModelType, Params, ReturnType>;
36
+ }
37
+ export interface Resolver<ParamsType = any, ReturnType = any, ModelType = undefined> extends SharedResolverOptions {
38
+ execute: Execute<ParamsType, ReturnType, ModelType>;
39
+ resolve: ModelType extends undefined ? GlobalResolverResolve<ParamsType, ReturnType> : ModelResolverResolve<ModelType, Params, ReturnType>;
40
+ modelResolve?: ModelType extends undefined ? undefined : GlobalResolverResolve<ParamsType, ReturnType>;
36
41
  }
37
- declare type AnyFunction = (...args: any) => any;
38
- export interface Resolver<ResolveFunction extends AnyFunction = AnyFunction> extends SharedResolverOptions {
39
- execute: Execute<ReturnType<ResolveFunction>>;
40
- resolve: ResolveFunction;
42
+ export declare type CreateResolver = <ParamsType, ReturnType>(options: {
43
+ resolve: (params?: ParamsType, viewer?: any) => Promise<ReturnType>;
44
+ } & ResolverOptions<ParamsType, ReturnType>) => Resolver<ParamsType, ReturnType, undefined>;
45
+ export declare type CreateModelResolver = <ModelType, ParamsType, ReturnType>(options: {
46
+ resolve: (item: ModelType, params?: ParamsType, viewer?: any) => Promise<ReturnType>;
47
+ } & ResolverOptions<ParamsType, ReturnType, ModelType>) => Resolver<ParamsType, ReturnType, ModelType>;
48
+ export interface PermissionCheckerOptions {
49
+ resolver: ResolverOptions;
50
+ parent: any;
51
+ params: any;
52
+ viewer: any;
41
53
  }
42
- export declare type CreateResolver = <ResolveFunction extends AnyFunction>(options: ResolverOptions) => Resolver<ResolveFunction>;
43
- declare type OmitFirstArg<F> = F extends (x: any, ...args: infer P) => infer R ? (...args: P) => R : never;
44
- export declare type ModelResolverFunction<F extends ModelResolve> = OmitFirstArg<F>;
45
- export {};
54
+ export declare type PermissionChecker = (options: PermissionCheckerOptions) => Promise<string | void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orion-js/resolvers",
3
- "version": "3.0.0-alpha.20",
3
+ "version": "3.0.6",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "files": [
@@ -16,9 +16,9 @@
16
16
  "watch": "yarn run clean && tsc -w"
17
17
  },
18
18
  "dependencies": {
19
- "@orion-js/cache": "^3.0.0-alpha.10",
20
- "@orion-js/helpers": "^3.0.0-alpha.11",
21
- "@orion-js/schema": "^3.0.0-alpha.13"
19
+ "@orion-js/cache": "^3.0.0-alpha.23",
20
+ "@orion-js/helpers": "^3.0.0",
21
+ "@orion-js/schema": "^3.0.0"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@shelf/jest-mongodb": "^2.1.0",
@@ -31,5 +31,5 @@
31
31
  "publishConfig": {
32
32
  "access": "public"
33
33
  },
34
- "gitHead": "145e17f5a9d6bbf02f166c5faa416be60752a42f"
34
+ "gitHead": "91b207f9f7afa418177b5aeace2e5f9b0a0ef04d"
35
35
  }