uilint 0.2.132 → 0.2.134

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-TKJ27W62.js";
10
10
  import {
11
11
  detectPackageManager
12
- } from "./chunk-JPE27ROY.js";
12
+ } from "./chunk-R72XAPDG.js";
13
13
 
14
14
  // src/commands/init/plan.ts
15
15
  import { join } from "path";
@@ -276,4 +276,4 @@ export {
276
276
  createPlan,
277
277
  getMissingRules
278
278
  };
279
- //# sourceMappingURL=chunk-DZA4FNII.js.map
279
+ //# sourceMappingURL=chunk-QBGHXYT3.js.map
@@ -190,6 +190,34 @@ function getInstalledUilintPackages(projectPath) {
190
190
  return /* @__PURE__ */ new Map();
191
191
  }
192
192
  }
193
+ async function uninstallDependencies(pm, projectPath, packages) {
194
+ if (!packages.length) return;
195
+ const installed = getInstalledPackages(projectPath);
196
+ const packagesToUninstall = packages.filter((pkg) => {
197
+ const name = getPackageName(pkg);
198
+ return installed.has(name);
199
+ });
200
+ if (!packagesToUninstall.length) return;
201
+ switch (pm) {
202
+ case "pnpm":
203
+ await spawnAsync("pnpm", ["remove", ...packagesToUninstall], projectPath);
204
+ return;
205
+ case "yarn":
206
+ await spawnAsync("yarn", ["remove", ...packagesToUninstall], projectPath);
207
+ return;
208
+ case "bun":
209
+ await spawnAsync("bun", ["remove", ...packagesToUninstall], projectPath);
210
+ return;
211
+ case "npm":
212
+ default:
213
+ await spawnAsync(
214
+ "npm",
215
+ ["uninstall", ...packagesToUninstall],
216
+ projectPath
217
+ );
218
+ return;
219
+ }
220
+ }
193
221
  async function updatePackages(pm, projectPath, packages, options = { dev: true }) {
194
222
  if (!packages.length) return;
195
223
  const isDev = options.dev ?? true;
@@ -232,6 +260,7 @@ export {
232
260
  installDependencies,
233
261
  runTestsWithCoverage,
234
262
  getInstalledUilintPackages,
263
+ uninstallDependencies,
235
264
  updatePackages
236
265
  };
237
- //# sourceMappingURL=chunk-JPE27ROY.js.map
266
+ //# sourceMappingURL=chunk-R72XAPDG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/package-manager.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"fs\";\nimport { spawn } from \"child_process\";\nimport { dirname, join } from \"path\";\n\nexport type PackageManager = \"pnpm\" | \"yarn\" | \"npm\" | \"bun\";\n\n/**\n * Detect which package manager a project uses by looking for lockfiles.\n * Walks up the directory tree to support monorepos.\n */\nexport function detectPackageManager(projectPath: string): PackageManager {\n // Monorepo-friendly detection: walk up to find the lockfile/workspace marker.\n let dir = projectPath;\n for (;;) {\n // pnpm\n if (existsSync(join(dir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(dir, \"pnpm-workspace.yaml\"))) return \"pnpm\";\n\n // yarn\n if (existsSync(join(dir, \"yarn.lock\"))) return \"yarn\";\n\n // bun\n if (existsSync(join(dir, \"bun.lockb\"))) return \"bun\";\n if (existsSync(join(dir, \"bun.lock\"))) return \"bun\";\n\n // npm\n if (existsSync(join(dir, \"package-lock.json\"))) return \"npm\";\n\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n // Default: npm (best-effort)\n return \"npm\";\n}\n\nfunction spawnAsync(\n command: string,\n args: string[],\n cwd: string\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n // Capture output so we can surface it in installer summaries, while still\n // streaming to the user for a good UX.\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: process.platform === \"win32\",\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n const MAX_CAPTURE = 64 * 1024; // keep last 64KB per stream\n\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n process.stdout.write(chunk);\n stdoutChunks.push(chunk);\n // keep bounded\n while (Buffer.concat(stdoutChunks).length > MAX_CAPTURE) stdoutChunks.shift();\n });\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n process.stderr.write(chunk);\n stderrChunks.push(chunk);\n while (Buffer.concat(stderrChunks).length > MAX_CAPTURE) stderrChunks.shift();\n });\n\n child.on(\"error\", (err) => {\n reject(err);\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n const cmd = `${command} ${args.join(\" \")}`.trim();\n const stdout = Buffer.concat(stdoutChunks).toString(\"utf-8\").trim();\n const stderr = Buffer.concat(stderrChunks).toString(\"utf-8\").trim();\n const snippet = (stderr || stdout).trim();\n\n reject(\n new Error(\n `${cmd} exited with ${code}${\n snippet ? `\\n\\n--- output ---\\n${snippet}\\n--- end output ---` : \"\"\n }`\n )\n );\n });\n });\n}\n\n/**\n * Get the set of packages already installed in a project\n * (both dependencies and devDependencies)\n */\nfunction getInstalledPackages(projectPath: string): Set<string> {\n const pkgJsonPath = join(projectPath, \"package.json\");\n if (!existsSync(pkgJsonPath)) {\n return new Set();\n }\n\n try {\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, \"utf-8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n const installed = new Set<string>();\n if (pkgJson.dependencies) {\n for (const name of Object.keys(pkgJson.dependencies)) {\n installed.add(name);\n }\n }\n if (pkgJson.devDependencies) {\n for (const name of Object.keys(pkgJson.devDependencies)) {\n installed.add(name);\n }\n }\n return installed;\n } catch {\n return new Set();\n }\n}\n\n/**\n * Extract package name from a package specifier (e.g., \"foo@^1.0.0\" -> \"foo\")\n */\nfunction getPackageName(specifier: string): string {\n // Handle scoped packages like @scope/pkg@version\n if (specifier.startsWith(\"@\")) {\n const slashIndex = specifier.indexOf(\"/\");\n if (slashIndex === -1) return specifier;\n\n const afterSlash = specifier.slice(slashIndex + 1);\n const atIndex = afterSlash.indexOf(\"@\");\n if (atIndex === -1) return specifier;\n return specifier.slice(0, slashIndex + 1 + atIndex);\n }\n\n // Handle unscoped packages like pkg@version\n const atIndex = specifier.indexOf(\"@\");\n if (atIndex === -1) return specifier;\n return specifier.slice(0, atIndex);\n}\n\n/**\n * Filter out packages that are already installed\n */\nfunction filterAlreadyInstalled(\n packages: string[],\n projectPath: string\n): string[] {\n const installed = getInstalledPackages(projectPath);\n return packages.filter((pkg) => {\n const name = getPackageName(pkg);\n return !installed.has(name);\n });\n}\n\nexport async function installDependencies(\n pm: PackageManager,\n projectPath: string,\n packages: string[],\n options: { dev?: boolean } = { dev: true }\n): Promise<void> {\n if (!packages.length) return;\n\n // Filter out packages that are already installed to avoid yarn/npm errors\n // when trying to add a regular dependency as a dev dependency or vice versa\n const packagesToInstall = filterAlreadyInstalled(packages, projectPath);\n if (!packagesToInstall.length) return;\n\n const isDev = options.dev ?? true;\n\n switch (pm) {\n case \"pnpm\":\n await spawnAsync(\n \"pnpm\",\n [\"add\", ...(isDev ? [\"-D\"] : []), ...packagesToInstall],\n projectPath\n );\n return;\n case \"yarn\":\n await spawnAsync(\n \"yarn\",\n [\"add\", ...(isDev ? [\"-D\"] : []), ...packagesToInstall],\n projectPath\n );\n return;\n case \"bun\":\n await spawnAsync(\n \"bun\",\n [\"add\", ...(isDev ? [\"-d\"] : []), ...packagesToInstall],\n projectPath\n );\n return;\n case \"npm\":\n default:\n await spawnAsync(\n \"npm\",\n [\"install\", isDev ? \"--save-dev\" : \"--save\", ...packagesToInstall],\n projectPath\n );\n return;\n }\n}\n\n/**\n * Get the command and arguments to run tests with coverage\n */\nexport function getTestCoverageCommand(pm: PackageManager): {\n command: string;\n args: string[];\n} {\n switch (pm) {\n case \"pnpm\":\n return { command: \"pnpm\", args: [\"test\", \"--\", \"--coverage\"] };\n case \"yarn\":\n return { command: \"yarn\", args: [\"test\", \"--coverage\"] };\n case \"bun\":\n return { command: \"bun\", args: [\"test\", \"--coverage\"] };\n case \"npm\":\n default:\n return { command: \"npm\", args: [\"test\", \"--\", \"--coverage\"] };\n }\n}\n\n/**\n * Run tests with coverage for a project\n */\nexport async function runTestsWithCoverage(\n pm: PackageManager,\n projectPath: string\n): Promise<void> {\n const { command, args } = getTestCoverageCommand(pm);\n await spawnAsync(command, args, projectPath);\n}\n\n/**\n * UILint packages that can be updated\n */\nexport const UILINT_PACKAGES = [\n \"uilint\",\n \"uilint-eslint\",\n \"uilint-core\",\n \"uilint-react\",\n] as const;\n\nexport type UilintPackage = (typeof UILINT_PACKAGES)[number];\n\n/**\n * Get installed uilint packages and their versions\n */\nexport function getInstalledUilintPackages(\n projectPath: string\n): Map<UilintPackage, string> {\n const pkgJsonPath = join(projectPath, \"package.json\");\n if (!existsSync(pkgJsonPath)) {\n return new Map();\n }\n\n try {\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, \"utf-8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n const result = new Map<UilintPackage, string>();\n const allDeps = {\n ...pkgJson.dependencies,\n ...pkgJson.devDependencies,\n };\n\n for (const pkg of UILINT_PACKAGES) {\n if (allDeps[pkg]) {\n result.set(pkg, allDeps[pkg]);\n }\n }\n\n return result;\n } catch {\n return new Map();\n }\n}\n\n/**\n * Update packages to their latest versions\n */\nexport async function updatePackages(\n pm: PackageManager,\n projectPath: string,\n packages: string[],\n options: { dev?: boolean } = { dev: true }\n): Promise<void> {\n if (!packages.length) return;\n\n const isDev = options.dev ?? true;\n\n // Use @latest to update to latest version\n const packagesWithLatest = packages.map((pkg) => `${pkg}@latest`);\n\n switch (pm) {\n case \"pnpm\":\n await spawnAsync(\n \"pnpm\",\n [\"add\", ...(isDev ? [\"-D\"] : []), ...packagesWithLatest],\n projectPath\n );\n return;\n case \"yarn\":\n await spawnAsync(\n \"yarn\",\n [\"add\", ...(isDev ? [\"-D\"] : []), ...packagesWithLatest],\n projectPath\n );\n return;\n case \"bun\":\n await spawnAsync(\n \"bun\",\n [\"add\", ...(isDev ? [\"-d\"] : []), ...packagesWithLatest],\n projectPath\n );\n return;\n case \"npm\":\n default:\n await spawnAsync(\n \"npm\",\n [\"install\", isDev ? \"--save-dev\" : \"--save\", ...packagesWithLatest],\n projectPath\n );\n return;\n }\n}\n"],"mappings":"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","names":["atIndex"]}
1
+ {"version":3,"sources":["../src/utils/package-manager.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"fs\";\nimport { spawn } from \"child_process\";\nimport { dirname, join } from \"path\";\n\nexport type PackageManager = \"pnpm\" | \"yarn\" | \"npm\" | \"bun\";\n\n/**\n * Detect which package manager a project uses by looking for lockfiles.\n * Walks up the directory tree to support monorepos.\n */\nexport function detectPackageManager(projectPath: string): PackageManager {\n // Monorepo-friendly detection: walk up to find the lockfile/workspace marker.\n let dir = projectPath;\n for (;;) {\n // pnpm\n if (existsSync(join(dir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(dir, \"pnpm-workspace.yaml\"))) return \"pnpm\";\n\n // yarn\n if (existsSync(join(dir, \"yarn.lock\"))) return \"yarn\";\n\n // bun\n if (existsSync(join(dir, \"bun.lockb\"))) return \"bun\";\n if (existsSync(join(dir, \"bun.lock\"))) return \"bun\";\n\n // npm\n if (existsSync(join(dir, \"package-lock.json\"))) return \"npm\";\n\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n // Default: npm (best-effort)\n return \"npm\";\n}\n\nfunction spawnAsync(\n command: string,\n args: string[],\n cwd: string\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n // Capture output so we can surface it in installer summaries, while still\n // streaming to the user for a good UX.\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: process.platform === \"win32\",\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n const MAX_CAPTURE = 64 * 1024; // keep last 64KB per stream\n\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n process.stdout.write(chunk);\n stdoutChunks.push(chunk);\n // keep bounded\n while (Buffer.concat(stdoutChunks).length > MAX_CAPTURE) stdoutChunks.shift();\n });\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n process.stderr.write(chunk);\n stderrChunks.push(chunk);\n while (Buffer.concat(stderrChunks).length > MAX_CAPTURE) stderrChunks.shift();\n });\n\n child.on(\"error\", (err) => {\n reject(err);\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n const cmd = `${command} ${args.join(\" \")}`.trim();\n const stdout = Buffer.concat(stdoutChunks).toString(\"utf-8\").trim();\n const stderr = Buffer.concat(stderrChunks).toString(\"utf-8\").trim();\n const snippet = (stderr || stdout).trim();\n\n reject(\n new Error(\n `${cmd} exited with ${code}${\n snippet ? `\\n\\n--- output ---\\n${snippet}\\n--- end output ---` : \"\"\n }`\n )\n );\n });\n });\n}\n\n/**\n * Get the set of packages already installed in a project\n * (both dependencies and devDependencies)\n */\nfunction getInstalledPackages(projectPath: string): Set<string> {\n const pkgJsonPath = join(projectPath, \"package.json\");\n if (!existsSync(pkgJsonPath)) {\n return new Set();\n }\n\n try {\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, \"utf-8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n const installed = new Set<string>();\n if (pkgJson.dependencies) {\n for (const name of Object.keys(pkgJson.dependencies)) {\n installed.add(name);\n }\n }\n if (pkgJson.devDependencies) {\n for (const name of Object.keys(pkgJson.devDependencies)) {\n installed.add(name);\n }\n }\n return installed;\n } catch {\n return new Set();\n }\n}\n\n/**\n * Extract package name from a package specifier (e.g., \"foo@^1.0.0\" -> \"foo\")\n */\nfunction getPackageName(specifier: string): string {\n // Handle scoped packages like @scope/pkg@version\n if (specifier.startsWith(\"@\")) {\n const slashIndex = specifier.indexOf(\"/\");\n if (slashIndex === -1) return specifier;\n\n const afterSlash = specifier.slice(slashIndex + 1);\n const atIndex = afterSlash.indexOf(\"@\");\n if (atIndex === -1) return specifier;\n return specifier.slice(0, slashIndex + 1 + atIndex);\n }\n\n // Handle unscoped packages like pkg@version\n const atIndex = specifier.indexOf(\"@\");\n if (atIndex === -1) return specifier;\n return specifier.slice(0, atIndex);\n}\n\n/**\n * Filter out packages that are already installed\n */\nfunction filterAlreadyInstalled(\n packages: string[],\n projectPath: string\n): string[] {\n const installed = getInstalledPackages(projectPath);\n return packages.filter((pkg) => {\n const name = getPackageName(pkg);\n return !installed.has(name);\n });\n}\n\nexport async function installDependencies(\n pm: PackageManager,\n projectPath: string,\n packages: string[],\n options: { dev?: boolean } = { dev: true }\n): Promise<void> {\n if (!packages.length) return;\n\n // Filter out packages that are already installed to avoid yarn/npm errors\n // when trying to add a regular dependency as a dev dependency or vice versa\n const packagesToInstall = filterAlreadyInstalled(packages, projectPath);\n if (!packagesToInstall.length) return;\n\n const isDev = options.dev ?? true;\n\n switch (pm) {\n case \"pnpm\":\n await spawnAsync(\n \"pnpm\",\n [\"add\", ...(isDev ? [\"-D\"] : []), ...packagesToInstall],\n projectPath\n );\n return;\n case \"yarn\":\n await spawnAsync(\n \"yarn\",\n [\"add\", ...(isDev ? [\"-D\"] : []), ...packagesToInstall],\n projectPath\n );\n return;\n case \"bun\":\n await spawnAsync(\n \"bun\",\n [\"add\", ...(isDev ? [\"-d\"] : []), ...packagesToInstall],\n projectPath\n );\n return;\n case \"npm\":\n default:\n await spawnAsync(\n \"npm\",\n [\"install\", isDev ? \"--save-dev\" : \"--save\", ...packagesToInstall],\n projectPath\n );\n return;\n }\n}\n\n/**\n * Get the command and arguments to run tests with coverage\n */\nexport function getTestCoverageCommand(pm: PackageManager): {\n command: string;\n args: string[];\n} {\n switch (pm) {\n case \"pnpm\":\n return { command: \"pnpm\", args: [\"test\", \"--\", \"--coverage\"] };\n case \"yarn\":\n return { command: \"yarn\", args: [\"test\", \"--coverage\"] };\n case \"bun\":\n return { command: \"bun\", args: [\"test\", \"--coverage\"] };\n case \"npm\":\n default:\n return { command: \"npm\", args: [\"test\", \"--\", \"--coverage\"] };\n }\n}\n\n/**\n * Run tests with coverage for a project\n */\nexport async function runTestsWithCoverage(\n pm: PackageManager,\n projectPath: string\n): Promise<void> {\n const { command, args } = getTestCoverageCommand(pm);\n await spawnAsync(command, args, projectPath);\n}\n\n/**\n * UILint packages that can be updated\n */\nexport const UILINT_PACKAGES = [\n \"uilint\",\n \"uilint-eslint\",\n \"uilint-core\",\n \"uilint-react\",\n] as const;\n\nexport type UilintPackage = (typeof UILINT_PACKAGES)[number];\n\n/**\n * Get installed uilint packages and their versions\n */\nexport function getInstalledUilintPackages(\n projectPath: string\n): Map<UilintPackage, string> {\n const pkgJsonPath = join(projectPath, \"package.json\");\n if (!existsSync(pkgJsonPath)) {\n return new Map();\n }\n\n try {\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, \"utf-8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n const result = new Map<UilintPackage, string>();\n const allDeps = {\n ...pkgJson.dependencies,\n ...pkgJson.devDependencies,\n };\n\n for (const pkg of UILINT_PACKAGES) {\n if (allDeps[pkg]) {\n result.set(pkg, allDeps[pkg]);\n }\n }\n\n return result;\n } catch {\n return new Map();\n }\n}\n\n/**\n * Uninstall dependencies from a project\n */\nexport async function uninstallDependencies(\n pm: PackageManager,\n projectPath: string,\n packages: string[]\n): Promise<void> {\n if (!packages.length) return;\n\n // Only uninstall packages that are actually installed\n const installed = getInstalledPackages(projectPath);\n const packagesToUninstall = packages.filter((pkg) => {\n const name = getPackageName(pkg);\n return installed.has(name);\n });\n\n if (!packagesToUninstall.length) return;\n\n switch (pm) {\n case \"pnpm\":\n await spawnAsync(\"pnpm\", [\"remove\", ...packagesToUninstall], projectPath);\n return;\n case \"yarn\":\n await spawnAsync(\"yarn\", [\"remove\", ...packagesToUninstall], projectPath);\n return;\n case \"bun\":\n await spawnAsync(\"bun\", [\"remove\", ...packagesToUninstall], projectPath);\n return;\n case \"npm\":\n default:\n await spawnAsync(\n \"npm\",\n [\"uninstall\", ...packagesToUninstall],\n projectPath\n );\n return;\n }\n}\n\n/**\n * Update packages to their latest versions\n */\nexport async function updatePackages(\n pm: PackageManager,\n projectPath: string,\n packages: string[],\n options: { dev?: boolean } = { dev: true }\n): Promise<void> {\n if (!packages.length) return;\n\n const isDev = options.dev ?? true;\n\n // Use @latest to update to latest version\n const packagesWithLatest = packages.map((pkg) => `${pkg}@latest`);\n\n switch (pm) {\n case \"pnpm\":\n await spawnAsync(\n \"pnpm\",\n [\"add\", ...(isDev ? [\"-D\"] : []), ...packagesWithLatest],\n projectPath\n );\n return;\n case \"yarn\":\n await spawnAsync(\n \"yarn\",\n [\"add\", ...(isDev ? [\"-D\"] : []), ...packagesWithLatest],\n projectPath\n );\n return;\n case \"bun\":\n await spawnAsync(\n \"bun\",\n [\"add\", ...(isDev ? [\"-d\"] : []), ...packagesWithLatest],\n projectPath\n );\n return;\n case \"npm\":\n default:\n await spawnAsync(\n \"npm\",\n [\"install\", isDev ? \"--save-dev\" : \"--save\", ...packagesWithLatest],\n projectPath\n );\n return;\n }\n}\n"],"mappings":"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","names":["atIndex"]}
@@ -3,7 +3,7 @@ import {
3
3
  detectPackageManager,
4
4
  installDependencies,
5
5
  runTestsWithCoverage
6
- } from "./chunk-JPE27ROY.js";
6
+ } from "./chunk-R72XAPDG.js";
7
7
 
8
8
  // src/utils/coverage-detect.ts
9
9
  import { existsSync, readFileSync, statSync } from "fs";
@@ -1183,4 +1183,4 @@ export {
1183
1183
  prepareCoverage,
1184
1184
  needsCoveragePreparation
1185
1185
  };
1186
- //# sourceMappingURL=chunk-WRXJULXA.js.map
1186
+ //# sourceMappingURL=chunk-VON73PHI.js.map
@@ -9,7 +9,7 @@ import {
9
9
  injectCoverageConfig,
10
10
  installEslintPlugin,
11
11
  removeEslintPlugin
12
- } from "./chunk-WRXJULXA.js";
12
+ } from "./chunk-VON73PHI.js";
13
13
  import {
14
14
  GENSTYLEGUIDE_COMMAND_MD,
15
15
  loadSkill,
@@ -29,8 +29,9 @@ import {
29
29
  } from "./chunk-CZNPG4UI.js";
30
30
  import {
31
31
  detectPackageManager,
32
- installDependencies
33
- } from "./chunk-JPE27ROY.js";
32
+ installDependencies,
33
+ uninstallDependencies
34
+ } from "./chunk-R72XAPDG.js";
34
35
 
35
36
  // src/commands/init/analyze.ts
36
37
  import { existsSync as existsSync3, readFileSync as readFileSync3 } from "fs";
@@ -2209,6 +2210,9 @@ async function executeAction(action, options) {
2209
2210
  case "remove_directory": {
2210
2211
  return await executeRemoveDirectory(action, options);
2211
2212
  }
2213
+ case "remove_dependencies": {
2214
+ return await executeRemoveDependencies(action, options);
2215
+ }
2212
2216
  case "update_manifest": {
2213
2217
  return await executeUpdateManifest(action, options);
2214
2218
  }
@@ -2497,6 +2501,27 @@ async function executeRemoveDirectory(action, options) {
2497
2501
  }
2498
2502
  return { action, success: true };
2499
2503
  }
2504
+ async function executeRemoveDependencies(action, options) {
2505
+ const { dryRun = false, uninstallDependencies: uninstallDependencies2 = uninstallDependencies } = options;
2506
+ if (dryRun) {
2507
+ return {
2508
+ action,
2509
+ success: true,
2510
+ wouldDo: `Remove dependencies from ${action.packagePath}: ${action.packages.join(", ")}`
2511
+ };
2512
+ }
2513
+ try {
2514
+ const pm = detectPackageManager(action.packagePath);
2515
+ await uninstallDependencies2(pm, action.packagePath, action.packages);
2516
+ return { action, success: true };
2517
+ } catch (error) {
2518
+ return {
2519
+ action,
2520
+ success: false,
2521
+ error: error instanceof Error ? error.message : String(error)
2522
+ };
2523
+ }
2524
+ }
2500
2525
  async function executeUpdateManifest(action, options) {
2501
2526
  const { dryRun = false } = options;
2502
2527
  if (dryRun) {
@@ -3618,6 +3643,11 @@ ${semanticCat?.icon ?? "\u{1F9E0}"} ${semanticCat?.name ?? "Semantic rules"} (${
3618
3643
  type: "remove_directory",
3619
3644
  path: rulesDir
3620
3645
  });
3646
+ actions.push({
3647
+ type: "remove_dependencies",
3648
+ packagePath: target.path,
3649
+ packages: ["uilint-eslint"]
3650
+ });
3621
3651
  }
3622
3652
  return { actions };
3623
3653
  }
@@ -3964,6 +3994,11 @@ var nextOverlayInstaller = {
3964
3994
  projectPath,
3965
3995
  appRoot: detection.appRoot
3966
3996
  });
3997
+ actions.push({
3998
+ type: "remove_dependencies",
3999
+ packagePath: projectPath,
4000
+ packages: ["uilint-react", "uilint-core", "jsx-loc-plugin"]
4001
+ });
3967
4002
  return { actions };
3968
4003
  }
3969
4004
  };
@@ -4076,6 +4111,11 @@ var viteOverlayInstaller = {
4076
4111
  type: "remove_vite_config",
4077
4112
  projectPath
4078
4113
  });
4114
+ actions.push({
4115
+ type: "remove_dependencies",
4116
+ packagePath: projectPath,
4117
+ packages: ["uilint-react", "uilint-core", "jsx-loc-plugin"]
4118
+ });
4079
4119
  return { actions };
4080
4120
  }
4081
4121
  };
@@ -4112,4 +4152,4 @@ export {
4112
4152
  analyze,
4113
4153
  execute
4114
4154
  };
4115
- //# sourceMappingURL=chunk-EBTY4AR3.js.map
4155
+ //# sourceMappingURL=chunk-YROUPMHQ.js.map