{"version":3,"file":"file.mjs","names":["nodePath"],"sources":["../../../../../../../@warlock.js/fs/src/facade/file.ts"],"sourcesContent":["import nodePath from \"node:path\";\nimport { files } from \"./files\";\nimport { Directory } from \"./directory\";\nimport type { HashAlgorithm } from \"../hash\";\nimport type {\n  CopyOptions,\n  FileStats,\n  MergeJsonOptions,\n  MoveOptions,\n  ReadJsonOptions,\n  ReadOptions,\n  WriteJsonOptions,\n  WriteOptions,\n} from \"./options\";\n\nfunction dirPathOf(dir: string | Directory): string {\n  return typeof dir === \"string\" ? dir : dir.path;\n}\n\n/**\n * A lazy, **immutable** handle to a file path. The constructor does zero IO;\n * path helpers (`name`/`extension`/`basename`/`parent`) are pure `node:path`.\n * `copy`/`move`/`copyTo`/`moveTo`/`rename` return a NEW handle to the\n * destination and never mutate `this.path`.\n *\n * @example\n * const pkg = fs.file(\"package.json\");\n * await pkg.editJson<Pkg>((p) => ({ ...p, version: \"4.7.0\" }));\n * pkg.extension; // \".json\"\n */\nexport class File {\n  public constructor(public readonly path: string) {}\n\n  /** Basename including extension (`\"user.model.ts\"`). */\n  public get name(): string {\n    return nodePath.basename(this.path);\n  }\n\n  /** Basename without extension (`\"user.model\"`). */\n  public get basename(): string {\n    return nodePath.basename(this.path, nodePath.extname(this.path));\n  }\n\n  /** Extension including the dot (`\".ts\"`), or `\"\"` when there is none. */\n  public get extension(): string {\n    return nodePath.extname(this.path);\n  }\n\n  /** Handle to the parent directory (pure path — no IO). */\n  public parent(): Directory {\n    return new Directory(nodePath.dirname(this.path));\n  }\n\n  public get(): Promise<string>;\n  public get(options: ReadOptions & { encoding: null }): Promise<Buffer>;\n  public get(options: ReadOptions): Promise<string | Buffer>;\n  public get(options?: ReadOptions): Promise<string | Buffer> {\n    return files.get(this.path, (options ?? {}) as ReadOptions);\n  }\n\n  public getJson<T = unknown>(options?: ReadJsonOptions<T>): Promise<T> {\n    return files.getJson<T>(this.path, options);\n  }\n\n  public put(content: string | Buffer, options?: WriteOptions): Promise<void> {\n    return files.put(this.path, content, options);\n  }\n\n  public putJson(value: unknown, options?: WriteJsonOptions): Promise<void> {\n    return files.putJson(this.path, value, options);\n  }\n\n  public append(content: string | Buffer, options?: WriteOptions): Promise<void> {\n    return files.append(this.path, content, options);\n  }\n\n  public prepend(content: string | Buffer, options?: WriteOptions): Promise<void> {\n    return files.prepend(this.path, content, options);\n  }\n\n  public appendJsonLine(value: unknown): Promise<void> {\n    return files.appendJsonLine(this.path, value);\n  }\n\n  public edit(editor: (content: string) => string | Promise<string>): Promise<void> {\n    return files.edit(this.path, editor);\n  }\n\n  public editJson<T = unknown>(\n    editor: (value: T) => T | Promise<T>,\n    options?: WriteJsonOptions,\n  ): Promise<void> {\n    return files.editJson<T>(this.path, editor, options);\n  }\n\n  public mergeJson<T = Record<string, unknown>>(\n    partial: Partial<T>,\n    options?: MergeJsonOptions,\n  ): Promise<void> {\n    return files.mergeJson<T>(this.path, partial, options);\n  }\n\n  public exists(): Promise<boolean> {\n    return files.exists(this.path);\n  }\n\n  public isEmpty(): Promise<boolean> {\n    return files.isEmpty(this.path);\n  }\n\n  public ensure(): Promise<void> {\n    return files.ensure(this.path);\n  }\n\n  public touch(): Promise<void> {\n    return files.touch(this.path);\n  }\n\n  public remove(): Promise<void> {\n    return files.remove(this.path);\n  }\n\n  public async copy(to: string, options?: CopyOptions): Promise<File> {\n    await files.copy(this.path, to, options);\n    return new File(to);\n  }\n\n  /** Copy into a directory, keeping this file's name. */\n  public async copyTo(dir: string | Directory, options?: CopyOptions): Promise<File> {\n    const target = nodePath.join(dirPathOf(dir), this.name);\n    await files.copy(this.path, target, options);\n    return new File(target);\n  }\n\n  public async move(to: string, options?: MoveOptions): Promise<File> {\n    await files.move(this.path, to, options);\n    return new File(to);\n  }\n\n  /** Move into a directory, keeping this file's name. */\n  public async moveTo(dir: string | Directory, options?: MoveOptions): Promise<File> {\n    const target = nodePath.join(dirPathOf(dir), this.name);\n    await files.move(this.path, target, options);\n    return new File(target);\n  }\n\n  /** Rename within the same parent directory. */\n  public async rename(newName: string, options?: MoveOptions): Promise<File> {\n    const target = nodePath.join(nodePath.dirname(this.path), newName);\n    await files.move(this.path, target, options);\n    return new File(target);\n  }\n\n  public stats(): Promise<FileStats> {\n    return files.stats(this.path);\n  }\n\n  public size(): Promise<number> {\n    return files.size(this.path);\n  }\n\n  public lastModified(): Promise<Date> {\n    return files.lastModified(this.path);\n  }\n\n  public hash(algorithm?: HashAlgorithm): Promise<string> {\n    return files.hash(this.path, algorithm);\n  }\n\n  public readLines(): AsyncIterable<string> {\n    return files.readLines(this.path);\n  }\n}\n"],"mappings":"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"}