{
  "version": 3,
  "sources": ["../Source/FileSystem/index.ts", "../Source/FileSystem/FileSystem.ts", "../Source/FileSystem/Effect/index.ts", "../Source/FileSystem/Effect/FileSystem.Effect.ts", "../Source/FileSystem/Module/index.ts", "../Source/FileSystem/Module/Extension.ts", "../Source/String/String.ts", "../Source/FileSystem/Module/Module.ts"],
  "sourcesContent": ["/**\n * Utilities for working with files and directories.\n *\n * @module @sorrell/utilities/fs\n */\n/**\n * @file      index.ts\n * @author    Gage Sorrell <gage@sorrell.sh>\n * @copyright (c) 2026 Gage Sorrell\n * @license   MIT\n */\nexport * from \"./FileSystem.ts\";\nexport * from \"./FileSystem.Types.ts\";\nexport * as Effect from \"./Effect/index.ts\";\nexport * as Module from \"./Module/index.ts\";\n", "/**\n * @file      FileSystem.ts\n * @author    Gage Sorrell <gage@sorrell.sh>\n * @copyright (c) 2026 Gage Sorrell\n * @license   MIT\n */\n// @TODO TEMPORARY\n/* eslint-disable jsdoc/require-jsdoc */\nimport * as FileSystem from \"node:fs/promises\";\nimport * as Path from \"node:path\";\nimport type { Dirent, Stats } from \"node:fs\";\nimport { basename, dirname, extname, join } from \"path\";\nimport { type FFileExtension } from \"./FileSystem.Types.ts\";\nimport { type FileHandle } from \"fs/promises\";\nimport { promises as Fs } from \"fs\";\nimport { constants as FsConstants } from \"fs\";\nimport os from \"os\";\n/* eslint-disable jsdoc/require-example */\n/**\n * Determine whether an object exists at the given {@link Path}.\n *\n * @param Path - The path to check for the existence of an object within the current file system.\n * @returns {Promise<boolean>} Whether there is an object at the given {@link Path}.\n */\nasync function PathExists(Path: string): Promise<boolean> {\n    try {\n        await Fs.access(Path, FsConstants.F_OK);\n        return true;\n    }\n    catch {\n        return false;\n    }\n}\n/**\n * Determine whether the given {@link Extension | file extension} is valid on the current platform.\n *\n * @param Extension - The {@link FFileExtension | file extension} to test.\n * @returns {boolean} Whether the file extension is valid on the current platform.\n */\nexport function IsSupportedFileExtension(Extension: FFileExtension): boolean {\n    let NormalizedExtension: string = Extension.slice(1);\n    if (NormalizedExtension.startsWith(\".\")) {\n        NormalizedExtension = NormalizedExtension.slice(1);\n    }\n    if (NormalizedExtension.length === 0) {\n        return false;\n    }\n    if (NormalizedExtension.includes(\"/\")\n        || NormalizedExtension.includes(\"\\\\\")\n        || NormalizedExtension.includes(\"\\0\")) {\n        return false;\n    }\n    if (os.platform() === \"win32\") {\n        /* eslint-disable-next-line no-control-regex */\n        const HasIllegalCharacters: boolean = /[<>:\"/\\\\|?*\\x00-\\x1F]/u.test(NormalizedExtension);\n        if (HasIllegalCharacters) {\n            return false;\n        }\n        if (/[ .]$/u.test(NormalizedExtension)) {\n            return false;\n        }\n    }\n    return true;\n}\n/**\n * Given a path at which we wish to create a new file, check if a file at that\n * path already exists, and if so, then append `(${ number })` before the file\n * extension, consistent with the Windows Explorer handles conflicting file\n * names when pasting files.\n *\n * @param InPath - The path from which a safe path is derived.\n *\n * @returns {Promise<string>} The path derived from the given {@link InPath | path}\n * at which no object yet exists.\n */\nexport async function GetSafeNewPath(InPath: string): Promise<string> {\n    const DirectoryPath: string = dirname(InPath);\n    const Extension: string = extname(InPath);\n    const FileName: string = basename(InPath);\n    const BaseFileName: string = Extension === \"\"\n        ? FileName\n        : basename(InPath, Extension);\n    let CandidatePath: string = InPath;\n    let Index: number = 1;\n    while (await PathExists(CandidatePath)) {\n        const CandidateFileName: string = `${BaseFileName} (${Index})${Extension}`;\n        CandidatePath = join(DirectoryPath, CandidateFileName);\n        Index++;\n    }\n    return CandidatePath;\n}\n/* eslint-disable-next-line @typescript-eslint/typedef */\nexport const ReservedWindowsFileNames = [\n    \"CON\",\n    \"PRN\",\n    \"AUX\",\n    \"NUL\",\n    \"COM1\",\n    \"COM2\",\n    \"COM3\",\n    \"COM4\",\n    \"COM5\",\n    \"COM6\",\n    \"COM7\",\n    \"COM8\",\n    \"COM9\",\n    \"LPT1\",\n    \"LPT2\",\n    \"LPT3\",\n    \"LPT4\",\n    \"LPT5\",\n    \"LPT6\",\n    \"LPT7\",\n    \"LPT8\",\n    \"LPT9\"\n] as const;\n/* eslint-disable no-control-regex */\nexport /** A regular expression describing the characters that are not permitted in file names. */ const InvalidCharacters: RegExp = /[<>:\"/\\\\|?*\\u0000-\\u001F]/u;\n/* eslint-enable no-control-regex */\n/**\n * Determines whether the given {@link FileName} is valid within the given {@link DirectoryPath}.\n *\n * @remarks This *does* attempt to create a file at the desired path.  The file is\n * temporary iff `!PersistNewFile`, and is never created when this function\n * returns `false`.\n *\n * @param DirectoryPath - The path to the directory in which you wish to check.\n * @param FileName - The desired file name.\n * @param PersistNewFile - If specified, whether to keep the otherwise-temporary file\n * created at the desired path.  This defaults to `false`.\n * @param Extension - If provided, the function will only return `true` if\n * `FileName.endsWith(Extension)` *and* the `Extension` is a valid file extension.\n *\n * @returns {Promise<boolean>} Whether a file of the given `FileName` can be created in `DirectoryPath`.\n */\nexport async function IsValidFileNameOnSystem(DirectoryPath: string, FileName: string, PersistNewFile: boolean = false, Extension: FFileExtension | undefined = undefined): Promise<boolean> {\n    const ExtensionSafe: FFileExtension | null | \"\" = Extension !== undefined\n        ? (Extension.startsWith(\".\") && IsSupportedFileExtension(Extension))\n            ? Extension\n            : null\n        : \"\";\n    const IsExtensionImproper: boolean = (ExtensionSafe === null ||\n        ExtensionSafe === \".\" ||\n        !FileName.endsWith(ExtensionSafe));\n    if (IsExtensionImproper) {\n        return false;\n    }\n    const FilePath: string = join(DirectoryPath, FileName);\n    try {\n        const ThisFileHandle: FileHandle = await Fs.open(FilePath, \"wx\");\n        await ThisFileHandle.close();\n        if (!PersistNewFile) {\n            await Fs.unlink(FilePath);\n        }\n        return true;\n    }\n    catch {\n        return false;\n    }\n}\n/**\n * Write a text file to a given {@link Path} having contents {@link Contents}.\n *\n * @param Path - The path of the file that will be written.\n * @param Contents - The text contents of the file to write.\n *\n * @returns {Promise<void>} A {@link Promise} that resolves when the call to {@link Fs.writeFile} resolves.\n *\n * @example\n * ```typescript\n * import { WriteTextFile } from \"@sorrell/utilities/fs\";\n * import { resolve } from \"path\";\n *\n * const MyReadMe: string = \"# ReadMe\\n\\nThis package accomplishes...\\n\";\n * const MyReadMePath: string = resolve(\".\");\n *\n * await WriteTextFile(MyReadMePath, MyReadMe);\n * ```\n */\nexport async function WriteTextFile(Path: string, Contents: string): Promise<void> {\n    await Fs.writeFile(Path, Contents, { encoding: \"utf-8\" });\n}\ntype DeletePhase = \"Scanning\" | \"Deleting\" | \"Done\";\ntype DeleteEntryKind = \"File\" | \"Directory\" | \"Other\";\ntype DeleteEntry = {\n    EntryPath: string;\n    Kind: DeleteEntryKind;\n    Size: number;\n};\ntype DeleteProgress = {\n    Phase: DeletePhase;\n    CurrentPath: string | null;\n    DiscoveredEntries: number;\n    TotalEntries: number;\n    DeletedEntries: number;\n    TotalBytes: number;\n    DeletedBytes: number;\n};\ntype DeleteWithProgressOptions = {\n    OnProgress?: (Progress: DeleteProgress) => void;\n    Signal?: AbortSignal;\n};\nfunction IsMissingFileError(ErrorValue: unknown): boolean {\n    return (typeof ErrorValue === \"object\" &&\n        ErrorValue !== null &&\n        \"code\" in ErrorValue &&\n        ErrorValue.code === \"ENOENT\");\n}\nfunction CloneProgress(Progress: DeleteProgress): DeleteProgress {\n    return { ...Progress };\n}\nasync function BuildDeletionPlan(RootPath: string, Progress: DeleteProgress, Options: DeleteWithProgressOptions): Promise<Array<DeleteEntry>> {\n    const Entries: Array<DeleteEntry> = [];\n    /* eslint-disable-next-line jsdoc/require-jsdoc */\n    async function Visit(CurrentPath: string): Promise<void> {\n        Options.Signal?.throwIfAborted();\n        Progress.Phase = \"Scanning\";\n        Progress.CurrentPath = CurrentPath;\n        Options.OnProgress?.(CloneProgress(Progress));\n        let Stats: Stats;\n        try {\n            Stats = await FileSystem.lstat(CurrentPath);\n        }\n        catch (ErrorValue) {\n            if (IsMissingFileError(ErrorValue)) {\n                return;\n            }\n            throw ErrorValue;\n        }\n        if (Stats.isDirectory()) {\n            const Children: Array<Dirent<string>> = await FileSystem.readdir(CurrentPath, {\n                withFileTypes: true\n            });\n            for (const Child of Children) {\n                await Visit(Path.join(CurrentPath, Child.name));\n            }\n            Entries.push({\n                EntryPath: CurrentPath,\n                Kind: \"Directory\",\n                Size: 0\n            });\n        }\n        else {\n            const Size: number = Stats.isFile() ? Stats.size : 0;\n            Entries.push({\n                EntryPath: CurrentPath,\n                Kind: Stats.isFile() ? \"File\" : \"Other\",\n                Size\n            });\n            Progress.TotalBytes += Size;\n        }\n        Progress.DiscoveredEntries = Entries.length;\n        Options.OnProgress?.(CloneProgress(Progress));\n    }\n    await Visit(RootPath);\n    return Entries;\n}\nexport async function DeleteWithProgress(RootPath: string, Options: DeleteWithProgressOptions = {}): Promise<void> {\n    const Progress: DeleteProgress = {\n        CurrentPath: null,\n        DeletedBytes: 0,\n        DeletedEntries: 0,\n        DiscoveredEntries: 0,\n        Phase: \"Scanning\",\n        TotalBytes: 0,\n        TotalEntries: 0\n    };\n    const Entries: Array<DeleteEntry> = await BuildDeletionPlan(RootPath, Progress, Options);\n    Progress.Phase = \"Deleting\";\n    Progress.TotalEntries = Entries.length;\n    Progress.CurrentPath = null;\n    Options.OnProgress?.(CloneProgress(Progress));\n    for (const Entry of Entries) {\n        Options.Signal?.throwIfAborted();\n        Progress.CurrentPath = Entry.EntryPath;\n        Options.OnProgress?.(CloneProgress(Progress));\n        try {\n            if (Entry.Kind === \"Directory\") {\n                await FileSystem.rmdir(Entry.EntryPath);\n            }\n            else {\n                await FileSystem.unlink(Entry.EntryPath);\n            }\n        }\n        catch (ErrorValue) {\n            if (!IsMissingFileError(ErrorValue)) {\n                throw ErrorValue;\n            }\n        }\n        Progress.DeletedEntries += 1;\n        Progress.DeletedBytes += Entry.Size;\n        Options.OnProgress?.(CloneProgress(Progress));\n    }\n    Progress.Phase = \"Done\";\n    Progress.CurrentPath = null;\n    Options.OnProgress?.(CloneProgress(Progress));\n}\nconst TsJsExtensions: Set<string> = new Set([\n    \".ts\",\n    \".tsx\",\n    \".mts\",\n    \".cts\",\n    \".js\",\n    \".jsx\",\n    \".mjs\",\n    \".cjs\"\n]);\nexport function IsValidFileSubpath(DirectoryPath: string, FilePath: string): boolean {\n    if (IsValidDirectoryPath(DirectoryPath) === false) {\n        return false;\n    }\n    if (IsValidExtensionlessFilePath(FilePath) === false) {\n        return false;\n    }\n    if (Path.isAbsolute(FilePath) === false) {\n        return true;\n    }\n    return IsPathContainedUnderDirectory(DirectoryPath, FilePath);\n}\n;\nconst IsValidDirectoryPath = (DirectoryPath: string): boolean => {\n    if (DirectoryPath.trim() === \"\") {\n        return false;\n    }\n    const NormalizedDirectoryPath: string = Path.normalize(DirectoryPath);\n    const DirectoryBaseName: string = Path.basename(NormalizedDirectoryPath);\n    return IsValidPathSegment(DirectoryBaseName);\n};\nconst IsValidExtensionlessFilePath = (FilePath: string): boolean => {\n    if (FilePath.trim() === \"\") {\n        return false;\n    }\n    const NormalizedFilePath: string = Path.normalize(FilePath);\n    if (NormalizedFilePath.endsWith(Path.sep)) {\n        return false;\n    }\n    const FileName: string = Path.basename(NormalizedFilePath);\n    if (IsValidFileName(FileName) === false) {\n        return false;\n    }\n    const Extension: string = Path.extname(FileName).toLowerCase();\n    return TsJsExtensions.has(Extension) === false;\n};\nexport function IsPathContainedUnderDirectory(ParentPath: string, ChildPath: string): boolean {\n    const ResolvedParentPath: string = Path.resolve(ParentPath);\n    const ResolvedChildPath: string = Path.resolve(ChildPath);\n    const RelativePath: string = Path.relative(ResolvedParentPath, ResolvedChildPath);\n    if (RelativePath === \"\") {\n        return false;\n    }\n    if (RelativePath === \"..\") {\n        return false;\n    }\n    if (RelativePath.startsWith(`..${Path.sep}`)) {\n        return false;\n    }\n    return Path.isAbsolute(RelativePath) === false;\n}\n;\nfunction IsValidFileName(FileName: string): boolean {\n    if (IsValidPathSegment(FileName) === false) {\n        return false;\n    }\n    if (FileName === \".\" || FileName === \"..\") {\n        return false;\n    }\n    return true;\n}\n;\nconst IsValidPathSegment = (PathSegment: string): boolean => {\n    if (PathSegment.trim() === \"\") {\n        return false;\n    }\n    /* eslint-disable-next-line no-control-regex */\n    if (/[<>:\"/\\\\|?*\\x00-\\x1F]/u.test(PathSegment)) {\n        return false;\n    }\n    if (/[. ]$/u.test(PathSegment)) {\n        return false;\n    }\n    return ReservedWindowsFileNames.every((Reserved: string): boolean => {\n        return !PathSegment.includes(Reserved);\n    });\n};\n/* eslint-enable jsdoc/require-example */\n", "/**\n * Utilities for using `effect` to work with files and directories.\n *\n * @module @sorrell/utilities/fs/effect\n */\n/**\n * @file      index.ts\n * @author    Gage Sorrell <gage@sorrell.sh>\n * @copyright (c) 2026 Gage Sorrell\n * @license   MIT\n */\nexport * from \"./FileSystem.Effect.ts\";\n", "/**\n * @file      FileSystem.Effect.ts\n * @author    Gage Sorrell <gage@sorrell.sh>\n * @copyright (c) 2026 Gage Sorrell\n * @license   MIT\n */\nexport /** The temporary dummy export for the {@link fs/effect} module. */ const __FileSystem_Dummy_Export: \"__FileSystem_Dummy_Export\" = \"__FileSystem_Dummy_Export\" as const;\n", "/**\n * Utilities for working JavaScript/TypeScript module files.\n *\n * @module @sorrell/utilities/fs/module\n */\n/**\n * @file      index.ts\n * @author    Gage Sorrell <gage@sorrell.sh>\n * @copyright (c) 2026 Gage Sorrell\n * @license   MIT\n */\nexport * as Extension from \"./Extension.ts\";\nexport * from \"./Module.ts\";\n", "/**\n * @file      Extension.ts\n * @author    Gage Sorrell <gage@sorrell.sh>\n * @copyright (c) 2026 Gage Sorrell\n * @license   MIT\n */\n/* eslint-disable jsdoc/require-example */\n/* eslint-disable @typescript-eslint/typedef */\nexport /**\n       * The valid file extensions for TypeScript *source* modules.\n       */ const Source = [\n    \".ts\",\n    \".tsx\",\n    \".mts\",\n    \".cts\"\n] as const;\nexport /**\n       * The valid file extensions for TypeScript *declaration* modules.\n       */ const Declaration = [\n    \".d.ts\",\n    \".d.mts\",\n    \".d.cts\"\n] as const;\nexport /**\n       * The valid file extensions for *any* TypeScript module.\n       */ const Any = [\n    \".ts\",\n    \".tsx\",\n    \".mts\",\n    \".cts\",\n    \".d.ts\",\n    \".d.mts\",\n    \".d.cts\"\n] as const;\n/* eslint-enable @typescript-eslint/typedef */\nexport /**\n       * A {@link RegExp | regular expression} that describes all file names\n       * with a valid extension.\n       */ const IsValidRegExp: RegExp = /\\.(ts|tsx|mts|cts|d\\.ts|d\\.mts|d\\.cts)$/iu;\n/**\n * Determine whether a given {@link In | string} is a {@link Any | valid TypeScript module extension}.\n *\n * @param In - The string to test.\n *\n * @returns {In is Any} Whether the given {@link In | string} is a valid TypeScript module extension.\n */\nexport function IsValid(In: string): In is Any {\n    return IsValidRegExp.test(In);\n}\n/** The type of any valid TypeScript module file extension. */\nexport type Any = typeof Any[number];\n/** The type of any valid TypeScript *declaration* module file extension. */\nexport type Declaration = typeof Declaration[number];\n/** The type of any valid TypeScript *source* module file extension. */\nexport type Source = typeof Source[number];\n/** Specify how file extensions should be used in the context of module file names. */\nexport type Policy = \n/** An extension name is required in the given context. */\n\"Require\"\n/** Extension names are *banned* in the given context. */\n | \"Disallow\"\n/** An extension name is required *and* must be one of the extensions in this {@link ReadonlyArray}. */\n | ReadonlyArray<Any>;\n", "/**\n * @file      String.ts\n * @author    Gage Sorrell <gage@sorrell.sh>\n * @copyright (c) 2026 Gage Sorrell\n * @license   MIT\n */\nimport { dfs } from \"effect/Graph\";\nimport { FilterDefined } from \"../Array\";\n/**\n * @module String\n * Functions for manipulating strings.\n */\n// @TODO TEMPORARY.\n/* eslint-disable jsdoc/require-example */\n/**\n * Does the given {@link TestString} contain only letters?\n * This is equivalent to Python's\n * {@link https://docs.python.org/3/library/stdtypes.html#str.isalpha | isalpha} function.\n *\n * @remarks This is an alias for {@link IsAlpha}.\n *\n * @param TestString - The string that you wish to test.\n *\n * @returns {boolean} Whether the given string contains *only* (Latin alphabet) letters.\n */\nexport function IsLetters(TestString: string): boolean {\n    return /^[a-zA-Z]*$/.test(TestString);\n}\n/**\n * Does the given {@link TestString} contain only letters?\n * This is equivalent to Python's\n * {@link https://docs.python.org/3/library/stdtypes.html#str.isalpha | isalpha} function.\n *\n * @param TestString - The string that you wish to test.\n *\n * @returns {boolean} Whether the given string contains *only* (Latin alphabet) letters.\n */\nexport function IsAlpha(TestString: string): boolean {\n    return IsLetters(TestString);\n}\n/**\n * Does the given {@link TestString} contain only digits?\n *\n * This is equivalent to Python's\n * {@link https://docs.python.org/3/library/stdtypes.html#str.isnumeric | isnumeric} function.\n *\n * @param TestString - The string that you wish to test.\n *\n * @returns {boolean} Whether the given string contains *only* numeric digits.\n */\nexport function IsNumeric(TestString: string): boolean {\n    return /^\\d+$/.test(TestString);\n}\n/**\n * This function provides a convenient way to define long strings across multiple lines.\n * The linebreaks and leading indentation are removed from the final string.\n * Please see the example below for how this is to be done.\n *\n * @param Content - The given string to dedent.\n * @param IndentLength - The number of spaces for which this function will check.  This\n * is necessary only if the number of spaces used in the {@link Content} is not a multiple\n * of two.\n *\n * @returns {string} The given {@link Content}, but with the spaces at the beginning\n * of each line (excluding the first line if no spaces exist in the first line) removed.\n *\n * @example\n * ```typescript\n * import { Dedent } from \"@sorrell/utilities/string\";\n *\n * const MyLongString: string = Dedent(`Lorem ipsum dolor sit amet, consectetur adipiscing elit,\n *             sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad\n *                 minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea\n *             commodo consequat.`);\n *\n * // `MyLongString` <- `\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, \\\n * sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad \\\n *     minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea \\\n * commodo consequat.\"`\n * ```\n */\nexport function Dedent(Content: string, IndentLength?: number): string {\n    const WhitespaceSubstring: string = ((): string => {\n        if (IndentLength !== undefined) {\n            return \"\\n\" + \" \".repeat(IndentLength);\n        }\n        let WhitespaceSubstring: string = \"\\n\";\n        while (true) {\n            const TestString: string = WhitespaceSubstring + \"  \";\n            if (Content.includes(TestString)) {\n                WhitespaceSubstring = TestString;\n            }\n            else {\n                break;\n            }\n        }\n        return WhitespaceSubstring;\n    })();\n    return Content.replaceAll(WhitespaceSubstring, \"\");\n}\n/**\n * Given a {@link ReadonlyArray} of `string`s (and possibly `undefined`), join the `string`s\n * with a given {@link Separator} `string`.\n *\n * @param StringArray - The {@link ReadonlyArray} of `string`s, and possibly `undefined`.\n * @param Separator - The `string` passed to {@link Array.join} on the filtered {@link StringArray}.\n *\n * @returns {string} The joined `string`s in the given {@link StringArray}, separated by\n * the given {@link Separator}.\n */\nexport function JoinDefined<ElementType extends string | undefined>(StringArray: ReadonlyArray<ElementType>, Separator: string): string {\n    const IsDefined = <Type>(Element: Type): boolean => Element !== undefined;\n    const DefinedOnly: ReadonlyArray<string> = StringArray.filter(IsDefined) as ReadonlyArray<string>;\n    return DefinedOnly.join(Separator);\n}\nexport function GetUtf8ByteLength(Text: string): number {\n    return new TextEncoder().encode(Text).length;\n}\n", "/**\n * @file      Module.ts\n * @author    Gage Sorrell <gage@sorrell.sh>\n * @copyright (c) 2026 Gage Sorrell\n * @license   MIT\n */\n/* eslint-disable jsdoc/require-example */\nimport * as Extension from \"./Extension.ts\";\nimport { InvalidCharacters, ReservedWindowsFileNames } from \"../FileSystem.ts\";\nimport { GetUtf8ByteLength } from \"../../String/String.ts\";\nexport namespace FileName {\n    /**\n     * For a given {@link FileName} and {@link ExtensionPolicy:param}, determine whether\n     * the given {@link FileName} is a valid TypeScript module file name.\n     *\n     * @param FileName - The file name to test.\n     *\n     * @param ExtensionPolicy - How the file extension (or lack of file extension) should affect\n     * the validity of the given {@link FileName}.\n     *\n     * @returns {boolean} Whether the given {@link FileName} is a valid name for a TypeScript module.\n     */\n    export function IsValid(FileName: string, ExtensionPolicy: Extension.Policy = \"Disallow\"): boolean {\n        if (FileName.length === 0) {\n            return false;\n        }\n        if (FileName === \".\" || FileName === \"..\") {\n            return false;\n        }\n        const DoesExtensionSatisfyPolicy: boolean = ((ExtensionPolicy === \"Disallow\" && !Extension.IsValidRegExp.test(FileName)) ||\n            (ExtensionPolicy === \"Require\" && Extension.IsValidRegExp.test(FileName)) ||\n            (Array.isArray(ExtensionPolicy) && ExtensionPolicy.some(FileName.endsWith)));\n        if (!DoesExtensionSatisfyPolicy) {\n            return false;\n        }\n        if (FileName.endsWith(\".\") || FileName.endsWith(\" \")) {\n            return false;\n        }\n        if (GetUtf8ByteLength(FileName) > 255) {\n            return false;\n        }\n        if (InvalidCharacters.test(FileName)) {\n            return false;\n        }\n        const FileNameWithoutDots: string | undefined = FileName.split(\".\")[0]?.toUpperCase();\n        const FileNameContainsWindowsReserved: boolean = (FileNameWithoutDots !== undefined &&\n            (ReservedWindowsFileNames as ReadonlyArray<string>).includes(FileNameWithoutDots));\n        if (FileNameContainsWindowsReserved) {\n            return false;\n        }\n        return true;\n    }\n}\n"],
  "mappings": "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",
  "names": ["import_fs", "Path", "Fs", "FsConstants", "os", "FileName", "FileName", "FileName", "FileName", "IsValid"]
}
