From 65977d20a4e320a199d9c769faae5643dc28bbd2 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 9 Oct 2024 18:27:11 -0700 Subject: [PATCH 01/15] chore: remove prettier workspace property --- packages/adders/eslint/config/adder.ts | 5 +++-- packages/adders/package.json | 3 +++ packages/adders/tailwindcss/config/adder.ts | 5 +++-- packages/core/files/workspace.ts | 4 ---- pnpm-lock.yaml | 6 +++++- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/adders/eslint/config/adder.ts b/packages/adders/eslint/config/adder.ts index 82394a50..680a1578 100644 --- a/packages/adders/eslint/config/adder.ts +++ b/packages/adders/eslint/config/adder.ts @@ -4,6 +4,7 @@ import { options } from './options.ts'; import { addEslintConfigPrettier } from '../../common.ts'; import { defineAdderConfig, log, type AstKinds, type AstTypes } from '@svelte-cli/core'; import { array, common, exports, functions, imports, object } from '@svelte-cli/core/js'; +import * as resolve from 'empathic/resolve'; export const adder = defineAdderConfig({ metadata: { @@ -33,7 +34,7 @@ export const adder = defineAdderConfig({ name: 'eslint-config-prettier', version: '^9.1.0', dev: true, - condition: ({ prettier }) => prettier + condition: ({ cwd }) => Boolean(resolve.from(cwd, 'prettier', true)) } ], files: [ @@ -141,7 +142,7 @@ export const adder = defineAdderConfig({ { name: () => 'eslint.config.js', contentType: 'script', - condition: ({ prettier }) => prettier, + condition: ({ cwd }) => Boolean(resolve.from(cwd, 'prettier', true)), content: addEslintConfigPrettier } ] diff --git a/packages/adders/package.json b/packages/adders/package.json index d65cdbf7..9457fb20 100644 --- a/packages/adders/package.json +++ b/packages/adders/package.json @@ -16,5 +16,8 @@ }, "dependencies": { "@svelte-cli/core": "workspace:*" + }, + "devDependencies": { + "empathic": "^1.0.0" } } diff --git a/packages/adders/tailwindcss/config/adder.ts b/packages/adders/tailwindcss/config/adder.ts index 7b63d5ae..53b71630 100644 --- a/packages/adders/tailwindcss/config/adder.ts +++ b/packages/adders/tailwindcss/config/adder.ts @@ -3,6 +3,7 @@ import { defineAdderConfig } from '@svelte-cli/core'; import { array, common, exports, functions, imports, object } from '@svelte-cli/core/js'; import { addImports } from '@svelte-cli/core/css'; import { element } from '@svelte-cli/core/html'; +import * as resolve from 'empathic/resolve'; export const adder = defineAdderConfig({ metadata: { @@ -31,7 +32,7 @@ export const adder = defineAdderConfig({ name: 'prettier-plugin-tailwindcss', version: '^0.6.5', dev: true, - condition: ({ prettier }) => prettier + condition: ({ cwd }) => Boolean(resolve.from(cwd, 'prettier', true)), } ], files: [ @@ -134,7 +135,7 @@ export const adder = defineAdderConfig({ if (!plugins.includes(PLUGIN_NAME)) plugins.push(PLUGIN_NAME); }, - condition: ({ prettier }) => prettier + condition: ({ cwd }) => Boolean(resolve.from(cwd, 'prettier', true)), } ] }); diff --git a/packages/core/files/workspace.ts b/packages/core/files/workspace.ts index cef874d0..00600720 100644 --- a/packages/core/files/workspace.ts +++ b/packages/core/files/workspace.ts @@ -1,7 +1,6 @@ import fs from 'node:fs'; import path from 'node:path'; import * as find from 'empathic/find'; -import * as resolve from 'empathic/resolve'; import { AGENTS, detectSync, type AgentName } from 'package-manager-detector'; import { type AstTypes, parseScript } from '@svelte-cli/ast-tooling'; import { TESTING } from '../env.ts'; @@ -14,7 +13,6 @@ export type Workspace = { options: OptionValues; cwd: string; dependencies: Record; - prettier: boolean; typescript: boolean; kit: { libDirectory: string; routesDirectory: string } | undefined; packageManager: AgentName; @@ -24,7 +22,6 @@ export function createEmptyWorkspace() { return { options: {}, cwd: '', - prettier: false, typescript: false, kit: undefined } as Workspace; @@ -48,7 +45,6 @@ export function createWorkspace(cwd: string): Wor workspace.dependencies = { ...packageJson.devDependencies, ...packageJson.dependencies }; workspace.typescript = usesTypescript; - workspace.prettier = Boolean(resolve.from(cwd, 'prettier', true)); workspace.packageManager = detectPackageManager(cwd); if ('@sveltejs/kit' in workspace.dependencies) workspace.kit = parseKitOptions(workspace); for (const [key, value] of Object.entries(workspace.dependencies)) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 77f4e22e..0a9921dc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,6 +93,10 @@ importers: '@svelte-cli/core': specifier: workspace:* version: link:../core + devDependencies: + empathic: + specifier: ^1.0.0 + version: 1.0.0 packages/ast-tooling: devDependencies: @@ -992,7 +996,7 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} From e20f6eacee9f9614f58b90fe44c6c0fdd0eee484 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 10 Oct 2024 08:01:55 -0700 Subject: [PATCH 02/15] don't require empathic --- packages/adders/eslint/config/adder.ts | 5 ++--- packages/adders/package.json | 3 --- packages/adders/tailwindcss/config/adder.ts | 5 ++--- packages/core/files/workspace.ts | 4 ++++ pnpm-lock.yaml | 4 ---- 5 files changed, 8 insertions(+), 13 deletions(-) diff --git a/packages/adders/eslint/config/adder.ts b/packages/adders/eslint/config/adder.ts index 680a1578..f202ee12 100644 --- a/packages/adders/eslint/config/adder.ts +++ b/packages/adders/eslint/config/adder.ts @@ -4,7 +4,6 @@ import { options } from './options.ts'; import { addEslintConfigPrettier } from '../../common.ts'; import { defineAdderConfig, log, type AstKinds, type AstTypes } from '@svelte-cli/core'; import { array, common, exports, functions, imports, object } from '@svelte-cli/core/js'; -import * as resolve from 'empathic/resolve'; export const adder = defineAdderConfig({ metadata: { @@ -34,7 +33,7 @@ export const adder = defineAdderConfig({ name: 'eslint-config-prettier', version: '^9.1.0', dev: true, - condition: ({ cwd }) => Boolean(resolve.from(cwd, 'prettier', true)) + condition: ({ isResolvable }) => isResolvable('prettier') } ], files: [ @@ -142,7 +141,7 @@ export const adder = defineAdderConfig({ { name: () => 'eslint.config.js', contentType: 'script', - condition: ({ cwd }) => Boolean(resolve.from(cwd, 'prettier', true)), + condition: ({ isResolvable }) => isResolvable('prettier'), content: addEslintConfigPrettier } ] diff --git a/packages/adders/package.json b/packages/adders/package.json index 9457fb20..d65cdbf7 100644 --- a/packages/adders/package.json +++ b/packages/adders/package.json @@ -16,8 +16,5 @@ }, "dependencies": { "@svelte-cli/core": "workspace:*" - }, - "devDependencies": { - "empathic": "^1.0.0" } } diff --git a/packages/adders/tailwindcss/config/adder.ts b/packages/adders/tailwindcss/config/adder.ts index 53b71630..eaebf68c 100644 --- a/packages/adders/tailwindcss/config/adder.ts +++ b/packages/adders/tailwindcss/config/adder.ts @@ -3,7 +3,6 @@ import { defineAdderConfig } from '@svelte-cli/core'; import { array, common, exports, functions, imports, object } from '@svelte-cli/core/js'; import { addImports } from '@svelte-cli/core/css'; import { element } from '@svelte-cli/core/html'; -import * as resolve from 'empathic/resolve'; export const adder = defineAdderConfig({ metadata: { @@ -32,7 +31,7 @@ export const adder = defineAdderConfig({ name: 'prettier-plugin-tailwindcss', version: '^0.6.5', dev: true, - condition: ({ cwd }) => Boolean(resolve.from(cwd, 'prettier', true)), + condition: ({ isResolvable }) => isResolvable('prettier') } ], files: [ @@ -135,7 +134,7 @@ export const adder = defineAdderConfig({ if (!plugins.includes(PLUGIN_NAME)) plugins.push(PLUGIN_NAME); }, - condition: ({ cwd }) => Boolean(resolve.from(cwd, 'prettier', true)), + condition: ({ isResolvable }) => isResolvable('prettier') } ] }); diff --git a/packages/core/files/workspace.ts b/packages/core/files/workspace.ts index 00600720..3fef374c 100644 --- a/packages/core/files/workspace.ts +++ b/packages/core/files/workspace.ts @@ -1,6 +1,7 @@ import fs from 'node:fs'; import path from 'node:path'; import * as find from 'empathic/find'; +import * as resolve from 'empathic/resolve'; import { AGENTS, detectSync, type AgentName } from 'package-manager-detector'; import { type AstTypes, parseScript } from '@svelte-cli/ast-tooling'; import { TESTING } from '../env.ts'; @@ -13,6 +14,7 @@ export type Workspace = { options: OptionValues; cwd: string; dependencies: Record; + isResolvable: (module: string) => boolean; typescript: boolean; kit: { libDirectory: string; routesDirectory: string } | undefined; packageManager: AgentName; @@ -22,6 +24,7 @@ export function createEmptyWorkspace() { return { options: {}, cwd: '', + isResolvable: (_module) => false, typescript: false, kit: undefined } as Workspace; @@ -45,6 +48,7 @@ export function createWorkspace(cwd: string): Wor workspace.dependencies = { ...packageJson.devDependencies, ...packageJson.dependencies }; workspace.typescript = usesTypescript; + workspace.isResolvable = (module: string) => Boolean(resolve.from(workspace.cwd, module, true)); workspace.packageManager = detectPackageManager(cwd); if ('@sveltejs/kit' in workspace.dependencies) workspace.kit = parseKitOptions(workspace); for (const [key, value] of Object.entries(workspace.dependencies)) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a9921dc..fb092959 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,10 +93,6 @@ importers: '@svelte-cli/core': specifier: workspace:* version: link:../core - devDependencies: - empathic: - specifier: ^1.0.0 - version: 1.0.0 packages/ast-tooling: devDependencies: From 27145e6ae28e9b4f7f3af72ef3983b220ec4b450 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 10 Oct 2024 08:19:56 -0700 Subject: [PATCH 03/15] one more to update --- packages/cli/commands/add.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/commands/add.ts b/packages/cli/commands/add.ts index a56e4a81..26a8770a 100644 --- a/packages/cli/commands/add.ts +++ b/packages/cli/commands/add.ts @@ -463,7 +463,7 @@ export async function runAddCommand(options: Options, adders: string[]): Promise // format modified/created files with prettier (if available) const workspace = createWorkspace(options.cwd); - if (filesToFormat.length > 0 && depsStatus === 'installed' && workspace.prettier) { + if (filesToFormat.length > 0 && depsStatus === 'installed' && workspace.isResolvable('prettier')) { const { start, stop } = p.spinner(); start('Formatting modified files'); try { From 0c1911f80ae5a0fbb2bbd59e1cfde765c6debe02 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 10 Oct 2024 08:26:32 -0700 Subject: [PATCH 04/15] format --- packages/cli/commands/add.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/cli/commands/add.ts b/packages/cli/commands/add.ts index 26a8770a..0ea71ffb 100644 --- a/packages/cli/commands/add.ts +++ b/packages/cli/commands/add.ts @@ -463,7 +463,11 @@ export async function runAddCommand(options: Options, adders: string[]): Promise // format modified/created files with prettier (if available) const workspace = createWorkspace(options.cwd); - if (filesToFormat.length > 0 && depsStatus === 'installed' && workspace.isResolvable('prettier')) { + if ( + filesToFormat.length > 0 && + depsStatus === 'installed' && + workspace.isResolvable('prettier') + ) { const { start, stop } = p.spinner(); start('Formatting modified files'); try { From 2a17b5ed0247e5b43557ca1a81c6e540fe863ff8 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:08:47 -0700 Subject: [PATCH 05/15] dependencyVersion method --- packages/adders/eslint/config/adder.ts | 4 +-- packages/adders/prettier/config/adder.ts | 17 ++++++------ packages/adders/tailwindcss/config/adder.ts | 4 +-- packages/cli/commands/add.ts | 4 +-- packages/core/files/workspace.ts | 30 ++++++++++++--------- 5 files changed, 33 insertions(+), 26 deletions(-) diff --git a/packages/adders/eslint/config/adder.ts b/packages/adders/eslint/config/adder.ts index f202ee12..1fa90ed1 100644 --- a/packages/adders/eslint/config/adder.ts +++ b/packages/adders/eslint/config/adder.ts @@ -33,7 +33,7 @@ export const adder = defineAdderConfig({ name: 'eslint-config-prettier', version: '^9.1.0', dev: true, - condition: ({ isResolvable }) => isResolvable('prettier') + condition: ({ dependencyVersion }) => Boolean(dependencyVersion('prettier')) } ], files: [ @@ -141,7 +141,7 @@ export const adder = defineAdderConfig({ { name: () => 'eslint.config.js', contentType: 'script', - condition: ({ isResolvable }) => isResolvable('prettier'), + condition: ({ dependencyVersion }) => Boolean(dependencyVersion('prettier')), content: addEslintConfigPrettier } ] diff --git a/packages/adders/prettier/config/adder.ts b/packages/adders/prettier/config/adder.ts index de0c023e..1835f399 100644 --- a/packages/adders/prettier/config/adder.ts +++ b/packages/adders/prettier/config/adder.ts @@ -22,7 +22,7 @@ export const adder = defineAdderConfig({ name: 'eslint-config-prettier', version: '^9.1.0', dev: true, - condition: ({ dependencies }) => hasEslint(dependencies) + condition: ({ dependencyVersion }) => hasEslint(dependencyVersion) } ], files: [ @@ -69,13 +69,13 @@ export const adder = defineAdderConfig({ { name: () => 'package.json', contentType: 'json', - content: ({ data, dependencies }) => { + content: ({ data, dependencyVersion }) => { data.scripts ??= {}; const scripts: Record = data.scripts; const CHECK_CMD = 'prettier --check .'; scripts['format'] ??= 'prettier --write .'; - if (hasEslint(dependencies)) { + if (hasEslint(dependencyVersion)) { scripts['lint'] ??= `${CHECK_CMD} && eslint .`; if (!scripts['lint'].includes(CHECK_CMD)) scripts['lint'] += ` && ${CHECK_CMD}`; } else { @@ -86,17 +86,17 @@ export const adder = defineAdderConfig({ { name: () => 'eslint.config.js', contentType: 'script', - condition: ({ dependencies: deps }) => { + condition: ({ dependencyVersion }) => { // We only want this to execute when it's `false`, not falsy - if (deps['eslint']?.startsWith(SUPPORTED_ESLINT_VERSION) === false) { + if (dependencyVersion('eslint')?.startsWith(SUPPORTED_ESLINT_VERSION) === false) { log.warn( `An older major version of ${colors.yellow( 'eslint' )} was detected. Skipping ${colors.yellow('eslint-config-prettier')} installation.` ); } - return hasEslint(deps); + return hasEslint(dependencyVersion); }, content: addEslintConfigPrettier } @@ -105,6 +105,7 @@ export const adder = defineAdderConfig({ const SUPPORTED_ESLINT_VERSION = '9'; -function hasEslint(deps: Record): boolean { - return !!deps['eslint'] && deps['eslint'].startsWith(SUPPORTED_ESLINT_VERSION); +function hasEslint(dependencyVersion: (pkg: string) => string | undefined): boolean { + const version = dependencyVersion('eslint'); + return !!version && version.startsWith(SUPPORTED_ESLINT_VERSION); } diff --git a/packages/adders/tailwindcss/config/adder.ts b/packages/adders/tailwindcss/config/adder.ts index eaebf68c..71a046b9 100644 --- a/packages/adders/tailwindcss/config/adder.ts +++ b/packages/adders/tailwindcss/config/adder.ts @@ -31,7 +31,7 @@ export const adder = defineAdderConfig({ name: 'prettier-plugin-tailwindcss', version: '^0.6.5', dev: true, - condition: ({ isResolvable }) => isResolvable('prettier') + condition: ({ dependencyVersion }) => Boolean(dependencyVersion('prettier')) } ], files: [ @@ -134,7 +134,7 @@ export const adder = defineAdderConfig({ if (!plugins.includes(PLUGIN_NAME)) plugins.push(PLUGIN_NAME); }, - condition: ({ isResolvable }) => isResolvable('prettier') + condition: ({ dependencyVersion }) => Boolean(dependencyVersion('prettier')) } ] }); diff --git a/packages/cli/commands/add.ts b/packages/cli/commands/add.ts index 0ea71ffb..37a3a237 100644 --- a/packages/cli/commands/add.ts +++ b/packages/cli/commands/add.ts @@ -340,7 +340,7 @@ export async function runAddCommand(options: Options, adders: string[]): Promise let installed = false; installed = dependent.config.packages.every( // we'll skip the conditions since we don't have any options to supply it - (p) => p.condition !== undefined || !!workspace.dependencies[p.name] + (p) => p.condition !== undefined || !!workspace.dependencyVersion(p.name) ); if (installed) continue; @@ -466,7 +466,7 @@ export async function runAddCommand(options: Options, adders: string[]): Promise if ( filesToFormat.length > 0 && depsStatus === 'installed' && - workspace.isResolvable('prettier') + !!workspace.dependencyVersion('prettier') ) { const { start, stop } = p.spinner(); start('Formatting modified files'); diff --git a/packages/core/files/workspace.ts b/packages/core/files/workspace.ts index 3fef374c..ac2729d6 100644 --- a/packages/core/files/workspace.ts +++ b/packages/core/files/workspace.ts @@ -1,7 +1,6 @@ import fs from 'node:fs'; import path from 'node:path'; import * as find from 'empathic/find'; -import * as resolve from 'empathic/resolve'; import { AGENTS, detectSync, type AgentName } from 'package-manager-detector'; import { type AstTypes, parseScript } from '@svelte-cli/ast-tooling'; import { TESTING } from '../env.ts'; @@ -13,8 +12,13 @@ import process from 'node:process'; export type Workspace = { options: OptionValues; cwd: string; - dependencies: Record; - isResolvable: (module: string) => boolean; + /** + * Returns the dependency version declared in the package.json. + * This may differ from the installed version. + * @param pkg the package to check for + * @returns the dependency version with any leading characters such as ^ or ~ removed + */ + dependencyVersion: (pkg: string) => string | undefined; typescript: boolean; kit: { libDirectory: string; routesDirectory: string } | undefined; packageManager: AgentName; @@ -24,7 +28,7 @@ export function createEmptyWorkspace() { return { options: {}, cwd: '', - isResolvable: (_module) => false, + dependencyVersion: (_pkg) => undefined, typescript: false, kit: undefined } as Workspace; @@ -45,17 +49,19 @@ export function createWorkspace(cwd: string): Wor } const { data: packageJson } = getPackageJson(workspace); + const dependencies = { ...packageJson.devDependencies, ...packageJson.dependencies }; - workspace.dependencies = { ...packageJson.devDependencies, ...packageJson.dependencies }; + workspace.dependencyVersion = (pkg) => { + const found = dependencies[pkg]; + if (!found) { + return found; + } + // removes the version ranges (e.g. `^` is removed from: `^9.0.0`) + return found.replaceAll(/[^\d|.]/g, ''); + }; workspace.typescript = usesTypescript; - workspace.isResolvable = (module: string) => Boolean(resolve.from(workspace.cwd, module, true)); workspace.packageManager = detectPackageManager(cwd); - 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`) - workspace.dependencies[key] = value.replaceAll(/[^\d|.]/g, ''); - } - + if ('@sveltejs/kit' in dependencies) workspace.kit = parseKitOptions(workspace); return workspace; } From e3d228810e2c3995f6a51f3b60eeeb2edf761ac2 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:28:45 -0700 Subject: [PATCH 06/15] add TODO --- packages/core/files/workspace.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/core/files/workspace.ts b/packages/core/files/workspace.ts index ac2729d6..fb0a2038 100644 --- a/packages/core/files/workspace.ts +++ b/packages/core/files/workspace.ts @@ -52,6 +52,9 @@ export function createWorkspace(cwd: string): Wor const dependencies = { ...packageJson.devDependencies, ...packageJson.dependencies }; workspace.dependencyVersion = (pkg) => { + // TODO: support monorepos + // it would be nice to keep this working before the user has done an install + // we could go up checking all the package.json until we find a pnpm-workspace.yaml, etc. const found = dependencies[pkg]; if (!found) { return found; From 0bf023ac2558d0f98565a49522796129d4244539 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:55:10 -0700 Subject: [PATCH 07/15] take cwd rather than workspace --- packages/core/files/processors.ts | 6 +++--- packages/core/files/utils.ts | 16 ++++++++-------- packages/core/files/workspace.ts | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/core/files/processors.ts b/packages/core/files/processors.ts index 76da488d..fd0b9904 100644 --- a/packages/core/files/processors.ts +++ b/packages/core/files/processors.ts @@ -13,7 +13,7 @@ import { type CssAst, type HtmlDocument } from '@svelte-cli/ast-tooling'; -import { fileExistsWorkspace, readFile, writeFile } from './utils.ts'; +import { fileExists, readFile, writeFile } from './utils.ts'; import type { ConditionDefinition } from '../adder/config.ts'; import type { OptionDefinition } from '../adder/options.ts'; import type { Workspace } from './workspace.ts'; @@ -89,8 +89,8 @@ export function createOrUpdateFiles( continue; } - const exists = fileExistsWorkspace(workspace, fileDetails.name(workspace)); - let content = exists ? readFile(workspace, fileDetails.name(workspace)) : ''; + const exists = fileExists(workspace.cwd, fileDetails.name(workspace)); + let content = exists ? readFile(workspace.cwd, fileDetails.name(workspace)) : ''; if (fileDetails.contentType === 'css') { content = handleCssFile(content, fileDetails, workspace); diff --git a/packages/core/files/utils.ts b/packages/core/files/utils.ts index b207db40..1ef713d3 100644 --- a/packages/core/files/utils.ts +++ b/packages/core/files/utils.ts @@ -15,11 +15,11 @@ export type Package = { keywords?: string[]; }; -export function getPackageJson(workspace: Workspace): { +export function getPackageJson(cwd: string): { text: string; data: Package; } { - const packageText = readFile(workspace, commonFilePaths.packageJson); + const packageText = readFile(cwd, commonFilePaths.packageJson); if (!packageText) { return { text: '', @@ -39,10 +39,10 @@ export function getPackageJson(workspace: Workspace): { }; } -export function readFile(workspace: Workspace, filePath: string): string { - const fullFilePath = getFilePath(workspace.cwd, filePath); +export function readFile(cwd: string, filePath: string): string { + const fullFilePath = getFilePath(cwd, filePath); - if (!fileExistsWorkspace(workspace, filePath)) { + if (!fileExists(cwd, filePath)) { return ''; } @@ -52,7 +52,7 @@ export function readFile(workspace: Workspace, filePath: string): string { } export function installPackages(config: AdderConfig, workspace: Workspace): string { - const { text: originalText, data } = getPackageJson(workspace); + const { text: originalText, data } = getPackageJson(workspace.cwd); for (const dependency of config.packages) { if (dependency.condition && !dependency.condition(workspace)) { @@ -103,8 +103,8 @@ export function writeFile(workspace: Workspace, filePath: string, content: fs.writeFileSync(fullFilePath, content, 'utf8'); } -export function fileExistsWorkspace(workspace: Workspace, filePath: string): boolean { - const fullFilePath = getFilePath(workspace.cwd, filePath); +export function fileExists(cwd: string, filePath: string): boolean { + const fullFilePath = getFilePath(cwd, filePath); return fs.existsSync(fullFilePath); } diff --git a/packages/core/files/workspace.ts b/packages/core/files/workspace.ts index fb0a2038..3d6f0ab1 100644 --- a/packages/core/files/workspace.ts +++ b/packages/core/files/workspace.ts @@ -48,7 +48,7 @@ export function createWorkspace(cwd: string): Wor usesTypescript ||= find.up(commonFilePaths.tsconfig, { cwd }) !== undefined; } - const { data: packageJson } = getPackageJson(workspace); + const { data: packageJson } = getPackageJson(workspace.cwd); const dependencies = { ...packageJson.devDependencies, ...packageJson.dependencies }; workspace.dependencyVersion = (pkg) => { @@ -69,7 +69,7 @@ export function createWorkspace(cwd: string): Wor } function parseKitOptions(workspace: Workspace) { - const configSource = readFile(workspace, commonFilePaths.svelteConfig); + const configSource = readFile(workspace.cwd, commonFilePaths.svelteConfig); const ast = parseScript(configSource); const defaultExport = ast.body.find((s) => s.type === 'ExportDefaultDeclaration'); From 2ec4ba20a4adaa0475d0c96ce6e08e3cc9504f83 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 10 Oct 2024 10:17:24 -0700 Subject: [PATCH 08/15] monorepo support --- packages/core/files/utils.ts | 1 + packages/core/files/workspace.ts | 40 ++++++++++++++++++++++---------- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/packages/core/files/utils.ts b/packages/core/files/utils.ts index 1ef713d3..6f5b4906 100644 --- a/packages/core/files/utils.ts +++ b/packages/core/files/utils.ts @@ -13,6 +13,7 @@ export type Package = { bugs?: string; repository?: { type: string; url: string }; keywords?: string[]; + workspaces?: string[]; }; export function getPackageJson(cwd: string): { diff --git a/packages/core/files/workspace.ts b/packages/core/files/workspace.ts index 3d6f0ab1..7d8df82d 100644 --- a/packages/core/files/workspace.ts +++ b/packages/core/files/workspace.ts @@ -48,26 +48,42 @@ export function createWorkspace(cwd: string): Wor usesTypescript ||= find.up(commonFilePaths.tsconfig, { cwd }) !== undefined; } - const { data: packageJson } = getPackageJson(workspace.cwd); - const dependencies = { ...packageJson.devDependencies, ...packageJson.dependencies }; - workspace.dependencyVersion = (pkg) => { - // TODO: support monorepos - // it would be nice to keep this working before the user has done an install - // we could go up checking all the package.json until we find a pnpm-workspace.yaml, etc. - const found = dependencies[pkg]; - if (!found) { - return found; + const root = findRoot(workspace.cwd); + let directory = cwd; + while (directory && directory !== root) { + const { data: packageJson } = getPackageJson(workspace.cwd); + const dependencies = { ...packageJson.devDependencies, ...packageJson.dependencies }; + const found = dependencies[pkg]; + if (found) { + // removes the version ranges (e.g. `^` is removed from: `^9.0.0`) + return found.replaceAll(/[^\d|.]/g, ''); + } + directory = path.dirname(directory); } - // removes the version ranges (e.g. `^` is removed from: `^9.0.0`) - return found.replaceAll(/[^\d|.]/g, ''); }; workspace.typescript = usesTypescript; workspace.packageManager = detectPackageManager(cwd); - if ('@sveltejs/kit' in dependencies) workspace.kit = parseKitOptions(workspace); + if (workspace.dependencyVersion('@sveltejs/kit')) workspace.kit = parseKitOptions(workspace); return workspace; } +function findRoot(cwd: string): string { + const { root } = path.parse(cwd); + let directory = cwd; + while (directory && directory !== root) { + if (fs.existsSync(path.join(directory, 'pnpm-workspace.yaml'))) { + return directory; + } + const { data } = getPackageJson(directory); + if (data.workspaces) { + return directory; + } + directory = path.dirname(directory); + } + return root; +} + function parseKitOptions(workspace: Workspace) { const configSource = readFile(workspace.cwd, commonFilePaths.svelteConfig); const ast = parseScript(configSource); From cd2960ae198121e6c2c71a4fa8610cc146ce15e1 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 10 Oct 2024 11:03:21 -0700 Subject: [PATCH 09/15] revert hash change --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb092959..77f4e22e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -992,7 +992,7 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} From 1a3c380d06bdf256fd8b5f2bdd94aec8694ab9b2 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 10 Oct 2024 11:10:13 -0700 Subject: [PATCH 10/15] perf --- packages/core/files/workspace.ts | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/packages/core/files/workspace.ts b/packages/core/files/workspace.ts index 7d8df82d..1e50059b 100644 --- a/packages/core/files/workspace.ts +++ b/packages/core/files/workspace.ts @@ -15,6 +15,7 @@ export type Workspace = { /** * Returns the dependency version declared in the package.json. * This may differ from the installed version. + * Includes both dependencies and devDependencies. * @param pkg the package to check for * @returns the dependency version with any leading characters such as ^ or ~ removed */ @@ -48,19 +49,21 @@ export function createWorkspace(cwd: string): Wor usesTypescript ||= find.up(commonFilePaths.tsconfig, { cwd }) !== undefined; } + let dependencies: Record = {}; + let directory = workspace.cwd; + const root = findRoot(workspace.cwd); + while (directory && directory !== root) { + const { data: packageJson } = getPackageJson(workspace.cwd); + dependencies = { ...packageJson.devDependencies, ...packageJson.dependencies, ...dependencies }; + directory = path.dirname(directory); + } + // removes the version ranges (e.g. `^` is removed from: `^9.0.0`) + for (const [key, value] of Object.entries(dependencies)) { + dependencies[key] = value.replaceAll(/[^\d|.]/g, ''); + } + workspace.dependencyVersion = (pkg) => { - const root = findRoot(workspace.cwd); - let directory = cwd; - while (directory && directory !== root) { - const { data: packageJson } = getPackageJson(workspace.cwd); - const dependencies = { ...packageJson.devDependencies, ...packageJson.dependencies }; - const found = dependencies[pkg]; - if (found) { - // removes the version ranges (e.g. `^` is removed from: `^9.0.0`) - return found.replaceAll(/[^\d|.]/g, ''); - } - directory = path.dirname(directory); - } + return dependencies[pkg]; }; workspace.typescript = usesTypescript; workspace.packageManager = detectPackageManager(cwd); From a23d4de958f3634bc615c26e401a6ffa8f22cd9f Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 10 Oct 2024 11:37:01 -0700 Subject: [PATCH 11/15] mention monorepo in comment --- packages/core/files/workspace.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/files/workspace.ts b/packages/core/files/workspace.ts index 1e50059b..860cccb0 100644 --- a/packages/core/files/workspace.ts +++ b/packages/core/files/workspace.ts @@ -16,6 +16,7 @@ export type Workspace = { * Returns the dependency version declared in the package.json. * This may differ from the installed version. * Includes both dependencies and devDependencies. + * Also checks parent package.json files if called in a monorepo. * @param pkg the package to check for * @returns the dependency version with any leading characters such as ^ or ~ removed */ From 45782538171bc93bd8628debeb87f0d27404101f Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 10 Oct 2024 19:53:22 -0700 Subject: [PATCH 12/15] fix bad merge --- packages/cli/commands/add/workspace.ts | 33 -------------------------- packages/core/adder/workspace.ts | 11 +++++++-- 2 files changed, 9 insertions(+), 35 deletions(-) diff --git a/packages/cli/commands/add/workspace.ts b/packages/cli/commands/add/workspace.ts index f5af6b27..25c42ead 100644 --- a/packages/cli/commands/add/workspace.ts +++ b/packages/cli/commands/add/workspace.ts @@ -1,40 +1,12 @@ import fs from 'node:fs'; import path from 'node:path'; import * as find from 'empathic/find'; -<<<<<<< HEAD:packages/core/files/workspace.ts -import { AGENTS, detectSync, type AgentName } from 'package-manager-detector'; -import { type AstTypes, parseScript } from '@svelte-cli/ast-tooling'; -import { TESTING } from '../env.ts'; -import { common, object } from '../tooling/js/index.ts'; -import { commonFilePaths, getPackageJson, readFile } from './utils.ts'; -import type { OptionDefinition, OptionValues } from '../adder/options.ts'; -import process from 'node:process'; - -export type Workspace = { - options: OptionValues; - cwd: string; - /** - * Returns the dependency version declared in the package.json. - * This may differ from the installed version. - * Includes both dependencies and devDependencies. - * Also checks parent package.json files if called in a monorepo. - * @param pkg the package to check for - * @returns the dependency version with any leading characters such as ^ or ~ removed - */ - dependencyVersion: (pkg: string) => string | undefined; - typescript: boolean; - kit: { libDirectory: string; routesDirectory: string } | undefined; - packageManager: AgentName; -}; -======= -import * as resolve from 'empathic/resolve'; import { common, object, type AstTypes } from '@svelte-cli/core/js'; import { parseScript } from '@svelte-cli/core/parsers'; import { TESTING } from '../../env.ts'; import { commonFilePaths, getPackageJson, readFile } from './utils.ts'; import { detectPackageManager } from '../../common.ts'; import type { OptionDefinition, Workspace } from '@svelte-cli/core'; ->>>>>>> main:packages/cli/commands/add/workspace.ts export function createEmptyWorkspace() { return { @@ -99,13 +71,8 @@ function findRoot(cwd: string): string { } function parseKitOptions(workspace: Workspace) { -<<<<<<< HEAD:packages/core/files/workspace.ts const configSource = readFile(workspace.cwd, commonFilePaths.svelteConfig); - const ast = parseScript(configSource); -======= - const configSource = readFile(workspace, commonFilePaths.svelteConfig); const { ast } = parseScript(configSource); ->>>>>>> main:packages/cli/commands/add/workspace.ts const defaultExport = ast.body.find((s) => s.type === 'ExportDefaultDeclaration'); if (!defaultExport) throw Error('Missing default export in `svelte.config.js`'); diff --git a/packages/core/adder/workspace.ts b/packages/core/adder/workspace.ts index 4b7e5287..a03f2877 100644 --- a/packages/core/adder/workspace.ts +++ b/packages/core/adder/workspace.ts @@ -3,8 +3,15 @@ import type { OptionDefinition, OptionValues } from './options.ts'; export type Workspace = { options: OptionValues; cwd: string; - dependencies: Record; - prettier: boolean; + /** + * Returns the dependency version declared in the package.json. + * This may differ from the installed version. + * Includes both dependencies and devDependencies. + * Also checks parent package.json files if called in a monorepo. + * @param pkg the package to check for + * @returns the dependency version with any leading characters such as ^ or ~ removed + */ + dependencyVersion: (pkg: string) => string | undefined; typescript: boolean; kit: { libDirectory: string; routesDirectory: string } | undefined; packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun'; From f64c63c89d56cc4d106f1213bdfe25b8bda4ebc3 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 10 Oct 2024 19:54:52 -0700 Subject: [PATCH 13/15] fix build --- packages/cli/commands/add/processor.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/commands/add/processor.ts b/packages/cli/commands/add/processor.ts index c8b2b1f2..da31a8c1 100644 --- a/packages/cli/commands/add/processor.ts +++ b/packages/cli/commands/add/processor.ts @@ -1,4 +1,4 @@ -import { fileExistsWorkspace, readFile, writeFile } from './utils.ts'; +import { fileExists, readFile, writeFile } from './utils.ts'; import type { Workspace, OptionDefinition, FileType } from '@svelte-cli/core'; /** @@ -17,7 +17,7 @@ export function createOrUpdateFiles( continue; } - const exists = fileExistsWorkspace(workspace, fileDetails.name(workspace)); + const exists = fileExists(workspace, fileDetails.name(workspace)); let content = exists ? readFile(workspace, fileDetails.name(workspace)) : ''; // process file content = fileDetails.content({ content, ...workspace }); From 08c5b23c18c8931df407067ba51048edf5b6456e Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 10 Oct 2024 19:55:27 -0700 Subject: [PATCH 14/15] format --- packages/adders/prettier/config/adder.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/adders/prettier/config/adder.ts b/packages/adders/prettier/config/adder.ts index afd46b88..2708622b 100644 --- a/packages/adders/prettier/config/adder.ts +++ b/packages/adders/prettier/config/adder.ts @@ -90,7 +90,6 @@ export const adder = defineAdder({ { name: () => 'eslint.config.js', condition: ({ dependencyVersion }) => { - // We only want this to execute when it's `false`, not falsy if (dependencyVersion('eslint')?.startsWith(SUPPORTED_ESLINT_VERSION) === false) { From 196af1178c3abe9770f12ba28e0a8165b95d306f Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 10 Oct 2024 19:55:51 -0700 Subject: [PATCH 15/15] fix --- packages/cli/commands/add/processor.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/commands/add/processor.ts b/packages/cli/commands/add/processor.ts index da31a8c1..ca07f4c6 100644 --- a/packages/cli/commands/add/processor.ts +++ b/packages/cli/commands/add/processor.ts @@ -17,8 +17,8 @@ export function createOrUpdateFiles( continue; } - const exists = fileExists(workspace, fileDetails.name(workspace)); - let content = exists ? readFile(workspace, fileDetails.name(workspace)) : ''; + const exists = fileExists(workspace.cwd, fileDetails.name(workspace)); + let content = exists ? readFile(workspace.cwd, fileDetails.name(workspace)) : ''; // process file content = fileDetails.content({ content, ...workspace });