blob: 0d5deb1c15fe36fc76b78eabca14f4b59d7c3bba [file] [log] [blame]
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import { UpdateRecorder } from './update-recorder';
/**
* A workspace path semantically is equivalent to the `Path` type provided by the
* Angular devkit. Paths denoted with such a type are guaranteed to be representing
* paths of a given virtual file system. This means that the root of a path can be
* different, and does not necessarily need to match the root in the real file system.
*
* For example: Consider we have a project in `/home/<..>/my-project`. Then a path
* like `/package.json` could actually refer to the `package.json` file in `my-project`.
* Note that in the real file system this would not match though.
*
* One wonder why another type has been declared for such paths, when there already
* is the `Path` type provided by the devkit. We do this for a couple of reasons:
*
* 1. The update-tool cannot have a dependency on the Angular devkit as that one
* is not synced into g3. We want to be able to run migrations in g3 if needed.
*/
export declare type WorkspacePath = string & {
__PRIVATE_DEVKIT_PATH: void;
};
/** Interface that describes a directory. */
export interface DirectoryEntry {
/** List of directories inside the directory. */
directories: string[];
/** List of files inside the directory. */
files: string[];
}
/**
* Abstraction of the file system that migrations can use to record and apply
* changes. This is necessary to support virtual file systems as used in the CLI devkit.
*/
export declare abstract class FileSystem {
/** Checks whether the given file or directory exists. */
abstract exists(path: WorkspacePath): boolean;
/** Gets the contents of the given file. */
abstract read(filePath: WorkspacePath): string | null;
/** Reads the given directory to retrieve children. */
abstract readDirectory(dirPath: WorkspacePath): DirectoryEntry;
/**
* Creates an update recorder for the given file. Edits can be recorded and
* committed in batches. Changes are not applied automatically because otherwise
* migrations would need to re-read files, or account for shifted file contents.
*/
abstract edit(filePath: WorkspacePath): UpdateRecorder;
/** Applies all changes which have been recorded in update recorders. */
abstract commitEdits(): void;
/** Creates a new file with the given content. */
abstract create(filePath: WorkspacePath, content: string): void;
/** Overwrites an existing file with the given content. */
abstract overwrite(filePath: WorkspacePath, content: string): void;
/** Deletes the given file. */
abstract delete(filePath: WorkspacePath): void;
/**
* Resolves given paths to a resolved path in the file system. For example, the devkit
* tree considers the actual workspace directory as file system root.
*
* Follows the same semantics as the native path `resolve` method. i.e. segments
* are processed in reverse. The last segment is considered the target and the
* function will iterate from the target through other segments until it finds an
* absolute path segment.
*/
abstract resolve(...segments: string[]): WorkspacePath;
}