@stackbit/sdk
Version:
111 lines • 4.76 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.extendModelsWithPresetsIds = exports.getPresetDirs = exports.loadPresets = void 0;
const lodash_1 = __importDefault(require("lodash"));
const path_1 = __importDefault(require("path"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const utils_1 = require("@stackbit/utils");
const config_errors_1 = require("./config-errors");
async function loadPresets({ config, fallbackSrcType, fallbackSrcProjectId }) {
const presetFiles = [];
const presetsRelDirs = getPresetDirs(config);
for (const presetsRelDir of presetsRelDirs) {
const presetsDir = path_1.default.join(config.dirPath, presetsRelDir);
if (!(await fs_extra_1.default.pathExists(presetsDir))) {
continue;
}
const files = (await fs_extra_1.default.readdir(presetsDir))
.filter((fileName) => ['.json', '.yaml', '.yml'].includes(path_1.default.parse(fileName).ext))
.map((fileName) => path_1.default.join(presetsRelDir, fileName));
presetFiles.push(...files);
}
const presets = {};
const errors = [];
for (const presetFile of presetFiles) {
const presetsRelDir = path_1.default.dirname(presetFile);
const presetPath = path_1.default.join(config.dirPath, presetFile);
let presetData;
try {
presetData = await (0, utils_1.parseFile)(presetPath);
}
catch (err) {
errors.push(new config_errors_1.ConfigPresetsError(`Error parsing ${presetFile} (${err?.message})`));
continue;
}
const srcType = presetData.srcType ?? fallbackSrcType;
const srcProjectId = presetData.srcProjectId ?? fallbackSrcProjectId;
lodash_1.default.forEach(lodash_1.default.get(presetData, 'presets', []), (preset, i) => {
const presetId = `${presetFile}:presets[${i}]`;
const { thumbnail, ...rest } = preset;
presets[presetId] = {
...rest,
...(thumbnail ? { thumbnail: resolveThumbnailPath(thumbnail, presetsRelDir) } : null),
modelName: presetData.model,
...(srcType ? { srcType } : null),
...(srcProjectId ? { srcProjectId } : null)
};
});
}
return {
presets,
errors
};
}
exports.loadPresets = loadPresets;
function getPresetDirs(config) {
const defaultPresetsDirs = ['.stackbit/presets', 'node_modules/@stackbit/components/presets'];
if (config.presetSource?.type === 'files' && config.presetSource?.presetDirs) {
return [...new Set([...defaultPresetsDirs, ...config.presetSource.presetDirs])];
}
return defaultPresetsDirs;
}
exports.getPresetDirs = getPresetDirs;
function extendModelsWithPresetsIds({ models, presets }) {
// for older projects that pass the Model, we assume that all presets belong to the same content-source
const presetsIdsByContentSourceAndModel = {};
const presetsIdsByModel_deprecated = {};
for (const [presetId, preset] of Object.entries(presets)) {
(0, utils_1.append)(presetsIdsByContentSourceAndModel, [preset.srcType, preset.srcProjectId, preset.modelName], presetId);
(0, utils_1.append)(presetsIdsByModel_deprecated, preset.modelName, presetId);
}
// update models with presets IDs
return models.map((model) => {
let presetIdsForModel;
if ('srcType' in model && 'srcProjectId' in model) {
// "as" can be removed in typescript 4.3.5 and above
const srcType = model.srcType;
const srcProjectId = model.srcProjectId;
presetIdsForModel = presetsIdsByContentSourceAndModel[srcType]?.[srcProjectId]?.[model.name];
}
else {
presetIdsForModel = presetsIdsByModel_deprecated[model.name];
}
if (!presetIdsForModel) {
return model;
}
return {
...model,
presets: presetIdsForModel
};
});
}
exports.extendModelsWithPresetsIds = extendModelsWithPresetsIds;
function resolveThumbnailPath(thumbnail, dir) {
if (thumbnail.startsWith('//') || /https?:\/\//.test(thumbnail)) {
return thumbnail;
}
if (thumbnail.startsWith('/')) {
if (dir.endsWith('@stackbit/components/presets')) {
dir = dir.replace(/\/presets$/, '');
}
else {
dir = '';
}
thumbnail = thumbnail.replace(/^\//, '');
}
return path_1.default.join(dir, thumbnail);
}
//# sourceMappingURL=presets-loader.js.map