@strapi/permissions 5.48.1 → 5.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,3 @@
1
- /// <reference types="lodash" />
2
1
  import _ from 'lodash/fp';
3
2
  declare const sanitizePermissionFields: _.LodashPick2x1;
4
3
  export interface Permission {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/permission/index.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,WAAW,CAAC;AAI1B,QAAA,MAAM,wBAAwB,iBAA4B,CAAC;AAE3D,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAWD;;;;GAIG;AACH,QAAA,MAAM,MAAM,6GAAqE,CAAC;AAElF;;GAEG;AACH,QAAA,MAAM,YAAY,mEAQhB,CAAC;AAEH;;GAEG;AACH,QAAA,MAAM,WAAW,yBAKhB,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/permission/index.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,WAAW,CAAC;AAI1B,QAAA,MAAM,wBAAwB,iBAA4B,CAAC;AAE3D,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAWD;;;;GAIG;AACH,QAAA,MAAM,MAAM,6GAAqE,CAAC;AAElF;;GAEG;AACH,QAAA,MAAM,YAAY,mEAQhB,CAAC;AAEH;;GAEG;AACH,QAAA,MAAM,WAAW,yBAKhB,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC"}
@@ -2,13 +2,17 @@
2
2
 
3
3
  var _ = require('lodash/fp');
4
4
 
5
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
+
7
+ var ___default = /*#__PURE__*/_interopDefault(_);
8
+
5
9
  const PERMISSION_FIELDS = [
6
10
  'action',
7
11
  'subject',
8
12
  'properties',
9
13
  'conditions'
10
14
  ];
11
- const sanitizePermissionFields = _.pick(PERMISSION_FIELDS);
15
+ const sanitizePermissionFields = ___default.default.pick(PERMISSION_FIELDS);
12
16
  /**
13
17
  * Creates a permission with default values for optional properties
14
18
  */ const getDefaultPermission = ()=>({
@@ -20,19 +24,19 @@ const sanitizePermissionFields = _.pick(PERMISSION_FIELDS);
20
24
  * Create a new permission based on given attributes
21
25
  *
22
26
  * @param {object} attributes
23
- */ const create = _.pipe(_.pick(PERMISSION_FIELDS), _.merge(getDefaultPermission()));
27
+ */ const create = ___default.default.pipe(___default.default.pick(PERMISSION_FIELDS), ___default.default.merge(getDefaultPermission()));
24
28
  /**
25
29
  * Add a condition to a permission
26
- */ const addCondition = _.curry((condition, permission)=>{
30
+ */ const addCondition = ___default.default.curry((condition, permission)=>{
27
31
  const { conditions } = permission;
28
- const newConditions = Array.isArray(conditions) ? _.uniq(conditions.concat(condition)) : [
32
+ const newConditions = Array.isArray(conditions) ? ___default.default.uniq(conditions.concat(condition)) : [
29
33
  condition
30
34
  ];
31
- return _.set('conditions', newConditions, permission);
35
+ return ___default.default.set('conditions', newConditions, permission);
32
36
  });
33
37
  /**
34
38
  * Gets a property or a part of a property from a permission.
35
- */ const getProperty = _.curry((property, permission)=>_.get(`properties.${property}`, permission));
39
+ */ const getProperty = ___default.default.curry((property, permission)=>___default.default.get(`properties.${property}`, permission));
36
40
 
37
41
  exports.addCondition = addCondition;
38
42
  exports.create = create;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/domain/permission/index.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nconst PERMISSION_FIELDS = ['action', 'subject', 'properties', 'conditions'] as const;\n\nconst sanitizePermissionFields = _.pick(PERMISSION_FIELDS);\n\nexport interface Permission {\n action: string;\n actionParameters?: Record<string, unknown>;\n subject?: string | object | null;\n properties?: Record<string, any>;\n conditions?: string[];\n}\n\n/**\n * Creates a permission with default values for optional properties\n */\nconst getDefaultPermission = (): Pick<Permission, 'conditions' | 'properties' | 'subject'> => ({\n conditions: [],\n properties: {},\n subject: null,\n});\n\n/**\n * Create a new permission based on given attributes\n *\n * @param {object} attributes\n */\nconst create = _.pipe(_.pick(PERMISSION_FIELDS), _.merge(getDefaultPermission()));\n\n/**\n * Add a condition to a permission\n */\nconst addCondition = _.curry((condition: string, permission: Permission): Permission => {\n const { conditions } = permission;\n\n const newConditions = Array.isArray(conditions)\n ? _.uniq(conditions.concat(condition))\n : [condition];\n\n return _.set('conditions', newConditions, permission);\n});\n\n/**\n * Gets a property or a part of a property from a permission.\n */\nconst getProperty = _.curry(\n <T extends keyof Permission['properties']>(\n property: T,\n permission: Permission\n ): Permission['properties'][T] => _.get(`properties.${property}`, permission)\n);\n\nexport { create, sanitizePermissionFields, addCondition, getProperty };\n"],"names":["PERMISSION_FIELDS","sanitizePermissionFields","_","pick","getDefaultPermission","conditions","properties","subject","create","pipe","merge","addCondition","curry","condition","permission","newConditions","Array","isArray","uniq","concat","set","getProperty","property","get"],"mappings":";;;;AAEA,MAAMA,iBAAAA,GAAoB;AAAC,IAAA,QAAA;AAAU,IAAA,SAAA;AAAW,IAAA,YAAA;AAAc,IAAA;AAAa,CAAA;AAE3E,MAAMC,wBAAAA,GAA2BC,CAAAA,CAAEC,IAAI,CAACH,iBAAAA;AAUxC;;IAGA,MAAMI,oBAAAA,GAAuB,KAAkE;AAC7FC,QAAAA,UAAAA,EAAY,EAAE;AACdC,QAAAA,UAAAA,EAAY,EAAC;QACbC,OAAAA,EAAS;KACX,CAAA;AAEA;;;;IAKA,MAAMC,MAAAA,GAASN,CAAAA,CAAEO,IAAI,CAACP,CAAAA,CAAEC,IAAI,CAACH,iBAAAA,CAAAA,EAAoBE,CAAAA,CAAEQ,KAAK,CAACN,oBAAAA,EAAAA,CAAAA;AAEzD;;AAEC,UACKO,YAAAA,GAAeT,CAAAA,CAAEU,KAAK,CAAC,CAACC,SAAAA,EAAmBC,UAAAA,GAAAA;IAC/C,MAAM,EAAET,UAAU,EAAE,GAAGS,UAAAA;IAEvB,MAAMC,aAAAA,GAAgBC,KAAAA,CAAMC,OAAO,CAACZ,UAAAA,CAAAA,GAChCH,CAAAA,CAAEgB,IAAI,CAACb,UAAAA,CAAWc,MAAM,CAACN,SAAAA,CAAAA,CAAAA,GACzB;AAACA,QAAAA;AAAU,KAAA;AAEf,IAAA,OAAOX,CAAAA,CAAEkB,GAAG,CAAC,YAAA,EAAcL,aAAAA,EAAeD,UAAAA,CAAAA;AAC5C,CAAA;AAEA;;AAEC,IACD,MAAMO,WAAAA,GAAcnB,CAAAA,CAAEU,KAAK,CACzB,CACEU,QAAAA,EACAR,UAAAA,GACgCZ,CAAAA,CAAEqB,GAAG,CAAC,CAAC,WAAW,EAAED,UAAU,EAAER,UAAAA,CAAAA;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/domain/permission/index.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nconst PERMISSION_FIELDS = ['action', 'subject', 'properties', 'conditions'] as const;\n\nconst sanitizePermissionFields = _.pick(PERMISSION_FIELDS);\n\nexport interface Permission {\n action: string;\n actionParameters?: Record<string, unknown>;\n subject?: string | object | null;\n properties?: Record<string, any>;\n conditions?: string[];\n}\n\n/**\n * Creates a permission with default values for optional properties\n */\nconst getDefaultPermission = (): Pick<Permission, 'conditions' | 'properties' | 'subject'> => ({\n conditions: [],\n properties: {},\n subject: null,\n});\n\n/**\n * Create a new permission based on given attributes\n *\n * @param {object} attributes\n */\nconst create = _.pipe(_.pick(PERMISSION_FIELDS), _.merge(getDefaultPermission()));\n\n/**\n * Add a condition to a permission\n */\nconst addCondition = _.curry((condition: string, permission: Permission): Permission => {\n const { conditions } = permission;\n\n const newConditions = Array.isArray(conditions)\n ? _.uniq(conditions.concat(condition))\n : [condition];\n\n return _.set('conditions', newConditions, permission);\n});\n\n/**\n * Gets a property or a part of a property from a permission.\n */\nconst getProperty = _.curry(\n <T extends keyof Permission['properties']>(\n property: T,\n permission: Permission\n ): Permission['properties'][T] => _.get(`properties.${property}`, permission)\n);\n\nexport { create, sanitizePermissionFields, addCondition, getProperty };\n"],"names":["PERMISSION_FIELDS","sanitizePermissionFields","_","pick","getDefaultPermission","conditions","properties","subject","create","pipe","merge","addCondition","curry","condition","permission","newConditions","Array","isArray","uniq","concat","set","getProperty","property","get"],"mappings":";;;;;;;;AAEA,MAAMA,iBAAAA,GAAoB;AAAC,IAAA,QAAA;AAAU,IAAA,SAAA;AAAW,IAAA,YAAA;AAAc,IAAA;AAAa,CAAA;AAE3E,MAAMC,wBAAAA,GAA2BC,kBAAAA,CAAEC,IAAI,CAACH,iBAAAA;AAUxC;;IAGA,MAAMI,oBAAAA,GAAuB,KAAkE;AAC7FC,QAAAA,UAAAA,EAAY,EAAE;AACdC,QAAAA,UAAAA,EAAY,EAAC;QACbC,OAAAA,EAAS;KACX,CAAA;AAEA;;;;IAKA,MAAMC,MAAAA,GAASN,kBAAAA,CAAEO,IAAI,CAACP,kBAAAA,CAAEC,IAAI,CAACH,iBAAAA,CAAAA,EAAoBE,kBAAAA,CAAEQ,KAAK,CAACN,oBAAAA,EAAAA,CAAAA;AAEzD;;AAEC,UACKO,YAAAA,GAAeT,kBAAAA,CAAEU,KAAK,CAAC,CAACC,SAAAA,EAAmBC,UAAAA,GAAAA;IAC/C,MAAM,EAAET,UAAU,EAAE,GAAGS,UAAAA;IAEvB,MAAMC,aAAAA,GAAgBC,KAAAA,CAAMC,OAAO,CAACZ,UAAAA,CAAAA,GAChCH,kBAAAA,CAAEgB,IAAI,CAACb,UAAAA,CAAWc,MAAM,CAACN,SAAAA,CAAAA,CAAAA,GACzB;AAACA,QAAAA;AAAU,KAAA;AAEf,IAAA,OAAOX,kBAAAA,CAAEkB,GAAG,CAAC,YAAA,EAAcL,aAAAA,EAAeD,UAAAA,CAAAA;AAC5C,CAAA;AAEA;;AAEC,IACD,MAAMO,WAAAA,GAAcnB,kBAAAA,CAAEU,KAAK,CACzB,CACEU,QAAAA,EACAR,UAAAA,GACgCZ,kBAAAA,CAAEqB,GAAG,CAAC,CAAC,WAAW,EAAED,UAAU,EAAER,UAAAA,CAAAA;;;;;;;"}
@@ -5,7 +5,10 @@ var qs = require('qs');
5
5
  var ability = require('@casl/ability');
6
6
  var _ = require('lodash/fp');
7
7
 
8
- function _interopNamespaceDefault(e) {
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
9
12
  var n = Object.create(null);
10
13
  if (e) {
11
14
  Object.keys(e).forEach(function (k) {
@@ -22,7 +25,8 @@ function _interopNamespaceDefault(e) {
22
25
  return Object.freeze(n);
23
26
  }
24
27
 
25
- var sift__namespace = /*#__PURE__*/_interopNamespaceDefault(sift);
28
+ var sift__namespace = /*#__PURE__*/_interopNamespace(sift);
29
+ var qs__default = /*#__PURE__*/_interopDefault(qs);
26
30
 
27
31
  const allowedOperations = [
28
32
  '$or',
@@ -45,7 +49,7 @@ const conditionsMatcher = (conditions)=>{
45
49
  });
46
50
  };
47
51
  const buildParametrizedAction = ({ name, params })=>{
48
- return `${name}?${qs.stringify(params)}`;
52
+ return `${name}?${qs__default.default.stringify(params)}`;
49
53
  };
50
54
  /**
51
55
  * Casl Ability Builder.
@@ -59,7 +63,7 @@ const buildParametrizedAction = ({ name, params })=>{
59
63
  return can(caslAction, _.isNil(subject) ? 'all' : subject, fields, _.isObject(condition) ? condition : undefined);
60
64
  },
61
65
  buildParametrizedAction ({ name, params }) {
62
- return `${name}?${qs.stringify(params)}`;
66
+ return `${name}?${qs__default.default.stringify(params)}`;
63
67
  },
64
68
  build () {
65
69
  const ability = build({
@@ -1 +1 @@
1
- {"version":3,"file":"casl-ability.js","sources":["../../../src/engine/abilities/casl-ability.ts"],"sourcesContent":["import * as sift from 'sift';\nimport qs from 'qs';\nimport { AbilityBuilder, Ability } from '@casl/ability';\nimport { pick, isNil, isObject } from 'lodash/fp';\nimport type { ParametrizedAction, PermissionRule } from '../../types';\n\nexport interface CustomAbilityBuilder {\n can(permission: PermissionRule): ReturnType<AbilityBuilder<Ability>['can']>;\n buildParametrizedAction: (parametrizedAction: ParametrizedAction) => string;\n build(): Ability;\n}\n\nconst allowedOperations = [\n '$or',\n '$and',\n '$eq',\n '$ne',\n '$in',\n '$nin',\n '$lt',\n '$lte',\n '$gt',\n '$gte',\n '$exists',\n '$elemMatch',\n] as const;\n\nconst operations = pick(allowedOperations, sift);\n\nconst conditionsMatcher = (conditions: unknown) => {\n return sift.createQueryTester(conditions, { operations });\n};\n\nconst buildParametrizedAction = ({ name, params }: ParametrizedAction) => {\n return `${name}?${qs.stringify(params)}`;\n};\n\n/**\n * Casl Ability Builder.\n */\nexport const caslAbilityBuilder = (): CustomAbilityBuilder => {\n const { can, build, ...rest } = new AbilityBuilder(Ability);\n\n return {\n can(permission: PermissionRule) {\n const { action, subject, properties = {}, condition } = permission;\n const { fields } = properties;\n\n const caslAction = typeof action === 'string' ? action : buildParametrizedAction(action);\n\n return can(\n caslAction,\n isNil(subject) ? 'all' : subject,\n fields,\n isObject(condition) ? condition : undefined\n );\n },\n\n buildParametrizedAction({ name, params }: ParametrizedAction) {\n return `${name}?${qs.stringify(params)}`;\n },\n\n build() {\n const ability = build({ conditionsMatcher });\n\n function decorateCan(originalCan: Ability['can']) {\n return function (...args: Parameters<Ability['can']>) {\n const [action, ...rest] = args;\n const caslAction = typeof action === 'string' ? action : buildParametrizedAction(action);\n\n // Call the original `can` method\n return originalCan.apply(ability, [caslAction, ...rest]);\n };\n }\n\n ability.can = decorateCan(ability.can);\n return ability;\n },\n\n ...rest,\n };\n};\n"],"names":["allowedOperations","operations","pick","sift","conditionsMatcher","conditions","createQueryTester","buildParametrizedAction","name","params","qs","stringify","caslAbilityBuilder","can","build","rest","AbilityBuilder","Ability","permission","action","subject","properties","condition","fields","caslAction","isNil","isObject","undefined","ability","decorateCan","originalCan","args","apply"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAMA,iBAAAA,GAAoB;AACxB,IAAA,KAAA;AACA,IAAA,MAAA;AACA,IAAA,KAAA;AACA,IAAA,KAAA;AACA,IAAA,KAAA;AACA,IAAA,MAAA;AACA,IAAA,KAAA;AACA,IAAA,MAAA;AACA,IAAA,KAAA;AACA,IAAA,MAAA;AACA,IAAA,SAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,UAAAA,GAAaC,OAAKF,iBAAAA,EAAmBG,eAAAA,CAAAA;AAE3C,MAAMC,oBAAoB,CAACC,UAAAA,GAAAA;IACzB,OAAOF,eAAAA,CAAKG,iBAAiB,CAACD,UAAAA,EAAY;AAAEJ,QAAAA;AAAW,KAAA,CAAA;AACzD,CAAA;AAEA,MAAMM,0BAA0B,CAAC,EAAEC,IAAI,EAAEC,MAAM,EAAsB,GAAA;AACnE,IAAA,OAAO,GAAGD,IAAAA,CAAK,CAAC,EAAEE,EAAAA,CAAGC,SAAS,CAACF,MAAAA,CAAAA,CAAAA,CAAS;AAC1C,CAAA;AAEA;;UAGaG,kBAAAA,GAAqB,IAAA;IAChC,MAAM,EAAEC,GAAG,EAAEC,KAAK,EAAE,GAAGC,IAAAA,EAAM,GAAG,IAAIC,sBAAAA,CAAeC,eAAAA,CAAAA;IAEnD,OAAO;AACLJ,QAAAA,GAAAA,CAAAA,CAAIK,UAA0B,EAAA;YAC5B,MAAM,EAAEC,MAAM,EAAEC,OAAO,EAAEC,UAAAA,GAAa,EAAE,EAAEC,SAAS,EAAE,GAAGJ,UAAAA;YACxD,MAAM,EAAEK,MAAM,EAAE,GAAGF,UAAAA;AAEnB,YAAA,MAAMG,UAAAA,GAAa,OAAOL,MAAAA,KAAW,QAAA,GAAWA,SAASZ,uBAAAA,CAAwBY,MAAAA,CAAAA;YAEjF,OAAON,GAAAA,CACLW,YACAC,OAAAA,CAAML,OAAAA,CAAAA,GAAW,QAAQA,OAAAA,EACzBG,MAAAA,EACAG,UAAAA,CAASJ,SAAAA,CAAAA,GAAaA,SAAAA,GAAYK,SAAAA,CAAAA;AAEtC,QAAA,CAAA;AAEApB,QAAAA,uBAAAA,CAAAA,CAAwB,EAAEC,IAAI,EAAEC,MAAM,EAAsB,EAAA;AAC1D,YAAA,OAAO,GAAGD,IAAAA,CAAK,CAAC,EAAEE,EAAAA,CAAGC,SAAS,CAACF,MAAAA,CAAAA,CAAAA,CAAS;AAC1C,QAAA,CAAA;AAEAK,QAAAA,KAAAA,CAAAA,GAAAA;AACE,YAAA,MAAMc,UAAUd,KAAAA,CAAM;AAAEV,gBAAAA;AAAkB,aAAA,CAAA;AAE1C,YAAA,SAASyB,YAAYC,WAA2B,EAAA;gBAC9C,OAAO,SAAU,GAAGC,IAAgC,EAAA;AAClD,oBAAA,MAAM,CAACZ,MAAAA,EAAQ,GAAGJ,IAAAA,CAAK,GAAGgB,IAAAA;AAC1B,oBAAA,MAAMP,UAAAA,GAAa,OAAOL,MAAAA,KAAW,QAAA,GAAWA,SAASZ,uBAAAA,CAAwBY,MAAAA,CAAAA;;oBAGjF,OAAOW,WAAAA,CAAYE,KAAK,CAACJ,OAAAA,EAAS;AAACJ,wBAAAA,UAAAA;AAAeT,wBAAAA,GAAAA;AAAK,qBAAA,CAAA;AACzD,gBAAA,CAAA;AACF,YAAA;AAEAa,YAAAA,OAAAA,CAAQf,GAAG,GAAGgB,WAAAA,CAAYD,OAAAA,CAAQf,GAAG,CAAA;YACrC,OAAOe,OAAAA;AACT,QAAA,CAAA;AAEA,QAAA,GAAGb;AACL,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"casl-ability.js","sources":["../../../src/engine/abilities/casl-ability.ts"],"sourcesContent":["import * as sift from 'sift';\nimport qs from 'qs';\nimport { AbilityBuilder, Ability } from '@casl/ability';\nimport { pick, isNil, isObject } from 'lodash/fp';\nimport type { ParametrizedAction, PermissionRule } from '../../types';\n\nexport interface CustomAbilityBuilder {\n can(permission: PermissionRule): ReturnType<AbilityBuilder<Ability>['can']>;\n buildParametrizedAction: (parametrizedAction: ParametrizedAction) => string;\n build(): Ability;\n}\n\nconst allowedOperations = [\n '$or',\n '$and',\n '$eq',\n '$ne',\n '$in',\n '$nin',\n '$lt',\n '$lte',\n '$gt',\n '$gte',\n '$exists',\n '$elemMatch',\n] as const;\n\nconst operations = pick(allowedOperations, sift);\n\nconst conditionsMatcher = (conditions: unknown) => {\n return sift.createQueryTester(conditions, { operations });\n};\n\nconst buildParametrizedAction = ({ name, params }: ParametrizedAction) => {\n return `${name}?${qs.stringify(params)}`;\n};\n\n/**\n * Casl Ability Builder.\n */\nexport const caslAbilityBuilder = (): CustomAbilityBuilder => {\n const { can, build, ...rest } = new AbilityBuilder(Ability);\n\n return {\n can(permission: PermissionRule) {\n const { action, subject, properties = {}, condition } = permission;\n const { fields } = properties;\n\n const caslAction = typeof action === 'string' ? action : buildParametrizedAction(action);\n\n return can(\n caslAction,\n isNil(subject) ? 'all' : subject,\n fields,\n isObject(condition) ? condition : undefined\n );\n },\n\n buildParametrizedAction({ name, params }: ParametrizedAction) {\n return `${name}?${qs.stringify(params)}`;\n },\n\n build() {\n const ability = build({ conditionsMatcher });\n\n function decorateCan(originalCan: Ability['can']) {\n return function (...args: Parameters<Ability['can']>) {\n const [action, ...rest] = args;\n const caslAction = typeof action === 'string' ? action : buildParametrizedAction(action);\n\n // Call the original `can` method\n return originalCan.apply(ability, [caslAction, ...rest]);\n };\n }\n\n ability.can = decorateCan(ability.can);\n return ability;\n },\n\n ...rest,\n };\n};\n"],"names":["allowedOperations","operations","pick","sift","conditionsMatcher","conditions","createQueryTester","buildParametrizedAction","name","params","qs","stringify","caslAbilityBuilder","can","build","rest","AbilityBuilder","Ability","permission","action","subject","properties","condition","fields","caslAction","isNil","isObject","undefined","ability","decorateCan","originalCan","args","apply"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAMA,iBAAAA,GAAoB;AACxB,IAAA,KAAA;AACA,IAAA,MAAA;AACA,IAAA,KAAA;AACA,IAAA,KAAA;AACA,IAAA,KAAA;AACA,IAAA,MAAA;AACA,IAAA,KAAA;AACA,IAAA,MAAA;AACA,IAAA,KAAA;AACA,IAAA,MAAA;AACA,IAAA,SAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,UAAAA,GAAaC,OAAKF,iBAAAA,EAAmBG,eAAAA,CAAAA;AAE3C,MAAMC,oBAAoB,CAACC,UAAAA,GAAAA;IACzB,OAAOF,eAAAA,CAAKG,iBAAiB,CAACD,UAAAA,EAAY;AAAEJ,QAAAA;AAAW,KAAA,CAAA;AACzD,CAAA;AAEA,MAAMM,0BAA0B,CAAC,EAAEC,IAAI,EAAEC,MAAM,EAAsB,GAAA;AACnE,IAAA,OAAO,GAAGD,IAAAA,CAAK,CAAC,EAAEE,mBAAAA,CAAGC,SAAS,CAACF,MAAAA,CAAAA,CAAAA,CAAS;AAC1C,CAAA;AAEA;;UAGaG,kBAAAA,GAAqB,IAAA;IAChC,MAAM,EAAEC,GAAG,EAAEC,KAAK,EAAE,GAAGC,IAAAA,EAAM,GAAG,IAAIC,sBAAAA,CAAeC,eAAAA,CAAAA;IAEnD,OAAO;AACLJ,QAAAA,GAAAA,CAAAA,CAAIK,UAA0B,EAAA;YAC5B,MAAM,EAAEC,MAAM,EAAEC,OAAO,EAAEC,UAAAA,GAAa,EAAE,EAAEC,SAAS,EAAE,GAAGJ,UAAAA;YACxD,MAAM,EAAEK,MAAM,EAAE,GAAGF,UAAAA;AAEnB,YAAA,MAAMG,UAAAA,GAAa,OAAOL,MAAAA,KAAW,QAAA,GAAWA,SAASZ,uBAAAA,CAAwBY,MAAAA,CAAAA;YAEjF,OAAON,GAAAA,CACLW,YACAC,OAAAA,CAAML,OAAAA,CAAAA,GAAW,QAAQA,OAAAA,EACzBG,MAAAA,EACAG,UAAAA,CAASJ,SAAAA,CAAAA,GAAaA,SAAAA,GAAYK,SAAAA,CAAAA;AAEtC,QAAA,CAAA;AAEApB,QAAAA,uBAAAA,CAAAA,CAAwB,EAAEC,IAAI,EAAEC,MAAM,EAAsB,EAAA;AAC1D,YAAA,OAAO,GAAGD,IAAAA,CAAK,CAAC,EAAEE,mBAAAA,CAAGC,SAAS,CAACF,MAAAA,CAAAA,CAAAA,CAAS;AAC1C,QAAA,CAAA;AAEAK,QAAAA,KAAAA,CAAAA,GAAAA;AACE,YAAA,MAAMc,UAAUd,KAAAA,CAAM;AAAEV,gBAAAA;AAAkB,aAAA,CAAA;AAE1C,YAAA,SAASyB,YAAYC,WAA2B,EAAA;gBAC9C,OAAO,SAAU,GAAGC,IAAgC,EAAA;AAClD,oBAAA,MAAM,CAACZ,MAAAA,EAAQ,GAAGJ,IAAAA,CAAK,GAAGgB,IAAAA;AAC1B,oBAAA,MAAMP,UAAAA,GAAa,OAAOL,MAAAA,KAAW,QAAA,GAAWA,SAASZ,uBAAAA,CAAwBY,MAAAA,CAAAA;;oBAGjF,OAAOW,WAAAA,CAAYE,KAAK,CAACJ,OAAAA,EAAS;AAACJ,wBAAAA,UAAAA;AAAeT,wBAAAA,GAAAA;AAAK,qBAAA,CAAA;AACzD,gBAAA,CAAA;AACF,YAAA;AAEAa,YAAAA,OAAAA,CAAQf,GAAG,GAAGgB,WAAAA,CAAYD,OAAAA,CAAQf,GAAG,CAAA;YACrC,OAAOe,OAAAA;AACT,QAAA,CAAA;AAEA,QAAA,GAAGb;AACL,KAAA;AACF;;;;"}
@@ -1,5 +1,4 @@
1
1
  import { hooks } from '@strapi/utils';
2
- import * as domain from '../domain';
3
2
  import type { Permission } from '../domain/permission';
4
3
  import type { PermissionRule } from '../types';
5
4
  export interface PermissionEngineHooks {
@@ -18,16 +17,16 @@ declare const createEngineHooks: () => PermissionEngineHooks;
18
17
  * Create a context from a domain {@link Permission} used by the validate hooks
19
18
  */
20
19
  declare const createValidateContext: (permission: Permission) => {
21
- readonly permission: Readonly<domain.permission.Permission>;
20
+ readonly permission: Readonly<Permission>;
22
21
  };
23
22
  /**
24
23
  * Create a context from a domain {@link Permission} used by the before valuate hook
25
24
  */
26
25
  declare const createBeforeEvaluateContext: (permission: Permission) => {
27
- readonly permission: Readonly<domain.permission.Permission>;
26
+ readonly permission: Readonly<Permission>;
28
27
  addCondition(condition: string): {
29
- readonly permission: Readonly<domain.permission.Permission>;
30
- addCondition(condition: string): any;
28
+ readonly permission: Readonly<Permission>;
29
+ addCondition(condition: string): /*elided*/ any;
31
30
  };
32
31
  };
33
32
  interface WillRegisterContextParams {
@@ -42,12 +41,12 @@ declare const createWillRegisterContext: ({ permission, options }: WillRegisterC
42
41
  permission: PermissionRule;
43
42
  condition: {
44
43
  and(rawConditionObject: unknown): {
45
- and(rawConditionObject: unknown): any;
46
- or(rawConditionObject: unknown): any;
44
+ and(rawConditionObject: unknown): /*elided*/ any;
45
+ or(rawConditionObject: unknown): /*elided*/ any;
47
46
  };
48
47
  or(rawConditionObject: unknown): {
49
- and(rawConditionObject: unknown): any;
50
- or(rawConditionObject: unknown): any;
48
+ and(rawConditionObject: unknown): /*elided*/ any;
49
+ or(rawConditionObject: unknown): /*elided*/ any;
51
50
  };
52
51
  };
53
52
  };
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/engine/hooks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,KAAK,MAAM,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,WAAW,qBAAqB;IACpC,oCAAoC,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACnF,mBAAmB,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC7E,mCAAmC,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAClF,4BAA4B,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC7E,4BAA4B,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,qBAAqB,CAAC,CAAC;CAC9E;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC;AAEnD;;GAEG;AACH,QAAA,MAAM,iBAAiB,QAAO,qBAM5B,CAAC;AAEH;;GAEG;AACH,QAAA,MAAM,qBAAqB,eAAgB,UAAU;;CAInD,CAAC;AAEH;;GAEG;AACH,QAAA,MAAM,2BAA2B,eAAgB,UAAU;;4BAKjC,MAAM;;gCAAN,MAAM;;CAK9B,CAAC;AAEH,UAAU,yBAAyB;IACjC,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;;GAGG;AACH,QAAA,MAAM,yBAAyB,4BAA6B,yBAAyB;;;gCAQzD,OAAO;oCAAP,OAAO;mCAYR,OAAO;;+BAAP,OAAO;oCAZN,OAAO;mCAYR,OAAO;;;CAkBhC,CAAC;AAEH,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,2BAA2B,EAC3B,yBAAyB,GAC1B,CAAC"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/engine/hooks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,WAAW,qBAAqB;IACpC,oCAAoC,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACnF,mBAAmB,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC7E,mCAAmC,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAClF,4BAA4B,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC7E,4BAA4B,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,qBAAqB,CAAC,CAAC;CAC9E;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC;AAEnD;;GAEG;AACH,QAAA,MAAM,iBAAiB,QAAO,qBAM5B,CAAC;AAEH;;GAEG;AACH,QAAA,MAAM,qBAAqB,GAAI,YAAY,UAAU;yBACjC,QAAQ,CAAC,UAAU,CAAC;CAGtC,CAAC;AAEH;;GAEG;AACH,QAAA,MAAM,2BAA2B,GAAI,YAAY,UAAU;yBACvC,QAAQ,CAAC,UAAU,CAAC;4BAId,MAAM;6BAJZ,QAAQ,CAAC,UAAU,CAAC;gCAId,MAAM;;CAK9B,CAAC;AAEH,UAAU,yBAAyB;IACjC,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;;GAGG;AACH,QAAA,MAAM,yBAAyB,GAAI,yBAAyB,yBAAyB;;;gCAQzD,OAAO;oCAAP,OAAO;mCAYR,OAAO;;+BAAP,OAAO;oCAZN,OAAO;mCAYR,OAAO;;;CAkBhC,CAAC;AAEH,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,2BAA2B,EAC3B,yBAAyB,GAC1B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAQhD,OAAO,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/D,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,CAAC;AAErB,KAAK,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,EAAE,UAAU,CAAC,GAAG;IACrE,QAAQ,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;CAC5D,CAAC;AAEF,KAAK,cAAc,GAAG,QAAQ,CAAC;AAC/B,KAAK,iBAAiB,GAAG,QAAQ,CAAC;AAElC,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,qBAAqB,CAAC;IAC7B,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,MAAM,CAAC;IAC7D,eAAe,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/E,sBAAsB,CACpB,GAAG,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,OAAO,EAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,CAAC,UAAU,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE;QAAE,MAAM,EAAE,cAAc,CAAC;QAAC,SAAS,EAAE,iBAAiB,CAAA;KAAE,CAAC;IACpE,qBAAqB,CAAC,IAAI,SAAS,CAAC,oBAAoB,CAAC;CAC1D;AAsBD,QAAA,MAAM,SAAS,WAAY,YAAY,KAAG,MAoKzC,CAAC;AAEF,OAAO,EAAE,SAAS,IAAI,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAQhD,OAAO,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/D,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,CAAC;AAErB,KAAK,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,EAAE,UAAU,CAAC,GAAG;IACrE,QAAQ,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;CAC5D,CAAC;AAEF,KAAK,cAAc,GAAG,QAAQ,CAAC;AAC/B,KAAK,iBAAiB,GAAG,QAAQ,CAAC;AAElC,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,qBAAqB,CAAC;IAC7B,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,MAAM,CAAC;IAC7D,eAAe,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/E,sBAAsB,CACpB,GAAG,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,OAAO,EAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,CAAC,UAAU,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE;QAAE,MAAM,EAAE,cAAc,CAAC;QAAC,SAAS,EAAE,iBAAiB,CAAA;KAAE,CAAC;IACpE,qBAAqB,CAAC,IAAI,SAAS,CAAC,oBAAoB,CAAC;CAC1D;AAsBD,QAAA,MAAM,SAAS,GAAI,QAAQ,YAAY,KAAG,MAoKzC,CAAC;AAEF,OAAO,EAAE,SAAS,IAAI,GAAG,EAAE,CAAC"}
@@ -6,6 +6,11 @@ var hooks = require('./hooks.js');
6
6
  var index = require('./abilities/index.js');
7
7
  var caslAbility = require('./abilities/casl-ability.js');
8
8
 
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var ___default = /*#__PURE__*/_interopDefault(_);
12
+ var qs__default = /*#__PURE__*/_interopDefault(qs);
13
+
9
14
  /**
10
15
  * Create a default state object for the engine
11
16
  */ const createEngineState = ()=>{
@@ -36,7 +41,7 @@ const newEngine = (params)=>{
36
41
  const { action: actionName, subject, properties, conditions = [], actionParameters = {} } = permission;
37
42
  let action = actionName;
38
43
  if (actionParameters && Object.keys(actionParameters).length > 0) {
39
- action = `${actionName}?${qs.stringify(actionParameters)}`;
44
+ action = `${actionName}?${qs__default.default.stringify(actionParameters)}`;
40
45
  }
41
46
  if (conditions.length === 0) {
42
47
  return register({
@@ -45,32 +50,32 @@ const newEngine = (params)=>{
45
50
  properties
46
51
  });
47
52
  }
48
- const resolveConditions = _.map(providers.condition.get);
49
- const removeInvalidConditions = _.filter((condition)=>_.isFunction(condition.handler));
53
+ const resolveConditions = ___default.default.map(providers.condition.get);
54
+ const removeInvalidConditions = ___default.default.filter((condition)=>___default.default.isFunction(condition.handler));
50
55
  const evaluateConditions = (conditions)=>{
51
56
  return Promise.all(conditions.map(async (condition)=>({
52
57
  condition,
53
- result: await condition.handler(_.merge(options, {
54
- permission: _.cloneDeep(permission)
58
+ result: await condition.handler(___default.default.merge(options, {
59
+ permission: ___default.default.cloneDeep(permission)
55
60
  }))
56
61
  })));
57
62
  };
58
- const removeInvalidResults = _.filter(({ result })=>_.isBoolean(result) || _.isObject(result));
63
+ const removeInvalidResults = ___default.default.filter(({ result })=>___default.default.isBoolean(result) || ___default.default.isObject(result));
59
64
  const evaluatedConditions = await Promise.resolve(conditions).then(resolveConditions).then(removeInvalidConditions).then(evaluateConditions).then(removeInvalidResults);
60
- const resultPropEq = _.propEq('result');
61
- const pickResults = _.map(_.prop('result'));
65
+ const resultPropEq = ___default.default.propEq('result');
66
+ const pickResults = ___default.default.map(___default.default.prop('result'));
62
67
  if (evaluatedConditions.every(resultPropEq(false))) {
63
68
  return;
64
69
  }
65
- if (_.isEmpty(evaluatedConditions) || evaluatedConditions.some(resultPropEq(true))) {
70
+ if (___default.default.isEmpty(evaluatedConditions) || evaluatedConditions.some(resultPropEq(true))) {
66
71
  return register({
67
72
  action,
68
73
  subject,
69
74
  properties
70
75
  });
71
76
  }
72
- const results = pickResults(evaluatedConditions).filter(_.isObject);
73
- if (_.isEmpty(results)) {
77
+ const results = pickResults(evaluatedConditions).filter(___default.default.isObject);
78
+ if (___default.default.isEmpty(results)) {
74
79
  return register({
75
80
  action,
76
81
  subject,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/engine/index.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport qs from 'qs';\nimport { Ability } from '@casl/ability';\nimport { providerFactory } from '@strapi/utils';\n\nimport {\n createEngineHooks,\n createWillRegisterContext,\n createBeforeEvaluateContext,\n createValidateContext,\n} from './hooks';\nimport type { PermissionEngineHooks, HookName } from './hooks';\n\nimport * as abilities from './abilities';\nimport { Permission } from '../domain/permission';\nimport type { PermissionRule } from '../types';\n\nexport { abilities };\n\ntype Provider = Omit<ReturnType<typeof providerFactory>, 'register'> & {\n register(...args: unknown[]): Promise<Provider> | Provider;\n};\n\ntype ActionProvider = Provider;\ntype ConditionProvider = Provider;\n\nexport interface Engine {\n hooks: PermissionEngineHooks;\n on(hook: HookName, handler: (...args: any[]) => any): Engine;\n generateAbility(permissions: Permission[], options?: object): Promise<Ability>;\n createRegisterFunction(\n can: (permission: PermissionRule) => unknown,\n options: Record<string, unknown>\n ): (permission: PermissionRule) => Promise<unknown>;\n}\n\nexport interface EngineParams {\n providers: { action: ActionProvider; condition: ConditionProvider };\n abilityBuilderFactory?(): abilities.CustomAbilityBuilder;\n}\n\ninterface EvaluateParams {\n options: Record<string, unknown>;\n register: (permission: PermissionRule) => Promise<unknown>;\n permission: Permission;\n}\n\ninterface Condition {\n name: string;\n handler(...params: unknown[]): boolean | object;\n}\n\n/**\n * Create a default state object for the engine\n */\nconst createEngineState = () => {\n const hooks = createEngineHooks();\n\n return { hooks };\n};\n\nconst newEngine = (params: EngineParams): Engine => {\n const { providers, abilityBuilderFactory = abilities.caslAbilityBuilder } = params;\n\n const state = createEngineState();\n\n const runValidationHook = async (hook: HookName, context: unknown) =>\n state.hooks[hook].call(context);\n\n /**\n * Evaluate a permission using local and registered behaviors (using hooks).\n * Validate, format (add condition, etc...), evaluate (evaluate conditions) and register a permission\n */\n const evaluate = async (params: EvaluateParams) => {\n const { options, register } = params;\n\n const preFormatValidation = await runValidationHook(\n 'before-format::validate.permission',\n createBeforeEvaluateContext(params.permission)\n );\n\n if (preFormatValidation === false) {\n return;\n }\n\n const permission = (await state.hooks['format.permission'].call(\n params.permission\n )) as Permission;\n\n const afterFormatValidation = await runValidationHook(\n 'after-format::validate.permission',\n createValidateContext(permission)\n );\n\n if (afterFormatValidation === false) {\n return;\n }\n\n await state.hooks['before-evaluate.permission'].call(createBeforeEvaluateContext(permission));\n\n const {\n action: actionName,\n subject,\n properties,\n conditions = [],\n actionParameters = {},\n } = permission;\n\n let action = actionName;\n\n if (actionParameters && Object.keys(actionParameters).length > 0) {\n action = `${actionName}?${qs.stringify(actionParameters)}`;\n }\n\n if (conditions.length === 0) {\n return register({ action, subject, properties });\n }\n\n const resolveConditions = _.map(providers.condition.get);\n\n const removeInvalidConditions = _.filter((condition: Condition) =>\n _.isFunction(condition.handler)\n );\n\n const evaluateConditions = (conditions: Condition[]) => {\n return Promise.all(\n conditions.map(async (condition) => ({\n condition,\n result: await condition.handler(\n _.merge(options, { permission: _.cloneDeep(permission) })\n ),\n }))\n );\n };\n\n const removeInvalidResults = _.filter(\n ({ result }) => _.isBoolean(result) || _.isObject(result)\n );\n\n const evaluatedConditions = await Promise.resolve(conditions)\n .then(resolveConditions)\n .then(removeInvalidConditions)\n .then(evaluateConditions)\n .then(removeInvalidResults);\n\n const resultPropEq = _.propEq('result');\n const pickResults = _.map(_.prop('result'));\n\n if (evaluatedConditions.every(resultPropEq(false))) {\n return;\n }\n\n if (_.isEmpty(evaluatedConditions) || evaluatedConditions.some(resultPropEq(true))) {\n return register({ action, subject, properties });\n }\n\n const results = pickResults(evaluatedConditions).filter(_.isObject);\n\n if (_.isEmpty(results)) {\n return register({ action, subject, properties });\n }\n\n return register({\n action,\n subject,\n properties,\n condition: { $and: [{ $or: results }] },\n });\n };\n\n return {\n get hooks() {\n return state.hooks;\n },\n\n /**\n * Create a register function that wraps a `can` function\n * used to register a permission in the ability builder\n */\n createRegisterFunction(can, options: Record<string, unknown>) {\n return async (permission: PermissionRule) => {\n const hookContext = createWillRegisterContext({ options, permission });\n\n await state.hooks['before-register.permission'].call(hookContext);\n\n return can(permission);\n };\n },\n\n /**\n * Register a new handler for a given hook\n */\n on(hook, handler) {\n const validHooks = Object.keys(state.hooks);\n const isValidHook = validHooks.includes(hook);\n\n if (!isValidHook) {\n throw new Error(\n `Invalid hook supplied when trying to register an handler to the permission engine. Got \"${hook}\" but expected one of ${validHooks.join(\n ', '\n )}`\n );\n }\n\n state.hooks[hook].register(handler);\n\n return this;\n },\n\n /**\n * Generate an ability based on the instance's\n * ability builder and the given permissions\n */\n async generateAbility(permissions, options: Record<string, unknown> = {}) {\n const { can, build } = abilityBuilderFactory();\n\n for (const permission of permissions) {\n const register = this.createRegisterFunction(can, options);\n\n await evaluate({ permission, options, register });\n }\n\n return build();\n },\n };\n};\n\nexport { newEngine as new };\n"],"names":["createEngineState","hooks","createEngineHooks","newEngine","params","providers","abilityBuilderFactory","abilities","state","runValidationHook","hook","context","call","evaluate","options","register","preFormatValidation","createBeforeEvaluateContext","permission","afterFormatValidation","createValidateContext","action","actionName","subject","properties","conditions","actionParameters","Object","keys","length","qs","stringify","resolveConditions","_","map","condition","get","removeInvalidConditions","filter","isFunction","handler","evaluateConditions","Promise","all","result","merge","cloneDeep","removeInvalidResults","isBoolean","isObject","evaluatedConditions","resolve","then","resultPropEq","propEq","pickResults","prop","every","isEmpty","some","results","$and","$or","createRegisterFunction","can","hookContext","createWillRegisterContext","on","validHooks","isValidHook","includes","Error","join","generateAbility","permissions","build"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/engine/index.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport qs from 'qs';\nimport { Ability } from '@casl/ability';\nimport { providerFactory } from '@strapi/utils';\n\nimport {\n createEngineHooks,\n createWillRegisterContext,\n createBeforeEvaluateContext,\n createValidateContext,\n} from './hooks';\nimport type { PermissionEngineHooks, HookName } from './hooks';\n\nimport * as abilities from './abilities';\nimport { Permission } from '../domain/permission';\nimport type { PermissionRule } from '../types';\n\nexport { abilities };\n\ntype Provider = Omit<ReturnType<typeof providerFactory>, 'register'> & {\n register(...args: unknown[]): Promise<Provider> | Provider;\n};\n\ntype ActionProvider = Provider;\ntype ConditionProvider = Provider;\n\nexport interface Engine {\n hooks: PermissionEngineHooks;\n on(hook: HookName, handler: (...args: any[]) => any): Engine;\n generateAbility(permissions: Permission[], options?: object): Promise<Ability>;\n createRegisterFunction(\n can: (permission: PermissionRule) => unknown,\n options: Record<string, unknown>\n ): (permission: PermissionRule) => Promise<unknown>;\n}\n\nexport interface EngineParams {\n providers: { action: ActionProvider; condition: ConditionProvider };\n abilityBuilderFactory?(): abilities.CustomAbilityBuilder;\n}\n\ninterface EvaluateParams {\n options: Record<string, unknown>;\n register: (permission: PermissionRule) => Promise<unknown>;\n permission: Permission;\n}\n\ninterface Condition {\n name: string;\n handler(...params: unknown[]): boolean | object;\n}\n\n/**\n * Create a default state object for the engine\n */\nconst createEngineState = () => {\n const hooks = createEngineHooks();\n\n return { hooks };\n};\n\nconst newEngine = (params: EngineParams): Engine => {\n const { providers, abilityBuilderFactory = abilities.caslAbilityBuilder } = params;\n\n const state = createEngineState();\n\n const runValidationHook = async (hook: HookName, context: unknown) =>\n state.hooks[hook].call(context);\n\n /**\n * Evaluate a permission using local and registered behaviors (using hooks).\n * Validate, format (add condition, etc...), evaluate (evaluate conditions) and register a permission\n */\n const evaluate = async (params: EvaluateParams) => {\n const { options, register } = params;\n\n const preFormatValidation = await runValidationHook(\n 'before-format::validate.permission',\n createBeforeEvaluateContext(params.permission)\n );\n\n if (preFormatValidation === false) {\n return;\n }\n\n const permission = (await state.hooks['format.permission'].call(\n params.permission\n )) as Permission;\n\n const afterFormatValidation = await runValidationHook(\n 'after-format::validate.permission',\n createValidateContext(permission)\n );\n\n if (afterFormatValidation === false) {\n return;\n }\n\n await state.hooks['before-evaluate.permission'].call(createBeforeEvaluateContext(permission));\n\n const {\n action: actionName,\n subject,\n properties,\n conditions = [],\n actionParameters = {},\n } = permission;\n\n let action = actionName;\n\n if (actionParameters && Object.keys(actionParameters).length > 0) {\n action = `${actionName}?${qs.stringify(actionParameters)}`;\n }\n\n if (conditions.length === 0) {\n return register({ action, subject, properties });\n }\n\n const resolveConditions = _.map(providers.condition.get);\n\n const removeInvalidConditions = _.filter((condition: Condition) =>\n _.isFunction(condition.handler)\n );\n\n const evaluateConditions = (conditions: Condition[]) => {\n return Promise.all(\n conditions.map(async (condition) => ({\n condition,\n result: await condition.handler(\n _.merge(options, { permission: _.cloneDeep(permission) })\n ),\n }))\n );\n };\n\n const removeInvalidResults = _.filter(\n ({ result }) => _.isBoolean(result) || _.isObject(result)\n );\n\n const evaluatedConditions = await Promise.resolve(conditions)\n .then(resolveConditions)\n .then(removeInvalidConditions)\n .then(evaluateConditions)\n .then(removeInvalidResults);\n\n const resultPropEq = _.propEq('result');\n const pickResults = _.map(_.prop('result'));\n\n if (evaluatedConditions.every(resultPropEq(false))) {\n return;\n }\n\n if (_.isEmpty(evaluatedConditions) || evaluatedConditions.some(resultPropEq(true))) {\n return register({ action, subject, properties });\n }\n\n const results = pickResults(evaluatedConditions).filter(_.isObject);\n\n if (_.isEmpty(results)) {\n return register({ action, subject, properties });\n }\n\n return register({\n action,\n subject,\n properties,\n condition: { $and: [{ $or: results }] },\n });\n };\n\n return {\n get hooks() {\n return state.hooks;\n },\n\n /**\n * Create a register function that wraps a `can` function\n * used to register a permission in the ability builder\n */\n createRegisterFunction(can, options: Record<string, unknown>) {\n return async (permission: PermissionRule) => {\n const hookContext = createWillRegisterContext({ options, permission });\n\n await state.hooks['before-register.permission'].call(hookContext);\n\n return can(permission);\n };\n },\n\n /**\n * Register a new handler for a given hook\n */\n on(hook, handler) {\n const validHooks = Object.keys(state.hooks);\n const isValidHook = validHooks.includes(hook);\n\n if (!isValidHook) {\n throw new Error(\n `Invalid hook supplied when trying to register an handler to the permission engine. Got \"${hook}\" but expected one of ${validHooks.join(\n ', '\n )}`\n );\n }\n\n state.hooks[hook].register(handler);\n\n return this;\n },\n\n /**\n * Generate an ability based on the instance's\n * ability builder and the given permissions\n */\n async generateAbility(permissions, options: Record<string, unknown> = {}) {\n const { can, build } = abilityBuilderFactory();\n\n for (const permission of permissions) {\n const register = this.createRegisterFunction(can, options);\n\n await evaluate({ permission, options, register });\n }\n\n return build();\n },\n };\n};\n\nexport { newEngine as new };\n"],"names":["createEngineState","hooks","createEngineHooks","newEngine","params","providers","abilityBuilderFactory","abilities","state","runValidationHook","hook","context","call","evaluate","options","register","preFormatValidation","createBeforeEvaluateContext","permission","afterFormatValidation","createValidateContext","action","actionName","subject","properties","conditions","actionParameters","Object","keys","length","qs","stringify","resolveConditions","_","map","condition","get","removeInvalidConditions","filter","isFunction","handler","evaluateConditions","Promise","all","result","merge","cloneDeep","removeInvalidResults","isBoolean","isObject","evaluatedConditions","resolve","then","resultPropEq","propEq","pickResults","prop","every","isEmpty","some","results","$and","$or","createRegisterFunction","can","hookContext","createWillRegisterContext","on","validHooks","isValidHook","includes","Error","join","generateAbility","permissions","build"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/permissions",
3
- "version": "5.48.1",
3
+ "version": "5.50.0",
4
4
  "description": "Strapi's permission layer.",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -40,18 +40,22 @@
40
40
  "test:ts": "run -T tsc --noEmit",
41
41
  "test:unit": "run -T jest",
42
42
  "test:unit:watch": "run -T jest --watch",
43
+ "test:unit:vitest": "vitest run",
44
+ "test:unit:vitest:watch": "vitest --watch",
43
45
  "watch": "run -T rollup -c -w"
44
46
  },
45
47
  "dependencies": {
46
48
  "@casl/ability": "6.7.5",
47
- "@strapi/utils": "5.48.1",
49
+ "@strapi/utils": "5.50.0",
48
50
  "lodash": "4.18.1",
49
51
  "qs": "6.15.2",
50
52
  "sift": "16.0.1"
51
53
  },
52
54
  "devDependencies": {
53
- "eslint-config-custom": "5.48.1",
54
- "tsconfig": "5.48.1"
55
+ "eslint-config-custom": "5.50.0",
56
+ "tsconfig": "5.50.0",
57
+ "vitest": "catalog:",
58
+ "vitest-config": "5.50.0"
55
59
  },
56
60
  "engines": {
57
61
  "node": ">=20.0.0 <=26.x.x",