From 516de92ee23648606ce97a879790c8ca480e0cf0 Mon Sep 17 00:00:00 2001 From: aaaaaajie Date: Thu, 13 Mar 2025 17:16:33 +0800 Subject: [PATCH] fix: merge acl action params appends bug --- .../core/acl/src/__tests__/acl-role.test.ts | 28 +++++++++++++++++++ packages/core/acl/src/utils/acl-role.ts | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/core/acl/src/__tests__/acl-role.test.ts b/packages/core/acl/src/__tests__/acl-role.test.ts index 1520a0b73e..88b914361e 100644 --- a/packages/core/acl/src/__tests__/acl-role.test.ts +++ b/packages/core/acl/src/__tests__/acl-role.test.ts @@ -397,6 +397,34 @@ describe('multiple roles merge', () => { }, }); }); + test('should union appends(params={ appends: [a,b]}) when appends = [a,b], appends =[]', () => { + acl.setAvailableAction('update'); + acl.define({ + role: 'role1', + actions: { + 'posts:update': { + appends: ['a', 'b'], + }, + }, + }); + acl.define({ + role: 'role2', + actions: { + 'posts:update': { + appends: [], + }, + }, + }); + const canResult = acl.can({ resource: 'posts', action: 'update', roles: ['role1', 'role2'] }); + expect(canResult).toStrictEqual({ + role: 'role1', + resource: 'posts', + action: 'update', + params: { + appends: expect.arrayContaining(['a', 'b']), + }, + }); + }); }); describe('filter & fields merge', () => { diff --git a/packages/core/acl/src/utils/acl-role.ts b/packages/core/acl/src/utils/acl-role.ts index c9cbb39f2c..406ce36dec 100644 --- a/packages/core/acl/src/utils/acl-role.ts +++ b/packages/core/acl/src/utils/acl-role.ts @@ -184,7 +184,7 @@ export function mergeAclActionParams(sourceParams, targetParams) { }, fields: andMerge, whitelist: andMerge, - appends: andMerge, + appends: 'union', }); removeEmptyParams(mergedParams); return mergedParams;