@stackbit/sdk
Version:
102 lines • 4.47 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateContentModels = exports.validateConfig = exports.validateBaseConfig = void 0;
const lodash_1 = __importDefault(require("lodash"));
const config_schema_1 = require("./config-schema");
const config_errors_1 = require("./config-errors");
function validateBaseConfig(config) {
const validationOptions = { abortEarly: false, context: { config: config } };
const validationResult = config_schema_1.stackbitConfigBaseSchema.validate(config, validationOptions);
const errors = mapJoiErrorsToConfigValidationErrors(validationResult);
return {
config: validationResult.value,
valid: lodash_1.default.isEmpty(errors),
errors
};
}
exports.validateBaseConfig = validateBaseConfig;
function validateConfig(config) {
const validationOptions = { abortEarly: false, context: { config: config } };
const validationResult = config_schema_1.stackbitConfigFullSchema.validate(config, validationOptions);
const validatedConfig = validationResult.value;
const errors = mapJoiErrorsToConfigValidationErrors(validationResult);
const valid = lodash_1.default.isEmpty(errors);
const invalidModelNames = getInvalidModelNames(errors, 'models', config);
const validatedModels = validatedConfig.models ?? [];
lodash_1.default.forEach(validatedModels, (model) => {
if (invalidModelNames.includes(model.name)) {
lodash_1.default.set(model, '__metadata.invalid', true);
}
});
return {
config: validatedConfig,
valid,
errors
};
}
exports.validateConfig = validateConfig;
function validateContentModels(contentModels, models) {
const modelMap = lodash_1.default.keyBy(models, 'name');
const config = { contentModels: contentModels };
const validationResult = config_schema_1.contentModelsSchema.validate(config, {
abortEarly: false,
context: {
modelMap: modelMap
}
});
const validatedConfig = validationResult.value;
const errors = mapJoiErrorsToConfigValidationErrors(validationResult);
const valid = lodash_1.default.isEmpty(errors);
const invalidModelNames = getInvalidModelNames(errors, 'contentModels', config);
const validatedContentModels = validatedConfig.contentModels ?? {};
lodash_1.default.forEach(validatedContentModels, (contentModel, modelName) => {
if (invalidModelNames.includes(modelName)) {
lodash_1.default.set(contentModel, '__metadata.invalid', true);
}
});
return {
contentModels: validatedContentModels,
valid,
errors
};
}
exports.validateContentModels = validateContentModels;
function mapJoiErrorsToConfigValidationErrors(validationResult) {
const joiErrors = validationResult.error?.details || [];
return joiErrors.map((validationError) => {
const normFieldPath = validationError.path.slice();
if (validationError.path[0] === 'models' && typeof validationError.path[1] == 'string') {
const modelName = validationError.path[1];
normFieldPath[1] = lodash_1.default.findIndex(validationResult.value.models, { name: modelName });
}
return new config_errors_1.ConfigValidationError({
type: validationError.type,
message: validationError.message,
fieldPath: validationError.path,
normFieldPath: normFieldPath,
value: validationError.context?.value
});
});
}
function getInvalidModelNames(errors, configKey, value) {
// get array of invalid model names by iterating errors and filtering these
// having fieldPath starting with ['models', modelName]
return lodash_1.default.reduce(errors, (modelNames, error) => {
if (error.fieldPath[0] === configKey) {
if (typeof error.fieldPath[1] == 'string') {
modelNames.push(error.fieldPath[1]);
}
else if (typeof error.fieldPath[1] == 'number') {
const model = value[configKey][error.fieldPath[1]];
if (model?.name) {
modelNames.push(model?.name);
}
}
}
return modelNames;
}, []);
}
//# sourceMappingURL=config-validator.js.map