vue-zo
Version:
A Vuejs/Nuxt plugin that allows you to use roles and permissions in your components (setup macro & option API), also compatible as middleware, methods, composition-api and Pinia
103 lines • 8.09 kB
JavaScript
import { match } from '../utils/strings';
export class Zo {
constructor(options = {}) {
this.#canPersistent = false;
this.#roles = [];
this.#permissions = [];
this.#superRole = undefined;
/*
|-------------------------------------------------------------------------
| Setters
|-------------------------------------------------------------------------
|
| These functions controls the "permissions" and "roles" provided
| by Vue Gates, or from a custom array.
|
*/
this.setRoles = (roles) => {
this.#roles = roles;
if (this.#canPersistent) {
localStorage.setItem('roles', JSON.stringify(roles));
}
};
this.setPermissions = (permissions) => {
this.#permissions = permissions;
if (this.#canPersistent) {
localStorage.setItem('permissions', JSON.stringify(permissions));
}
};
/*
|-------------------------------------------------------------------------
| Getters
|-------------------------------------------------------------------------
|
| These functions return the "permissions" and "roles" stored.
| This is useful when you want list all data.
|
*/
this.getRoles = () => this.#roles;
this.getPermissions = () => this.#permissions;
this.isSuperUser = () => this.#superRole && this.#roles.includes(this.#superRole);
/*
|-------------------------------------------------------------------------
| Directives
|-------------------------------------------------------------------------
|
| These is a group of functions for Vue Directives.
| This is useful when you want valid a "permission" or "role"
| programmatically.
|
*/
// Roles
this.hasRole = (role) => this.isSuperUser() || this.#roles.includes(role);
this.unlessRole = (role) => !this.hasRole(role);
this.hasAnyRole = (values) => {
if (this.isSuperUser()) {
return true;
}
const roles = values.split('|');
return roles.some((role) => this.hasRole(role));
};
this.hasAllRoles = (values) => {
if (this.isSuperUser()) {
return true;
}
const roles = values.split('|');
return roles.every((role) => this.hasRole(role));
};
// Permissions
this.hasPermission = (permission) => this.isSuperUser() ||
!!this.#permissions.find((wildcard) => match(permission, wildcard));
this.unlessPermission = (permission) => !this.hasPermission(permission);
this.hasAnyPermission = (values) => {
if (this.isSuperUser()) {
return true;
}
const permissions = values.split('|');
return permissions.some((permission) => this.hasPermission(permission));
};
this.hasAllPermissions = (values) => {
if (this.isSuperUser()) {
return true;
}
const permissions = values.split('|');
return permissions.every((permission) => this.hasPermission(permission));
};
const canPersistent = options.persistent;
const roles = canPersistent
? JSON.parse(localStorage.getItem('roles'))
: [];
const permissions = canPersistent
? JSON.parse(localStorage.getItem('permissions'))
: [];
this.#canPersistent = canPersistent;
this.#roles = roles;
this.#permissions = permissions;
this.#superRole = options.superRole;
}
#canPersistent;
#roles;
#permissions;
#superRole;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWm8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9aby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHekMsTUFBTSxPQUFPLEVBQUU7SUFTYixZQUFZLFVBQW9CLEVBQUU7UUFSbEMsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFdkIsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUV0QixpQkFBWSxHQUFhLEVBQUUsQ0FBQztRQUU1QixlQUFVLEdBQXVCLFNBQVMsQ0FBQztRQWlCM0M7Ozs7Ozs7O1VBUUU7UUFFRixhQUFRLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3ZCLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUN0RDtRQUNILENBQUMsQ0FBQztRQUVGLG1CQUFjLEdBQUcsQ0FBQyxXQUFxQixFQUFFLEVBQUU7WUFDekMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7WUFDaEMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN2QixZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7YUFDbEU7UUFDSCxDQUFDLENBQUM7UUFFRjs7Ozs7Ozs7VUFRRTtRQUVGLGFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRTdCLG1CQUFjLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUV6QyxnQkFBVyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE1B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