@dbx-tools/shared-fs 0.6.10
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.
- package/README.md +56 -0
- package/index.ts +14 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.js +10 -0
- package/lib/src/base-fs.d.ts +268 -0
- package/lib/src/base-fs.js +622 -0
- package/lib/src/fs.d.ts +110 -0
- package/lib/src/fs.js +2 -0
- package/lib/src/memory-fs.d.ts +46 -0
- package/lib/src/memory-fs.js +131 -0
- package/lib/src/posix-path.d.ts +80 -0
- package/lib/src/posix-path.js +208 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +53 -0
- package/src/base-fs.ts +882 -0
- package/src/fs.ts +142 -0
- package/src/memory-fs.ts +174 -0
- package/src/posix-path.ts +219 -0
package/lib/src/fs.d.ts
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
export type FileContent = string | Uint8Array;
|
|
2
|
+
export type FileEntryType = "file" | "directory" | "symbolic-link" | "other";
|
|
3
|
+
export interface FileEntry {
|
|
4
|
+
name: string;
|
|
5
|
+
type: FileEntryType;
|
|
6
|
+
size?: number;
|
|
7
|
+
/**
|
|
8
|
+
* Provider-specific information that is not part of the
|
|
9
|
+
* portable filesystem contract.
|
|
10
|
+
*/
|
|
11
|
+
metadata?: Readonly<Record<string, unknown>>;
|
|
12
|
+
}
|
|
13
|
+
export interface FileStat extends FileEntry {
|
|
14
|
+
/** Path relative to the filesystem root. */
|
|
15
|
+
path: string;
|
|
16
|
+
createdAt?: Date;
|
|
17
|
+
modifiedAt?: Date;
|
|
18
|
+
accessedAt?: Date;
|
|
19
|
+
mimeType?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ReadFileOptions {
|
|
22
|
+
/**
|
|
23
|
+
* Return decoded text using this encoding.
|
|
24
|
+
* Without an encoding, readFile returns Uint8Array.
|
|
25
|
+
*/
|
|
26
|
+
encoding?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface WriteFileOptions {
|
|
29
|
+
/** Replace an existing file. Defaults to true. */
|
|
30
|
+
overwrite?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface RemoveOptions {
|
|
33
|
+
/** Do not fail if the target does not exist. */
|
|
34
|
+
force?: boolean;
|
|
35
|
+
/** Recursively remove directory contents. */
|
|
36
|
+
recursive?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface CopyOptions {
|
|
39
|
+
/** Replace an existing destination. Defaults to true. */
|
|
40
|
+
overwrite?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface MakeDirectoryOptions {
|
|
43
|
+
/** Create missing parent directories. */
|
|
44
|
+
recursive?: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface ListOptions {
|
|
47
|
+
/** Recursively list descendant entries. */
|
|
48
|
+
recursive?: boolean;
|
|
49
|
+
/** Maximum recursion depth. */
|
|
50
|
+
maxDepth?: number;
|
|
51
|
+
/** Only include files with the given extension or extensions. */
|
|
52
|
+
extension?: string | string[];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* A filesystem rooted at a local, remote, or virtual location.
|
|
56
|
+
*
|
|
57
|
+
* Possible implementations include:
|
|
58
|
+
* - Local disk
|
|
59
|
+
* - FTP or SFTP
|
|
60
|
+
* - Object storage
|
|
61
|
+
* - In-memory storage
|
|
62
|
+
* - Databricks
|
|
63
|
+
* - Database-backed storage
|
|
64
|
+
*/
|
|
65
|
+
export interface FileSystem<TBackend extends string = string> {
|
|
66
|
+
/** Unique identifier for this filesystem instance. */
|
|
67
|
+
readonly id: string;
|
|
68
|
+
/**
|
|
69
|
+
* Identifier for the underlying implementation.
|
|
70
|
+
*
|
|
71
|
+
* Examples: "disk", "ftp", "sftp", "memory", "s3", or "dbfs".
|
|
72
|
+
*/
|
|
73
|
+
readonly backend: TBackend;
|
|
74
|
+
/**
|
|
75
|
+
* Root location exposed by this filesystem.
|
|
76
|
+
*
|
|
77
|
+
* Examples:
|
|
78
|
+
* - /var/data
|
|
79
|
+
* - ftp://example.com/files
|
|
80
|
+
* - s3://bucket/prefix
|
|
81
|
+
* - /Volumes/catalog/schema/volume
|
|
82
|
+
*/
|
|
83
|
+
readonly root: string;
|
|
84
|
+
readonly readOnly: boolean;
|
|
85
|
+
/** Prepare, connect to, or validate the filesystem. */
|
|
86
|
+
init(): Promise<void>;
|
|
87
|
+
/** Release connections or other resources. */
|
|
88
|
+
close(): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Resolve a filesystem-relative path into the path understood
|
|
91
|
+
* by the underlying backend.
|
|
92
|
+
*/
|
|
93
|
+
resolvePath(inputPath: string): string;
|
|
94
|
+
/** Read a file as binary data. */
|
|
95
|
+
readFile(inputPath: string): Promise<Uint8Array>;
|
|
96
|
+
/** Read and decode a file as text. */
|
|
97
|
+
readFile(inputPath: string, options: ReadFileOptions & {
|
|
98
|
+
encoding: string;
|
|
99
|
+
}): Promise<string>;
|
|
100
|
+
writeFile(inputPath: string, content: FileContent, options?: WriteFileOptions): Promise<void>;
|
|
101
|
+
appendFile(inputPath: string, content: FileContent): Promise<void>;
|
|
102
|
+
deleteFile(inputPath: string, options?: RemoveOptions): Promise<void>;
|
|
103
|
+
copyFile(sourcePath: string, destinationPath: string, options?: CopyOptions): Promise<void>;
|
|
104
|
+
moveFile(sourcePath: string, destinationPath: string, options?: CopyOptions): Promise<void>;
|
|
105
|
+
mkdir(inputPath: string, options?: MakeDirectoryOptions): Promise<void>;
|
|
106
|
+
rmdir(inputPath: string, options?: RemoveOptions): Promise<void>;
|
|
107
|
+
readdir(inputPath: string, options?: ListOptions): Promise<FileEntry[]>;
|
|
108
|
+
exists(inputPath: string): Promise<boolean>;
|
|
109
|
+
stat(inputPath: string): Promise<FileStat>;
|
|
110
|
+
}
|
package/lib/src/fs.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEZpbGVDb250ZW50ID0gc3RyaW5nIHwgVWludDhBcnJheTtcblxuZXhwb3J0IHR5cGUgRmlsZUVudHJ5VHlwZSA9IFwiZmlsZVwiIHwgXCJkaXJlY3RvcnlcIiB8IFwic3ltYm9saWMtbGlua1wiIHwgXCJvdGhlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVFbnRyeSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogRmlsZUVudHJ5VHlwZTtcbiAgc2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogUHJvdmlkZXItc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBpcyBub3QgcGFydCBvZiB0aGVcbiAgICogcG9ydGFibGUgZmlsZXN5c3RlbSBjb250cmFjdC5cbiAgICovXG4gIG1ldGFkYXRhPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTdGF0IGV4dGVuZHMgRmlsZUVudHJ5IHtcbiAgLyoqIFBhdGggcmVsYXRpdmUgdG8gdGhlIGZpbGVzeXN0ZW0gcm9vdC4gKi9cbiAgcGF0aDogc3RyaW5nO1xuXG4gIGNyZWF0ZWRBdD86IERhdGU7XG4gIG1vZGlmaWVkQXQ/OiBEYXRlO1xuICBhY2Nlc3NlZEF0PzogRGF0ZTtcblxuICBtaW1lVHlwZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWFkRmlsZU9wdGlvbnMge1xuICAvKipcbiAgICogUmV0dXJuIGRlY29kZWQgdGV4dCB1c2luZyB0aGlzIGVuY29kaW5nLlxuICAgKiBXaXRob3V0IGFuIGVuY29kaW5nLCByZWFkRmlsZSByZXR1cm5zIFVpbnQ4QXJyYXkuXG4gICAqL1xuICBlbmNvZGluZz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXcml0ZUZpbGVPcHRpb25zIHtcbiAgLyoqIFJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZS4gRGVmYXVsdHMgdG8gdHJ1ZS4gKi9cbiAgb3ZlcndyaXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW1vdmVPcHRpb25zIHtcbiAgLyoqIERvIG5vdCBmYWlsIGlmIHRoZSB0YXJnZXQgZG9lcyBub3QgZXhpc3QuICovXG4gIGZvcmNlPzogYm9vbGVhbjtcblxuICAvKiogUmVjdXJzaXZlbHkgcmVtb3ZlIGRpcmVjdG9yeSBjb250ZW50cy4gKi9cbiAgcmVjdXJzaXZlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb3B5T3B0aW9ucyB7XG4gIC8qKiBSZXBsYWNlIGFuIGV4aXN0aW5nIGRlc3RpbmF0aW9uLiBEZWZhdWx0cyB0byB0cnVlLiAqL1xuICBvdmVyd3JpdGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1ha2VEaXJlY3RvcnlPcHRpb25zIHtcbiAgLyoqIENyZWF0ZSBtaXNzaW5nIHBhcmVudCBkaXJlY3Rvcmllcy4gKi9cbiAgcmVjdXJzaXZlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0T3B0aW9ucyB7XG4gIC8qKiBSZWN1cnNpdmVseSBsaXN0IGRlc2NlbmRhbnQgZW50cmllcy4gKi9cbiAgcmVjdXJzaXZlPzogYm9vbGVhbjtcblxuICAvKiogTWF4aW11bSByZWN1cnNpb24gZGVwdGguICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuXG4gIC8qKiBPbmx5IGluY2x1ZGUgZmlsZXMgd2l0aCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIG9yIGV4dGVuc2lvbnMuICovXG4gIGV4dGVuc2lvbj86IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgZmlsZXN5c3RlbSByb290ZWQgYXQgYSBsb2NhbCwgcmVtb3RlLCBvciB2aXJ0dWFsIGxvY2F0aW9uLlxuICpcbiAqIFBvc3NpYmxlIGltcGxlbWVudGF0aW9ucyBpbmNsdWRlOlxuICogLSBMb2NhbCBkaXNrXG4gKiAtIEZUUCBvciBTRlRQXG4gKiAtIE9iamVjdCBzdG9yYWdlXG4gKiAtIEluLW1lbW9yeSBzdG9yYWdlXG4gKiAtIERhdGFicmlja3NcbiAqIC0gRGF0YWJhc2UtYmFja2VkIHN0b3JhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlU3lzdGVtPFRCYWNrZW5kIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiB7XG4gIC8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBmaWxlc3lzdGVtIGluc3RhbmNlLiAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZGVudGlmaWVyIGZvciB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogRXhhbXBsZXM6IFwiZGlza1wiLCBcImZ0cFwiLCBcInNmdHBcIiwgXCJtZW1vcnlcIiwgXCJzM1wiLCBvciBcImRiZnNcIi5cbiAgICovXG4gIHJlYWRvbmx5IGJhY2tlbmQ6IFRCYWNrZW5kO1xuXG4gIC8qKlxuICAgKiBSb290IGxvY2F0aW9uIGV4cG9zZWQgYnkgdGhpcyBmaWxlc3lzdGVtLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICogLSAvdmFyL2RhdGFcbiAgICogLSBmdHA6Ly9leGFtcGxlLmNvbS9maWxlc1xuICAgKiAtIHMzOi8vYnVja2V0L3ByZWZpeFxuICAgKiAtIC9Wb2x1bWVzL2NhdGFsb2cvc2NoZW1hL3ZvbHVtZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdDogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IHJlYWRPbmx5OiBib29sZWFuO1xuXG4gIC8qKiBQcmVwYXJlLCBjb25uZWN0IHRvLCBvciB2YWxpZGF0ZSB0aGUgZmlsZXN5c3RlbS4gKi9cbiAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBSZWxlYXNlIGNvbm5lY3Rpb25zIG9yIG90aGVyIHJlc291cmNlcy4gKi9cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGZpbGVzeXN0ZW0tcmVsYXRpdmUgcGF0aCBpbnRvIHRoZSBwYXRoIHVuZGVyc3Rvb2RcbiAgICogYnkgdGhlIHVuZGVybHlpbmcgYmFja2VuZC5cbiAgICovXG4gIHJlc29sdmVQYXRoKGlucHV0UGF0aDogc3RyaW5nKTogc3RyaW5nO1xuXG4gIC8qKiBSZWFkIGEgZmlsZSBhcyBiaW5hcnkgZGF0YS4gKi9cbiAgcmVhZEZpbGUoaW5wdXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFVpbnQ4QXJyYXk+O1xuXG4gIC8qKiBSZWFkIGFuZCBkZWNvZGUgYSBmaWxlIGFzIHRleHQuICovXG4gIHJlYWRGaWxlKGlucHV0UGF0aDogc3RyaW5nLCBvcHRpb25zOiBSZWFkRmlsZU9wdGlvbnMgJiB7IGVuY29kaW5nOiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPjtcblxuICB3cml0ZUZpbGUoaW5wdXRQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IEZpbGVDb250ZW50LCBvcHRpb25zPzogV3JpdGVGaWxlT3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG5cbiAgYXBwZW5kRmlsZShpbnB1dFBhdGg6IHN0cmluZywgY29udGVudDogRmlsZUNvbnRlbnQpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIGRlbGV0ZUZpbGUoaW5wdXRQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZW1vdmVPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcblxuICBjb3B5RmlsZShzb3VyY2VQYXRoOiBzdHJpbmcsIGRlc3RpbmF0aW9uUGF0aDogc3RyaW5nLCBvcHRpb25zPzogQ29weU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIG1vdmVGaWxlKHNvdXJjZVBhdGg6IHN0cmluZywgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3B5T3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG5cbiAgbWtkaXIoaW5wdXRQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBNYWtlRGlyZWN0b3J5T3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG5cbiAgcm1kaXIoaW5wdXRQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZW1vdmVPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcblxuICByZWFkZGlyKGlucHV0UGF0aDogc3RyaW5nLCBvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPEZpbGVFbnRyeVtdPjtcblxuICBleGlzdHMoaW5wdXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gIHN0YXQoaW5wdXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEZpbGVTdGF0Pjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory {@link FileSystem} backed by Maps.
|
|
3
|
+
*
|
|
4
|
+
* Implements only the `*At` primitives; {@link BaseFileSystem} supplies parents,
|
|
5
|
+
* recursion, encoding, and append/copy/move fallbacks. Useful for tests and as
|
|
6
|
+
* a reference for new adapters.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import { BaseFileSystem, type FileSystemRootInput } from "./base-fs.ts";
|
|
11
|
+
import type { FileEntry, FileStat, WriteFileOptions } from "./fs.ts";
|
|
12
|
+
/** Options for {@link MemoryFileSystem}. */
|
|
13
|
+
export interface MemoryFileSystemOptions {
|
|
14
|
+
/** Unique identifier. Defaults to a stable hash of the root. */
|
|
15
|
+
id?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Virtual root. Defaults to `/memory`. See {@link FileSystemRootInput}.
|
|
18
|
+
*/
|
|
19
|
+
root?: FileSystemRootInput;
|
|
20
|
+
/** Block all write operations. Defaults to false. */
|
|
21
|
+
readOnly?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* {@link FileSystem} that stores files and directories in process memory.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* const fs = new MemoryFileSystem();
|
|
29
|
+
* await fs.writeFile("note.txt", "hi");
|
|
30
|
+
* const text = await fs.readFile("note.txt", { encoding: "utf8" });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare class MemoryFileSystem extends BaseFileSystem<"memory"> {
|
|
34
|
+
private readonly files;
|
|
35
|
+
private readonly dirs;
|
|
36
|
+
constructor(options?: MemoryFileSystemOptions);
|
|
37
|
+
/** Drop every file and directory except the root. */
|
|
38
|
+
clear(): void;
|
|
39
|
+
protected readBytesAt(resolvedPath: string): Promise<Uint8Array>;
|
|
40
|
+
protected writeBytesAt(resolvedPath: string, content: Uint8Array, options: Required<WriteFileOptions>): Promise<void>;
|
|
41
|
+
protected deleteFileAt(resolvedPath: string): Promise<void>;
|
|
42
|
+
protected createDirectoryAt(resolvedPath: string): Promise<void>;
|
|
43
|
+
protected removeDirectoryAt(resolvedPath: string): Promise<void>;
|
|
44
|
+
protected listDirectoryAt(resolvedPath: string): Promise<FileEntry[]>;
|
|
45
|
+
protected statAt(resolvedPath: string): Promise<Omit<FileStat, "path">>;
|
|
46
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory {@link FileSystem} backed by Maps.
|
|
3
|
+
*
|
|
4
|
+
* Implements only the `*At` primitives; {@link BaseFileSystem} supplies parents,
|
|
5
|
+
* recursion, encoding, and append/copy/move fallbacks. Useful for tests and as
|
|
6
|
+
* a reference for new adapters.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import { hash } from "@dbx-tools/shared-core";
|
|
11
|
+
import { BaseFileSystem, FileSystemError, normalizeFileSystemRoot, } from "./base-fs.js";
|
|
12
|
+
import * as posixPath from "./posix-path.js";
|
|
13
|
+
/**
|
|
14
|
+
* {@link FileSystem} that stores files and directories in process memory.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const fs = new MemoryFileSystem();
|
|
19
|
+
* await fs.writeFile("note.txt", "hi");
|
|
20
|
+
* const text = await fs.readFile("note.txt", { encoding: "utf8" });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export class MemoryFileSystem extends BaseFileSystem {
|
|
24
|
+
files = new Map();
|
|
25
|
+
dirs = new Set();
|
|
26
|
+
constructor(options = {}) {
|
|
27
|
+
const root = options.root ?? "/memory";
|
|
28
|
+
super({
|
|
29
|
+
id: options.id ?? `memory-${hash.fnvHash(normalizeFileSystemRoot(root))}`,
|
|
30
|
+
backend: "memory",
|
|
31
|
+
root,
|
|
32
|
+
readOnly: options.readOnly,
|
|
33
|
+
});
|
|
34
|
+
this.dirs.add(this.root);
|
|
35
|
+
}
|
|
36
|
+
/** Drop every file and directory except the root. */
|
|
37
|
+
clear() {
|
|
38
|
+
this.files.clear();
|
|
39
|
+
this.dirs.clear();
|
|
40
|
+
this.dirs.add(this.root);
|
|
41
|
+
}
|
|
42
|
+
async readBytesAt(resolvedPath) {
|
|
43
|
+
const bytes = this.files.get(resolvedPath);
|
|
44
|
+
if (!bytes) {
|
|
45
|
+
throw new FileSystemError("NOT_FOUND", `Not found: ${resolvedPath}`, resolvedPath);
|
|
46
|
+
}
|
|
47
|
+
return new Uint8Array(bytes);
|
|
48
|
+
}
|
|
49
|
+
async writeBytesAt(resolvedPath, content, options) {
|
|
50
|
+
if (!options.overwrite && this.files.has(resolvedPath)) {
|
|
51
|
+
throw new FileSystemError("ALREADY_EXISTS", `Exists: ${resolvedPath}`, resolvedPath);
|
|
52
|
+
}
|
|
53
|
+
if (this.dirs.has(resolvedPath)) {
|
|
54
|
+
throw new FileSystemError("IS_DIRECTORY", `Is directory: ${resolvedPath}`, resolvedPath);
|
|
55
|
+
}
|
|
56
|
+
this.files.set(resolvedPath, new Uint8Array(content));
|
|
57
|
+
}
|
|
58
|
+
async deleteFileAt(resolvedPath) {
|
|
59
|
+
if (!this.files.delete(resolvedPath)) {
|
|
60
|
+
throw new FileSystemError("NOT_FOUND", `Not found: ${resolvedPath}`, resolvedPath);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async createDirectoryAt(resolvedPath) {
|
|
64
|
+
if (this.files.has(resolvedPath) || this.dirs.has(resolvedPath)) {
|
|
65
|
+
throw new FileSystemError("ALREADY_EXISTS", `Exists: ${resolvedPath}`, resolvedPath);
|
|
66
|
+
}
|
|
67
|
+
this.dirs.add(resolvedPath);
|
|
68
|
+
}
|
|
69
|
+
async removeDirectoryAt(resolvedPath) {
|
|
70
|
+
if (!this.dirs.has(resolvedPath)) {
|
|
71
|
+
throw new FileSystemError("NOT_FOUND", `Not found: ${resolvedPath}`, resolvedPath);
|
|
72
|
+
}
|
|
73
|
+
if (resolvedPath === this.root) {
|
|
74
|
+
throw new FileSystemError("PERMISSION_DENIED", `Cannot remove filesystem root: ${resolvedPath}`, resolvedPath);
|
|
75
|
+
}
|
|
76
|
+
const prefix = `${resolvedPath}/`;
|
|
77
|
+
for (const file of this.files.keys()) {
|
|
78
|
+
if (file.startsWith(prefix)) {
|
|
79
|
+
throw new FileSystemError("DIRECTORY_NOT_EMPTY", `Not empty: ${resolvedPath}`, resolvedPath);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
for (const dir of this.dirs) {
|
|
83
|
+
if (dir !== resolvedPath && dir.startsWith(prefix)) {
|
|
84
|
+
throw new FileSystemError("DIRECTORY_NOT_EMPTY", `Not empty: ${resolvedPath}`, resolvedPath);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
this.dirs.delete(resolvedPath);
|
|
88
|
+
}
|
|
89
|
+
async listDirectoryAt(resolvedPath) {
|
|
90
|
+
if (!this.dirs.has(resolvedPath)) {
|
|
91
|
+
throw new FileSystemError("NOT_FOUND", `Not found: ${resolvedPath}`, resolvedPath);
|
|
92
|
+
}
|
|
93
|
+
const prefix = `${resolvedPath}/`;
|
|
94
|
+
const names = new Map();
|
|
95
|
+
for (const dir of this.dirs) {
|
|
96
|
+
if (!dir.startsWith(prefix))
|
|
97
|
+
continue;
|
|
98
|
+
const rest = dir.slice(prefix.length);
|
|
99
|
+
if (!rest || rest.includes("/"))
|
|
100
|
+
continue;
|
|
101
|
+
names.set(rest, { name: rest, type: "directory" });
|
|
102
|
+
}
|
|
103
|
+
for (const [file, bytes] of this.files) {
|
|
104
|
+
if (!file.startsWith(prefix))
|
|
105
|
+
continue;
|
|
106
|
+
const rest = file.slice(prefix.length);
|
|
107
|
+
if (!rest || rest.includes("/"))
|
|
108
|
+
continue;
|
|
109
|
+
names.set(rest, { name: rest, type: "file", size: bytes.byteLength });
|
|
110
|
+
}
|
|
111
|
+
return [...names.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
112
|
+
}
|
|
113
|
+
async statAt(resolvedPath) {
|
|
114
|
+
if (this.dirs.has(resolvedPath)) {
|
|
115
|
+
return {
|
|
116
|
+
name: posixPath.basename(resolvedPath) || posixPath.basename(this.root),
|
|
117
|
+
type: "directory",
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const bytes = this.files.get(resolvedPath);
|
|
121
|
+
if (!bytes) {
|
|
122
|
+
throw new FileSystemError("NOT_FOUND", `Not found: ${resolvedPath}`, resolvedPath);
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
name: posixPath.basename(resolvedPath),
|
|
126
|
+
type: "file",
|
|
127
|
+
size: bytes.byteLength,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LWZzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbW9yeS1mcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5QyxPQUFPLEVBQ0wsY0FBYyxFQUNkLGVBQWUsRUFDZix1QkFBdUIsR0FFeEIsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxLQUFLLFNBQVMsTUFBTSxpQkFBaUIsQ0FBQztBQWdCN0M7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxPQUFPLGdCQUFpQixTQUFRLGNBQXdCO0lBQzNDLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztJQUN0QyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUUxQyxZQUFZLFVBQW1DLEVBQUU7UUFDL0MsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUM7UUFDdkMsS0FBSyxDQUFDO1lBQ0osRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDekUsT0FBTyxFQUFFLFFBQVE7WUFDakIsSUFBSTtZQUNKLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtTQUMzQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixD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RSxZQUFZLENBQUMsQ0FBQztRQUNyRixDQUFDO1FBQ0QsT0FBTztZQUNMLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztZQUN0QyxJQUFJLEVBQUUsTUFBTTtZQUNaLElBQUksRUFBRSxLQUFLLENBQUMsVUFBVTtTQUN2QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbi1tZW1vcnkge0BsaW5rIEZpbGVTeXN0ZW19IGJhY2tlZCBieSBNYXBzLlxuICpcbiAqIEltcGxlbWVudHMgb25seSB0aGUgYCpBdGAgcHJpbWl0aXZlczsge0BsaW5rIEJhc2VGaWxlU3lzdGVtfSBzdXBwbGllcyBwYXJlbnRzLFxuICogcmVjdXJzaW9uLCBlbmNvZGluZywgYW5kIGFwcGVuZC9jb3B5L21vdmUgZmFsbGJhY2tzLiBVc2VmdWwgZm9yIHRlc3RzIGFuZCBhc1xuICogYSByZWZlcmVuY2UgZm9yIG5ldyBhZGFwdGVycy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaGFzaCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBCYXNlRmlsZVN5c3RlbSxcbiAgRmlsZVN5c3RlbUVycm9yLFxuICBub3JtYWxpemVGaWxlU3lzdGVtUm9vdCxcbiAgdHlwZSBGaWxlU3lzdGVtUm9vdElucHV0LFxufSBmcm9tIFwiLi9iYXNlLWZzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVFbnRyeSwgRmlsZVN0YXQsIFdyaXRlRmlsZU9wdGlvbnMgfSBmcm9tIFwiLi9mcy50c1wiO1xuaW1wb3J0ICogYXMgcG9zaXhQYXRoIGZyb20gXCIuL3Bvc2l4LXBhdGgudHNcIjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBNZW1vcnlGaWxlU3lzdGVtfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVtb3J5RmlsZVN5c3RlbU9wdGlvbnMge1xuICAvKiogVW5pcXVlIGlkZW50aWZpZXIuIERlZmF1bHRzIHRvIGEgc3RhYmxlIGhhc2ggb2YgdGhlIHJvb3QuICovXG4gIGlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWaXJ0dWFsIHJvb3QuIERlZmF1bHRzIHRvIGAvbWVtb3J5YC4gU2VlIHtAbGluayBGaWxlU3lzdGVtUm9vdElucHV0fS5cbiAgICovXG4gIHJvb3Q/OiBGaWxlU3lzdGVtUm9vdElucHV0O1xuXG4gIC8qKiBCbG9jayBhbGwgd3JpdGUgb3BlcmF0aW9ucy4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIHJlYWRPbmx5PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiB7QGxpbmsgRmlsZVN5c3RlbX0gdGhhdCBzdG9yZXMgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluIHByb2Nlc3MgbWVtb3J5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgZnMgPSBuZXcgTWVtb3J5RmlsZVN5c3RlbSgpO1xuICogYXdhaXQgZnMud3JpdGVGaWxlKFwibm90ZS50eHRcIiwgXCJoaVwiKTtcbiAqIGNvbnN0IHRleHQgPSBhd2FpdCBmcy5yZWFkRmlsZShcIm5vdGUudHh0XCIsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1vcnlGaWxlU3lzdGVtIGV4dGVuZHMgQmFzZUZpbGVTeXN0ZW08XCJtZW1vcnlcIj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIFVpbnQ4QXJyYXk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1lbW9yeUZpbGVTeXN0ZW1PcHRpb25zID0ge30pIHtcbiAgICBjb25zdCByb290ID0gb3B0aW9ucy5yb290ID8/IFwiL21lbW9yeVwiO1xuICAgIHN1cGVyKHtcbiAgICAgIGlkOiBvcHRpb25zLmlkID8/IGBtZW1vcnktJHtoYXNoLmZudkhhc2gobm9ybWFsaXplRmlsZVN5c3RlbVJvb3Qocm9vdCkpfWAsXG4gICAgICBiYWNrZW5kOiBcIm1lbW9yeVwiLFxuICAgICAgcm9vdCxcbiAgICAgIHJlYWRPbmx5OiBvcHRpb25zLnJlYWRPbmx5LFxuICAgIH0pO1xuICAgIHRoaXMuZGlycy5hZGQodGhpcy5yb290KTtcbiAgfVxuXG4gIC8qKiBEcm9wIGV2ZXJ5IGZpbGUgYW5kIGRpcmVjdG9yeSBleGNlcHQgdGhlIHJvb3QuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsZXMuY2xlYXIoKTtcbiAgICB0aGlzLmRpcnMuY2xlYXIoKTtcbiAgICB0aGlzLmRpcnMuYWRkKHRoaXMucm9vdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcmVhZEJ5dGVzQXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBieXRlcyA9IHRoaXMuZmlsZXMuZ2V0KHJlc29sdmVkUGF0aCk7XG4gICAgaWYgKCFieXRlcykge1xuICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcIk5PVF9GT1VORFwiLCBgTm90IGZvdW5kOiAke3Jlc29sdmVkUGF0aH1gLCByZXNvbHZlZFBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHdyaXRlQnl0ZXNBdChcbiAgICByZXNvbHZlZFBhdGg6IHN0cmluZyxcbiAgICBjb250ZW50OiBVaW50OEFycmF5LFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPFdyaXRlRmlsZU9wdGlvbnM+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIW9wdGlvbnMub3ZlcndyaXRlICYmIHRoaXMuZmlsZXMuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXJyb3IoXCJBTFJFQURZX0VYSVNUU1wiLCBgRXhpc3RzOiAke3Jlc29sdmVkUGF0aH1gLCByZXNvbHZlZFBhdGgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaXJzLmhhcyhyZXNvbHZlZFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFwiSVNfRElSRUNUT1JZXCIsIGBJcyBkaXJlY3Rvcnk6ICR7cmVzb2x2ZWRQYXRofWAsIHJlc29sdmVkUGF0aCk7XG4gICAgfVxuICAgIHRoaXMuZmlsZXMuc2V0KHJlc29sdmVkUGF0aCwgbmV3IFVpbnQ4QXJyYXkoY29udGVudCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUZpbGVBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5maWxlcy5kZWxldGUocmVzb2x2ZWRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcIk5PVF9GT1VORFwiLCBgTm90IGZvdW5kOiAke3Jlc29sdmVkUGF0aH1gLCByZXNvbHZlZFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVEaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZpbGVzLmhhcyhyZXNvbHZlZFBhdGgpIHx8IHRoaXMuZGlycy5oYXMocmVzb2x2ZWRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcIkFMUkVBRFlfRVhJU1RTXCIsIGBFeGlzdHM6ICR7cmVzb2x2ZWRQYXRofWAsIHJlc29sdmVkUGF0aCk7XG4gICAgfVxuICAgIHRoaXMuZGlycy5hZGQocmVzb2x2ZWRQYXRoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZW1vdmVEaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5kaXJzLmhhcyhyZXNvbHZlZFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFwiTk9UX0ZPVU5EXCIsIGBOb3QgZm91bmQ6ICR7cmVzb2x2ZWRQYXRofWAsIHJlc29sdmVkUGF0aCk7XG4gICAgfVxuICAgIGlmIChyZXNvbHZlZFBhdGggPT09IHRoaXMucm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcbiAgICAgICAgXCJQRVJNSVNTSU9OX0RFTklFRFwiLFxuICAgICAgICBgQ2Fubm90IHJlbW92ZSBmaWxlc3lzdGVtIHJvb3Q6ICR7cmVzb2x2ZWRQYXRofWAsXG4gICAgICAgIHJlc29sdmVkUGF0aCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHByZWZpeCA9IGAke3Jlc29sdmVkUGF0aH0vYDtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGhpcy5maWxlcy5rZXlzKCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFxuICAgICAgICAgIFwiRElSRUNUT1JZX05PVF9FTVBUWVwiLFxuICAgICAgICAgIGBOb3QgZW1wdHk6ICR7cmVzb2x2ZWRQYXRofWAsXG4gICAgICAgICAgcmVzb2x2ZWRQYXRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpciBvZiB0aGlzLmRpcnMpIHtcbiAgICAgIGlmIChkaXIgIT09IHJlc29sdmVkUGF0aCAmJiBkaXIuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXJyb3IoXG4gICAgICAgICAgXCJESVJFQ1RPUllfTk9UX0VNUFRZXCIsXG4gICAgICAgICAgYE5vdCBlbXB0eTogJHtyZXNvbHZlZFBhdGh9YCxcbiAgICAgICAgICByZXNvbHZlZFBhdGgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZGlycy5kZWxldGUocmVzb2x2ZWRQYXRoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBsaXN0RGlyZWN0b3J5QXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEZpbGVFbnRyeVtdPiB7XG4gICAgaWYgKCF0aGlzLmRpcnMuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXJyb3IoXCJOT1RfRk9VTkRcIiwgYE5vdCBmb3VuZDogJHtyZXNvbHZlZFBhdGh9YCwgcmVzb2x2ZWRQYXRoKTtcbiAgICB9XG4gICAgY29uc3QgcHJlZml4ID0gYCR7cmVzb2x2ZWRQYXRofS9gO1xuICAgIGNvbnN0IG5hbWVzID0gbmV3IE1hcDxzdHJpbmcsIEZpbGVFbnRyeT4oKTtcblxuICAgIGZvciAoY29uc3QgZGlyIG9mIHRoaXMuZGlycykge1xuICAgICAgaWYgKCFkaXIuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJlc3QgPSBkaXIuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgICBpZiAoIXJlc3QgfHwgcmVzdC5pbmNsdWRlcyhcIi9cIikpIGNvbnRpbnVlO1xuICAgICAgbmFtZXMuc2V0KHJlc3QsIHsgbmFtZTogcmVzdCwgdHlwZTogXCJkaXJlY3RvcnlcIiB9KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbZmlsZSwgYnl0ZXNdIG9mIHRoaXMuZmlsZXMpIHtcbiAgICAgIGlmICghZmlsZS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcmVzdCA9IGZpbGUuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgICBpZiAoIXJlc3QgfHwgcmVzdC5pbmNsdWRlcyhcIi9cIikpIGNvbnRpbnVlO1xuICAgICAgbmFtZXMuc2V0KHJlc3QsIHsgbmFtZTogcmVzdCwgdHlwZTogXCJmaWxlXCIsIHNpemU6IGJ5dGVzLmJ5dGVMZW5ndGggfSk7XG4gICAgfVxuICAgIHJldHVybiBbLi4ubmFtZXMudmFsdWVzKCldLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHN0YXRBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8T21pdDxGaWxlU3RhdCwgXCJwYXRoXCI+PiB7XG4gICAgaWYgKHRoaXMuZGlycy5oYXMocmVzb2x2ZWRQYXRoKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcG9zaXhQYXRoLmJhc2VuYW1lKHJlc29sdmVkUGF0aCkgfHwgcG9zaXhQYXRoLmJhc2VuYW1lKHRoaXMucm9vdCksXG4gICAgICAgIHR5cGU6IFwiZGlyZWN0b3J5XCIsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBieXRlcyA9IHRoaXMuZmlsZXMuZ2V0KHJlc29sdmVkUGF0aCk7XG4gICAgaWYgKCFieXRlcykge1xuICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcIk5PVF9GT1VORFwiLCBgTm90IGZvdW5kOiAke3Jlc29sdmVkUGF0aH1gLCByZXNvbHZlZFBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogcG9zaXhQYXRoLmJhc2VuYW1lKHJlc29sdmVkUGF0aCksXG4gICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgIHNpemU6IGJ5dGVzLmJ5dGVMZW5ndGgsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POSIX-only path helpers for {@link BaseFileSystem} and adapters.
|
|
3
|
+
*
|
|
4
|
+
* The portable filesystem namespace always uses `/` separators. Host adapters
|
|
5
|
+
* convert with {@link toPosix} / {@link toHost} at the boundary; they must not
|
|
6
|
+
* leak `\` into namespace paths.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
/** Replace every `\` with `/`. */
|
|
11
|
+
export declare function toPosix(input: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Convert a POSIX path to a host separator style.
|
|
14
|
+
*
|
|
15
|
+
* @param separator - Host separator (`path.sep` in Node). Defaults to `/`
|
|
16
|
+
* (no-op), which keeps shared code free of `process`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function toHost(posixPath: string, separator?: string): string;
|
|
19
|
+
/** True when {@link input} is an absolute POSIX or Windows-drive path. */
|
|
20
|
+
export declare function isAbsolute(input: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Normalize a filesystem root for storage on {@link BaseFileSystem.root}.
|
|
23
|
+
*
|
|
24
|
+
* Converts to POSIX, trims, and strips trailing slashes while preserving
|
|
25
|
+
* `/`, Windows drive roots (`C:/`), and URL-like scheme roots.
|
|
26
|
+
*/
|
|
27
|
+
export declare function normalizeRoot(root: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Join path segments using `/`.
|
|
30
|
+
*
|
|
31
|
+
* Absolute segments (see {@link isAbsolute}) reset the result. Empty segments
|
|
32
|
+
* and `.` are skipped. Does not resolve `..`; use {@link normalize} for that.
|
|
33
|
+
*/
|
|
34
|
+
export declare function join(...parts: string[]): string;
|
|
35
|
+
export type NormalizeResult = {
|
|
36
|
+
readonly ok: true;
|
|
37
|
+
readonly path: string;
|
|
38
|
+
} | {
|
|
39
|
+
readonly ok: false;
|
|
40
|
+
readonly escape: true;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Normalize a filesystem-relative path into a rooted POSIX namespace path
|
|
44
|
+
* (`/a/b`). Resolves `.` and `..`. Returns `{ escape: true }` when `..`
|
|
45
|
+
* would leave the root.
|
|
46
|
+
*
|
|
47
|
+
* Backslashes are converted via {@link toPosix}. Null bytes are rejected by
|
|
48
|
+
* callers that wrap this in a {@link FileSystemError}.
|
|
49
|
+
*/
|
|
50
|
+
export declare function normalize(inputPath: string): NormalizeResult;
|
|
51
|
+
/** Parent directory of a POSIX path (`/` for the root). */
|
|
52
|
+
export declare function dirname(inputPath: string): string;
|
|
53
|
+
/** Final segment of a POSIX path. */
|
|
54
|
+
export declare function basename(inputPath: string): string;
|
|
55
|
+
/**
|
|
56
|
+
* Relative POSIX path from {@link from} to {@link to}, both absolute.
|
|
57
|
+
* Returns undefined when {@link to} is outside {@link from}.
|
|
58
|
+
*/
|
|
59
|
+
export declare function relative(from: string, to: string): string | undefined;
|
|
60
|
+
/** Whether {@link candidate} is {@link root} or a descendant (POSIX lexical). */
|
|
61
|
+
export declare function isWithinRoot(root: string, candidate: string): boolean;
|
|
62
|
+
/** True when {@link input} is `~` or a path under `~/` (or `~\`). */
|
|
63
|
+
export declare function isHomeRelativePath(input: string): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Expand a `~` / `~/...` input against {@link home}.
|
|
66
|
+
*
|
|
67
|
+
* Shared by every adapter that has a notion of "home", since each one differs
|
|
68
|
+
* only in what `home` is and how segments join: local disk passes
|
|
69
|
+
* `path.join`, Databricks passes a POSIX join under
|
|
70
|
+
* `/Workspace/Users/<user>`. Non-home inputs come back trimmed and unchanged.
|
|
71
|
+
*
|
|
72
|
+
* @param joinWith - Join the expanded remainder onto {@link home}. Defaults to
|
|
73
|
+
* POSIX {@link join}.
|
|
74
|
+
*/
|
|
75
|
+
export declare function expandHome(input: string, home: string, joinWith?: (home: string, rest: string) => string): string;
|
|
76
|
+
/**
|
|
77
|
+
* Drop a leading `~` and any leading separators, so an absolute-looking or
|
|
78
|
+
* home-relative input can be joined UNDER a base rather than replacing it.
|
|
79
|
+
*/
|
|
80
|
+
export declare function toRelativeSegment(input: string): string;
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POSIX-only path helpers for {@link BaseFileSystem} and adapters.
|
|
3
|
+
*
|
|
4
|
+
* The portable filesystem namespace always uses `/` separators. Host adapters
|
|
5
|
+
* convert with {@link toPosix} / {@link toHost} at the boundary; they must not
|
|
6
|
+
* leak `\` into namespace paths.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
/** Replace every `\` with `/`. */
|
|
11
|
+
export function toPosix(input) {
|
|
12
|
+
return input.replace(/\\/g, "/");
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Convert a POSIX path to a host separator style.
|
|
16
|
+
*
|
|
17
|
+
* @param separator - Host separator (`path.sep` in Node). Defaults to `/`
|
|
18
|
+
* (no-op), which keeps shared code free of `process`.
|
|
19
|
+
*/
|
|
20
|
+
export function toHost(posixPath, separator = "/") {
|
|
21
|
+
if (separator === "/" || separator.length === 0)
|
|
22
|
+
return posixPath;
|
|
23
|
+
// Preserve scheme roots such as `s3://bucket/key`.
|
|
24
|
+
const scheme = /^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.exec(posixPath);
|
|
25
|
+
if (scheme) {
|
|
26
|
+
const prefix = scheme[0];
|
|
27
|
+
return prefix + posixPath.slice(prefix.length).replace(/\//g, separator);
|
|
28
|
+
}
|
|
29
|
+
return posixPath.replace(/\//g, separator);
|
|
30
|
+
}
|
|
31
|
+
/** True when {@link input} is an absolute POSIX or Windows-drive path. */
|
|
32
|
+
export function isAbsolute(input) {
|
|
33
|
+
const p = toPosix(input);
|
|
34
|
+
if (p.startsWith("/"))
|
|
35
|
+
return true;
|
|
36
|
+
// `C:/...` drive path
|
|
37
|
+
if (/^[A-Za-z]:\//.test(p))
|
|
38
|
+
return true;
|
|
39
|
+
// `scheme://...`
|
|
40
|
+
if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(p))
|
|
41
|
+
return true;
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Normalize a filesystem root for storage on {@link BaseFileSystem.root}.
|
|
46
|
+
*
|
|
47
|
+
* Converts to POSIX, trims, and strips trailing slashes while preserving
|
|
48
|
+
* `/`, Windows drive roots (`C:/`), and URL-like scheme roots.
|
|
49
|
+
*/
|
|
50
|
+
export function normalizeRoot(root) {
|
|
51
|
+
const trimmed = toPosix(root.trim());
|
|
52
|
+
if (!trimmed) {
|
|
53
|
+
throw new TypeError("Filesystem root cannot be empty");
|
|
54
|
+
}
|
|
55
|
+
const scheme = /^([a-zA-Z][a-zA-Z0-9+.-]*:\/\/)(.*)$/.exec(trimmed);
|
|
56
|
+
if (scheme) {
|
|
57
|
+
const [, prefix, rest] = scheme;
|
|
58
|
+
if (!rest)
|
|
59
|
+
return trimmed; // bare `s3://`
|
|
60
|
+
return prefix + rest.replace(/\/+$/, "");
|
|
61
|
+
}
|
|
62
|
+
if (trimmed === "/")
|
|
63
|
+
return "/";
|
|
64
|
+
if (/^[A-Za-z]:\/$/.test(trimmed))
|
|
65
|
+
return trimmed;
|
|
66
|
+
if (/^[A-Za-z]:\//.test(trimmed))
|
|
67
|
+
return trimmed.replace(/\/+$/, "");
|
|
68
|
+
return trimmed.replace(/\/+$/, "");
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Join path segments using `/`.
|
|
72
|
+
*
|
|
73
|
+
* Absolute segments (see {@link isAbsolute}) reset the result. Empty segments
|
|
74
|
+
* and `.` are skipped. Does not resolve `..`; use {@link normalize} for that.
|
|
75
|
+
*/
|
|
76
|
+
export function join(...parts) {
|
|
77
|
+
if (parts.length === 0)
|
|
78
|
+
return ".";
|
|
79
|
+
let result = "";
|
|
80
|
+
for (const part of parts) {
|
|
81
|
+
const segment = toPosix(part);
|
|
82
|
+
if (!segment || segment === ".")
|
|
83
|
+
continue;
|
|
84
|
+
if (isAbsolute(segment)) {
|
|
85
|
+
result = segment;
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (!result || result.endsWith("/")) {
|
|
89
|
+
result += segment.replace(/^\/+/, "");
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
result += `/${segment.replace(/^\/+/, "")}`;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return result || ".";
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Normalize a filesystem-relative path into a rooted POSIX namespace path
|
|
99
|
+
* (`/a/b`). Resolves `.` and `..`. Returns `{ escape: true }` when `..`
|
|
100
|
+
* would leave the root.
|
|
101
|
+
*
|
|
102
|
+
* Backslashes are converted via {@link toPosix}. Null bytes are rejected by
|
|
103
|
+
* callers that wrap this in a {@link FileSystemError}.
|
|
104
|
+
*/
|
|
105
|
+
export function normalize(inputPath) {
|
|
106
|
+
const p = toPosix(inputPath);
|
|
107
|
+
const segments = [];
|
|
108
|
+
for (const segment of p.split("/")) {
|
|
109
|
+
if (!segment || segment === ".")
|
|
110
|
+
continue;
|
|
111
|
+
if (segment === "..") {
|
|
112
|
+
if (segments.length === 0)
|
|
113
|
+
return { ok: false, escape: true };
|
|
114
|
+
segments.pop();
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
segments.push(segment);
|
|
118
|
+
}
|
|
119
|
+
return { ok: true, path: `/${segments.join("/")}` };
|
|
120
|
+
}
|
|
121
|
+
/** Parent directory of a POSIX path (`/` for the root). */
|
|
122
|
+
export function dirname(inputPath) {
|
|
123
|
+
const p = toPosix(inputPath);
|
|
124
|
+
if (p === "/" || /^[A-Za-z]:\/$/.test(p))
|
|
125
|
+
return p;
|
|
126
|
+
const trimmed = p.replace(/\/+$/, "") || "/";
|
|
127
|
+
const slash = trimmed.lastIndexOf("/");
|
|
128
|
+
if (slash <= 0) {
|
|
129
|
+
if (/^[A-Za-z]:\//.test(trimmed))
|
|
130
|
+
return `${trimmed.slice(0, 2)}/`;
|
|
131
|
+
return "/";
|
|
132
|
+
}
|
|
133
|
+
if (slash === 2 && /^[A-Za-z]:\//.test(trimmed)) {
|
|
134
|
+
return trimmed.slice(0, 3); // `C:/`
|
|
135
|
+
}
|
|
136
|
+
return trimmed.slice(0, slash) || "/";
|
|
137
|
+
}
|
|
138
|
+
/** Final segment of a POSIX path. */
|
|
139
|
+
export function basename(inputPath) {
|
|
140
|
+
const p = toPosix(inputPath).replace(/\/+$/, "");
|
|
141
|
+
if (!p || p === "/")
|
|
142
|
+
return "";
|
|
143
|
+
const slash = p.lastIndexOf("/");
|
|
144
|
+
return slash < 0 ? p : p.slice(slash + 1);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Relative POSIX path from {@link from} to {@link to}, both absolute.
|
|
148
|
+
* Returns undefined when {@link to} is outside {@link from}.
|
|
149
|
+
*/
|
|
150
|
+
export function relative(from, to) {
|
|
151
|
+
const fromNorm = normalizeRoot(from);
|
|
152
|
+
const toNorm = toPosix(to).replace(/\/+$/, "") || toPosix(to);
|
|
153
|
+
if (toNorm === fromNorm)
|
|
154
|
+
return "";
|
|
155
|
+
const prefix = fromNorm.endsWith("/") ? fromNorm : `${fromNorm}/`;
|
|
156
|
+
if (!toNorm.startsWith(prefix) && toNorm !== fromNorm) {
|
|
157
|
+
// Case-folding not applied; adapters that need it should normalize first.
|
|
158
|
+
if (fromNorm === "/") {
|
|
159
|
+
return toNorm.startsWith("/") ? toNorm.slice(1) : undefined;
|
|
160
|
+
}
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
return toNorm.slice(prefix.length);
|
|
164
|
+
}
|
|
165
|
+
/** Whether {@link candidate} is {@link root} or a descendant (POSIX lexical). */
|
|
166
|
+
export function isWithinRoot(root, candidate) {
|
|
167
|
+
return relative(root, candidate) !== undefined;
|
|
168
|
+
}
|
|
169
|
+
/** True when {@link input} is `~` or a path under `~/` (or `~\`). */
|
|
170
|
+
export function isHomeRelativePath(input) {
|
|
171
|
+
const trimmed = input.trim();
|
|
172
|
+
return trimmed === "~" || trimmed.startsWith("~/") || trimmed.startsWith("~\\");
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Expand a `~` / `~/...` input against {@link home}.
|
|
176
|
+
*
|
|
177
|
+
* Shared by every adapter that has a notion of "home", since each one differs
|
|
178
|
+
* only in what `home` is and how segments join: local disk passes
|
|
179
|
+
* `path.join`, Databricks passes a POSIX join under
|
|
180
|
+
* `/Workspace/Users/<user>`. Non-home inputs come back trimmed and unchanged.
|
|
181
|
+
*
|
|
182
|
+
* @param joinWith - Join the expanded remainder onto {@link home}. Defaults to
|
|
183
|
+
* POSIX {@link join}.
|
|
184
|
+
*/
|
|
185
|
+
export function expandHome(input, home, joinWith = join) {
|
|
186
|
+
const trimmed = input.trim();
|
|
187
|
+
if (!isHomeRelativePath(trimmed))
|
|
188
|
+
return trimmed;
|
|
189
|
+
if (!home.trim()) {
|
|
190
|
+
throw new TypeError("Home expansion requires a non-empty home directory");
|
|
191
|
+
}
|
|
192
|
+
const rest = stripLeadingSeparators(trimmed.slice(1));
|
|
193
|
+
return rest ? joinWith(home, rest) : home;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Drop a leading `~` and any leading separators, so an absolute-looking or
|
|
197
|
+
* home-relative input can be joined UNDER a base rather than replacing it.
|
|
198
|
+
*/
|
|
199
|
+
export function toRelativeSegment(input) {
|
|
200
|
+
const trimmed = input.trim();
|
|
201
|
+
if (!trimmed || trimmed === "." || trimmed === "./")
|
|
202
|
+
return "";
|
|
203
|
+
return stripLeadingSeparators(trimmed.replace(/^~(?=[/\\]|$)/, ""));
|
|
204
|
+
}
|
|
205
|
+
function stripLeadingSeparators(input) {
|
|
206
|
+
return input.replace(/^[\\/]+/, "");
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zaXgtcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3NpeC1wYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsa0NBQWtDO0FBQ2xDLE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBYTtJQUNuQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxNQUFNLENBQUMsU0FBaUIsRUFBRSxTQUFTLEdBQUcsR0FBRztJQUN2RCxJQUFJLFNBQVMsS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEUsbURBQW1EO0lBQ25ELE1BQU0sTUFBTSxHQUFHLCtCQUErQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELDBFQUEwRTtBQUMxRSxNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQWE7SUFDdEMsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNuQyxzQkFBc0I7SUFDdEIsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMs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QyxDQUFDLENBQUM7SUFDdEQsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUM1QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWE7SUFDN0MsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLEdBQUcsSUFBSSxPQUFPLEtBQUssSUFBSTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQy9ELE9BQU8sc0JBQXNCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxLQUFhO0lBQzNDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUE9TSVgtb25seSBwYXRoIGhlbHBlcnMgZm9yIHtAbGluayBCYXNlRmlsZVN5c3RlbX0gYW5kIGFkYXB0ZXJzLlxuICpcbiAqIFRoZSBwb3J0YWJsZSBmaWxlc3lzdGVtIG5hbWVzcGFjZSBhbHdheXMgdXNlcyBgL2Agc2VwYXJhdG9ycy4gSG9zdCBhZGFwdGVyc1xuICogY29udmVydCB3aXRoIHtAbGluayB0b1Bvc2l4fSAvIHtAbGluayB0b0hvc3R9IGF0IHRoZSBib3VuZGFyeTsgdGhleSBtdXN0IG5vdFxuICogbGVhayBgXFxgIGludG8gbmFtZXNwYWNlIHBhdGhzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG4vKiogUmVwbGFjZSBldmVyeSBgXFxgIHdpdGggYC9gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUG9zaXgoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBpbnB1dC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgUE9TSVggcGF0aCB0byBhIGhvc3Qgc2VwYXJhdG9yIHN0eWxlLlxuICpcbiAqIEBwYXJhbSBzZXBhcmF0b3IgLSBIb3N0IHNlcGFyYXRvciAoYHBhdGguc2VwYCBpbiBOb2RlKS4gRGVmYXVsdHMgdG8gYC9gXG4gKiAgIChuby1vcCksIHdoaWNoIGtlZXBzIHNoYXJlZCBjb2RlIGZyZWUgb2YgYHByb2Nlc3NgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Ib3N0KHBvc2l4UGF0aDogc3RyaW5nLCBzZXBhcmF0b3IgPSBcIi9cIik6IHN0cmluZyB7XG4gIGlmIChzZXBhcmF0b3IgPT09IFwiL1wiIHx8IHNlcGFyYXRvci5sZW5ndGggPT09IDApIHJldHVybiBwb3NpeFBhdGg7XG4gIC8vIFByZXNlcnZlIHNjaGVtZSByb290cyBzdWNoIGFzIGBzMzovL2J1Y2tldC9rZXlgLlxuICBjb25zdCBzY2hlbWUgPSAvXlthLXpBLVpdW2EtekEtWjAtOSsuLV0qOlxcL1xcLy8uZXhlYyhwb3NpeFBhdGgpO1xuICBpZiAoc2NoZW1lKSB7XG4gICAgY29uc3QgcHJlZml4ID0gc2NoZW1lWzBdO1xuICAgIHJldHVybiBwcmVmaXggKyBwb3NpeFBhdGguc2xpY2UocHJlZml4Lmxlbmd0aCkucmVwbGFjZSgvXFwvL2csIHNlcGFyYXRvcik7XG4gIH1cbiAgcmV0dXJuIHBvc2l4UGF0aC5yZXBsYWNlKC9cXC8vZywgc2VwYXJhdG9yKTtcbn1cblxuLyoqIFRydWUgd2hlbiB7QGxpbmsgaW5wdXR9IGlzIGFuIGFic29sdXRlIFBPU0lYIG9yIFdpbmRvd3MtZHJpdmUgcGF0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Fic29sdXRlKGlucHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcCA9IHRvUG9zaXgoaW5wdXQpO1xuICBpZiAocC5zdGFydHNXaXRoKFwiL1wiKSkgcmV0dXJuIHRydWU7XG4gIC8vIGBDOi8uLi5gIGRyaXZlIHBhdGhcbiAgaWYgKC9eW0EtWmEtel06XFwvLy50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgLy8gYHNjaGVtZTovLy4uLmBcbiAgaWYgKC9eW2EtekEtWl1bYS16QS1aMC05Ky4tXSo6XFwvXFwvLy50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIGZpbGVzeXN0ZW0gcm9vdCBmb3Igc3RvcmFnZSBvbiB7QGxpbmsgQmFzZUZpbGVTeXN0ZW0ucm9vdH0uXG4gKlxuICogQ29udmVydHMgdG8gUE9TSVgsIHRyaW1zLCBhbmQgc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMgd2hpbGUgcHJlc2VydmluZ1xuICogYC9gLCBXaW5kb3dzIGRyaXZlIHJvb3RzIChgQzovYCksIGFuZCBVUkwtbGlrZSBzY2hlbWUgcm9vdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSb290KHJvb3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWQgPSB0b1Bvc2l4KHJvb3QudHJpbSgpKTtcbiAgaWYgKCF0cmltbWVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZpbGVzeXN0ZW0gcm9vdCBjYW5ub3QgYmUgZW1wdHlcIik7XG4gIH1cblxuICBjb25zdCBzY2hlbWUgPSAvXihbYS16QS1aXVthLXpBLVowLTkrLi1dKjpcXC9cXC8pKC4qKSQvLmV4ZWModHJpbW1lZCk7XG4gIGlmIChzY2hlbWUpIHtcbiAgICBjb25zdCBbLCBwcmVmaXgsIHJlc3RdID0gc2NoZW1lO1xuICAgIGlmICghcmVzdCkgcmV0dXJuIHRyaW1tZWQ7IC8vIGJhcmUgYHMzOi8vYFxuICAgIHJldHVybiBwcmVmaXggKyByZXN0LnJlcGxhY2UoL1xcLyskLywgXCJcIik7XG4gIH1cblxuICBpZiAodHJpbW1lZCA9PT0gXCIvXCIpIHJldHVybiBcIi9cIjtcbiAgaWYgKC9eW0EtWmEtel06XFwvJC8udGVzdCh0cmltbWVkKSkgcmV0dXJuIHRyaW1tZWQ7XG4gIGlmICgvXltBLVphLXpdOlxcLy8udGVzdCh0cmltbWVkKSkgcmV0dXJuIHRyaW1tZWQucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgcmV0dXJuIHRyaW1tZWQucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbn1cblxuLyoqXG4gKiBKb2luIHBhdGggc2VnbWVudHMgdXNpbmcgYC9gLlxuICpcbiAqIEFic29sdXRlIHNlZ21lbnRzIChzZWUge0BsaW5rIGlzQWJzb2x1dGV9KSByZXNldCB0aGUgcmVzdWx0LiBFbXB0eSBzZWdtZW50c1xuICogYW5kIGAuYCBhcmUgc2tpcHBlZC4gRG9lcyBub3QgcmVzb2x2ZSBgLi5gOyB1c2Uge0BsaW5rIG5vcm1hbGl6ZX0gZm9yIHRoYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2luKC4uLnBhcnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHJldHVybiBcIi5cIjtcblxuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgY29uc3Qgc2VnbWVudCA9IHRvUG9zaXgocGFydCk7XG4gICAgaWYgKCFzZWdtZW50IHx8IHNlZ21lbnQgPT09IFwiLlwiKSBjb250aW51ZTtcblxuICAgIGlmIChpc0Fic29sdXRlKHNlZ21lbnQpKSB7XG4gICAgICByZXN1bHQgPSBzZWdtZW50O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0LmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgcmVzdWx0ICs9IHNlZ21lbnQucmVwbGFjZSgvXlxcLysvLCBcIlwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ICs9IGAvJHtzZWdtZW50LnJlcGxhY2UoL15cXC8rLywgXCJcIil9YDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0IHx8IFwiLlwiO1xufVxuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVSZXN1bHQgPVxuICB7IHJlYWRvbmx5IG9rOiB0cnVlOyByZWFkb25seSBwYXRoOiBzdHJpbmcgfSB8IHsgcmVhZG9ubHkgb2s6IGZhbHNlOyByZWFkb25seSBlc2NhcGU6IHRydWUgfTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYSBmaWxlc3lzdGVtLXJlbGF0aXZlIHBhdGggaW50byBhIHJvb3RlZCBQT1NJWCBuYW1lc3BhY2UgcGF0aFxuICogKGAvYS9iYCkuIFJlc29sdmVzIGAuYCBhbmQgYC4uYC4gUmV0dXJucyBgeyBlc2NhcGU6IHRydWUgfWAgd2hlbiBgLi5gXG4gKiB3b3VsZCBsZWF2ZSB0aGUgcm9vdC5cbiAqXG4gKiBCYWNrc2xhc2hlcyBhcmUgY29udmVydGVkIHZpYSB7QGxpbmsgdG9Qb3NpeH0uIE51bGwgYnl0ZXMgYXJlIHJlamVjdGVkIGJ5XG4gKiBjYWxsZXJzIHRoYXQgd3JhcCB0aGlzIGluIGEge0BsaW5rIEZpbGVTeXN0ZW1FcnJvcn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoaW5wdXRQYXRoOiBzdHJpbmcpOiBOb3JtYWxpemVSZXN1bHQge1xuICBjb25zdCBwID0gdG9Qb3NpeChpbnB1dFBhdGgpO1xuICBjb25zdCBzZWdtZW50czogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgcC5zcGxpdChcIi9cIikpIHtcbiAgICBpZiAoIXNlZ21lbnQgfHwgc2VnbWVudCA9PT0gXCIuXCIpIGNvbnRpbnVlO1xuICAgIGlmIChzZWdtZW50ID09PSBcIi4uXCIpIHtcbiAgICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB7IG9rOiBmYWxzZSwgZXNjYXBlOiB0cnVlIH07XG4gICAgICBzZWdtZW50cy5wb3AoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBzZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICB9XG5cbiAgcmV0dXJuIHsgb2s6IHRydWUsIHBhdGg6IGAvJHtzZWdtZW50cy5qb2luKFwiL1wiKX1gIH07XG59XG5cbi8qKiBQYXJlbnQgZGlyZWN0b3J5IG9mIGEgUE9TSVggcGF0aCAoYC9gIGZvciB0aGUgcm9vdCkuICovXG5leHBvcnQgZnVuY3Rpb24gZGlybmFtZShpbnB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHAgPSB0b1Bvc2l4KGlucHV0UGF0aCk7XG4gIGlmIChwID09PSBcIi9cIiB8fCAvXltBLVphLXpdOlxcLyQvLnRlc3QocCkpIHJldHVybiBwO1xuXG4gIGNvbnN0IHRyaW1tZWQgPSBwLnJlcGxhY2UoL1xcLyskLywgXCJcIikgfHwgXCIvXCI7XG4gIGNvbnN0IHNsYXNoID0gdHJpbW1lZC5sYXN0SW5kZXhPZihcIi9cIik7XG4gIGlmIChzbGFzaCA8PSAwKSB7XG4gICAgaWYgKC9eW0EtWmEtel06XFwvLy50ZXN0KHRyaW1tZWQpKSByZXR1cm4gYCR7dHJpbW1lZC5zbGljZSgwLCAyKX0vYDtcbiAgICByZXR1cm4gXCIvXCI7XG4gIH1cbiAgaWYgKHNsYXNoID09PSAyICYmIC9eW0EtWmEtel06XFwvLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgcmV0dXJuIHRyaW1tZWQuc2xpY2UoMCwgMyk7IC8vIGBDOi9gXG4gIH1cbiAgcmV0dXJuIHRyaW1tZWQuc2xpY2UoMCwgc2xhc2gpIHx8IFwiL1wiO1xufVxuXG4vKiogRmluYWwgc2VnbWVudCBvZiBhIFBPU0lYIHBhdGguICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZW5hbWUoaW5wdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwID0gdG9Qb3NpeChpbnB1dFBhdGgpLnJlcGxhY2UoL1xcLyskLywgXCJcIik7XG4gIGlmICghcCB8fCBwID09PSBcIi9cIikgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IHNsYXNoID0gcC5sYXN0SW5kZXhPZihcIi9cIik7XG4gIHJldHVybiBzbGFzaCA8IDAgPyBwIDogcC5zbGljZShzbGFzaCArIDEpO1xufVxuXG4vKipcbiAqIFJlbGF0aXZlIFBPU0lYIHBhdGggZnJvbSB7QGxpbmsgZnJvbX0gdG8ge0BsaW5rIHRvfSwgYm90aCBhYnNvbHV0ZS5cbiAqIFJldHVybnMgdW5kZWZpbmVkIHdoZW4ge0BsaW5rIHRvfSBpcyBvdXRzaWRlIHtAbGluayBmcm9tfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlKGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZyb21Ob3JtID0gbm9ybWFsaXplUm9vdChmcm9tKTtcbiAgY29uc3QgdG9Ob3JtID0gdG9Qb3NpeCh0bykucmVwbGFjZSgvXFwvKyQvLCBcIlwiKSB8fCB0b1Bvc2l4KHRvKTtcblxuICBpZiAodG9Ob3JtID09PSBmcm9tTm9ybSkgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IHByZWZpeCA9IGZyb21Ob3JtLmVuZHNXaXRoKFwiL1wiKSA/IGZyb21Ob3JtIDogYCR7ZnJvbU5vcm19L2A7XG4gIGlmICghdG9Ob3JtLnN0YXJ0c1dpdGgocHJlZml4KSAmJiB0b05vcm0gIT09IGZyb21Ob3JtKSB7XG4gICAgLy8gQ2FzZS1mb2xkaW5nIG5vdCBhcHBsaWVkOyBhZGFwdGVycyB0aGF0IG5lZWQgaXQgc2hvdWxkIG5vcm1hbGl6ZSBmaXJzdC5cbiAgICBpZiAoZnJvbU5vcm0gPT09IFwiL1wiKSB7XG4gICAgICByZXR1cm4gdG9Ob3JtLnN0YXJ0c1dpdGgoXCIvXCIpID8gdG9Ob3JtLnNsaWNlKDEpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB0b05vcm0uc2xpY2UocHJlZml4Lmxlbmd0aCk7XG59XG5cbi8qKiBXaGV0aGVyIHtAbGluayBjYW5kaWRhdGV9IGlzIHtAbGluayByb290fSBvciBhIGRlc2NlbmRhbnQgKFBPU0lYIGxleGljYWwpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2l0aGluUm9vdChyb290OiBzdHJpbmcsIGNhbmRpZGF0ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZWxhdGl2ZShyb290LCBjYW5kaWRhdGUpICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKiBUcnVlIHdoZW4ge0BsaW5rIGlucHV0fSBpcyBgfmAgb3IgYSBwYXRoIHVuZGVyIGB+L2AgKG9yIGB+XFxgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0hvbWVSZWxhdGl2ZVBhdGgoaW5wdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0cmltbWVkID0gaW5wdXQudHJpbSgpO1xuICByZXR1cm4gdHJpbW1lZCA9PT0gXCJ+XCIgfHwgdHJpbW1lZC5zdGFydHNXaXRoKFwifi9cIikgfHwgdHJpbW1lZC5zdGFydHNXaXRoKFwiflxcXFxcIik7XG59XG5cbi8qKlxuICogRXhwYW5kIGEgYH5gIC8gYH4vLi4uYCBpbnB1dCBhZ2FpbnN0IHtAbGluayBob21lfS5cbiAqXG4gKiBTaGFyZWQgYnkgZXZlcnkgYWRhcHRlciB0aGF0IGhhcyBhIG5vdGlvbiBvZiBcImhvbWVcIiwgc2luY2UgZWFjaCBvbmUgZGlmZmVyc1xuICogb25seSBpbiB3aGF0IGBob21lYCBpcyBhbmQgaG93IHNlZ21lbnRzIGpvaW46IGxvY2FsIGRpc2sgcGFzc2VzXG4gKiBgcGF0aC5qb2luYCwgRGF0YWJyaWNrcyBwYXNzZXMgYSBQT1NJWCBqb2luIHVuZGVyXG4gKiBgL1dvcmtzcGFjZS9Vc2Vycy88dXNlcj5gLiBOb24taG9tZSBpbnB1dHMgY29tZSBiYWNrIHRyaW1tZWQgYW5kIHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0gam9pbldpdGggLSBKb2luIHRoZSBleHBhbmRlZCByZW1haW5kZXIgb250byB7QGxpbmsgaG9tZX0uIERlZmF1bHRzIHRvXG4gKiAgIFBPU0lYIHtAbGluayBqb2lufS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZEhvbWUoXG4gIGlucHV0OiBzdHJpbmcsXG4gIGhvbWU6IHN0cmluZyxcbiAgam9pbldpdGg6IChob21lOiBzdHJpbmcsIHJlc3Q6IHN0cmluZykgPT4gc3RyaW5nID0gam9pbixcbik6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWQgPSBpbnB1dC50cmltKCk7XG4gIGlmICghaXNIb21lUmVsYXRpdmVQYXRoKHRyaW1tZWQpKSByZXR1cm4gdHJpbW1lZDtcbiAgaWYgKCFob21lLnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJIb21lIGV4cGFuc2lvbiByZXF1aXJlcyBhIG5vbi1lbXB0eSBob21lIGRpcmVjdG9yeVwiKTtcbiAgfVxuICBjb25zdCByZXN0ID0gc3RyaXBMZWFkaW5nU2VwYXJhdG9ycyh0cmltbWVkLnNsaWNlKDEpKTtcbiAgcmV0dXJuIHJlc3QgPyBqb2luV2l0aChob21lLCByZXN0KSA6IGhvbWU7XG59XG5cbi8qKlxuICogRHJvcCBhIGxlYWRpbmcgYH5gIGFuZCBhbnkgbGVhZGluZyBzZXBhcmF0b3JzLCBzbyBhbiBhYnNvbHV0ZS1sb29raW5nIG9yXG4gKiBob21lLXJlbGF0aXZlIGlucHV0IGNhbiBiZSBqb2luZWQgVU5ERVIgYSBiYXNlIHJhdGhlciB0aGFuIHJlcGxhY2luZyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUmVsYXRpdmVTZWdtZW50KGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gaW5wdXQudHJpbSgpO1xuICBpZiAoIXRyaW1tZWQgfHwgdHJpbW1lZCA9PT0gXCIuXCIgfHwgdHJpbW1lZCA9PT0gXCIuL1wiKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIHN0cmlwTGVhZGluZ1NlcGFyYXRvcnModHJpbW1lZC5yZXBsYWNlKC9efig/PVsvXFxcXF18JCkvLCBcIlwiKSk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwTGVhZGluZ1NlcGFyYXRvcnMoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBpbnB1dC5yZXBsYWNlKC9eW1xcXFwvXSsvLCBcIlwiKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["../src/base-fs.ts","../src/fs.ts","../src/memory-fs.ts","../src/posix-path.ts","../index.ts"],"version":"5.9.3"}
|