com-angel-authorization 1.0.1 → 1.0.3

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/react/index.ts","../../src/react/context.tsx","../../src/react/Can.tsx","../../src/react/ResourceManager.tsx"],"sourcesContent":["export { PermissionProvider, usePermission, useHasPermission, useHasRole } from './context';\nexport type { PermissionProviderProps, UsePermissionResult } from './context';\n\nexport { Can } from './Can';\nexport type { CanProps } from './Can';\n\nexport { ResourceManager } from './ResourceManager';\nexport type { ResourceManagerProps } 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","import {\n createContext,\n createElement,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport {\n createPermissionStore,\n type CheckOptions,\n type PermissionCode,\n type PermissionState,\n type PermissionStore,\n type RoleCode,\n} from '../core';\n\nconst PermissionContext = createContext<PermissionStore | null>(null);\n\nexport interface PermissionProviderProps {\n children: ReactNode;\n /** Pass an existing store to share across trees, or omit to create one. */\n store?: PermissionStore;\n /** Initial state when the provider creates its own store. */\n initialState?: Partial<PermissionState>;\n}\n\nexport function PermissionProvider({\n children,\n store: externalStore,\n initialState,\n}: PermissionProviderProps) {\n const store = useMemo(\n () => externalStore ?? createPermissionStore(initialState),\n // store identity is intentional; initialState only applies on first create\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [externalStore],\n );\n\n return createElement(PermissionContext.Provider, { value: store }, children);\n}\n\nfunction useStore(): PermissionStore {\n const store = useContext(PermissionContext);\n if (!store) {\n throw new Error(\n '[com-angel-authorization/react] usePermission* hooks must be used within <PermissionProvider>.',\n );\n }\n return store;\n}\n\nfunction usePermissionSnapshot(store: PermissionStore): PermissionState {\n const [state, setState] = useState(() => store.getState());\n\n useEffect(() => {\n setState(store.getState());\n return store.subscribe(setState);\n }, [store]);\n\n return state;\n}\n\nexport interface UsePermissionResult {\n permissions: PermissionCode[];\n roles: RoleCode[];\n isSuperAdmin: 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\nexport function usePermission(): UsePermissionResult {\n const store = useStore();\n const state = usePermissionSnapshot(store);\n\n const hasPermission = useCallback(\n (codes: PermissionCode | PermissionCode[], options?: CheckOptions) =>\n store.hasPermission(codes, options),\n [store],\n );\n\n const hasRole = useCallback(\n (codes: RoleCode | RoleCode[], options?: CheckOptions) => store.hasRole(codes, options),\n [store],\n );\n\n const can = useCallback(\n (codes: PermissionCode | PermissionCode[], options?: CheckOptions) => store.can(codes, options),\n [store],\n );\n\n return {\n permissions: state.permissions,\n roles: state.roles,\n isSuperAdmin: Boolean(state.isSuperAdmin),\n hasPermission,\n hasRole,\n can,\n setPermissions: store.setPermissions.bind(store),\n setRoles: store.setRoles.bind(store),\n setSuperAdmin: store.setSuperAdmin.bind(store),\n hydrate: store.hydrate.bind(store),\n clear: store.clear.bind(store),\n store,\n };\n}\n\n/** Returns whether the current user has the given permission(s). */\nexport function useHasPermission(\n codes: PermissionCode | PermissionCode[],\n options?: CheckOptions,\n): boolean {\n const { hasPermission, permissions, isSuperAdmin } = usePermission();\n // re-compute when permission list / super-admin changes\n void permissions;\n void isSuperAdmin;\n return hasPermission(codes, options);\n}\n\n/** Returns whether the current user has the given role(s). */\nexport function useHasRole(\n codes: RoleCode | RoleCode[],\n options?: CheckOptions,\n): boolean {\n const { hasRole, roles, isSuperAdmin } = usePermission();\n void roles;\n void isSuperAdmin;\n return hasRole(codes, options);\n}\n","import type { ReactNode } from 'react';\nimport type { CheckOptions, PermissionCode, RoleCode } from '../core';\nimport { usePermission } from './context';\n\nexport interface CanProps {\n /** Permission codes to check. */\n permission?: PermissionCode | PermissionCode[];\n /** Role codes to check. */\n role?: RoleCode | RoleCode[];\n /**\n * `any` — pass when at least one code matches (default)\n * `all` — pass only when every code matches\n */\n mode?: CheckOptions['mode'];\n /**\n * How permission and role conditions combine when both are provided.\n * Default: `and` (must satisfy both).\n */\n combine?: 'and' | 'or';\n children: ReactNode;\n /** Fallback when access is denied. */\n fallback?: ReactNode;\n}\n\nfunction evaluateAccess(\n hasPermission: (c: PermissionCode | PermissionCode[], o?: CheckOptions) => boolean,\n hasRole: (c: RoleCode | RoleCode[], o?: CheckOptions) => boolean,\n props: Pick<CanProps, 'permission' | 'role' | 'mode' | 'combine'>,\n): boolean {\n const { permission, role, mode, combine = 'and' } = props;\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 ? hasPermission(permission!, options) : true;\n const roleOk = hasRoleCheck ? 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\n/**\n * Conditionally render children 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\" fallback={null}>\n * <AdminPanel />\n * </Can>\n */\nexport function Can({\n permission,\n role,\n mode,\n combine,\n children,\n fallback = null,\n}: CanProps) {\n const { hasPermission, hasRole } = usePermission();\n const allowed = evaluateAccess(hasPermission, hasRole, {\n permission,\n role,\n mode,\n combine,\n });\n\n return <>{allowed ? children : fallback}</>;\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type CSSProperties,\n type FormEvent,\n type ReactNode,\n} from 'react';\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\nconst emptyForm = (): AuthorizationResourceFormValues => ({\n name: '',\n identification: '',\n status: RESOURCE_STATUS_ENABLED,\n private: false,\n description: '',\n});\n\nexport type ResourceManagerProps = {\n api: AuthorizationResourceApi;\n title?: string;\n pageSize?: string;\n /** 自定义顶部右侧操作区 */\n toolbarExtra?: ReactNode;\n};\n\nexport function ResourceManager({\n api,\n title = '权限点管理',\n pageSize: initialPageSize = '20',\n toolbarExtra,\n}: ResourceManagerProps) {\n const [records, setRecords] = useState<AuthorizationResource[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [pageSize, setPageSize] = useState(initialPageSize);\n const [pageToken, setPageToken] = useState('');\n const [hasPreviousPage, setHasPreviousPage] = useState(false);\n const [hasNextPage, setHasNextPage] = useState(false);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [editing, setEditing] = useState<AuthorizationResource | null>(null);\n const [form, setForm] = useState<AuthorizationResourceFormValues>(emptyForm);\n const [saving, setSaving] = useState(false);\n\n const loadList = useCallback(\n async (direction: PageDirection = 'current', token = pageToken) => {\n setLoading(true);\n setError('');\n try {\n const result = await api.list({\n pagination: {\n pageToken: token,\n pageSize,\n pageDirection: direction,\n },\n });\n setRecords(result.records);\n setPageToken(result.pageToken);\n setHasPreviousPage(result.hasPreviousPage);\n setHasNextPage(result.hasNextPage);\n } catch (err) {\n setError(err instanceof Error ? err.message : '加载失败');\n } finally {\n setLoading(false);\n }\n },\n [api, pageSize, pageToken],\n );\n\n useEffect(() => {\n void loadList('current', '');\n // 仅 pageSize / api 变化时重置首页\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, pageSize]);\n\n const openCreate = () => {\n setEditing(null);\n setForm(emptyForm());\n setDialogOpen(true);\n };\n\n const openEdit = (row: AuthorizationResource) => {\n setEditing(row);\n setForm({\n name: row.name,\n identification: row.identification,\n status: row.status,\n private: row.private,\n description: row.description,\n });\n setDialogOpen(true);\n };\n\n const closeDialog = () => {\n if (saving) return;\n setDialogOpen(false);\n };\n\n const handleSubmit = async (event: FormEvent) => {\n event.preventDefault();\n if (!form.name.trim()) {\n setError('请填写权限名称');\n return;\n }\n if (!form.identification.trim()) {\n setError('请填写接口标识');\n return;\n }\n\n setSaving(true);\n setError('');\n try {\n if (editing) {\n await api.update(editing.resourceId, form);\n } else {\n await api.create(form);\n }\n setDialogOpen(false);\n await loadList('current', '');\n } catch (err) {\n setError(err instanceof Error ? err.message : '保存失败');\n } finally {\n setSaving(false);\n }\n };\n\n const handleDelete = async (row: AuthorizationResource) => {\n if (!window.confirm(`确认删除权限点「${row.name}」?`)) return;\n setError('');\n try {\n await api.remove(row.resourceId);\n await loadList('current', '');\n } catch (err) {\n setError(err instanceof Error ? err.message : '删除失败');\n }\n };\n\n const statusLabel = useMemo(\n () =>\n Object.fromEntries(RESOURCE_STATUS_OPTIONS.map((o) => [o.value, o.label])) as Record<\n number,\n string\n >,\n [],\n );\n\n return (\n <div style={styles.root}>\n <div style={styles.toolbar}>\n <h2 style={styles.title}>{title}</h2>\n <div style={styles.toolbarRight}>\n {toolbarExtra}\n <button type=\"button\" style={styles.primaryBtn} onClick={openCreate}>\n 新增\n </button>\n </div>\n </div>\n\n {error ? <div style={styles.error}>{error}</div> : null}\n\n <div style={styles.tableWrap}>\n <table style={styles.table}>\n <thead>\n <tr>\n <th style={styles.th}>权限名称</th>\n <th style={styles.th}>接口标识</th>\n <th style={styles.th}>描述</th>\n <th style={{ ...styles.th, width: 90 }}>状态</th>\n <th style={{ ...styles.th, width: 140 }}>操作</th>\n </tr>\n </thead>\n <tbody>\n {loading ? (\n <tr>\n <td colSpan={5} style={styles.empty}>\n 加载中…\n </td>\n </tr>\n ) : records.length === 0 ? (\n <tr>\n <td colSpan={5} style={styles.empty}>\n 暂无数据\n </td>\n </tr>\n ) : (\n records.map((row) => (\n <tr key={row.resourceId}>\n <td style={styles.td}>{row.name}</td>\n <td style={styles.td}>\n <code style={styles.code}>{row.identification}</code>\n </td>\n <td style={styles.td}>{row.description || '—'}</td>\n <td style={styles.td}>\n <span\n style={{\n ...styles.badge,\n background:\n row.status === RESOURCE_STATUS_ENABLED ? '#e8f7ef' : '#f4f4f5',\n color: row.status === RESOURCE_STATUS_ENABLED ? '#067647' : '#667085',\n }}\n >\n {statusLabel[row.status] ?? row.status}\n </span>\n </td>\n <td style={styles.td}>\n <button type=\"button\" style={styles.linkBtn} onClick={() => openEdit(row)}>\n 编辑\n </button>\n <button\n type=\"button\"\n style={{ ...styles.linkBtn, color: '#d92d20' }}\n onClick={() => void handleDelete(row)}\n >\n 删除\n </button>\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n <div style={styles.pagination}>\n <label style={styles.pageSize}>\n 每页\n <select\n value={pageSize}\n onChange={(e) => {\n setPageToken('');\n setPageSize(e.target.value);\n }}\n style={styles.select}\n >\n {PAGE_SIZE_OPTIONS.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </label>\n <div style={styles.pageBtns}>\n <button\n type=\"button\"\n style={styles.secondaryBtn}\n disabled={!hasPreviousPage || loading}\n onClick={() => void loadList('previous')}\n >\n 上一页\n </button>\n <button\n type=\"button\"\n style={styles.secondaryBtn}\n disabled={!hasNextPage || loading}\n onClick={() => void loadList('next')}\n >\n 下一页\n </button>\n </div>\n </div>\n\n {dialogOpen ? (\n <div style={styles.mask} onClick={closeDialog}>\n <div\n style={styles.dialog}\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div style={styles.dialogHeader}>\n <h3 style={styles.dialogTitle}>{editing ? '编辑权限点' : '新增权限点'}</h3>\n <button type=\"button\" style={styles.iconBtn} onClick={closeDialog} aria-label=\"关闭\">\n ×\n </button>\n </div>\n <form style={styles.form} onSubmit={(e) => void handleSubmit(e)}>\n <label style={styles.field}>\n <span style={styles.label}>权限名称</span>\n <input\n style={styles.input}\n value={form.name}\n onChange={(e) => setForm((prev) => ({ ...prev, name: e.target.value }))}\n placeholder=\"请输入权限名称\"\n required\n />\n </label>\n <label style={styles.field}>\n <span style={styles.label}>接口标识</span>\n <input\n style={styles.input}\n value={form.identification}\n onChange={(e) =>\n setForm((prev) => ({ ...prev, identification: e.target.value }))\n }\n placeholder=\"如 user:list\"\n required\n />\n </label>\n <label style={styles.field}>\n <span style={styles.label}>状态</span>\n <select\n style={styles.input}\n value={form.status}\n onChange={(e) =>\n setForm((prev) => ({\n ...prev,\n status: Number(e.target.value) as 0 | 1,\n }))\n }\n >\n {RESOURCE_STATUS_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n <label style={styles.field}>\n <span style={styles.label}>私有资源</span>\n <select\n style={styles.input}\n value={form.private ? '1' : '0'}\n onChange={(e) =>\n setForm((prev) => ({ ...prev, private: e.target.value === '1' }))\n }\n >\n {RESOURCE_PRIVATE_OPTIONS.map((opt) => (\n <option key={String(opt.value)} value={opt.value ? '1' : '0'}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n <label style={styles.field}>\n <span style={styles.label}>描述</span>\n <textarea\n style={{ ...styles.input, minHeight: 88, resize: 'vertical' }}\n value={form.description}\n onChange={(e) =>\n setForm((prev) => ({ ...prev, description: e.target.value }))\n }\n placeholder=\"请输入描述\"\n />\n </label>\n <div style={styles.dialogFooter}>\n <button type=\"button\" style={styles.secondaryBtn} onClick={closeDialog}>\n 取消\n </button>\n <button type=\"submit\" style={styles.primaryBtn} disabled={saving}>\n {saving ? '保存中…' : '保存'}\n </button>\n </div>\n </form>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nconst styles: Record<string, CSSProperties> = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n padding: 16,\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: 12,\n },\n title: { margin: 0, fontSize: 18, fontWeight: 600 },\n toolbarRight: { display: 'flex', alignItems: 'center', gap: 8 },\n error: {\n padding: '10px 12px',\n borderRadius: 8,\n background: '#fef3f2',\n color: '#b42318',\n fontSize: 13,\n },\n tableWrap: {\n overflow: 'auto',\n border: '1px solid #eaecf0',\n borderRadius: 10,\n background: '#fff',\n },\n table: { width: '100%', borderCollapse: 'collapse', minWidth: 720 },\n th: {\n textAlign: 'left',\n padding: '12px 14px',\n fontSize: 13,\n fontWeight: 600,\n color: '#475467',\n background: '#f9fafb',\n borderBottom: '1px solid #eaecf0',\n },\n td: {\n padding: '12px 14px',\n fontSize: 14,\n borderBottom: '1px solid #f2f4f7',\n verticalAlign: 'middle',\n },\n empty: {\n padding: 28,\n textAlign: 'center',\n color: '#98a2b3',\n fontSize: 14,\n },\n code: {\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n fontSize: 13,\n background: '#f2f4f7',\n padding: '2px 6px',\n borderRadius: 4,\n },\n badge: {\n display: 'inline-block',\n padding: '2px 8px',\n borderRadius: 999,\n fontSize: 12,\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: 13,\n },\n pagination: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n },\n pageSize: { display: 'flex', alignItems: 'center', gap: 8, fontSize: 13, color: '#475467' },\n pageBtns: { display: 'flex', gap: 8 },\n primaryBtn: {\n border: 'none',\n background: '#049BAD',\n color: '#fff',\n borderRadius: 8,\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: 14,\n },\n secondaryBtn: {\n border: '1px solid #d0d5dd',\n background: '#fff',\n color: '#344054',\n borderRadius: 8,\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: 14,\n },\n select: {\n border: '1px solid #d0d5dd',\n borderRadius: 6,\n padding: '4px 8px',\n fontSize: 13,\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: 16,\n },\n dialog: {\n width: '100%',\n maxWidth: 480,\n background: '#fff',\n borderRadius: 12,\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: 16, fontWeight: 600 },\n iconBtn: {\n border: 'none',\n background: 'transparent',\n fontSize: 22,\n lineHeight: 1,\n cursor: 'pointer',\n color: '#667085',\n },\n form: { display: 'flex', flexDirection: 'column', gap: 12, padding: 16 },\n field: { display: 'flex', flexDirection: 'column', gap: 6 },\n label: { fontSize: 13, color: '#344054', fontWeight: 500 },\n input: {\n border: '1px solid #d0d5dd',\n borderRadius: 8,\n padding: '8px 10px',\n fontSize: 14,\n outline: 'none',\n },\n dialogFooter: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 8,\n paddingTop: 4,\n },\n};\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_core","import_resources"]}
1
+ {"version":3,"sources":["../../src/react/index.ts","../../src/react/context.tsx","../../src/core/store.ts","../../src/react/Can.tsx","../../src/react/ResourceManager.tsx","../../src/resources/types.ts","../../src/utils/snowflake.ts","../../src/resources/pagination.ts","../../src/resources/api.ts"],"sourcesContent":["export { PermissionProvider, usePermission, useHasPermission, useHasRole } from './context';\nexport type { PermissionProviderProps, UsePermissionResult } from './context';\n\nexport { Can } from './Can';\nexport type { CanProps } from './Can';\n\nexport { ResourceManager } from './ResourceManager';\nexport type { ResourceManagerProps } 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","import {\n createContext,\n createElement,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport {\n createPermissionStore,\n type CheckOptions,\n type PermissionCode,\n type PermissionState,\n type PermissionStore,\n type RoleCode,\n} from '../core';\n\nconst PermissionContext = createContext<PermissionStore | null>(null);\n\nexport interface PermissionProviderProps {\n children: ReactNode;\n /** Pass an existing store to share across trees, or omit to create one. */\n store?: PermissionStore;\n /** Initial state when the provider creates its own store. */\n initialState?: Partial<PermissionState>;\n}\n\nexport function PermissionProvider({\n children,\n store: externalStore,\n initialState,\n}: PermissionProviderProps) {\n const store = useMemo(\n () => externalStore ?? createPermissionStore(initialState),\n // store identity is intentional; initialState only applies on first create\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [externalStore],\n );\n\n return createElement(PermissionContext.Provider, { value: store }, children);\n}\n\nfunction useStore(): PermissionStore {\n const store = useContext(PermissionContext);\n if (!store) {\n throw new Error(\n '[com-angel-authorization/react] usePermission* hooks must be used within <PermissionProvider>.',\n );\n }\n return store;\n}\n\nfunction usePermissionSnapshot(store: PermissionStore): PermissionState {\n const [state, setState] = useState(() => store.getState());\n\n useEffect(() => {\n setState(store.getState());\n return store.subscribe(setState);\n }, [store]);\n\n return state;\n}\n\nexport interface UsePermissionResult {\n permissions: PermissionCode[];\n roles: RoleCode[];\n isSuperAdmin: 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\nexport function usePermission(): UsePermissionResult {\n const store = useStore();\n const state = usePermissionSnapshot(store);\n\n const hasPermission = useCallback(\n (codes: PermissionCode | PermissionCode[], options?: CheckOptions) =>\n store.hasPermission(codes, options),\n [store],\n );\n\n const hasRole = useCallback(\n (codes: RoleCode | RoleCode[], options?: CheckOptions) => store.hasRole(codes, options),\n [store],\n );\n\n const can = useCallback(\n (codes: PermissionCode | PermissionCode[], options?: CheckOptions) => store.can(codes, options),\n [store],\n );\n\n return {\n permissions: state.permissions,\n roles: state.roles,\n isSuperAdmin: Boolean(state.isSuperAdmin),\n hasPermission,\n hasRole,\n can,\n setPermissions: store.setPermissions.bind(store),\n setRoles: store.setRoles.bind(store),\n setSuperAdmin: store.setSuperAdmin.bind(store),\n hydrate: store.hydrate.bind(store),\n clear: store.clear.bind(store),\n store,\n };\n}\n\n/** Returns whether the current user has the given permission(s). */\nexport function useHasPermission(\n codes: PermissionCode | PermissionCode[],\n options?: CheckOptions,\n): boolean {\n const { hasPermission, permissions, isSuperAdmin } = usePermission();\n // re-compute when permission list / super-admin changes\n void permissions;\n void isSuperAdmin;\n return hasPermission(codes, options);\n}\n\n/** Returns whether the current user has the given role(s). */\nexport function useHasRole(\n codes: RoleCode | RoleCode[],\n options?: CheckOptions,\n): boolean {\n const { hasRole, roles, isSuperAdmin } = usePermission();\n void roles;\n void isSuperAdmin;\n return hasRole(codes, options);\n}\n","import type {\n CheckOptions,\n MatchMode,\n PermissionChecker,\n PermissionCode,\n PermissionListener,\n PermissionState,\n RoleCode,\n} from './types';\n\nconst DEFAULT_STATE: PermissionState = {\n permissions: [],\n roles: [],\n isSuperAdmin: false,\n};\n\nfunction toArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction matchCodes(\n owned: Set<string>,\n required: string[],\n mode: MatchMode,\n isSuperAdmin: boolean,\n): boolean {\n if (isSuperAdmin) return true;\n if (required.length === 0) return true;\n\n if (mode === 'all') {\n return required.every((code) => owned.has(code));\n }\n\n return required.some((code) => owned.has(code));\n}\n\n/**\n * Mutable permission store shared by React / Vue adapters.\n * Framework-agnostic — safe to use in Node, browser, or any UI lib.\n */\nexport class PermissionStore implements PermissionChecker {\n private state: PermissionState;\n private permissionSet: Set<string>;\n private roleSet: Set<string>;\n private listeners = new Set<PermissionListener>();\n\n constructor(initial?: Partial<PermissionState>) {\n this.state = {\n ...DEFAULT_STATE,\n ...initial,\n permissions: initial?.permissions ?? [],\n roles: initial?.roles ?? [],\n };\n this.permissionSet = new Set(this.state.permissions);\n this.roleSet = new Set(this.state.roles);\n }\n\n getState(): PermissionState {\n return {\n permissions: [...this.state.permissions],\n roles: [...this.state.roles],\n isSuperAdmin: this.state.isSuperAdmin,\n };\n }\n\n setState(next: Partial<PermissionState>): void {\n this.state = {\n permissions: next.permissions ?? this.state.permissions,\n roles: next.roles ?? this.state.roles,\n isSuperAdmin: next.isSuperAdmin ?? this.state.isSuperAdmin,\n };\n this.permissionSet = new Set(this.state.permissions);\n this.roleSet = new Set(this.state.roles);\n this.emit();\n }\n\n setPermissions(permissions: PermissionCode[]): void {\n this.setState({ permissions });\n }\n\n setRoles(roles: RoleCode[]): void {\n this.setState({ roles });\n }\n\n setSuperAdmin(isSuperAdmin: boolean): void {\n this.setState({ isSuperAdmin });\n }\n\n /** Replace permissions, roles and super-admin flag in one shot (typical after login). */\n hydrate(payload: Partial<PermissionState>): void {\n this.setState({\n permissions: payload.permissions ?? [],\n roles: payload.roles ?? [],\n isSuperAdmin: payload.isSuperAdmin ?? false,\n });\n }\n\n /** Clear all authz data (typical after logout). */\n clear(): void {\n this.hydrate({});\n }\n\n hasPermission(\n codes: PermissionCode | PermissionCode[],\n options: CheckOptions = {},\n ): boolean {\n const mode = options.mode ?? 'any';\n return matchCodes(\n this.permissionSet,\n toArray(codes).filter(Boolean),\n mode,\n Boolean(this.state.isSuperAdmin),\n );\n }\n\n hasRole(codes: RoleCode | RoleCode[], options: CheckOptions = {}): boolean {\n const mode = options.mode ?? 'any';\n return matchCodes(\n this.roleSet,\n toArray(codes).filter(Boolean),\n mode,\n Boolean(this.state.isSuperAdmin),\n );\n }\n\n /** Alias of `hasPermission` for template-friendly APIs. */\n can(codes: PermissionCode | PermissionCode[], options?: CheckOptions): boolean {\n return this.hasPermission(codes, options);\n }\n\n subscribe(listener: PermissionListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emit(): void {\n const snapshot = this.getState();\n this.listeners.forEach((listener) => listener(snapshot));\n }\n}\n\nexport function createPermissionStore(\n initial?: Partial<PermissionState>,\n): PermissionStore {\n return new PermissionStore(initial);\n}\n","import type { ReactNode } from 'react';\nimport type { CheckOptions, PermissionCode, RoleCode } from '../core';\nimport { usePermission } from './context';\n\nexport interface CanProps {\n /** Permission codes to check. */\n permission?: PermissionCode | PermissionCode[];\n /** Role codes to check. */\n role?: RoleCode | RoleCode[];\n /**\n * `any` — pass when at least one code matches (default)\n * `all` — pass only when every code matches\n */\n mode?: CheckOptions['mode'];\n /**\n * How permission and role conditions combine when both are provided.\n * Default: `and` (must satisfy both).\n */\n combine?: 'and' | 'or';\n children: ReactNode;\n /** Fallback when access is denied. */\n fallback?: ReactNode;\n}\n\nfunction evaluateAccess(\n hasPermission: (c: PermissionCode | PermissionCode[], o?: CheckOptions) => boolean,\n hasRole: (c: RoleCode | RoleCode[], o?: CheckOptions) => boolean,\n props: Pick<CanProps, 'permission' | 'role' | 'mode' | 'combine'>,\n): boolean {\n const { permission, role, mode, combine = 'and' } = props;\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 ? hasPermission(permission!, options) : true;\n const roleOk = hasRoleCheck ? 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\n/**\n * Conditionally render children 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\" fallback={null}>\n * <AdminPanel />\n * </Can>\n */\nexport function Can({\n permission,\n role,\n mode,\n combine,\n children,\n fallback = null,\n}: CanProps) {\n const { hasPermission, hasRole } = usePermission();\n const allowed = evaluateAccess(hasPermission, hasRole, {\n permission,\n role,\n mode,\n combine,\n });\n\n return <>{allowed ? children : fallback}</>;\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type CSSProperties,\n type FormEvent,\n type ReactNode,\n} from 'react';\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\nconst emptyForm = (): AuthorizationResourceFormValues => ({\n name: '',\n identification: '',\n status: RESOURCE_STATUS_ENABLED,\n private: false,\n description: '',\n});\n\nexport type ResourceManagerProps = {\n api: AuthorizationResourceApi;\n title?: string;\n pageSize?: string;\n /** 自定义顶部右侧操作区 */\n toolbarExtra?: ReactNode;\n};\n\nexport function ResourceManager({\n api,\n title = '权限点管理',\n pageSize: initialPageSize = '20',\n toolbarExtra,\n}: ResourceManagerProps) {\n const [records, setRecords] = useState<AuthorizationResource[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [pageSize, setPageSize] = useState(initialPageSize);\n const [pageToken, setPageToken] = useState('');\n const [hasPreviousPage, setHasPreviousPage] = useState(false);\n const [hasNextPage, setHasNextPage] = useState(false);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [editing, setEditing] = useState<AuthorizationResource | null>(null);\n const [form, setForm] = useState<AuthorizationResourceFormValues>(emptyForm);\n const [saving, setSaving] = useState(false);\n\n const loadList = useCallback(\n async (direction: PageDirection = 'current', token = pageToken) => {\n setLoading(true);\n setError('');\n try {\n const result = await api.list({\n pagination: {\n pageToken: token,\n pageSize,\n pageDirection: direction,\n },\n });\n setRecords(result.records);\n setPageToken(result.pageToken);\n setHasPreviousPage(result.hasPreviousPage);\n setHasNextPage(result.hasNextPage);\n } catch (err) {\n setError(err instanceof Error ? err.message : '加载失败');\n } finally {\n setLoading(false);\n }\n },\n [api, pageSize, pageToken],\n );\n\n useEffect(() => {\n void loadList('current', '');\n // 仅 pageSize / api 变化时重置首页\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, pageSize]);\n\n const openCreate = () => {\n setEditing(null);\n setForm(emptyForm());\n setDialogOpen(true);\n };\n\n const openEdit = (row: AuthorizationResource) => {\n setEditing(row);\n setForm({\n name: row.name,\n identification: row.identification,\n status: row.status,\n private: row.private,\n description: row.description,\n });\n setDialogOpen(true);\n };\n\n const closeDialog = () => {\n if (saving) return;\n setDialogOpen(false);\n };\n\n const handleSubmit = async (event: FormEvent) => {\n event.preventDefault();\n if (!form.name.trim()) {\n setError('请填写权限名称');\n return;\n }\n if (!form.identification.trim()) {\n setError('请填写接口标识');\n return;\n }\n\n setSaving(true);\n setError('');\n try {\n if (editing) {\n await api.update(editing.resourceId, form);\n } else {\n await api.create(form);\n }\n setDialogOpen(false);\n await loadList('current', '');\n } catch (err) {\n setError(err instanceof Error ? err.message : '保存失败');\n } finally {\n setSaving(false);\n }\n };\n\n const handleDelete = async (row: AuthorizationResource) => {\n if (!window.confirm(`确认删除权限点「${row.name}」?`)) return;\n setError('');\n try {\n await api.remove(row.resourceId);\n await loadList('current', '');\n } catch (err) {\n setError(err instanceof Error ? err.message : '删除失败');\n }\n };\n\n const statusLabel = useMemo(\n () =>\n Object.fromEntries(RESOURCE_STATUS_OPTIONS.map((o) => [o.value, o.label])) as Record<\n number,\n string\n >,\n [],\n );\n\n return (\n <div style={styles.root}>\n <div style={styles.toolbar}>\n <h2 style={styles.title}>{title}</h2>\n <div style={styles.toolbarRight}>\n {toolbarExtra}\n <button type=\"button\" style={styles.primaryBtn} onClick={openCreate}>\n 新增\n </button>\n </div>\n </div>\n\n {error ? <div style={styles.error}>{error}</div> : null}\n\n <div style={styles.tableWrap}>\n <table style={styles.table}>\n <thead>\n <tr>\n <th style={styles.th}>权限名称</th>\n <th style={styles.th}>接口标识</th>\n <th style={styles.th}>描述</th>\n <th style={{ ...styles.th, width: 90 }}>状态</th>\n <th style={{ ...styles.th, width: 140 }}>操作</th>\n </tr>\n </thead>\n <tbody>\n {loading ? (\n <tr>\n <td colSpan={5} style={styles.empty}>\n 加载中…\n </td>\n </tr>\n ) : records.length === 0 ? (\n <tr>\n <td colSpan={5} style={styles.empty}>\n 暂无数据\n </td>\n </tr>\n ) : (\n records.map((row) => (\n <tr key={row.resourceId}>\n <td style={styles.td}>{row.name}</td>\n <td style={styles.td}>\n <code style={styles.code}>{row.identification}</code>\n </td>\n <td style={styles.td}>{row.description || '—'}</td>\n <td style={styles.td}>\n <span\n style={{\n ...styles.badge,\n background:\n row.status === RESOURCE_STATUS_ENABLED ? '#e8f7ef' : '#f4f4f5',\n color: row.status === RESOURCE_STATUS_ENABLED ? '#067647' : '#667085',\n }}\n >\n {statusLabel[row.status] ?? row.status}\n </span>\n </td>\n <td style={styles.td}>\n <button type=\"button\" style={styles.linkBtn} onClick={() => openEdit(row)}>\n 编辑\n </button>\n <button\n type=\"button\"\n style={{ ...styles.linkBtn, color: '#d92d20' }}\n onClick={() => void handleDelete(row)}\n >\n 删除\n </button>\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n <div style={styles.pagination}>\n <label style={styles.pageSize}>\n 每页\n <select\n value={pageSize}\n onChange={(e) => {\n setPageToken('');\n setPageSize(e.target.value);\n }}\n style={styles.select}\n >\n {PAGE_SIZE_OPTIONS.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </label>\n <div style={styles.pageBtns}>\n <button\n type=\"button\"\n style={styles.secondaryBtn}\n disabled={!hasPreviousPage || loading}\n onClick={() => void loadList('previous')}\n >\n 上一页\n </button>\n <button\n type=\"button\"\n style={styles.secondaryBtn}\n disabled={!hasNextPage || loading}\n onClick={() => void loadList('next')}\n >\n 下一页\n </button>\n </div>\n </div>\n\n {dialogOpen ? (\n <div style={styles.mask} onClick={closeDialog}>\n <div\n style={styles.dialog}\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div style={styles.dialogHeader}>\n <h3 style={styles.dialogTitle}>{editing ? '编辑权限点' : '新增权限点'}</h3>\n <button type=\"button\" style={styles.iconBtn} onClick={closeDialog} aria-label=\"关闭\">\n ×\n </button>\n </div>\n <form style={styles.form} onSubmit={(e) => void handleSubmit(e)}>\n <label style={styles.field}>\n <span style={styles.label}>权限名称</span>\n <input\n style={styles.input}\n value={form.name}\n onChange={(e) => setForm((prev) => ({ ...prev, name: e.target.value }))}\n placeholder=\"请输入权限名称\"\n required\n />\n </label>\n <label style={styles.field}>\n <span style={styles.label}>接口标识</span>\n <input\n style={styles.input}\n value={form.identification}\n onChange={(e) =>\n setForm((prev) => ({ ...prev, identification: e.target.value }))\n }\n placeholder=\"如 user:list\"\n required\n />\n </label>\n <label style={styles.field}>\n <span style={styles.label}>状态</span>\n <select\n style={styles.input}\n value={form.status}\n onChange={(e) =>\n setForm((prev) => ({\n ...prev,\n status: Number(e.target.value) as 0 | 1,\n }))\n }\n >\n {RESOURCE_STATUS_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n <label style={styles.field}>\n <span style={styles.label}>私有资源</span>\n <select\n style={styles.input}\n value={form.private ? '1' : '0'}\n onChange={(e) =>\n setForm((prev) => ({ ...prev, private: e.target.value === '1' }))\n }\n >\n {RESOURCE_PRIVATE_OPTIONS.map((opt) => (\n <option key={String(opt.value)} value={opt.value ? '1' : '0'}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n <label style={styles.field}>\n <span style={styles.label}>描述</span>\n <textarea\n style={{ ...styles.input, minHeight: 88, resize: 'vertical' }}\n value={form.description}\n onChange={(e) =>\n setForm((prev) => ({ ...prev, description: e.target.value }))\n }\n placeholder=\"请输入描述\"\n />\n </label>\n <div style={styles.dialogFooter}>\n <button type=\"button\" style={styles.secondaryBtn} onClick={closeDialog}>\n 取消\n </button>\n <button type=\"submit\" style={styles.primaryBtn} disabled={saving}>\n {saving ? '保存中…' : '保存'}\n </button>\n </div>\n </form>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nconst styles: Record<string, CSSProperties> = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n padding: 16,\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: 12,\n },\n title: { margin: 0, fontSize: 18, fontWeight: 600 },\n toolbarRight: { display: 'flex', alignItems: 'center', gap: 8 },\n error: {\n padding: '10px 12px',\n borderRadius: 8,\n background: '#fef3f2',\n color: '#b42318',\n fontSize: 13,\n },\n tableWrap: {\n overflow: 'auto',\n border: '1px solid #eaecf0',\n borderRadius: 10,\n background: '#fff',\n },\n table: { width: '100%', borderCollapse: 'collapse', minWidth: 720 },\n th: {\n textAlign: 'left',\n padding: '12px 14px',\n fontSize: 13,\n fontWeight: 600,\n color: '#475467',\n background: '#f9fafb',\n borderBottom: '1px solid #eaecf0',\n },\n td: {\n padding: '12px 14px',\n fontSize: 14,\n borderBottom: '1px solid #f2f4f7',\n verticalAlign: 'middle',\n },\n empty: {\n padding: 28,\n textAlign: 'center',\n color: '#98a2b3',\n fontSize: 14,\n },\n code: {\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n fontSize: 13,\n background: '#f2f4f7',\n padding: '2px 6px',\n borderRadius: 4,\n },\n badge: {\n display: 'inline-block',\n padding: '2px 8px',\n borderRadius: 999,\n fontSize: 12,\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: 13,\n },\n pagination: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n },\n pageSize: { display: 'flex', alignItems: 'center', gap: 8, fontSize: 13, color: '#475467' },\n pageBtns: { display: 'flex', gap: 8 },\n primaryBtn: {\n border: 'none',\n background: '#049BAD',\n color: '#fff',\n borderRadius: 8,\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: 14,\n },\n secondaryBtn: {\n border: '1px solid #d0d5dd',\n background: '#fff',\n color: '#344054',\n borderRadius: 8,\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: 14,\n },\n select: {\n border: '1px solid #d0d5dd',\n borderRadius: 6,\n padding: '4px 8px',\n fontSize: 13,\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: 16,\n },\n dialog: {\n width: '100%',\n maxWidth: 480,\n background: '#fff',\n borderRadius: 12,\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: 16, fontWeight: 600 },\n iconBtn: {\n border: 'none',\n background: 'transparent',\n fontSize: 22,\n lineHeight: 1,\n cursor: 'pointer',\n color: '#667085',\n },\n form: { display: 'flex', flexDirection: 'column', gap: 12, padding: 16 },\n field: { display: 'flex', flexDirection: 'column', gap: 6 },\n label: { fontSize: 13, color: '#344054', fontWeight: 500 },\n input: {\n border: '1px solid #d0d5dd',\n borderRadius: 8,\n padding: '8px 10px',\n fontSize: 14,\n outline: 'none',\n },\n dialogFooter: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 8,\n paddingTop: 4,\n },\n};\n","export type PageDirection = 'previous' | 'current' | 'next';\n\nexport type ListPaginationParams = {\n pageToken?: string;\n pageSize?: string;\n pageDirection?: PageDirection;\n};\n\nexport type ListPaginationResult = {\n pageToken: string;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n};\n\n/** 权限点状态:1 启用,0 禁用 */\nexport type ResourceStatus = 0 | 1;\n\nexport type AuthorizationResource = {\n resourceId: string;\n type: 'api';\n name: string;\n identification: string;\n status: ResourceStatus;\n private: boolean;\n description: string;\n};\n\nexport type AuthorizationResourceFormValues = {\n name: string;\n identification: string;\n status: ResourceStatus;\n private: boolean;\n description: string;\n};\n\nexport type CreateAuthorizationResourceBody = AuthorizationResourceFormValues & {\n resourceId: string;\n type: 'api';\n};\n\nexport type UpdateAuthorizationResourceBody = Partial<AuthorizationResourceFormValues> & {\n type?: 'api';\n};\n\nexport type FetchAuthorizationResourcesParams = {\n pagination?: ListPaginationParams;\n};\n\nexport type AuthorizationResourceListResult = {\n records: AuthorizationResource[];\n pageToken: string;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n};\n\nexport const RESOURCE_TYPE_API = 'api' as const;\n\nexport const RESOURCE_STATUS_ENABLED: ResourceStatus = 1;\nexport const RESOURCE_STATUS_DISABLED: ResourceStatus = 0;\n\nexport const RESOURCE_STATUS_OPTIONS: { label: string; value: ResourceStatus }[] = [\n { label: '启用', value: RESOURCE_STATUS_ENABLED },\n { label: '禁用', value: RESOURCE_STATUS_DISABLED },\n];\n\nexport const RESOURCE_PRIVATE_OPTIONS: { label: string; value: boolean }[] = [\n { label: '是', value: true },\n { label: '否', value: false },\n];\n","const DEVICE_WORKER_ID_KEY = 'hgams_device_worker_id';\n\nfunction generateDeviceWorkerId(): bigint {\n const cached = localStorage.getItem(DEVICE_WORKER_ID_KEY);\n if (cached !== null && cached !== '') {\n return BigInt(cached);\n }\n\n const components = [\n navigator.userAgent,\n screen.width + 'x' + screen.height,\n screen.colorDepth,\n navigator.language,\n new Date().getTimezoneOffset(),\n navigator.hardwareConcurrency,\n (navigator as Navigator & { deviceMemory?: number }).deviceMemory,\n ];\n\n const fingerprint = components.join('|');\n\n let hash = 0;\n for (let i = 0; i < fingerprint.length; i++) {\n hash = (hash << 5) - hash + fingerprint.charCodeAt(i);\n hash |= 0;\n }\n\n const maxWorkerId = Math.pow(2, 14) - 1;\n const workerId = Math.abs(hash % maxWorkerId);\n const workerIdBigInt = BigInt(workerId);\n localStorage.setItem(DEVICE_WORKER_ID_KEY, workerIdBigInt.toString());\n return workerIdBigInt;\n}\n\ninterface SnowyflakeOptions {\n epoch?: bigint;\n workerId?: bigint;\n processId?: bigint;\n workerIdBits?: number;\n processIdBits?: number;\n sequenceBits?: number;\n}\n\n/**\n * snowyflake 2.0.1 仅支持固定 5+5+12 位布局,此处按相同 nextId 算法实现可配置位数版本。\n */\nclass ConfigurableSnowflake {\n readonly epoch: bigint;\n readonly workerId: bigint;\n readonly processId: bigint;\n\n private readonly sequenceMask: bigint;\n private readonly timestampLeftShift: bigint;\n private readonly workerIdShift: bigint;\n private readonly processIdShift: bigint;\n private sequence = 0n;\n private latestTimestamp = BigInt(Date.now());\n\n constructor({\n epoch = 0n,\n workerId = 0n,\n processId = 0n,\n workerIdBits = 5,\n processIdBits = 5,\n sequenceBits = 12,\n }: SnowyflakeOptions = {}) {\n this.epoch = epoch;\n\n const workerIdBitsBig = BigInt(workerIdBits);\n const processIdBitsBig = BigInt(processIdBits);\n const sequenceBitsBig = BigInt(sequenceBits);\n const workerIdMask = -1n ^ (-1n << workerIdBitsBig);\n const processIdMask = -1n ^ (-1n << processIdBitsBig);\n\n this.sequenceMask = -1n ^ (-1n << sequenceBitsBig);\n this.timestampLeftShift =\n sequenceBitsBig + workerIdBitsBig + processIdBitsBig;\n this.workerIdShift = sequenceBitsBig + processIdBitsBig;\n this.processIdShift = sequenceBitsBig;\n\n this.workerId = workerId & workerIdMask;\n this.processId = processId & processIdMask;\n }\n\n nextId(): bigint {\n const timestamp = BigInt(Date.now());\n\n if (this.latestTimestamp === timestamp) {\n this.sequence = (this.sequence + 1n) & this.sequenceMask;\n } else {\n this.sequence = 0n;\n this.latestTimestamp = timestamp;\n }\n\n return (\n ((timestamp - this.epoch) << this.timestampLeftShift) |\n (this.workerId << this.workerIdShift) |\n (this.processId << this.processIdShift) |\n this.sequence\n );\n }\n}\n\n/** 应用级单例,模块加载时只初始化一次(不受 React StrictMode 重复 mount 影响) */\nexport const snowyflake = new ConfigurableSnowflake({\n workerId: generateDeviceWorkerId(),\n workerIdBits: 14,\n processIdBits: 0,\n sequenceBits: 8,\n epoch: BigInt(new Date('2026-06-08').getTime()),\n});\n\n/** 生成雪花 ID 字符串(reportId、detailId、resourceId 等) */\nexport function getAppClientId(): string {\n return snowyflake.nextId().toString();\n}\n\nexport function getDeviceWorkerId(): string {\n return snowyflake.workerId.toString();\n}\n","import type { ListPaginationResult } from './types';\n\nexport function appendQueryParam(parts: string[], key: string, value: string): void {\n if (value !== undefined && value !== null && String(value) !== '') {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\n }\n}\n\nexport function extractPagination(payload: unknown): ListPaginationResult {\n if (!payload || typeof payload !== 'object') {\n return {\n pageToken: '',\n hasPreviousPage: false,\n hasNextPage: false,\n };\n }\n\n const envelope = payload as Record<string, unknown>;\n const pagination = (\n envelope.pagination && typeof envelope.pagination === 'object'\n ? envelope.pagination\n : envelope.page && typeof envelope.page === 'object'\n ? envelope.page\n : null\n ) as Record<string, unknown> | null;\n\n const rawPageToken =\n pagination?.['page-token'] ??\n pagination?.pageToken ??\n pagination?.nextPageToken ??\n envelope['page-token'] ??\n envelope.pageToken ??\n '';\n const pageToken =\n rawPageToken === undefined || rawPageToken === null ? '' : String(rawPageToken);\n\n const hasPreviousPage = Boolean(\n pagination?.hasPreviousPage ??\n pagination?.hasPrevious ??\n pagination?.hasPre ??\n pagination?.previous ??\n envelope.hasPreviousPage ??\n envelope.hasPrevious,\n );\n const hasNextPage = Boolean(\n pagination?.hasNextPage ??\n pagination?.hasNext ??\n pagination?.next ??\n envelope.hasNextPage ??\n envelope.hasNext,\n );\n\n return {\n pageToken,\n hasPreviousPage,\n hasNextPage,\n };\n}\n\nexport function extractRecords(payload: unknown): unknown[] {\n if (!payload) return [];\n if (Array.isArray(payload)) return payload;\n\n if (typeof payload === 'object') {\n const envelope = payload as Record<string, unknown>;\n const data = envelope.data;\n\n if (Array.isArray(data)) return data;\n\n if (data && typeof data === 'object') {\n const nested = data as Record<string, unknown>;\n if (Array.isArray(nested.records)) return nested.records;\n if (Array.isArray(nested.items)) return nested.items;\n if (Array.isArray(nested.list)) return nested.list;\n if (Array.isArray(nested.content)) return nested.content;\n }\n\n if (Array.isArray(envelope.records)) return envelope.records;\n if (Array.isArray(envelope.items)) return envelope.items;\n if (Array.isArray(envelope.list)) return envelope.list;\n if (Array.isArray(envelope.content)) return envelope.content;\n }\n\n return [];\n}\n","import { getAppClientId } from '../utils/snowflake';\nimport { appendQueryParam, extractPagination, extractRecords } from './pagination';\nimport {\n RESOURCE_STATUS_DISABLED,\n RESOURCE_STATUS_ENABLED,\n RESOURCE_TYPE_API,\n type AuthorizationResource,\n type AuthorizationResourceFormValues,\n type AuthorizationResourceListResult,\n type CreateAuthorizationResourceBody,\n type FetchAuthorizationResourcesParams,\n type ResourceStatus,\n type UpdateAuthorizationResourceBody,\n} from './types';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport type ResourceRequestOptions = {\n method: HttpMethod;\n url: string;\n body?: unknown;\n signal?: AbortSignal;\n};\n\n/**\n * 由宿主应用注入的请求函数(可对接 Angel_HGAMS 的 apiGetJson / apiPostJson 等)。\n */\nexport type ResourceHttpRequest = <T = unknown>(\n options: ResourceRequestOptions,\n) => Promise<T>;\n\nexport type AuthorizationResourceApi = {\n list: (\n params?: FetchAuthorizationResourcesParams,\n signal?: AbortSignal,\n ) => Promise<AuthorizationResourceListResult>;\n create: (\n values: AuthorizationResourceFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n update: (\n resourceId: string,\n values: AuthorizationResourceFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n remove: (resourceId: string, signal?: AbortSignal) => Promise<unknown>;\n};\n\nfunction toResourceStatus(value: unknown): ResourceStatus {\n const n = Number(value);\n return n === RESOURCE_STATUS_ENABLED ? RESOURCE_STATUS_ENABLED : RESOURCE_STATUS_DISABLED;\n}\n\nfunction toBoolean(value: unknown): boolean {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return value !== 0;\n if (typeof value === 'string') {\n const v = value.trim().toLowerCase();\n return v === 'true' || v === '1' || v === 'yes' || v === '是';\n }\n return false;\n}\n\nexport function mapAuthorizationResource(item: unknown): AuthorizationResource | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const resourceId = row.resourceId ?? row.resource_id ?? row.id;\n if (resourceId === undefined || resourceId === null || resourceId === '') return null;\n\n return {\n resourceId: String(resourceId),\n type: RESOURCE_TYPE_API,\n name: String(row.name ?? ''),\n identification: String(row.identification ?? row.identity ?? ''),\n status: toResourceStatus(row.status),\n private: toBoolean(row.private ?? row.isPrivate ?? row.is_private),\n description: String(row.description ?? row.desc ?? ''),\n };\n}\n\nfunction buildListUrl(params?: FetchAuthorizationResourcesParams): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'type', RESOURCE_TYPE_API);\n appendQueryParam(parts, 'page-token', params?.pagination?.pageToken ?? '');\n appendQueryParam(parts, 'page-size', params?.pagination?.pageSize ?? '20');\n appendQueryParam(parts, 'page-direction', params?.pagination?.pageDirection ?? 'current');\n return `/authorization-resources?${parts.join('&')}`;\n}\n\nexport function buildCreateBody(\n values: AuthorizationResourceFormValues,\n resourceId = getAppClientId(),\n): CreateAuthorizationResourceBody {\n return {\n resourceId,\n type: RESOURCE_TYPE_API,\n name: values.name.trim(),\n identification: values.identification.trim(),\n status: values.status,\n private: values.private,\n description: values.description.trim(),\n };\n}\n\nexport function buildUpdateBody(\n values: AuthorizationResourceFormValues,\n): UpdateAuthorizationResourceBody {\n return {\n type: RESOURCE_TYPE_API,\n name: values.name.trim(),\n identification: values.identification.trim(),\n status: values.status,\n private: values.private,\n description: values.description.trim(),\n };\n}\n\nexport function createAuthorizationResourceApi(\n request: ResourceHttpRequest,\n): AuthorizationResourceApi {\n return {\n async list(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildListUrl(params),\n signal,\n });\n const records = extractRecords(json)\n .map(mapAuthorizationResource)\n .filter((item): item is AuthorizationResource => item !== null);\n const pagination = extractPagination(json);\n return {\n records,\n ...pagination,\n };\n },\n\n async create(values, signal) {\n return request({\n method: 'POST',\n url: '/authorization-resources',\n body: buildCreateBody(values),\n signal,\n });\n },\n\n async update(resourceId, values, signal) {\n return request({\n method: 'PATCH',\n url: `/authorization-resources/${encodeURIComponent(resourceId)}`,\n body: buildUpdateBody(values),\n signal,\n });\n },\n\n async remove(resourceId, signal) {\n return request({\n method: 'DELETE',\n url: `/authorization-resources/${encodeURIComponent(resourceId)}`,\n signal,\n });\n },\n };\n}\n\nexport type CreateDefaultResourceRequestOptions = {\n /** API 前缀,如 `/api` 或完整域名 */\n baseUrl?: string;\n /** 追加请求头(如 Authorization) */\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n credentials?: RequestCredentials;\n};\n\n/**\n * 基于 fetch 的默认请求实现,便于快速接入。\n * 生产环境建议注入宿主应用已有的 request 封装。\n */\nexport function createDefaultResourceRequest(\n options: CreateDefaultResourceRequestOptions = {},\n): ResourceHttpRequest {\n const baseUrl = (options.baseUrl ?? '').replace(/\\/+$/, '');\n const credentials = options.credentials ?? 'include';\n\n return async function request<T = unknown>({\n method,\n url,\n body,\n signal,\n }: ResourceRequestOptions): Promise<T> {\n const path = url.startsWith('http') ? url : `${baseUrl}${url.startsWith('/') ? url : `/${url}`}`;\n const headers: Record<string, string> = {\n Accept: 'application/json',\n ...(await options.getHeaders?.()),\n };\n\n let payload: BodyInit | undefined;\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n payload = JSON.stringify(body);\n }\n\n const response = await fetch(path, {\n method,\n headers,\n body: payload,\n credentials,\n signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(text || `HTTP ${response.status}`);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const text = await response.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n };\n}\n"],"mappings":"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","names":["import_react","text","import_jsx_runtime"]}