Skip to content

Commit 0596153

Browse files
authored
Merge pull request #351 from Freezystem/patch-1
fix false negative check on UUID v7 and v8
2 parents d99b6ff + 16458e3 commit 0596153

File tree

4 files changed

+31
-3
lines changed

4 files changed

+31
-3
lines changed

index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ export interface RuleUUID extends RuleCustom {
558558
/**
559559
* UUID version in range 0-6
560560
*/
561-
version?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
561+
version?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
562562
}
563563

564564
export interface RuleObjectID extends RuleCustom {

lib/rules/uuid.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use strict";
22

3-
const PATTERN = /^([0-9a-f]{8}-[0-9a-f]{4}-[1-6][0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}|[0]{8}-[0]{4}-[0]{4}-[0]{4}-[0]{12})$/i;
3+
const PATTERN = /^([0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}|[0]{8}-[0]{4}-[0]{4}-[0]{4}-[0]{12})$/i;
44

55
/** Signature: function(value, field, parent, errors, context)
66
*/
@@ -21,7 +21,7 @@ module.exports = function({ schema, messages }, path) {
2121
const version = val.charAt(14) | 0;
2222
`);
2323

24-
if(parseInt(schema.version) < 7) {
24+
if(parseInt(schema.version) < 9) {
2525
src.push(`
2626
if (${schema.version} !== version) {
2727
${this.makeError({ type: "uuidVersion", expected: schema.version, actual: "version", messages })}
@@ -40,6 +40,8 @@ module.exports = function({ schema, messages }, path) {
4040
case 3:
4141
case 4:
4242
case 5:
43+
case 7:
44+
case 8:
4345
if (["8", "9", "a", "b"].indexOf(val.charAt(19)) === -1) {
4446
${this.makeError({ type: "uuid", actual: "value", messages })}
4547
}

test/rules/uuid.spec.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ describe("Test rule: uuid", () => {
3737
const check3 = v.compile({ $$root: true, type: "uuid", version: 3 });
3838
const check4 = v.compile({ $$root: true, type: "uuid", version: 4 });
3939
const check5 = v.compile({ $$root: true, type: "uuid", version: 5 });
40+
const check7 = v.compile({ $$root: true, type: "uuid", version: 7 });
4041
message = "The '' field must be a valid UUID version provided.";
4142

4243
expect(check0("00000000-0000-1000-0000-000000000000")).toEqual([{"actual": 1, "expected": 0, "type": "uuidVersion", message}]);
@@ -47,6 +48,7 @@ describe("Test rule: uuid", () => {
4748
expect(check3("9a7b330a-a736-41e5-af7f-feaf819cdc9f")).toEqual([{"actual": 4, "expected": 3, "type": "uuidVersion", message}]);
4849
expect(check4("9a7b330a-a736-21e5-af7f-feaf819cdc9f")).toEqual([{"actual": 2, "expected": 4, "type": "uuidVersion", message}]);
4950
expect(check5("9a7b330a-a736-11e5-af7f-feaf819cdc9f")).toEqual([{"actual": 1, "expected": 5, "type": "uuidVersion", message}]);
51+
expect(check7("019681ac-4f0f-86a2-866e-5408b2d861f8")).toEqual([{"actual": 8, "expected": 7, "type": "uuidVersion", message}]);
5052
});
5153

5254
it("check valid version", () => {
@@ -57,6 +59,8 @@ describe("Test rule: uuid", () => {
5759
const check4 = v.compile({ $$root: true, type: "uuid", version: 4 });
5860
const check5 = v.compile({ $$root: true, type: "uuid", version: 5 });
5961
const check6 = v.compile({ $$root: true, type: "uuid", version: 6 });
62+
const check7 = v.compile({ $$root: true, type: "uuid", version: 7 });
63+
const check8 = v.compile({ $$root: true, type: "uuid", version: 8 });
6064

6165
expect(check0("00000000-0000-0000-0000-000000000000")).toEqual(true);
6266
expect(check1("45745c60-7b1a-11e8-9c9c-2d42b21b1a3e")).toEqual(true);
@@ -65,6 +69,8 @@ describe("Test rule: uuid", () => {
6569
expect(check4("10ba038e-48da-487b-96e8-8d3b99b6d18a")).toEqual(true);
6670
expect(check5("fdda765f-fc57-5604-a269-52a7df8164ec")).toEqual(true);
6771
expect(check6("a9030619-8514-6970-e0f9-81b9ceb08a5f")).toEqual(true);
72+
expect(check7("01965dfe-77ac-78e2-9f69-51e5ce8bd080")).toEqual(true);
73+
expect(check8("019681ac-4f0f-86a2-866e-5408b2d861f8")).toEqual(true);
6874
});
6975

7076
it("should not be case insensitive", () => {
@@ -74,20 +80,26 @@ describe("Test rule: uuid", () => {
7480
const check4 = v.compile({ $$root: true, type: "uuid", version: 4 });
7581
const check5 = v.compile({ $$root: true, type: "uuid", version: 5 });
7682
const check6 = v.compile({ $$root: true, type: "uuid", version: 6 });
83+
const check7 = v.compile({ $$root: true, type: "uuid", version: 7 });
84+
const check8 = v.compile({ $$root: true, type: "uuid", version: 8 });
7785

7886
expect(check1("45745c60-7b1a-11e8-9c9c-2d42b21b1a3e")).toEqual(true);
7987
expect(check2("9a7b330a-a736-21e5-af7f-feaf819cdc9f")).toEqual(true);
8088
expect(check3("9125a8dc-52ee-365b-a5aa-81b0b3681cf6")).toEqual(true);
8189
expect(check4("10ba038e-48da-487b-96e8-8d3b99b6d18a")).toEqual(true);
8290
expect(check5("fdda765f-fc57-5604-a269-52a7df8164ec")).toEqual(true);
8391
expect(check6("a9030619-8514-6970-e0f9-81b9ceb08a5f")).toEqual(true);
92+
expect(check7("01965dfe-77ac-78e2-9f69-51e5ce8bd080")).toEqual(true);
93+
expect(check8("019681ac-4f0f-86a2-866e-5408b2d861f8")).toEqual(true);
8494

8595
expect(check1("45745C60-7B1A-11E8-9C9C-2D42B21B1A3E")).toEqual(true);
8696
expect(check2("9A7B330A-A736-21E5-AF7F-FEAF819CDC9F")).toEqual(true);
8797
expect(check3("9125A8DC-52EE-365B-A5AA-81B0B3681CF6")).toEqual(true);
8898
expect(check4("10BA038E-48DA-487B-96E8-8D3B99B6D18A")).toEqual(true);
8999
expect(check5("FDDA765F-FC57-5604-A269-52A7DF8164EC")).toEqual(true);
90100
expect(check6("A9030619-8514-6970-E0F9-81B9CEB08A5F")).toEqual(true);
101+
expect(check7("01965DFE-77AC-78E2-9F69-51E5CE8BD080")).toEqual(true);
102+
expect(check8("019681AC-4F0F-86A2-866E-5408B2D861F8")).toEqual(true);
91103
});
92104

93105
it("should allow custom metas", async () => {

test/typescript/rules/uuid.spec.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ describe('TypeScript Definitions', () => {
3636
const check3 = v.compile({ $$root: true, type: 'uuid', version: 3 } as RuleUUID);
3737
const check4 = v.compile({ $$root: true, type: 'uuid', version: 4 } as RuleUUID);
3838
const check5 = v.compile({ $$root: true, type: 'uuid', version: 5 } as RuleUUID);
39+
const check7 = v.compile({ $$root: true, type: 'uuid', version: 7 } as RuleUUID);
3940
message = 'The \'\' field must be a valid UUID version provided.';
4041

4142
expect(check0("00000000-0000-1000-0000-000000000000")).toEqual([{ "actual": 1, "expected": 0, "type": "uuidVersion", message }]);
@@ -45,6 +46,7 @@ describe('TypeScript Definitions', () => {
4546
expect(check3('9a7b330a-a736-41e5-af7f-feaf819cdc9f')).toEqual([{ 'actual': 4, 'expected': 3, 'type': 'uuidVersion', message }]);
4647
expect(check4('9a7b330a-a736-21e5-af7f-feaf819cdc9f')).toEqual([{ 'actual': 2, 'expected': 4, 'type': 'uuidVersion', message }]);
4748
expect(check5('9a7b330a-a736-11e5-af7f-feaf819cdc9f')).toEqual([{ 'actual': 1, 'expected': 5, 'type': 'uuidVersion', message }]);
49+
expect(check7("019681ac-4f0f-86a2-866e-5408b2d861f8")).toEqual([{"actual": 8, "expected": 7, "type": "uuidVersion", message}]);
4850
});
4951

5052
it('check valid version', () => {
@@ -54,13 +56,19 @@ describe('TypeScript Definitions', () => {
5456
const check3 = v.compile({ $$root: true, type: 'uuid', version: 3 } as RuleUUID);
5557
const check4 = v.compile({ $$root: true, type: 'uuid', version: 4 } as RuleUUID);
5658
const check5 = v.compile({ $$root: true, type: 'uuid', version: 5 } as RuleUUID);
59+
const check6 = v.compile({ $$root: true, type: 'uuid', version: 6 } as RuleUUID);
60+
const check7 = v.compile({ $$root: true, type: 'uuid', version: 7 } as RuleUUID);
61+
const check8 = v.compile({ $$root: true, type: 'uuid', version: 8 } as RuleUUID);
5762

5863
expect(check0("00000000-0000-0000-0000-000000000000")).toEqual(true);
5964
expect(check1('45745c60-7b1a-11e8-9c9c-2d42b21b1a3e')).toEqual(true);
6065
expect(check2('9a7b330a-a736-21e5-af7f-feaf819cdc9f')).toEqual(true);
6166
expect(check3('9125a8dc-52ee-365b-a5aa-81b0b3681cf6')).toEqual(true);
6267
expect(check4('10ba038e-48da-487b-96e8-8d3b99b6d18a')).toEqual(true);
6368
expect(check5('fdda765f-fc57-5604-a269-52a7df8164ec')).toEqual(true);
69+
expect(check6('a9030619-8514-6970-e0f9-81b9ceb08a5f')).toEqual(true);
70+
expect(check7('01965dfe-77ac-78e2-9f69-51e5ce8bd080')).toEqual(true);
71+
expect(check8('019681ac-4f0f-86a2-866e-5408b2d861f8')).toEqual(true);
6472
});
6573

6674
it("should not be case insensitive", () => {
@@ -70,20 +78,26 @@ describe('TypeScript Definitions', () => {
7078
const check4 = v.compile({ $$root: true, type: "uuid", version: 4 } as RuleUUID);
7179
const check5 = v.compile({ $$root: true, type: "uuid", version: 5 } as RuleUUID);
7280
const check6 = v.compile({ $$root: true, type: "uuid", version: 6 } as RuleUUID);
81+
const check7 = v.compile({ $$root: true, type: 'uuid', version: 7 } as RuleUUID);
82+
const check8 = v.compile({ $$root: true, type: 'uuid', version: 8 } as RuleUUID);
7383

7484
expect(check1("45745c60-7b1a-11e8-9c9c-2d42b21b1a3e")).toEqual(true);
7585
expect(check2("9a7b330a-a736-21e5-af7f-feaf819cdc9f")).toEqual(true);
7686
expect(check3("9125a8dc-52ee-365b-a5aa-81b0b3681cf6")).toEqual(true);
7787
expect(check4("10ba038e-48da-487b-96e8-8d3b99b6d18a")).toEqual(true);
7888
expect(check5("fdda765f-fc57-5604-a269-52a7df8164ec")).toEqual(true);
7989
expect(check6("a9030619-8514-6970-e0f9-81b9ceb08a5f")).toEqual(true);
90+
expect(check7("01965dfe-77ac-78e2-9f69-51e5ce8bd080")).toEqual(true);
91+
expect(check8("019681ac-4f0f-86a2-866e-5408b2d861f8")).toEqual(true);
8092

8193
expect(check1("45745C60-7B1A-11E8-9C9C-2D42B21B1A3E")).toEqual(true);
8294
expect(check2("9A7B330A-A736-21E5-AF7F-FEAF819CDC9F")).toEqual(true);
8395
expect(check3("9125A8DC-52EE-365B-A5AA-81B0B3681CF6")).toEqual(true);
8496
expect(check4("10BA038E-48DA-487B-96E8-8D3B99B6D18A")).toEqual(true);
8597
expect(check5("FDDA765F-FC57-5604-A269-52A7DF8164EC")).toEqual(true);
8698
expect(check6("A9030619-8514-6970-E0F9-81B9CEB08A5F")).toEqual(true);
99+
expect(check7("01965DFE-77AC-78E2-9F69-51E5CE8BD080")).toEqual(true);
100+
expect(check8("019681AC-4F0F-86A2-866E-5408B2D861F8")).toEqual(true);
87101
});
88102
});
89103
});

0 commit comments

Comments
 (0)