@stackbit/sdk
Version:
114 lines • 4.71 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.matchCMS = void 0;
const path_1 = __importDefault(require("path"));
const lodash_1 = __importDefault(require("lodash"));
const utils_1 = require("@stackbit/utils");
const file_browser_1 = require("./file-browser");
const analyzer_utils_1 = require("./analyzer-utils");
async function matchCMS(options) {
const fileBrowser = (0, file_browser_1.getFileBrowserFromOptions)(options);
await fileBrowser.listFiles();
let cssMatch = null;
await (0, utils_1.forEachPromise)(CSSMatchers, async (cssMatcher) => {
if (cssMatcher.match) {
const cmsDataResult = await cssMatcher.match(fileBrowser);
if (cmsDataResult) {
cssMatch = {
cmsName: cssMatcher.name,
cmsData: cmsDataResult
};
return false;
}
}
else if (cssMatcher.matchByPackageName) {
const dirs = await (0, analyzer_utils_1.findDirsWithPackageDependency)(fileBrowser, lodash_1.default.castArray(cssMatcher.matchByPackageName));
if (dirs.length === 1) {
cssMatch = {
cmsName: cssMatcher.name
};
return false;
}
}
});
return cssMatch;
}
exports.matchCMS = matchCMS;
const CSSMatchers = [
{
name: 'contentful',
matchByPackageName: ['gatsby-source-contentful', 'sourcebit-source-contentful', 'contentful', 'contentful-management']
},
{
name: 'sanity',
match: async (fileBrowser) => {
const configFile = 'sanity.json';
const configFileExists = fileBrowser.fileNameExists(configFile);
if (!configFileExists) {
return null;
}
const configFilePaths = fileBrowser.getFilePathsForFileName(configFile);
const rootConfigPath = await (0, utils_1.findPromise)(configFilePaths, async (configFilePath) => {
const config = await fileBrowser.getFileData(configFilePath);
return lodash_1.default.has(config, 'root') || lodash_1.default.has(config, 'api');
});
if (rootConfigPath) {
const config = await fileBrowser.getFileData(rootConfigPath);
return lodash_1.default.omitBy({
studioPath: path_1.default.parse(rootConfigPath).dir,
projectId: lodash_1.default.get(config, 'api.projectId'),
dataset: lodash_1.default.get(config, 'api.dataset')
}, lodash_1.default.isNil);
}
return null;
}
},
{
name: 'forestry',
match: async (fileBrowser) => {
const configFolder = '.forestry';
const configFolderExists = fileBrowser.directoryPathExists(configFolder);
if (!configFolderExists) {
return null;
}
return {
forestryDir: configFolder
};
}
},
{
name: 'netlifycms',
match: async (fileBrowser) => {
const configFile = 'config.yml';
const configFileExists = fileBrowser.fileNameExists(configFile);
if (!configFileExists) {
return null;
}
const configFilePaths = fileBrowser.getFilePathsForFileName(configFile);
const netlifyCMSConfigFilePaths = await (0, utils_1.reducePromise)(configFilePaths, async (filePaths, filePath) => {
const data = await fileBrowser.getFileData(filePath);
const hasBackend = lodash_1.default.has(data, 'backend');
if (!hasBackend) {
return filePaths;
}
const requiredFields = ['backend', 'media_folder', 'collections'];
const minNumOfRequiredFields = 2;
const numOfRequiredFields = lodash_1.default.reduce(requiredFields, (count, field) => count + (lodash_1.default.has(data, field) ? 1 : 0), 0);
if (numOfRequiredFields < minNumOfRequiredFields) {
return filePaths;
}
return filePaths.concat(filePath);
}, []);
if (netlifyCMSConfigFilePaths.length === 1) {
return {
configPath: netlifyCMSConfigFilePaths[0]
};
}
return null;
}
}
];
//# sourceMappingURL=cms-matcher.js.map