or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

directory-operations.mddirectory-walking.mdfilesystem-metadata.mdindex.mdpath-objects.mdpath-resolution.md

index.mddocs/

0

# path-scurry

1

2

path-scurry is a high-performance utility for building tools that read the file system, designed to minimize filesystem operations and path string manipulations. It provides intelligent caching mechanisms, cross-platform path handling, and multiple interfaces including streaming, async/await, and traditional callback patterns for maximum flexibility and performance.

3

4

## Package Information

5

6

- **Package Name**: path-scurry

7

- **Package Type**: npm

8

- **Language**: TypeScript

9

- **Installation**: `npm install path-scurry`

10

11

## Core Imports

12

13

```typescript

14

import { PathScurry, Path } from "path-scurry";

15

```

16

17

For CommonJS:

18

19

```javascript

20

const { PathScurry, Path } = require("path-scurry");

21

```

22

23

Platform-specific imports:

24

25

```typescript

26

import { PathScurryWin32, PathScurryPosix, PathScurryDarwin } from "path-scurry";

27

import { PathWin32, PathPosix } from "path-scurry";

28

```

29

30

## Basic Usage

31

32

```typescript

33

import { PathScurry } from "path-scurry";

34

35

// Create a path walker for the current directory

36

const pw = new PathScurry(process.cwd());

37

38

// Simple directory traversal

39

for await (const entry of pw) {

40

if (entry.isFile() && entry.name.endsWith(".js")) {

41

console.log(entry.fullpath());

42

}

43

}

44

45

// Path resolution with caching

46

const resolved = pw.resolve("./src/index.ts");

47

console.log(resolved); // Fully resolved absolute path

48

49

// Directory reading

50

const children = await pw.readdir("./src");

51

console.log(children.map(child => child.name));

52

```

53

54

## Architecture

55

56

Path-scurry is built around several key components:

57

58

- **PathScurry Classes**: Main interface providing filesystem operations and path resolution with intelligent caching

59

- **Path Objects**: Represent individual filesystem entries with lazy-loaded metadata and cached operations

60

- **Caching System**: LRU caches for path resolution, directory contents, and filesystem metadata to minimize syscalls

61

- **Cross-Platform Support**: Platform-specific implementations handling Windows UNC paths, drive letters, and POSIX paths

62

- **Multiple APIs**: Traditional fs-like methods, streaming interfaces, async iterators, and callback patterns

63

64

## Capabilities

65

66

### Path Resolution and Navigation

67

68

Core path resolution functionality with intelligent caching, supporting both relative and absolute paths across platforms.

69

70

```typescript { .api }

71

class PathScurry {

72

constructor(cwd?: URL | string, opts?: PathScurryOpts);

73

resolve(...paths: string[]): string;

74

resolvePosix(...paths: string[]): string;

75

relative(entry?: PathBase | string): string;

76

relativePosix(entry?: PathBase | string): string;

77

basename(entry?: PathBase | string): string;

78

dirname(entry?: PathBase | string): string;

79

depth(path?: Path | string): number;

80

chdir(path: string | Path): void;

81

}

82

83

interface PathScurryOpts {

84

nocase?: boolean;

85

childrenCacheSize?: number;

86

fs?: FSOption;

87

}

88

```

89

90

[Path Resolution](./path-resolution.md)

91

92

### Directory Operations

93

94

High-performance directory reading and traversal with caching and multiple output formats.

95

96

```typescript { .api }

97

// Directory reading

98

readdir(): Promise<PathBase[]>;

99

readdir(opts: { withFileTypes: false }): Promise<string[]>;

100

readdir(entry: PathBase | string): Promise<PathBase[]>;

101

readdir(entry: PathBase | string, opts: { withFileTypes: false }): Promise<string[]>;

102

103

readdirSync(): PathBase[];

104

readdirSync(opts: { withFileTypes: false }): string[];

105

readdirSync(entry: PathBase | string): PathBase[];

106

readdirSync(entry: PathBase | string, opts: { withFileTypes: false }): string[];

107

```

108

109

[Directory Operations](./directory-operations.md)

110

111

### File System Metadata

112

113

Cached filesystem metadata operations including lstat, readlink, and realpath with error handling.

114

115

```typescript { .api }

116

lstat(entry?: string | PathBase): Promise<PathBase | undefined>;

117

lstatSync(entry?: string | PathBase): PathBase | undefined;

118

119

readlink(entry?: string | PathBase): Promise<string | undefined>;

120

readlink(entry: string | PathBase, opt: { withFileTypes: true }): Promise<PathBase | undefined>;

121

readlinkSync(entry?: string | PathBase): string | undefined;

122

readlinkSync(entry: string | PathBase, opt: { withFileTypes: true }): PathBase | undefined;

123

124

realpath(entry?: string | PathBase): Promise<string | undefined>;

125

realpath(entry: string | PathBase, opt: { withFileTypes: true }): Promise<PathBase | undefined>;

126

realpathSync(entry?: string | PathBase): string | undefined;

127

realpathSync(entry: string | PathBase, opt: { withFileTypes: true }): PathBase | undefined;

128

```

129

130

[File System Metadata](./filesystem-metadata.md)

131

132

### Directory Walking and Traversal

133

134

Multiple interfaces for directory tree traversal including async/await, streaming, and synchronous options with filtering and symlink following.

135

136

```typescript { .api }

137

// Async array-based walking

138

walk(): Promise<PathBase[]>;

139

walk(opts: WalkOptions): Promise<PathBase[] | string[]>;

140

walk(entry: string | PathBase, opts?: WalkOptions): Promise<PathBase[] | string[]>;

141

142

walkSync(): PathBase[];

143

walkSync(opts: WalkOptions): PathBase[] | string[];

144

walkSync(entry: string | PathBase, opts?: WalkOptions): PathBase[] | string[];

145

146

// Streaming interfaces

147

stream(): Minipass<PathBase>;

148

stream(opts: WalkOptions): Minipass<PathBase | string>;

149

streamSync(): Minipass<PathBase>;

150

151

// Async iteration

152

iterate(): AsyncGenerator<PathBase, void, void>;

153

iterate(opts: WalkOptions): AsyncGenerator<PathBase | string, void, void>;

154

iterateSync(): Generator<PathBase, void, void>;

155

156

interface WalkOptions {

157

withFileTypes?: boolean;

158

follow?: boolean;

159

filter?: (entry: PathBase) => boolean;

160

walkFilter?: (entry: PathBase) => boolean;

161

}

162

```

163

164

[Directory Walking](./directory-walking.md)

165

166

### Path Objects

167

168

Individual filesystem entry objects with lazy-loaded metadata, type checking, and path manipulation methods.

169

170

```typescript { .api }

171

abstract class PathBase implements Dirent {

172

name: string;

173

isCWD: boolean;

174

readonly parentPath: string;

175

readonly path: string; // deprecated

176

177

// Path navigation

178

resolve(path?: string): PathBase;

179

relative(): string;

180

relativePosix(): string;

181

fullpath(): string;

182

fullpathPosix(): string;

183

depth(): number;

184

185

// Type checking

186

isFile(): boolean;

187

isDirectory(): boolean;

188

isSymbolicLink(): boolean;

189

isUnknown(): boolean;

190

isType(type: Type): boolean;

191

getType(): Type;

192

isNamed(name: string): boolean;

193

194

// Filesystem operations

195

readdir(): Promise<PathBase[]>;

196

readdirSync(): PathBase[];

197

lstat(): Promise<PathBase | undefined>;

198

lstatSync(): PathBase | undefined;

199

readlink(): Promise<PathBase | undefined>;

200

readlinkSync(): PathBase | undefined;

201

realpath(): Promise<PathBase | undefined>;

202

realpathSync(): PathBase | undefined;

203

}

204

205

type Type = 'Unknown' | 'FIFO' | 'CharacterDevice' | 'Directory' |

206

'BlockDevice' | 'File' | 'SymbolicLink' | 'Socket';

207

```

208

209

[Path Objects](./path-objects.md)

210

211

## Types

212

213

```typescript { .api }

214

type Path = PathBase | InstanceType<typeof Path>;

215

type PathScurry = PathScurryBase | InstanceType<typeof PathScurry>;

216

217

// Internal types also exported

218

type Children = PathBase[] & { provisional: number };

219

220

interface PathOpts {

221

fullpath?: string;

222

relative?: string;

223

relativePosix?: string;

224

parent?: PathBase;

225

fs?: FSOption;

226

}

227

228

interface FSOption {

229

lstatSync?: (path: string) => Stats;

230

readdir?: (path: string, options: { withFileTypes: true },

231

cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any) => void;

232

readdirSync?: (path: string, options: { withFileTypes: true }) => Dirent[];

233

readlinkSync?: (path: string) => string;

234

realpathSync?: (path: string) => string;

235

promises?: {

236

lstat?: (path: string) => Promise<Stats>;

237

readdir?: (path: string, options: { withFileTypes: true }) => Promise<Dirent[]>;

238

readlink?: (path: string) => Promise<string>;

239

realpath?: (path: string) => Promise<string>;

240

};

241

}

242

243

// Internal cache classes (exported but advanced usage)

244

class ResolveCache extends LRUCache<string, string> {

245

constructor();

246

}

247

248

class ChildrenCache extends LRUCache<PathBase, Children> {

249

constructor(maxSize?: number);

250

}

251

```