Skip to content

Commit 7e3da6f

Browse files
iqbalhasandevgithub-actions[bot]
authored andcommitted
style: fix code formatting [skip ci]
1 parent 959712d commit 7e3da6f

File tree

3 files changed

+145
-43
lines changed

3 files changed

+145
-43
lines changed

CHANGELOG.md

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,20 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
99

1010
### Fixed
1111

12-
- **Logical operators without spaces**: Fixed issue where logical operators (`||`, `&&`, `|`, `&`) were not working when used without spaces around them (e.g., `properties.view-all||properties.view-own`)
13-
- **Permission names with hyphens**: Updated regex pattern to properly support permission names containing hyphens (e.g., `properties.view-all`, `user-profile.edit`)
14-
- **Operator normalization**: Improved operator normalization logic to prevent double replacement issues
12+
- **Logical operators without spaces**: Fixed issue where logical operators (`||`, `&&`, `|`, `&`)
13+
were not working when used without spaces around them (e.g.,
14+
`properties.view-all||properties.view-own`)
15+
- **Permission names with hyphens**: Updated regex pattern to properly support permission names
16+
containing hyphens (e.g., `properties.view-all`, `user-profile.edit`)
17+
- **Operator normalization**: Improved operator normalization logic to prevent double replacement
18+
issues
1519

1620
### Added
1721

18-
- **Comprehensive test coverage**: Added extensive test suite for logical operators without spaces, covering various edge cases and scenarios
19-
- **Hyphenated permission support**: Full support for permission names with hyphens in logical expressions
22+
- **Comprehensive test coverage**: Added extensive test suite for logical operators without spaces,
23+
covering various edge cases and scenarios
24+
- **Hyphenated permission support**: Full support for permission names with hyphens in logical
25+
expressions
2026

2127
### Technical Details
2228

__tests__/logical-operators-no-spaces.test.tsx

Lines changed: 132 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,15 @@ describe('Logical Operators Without Spaces', () => {
3434
const { result } = renderHook(() => usePermissions());
3535

3636
// Test various OR expressions without spaces
37-
expect(result.current.hasPermission('properties.view-all||properties.view-own')).toBe(true);
38-
expect(result.current.hasPermission('users.create||posts.view')).toBe(false); // Neither permission exists
39-
expect(result.current.hasPermission('properties.view-all||users.create')).toBe(true); // One permission exists
37+
expect(
38+
result.current.hasPermission('properties.view-all||properties.view-own')
39+
).toBe(true);
40+
expect(result.current.hasPermission('users.create||posts.view')).toBe(
41+
false
42+
); // Neither permission exists
43+
expect(
44+
result.current.hasPermission('properties.view-all||users.create')
45+
).toBe(true); // One permission exists
4046
});
4147

4248
it('should handle single | without spaces around operators', () => {
@@ -45,9 +51,15 @@ describe('Logical Operators Without Spaces', () => {
4551
const { result } = renderHook(() => usePermissions());
4652

4753
// Test single | expressions without spaces
48-
expect(result.current.hasPermission('properties.view-all|properties.view-own')).toBe(true);
49-
expect(result.current.hasPermission('properties.view-all|users.create')).toBe(true); // One permission exists
50-
expect(result.current.hasPermission('users.create|posts.view')).toBe(false); // Neither permission exists
54+
expect(
55+
result.current.hasPermission('properties.view-all|properties.view-own')
56+
).toBe(true);
57+
expect(
58+
result.current.hasPermission('properties.view-all|users.create')
59+
).toBe(true); // One permission exists
60+
expect(result.current.hasPermission('users.create|posts.view')).toBe(
61+
false
62+
); // Neither permission exists
5163
});
5264
});
5365

@@ -58,9 +70,15 @@ describe('Logical Operators Without Spaces', () => {
5870
const { result } = renderHook(() => usePermissions());
5971

6072
// Test various AND expressions without spaces
61-
expect(result.current.hasPermission('properties.view-all&&properties.view-own')).toBe(true);
62-
expect(result.current.hasPermission('properties.view-all&&users.create')).toBe(false); // One permission missing
63-
expect(result.current.hasPermission('users.create&&posts.view')).toBe(false); // Both permissions missing
73+
expect(
74+
result.current.hasPermission('properties.view-all&&properties.view-own')
75+
).toBe(true);
76+
expect(
77+
result.current.hasPermission('properties.view-all&&users.create')
78+
).toBe(false); // One permission missing
79+
expect(result.current.hasPermission('users.create&&posts.view')).toBe(
80+
false
81+
); // Both permissions missing
6482
});
6583

6684
it('should handle single & without spaces around operators', () => {
@@ -69,9 +87,15 @@ describe('Logical Operators Without Spaces', () => {
6987
const { result } = renderHook(() => usePermissions());
7088

7189
// Test single & expressions without spaces
72-
expect(result.current.hasPermission('properties.view-all&properties.view-own')).toBe(true);
73-
expect(result.current.hasPermission('properties.view-all&users.create')).toBe(false); // One permission missing
74-
expect(result.current.hasPermission('users.create&posts.view')).toBe(false); // Both permissions missing
90+
expect(
91+
result.current.hasPermission('properties.view-all&properties.view-own')
92+
).toBe(true);
93+
expect(
94+
result.current.hasPermission('properties.view-all&users.create')
95+
).toBe(false); // One permission missing
96+
expect(result.current.hasPermission('users.create&posts.view')).toBe(
97+
false
98+
); // Both permissions missing
7599
});
76100
});
77101

@@ -82,9 +106,19 @@ describe('Logical Operators Without Spaces', () => {
82106
const { result } = renderHook(() => usePermissions());
83107

84108
// Test complex expressions without spaces
85-
expect(result.current.hasPermission('(properties.view-all||users.create)&&admin.access')).toBe(true);
86-
expect(result.current.hasPermission('(properties.view-all||users.create)&&admin.delete')).toBe(false);
87-
expect(result.current.hasPermission('(users.create||posts.view)&&admin.access')).toBe(false);
109+
expect(
110+
result.current.hasPermission(
111+
'(properties.view-all||users.create)&&admin.access'
112+
)
113+
).toBe(true);
114+
expect(
115+
result.current.hasPermission(
116+
'(properties.view-all||users.create)&&admin.delete'
117+
)
118+
).toBe(false);
119+
expect(
120+
result.current.hasPermission('(users.create||posts.view)&&admin.access')
121+
).toBe(false);
88122
});
89123

90124
it('should handle mixed operators without spaces', () => {
@@ -93,34 +127,72 @@ describe('Logical Operators Without Spaces', () => {
93127
const { result } = renderHook(() => usePermissions());
94128

95129
// Test mixed operators without spaces
96-
expect(result.current.hasPermission('properties.view-all&&admin.access||reports.read')).toBe(true);
97-
expect(result.current.hasPermission('properties.view-all&admin.access|reports.read')).toBe(true);
98-
expect(result.current.hasPermission('users.create&&admin.access||reports.read')).toBe(true); // reports.read exists
130+
expect(
131+
result.current.hasPermission(
132+
'properties.view-all&&admin.access||reports.read'
133+
)
134+
).toBe(true);
135+
expect(
136+
result.current.hasPermission(
137+
'properties.view-all&admin.access|reports.read'
138+
)
139+
).toBe(true);
140+
expect(
141+
result.current.hasPermission('users.create&&admin.access||reports.read')
142+
).toBe(true); // reports.read exists
99143
});
100144
});
101145

102146
describe('Permission names with hyphens', () => {
103147
it('should handle permission names with hyphens in expressions without spaces', () => {
104-
mockPageProps(['user-profile.edit', 'api-access.read', 'system-config.update']);
148+
mockPageProps([
149+
'user-profile.edit',
150+
'api-access.read',
151+
'system-config.update',
152+
]);
105153

106154
const { result } = renderHook(() => usePermissions());
107155

108156
// Test hyphenated permission names without spaces
109-
expect(result.current.hasPermission('user-profile.edit||api-access.read')).toBe(true);
110-
expect(result.current.hasPermission('user-profile.edit&&api-access.read')).toBe(true);
111-
expect(result.current.hasPermission('user-profile.edit&&system-config.update')).toBe(true);
112-
expect(result.current.hasPermission('user-profile.edit&&users.create')).toBe(false); // users.create doesn't exist
157+
expect(
158+
result.current.hasPermission('user-profile.edit||api-access.read')
159+
).toBe(true);
160+
expect(
161+
result.current.hasPermission('user-profile.edit&&api-access.read')
162+
).toBe(true);
163+
expect(
164+
result.current.hasPermission('user-profile.edit&&system-config.update')
165+
).toBe(true);
166+
expect(
167+
result.current.hasPermission('user-profile.edit&&users.create')
168+
).toBe(false); // users.create doesn't exist
113169
});
114170

115171
it('should handle complex hyphenated permission expressions', () => {
116-
mockPageProps(['user-profile.edit', 'api-access.read', 'admin-panel.access']);
172+
mockPageProps([
173+
'user-profile.edit',
174+
'api-access.read',
175+
'admin-panel.access',
176+
]);
117177

118178
const { result } = renderHook(() => usePermissions());
119179

120180
// Test complex expressions with hyphenated permissions
121-
expect(result.current.hasPermission('(user-profile.edit||api-access.read)&&admin-panel.access')).toBe(true);
122-
expect(result.current.hasPermission('user-profile.edit&&(api-access.read||system-config.update)')).toBe(true);
123-
expect(result.current.hasPermission('(user-profile.edit||api-access.read)&&system-config.update')).toBe(false);
181+
expect(
182+
result.current.hasPermission(
183+
'(user-profile.edit||api-access.read)&&admin-panel.access'
184+
)
185+
).toBe(true);
186+
expect(
187+
result.current.hasPermission(
188+
'user-profile.edit&&(api-access.read||system-config.update)'
189+
)
190+
).toBe(true);
191+
expect(
192+
result.current.hasPermission(
193+
'(user-profile.edit||api-access.read)&&system-config.update'
194+
)
195+
).toBe(false);
124196
});
125197
});
126198

@@ -131,12 +203,24 @@ describe('Logical Operators Without Spaces', () => {
131203
const { result } = renderHook(() => usePermissions());
132204

133205
// Test boolean literals without spaces
134-
expect(result.current.hasPermission('true||properties.view-all')).toBe(true);
135-
expect(result.current.hasPermission('false||properties.view-all')).toBe(true);
136-
expect(result.current.hasPermission('true&&properties.view-all')).toBe(true);
137-
expect(result.current.hasPermission('false&&properties.view-all')).toBe(false);
138-
expect(result.current.hasPermission('properties.view-all||true')).toBe(true);
139-
expect(result.current.hasPermission('properties.view-all&&false')).toBe(false);
206+
expect(result.current.hasPermission('true||properties.view-all')).toBe(
207+
true
208+
);
209+
expect(result.current.hasPermission('false||properties.view-all')).toBe(
210+
true
211+
);
212+
expect(result.current.hasPermission('true&&properties.view-all')).toBe(
213+
true
214+
);
215+
expect(result.current.hasPermission('false&&properties.view-all')).toBe(
216+
false
217+
);
218+
expect(result.current.hasPermission('properties.view-all||true')).toBe(
219+
true
220+
);
221+
expect(result.current.hasPermission('properties.view-all&&false')).toBe(
222+
false
223+
);
140224
});
141225
});
142226

@@ -147,8 +231,16 @@ describe('Logical Operators Without Spaces', () => {
147231
const { result } = renderHook(() => usePermissions());
148232

149233
// These should be handled gracefully (though they're not valid expressions)
150-
expect(result.current.hasPermission('properties.view-all||||properties.view-own')).toBe(false); // Invalid
151-
expect(result.current.hasPermission('properties.view-all&&&&properties.view-own')).toBe(false); // Invalid
234+
expect(
235+
result.current.hasPermission(
236+
'properties.view-all||||properties.view-own'
237+
)
238+
).toBe(false); // Invalid
239+
expect(
240+
result.current.hasPermission(
241+
'properties.view-all&&&&properties.view-own'
242+
)
243+
).toBe(false); // Invalid
152244
});
153245

154246
it('should handle expressions starting or ending with operators', () => {
@@ -166,7 +258,11 @@ describe('Logical Operators Without Spaces', () => {
166258

167259
describe('Comparison with spaced expressions', () => {
168260
it('should produce the same results with and without spaces', () => {
169-
mockPageProps(['properties.view-all', 'properties.view-own', 'admin.access']);
261+
mockPageProps([
262+
'properties.view-all',
263+
'properties.view-own',
264+
'admin.access',
265+
]);
170266

171267
const { result } = renderHook(() => usePermissions());
172268

hooks/use-permissions.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,9 @@ export function usePermissions(permissions?: string[]) {
9999
// First, add spaces around operators to ensure proper parsing
100100
let jsExpression = expression
101101
.replace(/\|\|/g, ' || ') // Add spaces around ||
102-
.replace(/&&/g, ' && ') // Add spaces around &&
102+
.replace(/&&/g, ' && ') // Add spaces around &&
103103
.replace(/(?<!\|)\|(?!\|)/g, ' || ') // Single | becomes || with spaces (not preceded by |)
104-
.replace(/(?<!&)&(?!&)/g, ' && '); // Single & becomes && with spaces (not preceded by &)
104+
.replace(/(?<!&)&(?!&)/g, ' && '); // Single & becomes && with spaces (not preceded by &)
105105

106106
// Clean up multiple spaces
107107
jsExpression = jsExpression.replace(/\s+/g, ' ').trim();

0 commit comments

Comments
 (0)