diff --git a/package-lock.json b/package-lock.json index 7b7d7ce4..e6709c01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1437,6 +1437,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, "fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", @@ -2074,7 +2081,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -2372,13 +2378,6 @@ "path-exists": "^4.0.0" } }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3187,7 +3186,6 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -4324,8 +4322,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs-unparser": { "version": "2.0.0", diff --git a/package.json b/package.json index 3945de1a..4d0ea883 100644 --- a/package.json +++ b/package.json @@ -613,7 +613,6 @@ "copy-webpack-plugin": "^6.4.1", "glob": "^7.2.0", "mocha": "^8.3.1", - "semver": "^7.3.5", "ts-loader": "^9.2.6", "tslint": "^5.20.1", "typescript": "^4.5.4", @@ -628,6 +627,7 @@ "globby": "^11.1.0", "lodash": "^4.17.21", "minimatch": "^3.0.4", + "semver": "^7.3.5", "vscode-extension-telemetry-wrapper": "^0.11.0", "vscode-tas-client": "^0.1.27" } diff --git a/src/controllers/projectController.ts b/src/controllers/projectController.ts index 355f69c6..2c346251 100644 --- a/src/controllers/projectController.ts +++ b/src/controllers/projectController.ts @@ -4,6 +4,7 @@ import * as fse from "fs-extra"; import * as _ from "lodash"; import * as path from "path"; +import * as semver from "semver"; import { commands, Disposable, Extension, ExtensionContext, extensions, QuickPickItem, Uri, window, workspace } from "vscode"; import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; @@ -58,6 +59,8 @@ export class ProjectController implements Disposable { if (choice.metadata.type === ProjectType.NoBuildTool) { await scaffoldSimpleProject(this.context); + } else if (choice.metadata.createCommandId && choice.metadata.createCommandArgs) { + await commands.executeCommand(choice.metadata.createCommandId, ...choice.metadata.createCommandArgs); } else if (choice.metadata.createCommandId) { await commands.executeCommand(choice.metadata.createCommandId); } @@ -75,7 +78,9 @@ interface IProjectTypeMetadata { type: ProjectType; extensionId: string; extensionName: string; + leastExtensionVersion?: string; createCommandId: string; + createCommandArgs?: any[]; } interface IProjectTypeQuickPick extends QuickPickItem { @@ -88,6 +93,7 @@ enum ProjectType { SpringBoot = "SpringBoot", Quarkus = "Quarkus", MicroProfile = "MicroProfile", + JavaFX = "JavaFX", } async function ensureExtension(typeName: string, metaData: IProjectTypeMetadata): Promise { @@ -101,6 +107,11 @@ async function ensureExtension(typeName: string, metaData: IProjectTypeMetadata) return false; } + if (metaData.leastExtensionVersion && semver.lt(extension.packageJSON.version, metaData.leastExtensionVersion)) { + await promptUpdateExtension(typeName, metaData); + return false; + } + await extension.activate(); return true; } @@ -112,6 +123,13 @@ async function promptInstallExtension(projectType: string, metaData: IProjectTyp } } +async function promptUpdateExtension(projectType: string, metaData: IProjectTypeMetadata): Promise { + const choice: string | undefined = await window.showInformationMessage(`${metaData.extensionName} needs to be updated to create ${projectType} projects. Please re-run the command 'Java: Create Java Project...' after the extension is updated.`, "Update"); + if (choice === "Update") { + commands.executeCommand(Commands.INSTALL_EXTENSION, metaData.extensionId); + } +} + async function scaffoldSimpleProject(context: ExtensionContext): Promise { const workspaceFolder = Utility.getDefaultWorkspaceFolder(); const location: Uri[] | undefined = await window.showOpenDialog({ @@ -205,4 +223,20 @@ const projectTypes: IProjectType[] = [ createCommandId: "extension.microProfileStarter", }, }, + { + displayName: "JavaFX", + description: "create from archetype", + metadata: { + type: ProjectType.JavaFX, + extensionId: "vscjava.vscode-maven", + extensionName: "Maven for Java", + leastExtensionVersion: "0.35.0", + createCommandId: "maven.archetype.generate", + createCommandArgs: [{ + archetypeGroupId: "org.openjfx", + archetypeArtifactId: "javafx-archetype-fxml", + archetypeVersion: "RELEASE", + }], + }, + }, ]; diff --git a/test/ui/command.test.ts b/test/ui/command.test.ts index e0af096b..4d98e415 100644 --- a/test/ui/command.test.ts +++ b/test/ui/command.test.ts @@ -282,11 +282,8 @@ describe("Command Tests", function() { await new Workbench().executeCommand("java.project.create"); let inputBox = await InputBox.create(); const picks = await inputBox.getQuickPicks(); - for (const quickPick of picks) { - if (await quickPick.getLabel() === "No build tools") { - await quickPick.click(); - } - } + assert.equal("No build tools", await picks[0].getLabel()); + await picks[0].select(); await sleep(3000); inputBox = await InputBox.create(); await inputBox.setText(targetPath);