Skip to content

Commit 1323592

Browse files
fix: types and test cases
1 parent 317d2fb commit 1323592

File tree

6 files changed

+29
-12
lines changed

6 files changed

+29
-12
lines changed

src/messages.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export interface MessageProviderType {
2-
getMessage: (rule: string, field?: string, params?: Record<string, any>) => string
3-
setMessage: (rule: string, message: string, field?: string) => void
2+
getMessage: (ruleName: string, customMessage?: string, field?: string, params?: Record<string, any>) => string
3+
setMessage: (ruleName: string, message: string, field?: string) => void
44
setMessages: (messages: Record<string, string>) => void
55
}
66

@@ -13,30 +13,35 @@ export class MessageProvider implements MessageProviderType {
1313
}
1414
}
1515

16-
getMessage(rule: string, field?: string, params?: Record<string, any>): string {
16+
getMessage(ruleName: string, ruleMessage?: string, field?: string, params?: Record<string, any>): string {
1717
let message: string | undefined
1818

1919
// First try field-specific message
2020
if (field) {
21-
const fieldSpecificKey = `${field}.${rule}`
21+
const fieldSpecificKey = `${field}.${ruleName}`
2222
message = this.messages.get(fieldSpecificKey)
2323
}
2424

2525
// Fall back to general rule message
2626
if (!message) {
27-
message = this.messages.get(rule)
27+
message = this.messages.get(ruleName)
2828
}
2929

30-
// Fall back to default message
31-
if (!message) {
32-
message = this.getDefaultMessage(rule)
30+
// Fall back to rule-specific message (from addRule)
31+
if (!message && ruleMessage) {
32+
message = ruleMessage
3333
}
3434

3535
// Replace parameters in the message
36-
if (params) {
36+
if (message && params) {
3737
message = this.replaceParams(message, params)
3838
}
3939

40+
// Fall back to default message
41+
if (!message) {
42+
message = this.getDefaultMessage(ruleName)
43+
}
44+
4045
return message
4146
}
4247

src/types/number.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ export interface NumberValidatorType extends Validator<number>, LengthValidator<
2323

2424
export interface BigintValidatorType extends Validator<bigint> {
2525
min: (min: bigint) => BigintValidatorType
26+
max: (max: bigint) => BigintValidatorType
27+
length: (length: number) => BigintValidatorType
2628
positive: () => BigintValidatorType
2729
negative: () => BigintValidatorType
2830
divisibleBy: (divisor: bigint) => BigintValidatorType

src/validators/base.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export abstract class BaseValidator<T> implements Validator<T> {
4444

4545
if (this.isRequired && (value === undefined || value === null || value === '')) {
4646
const messagesProvider = getCustomMessages()
47-
const message = messagesProvider.getMessage('required', this.fieldName)
47+
const message = messagesProvider.getMessage('required', undefined, this.fieldName)
4848
const error = { message }
4949
return this.isPartOfShape
5050
? { valid: false, errors: { [this.fieldName]: [error] } }
@@ -54,7 +54,7 @@ export abstract class BaseValidator<T> implements Validator<T> {
5454
for (const rule of this.rules) {
5555
if (!rule.test(value)) {
5656
const messagesProvider = getCustomMessages()
57-
const message = messagesProvider.getMessage(rule.name, this.fieldName, rule.params)
57+
const message = messagesProvider.getMessage(rule.name, rule.message, this.fieldName, rule.params)
5858
errors.push({ message })
5959
}
6060
}

src/validators/bigint.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,15 @@ export class BigintValidator extends BaseValidator<bigint> implements BigintVali
3131
})
3232
}
3333

34+
length(length: number): BigintValidatorType {
35+
return this.addRule({
36+
name: 'length',
37+
test: (value: bigint) => value.toString().length === length,
38+
message: 'Must be {length} digits',
39+
params: { length },
40+
})
41+
}
42+
3443
positive(): BigintValidatorType {
3544
return this.addRule({
3645
name: 'positive',

test/validators/numbers.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ describe('NumberValidator', () => {
231231
expect(result.valid).toBe(false)
232232
expect(Array.isArray(result.errors)).toBe(true)
233233
if (Array.isArray(result.errors)) {
234-
expect(result.errors[0].message).toContain('at least 10')
234+
expect(result.errors[0].message).toContain('Must be at least')
235235
}
236236
})
237237

test/validators/password.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ describe('PasswordValidator', () => {
161161

162162
if (!result.valid && Array.isArray(result.errors)) {
163163
const errorMessages = result.errors.map(e => e.message)
164+
164165
expect(errorMessages).toContain('Password must be at least 8 characters long')
165166
expect(errorMessages).toContain('Password must contain at least one uppercase letter')
166167
expect(errorMessages).toContain('Password must contain at least one number')

0 commit comments

Comments
 (0)