From f7140cd26218e2e71e64bcb7d95f346ec9a8f2fb Mon Sep 17 00:00:00 2001 From: John Lindquist Date: Thu, 10 Oct 2024 20:44:41 -0700 Subject: [PATCH] fix(pnpm): use kitPnpmPath --- src/api/global.ts | 150 ++++++++++++++++++---------------- src/cli/install.ts | 126 ++++++++++++++-------------- src/cli/lib/install.ts | 37 +++++++++ src/cli/uninstall.ts | 60 ++++++-------- src/cli/update-kit-package.ts | 53 ++++++------ src/cli/update-package.ts | 53 ++++++------ src/core/resolvers.ts | 50 ++++++++---- src/core/utils.ts | 1 + 8 files changed, 289 insertions(+), 241 deletions(-) create mode 100644 src/cli/lib/install.ts diff --git a/src/api/global.ts b/src/api/global.ts index 16001358..868f11ee 100644 --- a/src/api/global.ts +++ b/src/api/global.ts @@ -1,22 +1,23 @@ import { - assignPropsTo, - home, - isBin, - isDir, - isFile, - kitPath, - kenvPath, - wait, - getLogFromScriptPath, - createPathResolver + assignPropsTo, + home, + isBin, + isDir, + isFile, + kitPath, + kenvPath, + wait, + getLogFromScriptPath, + createPathResolver, } from "../core/utils.js" import { getScripts } from "../core/db.js" import type { PromptConfig } from "../types/core" import { - format, - formatDistanceToNow + format, + formatDistanceToNow, } from "@johnlindquist/kit-internal/date-fns" +import { kitPnpmPath } from "../core/resolvers.js" global.actionFlag = "" global.getScripts = getScripts @@ -33,51 +34,54 @@ await import("./packages/tmpPromise.js") await import("./packages/git.js") global.env = async (envKey, promptConfig) => { - if (!envKey) throw new Error(`Environment Key Required`) - - let secret = - typeof (promptConfig as PromptConfig)?.secret === "boolean" - ? (promptConfig as PromptConfig).secret - : envKey.includes("KEY") || - envKey.includes("SECRET") || - envKey.includes("TOKEN") - ? true - : false - if ((promptConfig as any)?.reset !== true) { - let envVal = global.env[envKey] || process.env[envKey] - if (envVal) return envVal - } - - let input = - typeof promptConfig === "function" - ? await promptConfig() - : typeof promptConfig === "string" - ? await global.mini({ - enter: "Write to .env", - shortcuts: [], - placeholder: promptConfig, - secret, - keyword: "" - }) - : await global.mini({ - enter: "Write to .env", - shortcuts: [], - placeholder: `Set ${envKey}:`, - ...promptConfig, - secret, - keyword: "" - }) - - if (input?.startsWith("~")) input = input.replace(/^~/, home()) - await global.cli("set-env-var", envKey, input) - global.env[envKey] = process.env[envKey] = input - return input + if (!envKey) throw new Error(`Environment Key Required`) + + let secret = + typeof (promptConfig as PromptConfig)?.secret === + "boolean" + ? (promptConfig as PromptConfig).secret + : envKey.includes("KEY") || + envKey.includes("SECRET") || + envKey.includes("TOKEN") + ? true + : false + if ((promptConfig as any)?.reset !== true) { + let envVal = global.env[envKey] || process.env[envKey] + if (envVal) return envVal + } + + let input = + typeof promptConfig === "function" + ? await promptConfig() + : typeof promptConfig === "string" + ? await global.mini({ + enter: "Write to .env", + shortcuts: [], + placeholder: promptConfig, + secret, + keyword: "", + }) + : await global.mini({ + enter: "Write to .env", + shortcuts: [], + placeholder: `Set ${envKey}:`, + ...promptConfig, + secret, + keyword: "", + }) + + if (input?.startsWith("~")) + input = input.replace(/^~/, home()) + await global.cli("set-env-var", envKey, input) + global.env[envKey] = process.env[envKey] = input + return input } assignPropsTo(process.env, global.env) global.wait = wait global.kitPath = kitPath +global.kitPnpmPath = kitPnpmPath global.kenvPath = kenvPath global.isBin = isBin global.isDir = isDir @@ -88,41 +92,49 @@ global.home = home global.memoryMap = new Map() global.getLog = () => { - let log = getLogFromScriptPath(global.kitScript) - return log + let log = getLogFromScriptPath(global.kitScript) + return log } let intervals // A proxy around setInterval that keeps track of all intervals global.setInterval = new Proxy(setInterval, { - apply: (target, thisArg, args: Parameters) => { - let id = target(...args) - intervals = intervals || new Set() - intervals.add(id) - return id - } + apply: ( + target, + thisArg, + args: Parameters + ) => { + let id = target(...args) + intervals = intervals || new Set() + intervals.add(id) + return id + }, }) let timeouts global.setTimeout = new Proxy(setTimeout, { - apply: (target, thisArg, args: Parameters) => { - let id = target(...args) - timeouts = timeouts || new Set() - timeouts.add(id) - return id - } + apply: ( + target, + thisArg, + args: Parameters + ) => { + let id = target(...args) + timeouts = timeouts || new Set() + timeouts.add(id) + return id + }, }) global.clearAllIntervals = () => { - intervals?.forEach((id) => clearInterval(id)) - intervals = new Set() + intervals?.forEach(id => clearInterval(id)) + intervals = new Set() } global.clearAllTimeouts = () => { - timeouts?.forEach((id) => clearTimeout(id)) - timeouts = new Set() + timeouts?.forEach(id => clearTimeout(id)) + timeouts = new Set() } global.formatDate = format diff --git a/src/cli/install.ts b/src/cli/install.ts index b7295c14..391c7975 100644 --- a/src/cli/install.ts +++ b/src/cli/install.ts @@ -1,77 +1,73 @@ import { - formatDistanceToNow, - parseISO + formatDistanceToNow, + parseISO, } from "@johnlindquist/kit-internal/date-fns" import { KIT_FIRST_PATH } from "../core/utils.js" +import { createPackageManagerCommand } from "./lib/install.js" -let install = async (packageNames:string[]) => { - let cwd = kenvPath() +let install = async (packageNames: string[]) => { + let cwd = kenvPath() - // if (process.env.SCRIPTS_DIR) { - // cwd = kenvPath(process.env.SCRIPTS_DIR) - // } + // if (process.env.SCRIPTS_DIR) { + // cwd = kenvPath(process.env.SCRIPTS_DIR) + // } + let command = await createPackageManagerCommand( + "i", + packageNames + ) - let isYarn = await isFile(kenvPath("yarn.lock")) - let [tool, toolArgs] = ( - isYarn - ? `yarn${global.isWin ? `.cmd` : ``} add` - : `pnpm${global.isWin ? `.cmd` : ``} i` - ).split(" ") - - let toolPath = global.isWin ? (isYarn ? "yarn" : "pnpm") : tool - - let packages = packageNames.join(" ") - let command = `${toolPath} ${toolArgs} -D ${packages}`.trim() - - return await term({ - name: "pnpm install", - command, - env: { - ...global.env, - PATH: KIT_FIRST_PATH, - DISABLE_AUTO_UPDATE: "true" // Disable auto-update for zsh - }, - cwd - }) + return await term({ + name: "pnpm install", + command, + env: { + ...global.env, + PATH: KIT_FIRST_PATH, + DISABLE_AUTO_UPDATE: "true", // Disable auto-update for zsh + }, + cwd, + }) } let packages = await arg( - { - enter: "Install", - placeholder: "Which npm package/s would you like to install?" - }, - async (input) => { - if (!input || input?.length < 3) - return [ - { - info: true, - miss: true, - name: `Search for npm packages` - } - ] - type pkgs = { - objects: { - package: { - name: string - description: string - date: string - } - }[] - } - let response = await get( - `http://registry.npmjs.com/-/v1/search?text=${input}&size=20` - ) - let packages = response.data.objects - return packages.map((o) => { - return { - name: o.package.name, - value: o.package.name, - description: `${o.package.description} - ${formatDistanceToNow( - parseISO(o.package.date) - )} ago` - } - }) - } + { + enter: "Install", + placeholder: + "Which npm package/s would you like to install?", + }, + async input => { + if (!input || input?.length < 3) + return [ + { + info: true, + miss: true, + name: `Search for npm packages`, + }, + ] + type pkgs = { + objects: { + package: { + name: string + description: string + date: string + } + }[] + } + let response = await get( + `http://registry.npmjs.com/-/v1/search?text=${input}&size=20` + ) + let packages = response.data.objects + return packages.map(o => { + return { + name: o.package.name, + value: o.package.name, + description: `${ + o.package.description + } - ${formatDistanceToNow( + parseISO(o.package.date) + )} ago`, + } + }) + } ) let installNames = [...packages.split(" ")] diff --git a/src/cli/lib/install.ts b/src/cli/lib/install.ts new file mode 100644 index 00000000..7093a7e5 --- /dev/null +++ b/src/cli/lib/install.ts @@ -0,0 +1,37 @@ +import { kitPnpmPath } from "../../core/resolvers.js" + +export async function createPackageManagerCommand( + command: "i" | "un", + packageNames: string[] +) { + let isYarn = await isFile(kenvPath("yarn.lock")) + + let packageManager = isYarn ? "yarn" : "pnpm" + let toolCommand = command as + | "add" + | "i" + | "remove" + | "uninstall" + + if (isYarn) { + if (command == "i") toolCommand = "add" + } + + // Add .cmd extension for Windows + if (global.isWin) { + packageManager += ".cmd" + } + + if (!isYarn) { + packageManager = kitPnpmPath(packageManager) + } + + // Combine package manager and command + let installCommand = `${packageManager} ${command}` + + let packages = packageNames.join(" ") + let fullCommand = + `${installCommand} -D ${packages}`.trim() + + return fullCommand +} diff --git a/src/cli/uninstall.ts b/src/cli/uninstall.ts index a1fa77d4..d637c7fd 100644 --- a/src/cli/uninstall.ts +++ b/src/cli/uninstall.ts @@ -1,56 +1,46 @@ import { KIT_FIRST_PATH } from "../core/utils.js" +import { createPackageManagerCommand } from "./lib/install.js" let file = JSON.parse( - await readFile(kenvPath("package.json"), { - encoding: "utf8" - }) + await readFile(kenvPath("package.json"), { + encoding: "utf8", + }) ) let packageNames = (await arg( - { - placeholder: chalk`Which packages do you want to {red uninstall}`, - enter: "Uninstall" - }, - [ - ...Object.keys(file?.dependencies || []), - ...Object.keys(file?.devDependencies || []) - ].filter((k) => !k.startsWith("@johnlindquist")) + { + placeholder: chalk`Which packages do you want to {red uninstall}`, + enter: "Uninstall", + }, + [ + ...Object.keys(file?.dependencies || []), + ...Object.keys(file?.devDependencies || []), + ].filter(k => !k.startsWith("@johnlindquist")) )) as string[] //grab all the args you used `kit un jquery react` if (typeof packageNames == "string") { - packageNames = [packageNames, ...args] + packageNames = [packageNames, ...args] } let cwd = kenvPath() if (process.env.SCRIPTS_DIR) { - cwd = kenvPath(process.env.SCRIPTS_DIR) + cwd = kenvPath(process.env.SCRIPTS_DIR) } -let isYarn = await isFile(kenvPath("yarn.lock")) -let [tool, toolArgs] = ( - isYarn - ? `yarn${global.isWin ? ".cmd" : ""} remove` - : `pnpm${global.isWin ? ".cmd" : ""} rm` -).split(" ") - -let toolPath = global.isWin ? (isYarn ? "yarn" : "pnpm") : tool - -let toolExists = await isBin(toolPath) -if (!toolExists) { - toolPath = "pnpm" -} - -let command = `${toolPath} ${toolArgs} -D ${packageNames.join(" ")}`.trim() +let command = await createPackageManagerCommand( + "un", + packageNames +) await term({ - command, - env: { - ...global.env, - PATH: KIT_FIRST_PATH, - DISABLE_AUTO_UPDATE: "true" // Disable auto-update for zsh - }, - cwd + command, + env: { + ...global.env, + PATH: KIT_FIRST_PATH, + DISABLE_AUTO_UPDATE: "true", // Disable auto-update for zsh + }, + cwd, }) export {} diff --git a/src/cli/update-kit-package.ts b/src/cli/update-kit-package.ts index 265f2710..34e1f7f5 100644 --- a/src/cli/update-kit-package.ts +++ b/src/cli/update-kit-package.ts @@ -1,49 +1,48 @@ import { KIT_FIRST_PATH } from "../core/utils.js" +import { createPackageManagerCommand } from "./lib/install.js" let file = JSON.parse( - await readFile(kenvPath("package.json"), { - encoding: "utf8" - }) + await readFile(kenvPath("package.json"), { + encoding: "utf8", + }) ) let packages = (await arg( - { - placeholder: `Which package do you want to update to latest?`, - enter: "Update" - }, - [ - ...Object.keys(file?.dependencies || []), - ...Object.keys(file?.devDependencies || []) - ].filter((k) => !k.startsWith("@johnlindquist/kit")) + { + placeholder: `Which package do you want to update to latest?`, + enter: "Update", + }, + [ + ...Object.keys(file?.dependencies || []), + ...Object.keys(file?.devDependencies || []), + ].filter(k => !k.startsWith("@johnlindquist/kit")) )) as string[] //grab all the args you used `kit un jquery react` if (typeof packages == "string") { - packages = [packages, ...args] + packages = [packages, ...args] } -let isYarn = await isFile(kenvPath("yarn.lock")) -let [tool, command] = ( - isYarn - ? `yarn${global.isWin ? `.cmd` : ``} add` - : `npm${global.isWin ? `.cmd` : ``} i` -).split(" ") +packages = packages.map(p => `${p}@latest`) + +let command = await createPackageManagerCommand( + "i", + packages +) let cwd = kenvPath() if (process.env.SCRIPTS_DIR) { - cwd = kenvPath(process.env.SCRIPTS_DIR) + cwd = kenvPath(process.env.SCRIPTS_DIR) } await term({ - command: `${tool} ${command} ${packages - .map((p) => `${p}@latest`) - .join(" ")}`.trim(), - env: { - ...global.env, - PATH: KIT_FIRST_PATH - }, - cwd + command, + env: { + ...global.env, + PATH: KIT_FIRST_PATH, + }, + cwd, }) export {} diff --git a/src/cli/update-package.ts b/src/cli/update-package.ts index 265f2710..34e1f7f5 100644 --- a/src/cli/update-package.ts +++ b/src/cli/update-package.ts @@ -1,49 +1,48 @@ import { KIT_FIRST_PATH } from "../core/utils.js" +import { createPackageManagerCommand } from "./lib/install.js" let file = JSON.parse( - await readFile(kenvPath("package.json"), { - encoding: "utf8" - }) + await readFile(kenvPath("package.json"), { + encoding: "utf8", + }) ) let packages = (await arg( - { - placeholder: `Which package do you want to update to latest?`, - enter: "Update" - }, - [ - ...Object.keys(file?.dependencies || []), - ...Object.keys(file?.devDependencies || []) - ].filter((k) => !k.startsWith("@johnlindquist/kit")) + { + placeholder: `Which package do you want to update to latest?`, + enter: "Update", + }, + [ + ...Object.keys(file?.dependencies || []), + ...Object.keys(file?.devDependencies || []), + ].filter(k => !k.startsWith("@johnlindquist/kit")) )) as string[] //grab all the args you used `kit un jquery react` if (typeof packages == "string") { - packages = [packages, ...args] + packages = [packages, ...args] } -let isYarn = await isFile(kenvPath("yarn.lock")) -let [tool, command] = ( - isYarn - ? `yarn${global.isWin ? `.cmd` : ``} add` - : `npm${global.isWin ? `.cmd` : ``} i` -).split(" ") +packages = packages.map(p => `${p}@latest`) + +let command = await createPackageManagerCommand( + "i", + packages +) let cwd = kenvPath() if (process.env.SCRIPTS_DIR) { - cwd = kenvPath(process.env.SCRIPTS_DIR) + cwd = kenvPath(process.env.SCRIPTS_DIR) } await term({ - command: `${tool} ${command} ${packages - .map((p) => `${p}@latest`) - .join(" ")}`.trim(), - env: { - ...global.env, - PATH: KIT_FIRST_PATH - }, - cwd + command, + env: { + ...global.env, + PATH: KIT_FIRST_PATH, + }, + cwd, }) export {} diff --git a/src/core/resolvers.ts b/src/core/resolvers.ts index 4a338bbb..ed252142 100644 --- a/src/core/resolvers.ts +++ b/src/core/resolvers.ts @@ -3,39 +3,53 @@ import * as path from "node:path" const windowsSlashRE = /\\/g export function slash(p: string): string { - return p.replace(windowsSlashRE, "/") + return p.replace(windowsSlashRE, "/") } export let createPathResolver = - (parentDir: string) => - (...parts: string[]) => { - return path.resolve(parentDir, ...parts) - } + (parentDir: string) => + (...parts: string[]) => { + return path.resolve(parentDir, ...parts) + } export let home = (...pathParts: string[]) => { - return createPathResolver(homedir())(...pathParts) + return createPathResolver(homedir())(...pathParts) } const getEnvOrDefault = ( - envVar: string | undefined, - defaultValue: string + envVar: string | undefined, + defaultValue: string ): string => { - return envVar && envVar !== "undefined" ? envVar : defaultValue + return envVar && envVar !== "undefined" + ? envVar + : defaultValue } export let kitPath = (...parts: string[]) => - createPathResolver(getEnvOrDefault(process.env.KIT, home(".kit")))( - ...parts.filter(Boolean) - ) + createPathResolver( + getEnvOrDefault(process.env.KIT, home(".kit")) + )(...parts.filter(Boolean)) export let kenvPath = (...parts: string[]) => { - return createPathResolver(getEnvOrDefault(process.env.KENV, home(".kenv")))( - ...parts.filter(Boolean) - ) + return createPathResolver( + getEnvOrDefault(process.env.KENV, home(".kenv")) + )(...parts.filter(Boolean)) +} + +export let kitPnpmPath = (...parts: string[]) => { + return createPathResolver( + getEnvOrDefault( + process.env.KIT_PNPM_PATH, + kitPath("pnpm") + ) + )(...parts.filter(Boolean)) } export let kitDotEnvPath = () => { - return createPathResolver( - getEnvOrDefault(process.env.KIT_DOTENV_PATH, kenvPath(".env")) - )() + return createPathResolver( + getEnvOrDefault( + process.env.KIT_DOTENV_PATH, + kenvPath(".env") + ) + )() } diff --git a/src/core/utils.ts b/src/core/utils.ts index cc761c80..808b7ef4 100644 --- a/src/core/utils.ts +++ b/src/core/utils.ts @@ -1642,6 +1642,7 @@ export { home, kitPath, kenvPath, + kitPnpmPath, kitDotEnvPath, } from "./resolvers.js"