| /** |
| * @author Toru Nagashima |
| * @copyright 2015 Toru Nagashima. All rights reserved. |
| * See LICENSE file in root directory for full license. |
| */ |
| "use strict" |
| |
| //------------------------------------------------------------------------------ |
| // Requirements |
| //------------------------------------------------------------------------------ |
| |
| const fs = require("fs") |
| const path = require("path") |
| const Cache = require("./cache") |
| |
| //------------------------------------------------------------------------------ |
| // Helpers |
| //------------------------------------------------------------------------------ |
| |
| const ROOT = /^(?:[/.]|\.\.|[A-Z]:\\|\\\\)(?:[/\\]\.\.)*$/ |
| const cache = new Cache() |
| |
| /** |
| * Check whether the file exists or not. |
| * @param {string} filePath The file path to check. |
| * @returns {boolean} `true` if the file exists. |
| */ |
| function existsCaseSensitive(filePath) { |
| let dirPath = filePath |
| |
| while (dirPath !== "" && !ROOT.test(dirPath)) { |
| const fileName = path.basename(dirPath) |
| dirPath = path.dirname(dirPath) |
| |
| if (fs.readdirSync(dirPath).indexOf(fileName) === -1) { |
| return false |
| } |
| } |
| |
| return true |
| } |
| |
| //------------------------------------------------------------------------------ |
| // Public Interface |
| //------------------------------------------------------------------------------ |
| |
| /** |
| * Checks whether or not the file of a given path exists. |
| * |
| * @param {string} filePath - A file path to check. |
| * @returns {boolean} `true` if the file of a given path exists. |
| */ |
| module.exports = function exists(filePath) { |
| let result = cache.get(filePath) |
| if (result == null) { |
| try { |
| const relativePath = path.relative(process.cwd(), filePath) |
| result = ( |
| fs.statSync(relativePath).isFile() && |
| existsCaseSensitive(relativePath) |
| ) |
| } |
| catch (error) { |
| if (error.code !== "ENOENT") { |
| throw error |
| } |
| result = false |
| } |
| cache.set(filePath, result) |
| } |
| |
| return result |
| } |