From cfc917f09f90a27c3f9d5e2ec16a52c2db039f4c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 10:22:45 +0000 Subject: [PATCH 1/3] Initial plan From bc791a01a26e49315b5ad50bf83e9fba92e04a52 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 10:26:20 +0000 Subject: [PATCH 2/3] fix: handle missing config in upgrade-packages by auto-detecting framework from package.json Agent-Logs-Url: https://github.com/IgniteUI/igniteui-cli/sessions/836f72b0-5436-41af-a5f3-4dba187bbe1a Co-authored-by: kdinev <1472513+kdinev@users.noreply.github.com> --- packages/cli/lib/commands/upgrade.ts | 31 ++++++++++++++--- spec/unit/upgrade-spec.ts | 51 ++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 4 deletions(-) diff --git a/packages/cli/lib/commands/upgrade.ts b/packages/cli/lib/commands/upgrade.ts index 873b96a2b..b57991716 100644 --- a/packages/cli/lib/commands/upgrade.ts +++ b/packages/cli/lib/commands/upgrade.ts @@ -1,7 +1,14 @@ -import { App, BaseTemplateManager, GoogleAnalytics, ProjectConfig, TEMPLATE_MANAGER, type ProjectTemplate, Util } from "@igniteui/cli-core"; +import { App, BaseTemplateManager, detectFrameworkFromPackageJson, GoogleAnalytics, ProjectConfig, TEMPLATE_MANAGER, + type ProjectTemplate, Util } from "@igniteui/cli-core"; import { PositionalArgs, UpgradeCommandType } from "./types"; import { ArgumentsCamelCase } from "yargs"; +const FRAMEWORK_PROJECT_TYPE_MAP: Record = { + angular: "igx-ts", + react: "igr-ts", + webcomponents: "igc-ts" +}; + const command: UpgradeCommandType = { command: "upgrade-packages", aliases: ["upgrade"], @@ -25,8 +32,24 @@ const command: UpgradeCommandType = { }, async upgrade(argv: ArgumentsCamelCase) { const config = ProjectConfig.getConfig(); - const framework = config.project.framework; - const projectType = config.project.projectType; + let framework = config.project?.framework; + let projectType = config.project?.projectType; + + if (!framework) { + const detected = detectFrameworkFromPackageJson(); + if (!detected) { + Util.log("Unable to determine the project framework. " + + "Please ensure you are running this command in a project directory with a package.json file, " + + "or create an ignite-ui-cli.json configuration file.", "yellow"); + return; + } + framework = detected; + projectType = projectType || FRAMEWORK_PROJECT_TYPE_MAP[framework]; + } + + if (!projectType) { + projectType = FRAMEWORK_PROJECT_TYPE_MAP[framework.toLowerCase()] || ""; + } switch (framework.toLowerCase()) { case "jquery": @@ -39,7 +62,7 @@ const command: UpgradeCommandType = { const templateManager = App.container.get(TEMPLATE_MANAGER); const projectLibrary = templateManager.getProjectLibrary(framework, projectType); let project: ProjectTemplate; - if (!config.project.projectTemplate || !projectLibrary.hasProject(config.project.projectTemplate)) { + if (!config.project?.projectTemplate || !projectLibrary.hasProject(config.project.projectTemplate)) { // in case project template is missing from the config we provide backward. project = projectLibrary.getProject(projectLibrary.projectIds[0]); } else { diff --git a/spec/unit/upgrade-spec.ts b/spec/unit/upgrade-spec.ts index 051b7ee15..8b1cc4964 100644 --- a/spec/unit/upgrade-spec.ts +++ b/spec/unit/upgrade-spec.ts @@ -2,6 +2,7 @@ import { App, BaseTemplate, BaseTemplateManager, Config, GoogleAnalytics, PackageManager, ProjectConfig, ProjectLibrary, ProjectTemplate, Template, TEMPLATE_MANAGER, Util } from "@igniteui/cli-core"; +import * as detectFrameworkModule from "../../packages/core/util/detect-framework"; import { default as upgradeCmd } from "../../packages/cli/lib/commands/upgrade"; @@ -144,4 +145,54 @@ describe("Unit - Upgrade command", () => { await upgradeCmd.handler({ _: ["upgrade"], $0: "upgrade" }); expect(Util.log).toHaveBeenCalledTimes(1); }); + + it("Should auto-detect framework from package.json when config has no project", async () => { + const config = {} as Config; + spyOn(ProjectConfig, "getConfig").and.returnValue(config); + spyOn(detectFrameworkModule, "detectFrameworkFromPackageJson").and.returnValue("react"); + + const mockProjTemplate: ProjectTemplate = { + id: "mock", + name: "mock", + description: "mock", + delimiters: { content: { start: "{{", end: "}}" }, path: { start: "[[", end: "]]" } }, + dependencies: [], + framework: "react", + projectType: "igr-ts", + hasExtraConfiguration: false, + isHidden: false, + templatePaths: [], + generateConfig: jasmine.createSpy().and.returnValue({}), + getExtraConfiguration: jasmine.createSpy().and.returnValue([]), + setExtraConfiguration: jasmine.createSpy(), + installModules: jasmine.createSpy(), + upgradeIgniteUIPackages: jasmine.createSpy().and.returnValue(Promise.resolve(true)) + }; + + const mockProjLib: Partial = { + projectIds: ["default-project"], + getProject: jasmine.createSpy().and.returnValue(mockProjTemplate), + hasProject: jasmine.createSpy().and.returnValue(false) + }; + + const mockTemplateManager: Partial = { getProjectLibrary: () => null }; + App.container.set(TEMPLATE_MANAGER, mockTemplateManager); + spyOn(mockTemplateManager, "getProjectLibrary").and.returnValue(mockProjLib as ProjectLibrary); + + await upgradeCmd.handler({ skipInstall: true, _: ["upgrade"], $0: "upgrade" }); + expect(detectFrameworkModule.detectFrameworkFromPackageJson).toHaveBeenCalled(); + expect(mockTemplateManager.getProjectLibrary).toHaveBeenCalledWith("react", "igr-ts"); + expect(mockProjTemplate.upgradeIgniteUIPackages).toHaveBeenCalledWith(process.cwd(), ""); + }); + + it("Should log a message when no framework can be detected", async () => { + const config = {} as Config; + spyOn(ProjectConfig, "getConfig").and.returnValue(config); + spyOn(detectFrameworkModule, "detectFrameworkFromPackageJson").and.returnValue(null); + + await upgradeCmd.handler({ _: ["upgrade"], $0: "upgrade" }); + expect(Util.log).toHaveBeenCalledWith( + jasmine.stringMatching(/Unable to determine the project framework/), "yellow" + ); + }); }); From 29fe92c5f090c9458c4ab6725094a413b60aba31 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 10:28:37 +0000 Subject: [PATCH 3/3] refactor: consolidate projectType mapping logic in upgrade command Agent-Logs-Url: https://github.com/IgniteUI/igniteui-cli/sessions/836f72b0-5436-41af-a5f3-4dba187bbe1a Co-authored-by: kdinev <1472513+kdinev@users.noreply.github.com> --- packages/cli/lib/commands/upgrade.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/cli/lib/commands/upgrade.ts b/packages/cli/lib/commands/upgrade.ts index b57991716..4683e2cde 100644 --- a/packages/cli/lib/commands/upgrade.ts +++ b/packages/cli/lib/commands/upgrade.ts @@ -44,7 +44,6 @@ const command: UpgradeCommandType = { return; } framework = detected; - projectType = projectType || FRAMEWORK_PROJECT_TYPE_MAP[framework]; } if (!projectType) {