UNPKG

@casl/vue

Version:

Vue plugin for CASL which makes it easy to add permissions in any Vue application

1 lines 6.83 kB
{"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"}