@kiwano/core 0.0.1 → 0.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/Builder.js +2 -2
- package/argument.d.ts +4 -0
- package/argument.js +28 -11
- package/enumType.js +7 -10
- package/enumValue.js +5 -7
- package/field.d.ts +4 -0
- package/field.js +33 -13
- package/inputField.d.ts +4 -0
- package/inputField.js +28 -11
- package/inputObjectType.js +7 -10
- package/objectType.js +7 -10
- package/package.json +8 -5
- package/plugin/MultiPlugin.d.ts +16 -16
- package/plugin/MultiPlugin.js +32 -32
- package/plugin/acl/{Acl.d.ts → acl.d.ts} +16 -8
- package/plugin/acl/{Acl.js → acl.js} +49 -25
- package/plugin/acl/index.d.ts +1 -4
- package/plugin/acl/index.js +1 -7
- package/plugin/acl/middleware.d.ts +3 -3
- package/plugin/acl/middleware.js +10 -13
- package/plugin/common.d.ts +16 -16
- package/plugin/filter/equals.d.ts +2 -2
- package/plugin/filter/equals.js +3 -4
- package/plugin/filter/search.d.ts +2 -2
- package/plugin/filter/search.js +3 -7
- package/plugin/pagination/connection.d.ts +2 -2
- package/plugin/pagination/connection.js +1 -2
- package/plugin/pagination/firstAfter.d.ts +2 -2
- package/plugin/pagination/firstAfter.js +1 -2
- package/plugin/pagination/items.d.ts +2 -2
- package/plugin/pagination/items.js +1 -2
- package/plugin/pagination/offsetLimit.d.ts +2 -2
- package/plugin/pagination/offsetLimit.js +1 -2
- package/plugin/sort/sort.d.ts +2 -2
- package/plugin/sort/sort.js +3 -4
- package/schema.js +22 -25
- package/unionType.js +6 -9
- package/util.d.ts +7 -0
- package/util.js +22 -11
- package/plugin/acl/plugin.d.ts +0 -15
- package/plugin/acl/plugin.js +0 -50
package/plugin/MultiPlugin.js
CHANGED
|
@@ -94,53 +94,53 @@ class MultiPlugin {
|
|
|
94
94
|
afterBuildSchema(builder, schema) {
|
|
95
95
|
this.executeSync('afterBuildSchema', plugin => plugin.afterBuildSchema(builder, schema));
|
|
96
96
|
}
|
|
97
|
-
beforeBuildObjectType(builder, context) {
|
|
98
|
-
this.executeSync('beforeBuildObjectType', plugin => plugin.beforeBuildObjectType(builder, context));
|
|
97
|
+
beforeBuildObjectType(builder, context, info) {
|
|
98
|
+
this.executeSync('beforeBuildObjectType', plugin => plugin.beforeBuildObjectType(builder, context, info));
|
|
99
99
|
}
|
|
100
|
-
afterBuildObjectType(builder, context, objectType) {
|
|
101
|
-
this.executeSync('afterBuildObjectType', plugin => plugin.afterBuildObjectType(builder, context, objectType));
|
|
100
|
+
afterBuildObjectType(builder, context, info, objectType) {
|
|
101
|
+
this.executeSync('afterBuildObjectType', plugin => plugin.afterBuildObjectType(builder, context, info, objectType));
|
|
102
102
|
}
|
|
103
|
-
beforeBuildInputObjectType(builder, context) {
|
|
104
|
-
this.executeSync('beforeBuildInputObjectType', plugin => plugin.beforeBuildInputObjectType(builder, context));
|
|
103
|
+
beforeBuildInputObjectType(builder, context, info) {
|
|
104
|
+
this.executeSync('beforeBuildInputObjectType', plugin => plugin.beforeBuildInputObjectType(builder, context, info));
|
|
105
105
|
}
|
|
106
|
-
afterBuildInputObjectType(builder, context, inputObjectType) {
|
|
107
|
-
this.executeSync('afterBuildInputObjectType', plugin => plugin.afterBuildInputObjectType(builder, context, inputObjectType));
|
|
106
|
+
afterBuildInputObjectType(builder, context, info, inputObjectType) {
|
|
107
|
+
this.executeSync('afterBuildInputObjectType', plugin => plugin.afterBuildInputObjectType(builder, context, info, inputObjectType));
|
|
108
108
|
}
|
|
109
|
-
beforeBuildEnumType(builder, context) {
|
|
110
|
-
this.executeSync('beforeBuildEnumType', plugin => plugin.beforeBuildEnumType(builder, context));
|
|
109
|
+
beforeBuildEnumType(builder, context, info) {
|
|
110
|
+
this.executeSync('beforeBuildEnumType', plugin => plugin.beforeBuildEnumType(builder, context, info));
|
|
111
111
|
}
|
|
112
|
-
afterBuildEnumType(builder, context, enumType) {
|
|
113
|
-
this.executeSync('afterBuildEnumType', plugin => plugin.afterBuildEnumType(builder, context, enumType));
|
|
112
|
+
afterBuildEnumType(builder, context, info, enumType) {
|
|
113
|
+
this.executeSync('afterBuildEnumType', plugin => plugin.afterBuildEnumType(builder, context, info, enumType));
|
|
114
114
|
}
|
|
115
|
-
beforeBuildEnumValue(builder, context) {
|
|
116
|
-
this.executeSync('beforeBuildEnumValue', plugin => plugin.beforeBuildEnumValue(builder, context));
|
|
115
|
+
beforeBuildEnumValue(builder, context, info) {
|
|
116
|
+
this.executeSync('beforeBuildEnumValue', plugin => plugin.beforeBuildEnumValue(builder, context, info));
|
|
117
117
|
}
|
|
118
|
-
afterBuildEnumValue(builder, context, enumValue) {
|
|
119
|
-
this.executeSync('afterBuildEnumValue', plugin => plugin.afterBuildEnumValue(builder, context, enumValue));
|
|
118
|
+
afterBuildEnumValue(builder, context, info, enumValue) {
|
|
119
|
+
this.executeSync('afterBuildEnumValue', plugin => plugin.afterBuildEnumValue(builder, context, info, enumValue));
|
|
120
120
|
}
|
|
121
|
-
beforeBuildUnionType(builder, context) {
|
|
122
|
-
this.executeSync('beforeBuildUnionType', plugin => plugin.beforeBuildUnionType(builder, context));
|
|
121
|
+
beforeBuildUnionType(builder, context, info) {
|
|
122
|
+
this.executeSync('beforeBuildUnionType', plugin => plugin.beforeBuildUnionType(builder, context, info));
|
|
123
123
|
}
|
|
124
|
-
afterBuildUnionType(builder, context, unionType) {
|
|
125
|
-
this.executeSync('afterBuildUnionType', plugin => plugin.afterBuildUnionType(builder, context, unionType));
|
|
124
|
+
afterBuildUnionType(builder, context, info, unionType) {
|
|
125
|
+
this.executeSync('afterBuildUnionType', plugin => plugin.afterBuildUnionType(builder, context, info, unionType));
|
|
126
126
|
}
|
|
127
|
-
beforeBuildField(builder, context) {
|
|
128
|
-
this.executeSync('beforeBuildField', plugin => plugin.beforeBuildField(builder, context));
|
|
127
|
+
beforeBuildField(builder, context, info) {
|
|
128
|
+
this.executeSync('beforeBuildField', plugin => plugin.beforeBuildField(builder, context, info));
|
|
129
129
|
}
|
|
130
|
-
afterBuildField(builder, context, field) {
|
|
131
|
-
this.executeSync('afterBuildField', plugin => plugin.afterBuildField(builder, context, field));
|
|
130
|
+
afterBuildField(builder, context, info, field) {
|
|
131
|
+
this.executeSync('afterBuildField', plugin => plugin.afterBuildField(builder, context, info, field));
|
|
132
132
|
}
|
|
133
|
-
beforeBuildInputField(builder, context) {
|
|
134
|
-
this.executeSync('beforeBuildInputField', plugin => plugin.beforeBuildInputField(builder, context));
|
|
133
|
+
beforeBuildInputField(builder, context, info) {
|
|
134
|
+
this.executeSync('beforeBuildInputField', plugin => plugin.beforeBuildInputField(builder, context, info));
|
|
135
135
|
}
|
|
136
|
-
afterBuildInputField(builder, context, inputField) {
|
|
137
|
-
this.executeSync('afterBuildInputField', plugin => plugin.afterBuildInputField(builder, context, inputField));
|
|
136
|
+
afterBuildInputField(builder, context, info, inputField) {
|
|
137
|
+
this.executeSync('afterBuildInputField', plugin => plugin.afterBuildInputField(builder, context, info, inputField));
|
|
138
138
|
}
|
|
139
|
-
beforeBuildArgument(builder, context) {
|
|
140
|
-
this.executeSync('beforeBuildArgument', plugin => plugin.beforeBuildArgument(builder, context));
|
|
139
|
+
beforeBuildArgument(builder, context, info) {
|
|
140
|
+
this.executeSync('beforeBuildArgument', plugin => plugin.beforeBuildArgument(builder, context, info));
|
|
141
141
|
}
|
|
142
|
-
afterBuildArgument(builder, context, argument) {
|
|
143
|
-
this.executeSync('afterBuildArgument', plugin => plugin.afterBuildArgument(builder, context, argument));
|
|
142
|
+
afterBuildArgument(builder, context, info, argument) {
|
|
143
|
+
this.executeSync('afterBuildArgument', plugin => plugin.afterBuildArgument(builder, context, info, argument));
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
146
|
exports.MultiPlugin = MultiPlugin;
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { AclMiddlewareOptions } from "./middleware";
|
|
2
|
+
import { Plugin } from "../common";
|
|
3
|
+
import { SchemaBuilder } from "../../schema";
|
|
4
|
+
import { GraphQLSchema } from "graphql";
|
|
1
5
|
export declare type AclRoleIdentifier = string | number;
|
|
2
6
|
interface AclRoleConfig {
|
|
3
7
|
identifier: AclRoleIdentifier;
|
|
@@ -17,16 +21,17 @@ export interface AclValidateConfig {
|
|
|
17
21
|
allowedRoles?: AclRoleIdentifier[];
|
|
18
22
|
}
|
|
19
23
|
export declare type AclValidateConfigType = AclValidateConfig | AclRoleIdentifier | AclRoleIdentifier[];
|
|
20
|
-
export interface AclOptions {
|
|
24
|
+
export interface AclOptions extends AclMiddlewareOptions {
|
|
21
25
|
defaultAction?: AclAction;
|
|
22
26
|
learn?: boolean;
|
|
23
27
|
}
|
|
24
28
|
export declare const defaultAclOptions: AclOptions;
|
|
25
|
-
export declare
|
|
26
|
-
protected _options:
|
|
29
|
+
export declare class AclPlugin implements Plugin {
|
|
30
|
+
protected _options: AclOptions;
|
|
27
31
|
protected _roles: Map<AclRoleIdentifier, AclRoleConfig>;
|
|
28
32
|
protected _allowRules: Map<string, AclRuleConfig>;
|
|
29
33
|
protected _denyRules: Map<string, AclRuleConfig>;
|
|
34
|
+
constructor(options?: AclOptions);
|
|
30
35
|
defaultAction(action: AclAction): this;
|
|
31
36
|
learn(learn?: boolean): this;
|
|
32
37
|
role(identifier: AclRoleIdentifier, parent?: AclRoleIdentifier): this;
|
|
@@ -35,13 +40,16 @@ export declare abstract class AbstractAcl<OT extends AclOptions> {
|
|
|
35
40
|
isAllowed(role: AclRoleIdentifier, resource: string): boolean;
|
|
36
41
|
isRoleIncluded(role: AclRoleIdentifier, compareRoles: Set<AclRoleIdentifier>): boolean;
|
|
37
42
|
validate(config: AclValidateConfigType, role?: string): boolean;
|
|
38
|
-
middleware(config?: AclValidateConfigType): any;
|
|
43
|
+
middleware(config?: AclValidateConfigType): (req: any, res: any, next: any) => void;
|
|
44
|
+
rolePath(path: string): this;
|
|
45
|
+
onForbidden(handler: (resource: string) => void): this;
|
|
46
|
+
beforeBuildSchema(builder: SchemaBuilder): void;
|
|
47
|
+
afterBuildSchema(builder: SchemaBuilder, schema: GraphQLSchema): void;
|
|
48
|
+
protected addRules(resource: string, allowed: Set<string>, denied: Set<string>): void;
|
|
39
49
|
protected _findRules(resource: string, collection: Map<string, AclRuleConfig>): AclRuleConfig[];
|
|
40
50
|
protected _learnRoles(roles: Set<AclRoleIdentifier>): void;
|
|
41
51
|
protected _getRoleList(roleConfig: AclRoleConfig): AclRoleIdentifier[];
|
|
42
52
|
protected _getRuleConfig(name: string, roles: Set<AclRoleIdentifier>): AclRuleConfig;
|
|
43
53
|
}
|
|
44
|
-
export declare
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
export default Acl;
|
|
54
|
+
export declare function aclPlugin(options?: AclOptions): AclPlugin;
|
|
55
|
+
export default aclPlugin;
|
|
@@ -3,13 +3,8 @@ 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.
|
|
7
|
-
const
|
|
8
|
-
const isString_1 = __importDefault(require("lodash/isString"));
|
|
9
|
-
const isNumber_1 = __importDefault(require("lodash/isNumber"));
|
|
10
|
-
const sortBy_1 = __importDefault(require("lodash/sortBy"));
|
|
11
|
-
const escapeRegExp_1 = __importDefault(require("lodash/escapeRegExp"));
|
|
12
|
-
const defaults_1 = __importDefault(require("lodash/defaults"));
|
|
6
|
+
exports.aclPlugin = exports.AclPlugin = exports.defaultAclOptions = exports.AclAction = void 0;
|
|
7
|
+
const lodash_1 = require("lodash");
|
|
13
8
|
const middleware_1 = require("./middleware");
|
|
14
9
|
const FrameworkError_1 = __importDefault(require("../../error/FrameworkError"));
|
|
15
10
|
var AclAction;
|
|
@@ -21,11 +16,12 @@ exports.defaultAclOptions = {
|
|
|
21
16
|
defaultAction: AclAction.DENY,
|
|
22
17
|
learn: true
|
|
23
18
|
};
|
|
24
|
-
class
|
|
25
|
-
constructor() {
|
|
19
|
+
class AclPlugin {
|
|
20
|
+
constructor(options) {
|
|
26
21
|
this._roles = new Map();
|
|
27
22
|
this._allowRules = new Map();
|
|
28
23
|
this._denyRules = new Map();
|
|
24
|
+
this._options = lodash_1.defaults(options || {}, middleware_1.defaultAclMiddlewareOptions, exports.defaultAclOptions);
|
|
29
25
|
}
|
|
30
26
|
defaultAction(action) {
|
|
31
27
|
this._options.defaultAction = action;
|
|
@@ -42,7 +38,7 @@ class AbstractAcl {
|
|
|
42
38
|
return this;
|
|
43
39
|
}
|
|
44
40
|
allow(resource, roles) {
|
|
45
|
-
const parsedRoles = new Set(
|
|
41
|
+
const parsedRoles = new Set(lodash_1.isArray(roles) ? roles : [roles]);
|
|
46
42
|
if (this._options.learn) {
|
|
47
43
|
this._learnRoles(parsedRoles);
|
|
48
44
|
}
|
|
@@ -56,7 +52,7 @@ class AbstractAcl {
|
|
|
56
52
|
return this;
|
|
57
53
|
}
|
|
58
54
|
deny(resource, roles) {
|
|
59
|
-
const parsedRoles = new Set(
|
|
55
|
+
const parsedRoles = new Set(lodash_1.isArray(roles) ? roles : [roles]);
|
|
60
56
|
if (this._options.learn) {
|
|
61
57
|
this._learnRoles(parsedRoles);
|
|
62
58
|
}
|
|
@@ -73,7 +69,7 @@ class AbstractAcl {
|
|
|
73
69
|
let determinedAction = this._options.defaultAction;
|
|
74
70
|
const allowRules = this._findRules(resource, this._allowRules);
|
|
75
71
|
const denyRules = this._findRules(resource, this._denyRules);
|
|
76
|
-
const rules =
|
|
72
|
+
const rules = lodash_1.sortBy([
|
|
77
73
|
...allowRules.map(rule => ({ rule, action: AclAction.ALLOW })),
|
|
78
74
|
...denyRules.map(rule => ({ rule, action: AclAction.DENY })),
|
|
79
75
|
], rule => rule.rule.name.length);
|
|
@@ -102,10 +98,10 @@ class AbstractAcl {
|
|
|
102
98
|
}
|
|
103
99
|
validate(config, role = null) {
|
|
104
100
|
let parsedConfig;
|
|
105
|
-
if (
|
|
101
|
+
if (lodash_1.isArray(config)) {
|
|
106
102
|
parsedConfig = { allowedRoles: config };
|
|
107
103
|
}
|
|
108
|
-
else if (
|
|
104
|
+
else if (lodash_1.isString(config) || lodash_1.isNumber(config)) {
|
|
109
105
|
parsedConfig = { allowedRoles: [config] };
|
|
110
106
|
}
|
|
111
107
|
else if (config) {
|
|
@@ -123,12 +119,43 @@ class AbstractAcl {
|
|
|
123
119
|
return allowed;
|
|
124
120
|
}
|
|
125
121
|
middleware(config = null) {
|
|
126
|
-
return middleware_1.expressAclMiddleware(this, config);
|
|
122
|
+
return middleware_1.expressAclMiddleware(this, config, this._options);
|
|
123
|
+
}
|
|
124
|
+
rolePath(path) {
|
|
125
|
+
this._options.rolePath = path;
|
|
126
|
+
return this;
|
|
127
|
+
}
|
|
128
|
+
onForbidden(handler) {
|
|
129
|
+
this._options.onForbidden = handler;
|
|
130
|
+
return this;
|
|
131
|
+
}
|
|
132
|
+
beforeBuildSchema(builder) {
|
|
133
|
+
// Add middleware
|
|
134
|
+
builder.use(middleware_1.graphQLAclMiddleware(this, null, this._options));
|
|
135
|
+
}
|
|
136
|
+
afterBuildSchema(builder, schema) {
|
|
137
|
+
// Add rules
|
|
138
|
+
for (let type of builder.getObjectTypes()) {
|
|
139
|
+
const typeInfo = type.info();
|
|
140
|
+
this.addRules(`${type.name}.*`, typeInfo.allowedRoles, typeInfo.deniedRoles);
|
|
141
|
+
for (let field of type.info().fields) {
|
|
142
|
+
const fieldInfo = field.info();
|
|
143
|
+
this.addRules(`${type.name}.${field.name}`, fieldInfo.allowedRoles, fieldInfo.deniedRoles);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
addRules(resource, allowed, denied) {
|
|
148
|
+
if (allowed.size > 0) {
|
|
149
|
+
this.allow(resource, Array.from(allowed));
|
|
150
|
+
}
|
|
151
|
+
if (denied.size > 0) {
|
|
152
|
+
this.deny(resource, Array.from(denied));
|
|
153
|
+
}
|
|
127
154
|
}
|
|
128
155
|
_findRules(resource, collection) {
|
|
129
156
|
const allRules = Array.from(collection.values());
|
|
130
157
|
return allRules.filter(rule => {
|
|
131
|
-
if (
|
|
158
|
+
if (lodash_1.isString(rule.resource)) {
|
|
132
159
|
return rule.resource === resource;
|
|
133
160
|
}
|
|
134
161
|
else if (rule.resource instanceof RegExp) {
|
|
@@ -159,7 +186,7 @@ class AbstractAcl {
|
|
|
159
186
|
_getRuleConfig(name, roles) {
|
|
160
187
|
let resource = name;
|
|
161
188
|
if (name.indexOf('*') >= 0) {
|
|
162
|
-
const pattern =
|
|
189
|
+
const pattern = lodash_1.escapeRegExp(name).replace('\\*', '(.*)');
|
|
163
190
|
resource = new RegExp(`^${pattern}$`);
|
|
164
191
|
}
|
|
165
192
|
return {
|
|
@@ -169,12 +196,9 @@ class AbstractAcl {
|
|
|
169
196
|
};
|
|
170
197
|
}
|
|
171
198
|
}
|
|
172
|
-
exports.
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
super();
|
|
176
|
-
this._options = defaults_1.default(options || {}, exports.defaultAclOptions);
|
|
177
|
-
}
|
|
199
|
+
exports.AclPlugin = AclPlugin;
|
|
200
|
+
function aclPlugin(options) {
|
|
201
|
+
return new AclPlugin(options);
|
|
178
202
|
}
|
|
179
|
-
exports.
|
|
180
|
-
exports.default =
|
|
203
|
+
exports.aclPlugin = aclPlugin;
|
|
204
|
+
exports.default = aclPlugin;
|
package/plugin/acl/index.d.ts
CHANGED
package/plugin/acl/index.js
CHANGED
|
@@ -9,12 +9,6 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
|
|
|
9
9
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
10
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
11
|
};
|
|
12
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
|
-
};
|
|
15
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
|
|
17
|
-
__exportStar(require("./Acl"), exports);
|
|
13
|
+
__exportStar(require("./acl"), exports);
|
|
18
14
|
__exportStar(require("./middleware"), exports);
|
|
19
|
-
__exportStar(require("./plugin"), exports);
|
|
20
|
-
exports.default = plugin_1.default;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Path } from "graphql/jsutils/Path";
|
|
2
|
-
import
|
|
2
|
+
import { AclValidateConfigType, AclPlugin } from "./acl";
|
|
3
3
|
import { Middleware } from "../../common";
|
|
4
4
|
export interface AclMiddlewareOptions {
|
|
5
5
|
rolePath?: string;
|
|
6
6
|
onForbidden?: (resource: string) => void;
|
|
7
7
|
}
|
|
8
8
|
export declare const defaultAclMiddlewareOptions: AclMiddlewareOptions;
|
|
9
|
-
export declare function expressAclMiddleware(acl:
|
|
10
|
-
export declare function graphQLAclMiddleware(acl:
|
|
9
|
+
export declare function expressAclMiddleware(acl: AclPlugin, config?: AclValidateConfigType, options?: AclMiddlewareOptions): (req: any, res: any, next: any) => void;
|
|
10
|
+
export declare function graphQLAclMiddleware(acl: AclPlugin, config?: AclValidateConfigType, options?: AclMiddlewareOptions): Middleware;
|
|
11
11
|
export declare function getPathResource(path: Path): string;
|
package/plugin/acl/middleware.js
CHANGED
|
@@ -1,27 +1,24 @@
|
|
|
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
3
|
exports.getPathResource = exports.graphQLAclMiddleware = exports.expressAclMiddleware = exports.defaultAclMiddlewareOptions = void 0;
|
|
7
|
-
const
|
|
8
|
-
const get_1 = __importDefault(require("lodash/get"));
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
9
5
|
const resolver_1 = require("../../error/resolver");
|
|
10
6
|
exports.defaultAclMiddlewareOptions = {
|
|
11
|
-
rolePath: "
|
|
12
|
-
onForbidden: resource => { throw new resolver_1.ForbiddenError(`No access to ${resource}
|
|
7
|
+
rolePath: "role",
|
|
8
|
+
onForbidden: resource => { throw new resolver_1.ForbiddenError(`No access to ${resource}`); }
|
|
13
9
|
};
|
|
14
10
|
function expressAclMiddleware(acl, config = null, options = null) {
|
|
15
11
|
const fullOptions = getOptions(options);
|
|
16
12
|
return (req, res, next) => {
|
|
17
13
|
var _a;
|
|
14
|
+
const fullPath = req.baseUrl + req.path;
|
|
18
15
|
if (!config) {
|
|
19
|
-
config = { resource:
|
|
16
|
+
config = { resource: fullPath };
|
|
20
17
|
}
|
|
21
|
-
const role = (_a =
|
|
18
|
+
const role = (_a = lodash_1.get(req, fullOptions.rolePath)) !== null && _a !== void 0 ? _a : null;
|
|
22
19
|
const allowed = acl.validate(config, role);
|
|
23
20
|
if (!allowed) {
|
|
24
|
-
|
|
21
|
+
fullOptions.onForbidden(fullPath);
|
|
25
22
|
}
|
|
26
23
|
next();
|
|
27
24
|
};
|
|
@@ -36,10 +33,10 @@ function graphQLAclMiddleware(acl, config = null, options = null) {
|
|
|
36
33
|
if (!config) {
|
|
37
34
|
parsedConfig = { resource: pathResource };
|
|
38
35
|
}
|
|
39
|
-
const role = (_a =
|
|
36
|
+
const role = (_a = lodash_1.get(context, fullOptions.rolePath)) !== null && _a !== void 0 ? _a : null;
|
|
40
37
|
const allowed = acl.validate(parsedConfig, role);
|
|
41
38
|
if (!allowed) {
|
|
42
|
-
|
|
39
|
+
fullOptions.onForbidden(pathResource);
|
|
43
40
|
}
|
|
44
41
|
return resolve(root, args, context, info);
|
|
45
42
|
};
|
|
@@ -50,5 +47,5 @@ function getPathResource(path) {
|
|
|
50
47
|
}
|
|
51
48
|
exports.getPathResource = getPathResource;
|
|
52
49
|
function getOptions(options) {
|
|
53
|
-
return
|
|
50
|
+
return lodash_1.defaults({}, options || {}, exports.defaultAclMiddlewareOptions);
|
|
54
51
|
}
|
package/plugin/common.d.ts
CHANGED
|
@@ -34,20 +34,20 @@ export interface Plugin {
|
|
|
34
34
|
afterBuild?(rootBuilder: AbstractSchemaBuilder<any>, schema: GraphQLSchema): any;
|
|
35
35
|
beforeBuildSchema?(builder: AbstractSchemaBuilder<any>): any;
|
|
36
36
|
afterBuildSchema?(builder: AbstractSchemaBuilder<any>, schema: GraphQLSchema): any;
|
|
37
|
-
beforeBuildObjectType?(builder: ObjectTypeBuilder, context: BuildContext): any;
|
|
38
|
-
afterBuildObjectType?(builder: ObjectTypeBuilder, context: BuildContext, objectType: GraphQLObjectType): any;
|
|
39
|
-
beforeBuildInputObjectType?(builder: InputObjectTypeBuilder, context: BuildContext): any;
|
|
40
|
-
afterBuildInputObjectType?(builder: InputObjectTypeBuilder, context: BuildContext, inputObjectType: GraphQLInputObjectType): any;
|
|
41
|
-
beforeBuildEnumType?(builder: EnumTypeBuilder, context: BuildContext): any;
|
|
42
|
-
afterBuildEnumType?(builder: EnumTypeBuilder, context: BuildContext, enumType: GraphQLEnumType): any;
|
|
43
|
-
beforeBuildEnumValue?(builder: EnumValueBuilder, context: BuildContext): any;
|
|
44
|
-
afterBuildEnumValue?(builder: EnumValueBuilder, context: BuildContext, enumValue: GraphQLEnumValueConfig): any;
|
|
45
|
-
beforeBuildUnionType?(builder: UnionTypeBuilder, context: BuildContext): any;
|
|
46
|
-
afterBuildUnionType?(builder: UnionTypeBuilder, context: BuildContext, unionType: GraphQLUnionType): any;
|
|
47
|
-
beforeBuildField?(builder: FieldBuilder, context: BuildContext): any;
|
|
48
|
-
afterBuildField?(builder: FieldBuilder, context: BuildContext, field: GraphQLFieldConfig<any, any>): any;
|
|
49
|
-
beforeBuildInputField?(builder: InputFieldBuilder, context: BuildContext): any;
|
|
50
|
-
afterBuildInputField?(builder: InputFieldBuilder, context: BuildContext, inputField: GraphQLInputFieldConfig): any;
|
|
51
|
-
beforeBuildArgument?(builder: ArgumentBuilder, context: BuildContext): any;
|
|
52
|
-
afterBuildArgument?(builder: ArgumentBuilder, context: BuildContext, argument: GraphQLArgumentConfig): any;
|
|
37
|
+
beforeBuildObjectType?(builder: ObjectTypeBuilder, context: BuildContext, info: ObjectTypeBuilderInfo): any;
|
|
38
|
+
afterBuildObjectType?(builder: ObjectTypeBuilder, context: BuildContext, info: ObjectTypeBuilderInfo, objectType: GraphQLObjectType): any;
|
|
39
|
+
beforeBuildInputObjectType?(builder: InputObjectTypeBuilder, context: BuildContext, info: InputObjectTypeBuilderInfo): any;
|
|
40
|
+
afterBuildInputObjectType?(builder: InputObjectTypeBuilder, context: BuildContext, info: InputObjectTypeBuilderInfo, inputObjectType: GraphQLInputObjectType): any;
|
|
41
|
+
beforeBuildEnumType?(builder: EnumTypeBuilder, context: BuildContext, info: EnumTypeBuilderInfo): any;
|
|
42
|
+
afterBuildEnumType?(builder: EnumTypeBuilder, context: BuildContext, info: EnumTypeBuilderInfo, enumType: GraphQLEnumType): any;
|
|
43
|
+
beforeBuildEnumValue?(builder: EnumValueBuilder, context: BuildContext, info: EnumValueBuilderInfo): any;
|
|
44
|
+
afterBuildEnumValue?(builder: EnumValueBuilder, context: BuildContext, info: EnumValueBuilderInfo, enumValue: GraphQLEnumValueConfig): any;
|
|
45
|
+
beforeBuildUnionType?(builder: UnionTypeBuilder, context: BuildContext, info: UnionTypeBuilderInfo): any;
|
|
46
|
+
afterBuildUnionType?(builder: UnionTypeBuilder, context: BuildContext, info: UnionTypeBuilderInfo, unionType: GraphQLUnionType): any;
|
|
47
|
+
beforeBuildField?(builder: FieldBuilder, context: BuildContext, info: FieldBuilderInfo): any;
|
|
48
|
+
afterBuildField?(builder: FieldBuilder, context: BuildContext, info: FieldBuilderInfo, field: GraphQLFieldConfig<any, any>): any;
|
|
49
|
+
beforeBuildInputField?(builder: InputFieldBuilder, context: BuildContext, info: InputFieldBuilderInfo): any;
|
|
50
|
+
afterBuildInputField?(builder: InputFieldBuilder, context: BuildContext, info: InputFieldBuilderInfo, inputField: GraphQLInputFieldConfig): any;
|
|
51
|
+
beforeBuildArgument?(builder: ArgumentBuilder, context: BuildContext, info: ArgumentBuilderInfo): any;
|
|
52
|
+
afterBuildArgument?(builder: ArgumentBuilder, context: BuildContext, info: ArgumentBuilderInfo, argument: GraphQLArgumentConfig): any;
|
|
53
53
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FieldBuilder } from "../../field";
|
|
1
|
+
import { FieldBuilder, FieldBuilderInfo } from "../../field";
|
|
2
2
|
import { InputObjectTypeBuilder } from "../../inputObjectType";
|
|
3
3
|
import { ObjectTypeBuilder } from "../../objectType";
|
|
4
4
|
import { InputFieldType } from "../../inputField";
|
|
@@ -27,7 +27,7 @@ export declare class EqualsFilterPlugin implements Plugin {
|
|
|
27
27
|
include(name: string, type: InputFieldType): this;
|
|
28
28
|
argumentName(name: string): this;
|
|
29
29
|
inputName(nameFactory: (typeName: string) => string): this;
|
|
30
|
-
beforeBuildField(builder: FieldBuilder, context: BuildContext): void;
|
|
30
|
+
beforeBuildField(builder: FieldBuilder, context: BuildContext, info: FieldBuilderInfo): void;
|
|
31
31
|
protected _createFilterInputType(context: BuildContext, name: string, targetObjectType?: ObjectTypeBuilder): InputObjectTypeBuilder;
|
|
32
32
|
protected _getExtraFieldConfigs(context: BuildContext, name: string, targetObjectType?: ObjectTypeBuilder): Set<EqualsFilterPluginFieldConfig>;
|
|
33
33
|
}
|
package/plugin/filter/equals.js
CHANGED
|
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.equalsFilterPlugin = exports.EqualsFilterPlugin = exports.defaultEqualsFilterPluginOptions = void 0;
|
|
7
|
-
const
|
|
7
|
+
const lodash_1 = require("lodash");
|
|
8
8
|
const inputObjectType_1 = __importDefault(require("../../inputObjectType"));
|
|
9
9
|
const objectType_1 = require("../../objectType");
|
|
10
10
|
const util_1 = require("../../util");
|
|
@@ -16,7 +16,7 @@ exports.defaultEqualsFilterPluginOptions = {
|
|
|
16
16
|
};
|
|
17
17
|
class EqualsFilterPlugin {
|
|
18
18
|
constructor(options) {
|
|
19
|
-
this._options =
|
|
19
|
+
this._options = lodash_1.defaults(options || {}, exports.defaultEqualsFilterPluginOptions, {
|
|
20
20
|
exclude: [],
|
|
21
21
|
include: []
|
|
22
22
|
});
|
|
@@ -48,8 +48,7 @@ class EqualsFilterPlugin {
|
|
|
48
48
|
this._options.inputName = nameFactory;
|
|
49
49
|
return this;
|
|
50
50
|
}
|
|
51
|
-
beforeBuildField(builder, context) {
|
|
52
|
-
const info = builder.info();
|
|
51
|
+
beforeBuildField(builder, context, info) {
|
|
53
52
|
if (!info.list) {
|
|
54
53
|
return;
|
|
55
54
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FieldBuilder } from "../../field";
|
|
1
|
+
import { FieldBuilder, FieldBuilderInfo } from "../../field";
|
|
2
2
|
import { Plugin } from "../common";
|
|
3
3
|
import { BuildContext } from "../../Builder";
|
|
4
4
|
export interface SearchFilterPluginOptions {
|
|
@@ -8,7 +8,7 @@ export declare const defaultSearchFilterPluginOptions: SearchFilterPluginOptions
|
|
|
8
8
|
export declare class SearchFilterPlugin implements Plugin {
|
|
9
9
|
protected _options: SearchFilterPluginOptions;
|
|
10
10
|
constructor(options?: SearchFilterPluginOptions);
|
|
11
|
-
beforeBuildField(builder: FieldBuilder, context: BuildContext): void;
|
|
11
|
+
beforeBuildField(builder: FieldBuilder, context: BuildContext, info: FieldBuilderInfo): void;
|
|
12
12
|
}
|
|
13
13
|
export declare function searchFilterPlugin(): SearchFilterPlugin;
|
|
14
14
|
export default searchFilterPlugin;
|
package/plugin/filter/search.js
CHANGED
|
@@ -1,19 +1,15 @@
|
|
|
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
3
|
exports.searchFilterPlugin = exports.SearchFilterPlugin = exports.defaultSearchFilterPluginOptions = void 0;
|
|
7
|
-
const
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
8
5
|
exports.defaultSearchFilterPluginOptions = {
|
|
9
6
|
argumentName: 'search'
|
|
10
7
|
};
|
|
11
8
|
class SearchFilterPlugin {
|
|
12
9
|
constructor(options) {
|
|
13
|
-
this._options =
|
|
10
|
+
this._options = lodash_1.defaults(options || {}, exports.defaultSearchFilterPluginOptions);
|
|
14
11
|
}
|
|
15
|
-
beforeBuildField(builder, context) {
|
|
16
|
-
const info = builder.info();
|
|
12
|
+
beforeBuildField(builder, context, info) {
|
|
17
13
|
if (!info.list) {
|
|
18
14
|
return;
|
|
19
15
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FieldBuilder } from "../../field";
|
|
1
|
+
import { FieldBuilder, FieldBuilderInfo } from "../../field";
|
|
2
2
|
import { ObjectTypeBuilder } from "../../objectType";
|
|
3
3
|
import { Plugin } from "../common";
|
|
4
4
|
import { BuildContext } from "../../Builder";
|
|
@@ -6,7 +6,7 @@ export declare class ConnectionPaginationPlugin implements Plugin {
|
|
|
6
6
|
protected _totalCount: boolean;
|
|
7
7
|
totalCount(): this;
|
|
8
8
|
totalCount(totalCount: boolean): this;
|
|
9
|
-
beforeBuildField(builder: FieldBuilder, context: BuildContext): void;
|
|
9
|
+
beforeBuildField(builder: FieldBuilder, context: BuildContext, info: FieldBuilderInfo): void;
|
|
10
10
|
protected _createPageInfoObjectType(): ObjectTypeBuilder;
|
|
11
11
|
protected _createConnectionObjectType(name: string, edgeTypeName: string): ObjectTypeBuilder;
|
|
12
12
|
protected _createEdgeObjectType(name: string, typeName: string): ObjectTypeBuilder;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { FieldBuilder } from "../../field";
|
|
1
|
+
import { FieldBuilder, FieldBuilderInfo } from "../../field";
|
|
2
2
|
import { Plugin } from "../common";
|
|
3
3
|
import { BuildContext } from "../../Builder";
|
|
4
4
|
export declare class FirstAfterPaginationPlugin implements Plugin {
|
|
5
|
-
beforeBuildField(builder: FieldBuilder, context: BuildContext): void;
|
|
5
|
+
beforeBuildField(builder: FieldBuilder, context: BuildContext, info: FieldBuilderInfo): void;
|
|
6
6
|
}
|
|
7
7
|
export declare function firstAfterPaginationPlugin(): FirstAfterPaginationPlugin;
|
|
8
8
|
export default firstAfterPaginationPlugin;
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.firstAfterPaginationPlugin = exports.FirstAfterPaginationPlugin = void 0;
|
|
4
4
|
class FirstAfterPaginationPlugin {
|
|
5
|
-
beforeBuildField(builder, context) {
|
|
6
|
-
const info = builder.info();
|
|
5
|
+
beforeBuildField(builder, context, info) {
|
|
7
6
|
if (!info.list) {
|
|
8
7
|
return;
|
|
9
8
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { FieldBuilder } from "../../field";
|
|
1
|
+
import { FieldBuilder, FieldBuilderInfo } from "../../field";
|
|
2
2
|
import { ObjectTypeBuilder } from "../../objectType";
|
|
3
3
|
import { Plugin } from "../common";
|
|
4
4
|
import { BuildContext } from "../../Builder";
|
|
5
5
|
export declare class ItemsPaginationPlugin implements Plugin {
|
|
6
|
-
beforeBuildField(builder: FieldBuilder, context: BuildContext): void;
|
|
6
|
+
beforeBuildField(builder: FieldBuilder, context: BuildContext, info: FieldBuilderInfo): void;
|
|
7
7
|
protected _createListObjectType(name: string, typeName: string): ObjectTypeBuilder;
|
|
8
8
|
}
|
|
9
9
|
export declare function itemsPaginationPlugin(): ItemsPaginationPlugin;
|
|
@@ -26,8 +26,7 @@ exports.itemsPaginationPlugin = exports.ItemsPaginationPlugin = void 0;
|
|
|
26
26
|
const objectType_1 = __importStar(require("../../objectType"));
|
|
27
27
|
const PluginError_1 = __importDefault(require("../PluginError"));
|
|
28
28
|
class ItemsPaginationPlugin {
|
|
29
|
-
beforeBuildField(builder, context) {
|
|
30
|
-
const info = builder.info();
|
|
29
|
+
beforeBuildField(builder, context, info) {
|
|
31
30
|
if (!info.list) {
|
|
32
31
|
return;
|
|
33
32
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { FieldBuilder } from "../../field";
|
|
1
|
+
import { FieldBuilder, FieldBuilderInfo } from "../../field";
|
|
2
2
|
import { Plugin } from "../common";
|
|
3
3
|
import { BuildContext } from "../../Builder";
|
|
4
4
|
export declare class OffsetLimitPaginationPlugin implements Plugin {
|
|
5
|
-
beforeBuildField(builder: FieldBuilder, context: BuildContext): void;
|
|
5
|
+
beforeBuildField(builder: FieldBuilder, context: BuildContext, info: FieldBuilderInfo): void;
|
|
6
6
|
}
|
|
7
7
|
export declare function offsetLimitPaginationPlugin(): OffsetLimitPaginationPlugin;
|
|
8
8
|
export default offsetLimitPaginationPlugin;
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.offsetLimitPaginationPlugin = exports.OffsetLimitPaginationPlugin = void 0;
|
|
4
4
|
class OffsetLimitPaginationPlugin {
|
|
5
|
-
beforeBuildField(builder, context) {
|
|
6
|
-
const info = builder.info();
|
|
5
|
+
beforeBuildField(builder, context, info) {
|
|
7
6
|
if (!info.list) {
|
|
8
7
|
return;
|
|
9
8
|
}
|
package/plugin/sort/sort.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FieldBuilder } from "../../field";
|
|
1
|
+
import { FieldBuilder, FieldBuilderInfo } from "../../field";
|
|
2
2
|
import { InputObjectTypeBuilder } from "../../inputObjectType";
|
|
3
3
|
import { EnumTypeBuilder } from "../../enumType";
|
|
4
4
|
import { ObjectTypeBuilder } from "../../objectType";
|
|
@@ -34,7 +34,7 @@ export declare class SortPlugin implements Plugin {
|
|
|
34
34
|
argumentName(name: string): this;
|
|
35
35
|
inputName(nameFactory: (typeName: string) => string): this;
|
|
36
36
|
fieldEnumName(nameFactory: (typeName: string) => string): this;
|
|
37
|
-
beforeBuildField(builder: FieldBuilder, context: BuildContext): void;
|
|
37
|
+
beforeBuildField(builder: FieldBuilder, context: BuildContext, info: FieldBuilderInfo): void;
|
|
38
38
|
protected _createSortInputType(name: string, enumName: string): InputObjectTypeBuilder;
|
|
39
39
|
protected _createSortFieldEnum(context: BuildContext, name: string, typeName: string, targetObjectType?: ObjectTypeBuilder): EnumTypeBuilder;
|
|
40
40
|
protected _createSortDirectionEnum(): EnumTypeBuilder;
|
package/plugin/sort/sort.js
CHANGED
|
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.sortPlugin = exports.SortPlugin = exports.defaultSortPluginOptions = exports.SortDirection = void 0;
|
|
7
|
-
const
|
|
7
|
+
const lodash_1 = require("lodash");
|
|
8
8
|
const inputObjectType_1 = __importDefault(require("../../inputObjectType"));
|
|
9
9
|
const enumType_1 = __importDefault(require("../../enumType"));
|
|
10
10
|
const objectType_1 = require("../../objectType");
|
|
@@ -24,7 +24,7 @@ exports.defaultSortPluginOptions = {
|
|
|
24
24
|
};
|
|
25
25
|
class SortPlugin {
|
|
26
26
|
constructor(options) {
|
|
27
|
-
this._options =
|
|
27
|
+
this._options = lodash_1.defaults(options || {}, exports.defaultSortPluginOptions, {
|
|
28
28
|
exclude: [],
|
|
29
29
|
include: []
|
|
30
30
|
});
|
|
@@ -64,8 +64,7 @@ class SortPlugin {
|
|
|
64
64
|
this._options.fieldEnumName = nameFactory;
|
|
65
65
|
return this;
|
|
66
66
|
}
|
|
67
|
-
beforeBuildField(builder, context) {
|
|
68
|
-
const info = builder.info();
|
|
67
|
+
beforeBuildField(builder, context, info) {
|
|
69
68
|
if (!info.list) {
|
|
70
69
|
return;
|
|
71
70
|
}
|