Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1671,6 +1671,7 @@ Name | Default text
`numberEqual` | The '{field}' field must be equal to {expected}.
`numberNotEqual` | The '{field}' field can't be equal to {expected}.
`numberInteger` | The '{field}' field must be an integer.
`numberStep` | The '{field}' field must be a multiple of {expected}.
`numberPositive` | The '{field}' field must be a positive number.
`numberNegative` | The '{field}' field must be a negative number.
`array` | The '{field}' field must be an array.
Expand Down
8 changes: 8 additions & 0 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,10 @@ export interface RuleNumber extends RuleCustom {
* @default false
*/
integer?: boolean;
/**
* The stepping interval for the input value
*/
step?: number;
/**
* The value must be greater than zero
* @default false
Expand Down Expand Up @@ -731,6 +735,10 @@ export interface BuiltInMessages {
* The '{field}' field must be an integer.
*/
numberInteger?: string;
/**
* The '{field}' field must be a multiple of {expected}.
*/
numberStep?: string;
/**
* The '{field}' field must be a positive number.
*/
Expand Down
1 change: 1 addition & 0 deletions lib/messages.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ module.exports = {
numberEqual: "The '{field}' field must be equal to {expected}.",
numberNotEqual: "The '{field}' field can't be equal to {expected}.",
numberInteger: "The '{field}' field must be an integer.",
numberStep: "The '{field}' field must be a multiple of {expected}.",
numberPositive: "The '{field}' field must be a positive number.",
numberNegative: "The '{field}' field must be a negative number.",

Expand Down
9 changes: 9 additions & 0 deletions lib/rules/number.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,15 @@ module.exports = function({ schema, messages }, path, context) {
`);
}

// Check step
if (schema.step != null) {
src.push(`
if (value % ${schema.step} !== 0) {
${this.makeError({ type: "numberStep", expected: schema.step, actual: "origValue", messages })}
}
`);
}

// Check positive
if (schema.positive === true) {
src.push(`
Expand Down
1 change: 1 addition & 0 deletions test/messages.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ describe("Test Messages", () => {
expect(msg.numberEqual).toBeDefined();
expect(msg.numberNotEqual).toBeDefined();
expect(msg.numberInteger).toBeDefined();
expect(msg.numberStep).toBeDefined();
expect(msg.numberPositive).toBeDefined();
expect(msg.numberNegative).toBeDefined();
expect(msg.array).toBeDefined();
Expand Down
13 changes: 13 additions & 0 deletions test/rules/number.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,19 @@ describe("Test rule: number", () => {
expect(check(20)).toEqual(true);
});

it("check step", () => {
const check = v.compile({ $$root: true, type: "number", step: 10 });
const message = "The '' field must be a multiple of 10.";

expect(check(8.5)).toEqual([{ type: "numberStep", expected: 10, actual: 8.5, message }]);
expect(check(-5.5)).toEqual([{ type: "numberStep", expected: 10, actual: -5.5, message }]);
expect(check(15)).toEqual([{ type: "numberStep", expected: 10, actual: 15, message }]);
expect(check(0)).toEqual(true);
expect(check(-20)).toEqual(true);
expect(check(20)).toEqual(true);
expect(check(100)).toEqual(true);
});

it("check positive number", () => {
const check = v.compile({ $$root: true, type: "number", positive: true });
const message = "The '' field must be a positive number.";
Expand Down
1 change: 1 addition & 0 deletions test/typescript/messages.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ describe("TypeScript Definitions", () => {
expect(msg.numberEqual).toBeDefined();
expect(msg.numberNotEqual).toBeDefined();
expect(msg.numberInteger).toBeDefined();
expect(msg.numberStep).toBeDefined();
expect(msg.numberPositive).toBeDefined();
expect(msg.numberNegative).toBeDefined();
expect(msg.array).toBeDefined();
Expand Down
13 changes: 13 additions & 0 deletions test/typescript/rules/number.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,19 @@ describe('TypeScript Definitions', () => {
expect(check(20)).toEqual(true);
});

it('check step', () => {
const check = v.compile({ $$root: true, type: 'number', step: 10 } as RuleNumber);
const message = 'The \'\' field must be a multiple of 10.';

expect(check(8.5)).toEqual([{ type: "numberStep", expected: 10, actual: 8.5, message }]);
expect(check(-5.5)).toEqual([{ type: "numberStep", expected: 10, actual: -5.5, message }]);
expect(check(15)).toEqual([{ type: "numberStep", expected: 10, actual: 15, message }]);
expect(check(0)).toEqual(true);
expect(check(-20)).toEqual(true);
expect(check(20)).toEqual(true);
expect(check(100)).toEqual(true);
});

it('check positive number', () => {
const check = v.compile({ $$root: true, type: 'number', positive: true } as RuleNumber);
const message = 'The \'\' field must be a positive number.';
Expand Down