{
  "version": 3,
  "sources": ["../src/index.ts", "../src/overlay-fs.ts"],
  "sourcesContent": ["export * from \"./overlay-fs\";\n", "import type {\n  IBaseFileSystemPromiseActions,\n  IBaseFileSystemSyncActions,\n  IDirectoryEntry,\n  IFileSystem,\n  ReadFileOptions,\n} from \"@file-services/types\";\nimport { createFileSystem } from \"@file-services/utils\";\n\nconst getEntryName = (item: IDirectoryEntry) => item.name;\n\nexport function createOverlayFs(\n  lowerFs: IFileSystem,\n  upperFs: IFileSystem,\n  baseDirectoryPath = lowerFs.cwd(),\n): IFileSystem {\n  const { promises: lowerPromises } = lowerFs;\n  const { promises: upperPromises } = upperFs;\n  const lowerFsRelativeUp = `..${lowerFs.sep}`;\n\n  // ensure base Directory is absolute\n  baseDirectoryPath = lowerFs.resolve(baseDirectoryPath);\n\n  function resolvePaths(path: string): { resolvedLowerPath: string; resolvedUpperPath?: string } {\n    const resolvedLowerPath = lowerFs.resolve(path);\n    const relativeToBase = lowerFs.relative(baseDirectoryPath, resolvedLowerPath);\n\n    if (\n      relativeToBase !== \"..\" &&\n      !relativeToBase.startsWith(lowerFsRelativeUp) &&\n      !lowerFs.isAbsolute(relativeToBase)\n    ) {\n      return { resolvedLowerPath, resolvedUpperPath: relativeToBase.replace(/\\\\/g, \"/\") };\n    } else {\n      return { resolvedLowerPath };\n    }\n  }\n\n  function realpathSync(path: string) {\n    const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n    if (resolvedUpperPath !== undefined && upperFs.existsSync(resolvedUpperPath)) {\n      const { stackTraceLimit } = Error;\n      try {\n        Error.stackTraceLimit = 0;\n        return lowerFs.join(baseDirectoryPath, upperFs.realpathSync(resolvedUpperPath));\n      } catch {\n        /**/\n      } finally {\n        Error.stackTraceLimit = stackTraceLimit;\n      }\n    }\n    return lowerFs.realpathSync(resolvedLowerPath);\n  }\n\n  realpathSync.native = function realpathSyncNative(path: string) {\n    const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n    if (resolvedUpperPath !== undefined && upperFs.existsSync(resolvedUpperPath)) {\n      const { stackTraceLimit } = Error;\n      try {\n        Error.stackTraceLimit = 0;\n        return lowerFs.join(baseDirectoryPath, upperFs.realpathSync.native(resolvedUpperPath));\n      } catch {\n        /**/\n      } finally {\n        Error.stackTraceLimit = stackTraceLimit;\n      }\n    }\n    return lowerFs.realpathSync.native(resolvedLowerPath);\n  };\n\n  const baseSyncActions: Partial<IBaseFileSystemSyncActions> = {\n    existsSync(path) {\n      const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n      if (resolvedUpperPath !== undefined) {\n        return upperFs.existsSync(resolvedUpperPath) || lowerFs.existsSync(resolvedLowerPath);\n      } else {\n        return lowerFs.existsSync(resolvedLowerPath);\n      }\n    },\n    readFileSync: function readFileSync(path, ...args) {\n      const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n      if (resolvedUpperPath !== undefined && upperFs.existsSync(resolvedUpperPath)) {\n        const { stackTraceLimit } = Error;\n        try {\n          Error.stackTraceLimit = 0;\n          return upperFs.readFileSync(resolvedUpperPath, ...args);\n        } catch {\n          /**/\n        } finally {\n          Error.stackTraceLimit = stackTraceLimit;\n        }\n      }\n      return lowerFs.readFileSync(resolvedLowerPath, ...args);\n    } as IBaseFileSystemSyncActions[\"readFileSync\"],\n    statSync: function (path: string, ...args: []) {\n      const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n      if (resolvedUpperPath !== undefined && upperFs.existsSync(resolvedUpperPath)) {\n        try {\n          const stats = upperFs.statSync(resolvedUpperPath, ...args);\n          if (stats) {\n            return stats;\n          }\n        } catch {\n          /**/\n        }\n      }\n      return lowerFs.statSync(resolvedLowerPath, ...args);\n    } as IBaseFileSystemSyncActions[\"statSync\"],\n    lstatSync: function lstatSync(path: string, ...args: []) {\n      const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n      if (resolvedUpperPath !== undefined && upperFs.existsSync(resolvedUpperPath)) {\n        try {\n          const stats = upperFs.lstatSync(resolvedUpperPath, ...args);\n          if (stats) {\n            return stats;\n          }\n        } catch {\n          /**/\n        }\n      }\n      return lowerFs.lstatSync(resolvedLowerPath, ...args);\n    } as IBaseFileSystemSyncActions[\"lstatSync\"],\n    realpathSync,\n    readlinkSync(path) {\n      const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n      if (resolvedUpperPath !== undefined && upperFs.existsSync(resolvedUpperPath)) {\n        const { stackTraceLimit } = Error;\n        try {\n          Error.stackTraceLimit = 0;\n          return upperFs.readlinkSync(resolvedUpperPath);\n        } catch {\n          /**/\n        } finally {\n          Error.stackTraceLimit = stackTraceLimit;\n        }\n      }\n      return lowerFs.readlinkSync(resolvedLowerPath);\n    },\n    readdirSync: ((path, options: { withFileTypes: true }) => {\n      const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n      if (resolvedUpperPath !== undefined && upperFs.existsSync(resolvedUpperPath)) {\n        const { stackTraceLimit } = Error;\n        try {\n          Error.stackTraceLimit = 0;\n          const resInUpper = upperFs.readdirSync(resolvedUpperPath, options);\n          try {\n            const resInLower = lowerFs.readdirSync(resolvedLowerPath, options);\n            if (options !== null && typeof options === \"object\" && options.withFileTypes) {\n              const namesInUpper = new Set<string>(resInUpper.map(getEntryName));\n              return [...resInLower.filter((item) => !namesInUpper.has(item.name)), ...resInUpper];\n            }\n            return Array.from(new Set([...resInLower, ...resInUpper]));\n          } catch {\n            return resInUpper;\n          }\n        } catch {\n          /**/\n        } finally {\n          Error.stackTraceLimit = stackTraceLimit;\n        }\n      }\n      return lowerFs.readdirSync(resolvedLowerPath, options);\n    }) as IBaseFileSystemSyncActions[\"readdirSync\"],\n  };\n\n  const basePromiseActions: Partial<IBaseFileSystemPromiseActions> = {\n    async exists(path) {\n      const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n      if (resolvedUpperPath !== undefined) {\n        return (await upperPromises.exists(resolvedUpperPath)) || (await lowerPromises.exists(resolvedLowerPath));\n      } else {\n        return lowerPromises.exists(resolvedLowerPath);\n      }\n    },\n    readFile: async function readFile(path: string, ...args: [ReadFileOptions]) {\n      const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n      if (resolvedUpperPath !== undefined && upperFs.existsSync(resolvedUpperPath)) {\n        try {\n          return await upperPromises.readFile(resolvedUpperPath, ...args);\n        } catch {\n          /**/\n        }\n      }\n      return lowerPromises.readFile(resolvedLowerPath, ...args);\n    } as IBaseFileSystemPromiseActions[\"readFile\"],\n    async stat(path) {\n      const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n      if (resolvedUpperPath !== undefined && upperFs.existsSync(resolvedUpperPath)) {\n        try {\n          return await upperPromises.stat(resolvedUpperPath);\n        } catch {\n          /**/\n        }\n      }\n      return lowerPromises.stat(resolvedLowerPath);\n    },\n    async lstat(path) {\n      const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n      if (resolvedUpperPath !== undefined && upperFs.existsSync(resolvedUpperPath)) {\n        try {\n          return await upperPromises.lstat(resolvedUpperPath);\n        } catch {\n          /**/\n        }\n      }\n      return lowerPromises.lstat(resolvedLowerPath);\n    },\n    async realpath(path) {\n      const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n      if (resolvedUpperPath !== undefined && upperFs.existsSync(resolvedUpperPath)) {\n        try {\n          return lowerFs.join(baseDirectoryPath, await upperPromises.realpath(resolvedUpperPath));\n        } catch {\n          /**/\n        }\n      }\n      return lowerPromises.realpath(resolvedLowerPath);\n    },\n    async readlink(path) {\n      const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n      if (resolvedUpperPath !== undefined && upperFs.existsSync(resolvedUpperPath)) {\n        try {\n          return await upperPromises.readlink(resolvedUpperPath);\n        } catch {\n          /**/\n        }\n      }\n      return lowerPromises.readlink(resolvedLowerPath);\n    },\n    readdir: async function readdir(path: string, options: { withFileTypes: true }) {\n      const { resolvedLowerPath, resolvedUpperPath } = resolvePaths(path);\n      if (resolvedUpperPath !== undefined && upperFs.existsSync(resolvedUpperPath)) {\n        try {\n          const resInUpper = await upperPromises.readdir(resolvedUpperPath, options);\n          try {\n            const resInLower = await lowerPromises.readdir(resolvedLowerPath, options);\n            if (options !== null && typeof options === \"object\" && options.withFileTypes) {\n              const namesInUpper = new Set<string>(resInUpper.map(getEntryName));\n              return [...resInLower.filter((item) => !namesInUpper.has(item.name)), ...resInUpper];\n            }\n            return Array.from(new Set([...resInLower, ...resInUpper]));\n          } catch {\n            /**/\n          }\n          return resInUpper;\n        } catch {\n          /**/\n        }\n      }\n      return lowerPromises.readdir(resolvedLowerPath, options);\n    } as IBaseFileSystemPromiseActions[\"readdir\"],\n  };\n\n  return createFileSystem({\n    ...lowerFs,\n    ...baseSyncActions,\n    promises: { ...lowerPromises, ...basePromiseActions },\n  });\n}\n\n// to avoid having to include @types/node\ninterface TracedErrorConstructor extends ErrorConstructor {\n  stackTraceLimit?: number;\n}\ndeclare let Error: TracedErrorConstructor;\n"],
  "mappings": "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",
  "names": []
}
