@casl/vue 2.2.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- import{ref as i,inject as n,provide as r,defineComponent as t}from"vue";import{PureAbility as e}from"@casl/ability";function reactiveAbility(n){if(n.hasOwnProperty("possibleRulesFor"))return n;var r=i(true);n.on("updated",(function(){r.value=!r.value}));var t=n.possibleRulesFor.bind(n);n.possibleRulesFor=function(i,n){r.value=r.value;return t(i,n)};n.can=n.can.bind(n);n.cannot=n.cannot.bind(n);return n}var o=Symbol("ability");function useAbility(){var i=n(o);if(!i)throw new Error("Cannot inject Ability instance because it was not provided");return i}function provideAbility(i){r(o,reactiveAbility(i))}function a(i){if("a"in i)return"a";if("this"in i)return"this";if("an"in i)return"an";return""}var u=t({name:"Can",props:{I:String,do:String,a:[String,Function],an:[String,Function],this:[String,Function,Object],on:[String,Function,Object],not:Boolean,passThrough:Boolean,field:String},setup:function i(n,r){var t=r.slots;var e=n;var o="do";var u="on";if(!(o in n)){o="I";u=a(n)}if(!e[o])throw new Error("Neither `I` nor `do` prop was passed in <Can>");if(!t.default)throw new Error("Expects to receive default slot");var l=useAbility();return function(){var i=l.can(e[o],e[u],e.field);var r=n.not?!i:i;if(!n.passThrough)return r?t.default():null;return t.default({allowed:r,ability:l})}}});function l(i,n,r){if(!n||!(n instanceof e))throw new Error("Please provide an Ability instance to abilitiesPlugin plugin");i.provide(o,reactiveAbility(n));if(r&&r.useGlobalProperties){i.config.globalProperties.$ability=n;i.config.globalProperties.$can=n.can.bind(n)}}export{o as ABILITY_TOKEN,u as Can,l as abilitiesPlugin,provideAbility,useAbility};
1
+ import{ref as i,inject as r,provide as t,defineComponent as n}from"vue";import{PureAbility as e}from"@casl/ability";function reactiveAbility(r){if(r.hasOwnProperty("possibleRulesFor"))return r;var t=i(true);r.on("updated",(function(){t.value=!t.value}));var n=r.possibleRulesFor.bind(r);r.possibleRulesFor=function(i,r){t.value=t.value;return n(i,r)};r.can=r.can.bind(r);r.cannot=r.cannot.bind(r);return r}var o=Symbol("ability");function useAbility(){var i=r(o);if(!i)throw new Error("Cannot inject Ability instance because it was not provided");return i}function provideAbility(i){t(o,reactiveAbility(i))}function a(i){if(void 0!==i.a)return"a";if(void 0!==i.this)return"this";if(void 0!==i.an)return"an";return""}var u=n({name:"Can",props:{I:String,do:String,a:[String,Function],an:[String,Function],this:[String,Function,Object],on:[String,Function,Object],not:Boolean,passThrough:Boolean,field:String},setup:function i(r,t){var n=t.slots;var e=r;var o="do";var u="on";if(void 0===e[o]){o="I";u=a(r)}if(!e[o])throw new Error("Neither `I` nor `do` prop was passed in <Can>");if(!n.default)throw new Error("Expects to receive default slot");var l=useAbility();return function(){var i=l.can(e[o],e[u],e.field);var t=r.not?!i:i;if(!r.passThrough)return t?n.default():null;return n.default({allowed:t,ability:l})}}});function l(i,r,t){if(!r||!(r instanceof e))throw new Error("Please provide an Ability instance to abilitiesPlugin plugin");i.provide(o,reactiveAbility(r));if(t&&t.useGlobalProperties){i.config.globalProperties.$ability=r;i.config.globalProperties.$can=r.can.bind(r)}}export{o as ABILITY_TOKEN,u as Can,l as abilitiesPlugin,provideAbility,useAbility};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","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 (ability.hasOwnProperty('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<Ability> = 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 ('a' in props) {\n return 'a';\n }\n\n if ('this' in props) {\n return 'this';\n }\n\n if ('an' in props) {\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 (!(actionProp in props)) {\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","hasOwnProperty","watcher","ref","on","value","possibleRulesFor","bind","action","subject","can","cannot","ABILITY_TOKEN","Symbol","useAbility","inject","Error","provideAbility","provide","detectSubjectProp","props","Can","defineComponent","name","I","String","do","a","Function","an","this","Object","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,MAC1BA,EAAQC,eAAe,2BAClBD,MAGHE,EAAUC,EAAI,MACpBH,EAAQI,GAAG,WAAW,WACpBF,EAAQG,OAASH,EAAQG,aAGrBC,EAAmBN,EAAQM,iBAAiBC,KAAKP,GACvDA,EAAQM,iBAAmB,SAACE,EAAgBC,GAC1CP,EAAQG,MAAQH,EAAQG,aACjBC,EAAiBE,EAAQC,IAElCT,EAAQU,IAAMV,EAAQU,IAAIH,KAAKP,GAC/BA,EAAQW,OAASX,EAAQW,OAAOJ,KAAKP,UAE9BA,MCjBIY,EAAuCC,OAAO,WAEpD,SAASC,iBACRd,EAAUe,EAAUH,OAErBZ,QACG,IAAIgB,MAAM,qEAGXhB,EAGF,SAASiB,eAAejB,GAC7BkB,EAAQN,EAAeb,gBAAgBC,ICczC,SAASmB,EAAkBC,MACrB,MAAOA,QACF,OAGL,SAAUA,QACL,UAGL,OAAQA,QACH,WAGF,OAGIC,EAAMC,EAAsC,CACvDC,KAAM,MACNH,MAAO,CACLI,EAAGC,OACHC,GAAID,OACJE,EAAG,CAACF,OAAQG,UACZC,GAAI,CAACJ,OAAQG,UACbE,KAAM,CAACL,OAAQG,SAAUG,QACzB3B,GAAI,CAACqB,OAAQG,SAAUG,QACvBC,IAAKC,QACLC,YAAaD,QACbE,MAAOV,QAETW,iBAAMhB,SAASiB,IAAAA,UACPC,EAASlB,MACXmB,EAAa,SACbC,EAAc,UAEZD,KAAcnB,GAAQ,CAC1BmB,EAAa,IACbC,EAAcrB,EAAkBC,OAG7BkB,EAAOC,SACJ,IAAIvB,MAAM,qDAGbqB,EAAMI,cACH,IAAIzB,MAAM,uCAGZhB,EAAUc,oBAET,eACC4B,EAAY1C,EAAQU,IAAI4B,EAAOC,GAAaD,EAAOE,GAAcF,EAAOH,WACxEQ,EAAYvB,EAAMY,KAAOU,EAAYA,MAEtCtB,EAAMc,mBACFS,EAAYN,EAAMI,UAAa,YAGjCJ,EAAMI,QAAS,CACpBG,QAASD,EACT3C,QAAAA,QCjFD,SAAS6C,EAAgBC,EAAU9C,EAAqB+C,OACxD/C,KAAaA,aAAmBgD,SAC7B,IAAIhC,MAAM,gEAGlB8B,EAAI5B,QAAQN,EAAeb,gBAAgBC,OAEvC+C,GAAWA,EAAQE,oBAAqB,CAC1CH,EAAII,OAAOC,iBAAiBC,SAAWpD,EACvC8C,EAAII,OAAOC,iBAAiBE,KAAOrD,EAAQU,IAAIH,KAAKP"}
1
+ {"version":3,"file":"index.js","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 (ability.hasOwnProperty('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<Ability> = 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","hasOwnProperty","watcher","ref","on","value","possibleRulesFor","bind","action","subject","can","cannot","ABILITY_TOKEN","Symbol","useAbility","inject","Error","provideAbility","provide","detectSubjectProp","props","undefined","a","this","an","Can","defineComponent","name","I","String","do","Function","Object","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,MAC1BA,EAAQC,eAAe,2BAClBD,MAGHE,EAAUC,EAAI,MACpBH,EAAQI,GAAG,WAAW,WACpBF,EAAQG,OAASH,EAAQG,aAGrBC,EAAmBN,EAAQM,iBAAiBC,KAAKP,GACvDA,EAAQM,iBAAmB,SAACE,EAAgBC,GAC1CP,EAAQG,MAAQH,EAAQG,aACjBC,EAAiBE,EAAQC,IAElCT,EAAQU,IAAMV,EAAQU,IAAIH,KAAKP,GAC/BA,EAAQW,OAASX,EAAQW,OAAOJ,KAAKP,UAE9BA,MCjBIY,EAAuCC,OAAO,WAEpD,SAASC,iBACRd,EAAUe,EAAUH,OAErBZ,QACG,IAAIgB,MAAM,qEAGXhB,EAGF,SAASiB,eAAejB,GAC7BkB,EAAQN,EAAeb,gBAAgBC,ICczC,SAASmB,EAAkBC,WACTC,IAAZD,EAAME,QACD,YAGUD,IAAfD,EAAMG,WACD,eAGQF,IAAbD,EAAMI,SACD,WAGF,OAGIC,EAAMC,EAAsC,CACvDC,KAAM,MACNP,MAAO,CACLQ,EAAGC,OACHC,GAAID,OACJP,EAAG,CAACO,OAAQE,UACZP,GAAI,CAACK,OAAQE,UACbR,KAAM,CAACM,OAAQE,SAAUC,QACzB5B,GAAI,CAACyB,OAAQE,SAAUC,QACvBC,IAAKC,QACLC,YAAaD,QACbE,MAAOP,QAETQ,iBAAMjB,SAASkB,IAAAA,UACPC,EAASnB,MACXoB,EAAa,SACbC,EAAc,aAESpB,IAAvBkB,EAAOC,GAA2B,CACpCA,EAAa,IACbC,EAActB,EAAkBC,OAG7BmB,EAAOC,SACJ,IAAIxB,MAAM,qDAGbsB,EAAMI,cACH,IAAI1B,MAAM,uCAGZhB,EAAUc,oBAET,eACC6B,EAAY3C,EAAQU,IAAI6B,EAAOC,GAAaD,EAAOE,GAAcF,EAAOH,WACxEQ,EAAYxB,EAAMa,KAAOU,EAAYA,MAEtCvB,EAAMe,mBACFS,EAAYN,EAAMI,UAAa,YAGjCJ,EAAMI,QAAS,CACpBG,QAASD,EACT5C,QAAAA,QCjFD,SAAS8C,EAAgBC,EAAU/C,EAAqBgD,OACxDhD,KAAaA,aAAmBiD,SAC7B,IAAIjC,MAAM,gEAGlB+B,EAAI7B,QAAQN,EAAeb,gBAAgBC,OAEvCgD,GAAWA,EAAQE,oBAAqB,CAC1CH,EAAII,OAAOC,iBAAiBC,SAAWrD,EACvC+C,EAAII,OAAOC,iBAAiBE,KAAOtD,EAAQU,IAAIH,KAAKP"}
@@ -1,2 +1,2 @@
1
- import{ref as t,inject as i,provide as n,defineComponent as r}from"vue";import{PureAbility as e}from"@casl/ability";function reactiveAbility(i){if(i.hasOwnProperty("possibleRulesFor"))return i;const n=t(true);i.on("updated",(()=>{n.value=!n.value}));const r=i.possibleRulesFor.bind(i);i.possibleRulesFor=(t,i)=>{n.value=n.value;return r(t,i)};i.can=i.can.bind(i);i.cannot=i.cannot.bind(i);return i}const o=Symbol("ability");function useAbility(){const t=i(o);if(!t)throw new Error("Cannot inject Ability instance because it was not provided");return t}function provideAbility(t){n(o,reactiveAbility(t))}function s(t){if("a"in t)return"a";if("this"in t)return"this";if("an"in t)return"an";return""}const u=r({name:"Can",props:{I:String,do:String,a:[String,Function],an:[String,Function],this:[String,Function,Object],on:[String,Function,Object],not:Boolean,passThrough:Boolean,field:String},setup(t,{slots:i}){const n=t;let r="do";let e="on";if(!(r in t)){r="I";e=s(t)}if(!n[r])throw new Error("Neither `I` nor `do` prop was passed in <Can>");if(!i.default)throw new Error("Expects to receive default slot");const o=useAbility();return()=>{const s=o.can(n[r],n[e],n.field);const u=t.not?!s:s;if(!t.passThrough)return u?i.default():null;return i.default({allowed:u,ability:o})}}});function a(t,i,n){if(!i||!(i instanceof e))throw new Error("Please provide an Ability instance to abilitiesPlugin plugin");t.provide(o,reactiveAbility(i));if(n&&n.useGlobalProperties){t.config.globalProperties.$ability=i;t.config.globalProperties.$can=i.can.bind(i)}}export{o as ABILITY_TOKEN,u as Can,a as abilitiesPlugin,provideAbility,useAbility};
1
+ import{ref as t,inject as i,provide as n,defineComponent as r}from"vue";import{PureAbility as o}from"@casl/ability";function reactiveAbility(i){if(i.hasOwnProperty("possibleRulesFor"))return i;const n=t(true);i.on("updated",(()=>{n.value=!n.value}));const r=i.possibleRulesFor.bind(i);i.possibleRulesFor=(t,i)=>{n.value=n.value;return r(t,i)};i.can=i.can.bind(i);i.cannot=i.cannot.bind(i);return i}const e=Symbol("ability");function useAbility(){const t=i(e);if(!t)throw new Error("Cannot inject Ability instance because it was not provided");return t}function provideAbility(t){n(e,reactiveAbility(t))}function s(t){if(void 0!==t.a)return"a";if(void 0!==t.this)return"this";if(void 0!==t.an)return"an";return""}const u=r({name:"Can",props:{I:String,do:String,a:[String,Function],an:[String,Function],this:[String,Function,Object],on:[String,Function,Object],not:Boolean,passThrough:Boolean,field:String},setup(t,{slots:i}){const n=t;let r="do";let o="on";if(void 0===n[r]){r="I";o=s(t)}if(!n[r])throw new Error("Neither `I` nor `do` prop was passed in <Can>");if(!i.default)throw new Error("Expects to receive default slot");const e=useAbility();return()=>{const s=e.can(n[r],n[o],n.field);const u=t.not?!s:s;if(!t.passThrough)return u?i.default():null;return i.default({allowed:u,ability:e})}}});function l(t,i,n){if(!i||!(i instanceof o))throw new Error("Please provide an Ability instance to abilitiesPlugin plugin");t.provide(e,reactiveAbility(i));if(n&&n.useGlobalProperties){t.config.globalProperties.$ability=i;t.config.globalProperties.$can=i.can.bind(i)}}export{e as ABILITY_TOKEN,u as Can,l as abilitiesPlugin,provideAbility,useAbility};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"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 (ability.hasOwnProperty('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<Ability> = 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 ('a' in props) {\n return 'a';\n }\n\n if ('this' in props) {\n return 'this';\n }\n\n if ('an' in props) {\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 (!(actionProp in props)) {\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","hasOwnProperty","watcher","ref","on","value","possibleRulesFor","bind","action","subject","can","cannot","ABILITY_TOKEN","Symbol","useAbility","inject","Error","provideAbility","provide","detectSubjectProp","props","Can","defineComponent","name","I","String","do","a","Function","an","this","Object","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,MAC1BA,EAAQC,eAAe,2BAClBD,QAGHE,EAAUC,EAAI,MACpBH,EAAQI,GAAG,WAAW,KACpBF,EAAQG,OAASH,EAAQG,eAGrBC,EAAmBN,EAAQM,iBAAiBC,KAAKP,GACvDA,EAAQM,iBAAmB,CAACE,EAAgBC,KAC1CP,EAAQG,MAAQH,EAAQG,aACjBC,EAAiBE,EAAQC,IAElCT,EAAQU,IAAMV,EAAQU,IAAIH,KAAKP,GAC/BA,EAAQW,OAASX,EAAQW,OAAOJ,KAAKP,UAE9BA,QCjBIY,EAAuCC,OAAO,WAEpD,SAASC,mBACRd,EAAUe,EAAUH,OAErBZ,QACG,IAAIgB,MAAM,qEAGXhB,EAGF,SAASiB,eAAejB,GAC7BkB,EAAQN,EAAeb,gBAAgBC,ICczC,SAASmB,EAAkBC,MACrB,MAAOA,QACF,OAGL,SAAUA,QACL,UAGL,OAAQA,QACH,WAGF,SAGIC,EAAMC,EAAsC,CACvDC,KAAM,MACNH,MAAO,CACLI,EAAGC,OACHC,GAAID,OACJE,EAAG,CAACF,OAAQG,UACZC,GAAI,CAACJ,OAAQG,UACbE,KAAM,CAACL,OAAQG,SAAUG,QACzB3B,GAAI,CAACqB,OAAQG,SAAUG,QACvBC,IAAKC,QACLC,YAAaD,QACbE,MAAOV,QAETW,MAAMhB,GAAOiB,MAAEA,UACPC,EAASlB,MACXmB,EAAa,SACbC,EAAc,UAEZD,KAAcnB,GAAQ,CAC1BmB,EAAa,IACbC,EAAcrB,EAAkBC,OAG7BkB,EAAOC,SACJ,IAAIvB,MAAM,qDAGbqB,EAAMI,cACH,IAAIzB,MAAM,yCAGZhB,EAAUc,mBAET,WACC4B,EAAY1C,EAAQU,IAAI4B,EAAOC,GAAaD,EAAOE,GAAcF,EAAOH,aACxEQ,EAAYvB,EAAMY,KAAOU,EAAYA,MAEtCtB,EAAMc,mBACFS,EAAYN,EAAMI,UAAa,YAGjCJ,EAAMI,QAAS,CACpBG,QAASD,EACT3C,QAAAA,QCjFD,SAAS6C,EAAgBC,EAAU9C,EAAqB+C,OACxD/C,KAAaA,aAAmBgD,SAC7B,IAAIhC,MAAM,gEAGlB8B,EAAI5B,QAAQN,EAAeb,gBAAgBC,OAEvC+C,GAAWA,EAAQE,oBAAqB,CAC1CH,EAAII,OAAOC,iBAAiBC,SAAWpD,EACvC8C,EAAII,OAAOC,iBAAiBE,KAAOrD,EAAQU,IAAIH,KAAKP"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -24,29 +24,37 @@ export declare type CanProps<T extends AnyAbility> = AbilityCanProps<Generics<T>
24
24
  not?: boolean;
25
25
  passThrough?: boolean;
26
26
  };
27
- export declare const Can: import("vue").DefineComponent<CanProps<Ability<AbilityTuple<string, import("@casl/ability").Subject>, import("@casl/ability").MongoQuery<import("@casl/ability/dist/types/types").AnyObject>>>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, import("vue").EmitsOptions, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<({} & {
28
- on?: import("@casl/ability").Subject | undefined;
27
+ export declare const Can: import("vue").DefineComponent<CanProps<Ability<AbilityTuple<string, import("@casl/ability").Subject>, import("@casl/ability").MongoQuery<import("@casl/ability/dist/types/types").AnyObject>>>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<{
28
+ do: string;
29
+ on: import("@casl/ability").Subject;
29
30
  field?: string | undefined;
30
- do?: string | undefined;
31
+ } & {
31
32
  not?: boolean | undefined;
32
33
  passThrough?: boolean | undefined;
33
- }) | ({} & {
34
- a?: SubjectType | undefined;
35
- I?: string | undefined;
34
+ }> | Readonly<{
35
+ I: string;
36
+ a: SubjectType;
36
37
  field?: string | undefined;
38
+ } & {
37
39
  not?: boolean | undefined;
38
40
  passThrough?: boolean | undefined;
39
- }) | ({} & {
40
- I?: string | undefined;
41
+ }> | Readonly<{
42
+ I: string;
43
+ an: SubjectType;
41
44
  field?: string | undefined;
42
- an?: SubjectType | undefined;
45
+ } & {
43
46
  not?: boolean | undefined;
44
47
  passThrough?: boolean | undefined;
45
- }) | ({} & {
46
- this?: unknown;
47
- I?: string | undefined;
48
+ }> | Readonly<{
49
+ I: string;
50
+ this: {
51
+ [x: string]: any;
52
+ [x: number]: any;
53
+ [x: symbol]: any;
54
+ };
48
55
  field?: string | undefined;
56
+ } & {
49
57
  not?: boolean | undefined;
50
58
  passThrough?: boolean | undefined;
51
- })>, {} | {} | {} | {}>;
59
+ }>, {} | {} | {} | {}>;
52
60
  export {};
package/dist/umd/index.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(i,n){"object"===typeof exports&&"undefined"!==typeof module?n(exports,require("vue"),require("@casl/ability")):"function"===typeof define&&define.amd?define(["exports","vue","@casl/ability"],n):(i="undefined"!==typeof globalThis?globalThis:i||self,n((i.casl=i.casl||{},i.casl.vue={}),i.Vue,i.casl))})(this,(function(i,n,t){"use strict";function reactiveAbility(i){if(i.hasOwnProperty("possibleRulesFor"))return i;var t=n.ref(true);i.on("updated",(function(){t.value=!t.value}));var e=i.possibleRulesFor.bind(i);i.possibleRulesFor=function(i,n){t.value=t.value;return e(i,n)};i.can=i.can.bind(i);i.cannot=i.cannot.bind(i);return i}var e=Symbol("ability");function useAbility(){var i=n.inject(e);if(!i)throw new Error("Cannot inject Ability instance because it was not provided");return i}function provideAbility(i){n.provide(e,reactiveAbility(i))}function r(i){if("a"in i)return"a";if("this"in i)return"this";if("an"in i)return"an";return""}var o=n.defineComponent({name:"Can",props:{I:String,do:String,a:[String,Function],an:[String,Function],this:[String,Function,Object],on:[String,Function,Object],not:Boolean,passThrough:Boolean,field:String},setup:function i(n,t){var e=t.slots;var o=n;var u="do";var a="on";if(!(u in n)){u="I";a=r(n)}if(!o[u])throw new Error("Neither `I` nor `do` prop was passed in <Can>");if(!e.default)throw new Error("Expects to receive default slot");var l=useAbility();return function(){var i=l.can(o[u],o[a],o.field);var t=n.not?!i:i;if(!n.passThrough)return t?e.default():null;return e.default({allowed:t,ability:l})}}});function u(i,n,r){if(!n||!(n instanceof t.PureAbility))throw new Error("Please provide an Ability instance to abilitiesPlugin plugin");i.provide(e,reactiveAbility(n));if(r&&r.useGlobalProperties){i.config.globalProperties.$ability=n;i.config.globalProperties.$can=n.can.bind(n)}}i.ABILITY_TOKEN=e;i.Can=o;i.abilitiesPlugin=u;i.provideAbility=provideAbility;i.useAbility=useAbility;Object.defineProperty(i,"__esModule",{value:true})}));
1
+ (function(i,t){"object"===typeof exports&&"undefined"!==typeof module?t(exports,require("vue"),require("@casl/ability")):"function"===typeof define&&define.amd?define(["exports","vue","@casl/ability"],t):(i="undefined"!==typeof globalThis?globalThis:i||self,t((i.casl=i.casl||{},i.casl.vue={}),i.Vue,i.casl))})(this,(function(i,t,e){"use strict";function reactiveAbility(i){if(i.hasOwnProperty("possibleRulesFor"))return i;var e=t.ref(true);i.on("updated",(function(){e.value=!e.value}));var n=i.possibleRulesFor.bind(i);i.possibleRulesFor=function(i,t){e.value=e.value;return n(i,t)};i.can=i.can.bind(i);i.cannot=i.cannot.bind(i);return i}var n=Symbol("ability");function useAbility(){var i=t.inject(n);if(!i)throw new Error("Cannot inject Ability instance because it was not provided");return i}function provideAbility(i){t.provide(n,reactiveAbility(i))}function r(i){if(void 0!==i.a)return"a";if(void 0!==i.this)return"this";if(void 0!==i.an)return"an";return""}var o=t.defineComponent({name:"Can",props:{I:String,do:String,a:[String,Function],an:[String,Function],this:[String,Function,Object],on:[String,Function,Object],not:Boolean,passThrough:Boolean,field:String},setup:function i(t,e){var n=e.slots;var o=t;var u="do";var a="on";if(void 0===o[u]){u="I";a=r(t)}if(!o[u])throw new Error("Neither `I` nor `do` prop was passed in <Can>");if(!n.default)throw new Error("Expects to receive default slot");var l=useAbility();return function(){var i=l.can(o[u],o[a],o.field);var e=t.not?!i:i;if(!t.passThrough)return e?n.default():null;return n.default({allowed:e,ability:l})}}});function u(i,t,r){if(!t||!(t instanceof e.PureAbility))throw new Error("Please provide an Ability instance to abilitiesPlugin plugin");i.provide(n,reactiveAbility(t));if(r&&r.useGlobalProperties){i.config.globalProperties.$ability=t;i.config.globalProperties.$can=t.can.bind(t)}}i.ABILITY_TOKEN=n;i.Can=o;i.abilitiesPlugin=u;i.provideAbility=provideAbility;i.useAbility=useAbility;Object.defineProperty(i,"__esModule",{value:true})}));
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","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 (ability.hasOwnProperty('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<Ability> = 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 ('a' in props) {\n return 'a';\n }\n\n if ('this' in props) {\n return 'this';\n }\n\n if ('an' in props) {\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 (!(actionProp in props)) {\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","hasOwnProperty","watcher","ref","on","value","possibleRulesFor","bind","action","subject","can","cannot","ABILITY_TOKEN","Symbol","useAbility","inject","Error","provideAbility","provide","detectSubjectProp","props","Can","defineComponent","name","I","String","do","a","Function","an","this","Object","not","Boolean","passThrough","field","setup","slots","$props","actionProp","subjectProp","default","isAllowed","canRender","allowed","abilitiesPlugin","app","options","PureAbility","useGlobalProperties","config","globalProperties","$ability","$can"],"mappings":"0VAGO,SAASA,gBAAgBC,MAC1BA,EAAQC,eAAe,2BAClBD,MAGHE,EAAUC,MAAI,MACpBH,EAAQI,GAAG,WAAW,WACpBF,EAAQG,OAASH,EAAQG,aAGrBC,EAAmBN,EAAQM,iBAAiBC,KAAKP,GACvDA,EAAQM,iBAAmB,SAACE,EAAgBC,GAC1CP,EAAQG,MAAQH,EAAQG,aACjBC,EAAiBE,EAAQC,IAElCT,EAAQU,IAAMV,EAAQU,IAAIH,KAAKP,GAC/BA,EAAQW,OAASX,EAAQW,OAAOJ,KAAKP,UAE9BA,MCjBIY,EAAuCC,OAAO,WAEpD,SAASC,iBACRd,EAAUe,SAAUH,OAErBZ,QACG,IAAIgB,MAAM,qEAGXhB,EAGF,SAASiB,eAAejB,GAC7BkB,UAAQN,EAAeb,gBAAgBC,ICczC,SAASmB,EAAkBC,MACrB,MAAOA,QACF,OAGL,SAAUA,QACL,UAGL,OAAQA,QACH,WAGF,OAGIC,EAAMC,kBAAsC,CACvDC,KAAM,MACNH,MAAO,CACLI,EAAGC,OACHC,GAAID,OACJE,EAAG,CAACF,OAAQG,UACZC,GAAI,CAACJ,OAAQG,UACbE,KAAM,CAACL,OAAQG,SAAUG,QACzB3B,GAAI,CAACqB,OAAQG,SAAUG,QACvBC,IAAKC,QACLC,YAAaD,QACbE,MAAOV,QAETW,iBAAMhB,SAASiB,IAAAA,UACPC,EAASlB,MACXmB,EAAa,SACbC,EAAc,UAEZD,KAAcnB,GAAQ,CAC1BmB,EAAa,IACbC,EAAcrB,EAAkBC,OAG7BkB,EAAOC,SACJ,IAAIvB,MAAM,qDAGbqB,EAAMI,cACH,IAAIzB,MAAM,uCAGZhB,EAAUc,oBAET,eACC4B,EAAY1C,EAAQU,IAAI4B,EAAOC,GAAaD,EAAOE,GAAcF,EAAOH,WACxEQ,EAAYvB,EAAMY,KAAOU,EAAYA,MAEtCtB,EAAMc,mBACFS,EAAYN,EAAMI,UAAa,YAGjCJ,EAAMI,QAAS,CACpBG,QAASD,EACT3C,QAAAA,QCjFD,SAAS6C,EAAgBC,EAAU9C,EAAqB+C,OACxD/C,KAAaA,aAAmBgD,qBAC7B,IAAIhC,MAAM,gEAGlB8B,EAAI5B,QAAQN,EAAeb,gBAAgBC,OAEvC+C,GAAWA,EAAQE,oBAAqB,CAC1CH,EAAII,OAAOC,iBAAiBC,SAAWpD,EACvC8C,EAAII,OAAOC,iBAAiBE,KAAOrD,EAAQU,IAAIH,KAAKP"}
1
+ {"version":3,"file":"index.js","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 (ability.hasOwnProperty('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<Ability> = 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","hasOwnProperty","watcher","ref","on","value","possibleRulesFor","bind","action","subject","can","cannot","ABILITY_TOKEN","Symbol","useAbility","inject","Error","provideAbility","provide","detectSubjectProp","props","undefined","a","this","an","Can","defineComponent","name","I","String","do","Function","Object","not","Boolean","passThrough","field","setup","slots","$props","actionProp","subjectProp","default","isAllowed","canRender","allowed","abilitiesPlugin","app","options","PureAbility","useGlobalProperties","config","globalProperties","$ability","$can"],"mappings":"0VAGO,SAASA,gBAAgBC,MAC1BA,EAAQC,eAAe,2BAClBD,MAGHE,EAAUC,MAAI,MACpBH,EAAQI,GAAG,WAAW,WACpBF,EAAQG,OAASH,EAAQG,aAGrBC,EAAmBN,EAAQM,iBAAiBC,KAAKP,GACvDA,EAAQM,iBAAmB,SAACE,EAAgBC,GAC1CP,EAAQG,MAAQH,EAAQG,aACjBC,EAAiBE,EAAQC,IAElCT,EAAQU,IAAMV,EAAQU,IAAIH,KAAKP,GAC/BA,EAAQW,OAASX,EAAQW,OAAOJ,KAAKP,UAE9BA,MCjBIY,EAAuCC,OAAO,WAEpD,SAASC,iBACRd,EAAUe,SAAUH,OAErBZ,QACG,IAAIgB,MAAM,qEAGXhB,EAGF,SAASiB,eAAejB,GAC7BkB,UAAQN,EAAeb,gBAAgBC,ICczC,SAASmB,EAAkBC,WACTC,IAAZD,EAAME,QACD,YAGUD,IAAfD,EAAMG,WACD,eAGQF,IAAbD,EAAMI,SACD,WAGF,OAGIC,EAAMC,kBAAsC,CACvDC,KAAM,MACNP,MAAO,CACLQ,EAAGC,OACHC,GAAID,OACJP,EAAG,CAACO,OAAQE,UACZP,GAAI,CAACK,OAAQE,UACbR,KAAM,CAACM,OAAQE,SAAUC,QACzB5B,GAAI,CAACyB,OAAQE,SAAUC,QACvBC,IAAKC,QACLC,YAAaD,QACbE,MAAOP,QAETQ,iBAAMjB,SAASkB,IAAAA,UACPC,EAASnB,MACXoB,EAAa,SACbC,EAAc,aAESpB,IAAvBkB,EAAOC,GAA2B,CACpCA,EAAa,IACbC,EAActB,EAAkBC,OAG7BmB,EAAOC,SACJ,IAAIxB,MAAM,qDAGbsB,EAAMI,cACH,IAAI1B,MAAM,uCAGZhB,EAAUc,oBAET,eACC6B,EAAY3C,EAAQU,IAAI6B,EAAOC,GAAaD,EAAOE,GAAcF,EAAOH,WACxEQ,EAAYxB,EAAMa,KAAOU,EAAYA,MAEtCvB,EAAMe,mBACFS,EAAYN,EAAMI,UAAa,YAGjCJ,EAAMI,QAAS,CACpBG,QAASD,EACT5C,QAAAA,QCjFD,SAAS8C,EAAgBC,EAAU/C,EAAqBgD,OACxDhD,KAAaA,aAAmBiD,qBAC7B,IAAIjC,MAAM,gEAGlB+B,EAAI7B,QAAQN,EAAeb,gBAAgBC,OAEvCgD,GAAWA,EAAQE,oBAAqB,CAC1CH,EAAII,OAAOC,iBAAiBC,SAAWrD,EACvC+C,EAAII,OAAOC,iBAAiBE,KAAOtD,EAAQU,IAAIH,KAAKP"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@casl/vue",
3
- "version": "2.2.0",
3
+ "version": "2.2.1",
4
4
  "description": "Vue plugin for CASL which makes it easy to add permissions in any Vue application",
5
5
  "main": "dist/umd/index.js",
6
6
  "module": "dist/es5m/index.js",
@@ -50,7 +50,7 @@
50
50
  "@types/jest": "^28.0.0",
51
51
  "chai": "^4.1.0",
52
52
  "chai-spies": "^1.0.0",
53
- "vue": "^3.0.5"
53
+ "vue": "^3.2.45"
54
54
  },
55
55
  "files": [
56
56
  "dist",