2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 // import Ajv from 'ajv';
22 import cloneDeep from 'lodash/cloneDeep.js';
23 import JSONPointer from './JSONPointer.js';
25 export default class JSONSchema {
28 this._schema = schema;
29 this._fragmentsCache = new Map();
30 // this._ajv = new Ajv({
34 // this._validate = this._ajv.compile(schema);
38 data = cloneDeep(data);
39 // this._validate(data);
44 return this._getSchemaFragment(pointer).title;
48 const fragment = this._getSchemaFragment(pointer);
53 const fragment = this._getSchemaFragment(pointer);
54 return fragment && fragment.default;
58 const fragment = this._getSchemaFragment(pointer);
59 return fragment && (fragment.type === 'array' ? fragment.items.enum : fragment.enum);
63 const parentPointer = JSONPointer.extractParentPointer(pointer);
64 const lastPart = JSONPointer.extractLastPart(pointer);
65 let parentFragment = this._getSchemaFragment(parentPointer);
66 return parentFragment && parentFragment.required && parentFragment.required.includes(lastPart);
70 const fragment = this._getSchemaFragment(pointer);
71 return fragment && fragment.type === 'number';
74 getMaxValue(pointer) {
75 const fragment = this._getSchemaFragment(pointer);
76 return fragment && fragment.maximum;
79 getMinValue(pointer) {
80 const fragment = this._getSchemaFragment(pointer);
81 return fragment && fragment.minimum;
85 const fragment = this._getSchemaFragment(pointer);
86 return fragment && fragment.type === 'string';
90 const fragment = this._getSchemaFragment(pointer);
91 return fragment && fragment.pattern;
94 getMaxLength(pointer) {
95 const fragment = this._getSchemaFragment(pointer);
96 return fragment && fragment.maxLength;
99 getMinLength(pointer) {
100 const fragment = this._getSchemaFragment(pointer);
101 return fragment && fragment.minLength;
105 const fragment = this._getSchemaFragment(pointer);
106 return fragment && fragment.type === 'array';
109 _getSchemaFragment(pointer) {
110 if (this._fragmentsCache.has(pointer)) {
111 return this._fragmentsCache.get(pointer);
114 let parts = JSONPointer.extractParts(pointer);
116 let fragment = parts.reduce((fragment, part) => {
117 if (fragment === undefined) {
122 fragment = this._getSchemaFragmentByRef(fragment.$ref);
125 switch (fragment.type) {
127 return fragment.properties && fragment.properties[part];
130 return fragment.enum && fragment.enum[part];
133 // throw new Error(`Incorrect/unsupported JSONPointer "${pointer}" from "${part}"`);
138 while(fragment && fragment.$ref) {
139 fragment = this._getSchemaFragmentByRef(fragment.$ref);
142 this._fragmentsCache.set(pointer, fragment);
146 _getSchemaFragmentByRef($ref) {
147 let pointer = $ref.substr(1);
148 return JSONPointer.getValue(this._schema, pointer);
149 // let fragmentAjv = new Ajv();
150 // fragmentAjv.addSchema(this._schema);
151 // let compiledFragment = fragmentAjv.compile({$ref});
152 // let fragment = compiledFragment.refVal[compiledFragment.refs[$ref]];