com-angel-authorization 1.0.31 → 1.0.33

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.
package/README.md CHANGED
@@ -345,7 +345,7 @@ createApp(ResourceManager, { api }).mount('#app');
345
345
  | 新增 | POST | `/authorization-resources` |
346
346
  | 修改 | PATCH | `/authorization-resources/{resource-id}` |
347
347
  | 删除 | DELETE | `/authorization-resources/{resource-id}` |
348
- | 权限点下拉 | GET | `/authorization-resources?type=api` |
348
+ | 权限点下拉 | GET | `/authorization-resources?type=api&keyword=`(输入关键字后带 `keyword` 搜索) |
349
349
 
350
350
  新增时 `resourceId` 由 `getAppClientId()` 生成;上级选择「无」时 `parentId` 传 `null`。
351
351
 
@@ -472,7 +472,7 @@ export function Page() {
472
472
  |------|------|
473
473
  | username | 账号:需包含英文字母,可搭配数字,不支持中文或特殊符号;长度大于 1 |
474
474
  | name | 用户名 |
475
- | password | 初始密码(编辑时可留空表示不修改) |
475
+ | password | 初始密码(仅新增时填写;编辑请用「重置密码」) |
476
476
  | groupIds | 归属部门,必填;点击后才请求 `/system/groups` 展开多选 |
477
477
  | roleIds | 用户角色,多选(`/system/roles`) |
478
478
  | enabled | 是否启用(boolean,Switch,靠左) |
package/dist/index.cjs CHANGED
@@ -403,6 +403,7 @@ function buildListUrl(type, params) {
403
403
  if (params?.depth !== void 0 && params?.depth !== null && String(params.depth) !== "") {
404
404
  appendQueryParam(parts, "depth", String(params.depth));
405
405
  }
406
+ appendQueryParam(parts, "keyword", params?.keyword ?? "");
406
407
  appendQueryParam(parts, "page-token", params?.pagination?.pageToken ?? "");
407
408
  appendQueryParam(parts, "page-size", params?.pagination?.pageSize ?? "20");
408
409
  appendQueryParam(parts, "page-direction", params?.pagination?.pageDirection ?? "current");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/store.ts","../src/utils/snowflake.ts","../src/admin/menu.ts","../src/resources/types.ts","../src/resources/pagination.ts","../src/resources/api.ts","../src/roles/index.ts","../src/users/index.ts"],"names":["text","buildListUrl"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n CheckOptions,\n MatchMode,\n PermissionCode,\n PermissionListener,\n PermissionState,\n PermissionStoreAPI,\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 PermissionStoreAPI {\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): PermissionStoreAPI {\n return new PermissionStore(initial);\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","export type SystemAdminMenuKey = 'menu' | 'resource' | 'role' | 'user';\n\nexport type SystemAdminSubMenu = {\n key: SystemAdminMenuKey;\n label: string;\n};\n\nexport type SystemAdminMenuGroup = {\n key: 'system';\n label: string;\n children: SystemAdminSubMenu[];\n};\n\n/** 系统管理菜单结构 */\nexport const SYSTEM_ADMIN_MENU: SystemAdminMenuGroup = {\n key: 'system',\n label: '系统管理',\n children: [\n { key: 'user', label: '用户管理' },\n { key: 'role', label: '角色管理' },\n { key: 'menu', label: '菜单管理' },\n { key: 'resource', label: '权限点管理' },\n ],\n};\n\nexport const SYSTEM_ADMIN_DEFAULT_KEY: SystemAdminMenuKey = 'menu';\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 禁用;菜单 1 显示 / 0 隐藏 */\nexport type ResourceStatus = 0 | 1;\n\n/** 权限点类型 */\nexport type ApiResourceType = 'api';\n\n/** 菜单资源类型 */\nexport type MenuResourceType = 'page' | 'menu' | 'button';\n\nexport type ResourceType = ApiResourceType | MenuResourceType;\n\nexport type AuthorizationResource = {\n resourceId: string;\n type: ApiResourceType;\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: ApiResourceType;\n};\n\nexport type UpdateAuthorizationResourceBody = Partial<AuthorizationResourceFormValues> & {\n type?: ApiResourceType;\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 type MenuPermissionPoint = {\n resourceId?: string;\n name: string;\n identification?: string;\n};\n\nexport type MenuResource = {\n resourceId: string;\n /** 上级菜单 ID;无上级时为 null */\n parentId: string | null;\n /**\n * 菜单层级:无上级(根)为 1,其余为上级 depth + 1\n */\n depth: number;\n /**\n * 是否叶子节点:`1` 表示无下级菜单,不可再展开\n */\n leaf: number;\n type: MenuResourceType;\n name: string;\n identification: string;\n permissionPointIds: string[];\n /** 关联权限点对象(列表展示优先取其中 name) */\n permissionPoints?: MenuPermissionPoint[];\n /** 关联权限点名称(列表展示用,后端可能返回) */\n permissionPointNames?: string[];\n status: ResourceStatus;\n /** 显示排序,数值越小越靠前 */\n sort: number;\n};\n\nexport type MenuResourceFormValues = {\n /** 上级菜单 ID;选择「无」时为 null */\n parentId: string | null;\n /** 由 parentId 自动计算:无为 1,否则上级 depth + 1 */\n depth: number;\n type: MenuResourceType;\n name: string;\n identification: string;\n permissionPointIds: string[];\n status: ResourceStatus;\n /** 显示排序 */\n sort: number;\n};\n\nexport type CreateMenuResourceBody = MenuResourceFormValues & {\n resourceId: string;\n};\n\nexport type UpdateMenuResourceBody = Partial<MenuResourceFormValues>;\n\nexport type FetchMenuResourcesParams = {\n /** 列表默认传 1,只拉根层 */\n depth?: number;\n pagination?: ListPaginationParams;\n};\n\nexport type MenuResourceListResult = {\n records: MenuResource[];\n pageToken: string;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n};\n\n/** leaf === 1 表示无下级 */\nexport const MENU_LEAF_YES = 1;\nexport const MENU_LEAF_NO = 0;\n\nexport const RESOURCE_TYPE_API: ApiResourceType = 'api';\nexport const MENU_TYPE_PAGE: MenuResourceType = 'page';\nexport const MENU_TYPE_MENU: MenuResourceType = 'menu';\nexport const MENU_TYPE_BUTTON: MenuResourceType = 'button';\n\n/** 菜单列表查询 type 参数 */\nexport const MENU_LIST_TYPE_PARAM = 'page,menu,button';\n\n/**\n * 上级菜单选择「无」时,表单 select 使用的空值。\n * 提交接口时会转换为 parentId: null。\n */\nexport const ROOT_PARENT_ID = '';\n\n/** 无上级时的菜单层级 */\nexport const ROOT_MENU_DEPTH = 1;\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\n/** 菜单可见性 */\nexport const MENU_VISIBILITY_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\nexport const MENU_TYPE_OPTIONS: { label: string; value: MenuResourceType }[] = [\n { label: '目录', value: MENU_TYPE_PAGE },\n { label: '菜单', value: MENU_TYPE_MENU },\n { label: '按钮', value: MENU_TYPE_BUTTON },\n];\n\nexport const MENU_TYPE_LABEL: Record<MenuResourceType, string> = {\n page: '目录',\n menu: '菜单',\n button: '按钮',\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 MENU_LIST_TYPE_PARAM,\n MENU_LEAF_YES,\n MENU_TYPE_BUTTON,\n MENU_TYPE_MENU,\n MENU_TYPE_PAGE,\n RESOURCE_STATUS_DISABLED,\n RESOURCE_STATUS_ENABLED,\n RESOURCE_TYPE_API,\n ROOT_MENU_DEPTH,\n type AuthorizationResource,\n type AuthorizationResourceFormValues,\n type AuthorizationResourceListResult,\n type CreateAuthorizationResourceBody,\n type CreateMenuResourceBody,\n type FetchAuthorizationResourcesParams,\n type FetchMenuResourcesParams,\n type MenuPermissionPoint,\n type MenuResource,\n type MenuResourceFormValues,\n type MenuResourceListResult,\n type MenuResourceType,\n type ResourceStatus,\n type UpdateAuthorizationResourceBody,\n type UpdateMenuResourceBody,\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\nexport type MenuResourceApi = {\n list: (\n params?: FetchMenuResourcesParams,\n signal?: AbortSignal,\n ) => Promise<MenuResourceListResult>;\n /** 展开下级:GET /authorization-resources/{resource-id}/sub-resources */\n listSubResources: (\n resourceId: string,\n signal?: AbortSignal,\n ) => Promise<MenuResource[]>;\n /** 拉取权限点(type=api),供菜单表单多选 */\n listPermissionPoints: (\n params?: FetchAuthorizationResourcesParams,\n signal?: AbortSignal,\n ) => Promise<AuthorizationResourceListResult>;\n create: (values: MenuResourceFormValues, signal?: AbortSignal) => Promise<unknown>;\n update: (\n resourceId: string,\n values: MenuResourceFormValues,\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\nfunction toStringArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (item && typeof item === 'object') {\n const row = item as Record<string, unknown>;\n const id = row.resourceId ?? row.resource_id ?? row.id;\n return id === undefined || id === null ? '' : String(id);\n }\n return String(item ?? '');\n })\n .filter(Boolean);\n }\n if (typeof value === 'string' && value.trim()) {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n }\n return [];\n}\n\nfunction mapMenuPermissionPoints(value: unknown): MenuPermissionPoint[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const points = value\n .map((item) => {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const name = String(row.name ?? '').trim();\n if (!name) return null;\n const resourceId = row.resourceId ?? row.resource_id ?? row.id;\n const identification = row.identification ?? row.identity;\n return {\n ...(resourceId !== undefined && resourceId !== null && resourceId !== ''\n ? { resourceId: String(resourceId) }\n : {}),\n name,\n ...(identification !== undefined && identification !== null && identification !== ''\n ? { identification: String(identification) }\n : {}),\n } satisfies MenuPermissionPoint;\n })\n .filter((item): item is MenuPermissionPoint => item !== null);\n return points.length ? points : undefined;\n}\n\nfunction toMenuType(value: unknown): MenuResourceType {\n const v = String(value ?? '').toLowerCase();\n if (v === MENU_TYPE_PAGE || v === MENU_TYPE_MENU || v === MENU_TYPE_BUTTON) {\n return v;\n }\n return MENU_TYPE_MENU;\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\nexport function mapMenuResource(item: unknown): MenuResource | 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 const permissionPoints = mapMenuPermissionPoints(\n row.permissionPoints ?? row.permission_points,\n );\n\n const permissionPointIds = toStringArray(\n row.permissionPointIds ??\n row.permission_point_ids ??\n (permissionPoints?.length\n ? permissionPoints.map((p) => p.resourceId).filter(Boolean)\n : undefined) ??\n row.permissions,\n );\n\n const permissionNamesRaw =\n row.permissionPointNames ?? row.permission_point_names ?? row.permissionNames;\n const permissionPointNames = Array.isArray(permissionNamesRaw)\n ? permissionNamesRaw.map((n) => String(n ?? '')).filter(Boolean)\n : permissionPoints?.map((p) => p.name).filter(Boolean);\n\n const rawParentId =\n row.parentId ??\n row.parent_id ??\n (row.parent && typeof row.parent === 'object'\n ? ((row.parent as Record<string, unknown>).resourceId ??\n (row.parent as Record<string, unknown>).resource_id ??\n (row.parent as Record<string, unknown>).id)\n : undefined);\n const parentId =\n rawParentId === undefined ||\n rawParentId === null ||\n rawParentId === '' ||\n String(rawParentId) === '0'\n ? null\n : String(rawParentId);\n\n const rawDepth = row.depth;\n const parsedDepth = Number(rawDepth);\n const depth =\n Number.isFinite(parsedDepth) && parsedDepth > 0\n ? Math.floor(parsedDepth)\n : parentId\n ? ROOT_MENU_DEPTH + 1\n : ROOT_MENU_DEPTH;\n\n const rawLeaf = row.leaf;\n const leaf =\n rawLeaf === true ||\n rawLeaf === 1 ||\n rawLeaf === '1' ||\n String(rawLeaf).toLowerCase() === 'true'\n ? MENU_LEAF_YES\n : Number(rawLeaf) === MENU_LEAF_YES\n ? MENU_LEAF_YES\n : 0;\n\n const rawSort = row.sort ?? row.order ?? row.sortOrder ?? row.sort_order;\n const parsedSort = Number(rawSort);\n const sort = Number.isFinite(parsedSort) ? Math.floor(parsedSort) : 0;\n\n return {\n resourceId: String(resourceId),\n parentId,\n depth,\n leaf,\n type: toMenuType(row.type),\n name: String(row.name ?? ''),\n identification: String(row.identification ?? row.identity ?? row.path ?? ''),\n permissionPointIds,\n permissionPoints,\n permissionPointNames:\n permissionPointNames && permissionPointNames.length\n ? permissionPointNames\n : undefined,\n status: toResourceStatus(row.status),\n sort,\n };\n}\n\n/**\n * leaf === 1 表示无下级菜单。\n */\nexport function isMenuLeaf(row: Pick<MenuResource, 'leaf'>): boolean {\n return Number(row.leaf) === MENU_LEAF_YES;\n}\n\n/**\n * 根据上级菜单计算 depth:无上级为 1,否则为上级 depth + 1。\n */\nexport function resolveMenuDepth(\n parentId: string | null | undefined,\n menus: Array<Pick<MenuResource, 'resourceId' | 'depth'>>,\n): number {\n if (!parentId) return ROOT_MENU_DEPTH;\n const parent = menus.find((item) => item.resourceId === parentId);\n const parentDepth =\n parent && Number.isFinite(parent.depth) && parent.depth > 0\n ? Math.floor(parent.depth)\n : ROOT_MENU_DEPTH;\n return parentDepth + 1;\n}\n\nfunction buildListUrl(\n type: string,\n params?: {\n pagination?: FetchAuthorizationResourcesParams['pagination'];\n depth?: number | string;\n },\n): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'type', type);\n if (params?.depth !== undefined && params?.depth !== null && String(params.depth) !== '') {\n appendQueryParam(parts, 'depth', String(params.depth));\n }\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 buildCreateMenuBody(\n values: MenuResourceFormValues,\n resourceId = getAppClientId(),\n): CreateMenuResourceBody {\n const parentId = values.parentId ? values.parentId : null;\n return {\n resourceId,\n parentId,\n depth: values.depth > 0 ? Math.floor(values.depth) : parentId ? ROOT_MENU_DEPTH + 1 : ROOT_MENU_DEPTH,\n type: values.type,\n name: values.name.trim(),\n identification: values.identification.trim(),\n permissionPointIds: [...values.permissionPointIds],\n status: values.status,\n sort: Number.isFinite(Number(values.sort)) ? Math.floor(Number(values.sort)) : 0,\n };\n}\n\nexport function buildUpdateMenuBody(values: MenuResourceFormValues): UpdateMenuResourceBody {\n const parentId = values.parentId ? values.parentId : null;\n return {\n parentId,\n depth: values.depth > 0 ? Math.floor(values.depth) : parentId ? ROOT_MENU_DEPTH + 1 : ROOT_MENU_DEPTH,\n type: values.type,\n name: values.name.trim(),\n identification: values.identification.trim(),\n permissionPointIds: [...values.permissionPointIds],\n status: values.status,\n sort: Number.isFinite(Number(values.sort)) ? Math.floor(Number(values.sort)) : 0,\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(RESOURCE_TYPE_API, 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 function createMenuResourceApi(request: ResourceHttpRequest): MenuResourceApi {\n const permissionApi = createAuthorizationResourceApi(request);\n\n return {\n async list(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildListUrl(MENU_LIST_TYPE_PARAM, {\n pagination: params?.pagination,\n depth: params?.depth ?? ROOT_MENU_DEPTH,\n }),\n signal,\n });\n const records = extractRecords(json)\n .map(mapMenuResource)\n .filter((item): item is MenuResource => item !== null);\n const pagination = extractPagination(json);\n return {\n records,\n ...pagination,\n };\n },\n\n async listSubResources(resourceId, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: `/authorization-resources/${encodeURIComponent(resourceId)}/sub-resources`,\n signal,\n });\n return extractRecords(json)\n .map(mapMenuResource)\n .filter((item): item is MenuResource => item !== null)\n .map((item) => ({\n ...item,\n // 子资源接口常不回 parentId,用请求路径上的父级补齐\n parentId: item.parentId ?? resourceId,\n }));\n },\n\n listPermissionPoints(params, signal) {\n return permissionApi.list(params, signal);\n },\n\n async create(values, signal) {\n return request({\n method: 'POST',\n url: '/authorization-resources',\n body: buildCreateMenuBody(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: buildUpdateMenuBody(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","import { appendQueryParam, extractPagination, extractRecords } from '../resources/pagination';\nimport type { ResourceHttpRequest } from '../resources';\nimport type {\n CreateSystemRoleBody,\n FetchSystemRolesParams,\n RolePermissionTreeNode,\n RolePermissionsResult,\n SaveRolePermissionsBody,\n SystemRole,\n SystemRoleFormValues,\n SystemRoleListResult,\n UpdateSystemRoleBody,\n} from './types';\n\nexport type {\n CreateSystemRoleBody,\n FetchSystemRolesParams,\n RolePermissionTreeNode,\n RolePermissionsResult,\n SaveRolePermissionsBody,\n SystemRole,\n SystemRoleFormValues,\n SystemRoleListResult,\n UpdateSystemRoleBody,\n} from './types';\n\nexport type SystemRoleApi = {\n list: (\n params?: FetchSystemRolesParams,\n signal?: AbortSignal,\n ) => Promise<SystemRoleListResult>;\n create: (values: SystemRoleFormValues, signal?: AbortSignal) => Promise<unknown>;\n update: (\n roleId: string,\n values: SystemRoleFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n remove: (roleId: string, signal?: AbortSignal) => Promise<unknown>;\n getPermissions: (\n roleId: string,\n signal?: AbortSignal,\n ) => Promise<RolePermissionsResult>;\n savePermissions: (\n roleId: string,\n resourceIds: string[],\n signal?: AbortSignal,\n ) => Promise<unknown>;\n};\n\nexport function mapSystemRole(item: unknown): SystemRole | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const roleId = row.roleId ?? row.role_id ?? row.id;\n if (roleId === undefined || roleId === null || roleId === '') return null;\n\n return {\n roleId: String(roleId),\n name: String(row.name ?? ''),\n description: String(row.description ?? row.desc ?? ''),\n };\n}\n\nexport function mapPermissionTreeNode(item: unknown): RolePermissionTreeNode | 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 const rawChildren = row.children ?? row.childList ?? row.child_list ?? [];\n const children = Array.isArray(rawChildren)\n ? rawChildren\n .map(mapPermissionTreeNode)\n .filter((node): node is RolePermissionTreeNode => node !== null)\n : [];\n\n return {\n resourceId: String(resourceId),\n name: String(row.name ?? ''),\n children,\n };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : null;\n}\n\nexport function mapRolePermissions(payload: unknown): RolePermissionsResult {\n const envelope = asObject(payload) ?? {};\n const data = asObject(envelope.data) ?? envelope;\n\n const rawIds = data.resourceIds ?? data.resource_ids ?? [];\n const resourceIds = Array.isArray(rawIds)\n ? rawIds\n .map((id) => (id === undefined || id === null ? '' : String(id)))\n .filter(Boolean)\n : [];\n\n const rawTree = data.resourceTree ?? data.resource_tree ?? [];\n const resourceTree = Array.isArray(rawTree)\n ? rawTree\n .map(mapPermissionTreeNode)\n .filter((node): node is RolePermissionTreeNode => node !== null)\n : [];\n\n return { resourceIds, resourceTree };\n}\n\n/** 收集节点及其全部子孙 resourceId */\nexport function collectTreeResourceIds(node: RolePermissionTreeNode): string[] {\n return [node.resourceId, ...node.children.flatMap(collectTreeResourceIds)];\n}\n\nexport type PermissionTreeIndex = {\n parentMap: Map<string, string | null>;\n nodeMap: Map<string, RolePermissionTreeNode>;\n};\n\n/** 建立父节点索引,供父子联动向上回写 */\nexport function buildPermissionTreeIndex(\n tree: RolePermissionTreeNode[],\n): PermissionTreeIndex {\n const parentMap = new Map<string, string | null>();\n const nodeMap = new Map<string, RolePermissionTreeNode>();\n\n const walk = (nodes: RolePermissionTreeNode[], parentId: string | null) => {\n for (const node of nodes) {\n parentMap.set(node.resourceId, parentId);\n nodeMap.set(node.resourceId, node);\n if (node.children.length > 0) {\n walk(node.children, node.resourceId);\n }\n }\n };\n walk(tree, null);\n\n return { parentMap, nodeMap };\n}\n\n/**\n * 父子联动勾选:\n * - 勾选:当前节点 + 全部子孙选中,并向上:子节点全选则父节点选中\n * - 取消:当前节点 + 全部子孙取消,并向上:任一子未选则父节点取消(半选由 UI 展示)\n */\nexport function togglePermissionCheck(\n tree: RolePermissionTreeNode[],\n checked: ReadonlySet<string>,\n node: RolePermissionTreeNode,\n): Set<string> {\n const next = new Set(checked);\n const ids = collectTreeResourceIds(node);\n const shouldCheck = !checked.has(node.resourceId);\n\n if (shouldCheck) {\n ids.forEach((id) => next.add(id));\n } else {\n ids.forEach((id) => next.delete(id));\n }\n\n const { parentMap, nodeMap } = buildPermissionTreeIndex(tree);\n let parentId = parentMap.get(node.resourceId) ?? null;\n while (parentId) {\n const parent = nodeMap.get(parentId);\n if (!parent) break;\n const allChildrenChecked = parent.children.every((child) =>\n next.has(child.resourceId),\n );\n if (allChildrenChecked && parent.children.length > 0) {\n next.add(parentId);\n } else {\n next.delete(parentId);\n }\n parentId = parentMap.get(parentId) ?? null;\n }\n\n return next;\n}\n\n/** 子孙勾选统计(不含自身),用于半选态 */\nexport function countCheckedDescendants(\n node: RolePermissionTreeNode,\n checked: ReadonlySet<string>,\n): { total: number; checkedCount: number } {\n let total = 0;\n let checkedCount = 0;\n const walk = (n: RolePermissionTreeNode) => {\n for (const child of n.children) {\n total += 1;\n if (checked.has(child.resourceId)) checkedCount += 1;\n walk(child);\n }\n };\n walk(node);\n return { total, checkedCount };\n}\n\n/** 是否存在已勾选的子孙节点 */\nexport function hasCheckedDescendant(\n node: RolePermissionTreeNode,\n checked: ReadonlySet<string>,\n): boolean {\n for (const child of node.children) {\n if (checked.has(child.resourceId) || hasCheckedDescendant(child, checked)) {\n return true;\n }\n }\n return false;\n}\n\n/** 半选:自身未勾选,但存在已勾选的子孙 */\nexport function isPermissionNodeIndeterminate(\n node: RolePermissionTreeNode,\n checked: ReadonlySet<string>,\n): boolean {\n if (checked.has(node.resourceId) || node.children.length === 0) return false;\n return hasCheckedDescendant(node, checked);\n}\n\nfunction buildListUrl(params?: FetchSystemRolesParams): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'keyword', params?.keyword ?? '');\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 parts.length ? `/system/roles?${parts.join('&')}` : '/system/roles';\n}\n\nexport function buildCreateRoleBody(values: SystemRoleFormValues): CreateSystemRoleBody {\n return {\n name: values.name.trim(),\n description: values.description.trim(),\n };\n}\n\nexport function buildUpdateRoleBody(values: SystemRoleFormValues): UpdateSystemRoleBody {\n return {\n name: values.name.trim(),\n description: values.description.trim(),\n };\n}\n\nexport function buildSavePermissionsBody(resourceIds: string[]): SaveRolePermissionsBody {\n return {\n resourceIds: [...new Set(resourceIds.map(String).filter(Boolean))],\n };\n}\n\nexport function createSystemRoleApi(request: ResourceHttpRequest): SystemRoleApi {\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(mapSystemRole)\n .filter((item): item is SystemRole => item !== null);\n return {\n records,\n ...extractPagination(json),\n };\n },\n\n async create(values, signal) {\n return request({\n method: 'POST',\n url: '/system/roles',\n body: buildCreateRoleBody(values),\n signal,\n });\n },\n\n async update(roleId, values, signal) {\n return request({\n method: 'PATCH',\n url: `/system/roles/${encodeURIComponent(roleId)}`,\n body: buildUpdateRoleBody(values),\n signal,\n });\n },\n\n async remove(roleId, signal) {\n return request({\n method: 'DELETE',\n url: `/system/roles/${encodeURIComponent(roleId)}`,\n signal,\n });\n },\n\n async getPermissions(roleId, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: `/system/roles/${encodeURIComponent(roleId)}/permissions`,\n signal,\n });\n return mapRolePermissions(json);\n },\n\n async savePermissions(roleId, resourceIds, signal) {\n return request({\n method: 'POST',\n url: `/system/roles/${encodeURIComponent(roleId)}/permissions`,\n body: buildSavePermissionsBody(resourceIds),\n signal,\n });\n },\n };\n}\n","import { appendQueryParam, extractPagination, extractRecords } from '../resources/pagination';\nimport type { ResourceHttpRequest } from '../resources';\nimport type {\n CreateSystemUserBody,\n FetchSystemGroupsParams,\n FetchSystemRoleOptionsParams,\n FetchSystemUsersParams,\n SystemGroupOption,\n SystemRoleOption,\n SystemUser,\n SystemUserFormValues,\n SystemUserListResult,\n UpdateSystemUserBody,\n} from './types';\n\nexport type {\n CreateSystemUserBody,\n FetchSystemGroupsParams,\n FetchSystemRoleOptionsParams,\n FetchSystemUsersParams,\n SystemGroupOption,\n SystemRoleOption,\n SystemUser,\n SystemUserFormValues,\n SystemUserListResult,\n UpdateSystemUserBody,\n} from './types';\n\nexport type SystemUserApi = {\n list: (\n params?: FetchSystemUsersParams,\n signal?: AbortSignal,\n ) => Promise<SystemUserListResult>;\n create: (values: SystemUserFormValues, signal?: AbortSignal) => Promise<unknown>;\n update: (\n userId: string,\n values: SystemUserFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n remove: (userId: string, signal?: AbortSignal) => Promise<unknown>;\n resetPassword: (\n userId: string,\n password: string,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n listGroups: (\n params?: FetchSystemGroupsParams,\n signal?: AbortSignal,\n ) => Promise<SystemGroupOption[]>;\n listRoleOptions: (\n params?: FetchSystemRoleOptionsParams,\n signal?: AbortSignal,\n ) => Promise<SystemRoleOption[]>;\n};\n\nfunction asIdList(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .map((item) => {\n if (item === undefined || item === null || item === '') return '';\n if (typeof item === 'object') {\n const row = item as Record<string, unknown>;\n const id = row.groupId ?? row.roleId ?? row.id;\n return id === undefined || id === null ? '' : String(id);\n }\n return String(item);\n })\n .filter(Boolean);\n}\n\nfunction asNameList(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const names = value\n .map((item) => {\n if (item === undefined || item === null) return '';\n if (typeof item === 'object') {\n return String((item as Record<string, unknown>).name ?? '');\n }\n return String(item);\n })\n .filter(Boolean);\n return names.length ? names : undefined;\n}\n\nexport function mapSystemUser(item: unknown): SystemUser | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const userId = row.userId ?? row.user_id ?? row.id;\n if (userId === undefined || userId === null || userId === '') return null;\n\n return {\n userId: String(userId),\n username: String(row.username ?? row.account ?? ''),\n name: String(row.name ?? ''),\n groupIds: asIdList(row.groupIds ?? row.group_ids ?? row.groups),\n roleIds: asIdList(row.roleIds ?? row.role_ids ?? row.roles),\n groupNames: asNameList(row.groupNames ?? row.group_names ?? row.groups),\n roleNames: asNameList(row.roleNames ?? row.role_names ?? row.roles),\n enabled: Boolean(row.enabled ?? row.enable ?? true),\n };\n}\n\nexport function mapSystemGroupOption(item: unknown): SystemGroupOption | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const groupId = row.groupId ?? row.group_id ?? row.id;\n if (groupId === undefined || groupId === null || groupId === '') return null;\n return {\n groupId: String(groupId),\n name: String(row.name ?? ''),\n };\n}\n\nexport function mapSystemRoleOption(item: unknown): SystemRoleOption | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const roleId = row.roleId ?? row.role_id ?? row.id;\n if (roleId === undefined || roleId === null || roleId === '') return null;\n return {\n roleId: String(roleId),\n name: String(row.name ?? ''),\n };\n}\n\n/**\n * 账号校验:长度大于 1;须含英文字母,可搭配数字;不支持中文或特殊符号。\n * 通过返回 null,失败返回错误文案。\n */\nexport function validateUsername(username: string): string | null {\n const value = username.trim();\n if (value.length <= 1) return '账号长度需大于 1';\n if (!/^(?=.*[A-Za-z])[A-Za-z0-9]+$/.test(value)) {\n return '账号需包含英文字母,可搭配数字,不支持中文或特殊符号。';\n }\n return null;\n}\n\nfunction buildListUrl(params?: FetchSystemUsersParams): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'keyword', params?.keyword ?? '');\n if (params?.enabled !== undefined) {\n appendQueryParam(parts, 'enabled', String(params.enabled));\n }\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 parts.length ? `/system/users?${parts.join('&')}` : '/system/users';\n}\n\nfunction buildKeywordUrl(base: string, keyword?: string): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'keyword', keyword ?? '');\n return parts.length ? `${base}?${parts.join('&')}` : base;\n}\n\nexport function buildCreateUserBody(values: SystemUserFormValues): CreateSystemUserBody {\n return {\n username: values.username.trim(),\n name: values.name.trim(),\n password: values.password,\n groupIds: [...new Set(values.groupIds.map(String))],\n roleIds: [...new Set(values.roleIds.map(String))],\n enabled: Boolean(values.enabled),\n };\n}\n\nexport function buildUpdateUserBody(values: SystemUserFormValues): UpdateSystemUserBody {\n const body: UpdateSystemUserBody = {\n username: values.username.trim(),\n name: values.name.trim(),\n groupIds: [...new Set(values.groupIds.map(String))],\n roleIds: [...new Set(values.roleIds.map(String))],\n enabled: Boolean(values.enabled),\n };\n if (values.password.trim()) {\n body.password = values.password;\n }\n return body;\n}\n\nexport function createSystemUserApi(request: ResourceHttpRequest): SystemUserApi {\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(mapSystemUser)\n .filter((item): item is SystemUser => item !== null);\n return {\n records,\n ...extractPagination(json),\n };\n },\n\n async create(values, signal) {\n return request({\n method: 'POST',\n url: '/system/users',\n body: buildCreateUserBody(values),\n signal,\n });\n },\n\n async update(userId, values, signal) {\n return request({\n method: 'PATCH',\n url: `/system/users/${encodeURIComponent(userId)}`,\n body: buildUpdateUserBody(values),\n signal,\n });\n },\n\n async remove(userId, signal) {\n return request({\n method: 'DELETE',\n url: `/system/users/${encodeURIComponent(userId)}`,\n signal,\n });\n },\n\n async resetPassword(userId, password, signal) {\n return request({\n method: 'POST',\n url: `/system/users/${encodeURIComponent(userId)}/reset-password`,\n body: { password },\n signal,\n });\n },\n\n async listGroups(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildKeywordUrl('/system/groups', params?.keyword),\n signal,\n });\n return extractRecords(json)\n .map(mapSystemGroupOption)\n .filter((item): item is SystemGroupOption => item !== null);\n },\n\n async listRoleOptions(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildKeywordUrl('/system/roles', params?.keyword),\n signal,\n });\n return extractRecords(json)\n .map(mapSystemRoleOption)\n .filter((item): item is SystemRoleOption => item !== null);\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/store.ts","../src/utils/snowflake.ts","../src/admin/menu.ts","../src/resources/types.ts","../src/resources/pagination.ts","../src/resources/api.ts","../src/roles/index.ts","../src/users/index.ts"],"names":["text","buildListUrl"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n CheckOptions,\n MatchMode,\n PermissionCode,\n PermissionListener,\n PermissionState,\n PermissionStoreAPI,\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 PermissionStoreAPI {\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): PermissionStoreAPI {\n return new PermissionStore(initial);\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","export type SystemAdminMenuKey = 'menu' | 'resource' | 'role' | 'user';\n\nexport type SystemAdminSubMenu = {\n key: SystemAdminMenuKey;\n label: string;\n};\n\nexport type SystemAdminMenuGroup = {\n key: 'system';\n label: string;\n children: SystemAdminSubMenu[];\n};\n\n/** 系统管理菜单结构 */\nexport const SYSTEM_ADMIN_MENU: SystemAdminMenuGroup = {\n key: 'system',\n label: '系统管理',\n children: [\n { key: 'user', label: '用户管理' },\n { key: 'role', label: '角色管理' },\n { key: 'menu', label: '菜单管理' },\n { key: 'resource', label: '权限点管理' },\n ],\n};\n\nexport const SYSTEM_ADMIN_DEFAULT_KEY: SystemAdminMenuKey = 'menu';\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 禁用;菜单 1 显示 / 0 隐藏 */\nexport type ResourceStatus = 0 | 1;\n\n/** 权限点类型 */\nexport type ApiResourceType = 'api';\n\n/** 菜单资源类型 */\nexport type MenuResourceType = 'page' | 'menu' | 'button';\n\nexport type ResourceType = ApiResourceType | MenuResourceType;\n\nexport type AuthorizationResource = {\n resourceId: string;\n type: ApiResourceType;\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: ApiResourceType;\n};\n\nexport type UpdateAuthorizationResourceBody = Partial<AuthorizationResourceFormValues> & {\n type?: ApiResourceType;\n};\n\nexport type FetchAuthorizationResourcesParams = {\n /** 按名称 / 标识搜索 */\n keyword?: string;\n pagination?: ListPaginationParams;\n};\n\nexport type AuthorizationResourceListResult = {\n records: AuthorizationResource[];\n pageToken: string;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n};\n\nexport type MenuPermissionPoint = {\n resourceId?: string;\n name: string;\n identification?: string;\n};\n\nexport type MenuResource = {\n resourceId: string;\n /** 上级菜单 ID;无上级时为 null */\n parentId: string | null;\n /**\n * 菜单层级:无上级(根)为 1,其余为上级 depth + 1\n */\n depth: number;\n /**\n * 是否叶子节点:`1` 表示无下级菜单,不可再展开\n */\n leaf: number;\n type: MenuResourceType;\n name: string;\n identification: string;\n permissionPointIds: string[];\n /** 关联权限点对象(列表展示优先取其中 name) */\n permissionPoints?: MenuPermissionPoint[];\n /** 关联权限点名称(列表展示用,后端可能返回) */\n permissionPointNames?: string[];\n status: ResourceStatus;\n /** 显示排序,数值越小越靠前 */\n sort: number;\n};\n\nexport type MenuResourceFormValues = {\n /** 上级菜单 ID;选择「无」时为 null */\n parentId: string | null;\n /** 由 parentId 自动计算:无为 1,否则上级 depth + 1 */\n depth: number;\n type: MenuResourceType;\n name: string;\n identification: string;\n permissionPointIds: string[];\n status: ResourceStatus;\n /** 显示排序 */\n sort: number;\n};\n\nexport type CreateMenuResourceBody = MenuResourceFormValues & {\n resourceId: string;\n};\n\nexport type UpdateMenuResourceBody = Partial<MenuResourceFormValues>;\n\nexport type FetchMenuResourcesParams = {\n /** 列表默认传 1,只拉根层 */\n depth?: number;\n pagination?: ListPaginationParams;\n};\n\nexport type MenuResourceListResult = {\n records: MenuResource[];\n pageToken: string;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n};\n\n/** leaf === 1 表示无下级 */\nexport const MENU_LEAF_YES = 1;\nexport const MENU_LEAF_NO = 0;\n\nexport const RESOURCE_TYPE_API: ApiResourceType = 'api';\nexport const MENU_TYPE_PAGE: MenuResourceType = 'page';\nexport const MENU_TYPE_MENU: MenuResourceType = 'menu';\nexport const MENU_TYPE_BUTTON: MenuResourceType = 'button';\n\n/** 菜单列表查询 type 参数 */\nexport const MENU_LIST_TYPE_PARAM = 'page,menu,button';\n\n/**\n * 上级菜单选择「无」时,表单 select 使用的空值。\n * 提交接口时会转换为 parentId: null。\n */\nexport const ROOT_PARENT_ID = '';\n\n/** 无上级时的菜单层级 */\nexport const ROOT_MENU_DEPTH = 1;\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\n/** 菜单可见性 */\nexport const MENU_VISIBILITY_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\nexport const MENU_TYPE_OPTIONS: { label: string; value: MenuResourceType }[] = [\n { label: '目录', value: MENU_TYPE_PAGE },\n { label: '菜单', value: MENU_TYPE_MENU },\n { label: '按钮', value: MENU_TYPE_BUTTON },\n];\n\nexport const MENU_TYPE_LABEL: Record<MenuResourceType, string> = {\n page: '目录',\n menu: '菜单',\n button: '按钮',\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 MENU_LIST_TYPE_PARAM,\n MENU_LEAF_YES,\n MENU_TYPE_BUTTON,\n MENU_TYPE_MENU,\n MENU_TYPE_PAGE,\n RESOURCE_STATUS_DISABLED,\n RESOURCE_STATUS_ENABLED,\n RESOURCE_TYPE_API,\n ROOT_MENU_DEPTH,\n type AuthorizationResource,\n type AuthorizationResourceFormValues,\n type AuthorizationResourceListResult,\n type CreateAuthorizationResourceBody,\n type CreateMenuResourceBody,\n type FetchAuthorizationResourcesParams,\n type FetchMenuResourcesParams,\n type MenuPermissionPoint,\n type MenuResource,\n type MenuResourceFormValues,\n type MenuResourceListResult,\n type MenuResourceType,\n type ResourceStatus,\n type UpdateAuthorizationResourceBody,\n type UpdateMenuResourceBody,\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\nexport type MenuResourceApi = {\n list: (\n params?: FetchMenuResourcesParams,\n signal?: AbortSignal,\n ) => Promise<MenuResourceListResult>;\n /** 展开下级:GET /authorization-resources/{resource-id}/sub-resources */\n listSubResources: (\n resourceId: string,\n signal?: AbortSignal,\n ) => Promise<MenuResource[]>;\n /** 拉取权限点(type=api),供菜单表单多选 */\n listPermissionPoints: (\n params?: FetchAuthorizationResourcesParams,\n signal?: AbortSignal,\n ) => Promise<AuthorizationResourceListResult>;\n create: (values: MenuResourceFormValues, signal?: AbortSignal) => Promise<unknown>;\n update: (\n resourceId: string,\n values: MenuResourceFormValues,\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\nfunction toStringArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (item && typeof item === 'object') {\n const row = item as Record<string, unknown>;\n const id = row.resourceId ?? row.resource_id ?? row.id;\n return id === undefined || id === null ? '' : String(id);\n }\n return String(item ?? '');\n })\n .filter(Boolean);\n }\n if (typeof value === 'string' && value.trim()) {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n }\n return [];\n}\n\nfunction mapMenuPermissionPoints(value: unknown): MenuPermissionPoint[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const points = value\n .map((item) => {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const name = String(row.name ?? '').trim();\n if (!name) return null;\n const resourceId = row.resourceId ?? row.resource_id ?? row.id;\n const identification = row.identification ?? row.identity;\n return {\n ...(resourceId !== undefined && resourceId !== null && resourceId !== ''\n ? { resourceId: String(resourceId) }\n : {}),\n name,\n ...(identification !== undefined && identification !== null && identification !== ''\n ? { identification: String(identification) }\n : {}),\n } satisfies MenuPermissionPoint;\n })\n .filter((item): item is MenuPermissionPoint => item !== null);\n return points.length ? points : undefined;\n}\n\nfunction toMenuType(value: unknown): MenuResourceType {\n const v = String(value ?? '').toLowerCase();\n if (v === MENU_TYPE_PAGE || v === MENU_TYPE_MENU || v === MENU_TYPE_BUTTON) {\n return v;\n }\n return MENU_TYPE_MENU;\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\nexport function mapMenuResource(item: unknown): MenuResource | 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 const permissionPoints = mapMenuPermissionPoints(\n row.permissionPoints ?? row.permission_points,\n );\n\n const permissionPointIds = toStringArray(\n row.permissionPointIds ??\n row.permission_point_ids ??\n (permissionPoints?.length\n ? permissionPoints.map((p) => p.resourceId).filter(Boolean)\n : undefined) ??\n row.permissions,\n );\n\n const permissionNamesRaw =\n row.permissionPointNames ?? row.permission_point_names ?? row.permissionNames;\n const permissionPointNames = Array.isArray(permissionNamesRaw)\n ? permissionNamesRaw.map((n) => String(n ?? '')).filter(Boolean)\n : permissionPoints?.map((p) => p.name).filter(Boolean);\n\n const rawParentId =\n row.parentId ??\n row.parent_id ??\n (row.parent && typeof row.parent === 'object'\n ? ((row.parent as Record<string, unknown>).resourceId ??\n (row.parent as Record<string, unknown>).resource_id ??\n (row.parent as Record<string, unknown>).id)\n : undefined);\n const parentId =\n rawParentId === undefined ||\n rawParentId === null ||\n rawParentId === '' ||\n String(rawParentId) === '0'\n ? null\n : String(rawParentId);\n\n const rawDepth = row.depth;\n const parsedDepth = Number(rawDepth);\n const depth =\n Number.isFinite(parsedDepth) && parsedDepth > 0\n ? Math.floor(parsedDepth)\n : parentId\n ? ROOT_MENU_DEPTH + 1\n : ROOT_MENU_DEPTH;\n\n const rawLeaf = row.leaf;\n const leaf =\n rawLeaf === true ||\n rawLeaf === 1 ||\n rawLeaf === '1' ||\n String(rawLeaf).toLowerCase() === 'true'\n ? MENU_LEAF_YES\n : Number(rawLeaf) === MENU_LEAF_YES\n ? MENU_LEAF_YES\n : 0;\n\n const rawSort = row.sort ?? row.order ?? row.sortOrder ?? row.sort_order;\n const parsedSort = Number(rawSort);\n const sort = Number.isFinite(parsedSort) ? Math.floor(parsedSort) : 0;\n\n return {\n resourceId: String(resourceId),\n parentId,\n depth,\n leaf,\n type: toMenuType(row.type),\n name: String(row.name ?? ''),\n identification: String(row.identification ?? row.identity ?? row.path ?? ''),\n permissionPointIds,\n permissionPoints,\n permissionPointNames:\n permissionPointNames && permissionPointNames.length\n ? permissionPointNames\n : undefined,\n status: toResourceStatus(row.status),\n sort,\n };\n}\n\n/**\n * leaf === 1 表示无下级菜单。\n */\nexport function isMenuLeaf(row: Pick<MenuResource, 'leaf'>): boolean {\n return Number(row.leaf) === MENU_LEAF_YES;\n}\n\n/**\n * 根据上级菜单计算 depth:无上级为 1,否则为上级 depth + 1。\n */\nexport function resolveMenuDepth(\n parentId: string | null | undefined,\n menus: Array<Pick<MenuResource, 'resourceId' | 'depth'>>,\n): number {\n if (!parentId) return ROOT_MENU_DEPTH;\n const parent = menus.find((item) => item.resourceId === parentId);\n const parentDepth =\n parent && Number.isFinite(parent.depth) && parent.depth > 0\n ? Math.floor(parent.depth)\n : ROOT_MENU_DEPTH;\n return parentDepth + 1;\n}\n\nfunction buildListUrl(\n type: string,\n params?: {\n pagination?: FetchAuthorizationResourcesParams['pagination'];\n depth?: number | string;\n keyword?: string;\n },\n): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'type', type);\n if (params?.depth !== undefined && params?.depth !== null && String(params.depth) !== '') {\n appendQueryParam(parts, 'depth', String(params.depth));\n }\n appendQueryParam(parts, 'keyword', params?.keyword ?? '');\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 buildCreateMenuBody(\n values: MenuResourceFormValues,\n resourceId = getAppClientId(),\n): CreateMenuResourceBody {\n const parentId = values.parentId ? values.parentId : null;\n return {\n resourceId,\n parentId,\n depth: values.depth > 0 ? Math.floor(values.depth) : parentId ? ROOT_MENU_DEPTH + 1 : ROOT_MENU_DEPTH,\n type: values.type,\n name: values.name.trim(),\n identification: values.identification.trim(),\n permissionPointIds: [...values.permissionPointIds],\n status: values.status,\n sort: Number.isFinite(Number(values.sort)) ? Math.floor(Number(values.sort)) : 0,\n };\n}\n\nexport function buildUpdateMenuBody(values: MenuResourceFormValues): UpdateMenuResourceBody {\n const parentId = values.parentId ? values.parentId : null;\n return {\n parentId,\n depth: values.depth > 0 ? Math.floor(values.depth) : parentId ? ROOT_MENU_DEPTH + 1 : ROOT_MENU_DEPTH,\n type: values.type,\n name: values.name.trim(),\n identification: values.identification.trim(),\n permissionPointIds: [...values.permissionPointIds],\n status: values.status,\n sort: Number.isFinite(Number(values.sort)) ? Math.floor(Number(values.sort)) : 0,\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(RESOURCE_TYPE_API, 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 function createMenuResourceApi(request: ResourceHttpRequest): MenuResourceApi {\n const permissionApi = createAuthorizationResourceApi(request);\n\n return {\n async list(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildListUrl(MENU_LIST_TYPE_PARAM, {\n pagination: params?.pagination,\n depth: params?.depth ?? ROOT_MENU_DEPTH,\n }),\n signal,\n });\n const records = extractRecords(json)\n .map(mapMenuResource)\n .filter((item): item is MenuResource => item !== null);\n const pagination = extractPagination(json);\n return {\n records,\n ...pagination,\n };\n },\n\n async listSubResources(resourceId, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: `/authorization-resources/${encodeURIComponent(resourceId)}/sub-resources`,\n signal,\n });\n return extractRecords(json)\n .map(mapMenuResource)\n .filter((item): item is MenuResource => item !== null)\n .map((item) => ({\n ...item,\n // 子资源接口常不回 parentId,用请求路径上的父级补齐\n parentId: item.parentId ?? resourceId,\n }));\n },\n\n listPermissionPoints(params, signal) {\n return permissionApi.list(params, signal);\n },\n\n async create(values, signal) {\n return request({\n method: 'POST',\n url: '/authorization-resources',\n body: buildCreateMenuBody(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: buildUpdateMenuBody(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","import { appendQueryParam, extractPagination, extractRecords } from '../resources/pagination';\nimport type { ResourceHttpRequest } from '../resources';\nimport type {\n CreateSystemRoleBody,\n FetchSystemRolesParams,\n RolePermissionTreeNode,\n RolePermissionsResult,\n SaveRolePermissionsBody,\n SystemRole,\n SystemRoleFormValues,\n SystemRoleListResult,\n UpdateSystemRoleBody,\n} from './types';\n\nexport type {\n CreateSystemRoleBody,\n FetchSystemRolesParams,\n RolePermissionTreeNode,\n RolePermissionsResult,\n SaveRolePermissionsBody,\n SystemRole,\n SystemRoleFormValues,\n SystemRoleListResult,\n UpdateSystemRoleBody,\n} from './types';\n\nexport type SystemRoleApi = {\n list: (\n params?: FetchSystemRolesParams,\n signal?: AbortSignal,\n ) => Promise<SystemRoleListResult>;\n create: (values: SystemRoleFormValues, signal?: AbortSignal) => Promise<unknown>;\n update: (\n roleId: string,\n values: SystemRoleFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n remove: (roleId: string, signal?: AbortSignal) => Promise<unknown>;\n getPermissions: (\n roleId: string,\n signal?: AbortSignal,\n ) => Promise<RolePermissionsResult>;\n savePermissions: (\n roleId: string,\n resourceIds: string[],\n signal?: AbortSignal,\n ) => Promise<unknown>;\n};\n\nexport function mapSystemRole(item: unknown): SystemRole | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const roleId = row.roleId ?? row.role_id ?? row.id;\n if (roleId === undefined || roleId === null || roleId === '') return null;\n\n return {\n roleId: String(roleId),\n name: String(row.name ?? ''),\n description: String(row.description ?? row.desc ?? ''),\n };\n}\n\nexport function mapPermissionTreeNode(item: unknown): RolePermissionTreeNode | 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 const rawChildren = row.children ?? row.childList ?? row.child_list ?? [];\n const children = Array.isArray(rawChildren)\n ? rawChildren\n .map(mapPermissionTreeNode)\n .filter((node): node is RolePermissionTreeNode => node !== null)\n : [];\n\n return {\n resourceId: String(resourceId),\n name: String(row.name ?? ''),\n children,\n };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : null;\n}\n\nexport function mapRolePermissions(payload: unknown): RolePermissionsResult {\n const envelope = asObject(payload) ?? {};\n const data = asObject(envelope.data) ?? envelope;\n\n const rawIds = data.resourceIds ?? data.resource_ids ?? [];\n const resourceIds = Array.isArray(rawIds)\n ? rawIds\n .map((id) => (id === undefined || id === null ? '' : String(id)))\n .filter(Boolean)\n : [];\n\n const rawTree = data.resourceTree ?? data.resource_tree ?? [];\n const resourceTree = Array.isArray(rawTree)\n ? rawTree\n .map(mapPermissionTreeNode)\n .filter((node): node is RolePermissionTreeNode => node !== null)\n : [];\n\n return { resourceIds, resourceTree };\n}\n\n/** 收集节点及其全部子孙 resourceId */\nexport function collectTreeResourceIds(node: RolePermissionTreeNode): string[] {\n return [node.resourceId, ...node.children.flatMap(collectTreeResourceIds)];\n}\n\nexport type PermissionTreeIndex = {\n parentMap: Map<string, string | null>;\n nodeMap: Map<string, RolePermissionTreeNode>;\n};\n\n/** 建立父节点索引,供父子联动向上回写 */\nexport function buildPermissionTreeIndex(\n tree: RolePermissionTreeNode[],\n): PermissionTreeIndex {\n const parentMap = new Map<string, string | null>();\n const nodeMap = new Map<string, RolePermissionTreeNode>();\n\n const walk = (nodes: RolePermissionTreeNode[], parentId: string | null) => {\n for (const node of nodes) {\n parentMap.set(node.resourceId, parentId);\n nodeMap.set(node.resourceId, node);\n if (node.children.length > 0) {\n walk(node.children, node.resourceId);\n }\n }\n };\n walk(tree, null);\n\n return { parentMap, nodeMap };\n}\n\n/**\n * 父子联动勾选:\n * - 勾选:当前节点 + 全部子孙选中,并向上:子节点全选则父节点选中\n * - 取消:当前节点 + 全部子孙取消,并向上:任一子未选则父节点取消(半选由 UI 展示)\n */\nexport function togglePermissionCheck(\n tree: RolePermissionTreeNode[],\n checked: ReadonlySet<string>,\n node: RolePermissionTreeNode,\n): Set<string> {\n const next = new Set(checked);\n const ids = collectTreeResourceIds(node);\n const shouldCheck = !checked.has(node.resourceId);\n\n if (shouldCheck) {\n ids.forEach((id) => next.add(id));\n } else {\n ids.forEach((id) => next.delete(id));\n }\n\n const { parentMap, nodeMap } = buildPermissionTreeIndex(tree);\n let parentId = parentMap.get(node.resourceId) ?? null;\n while (parentId) {\n const parent = nodeMap.get(parentId);\n if (!parent) break;\n const allChildrenChecked = parent.children.every((child) =>\n next.has(child.resourceId),\n );\n if (allChildrenChecked && parent.children.length > 0) {\n next.add(parentId);\n } else {\n next.delete(parentId);\n }\n parentId = parentMap.get(parentId) ?? null;\n }\n\n return next;\n}\n\n/** 子孙勾选统计(不含自身),用于半选态 */\nexport function countCheckedDescendants(\n node: RolePermissionTreeNode,\n checked: ReadonlySet<string>,\n): { total: number; checkedCount: number } {\n let total = 0;\n let checkedCount = 0;\n const walk = (n: RolePermissionTreeNode) => {\n for (const child of n.children) {\n total += 1;\n if (checked.has(child.resourceId)) checkedCount += 1;\n walk(child);\n }\n };\n walk(node);\n return { total, checkedCount };\n}\n\n/** 是否存在已勾选的子孙节点 */\nexport function hasCheckedDescendant(\n node: RolePermissionTreeNode,\n checked: ReadonlySet<string>,\n): boolean {\n for (const child of node.children) {\n if (checked.has(child.resourceId) || hasCheckedDescendant(child, checked)) {\n return true;\n }\n }\n return false;\n}\n\n/** 半选:自身未勾选,但存在已勾选的子孙 */\nexport function isPermissionNodeIndeterminate(\n node: RolePermissionTreeNode,\n checked: ReadonlySet<string>,\n): boolean {\n if (checked.has(node.resourceId) || node.children.length === 0) return false;\n return hasCheckedDescendant(node, checked);\n}\n\nfunction buildListUrl(params?: FetchSystemRolesParams): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'keyword', params?.keyword ?? '');\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 parts.length ? `/system/roles?${parts.join('&')}` : '/system/roles';\n}\n\nexport function buildCreateRoleBody(values: SystemRoleFormValues): CreateSystemRoleBody {\n return {\n name: values.name.trim(),\n description: values.description.trim(),\n };\n}\n\nexport function buildUpdateRoleBody(values: SystemRoleFormValues): UpdateSystemRoleBody {\n return {\n name: values.name.trim(),\n description: values.description.trim(),\n };\n}\n\nexport function buildSavePermissionsBody(resourceIds: string[]): SaveRolePermissionsBody {\n return {\n resourceIds: [...new Set(resourceIds.map(String).filter(Boolean))],\n };\n}\n\nexport function createSystemRoleApi(request: ResourceHttpRequest): SystemRoleApi {\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(mapSystemRole)\n .filter((item): item is SystemRole => item !== null);\n return {\n records,\n ...extractPagination(json),\n };\n },\n\n async create(values, signal) {\n return request({\n method: 'POST',\n url: '/system/roles',\n body: buildCreateRoleBody(values),\n signal,\n });\n },\n\n async update(roleId, values, signal) {\n return request({\n method: 'PATCH',\n url: `/system/roles/${encodeURIComponent(roleId)}`,\n body: buildUpdateRoleBody(values),\n signal,\n });\n },\n\n async remove(roleId, signal) {\n return request({\n method: 'DELETE',\n url: `/system/roles/${encodeURIComponent(roleId)}`,\n signal,\n });\n },\n\n async getPermissions(roleId, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: `/system/roles/${encodeURIComponent(roleId)}/permissions`,\n signal,\n });\n return mapRolePermissions(json);\n },\n\n async savePermissions(roleId, resourceIds, signal) {\n return request({\n method: 'POST',\n url: `/system/roles/${encodeURIComponent(roleId)}/permissions`,\n body: buildSavePermissionsBody(resourceIds),\n signal,\n });\n },\n };\n}\n","import { appendQueryParam, extractPagination, extractRecords } from '../resources/pagination';\nimport type { ResourceHttpRequest } from '../resources';\nimport type {\n CreateSystemUserBody,\n FetchSystemGroupsParams,\n FetchSystemRoleOptionsParams,\n FetchSystemUsersParams,\n SystemGroupOption,\n SystemRoleOption,\n SystemUser,\n SystemUserFormValues,\n SystemUserListResult,\n UpdateSystemUserBody,\n} from './types';\n\nexport type {\n CreateSystemUserBody,\n FetchSystemGroupsParams,\n FetchSystemRoleOptionsParams,\n FetchSystemUsersParams,\n SystemGroupOption,\n SystemRoleOption,\n SystemUser,\n SystemUserFormValues,\n SystemUserListResult,\n UpdateSystemUserBody,\n} from './types';\n\nexport type SystemUserApi = {\n list: (\n params?: FetchSystemUsersParams,\n signal?: AbortSignal,\n ) => Promise<SystemUserListResult>;\n create: (values: SystemUserFormValues, signal?: AbortSignal) => Promise<unknown>;\n update: (\n userId: string,\n values: SystemUserFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n remove: (userId: string, signal?: AbortSignal) => Promise<unknown>;\n resetPassword: (\n userId: string,\n password: string,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n listGroups: (\n params?: FetchSystemGroupsParams,\n signal?: AbortSignal,\n ) => Promise<SystemGroupOption[]>;\n listRoleOptions: (\n params?: FetchSystemRoleOptionsParams,\n signal?: AbortSignal,\n ) => Promise<SystemRoleOption[]>;\n};\n\nfunction asIdList(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .map((item) => {\n if (item === undefined || item === null || item === '') return '';\n if (typeof item === 'object') {\n const row = item as Record<string, unknown>;\n const id = row.groupId ?? row.roleId ?? row.id;\n return id === undefined || id === null ? '' : String(id);\n }\n return String(item);\n })\n .filter(Boolean);\n}\n\nfunction asNameList(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const names = value\n .map((item) => {\n if (item === undefined || item === null) return '';\n if (typeof item === 'object') {\n return String((item as Record<string, unknown>).name ?? '');\n }\n return String(item);\n })\n .filter(Boolean);\n return names.length ? names : undefined;\n}\n\nexport function mapSystemUser(item: unknown): SystemUser | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const userId = row.userId ?? row.user_id ?? row.id;\n if (userId === undefined || userId === null || userId === '') return null;\n\n return {\n userId: String(userId),\n username: String(row.username ?? row.account ?? ''),\n name: String(row.name ?? ''),\n groupIds: asIdList(row.groupIds ?? row.group_ids ?? row.groups),\n roleIds: asIdList(row.roleIds ?? row.role_ids ?? row.roles),\n groupNames: asNameList(row.groupNames ?? row.group_names ?? row.groups),\n roleNames: asNameList(row.roleNames ?? row.role_names ?? row.roles),\n enabled: Boolean(row.enabled ?? row.enable ?? true),\n };\n}\n\nexport function mapSystemGroupOption(item: unknown): SystemGroupOption | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const groupId = row.groupId ?? row.group_id ?? row.id;\n if (groupId === undefined || groupId === null || groupId === '') return null;\n return {\n groupId: String(groupId),\n name: String(row.name ?? ''),\n };\n}\n\nexport function mapSystemRoleOption(item: unknown): SystemRoleOption | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const roleId = row.roleId ?? row.role_id ?? row.id;\n if (roleId === undefined || roleId === null || roleId === '') return null;\n return {\n roleId: String(roleId),\n name: String(row.name ?? ''),\n };\n}\n\n/**\n * 账号校验:长度大于 1;须含英文字母,可搭配数字;不支持中文或特殊符号。\n * 通过返回 null,失败返回错误文案。\n */\nexport function validateUsername(username: string): string | null {\n const value = username.trim();\n if (value.length <= 1) return '账号长度需大于 1';\n if (!/^(?=.*[A-Za-z])[A-Za-z0-9]+$/.test(value)) {\n return '账号需包含英文字母,可搭配数字,不支持中文或特殊符号。';\n }\n return null;\n}\n\nfunction buildListUrl(params?: FetchSystemUsersParams): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'keyword', params?.keyword ?? '');\n if (params?.enabled !== undefined) {\n appendQueryParam(parts, 'enabled', String(params.enabled));\n }\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 parts.length ? `/system/users?${parts.join('&')}` : '/system/users';\n}\n\nfunction buildKeywordUrl(base: string, keyword?: string): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'keyword', keyword ?? '');\n return parts.length ? `${base}?${parts.join('&')}` : base;\n}\n\nexport function buildCreateUserBody(values: SystemUserFormValues): CreateSystemUserBody {\n return {\n username: values.username.trim(),\n name: values.name.trim(),\n password: values.password,\n groupIds: [...new Set(values.groupIds.map(String))],\n roleIds: [...new Set(values.roleIds.map(String))],\n enabled: Boolean(values.enabled),\n };\n}\n\nexport function buildUpdateUserBody(values: SystemUserFormValues): UpdateSystemUserBody {\n const body: UpdateSystemUserBody = {\n username: values.username.trim(),\n name: values.name.trim(),\n groupIds: [...new Set(values.groupIds.map(String))],\n roleIds: [...new Set(values.roleIds.map(String))],\n enabled: Boolean(values.enabled),\n };\n if (values.password.trim()) {\n body.password = values.password;\n }\n return body;\n}\n\nexport function createSystemUserApi(request: ResourceHttpRequest): SystemUserApi {\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(mapSystemUser)\n .filter((item): item is SystemUser => item !== null);\n return {\n records,\n ...extractPagination(json),\n };\n },\n\n async create(values, signal) {\n return request({\n method: 'POST',\n url: '/system/users',\n body: buildCreateUserBody(values),\n signal,\n });\n },\n\n async update(userId, values, signal) {\n return request({\n method: 'PATCH',\n url: `/system/users/${encodeURIComponent(userId)}`,\n body: buildUpdateUserBody(values),\n signal,\n });\n },\n\n async remove(userId, signal) {\n return request({\n method: 'DELETE',\n url: `/system/users/${encodeURIComponent(userId)}`,\n signal,\n });\n },\n\n async resetPassword(userId, password, signal) {\n return request({\n method: 'POST',\n url: `/system/users/${encodeURIComponent(userId)}/reset-password`,\n body: { password },\n signal,\n });\n },\n\n async listGroups(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildKeywordUrl('/system/groups', params?.keyword),\n signal,\n });\n return extractRecords(json)\n .map(mapSystemGroupOption)\n .filter((item): item is SystemGroupOption => item !== null);\n },\n\n async listRoleOptions(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildKeywordUrl('/system/roles', params?.keyword),\n signal,\n });\n return extractRecords(json)\n .map(mapSystemRoleOption)\n .filter((item): item is SystemRoleOption => item !== null);\n },\n };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -151,6 +151,8 @@ type UpdateAuthorizationResourceBody = Partial<AuthorizationResourceFormValues>
151
151
  type?: ApiResourceType;
152
152
  };
153
153
  type FetchAuthorizationResourcesParams = {
154
+ /** 按名称 / 标识搜索 */
155
+ keyword?: string;
154
156
  pagination?: ListPaginationParams;
155
157
  };
156
158
  type AuthorizationResourceListResult = {
package/dist/index.d.ts CHANGED
@@ -151,6 +151,8 @@ type UpdateAuthorizationResourceBody = Partial<AuthorizationResourceFormValues>
151
151
  type?: ApiResourceType;
152
152
  };
153
153
  type FetchAuthorizationResourcesParams = {
154
+ /** 按名称 / 标识搜索 */
155
+ keyword?: string;
154
156
  pagination?: ListPaginationParams;
155
157
  };
156
158
  type AuthorizationResourceListResult = {
package/dist/index.js CHANGED
@@ -401,6 +401,7 @@ function buildListUrl(type, params) {
401
401
  if (params?.depth !== void 0 && params?.depth !== null && String(params.depth) !== "") {
402
402
  appendQueryParam(parts, "depth", String(params.depth));
403
403
  }
404
+ appendQueryParam(parts, "keyword", params?.keyword ?? "");
404
405
  appendQueryParam(parts, "page-token", params?.pagination?.pageToken ?? "");
405
406
  appendQueryParam(parts, "page-size", params?.pagination?.pageSize ?? "20");
406
407
  appendQueryParam(parts, "page-direction", params?.pagination?.pageDirection ?? "current");