@featurevisor/core
Version:
Core package of Featurevisor for Node.js usage
114 lines • 5.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.configPlugin = exports.SCHEMA_VERSION = exports.DEFAULT_PARSER = exports.DEFAULT_PRETTY_DATAFILE = exports.DEFAULT_PRETTY_STATE = exports.DEFAULT_BUCKET_BY_ATTRIBUTE = exports.DEFAULT_TAGS = exports.DEFAULT_ENVIRONMENTS = exports.ROOT_DIR_PLACEHOLDER = exports.CONFIG_MODULE_NAME = exports.SITE_EXPORT_DIRECTORY_NAME = exports.DATAFILE_NAME_PATTERN = exports.DATAFILES_DIRECTORY_NAME = exports.STATE_DIRECTORY_NAME = exports.TESTS_DIRECTORY_NAME = exports.GROUPS_DIRECTORY_NAME = exports.ATTRIBUTES_DIRECTORY_NAME = exports.SEGMENTS_DIRECTORY_NAME = exports.FEATURES_DIRECTORY_NAME = void 0;
exports.getProjectConfig = getProjectConfig;
exports.showProjectConfig = showProjectConfig;
const path = require("path");
const parsers_1 = require("./parsers");
const filesystemAdapter_1 = require("../datasource/filesystemAdapter");
exports.FEATURES_DIRECTORY_NAME = "features";
exports.SEGMENTS_DIRECTORY_NAME = "segments";
exports.ATTRIBUTES_DIRECTORY_NAME = "attributes";
exports.GROUPS_DIRECTORY_NAME = "groups";
exports.TESTS_DIRECTORY_NAME = "tests";
exports.STATE_DIRECTORY_NAME = ".featurevisor";
exports.DATAFILES_DIRECTORY_NAME = "datafiles";
exports.DATAFILE_NAME_PATTERN = "featurevisor-%s.json";
exports.SITE_EXPORT_DIRECTORY_NAME = "out";
exports.CONFIG_MODULE_NAME = "featurevisor.config.js";
exports.ROOT_DIR_PLACEHOLDER = "<rootDir>";
exports.DEFAULT_ENVIRONMENTS = ["staging", "production"];
exports.DEFAULT_TAGS = ["all"];
exports.DEFAULT_BUCKET_BY_ATTRIBUTE = "userId";
exports.DEFAULT_PRETTY_STATE = true;
exports.DEFAULT_PRETTY_DATAFILE = false;
exports.DEFAULT_PARSER = "yml";
exports.SCHEMA_VERSION = "2"; // default schema version
// rootDirectoryPath: path to the root directory of the project (without ending with a slash)
function getProjectConfig(rootDirectoryPath) {
const baseConfig = {
environments: exports.DEFAULT_ENVIRONMENTS,
tags: exports.DEFAULT_TAGS,
defaultBucketBy: "userId",
parser: exports.DEFAULT_PARSER,
prettyState: exports.DEFAULT_PRETTY_STATE,
prettyDatafile: exports.DEFAULT_PRETTY_DATAFILE,
stringify: true,
adapter: filesystemAdapter_1.FilesystemAdapter,
featuresDirectoryPath: path.join(rootDirectoryPath, exports.FEATURES_DIRECTORY_NAME),
segmentsDirectoryPath: path.join(rootDirectoryPath, exports.SEGMENTS_DIRECTORY_NAME),
attributesDirectoryPath: path.join(rootDirectoryPath, exports.ATTRIBUTES_DIRECTORY_NAME),
groupsDirectoryPath: path.join(rootDirectoryPath, exports.GROUPS_DIRECTORY_NAME),
testsDirectoryPath: path.join(rootDirectoryPath, exports.TESTS_DIRECTORY_NAME),
stateDirectoryPath: path.join(rootDirectoryPath, exports.STATE_DIRECTORY_NAME),
datafilesDirectoryPath: path.join(rootDirectoryPath, exports.DATAFILES_DIRECTORY_NAME),
datafileNamePattern: exports.DATAFILE_NAME_PATTERN,
siteExportDirectoryPath: path.join(rootDirectoryPath, exports.SITE_EXPORT_DIRECTORY_NAME),
enforceCatchAllRule: false,
plugins: [],
maxVariableStringLength: undefined,
maxVariableArrayStringifiedLength: undefined,
maxVariableObjectStringifiedLength: undefined,
maxVariableJSONStringifiedLength: undefined,
};
const configModulePath = path.join(rootDirectoryPath, exports.CONFIG_MODULE_NAME);
const customConfig = require(configModulePath);
const mergedConfig = {};
Object.keys(baseConfig).forEach((key) => {
mergedConfig[key] =
typeof customConfig[key] !== "undefined" ? customConfig[key] : baseConfig[key];
if (key.endsWith("Path") && mergedConfig[key].indexOf(exports.ROOT_DIR_PLACEHOLDER) !== -1) {
mergedConfig[key] = mergedConfig[key].replace(exports.ROOT_DIR_PLACEHOLDER, rootDirectoryPath);
}
});
const finalConfig = mergedConfig;
if (typeof finalConfig.parser === "string") {
const allowedParsers = Object.keys(parsers_1.parsers);
if (allowedParsers.indexOf(finalConfig.parser) === -1) {
throw new Error(`Invalid parser: ${finalConfig.parser}`);
}
finalConfig.parser = parsers_1.parsers[finalConfig.parser];
}
return finalConfig;
}
function showProjectConfig(projectConfig, options = {}) {
if (options.json) {
console.log(options.pretty ? JSON.stringify(projectConfig, null, 2) : JSON.stringify(projectConfig));
return;
}
console.log("\nProject configuration:\n");
const keys = Object.keys(projectConfig);
const longestKeyLength = keys.reduce((acc, key) => (key.length > acc ? key.length : acc), 0);
const ignoreKeys = ["adapter", "parser"];
for (const key of keys) {
if (ignoreKeys.indexOf(key) !== -1) {
continue;
}
console.log(` - ${key.padEnd(longestKeyLength, " ")}: ${projectConfig[key]}`);
}
}
exports.configPlugin = {
command: "config",
handler: async ({ rootDirectoryPath, parsed }) => {
const projectConfig = getProjectConfig(rootDirectoryPath);
showProjectConfig(projectConfig, {
json: parsed.json,
pretty: parsed.pretty,
});
},
examples: [
{
command: "config",
description: "show the project configuration",
},
{
command: "config --print",
description: "show the project configuration as JSON",
},
{
command: "config --print --pretty",
description: "show the project configuration (as pretty JSON)",
},
],
};
//# sourceMappingURL=projectConfig.js.map