Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit f356be1

Browse files
committed
refactor: modular format registration
1 parent 70d0878 commit f356be1

File tree

3 files changed

+29
-13
lines changed

3 files changed

+29
-13
lines changed

src/IntegrationSchema.ts

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
import Ajv from 'ajv';
2-
import addFormats from 'ajv-formats';
3-
4-
const ipv4 = addFormats.get('ipv4') as RegExp;
5-
const ipv6 = addFormats.get('ipv6') as RegExp;
6-
const ipv4CidrRegex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(3[0-2]|[12]?[0-9])$/;
7-
const ipv6CidrRegex = /^([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$|^([0-9a-fA-F]{1,4}:){1,7}:\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$|^::\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$|^([0-9a-fA-F]{1,4}:){1,7}[0-9a-fA-F]{1,4}$/;
2+
import { registerFormats } from './registerFormats';
83

94
// JSON Schema allows an object to contain properties that are not specified by
105
// the schema. This can be disabled with `additionalProperties: false`. Ajv then
@@ -24,14 +19,9 @@ const ipv6CidrRegex = /^([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}\/(12[0-8]|1[01]
2419
export const IntegrationSchema = new Ajv({
2520
// Ignore "excludes", "multiple"; used in JupiterOne UI?
2621
strictSchema: false,
27-
formats: {
28-
ip: (x) => ipv4.test(x) || ipv6.test(x),
29-
ipCidr: (x) => ipv4CidrRegex.test(x) || ipv6CidrRegex.test(x),
30-
},
3122
});
3223

33-
// Install ajv-formats
34-
addFormats(IntegrationSchema);
24+
registerFormats(IntegrationSchema);
3525

3626
// Schema Imports : generated by tools/generate-schema-imports.sh
3727
import WorkloadJson from './schemas/Workload.json';

src/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
export { registerSchemas } from './registerSchemas';
2+
export { registerFormats } from './registerFormats';
3+
14
export { EVERYONE, INTERNET } from './globalEntities';
25

36
export { RelationshipClass } from './RelationshipClass';
@@ -21,5 +24,4 @@ export type EntityClass = keyof typeof entitySchemas;
2124
export const entityClasses = Object.keys(entitySchemas) as EntityClass[];
2225

2326
export { validateEntityWithSchema } from './validateEntityWithSchema';
24-
export { registerSchemas } from './registerSchemas';
2527
export { getSchema } from './getSchema';

src/registerFormats.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import addFormats from 'ajv-formats';
2+
import Ajv from 'ajv';
3+
4+
const ipv4 = addFormats.get('ipv4') as RegExp;
5+
const ipv6 = addFormats.get('ipv6') as RegExp;
6+
const ipv4CidrRegex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(3[0-2]|[12]?[0-9])$/;
7+
const ipv6CidrRegex = /^([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$|^([0-9a-fA-F]{1,4}:){1,7}:\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$|^::\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$|^([0-9a-fA-F]{1,4}:){1,7}[0-9a-fA-F]{1,4}$/;
8+
9+
const isValidIpFormat = {
10+
name: 'ip',
11+
fn: (x) => ipv4.test(x) || ipv6.test(x),
12+
};
13+
14+
const isValidIpCidrFormat = {
15+
name: 'ipCidr',
16+
fn: (x) => ipv4CidrRegex.test(x) || ipv6CidrRegex.test(x),
17+
};
18+
19+
export function registerFormats(ajvInstance: Ajv): void {
20+
ajvInstance.addFormat(isValidIpFormat.name, isValidIpFormat.fn);
21+
ajvInstance.addFormat(isValidIpCidrFormat.name, isValidIpCidrFormat.fn);
22+
23+
addFormats(ajvInstance);
24+
}

0 commit comments

Comments
 (0)