diff --git a/expressions/src/completion.ts b/expressions/src/completion.ts index 846ebe6..4ebafc3 100644 --- a/expressions/src/completion.ts +++ b/expressions/src/completion.ts @@ -2,7 +2,6 @@ import {DescriptionPair} from "./completion/descriptionDictionary.js"; import {Dictionary, isDictionary} from "./data/dictionary.js"; import {ExpressionData} from "./data/expressiondata.js"; import {Evaluator} from "./evaluator.js"; -import {FeatureFlags} from "./features.js"; import {wellKnownFunctions} from "./funcs.js"; import {FunctionDefinition, FunctionInfo} from "./funcs/info.js"; import {Lexer, Token, TokenType} from "./lexer.js"; @@ -27,15 +26,13 @@ export type CompletionItem = { * @param context Context available for the expression * @param extensionFunctions List of functions available * @param functions Optional map of functions to use during evaluation - * @param featureFlags Optional feature flags to control which features are enabled * @returns Array of completion items */ export function complete( input: string, context: Dictionary, extensionFunctions: FunctionInfo[], - functions?: Map, - featureFlags?: FeatureFlags + functions?: Map ): CompletionItem[] { // Lex const lexer = new Lexer(input); @@ -66,7 +63,7 @@ export function complete( const result = contextKeys(context); // Merge with functions - result.push(...functionItems(extensionFunctions, featureFlags)); + result.push(...functionItems(extensionFunctions)); return result; } @@ -91,15 +88,10 @@ export function complete( return contextKeys(result); } -function functionItems(extensionFunctions: FunctionInfo[], featureFlags?: FeatureFlags): CompletionItem[] { +function functionItems(extensionFunctions: FunctionInfo[]): CompletionItem[] { const result: CompletionItem[] = []; - const flags = featureFlags ?? new FeatureFlags(); for (const fdef of [...Object.values(wellKnownFunctions), ...extensionFunctions]) { - // Filter out case function if feature is disabled - if (fdef.name === "case" && !flags.isEnabled("allowCaseFunction")) { - continue; - } result.push({ label: fdef.name, description: fdef.description, diff --git a/expressions/src/features.test.ts b/expressions/src/features.test.ts index f280c14..307616a 100644 --- a/expressions/src/features.test.ts +++ b/expressions/src/features.test.ts @@ -53,8 +53,7 @@ describe("FeatureFlags", () => { const flags = new FeatureFlags({all: true}); expect(flags.getEnabledFeatures()).toEqual([ "missingInputsQuickfix", - "blockScalarChompingWarning", - "allowCaseFunction" + "blockScalarChompingWarning" ]); }); }); diff --git a/expressions/src/features.ts b/expressions/src/features.ts index e142aac..7bd5481 100644 --- a/expressions/src/features.ts +++ b/expressions/src/features.ts @@ -28,12 +28,6 @@ export interface ExperimentalFeatures { * @default false */ blockScalarChompingWarning?: boolean; - - /** - * Enable the case() function in expressions. - * @default false - */ - allowCaseFunction?: boolean; } /** @@ -47,8 +41,7 @@ export type ExperimentalFeatureKey = Exclude; */ const allFeatureKeys: ExperimentalFeatureKey[] = [ "missingInputsQuickfix", - "blockScalarChompingWarning", - "allowCaseFunction" + "blockScalarChompingWarning" ]; export class FeatureFlags { diff --git a/languageservice/src/complete.expressions.test.ts b/languageservice/src/complete.expressions.test.ts index 0a2f276..e20b4cf 100644 --- a/languageservice/src/complete.expressions.test.ts +++ b/languageservice/src/complete.expressions.test.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -import {data, DescriptionDictionary, FeatureFlags} from "@actions/expressions"; +import {data, DescriptionDictionary} from "@actions/expressions"; import {CompletionItem, CompletionItemKind, MarkupContent} from "vscode-languageserver-types"; import {complete, getExpressionInput} from "./complete.js"; import {ContextProviderConfig} from "./context-providers/config.js"; @@ -69,8 +69,7 @@ describe("expressions", () => { it("single region", async () => { const input = "run-name: ${{ | }}"; const result = await complete(...getPositionFromCursor(input), { - contextProviderConfig, - featureFlags: new FeatureFlags({allowCaseFunction: true}) + contextProviderConfig }); expect(result.map(x => x.label)).toEqual([ @@ -113,8 +112,7 @@ describe("expressions", () => { it("single region with existing input", async () => { const input = "run-name: ${{ g| }}"; const result = await complete(...getPositionFromCursor(input), { - contextProviderConfig, - featureFlags: new FeatureFlags({allowCaseFunction: true}) + contextProviderConfig }); expect(result.map(x => x.label)).toEqual([ @@ -135,8 +133,7 @@ describe("expressions", () => { it("single region with existing condition", async () => { const input = "run-name: ${{ g| == 'test' }}"; const result = await complete(...getPositionFromCursor(input), { - contextProviderConfig, - featureFlags: new FeatureFlags({allowCaseFunction: true}) + contextProviderConfig }); expect(result.map(x => x.label)).toEqual([ @@ -157,8 +154,7 @@ describe("expressions", () => { it("multiple regions with partial function", async () => { const input = "run-name: Run a ${{ inputs.test }} one-line script ${{ from|('test') == inputs.name }}"; const result = await complete(...getPositionFromCursor(input), { - contextProviderConfig, - featureFlags: new FeatureFlags({allowCaseFunction: true}) + contextProviderConfig }); expect(result.map(x => x.label)).toEqual([ @@ -179,8 +175,7 @@ describe("expressions", () => { it("multiple regions - first region", async () => { const input = "run-name: test-${{ git| == 1 }}-${{ github.event }}"; const result = await complete(...getPositionFromCursor(input), { - contextProviderConfig, - featureFlags: new FeatureFlags({allowCaseFunction: true}) + contextProviderConfig }); expect(result.map(x => x.label)).toEqual([ @@ -201,8 +196,7 @@ describe("expressions", () => { it("multiple regions", async () => { const input = "run-name: test-${{ github }}-${{ | }}"; const result = await complete(...getPositionFromCursor(input), { - contextProviderConfig, - featureFlags: new FeatureFlags({allowCaseFunction: true}) + contextProviderConfig }); expect(result.map(x => x.label)).toEqual([ @@ -1181,8 +1175,7 @@ jobs: `; const result = await complete(...getPositionFromCursor(input), { - contextProviderConfig, - featureFlags: new FeatureFlags({allowCaseFunction: true}) + contextProviderConfig }); expect(result.map(x => x.label)).toEqual([ "env", diff --git a/languageservice/src/complete.test.ts b/languageservice/src/complete.test.ts index 5026283..c661080 100644 --- a/languageservice/src/complete.test.ts +++ b/languageservice/src/complete.test.ts @@ -6,7 +6,6 @@ import {getPositionFromCursor} from "./test-utils/cursor-position.js"; import {TestLogger} from "./test-utils/logger.js"; import {clearCache} from "./utils/workflow-cache.js"; import {ValueProviderConfig, ValueProviderKind} from "./value-providers/config.js"; -import {FeatureFlags} from "@actions/expressions/features"; registerLogger(new TestLogger()); @@ -898,11 +897,9 @@ jobs: }); describe("expression completions", () => { - it("include case function when enabled", async () => { + it("includes case function", async () => { const input = "on: push\njobs:\n build:\n runs-on: ${{ c|"; - const result = await complete(...getPositionFromCursor(input), { - featureFlags: new FeatureFlags({allowCaseFunction: true}) - }); + const result = await complete(...getPositionFromCursor(input)); expect(result).not.toBeUndefined(); // Expression completions starting with 'c': case, contains @@ -910,18 +907,5 @@ jobs: expect(labels).toContain("case"); expect(labels).toContain("contains"); }); - - it("exclude case function when disabled", async () => { - const input = "on: push\njobs:\n build:\n runs-on: ${{ c|"; - const result = await complete(...getPositionFromCursor(input), { - featureFlags: new FeatureFlags({allowCaseFunction: false}) - }); - - expect(result).not.toBeUndefined(); - // Expression completions starting with 'c': contains - const labels = result.map(x => x.label); - expect(labels).not.toContain("case"); - expect(labels).toContain("contains"); - }); }); });