@featurevisor/core
Version:
Core package of Featurevisor for Node.js usage
135 lines • 4.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildPlugin = void 0;
exports.buildProject = buildProject;
const config_1 = require("../config");
const revision_1 = require("./revision");
const buildDatafile_1 = require("./buildDatafile");
async function buildForEnvironment({ projectConfig, datasource, nextRevision, environment, tags, cliOptions, }) {
console.log(`\nBuilding datafiles for environment: ${environment}`);
const existingState = await datasource.readState(environment);
for (const tag of tags) {
console.log(`\n => Tag: ${tag}`);
const datafileContent = await (0, buildDatafile_1.buildDatafile)(projectConfig, datasource, {
schemaVersion: cliOptions.schemaVersion || config_1.SCHEMA_VERSION,
revision: nextRevision,
revisionFromHash: cliOptions.revisionFromHash,
environment: environment,
tag: tag,
inflate: cliOptions.inflate,
}, existingState);
// write datafile for environment/tag
await datasource.writeDatafile(datafileContent, {
environment,
tag,
datafilesDir: cliOptions.datafilesDir,
});
}
if (typeof cliOptions.stateFiles === "undefined" || cliOptions.stateFiles) {
// write state for environment
await datasource.writeState(environment, existingState);
// write revision
await datasource.writeRevision(nextRevision);
}
}
async function buildProject(deps, cliOptions = {}) {
const { projectConfig, datasource } = deps;
/**
* This build process does not write to disk, and prints only to stdout.
*
* This is ideally for test runners in other languages,
* when they wish to get datafile for a single feature and/or environment,
* so they can run tests against their own SDKs in other languages.
*
* This way we centralize the datafile generation in one place,
* while tests can be run anywhere else.
*/
if (cliOptions.environment && cliOptions.json) {
const datafileContent = await (0, buildDatafile_1.getCustomDatafile)({
featureKey: cliOptions.feature,
environment: cliOptions.environment,
projectConfig,
datasource,
revision: cliOptions.revision,
schemaVersion: cliOptions.schemaVersion,
});
if (cliOptions.pretty) {
console.log(JSON.stringify(datafileContent, null, 2));
}
else {
console.log(JSON.stringify(datafileContent));
}
return;
}
/**
* Regular build process that writes to disk.
*/
const tags = projectConfig.tags;
const environments = projectConfig.environments;
const currentRevision = await datasource.readRevision();
console.log("\nCurrent revision:", currentRevision);
const nextRevision = (cliOptions.revision && cliOptions.revision.toString()) || (0, revision_1.getNextRevision)(currentRevision);
// with environments
if (Array.isArray(environments)) {
for (const environment of environments) {
await buildForEnvironment({
projectConfig,
datasource,
nextRevision,
environment,
tags,
cliOptions,
});
}
}
// no environment
if (environments === false) {
await buildForEnvironment({
projectConfig,
datasource,
nextRevision,
environment: false,
tags,
cliOptions,
});
}
console.log("\nLatest revision:", nextRevision);
}
exports.buildPlugin = {
command: "build",
handler: async function ({ rootDirectoryPath, projectConfig, datasource, parsed }) {
await buildProject({
rootDirectoryPath,
projectConfig,
datasource,
options: parsed,
}, parsed);
},
examples: [
{
command: "build",
description: "build datafiles for all environments and tags",
},
{
command: "build --revision=123",
description: "build datafiles starting with revision value as 123",
},
{
command: "build --environment=production",
description: "build datafiles for production environment",
},
{
command: "build --print --environment=production --feature=featureKey",
description: "print datafile for a feature in production environment",
},
{
command: "build --print --environment=production --pretty",
description: "print datafile with pretty print",
},
{
command: "build --no-state-files",
description: "build datafiles without writing state files",
},
],
};
//# sourceMappingURL=buildProject.js.map