nuxt-can
nuxt-can apporte deux directives Vue (v-can, v-cannot) pour écrire des permissions ultra lisibles dans les templates Nuxt. Les directives sont transformées à la compilation en appels à une fonction __can__ fournie par l’application hôte tout en restant 100 % tree-shake friendly et parfaitement typées côté TypeScript.
Features
- ✅ Directives
v-can/v-cannottransformées env-if/!v-if - ✅ Merge automatique avec des
v-ifexistants (pas de runtime inutile) - ✅ Proxy global
can+ types générés selon votre configuration de permissions - ✅ Import configurable de la fonction
__can__(store, API, …) - ✅ Erreurs compile-time claires (cas interdits détectés avant build)
Quick Setup
Installez le module dans votre application Nuxt :
npm install nuxt-can
# ou
npx nuxi module add nuxt-can
Déclarez ensuite le module et configurez vos permissions :
// nuxt.config.ts
import NuxtCan from 'nuxt-can'
export default defineNuxtConfig({
modules: [NuxtCan],
nuxtCan: {
permissions: {
employee: ['view', 'edit'],
contract: ['create'],
},
canFunctionImport: '~/permissions/can', // chemin vers votre implémentation __can__
},
})
Implémentez la fonction __can__ dans le fichier ciblé (~/permissions/can dans l’exemple) :
// permissions/can.ts
const permissionsStore = usePermissionsStore()
export function __can__(path: string[]) {
return permissionsStore.check(path.join('.'))
}
Le module génère automatiquement un proxy can typé :
<template>
<button v-can="can.employee.view">Voir le dossier</button>
<button v-if="isReady" v-can="can.employee.edit">
Modifier
</button>
<p v-cannot>Accès refusé</p>
</template>
Résultat compilé :
<button v-if="__can__(['employee', 'view'])">Voir le dossier</button>
<button v-if="(isReady) && __can__(['employee', 'edit'])">Modifier</button>
<p v-if="!(__can__(['employee', 'edit']))">Accès refusé</p>
Règles et erreurs surveillées
v-cannotdoit suivre immédiatement unv-can(aucun autre composant entre les deux).- Un
v-canne peut pas cohabiter avecv-else/v-else-if. v-cannotn’accepte ni expression, ni argument, niv-if.- Un seul
v-cannotparv-can. - Les expressions doivent suivre le pattern
can.x.y(au moins deux niveaux aprèscan).
Toute violation produit une erreur compile-time lisible.
Types générés
À partir de la clé permissions, le module génère un fichier .d.ts qui expose :
can/$cansurComponentCustomProperties__can__sur les templates/scripts NuxtNuxtApp.$canetNuxtApp.$__can__
La DX template + TypeScript reste donc impeccable sans configuration additionnelle.
Contribution
Local development
# Install dependencies
npm install
# Generate type stubs
npm run dev:prepare
# Develop with the playground
npm run dev
# Build the playground
npm run dev:build
# Run ESLint
npm run lint
# Run Vitest
npm run test
npm run test:watch
# Release new version
npm run release