diff --git a/examples/sample-action-client/package.json b/examples/sample-action-client/package.json index 70ef1956..6643b428 100644 --- a/examples/sample-action-client/package.json +++ b/examples/sample-action-client/package.json @@ -46,6 +46,10 @@ "title": "BAS Toolkit: has Fiori capabilities (hasFioriCapabilities)", "command": "has.fiori.capabilities" }, + { + "title": "BAS Toolkit: has Cap capabilities (hasCapCapabilities)", + "command": "has.cap.capabilities" + }, { "title": "BAS Toolkit: Is Opened For Action (isOpenedForAction)", "command": "is.opened.for.action" @@ -88,6 +92,7 @@ "onCommand:get.parameter", "onCommand:lcap.enabled", "onCommand:has.fiori.capabilities", + "onCommand:has.cap.capabilities", "onCommand:is.opened.for.action", "onCommand:fileaction.scheduled", "onCommand:executeaction.display.error", diff --git a/examples/sample-action-client/src/extension.ts b/examples/sample-action-client/src/extension.ts index c68100b2..2920bb5c 100644 --- a/examples/sample-action-client/src/extension.ts +++ b/examples/sample-action-client/src/extension.ts @@ -154,6 +154,15 @@ export function activate(context: ExtensionContext) { }) ); + context.subscriptions.push( + commands.registerCommand("has.cap.capabilities", async () => { + const enabledValue = await basAPI.hasCapCapabilities(); + void window.showInformationMessage( + `has Cap capabilities? ${enabledValue}` + ); + }) + ); + context.subscriptions.push( commands.registerCommand("is.opened.for.action", async () => { const isOpenedForActionValue = await basAPI.isOpenedForAction(); diff --git a/packages/app-studio-toolkit-types/api.d.ts b/packages/app-studio-toolkit-types/api.d.ts index a3b78c72..157349ad 100644 --- a/packages/app-studio-toolkit-types/api.d.ts +++ b/packages/app-studio-toolkit-types/api.d.ts @@ -110,6 +110,11 @@ export interface BasToolkit { */ hasFioriCapabilities: () => Promise; + /** + * Is environment Cap or not + */ + hasCapCapabilities: () => Promise; + /** * Determine whether BAS is opened for running action or editing a project * diff --git a/packages/app-studio-toolkit/src/apis/validateCapCapabilities.ts b/packages/app-studio-toolkit/src/apis/validateCapCapabilities.ts new file mode 100644 index 00000000..4afc0f6e --- /dev/null +++ b/packages/app-studio-toolkit/src/apis/validateCapCapabilities.ts @@ -0,0 +1,15 @@ +import { getLogger } from "@sap/artifact-management"; +import { extensions } from "vscode"; + +export const CAP_EXTENSION_ID = "SAPSE.vscode-cds"; + +// eslint-disable-next-line @typescript-eslint/require-await -- the new implementation does not require await. +export async function hasCapCapabilities(): Promise { + const logger = getLogger().getChildLogger({ label: "hasCapCapabilities" }); + + // Cap mode is determined by the existence of the Cap extension + const hasCapCapabilities = !!extensions.getExtension(CAP_EXTENSION_ID); + logger.trace("Has Cap Capabilities", { hasCapCapabilities }); + + return hasCapCapabilities; +} diff --git a/packages/app-studio-toolkit/src/public-api/base-bas-api.ts b/packages/app-studio-toolkit/src/public-api/base-bas-api.ts index 89d98974..ef099402 100644 --- a/packages/app-studio-toolkit/src/public-api/base-bas-api.ts +++ b/packages/app-studio-toolkit/src/public-api/base-bas-api.ts @@ -11,6 +11,7 @@ import { import { getLogger } from "../logger/logger"; import { isLCAPEnabled, isLCAPEnabledSync } from "../apis/validateLCAP"; import { hasFioriCapabilities } from "../apis/validateFioriCapabilities"; +import { hasCapCapabilities } from "../apis/validateCapCapabilities"; import { isOpenedForAction } from "../apis/isOpenedForAction"; /** @@ -48,6 +49,7 @@ export const baseBasToolkitAPI: Omit = { isLCAPEnabled, isLCAPEnabledSync, hasFioriCapabilities, + hasCapCapabilities, isOpenedForAction, actions: { diff --git a/packages/app-studio-toolkit/test/apis/validateCapabilities.spec.ts b/packages/app-studio-toolkit/test/apis/validateCapabilities.spec.ts index b40c3738..c1d9d881 100644 --- a/packages/app-studio-toolkit/test/apis/validateCapabilities.spec.ts +++ b/packages/app-studio-toolkit/test/apis/validateCapabilities.spec.ts @@ -10,11 +10,16 @@ const testVscode = { mockVscode(testVscode, "dist/src/logger/logger.js"); mockVscode(testVscode, "dist/src/apis/validateLCAP.js"); mockVscode(testVscode, "dist/src/apis/validateFioriCapabilities.js"); +mockVscode(testVscode, "dist/src/apis/validateCapCapabilities.js"); import { isLCAPEnabled, LACP_EXTENSION_ID } from "../../src/apis/validateLCAP"; import { hasFioriCapabilities, FIORI_EXTENSION_ID, } from "../../src/apis/validateFioriCapabilities"; +import { + hasCapCapabilities, + CAP_EXTENSION_ID, +} from "../../src/apis/validateCapCapabilities"; describe("validate capabilities API", () => { it("should return false", async () => { @@ -79,5 +84,23 @@ describe("validate capabilities API", () => { const parameterValue = await hasFioriCapabilities(); expect(parameterValue).to.be.true; }); + it("should return false when Cap extension does not exist", async () => { + extensionsMock + .expects("getExtension") + .withExactArgs(CAP_EXTENSION_ID) + .returns(undefined); + const parameterValue = await hasCapCapabilities(); + expect(parameterValue).to.be.false; + }); + + it("should return true when Cap extension exists", async () => { + const extension = { id: CAP_EXTENSION_ID }; + extensionsMock + .expects("getExtension") + .withExactArgs(CAP_EXTENSION_ID) + .returns(extension); + const parameterValue = await hasCapCapabilities(); + expect(parameterValue).to.be.true; + }); }); });