Skip to content

Commit be391cf

Browse files
committed
refactor: update and simplify validate
1 parent 52295a7 commit be391cf

File tree

2 files changed

+42
-54
lines changed

2 files changed

+42
-54
lines changed

src/validate.test.ts

Lines changed: 29 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,63 @@
11
import {test, expect, describe} from 'vitest'
22
import {isValidSuitCssProperty, isValidCustomProperty} from './validate.js'
33

4-
describe('valid patterns', () => {
5-
test('basic properties', () => {
6-
expect(isValidSuitCssProperty('--Button-color', 'Button')).toBe(true)
7-
expect(isValidSuitCssProperty('--Button-backgroundColor', 'Button')).toBe(
8-
true,
9-
)
4+
describe('isValidCustomProperty (default)', () => {
5+
test('accepts valid component names with any suffix', () => {
6+
expect(isValidCustomProperty('--Button-color', 'Button')).toBe(true)
7+
expect(isValidCustomProperty('--Button-Color', 'Button')).toBe(true)
8+
expect(isValidCustomProperty('--Button-123', 'Button')).toBe(true)
9+
expect(isValidCustomProperty('--Button', 'Button')).toBe(true)
10+
expect(
11+
isValidCustomProperty('--UserProfile-avatar-size', 'UserProfile'),
12+
).toBe(true)
1013
})
1114

12-
test('descendants', () => {
13-
expect(isValidSuitCssProperty('--Button-icon-size', 'Button')).toBe(true)
15+
test('rejects wrong component names', () => {
16+
expect(isValidCustomProperty('--Wrong-color', 'Button')).toBe(false)
17+
expect(isValidCustomProperty('--button-color', 'Button')).toBe(false)
1418
})
19+
})
1520

16-
test('modifiers', () => {
21+
describe('isValidSuitCssProperty (strict SUIT CSS)', () => {
22+
test('accepts basic valid patterns', () => {
23+
expect(isValidSuitCssProperty('--Button-color', 'Button')).toBe(true)
24+
expect(isValidSuitCssProperty('--Button-icon-size', 'Button')).toBe(true)
1725
expect(isValidSuitCssProperty('--Button--primary-color', 'Button')).toBe(
1826
true,
1927
)
20-
})
21-
22-
test('states', () => {
2328
expect(isValidSuitCssProperty('--Button-onHover-color', 'Button')).toBe(
2429
true,
2530
)
2631
})
2732

28-
test('complex combinations', () => {
29-
expect(
30-
isValidSuitCssProperty('--Button-icon-onHover-color', 'Button'),
31-
).toBe(true)
32-
expect(
33-
isValidSuitCssProperty(
34-
'--Button--primary-onHover-backgroundColor',
35-
'Button',
36-
),
37-
).toBe(true)
38-
})
39-
})
40-
41-
describe('invalid patterns', () => {
42-
test('wrong component name', () => {
43-
expect(isValidSuitCssProperty('--Wrong-color', 'Button')).toBe(false)
44-
})
45-
46-
test('malformed properties', () => {
33+
test('rejects what default function accepts', () => {
4734
expect(isValidSuitCssProperty('--Button', 'Button')).toBe(false)
48-
expect(isValidSuitCssProperty('--Button-', 'Button')).toBe(false)
49-
expect(isValidSuitCssProperty('--ButtonColor', 'Button')).toBe(false)
50-
})
51-
52-
test('case violations', () => {
5335
expect(isValidSuitCssProperty('--Button-Color', 'Button')).toBe(false)
5436
expect(isValidSuitCssProperty('--Button-Icon-size', 'Button')).toBe(false)
55-
})
56-
57-
test('invalid syntax', () => {
37+
expect(isValidSuitCssProperty('--Button-123', 'Button')).toBe(false)
5838
expect(isValidSuitCssProperty('--Button---primary-color', 'Button')).toBe(
5939
false,
6040
)
61-
})
62-
})
63-
64-
describe('different component names', () => {
65-
test('validates component name matching', () => {
66-
expect(
67-
isValidSuitCssProperty('--UserProfile-avatar-size', 'UserProfile'),
68-
).toBe(true)
69-
expect(isValidSuitCssProperty('--Button-color', 'UserProfile')).toBe(false)
41+
expect(isValidSuitCssProperty('--Button--', 'Button')).toBe(false)
7042
})
7143
})
7244

7345
describe('custom configuration', () => {
7446
test('accepts custom regex pattern', () => {
7547
const underscorePattern = /^_[a-z][a-zA-Z]*$/
76-
7748
expect(
7849
isValidCustomProperty('--Button_color', 'Button', {
7950
pattern: underscorePattern,
8051
}),
8152
).toBe(true)
8253
})
54+
55+
test('rejects custom pattern when it does not match', () => {
56+
const underscorePattern = /^_[a-z][a-zA-Z]*$/
57+
expect(
58+
isValidCustomProperty('--Button-color', 'Button', {
59+
pattern: underscorePattern,
60+
}),
61+
).toBe(false)
62+
})
8363
})

src/validate.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ export function isValidCustomProperty(
1111
return false
1212
}
1313

14-
const afterComponent = property.slice(`--${componentName}`.length)
14+
const {pattern} = config
1515

16-
const pattern =
17-
config.pattern ||
18-
/^(?:-[a-z][a-zA-Z]*)*(?:--[a-z][a-zA-Z]*)*(?:-on[A-Z][a-zA-Z]*)*-[a-z][a-zA-Z]*$/
16+
if (!pattern) {
17+
return true
18+
}
19+
20+
const afterComponent = property.slice(`--${componentName}`.length)
1921

2022
return pattern.test(afterComponent)
2123
}
@@ -24,5 +26,11 @@ export function isValidSuitCssProperty(
2426
property: string,
2527
componentName: string,
2628
) {
27-
return isValidCustomProperty(property, componentName)
29+
/**
30+
* SUITCSS: --ComponentName[-descendant|--modifier][-onState]-(cssProperty|variableName)
31+
*/
32+
const pattern =
33+
/^(?:-[a-z][a-zA-Z]*)*(?:--[a-z][a-zA-Z]*)*(?:-on[A-Z][a-zA-Z]*)*-[a-z][a-zA-Z]*$/
34+
35+
return isValidCustomProperty(property, componentName, {pattern})
2836
}

0 commit comments

Comments
 (0)