{"version":3,"file":"index.cjs","names":["ref","inject","defineComponent","Ability","Object","defineProperty","exports","Symbol","toStringTag","value","vue","require","_casl_ability","hasOwn","obj","prop","prototype","hasOwnProperty","call","reactiveAbility","ability","watcher","ref","on","possibleRulesFor","bind","action","subject","can","cannot","ABILITY_TOKEN","useAbility","inject","Error","Can","defineComponent","name","props","I","String","do","a","Function","an","this","not","Boolean","passThrough","field","setup","slots","$props","actionProp","subjectProp","undefined","detectSubjectProp","default","rule","relevantRuleFor","isAllowed","inverted","allowed","reason","abilitiesPlugin","app","options","Ability","provide","useGlobalProperties","config","globalProperties","$ability","$can","provideAbility"],"sources":["../../src/reactiveAbility.ts","../../src/useAbility.ts","../../src/component/can.ts","../../src/plugin.ts"],"sourcesContent":["import { AnyAbility, SubjectType } from '@casl/ability';\nimport { ref } from 'vue';\n\nconst hasOwn: (o: object, v: PropertyKey) => boolean = Object.hasOwn ||\n  ((obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop));\n\nexport function reactiveAbility(ability: AnyAbility) {\n  if (hasOwn(ability, 'possibleRulesFor')) return ability;\n\n  const watcher = ref(true);\n  ability.on('updated', () => {\n    watcher.value = !watcher.value;\n  });\n\n  const possibleRulesFor = ability.possibleRulesFor.bind(ability);\n  ability.possibleRulesFor = (action: string, subject: SubjectType) => {\n    watcher.value = watcher.value; // eslint-disable-line\n    return possibleRulesFor(action, subject);\n  };\n  ability.can = ability.can.bind(ability);\n  ability.cannot = ability.cannot.bind(ability);\n\n  return ability;\n}\n","import type { AnyAbility, MongoAbility } from '@casl/ability';\nimport { inject, InjectionKey, provide } from 'vue';\nimport { reactiveAbility } from './reactiveAbility';\n\nexport const ABILITY_TOKEN: InjectionKey<AnyAbility> = Symbol('ability');\n\nexport function useAbility<T extends AnyAbility = MongoAbility>(): T {\n  const ability = inject<T>(ABILITY_TOKEN);\n\n  if (!ability) {\n    throw new Error(\n      'Cannot inject Ability instance because it was not provided. ' +\n      'Did you forget to install abilitiesPlugin or call provideAbility in a parent component?'\n    );\n  }\n\n  return ability;\n}\n\nexport function provideAbility(ability: AnyAbility) {\n  provide(ABILITY_TOKEN, reactiveAbility(ability));\n}\n","import {\n  Abilities,\n  AbilityTuple,\n  AnyAbility,\n  Generics,\n  IfString,\n  MongoAbility,\n  ResolveSubjects,\n  SubjectResolver,\n  SubjectType\n} from '@casl/ability';\nimport { ComponentCustomProperties, defineComponent } from 'vue';\nimport { useAbility } from '../useAbility';\n\nexport type CanProps<T extends AnyAbility> = AbilityCanProps<Generics<T>['abilities'], Generics<T>['subjectResolver']> & {\n  not?: boolean,\n  passThrough?: boolean\n};\n\nexport const Can = defineComponent<CanProps<VueAbility>>({\n  name: 'Can',\n  props: {\n    I: String,\n    do: String,\n    a: [String, Function],\n    an: [String, Function],\n    this: [String, Function, Object],\n    on: [String, Function, Object],\n    not: Boolean,\n    passThrough: Boolean,\n    field: String\n  } as any,\n  setup(props, { slots }) {\n    const $props = props as Record<string, any>;\n    let actionProp = 'do';\n    let subjectProp = 'on';\n\n    if ($props[actionProp] === undefined) {\n      actionProp = 'I';\n      subjectProp = detectSubjectProp(props);\n    }\n\n    if (!$props[actionProp]) {\n      throw new Error('Neither `I` nor `do` prop was passed in <Can>');\n    }\n\n    if (!slots.default) {\n      throw new Error('Expects to receive default slot');\n    }\n\n    const ability = useAbility<VueAbility>();\n\n    return () => {\n      const rule = ability.relevantRuleFor($props[actionProp], $props[subjectProp], $props.field);\n      let isAllowed = !!rule && !rule.inverted;\n      if (props.not) isAllowed = !isAllowed;\n\n      if (!props.passThrough && !isAllowed) {\n        return null;\n      }\n\n      return slots.default!({\n        allowed: isAllowed,\n        reason: rule?.reason,\n        ability,\n      });\n    };\n  }\n});\n\ntype AbilityCanProps<\n  T extends Abilities,\n  R extends SubjectResolver,\n  Else = IfString<T, { do: T } | { I: T }>\n> = T extends AbilityTuple\n  ? { do: T[0], on: ResolveSubjects<T[1], R>, field?: string } |\n  { I: T[0], a: Extract<ResolveSubjects<T[1], R>, SubjectType>, field?: string } |\n  { I: T[0], an: Extract<ResolveSubjects<T[1], R>, SubjectType>, field?: string } |\n  { I: T[0], this: Exclude<ResolveSubjects<T[1], R>, SubjectType>, field?: string }\n  : Else;\n\ntype VueAbility = ComponentCustomProperties extends { $ability: AnyAbility }\n  ? ComponentCustomProperties['$ability']\n  : MongoAbility;\n\nfunction detectSubjectProp(props: Record<string, unknown>) {\n  if (props.a !== undefined) {\n    return 'a';\n  }\n\n  if (props.this !== undefined) {\n    return 'this';\n  }\n\n  if (props.an !== undefined) {\n    return 'an';\n  }\n\n  return '';\n}\n","import { App } from 'vue';\nimport { AnyAbility, Ability, MongoAbility } from '@casl/ability';\nimport { ABILITY_TOKEN } from './useAbility';\nimport { reactiveAbility } from './reactiveAbility';\n\nexport interface AbilityPluginOptions {\n  useGlobalProperties?: boolean\n}\n\nexport function abilitiesPlugin(app: App, ability: AnyAbility, options?: AbilityPluginOptions) {\n  if (!ability || !(ability instanceof Ability)) {\n    throw new Error('Please, provide an Ability instance to abilitiesPlugin plugin');\n  }\n\n  app.provide(ABILITY_TOKEN, reactiveAbility(ability));\n\n  if (options && options.useGlobalProperties) {\n    app.config.globalProperties.$ability = ability as MongoAbility;\n    app.config.globalProperties.$can = ability.can.bind(ability);\n  }\n}\n"],"mappings":";;;;;;AAGA,MAAMa,IAAiDT,OAAOS,UAAA,EAC1DC,GAAKC,MAASX,OAAOY,UAAUC,eAAeC,KAAKJ,GAAKC;;AAE5D,SAAgBI,EAAgBC;IAC9B,IAAIP,EAAOO,GAAS,qBAAqB,OAAOA;IAEhD,MAAMC,KAAA,GAAUrB,EAAAA,MAAI;IACpBoB,EAAQG,GAAG,WAAA;QACTF,EAAQZ,SAASY,EAAQZ;;IAG3B,MAAMe,IAAmBJ,EAAQI,iBAAiBC,KAAKL;IAQvD,OAPAA,EAAQI,mBAAA,CAAoBE,GAAgBC,OAC1CN,EAAQZ,QAAQY,EAAQZ,OACjBe,EAAiBE,GAAQC,KAElCP,EAAQQ,MAAMR,EAAQQ,IAAIH,KAAKL;IAC/BA,EAAQS,SAAST,EAAQS,OAAOJ,KAAKL,IAE9BA;AACT;;ACnBA,MAAaU,IAA0CvB,OAAO;;AAE9D,SAAgBwB;IACd,MAAMX,KAAA,GAAUnB,EAAAA,QAAU6B;IAE1B,KAAKV,GACH,MAAM,IAAIa,MACR;IAKJ,OAAOb;AACT;;ACEA,MAAac,KAAA,GAAMhC,EAAAA,iBAAsC;IACvDkC,MAAM;IACNC,OAAO;QACLC,GAAGC;QACHC,IAAID;QACJE,GAAG,EAACF,QAAQG;QACZC,IAAI,EAACJ,QAAQG;QACbE,MAAM,EAACL,QAAQG,UAAUtC;QACzBmB,IAAI,EAACgB,QAAQG,UAAUtC;QACvByC,KAAKC;QACLC,aAAaD;QACbE,OAAOT;;IAET,KAAAU,CAAMZ,IAAOa,OAAEA;QACb,MAAMC,IAASd;QACf,IAAIe,IAAa,MACbC,IAAc;QAOlB,SAL2BC,MAAvBH,EAAOC,OACTA,IAAa,KACbC,IA8CN,SAA2BhB;YACzB,SAAgBiB,MAAZjB,EAAMI,GACR,OAAO;YAGT,SAAmBa,MAAfjB,EAAMO,MACR,OAAO;YAGT,SAAiBU,MAAbjB,EAAMM,IACR,OAAO;YAGT,OAAO;AACT,SA5DoBY,CAAkBlB,MAG7Bc,EAAOC,IACV,MAAM,IAAInB,MAAM;QAGlB,KAAKiB,EAAMM,SACT,MAAM,IAAIvB,MAAM;QAGlB,MAAMb,IAAUW;QAEhB,OAAA;YACE,MAAM0B,IAAOrC,EAAQsC,gBAAgBP,EAAOC,IAAaD,EAAOE,IAAcF,EAAOH;YACrF,IAAIW,MAAcF,MAASA,EAAKG;YAGhC,OAFIvB,EAAMQ,QAAKc,KAAaA,IAEvBtB,EAAMU,eAAgBY,IAIpBT,EAAMM,QAAS;gBACpBK,SAASF;gBACTG,QAAQL,GAAMK;gBACd1C;iBANO;;AASb;;;sEC1DF,SAAgC4C,GAAU5C,GAAqB6C;IAC7D,MAAK7C,KAAaA,aAAmBjB,EAAAA,UACnC,MAAM,IAAI8B,MAAM;IAGlB+B,EAAIG,QAAQrC,GAAeX,EAAgBC,KAEvC6C,KAAWA,EAAQG,wBACrBJ,EAAIK,OAAOC,iBAAiBC,WAAWnD;IACvC4C,EAAIK,OAAOC,iBAAiBE,OAAOpD,EAAQQ,IAAIH,KAAKL;AAExD,4BFDA,SAA+BA;KAC7B,GAAAV,EAAAyD,SAAQrC,GAAeX,EAAgBC;AACzC"}