summaryrefslogtreecommitdiff
path: root/std/fs/walk.ts
diff options
context:
space:
mode:
authorCasper Beyer <caspervonb@pm.me>2021-02-02 19:05:46 +0800
committerGitHub <noreply@github.com>2021-02-02 12:05:46 +0100
commit6abf126c2a7a451cded8c6b5e6ddf1b69c84055d (patch)
treefd94c013a19fcb38954844085821ec1601c20e18 /std/fs/walk.ts
parenta2b5d44f1aa9d64f448a2a3cc2001272e2f60b98 (diff)
chore: remove std directory (#9361)
This removes the std folder from the tree. Various parts of the tests are pretty tightly dependent on std (47 direct imports and 75 indirect imports, not counting the cli tests that use them as fixtures) so I've added std as a submodule for now.
Diffstat (limited to 'std/fs/walk.ts')
-rw-r--r--std/fs/walk.ts188
1 files changed, 0 insertions, 188 deletions
diff --git a/std/fs/walk.ts b/std/fs/walk.ts
deleted file mode 100644
index 4ce564435..000000000
--- a/std/fs/walk.ts
+++ /dev/null
@@ -1,188 +0,0 @@
-// Documentation and interface for walk were adapted from Go
-// https://golang.org/pkg/path/filepath/#Walk
-// Copyright 2009 The Go Authors. All rights reserved. BSD license.
-import { assert } from "../_util/assert.ts";
-import { basename, join, normalize } from "../path/mod.ts";
-
-/** Create WalkEntry for the `path` synchronously */
-export function _createWalkEntrySync(path: string): WalkEntry {
- path = normalize(path);
- const name = basename(path);
- const info = Deno.statSync(path);
- return {
- path,
- name,
- isFile: info.isFile,
- isDirectory: info.isDirectory,
- isSymlink: info.isSymlink,
- };
-}
-
-/** Create WalkEntry for the `path` asynchronously */
-export async function _createWalkEntry(path: string): Promise<WalkEntry> {
- path = normalize(path);
- const name = basename(path);
- const info = await Deno.stat(path);
- return {
- path,
- name,
- isFile: info.isFile,
- isDirectory: info.isDirectory,
- isSymlink: info.isSymlink,
- };
-}
-
-export interface WalkOptions {
- maxDepth?: number;
- includeFiles?: boolean;
- includeDirs?: boolean;
- followSymlinks?: boolean;
- exts?: string[];
- match?: RegExp[];
- skip?: RegExp[];
-}
-
-function include(
- path: string,
- exts?: string[],
- match?: RegExp[],
- skip?: RegExp[],
-): boolean {
- if (exts && !exts.some((ext): boolean => path.endsWith(ext))) {
- return false;
- }
- if (match && !match.some((pattern): boolean => !!path.match(pattern))) {
- return false;
- }
- if (skip && skip.some((pattern): boolean => !!path.match(pattern))) {
- return false;
- }
- return true;
-}
-
-export interface WalkEntry extends Deno.DirEntry {
- path: string;
-}
-
-/** Walks the file tree rooted at root, yielding each file or directory in the
- * tree filtered according to the given options. The files are walked in lexical
- * order, which makes the output deterministic but means that for very large
- * directories walk() can be inefficient.
- *
- * Options:
- * - maxDepth?: number = Infinity;
- * - includeFiles?: boolean = true;
- * - includeDirs?: boolean = true;
- * - followSymlinks?: boolean = false;
- * - exts?: string[];
- * - match?: RegExp[];
- * - skip?: RegExp[];
- *
- *
- * for await (const entry of walk(".")) {
- * console.log(entry.path);
- * assert(entry.isFile);
- * }
- */
-export async function* walk(
- root: string,
- {
- maxDepth = Infinity,
- includeFiles = true,
- includeDirs = true,
- followSymlinks = false,
- exts = undefined,
- match = undefined,
- skip = undefined,
- }: WalkOptions = {},
-): AsyncIterableIterator<WalkEntry> {
- if (maxDepth < 0) {
- return;
- }
- if (includeDirs && include(root, exts, match, skip)) {
- yield await _createWalkEntry(root);
- }
- if (maxDepth < 1 || !include(root, undefined, undefined, skip)) {
- return;
- }
- for await (const entry of Deno.readDir(root)) {
- assert(entry.name != null);
- let path = join(root, entry.name);
-
- if (entry.isSymlink) {
- if (followSymlinks) {
- path = await Deno.realPath(path);
- } else {
- continue;
- }
- }
-
- if (entry.isFile) {
- if (includeFiles && include(path, exts, match, skip)) {
- yield { path, ...entry };
- }
- } else {
- yield* walk(path, {
- maxDepth: maxDepth - 1,
- includeFiles,
- includeDirs,
- followSymlinks,
- exts,
- match,
- skip,
- });
- }
- }
-}
-
-/** Same as walk() but uses synchronous ops */
-export function* walkSync(
- root: string,
- {
- maxDepth = Infinity,
- includeFiles = true,
- includeDirs = true,
- followSymlinks = false,
- exts = undefined,
- match = undefined,
- skip = undefined,
- }: WalkOptions = {},
-): IterableIterator<WalkEntry> {
- if (maxDepth < 0) {
- return;
- }
- if (includeDirs && include(root, exts, match, skip)) {
- yield _createWalkEntrySync(root);
- }
- if (maxDepth < 1 || !include(root, undefined, undefined, skip)) {
- return;
- }
- for (const entry of Deno.readDirSync(root)) {
- assert(entry.name != null);
- let path = join(root, entry.name);
-
- if (entry.isSymlink) {
- if (followSymlinks) {
- path = Deno.realPathSync(path);
- } else {
- continue;
- }
- }
-
- if (entry.isFile) {
- if (includeFiles && include(path, exts, match, skip)) {
- yield { path, ...entry };
- }
- } else {
- yield* walkSync(path, {
- maxDepth: maxDepth - 1,
- includeFiles,
- includeDirs,
- followSymlinks,
- exts,
- match,
- skip,
- });
- }
- }
-}