UNPKG

@stackbit/sdk

Version:
273 lines 10.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getModelFieldForModelKeyPath = exports.resolveLabelFieldForModel = exports.assignLabelFieldIfNeeded = exports.mapListItemsPropsOrSelfSpecificProps = exports.getListItemsOrSelf = exports.normalizeListFieldInPlace = exports.normalizeListField = exports.getListFieldItems = exports.isCustomModelListItems = exports.isReferenceListItems = exports.isModelListItems = exports.isObjectListItems = exports.isListField = exports.isListOfCustomModelsField = exports.isListOfReferencesField = exports.isListOfModelsField = exports.isListOfObjectsField = exports.isEnumField = exports.isCustomModelField = exports.isCrossReferenceField = exports.isReferenceField = exports.isModelField = exports.isObjectField = exports.isSingleInstanceModel = exports.isObjectModel = exports.isPageModel = exports.isListDataModel = exports.isDataModel = exports.isConfigModel = exports.getModelByName = void 0; const lodash_1 = __importDefault(require("lodash")); const config_consts_1 = require("../config/config-consts"); function getModelByName(models, modelName) { return models.find((model) => model.name === modelName); } exports.getModelByName = getModelByName; function isConfigModel(model) { return model.type === 'config'; } exports.isConfigModel = isConfigModel; function isDataModel(model) { return model.type === 'data'; } exports.isDataModel = isDataModel; function isListDataModel(model) { return isDataModel(model) && Boolean(model.isList); } exports.isListDataModel = isListDataModel; function isPageModel(model) { return model.type === 'page'; } exports.isPageModel = isPageModel; function isObjectModel(model) { return model.type === 'object'; } exports.isObjectModel = isObjectModel; function isSingleInstanceModel(model) { if (model.type === 'config') { return true; } else if (model.type === 'data') { return lodash_1.default.has(model, 'file') || lodash_1.default.get(model, 'singleInstance', false); } else if (model.type === 'page') { return lodash_1.default.has(model, 'file') || lodash_1.default.get(model, 'singleInstance', false); } return false; } exports.isSingleInstanceModel = isSingleInstanceModel; function isObjectField(field) { return field.type === 'object'; } exports.isObjectField = isObjectField; function isModelField(field) { return field.type === 'model'; } exports.isModelField = isModelField; function isReferenceField(field) { return field.type === 'reference'; } exports.isReferenceField = isReferenceField; function isCrossReferenceField(field) { return field.type === 'cross-reference'; } exports.isCrossReferenceField = isCrossReferenceField; function isCustomModelField(field, modelsByName) { // custom model field types are deprecated return !config_consts_1.FIELD_TYPES.includes(field.type) && lodash_1.default.has(modelsByName, field.type); } exports.isCustomModelField = isCustomModelField; function isEnumField(field) { return field.type === 'enum'; } exports.isEnumField = isEnumField; function isListOfObjectsField(field) { return isListField(field) && isObjectListItems(getListFieldItems(field)); } exports.isListOfObjectsField = isListOfObjectsField; function isListOfModelsField(field) { return isListField(field) && isModelListItems(getListFieldItems(field)); } exports.isListOfModelsField = isListOfModelsField; function isListOfReferencesField(field) { return isListField(field) && isReferenceListItems(getListFieldItems(field)); } exports.isListOfReferencesField = isListOfReferencesField; function isListOfCustomModelsField(field, modelsByName) { // custom model field types are deprecated return isListField(field) && isCustomModelListItems(getListFieldItems(field), modelsByName); } exports.isListOfCustomModelsField = isListOfCustomModelsField; function isListField(field) { // 'array' is deprecated field type return ['list', 'array'].includes(field.type); } exports.isListField = isListField; function isObjectListItems(items) { return items.type === 'object'; } exports.isObjectListItems = isObjectListItems; function isModelListItems(items) { return items.type === 'model'; } exports.isModelListItems = isModelListItems; function isReferenceListItems(items) { return items.type === 'reference'; } exports.isReferenceListItems = isReferenceListItems; function isCustomModelListItems(items, modelsByName) { // custom model field types are deprecated return !config_consts_1.FIELD_TYPES.includes(items.type) && (!modelsByName || lodash_1.default.has(modelsByName, items.type)); } exports.isCustomModelListItems = isCustomModelListItems; /** * Gets a list field and returns its items field. If list field does not define * items field, the default field is string: * * @example * listItemField = getListFieldItems({ * type: 'list', * name: '...', * items: { type: 'object', fields: [] } * } * listItemField => { * type: 'object', * name: '...', * fields: [] * } * * // list field without `items` * listItemField = getListFieldItems({ type: 'list', name: '...' } * listItemField => { type: 'string' } * * @param {Object} field * @return {Object} */ function getListFieldItems(field) { // items.type defaults to string return Object.assign({ type: 'string' }, field.items); } exports.getListFieldItems = getListFieldItems; function normalizeListField(field) { // in older versions, the list 'items' were optional and when weren't // specified a default list of strings was used. if (lodash_1.default.get(field, 'items.type')) { return field; } return { ...field, items: { ...(field.items ?? {}), type: 'string' } }; } exports.normalizeListField = normalizeListField; function normalizeListFieldInPlace(field) { // 'items.type' of list field default to 'string', set it explicitly if (!lodash_1.default.has(field, 'items.type')) { lodash_1.default.set(field, 'items.type', 'string'); } return field; } exports.normalizeListFieldInPlace = normalizeListFieldInPlace; function getListItemsOrSelf(field) { if (isListField(field)) { return normalizeListField(field).items; } return field; } exports.getListItemsOrSelf = getListItemsOrSelf; function mapListItemsPropsOrSelfSpecificProps(field, func) { if (isListField(field)) { const listItems = normalizeListField(field).items; const mappedListItems = func(listItems); return { ...field, items: mappedListItems }; } return func(field); } exports.mapListItemsPropsOrSelfSpecificProps = mapListItemsPropsOrSelfSpecificProps; function assignLabelFieldIfNeeded(modelOrField) { if (modelOrField.labelField) { return; } const labelField = resolveLabelFieldForModel(modelOrField); if (labelField) { modelOrField.labelField = labelField; } } exports.assignLabelFieldIfNeeded = assignLabelFieldIfNeeded; function resolveLabelFieldForModel(modelOrField) { const fields = lodash_1.default.get(modelOrField, 'fields'); let labelField = lodash_1.default.get(modelOrField, 'labelField', null); if (labelField) { return labelField; } // see if there is a field named 'title' let titleField = lodash_1.default.find(fields, (field) => field.name === 'title' && ['string', 'text'].includes(field.type)); if (!titleField) { // see if there is a field named 'label' titleField = lodash_1.default.find(fields, (field) => field.name === 'label' && ['string', 'text'].includes(field.type)); } if (!titleField) { // get the first 'string' field titleField = lodash_1.default.find(fields, { type: 'string' }); } if (titleField) { labelField = lodash_1.default.get(titleField, 'name'); } return labelField || null; } exports.resolveLabelFieldForModel = resolveLabelFieldForModel; function getModelFieldForModelKeyPath(model, modelKeyPath) { function _getField(field, modelKeyPath) { if (modelKeyPath.length === 0) { return field; } else if (isObjectField(field)) { return _getObjectFields(field, modelKeyPath); } else if (isListField(field)) { return _getListItems(field, modelKeyPath); } else { return null; } } function _getObjectFields(field, modelKeyPath) { if (modelKeyPath.length === 0) { return field; } const key = modelKeyPath.shift(); if (key !== 'fields' || !field.fields) { return null; } if (modelKeyPath.length === 0) { return null; } const fieldName = modelKeyPath.shift(); const childField = lodash_1.default.find(field.fields, (field) => field.name === fieldName); if (!childField) { return null; } return _getField(childField, modelKeyPath); } function _getListItems(field, modelKeyPath) { if (modelKeyPath.length === 0) { return field; } const key = modelKeyPath.shift(); if (key !== 'items' || !field.items) { return null; } if (modelKeyPath.length === 0) { return field.items; } if (!isObjectListItems(field.items)) { return null; } return _getObjectFields(field.items, modelKeyPath); } modelKeyPath = modelKeyPath.slice(); if (!model) { return null; } else if (isListDataModel(model)) { return _getListItems(model, modelKeyPath); } else { return _getObjectFields(model, modelKeyPath); } } exports.getModelFieldForModelKeyPath = getModelFieldForModelKeyPath; //# sourceMappingURL=model-utils.js.map