UNPKG

@featurevisor/core

Version:

Core package of Featurevisor for Node.js usage

114 lines 5.69 kB
"use strict"; 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