com-angel-authorization 1.0.0 → 1.0.1

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 +1 @@
1
- {"version":3,"sources":["../../src/vue/plugin.ts","../../src/vue/directive.ts","../../src/vue/Can.ts","../../src/vue/index.ts"],"sourcesContent":["import {\n computed,\n inject,\n onScopeDispose,\n shallowRef,\n type App,\n type ComputedRef,\n type InjectionKey,\n type Plugin,\n} from 'vue';\nimport {\n createPermissionStore,\n type CheckOptions,\n type PermissionCode,\n type PermissionState,\n type PermissionStore,\n type RoleCode,\n} from '../core';\nimport { createVPermission } from './directive';\n\nexport const PERMISSION_STORE_KEY: InjectionKey<PermissionStore> = Symbol(\n 'angel-authorization-store',\n);\n\nexport interface PermissionPluginOptions {\n /** Pass an existing store to share across apps. */\n store?: PermissionStore;\n /** Initial state when the plugin creates its own store. */\n initialState?: Partial<PermissionState>;\n /** Custom directive name. Default: `permission` → `v-permission`. */\n directiveName?: string;\n}\n\nexport function createPermissionPlugin(\n options: PermissionPluginOptions = {},\n): Plugin & { store: PermissionStore } {\n const store = options.store ?? createPermissionStore(options.initialState);\n const directiveName = options.directiveName ?? 'permission';\n\n const plugin: Plugin & { store: PermissionStore } = {\n store,\n install(app: App) {\n app.provide(PERMISSION_STORE_KEY, store);\n app.directive(directiveName, createVPermission(store));\n app.config.globalProperties.$permission = store;\n app.config.globalProperties.$can = (\n codes: PermissionCode | PermissionCode[],\n opts?: CheckOptions,\n ) => store.can(codes, opts);\n app.config.globalProperties.$hasRole = (\n codes: RoleCode | RoleCode[],\n opts?: CheckOptions,\n ) => store.hasRole(codes, opts);\n },\n };\n\n return plugin;\n}\n\nfunction resolveStore(store?: PermissionStore): PermissionStore {\n const injected = store ?? inject(PERMISSION_STORE_KEY, null);\n if (!injected) {\n throw new Error(\n '[com-angel-authorization/vue] Permission store not found. Did you call app.use(createPermissionPlugin())?',\n );\n }\n return injected;\n}\n\nexport interface UsePermissionResult {\n permissions: ComputedRef<PermissionCode[]>;\n roles: ComputedRef<RoleCode[]>;\n isSuperAdmin: ComputedRef<boolean>;\n hasPermission: (codes: PermissionCode | PermissionCode[], options?: CheckOptions) => boolean;\n hasRole: (codes: RoleCode | RoleCode[], options?: CheckOptions) => boolean;\n can: (codes: PermissionCode | PermissionCode[], options?: CheckOptions) => boolean;\n setPermissions: (permissions: PermissionCode[]) => void;\n setRoles: (roles: RoleCode[]) => void;\n setSuperAdmin: (isSuperAdmin: boolean) => void;\n hydrate: (payload: Partial<PermissionState>) => void;\n clear: () => void;\n store: PermissionStore;\n}\n\n/**\n * Reactive permission API for Vue 3 Composition API.\n */\nexport function usePermission(store?: PermissionStore): UsePermissionResult {\n const permissionStore = resolveStore(store);\n const state = shallowRef<PermissionState>(permissionStore.getState());\n\n const unsubscribe = permissionStore.subscribe((next) => {\n state.value = next;\n });\n onScopeDispose(unsubscribe);\n\n return {\n permissions: computed(() => state.value.permissions),\n roles: computed(() => state.value.roles),\n isSuperAdmin: computed(() => Boolean(state.value.isSuperAdmin)),\n hasPermission: (codes, options) => permissionStore.hasPermission(codes, options),\n hasRole: (codes, options) => permissionStore.hasRole(codes, options),\n can: (codes, options) => permissionStore.can(codes, options),\n setPermissions: permissionStore.setPermissions.bind(permissionStore),\n setRoles: permissionStore.setRoles.bind(permissionStore),\n setSuperAdmin: permissionStore.setSuperAdmin.bind(permissionStore),\n hydrate: permissionStore.hydrate.bind(permissionStore),\n clear: permissionStore.clear.bind(permissionStore),\n store: permissionStore,\n };\n}\n\nexport function useHasPermission(\n codes: PermissionCode | PermissionCode[],\n options?: CheckOptions,\n store?: PermissionStore,\n) {\n const { permissions, isSuperAdmin, hasPermission } = usePermission(store);\n return computed(() => {\n void permissions.value;\n void isSuperAdmin.value;\n return hasPermission(codes, options);\n });\n}\n\nexport function useHasRole(\n codes: RoleCode | RoleCode[],\n options?: CheckOptions,\n store?: PermissionStore,\n) {\n const { roles, isSuperAdmin, hasRole } = usePermission(store);\n return computed(() => {\n void roles.value;\n void isSuperAdmin.value;\n return hasRole(codes, options);\n });\n}\n\ndeclare module 'vue' {\n interface ComponentCustomProperties {\n $permission: PermissionStore;\n $can: (codes: PermissionCode | PermissionCode[], options?: CheckOptions) => boolean;\n $hasRole: (codes: RoleCode | RoleCode[], options?: CheckOptions) => boolean;\n }\n}\n","import type { Directive, DirectiveBinding } from 'vue';\nimport type { CheckOptions, MatchMode, PermissionCode, PermissionStore, RoleCode } from '../core';\n\nexport type PermissionDirectiveValue =\n | PermissionCode\n | PermissionCode[]\n | {\n permission?: PermissionCode | PermissionCode[];\n role?: RoleCode | RoleCode[];\n mode?: MatchMode;\n /** When both permission and role are set. Default: `and`. */\n combine?: 'and' | 'or';\n /** CSS display value when allowed. Default: restores original display. */\n display?: string;\n };\n\nfunction parseBinding(binding: DirectiveBinding<PermissionDirectiveValue>): {\n permission?: PermissionCode | PermissionCode[];\n role?: RoleCode | RoleCode[];\n mode?: MatchMode;\n combine: 'and' | 'or';\n display?: string;\n} {\n const value = binding.value;\n const arg = binding.arg;\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return {\n permission: value.permission,\n role: value.role,\n mode: value.mode ?? (arg === 'all' ? 'all' : 'any'),\n combine: value.combine ?? 'and',\n display: value.display,\n };\n }\n\n if (arg === 'role') {\n return {\n role: value as RoleCode | RoleCode[],\n mode: binding.modifiers.all ? 'all' : 'any',\n combine: 'and',\n };\n }\n\n return {\n permission: value as PermissionCode | PermissionCode[],\n mode: arg === 'all' || binding.modifiers.all ? 'all' : 'any',\n combine: 'and',\n };\n}\n\nfunction isAllowed(\n store: PermissionStore,\n binding: DirectiveBinding<PermissionDirectiveValue>,\n): boolean {\n const { permission, role, mode, combine } = parseBinding(binding);\n const options: CheckOptions = { mode };\n\n const hasPermCheck = permission !== undefined;\n const hasRoleCheck = role !== undefined;\n\n if (!hasPermCheck && !hasRoleCheck) return true;\n\n const permOk = hasPermCheck ? store.hasPermission(permission!, options) : true;\n const roleOk = hasRoleCheck ? store.hasRole(role!, options) : true;\n\n if (hasPermCheck && hasRoleCheck) {\n return combine === 'or' ? permOk || roleOk : permOk && roleOk;\n }\n\n return hasPermCheck ? permOk : roleOk;\n}\n\ntype ElWithPermission = HTMLElement & {\n __angelPermissionDisplay?: string;\n __angelPermissionUnsubscribe?: () => void;\n};\n\nfunction applyVisibility(\n el: ElWithPermission,\n allowed: boolean,\n display?: string,\n): void {\n if (el.__angelPermissionDisplay === undefined) {\n el.__angelPermissionDisplay = el.style.display;\n }\n\n if (allowed) {\n el.style.display = display ?? el.__angelPermissionDisplay ?? '';\n el.removeAttribute('aria-hidden');\n } else {\n el.style.display = 'none';\n el.setAttribute('aria-hidden', 'true');\n }\n}\n\n/**\n * Create a `v-permission` directive bound to a specific store.\n * Prefer installing via `createPermissionPlugin()` which registers this automatically.\n */\nexport function createVPermission(\n store: PermissionStore,\n): Directive<ElWithPermission, PermissionDirectiveValue> {\n return {\n mounted(el, binding) {\n const update = () => {\n const { display } = parseBinding(binding);\n applyVisibility(el, isAllowed(store, binding), display);\n };\n\n update();\n el.__angelPermissionUnsubscribe = store.subscribe(update);\n },\n\n updated(el, binding) {\n const { display } = parseBinding(binding);\n applyVisibility(el, isAllowed(store, binding), display);\n },\n\n unmounted(el) {\n el.__angelPermissionUnsubscribe?.();\n delete el.__angelPermissionUnsubscribe;\n delete el.__angelPermissionDisplay;\n },\n };\n}\n","import { computed, defineComponent, type PropType } from 'vue';\nimport type { MatchMode, PermissionCode, RoleCode } from '../core';\nimport { usePermission } from './plugin';\n\n/**\n * Conditionally render slot content based on permission / role.\n *\n * @example\n * <Can permission=\"user:edit\">\n * <button>Edit</button>\n * </Can>\n *\n * <Can :permission=\"['user:edit', 'user:delete']\" mode=\"all\">\n * <AdminPanel />\n * <template #fallback>No access</template>\n * </Can>\n */\nexport const Can = defineComponent({\n name: 'Can',\n props: {\n permission: {\n type: [String, Array] as PropType<PermissionCode | PermissionCode[]>,\n default: undefined,\n },\n role: {\n type: [String, Array] as PropType<RoleCode | RoleCode[]>,\n default: undefined,\n },\n mode: {\n type: String as PropType<MatchMode>,\n default: 'any',\n },\n combine: {\n type: String as PropType<'and' | 'or'>,\n default: 'and',\n },\n },\n setup(props, { slots }) {\n const { hasPermission, hasRole, permissions, roles, isSuperAdmin } = usePermission();\n\n const allowed = computed(() => {\n void permissions.value;\n void roles.value;\n void isSuperAdmin.value;\n\n const hasPermCheck = props.permission !== undefined;\n const hasRoleCheck = props.role !== undefined;\n\n if (!hasPermCheck && !hasRoleCheck) return true;\n\n const options = { mode: props.mode };\n const permOk = hasPermCheck ? hasPermission(props.permission!, options) : true;\n const roleOk = hasRoleCheck ? hasRole(props.role!, options) : true;\n\n if (hasPermCheck && hasRoleCheck) {\n return props.combine === 'or' ? permOk || roleOk : permOk && roleOk;\n }\n\n return hasPermCheck ? permOk : roleOk;\n });\n\n return () => {\n if (allowed.value) {\n return slots.default?.();\n }\n return slots.fallback?.() ?? null;\n };\n },\n});\n","export {\n createPermissionPlugin,\n usePermission,\n useHasPermission,\n useHasRole,\n PERMISSION_STORE_KEY,\n} from './plugin';\nexport type { PermissionPluginOptions, UsePermissionResult } from './plugin';\n\nexport { createVPermission } from './directive';\nexport type { PermissionDirectiveValue } from './directive';\n\nexport { Can } from './Can';\n\nexport type {\n CheckOptions,\n MatchMode,\n PermissionChecker,\n PermissionCode,\n PermissionListener,\n PermissionState,\n RoleCode,\n} from '../core';\n\nexport { PermissionStore, createPermissionStore } from '../core';\n"],"mappings":"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","names":["computed","computed","createPermissionStore"]}
1
+ {"version":3,"sources":["../../src/vue/plugin.ts","../../src/vue/directive.ts","../../src/vue/Can.ts","../../src/vue/ResourceManager.ts","../../src/vue/index.ts"],"sourcesContent":["import {\n computed,\n inject,\n onScopeDispose,\n shallowRef,\n type App,\n type ComputedRef,\n type InjectionKey,\n type Plugin,\n} from 'vue';\nimport {\n createPermissionStore,\n type CheckOptions,\n type PermissionCode,\n type PermissionState,\n type PermissionStore,\n type RoleCode,\n} from '../core';\nimport { createVPermission } from './directive';\n\nexport const PERMISSION_STORE_KEY: InjectionKey<PermissionStore> = Symbol(\n 'angel-authorization-store',\n);\n\nexport interface PermissionPluginOptions {\n /** Pass an existing store to share across apps. */\n store?: PermissionStore;\n /** Initial state when the plugin creates its own store. */\n initialState?: Partial<PermissionState>;\n /** Custom directive name. Default: `permission` → `v-permission`. */\n directiveName?: string;\n}\n\nexport function createPermissionPlugin(\n options: PermissionPluginOptions = {},\n): Plugin & { store: PermissionStore } {\n const store = options.store ?? createPermissionStore(options.initialState);\n const directiveName = options.directiveName ?? 'permission';\n\n const plugin: Plugin & { store: PermissionStore } = {\n store,\n install(app: App) {\n app.provide(PERMISSION_STORE_KEY, store);\n app.directive(directiveName, createVPermission(store));\n app.config.globalProperties.$permission = store;\n app.config.globalProperties.$can = (\n codes: PermissionCode | PermissionCode[],\n opts?: CheckOptions,\n ) => store.can(codes, opts);\n app.config.globalProperties.$hasRole = (\n codes: RoleCode | RoleCode[],\n opts?: CheckOptions,\n ) => store.hasRole(codes, opts);\n },\n };\n\n return plugin;\n}\n\nfunction resolveStore(store?: PermissionStore): PermissionStore {\n const injected = store ?? inject(PERMISSION_STORE_KEY, null);\n if (!injected) {\n throw new Error(\n '[com-angel-authorization/vue] Permission store not found. Did you call app.use(createPermissionPlugin())?',\n );\n }\n return injected;\n}\n\nexport interface UsePermissionResult {\n permissions: ComputedRef<PermissionCode[]>;\n roles: ComputedRef<RoleCode[]>;\n isSuperAdmin: ComputedRef<boolean>;\n hasPermission: (codes: PermissionCode | PermissionCode[], options?: CheckOptions) => boolean;\n hasRole: (codes: RoleCode | RoleCode[], options?: CheckOptions) => boolean;\n can: (codes: PermissionCode | PermissionCode[], options?: CheckOptions) => boolean;\n setPermissions: (permissions: PermissionCode[]) => void;\n setRoles: (roles: RoleCode[]) => void;\n setSuperAdmin: (isSuperAdmin: boolean) => void;\n hydrate: (payload: Partial<PermissionState>) => void;\n clear: () => void;\n store: PermissionStore;\n}\n\n/**\n * Reactive permission API for Vue 3 Composition API.\n */\nexport function usePermission(store?: PermissionStore): UsePermissionResult {\n const permissionStore = resolveStore(store);\n const state = shallowRef<PermissionState>(permissionStore.getState());\n\n const unsubscribe = permissionStore.subscribe((next) => {\n state.value = next;\n });\n onScopeDispose(unsubscribe);\n\n return {\n permissions: computed(() => state.value.permissions),\n roles: computed(() => state.value.roles),\n isSuperAdmin: computed(() => Boolean(state.value.isSuperAdmin)),\n hasPermission: (codes, options) => permissionStore.hasPermission(codes, options),\n hasRole: (codes, options) => permissionStore.hasRole(codes, options),\n can: (codes, options) => permissionStore.can(codes, options),\n setPermissions: permissionStore.setPermissions.bind(permissionStore),\n setRoles: permissionStore.setRoles.bind(permissionStore),\n setSuperAdmin: permissionStore.setSuperAdmin.bind(permissionStore),\n hydrate: permissionStore.hydrate.bind(permissionStore),\n clear: permissionStore.clear.bind(permissionStore),\n store: permissionStore,\n };\n}\n\nexport function useHasPermission(\n codes: PermissionCode | PermissionCode[],\n options?: CheckOptions,\n store?: PermissionStore,\n) {\n const { permissions, isSuperAdmin, hasPermission } = usePermission(store);\n return computed(() => {\n void permissions.value;\n void isSuperAdmin.value;\n return hasPermission(codes, options);\n });\n}\n\nexport function useHasRole(\n codes: RoleCode | RoleCode[],\n options?: CheckOptions,\n store?: PermissionStore,\n) {\n const { roles, isSuperAdmin, hasRole } = usePermission(store);\n return computed(() => {\n void roles.value;\n void isSuperAdmin.value;\n return hasRole(codes, options);\n });\n}\n\ndeclare module 'vue' {\n interface ComponentCustomProperties {\n $permission: PermissionStore;\n $can: (codes: PermissionCode | PermissionCode[], options?: CheckOptions) => boolean;\n $hasRole: (codes: RoleCode | RoleCode[], options?: CheckOptions) => boolean;\n }\n}\n","import type { Directive, DirectiveBinding } from 'vue';\nimport type { CheckOptions, MatchMode, PermissionCode, PermissionStore, RoleCode } from '../core';\n\nexport type PermissionDirectiveValue =\n | PermissionCode\n | PermissionCode[]\n | {\n permission?: PermissionCode | PermissionCode[];\n role?: RoleCode | RoleCode[];\n mode?: MatchMode;\n /** When both permission and role are set. Default: `and`. */\n combine?: 'and' | 'or';\n /** CSS display value when allowed. Default: restores original display. */\n display?: string;\n };\n\nfunction parseBinding(binding: DirectiveBinding<PermissionDirectiveValue>): {\n permission?: PermissionCode | PermissionCode[];\n role?: RoleCode | RoleCode[];\n mode?: MatchMode;\n combine: 'and' | 'or';\n display?: string;\n} {\n const value = binding.value;\n const arg = binding.arg;\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return {\n permission: value.permission,\n role: value.role,\n mode: value.mode ?? (arg === 'all' ? 'all' : 'any'),\n combine: value.combine ?? 'and',\n display: value.display,\n };\n }\n\n if (arg === 'role') {\n return {\n role: value as RoleCode | RoleCode[],\n mode: binding.modifiers.all ? 'all' : 'any',\n combine: 'and',\n };\n }\n\n return {\n permission: value as PermissionCode | PermissionCode[],\n mode: arg === 'all' || binding.modifiers.all ? 'all' : 'any',\n combine: 'and',\n };\n}\n\nfunction isAllowed(\n store: PermissionStore,\n binding: DirectiveBinding<PermissionDirectiveValue>,\n): boolean {\n const { permission, role, mode, combine } = parseBinding(binding);\n const options: CheckOptions = { mode };\n\n const hasPermCheck = permission !== undefined;\n const hasRoleCheck = role !== undefined;\n\n if (!hasPermCheck && !hasRoleCheck) return true;\n\n const permOk = hasPermCheck ? store.hasPermission(permission!, options) : true;\n const roleOk = hasRoleCheck ? store.hasRole(role!, options) : true;\n\n if (hasPermCheck && hasRoleCheck) {\n return combine === 'or' ? permOk || roleOk : permOk && roleOk;\n }\n\n return hasPermCheck ? permOk : roleOk;\n}\n\ntype ElWithPermission = HTMLElement & {\n __angelPermissionDisplay?: string;\n __angelPermissionUnsubscribe?: () => void;\n};\n\nfunction applyVisibility(\n el: ElWithPermission,\n allowed: boolean,\n display?: string,\n): void {\n if (el.__angelPermissionDisplay === undefined) {\n el.__angelPermissionDisplay = el.style.display;\n }\n\n if (allowed) {\n el.style.display = display ?? el.__angelPermissionDisplay ?? '';\n el.removeAttribute('aria-hidden');\n } else {\n el.style.display = 'none';\n el.setAttribute('aria-hidden', 'true');\n }\n}\n\n/**\n * Create a `v-permission` directive bound to a specific store.\n * Prefer installing via `createPermissionPlugin()` which registers this automatically.\n */\nexport function createVPermission(\n store: PermissionStore,\n): Directive<ElWithPermission, PermissionDirectiveValue> {\n return {\n mounted(el, binding) {\n const update = () => {\n const { display } = parseBinding(binding);\n applyVisibility(el, isAllowed(store, binding), display);\n };\n\n update();\n el.__angelPermissionUnsubscribe = store.subscribe(update);\n },\n\n updated(el, binding) {\n const { display } = parseBinding(binding);\n applyVisibility(el, isAllowed(store, binding), display);\n },\n\n unmounted(el) {\n el.__angelPermissionUnsubscribe?.();\n delete el.__angelPermissionUnsubscribe;\n delete el.__angelPermissionDisplay;\n },\n };\n}\n","import { computed, defineComponent, type PropType } from 'vue';\nimport type { MatchMode, PermissionCode, RoleCode } from '../core';\nimport { usePermission } from './plugin';\n\n/**\n * Conditionally render slot content based on permission / role.\n *\n * @example\n * <Can permission=\"user:edit\">\n * <button>Edit</button>\n * </Can>\n *\n * <Can :permission=\"['user:edit', 'user:delete']\" mode=\"all\">\n * <AdminPanel />\n * <template #fallback>No access</template>\n * </Can>\n */\nexport const Can = defineComponent({\n name: 'Can',\n props: {\n permission: {\n type: [String, Array] as PropType<PermissionCode | PermissionCode[]>,\n default: undefined,\n },\n role: {\n type: [String, Array] as PropType<RoleCode | RoleCode[]>,\n default: undefined,\n },\n mode: {\n type: String as PropType<MatchMode>,\n default: 'any',\n },\n combine: {\n type: String as PropType<'and' | 'or'>,\n default: 'and',\n },\n },\n setup(props, { slots }) {\n const { hasPermission, hasRole, permissions, roles, isSuperAdmin } = usePermission();\n\n const allowed = computed(() => {\n void permissions.value;\n void roles.value;\n void isSuperAdmin.value;\n\n const hasPermCheck = props.permission !== undefined;\n const hasRoleCheck = props.role !== undefined;\n\n if (!hasPermCheck && !hasRoleCheck) return true;\n\n const options = { mode: props.mode };\n const permOk = hasPermCheck ? hasPermission(props.permission!, options) : true;\n const roleOk = hasRoleCheck ? hasRole(props.role!, options) : true;\n\n if (hasPermCheck && hasRoleCheck) {\n return props.combine === 'or' ? permOk || roleOk : permOk && roleOk;\n }\n\n return hasPermCheck ? permOk : roleOk;\n });\n\n return () => {\n if (allowed.value) {\n return slots.default?.();\n }\n return slots.fallback?.() ?? null;\n };\n },\n});\n","import {\n defineComponent,\n h,\n onMounted,\n reactive,\n ref,\n watch,\n type PropType,\n} from 'vue';\nimport {\n RESOURCE_PRIVATE_OPTIONS,\n RESOURCE_STATUS_ENABLED,\n RESOURCE_STATUS_OPTIONS,\n type AuthorizationResource,\n type AuthorizationResourceApi,\n type AuthorizationResourceFormValues,\n type PageDirection,\n} from '../resources';\n\nconst PAGE_SIZE_OPTIONS = ['10', '20', '50', '100'];\n\nfunction emptyForm(): AuthorizationResourceFormValues {\n return {\n name: '',\n identification: '',\n status: RESOURCE_STATUS_ENABLED,\n private: false,\n description: '',\n };\n}\n\nconst s = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n padding: '16px',\n color: '#101828',\n fontFamily:\n '\"PingFang SC\", \"Microsoft YaHei\", -apple-system, BlinkMacSystemFont, sans-serif',\n },\n toolbar: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n },\n title: { margin: '0', fontSize: '18px', fontWeight: '600' },\n toolbarRight: { display: 'flex', alignItems: 'center', gap: '8px' },\n error: {\n padding: '10px 12px',\n borderRadius: '8px',\n background: '#fef3f2',\n color: '#b42318',\n fontSize: '13px',\n },\n tableWrap: {\n overflow: 'auto',\n border: '1px solid #eaecf0',\n borderRadius: '10px',\n background: '#fff',\n },\n table: { width: '100%', borderCollapse: 'collapse', minWidth: '720px' },\n th: {\n textAlign: 'left',\n padding: '12px 14px',\n fontSize: '13px',\n fontWeight: '600',\n color: '#475467',\n background: '#f9fafb',\n borderBottom: '1px solid #eaecf0',\n },\n td: {\n padding: '12px 14px',\n fontSize: '14px',\n borderBottom: '1px solid #f2f4f7',\n verticalAlign: 'middle',\n },\n empty: {\n padding: '28px',\n textAlign: 'center',\n color: '#98a2b3',\n fontSize: '14px',\n },\n code: {\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n fontSize: '13px',\n background: '#f2f4f7',\n padding: '2px 6px',\n borderRadius: '4px',\n },\n badge: {\n display: 'inline-block',\n padding: '2px 8px',\n borderRadius: '999px',\n fontSize: '12px',\n fontWeight: '500',\n },\n linkBtn: {\n border: 'none',\n background: 'transparent',\n color: '#049BAD',\n cursor: 'pointer',\n padding: '0 8px 0 0',\n fontSize: '13px',\n },\n pagination: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n },\n pageSize: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '13px',\n color: '#475467',\n },\n pageBtns: { display: 'flex', gap: '8px' },\n primaryBtn: {\n border: 'none',\n background: '#049BAD',\n color: '#fff',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n secondaryBtn: {\n border: '1px solid #d0d5dd',\n background: '#fff',\n color: '#344054',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n select: {\n border: '1px solid #d0d5dd',\n borderRadius: '6px',\n padding: '4px 8px',\n fontSize: '13px',\n },\n mask: {\n position: 'fixed',\n inset: '0',\n background: 'rgba(16, 24, 40, 0.45)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '1000',\n padding: '16px',\n },\n dialog: {\n width: '100%',\n maxWidth: '480px',\n background: '#fff',\n borderRadius: '12px',\n boxShadow: '0 20px 40px rgba(16,24,40,0.18)',\n },\n dialogHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '14px 16px',\n borderBottom: '1px solid #eaecf0',\n },\n dialogTitle: { margin: '0', fontSize: '16px', fontWeight: '600' },\n iconBtn: {\n border: 'none',\n background: 'transparent',\n fontSize: '22px',\n lineHeight: '1',\n cursor: 'pointer',\n color: '#667085',\n },\n form: { display: 'flex', flexDirection: 'column', gap: '12px', padding: '16px' },\n field: { display: 'flex', flexDirection: 'column', gap: '6px' },\n label: { fontSize: '13px', color: '#344054', fontWeight: '500' },\n input: {\n border: '1px solid #d0d5dd',\n borderRadius: '8px',\n padding: '8px 10px',\n fontSize: '14px',\n outline: 'none',\n },\n dialogFooter: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '8px',\n paddingTop: '4px',\n },\n} as const;\n\n/**\n * 权限点管理页面(Vue 3)\n */\nexport const ResourceManager = defineComponent({\n name: 'ResourceManager',\n props: {\n api: {\n type: Object as PropType<AuthorizationResourceApi>,\n required: true,\n },\n title: {\n type: String,\n default: '权限点管理',\n },\n pageSize: {\n type: String,\n default: '20',\n },\n },\n setup(props, { slots }) {\n const records = ref<AuthorizationResource[]>([]);\n const loading = ref(false);\n const error = ref('');\n const pageSize = ref(props.pageSize);\n const pageToken = ref('');\n const hasPreviousPage = ref(false);\n const hasNextPage = ref(false);\n const dialogOpen = ref(false);\n const editing = ref<AuthorizationResource | null>(null);\n const form = reactive<AuthorizationResourceFormValues>(emptyForm());\n const saving = ref(false);\n\n const statusLabel = Object.fromEntries(\n RESOURCE_STATUS_OPTIONS.map((o) => [o.value, o.label]),\n ) as Record<number, string>;\n\n async function loadList(direction: PageDirection = 'current', token = pageToken.value) {\n loading.value = true;\n error.value = '';\n try {\n const result = await props.api.list({\n pagination: {\n pageToken: token,\n pageSize: pageSize.value,\n pageDirection: direction,\n },\n });\n records.value = result.records;\n pageToken.value = result.pageToken;\n hasPreviousPage.value = result.hasPreviousPage;\n hasNextPage.value = result.hasNextPage;\n } catch (err) {\n error.value = err instanceof Error ? err.message : '加载失败';\n } finally {\n loading.value = false;\n }\n }\n\n function openCreate() {\n editing.value = null;\n Object.assign(form, emptyForm());\n dialogOpen.value = true;\n }\n\n function openEdit(row: AuthorizationResource) {\n editing.value = row;\n Object.assign(form, {\n name: row.name,\n identification: row.identification,\n status: row.status,\n private: row.private,\n description: row.description,\n });\n dialogOpen.value = true;\n }\n\n function closeDialog() {\n if (!saving.value) dialogOpen.value = false;\n }\n\n async function handleSubmit(event: Event) {\n event.preventDefault();\n if (!form.name.trim()) {\n error.value = '请填写权限名称';\n return;\n }\n if (!form.identification.trim()) {\n error.value = '请填写接口标识';\n return;\n }\n\n saving.value = true;\n error.value = '';\n try {\n if (editing.value) {\n await props.api.update(editing.value.resourceId, { ...form });\n } else {\n await props.api.create({ ...form });\n }\n dialogOpen.value = false;\n await loadList('current', '');\n } catch (err) {\n error.value = err instanceof Error ? err.message : '保存失败';\n } finally {\n saving.value = false;\n }\n }\n\n async function handleDelete(row: AuthorizationResource) {\n if (!window.confirm(`确认删除权限点「${row.name}」?`)) return;\n error.value = '';\n try {\n await props.api.remove(row.resourceId);\n await loadList('current', '');\n } catch (err) {\n error.value = err instanceof Error ? err.message : '删除失败';\n }\n }\n\n onMounted(() => {\n void loadList('current', '');\n });\n\n watch(\n () => [props.api, pageSize.value] as const,\n () => {\n pageToken.value = '';\n void loadList('current', '');\n },\n );\n\n return () =>\n h('div', { style: s.root }, [\n h('div', { style: s.toolbar }, [\n h('h2', { style: s.title }, props.title),\n h('div', { style: s.toolbarRight }, [\n slots.toolbarExtra?.(),\n h(\n 'button',\n { type: 'button', style: s.primaryBtn, onClick: openCreate },\n '新增',\n ),\n ]),\n ]),\n error.value ? h('div', { style: s.error }, error.value) : null,\n h('div', { style: s.tableWrap }, [\n h('table', { style: s.table }, [\n h('thead', [\n h('tr', [\n h('th', { style: s.th }, '权限名称'),\n h('th', { style: s.th }, '接口标识'),\n h('th', { style: s.th }, '描述'),\n h('th', { style: { ...s.th, width: '90px' } }, '状态'),\n h('th', { style: { ...s.th, width: '140px' } }, '操作'),\n ]),\n ]),\n h(\n 'tbody',\n loading.value\n ? [\n h('tr', [\n h('td', { colspan: 5, style: s.empty }, '加载中…'),\n ]),\n ]\n : records.value.length === 0\n ? [\n h('tr', [\n h('td', { colspan: 5, style: s.empty }, '暂无数据'),\n ]),\n ]\n : records.value.map((row) =>\n h('tr', { key: row.resourceId }, [\n h('td', { style: s.td }, row.name),\n h('td', { style: s.td }, [\n h('code', { style: s.code }, row.identification),\n ]),\n h('td', { style: s.td }, row.description || '—'),\n h('td', { style: s.td }, [\n h(\n 'span',\n {\n style: {\n ...s.badge,\n background:\n row.status === RESOURCE_STATUS_ENABLED\n ? '#e8f7ef'\n : '#f4f4f5',\n color:\n row.status === RESOURCE_STATUS_ENABLED\n ? '#067647'\n : '#667085',\n },\n },\n statusLabel[row.status] ?? String(row.status),\n ),\n ]),\n h('td', { style: s.td }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.linkBtn,\n onClick: () => openEdit(row),\n },\n '编辑',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: { ...s.linkBtn, color: '#d92d20' },\n onClick: () => void handleDelete(row),\n },\n '删除',\n ),\n ]),\n ]),\n ),\n ),\n ]),\n ]),\n h('div', { style: s.pagination }, [\n h('label', { style: s.pageSize }, [\n '每页',\n h(\n 'select',\n {\n style: s.select,\n value: pageSize.value,\n onChange: (e: Event) => {\n pageSize.value = (e.target as HTMLSelectElement).value;\n },\n },\n PAGE_SIZE_OPTIONS.map((size) =>\n h('option', { key: size, value: size }, size),\n ),\n ),\n ]),\n h('div', { style: s.pageBtns }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: !hasPreviousPage.value || loading.value,\n onClick: () => void loadList('previous'),\n },\n '上一页',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: !hasNextPage.value || loading.value,\n onClick: () => void loadList('next'),\n },\n '下一页',\n ),\n ]),\n ]),\n dialogOpen.value\n ? h(\n 'div',\n { style: s.mask, onClick: closeDialog },\n [\n h(\n 'div',\n {\n style: s.dialog,\n role: 'dialog',\n 'aria-modal': 'true',\n onClick: (e: Event) => e.stopPropagation(),\n },\n [\n h('div', { style: s.dialogHeader }, [\n h(\n 'h3',\n { style: s.dialogTitle },\n editing.value ? '编辑权限点' : '新增权限点',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.iconBtn,\n 'aria-label': '关闭',\n onClick: closeDialog,\n },\n '×',\n ),\n ]),\n h(\n 'form',\n {\n style: s.form,\n onSubmit: (e: Event) => void handleSubmit(e),\n },\n [\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '权限名称'),\n h('input', {\n style: s.input,\n value: form.name,\n placeholder: '请输入权限名称',\n required: true,\n onInput: (e: Event) => {\n form.name = (e.target as HTMLInputElement).value;\n },\n }),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '接口标识'),\n h('input', {\n style: s.input,\n value: form.identification,\n placeholder: '如 user:list',\n required: true,\n onInput: (e: Event) => {\n form.identification = (\n e.target as HTMLInputElement\n ).value;\n },\n }),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '状态'),\n h(\n 'select',\n {\n style: s.input,\n value: form.status,\n onChange: (e: Event) => {\n form.status = Number(\n (e.target as HTMLSelectElement).value,\n ) as 0 | 1;\n },\n },\n RESOURCE_STATUS_OPTIONS.map((opt) =>\n h('option', { key: opt.value, value: opt.value }, opt.label),\n ),\n ),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '私有资源'),\n h(\n 'select',\n {\n style: s.input,\n value: form.private ? '1' : '0',\n onChange: (e: Event) => {\n form.private =\n (e.target as HTMLSelectElement).value === '1';\n },\n },\n RESOURCE_PRIVATE_OPTIONS.map((opt) =>\n h(\n 'option',\n {\n key: String(opt.value),\n value: opt.value ? '1' : '0',\n },\n opt.label,\n ),\n ),\n ),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '描述'),\n h('textarea', {\n style: {\n ...s.input,\n minHeight: '88px',\n resize: 'vertical',\n },\n value: form.description,\n placeholder: '请输入描述',\n onInput: (e: Event) => {\n form.description = (\n e.target as HTMLTextAreaElement\n ).value;\n },\n }),\n ]),\n h('div', { style: s.dialogFooter }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n onClick: closeDialog,\n },\n '取消',\n ),\n h(\n 'button',\n {\n type: 'submit',\n style: s.primaryBtn,\n disabled: saving.value,\n },\n saving.value ? '保存中…' : '保存',\n ),\n ]),\n ],\n ),\n ],\n ),\n ],\n )\n : null,\n ]);\n },\n});\n","export {\n createPermissionPlugin,\n usePermission,\n useHasPermission,\n useHasRole,\n PERMISSION_STORE_KEY,\n} from './plugin';\nexport type { PermissionPluginOptions, UsePermissionResult } from './plugin';\n\nexport { createVPermission } from './directive';\nexport type { PermissionDirectiveValue } from './directive';\n\nexport { Can } from './Can';\n\nexport { ResourceManager } from './ResourceManager';\n\nexport type {\n CheckOptions,\n MatchMode,\n PermissionChecker,\n PermissionCode,\n PermissionListener,\n PermissionState,\n RoleCode,\n} from '../core';\n\nexport { PermissionStore, createPermissionStore } from '../core';\n\nexport { getAppClientId, getDeviceWorkerId, snowyflake } from '../utils/snowflake';\n\nexport type {\n AuthorizationResource,\n AuthorizationResourceApi,\n AuthorizationResourceFormValues,\n AuthorizationResourceListResult,\n CreateAuthorizationResourceBody,\n CreateDefaultResourceRequestOptions,\n FetchAuthorizationResourcesParams,\n HttpMethod,\n ListPaginationParams,\n ListPaginationResult,\n PageDirection,\n ResourceHttpRequest,\n ResourceRequestOptions,\n ResourceStatus,\n UpdateAuthorizationResourceBody,\n} from '../resources';\n\nexport {\n RESOURCE_PRIVATE_OPTIONS,\n RESOURCE_STATUS_DISABLED,\n RESOURCE_STATUS_ENABLED,\n RESOURCE_STATUS_OPTIONS,\n RESOURCE_TYPE_API,\n appendQueryParam,\n buildCreateBody,\n buildUpdateBody,\n createAuthorizationResourceApi,\n createDefaultResourceRequest,\n extractPagination,\n extractRecords,\n mapAuthorizationResource,\n} from '../resources';\n"],"mappings":"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","names":["computed","computed","defineComponent","createPermissionStore","RESOURCE_PRIVATE_OPTIONS","RESOURCE_STATUS_ENABLED","RESOURCE_STATUS_OPTIONS"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "com-angel-authorization",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Framework-agnostic user permission toolkit for React and Vue",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -30,6 +30,7 @@
30
30
  "scripts": {
31
31
  "build": "tsup",
32
32
  "dev": "tsup --watch",
33
+ "demo": "vite --config playground/vite.config.ts",
33
34
  "typecheck": "tsc --noEmit",
34
35
  "prepublishOnly": "npm run build"
35
36
  },
@@ -58,9 +59,13 @@
58
59
  },
59
60
  "devDependencies": {
60
61
  "@types/react": "^18.3.12",
62
+ "@types/react-dom": "^18.3.1",
63
+ "@vitejs/plugin-react": "^4.3.4",
61
64
  "react": "^18.3.1",
65
+ "react-dom": "^18.3.1",
62
66
  "tsup": "^8.3.5",
63
67
  "typescript": "^5.6.3",
68
+ "vite": "^5.4.11",
64
69
  "vue": "^3.5.13"
65
70
  },
66
71
  "sideEffects": false