diff --git a/README.md b/README.md index 87aa1b6..a3418dd 100644 --- a/README.md +++ b/README.md @@ -257,7 +257,7 @@ decodo scrape https://example.com --full --format ndjson | Variable | Description | | --- | --- | | `DECODO_AUTH_TOKEN` | Basic auth token (overrides saved config, below `--token`) | -| `DECODO_CONFIG_HOME` | Override config directory (default: OS-specific `env-paths` location) | +| `DECODO_CONFIG_HOME` | Override config directory (default: `$XDG_CONFIG_HOME/decodo`, else `~/.config/decodo`) | ## Exit codes diff --git a/package.json b/package.json index 7d0f188..fe61e48 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@decodo/cli", - "version": "0.1.7", + "version": "0.1.8", "description": "Official CLI for the Decodo APIs", "license": "MIT", "type": "module", @@ -38,8 +38,7 @@ "packageManager": "pnpm@10.33.3", "dependencies": { "@decodo/sdk-ts": "^2.1.2", - "commander": "^14.0.0", - "env-paths": "^3.0.0" + "commander": "^14.0.0" }, "devDependencies": { "@biomejs/biome": "2.4.15", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c43f13..8e0cb2a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,9 +14,6 @@ importers: commander: specifier: ^14.0.0 version: 14.0.3 - env-paths: - specifier: ^3.0.0 - version: 3.0.0 devDependencies: '@biomejs/biome': specifier: 2.4.15 @@ -626,10 +623,6 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - env-paths@3.0.0: - resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} @@ -1279,8 +1272,6 @@ snapshots: deepmerge@4.3.1: {} - env-paths@3.0.0: {} - es-module-lexer@1.7.0: {} esbuild@0.27.7: diff --git a/src/platform/services/paths.ts b/src/platform/services/paths.ts index fea5df6..e99f99c 100644 --- a/src/platform/services/paths.ts +++ b/src/platform/services/paths.ts @@ -1,4 +1,5 @@ -import envPaths from "env-paths"; +import { homedir } from "node:os"; +import { join } from "node:path"; export function getConfigDir(): string { const override = process.env.DECODO_CONFIG_HOME; @@ -7,5 +8,11 @@ export function getConfigDir(): string { return override; } - return envPaths("decodo", { suffix: "" }).config; + const xdgConfigHome = process.env.XDG_CONFIG_HOME; + + if (xdgConfigHome) { + return join(xdgConfigHome, "decodo"); + } + + return join(homedir(), ".config", "decodo"); } diff --git a/tests/platform/services/paths.test.ts b/tests/platform/services/paths.test.ts new file mode 100644 index 0000000..78acdcb --- /dev/null +++ b/tests/platform/services/paths.test.ts @@ -0,0 +1,43 @@ +import { homedir } from "node:os"; +import { join } from "node:path"; +import { afterEach, describe, expect, it, vi } from "vitest"; + +describe("getConfigDir", () => { + afterEach(() => { + vi.unstubAllEnvs(); + vi.resetModules(); + }); + + it("returns ~/.config/decodo when no override is set", async () => { + vi.stubEnv("DECODO_CONFIG_HOME", undefined); + vi.stubEnv("XDG_CONFIG_HOME", undefined); + + const { getConfigDir } = await import( + "../../../src/platform/services/paths.js" + ); + + expect(getConfigDir()).toBe(join(homedir(), ".config", "decodo")); + }); + + it("honors XDG_CONFIG_HOME when set and no override", async () => { + vi.stubEnv("DECODO_CONFIG_HOME", undefined); + vi.stubEnv("XDG_CONFIG_HOME", "/xdg-config"); + + const { getConfigDir } = await import( + "../../../src/platform/services/paths.js" + ); + + expect(getConfigDir()).toBe(join("/xdg-config", "decodo")); + }); + + it("returns DECODO_CONFIG_HOME when set (precedence over XDG)", async () => { + vi.stubEnv("DECODO_CONFIG_HOME", "/custom/config"); + vi.stubEnv("XDG_CONFIG_HOME", "/xdg-config"); + + const { getConfigDir } = await import( + "../../../src/platform/services/paths.js" + ); + + expect(getConfigDir()).toBe("/custom/config"); + }); +});