@casl/vue 2.2.1 → 2.2.2
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.
- package/dist/es5m/index.js +1 -1
- package/dist/es5m/index.js.map +1 -1
- package/dist/es6m/index.mjs +1 -1
- package/dist/es6m/index.mjs.map +1 -1
- package/dist/types/component/can.d.ts +4 -4
- package/dist/types/useAbility.d.ts +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +2 -2
package/dist/es5m/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
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(
|
|
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(Object.hasOwn(r,"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(i.a!==void 0)return"a";if(i.this!==void 0)return"this";if(i.an!==void 0)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(e[o]===void 0){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
|
package/dist/es5m/index.js.map
CHANGED
|
@@ -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 (
|
|
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 (Object.hasOwn(ability, 'possibleRulesFor')) {\n return ability;\n }\n\n const watcher = ref(true);\n ability.on('updated', () => {\n watcher.value = !watcher.value;\n });\n\n const possibleRulesFor = ability.possibleRulesFor.bind(ability);\n ability.possibleRulesFor = (action: string, subject: SubjectType) => {\n watcher.value = watcher.value; // eslint-disable-line\n return possibleRulesFor(action, subject);\n };\n ability.can = ability.can.bind(ability);\n ability.cannot = ability.cannot.bind(ability);\n\n return ability;\n}\n","import { inject, InjectionKey, provide } from 'vue';\nimport type { AnyAbility, Ability } from '@casl/ability';\nimport { reactiveAbility } from './reactiveAbility';\n\nexport const ABILITY_TOKEN: InjectionKey<AnyAbility> = Symbol('ability');\n\nexport function useAbility<T extends AnyAbility = Ability>(): T {\n const ability = inject<T>(ABILITY_TOKEN);\n\n if (!ability) {\n throw new Error('Cannot inject Ability instance because it was not provided');\n }\n\n return ability;\n}\n\nexport function provideAbility(ability: AnyAbility) {\n provide(ABILITY_TOKEN, reactiveAbility(ability));\n}\n","import { defineComponent, ComponentCustomProperties } from 'vue';\nimport {\n SubjectType,\n Generics,\n AnyAbility,\n Ability,\n Abilities,\n IfString,\n AbilityTuple,\n} from '@casl/ability';\nimport { useAbility } from '../useAbility';\n\ntype AbilityCanProps<\n T extends Abilities,\n Else = IfString<T, { do: T } | { I: T }>\n> = T extends AbilityTuple\n ? { do: T[0], on: T[1], field?: string } |\n { I: T[0], a: Extract<T[1], SubjectType>, field?: string } |\n { I: T[0], an: Extract<T[1], SubjectType>, field?: string } |\n { I: T[0], this: Exclude<T[1], SubjectType>, field?: string }\n : Else;\n\nexport type CanProps<T extends AnyAbility> = AbilityCanProps<Generics<T>['abilities']> & {\n not?: boolean,\n passThrough?: boolean\n};\n\ntype VueAbility = ComponentCustomProperties extends { $ability: AnyAbility }\n ? ComponentCustomProperties['$ability']\n : Ability;\n\nfunction detectSubjectProp(props: Record<string, unknown>) {\n if (props.a !== undefined) {\n return 'a';\n }\n\n if (props.this !== undefined) {\n return 'this';\n }\n\n if (props.an !== undefined) {\n return 'an';\n }\n\n return '';\n}\n\nexport const Can = defineComponent<CanProps<VueAbility>>({\n name: 'Can',\n props: {\n I: String,\n do: String,\n a: [String, Function],\n an: [String, Function],\n this: [String, Function, Object],\n on: [String, Function, Object],\n not: Boolean,\n passThrough: Boolean,\n field: String\n } as any,\n setup(props, { slots }) {\n const $props = props as Record<string, any>;\n let actionProp = 'do';\n let subjectProp = 'on';\n\n if ($props[actionProp] === undefined) {\n actionProp = 'I';\n subjectProp = detectSubjectProp(props);\n }\n\n if (!$props[actionProp]) {\n throw new Error('Neither `I` nor `do` prop was passed in <Can>');\n }\n\n if (!slots.default) {\n throw new Error('Expects to receive default slot');\n }\n\n const ability = useAbility<VueAbility>();\n\n return () => {\n const isAllowed = ability.can($props[actionProp], $props[subjectProp], $props.field);\n const canRender = props.not ? !isAllowed : isAllowed;\n\n if (!props.passThrough) {\n return canRender ? slots.default!() : null;\n }\n\n return slots.default!({\n allowed: canRender,\n ability,\n });\n };\n }\n});\n","import { App } from 'vue';\nimport { AnyAbility, PureAbility } from '@casl/ability';\nimport { ABILITY_TOKEN } from './useAbility';\nimport { reactiveAbility } from './reactiveAbility';\n\nexport interface AbilityPluginOptions {\n useGlobalProperties?: boolean\n}\n\nexport function abilitiesPlugin(app: App, ability: AnyAbility, options?: AbilityPluginOptions) {\n if (!ability || !(ability instanceof PureAbility)) {\n throw new Error('Please provide an Ability instance to abilitiesPlugin plugin');\n }\n\n app.provide(ABILITY_TOKEN, reactiveAbility(ability));\n\n if (options && options.useGlobalProperties) {\n app.config.globalProperties.$ability = ability;\n app.config.globalProperties.$can = ability.can.bind(ability);\n }\n}\n"],"names":["reactiveAbility","ability","Object","hasOwn","watcher","ref","on","value","possibleRulesFor","bind","action","subject","can","cannot","ABILITY_TOKEN","Symbol","useAbility","inject","Error","provideAbility","provide","detectSubjectProp","props","a","undefined","this","an","Can","defineComponent","name","I","String","do","Function","not","Boolean","passThrough","field","setup","_ref","slots","$props","actionProp","subjectProp","default","isAllowed","canRender","allowed","abilitiesPlugin","app","options","PureAbility","useGlobalProperties","config","globalProperties","$ability","$can"],"mappings":"oHAGO,SAASA,gBAAgBC,GAC9B,GAAIC,OAAOC,OAAOF,EAAS,oBACzB,OAAOA,EAGT,IAAMG,EAAUC,EAAI,MACpBJ,EAAQK,GAAG,WAAW,WACpBF,EAAQG,OAASH,EAAQG,KAC3B,IAEA,IAAMC,EAAmBP,EAAQO,iBAAiBC,KAAKR,GACvDA,EAAQO,iBAAmB,SAACE,EAAgBC,GAC1CP,EAAQG,MAAQH,EAAQG,MACxB,OAAOC,EAAiBE,EAAQC,IAElCV,EAAQW,IAAMX,EAAQW,IAAIH,KAAKR,GAC/BA,EAAQY,OAASZ,EAAQY,OAAOJ,KAAKR,GAErC,OAAOA,CACT,KClBaa,EAA0CC,OAAO,WAEvD,SAASC,aACd,IAAMf,EAAUgB,EAAUH,GAE1B,IAAKb,EACH,MAAM,IAAIiB,MAAM,8DAGlB,OAAOjB,CACT,CAEO,SAASkB,eAAelB,GAC7BmB,EAAQN,EAAed,gBAAgBC,GACzC,CCaA,SAASoB,EAAkBC,GACzB,GAAIA,EAAMC,SAAMC,EACd,MAAO,IAGT,GAAIF,EAAMG,YAASD,EACjB,MAAO,OAGT,GAAIF,EAAMI,UAAOF,EACf,MAAO,KAGT,MAAO,EACT,CAEaG,IAAAA,EAAMC,EAAsC,CACvDC,KAAM,MACNP,MAAO,CACLQ,EAAGC,OACHC,GAAID,OACJR,EAAG,CAACQ,OAAQE,UACZP,GAAI,CAACK,OAAQE,UACbR,KAAM,CAACM,OAAQE,SAAU/B,QACzBI,GAAI,CAACyB,OAAQE,SAAU/B,QACvBgC,IAAKC,QACLC,YAAaD,QACbE,MAAON,QAETO,MAAKA,SAAAA,EAAChB,EAAKiB,GAAa,IAATC,EAAKD,EAALC,MACb,IAAMC,EAASnB,EACf,IAAIoB,EAAa,KACjB,IAAIC,EAAc,KAElB,GAAIF,EAAOC,UAAgBlB,EAAW,CACpCkB,EAAa,IACbC,EAActB,EAAkBC,EAClC,CAEA,IAAKmB,EAAOC,GACV,MAAM,IAAIxB,MAAM,iDAGlB,IAAKsB,EAAMI,QACT,MAAM,IAAI1B,MAAM,mCAGlB,IAAMjB,EAAUe,aAEhB,OAAO,WACL,IAAM6B,EAAY5C,EAAQW,IAAI6B,EAAOC,GAAaD,EAAOE,GAAcF,EAAOJ,OAC9E,IAAMS,EAAYxB,EAAMY,KAAOW,EAAYA,EAE3C,IAAKvB,EAAMc,YACT,OAAOU,EAAYN,EAAMI,UAAa,KAGxC,OAAOJ,EAAMI,QAAS,CACpBG,QAASD,EACT7C,QAAAA,IAGN,ICpFK,SAAS+C,EAAgBC,EAAUhD,EAAqBiD,GAC7D,IAAKjD,KAAaA,aAAmBkD,GACnC,MAAM,IAAIjC,MAAM,gEAGlB+B,EAAI7B,QAAQN,EAAed,gBAAgBC,IAE3C,GAAIiD,GAAWA,EAAQE,oBAAqB,CAC1CH,EAAII,OAAOC,iBAAiBC,SAAWtD,EACvCgD,EAAII,OAAOC,iBAAiBE,KAAOvD,EAAQW,IAAIH,KAAKR,EACtD,CACF"}
|
package/dist/es6m/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
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(
|
|
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(Object.hasOwn(i,"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(t.a!==void 0)return"a";if(t.this!==void 0)return"this";if(t.an!==void 0)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(n[r]===void 0){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
|
package/dist/es6m/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
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 (Object.hasOwn(ability, 'possibleRulesFor')) {\n return ability;\n }\n\n const watcher = ref(true);\n ability.on('updated', () => {\n watcher.value = !watcher.value;\n });\n\n const possibleRulesFor = ability.possibleRulesFor.bind(ability);\n ability.possibleRulesFor = (action: string, subject: SubjectType) => {\n watcher.value = watcher.value; // eslint-disable-line\n return possibleRulesFor(action, subject);\n };\n ability.can = ability.can.bind(ability);\n ability.cannot = ability.cannot.bind(ability);\n\n return ability;\n}\n","import { inject, InjectionKey, provide } from 'vue';\nimport type { AnyAbility, Ability } from '@casl/ability';\nimport { reactiveAbility } from './reactiveAbility';\n\nexport const ABILITY_TOKEN: InjectionKey<AnyAbility> = Symbol('ability');\n\nexport function useAbility<T extends AnyAbility = Ability>(): T {\n const ability = inject<T>(ABILITY_TOKEN);\n\n if (!ability) {\n throw new Error('Cannot inject Ability instance because it was not provided');\n }\n\n return ability;\n}\n\nexport function provideAbility(ability: AnyAbility) {\n provide(ABILITY_TOKEN, reactiveAbility(ability));\n}\n","import { defineComponent, ComponentCustomProperties } from 'vue';\nimport {\n SubjectType,\n Generics,\n AnyAbility,\n Ability,\n Abilities,\n IfString,\n AbilityTuple,\n} from '@casl/ability';\nimport { useAbility } from '../useAbility';\n\ntype AbilityCanProps<\n T extends Abilities,\n Else = IfString<T, { do: T } | { I: T }>\n> = T extends AbilityTuple\n ? { do: T[0], on: T[1], field?: string } |\n { I: T[0], a: Extract<T[1], SubjectType>, field?: string } |\n { I: T[0], an: Extract<T[1], SubjectType>, field?: string } |\n { I: T[0], this: Exclude<T[1], SubjectType>, field?: string }\n : Else;\n\nexport type CanProps<T extends AnyAbility> = AbilityCanProps<Generics<T>['abilities']> & {\n not?: boolean,\n passThrough?: boolean\n};\n\ntype VueAbility = ComponentCustomProperties extends { $ability: AnyAbility }\n ? ComponentCustomProperties['$ability']\n : Ability;\n\nfunction detectSubjectProp(props: Record<string, unknown>) {\n if (props.a !== undefined) {\n return 'a';\n }\n\n if (props.this !== undefined) {\n return 'this';\n }\n\n if (props.an !== undefined) {\n return 'an';\n }\n\n return '';\n}\n\nexport const Can = defineComponent<CanProps<VueAbility>>({\n name: 'Can',\n props: {\n I: String,\n do: String,\n a: [String, Function],\n an: [String, Function],\n this: [String, Function, Object],\n on: [String, Function, Object],\n not: Boolean,\n passThrough: Boolean,\n field: String\n } as any,\n setup(props, { slots }) {\n const $props = props as Record<string, any>;\n let actionProp = 'do';\n let subjectProp = 'on';\n\n if ($props[actionProp] === undefined) {\n actionProp = 'I';\n subjectProp = detectSubjectProp(props);\n }\n\n if (!$props[actionProp]) {\n throw new Error('Neither `I` nor `do` prop was passed in <Can>');\n }\n\n if (!slots.default) {\n throw new Error('Expects to receive default slot');\n }\n\n const ability = useAbility<VueAbility>();\n\n return () => {\n const isAllowed = ability.can($props[actionProp], $props[subjectProp], $props.field);\n const canRender = props.not ? !isAllowed : isAllowed;\n\n if (!props.passThrough) {\n return canRender ? slots.default!() : null;\n }\n\n return slots.default!({\n allowed: canRender,\n ability,\n });\n };\n }\n});\n","import { App } from 'vue';\nimport { AnyAbility, PureAbility } from '@casl/ability';\nimport { ABILITY_TOKEN } from './useAbility';\nimport { reactiveAbility } from './reactiveAbility';\n\nexport interface AbilityPluginOptions {\n useGlobalProperties?: boolean\n}\n\nexport function abilitiesPlugin(app: App, ability: AnyAbility, options?: AbilityPluginOptions) {\n if (!ability || !(ability instanceof PureAbility)) {\n throw new Error('Please provide an Ability instance to abilitiesPlugin plugin');\n }\n\n app.provide(ABILITY_TOKEN, reactiveAbility(ability));\n\n if (options && options.useGlobalProperties) {\n app.config.globalProperties.$ability = ability;\n app.config.globalProperties.$can = ability.can.bind(ability);\n }\n}\n"],"names":["reactiveAbility","ability","Object","hasOwn","watcher","ref","on","value","possibleRulesFor","bind","action","subject","can","cannot","ABILITY_TOKEN","Symbol","useAbility","inject","Error","provideAbility","provide","detectSubjectProp","props","a","undefined","this","an","Can","defineComponent","name","I","String","do","Function","not","Boolean","passThrough","field","setup","slots","$props","actionProp","subjectProp","default","isAllowed","canRender","allowed","abilitiesPlugin","app","options","PureAbility","useGlobalProperties","config","globalProperties","$ability","$can"],"mappings":"oHAGO,SAASA,gBAAgBC,GAC9B,GAAIC,OAAOC,OAAOF,EAAS,oBACzB,OAAOA,EAGT,MAAMG,EAAUC,EAAI,MACpBJ,EAAQK,GAAG,WAAW,KACpBF,EAAQG,OAASH,EAAQG,KAAK,IAGhC,MAAMC,EAAmBP,EAAQO,iBAAiBC,KAAKR,GACvDA,EAAQO,iBAAmB,CAACE,EAAgBC,KAC1CP,EAAQG,MAAQH,EAAQG,MACxB,OAAOC,EAAiBE,EAAQC,EAAQ,EAE1CV,EAAQW,IAAMX,EAAQW,IAAIH,KAAKR,GAC/BA,EAAQY,OAASZ,EAAQY,OAAOJ,KAAKR,GAErC,OAAOA,CACT,OClBaa,EAA0CC,OAAO,WAEvD,SAASC,aACd,MAAMf,EAAUgB,EAAUH,GAE1B,IAAKb,EACH,MAAM,IAAIiB,MAAM,8DAGlB,OAAOjB,CACT,CAEO,SAASkB,eAAelB,GAC7BmB,EAAQN,EAAed,gBAAgBC,GACzC,CCaA,SAASoB,EAAkBC,GACzB,GAAIA,EAAMC,SAAMC,EACd,MAAO,IAGT,GAAIF,EAAMG,YAASD,EACjB,MAAO,OAGT,GAAIF,EAAMI,UAAOF,EACf,MAAO,KAGT,MAAO,EACT,CAEaG,MAAAA,EAAMC,EAAsC,CACvDC,KAAM,MACNP,MAAO,CACLQ,EAAGC,OACHC,GAAID,OACJR,EAAG,CAACQ,OAAQE,UACZP,GAAI,CAACK,OAAQE,UACbR,KAAM,CAACM,OAAQE,SAAU/B,QACzBI,GAAI,CAACyB,OAAQE,SAAU/B,QACvBgC,IAAKC,QACLC,YAAaD,QACbE,MAAON,QAETO,KAAAA,CAAMhB,GAAOiB,MAAEA,IACb,MAAMC,EAASlB,EACf,IAAImB,EAAa,KACjB,IAAIC,EAAc,KAElB,GAAIF,EAAOC,UAAgBjB,EAAW,CACpCiB,EAAa,IACbC,EAAcrB,EAAkBC,EAClC,CAEA,IAAKkB,EAAOC,GACV,MAAM,IAAIvB,MAAM,iDAGlB,IAAKqB,EAAMI,QACT,MAAM,IAAIzB,MAAM,mCAGlB,MAAMjB,EAAUe,aAEhB,MAAO,KACL,MAAM4B,EAAY3C,EAAQW,IAAI4B,EAAOC,GAAaD,EAAOE,GAAcF,EAAOH,OAC9E,MAAMQ,EAAYvB,EAAMY,KAAOU,EAAYA,EAE3C,IAAKtB,EAAMc,YACT,OAAOS,EAAYN,EAAMI,UAAa,KAGxC,OAAOJ,EAAMI,QAAS,CACpBG,QAASD,EACT5C,WACA,CAEN,ICpFK,SAAS8C,EAAgBC,EAAU/C,EAAqBgD,GAC7D,IAAKhD,KAAaA,aAAmBiD,GACnC,MAAM,IAAIhC,MAAM,gEAGlB8B,EAAI5B,QAAQN,EAAed,gBAAgBC,IAE3C,GAAIgD,GAAWA,EAAQE,oBAAqB,CAC1CH,EAAII,OAAOC,iBAAiBC,SAAWrD,EACvC+C,EAAII,OAAOC,iBAAiBE,KAAOtD,EAAQW,IAAIH,KAAKR,EACtD,CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SubjectType, Generics, AnyAbility, Ability, Abilities, IfString, AbilityTuple } from '@casl/ability';
|
|
2
|
-
|
|
2
|
+
type AbilityCanProps<T extends Abilities, Else = IfString<T, {
|
|
3
3
|
do: T;
|
|
4
4
|
} | {
|
|
5
5
|
I: T;
|
|
@@ -20,11 +20,11 @@ declare type AbilityCanProps<T extends Abilities, Else = IfString<T, {
|
|
|
20
20
|
this: Exclude<T[1], SubjectType>;
|
|
21
21
|
field?: string;
|
|
22
22
|
} : Else;
|
|
23
|
-
export
|
|
23
|
+
export type CanProps<T extends AnyAbility> = AbilityCanProps<Generics<T>['abilities']> & {
|
|
24
24
|
not?: boolean;
|
|
25
25
|
passThrough?: boolean;
|
|
26
26
|
};
|
|
27
|
-
export declare const Can: import("vue").DefineComponent<CanProps<Ability<AbilityTuple
|
|
27
|
+
export declare const Can: import("vue").DefineComponent<CanProps<Ability<AbilityTuple, import("@casl/ability").MongoQuery>>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{
|
|
28
28
|
do: string;
|
|
29
29
|
on: import("@casl/ability").Subject;
|
|
30
30
|
field?: string | undefined;
|
|
@@ -56,5 +56,5 @@ export declare const Can: import("vue").DefineComponent<CanProps<Ability<Ability
|
|
|
56
56
|
} & {
|
|
57
57
|
not?: boolean | undefined;
|
|
58
58
|
passThrough?: boolean | undefined;
|
|
59
|
-
}>, {} | {} | {} | {}>;
|
|
59
|
+
}>, {} | {} | {} | {}, {}>;
|
|
60
60
|
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { InjectionKey } from 'vue';
|
|
2
2
|
import type { AnyAbility, Ability } from '@casl/ability';
|
|
3
|
-
export declare const ABILITY_TOKEN: InjectionKey<
|
|
3
|
+
export declare const ABILITY_TOKEN: InjectionKey<AnyAbility>;
|
|
4
4
|
export declare function useAbility<T extends AnyAbility = Ability>(): T;
|
|
5
5
|
export declare function provideAbility(ability: AnyAbility): void;
|
package/dist/umd/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(i,t){"object"
|
|
1
|
+
(function(i,t){typeof exports==="object"&&typeof module!=="undefined"?t(exports,require("vue"),require("@casl/ability")):typeof define==="function"&&define.amd?define(["exports","vue","@casl/ability"],t):(i=typeof globalThis!=="undefined"?globalThis:i||self,t((i.casl=i.casl||{},i.casl.vue={}),i.Vue,i.casl))})(this,(function(i,t,n){"use strict";function reactiveAbility(i){if(Object.hasOwn(i,"possibleRulesFor"))return i;var n=t.ref(true);i.on("updated",(function(){n.value=!n.value}));var e=i.possibleRulesFor.bind(i);i.possibleRulesFor=function(i,t){n.value=n.value;return e(i,t)};i.can=i.can.bind(i);i.cannot=i.cannot.bind(i);return i}var e=Symbol("ability");function useAbility(){var i=t.inject(e);if(!i)throw new Error("Cannot inject Ability instance because it was not provided");return i}function provideAbility(i){t.provide(e,reactiveAbility(i))}function r(i){if(i.a!==void 0)return"a";if(i.this!==void 0)return"this";if(i.an!==void 0)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,n){var e=n.slots;var o=t;var u="do";var a="on";if(o[u]===void 0){u="I";a=r(t)}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 n=t.not?!i:i;if(!t.passThrough)return n?e.default():null;return e.default({allowed:n,ability:l})}}});function u(i,t,r){if(!t||!(t instanceof n.PureAbility))throw new Error("Please provide an Ability instance to abilitiesPlugin plugin");i.provide(e,reactiveAbility(t));if(r&&r.useGlobalProperties){i.config.globalProperties.$ability=t;i.config.globalProperties.$can=t.can.bind(t)}}i.ABILITY_TOKEN=e;i.Can=o;i.abilitiesPlugin=u;i.provideAbility=provideAbility;i.useAbility=useAbility}));
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/umd/index.js.map
CHANGED
|
@@ -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 (
|
|
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 (Object.hasOwn(ability, 'possibleRulesFor')) {\n return ability;\n }\n\n const watcher = ref(true);\n ability.on('updated', () => {\n watcher.value = !watcher.value;\n });\n\n const possibleRulesFor = ability.possibleRulesFor.bind(ability);\n ability.possibleRulesFor = (action: string, subject: SubjectType) => {\n watcher.value = watcher.value; // eslint-disable-line\n return possibleRulesFor(action, subject);\n };\n ability.can = ability.can.bind(ability);\n ability.cannot = ability.cannot.bind(ability);\n\n return ability;\n}\n","import { inject, InjectionKey, provide } from 'vue';\nimport type { AnyAbility, Ability } from '@casl/ability';\nimport { reactiveAbility } from './reactiveAbility';\n\nexport const ABILITY_TOKEN: InjectionKey<AnyAbility> = Symbol('ability');\n\nexport function useAbility<T extends AnyAbility = Ability>(): T {\n const ability = inject<T>(ABILITY_TOKEN);\n\n if (!ability) {\n throw new Error('Cannot inject Ability instance because it was not provided');\n }\n\n return ability;\n}\n\nexport function provideAbility(ability: AnyAbility) {\n provide(ABILITY_TOKEN, reactiveAbility(ability));\n}\n","import { defineComponent, ComponentCustomProperties } from 'vue';\nimport {\n SubjectType,\n Generics,\n AnyAbility,\n Ability,\n Abilities,\n IfString,\n AbilityTuple,\n} from '@casl/ability';\nimport { useAbility } from '../useAbility';\n\ntype AbilityCanProps<\n T extends Abilities,\n Else = IfString<T, { do: T } | { I: T }>\n> = T extends AbilityTuple\n ? { do: T[0], on: T[1], field?: string } |\n { I: T[0], a: Extract<T[1], SubjectType>, field?: string } |\n { I: T[0], an: Extract<T[1], SubjectType>, field?: string } |\n { I: T[0], this: Exclude<T[1], SubjectType>, field?: string }\n : Else;\n\nexport type CanProps<T extends AnyAbility> = AbilityCanProps<Generics<T>['abilities']> & {\n not?: boolean,\n passThrough?: boolean\n};\n\ntype VueAbility = ComponentCustomProperties extends { $ability: AnyAbility }\n ? ComponentCustomProperties['$ability']\n : Ability;\n\nfunction detectSubjectProp(props: Record<string, unknown>) {\n if (props.a !== undefined) {\n return 'a';\n }\n\n if (props.this !== undefined) {\n return 'this';\n }\n\n if (props.an !== undefined) {\n return 'an';\n }\n\n return '';\n}\n\nexport const Can = defineComponent<CanProps<VueAbility>>({\n name: 'Can',\n props: {\n I: String,\n do: String,\n a: [String, Function],\n an: [String, Function],\n this: [String, Function, Object],\n on: [String, Function, Object],\n not: Boolean,\n passThrough: Boolean,\n field: String\n } as any,\n setup(props, { slots }) {\n const $props = props as Record<string, any>;\n let actionProp = 'do';\n let subjectProp = 'on';\n\n if ($props[actionProp] === undefined) {\n actionProp = 'I';\n subjectProp = detectSubjectProp(props);\n }\n\n if (!$props[actionProp]) {\n throw new Error('Neither `I` nor `do` prop was passed in <Can>');\n }\n\n if (!slots.default) {\n throw new Error('Expects to receive default slot');\n }\n\n const ability = useAbility<VueAbility>();\n\n return () => {\n const isAllowed = ability.can($props[actionProp], $props[subjectProp], $props.field);\n const canRender = props.not ? !isAllowed : isAllowed;\n\n if (!props.passThrough) {\n return canRender ? slots.default!() : null;\n }\n\n return slots.default!({\n allowed: canRender,\n ability,\n });\n };\n }\n});\n","import { App } from 'vue';\nimport { AnyAbility, PureAbility } from '@casl/ability';\nimport { ABILITY_TOKEN } from './useAbility';\nimport { reactiveAbility } from './reactiveAbility';\n\nexport interface AbilityPluginOptions {\n useGlobalProperties?: boolean\n}\n\nexport function abilitiesPlugin(app: App, ability: AnyAbility, options?: AbilityPluginOptions) {\n if (!ability || !(ability instanceof PureAbility)) {\n throw new Error('Please provide an Ability instance to abilitiesPlugin plugin');\n }\n\n app.provide(ABILITY_TOKEN, reactiveAbility(ability));\n\n if (options && options.useGlobalProperties) {\n app.config.globalProperties.$ability = ability;\n app.config.globalProperties.$can = ability.can.bind(ability);\n }\n}\n"],"names":["reactiveAbility","ability","Object","hasOwn","watcher","ref","on","value","possibleRulesFor","bind","action","subject","can","cannot","ABILITY_TOKEN","Symbol","useAbility","inject","Error","provideAbility","provide","detectSubjectProp","props","a","undefined","this","an","Can","defineComponent","name","I","String","do","Function","not","Boolean","passThrough","field","setup","_ref","slots","$props","actionProp","subjectProp","default","isAllowed","canRender","allowed","abilitiesPlugin","app","options","PureAbility","useGlobalProperties","config","globalProperties","$ability","$can"],"mappings":"0VAGO,SAASA,gBAAgBC,GAC9B,GAAIC,OAAOC,OAAOF,EAAS,oBACzB,OAAOA,EAGT,IAAMG,EAAUC,MAAI,MACpBJ,EAAQK,GAAG,WAAW,WACpBF,EAAQG,OAASH,EAAQG,KAC3B,IAEA,IAAMC,EAAmBP,EAAQO,iBAAiBC,KAAKR,GACvDA,EAAQO,iBAAmB,SAACE,EAAgBC,GAC1CP,EAAQG,MAAQH,EAAQG,MACxB,OAAOC,EAAiBE,EAAQC,IAElCV,EAAQW,IAAMX,EAAQW,IAAIH,KAAKR,GAC/BA,EAAQY,OAASZ,EAAQY,OAAOJ,KAAKR,GAErC,OAAOA,CACT,KClBaa,EAA0CC,OAAO,WAEvD,SAASC,aACd,IAAMf,EAAUgB,SAAUH,GAE1B,IAAKb,EACH,MAAM,IAAIiB,MAAM,8DAGlB,OAAOjB,CACT,CAEO,SAASkB,eAAelB,GAC7BmB,EAAAA,QAAQN,EAAed,gBAAgBC,GACzC,CCaA,SAASoB,EAAkBC,GACzB,GAAIA,EAAMC,SAAMC,EACd,MAAO,IAGT,GAAIF,EAAMG,YAASD,EACjB,MAAO,OAGT,GAAIF,EAAMI,UAAOF,EACf,MAAO,KAGT,MAAO,EACT,CAEaG,IAAAA,EAAMC,EAAAA,gBAAsC,CACvDC,KAAM,MACNP,MAAO,CACLQ,EAAGC,OACHC,GAAID,OACJR,EAAG,CAACQ,OAAQE,UACZP,GAAI,CAACK,OAAQE,UACbR,KAAM,CAACM,OAAQE,SAAU/B,QACzBI,GAAI,CAACyB,OAAQE,SAAU/B,QACvBgC,IAAKC,QACLC,YAAaD,QACbE,MAAON,QAETO,MAAKA,SAAAA,EAAChB,EAAKiB,GAAa,IAATC,EAAKD,EAALC,MACb,IAAMC,EAASnB,EACf,IAAIoB,EAAa,KACjB,IAAIC,EAAc,KAElB,GAAIF,EAAOC,UAAgBlB,EAAW,CACpCkB,EAAa,IACbC,EAActB,EAAkBC,EAClC,CAEA,IAAKmB,EAAOC,GACV,MAAM,IAAIxB,MAAM,iDAGlB,IAAKsB,EAAMI,QACT,MAAM,IAAI1B,MAAM,mCAGlB,IAAMjB,EAAUe,aAEhB,OAAO,WACL,IAAM6B,EAAY5C,EAAQW,IAAI6B,EAAOC,GAAaD,EAAOE,GAAcF,EAAOJ,OAC9E,IAAMS,EAAYxB,EAAMY,KAAOW,EAAYA,EAE3C,IAAKvB,EAAMc,YACT,OAAOU,EAAYN,EAAMI,UAAa,KAGxC,OAAOJ,EAAMI,QAAS,CACpBG,QAASD,EACT7C,QAAAA,IAGN,ICpFK,SAAS+C,EAAgBC,EAAUhD,EAAqBiD,GAC7D,IAAKjD,KAAaA,aAAmBkD,EAAWA,aAC9C,MAAM,IAAIjC,MAAM,gEAGlB+B,EAAI7B,QAAQN,EAAed,gBAAgBC,IAE3C,GAAIiD,GAAWA,EAAQE,oBAAqB,CAC1CH,EAAII,OAAOC,iBAAiBC,SAAWtD,EACvCgD,EAAII,OAAOC,iBAAiBE,KAAOvD,EAAQW,IAAIH,KAAKR,EACtD,CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@casl/vue",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.2",
|
|
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",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@casl/ability": "^6.0.0",
|
|
49
49
|
"@casl/dx": "workspace:^1.0.0",
|
|
50
|
-
"@types/jest": "^
|
|
50
|
+
"@types/jest": "^29.0.0",
|
|
51
51
|
"chai": "^4.1.0",
|
|
52
52
|
"chai-spies": "^1.0.0",
|
|
53
53
|
"vue": "^3.2.45"
|