Skip to content

Commit a93d428

Browse files
committed
feat(apidom-ls): single ajv instance
1 parent a49154b commit a93d428

File tree

4 files changed

+66
-67
lines changed

4 files changed

+66
-67
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import Ajv2020, * as Ajv2020Ns from 'ajv/dist/2020';
2+
import Ajv, * as AjvNs from 'ajv';
3+
import * as draft7MetaSchema from 'ajv/dist/refs/json-schema-draft-07.json';
4+
import AjvErrors from 'ajv-errors';
5+
import addFormats from 'ajv-formats';
6+
7+
import openapiSchemaJson31Ajv from '../json-schema/open-api-31/openapi-schema-31-ajv.json';
8+
import openapiSchemaJson31Meta from '../json-schema/open-api-31/openapi-schema-31-meta.json';
9+
import openapiSchemaJson31Dialect from '../json-schema/open-api-31/openapi-schema-31-dialect.json';
10+
11+
let ajvInstance: Ajv;
12+
let ajv2020Instance: Ajv2020;
13+
14+
export function ajv(ajv2020: boolean): Ajv2020 | Ajv {
15+
if (!ajv2020Instance && ajv2020) {
16+
ajv2020Instance = new Ajv2020({
17+
strict: false,
18+
allErrors: true,
19+
schemas: [openapiSchemaJson31Ajv, openapiSchemaJson31Meta, openapiSchemaJson31Dialect],
20+
});
21+
ajv2020Instance.addMetaSchema(draft7MetaSchema);
22+
addFormats(ajv2020Instance);
23+
ajv2020Instance.addFormat('media-range', true);
24+
25+
AjvErrors(ajv2020Instance);
26+
} else if (!ajvInstance && !ajv2020) {
27+
ajvInstance = new Ajv({
28+
strict: false,
29+
meta: true,
30+
allErrors: true,
31+
validateFormats: false,
32+
unicodeRegExp: false,
33+
});
34+
AjvErrors(ajvInstance);
35+
}
36+
37+
if (ajv2020) {
38+
return ajv2020Instance;
39+
}
40+
return ajvInstance;
41+
}
42+
43+
export function compileAjv(
44+
jsonSchema: Record<string, unknown>,
45+
ajv2020: boolean,
46+
): Ajv2020Ns.ValidateFunction | AjvNs.ValidateFunction {
47+
if (!ajv2020Instance && ajv2020) {
48+
ajv(ajv2020);
49+
} else if (!ajvInstance && !ajv2020) {
50+
ajv(ajv2020);
51+
}
52+
const ajvInst = ajv2020 ? ajv2020Instance : ajvInstance;
53+
return ajvInst.compile(jsonSchema);
54+
}

packages/apidom-ls/src/services/validation/providers/asyncapi-20-json-schema-validation-provider.ts

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,7 @@ import { JsonSchemaValidationProvider } from './json-schema-validation-provider'
44
// eslint-disable-next-line import/prefer-default-export
55
export class Asyncapi20JsonSchemaValidationProvider extends JsonSchemaValidationProvider {
66
public constructor() {
7-
super(
8-
false,
9-
{
10-
strict: false,
11-
meta: true,
12-
allErrors: true,
13-
validateFormats: false,
14-
unicodeRegExp: false,
15-
},
16-
asyncapiSchemaJson,
17-
);
7+
super(false, asyncapiSchemaJson);
188
}
199

2010
// eslint-disable-next-line class-methods-use-this

packages/apidom-ls/src/services/validation/providers/json-schema-validation-provider.ts

Lines changed: 9 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import Ajv2020, * as Ajv2020Ns from 'ajv/dist/2020';
2-
import Ajv, * as AjvNs from 'ajv';
3-
import AjvErrors from 'ajv-errors';
4-
import addFormats from 'ajv-formats';
1+
import Ajv2020 from 'ajv/dist/2020';
2+
import Ajv from 'ajv';
53
import { Diagnostic, DiagnosticSeverity, Range, Position } from 'vscode-languageserver-types';
64
import jsonSourceMap from 'json-source-map';
75
import { TextDocument } from 'vscode-languageserver-textdocument';
@@ -14,6 +12,7 @@ import {
1412
ValidationProvider,
1513
} from '../../../apidom-language-types';
1614
import { isJsonDoc } from '../../../parser-factory';
15+
import * as AjvUtils from './ajv-utils';
1716

1817
// eslint-disable-next-line import/prefer-default-export
1918
export abstract class JsonSchemaValidationProvider implements ValidationProvider {
@@ -23,14 +22,13 @@ export abstract class JsonSchemaValidationProvider implements ValidationProvider
2322

2423
private jsonSchema: Record<string, unknown>;
2524

26-
protected constructor(
27-
ajv2020: boolean,
28-
ajvOpts: Ajv2020Ns.Options | AjvNs.Options,
29-
jsonSchema: Record<string, unknown>,
30-
) {
25+
protected ajv2020: boolean;
26+
27+
protected constructor(ajv2020: boolean, jsonSchema: Record<string, unknown>) {
3128
this.validationEnabled = true;
32-
this.ajv = JsonSchemaValidationProvider.setupAjv(ajvOpts, ajv2020);
3329
this.jsonSchema = jsonSchema;
30+
this.ajv2020 = ajv2020;
31+
this.ajv = AjvUtils.ajv(ajv2020);
3432
}
3533

3634
public doValidation(
@@ -71,7 +69,7 @@ export abstract class JsonSchemaValidationProvider implements ValidationProvider
7169
if (!this.validationEnabled) {
7270
return;
7371
}
74-
const validateFunction = JsonSchemaValidationProvider.compileAjv(this.ajv, this.jsonSchema);
72+
const validateFunction = AjvUtils.compileAjv(this.jsonSchema, this.ajv2020);
7573
const jsonDoc = JSON.parse(jsonDocument);
7674
const valid = validateFunction(jsonDoc);
7775
if (!valid) {
@@ -136,29 +134,6 @@ export abstract class JsonSchemaValidationProvider implements ValidationProvider
136134
}
137135
}
138136

139-
protected static setupAjv(
140-
ajvOpts: Ajv2020Ns.Options | AjvNs.Options,
141-
ajv2020: boolean,
142-
): Ajv2020 | Ajv {
143-
let ajv: Ajv2020 | Ajv;
144-
if (ajv2020) {
145-
ajv = new Ajv2020(ajvOpts);
146-
addFormats(ajv);
147-
ajv.addFormat('media-range', true);
148-
} else {
149-
ajv = new Ajv(ajvOpts);
150-
}
151-
AjvErrors(ajv);
152-
return ajv;
153-
}
154-
155-
protected static compileAjv(
156-
ajv: Ajv2020 | Ajv,
157-
jsonSchema: Record<string, unknown>,
158-
): Ajv2020Ns.ValidateFunction | AjvNs.ValidateFunction {
159-
return ajv.compile(jsonSchema);
160-
}
161-
162137
abstract break(): boolean;
163138

164139
abstract namespaces(): string[];

packages/apidom-ls/src/services/validation/providers/openapi-31-json-schema-validation-provider.ts

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import openapiSchemaJson31Meta from '../json-schema/open-api-31/openapi-schema-31-meta.json';
2-
import openapiSchemaJson31Dialect from '../json-schema/open-api-31/openapi-schema-31-dialect.json';
31
import openapiSchemaJson31Ajv from '../json-schema/open-api-31/openapi-schema-31-ajv.json';
42
import { JsonSchemaValidationProvider } from './json-schema-validation-provider';
53

@@ -8,27 +6,9 @@ export class OpenAPi31JsonSchemaValidationProvider extends JsonSchemaValidationP
86
public constructor(jsonSchema?: Record<string, unknown>, ajv2020 = false) {
97
// default to OAI provided 3.1 schema
108
if (!jsonSchema) {
11-
super(
12-
true,
13-
{
14-
strict: false,
15-
allErrors: true,
16-
schemas: [openapiSchemaJson31Ajv, openapiSchemaJson31Meta, openapiSchemaJson31Dialect],
17-
},
18-
openapiSchemaJson31Ajv,
19-
);
9+
super(true, openapiSchemaJson31Ajv);
2010
} else {
21-
super(
22-
ajv2020,
23-
{
24-
strict: false,
25-
meta: true,
26-
allErrors: true,
27-
validateFormats: false,
28-
unicodeRegExp: false,
29-
},
30-
jsonSchema,
31-
);
11+
super(ajv2020, jsonSchema);
3212
}
3313
}
3414

0 commit comments

Comments
 (0)