| name | effect-path |
| description | Use effect Path for platform-abstract file path operations including joining, resolving, and URL conversion. |
path
Use effect Path abstraction for platform-abstract file path operations. Apply this skill when working with file paths, joining segments, resolving absolute paths, or converting between file URLs and paths. Path.layer supplies POSIX semantics from effect; Node.js and Bun platform layers provide host-specific path semantics. @effect/platform-browser does not provide a BrowserPath layer in beta.74, so browser code should provide Path.layer or a custom layer explicitly.
Import Pattern
import { Path } from 'effect';
Service Injection
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
});
Path Separator
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
const separator = path.sep;
});
Path Operations
join - Combine path segments
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
const fullPath = path.join('src', 'components', 'Button.tsx');
});
resolve - Convert to absolute path
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
const absolutePath = path.resolve('src', 'index.ts');
});
normalize - Clean up path
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
const clean = path.normalize('/foo/bar//baz/asdf/quux/..');
});
dirname - Get directory portion
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
const dir = path.dirname('/foo/bar/baz.txt');
});
basename - Get file name
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
const name = path.basename('/foo/bar/baz.txt');
const nameWithoutExt = path.basename('/foo/bar/baz.txt', '.txt');
});
extname - Get file extension
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
const ext = path.extname('/foo/bar/baz.txt');
});
parse - Decompose path into components
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
const parsed = path.parse('/home/user/dir/file.txt');
});
format - Construct path from components
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
const fullPath = path.format({
root: '/',
dir: '/home/user/dir',
base: 'file.txt'
});
});
isAbsolute - Check if path is absolute
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
const isAbs = path.isAbsolute('/foo/bar');
const isRel = path.isAbsolute('foo/bar');
});
relative - Get relative path
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
const relPath = path.relative(
'/data/orandea/test/aaa',
'/data/orandea/impl/bbb'
);
});
URL Conversions (Effectful)
Both operations can fail with BadArgument error.
fromFileUrl - Convert file URL to path
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
const filePath = yield* path.fromFileUrl(
new URL('file:///home/user/file.txt')
);
});
toFileUrl - Convert path to file URL
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
const fileUrl = yield* path.toFileUrl('/home/user/file.txt');
});
Complete Example
import { Path } from 'effect';
import { Effect } from 'effect';
const buildOutputPath = Effect.gen(function* () {
const path = yield* Path.Path;
const srcPath = path.join('src', 'index.ts');
const absoluteSrc = path.resolve(srcPath);
const dir = path.dirname(absoluteSrc);
const base = path.basename(absoluteSrc, '.ts');
const outputPath = path.join(dir, '..', 'dist', `${base}.js`);
return path.normalize(outputPath);
});
toNamespacedPath - Convert to namespaced path
import { Path } from 'effect';
import { Effect } from 'effect';
const program = Effect.gen(function* () {
const path = yield* Path.Path;
const namespaced = path.toNamespacedPath('/foo/bar/baz.txt');
});
DO
- Import Path from effect
- Use
path.sep for platform-specific separators
- Use
path.join() to combine path segments
- Use
path.resolve() to get absolute paths
- Handle errors from
fromFileUrl and toFileUrl with Effect error handling
- Pass a
URL object (not a string) to fromFileUrl
DON'T
- Import
node:path directly (breaks portability)
- Hardcode "/" or "\" separators
- Manually concatenate paths with string operations
- Assume file URL format without using conversion utilities
- Pass a string to
fromFileUrl — it requires a URL object