@minecraft/creator-tools
Version:
Minecraft Creator Tools command line and libraries.
364 lines (362 loc) • 14.7 kB
JavaScript
"use strict";
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
Object.defineProperty(exports, "__esModule", { value: true });
const Utilities_1 = require("../core/Utilities");
const Database_1 = require("../minecraft/Database");
const IField_1 = require("./IField");
class DataFormUtilities {
static generateDefaultItem(formDefinition) {
const newDataObject = {};
for (let i = 0; i < formDefinition.fields.length; i++) {
const field = formDefinition.fields[i];
if (field.defaultValue !== undefined) {
if (typeof field.defaultValue === "string" && DataFormUtilities.isObjectFieldType(field.dataType)) {
// sometimes our docs say the default value for an object is "N/A", which is not awesome
newDataObject[field.id] = {};
}
else {
newDataObject[field.id] = field.defaultValue;
}
}
}
return newDataObject;
}
static selectSubForm(form, select) {
const selectors = select.split("/");
for (const selector of selectors) {
if (selector.length > 0) {
const field = DataFormUtilities.getFieldById(form, selector);
if (!field || !field.subForm) {
throw new Error("Unable to find field " + selector + " in form " + form.id);
}
form = field.subForm;
}
}
return form;
}
static mergeFields(form) {
let fields = [];
const fieldsByName = {};
for (const field of form.fields) {
if (fieldsByName[field.id]) {
const origField = fieldsByName[field.id];
if (!origField.alternates) {
origField.alternates = [];
}
origField.alternates.push(field);
if (field.alternates) {
for (const subField of field.alternates) {
origField.alternates.push(subField);
}
field.alternates = undefined;
}
}
else {
fields.push(field);
fieldsByName[field.id] = field;
}
}
form.fields = fields;
for (const field of fields) {
if (field.subForm) {
DataFormUtilities.mergeFields(field.subForm);
}
if (field.alternates) {
for (let addField of field.alternates) {
if (addField.subForm) {
DataFormUtilities.mergeFields(addField.subForm);
}
}
}
}
DataFormUtilities.sortAndCleanAlternateFields(form);
}
static isObjectFieldType(fieldDataType) {
return (fieldDataType === IField_1.FieldDataType.object ||
fieldDataType === IField_1.FieldDataType.minecraftFilter ||
fieldDataType === IField_1.FieldDataType.minecraftEventTrigger);
}
static isScalarFieldType(fieldDataType) {
return (fieldDataType === IField_1.FieldDataType.boolean ||
fieldDataType === IField_1.FieldDataType.float ||
fieldDataType === IField_1.FieldDataType.int ||
fieldDataType === IField_1.FieldDataType.intBoolean ||
fieldDataType === IField_1.FieldDataType.intEnum ||
fieldDataType === IField_1.FieldDataType.string ||
fieldDataType === IField_1.FieldDataType.molang);
}
static sortFieldsBySignificance(fieldA, fieldB) {
if (fieldA.subForm && !fieldB.subForm) {
return -1;
}
if (!fieldA.subForm && fieldB.subForm) {
return 1;
}
const isAComplex = !DataFormUtilities.isScalarFieldType(fieldA.dataType);
const isBComplex = !DataFormUtilities.isScalarFieldType(fieldB.dataType);
if (isAComplex && !isBComplex) {
return -1;
}
if (!isAComplex && isBComplex) {
return 1;
}
return fieldA.dataType - fieldB.dataType;
}
static async loadSubForms(form, loadedForms) {
if (!loadedForms) {
loadedForms = "";
}
for (const field of form.fields) {
let subForm = undefined;
if (field.subForm) {
subForm = field.subForm;
}
else if (field.subFormId) {
if (loadedForms.indexOf("|" + field.subFormId + "|") < 0) {
subForm = await Database_1.default.ensureFormLoadedByPath(field.subFormId);
loadedForms += "|" + field.subFormId + "|";
}
}
if (subForm) {
await this.loadSubForms(subForm, loadedForms);
}
}
if (loadedForms === "") {
return undefined;
}
return loadedForms;
}
static sortAndCleanAlternateFields(form) {
let fields = [];
for (const field of form.fields) {
if (field.alternates) {
const allFields = [];
allFields.push(field);
allFields.push(...field.alternates);
field.alternates = undefined;
allFields.sort(DataFormUtilities.sortFieldsBySignificance);
allFields[0].alternates = [];
fields.push(allFields[0]);
for (let i = 1; i < allFields.length; i++) {
if (allFields[i].title === allFields[0].title) {
allFields[i].title = undefined;
}
allFields[0].alternates.push(allFields[i]);
}
}
else {
fields.push(field);
}
}
form.fields = fields;
for (const field of fields) {
if (field.subForm) {
DataFormUtilities.sortAndCleanAlternateFields(field.subForm);
}
if (field.alternates) {
for (let addField of field.alternates) {
if (addField.subForm) {
DataFormUtilities.sortAndCleanAlternateFields(addField.subForm);
}
}
}
}
}
static fixupFields(form, parentField) {
let fields = [];
for (const field of form.fields) {
if ((field.dataType === IField_1.FieldDataType.stringArray || field.dataType === IField_1.FieldDataType.numberArray) &&
field.subForm &&
field.subForm.fields &&
field.subForm.fields.length >= 1) {
const subField = field.subForm.fields[0];
if (subField.id.indexOf("<") >= 0) {
if (subField.dataType === IField_1.FieldDataType.molang) {
field.dataType = IField_1.FieldDataType.molangArray;
}
field.subForm = undefined;
}
fields.push(field);
}
else if (field.id.startsWith("<") && parentField) {
if (!parentField.alternates) {
parentField.alternates = [];
}
field.keyDescription = field.id;
field.id = parentField.id;
if (field.dataType === IField_1.FieldDataType.molangArray || field.dataType === IField_1.FieldDataType.stringArray) {
field.dataType = IField_1.FieldDataType.keyedStringCollection;
}
parentField.alternates.push(field);
}
else {
fields.push(field);
}
}
form.fields = fields;
for (const field of fields) {
if (field.subForm) {
DataFormUtilities.fixupFields(field.subForm, field);
}
if (field.alternates) {
for (let addField of field.alternates) {
if (addField.subForm) {
DataFormUtilities.fixupFields(addField.subForm, field);
}
}
}
}
}
static generateFormFromObject(id, obj, exampleSourcePath) {
let fields = [];
for (const fieldName in obj) {
const fieldData = obj[fieldName];
let fieldType = IField_1.FieldDataType.string;
if (typeof fieldData === "number") {
fieldType = IField_1.FieldDataType.number;
}
const samples = {};
samples[exampleSourcePath ? exampleSourcePath : "generated_doNotEdit"] = [
{
path: fieldName,
content: fieldData,
},
];
fields.push({
id: fieldName,
title: Utilities_1.default.humanifyJsName(fieldName),
dataType: fieldType,
samples: samples,
});
}
return {
id: id,
title: Utilities_1.default.humanifyJsName(id),
fields: fields,
};
}
static getFieldAndAlternates(fieldDefinition) {
const fields = [fieldDefinition];
if (fieldDefinition.alternates) {
for (const altField of fieldDefinition.alternates) {
fields.push(...DataFormUtilities.getFieldAndAlternates(altField));
}
}
return fields;
}
static getScalarField(formDefinition) {
if (formDefinition.scalarField) {
return formDefinition.scalarField;
}
if (formDefinition.scalarFieldUpgradeName && formDefinition.fields) {
for (const field of formDefinition.fields) {
if (field.id === formDefinition.scalarFieldUpgradeName) {
return field;
}
}
}
return undefined;
}
static isString(fieldType) {
return (fieldType === IField_1.FieldDataType.string ||
fieldType === IField_1.FieldDataType.molang ||
fieldType === IField_1.FieldDataType.longFormString ||
fieldType === IField_1.FieldDataType.stringLookup ||
fieldType === IField_1.FieldDataType.stringEnum ||
fieldType === IField_1.FieldDataType.localizableString);
}
static getFieldById(formDefinition, fieldId) {
if (!formDefinition.fields) {
return undefined;
}
for (const field of formDefinition.fields) {
if (field.id === fieldId) {
return field;
}
}
return undefined;
}
static getFieldTypeDescription(fieldType) {
switch (fieldType) {
case IField_1.FieldDataType.int:
return "Integer number";
case IField_1.FieldDataType.boolean:
return "Boolean true/false";
case IField_1.FieldDataType.float:
return "Decimal number";
case IField_1.FieldDataType.stringEnum:
return "String from a list of choices";
case IField_1.FieldDataType.intEnum:
return "Integer number from a list of choices";
case IField_1.FieldDataType.intBoolean:
return "Boolean 0/1";
case IField_1.FieldDataType.number:
return "Decimal number";
case IField_1.FieldDataType.long:
return "Large number";
case IField_1.FieldDataType.stringLookup:
return "String from a list of choices";
case IField_1.FieldDataType.intValueLookup:
return "Integer number from a list of choices";
case IField_1.FieldDataType.point3:
return "x, y, z coordinate array";
case IField_1.FieldDataType.intPoint3:
return "integer x, y, z coordinate array";
case IField_1.FieldDataType.longFormString:
return "Longer descriptive text";
case IField_1.FieldDataType.keyedObjectCollection:
return "Named set of objects";
case IField_1.FieldDataType.objectArray:
return "Array of objects";
case IField_1.FieldDataType.object:
return "Object";
case IField_1.FieldDataType.stringArray:
return "Array of strings";
case IField_1.FieldDataType.intRange:
return "Range of integers";
case IField_1.FieldDataType.floatRange:
return "Range of floats";
case IField_1.FieldDataType.minecraftFilter:
return "Minecraft filter";
case IField_1.FieldDataType.percentRange:
return "Percent Range";
case IField_1.FieldDataType.minecraftEventTrigger:
return "Minecraft Event Trigger";
case IField_1.FieldDataType.longFormStringArray:
return "Array of longer descriptive text";
case IField_1.FieldDataType.keyedStringCollection:
return "Keyed set of strings";
case IField_1.FieldDataType.version:
return "Version";
case IField_1.FieldDataType.uuid:
return "Unique Id";
case IField_1.FieldDataType.keyedBooleanCollection:
return "Keyed collection of boolean values";
case IField_1.FieldDataType.keyedStringArrayCollection:
return "Keyed collection of string arrays";
case IField_1.FieldDataType.arrayOfKeyedStringCollection:
return "Array of keyed string sets";
case IField_1.FieldDataType.keyedKeyedStringArrayCollection:
return "Keyed set of keyed string sets";
case IField_1.FieldDataType.keyedNumberCollection:
return "Keyed set of numbers";
case IField_1.FieldDataType.numberArray:
return "Array of numbers";
case IField_1.FieldDataType.point2:
return "a, b coordinate array";
case IField_1.FieldDataType.localizableString:
return "Localizable String";
case IField_1.FieldDataType.string:
return "String";
case IField_1.FieldDataType.molang:
return "Molang";
case IField_1.FieldDataType.molangArray:
return "Molang array";
default:
return "String";
}
}
}
exports.default = DataFormUtilities;
//# sourceMappingURL=../maps/dataform/DataFormUtilities.js.map