ut-tools
Version:
Build and Release management automation package.
56 lines • 3.19 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.detectDialect = exports.extractDraftVersion = exports.jsonSchemaDraft2020_12 = exports.jsonSchemaDraft2019_09 = exports.jsonSchemaDraft7 = exports.jsonSchemaDraft6 = exports.jsonSchemaDraft4 = exports.jsonSchemaLoose = exports.jsonSchema = void 0;
const json_1 = require("@stoplight/json");
const KNOWN_JSON_SCHEMA_TYPES = ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'];
const KNOWN_JSON_SCHEMA_COMPOUND_KEYWORDS = ['allOf', 'oneOf', 'anyOf', 'not', 'if'];
const SCHEMA_DRAFT_REGEX = /^https?:\/\/json-schema.org\/(?:draft-0([467])|draft\/(20(?:19-09|20-12)))\/(?:hyper-)?schema#?$/;
const hasValidJSONSchemaType = (document) => {
if (!('type' in document))
return false;
if (typeof document.type === 'string') {
return KNOWN_JSON_SCHEMA_TYPES.includes(document.type);
}
return Array.isArray(document.type) && document.type.every(type => KNOWN_JSON_SCHEMA_TYPES.includes(type));
};
const hasValidJSONSchemaEnumKeyword = (document) => Array.isArray(document['enum']);
const hasValidJSONSchemaCompoundKeyword = (document) => KNOWN_JSON_SCHEMA_COMPOUND_KEYWORDS.some(combiner => combiner in document && typeof document[combiner] === 'object' && document[combiner] !== null);
function hasSchemaVersion(document) {
return ((0, json_1.isPlainObject)(document) &&
'$schema' in document &&
typeof document.$schema === 'string');
}
const isJsonSchema = (document) => hasSchemaVersion(document) && document.$schema.includes('//json-schema.org/');
exports.jsonSchema = isJsonSchema;
exports.jsonSchema.displayName = 'JSON Schema';
const jsonSchemaLoose = (document) => (0, json_1.isPlainObject)(document) &&
(isJsonSchema(document) ||
hasValidJSONSchemaType(document) ||
hasValidJSONSchemaEnumKeyword(document) ||
hasValidJSONSchemaCompoundKeyword(document));
exports.jsonSchemaLoose = jsonSchemaLoose;
exports.jsonSchemaLoose.displayName = 'JSON Schema (loose)';
exports.jsonSchemaDraft4 = createJsonSchemaFormat('draft4', 'JSON Schema Draft 4');
exports.jsonSchemaDraft6 = createJsonSchemaFormat('draft6', 'JSON Schema Draft 6');
exports.jsonSchemaDraft7 = createJsonSchemaFormat('draft7', 'JSON Schema Draft 7');
exports.jsonSchemaDraft2019_09 = createJsonSchemaFormat('draft2019-09', 'JSON Schema Draft 2019-09');
exports.jsonSchemaDraft2020_12 = createJsonSchemaFormat('draft2020-12', 'JSON Schema Draft 2020-12');
function createJsonSchemaFormat(draft, name) {
const format = (document) => isJsonSchema(document) && extractDraftVersion(document.$schema) === draft;
format.displayName = name;
return format;
}
function extractDraftVersion($schema) {
var _a;
const match = SCHEMA_DRAFT_REGEX.exec($schema);
return match !== null ? `draft${(_a = match[1]) !== null && _a !== void 0 ? _a : match[2]}` : null;
}
exports.extractDraftVersion = extractDraftVersion;
function detectDialect(document) {
if (!isJsonSchema(document)) {
return null;
}
return extractDraftVersion(document.$schema);
}
exports.detectDialect = detectDialect;
//# sourceMappingURL=jsonSchema.js.map