From 60368599535f6ecf01b0d5f0fce73e12758c24f7 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Fri, 4 Oct 2024 13:26:55 -0400 Subject: [PATCH] use empathic --- packages/cli/commands/add.ts | 10 +++++----- packages/cli/commands/check.ts | 9 +++------ packages/cli/package.json | 1 + packages/core/files/utils.ts | 24 ------------------------ packages/core/files/workspace.ts | 8 +++++--- packages/core/internal.ts | 2 +- packages/core/package.json | 1 + pnpm-lock.yaml | 12 ++++++++++++ 8 files changed, 28 insertions(+), 39 deletions(-) diff --git a/packages/cli/commands/add.ts b/packages/cli/commands/add.ts index 244c6ad5c..19a61c78d 100644 --- a/packages/cli/commands/add.ts +++ b/packages/cli/commands/add.ts @@ -4,6 +4,7 @@ import * as v from 'valibot'; import { exec } from 'tinyexec'; import { Command, Option } from 'commander'; import * as p from '@svelte-cli/clack-prompts'; +import * as pkg from 'empathic/package'; import pc from 'picocolors'; import { adderCategories, @@ -16,7 +17,6 @@ import { import { createOrUpdateFiles, createWorkspace, - findUp, installPackages, TESTING } from '@svelte-cli/core/internal'; @@ -50,7 +50,7 @@ const addersOptions = getAdderOptionFlags(); const communityDetails: AdderWithoutExplicitArgs[] = []; // infers the workspace cwd if a `package.json` resides in a parent directory -const defaultPkgPath = findUp(process.cwd(), 'package.json'); +const defaultPkgPath = pkg.up(); const defaultCwd = defaultPkgPath ? path.dirname(defaultPkgPath) : undefined; export const add = new Command('add') @@ -460,8 +460,8 @@ export async function runAddCommand(options: Options, adders: string[]): Promise } // install dependencies - let depsStatus; - if (options.install) { + let depsStatus: 'installed' | 'skipped' | undefined; + if (options.install && selectedAdders.length > 0) { depsStatus = await common.suggestInstallingDependencies(options.cwd); } @@ -635,7 +635,7 @@ function getOptionChoices(details: AdderWithoutExplicitArgs) { const groups: Record = {}; const options: Record = {}; for (const [id, question] of Object.entries(details.config.options)) { - let values = []; + let values: string[] = []; const applyDefault = question.condition?.(options) !== false; if (question.type === 'boolean') { values = [id, `no-${id}`]; diff --git a/packages/cli/commands/check.ts b/packages/cli/commands/check.ts index a11050923..d71e3795b 100644 --- a/packages/cli/commands/check.ts +++ b/packages/cli/commands/check.ts @@ -1,12 +1,10 @@ -import { createRequire } from 'node:module'; import { execSync } from 'node:child_process'; import pc from 'picocolors'; +import * as resolve from 'empathic/resolve'; import { Command } from 'commander'; import { resolveCommand } from 'package-manager-detector/commands'; import { getUserAgent } from '../common.ts'; -const require = createRequire(import.meta.url); - export const check = new Command('check') .description('a CLI for checking your Svelte code') // flags that we'll want to pass to `svelte-check` @@ -30,9 +28,8 @@ function runCheck(cwd: string, args: string[]) { const pm = getUserAgent() ?? 'npm'; // validates that `svelte-check` is locally installed - try { - require.resolve('svelte-check', { paths: [cwd] }); - } catch { + const resolved = resolve.from(cwd, 'svelte-check', true); + if (!resolved) { const cmd = resolveCommand(pm, 'add', ['-D', 'svelte-check'])!; console.error( `'svelte-check' is not installed locally. Install it with: ${pc.bold(`${cmd.command} ${cmd.args.join(' ')}`)}` diff --git a/packages/cli/package.json b/packages/cli/package.json index 0a03ec4fe..f24afeb1d 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -35,6 +35,7 @@ "@svelte-cli/create": "workspace:*", "@types/tar-fs": "^2.0.4", "commander": "^12.1.0", + "empathic": "^1.0.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "tar-fs": "^3.0.6", diff --git a/packages/core/files/utils.ts b/packages/core/files/utils.ts index 155c38736..ec157e435 100644 --- a/packages/core/files/utils.ts +++ b/packages/core/files/utils.ts @@ -128,27 +128,3 @@ export const commonFilePaths = { tsconfig: 'tsconfig.json', viteConfigTS: 'vite.config.ts' } as const; - -export function findUp(searchPath: string, fileName: string, maxDepth = -1): string | undefined { - // partially sourced from https://github.com/privatenumber/get-tsconfig/blob/9e78ec52d450d58743439358dd88e2066109743f/src/utils/find-up.ts#L5 - let depth = 0; - while (maxDepth < 0 || depth < maxDepth) { - const configPath = path.posix.join(searchPath, fileName); - - try { - // `access` throws an exception if the file could not be found - fs.accessSync(configPath); - return configPath; - } catch { - const parentPath = path.dirname(searchPath); - if (parentPath === searchPath) { - // root directory - return; - } - - searchPath = parentPath; - } - - depth++; - } -} diff --git a/packages/core/files/workspace.ts b/packages/core/files/workspace.ts index edc186818..128a584a2 100644 --- a/packages/core/files/workspace.ts +++ b/packages/core/files/workspace.ts @@ -1,9 +1,11 @@ import fs from 'node:fs'; import path from 'node:path'; +import * as find from 'empathic/find'; +import * as resolve from 'empathic/resolve'; import { type AstTypes, parseScript } from '@svelte-cli/ast-tooling'; import { TESTING } from '../env.ts'; import { common, object } from '../tooling/js/index.ts'; -import { commonFilePaths, findUp, getPackageJson, readFile } from './utils.ts'; +import { commonFilePaths, getPackageJson, readFile } from './utils.ts'; import type { OptionDefinition, OptionValues, Question } from '../adder/options.ts'; export type Workspace = { @@ -38,14 +40,14 @@ export function createWorkspace(cwd: string): Wor // as we might detect the monorepo `tsconfig.json` otherwise. usesTypescript ||= fs.existsSync(path.join(cwd, commonFilePaths.tsconfig)); } else { - usesTypescript ||= findUp(cwd, commonFilePaths.tsconfig) !== undefined; + usesTypescript ||= find.up(commonFilePaths.tsconfig, { cwd }) !== undefined; } const { data: packageJson } = getPackageJson(workspace); workspace.dependencies = { ...packageJson.devDependencies, ...packageJson.dependencies }; workspace.typescript = usesTypescript; - workspace.prettier = 'prettier' in workspace.dependencies; + workspace.prettier = Boolean(resolve.from(cwd, 'prettier', true)); if ('@sveltejs/kit' in workspace.dependencies) workspace.kit = parseKitOptions(workspace); for (const [key, value] of Object.entries(workspace.dependencies)) { // removes the version ranges (e.g. `^` is removed from: `^9.0.0`) diff --git a/packages/core/internal.ts b/packages/core/internal.ts index 21db0bab7..7f2af1e81 100644 --- a/packages/core/internal.ts +++ b/packages/core/internal.ts @@ -1,4 +1,4 @@ -export { installPackages, findUp } from './files/utils.ts'; +export { installPackages } from './files/utils.ts'; export { createOrUpdateFiles } from './files/processors.ts'; export { createWorkspace, type Workspace } from './files/workspace.ts'; export { TESTING } from './env.ts'; diff --git a/packages/core/package.json b/packages/core/package.json index a1ce9ec7b..a7a7f9eaf 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -39,6 +39,7 @@ "@svelte-cli/clack-prompts": "workspace:*", "decircular": "^1.0.0", "dedent": "^1.5.3", + "empathic": "^1.0.0", "picocolors": "^1.1.0" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd6f056a9..b7fb7a5b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -172,6 +172,9 @@ importers: commander: specifier: ^12.1.0 version: 12.1.0 + empathic: + specifier: ^1.0.0 + version: 1.0.0 package-manager-detector: specifier: ^0.2.0 version: 0.2.0 @@ -203,6 +206,9 @@ importers: dedent: specifier: ^1.5.3 version: 1.5.3 + empathic: + specifier: ^1.0.0 + version: 1.0.0 picocolors: specifier: ^1.1.0 version: 1.1.0 @@ -1077,6 +1083,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@1.0.0: + resolution: {integrity: sha512-qtKgI1Mv8rTacvpaTkh28HM2Lbf+IOjXb7rhpt/42kZxRm8TBb/IVlo5iL2ztT19kc/EHAFN0fZ641avlXAgdg==} + engines: {node: '>=16'} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -3028,6 +3038,8 @@ snapshots: emoji-regex@9.2.2: {} + empathic@1.0.0: {} + end-of-stream@1.4.4: dependencies: once: 1.4.0