{
  "version": 3,
  "sources": ["../src/index.ts", "../src/error-codes.ts", "../src/memory-fs.ts"],
  "sourcesContent": ["export * from \"./error-codes\";\nexport * from \"./memory-fs\";\nexport * from \"./types\";\n", "export const FsErrorCodes = {\n  NO_FILE: \"ENOENT: no such file\",\n  NO_DIRECTORY: \"ENOENT: no such directory\",\n  NO_FILE_OR_DIRECTORY: \"ENOENT: no such file or directory\",\n\n  PATH_IS_FILE: \"ENOTDIR: path points to a file\",\n  PATH_IS_DIRECTORY: \"EISDIR: path points to a directory\",\n  PATH_IS_INVALID: \"EINVAL: invalid argument\",\n\n  CONTAINING_NOT_EXISTS: \"ENOENT: containing directory does not exist\",\n  DIRECTORY_NOT_EMPTY: \"ENOTEMPTY: directory is not empty\",\n\n  PATH_ALREADY_EXISTS: \"EEXIST: path already exists\",\n} as const;\n", "import path from \"@file-services/path\";\nimport {\n  FileSystemConstants,\n  type BufferEncoding,\n  type IDirectoryContents,\n  type IDirectoryEntry,\n  type IFileSystemStats,\n  type ReadFileOptions,\n  type RmOptions,\n  type StatSyncOptions,\n  type WatchChangeEventListener,\n} from \"@file-services/types\";\nimport { SetMultiMap, createFileSystem, syncToAsyncFs } from \"@file-services/utils\";\nimport { FsErrorCodes } from \"./error-codes\";\nimport type {\n  IBaseMemFileSystem,\n  IBaseMemFileSystemSync,\n  IFsMemDirectoryNode,\n  IFsMemFileNode,\n  IFsMemNodeType,\n  IFsMemSymlinkNode,\n  IMemFileSystem,\n} from \"./types\";\n\nconst posixPath = path.posix;\n\n/**\n * This is the main function to use, returning a sync/async\n * in-memory file system with extended API.\n *\n * @param rootContents optional data to populate / with\n */\nexport function createMemoryFs(rootContents?: IDirectoryContents<string | Uint8Array>): IMemFileSystem {\n  const baseFs = createBaseMemoryFs();\n\n  const fs: IMemFileSystem = {\n    ...createFileSystem(baseFs),\n    root: baseFs.root,\n  };\n\n  if (rootContents) {\n    fs.populateDirectorySync(posixPath.sep, rootContents);\n  }\n\n  return fs;\n}\n\n/**\n * Utility function to create a *base* sync/async\n * in-memory file system (without the extended API).\n */\nexport function createBaseMemoryFs(): IBaseMemFileSystem {\n  const syncMemFs = createBaseMemoryFsSync();\n  return { ...syncMemFs, ...syncToAsyncFs(syncMemFs) };\n}\n\n/**\n * Utility function to create a *base* sync-only\n * in-memory file system (without the extended API).\n */\nexport function createBaseMemoryFsSync(): IBaseMemFileSystemSync {\n  const root: IFsMemDirectoryNode = createMemDirectory(\"memory-fs-root\");\n  const changeListeners = new SetMultiMap<string, WatchChangeEventListener>();\n  const recursiveChangeListeners = new SetMultiMap<string, WatchChangeEventListener>();\n  const closeListeners = new SetMultiMap<string, () => void>();\n  const textEncoder = new TextEncoder();\n  realpathSync.native = realpathSync;\n\n  let workingDirectoryPath: string = posixPath.sep;\n  return {\n    root,\n    ...posixPath,\n    resolve: resolvePath,\n    caseSensitive: true,\n    cwd,\n    chdir,\n    copyFileSync,\n    existsSync,\n    lstatSync,\n    mkdirSync,\n    readdirSync,\n    readFileSync,\n    realpathSync,\n    readlinkSync,\n    renameSync,\n    rmdirSync,\n    rmSync,\n    statSync,\n    symlinkSync,\n    unlinkSync,\n    writeFileSync,\n    chmodSync: () => undefined,\n    watch: (path, options) => {\n      const recursive = options?.recursive;\n      return {\n        close() {\n          const listeners = closeListeners.get(path);\n          if (listeners) {\n            for (const listener of listeners) {\n              listener();\n            }\n            closeListeners.deleteKey(path);\n          }\n        },\n        on(event, listener) {\n          if (event === \"change\") {\n            if (recursive) {\n              recursiveChangeListeners.add(path, listener as WatchChangeEventListener);\n            } else {\n              changeListeners.add(path, listener as WatchChangeEventListener);\n            }\n          } else if (event === \"close\") {\n            closeListeners.add(path, listener as () => void);\n          }\n          return this;\n        },\n        off(event, listener) {\n          if (event === \"change\") {\n            changeListeners.delete(path, listener as WatchChangeEventListener);\n            recursiveChangeListeners.delete(path, listener as WatchChangeEventListener);\n          } else if (event === \"close\") {\n            closeListeners.delete(path, listener as () => void);\n          }\n          return this;\n        },\n      };\n    },\n  };\n\n  function resolvePath(...pathSegments: string[]): string {\n    return posixPath.resolve(workingDirectoryPath, ...pathSegments);\n  }\n\n  function cwd(): string {\n    return workingDirectoryPath;\n  }\n\n  function chdir(directoryPath: string): void {\n    workingDirectoryPath = resolvePath(directoryPath);\n  }\n\n  function readFileSync(filePath: string, options?: { encoding?: null; flag?: string } | null): Uint8Array;\n  function readFileSync(\n    filePath: string,\n    options: { encoding: BufferEncoding; flag?: string } | BufferEncoding,\n  ): string;\n  function readFileSync(filePath: string, options?: ReadFileOptions): string | Uint8Array {\n    const resolvedPath = resolvePath(filePath);\n    const fileNode = getNode(resolvedPath);\n\n    if (!fileNode) {\n      throw createFsError(resolvedPath, FsErrorCodes.NO_FILE, \"ENOENT\");\n    } else if (fileNode.type === \"dir\") {\n      throw createFsError(resolvedPath, FsErrorCodes.PATH_IS_DIRECTORY, \"EISDIR\");\n    }\n\n    const encoding = typeof options === \"string\" ? options : options?.encoding;\n\n    if (encoding === null || encoding == undefined) {\n      return typeof fileNode.contents === \"string\"\n        ? textEncoder.encode(fileNode.contents)\n        : new Uint8Array(fileNode.contents);\n    } else {\n      return typeof fileNode.contents === \"string\"\n        ? fileNode.contents\n        : new TextDecoder(encoding).decode(fileNode.contents);\n    }\n  }\n\n  function writeFileSync(filePath: string, fileContent: string | Uint8Array): void {\n    if (filePath === \"\") {\n      throw createFsError(filePath, FsErrorCodes.NO_FILE_OR_DIRECTORY, \"ENOENT\");\n    }\n\n    const resolvedPath = resolvePath(filePath);\n    const existingNode = getNode(resolvedPath);\n    if (existingNode) {\n      if (existingNode.type === \"dir\") {\n        throw createFsError(resolvedPath, FsErrorCodes.PATH_IS_DIRECTORY, \"EISDIR\");\n      }\n      existingNode.entry = { ...existingNode.entry, mtime: new Date() };\n      existingNode.contents = typeof fileContent === \"string\" ? fileContent : new Uint8Array(fileContent);\n      emitChangeEvent(\"change\", resolvedPath);\n    } else {\n      const parentPath = posixPath.dirname(resolvedPath);\n      const parentNode = getNode(parentPath);\n\n      if (!parentNode || parentNode.type !== \"dir\") {\n        throw createFsError(resolvedPath, FsErrorCodes.CONTAINING_NOT_EXISTS, \"ENOENT\");\n      }\n\n      const fileName = posixPath.basename(resolvedPath);\n      const currentDate = new Date();\n      const newFileNode: IFsMemFileNode = {\n        type: \"file\",\n        entry: {\n          name: fileName,\n          birthtime: currentDate,\n          mtime: currentDate,\n          ctime: currentDate,\n          isFile: returnsTrue,\n          isDirectory: returnsFalse,\n          isSymbolicLink: returnsFalse,\n        },\n        contents: typeof fileContent === \"string\" ? fileContent : new Uint8Array(fileContent),\n      };\n      parentNode.contents.set(fileName, newFileNode);\n      emitChangeEvent(\"rename\", resolvedPath);\n    }\n  }\n\n  function unlinkSync(filePath: string): void {\n    const resolvedPath = resolvePath(filePath);\n    const parentPath = posixPath.dirname(resolvedPath);\n    const parentNode = getNode(parentPath);\n\n    if (!parentNode || parentNode.type !== \"dir\") {\n      throw createFsError(resolvedPath, FsErrorCodes.NO_FILE, \"ENOENT\");\n    }\n\n    const fileName = posixPath.basename(resolvedPath);\n    const fileNode = parentNode.contents.get(fileName);\n\n    if (!fileNode) {\n      throw createFsError(resolvedPath, FsErrorCodes.NO_FILE, \"ENOENT\");\n    } else if (fileNode.type === \"dir\") {\n      throw createFsError(resolvedPath, FsErrorCodes.PATH_IS_DIRECTORY, \"EISDIR\");\n    }\n\n    parentNode.contents.delete(fileName);\n    emitChangeEvent(\"rename\", resolvedPath);\n  }\n\n  function readdirSync(\n    directoryPath: string,\n    options?: { encoding?: BufferEncoding | null; withFileTypes?: false } | BufferEncoding | null,\n  ): string[];\n  function readdirSync(\n    directoryPath: string,\n    options?: { encoding?: BufferEncoding | null; withFileTypes?: true } | BufferEncoding | null,\n  ): IDirectoryEntry[];\n  function readdirSync(\n    directoryPath: string,\n    options?: { encoding?: BufferEncoding | null; withFileTypes?: boolean } | BufferEncoding | null,\n  ): string[] | IDirectoryEntry[] {\n    const resolvedPath = resolvePath(directoryPath);\n    const directoryNode = getNode(resolvedPath);\n\n    if (!directoryNode) {\n      throw createFsError(resolvedPath, FsErrorCodes.NO_DIRECTORY, \"ENOENT\");\n    } else if (directoryNode.type === \"file\") {\n      throw createFsError(resolvedPath, FsErrorCodes.PATH_IS_FILE, \"ENOTDIR\");\n    }\n\n    return !!options && typeof options === \"object\" && options.withFileTypes\n      ? Array.from(directoryNode.contents.values(), ({ entry }) => entry)\n      : Array.from(directoryNode.contents.keys());\n  }\n\n  function mkdirSync(directoryPath: string, options?: { recursive?: boolean }): undefined {\n    const resolvedPath = resolvePath(directoryPath);\n    const parentPath = posixPath.dirname(resolvedPath);\n    let parentNode = getNode(parentPath);\n    const recursive = options?.recursive;\n\n    if (!parentNode) {\n      if (recursive) {\n        mkdirSync(parentPath, options);\n        parentNode = getNode(parentPath) as IFsMemDirectoryNode;\n      } else {\n        throw createFsError(resolvedPath, FsErrorCodes.CONTAINING_NOT_EXISTS, \"ENOENT\");\n      }\n    } else if (parentNode.type !== \"dir\") {\n      throw createFsError(resolvedPath, FsErrorCodes.PATH_IS_FILE, \"ENOTDIR\");\n    } else if (parentPath === resolvedPath) {\n      if (recursive) {\n        return;\n      } else {\n        throw createFsError(resolvedPath, FsErrorCodes.PATH_ALREADY_EXISTS, \"EEXIST\");\n      }\n    }\n\n    const directoryName = posixPath.basename(resolvedPath);\n    const existingNode = parentNode.contents.get(directoryName);\n\n    if (existingNode) {\n      if (recursive && existingNode.type === \"dir\") {\n        return;\n      }\n      throw createFsError(resolvedPath, FsErrorCodes.PATH_ALREADY_EXISTS, \"EEXIST\");\n    }\n\n    const newDirNode: IFsMemDirectoryNode = createMemDirectory(directoryName);\n    parentNode.contents.set(directoryName, newDirNode);\n    emitChangeEvent(\"rename\", resolvedPath);\n  }\n\n  function rmdirSync(directoryPath: string): void {\n    const resolvedPath = resolvePath(directoryPath);\n    const parentPath = posixPath.dirname(resolvedPath);\n    const parentNode = getNode(parentPath);\n\n    if (!parentNode || parentNode.type !== \"dir\") {\n      throw createFsError(resolvedPath, FsErrorCodes.NO_DIRECTORY, \"ENOENT\");\n    }\n\n    const directoryName = posixPath.basename(resolvedPath);\n    const directoryNode = parentNode.contents.get(directoryName);\n\n    if (!directoryNode || directoryNode.type !== \"dir\") {\n      throw createFsError(resolvedPath, FsErrorCodes.NO_DIRECTORY, \"ENOENT\");\n    } else if (directoryNode.contents.size > 0) {\n      throw createFsError(resolvedPath, FsErrorCodes.DIRECTORY_NOT_EMPTY, \"ENOTEMPTY\");\n    }\n\n    parentNode.contents.delete(directoryName);\n    emitChangeEvent(\"rename\", resolvedPath);\n  }\n\n  function rmSync(targetPath: string, { force, recursive }: RmOptions = {}): void {\n    const resolvedPath = resolvePath(targetPath);\n    const parentPath = posixPath.dirname(resolvedPath);\n    const parentNode = getNode(parentPath);\n\n    if (!parentNode || parentNode.type !== \"dir\") {\n      if (force) {\n        return;\n      } else {\n        throw createFsError(resolvedPath, FsErrorCodes.NO_DIRECTORY, \"ENOENT\");\n      }\n    }\n\n    const targetName = posixPath.basename(resolvedPath);\n    const targetNode = parentNode.contents.get(targetName);\n\n    if (!targetNode) {\n      if (force) {\n        return;\n      } else {\n        throw createFsError(resolvedPath, FsErrorCodes.NO_DIRECTORY, \"ENOENT\");\n      }\n    }\n    if (targetNode.type === \"dir\" && !recursive) {\n      throw createFsError(resolvedPath, FsErrorCodes.PATH_IS_DIRECTORY, \"EISDIR\");\n    }\n\n    parentNode.contents.delete(targetName);\n    emitChangeEvent(\"rename\", resolvedPath);\n  }\n\n  function existsSync(nodePath: string): boolean {\n    return !!getNode(resolvePath(nodePath));\n  }\n\n  function statSync(nodePath: string, options?: StatSyncOptions & { throwIfNoEntry?: true }): IFileSystemStats;\n  function statSync(\n    nodePath: string,\n    options: StatSyncOptions & { throwIfNoEntry: false },\n  ): IFileSystemStats | undefined;\n  function statSync(nodePath: string, options?: StatSyncOptions): IFileSystemStats | undefined {\n    const resolvedPath = resolvePath(nodePath);\n    const node = getNode(resolvedPath);\n    if (!node) {\n      const throwIfNoEntry = options?.throwIfNoEntry ?? true;\n      if (throwIfNoEntry) {\n        throw createFsError(resolvedPath, FsErrorCodes.NO_FILE_OR_DIRECTORY, \"ENOENT\");\n      } else {\n        return undefined;\n      }\n    }\n    return node.entry;\n  }\n\n  function lstatSync(nodePath: string, options?: StatSyncOptions & { throwIfNoEntry?: true }): IFileSystemStats;\n  function lstatSync(\n    nodePath: string,\n    options: StatSyncOptions & { throwIfNoEntry: false },\n  ): IFileSystemStats | undefined;\n  function lstatSync(nodePath: string, options?: StatSyncOptions): IFileSystemStats | undefined {\n    const resolvedPath = resolvePath(nodePath);\n    const node = getRawNode(resolvedPath);\n    if (!node) {\n      const throwIfNoEntry = options?.throwIfNoEntry ?? true;\n      if (throwIfNoEntry) {\n        throw createFsError(resolvedPath, FsErrorCodes.NO_FILE_OR_DIRECTORY, \"ENOENT\");\n      } else {\n        return undefined;\n      }\n    }\n    return node.entry;\n  }\n\n  function realpathSync(nodePath: string): string {\n    const resolvedPath = resolvePath(nodePath);\n    let currentPath = \"/\";\n    let node: IFsMemNodeType | undefined = root;\n    for (const depthName of resolvedPath.split(posixPath.sep)) {\n      if (!node) {\n        break;\n      }\n      if (depthName === \"\") {\n        continue;\n      }\n      if (node.type === \"dir\") {\n        node = node.contents.get(depthName);\n        currentPath = posixPath.join(currentPath, depthName);\n        while (node?.type === \"symlink\") {\n          currentPath = posixPath.resolve(posixPath.dirname(currentPath), node.target);\n          node = getRawNode(currentPath);\n        }\n      } else {\n        node = undefined;\n      }\n    }\n    if (!node) {\n      throw createFsError(resolvedPath, FsErrorCodes.NO_FILE_OR_DIRECTORY, \"ENOENT\");\n    }\n    return currentPath;\n  }\n\n  function readlinkSync(nodePath: string): string {\n    const resolvedPath = resolvePath(nodePath);\n    const node = getRawNode(resolvedPath);\n    if (!node) {\n      throw createFsError(resolvedPath, FsErrorCodes.NO_FILE_OR_DIRECTORY, \"ENOENT\");\n    } else if (node.type !== \"symlink\") {\n      throw createFsError(resolvedPath, FsErrorCodes.PATH_IS_INVALID, \"EINVAL\");\n    }\n    return node.target;\n  }\n\n  function renameSync(sourcePath: string, destinationPath: string): void {\n    const resolvedSourcePath = resolvePath(sourcePath);\n    const resolvedDestinationPath = resolvePath(destinationPath);\n    const sourceParentPath = posixPath.dirname(resolvedSourcePath);\n    const sourceParentNode = getNode(sourceParentPath);\n\n    if (!sourceParentNode || sourceParentNode.type !== \"dir\") {\n      throw createFsError(resolvedSourcePath, FsErrorCodes.CONTAINING_NOT_EXISTS, \"ENOENT\");\n    }\n\n    const sourceName = posixPath.basename(resolvedSourcePath);\n    const sourceNode = sourceParentNode.contents.get(sourceName);\n\n    if (!sourceNode) {\n      throw createFsError(resolvedSourcePath, FsErrorCodes.NO_FILE_OR_DIRECTORY, \"ENOENT\");\n    }\n\n    const destinationParentPath = posixPath.dirname(resolvedDestinationPath);\n    const destinationParentNode = getNode(destinationParentPath);\n\n    if (!destinationParentNode || destinationParentNode.type !== \"dir\") {\n      throw createFsError(resolvedDestinationPath, FsErrorCodes.CONTAINING_NOT_EXISTS, \"ENOENT\");\n    }\n\n    const destinationName = posixPath.basename(resolvedDestinationPath);\n    const destinationNode = destinationParentNode.contents.get(destinationName);\n\n    if (destinationNode) {\n      if (destinationNode.type === \"dir\") {\n        if (destinationNode.contents.size > 0) {\n          throw createFsError(resolvedDestinationPath, FsErrorCodes.DIRECTORY_NOT_EMPTY, \"ENOTEMPTY\");\n        }\n      } else {\n        throw createFsError(resolvedDestinationPath, FsErrorCodes.PATH_ALREADY_EXISTS, \"EEXIST\");\n      }\n    }\n\n    sourceParentNode.contents.delete(sourceName);\n    sourceNode.entry = { ...sourceNode.entry, name: destinationName, mtime: new Date() };\n    destinationParentNode.contents.set(destinationName, sourceNode);\n\n    emitChangeEvent(\"rename\", resolvedSourcePath);\n    emitChangeEvent(\"rename\", resolvedDestinationPath);\n  }\n\n  function copyFileSync(sourcePath: string, destinationPath: string, flags = 0): void {\n    const resolvedSourcePath = resolvePath(sourcePath);\n    const resolvedDestinationPath = resolvePath(destinationPath);\n    const sourceFileNode = getNode(resolvedSourcePath);\n\n    if (!sourceFileNode) {\n      throw createFsError(resolvedSourcePath, FsErrorCodes.NO_FILE_OR_DIRECTORY, \"ENOENT\");\n    }\n\n    if (sourceFileNode.type !== \"file\") {\n      throw createFsError(resolvedSourcePath, FsErrorCodes.PATH_IS_DIRECTORY, \"EISDIR\");\n    }\n\n    const destParentPath = posixPath.dirname(resolvedDestinationPath);\n    const destParentNode = getNode(destParentPath);\n\n    if (!destParentNode || destParentNode.type !== \"dir\") {\n      throw createFsError(resolvedDestinationPath, FsErrorCodes.CONTAINING_NOT_EXISTS, \"ENOENT\");\n    }\n\n    const targetName = posixPath.basename(resolvedDestinationPath);\n    const destinationFileNode = destParentNode.contents.get(targetName);\n\n    if (destinationFileNode) {\n      const shouldOverride = !(flags & FileSystemConstants.COPYFILE_EXCL);\n\n      if (!shouldOverride) {\n        throw createFsError(resolvedDestinationPath, FsErrorCodes.PATH_ALREADY_EXISTS, \"EEXIST\");\n      }\n\n      if (destinationFileNode.type !== \"file\") {\n        throw createFsError(resolvedDestinationPath, FsErrorCodes.PATH_IS_DIRECTORY, \"EISDIR\");\n      }\n    }\n\n    const newFileNode: IFsMemFileNode = {\n      ...sourceFileNode,\n      entry: { ...sourceFileNode.entry, name: targetName, mtime: new Date() },\n    };\n    destParentNode.contents.set(targetName, newFileNode);\n\n    emitChangeEvent(\"rename\", resolvedDestinationPath);\n  }\n\n  function symlinkSync(target: string, linkPath: string) {\n    const resolvedLinkPath = resolvePath(linkPath);\n    if (getNode(resolvedLinkPath)) {\n      throw createFsError(resolvedLinkPath, FsErrorCodes.PATH_ALREADY_EXISTS, \"EEXIST\");\n    }\n\n    const parentLinkPath = posixPath.dirname(resolvedLinkPath);\n    const parentNode = getNode(parentLinkPath);\n    if (!parentNode) {\n      throw createFsError(resolvedLinkPath, FsErrorCodes.NO_FILE, \"ENOENT\");\n    }\n    if (parentNode.type === \"file\") {\n      throw createFsError(resolvedLinkPath, FsErrorCodes.PATH_IS_FILE, \"ENOTDIR\");\n    }\n\n    const currentDate = new Date();\n    const fileName = posixPath.basename(resolvedLinkPath);\n    const symlinkNode: IFsMemSymlinkNode = {\n      type: \"symlink\",\n      entry: {\n        name: fileName,\n        birthtime: currentDate,\n        mtime: currentDate,\n        ctime: currentDate,\n        isFile: returnsFalse,\n        isDirectory: returnsFalse,\n        isSymbolicLink: returnsTrue,\n      },\n      target,\n    };\n\n    parentNode.contents.set(fileName, symlinkNode);\n    emitChangeEvent(\"rename\", resolvedLinkPath);\n  }\n\n  function getNode(nodePath: string): IFsMemFileNode | IFsMemDirectoryNode | undefined {\n    let node = getRawNode(nodePath);\n    while (node?.type === \"symlink\") {\n      nodePath = posixPath.resolve(posixPath.dirname(nodePath), node.target);\n      node = getRawNode(nodePath);\n    }\n    return node;\n  }\n\n  function getRawNode(nodePath: string): IFsMemNodeType | undefined {\n    let currentPath = \"/\";\n    let node: IFsMemNodeType | undefined = root;\n    for (const depthName of nodePath.split(posixPath.sep)) {\n      if (!node) {\n        break;\n      }\n      if (depthName === \"\") {\n        continue;\n      }\n      while (node?.type === \"symlink\") {\n        currentPath = posixPath.resolve(posixPath.dirname(currentPath), node.target);\n        node = getRawNode(currentPath);\n      }\n      if (node?.type === \"dir\") {\n        node = node.contents.get(depthName);\n        currentPath = posixPath.join(currentPath, depthName);\n      } else {\n        node = undefined;\n      }\n    }\n\n    return node;\n  }\n\n  function emitChangeEvent(type: \"change\" | \"rename\", changedPath: string): void {\n    const listenersOnPath = changeListeners.get(changedPath);\n    if (listenersOnPath) {\n      for (const listener of listenersOnPath) {\n        listener(type, posixPath.relative(\"/\", changedPath));\n      }\n    }\n    const parentPath = posixPath.dirname(changedPath);\n    const baseName = posixPath.basename(changedPath);\n    const listenersOnParent = changeListeners.get(parentPath);\n    if (listenersOnParent) {\n      for (const listener of listenersOnParent) {\n        listener(type, baseName);\n      }\n    }\n\n    for (const watchedPath of recursiveChangeListeners.keys()) {\n      const watchedWithSep = watchedPath.endsWith(\"/\") ? watchedPath : watchedPath + posixPath.sep;\n      if (changedPath === watchedPath || changedPath.startsWith(watchedWithSep)) {\n        const listeners = recursiveChangeListeners.get(watchedPath)!;\n        for (const listener of listeners) {\n          listener(type, posixPath.relative(watchedPath, changedPath));\n        }\n      }\n    }\n  }\n}\n\nfunction createMemDirectory(name: string): IFsMemDirectoryNode {\n  const currentDate = new Date();\n  return {\n    type: \"dir\",\n    contents: new Map<string, IFsMemNodeType>(),\n    entry: {\n      name,\n      birthtime: currentDate,\n      mtime: currentDate,\n      ctime: currentDate,\n      isFile: returnsFalse,\n      isDirectory: returnsTrue,\n      isSymbolicLink: returnsFalse,\n    },\n  };\n}\n\nconst returnsTrue = () => true;\nconst returnsFalse = () => false;\n\nfunction createFsError(\n  path: string,\n  message: string,\n  code: \"ENOENT\" | \"EEXIST\" | \"EISDIR\" | \"ENOTDIR\" | \"ENOTEMPTY\" | \"EINVAL\",\n): Error {\n  const error = new Error(`${path} ${message}`);\n  (error as Error & { path: string }).path = path;\n  (error as Error & { code: string }).code = code;\n  throw error;\n}\n"],
  "mappings": "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",
  "names": ["path"]
}
