UNPKG

3.56 kBJavaScriptView Raw
1"use strict";
2// Copyright IBM Corp. 2020. All Rights Reserved.
3// Node module: @loopback/rest
4// This file is licensed under the MIT License.
5// License text available at https://opensource.org/licenses/MIT
6Object.defineProperty(exports, "__esModule", { value: true });
7exports.AjvFactoryProvider = exports.DEFAULT_AJV_VALIDATION_OPTIONS = void 0;
8const tslib_1 = require("tslib");
9const core_1 = require("@loopback/core");
10const ajv_1 = tslib_1.__importDefault(require("ajv"));
11const ajv_errors_1 = tslib_1.__importDefault(require("ajv-errors"));
12const ajv_formats_1 = tslib_1.__importDefault(require("ajv-formats"));
13const ajv_keywords_1 = tslib_1.__importDefault(require("ajv-keywords"));
14const debug_1 = tslib_1.__importDefault(require("debug"));
15const keys_1 = require("../keys");
16const openapi_formats_1 = require("./openapi-formats");
17const debug = (0, debug_1.default)('loopback:rest:ajv');
18exports.DEFAULT_AJV_VALIDATION_OPTIONS = {
19 $data: true,
20};
21/**
22 * A provider class that instantiate an AJV instance
23 */
24let AjvFactoryProvider = class AjvFactoryProvider {
25 constructor(options = exports.DEFAULT_AJV_VALIDATION_OPTIONS) {
26 this.options = options;
27 }
28 value() {
29 return options => {
30 let validationOptions = {
31 ...this.options,
32 ...options,
33 };
34 // See https://github.com/epoberezkin/ajv#options
35 validationOptions = {
36 allErrors: true,
37 strictTypes: false,
38 ...validationOptions,
39 };
40 debug('AJV options', validationOptions);
41 const ajvOptions = { ...validationOptions };
42 delete ajvOptions.ajvErrors;
43 const ajvInst = new ajv_1.default(ajvOptions);
44 ajvInst.addKeyword('components');
45 ajvInst.addKeyword('x-typescript-type');
46 (0, ajv_keywords_1.default)(ajvInst, validationOptions.ajvKeywords);
47 (0, ajv_errors_1.default)(ajvInst, validationOptions.ajvErrors);
48 if (this.keywords) {
49 this.keywords.forEach(keyword => {
50 debug('Adding Ajv keyword %s', keyword.keyword);
51 ajvInst.addKeyword(keyword);
52 });
53 }
54 (0, ajv_formats_1.default)(ajvInst);
55 for (const format of openapi_formats_1.openapiFormats) {
56 ajvInst.addFormat(format.name, format);
57 }
58 if (this.formats) {
59 this.formats.forEach(format => {
60 debug('Adding Ajv format %s', format.name);
61 ajvInst.addFormat(format.name, format);
62 });
63 }
64 return ajvInst;
65 };
66 }
67};
68tslib_1.__decorate([
69 (0, core_1.inject)((0, core_1.filterByTag)(keys_1.RestTags.AJV_KEYWORD)),
70 tslib_1.__metadata("design:type", Array)
71], AjvFactoryProvider.prototype, "keywords", void 0);
72tslib_1.__decorate([
73 (0, core_1.inject)((0, core_1.filterByTag)(keys_1.RestTags.AJV_FORMAT)),
74 tslib_1.__metadata("design:type", Array)
75], AjvFactoryProvider.prototype, "formats", void 0);
76AjvFactoryProvider = tslib_1.__decorate([
77 (0, core_1.injectable)({ scope: core_1.BindingScope.SINGLETON }),
78 tslib_1.__param(0, (0, core_1.inject)(keys_1.RestBindings.REQUEST_BODY_PARSER_OPTIONS.deepProperty('validation'), { optional: true })),
79 tslib_1.__metadata("design:paramtypes", [Object])
80], AjvFactoryProvider);
81exports.AjvFactoryProvider = AjvFactoryProvider;
82//# sourceMappingURL=ajv-factory.provider.js.map
\No newline at end of file