{"version":3,"file":"hooks.mjs","sources":["../../src/engine/hooks.ts"],"sourcesContent":["import { cloneDeep, has, isArray } from 'lodash/fp';\nimport { hooks } from '@strapi/utils';\n\nimport * as domain from '../domain';\nimport type { Permission } from '../domain/permission';\nimport type { PermissionRule } from '../types';\n\nexport interface PermissionEngineHooks {\n 'before-format::validate.permission': ReturnType;\n 'format.permission': ReturnType;\n 'after-format::validate.permission': ReturnType;\n 'before-evaluate.permission': ReturnType;\n 'before-register.permission': ReturnType;\n}\n\nexport type HookName = keyof PermissionEngineHooks;\n\n/**\n * Create a hook map used by the permission Engine\n */\nconst createEngineHooks = (): PermissionEngineHooks => ({\n 'before-format::validate.permission': hooks.createAsyncBailHook(),\n 'format.permission': hooks.createAsyncSeriesWaterfallHook(),\n 'after-format::validate.permission': hooks.createAsyncBailHook(),\n 'before-evaluate.permission': hooks.createAsyncSeriesHook(),\n 'before-register.permission': hooks.createAsyncSeriesHook(),\n});\n\n/**\n * Create a context from a domain {@link Permission} used by the validate hooks\n */\nconst createValidateContext = (permission: Permission) => ({\n get permission(): Readonly {\n return cloneDeep(permission);\n },\n});\n\n/**\n * Create a context from a domain {@link Permission} used by the before valuate hook\n */\nconst createBeforeEvaluateContext = (permission: Permission) => ({\n get permission(): Readonly {\n return cloneDeep(permission);\n },\n\n addCondition(condition: string) {\n Object.assign(permission, domain.permission.addCondition(condition, permission));\n\n return this;\n },\n});\n\ninterface WillRegisterContextParams {\n permission: PermissionRule;\n options: Record;\n}\n\n/**\n * Create a context from a casl Permission & some options\n * @param caslPermission\n */\nconst createWillRegisterContext = ({ permission, options }: WillRegisterContextParams) => ({\n ...options,\n\n get permission() {\n return cloneDeep(permission);\n },\n\n condition: {\n and(rawConditionObject: unknown) {\n if (!permission.condition) {\n permission.condition = { $and: [] };\n }\n\n if (isArray(permission.condition.$and)) {\n permission.condition.$and.push(rawConditionObject);\n }\n\n return this;\n },\n\n or(rawConditionObject: unknown) {\n if (!permission.condition) {\n permission.condition = { $and: [] };\n }\n\n if (isArray(permission.condition.$and)) {\n const orClause = permission.condition.$and.find(has('$or'));\n\n if (orClause) {\n orClause.$or.push(rawConditionObject);\n } else {\n permission.condition.$and.push({ $or: [rawConditionObject] });\n }\n }\n\n return this;\n },\n },\n});\n\nexport {\n createEngineHooks,\n createValidateContext,\n createBeforeEvaluateContext,\n createWillRegisterContext,\n};\n"],"names":["createEngineHooks","hooks","createAsyncBailHook","createAsyncSeriesWaterfallHook","createAsyncSeriesHook","createValidateContext","permission","cloneDeep","createBeforeEvaluateContext","addCondition","condition","Object","assign","domain","createWillRegisterContext","options","and","rawConditionObject","$and","isArray","push","or","orClause","find","has","$or"],"mappings":";;;;AAiBA;;IAGA,MAAMA,iBAAAA,GAAoB,KAA8B;AACtD,QAAA,oCAAA,EAAsCC,MAAMC,mBAAmB,EAAA;AAC/D,QAAA,mBAAA,EAAqBD,MAAME,8BAA8B,EAAA;AACzD,QAAA,mCAAA,EAAqCF,MAAMC,mBAAmB,EAAA;AAC9D,QAAA,4BAAA,EAA8BD,MAAMG,qBAAqB,EAAA;AACzD,QAAA,4BAAA,EAA8BH,MAAMG,qBAAqB;KAC3D;AAEA;;AAEC,IACD,MAAMC,qBAAAA,GAAwB,CAACC,UAAAA,IAA4B;AACzD,QAAA,IAAIA,UAAAA,CAAAA,GAAmC;AACrC,YAAA,OAAOC,SAAAA,CAAUD,UAAAA,CAAAA;AACnB,QAAA;KACF;AAEA;;AAEC,IACD,MAAME,2BAAAA,GAA8B,CAACF,UAAAA,IAA4B;AAC/D,QAAA,IAAIA,UAAAA,CAAAA,GAAmC;AACrC,YAAA,OAAOC,SAAAA,CAAUD,UAAAA,CAAAA;AACnB,QAAA,CAAA;AAEAG,QAAAA,YAAAA,CAAAA,CAAaC,SAAiB,EAAA;YAC5BC,MAAAA,CAAOC,MAAM,CAACN,UAAAA,EAAYO,YAA8B,CAACH,SAAAA,EAAWJ,UAAAA,CAAAA,CAAAA;AAEpE,YAAA,OAAO,IAAI;AACb,QAAA;KACF;AAOA;;;IAIA,MAAMQ,4BAA4B,CAAC,EAAER,UAAU,EAAES,OAAO,EAA6B,IAAM;AACzF,QAAA,GAAGA,OAAO;AAEV,QAAA,IAAIT,UAAAA,CAAAA,GAAa;AACf,YAAA,OAAOC,SAAAA,CAAUD,UAAAA,CAAAA;AACnB,QAAA,CAAA;QAEAI,SAAAA,EAAW;AACTM,YAAAA,GAAAA,CAAAA,CAAIC,kBAA2B,EAAA;gBAC7B,IAAI,CAACX,UAAAA,CAAWI,SAAS,EAAE;AACzBJ,oBAAAA,UAAAA,CAAWI,SAAS,GAAG;AAAEQ,wBAAAA,IAAAA,EAAM;AAAG,qBAAA;AACpC,gBAAA;AAEA,gBAAA,IAAIC,OAAAA,CAAQb,UAAAA,CAAWI,SAAS,CAACQ,IAAI,CAAA,EAAG;AACtCZ,oBAAAA,UAAAA,CAAWI,SAAS,CAACQ,IAAI,CAACE,IAAI,CAACH,kBAAAA,CAAAA;AACjC,gBAAA;AAEA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAA;AAEAI,YAAAA,EAAAA,CAAAA,CAAGJ,kBAA2B,EAAA;gBAC5B,IAAI,CAACX,UAAAA,CAAWI,SAAS,EAAE;AACzBJ,oBAAAA,UAAAA,CAAWI,SAAS,GAAG;AAAEQ,wBAAAA,IAAAA,EAAM;AAAG,qBAAA;AACpC,gBAAA;AAEA,gBAAA,IAAIC,OAAAA,CAAQb,UAAAA,CAAWI,SAAS,CAACQ,IAAI,CAAA,EAAG;oBACtC,MAAMI,QAAAA,GAAWhB,WAAWI,SAAS,CAACQ,IAAI,CAACK,IAAI,CAACC,GAAAA,CAAI,KAAA,CAAA,CAAA;AAEpD,oBAAA,IAAIF,QAAAA,EAAU;wBACZA,QAAAA,CAASG,GAAG,CAACL,IAAI,CAACH,kBAAAA,CAAAA;oBACpB,CAAA,MAAO;AACLX,wBAAAA,UAAAA,CAAWI,SAAS,CAACQ,IAAI,CAACE,IAAI,CAAC;4BAAEK,GAAAA,EAAK;AAACR,gCAAAA;AAAmB;AAAC,yBAAA,CAAA;AAC7D,oBAAA;AACF,gBAAA;AAEA,gBAAA,OAAO,IAAI;AACb,YAAA;AACF;KACF;;;;"}