From cbf2fd70a6a0d54722b6541c948ce8cb3f682fb4 Mon Sep 17 00:00:00 2001 From: Alican Erdurmaz Date: Mon, 5 Aug 2024 10:21:32 +0300 Subject: [PATCH] feat(cli): automatically install `@refinedev/inferencer` after resources are generated (#6221) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ali Emir Şen --- .changeset/eleven-bottles-rush.md | 7 ++++++ .../sub-commands/resource/create-resources.ts | 24 +++++++++++++++++++ .../add/sub-commands/resource/index.test.ts | 4 ++++ packages/cli/src/utils/package/index.ts | 12 +++++++++- 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 .changeset/eleven-bottles-rush.md diff --git a/.changeset/eleven-bottles-rush.md b/.changeset/eleven-bottles-rush.md new file mode 100644 index 000000000000..93c2fc6f3d90 --- /dev/null +++ b/.changeset/eleven-bottles-rush.md @@ -0,0 +1,7 @@ +--- +"@refinedev/cli": minor +--- + +feat: Automatically install `@refinedev/inferencer` if missing after generating new resources. + +[Resolves #6220](https://github.com/refinedev/refine/issues/6220) diff --git a/packages/cli/src/commands/add/sub-commands/resource/create-resources.ts b/packages/cli/src/commands/add/sub-commands/resource/create-resources.ts index b492c9e5fe63..4480fff31f6d 100644 --- a/packages/cli/src/commands/add/sub-commands/resource/create-resources.ts +++ b/packages/cli/src/commands/add/sub-commands/resource/create-resources.ts @@ -1,7 +1,9 @@ import { ProjectTypes } from "@definitions/projectTypes"; import { compileDir } from "@utils/compile"; +import { installPackages, isInstalled } from "@utils/package"; import { getProjectType, getUIFramework } from "@utils/project"; import { getResourcePath } from "@utils/resource"; +import spinner from "@utils/spinner"; import { uppercaseFirstChar } from "@utils/text"; import execa from "execa"; import { @@ -56,6 +58,7 @@ export const createResources = async ( actions = selectedActions.join(","); } + let isAtleastOneResourceCreated = false; resources.forEach((resourceName) => { const customActions = actions ? actions.split(",") : undefined; const resourceFolderName = plural(resourceName).toLowerCase(); @@ -76,6 +79,7 @@ export const createResources = async ( ); return; } + isAtleastOneResourceCreated = true; // uppercase first letter const resource = uppercaseFirstChar(resourceName); @@ -169,6 +173,10 @@ export const createResources = async ( ); }); + if (isAtleastOneResourceCreated) { + installInferencer(); + } + return; }; @@ -223,3 +231,19 @@ const generateNextJsPages = ( const compileParams = { resource, resourceFolderName }; compileDir(resourcePageRootDirPath, compileParams); }; + +export const installInferencer = async () => { + console.log(); + const isInferencerInstalled = await spinner( + () => isInstalled("@refinedev/inferencer"), + "Checking if '@refinedev/inferencer' package is installed...", + ); + if (!isInferencerInstalled) { + console.log("πŸ“¦ Installing '@refinedev/inferencer' package..."); + await installPackages( + ["@refinedev/inferencer@latest"], + "add", + "βœ… '@refinedev/inferencer' package installed successfully!", + ); + } +}; diff --git a/packages/cli/src/commands/add/sub-commands/resource/index.test.ts b/packages/cli/src/commands/add/sub-commands/resource/index.test.ts index 46a8b8818012..551e7c245edb 100644 --- a/packages/cli/src/commands/add/sub-commands/resource/index.test.ts +++ b/packages/cli/src/commands/add/sub-commands/resource/index.test.ts @@ -6,6 +6,10 @@ import { existsSync, readFileSync, rmdirSync } from "fs-extra"; const srcDirPath = `${__dirname}/../../../..`; describe("add", () => { + beforeEach(() => { + jest.spyOn(testTargetModule, "installInferencer").mockImplementation(); + }); + it("should generate next js pages", () => { jest .spyOn(utilsProject, "getProjectType") diff --git a/packages/cli/src/utils/package/index.ts b/packages/cli/src/utils/package/index.ts index 380d5bb890d4..37d15acbfe26 100644 --- a/packages/cli/src/utils/package/index.ts +++ b/packages/cli/src/utils/package/index.ts @@ -166,6 +166,7 @@ export const getPreferedPM = async () => { export const installPackages = async ( packages: string[], type: "all" | "add" = "all", + successMessage = "All `Refine` packages updated πŸŽ‰", ) => { const pm = await getPreferedPM(); @@ -187,7 +188,7 @@ export const installPackages = async ( execution.on("exit", (exitCode) => { if (exitCode === 0) { - console.log("All `Refine` packages updated πŸŽ‰"); + console.log(successMessage); return; } @@ -334,3 +335,12 @@ export const getAllVersionsOfPackage = async ( return result; }; + +export const isInstalled = async (packageName: string) => { + const installedPackages = await getInstalledRefinePackages(); + if (!installedPackages) { + return false; + } + + return installedPackages.some((pkg) => pkg.name === packageName); +};