UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

182 lines (180 loc) 8.22 kB
"use strict"; // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. Object.defineProperty(exports, "__esModule", { value: true }); exports.SchemaItemInfoGeneratorTest = void 0; const ProjectInfoItem_1 = require("./ProjectInfoItem"); const IInfoItemData_1 = require("./IInfoItemData"); const Database_1 = require("../minecraft/Database"); const CartoApp_1 = require("../app/CartoApp"); const ajv_1 = require("ajv"); const axios_1 = require("axios"); const Utilities_1 = require("../core/Utilities"); const MinecraftDefinitions_1 = require("../minecraft/MinecraftDefinitions"); const ProjectItemUtilities_1 = require("../app/ProjectItemUtilities"); const JsonSchemaErrorBase = 100; const NotCurrentFormatVersionBase = 1100; var SchemaItemInfoGeneratorTest; (function (SchemaItemInfoGeneratorTest) { SchemaItemInfoGeneratorTest[SchemaItemInfoGeneratorTest["couldNotParseJson"] = 1] = "couldNotParseJson"; })(SchemaItemInfoGeneratorTest = exports.SchemaItemInfoGeneratorTest || (exports.SchemaItemInfoGeneratorTest = {})); class SchemaItemInfoGenerator { constructor() { this.id = "JSON"; this.title = "JSON Schema Validation"; this.canAlwaysProcess = true; this._validatorsByPath = {}; this._schemaContentByPath = {}; this.uuidRegex = new RegExp("[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"); this.loadSchema = this.loadSchema.bind(this); this.testUuid = this.testUuid.bind(this); this.testUri = this.testUri.bind(this); } getTopicData(topicId) { return { title: topicId.toString(), }; } summarize(info, infoSet) { } async loadSchema(uri) { console.log("Retrieving " + uri); const res = await axios_1.default.get(CartoApp_1.default.contentRoot + uri); console.log("Loading error: " + JSON.stringify(res.data)); return res.data; } async generate(projectItem, contentIndex) { const items = []; if (projectItem.file && projectItem.file.content && typeof projectItem.file.content === "string") { const schemaPath = projectItem.getSchemaPath(); if (schemaPath) { let val = this._validatorsByPath[schemaPath]; let verIsCurrent = await MinecraftDefinitions_1.default.formatVersionIsCurrent(projectItem); if (verIsCurrent) { if (!val) { const schemaContents = await Database_1.default.getSchema(schemaPath); if (schemaContents) { const ajv = new ajv_1.default({ allErrors: true, loadSchema: this.loadSchema, strict: false, unicodeRegExp: false, verbose: true, }); ajv.addFormat("uuid", this.testUuid); ajv.addFormat("uri", this.testUri); ajv.addFormat("color-hex", this.testUnknownFormat); ajv.addFormat("colox-hex", this.testUnknownFormat); ajv.addFormat("molang", this.testUnknownFormat); val = ajv.compile(schemaContents); this._validatorsByPath[schemaPath] = val; this._schemaContentByPath[schemaPath] = schemaContents; } } if (val) { let content = projectItem.file.content; let contentObj = undefined; content = Utilities_1.default.fixJsonContent(content); try { contentObj = JSON.parse(content); } catch (e) { let errorMess = e; if (e.message) { errorMess = e.message; } items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, SchemaItemInfoGeneratorTest.couldNotParseJson, "Could not parse JSON - " + errorMess, projectItem)); } if (contentObj) { const result = val(contentObj); if (!result && val.errors) { for (let i = 0; i < val.errors.length; i++) { const err = val.errors[i]; this.addError(items, projectItem, err); } } } } } else { let fvStr = ""; const fv = await MinecraftDefinitions_1.default.getFormatVersion(projectItem); if (fv) { fvStr = " (is at " + fv.join(".") + ")"; } items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.info, this.id, NotCurrentFormatVersionBase + projectItem.itemType, ProjectItemUtilities_1.default.getDescriptionForType(projectItem.itemType) + " is not at a current format version" + fvStr, projectItem)); } } } return items; } addError(items, projectItem, error) { var message = ""; switch (error.keyword) { case "required": message = 'Property "' + error.params.missingProperty + '" missing'; break; case "type": message = "Wrong type: " + error.instancePath + " " + error.keyword + " " + error.message; break; default: message = error.keyword + " " + error.instancePath + " " + error.message; break; } let errorContent = undefined; if (typeof error.data === "string") { errorContent = error.data; } else if (typeof error.data === "object") { let serial = undefined; try { serial = JSON.stringify(error.data, null, 2); } catch (e) { } errorContent = serial; } if (errorContent && errorContent.length > 100) { errorContent = errorContent.substring(0, 99); } let data = undefined; if (error.params) { for (const key in error.params) { let val = error.params[key]; if (typeof val === "string" && key !== "type" && key !== "pattern" && key !== "missingProperty" && key !== "comparison" && key !== "failingKeyword") { // force line breaks in long strings if (val.length > 80 && val.indexOf(" ") < 0) { val = val.replace(/,/gi, ", "); } if (data === undefined) { data = ""; } else { data += " "; } if (data.length < 100 && val.length < 100 && key.length < 100) { data += "(" + key + ": " + val + ")"; } } } } items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.warning, this.id, JsonSchemaErrorBase + projectItem.itemType, message, projectItem, data, undefined, errorContent)); } testUuid(uuidString) { return this.uuidRegex.test(uuidString); } testUnknownFormat(formatString) { return true; } testUri(uriString) { // could get much more sophisticated here... return uriString.indexOf("://") >= 0; } } exports.default = SchemaItemInfoGenerator; //# sourceMappingURL=../maps/info/SchemaItemInfoGenerator.js.map