Skip to content

Commit bc688a3

Browse files
Made maxLength optional for validate.string.length()
1 parent e8ec7ee commit bc688a3

File tree

2 files changed

+52
-4
lines changed

2 files changed

+52
-4
lines changed

src/string.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,19 +52,33 @@ Object.defineProperty(string, "length", { value: validateLength });
5252

5353

5454
function validateNonEmpty<T extends string>(value: T | undefined, fieldName = "value", defaultValue?: T): T {
55-
return validateLength(value, 1, Infinity, fieldName, defaultValue);
55+
return validateStringLength(value, 1, Infinity, fieldName, defaultValue);
5656
}
5757

5858

5959
function validateMinLength<T extends string>(
6060
value: T | undefined, minLength: number, fieldName = "value", defaultValue?: T): T {
61-
return validateLength(value, minLength, Infinity, fieldName, defaultValue);
61+
return validateStringLength(value, minLength, Infinity, fieldName, defaultValue);
6262
}
6363

6464

6565
function validateMaxLength<T extends string>(
6666
value: T | undefined, maxLength: number, fieldName = "value", defaultValue?: T): T {
67-
return validateLength(value, 0, maxLength, fieldName, defaultValue);
67+
return validateStringLength(value, 0, maxLength, fieldName, defaultValue);
68+
}
69+
70+
71+
function validateLength<T extends string>(
72+
value: T | undefined, minLength: number, maxLength?: number, fieldName = "value", defaultValue?: T): T {
73+
if (typeof maxLength === "string") {
74+
defaultValue = fieldName as T;
75+
fieldName = maxLength;
76+
maxLength = undefined;
77+
}
78+
if (maxLength === undefined) {
79+
maxLength = minLength;
80+
}
81+
return validateStringLength(value, minLength, maxLength, fieldName, defaultValue);
6882
}
6983

7084

@@ -79,7 +93,7 @@ function validateNonWhitespace<T extends string>(value: T | undefined, fieldName
7993
}
8094

8195

82-
function validateLength<T extends string>(
96+
function validateStringLength<T extends string>(
8397
value: T | undefined, minLength = 1, maxLength = Infinity, fieldName = "value", defaultValue?: T): T {
8498
value = type.string(value, fieldName, defaultValue);
8599

test/specs/string-length.spec.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,20 @@ describe("validate.string.length()", () => {
1111
expect(validate.string.length("hello", 5, 10)).to.equal("hello");
1212
});
1313

14+
it("should validate strings that meet the exact length", () => {
15+
expect(validate.string.length("a", 1)).to.equal("a");
16+
expect(validate.string.length("Hello, world!", 13)).to.equal("Hello, world!");
17+
expect(validate.string.length("hello", 5)).to.equal("hello");
18+
});
19+
1420
it("should validate default values", () => {
1521
expect(validate.string.length(undefined, 0, 1, "name", "A")).to.equal("A");
1622
expect(validate.string.length(undefined, 10, 50, "name", "Hello, world!")).to.equal("Hello, world!");
1723
expect(validate.string.length(undefined, 5, 10, "name", "hello")).to.equal("hello");
24+
25+
expect(validate.string.length(undefined, 1, "name", "A")).to.equal("A");
26+
expect(validate.string.length(undefined, 13, "name", "Hello, world!")).to.equal("Hello, world!");
27+
expect(validate.string.length(undefined, 5, "name", "hello")).to.equal("hello");
1828
});
1929

2030
it("should throw an error for strings that don't meet the minimum and maximum", () => {
@@ -29,6 +39,18 @@ describe("validate.string.length()", () => {
2939
expect(tooLong("Hello, world!", 1, 10)).to.throw(RangeError, 'Invalid value: "Hello, world!". It cannot be more than 10 characters.');
3040
});
3141

42+
it("should throw an error for strings that don't meet the exact length", () => {
43+
function tooLong (value, length) {
44+
return () => {
45+
validate.string.length(value, length);
46+
};
47+
}
48+
49+
expect(tooLong(" ", 0)).to.throw(RangeError, 'Invalid value: " ". It must be exactly 0 characters.');
50+
expect(tooLong("abc", 1)).to.throw(RangeError, 'Invalid value: "abc". It must be exactly 1 character.');
51+
expect(tooLong("Hello, world!", 10)).to.throw(RangeError, 'Invalid value: "Hello, world!". It must be exactly 10 characters.');
52+
});
53+
3254
it("should throw an error for defaults that don't meet the maximum", () => {
3355
function invalidDefault (defaultValue, min, max) {
3456
return () => {
@@ -41,4 +63,16 @@ describe("validate.string.length()", () => {
4163
expect(invalidDefault("Hello, world!", 1, 10)).to.throw(RangeError, 'Invalid name: "Hello, world!". It cannot be more than 10 characters.');
4264
});
4365

66+
it("should throw an error for defaults that don't meet the exact length", () => {
67+
function invalidDefault (defaultValue, length) {
68+
return () => {
69+
validate.string.length(undefined, length, "name", defaultValue);
70+
};
71+
}
72+
73+
expect(invalidDefault(" ", 0)).to.throw(RangeError, 'Invalid name: " ". It must be exactly 0 characters.');
74+
expect(invalidDefault("abc", 1)).to.throw(RangeError, 'Invalid name: "abc". It must be exactly 1 character.');
75+
expect(invalidDefault("Hello, world!", 10)).to.throw(RangeError, 'Invalid name: "Hello, world!". It must be exactly 10 characters.');
76+
});
77+
4478
});

0 commit comments

Comments
 (0)