/
accessible_fields.js
55 lines (44 loc) · 1.63 KB
/
accessible_fields.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import { permittedFieldsOf } from '@casl/ability/extra';
function wrapArray(value) {
return Array.isArray(value) ? value : [value];
}
function deprecate(name, { by: replacementName, fn }) {
return function wrapDeprecated(...args) {
if (process.env.NODE_ENV !== 'production') {
// eslint-disable-next-line no-console
console.warn(`"${name}" is deprecated, use "${replacementName}"`);
}
return fn.apply(this, args);
};
}
function fieldsOf(schema, options) {
const fields = Object.keys(schema.paths);
if (!options.except) {
return fields;
}
const excludedFields = wrapArray(options.except);
return fields.filter(field => excludedFields.indexOf(field) === -1);
}
export function accessibleFieldsPlugin(schema, options = {}) {
let fieldsFrom;
function accessibleFieldsBy(ability, action = 'read') {
if (!fieldsFrom) {
const ALL_FIELDS = options.only ? wrapArray(options.only) : fieldsOf(schema, options);
fieldsFrom = rule => rule.fields || ALL_FIELDS;
}
const subject = typeof this === 'function' ? this.modelName : this;
return permittedFieldsOf(ability, action, subject, { fieldsFrom });
}
const permittedFieldsBy = deprecate('permittedFieldsBy', {
by: 'accessibleFieldsBy',
fn: accessibleFieldsBy
});
schema.statics.permittedFieldsBy = permittedFieldsBy;
schema.methods.permittedFieldsBy = permittedFieldsBy;
schema.statics.accessibleFieldsBy = accessibleFieldsBy;
schema.methods.accessibleFieldsBy = accessibleFieldsBy;
}
export const permittedFieldsPlugin = deprecate('permittedFieldsPlugin', {
by: 'accessibleFieldsPlugin',
fn: accessibleFieldsPlugin
});