Rename FeatureFlag -> Feature
This commit is contained in:
parent
b16314e16c
commit
6de05e4b24
24 changed files with 116 additions and 124 deletions
2
lib/codeql.js
generated
2
lib/codeql.js
generated
|
|
@ -237,7 +237,7 @@ async function setupCodeQL(codeqlURL, apiDetails, tempDir, variant, featureFlags
|
|||
// allows us to quickly rollback a broken bundle that has made its way
|
||||
// into the toolcache.
|
||||
codeqlURL === undefined &&
|
||||
(await featureFlags.getValue(feature_flags_1.FeatureFlag.BypassToolcacheEnabled))
|
||||
(await featureFlags.getValue(feature_flags_1.Feature.BypassToolcacheEnabled))
|
||||
? "a specific version of CodeQL was not requested and the bypass toolcache feature flag is enabled"
|
||||
: undefined;
|
||||
const forceLatest = forceLatestReason !== undefined;
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
4
lib/codeql.test.js
generated
4
lib/codeql.test.js
generated
|
|
@ -208,7 +208,7 @@ for (const [isFeatureFlagEnabled, toolsInput, shouldToolcacheBeBypassed,] of TOO
|
|||
await mockApiAndSetupCodeQL({
|
||||
version: defaults.bundleVersion,
|
||||
apiDetails: sampleApiDetails,
|
||||
featureFlags: (0, feature_flags_1.createFeatureFlags)(isFeatureFlagEnabled ? [feature_flags_1.FeatureFlag.BypassToolcacheEnabled] : []),
|
||||
featureFlags: (0, feature_flags_1.createFeatureFlags)(isFeatureFlagEnabled ? [feature_flags_1.Feature.BypassToolcacheEnabled] : []),
|
||||
toolsInput: { input: toolsInput },
|
||||
tmpDir,
|
||||
});
|
||||
|
|
@ -354,7 +354,7 @@ const injectedConfigMacro = ava_1.default.macro({
|
|||
tempDir,
|
||||
augmentationProperties,
|
||||
};
|
||||
await codeqlObject.databaseInitCluster(thisStubConfig, "", undefined, undefined, (0, feature_flags_1.createFeatureFlags)([feature_flags_1.FeatureFlag.CliConfigFileEnabled]), (0, logging_1.getRunnerLogger)(true));
|
||||
await codeqlObject.databaseInitCluster(thisStubConfig, "", undefined, undefined, (0, feature_flags_1.createFeatureFlags)([feature_flags_1.Feature.CliConfigFileEnabled]), (0, logging_1.getRunnerLogger)(true));
|
||||
const args = runnerConstructorStub.firstCall.args[1];
|
||||
// should have used an config file
|
||||
const configArg = args.find((arg) => arg.startsWith("--codescanning-config="));
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
2
lib/config-utils.js
generated
2
lib/config-utils.js
generated
|
|
@ -151,7 +151,7 @@ async function addBuiltinSuiteQueries(languages, codeQL, resultMap, packs, suite
|
|||
languages.includes("javascript") &&
|
||||
(found === "security-extended" || found === "security-and-quality") &&
|
||||
!((_a = packs.javascript) === null || _a === void 0 ? void 0 : _a.some(isMlPoweredJsQueriesPack)) &&
|
||||
(await featureFlags.getValue(feature_flags_1.FeatureFlag.MlPoweredQueriesEnabled, codeQL))) {
|
||||
(await featureFlags.getValue(feature_flags_1.Feature.MlPoweredQueriesEnabled, codeQL))) {
|
||||
if (!packs.javascript) {
|
||||
packs.javascript = [];
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
4
lib/config-utils.test.js
generated
4
lib/config-utils.test.js
generated
|
|
@ -987,9 +987,7 @@ const mlPoweredQueriesMacro = ava_1.default.macro({
|
|||
return { packs: [] };
|
||||
},
|
||||
});
|
||||
const { packs } = await configUtils.initConfig("javascript", queriesInput, packsInput, undefined, undefined, undefined, false, false, "", "", { owner: "github", repo: "example " }, tmpDir, codeQL, tmpDir, gitHubVersion, sampleApiDetails, (0, feature_flags_1.createFeatureFlags)(isMlPoweredQueriesFlagEnabled
|
||||
? [feature_flags_1.FeatureFlag.MlPoweredQueriesEnabled]
|
||||
: []), (0, logging_1.getRunnerLogger)(true));
|
||||
const { packs } = await configUtils.initConfig("javascript", queriesInput, packsInput, undefined, undefined, undefined, false, false, "", "", { owner: "github", repo: "example " }, tmpDir, codeQL, tmpDir, gitHubVersion, sampleApiDetails, (0, feature_flags_1.createFeatureFlags)(isMlPoweredQueriesFlagEnabled ? [feature_flags_1.Feature.MlPoweredQueriesEnabled] : []), (0, logging_1.getRunnerLogger)(true));
|
||||
if (expectedVersionString !== undefined) {
|
||||
t.deepEqual(packs, {
|
||||
[languages_1.Language.javascript]: [
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
38
lib/feature-flags.js
generated
38
lib/feature-flags.js
generated
|
|
@ -19,35 +19,35 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|||
return result;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.createFeatureFlags = exports.GitHubFeatureFlags = exports.featureFlagConfig = exports.FeatureFlag = void 0;
|
||||
exports.createFeatureFlags = exports.GitHubFeatureFlags = exports.featureConfig = exports.Feature = void 0;
|
||||
const api_client_1 = require("./api-client");
|
||||
const util = __importStar(require("./util"));
|
||||
var FeatureFlag;
|
||||
(function (FeatureFlag) {
|
||||
FeatureFlag["BypassToolcacheEnabled"] = "bypass_toolcache_enabled";
|
||||
FeatureFlag["MlPoweredQueriesEnabled"] = "ml_powered_queries_enabled";
|
||||
FeatureFlag["TrapCachingEnabled"] = "trap_caching_enabled";
|
||||
FeatureFlag["GolangExtractionReconciliationEnabled"] = "golang_extraction_reconciliation_enabled";
|
||||
FeatureFlag["CliConfigFileEnabled"] = "cli_config_file_enabled";
|
||||
})(FeatureFlag = exports.FeatureFlag || (exports.FeatureFlag = {}));
|
||||
exports.featureFlagConfig = {
|
||||
[FeatureFlag.BypassToolcacheEnabled]: {
|
||||
var Feature;
|
||||
(function (Feature) {
|
||||
Feature["BypassToolcacheEnabled"] = "bypass_toolcache_enabled";
|
||||
Feature["MlPoweredQueriesEnabled"] = "ml_powered_queries_enabled";
|
||||
Feature["TrapCachingEnabled"] = "trap_caching_enabled";
|
||||
Feature["GolangExtractionReconciliationEnabled"] = "golang_extraction_reconciliation_enabled";
|
||||
Feature["CliConfigFileEnabled"] = "cli_config_file_enabled";
|
||||
})(Feature = exports.Feature || (exports.Feature = {}));
|
||||
exports.featureConfig = {
|
||||
[Feature.BypassToolcacheEnabled]: {
|
||||
envVar: "CODEQL_BYPASS_TOOLCACHE",
|
||||
minimumVersion: undefined,
|
||||
},
|
||||
[FeatureFlag.MlPoweredQueriesEnabled]: {
|
||||
[Feature.MlPoweredQueriesEnabled]: {
|
||||
envVar: "CODEQL_ML_POWERED_QUERIES",
|
||||
minimumVersion: "2.7.5",
|
||||
},
|
||||
[FeatureFlag.TrapCachingEnabled]: {
|
||||
[Feature.TrapCachingEnabled]: {
|
||||
envVar: "CODEQL_TRAP_CACHING",
|
||||
minimumVersion: undefined,
|
||||
},
|
||||
[FeatureFlag.GolangExtractionReconciliationEnabled]: {
|
||||
[Feature.GolangExtractionReconciliationEnabled]: {
|
||||
envVar: "CODEQL_GOLANG_EXTRACTION_RECONCILIATION",
|
||||
minimumVersion: undefined,
|
||||
},
|
||||
[FeatureFlag.CliConfigFileEnabled]: {
|
||||
[Feature.CliConfigFileEnabled]: {
|
||||
envVar: "CODEQL_PASS_CONFIG_TO_CLI",
|
||||
minimumVersion: "2.10.1",
|
||||
},
|
||||
|
|
@ -72,20 +72,20 @@ class GitHubFeatureFlags {
|
|||
* @throws if a `minimumVersion` is specified for the feature flag, and `codeql` is not provided.
|
||||
*/
|
||||
async getValue(flag, codeql) {
|
||||
if (!codeql && exports.featureFlagConfig[flag].minimumVersion) {
|
||||
if (!codeql && exports.featureConfig[flag].minimumVersion) {
|
||||
throw new Error(`A minimum version is specified for feature flag ${flag}, but no instance of CodeQL was provided.`);
|
||||
}
|
||||
// Bypassing the toolcache is disabled in test mode.
|
||||
if (flag === FeatureFlag.BypassToolcacheEnabled && util.isInTestMode()) {
|
||||
if (flag === Feature.BypassToolcacheEnabled && util.isInTestMode()) {
|
||||
return false;
|
||||
}
|
||||
const envVar = (process.env[exports.featureFlagConfig[flag].envVar] || "").toLocaleLowerCase();
|
||||
const envVar = (process.env[exports.featureConfig[flag].envVar] || "").toLocaleLowerCase();
|
||||
// Do not use this feature if user explicitly disables it via an environment variable.
|
||||
if (envVar === "false") {
|
||||
return false;
|
||||
}
|
||||
// Never use this feature if the CLI version explicitly can't support it.
|
||||
const minimumVersion = exports.featureFlagConfig[flag].minimumVersion;
|
||||
const minimumVersion = exports.featureConfig[flag].minimumVersion;
|
||||
if (codeql && minimumVersion) {
|
||||
if (!(await util.codeQlVersionAbove(codeql, minimumVersion))) {
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"feature-flags.js","sourceRoot":"","sources":["../src/feature-flags.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"feature-flags.js","sourceRoot":"","sources":["../src/feature-flags.ts"],"names":[],"mappings":"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"}
|
||||
38
lib/feature-flags.test.js
generated
38
lib/feature-flags.test.js
generated
|
|
@ -31,7 +31,7 @@ for (const variant of ALL_FEATURE_FLAGS_DISABLED_VARIANTS) {
|
|||
await (0, util_1.withTmpDir)(async (tmpDir) => {
|
||||
const loggedMessages = [];
|
||||
const featureFlags = setUpTests(tmpDir, (0, testing_utils_1.getRecordingLogger)(loggedMessages), variant.gitHubVersion);
|
||||
for (const flag of Object.values(feature_flags_1.FeatureFlag)) {
|
||||
for (const flag of Object.values(feature_flags_1.Feature)) {
|
||||
t.assert((await featureFlags.getValue(flag, includeCodeQlIfRequired(flag))) ===
|
||||
false);
|
||||
}
|
||||
|
|
@ -46,7 +46,7 @@ for (const variant of ALL_FEATURE_FLAGS_DISABLED_VARIANTS) {
|
|||
const loggedMessages = [];
|
||||
const featureFlags = setUpTests(tmpDir, (0, testing_utils_1.getRecordingLogger)(loggedMessages));
|
||||
(0, testing_utils_1.mockFeatureFlagApiEndpoint)(403, {});
|
||||
for (const flag of Object.values(feature_flags_1.FeatureFlag)) {
|
||||
for (const flag of Object.values(feature_flags_1.Feature)) {
|
||||
t.assert((await featureFlags.getValue(flag, includeCodeQlIfRequired(flag))) ===
|
||||
false);
|
||||
}
|
||||
|
|
@ -58,7 +58,7 @@ for (const variant of ALL_FEATURE_FLAGS_DISABLED_VARIANTS) {
|
|||
const loggedMessages = [];
|
||||
const featureFlags = setUpTests(tmpDir, (0, testing_utils_1.getRecordingLogger)(loggedMessages));
|
||||
(0, testing_utils_1.mockFeatureFlagApiEndpoint)(200, {});
|
||||
for (const flag of Object.values(feature_flags_1.FeatureFlag)) {
|
||||
for (const flag of Object.values(feature_flags_1.Feature)) {
|
||||
t.assert((await featureFlags.getValue(flag, includeCodeQlIfRequired(flag))) ===
|
||||
false);
|
||||
}
|
||||
|
|
@ -69,24 +69,24 @@ for (const variant of ALL_FEATURE_FLAGS_DISABLED_VARIANTS) {
|
|||
await (0, util_1.withTmpDir)(async (tmpDir) => {
|
||||
const featureFlags = setUpTests(tmpDir);
|
||||
(0, testing_utils_1.mockFeatureFlagApiEndpoint)(500, {});
|
||||
await t.throwsAsync(async () => featureFlags.getValue(feature_flags_1.FeatureFlag.MlPoweredQueriesEnabled, includeCodeQlIfRequired(feature_flags_1.FeatureFlag.MlPoweredQueriesEnabled)), {
|
||||
await t.throwsAsync(async () => featureFlags.getValue(feature_flags_1.Feature.MlPoweredQueriesEnabled, includeCodeQlIfRequired(feature_flags_1.Feature.MlPoweredQueriesEnabled)), {
|
||||
message: "Encountered an error while trying to load feature flags: Error: some error message",
|
||||
});
|
||||
});
|
||||
});
|
||||
for (const featureFlag of Object.keys(feature_flags_1.featureFlagConfig)) {
|
||||
for (const featureFlag of Object.keys(feature_flags_1.featureConfig)) {
|
||||
(0, ava_1.default)(`Only feature flag '${featureFlag}' is enabled if enabled in the API response. Other flags disabled`, async (t) => {
|
||||
await (0, util_1.withTmpDir)(async (tmpDir) => {
|
||||
const featureFlags = setUpTests(tmpDir);
|
||||
// set all feature flags to false except the one we're testing
|
||||
const expectedFeatureFlags = {};
|
||||
for (const f of Object.keys(feature_flags_1.featureFlagConfig)) {
|
||||
for (const f of Object.keys(feature_flags_1.featureConfig)) {
|
||||
expectedFeatureFlags[f] = f === featureFlag;
|
||||
}
|
||||
(0, testing_utils_1.mockFeatureFlagApiEndpoint)(200, expectedFeatureFlags);
|
||||
// retrieve the values of the actual feature flags
|
||||
const actualFeatureFlags = {};
|
||||
for (const f of Object.keys(feature_flags_1.featureFlagConfig)) {
|
||||
for (const f of Object.keys(feature_flags_1.featureConfig)) {
|
||||
actualFeatureFlags[f] = await featureFlags.getValue(f, includeCodeQlIfRequired(f));
|
||||
}
|
||||
// Alls flags should be false except the one we're testing
|
||||
|
|
@ -101,7 +101,7 @@ for (const featureFlag of Object.keys(feature_flags_1.featureFlagConfig)) {
|
|||
// feature flag should be disabled initially
|
||||
t.assert(!(await featureFlags.getValue(featureFlag, includeCodeQlIfRequired(featureFlag))));
|
||||
// set env var to true and check that the feature flag is now enabled
|
||||
process.env[feature_flags_1.featureFlagConfig[featureFlag].envVar] = "true";
|
||||
process.env[feature_flags_1.featureConfig[featureFlag].envVar] = "true";
|
||||
t.assert(await featureFlags.getValue(featureFlag, includeCodeQlIfRequired(featureFlag)));
|
||||
});
|
||||
});
|
||||
|
|
@ -113,11 +113,11 @@ for (const featureFlag of Object.keys(feature_flags_1.featureFlagConfig)) {
|
|||
// feature flag should be enabled initially
|
||||
t.assert(await featureFlags.getValue(featureFlag, includeCodeQlIfRequired(featureFlag)));
|
||||
// set env var to false and check that the feature flag is now disabled
|
||||
process.env[feature_flags_1.featureFlagConfig[featureFlag].envVar] = "false";
|
||||
process.env[feature_flags_1.featureConfig[featureFlag].envVar] = "false";
|
||||
t.assert(!(await featureFlags.getValue(featureFlag, includeCodeQlIfRequired(featureFlag))));
|
||||
});
|
||||
});
|
||||
if (feature_flags_1.featureFlagConfig[featureFlag].minimumVersion !== undefined) {
|
||||
if (feature_flags_1.featureConfig[featureFlag].minimumVersion !== undefined) {
|
||||
(0, ava_1.default)(`Getting Feature Flag '${featureFlag} should throw if no codeql is provided`, async (t) => {
|
||||
await (0, util_1.withTmpDir)(async (tmpDir) => {
|
||||
const featureFlags = setUpTests(tmpDir);
|
||||
|
|
@ -129,8 +129,8 @@ for (const featureFlag of Object.keys(feature_flags_1.featureFlagConfig)) {
|
|||
});
|
||||
});
|
||||
}
|
||||
if (feature_flags_1.featureFlagConfig[featureFlag].minimumVersion !== undefined) {
|
||||
(0, ava_1.default)(`Feature flag '${featureFlag}' is disabled if the minimum CLI version is below ${feature_flags_1.featureFlagConfig[featureFlag].minimumVersion}`, async (t) => {
|
||||
if (feature_flags_1.featureConfig[featureFlag].minimumVersion !== undefined) {
|
||||
(0, ava_1.default)(`Feature flag '${featureFlag}' is disabled if the minimum CLI version is below ${feature_flags_1.featureConfig[featureFlag].minimumVersion}`, async (t) => {
|
||||
await (0, util_1.withTmpDir)(async (tmpDir) => {
|
||||
const featureFlags = setUpTests(tmpDir);
|
||||
const expectedFeatureFlags = initializeFeatures(true);
|
||||
|
|
@ -140,29 +140,29 @@ for (const featureFlag of Object.keys(feature_flags_1.featureFlagConfig)) {
|
|||
t.assert(!(await featureFlags.getValue(featureFlag, codeql)));
|
||||
// even setting the env var to true should not enable the feature flag if
|
||||
// the minimum CLI version is not met
|
||||
process.env[feature_flags_1.featureFlagConfig[featureFlag].envVar] = "true";
|
||||
process.env[feature_flags_1.featureConfig[featureFlag].envVar] = "true";
|
||||
t.assert(!(await featureFlags.getValue(featureFlag, codeql)));
|
||||
// feature flag should be enabled when a new CLI version is set
|
||||
// and env var is not set
|
||||
process.env[feature_flags_1.featureFlagConfig[featureFlag].envVar] = "";
|
||||
codeql = (0, testing_utils_1.mockCodeQLVersion)(feature_flags_1.featureFlagConfig[featureFlag].minimumVersion);
|
||||
process.env[feature_flags_1.featureConfig[featureFlag].envVar] = "";
|
||||
codeql = (0, testing_utils_1.mockCodeQLVersion)(feature_flags_1.featureConfig[featureFlag].minimumVersion);
|
||||
t.assert(await featureFlags.getValue(featureFlag, codeql));
|
||||
// set env var to false and check that the feature flag is now disabled
|
||||
process.env[feature_flags_1.featureFlagConfig[featureFlag].envVar] = "false";
|
||||
process.env[feature_flags_1.featureConfig[featureFlag].envVar] = "false";
|
||||
t.assert(!(await featureFlags.getValue(featureFlag, codeql)));
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
function assertAllFeaturesUndefinedInApi(t, loggedMessages) {
|
||||
for (const featureFlag of Object.keys(feature_flags_1.featureFlagConfig)) {
|
||||
for (const featureFlag of Object.keys(feature_flags_1.featureConfig)) {
|
||||
t.assert(loggedMessages.find((v) => v.type === "debug" &&
|
||||
v.message.includes(featureFlag) &&
|
||||
v.message.includes("considering it disabled")) !== undefined);
|
||||
}
|
||||
}
|
||||
function initializeFeatures(initialValue) {
|
||||
return Object.keys(feature_flags_1.featureFlagConfig).reduce((features, key) => {
|
||||
return Object.keys(feature_flags_1.featureConfig).reduce((features, key) => {
|
||||
features[key] = initialValue;
|
||||
return features;
|
||||
}, {});
|
||||
|
|
@ -172,7 +172,7 @@ function setUpTests(tmpDir, logger = (0, logging_1.getRunnerLogger)(true), gitHu
|
|||
return new feature_flags_1.GitHubFeatureFlags(gitHubVersion, testApiDetails, testRepositoryNwo, logger);
|
||||
}
|
||||
function includeCodeQlIfRequired(featureFlag) {
|
||||
return feature_flags_1.featureFlagConfig[featureFlag].minimumVersion !== undefined
|
||||
return feature_flags_1.featureConfig[featureFlag].minimumVersion !== undefined
|
||||
? (0, testing_utils_1.mockCodeQLVersion)("9.9.9")
|
||||
: undefined;
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
2
lib/init-action.js
generated
2
lib/init-action.js
generated
|
|
@ -163,7 +163,7 @@ async function getTrapCachingEnabled(featureFlags) {
|
|||
if (trapCaching !== undefined) {
|
||||
return trapCaching === "true";
|
||||
}
|
||||
return await featureFlags.getValue(feature_flags_1.FeatureFlag.TrapCachingEnabled);
|
||||
return await featureFlags.getValue(feature_flags_1.Feature.TrapCachingEnabled);
|
||||
}
|
||||
async function runWrapper() {
|
||||
try {
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
4
lib/util.js
generated
4
lib/util.js
generated
|
|
@ -654,7 +654,7 @@ exports.isInTestMode = isInTestMode;
|
|||
* that gets passed to the CLI.
|
||||
*/
|
||||
async function useCodeScanningConfigInCli(codeql, featureFlags) {
|
||||
return await featureFlags.getValue(feature_flags_1.FeatureFlag.CliConfigFileEnabled, codeql);
|
||||
return await featureFlags.getValue(feature_flags_1.Feature.CliConfigFileEnabled, codeql);
|
||||
}
|
||||
exports.useCodeScanningConfigInCli = useCodeScanningConfigInCli;
|
||||
async function logCodeScanningConfigInCli(codeql, featureFlags, logger) {
|
||||
|
|
@ -700,7 +700,7 @@ function listFolder(dir) {
|
|||
}
|
||||
exports.listFolder = listFolder;
|
||||
async function isGoExtractionReconciliationEnabled(featureFlags) {
|
||||
return await featureFlags.getValue(feature_flags_1.FeatureFlag.GolangExtractionReconciliationEnabled);
|
||||
return await featureFlags.getValue(feature_flags_1.Feature.GolangExtractionReconciliationEnabled);
|
||||
}
|
||||
exports.isGoExtractionReconciliationEnabled = isGoExtractionReconciliationEnabled;
|
||||
/**
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -13,7 +13,7 @@ import { GitHubApiDetails } from "./api-client";
|
|||
import * as codeql from "./codeql";
|
||||
import { AugmentationProperties, Config } from "./config-utils";
|
||||
import * as defaults from "./defaults.json";
|
||||
import { createFeatureFlags, FeatureFlag, FeatureFlags } from "./feature-flags";
|
||||
import { createFeatureFlags, Feature, FeatureFlags } from "./feature-flags";
|
||||
import { Language } from "./languages";
|
||||
import { getRunnerLogger } from "./logging";
|
||||
import { setupTests, setupActionsVars } from "./testing-utils";
|
||||
|
|
@ -281,7 +281,7 @@ for (const [
|
|||
version: defaults.bundleVersion,
|
||||
apiDetails: sampleApiDetails,
|
||||
featureFlags: createFeatureFlags(
|
||||
isFeatureFlagEnabled ? [FeatureFlag.BypassToolcacheEnabled] : []
|
||||
isFeatureFlagEnabled ? [Feature.BypassToolcacheEnabled] : []
|
||||
),
|
||||
toolsInput: { input: toolsInput },
|
||||
tmpDir,
|
||||
|
|
@ -524,7 +524,7 @@ const injectedConfigMacro = test.macro({
|
|||
"",
|
||||
undefined,
|
||||
undefined,
|
||||
createFeatureFlags([FeatureFlag.CliConfigFileEnabled]),
|
||||
createFeatureFlags([Feature.CliConfigFileEnabled]),
|
||||
getRunnerLogger(true)
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ import * as api from "./api-client";
|
|||
import { Config } from "./config-utils";
|
||||
import * as defaults from "./defaults.json"; // Referenced from codeql-action-sync-tool!
|
||||
import { errorMatchers } from "./error-matcher";
|
||||
import { FeatureFlag, FeatureFlags } from "./feature-flags";
|
||||
import { Feature, FeatureFlags } from "./feature-flags";
|
||||
import { isTracedLanguage, Language } from "./languages";
|
||||
import { Logger } from "./logging";
|
||||
import { toolrunnerErrorCatcher } from "./toolrunner-error-catcher";
|
||||
|
|
@ -442,7 +442,7 @@ export async function setupCodeQL(
|
|||
// allows us to quickly rollback a broken bundle that has made its way
|
||||
// into the toolcache.
|
||||
codeqlURL === undefined &&
|
||||
(await featureFlags.getValue(FeatureFlag.BypassToolcacheEnabled))
|
||||
(await featureFlags.getValue(Feature.BypassToolcacheEnabled))
|
||||
? "a specific version of CodeQL was not requested and the bypass toolcache feature flag is enabled"
|
||||
: undefined;
|
||||
const forceLatest = forceLatestReason !== undefined;
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import * as sinon from "sinon";
|
|||
import * as api from "./api-client";
|
||||
import { getCachedCodeQL, PackDownloadOutput, setCodeQL } from "./codeql";
|
||||
import * as configUtils from "./config-utils";
|
||||
import { createFeatureFlags, FeatureFlag } from "./feature-flags";
|
||||
import { createFeatureFlags, Feature } from "./feature-flags";
|
||||
import { Language } from "./languages";
|
||||
import { getRunnerLogger, Logger } from "./logging";
|
||||
import { setupTests } from "./testing-utils";
|
||||
|
|
@ -1936,9 +1936,7 @@ const mlPoweredQueriesMacro = test.macro({
|
|||
gitHubVersion,
|
||||
sampleApiDetails,
|
||||
createFeatureFlags(
|
||||
isMlPoweredQueriesFlagEnabled
|
||||
? [FeatureFlag.MlPoweredQueriesEnabled]
|
||||
: []
|
||||
isMlPoweredQueriesFlagEnabled ? [Feature.MlPoweredQueriesEnabled] : []
|
||||
),
|
||||
getRunnerLogger(true)
|
||||
);
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ import {
|
|||
ResolveQueriesOutput,
|
||||
} from "./codeql";
|
||||
import * as externalQueries from "./external-queries";
|
||||
import { FeatureFlag, FeatureFlags } from "./feature-flags";
|
||||
import { Feature, FeatureFlags } from "./feature-flags";
|
||||
import { Language, parseLanguage } from "./languages";
|
||||
import { Logger } from "./logging";
|
||||
import { RepositoryNwo } from "./repository";
|
||||
|
|
@ -411,7 +411,7 @@ async function addBuiltinSuiteQueries(
|
|||
languages.includes("javascript") &&
|
||||
(found === "security-extended" || found === "security-and-quality") &&
|
||||
!packs.javascript?.some(isMlPoweredJsQueriesPack) &&
|
||||
(await featureFlags.getValue(FeatureFlag.MlPoweredQueriesEnabled, codeQL))
|
||||
(await featureFlags.getValue(Feature.MlPoweredQueriesEnabled, codeQL))
|
||||
) {
|
||||
if (!packs.javascript) {
|
||||
packs.javascript = [];
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@ import test from "ava";
|
|||
|
||||
import { GitHubApiDetails } from "./api-client";
|
||||
import {
|
||||
FeatureFlag,
|
||||
featureFlagConfig,
|
||||
Feature,
|
||||
featureConfig,
|
||||
FeatureFlags,
|
||||
GitHubFeatureFlags,
|
||||
} from "./feature-flags";
|
||||
|
|
@ -55,7 +55,7 @@ for (const variant of ALL_FEATURE_FLAGS_DISABLED_VARIANTS) {
|
|||
variant.gitHubVersion
|
||||
);
|
||||
|
||||
for (const flag of Object.values(FeatureFlag)) {
|
||||
for (const flag of Object.values(Feature)) {
|
||||
t.assert(
|
||||
(await featureFlags.getValue(flag, includeCodeQlIfRequired(flag))) ===
|
||||
false
|
||||
|
|
@ -81,7 +81,7 @@ test("API response missing", async (t) => {
|
|||
|
||||
mockFeatureFlagApiEndpoint(403, {});
|
||||
|
||||
for (const flag of Object.values(FeatureFlag)) {
|
||||
for (const flag of Object.values(Feature)) {
|
||||
t.assert(
|
||||
(await featureFlags.getValue(flag, includeCodeQlIfRequired(flag))) ===
|
||||
false
|
||||
|
|
@ -98,7 +98,7 @@ test("Feature flags are disabled if they're not returned in API response", async
|
|||
|
||||
mockFeatureFlagApiEndpoint(200, {});
|
||||
|
||||
for (const flag of Object.values(FeatureFlag)) {
|
||||
for (const flag of Object.values(Feature)) {
|
||||
t.assert(
|
||||
(await featureFlags.getValue(flag, includeCodeQlIfRequired(flag))) ===
|
||||
false
|
||||
|
|
@ -118,8 +118,8 @@ test("Feature flags exception is propagated if the API request errors", async (t
|
|||
await t.throwsAsync(
|
||||
async () =>
|
||||
featureFlags.getValue(
|
||||
FeatureFlag.MlPoweredQueriesEnabled,
|
||||
includeCodeQlIfRequired(FeatureFlag.MlPoweredQueriesEnabled)
|
||||
Feature.MlPoweredQueriesEnabled,
|
||||
includeCodeQlIfRequired(Feature.MlPoweredQueriesEnabled)
|
||||
),
|
||||
{
|
||||
message:
|
||||
|
|
@ -129,23 +129,23 @@ test("Feature flags exception is propagated if the API request errors", async (t
|
|||
});
|
||||
});
|
||||
|
||||
for (const featureFlag of Object.keys(featureFlagConfig)) {
|
||||
for (const featureFlag of Object.keys(featureConfig)) {
|
||||
test(`Only feature flag '${featureFlag}' is enabled if enabled in the API response. Other flags disabled`, async (t) => {
|
||||
await withTmpDir(async (tmpDir) => {
|
||||
const featureFlags = setUpTests(tmpDir);
|
||||
|
||||
// set all feature flags to false except the one we're testing
|
||||
const expectedFeatureFlags: { [flag: string]: boolean } = {};
|
||||
for (const f of Object.keys(featureFlagConfig)) {
|
||||
for (const f of Object.keys(featureConfig)) {
|
||||
expectedFeatureFlags[f] = f === featureFlag;
|
||||
}
|
||||
mockFeatureFlagApiEndpoint(200, expectedFeatureFlags);
|
||||
|
||||
// retrieve the values of the actual feature flags
|
||||
const actualFeatureFlags: { [flag: string]: boolean } = {};
|
||||
for (const f of Object.keys(featureFlagConfig)) {
|
||||
for (const f of Object.keys(featureConfig)) {
|
||||
actualFeatureFlags[f] = await featureFlags.getValue(
|
||||
f as FeatureFlag,
|
||||
f as Feature,
|
||||
includeCodeQlIfRequired(f)
|
||||
);
|
||||
}
|
||||
|
|
@ -165,16 +165,16 @@ for (const featureFlag of Object.keys(featureFlagConfig)) {
|
|||
// feature flag should be disabled initially
|
||||
t.assert(
|
||||
!(await featureFlags.getValue(
|
||||
featureFlag as FeatureFlag,
|
||||
featureFlag as Feature,
|
||||
includeCodeQlIfRequired(featureFlag)
|
||||
))
|
||||
);
|
||||
|
||||
// set env var to true and check that the feature flag is now enabled
|
||||
process.env[featureFlagConfig[featureFlag].envVar] = "true";
|
||||
process.env[featureConfig[featureFlag].envVar] = "true";
|
||||
t.assert(
|
||||
await featureFlags.getValue(
|
||||
featureFlag as FeatureFlag,
|
||||
featureFlag as Feature,
|
||||
includeCodeQlIfRequired(featureFlag)
|
||||
)
|
||||
);
|
||||
|
|
@ -191,23 +191,23 @@ for (const featureFlag of Object.keys(featureFlagConfig)) {
|
|||
// feature flag should be enabled initially
|
||||
t.assert(
|
||||
await featureFlags.getValue(
|
||||
featureFlag as FeatureFlag,
|
||||
featureFlag as Feature,
|
||||
includeCodeQlIfRequired(featureFlag)
|
||||
)
|
||||
);
|
||||
|
||||
// set env var to false and check that the feature flag is now disabled
|
||||
process.env[featureFlagConfig[featureFlag].envVar] = "false";
|
||||
process.env[featureConfig[featureFlag].envVar] = "false";
|
||||
t.assert(
|
||||
!(await featureFlags.getValue(
|
||||
featureFlag as FeatureFlag,
|
||||
featureFlag as Feature,
|
||||
includeCodeQlIfRequired(featureFlag)
|
||||
))
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
if (featureFlagConfig[featureFlag].minimumVersion !== undefined) {
|
||||
if (featureConfig[featureFlag].minimumVersion !== undefined) {
|
||||
test(`Getting Feature Flag '${featureFlag} should throw if no codeql is provided`, async (t) => {
|
||||
await withTmpDir(async (tmpDir) => {
|
||||
const featureFlags = setUpTests(tmpDir);
|
||||
|
|
@ -216,7 +216,7 @@ for (const featureFlag of Object.keys(featureFlagConfig)) {
|
|||
mockFeatureFlagApiEndpoint(200, expectedFeatureFlags);
|
||||
|
||||
await t.throwsAsync(
|
||||
async () => featureFlags.getValue(featureFlag as FeatureFlag),
|
||||
async () => featureFlags.getValue(featureFlag as Feature),
|
||||
{
|
||||
message: `A minimum version is specified for feature flag ${featureFlag}, but no instance of CodeQL was provided.`,
|
||||
}
|
||||
|
|
@ -225,8 +225,8 @@ for (const featureFlag of Object.keys(featureFlagConfig)) {
|
|||
});
|
||||
}
|
||||
|
||||
if (featureFlagConfig[featureFlag].minimumVersion !== undefined) {
|
||||
test(`Feature flag '${featureFlag}' is disabled if the minimum CLI version is below ${featureFlagConfig[featureFlag].minimumVersion}`, async (t) => {
|
||||
if (featureConfig[featureFlag].minimumVersion !== undefined) {
|
||||
test(`Feature flag '${featureFlag}' is disabled if the minimum CLI version is below ${featureConfig[featureFlag].minimumVersion}`, async (t) => {
|
||||
await withTmpDir(async (tmpDir) => {
|
||||
const featureFlags = setUpTests(tmpDir);
|
||||
|
||||
|
|
@ -236,30 +236,26 @@ for (const featureFlag of Object.keys(featureFlagConfig)) {
|
|||
// feature flag should be disabled when an old CLI version is set
|
||||
let codeql = mockCodeQLVersion("2.0.0");
|
||||
t.assert(
|
||||
!(await featureFlags.getValue(featureFlag as FeatureFlag, codeql))
|
||||
!(await featureFlags.getValue(featureFlag as Feature, codeql))
|
||||
);
|
||||
|
||||
// even setting the env var to true should not enable the feature flag if
|
||||
// the minimum CLI version is not met
|
||||
process.env[featureFlagConfig[featureFlag].envVar] = "true";
|
||||
process.env[featureConfig[featureFlag].envVar] = "true";
|
||||
t.assert(
|
||||
!(await featureFlags.getValue(featureFlag as FeatureFlag, codeql))
|
||||
!(await featureFlags.getValue(featureFlag as Feature, codeql))
|
||||
);
|
||||
|
||||
// feature flag should be enabled when a new CLI version is set
|
||||
// and env var is not set
|
||||
process.env[featureFlagConfig[featureFlag].envVar] = "";
|
||||
codeql = mockCodeQLVersion(
|
||||
featureFlagConfig[featureFlag].minimumVersion
|
||||
);
|
||||
t.assert(
|
||||
await featureFlags.getValue(featureFlag as FeatureFlag, codeql)
|
||||
);
|
||||
process.env[featureConfig[featureFlag].envVar] = "";
|
||||
codeql = mockCodeQLVersion(featureConfig[featureFlag].minimumVersion);
|
||||
t.assert(await featureFlags.getValue(featureFlag as Feature, codeql));
|
||||
|
||||
// set env var to false and check that the feature flag is now disabled
|
||||
process.env[featureFlagConfig[featureFlag].envVar] = "false";
|
||||
process.env[featureConfig[featureFlag].envVar] = "false";
|
||||
t.assert(
|
||||
!(await featureFlags.getValue(featureFlag as FeatureFlag, codeql))
|
||||
!(await featureFlags.getValue(featureFlag as Feature, codeql))
|
||||
);
|
||||
});
|
||||
});
|
||||
|
|
@ -267,7 +263,7 @@ for (const featureFlag of Object.keys(featureFlagConfig)) {
|
|||
}
|
||||
|
||||
function assertAllFeaturesUndefinedInApi(t, loggedMessages: LoggedMessage[]) {
|
||||
for (const featureFlag of Object.keys(featureFlagConfig)) {
|
||||
for (const featureFlag of Object.keys(featureConfig)) {
|
||||
t.assert(
|
||||
loggedMessages.find(
|
||||
(v) =>
|
||||
|
|
@ -280,7 +276,7 @@ function assertAllFeaturesUndefinedInApi(t, loggedMessages: LoggedMessage[]) {
|
|||
}
|
||||
|
||||
function initializeFeatures(initialValue: boolean) {
|
||||
return Object.keys(featureFlagConfig).reduce((features, key) => {
|
||||
return Object.keys(featureConfig).reduce((features, key) => {
|
||||
features[key] = initialValue;
|
||||
return features;
|
||||
}, {});
|
||||
|
|
@ -302,7 +298,7 @@ function setUpTests(
|
|||
}
|
||||
|
||||
function includeCodeQlIfRequired(featureFlag: string) {
|
||||
return featureFlagConfig[featureFlag].minimumVersion !== undefined
|
||||
return featureConfig[featureFlag].minimumVersion !== undefined
|
||||
? mockCodeQLVersion("9.9.9")
|
||||
: undefined;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,10 +5,10 @@ import { RepositoryNwo } from "./repository";
|
|||
import * as util from "./util";
|
||||
|
||||
export interface FeatureFlags {
|
||||
getValue(flag: FeatureFlag, codeql?: CodeQL): Promise<boolean>;
|
||||
getValue(flag: Feature, codeql?: CodeQL): Promise<boolean>;
|
||||
}
|
||||
|
||||
export enum FeatureFlag {
|
||||
export enum Feature {
|
||||
BypassToolcacheEnabled = "bypass_toolcache_enabled",
|
||||
MlPoweredQueriesEnabled = "ml_powered_queries_enabled",
|
||||
TrapCachingEnabled = "trap_caching_enabled",
|
||||
|
|
@ -16,27 +16,27 @@ export enum FeatureFlag {
|
|||
CliConfigFileEnabled = "cli_config_file_enabled",
|
||||
}
|
||||
|
||||
export const featureFlagConfig: Record<
|
||||
FeatureFlag,
|
||||
export const featureConfig: Record<
|
||||
Feature,
|
||||
{ envVar: string; minimumVersion: string | undefined }
|
||||
> = {
|
||||
[FeatureFlag.BypassToolcacheEnabled]: {
|
||||
[Feature.BypassToolcacheEnabled]: {
|
||||
envVar: "CODEQL_BYPASS_TOOLCACHE",
|
||||
minimumVersion: undefined,
|
||||
},
|
||||
[FeatureFlag.MlPoweredQueriesEnabled]: {
|
||||
[Feature.MlPoweredQueriesEnabled]: {
|
||||
envVar: "CODEQL_ML_POWERED_QUERIES",
|
||||
minimumVersion: "2.7.5",
|
||||
},
|
||||
[FeatureFlag.TrapCachingEnabled]: {
|
||||
[Feature.TrapCachingEnabled]: {
|
||||
envVar: "CODEQL_TRAP_CACHING",
|
||||
minimumVersion: undefined,
|
||||
},
|
||||
[FeatureFlag.GolangExtractionReconciliationEnabled]: {
|
||||
[Feature.GolangExtractionReconciliationEnabled]: {
|
||||
envVar: "CODEQL_GOLANG_EXTRACTION_RECONCILIATION",
|
||||
minimumVersion: undefined,
|
||||
},
|
||||
[FeatureFlag.CliConfigFileEnabled]: {
|
||||
[Feature.CliConfigFileEnabled]: {
|
||||
envVar: "CODEQL_PASS_CONFIG_TO_CLI",
|
||||
minimumVersion: "2.10.1",
|
||||
},
|
||||
|
|
@ -48,7 +48,7 @@ export const featureFlagConfig: Record<
|
|||
*
|
||||
* It maps feature flags to whether they are enabled or not.
|
||||
*/
|
||||
type FeatureFlagsApiResponse = Partial<Record<FeatureFlag, boolean>>;
|
||||
type FeatureFlagsApiResponse = Partial<Record<Feature, boolean>>;
|
||||
|
||||
export class GitHubFeatureFlags implements FeatureFlags {
|
||||
private cachedApiResponse: FeatureFlagsApiResponse | undefined;
|
||||
|
|
@ -72,20 +72,20 @@ export class GitHubFeatureFlags implements FeatureFlags {
|
|||
*
|
||||
* @throws if a `minimumVersion` is specified for the feature flag, and `codeql` is not provided.
|
||||
*/
|
||||
async getValue(flag: FeatureFlag, codeql?: CodeQL): Promise<boolean> {
|
||||
if (!codeql && featureFlagConfig[flag].minimumVersion) {
|
||||
async getValue(flag: Feature, codeql?: CodeQL): Promise<boolean> {
|
||||
if (!codeql && featureConfig[flag].minimumVersion) {
|
||||
throw new Error(
|
||||
`A minimum version is specified for feature flag ${flag}, but no instance of CodeQL was provided.`
|
||||
);
|
||||
}
|
||||
|
||||
// Bypassing the toolcache is disabled in test mode.
|
||||
if (flag === FeatureFlag.BypassToolcacheEnabled && util.isInTestMode()) {
|
||||
if (flag === Feature.BypassToolcacheEnabled && util.isInTestMode()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const envVar = (
|
||||
process.env[featureFlagConfig[flag].envVar] || ""
|
||||
process.env[featureConfig[flag].envVar] || ""
|
||||
).toLocaleLowerCase();
|
||||
|
||||
// Do not use this feature if user explicitly disables it via an environment variable.
|
||||
|
|
@ -94,7 +94,7 @@ export class GitHubFeatureFlags implements FeatureFlags {
|
|||
}
|
||||
|
||||
// Never use this feature if the CLI version explicitly can't support it.
|
||||
const minimumVersion = featureFlagConfig[flag].minimumVersion;
|
||||
const minimumVersion = featureConfig[flag].minimumVersion;
|
||||
if (codeql && minimumVersion) {
|
||||
if (!(await util.codeQlVersionAbove(codeql, minimumVersion))) {
|
||||
return false;
|
||||
|
|
@ -174,7 +174,7 @@ export class GitHubFeatureFlags implements FeatureFlags {
|
|||
*
|
||||
* This should be only used within tests.
|
||||
*/
|
||||
export function createFeatureFlags(enabledFlags: FeatureFlag[]): FeatureFlags {
|
||||
export function createFeatureFlags(enabledFlags: Feature[]): FeatureFlags {
|
||||
return {
|
||||
getValue: async (flag) => {
|
||||
return enabledFlags.includes(flag);
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ import {
|
|||
import { getGitHubVersionActionsOnly } from "./api-client";
|
||||
import { CodeQL, CODEQL_VERSION_NEW_TRACING } from "./codeql";
|
||||
import * as configUtils from "./config-utils";
|
||||
import { FeatureFlag, FeatureFlags, GitHubFeatureFlags } from "./feature-flags";
|
||||
import { Feature, FeatureFlags, GitHubFeatureFlags } from "./feature-flags";
|
||||
import {
|
||||
initCodeQL,
|
||||
initConfig,
|
||||
|
|
@ -324,7 +324,7 @@ async function getTrapCachingEnabled(
|
|||
if (trapCaching !== undefined) {
|
||||
return trapCaching === "true";
|
||||
}
|
||||
return await featureFlags.getValue(FeatureFlag.TrapCachingEnabled);
|
||||
return await featureFlags.getValue(Feature.TrapCachingEnabled);
|
||||
}
|
||||
|
||||
async function runWrapper() {
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ import {
|
|||
parsePacksSpecification,
|
||||
prettyPrintPack,
|
||||
} from "./config-utils";
|
||||
import { FeatureFlag, FeatureFlags } from "./feature-flags";
|
||||
import { Feature, FeatureFlags } from "./feature-flags";
|
||||
import { Language } from "./languages";
|
||||
import { Logger } from "./logging";
|
||||
|
||||
|
|
@ -781,7 +781,7 @@ export async function useCodeScanningConfigInCli(
|
|||
codeql: CodeQL,
|
||||
featureFlags: FeatureFlags
|
||||
): Promise<boolean> {
|
||||
return await featureFlags.getValue(FeatureFlag.CliConfigFileEnabled, codeql);
|
||||
return await featureFlags.getValue(Feature.CliConfigFileEnabled, codeql);
|
||||
}
|
||||
|
||||
export async function logCodeScanningConfigInCli(
|
||||
|
|
@ -835,7 +835,7 @@ export async function isGoExtractionReconciliationEnabled(
|
|||
featureFlags: FeatureFlags
|
||||
): Promise<boolean> {
|
||||
return await featureFlags.getValue(
|
||||
FeatureFlag.GolangExtractionReconciliationEnabled
|
||||
Feature.GolangExtractionReconciliationEnabled
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue