@casl/vue 2.1.1 → 2.2.0

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)};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 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};
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\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","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","can","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,WAG3BT,MCfIU,EAAuCC,OAAO,WAEpD,SAASC,iBACRZ,EAAUa,EAAUH,OAErBV,QACG,IAAIc,MAAM,qEAGXd,EAGF,SAASe,eAAef,GAC7BgB,EAAQN,EAAeX,gBAAgBC,ICczC,SAASiB,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,QACzBzB,GAAI,CAACmB,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,uCAGZd,EAAUY,oBAET,eACC4B,EAAYxC,EAAQyC,IAAIL,EAAOC,GAAaD,EAAOE,GAAcF,EAAOH,WACxES,EAAYxB,EAAMY,KAAOU,EAAYA,MAEtCtB,EAAMc,mBACFU,EAAYP,EAAMI,UAAa,YAGjCJ,EAAMI,QAAS,CACpBI,QAASD,EACT1C,QAAAA,QCjFD,SAAS4C,EAAgBC,EAAU7C,EAAqB8C,OACxD9C,KAAaA,aAAmB+C,SAC7B,IAAIjC,MAAM,gEAGlB+B,EAAI7B,QAAQN,EAAeX,gBAAgBC,OAEvC8C,GAAWA,EAAQE,oBAAqB,CAC1CH,EAAII,OAAOC,iBAAiBC,SAAWnD,EACvC6C,EAAII,OAAOC,iBAAiBE,KAAOpD,EAAQyC,IAAIlC,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 ('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,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)};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 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};
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\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","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","can","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,WAG3BT,QCfIU,EAAuCC,OAAO,WAEpD,SAASC,mBACRZ,EAAUa,EAAUH,OAErBV,QACG,IAAIc,MAAM,qEAGXd,EAGF,SAASe,eAAef,GAC7BgB,EAAQN,EAAeX,gBAAgBC,ICczC,SAASiB,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,QACzBzB,GAAI,CAACmB,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,yCAGZd,EAAUY,mBAET,WACC4B,EAAYxC,EAAQyC,IAAIL,EAAOC,GAAaD,EAAOE,GAAcF,EAAOH,aACxES,EAAYxB,EAAMY,KAAOU,EAAYA,MAEtCtB,EAAMc,mBACFU,EAAYP,EAAMI,UAAa,YAGjCJ,EAAMI,QAAS,CACpBI,QAASD,EACT1C,QAAAA,QCjFD,SAAS4C,EAAgBC,EAAU7C,EAAqB8C,OACxD9C,KAAaA,aAAmB+C,SAC7B,IAAIjC,MAAM,gEAGlB+B,EAAI7B,QAAQN,EAAeX,gBAAgBC,OAEvC8C,GAAWA,EAAQE,oBAAqB,CAC1CH,EAAII,OAAOC,iBAAiBC,SAAWnD,EACvC6C,EAAII,OAAOC,iBAAiBE,KAAOpD,EAAQyC,IAAIlC,KAAKP"}
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"}
@@ -24,29 +24,29 @@ 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<Record<string | number | symbol, unknown>>>>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, import("vue").EmitsOptions, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<{} & {
28
- on?: string | Record<string | number | symbol, any> | import("@casl/ability").SubjectClass<string> | 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, import("vue").EmitsOptions, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<({} & {
28
+ on?: import("@casl/ability").Subject | undefined;
29
29
  field?: string | undefined;
30
30
  do?: string | undefined;
31
31
  not?: boolean | undefined;
32
32
  passThrough?: boolean | undefined;
33
- }> | Readonly<{} & {
34
- a?: string | import("@casl/ability").SubjectClass<string> | undefined;
33
+ }) | ({} & {
34
+ a?: SubjectType | undefined;
35
35
  I?: string | undefined;
36
36
  field?: string | undefined;
37
37
  not?: boolean | undefined;
38
38
  passThrough?: boolean | undefined;
39
- }> | Readonly<{} & {
39
+ }) | ({} & {
40
40
  I?: string | undefined;
41
41
  field?: string | undefined;
42
- an?: string | import("@casl/ability").SubjectClass<string> | undefined;
42
+ an?: SubjectType | undefined;
43
43
  not?: boolean | undefined;
44
44
  passThrough?: boolean | undefined;
45
- }> | Readonly<{} & {
45
+ }) | ({} & {
46
46
  this?: unknown;
47
47
  I?: string | undefined;
48
48
  field?: string | undefined;
49
49
  not?: boolean | undefined;
50
50
  passThrough?: boolean | undefined;
51
- }>, {} | {} | {} | {}>;
51
+ })>, {} | {} | {} | {}>;
52
52
  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)};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,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})}));
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\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","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","can","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,WAG3BT,MCfIU,EAAuCC,OAAO,WAEpD,SAASC,iBACRZ,EAAUa,SAAUH,OAErBV,QACG,IAAIc,MAAM,qEAGXd,EAGF,SAASe,eAAef,GAC7BgB,UAAQN,EAAeX,gBAAgBC,ICczC,SAASiB,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,QACzBzB,GAAI,CAACmB,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,uCAGZd,EAAUY,oBAET,eACC4B,EAAYxC,EAAQyC,IAAIL,EAAOC,GAAaD,EAAOE,GAAcF,EAAOH,WACxES,EAAYxB,EAAMY,KAAOU,EAAYA,MAEtCtB,EAAMc,mBACFU,EAAYP,EAAMI,UAAa,YAGjCJ,EAAMI,QAAS,CACpBI,QAASD,EACT1C,QAAAA,QCjFD,SAAS4C,EAAgBC,EAAU7C,EAAqB8C,OACxD9C,KAAaA,aAAmB+C,qBAC7B,IAAIjC,MAAM,gEAGlB+B,EAAI7B,QAAQN,EAAeX,gBAAgBC,OAEvC8C,GAAWA,EAAQE,oBAAqB,CAC1CH,EAAII,OAAOC,iBAAiBC,SAAWnD,EACvC6C,EAAII,OAAOC,iBAAiBE,KAAOpD,EAAQyC,IAAIlC,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 ('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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@casl/vue",
3
- "version": "2.1.1",
3
+ "version": "2.2.0",
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",
@@ -8,13 +8,15 @@
8
8
  "typings": "dist/types/index.d.ts",
9
9
  "exports": {
10
10
  ".": {
11
+ "types": "./dist/types/index.d.ts",
11
12
  "import": "./dist/es6m/index.mjs",
12
13
  "require": "./dist/umd/index.js"
13
14
  }
14
15
  },
15
16
  "repository": {
16
17
  "type": "git",
17
- "url": "https://github.com/stalniy/casl.git"
18
+ "url": "https://github.com/stalniy/casl.git",
19
+ "directory": "packages/casl-vue"
18
20
  },
19
21
  "homepage": "https://casl.js.org",
20
22
  "publishConfig": {
@@ -39,12 +41,13 @@
39
41
  "author": "Sergii Stotskyi <sergiy.stotskiy@gmail.com>",
40
42
  "license": "MIT",
41
43
  "peerDependencies": {
42
- "@casl/ability": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.1.0",
44
+ "@casl/ability": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.1.0 || ^6.0.0",
43
45
  "vue": "^3.0.0"
44
46
  },
45
47
  "devDependencies": {
46
- "@casl/ability": "^5.1.0",
48
+ "@casl/ability": "^6.0.0",
47
49
  "@casl/dx": "workspace:^1.0.0",
50
+ "@types/jest": "^28.0.0",
48
51
  "chai": "^4.1.0",
49
52
  "chai-spies": "^1.0.0",
50
53
  "vue": "^3.0.5"
package/CHANGELOG.md DELETED
@@ -1,347 +0,0 @@
1
- # Change Log
2
-
3
- All notable changes to this project will be documented in this file.
4
-
5
- ## [2.1.1](https://github.com/stalniy/casl/compare/@casl/vue@2.1.0...@casl/vue@2.1.1) (2021-07-05)
6
-
7
-
8
- ### Bug Fixes
9
-
10
- * **vue:** binds ability to $can method ([cbb3c13](https://github.com/stalniy/casl/commit/cbb3c133c3d9583e6fdbc95c068e2e6343befdc9)), closes [#522](https://github.com/stalniy/casl/issues/522)
11
-
12
- # [2.1.0](https://github.com/stalniy/casl/compare/@casl/vue@2.0.2...@casl/vue@2.1.0) (2021-05-12)
13
-
14
-
15
- ### Bug Fixes
16
-
17
- * adjusts package tags to improve discoverability ([73e88b0](https://github.com/stalniy/casl/commit/73e88b0a256625b193b2cd9dc4a219f2e1193cbc))
18
-
19
- ## [2.0.2](https://github.com/stalniy/casl/compare/@casl/vue@2.0.1...@casl/vue@2.0.2) (2021-01-25)
20
-
21
- ## [2.0.1](https://github.com/stalniy/casl/compare/@casl/vue@2.0.0...@casl/vue@2.0.1) (2021-01-23)
22
-
23
- # [2.0.0](https://github.com/stalniy/casl/compare/@casl/vue@1.2.1...@casl/vue@2.0.0) (2021-01-22)
24
-
25
-
26
- ### Code Refactoring
27
-
28
- * **vue:** adds support for vue 3 ([#444](https://github.com/stalniy/casl/issues/444)) ([e742bcf](https://github.com/stalniy/casl/commit/e742bcf0d187f8283ff171ec9760431759b55910)), closes [#396](https://github.com/stalniy/casl/issues/396)
29
-
30
-
31
- ### BREAKING CHANGES
32
-
33
- * **vue:** refactor to use Vue 3 what introduces a bunch of breaking changes:
34
-
35
- * `Ability` instance is not a required plugin parameter. Previously, we could decide whether to pass ability as plugin parameter or as root component option. Now, the only way is to pass it in plugin:
36
-
37
- **Before**
38
-
39
- ```js
40
- import { abilitiesPlugin } from '@casl/vue';
41
- import Vue from 'vue';
42
- import { ability } from './services/AppAbility';
43
-
44
- Vue.use(abilitiesPlugin);
45
- new Vue({
46
- ability
47
- }).$mount('#app')
48
- ```
49
-
50
- **After**
51
-
52
- ```js
53
- import { abilitiesPlugin } from '@casl/vue';
54
- import { createApp } from 'vue';
55
- import { ability } from './services/AppAbility';
56
-
57
- createApp()
58
- .use(abilitiesPlugin, ability)
59
- .mount('#app');
60
- ```
61
-
62
- * `abilitiesPlugin` no more define global `$ability` and `$can` properties, instead a recommended way to get `AppAbility` instance is by injecting it through [provide/inject API](https://v3.vuejs.org/guide/component-provide-inject.html). To get previous behavior, pass `useGlobalProperties: true` option:
63
-
64
- **Before**
65
-
66
- ```js
67
- import { abilitiesPlugin } from '@casl/vue';
68
- import Vue from 'vue';
69
- import { ability } from './services/AppAbility';
70
-
71
- Vue.use(abilitiesPlugin);
72
- const root = new Vue({
73
- ability
74
- }).$mount('#app')
75
-
76
- console.log(root.$ability)
77
- ```
78
-
79
- **After**
80
-
81
- Recommended way:
82
-
83
- ```js
84
- import { abilitiesPlugin, ABILITY_TOKEN } from '@casl/vue';
85
- import { createApp } from 'vue';
86
- import { ability } from './services/AppAbility';
87
-
88
- const App = {
89
- name: 'App',
90
- inject: {
91
- $ability: { from: ABILITY_TOKEN }
92
- }
93
- };
94
-
95
- const root = createApp(App)
96
- .use(abilitiesPlugin, ability, {
97
- useGlobalProperties: true
98
- })
99
- .mount('#app');
100
-
101
- console.log(root.$ability)
102
- ```
103
-
104
- Backward compatible way:
105
-
106
- ```js
107
- import { abilitiesPlugin } from '@casl/vue';
108
- import { createApp } from 'vue';
109
- import { ability } from './services/AppAbility';
110
-
111
- const root = createApp()
112
- .use(abilitiesPlugin, ability, {
113
- useGlobalProperties: true
114
- })
115
- .mount('#app');
116
-
117
- console.log(root.$ability)
118
- ```
119
-
120
- * `AllCanProps<TAbility>` type was renamed to `CanProps<TAbility>`
121
-
122
- * `@casl/vue` no more augment vue types, so if you decide to use global properties, you will need to augment types by yourself
123
-
124
- **Before**
125
-
126
- @casl/vue augments type of `$ability` to `AnyAbility` and `$can` to `typeof $ability['can']`
127
-
128
- **After**
129
-
130
- create a separate file `src/ability-shim.d.ts` with the next content:
131
-
132
- ```ts
133
- import { AppAbility } from './AppAbility'
134
-
135
- declare module 'vue' {
136
- interface ComponentCustomProperties {
137
- $ability: AppAbility;
138
- $can(this: this, ...args: Parameters<this['$ability']['can']>): boolean;
139
- }
140
- }
141
- ```
142
-
143
- ## [1.2.1](https://github.com/stalniy/casl/compare/@casl/vue@1.2.0...@casl/vue@1.2.1) (2020-12-28)
144
-
145
-
146
- ### Bug Fixes
147
-
148
- * **dist:** adds separate `tsconfig.build.json` to every completementary project ([87742ce](https://github.com/stalniy/casl/commit/87742cec518a8a68d5fc29be2bbc9561cbc7da6c)), closes [#419](https://github.com/stalniy/casl/issues/419)
149
-
150
- # [1.2.0](https://github.com/stalniy/casl/compare/@casl/vue@1.1.1...@casl/vue@1.2.0) (2020-12-26)
151
-
152
-
153
- ### Bug Fixes
154
-
155
- * **angular:** fixes sourcemap generation for the code built by ngc ([7715263](https://github.com/stalniy/casl/commit/771526379ff8203170a433d71b68644a48ff44eb)), closes [#387](https://github.com/stalniy/casl/issues/387) [#382](https://github.com/stalniy/casl/issues/382)
156
- * **package:** removes `engine` section that points to npm@6 ([eecd12a](https://github.com/stalniy/casl/commit/eecd12ac49f56d6a0f57d1a57fb37487335b5f03)), closes [#417](https://github.com/stalniy/casl/issues/417)
157
-
158
-
159
- ### Features
160
-
161
- * **builder:** improves typings for AbilityBuilder [skip release] ([ebd4d17](https://github.com/stalniy/casl/commit/ebd4d17a355a2646467033118a3d6efee4321d27)), closes [#379](https://github.com/stalniy/casl/issues/379)
162
- * **esm:** adds ESM support for latest Node.js through `exports` prop in package.json ([cac2506](https://github.com/stalniy/casl/commit/cac2506a80c18f194210c2d89108d1d094751fa4)), closes [#331](https://github.com/stalniy/casl/issues/331)
163
-
164
-
165
- ### BREAKING CHANGES
166
-
167
- * **builder:** changes main generic parameter to be a class instead of instance and makes `defineAbility` to accept options as the 2nd argument.
168
-
169
- **Before**
170
-
171
- ```ts
172
- import { AbilityBuilder, defineAbility, Ability } from '@casl/ability';
173
-
174
- const resolveAction = (action: string) => {/* custom implementation */ };
175
- const ability = defineAbility({ resolveAction }, (can) => can('read', 'Item'));
176
- const builder = new AbilityBuilder<Ability>(Ability);
177
- ```
178
-
179
- **After**
180
-
181
- ```ts
182
- import { AbilityBuilder, defineAbility, Ability } from '@casl/ability';
183
-
184
- const resolveAction = (action: string) => {/* custom implementation */ };
185
- const ability = defineAbility((can) => can('read', 'Item'), { resolveAction });
186
- const builder = new AbilityBuilder(Ability); // first argument is now mandatory!
187
- ```
188
-
189
- The 1st parameter to `AbilityBuilder` is now madatory. This allows to infer generic parameters from it and makes AbilityType that is built to be explicit.
190
-
191
- ## [1.1.1](https://github.com/stalniy/casl/compare/@casl/vue@1.1.0...@casl/vue@1.1.1) (2020-06-09)
192
-
193
-
194
- ### Bug Fixes
195
-
196
- * **docs:** ensure README and docs for all packages are in sync ([8df3684](https://github.com/stalniy/casl/commit/8df3684b139de0af60c9c37f284a5028ffbf2224)), closes [#338](https://github.com/stalniy/casl/issues/338)
197
-
198
- # [1.1.0](https://github.com/stalniy/casl/compare/@casl/vue@1.0.3...@casl/vue@1.1.0) (2020-05-12)
199
-
200
-
201
- ### Features
202
-
203
- * **types:** extract vue augmentation modules into pseudo submodule ([a75296c](https://github.com/stalniy/casl/commit/a75296c3f73af432f500eb8e153cf0e7cde67796)), closes [#312](https://github.com/stalniy/casl/issues/312)
204
-
205
- ## [1.0.3](https://github.com/stalniy/casl/compare/@casl/vue@1.0.2...@casl/vue@1.0.3) (2020-04-22)
206
-
207
-
208
- ### Bug Fixes
209
-
210
- * **types:** use `AnyAbility` in ComponentOptions and in Vue augmentation modules ([7f9be6f](https://github.com/stalniy/casl/commit/7f9be6f13248c1df6df1b41a6d7e2edb62928bca))
211
-
212
- ## [1.0.2](https://github.com/stalniy/casl/compare/@casl/vue@1.0.1...@casl/vue@1.0.2) (2020-04-10)
213
-
214
-
215
- ### Bug Fixes
216
-
217
- * **vue:** ensure that terser doesn't mangle reserved required props ([7fa234c](https://github.com/stalniy/casl/commit/7fa234c06cc133bdffe485bfcb972dc595167899))
218
-
219
- ## [1.0.1](https://github.com/stalniy/casl/compare/@casl/vue@1.0.0...@casl/vue@1.0.1) (2020-04-09)
220
-
221
-
222
- ### Bug Fixes
223
-
224
- * **vue:** removes `of` alias from `<can>` component ([bd658e2](https://github.com/stalniy/casl/commit/bd658e21a34cbea8b6b70739f533453ebf95d20a))
225
-
226
- # [1.0.0](https://github.com/stalniy/casl/compare/@casl/vue@0.5.1...@casl/vue@1.0.0) (2020-04-09)
227
-
228
-
229
- ### Bug Fixes
230
-
231
- * **vue:** adds `an` alias, so types are compatible between React and Vue ([8276942](https://github.com/stalniy/casl/commit/8276942da1660ac3eb1cd928cc80db891ed7e275)), closes [#248](https://github.com/stalniy/casl/issues/248)
232
-
233
-
234
- ### Features
235
-
236
- * **ability:** updates typings for vue ([8ac4ca1](https://github.com/stalniy/casl/commit/8ac4ca14a59ed87bc0f84a853466418e6a74cd74)), closes [#256](https://github.com/stalniy/casl/issues/256)
237
- * **vue:** adds better generics typying for Vue ([5cc7b60](https://github.com/stalniy/casl/commit/5cc7b60d8a2a53db217f8ad1a4673a28f67aefce)), closes [#107](https://github.com/stalniy/casl/issues/107)
238
- * **vue:** migrates vue to typescript ([7bacadd](https://github.com/stalniy/casl/commit/7bacadd8878afe14898929ebeb7c3efd9af88d3c)), closes [#248](https://github.com/stalniy/casl/issues/248)
239
- * **vue:** throws exception if `Ability` is not provided ([aacd952](https://github.com/stalniy/casl/commit/aacd9520cfd3a35ea2dc3f44e8043734494f3c2a)), closes [#248](https://github.com/stalniy/casl/issues/248)
240
-
241
-
242
- ### BREAKING CHANGES
243
-
244
- * **typescript:** weak hand written declaration files are removed as `@casl/vue` has been completely rewritten to TypeScript. TypeScript now checks that you correctly use property aliases
245
- * **Can:** `of` alias is removed and field was extracted to a separate prop
246
-
247
- **Before**
248
-
249
- ```html
250
- <can I="read title" of="Post">...</can>
251
- ```
252
-
253
- **After**
254
-
255
- ```html
256
- <can I="read" a="Post" field="title">...</can>
257
- ```
258
-
259
- # [@casl/vue-v0.5.1](https://github.com/stalniy/casl/compare/@casl/vue@0.5.0...@casl/vue@0.5.1) (2019-02-10)
260
-
261
-
262
- ### Bug Fixes
263
-
264
- * **packages:** increases peerDependency of [@casl](https://github.com/casl)/ability ([9f6a7b8](https://github.com/stalniy/casl/commit/9f6a7b8)), closes [#119](https://github.com/stalniy/casl/issues/119)
265
-
266
- # [@casl/vue-v0.5.0](https://github.com/stalniy/casl/compare/@casl/vue@0.4.3...@casl/vue@0.5.0) (2018-11-25)
267
-
268
-
269
- ### Bug Fixes
270
-
271
- * **README:** changes links to [@casl](https://github.com/casl)/ability to point to npm package instead to git root [skip ci] ([a74086b](https://github.com/stalniy/casl/commit/a74086b)), closes [#102](https://github.com/stalniy/casl/issues/102)
272
-
273
-
274
- ### Features
275
-
276
- * **react:can:** updates typescript declarations ([213dcde](https://github.com/stalniy/casl/commit/213dcde))
277
- * **vue:** adds `passThrough` prop to `Can` ([28ca883](https://github.com/stalniy/casl/commit/28ca883)), closes [#105](https://github.com/stalniy/casl/issues/105)
278
-
279
- <a name="@casl/vue-v0.4.3"></a>
280
- # [@casl/vue-v0.4.3](https://github.com/stalniy/casl/compare/@casl/vue@0.4.2...@casl/vue@0.4.3) (2018-07-14)
281
-
282
-
283
- ### Bug Fixes
284
-
285
- * **vue:** fixes ts declaration for `abilitiesPlugin` ([7d8e9ca](https://github.com/stalniy/casl/commit/7d8e9ca)), closes [#92](https://github.com/stalniy/casl/issues/92)
286
-
287
- <a name="@casl/vue-v0.4.2"></a>
288
- # [@casl/vue-v0.4.2](https://github.com/stalniy/casl/compare/@casl/vue@0.4.1...@casl/vue@0.4.2) (2018-07-02)
289
-
290
-
291
- ### Bug Fixes
292
-
293
- * **package:** changes location of ES5M modules ([2b1ad4e](https://github.com/stalniy/casl/commit/2b1ad4e)), closes [#89](https://github.com/stalniy/casl/issues/89)
294
-
295
- <a name="@casl/vue-v0.4.1"></a>
296
- # [@casl/vue-v0.4.1](https://github.com/stalniy/casl/compare/@casl/vue@0.4.0...@casl/vue@0.4.1) (2018-06-04)
297
-
298
-
299
- ### Bug Fixes
300
-
301
- * **vue:** extends `ComponentOptions` with `ability` member ([#73](https://github.com/stalniy/casl/issues/73)) ([94d4c24](https://github.com/stalniy/casl/commit/94d4c24))
302
-
303
- <a name="@casl/vue-v0.4.0"></a>
304
- # [@casl/vue-v0.4.0](https://github.com/stalniy/casl/compare/@casl/vue@0.3.0...@casl/vue@0.4.0) (2018-06-01)
305
-
306
-
307
- ### Features
308
-
309
- * **vue:** pass ability down components tree ([28e3d8d](https://github.com/stalniy/casl/commit/28e3d8d)), closes [#72](https://github.com/stalniy/casl/issues/72)
310
-
311
-
312
- <a name="@casl/vue-v0.3.0"></a>
313
- # [@casl/vue-v0.3.0](https://github.com/stalniy/casl/compare/@casl/vue@0.2.1...@casl/vue@0.3.0) (2018-05-30)
314
-
315
-
316
- ### Features
317
-
318
- * **vue:** adds can component ([42ee540](https://github.com/stalniy/casl/commit/42ee540)), closes [#63](https://github.com/stalniy/casl/issues/63)
319
-
320
-
321
- <a name="@casl/vue-v0.2.1"></a>
322
- # [@casl/vue-v0.2.1](https://github.com/stalniy/casl/compare/@casl/vue@0.2.0...@casl/vue@0.2.1) (2018-05-29)
323
-
324
-
325
- ### Bug Fixes
326
-
327
- * **vue:** fixes issue with wrong type definition for `abilitiesPlugin` ([a7e2251](https://github.com/stalniy/casl/commit/a7e2251))
328
-
329
-
330
- <a name="0.2.0"></a>
331
- # 0.2.0 (2018-04-16)
332
-
333
-
334
- ### Features
335
-
336
- * **vue:** adds typescript definitions ([a7eac4b](https://github.com/stalniy/casl/commit/a7eac4b)), closes [#38](https://github.com/stalniy/casl/issues/38)
337
-
338
-
339
- <a name="0.1.0"></a>
340
- # 0.1.0 (2018-03-23)
341
-
342
-
343
- ### Features
344
-
345
- * **integration:** adds new folder for vue integration, closes [#22](https://github.com/stalniy/casl/issues/22)
346
- * **vue:** adds empty ability instance in case if such is not provided ([a971f05](https://github.com/stalniy/casl/commit/a971f05))
347
- * **ability:** adds reactivity to ability rules