{"_id":"@composy/permission-vue","name":"@composy/permission-vue","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"@composy/permission-vue","type":"module","version":"0.0.1","description":"LDesign 权限系统 Vue 3 适配层 / Vue 3 adapter for @composy/permission-core","author":{"name":"LDesign Team"},"license":"MIT","homepage":"https://github.com/ldesign/ldesign/tree/main/packages/permission/packages/vue#readme","repository":{"type":"git","url":"git+https://github.com/ldesign/ldesign.git","directory":"packages/permission/packages/vue"},"bugs":{"url":"https://github.com/ldesign/ldesign/issues"},"keywords":["authorization","composables","directives","ldesign","permission","rbac","typescript","vue3"],"sideEffects":false,"exports":{".":{"types":"./es/index.d.ts","import":"./es/index.js","require":"./lib/index.cjs","default":"./es/index.js"},"./components":{"types":"./es/components/index.d.ts","import":"./es/components/index.js","require":"./lib/components/index.cjs","default":"./es/components/index.js"},"./components/*":{"types":"./es/components/*.d.ts","import":"./es/components/*.js","require":"./lib/components/*.cjs","default":"./es/components/*.js"},"./composables":{"types":"./es/composables/index.d.ts","import":"./es/composables/index.js","require":"./lib/composables/index.cjs","default":"./es/composables/index.js"},"./composables/*":{"types":"./es/composables/*.d.ts","import":"./es/composables/*.js","require":"./lib/composables/*.cjs","default":"./es/composables/*.js"},"./directives":{"types":"./es/directives/index.d.ts","import":"./es/directives/index.js","require":"./lib/directives/index.cjs","default":"./es/directives/index.js"},"./directives/*":{"types":"./es/directives/*.d.ts","import":"./es/directives/*.js","require":"./lib/directives/*.cjs","default":"./es/directives/*.js"},"./engine":{"types":"./es/engine/index.d.ts","import":"./es/engine/index.js","require":"./lib/engine/index.cjs","default":"./es/engine/index.js"},"./engine/*":{"types":"./es/engine/*.d.ts","import":"./es/engine/*.js","require":"./lib/engine/*.cjs","default":"./es/engine/*.js"},"./plugin":{"types":"./es/plugin/index.d.ts","import":"./es/plugin/index.js","require":"./lib/plugin/index.cjs","default":"./es/plugin/index.js"},"./plugin/*":{"types":"./es/plugin/*.d.ts","import":"./es/plugin/*.js","require":"./lib/plugin/*.cjs","default":"./es/plugin/*.js"},"./package.json":"./package.json"},"main":"./lib/index.cjs","module":"./es/index.js","unpkg":"./dist/index.min.js","jsdelivr":"./dist/index.min.js","types":"./es/index.d.ts","scripts":{"build":"ldesign-builder build","build:only":"ldesign-builder build","clean":"rimraf es esm lib dist coverage","dev":"ldesign-builder build --watch","lint":"eslint . --fix","lint:check":"eslint . --max-warnings 0","lint:fix":"eslint . --fix","test":"ltesting run:unit","test:run":"ltesting run:unit","type-check":"vue-tsc --noEmit","test:watch":"ltesting run:unit --watch","test:coverage":"ltesting run:unit --coverage","test:changed":"ltesting run:unit --changed","test:failed":"ltesting run:unit --failed","test:ui":"ltesting dashboard"},"peerDependencies":{"@composy/engine-core":"^0.0.1","@composy/permission-core":"^0.0.1","vue":"^3.5.32","vue-router":"^4.0.0"},"peerDependenciesMeta":{"@composy/engine-core":{"optional":true},"vue-router":{"optional":true}},"dependencies":{"@composy/permission-core":"^0.0.1"},"devDependencies":{"@antfu/eslint-config":"9.1.0","@composy/builder":"^0.0.1","@composy/testing":"^0.0.1","@types/node":"26.1.1","eslint":"10.7.0","rimraf":"^6.1.3","typescript":"5.9.3","vue":"3.5.39","vue-router":"^5.1.0","vue-tsc":"^3.3.7"},"typings":"./es/index.d.ts","browser":"./dist/index.js","_id":"@composy/permission-vue@0.0.1","_nodeVersion":"23.11.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-ildB1B2cm+URNsVcBENzStv9hAvGYI3e4mWTxFyAAwEJfEbUfVy/KG4YTyQpU/VKKd3e7z2EpxAxBTlbR5Jc4g==","shasum":"73f3b0bdf73df9aa27ccb43eb1b9635aa2b43b3c","tarball":"https://registry.npmjs.org/@composy/permission-vue/-/permission-vue-0.0.1.tgz","fileCount":206,"unpackedSize":820150,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCIU4b/ikdihsBSMB24y+Aj6jyLtx3y7gk6gj9hH+6cwQIhAIuh5fK0TJ6Xg2UcU4hgN31UB4f1Hb4kUrKI/Z2cVvy7"}]},"_npmUser":{"name":"swimly","email":"979741120@qq.com"},"directories":{},"maintainers":[{"name":"swimly","email":"979741120@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/permission-vue_0.0.1_1786948874619_0.7263711640232662"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-17T06:41:14.351Z","0.0.1":"2026-08-17T06:41:14.769Z","modified":"2026-08-17T06:41:15.037Z"},"maintainers":[{"name":"swimly","email":"979741120@qq.com"}],"description":"LDesign 权限系统 Vue 3 适配层 / Vue 3 adapter for @composy/permission-core","homepage":"https://github.com/ldesign/ldesign/tree/main/packages/permission/packages/vue#readme","keywords":["authorization","composables","directives","ldesign","permission","rbac","typescript","vue3"],"repository":{"type":"git","url":"git+https://github.com/ldesign/ldesign.git","directory":"packages/permission/packages/vue"},"author":{"name":"LDesign Team"},"bugs":{"url":"https://github.com/ldesign/ldesign/issues"},"license":"MIT","readme":"# @composy/permission-vue\n\n`@composy/permission-vue` 是 `@composy/permission-core` 的 Vue 3 适配层，统一提供：\n\n- 原生 Vue Plugin 用法\n- `@composy/engine-core` plugin 用法\n- `usePermission` / `useRole`\n- `v-permission` / `v-role`\n- `PermissionGuard` / `RoleGuard`\n\n## 设计原则\n\n- 权限算法、角色继承、策略评估、缓存和错误上报全部来自 `@composy/permission-core`。\n- Vue 层只维护响应式桥接、生命周期清理、指令 DOM 行为、Guard 渲染和路由守卫。\n- 权限和角色输入会复用 core 的 `normalizePermissionList` /\n  `normalizeRoleList`，保证与非 Vue 场景一致。\n- `PermissionManager.subscribe()`\n  是 Vue 响应式状态更新的唯一来源，避免在组件层重复实现缓存或权限判断。\n\n## 安装\n\n```bash\npnpm add @composy/permission-core @composy/permission-vue\n```\n\n## 原生 Vue Plugin\n\n```ts\nimport { createPermissionPlugin } from '@composy/permission-vue'\nimport { createApp } from 'vue'\n\nconst app = createApp(App)\n\napp.use(\n  createPermissionPlugin({\n    superRole: 'admin',\n    onError(error) {\n      console.warn(error.phase, error.event)\n    },\n    permissionProvider: () => authStore.permissions,\n    roleProvider: () => authStore.roles,\n    roles: [\n      { id: 'admin', name: '管理员', permissions: ['*'], isSuper: true },\n      { id: 'editor', name: '编辑者', permissions: ['article:write'], parent: 'user' },\n    ],\n  })\n)\n```\n\n## Engine Plugin\n\n```ts\nimport { createPermissionEnginePlugin } from '@composy/permission-vue'\n\nconst permissionPlugin = createPermissionEnginePlugin({\n  permissionProvider: () => authStore.permissions,\n  roleProvider: () => authStore.roles,\n  installVuePlugin: true,\n})\n\nconsole.info(permissionPlugin.name)\n```\n\n## Composables\n\n```ts\nimport { usePermission, useRole } from '@composy/permission-vue'\n\nconst { permissions, can, refresh } = usePermission()\nconst { roles, is } = useRole()\n\nconst canEditArticle = can(['article:read', 'article:write'])\nconst isAdmin = is('admin')\n\nconsole.info(permissions.value, roles.value, canEditArticle.value, isAdmin.value, refresh)\n```\n\n## Directives\n\n<!-- prettier-ignore -->\n```vue\n<template>\n  <button v-permission=\"'user:create'\">\n    创建用户\n  </button>\n  <button v-permission.disable=\"'user:delete'\">\n    删除用户\n  </button>\n  <div v-role.any=\"['admin', 'manager']\">\n    管理区\n  </div>\n</template>\n```\n\n## Guard 组件\n\n```vue\n<template>\n  <PermissionGuard :permissions=\"['user:create']\">\n    <button>创建用户</button>\n\n    <template #fallback>\n      <span>无权限</span>\n    </template>\n  </PermissionGuard>\n\n  <RoleGuard :roles=\"['admin', 'manager']\" mode=\"any\">\n    <AdminPanel />\n  </RoleGuard>\n</template>\n```\n\n## 主要导出\n\n- `createPermissionPlugin`\n- `createPermissionEnginePlugin`\n- `usePermission`\n- `useRole`\n- `createPermissionDirective`\n- `createRoleDirective`\n- `PermissionGuard`\n- `RoleGuard`\n","readmeFilename":"README.md","_rev":"1-213f24b1935586fc825e550fe030b9cc"}