{"version":3,"file":"index.mjs","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\nexport function reactiveAbility(ability: AnyAbility) {\n  if (Object.hasOwn(ability, 'possibleRulesFor')) {\n    return ability;\n  }\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 { inject, InjectionKey, provide } from 'vue';\nimport type { AnyAbility, Ability } from '@casl/ability';\nimport { reactiveAbility } from './reactiveAbility';\n\nexport const ABILITY_TOKEN: InjectionKey<AnyAbility> = Symbol('ability');\n\nexport function useAbility<T extends AnyAbility = Ability>(): T {\n  const ability = inject<T>(ABILITY_TOKEN);\n\n  if (!ability) {\n    throw new Error('Cannot inject Ability instance because it was not provided');\n  }\n\n  return ability;\n}\n\nexport function provideAbility(ability: AnyAbility) {\n  provide(ABILITY_TOKEN, reactiveAbility(ability));\n}\n","import { defineComponent, ComponentCustomProperties } from 'vue';\nimport {\n  SubjectType,\n  Generics,\n  AnyAbility,\n  Ability,\n  Abilities,\n  IfString,\n  AbilityTuple,\n} from '@casl/ability';\nimport { useAbility } from '../useAbility';\n\ntype AbilityCanProps<\n  T extends Abilities,\n  Else = IfString<T, { do: T } | { I: T }>\n> = T extends AbilityTuple\n  ? { do: T[0], on: T[1], field?: string } |\n  { I: T[0], a: Extract<T[1], SubjectType>, field?: string } |\n  { I: T[0], an: Extract<T[1], SubjectType>, field?: string } |\n  { I: T[0], this: Exclude<T[1], SubjectType>, field?: string }\n  : Else;\n\nexport type CanProps<T extends AnyAbility> = AbilityCanProps<Generics<T>['abilities']> & {\n  not?: boolean,\n  passThrough?: boolean\n};\n\ntype VueAbility = ComponentCustomProperties extends { $ability: AnyAbility }\n  ? ComponentCustomProperties['$ability']\n  : Ability;\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\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 isAllowed = ability.can($props[actionProp], $props[subjectProp], $props.field);\n      const canRender = props.not ? !isAllowed : isAllowed;\n\n      if (!props.passThrough) {\n        return canRender ? slots.default!() : null;\n      }\n\n      return slots.default!({\n        allowed: canRender,\n        ability,\n      });\n    };\n  }\n});\n","import { App } from 'vue';\nimport { AnyAbility, PureAbility } 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 PureAbility)) {\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;\n    app.config.globalProperties.$can = ability.can.bind(ability);\n  }\n}\n"],"names":["reactiveAbility","ability","Object","hasOwn","watcher","ref","on","value","possibleRulesFor","bind","action","subject","can","cannot","ABILITY_TOKEN","Symbol","useAbility","inject","Error","provideAbility","provide","detectSubjectProp","props","a","undefined","this","an","Can","defineComponent","name","I","String","do","Function","not","Boolean","passThrough","field","setup","slots","$props","actionProp","subjectProp","default","isAllowed","canRender","allowed","abilitiesPlugin","app","options","PureAbility","useGlobalProperties","config","globalProperties","$ability","$can"],"mappings":"oHAGO,SAASA,gBAAgBC,GAC9B,GAAIC,OAAOC,OAAOF,EAAS,oBACzB,OAAOA,EAGT,MAAMG,EAAUC,EAAI,MACpBJ,EAAQK,GAAG,WAAW,KACpBF,EAAQG,OAASH,EAAQG,KAAK,IAGhC,MAAMC,EAAmBP,EAAQO,iBAAiBC,KAAKR,GACvDA,EAAQO,iBAAmB,CAACE,EAAgBC,KAC1CP,EAAQG,MAAQH,EAAQG,MACxB,OAAOC,EAAiBE,EAAQC,EAAQ,EAE1CV,EAAQW,IAAMX,EAAQW,IAAIH,KAAKR,GAC/BA,EAAQY,OAASZ,EAAQY,OAAOJ,KAAKR,GAErC,OAAOA,CACT,OClBaa,EAA0CC,OAAO,WAEvD,SAASC,aACd,MAAMf,EAAUgB,EAAUH,GAE1B,IAAKb,EACH,MAAM,IAAIiB,MAAM,8DAGlB,OAAOjB,CACT,CAEO,SAASkB,eAAelB,GAC7BmB,EAAQN,EAAed,gBAAgBC,GACzC,CCaA,SAASoB,EAAkBC,GACzB,GAAIA,EAAMC,SAAMC,EACd,MAAO,IAGT,GAAIF,EAAMG,YAASD,EACjB,MAAO,OAGT,GAAIF,EAAMI,UAAOF,EACf,MAAO,KAGT,MAAO,EACT,CAEaG,MAAAA,EAAMC,EAAsC,CACvDC,KAAM,MACNP,MAAO,CACLQ,EAAGC,OACHC,GAAID,OACJR,EAAG,CAACQ,OAAQE,UACZP,GAAI,CAACK,OAAQE,UACbR,KAAM,CAACM,OAAQE,SAAU/B,QACzBI,GAAI,CAACyB,OAAQE,SAAU/B,QACvBgC,IAAKC,QACLC,YAAaD,QACbE,MAAON,QAETO,KAAAA,CAAMhB,GAAOiB,MAAEA,IACb,MAAMC,EAASlB,EACf,IAAImB,EAAa,KACjB,IAAIC,EAAc,KAElB,GAAIF,EAAOC,UAAgBjB,EAAW,CACpCiB,EAAa,IACbC,EAAcrB,EAAkBC,EAClC,CAEA,IAAKkB,EAAOC,GACV,MAAM,IAAIvB,MAAM,iDAGlB,IAAKqB,EAAMI,QACT,MAAM,IAAIzB,MAAM,mCAGlB,MAAMjB,EAAUe,aAEhB,MAAO,KACL,MAAM4B,EAAY3C,EAAQW,IAAI4B,EAAOC,GAAaD,EAAOE,GAAcF,EAAOH,OAC9E,MAAMQ,EAAYvB,EAAMY,KAAOU,EAAYA,EAE3C,IAAKtB,EAAMc,YACT,OAAOS,EAAYN,EAAMI,UAAa,KAGxC,OAAOJ,EAAMI,QAAS,CACpBG,QAASD,EACT5C,WACA,CAEN,ICpFK,SAAS8C,EAAgBC,EAAU/C,EAAqBgD,GAC7D,IAAKhD,KAAaA,aAAmBiD,GACnC,MAAM,IAAIhC,MAAM,gEAGlB8B,EAAI5B,QAAQN,EAAed,gBAAgBC,IAE3C,GAAIgD,GAAWA,EAAQE,oBAAqB,CAC1CH,EAAII,OAAOC,iBAAiBC,SAAWrD,EACvC+C,EAAII,OAAOC,iBAAiBE,KAAOtD,EAAQW,IAAIH,KAAKR,EACtD,CACF"}