{"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,iBAAoB,GAAA,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,IACKC,MAAAA,qBAAAA,GAAwB,CAACC,UAAAA,IAA4B;AACzD,QAAA,IAAIA,UAAmC,CAAA,GAAA;AACrC,YAAA,OAAOC,SAAUD,CAAAA,UAAAA,CAAAA;AACnB;KACF;AAEA;;AAEC,IACKE,MAAAA,2BAAAA,GAA8B,CAACF,UAAAA,IAA4B;AAC/D,QAAA,IAAIA,UAAmC,CAAA,GAAA;AACrC,YAAA,OAAOC,SAAUD,CAAAA,UAAAA,CAAAA;AACnB,SAAA;AAEAG,QAAAA,YAAAA,CAAAA,CAAaC,SAAiB,EAAA;YAC5BC,MAAOC,CAAAA,MAAM,CAACN,UAAYO,EAAAA,YAA8B,CAACH,SAAWJ,EAAAA,UAAAA,CAAAA,CAAAA;AAEpE,YAAA,OAAO,IAAI;AACb;KACF;AAOA;;;IAIA,MAAMQ,4BAA4B,CAAC,EAAER,UAAU,EAAES,OAAO,EAA6B,IAAM;AACzF,QAAA,GAAGA,OAAO;AAEV,QAAA,IAAIT,UAAa,CAAA,GAAA;AACf,YAAA,OAAOC,SAAUD,CAAAA,UAAAA,CAAAA;AACnB,SAAA;QAEAI,SAAW,EAAA;AACTM,YAAAA,GAAAA,CAAAA,CAAIC,kBAA2B,EAAA;gBAC7B,IAAI,CAACX,UAAWI,CAAAA,SAAS,EAAE;AACzBJ,oBAAAA,UAAAA,CAAWI,SAAS,GAAG;AAAEQ,wBAAAA,IAAAA,EAAM;AAAG,qBAAA;AACpC;AAEA,gBAAA,IAAIC,OAAQb,CAAAA,UAAAA,CAAWI,SAAS,CAACQ,IAAI,CAAG,EAAA;AACtCZ,oBAAAA,UAAAA,CAAWI,SAAS,CAACQ,IAAI,CAACE,IAAI,CAACH,kBAAAA,CAAAA;AACjC;AAEA,gBAAA,OAAO,IAAI;AACb,aAAA;AAEAI,YAAAA,EAAAA,CAAAA,CAAGJ,kBAA2B,EAAA;gBAC5B,IAAI,CAACX,UAAWI,CAAAA,SAAS,EAAE;AACzBJ,oBAAAA,UAAAA,CAAWI,SAAS,GAAG;AAAEQ,wBAAAA,IAAAA,EAAM;AAAG,qBAAA;AACpC;AAEA,gBAAA,IAAIC,OAAQb,CAAAA,UAAAA,CAAWI,SAAS,CAACQ,IAAI,CAAG,EAAA;oBACtC,MAAMI,QAAAA,GAAWhB,WAAWI,SAAS,CAACQ,IAAI,CAACK,IAAI,CAACC,GAAI,CAAA,KAAA,CAAA,CAAA;AAEpD,oBAAA,IAAIF,QAAU,EAAA;wBACZA,QAASG,CAAAA,GAAG,CAACL,IAAI,CAACH,kBAAAA,CAAAA;qBACb,MAAA;AACLX,wBAAAA,UAAAA,CAAWI,SAAS,CAACQ,IAAI,CAACE,IAAI,CAAC;4BAAEK,GAAK,EAAA;AAACR,gCAAAA;AAAmB;AAAC,yBAAA,CAAA;AAC7D;AACF;AAEA,gBAAA,OAAO,IAAI;AACb;AACF;KACF;;;;"}