com-angel-authorization 1.0.9 → 1.0.11
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 +5 -2
- package/dist/index.cjs +26 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -1
- package/dist/index.d.ts +16 -1
- package/dist/index.js +24 -2
- package/dist/index.js.map +1 -1
- package/dist/react/index.cjs +181 -41
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +16 -1
- package/dist/react/index.d.ts +16 -1
- package/dist/react/index.js +178 -41
- package/dist/react/index.js.map +1 -1
- package/dist/vue/index.cjs +168 -23
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.d.cts +16 -1
- package/dist/vue/index.d.ts +16 -1
- package/dist/vue/index.js +165 -23
- package/dist/vue/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -340,7 +340,8 @@ createApp(ResourceManager, { api }).mount('#app');
|
|
|
340
340
|
|
|
341
341
|
| 操作 | 方法 | 地址 |
|
|
342
342
|
|------|------|------|
|
|
343
|
-
| 列表 | GET | `/authorization-resources?type=page,menu,button&page-token=&page-size=&page-direction=` |
|
|
343
|
+
| 列表 | GET | `/authorization-resources?type=page,menu,button&depth=1&page-token=&page-size=&page-direction=` |
|
|
344
|
+
| 展开下级 | GET | `/authorization-resources/{resource-id}/sub-resources` |
|
|
344
345
|
| 新增 | POST | `/authorization-resources` |
|
|
345
346
|
| 修改 | PATCH | `/authorization-resources/{resource-id}` |
|
|
346
347
|
| 删除 | DELETE | `/authorization-resources/{resource-id}` |
|
|
@@ -371,13 +372,15 @@ export function Page() {
|
|
|
371
372
|
| 字段 | 说明 |
|
|
372
373
|
|------|------|
|
|
373
374
|
| parentId | 上级菜单(下拉,无 → `null`) |
|
|
374
|
-
| depth |
|
|
375
|
+
| depth | 菜单层级(页面不展示;无上级为 `1`,否则上级 depth + 1,提交时自动带上) |
|
|
375
376
|
| type | `page` 目录 / `menu` 菜单 / `button` 按钮 |
|
|
376
377
|
| name | 菜单名称 |
|
|
377
378
|
| identification | 请求地址 |
|
|
378
379
|
| permissionPointIds | 权限标识(多选,来自 type=api 列表) |
|
|
379
380
|
| status | `1` 显示 / `0` 隐藏 |
|
|
380
381
|
|
|
382
|
+
列表默认 `depth=1`。返回项 `leaf=1` 表示无下级;否则可点击展开,请求 `/authorization-resources/{resource-id}/sub-resources`。
|
|
383
|
+
|
|
381
384
|
列表表头:菜单名称、请求地址、类型、可见、权限标识、操作。
|
|
382
385
|
|
|
383
386
|
---
|
package/dist/index.cjs
CHANGED
|
@@ -193,6 +193,8 @@ var SYSTEM_ADMIN_MENU = {
|
|
|
193
193
|
var SYSTEM_ADMIN_DEFAULT_KEY = "menu";
|
|
194
194
|
|
|
195
195
|
// src/resources/types.ts
|
|
196
|
+
var MENU_LEAF_YES = 1;
|
|
197
|
+
var MENU_LEAF_NO = 0;
|
|
196
198
|
var RESOURCE_TYPE_API = "api";
|
|
197
199
|
var MENU_TYPE_PAGE = "page";
|
|
198
200
|
var MENU_TYPE_MENU = "menu";
|
|
@@ -344,10 +346,13 @@ function mapMenuResource(item) {
|
|
|
344
346
|
const rawDepth = row.depth;
|
|
345
347
|
const parsedDepth = Number(rawDepth);
|
|
346
348
|
const depth = Number.isFinite(parsedDepth) && parsedDepth > 0 ? Math.floor(parsedDepth) : parentId ? ROOT_MENU_DEPTH + 1 : ROOT_MENU_DEPTH;
|
|
349
|
+
const rawLeaf = row.leaf;
|
|
350
|
+
const leaf = rawLeaf === true || rawLeaf === 1 || rawLeaf === "1" || String(rawLeaf).toLowerCase() === "true" ? MENU_LEAF_YES : Number(rawLeaf) === MENU_LEAF_YES ? MENU_LEAF_YES : 0;
|
|
347
351
|
return {
|
|
348
352
|
resourceId: String(resourceId),
|
|
349
353
|
parentId,
|
|
350
354
|
depth,
|
|
355
|
+
leaf,
|
|
351
356
|
type: toMenuType(row.type),
|
|
352
357
|
name: String(row.name ?? ""),
|
|
353
358
|
identification: String(row.identification ?? row.identity ?? row.path ?? ""),
|
|
@@ -356,6 +361,9 @@ function mapMenuResource(item) {
|
|
|
356
361
|
status: toResourceStatus(row.status)
|
|
357
362
|
};
|
|
358
363
|
}
|
|
364
|
+
function isMenuLeaf(row) {
|
|
365
|
+
return Number(row.leaf) === MENU_LEAF_YES;
|
|
366
|
+
}
|
|
359
367
|
function resolveMenuDepth(parentId, menus) {
|
|
360
368
|
if (!parentId) return ROOT_MENU_DEPTH;
|
|
361
369
|
const parent = menus.find((item) => item.resourceId === parentId);
|
|
@@ -365,6 +373,9 @@ function resolveMenuDepth(parentId, menus) {
|
|
|
365
373
|
function buildListUrl(type, params) {
|
|
366
374
|
const parts = [];
|
|
367
375
|
appendQueryParam(parts, "type", type);
|
|
376
|
+
if (params?.depth !== void 0 && params?.depth !== null && String(params.depth) !== "") {
|
|
377
|
+
appendQueryParam(parts, "depth", String(params.depth));
|
|
378
|
+
}
|
|
368
379
|
appendQueryParam(parts, "page-token", params?.pagination?.pageToken ?? "");
|
|
369
380
|
appendQueryParam(parts, "page-size", params?.pagination?.pageSize ?? "20");
|
|
370
381
|
appendQueryParam(parts, "page-direction", params?.pagination?.pageDirection ?? "current");
|
|
@@ -462,7 +473,10 @@ function createMenuResourceApi(request) {
|
|
|
462
473
|
async list(params, signal) {
|
|
463
474
|
const json = await request({
|
|
464
475
|
method: "GET",
|
|
465
|
-
url: buildListUrl(MENU_LIST_TYPE_PARAM,
|
|
476
|
+
url: buildListUrl(MENU_LIST_TYPE_PARAM, {
|
|
477
|
+
pagination: params?.pagination,
|
|
478
|
+
depth: params?.depth ?? ROOT_MENU_DEPTH
|
|
479
|
+
}),
|
|
466
480
|
signal
|
|
467
481
|
});
|
|
468
482
|
const records = extractRecords(json).map(mapMenuResource).filter((item) => item !== null);
|
|
@@ -472,6 +486,14 @@ function createMenuResourceApi(request) {
|
|
|
472
486
|
...pagination
|
|
473
487
|
};
|
|
474
488
|
},
|
|
489
|
+
async listSubResources(resourceId, signal) {
|
|
490
|
+
const json = await request({
|
|
491
|
+
method: "GET",
|
|
492
|
+
url: `/authorization-resources/${encodeURIComponent(resourceId)}/sub-resources`,
|
|
493
|
+
signal
|
|
494
|
+
});
|
|
495
|
+
return extractRecords(json).map(mapMenuResource).filter((item) => item !== null);
|
|
496
|
+
},
|
|
475
497
|
listPermissionPoints(params, signal) {
|
|
476
498
|
return permissionApi.list(params, signal);
|
|
477
499
|
},
|
|
@@ -539,6 +561,8 @@ function createDefaultResourceRequest(options = {}) {
|
|
|
539
561
|
};
|
|
540
562
|
}
|
|
541
563
|
|
|
564
|
+
exports.MENU_LEAF_NO = MENU_LEAF_NO;
|
|
565
|
+
exports.MENU_LEAF_YES = MENU_LEAF_YES;
|
|
542
566
|
exports.MENU_LIST_TYPE_PARAM = MENU_LIST_TYPE_PARAM;
|
|
543
567
|
exports.MENU_TYPE_BUTTON = MENU_TYPE_BUTTON;
|
|
544
568
|
exports.MENU_TYPE_LABEL = MENU_TYPE_LABEL;
|
|
@@ -569,6 +593,7 @@ exports.extractPagination = extractPagination;
|
|
|
569
593
|
exports.extractRecords = extractRecords;
|
|
570
594
|
exports.getAppClientId = getAppClientId;
|
|
571
595
|
exports.getDeviceWorkerId = getDeviceWorkerId;
|
|
596
|
+
exports.isMenuLeaf = isMenuLeaf;
|
|
572
597
|
exports.mapAuthorizationResource = mapAuthorizationResource;
|
|
573
598
|
exports.mapMenuResource = mapMenuResource;
|
|
574
599
|
exports.resolveMenuDepth = resolveMenuDepth;
|
package/dist/index.cjs.map
CHANGED
|
@@ -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"],"names":["text"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n CheckOptions,\n MatchMode,\n PermissionChecker,\n PermissionCode,\n PermissionListener,\n PermissionState,\n RoleCode,\n} from './types';\n\nconst DEFAULT_STATE: PermissionState = {\n permissions: [],\n roles: [],\n isSuperAdmin: false,\n};\n\nfunction toArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction matchCodes(\n owned: Set<string>,\n required: string[],\n mode: MatchMode,\n isSuperAdmin: boolean,\n): boolean {\n if (isSuperAdmin) return true;\n if (required.length === 0) return true;\n\n if (mode === 'all') {\n return required.every((code) => owned.has(code));\n }\n\n return required.some((code) => owned.has(code));\n}\n\n/**\n * Mutable permission store shared by React / Vue adapters.\n * Framework-agnostic — safe to use in Node, browser, or any UI lib.\n */\nexport class PermissionStore implements PermissionChecker {\n private state: PermissionState;\n private permissionSet: Set<string>;\n private roleSet: Set<string>;\n private listeners = new Set<PermissionListener>();\n\n constructor(initial?: Partial<PermissionState>) {\n this.state = {\n ...DEFAULT_STATE,\n ...initial,\n permissions: initial?.permissions ?? [],\n roles: initial?.roles ?? [],\n };\n this.permissionSet = new Set(this.state.permissions);\n this.roleSet = new Set(this.state.roles);\n }\n\n getState(): PermissionState {\n return {\n permissions: [...this.state.permissions],\n roles: [...this.state.roles],\n isSuperAdmin: this.state.isSuperAdmin,\n };\n }\n\n setState(next: Partial<PermissionState>): void {\n this.state = {\n permissions: next.permissions ?? this.state.permissions,\n roles: next.roles ?? this.state.roles,\n isSuperAdmin: next.isSuperAdmin ?? this.state.isSuperAdmin,\n };\n this.permissionSet = new Set(this.state.permissions);\n this.roleSet = new Set(this.state.roles);\n this.emit();\n }\n\n setPermissions(permissions: PermissionCode[]): void {\n this.setState({ permissions });\n }\n\n setRoles(roles: RoleCode[]): void {\n this.setState({ roles });\n }\n\n setSuperAdmin(isSuperAdmin: boolean): void {\n this.setState({ isSuperAdmin });\n }\n\n /** Replace permissions, roles and super-admin flag in one shot (typical after login). */\n hydrate(payload: Partial<PermissionState>): void {\n this.setState({\n permissions: payload.permissions ?? [],\n roles: payload.roles ?? [],\n isSuperAdmin: payload.isSuperAdmin ?? false,\n });\n }\n\n /** Clear all authz data (typical after logout). */\n clear(): void {\n this.hydrate({});\n }\n\n hasPermission(\n codes: PermissionCode | PermissionCode[],\n options: CheckOptions = {},\n ): boolean {\n const mode = options.mode ?? 'any';\n return matchCodes(\n this.permissionSet,\n toArray(codes).filter(Boolean),\n mode,\n Boolean(this.state.isSuperAdmin),\n );\n }\n\n hasRole(codes: RoleCode | RoleCode[], options: CheckOptions = {}): boolean {\n const mode = options.mode ?? 'any';\n return matchCodes(\n this.roleSet,\n toArray(codes).filter(Boolean),\n mode,\n Boolean(this.state.isSuperAdmin),\n );\n }\n\n /** Alias of `hasPermission` for template-friendly APIs. */\n can(codes: PermissionCode | PermissionCode[], options?: CheckOptions): boolean {\n return this.hasPermission(codes, options);\n }\n\n subscribe(listener: PermissionListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emit(): void {\n const snapshot = this.getState();\n this.listeners.forEach((listener) => listener(snapshot));\n }\n}\n\nexport function createPermissionStore(\n initial?: Partial<PermissionState>,\n): PermissionStore {\n return new PermissionStore(initial);\n}\n","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';\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: '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 MenuResource = {\n resourceId: string;\n /** 上级菜单 ID;无上级时为 null */\n parentId: string | null;\n /**\n * 菜单层级:无上级(根)为 1,其余为上级 depth + 1\n */\n depth: number;\n type: MenuResourceType;\n name: string;\n identification: string;\n permissionPointIds: string[];\n /** 关联权限点名称(列表展示用,后端可能返回) */\n permissionPointNames?: string[];\n status: ResourceStatus;\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\nexport type CreateMenuResourceBody = MenuResourceFormValues & {\n resourceId: string;\n};\n\nexport type UpdateMenuResourceBody = Partial<MenuResourceFormValues>;\n\nexport type FetchMenuResourcesParams = {\n pagination?: ListPaginationParams;\n};\n\nexport type MenuResourceListResult = {\n records: MenuResource[];\n pageToken: string;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n};\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_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 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 /** 拉取权限点(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 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 permissionPointIds = toStringArray(\n row.permissionPointIds ??\n row.permission_point_ids ??\n row.permissionPoints ??\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 : undefined;\n\n const rawParentId = row.parentId ?? row.parent_id;\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 return {\n resourceId: String(resourceId),\n parentId,\n depth,\n type: toMenuType(row.type),\n name: String(row.name ?? ''),\n identification: String(row.identification ?? row.identity ?? row.path ?? ''),\n permissionPointIds,\n permissionPointNames,\n status: toResourceStatus(row.status),\n };\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(type: string, params?: { pagination?: FetchAuthorizationResourcesParams['pagination'] }): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'type', type);\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 };\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 };\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, params),\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 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"]}
|
|
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"],"names":["text"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n CheckOptions,\n MatchMode,\n PermissionChecker,\n PermissionCode,\n PermissionListener,\n PermissionState,\n RoleCode,\n} from './types';\n\nconst DEFAULT_STATE: PermissionState = {\n permissions: [],\n roles: [],\n isSuperAdmin: false,\n};\n\nfunction toArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction matchCodes(\n owned: Set<string>,\n required: string[],\n mode: MatchMode,\n isSuperAdmin: boolean,\n): boolean {\n if (isSuperAdmin) return true;\n if (required.length === 0) return true;\n\n if (mode === 'all') {\n return required.every((code) => owned.has(code));\n }\n\n return required.some((code) => owned.has(code));\n}\n\n/**\n * Mutable permission store shared by React / Vue adapters.\n * Framework-agnostic — safe to use in Node, browser, or any UI lib.\n */\nexport class PermissionStore implements PermissionChecker {\n private state: PermissionState;\n private permissionSet: Set<string>;\n private roleSet: Set<string>;\n private listeners = new Set<PermissionListener>();\n\n constructor(initial?: Partial<PermissionState>) {\n this.state = {\n ...DEFAULT_STATE,\n ...initial,\n permissions: initial?.permissions ?? [],\n roles: initial?.roles ?? [],\n };\n this.permissionSet = new Set(this.state.permissions);\n this.roleSet = new Set(this.state.roles);\n }\n\n getState(): PermissionState {\n return {\n permissions: [...this.state.permissions],\n roles: [...this.state.roles],\n isSuperAdmin: this.state.isSuperAdmin,\n };\n }\n\n setState(next: Partial<PermissionState>): void {\n this.state = {\n permissions: next.permissions ?? this.state.permissions,\n roles: next.roles ?? this.state.roles,\n isSuperAdmin: next.isSuperAdmin ?? this.state.isSuperAdmin,\n };\n this.permissionSet = new Set(this.state.permissions);\n this.roleSet = new Set(this.state.roles);\n this.emit();\n }\n\n setPermissions(permissions: PermissionCode[]): void {\n this.setState({ permissions });\n }\n\n setRoles(roles: RoleCode[]): void {\n this.setState({ roles });\n }\n\n setSuperAdmin(isSuperAdmin: boolean): void {\n this.setState({ isSuperAdmin });\n }\n\n /** Replace permissions, roles and super-admin flag in one shot (typical after login). */\n hydrate(payload: Partial<PermissionState>): void {\n this.setState({\n permissions: payload.permissions ?? [],\n roles: payload.roles ?? [],\n isSuperAdmin: payload.isSuperAdmin ?? false,\n });\n }\n\n /** Clear all authz data (typical after logout). */\n clear(): void {\n this.hydrate({});\n }\n\n hasPermission(\n codes: PermissionCode | PermissionCode[],\n options: CheckOptions = {},\n ): boolean {\n const mode = options.mode ?? 'any';\n return matchCodes(\n this.permissionSet,\n toArray(codes).filter(Boolean),\n mode,\n Boolean(this.state.isSuperAdmin),\n );\n }\n\n hasRole(codes: RoleCode | RoleCode[], options: CheckOptions = {}): boolean {\n const mode = options.mode ?? 'any';\n return matchCodes(\n this.roleSet,\n toArray(codes).filter(Boolean),\n mode,\n Boolean(this.state.isSuperAdmin),\n );\n }\n\n /** Alias of `hasPermission` for template-friendly APIs. */\n can(codes: PermissionCode | PermissionCode[], options?: CheckOptions): boolean {\n return this.hasPermission(codes, options);\n }\n\n subscribe(listener: PermissionListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emit(): void {\n const snapshot = this.getState();\n this.listeners.forEach((listener) => listener(snapshot));\n }\n}\n\nexport function createPermissionStore(\n initial?: Partial<PermissionState>,\n): PermissionStore {\n return new PermissionStore(initial);\n}\n","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';\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: '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 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 /** 关联权限点名称(列表展示用,后端可能返回) */\n permissionPointNames?: string[];\n status: ResourceStatus;\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\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 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 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 permissionPointIds = toStringArray(\n row.permissionPointIds ??\n row.permission_point_ids ??\n row.permissionPoints ??\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 : undefined;\n\n const rawParentId = row.parentId ?? row.parent_id;\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 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 permissionPointNames,\n status: toResourceStatus(row.status),\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 };\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 };\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 },\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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -154,6 +154,10 @@ type MenuResource = {
|
|
|
154
154
|
* 菜单层级:无上级(根)为 1,其余为上级 depth + 1
|
|
155
155
|
*/
|
|
156
156
|
depth: number;
|
|
157
|
+
/**
|
|
158
|
+
* 是否叶子节点:`1` 表示无下级菜单,不可再展开
|
|
159
|
+
*/
|
|
160
|
+
leaf: number;
|
|
157
161
|
type: MenuResourceType;
|
|
158
162
|
name: string;
|
|
159
163
|
identification: string;
|
|
@@ -178,6 +182,8 @@ type CreateMenuResourceBody = MenuResourceFormValues & {
|
|
|
178
182
|
};
|
|
179
183
|
type UpdateMenuResourceBody = Partial<MenuResourceFormValues>;
|
|
180
184
|
type FetchMenuResourcesParams = {
|
|
185
|
+
/** 列表默认传 1,只拉根层 */
|
|
186
|
+
depth?: number;
|
|
181
187
|
pagination?: ListPaginationParams;
|
|
182
188
|
};
|
|
183
189
|
type MenuResourceListResult = {
|
|
@@ -186,6 +192,9 @@ type MenuResourceListResult = {
|
|
|
186
192
|
hasPreviousPage: boolean;
|
|
187
193
|
hasNextPage: boolean;
|
|
188
194
|
};
|
|
195
|
+
/** leaf === 1 表示无下级 */
|
|
196
|
+
declare const MENU_LEAF_YES = 1;
|
|
197
|
+
declare const MENU_LEAF_NO = 0;
|
|
189
198
|
declare const RESOURCE_TYPE_API: ApiResourceType;
|
|
190
199
|
declare const MENU_TYPE_PAGE: MenuResourceType;
|
|
191
200
|
declare const MENU_TYPE_MENU: MenuResourceType;
|
|
@@ -239,6 +248,8 @@ type AuthorizationResourceApi = {
|
|
|
239
248
|
};
|
|
240
249
|
type MenuResourceApi = {
|
|
241
250
|
list: (params?: FetchMenuResourcesParams, signal?: AbortSignal) => Promise<MenuResourceListResult>;
|
|
251
|
+
/** 展开下级:GET /authorization-resources/{resource-id}/sub-resources */
|
|
252
|
+
listSubResources: (resourceId: string, signal?: AbortSignal) => Promise<MenuResource[]>;
|
|
242
253
|
/** 拉取权限点(type=api),供菜单表单多选 */
|
|
243
254
|
listPermissionPoints: (params?: FetchAuthorizationResourcesParams, signal?: AbortSignal) => Promise<AuthorizationResourceListResult>;
|
|
244
255
|
create: (values: MenuResourceFormValues, signal?: AbortSignal) => Promise<unknown>;
|
|
@@ -247,6 +258,10 @@ type MenuResourceApi = {
|
|
|
247
258
|
};
|
|
248
259
|
declare function mapAuthorizationResource(item: unknown): AuthorizationResource | null;
|
|
249
260
|
declare function mapMenuResource(item: unknown): MenuResource | null;
|
|
261
|
+
/**
|
|
262
|
+
* leaf === 1 表示无下级菜单。
|
|
263
|
+
*/
|
|
264
|
+
declare function isMenuLeaf(row: Pick<MenuResource, 'leaf'>): boolean;
|
|
250
265
|
/**
|
|
251
266
|
* 根据上级菜单计算 depth:无上级为 1,否则为上级 depth + 1。
|
|
252
267
|
*/
|
|
@@ -274,4 +289,4 @@ declare function appendQueryParam(parts: string[], key: string, value: string):
|
|
|
274
289
|
declare function extractPagination(payload: unknown): ListPaginationResult;
|
|
275
290
|
declare function extractRecords(payload: unknown): unknown[];
|
|
276
291
|
|
|
277
|
-
export { type ApiResourceType, type AuthorizationResource, type AuthorizationResourceApi, type AuthorizationResourceFormValues, type AuthorizationResourceListResult, type CheckOptions, type CreateAuthorizationResourceBody, type CreateDefaultResourceRequestOptions, type CreateMenuResourceBody, type FetchAuthorizationResourcesParams, type FetchMenuResourcesParams, type HttpMethod, type ListPaginationParams, type ListPaginationResult, MENU_LIST_TYPE_PARAM, MENU_TYPE_BUTTON, MENU_TYPE_LABEL, MENU_TYPE_MENU, MENU_TYPE_OPTIONS, MENU_TYPE_PAGE, MENU_VISIBILITY_OPTIONS, type MatchMode, type MenuResource, type MenuResourceApi, type MenuResourceFormValues, type MenuResourceListResult, type MenuResourceType, type PageDirection, type PermissionChecker, type PermissionCode, type PermissionListener, type PermissionState, PermissionStore, RESOURCE_PRIVATE_OPTIONS, RESOURCE_STATUS_DISABLED, RESOURCE_STATUS_ENABLED, RESOURCE_STATUS_OPTIONS, RESOURCE_TYPE_API, ROOT_MENU_DEPTH, ROOT_PARENT_ID, type ResourceHttpRequest, type ResourceRequestOptions, type ResourceStatus, type ResourceType, type RoleCode, SYSTEM_ADMIN_DEFAULT_KEY, SYSTEM_ADMIN_MENU, type SystemAdminMenuGroup, type SystemAdminMenuKey, type SystemAdminSubMenu, type UpdateAuthorizationResourceBody, type UpdateMenuResourceBody, appendQueryParam, buildCreateBody, buildCreateMenuBody, buildUpdateBody, buildUpdateMenuBody, createAuthorizationResourceApi, createDefaultResourceRequest, createMenuResourceApi, createPermissionStore, extractPagination, extractRecords, getAppClientId, getDeviceWorkerId, mapAuthorizationResource, mapMenuResource, resolveMenuDepth, snowyflake };
|
|
292
|
+
export { type ApiResourceType, type AuthorizationResource, type AuthorizationResourceApi, type AuthorizationResourceFormValues, type AuthorizationResourceListResult, type CheckOptions, type CreateAuthorizationResourceBody, type CreateDefaultResourceRequestOptions, type CreateMenuResourceBody, type FetchAuthorizationResourcesParams, type FetchMenuResourcesParams, type HttpMethod, type ListPaginationParams, type ListPaginationResult, MENU_LEAF_NO, MENU_LEAF_YES, MENU_LIST_TYPE_PARAM, MENU_TYPE_BUTTON, MENU_TYPE_LABEL, MENU_TYPE_MENU, MENU_TYPE_OPTIONS, MENU_TYPE_PAGE, MENU_VISIBILITY_OPTIONS, type MatchMode, type MenuResource, type MenuResourceApi, type MenuResourceFormValues, type MenuResourceListResult, type MenuResourceType, type PageDirection, type PermissionChecker, type PermissionCode, type PermissionListener, type PermissionState, PermissionStore, RESOURCE_PRIVATE_OPTIONS, RESOURCE_STATUS_DISABLED, RESOURCE_STATUS_ENABLED, RESOURCE_STATUS_OPTIONS, RESOURCE_TYPE_API, ROOT_MENU_DEPTH, ROOT_PARENT_ID, type ResourceHttpRequest, type ResourceRequestOptions, type ResourceStatus, type ResourceType, type RoleCode, SYSTEM_ADMIN_DEFAULT_KEY, SYSTEM_ADMIN_MENU, type SystemAdminMenuGroup, type SystemAdminMenuKey, type SystemAdminSubMenu, type UpdateAuthorizationResourceBody, type UpdateMenuResourceBody, appendQueryParam, buildCreateBody, buildCreateMenuBody, buildUpdateBody, buildUpdateMenuBody, createAuthorizationResourceApi, createDefaultResourceRequest, createMenuResourceApi, createPermissionStore, extractPagination, extractRecords, getAppClientId, getDeviceWorkerId, isMenuLeaf, mapAuthorizationResource, mapMenuResource, resolveMenuDepth, snowyflake };
|
package/dist/index.d.ts
CHANGED
|
@@ -154,6 +154,10 @@ type MenuResource = {
|
|
|
154
154
|
* 菜单层级:无上级(根)为 1,其余为上级 depth + 1
|
|
155
155
|
*/
|
|
156
156
|
depth: number;
|
|
157
|
+
/**
|
|
158
|
+
* 是否叶子节点:`1` 表示无下级菜单,不可再展开
|
|
159
|
+
*/
|
|
160
|
+
leaf: number;
|
|
157
161
|
type: MenuResourceType;
|
|
158
162
|
name: string;
|
|
159
163
|
identification: string;
|
|
@@ -178,6 +182,8 @@ type CreateMenuResourceBody = MenuResourceFormValues & {
|
|
|
178
182
|
};
|
|
179
183
|
type UpdateMenuResourceBody = Partial<MenuResourceFormValues>;
|
|
180
184
|
type FetchMenuResourcesParams = {
|
|
185
|
+
/** 列表默认传 1,只拉根层 */
|
|
186
|
+
depth?: number;
|
|
181
187
|
pagination?: ListPaginationParams;
|
|
182
188
|
};
|
|
183
189
|
type MenuResourceListResult = {
|
|
@@ -186,6 +192,9 @@ type MenuResourceListResult = {
|
|
|
186
192
|
hasPreviousPage: boolean;
|
|
187
193
|
hasNextPage: boolean;
|
|
188
194
|
};
|
|
195
|
+
/** leaf === 1 表示无下级 */
|
|
196
|
+
declare const MENU_LEAF_YES = 1;
|
|
197
|
+
declare const MENU_LEAF_NO = 0;
|
|
189
198
|
declare const RESOURCE_TYPE_API: ApiResourceType;
|
|
190
199
|
declare const MENU_TYPE_PAGE: MenuResourceType;
|
|
191
200
|
declare const MENU_TYPE_MENU: MenuResourceType;
|
|
@@ -239,6 +248,8 @@ type AuthorizationResourceApi = {
|
|
|
239
248
|
};
|
|
240
249
|
type MenuResourceApi = {
|
|
241
250
|
list: (params?: FetchMenuResourcesParams, signal?: AbortSignal) => Promise<MenuResourceListResult>;
|
|
251
|
+
/** 展开下级:GET /authorization-resources/{resource-id}/sub-resources */
|
|
252
|
+
listSubResources: (resourceId: string, signal?: AbortSignal) => Promise<MenuResource[]>;
|
|
242
253
|
/** 拉取权限点(type=api),供菜单表单多选 */
|
|
243
254
|
listPermissionPoints: (params?: FetchAuthorizationResourcesParams, signal?: AbortSignal) => Promise<AuthorizationResourceListResult>;
|
|
244
255
|
create: (values: MenuResourceFormValues, signal?: AbortSignal) => Promise<unknown>;
|
|
@@ -247,6 +258,10 @@ type MenuResourceApi = {
|
|
|
247
258
|
};
|
|
248
259
|
declare function mapAuthorizationResource(item: unknown): AuthorizationResource | null;
|
|
249
260
|
declare function mapMenuResource(item: unknown): MenuResource | null;
|
|
261
|
+
/**
|
|
262
|
+
* leaf === 1 表示无下级菜单。
|
|
263
|
+
*/
|
|
264
|
+
declare function isMenuLeaf(row: Pick<MenuResource, 'leaf'>): boolean;
|
|
250
265
|
/**
|
|
251
266
|
* 根据上级菜单计算 depth:无上级为 1,否则为上级 depth + 1。
|
|
252
267
|
*/
|
|
@@ -274,4 +289,4 @@ declare function appendQueryParam(parts: string[], key: string, value: string):
|
|
|
274
289
|
declare function extractPagination(payload: unknown): ListPaginationResult;
|
|
275
290
|
declare function extractRecords(payload: unknown): unknown[];
|
|
276
291
|
|
|
277
|
-
export { type ApiResourceType, type AuthorizationResource, type AuthorizationResourceApi, type AuthorizationResourceFormValues, type AuthorizationResourceListResult, type CheckOptions, type CreateAuthorizationResourceBody, type CreateDefaultResourceRequestOptions, type CreateMenuResourceBody, type FetchAuthorizationResourcesParams, type FetchMenuResourcesParams, type HttpMethod, type ListPaginationParams, type ListPaginationResult, MENU_LIST_TYPE_PARAM, MENU_TYPE_BUTTON, MENU_TYPE_LABEL, MENU_TYPE_MENU, MENU_TYPE_OPTIONS, MENU_TYPE_PAGE, MENU_VISIBILITY_OPTIONS, type MatchMode, type MenuResource, type MenuResourceApi, type MenuResourceFormValues, type MenuResourceListResult, type MenuResourceType, type PageDirection, type PermissionChecker, type PermissionCode, type PermissionListener, type PermissionState, PermissionStore, RESOURCE_PRIVATE_OPTIONS, RESOURCE_STATUS_DISABLED, RESOURCE_STATUS_ENABLED, RESOURCE_STATUS_OPTIONS, RESOURCE_TYPE_API, ROOT_MENU_DEPTH, ROOT_PARENT_ID, type ResourceHttpRequest, type ResourceRequestOptions, type ResourceStatus, type ResourceType, type RoleCode, SYSTEM_ADMIN_DEFAULT_KEY, SYSTEM_ADMIN_MENU, type SystemAdminMenuGroup, type SystemAdminMenuKey, type SystemAdminSubMenu, type UpdateAuthorizationResourceBody, type UpdateMenuResourceBody, appendQueryParam, buildCreateBody, buildCreateMenuBody, buildUpdateBody, buildUpdateMenuBody, createAuthorizationResourceApi, createDefaultResourceRequest, createMenuResourceApi, createPermissionStore, extractPagination, extractRecords, getAppClientId, getDeviceWorkerId, mapAuthorizationResource, mapMenuResource, resolveMenuDepth, snowyflake };
|
|
292
|
+
export { type ApiResourceType, type AuthorizationResource, type AuthorizationResourceApi, type AuthorizationResourceFormValues, type AuthorizationResourceListResult, type CheckOptions, type CreateAuthorizationResourceBody, type CreateDefaultResourceRequestOptions, type CreateMenuResourceBody, type FetchAuthorizationResourcesParams, type FetchMenuResourcesParams, type HttpMethod, type ListPaginationParams, type ListPaginationResult, MENU_LEAF_NO, MENU_LEAF_YES, MENU_LIST_TYPE_PARAM, MENU_TYPE_BUTTON, MENU_TYPE_LABEL, MENU_TYPE_MENU, MENU_TYPE_OPTIONS, MENU_TYPE_PAGE, MENU_VISIBILITY_OPTIONS, type MatchMode, type MenuResource, type MenuResourceApi, type MenuResourceFormValues, type MenuResourceListResult, type MenuResourceType, type PageDirection, type PermissionChecker, type PermissionCode, type PermissionListener, type PermissionState, PermissionStore, RESOURCE_PRIVATE_OPTIONS, RESOURCE_STATUS_DISABLED, RESOURCE_STATUS_ENABLED, RESOURCE_STATUS_OPTIONS, RESOURCE_TYPE_API, ROOT_MENU_DEPTH, ROOT_PARENT_ID, type ResourceHttpRequest, type ResourceRequestOptions, type ResourceStatus, type ResourceType, type RoleCode, SYSTEM_ADMIN_DEFAULT_KEY, SYSTEM_ADMIN_MENU, type SystemAdminMenuGroup, type SystemAdminMenuKey, type SystemAdminSubMenu, type UpdateAuthorizationResourceBody, type UpdateMenuResourceBody, appendQueryParam, buildCreateBody, buildCreateMenuBody, buildUpdateBody, buildUpdateMenuBody, createAuthorizationResourceApi, createDefaultResourceRequest, createMenuResourceApi, createPermissionStore, extractPagination, extractRecords, getAppClientId, getDeviceWorkerId, isMenuLeaf, mapAuthorizationResource, mapMenuResource, resolveMenuDepth, snowyflake };
|
package/dist/index.js
CHANGED
|
@@ -191,6 +191,8 @@ var SYSTEM_ADMIN_MENU = {
|
|
|
191
191
|
var SYSTEM_ADMIN_DEFAULT_KEY = "menu";
|
|
192
192
|
|
|
193
193
|
// src/resources/types.ts
|
|
194
|
+
var MENU_LEAF_YES = 1;
|
|
195
|
+
var MENU_LEAF_NO = 0;
|
|
194
196
|
var RESOURCE_TYPE_API = "api";
|
|
195
197
|
var MENU_TYPE_PAGE = "page";
|
|
196
198
|
var MENU_TYPE_MENU = "menu";
|
|
@@ -342,10 +344,13 @@ function mapMenuResource(item) {
|
|
|
342
344
|
const rawDepth = row.depth;
|
|
343
345
|
const parsedDepth = Number(rawDepth);
|
|
344
346
|
const depth = Number.isFinite(parsedDepth) && parsedDepth > 0 ? Math.floor(parsedDepth) : parentId ? ROOT_MENU_DEPTH + 1 : ROOT_MENU_DEPTH;
|
|
347
|
+
const rawLeaf = row.leaf;
|
|
348
|
+
const leaf = rawLeaf === true || rawLeaf === 1 || rawLeaf === "1" || String(rawLeaf).toLowerCase() === "true" ? MENU_LEAF_YES : Number(rawLeaf) === MENU_LEAF_YES ? MENU_LEAF_YES : 0;
|
|
345
349
|
return {
|
|
346
350
|
resourceId: String(resourceId),
|
|
347
351
|
parentId,
|
|
348
352
|
depth,
|
|
353
|
+
leaf,
|
|
349
354
|
type: toMenuType(row.type),
|
|
350
355
|
name: String(row.name ?? ""),
|
|
351
356
|
identification: String(row.identification ?? row.identity ?? row.path ?? ""),
|
|
@@ -354,6 +359,9 @@ function mapMenuResource(item) {
|
|
|
354
359
|
status: toResourceStatus(row.status)
|
|
355
360
|
};
|
|
356
361
|
}
|
|
362
|
+
function isMenuLeaf(row) {
|
|
363
|
+
return Number(row.leaf) === MENU_LEAF_YES;
|
|
364
|
+
}
|
|
357
365
|
function resolveMenuDepth(parentId, menus) {
|
|
358
366
|
if (!parentId) return ROOT_MENU_DEPTH;
|
|
359
367
|
const parent = menus.find((item) => item.resourceId === parentId);
|
|
@@ -363,6 +371,9 @@ function resolveMenuDepth(parentId, menus) {
|
|
|
363
371
|
function buildListUrl(type, params) {
|
|
364
372
|
const parts = [];
|
|
365
373
|
appendQueryParam(parts, "type", type);
|
|
374
|
+
if (params?.depth !== void 0 && params?.depth !== null && String(params.depth) !== "") {
|
|
375
|
+
appendQueryParam(parts, "depth", String(params.depth));
|
|
376
|
+
}
|
|
366
377
|
appendQueryParam(parts, "page-token", params?.pagination?.pageToken ?? "");
|
|
367
378
|
appendQueryParam(parts, "page-size", params?.pagination?.pageSize ?? "20");
|
|
368
379
|
appendQueryParam(parts, "page-direction", params?.pagination?.pageDirection ?? "current");
|
|
@@ -460,7 +471,10 @@ function createMenuResourceApi(request) {
|
|
|
460
471
|
async list(params, signal) {
|
|
461
472
|
const json = await request({
|
|
462
473
|
method: "GET",
|
|
463
|
-
url: buildListUrl(MENU_LIST_TYPE_PARAM,
|
|
474
|
+
url: buildListUrl(MENU_LIST_TYPE_PARAM, {
|
|
475
|
+
pagination: params?.pagination,
|
|
476
|
+
depth: params?.depth ?? ROOT_MENU_DEPTH
|
|
477
|
+
}),
|
|
464
478
|
signal
|
|
465
479
|
});
|
|
466
480
|
const records = extractRecords(json).map(mapMenuResource).filter((item) => item !== null);
|
|
@@ -470,6 +484,14 @@ function createMenuResourceApi(request) {
|
|
|
470
484
|
...pagination
|
|
471
485
|
};
|
|
472
486
|
},
|
|
487
|
+
async listSubResources(resourceId, signal) {
|
|
488
|
+
const json = await request({
|
|
489
|
+
method: "GET",
|
|
490
|
+
url: `/authorization-resources/${encodeURIComponent(resourceId)}/sub-resources`,
|
|
491
|
+
signal
|
|
492
|
+
});
|
|
493
|
+
return extractRecords(json).map(mapMenuResource).filter((item) => item !== null);
|
|
494
|
+
},
|
|
473
495
|
listPermissionPoints(params, signal) {
|
|
474
496
|
return permissionApi.list(params, signal);
|
|
475
497
|
},
|
|
@@ -537,6 +559,6 @@ function createDefaultResourceRequest(options = {}) {
|
|
|
537
559
|
};
|
|
538
560
|
}
|
|
539
561
|
|
|
540
|
-
export { MENU_LIST_TYPE_PARAM, MENU_TYPE_BUTTON, MENU_TYPE_LABEL, MENU_TYPE_MENU, MENU_TYPE_OPTIONS, MENU_TYPE_PAGE, MENU_VISIBILITY_OPTIONS, PermissionStore, RESOURCE_PRIVATE_OPTIONS, RESOURCE_STATUS_DISABLED, RESOURCE_STATUS_ENABLED, RESOURCE_STATUS_OPTIONS, RESOURCE_TYPE_API, ROOT_MENU_DEPTH, ROOT_PARENT_ID, SYSTEM_ADMIN_DEFAULT_KEY, SYSTEM_ADMIN_MENU, appendQueryParam, buildCreateBody, buildCreateMenuBody, buildUpdateBody, buildUpdateMenuBody, createAuthorizationResourceApi, createDefaultResourceRequest, createMenuResourceApi, createPermissionStore, extractPagination, extractRecords, getAppClientId, getDeviceWorkerId, mapAuthorizationResource, mapMenuResource, resolveMenuDepth, snowyflake };
|
|
562
|
+
export { MENU_LEAF_NO, MENU_LEAF_YES, MENU_LIST_TYPE_PARAM, MENU_TYPE_BUTTON, MENU_TYPE_LABEL, MENU_TYPE_MENU, MENU_TYPE_OPTIONS, MENU_TYPE_PAGE, MENU_VISIBILITY_OPTIONS, PermissionStore, RESOURCE_PRIVATE_OPTIONS, RESOURCE_STATUS_DISABLED, RESOURCE_STATUS_ENABLED, RESOURCE_STATUS_OPTIONS, RESOURCE_TYPE_API, ROOT_MENU_DEPTH, ROOT_PARENT_ID, SYSTEM_ADMIN_DEFAULT_KEY, SYSTEM_ADMIN_MENU, appendQueryParam, buildCreateBody, buildCreateMenuBody, buildUpdateBody, buildUpdateMenuBody, createAuthorizationResourceApi, createDefaultResourceRequest, createMenuResourceApi, createPermissionStore, extractPagination, extractRecords, getAppClientId, getDeviceWorkerId, isMenuLeaf, mapAuthorizationResource, mapMenuResource, resolveMenuDepth, snowyflake };
|
|
541
563
|
//# sourceMappingURL=index.js.map
|
|
542
564
|
//# sourceMappingURL=index.js.map
|