{"ast":null,"code":"\"use strict\";\n\nconst pathUtil = require(\"path\");\n\nconst fs = require(\"./utils/fs\");\n\nconst modeUtil = require(\"./utils/mode\");\n\nconst validate = require(\"./utils/validate\");\n\nconst remove = require(\"./remove\");\n\nconst validateInput = (methodName, path, criteria) => {\n  const methodSignature = `${methodName}(path, [criteria])`;\n  validate.argument(methodSignature, \"path\", path, [\"string\"]);\n  validate.options(methodSignature, \"criteria\", criteria, {\n    empty: [\"boolean\"],\n    mode: [\"string\", \"number\"]\n  });\n};\n\nconst getCriteriaDefaults = passedCriteria => {\n  const criteria = passedCriteria || {};\n\n  if (typeof criteria.empty !== \"boolean\") {\n    criteria.empty = false;\n  }\n\n  if (criteria.mode !== undefined) {\n    criteria.mode = modeUtil.normalizeFileMode(criteria.mode);\n  }\n\n  return criteria;\n};\n\nconst generatePathOccupiedByNotDirectoryError = path => {\n  return new Error(`Path ${path} exists but is not a directory. Halting jetpack.dir() call for safety reasons.`);\n}; // ---------------------------------------------------------\n// Sync\n// ---------------------------------------------------------\n\n\nconst checkWhatAlreadyOccupiesPathSync = path => {\n  let stat;\n\n  try {\n    stat = fs.statSync(path);\n  } catch (err) {\n    // Detection if path already exists\n    if (err.code !== \"ENOENT\") {\n      throw err;\n    }\n  }\n\n  if (stat && !stat.isDirectory()) {\n    throw generatePathOccupiedByNotDirectoryError(path);\n  }\n\n  return stat;\n};\n\nconst createBrandNewDirectorySync = (path, opts) => {\n  const options = opts || {};\n\n  try {\n    fs.mkdirSync(path, options.mode);\n  } catch (err) {\n    if (err.code === \"ENOENT\") {\n      // Parent directory doesn't exist. Need to create it first.\n      createBrandNewDirectorySync(pathUtil.dirname(path), options); // Now retry creating this directory.\n\n      fs.mkdirSync(path, options.mode);\n    } else if (err.code === \"EEXIST\") {// The path already exists. We're fine.\n    } else {\n      throw err;\n    }\n  }\n};\n\nconst checkExistingDirectoryFulfillsCriteriaSync = (path, stat, criteria) => {\n  const checkMode = () => {\n    const mode = modeUtil.normalizeFileMode(stat.mode);\n\n    if (criteria.mode !== undefined && criteria.mode !== mode) {\n      fs.chmodSync(path, criteria.mode);\n    }\n  };\n\n  const checkEmptiness = () => {\n    if (criteria.empty) {\n      // Delete everything inside this directory\n      const list = fs.readdirSync(path);\n      list.forEach(filename => {\n        remove.sync(pathUtil.resolve(path, filename));\n      });\n    }\n  };\n\n  checkMode();\n  checkEmptiness();\n};\n\nconst dirSync = (path, passedCriteria) => {\n  const criteria = getCriteriaDefaults(passedCriteria);\n  const stat = checkWhatAlreadyOccupiesPathSync(path);\n\n  if (stat) {\n    checkExistingDirectoryFulfillsCriteriaSync(path, stat, criteria);\n  } else {\n    createBrandNewDirectorySync(path, criteria);\n  }\n}; // ---------------------------------------------------------\n// Async\n// ---------------------------------------------------------\n\n\nconst checkWhatAlreadyOccupiesPathAsync = path => {\n  return new Promise((resolve, reject) => {\n    fs.stat(path).then(stat => {\n      if (stat.isDirectory()) {\n        resolve(stat);\n      } else {\n        reject(generatePathOccupiedByNotDirectoryError(path));\n      }\n    }).catch(err => {\n      if (err.code === \"ENOENT\") {\n        // Path doesn't exist\n        resolve(undefined);\n      } else {\n        // This is other error that nonexistent path, so end here.\n        reject(err);\n      }\n    });\n  });\n}; // Delete all files and directores inside given directory\n\n\nconst emptyAsync = path => {\n  return new Promise((resolve, reject) => {\n    fs.readdir(path).then(list => {\n      const doOne = index => {\n        if (index === list.length) {\n          resolve();\n        } else {\n          const subPath = pathUtil.resolve(path, list[index]);\n          remove.async(subPath).then(() => {\n            doOne(index + 1);\n          });\n        }\n      };\n\n      doOne(0);\n    }).catch(reject);\n  });\n};\n\nconst checkExistingDirectoryFulfillsCriteriaAsync = (path, stat, criteria) => {\n  return new Promise((resolve, reject) => {\n    const checkMode = () => {\n      const mode = modeUtil.normalizeFileMode(stat.mode);\n\n      if (criteria.mode !== undefined && criteria.mode !== mode) {\n        return fs.chmod(path, criteria.mode);\n      }\n\n      return Promise.resolve();\n    };\n\n    const checkEmptiness = () => {\n      if (criteria.empty) {\n        return emptyAsync(path);\n      }\n\n      return Promise.resolve();\n    };\n\n    checkMode().then(checkEmptiness).then(resolve, reject);\n  });\n};\n\nconst createBrandNewDirectoryAsync = (path, opts) => {\n  const options = opts || {};\n  return new Promise((resolve, reject) => {\n    fs.mkdir(path, options.mode).then(resolve).catch(err => {\n      if (err.code === \"ENOENT\") {\n        // Parent directory doesn't exist. Need to create it first.\n        createBrandNewDirectoryAsync(pathUtil.dirname(path), options).then(() => {\n          // Now retry creating this directory.\n          return fs.mkdir(path, options.mode);\n        }).then(resolve).catch(err2 => {\n          if (err2.code === \"EEXIST\") {\n            // Hmm, something other have already created the directory?\n            // No problem for us.\n            resolve();\n          } else {\n            reject(err2);\n          }\n        });\n      } else if (err.code === \"EEXIST\") {\n        // The path already exists. We're fine.\n        resolve();\n      } else {\n        reject(err);\n      }\n    });\n  });\n};\n\nconst dirAsync = (path, passedCriteria) => {\n  return new Promise((resolve, reject) => {\n    const criteria = getCriteriaDefaults(passedCriteria);\n    checkWhatAlreadyOccupiesPathAsync(path).then(stat => {\n      if (stat !== undefined) {\n        return checkExistingDirectoryFulfillsCriteriaAsync(path, stat, criteria);\n      }\n\n      return createBrandNewDirectoryAsync(path, criteria);\n    }).then(resolve, reject);\n  });\n}; // ---------------------------------------------------------\n// API\n// ---------------------------------------------------------\n\n\nexports.validateInput = validateInput;\nexports.sync = dirSync;\nexports.createSync = createBrandNewDirectorySync;\nexports.async = dirAsync;\nexports.createAsync = createBrandNewDirectoryAsync;","map":{"version":3,"sources":["D:/Development/Work/CENOS/cenos-ui/node_modules/fs-jetpack/lib/dir.js"],"names":["pathUtil","require","fs","modeUtil","validate","remove","validateInput","methodName","path","criteria","methodSignature","argument","options","empty","mode","getCriteriaDefaults","passedCriteria","undefined","normalizeFileMode","generatePathOccupiedByNotDirectoryError","Error","checkWhatAlreadyOccupiesPathSync","stat","statSync","err","code","isDirectory","createBrandNewDirectorySync","opts","mkdirSync","dirname","checkExistingDirectoryFulfillsCriteriaSync","checkMode","chmodSync","checkEmptiness","list","readdirSync","forEach","filename","sync","resolve","dirSync","checkWhatAlreadyOccupiesPathAsync","Promise","reject","then","catch","emptyAsync","readdir","doOne","index","length","subPath","async","checkExistingDirectoryFulfillsCriteriaAsync","chmod","createBrandNewDirectoryAsync","mkdir","err2","dirAsync","exports","createSync","createAsync"],"mappings":"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","sourcesContent":["\"use strict\";\n\nconst pathUtil = require(\"path\");\nconst fs = require(\"./utils/fs\");\nconst modeUtil = require(\"./utils/mode\");\nconst validate = require(\"./utils/validate\");\nconst remove = require(\"./remove\");\n\nconst validateInput = (methodName, path, criteria) => {\n  const methodSignature = `${methodName}(path, [criteria])`;\n  validate.argument(methodSignature, \"path\", path, [\"string\"]);\n  validate.options(methodSignature, \"criteria\", criteria, {\n    empty: [\"boolean\"],\n    mode: [\"string\", \"number\"]\n  });\n};\n\nconst getCriteriaDefaults = passedCriteria => {\n  const criteria = passedCriteria || {};\n  if (typeof criteria.empty !== \"boolean\") {\n    criteria.empty = false;\n  }\n  if (criteria.mode !== undefined) {\n    criteria.mode = modeUtil.normalizeFileMode(criteria.mode);\n  }\n  return criteria;\n};\n\nconst generatePathOccupiedByNotDirectoryError = path => {\n  return new Error(\n    `Path ${path} exists but is not a directory. Halting jetpack.dir() call for safety reasons.`\n  );\n};\n\n// ---------------------------------------------------------\n// Sync\n// ---------------------------------------------------------\n\nconst checkWhatAlreadyOccupiesPathSync = path => {\n  let stat;\n\n  try {\n    stat = fs.statSync(path);\n  } catch (err) {\n    // Detection if path already exists\n    if (err.code !== \"ENOENT\") {\n      throw err;\n    }\n  }\n\n  if (stat && !stat.isDirectory()) {\n    throw generatePathOccupiedByNotDirectoryError(path);\n  }\n\n  return stat;\n};\n\nconst createBrandNewDirectorySync = (path, opts) => {\n  const options = opts || {};\n\n  try {\n    fs.mkdirSync(path, options.mode);\n  } catch (err) {\n    if (err.code === \"ENOENT\") {\n      // Parent directory doesn't exist. Need to create it first.\n      createBrandNewDirectorySync(pathUtil.dirname(path), options);\n      // Now retry creating this directory.\n      fs.mkdirSync(path, options.mode);\n    } else if (err.code === \"EEXIST\") {\n      // The path already exists. We're fine.\n    } else {\n      throw err;\n    }\n  }\n};\n\nconst checkExistingDirectoryFulfillsCriteriaSync = (path, stat, criteria) => {\n  const checkMode = () => {\n    const mode = modeUtil.normalizeFileMode(stat.mode);\n    if (criteria.mode !== undefined && criteria.mode !== mode) {\n      fs.chmodSync(path, criteria.mode);\n    }\n  };\n\n  const checkEmptiness = () => {\n    if (criteria.empty) {\n      // Delete everything inside this directory\n      const list = fs.readdirSync(path);\n      list.forEach(filename => {\n        remove.sync(pathUtil.resolve(path, filename));\n      });\n    }\n  };\n\n  checkMode();\n  checkEmptiness();\n};\n\nconst dirSync = (path, passedCriteria) => {\n  const criteria = getCriteriaDefaults(passedCriteria);\n  const stat = checkWhatAlreadyOccupiesPathSync(path);\n  if (stat) {\n    checkExistingDirectoryFulfillsCriteriaSync(path, stat, criteria);\n  } else {\n    createBrandNewDirectorySync(path, criteria);\n  }\n};\n\n// ---------------------------------------------------------\n// Async\n// ---------------------------------------------------------\n\nconst checkWhatAlreadyOccupiesPathAsync = path => {\n  return new Promise((resolve, reject) => {\n    fs.stat(path)\n      .then(stat => {\n        if (stat.isDirectory()) {\n          resolve(stat);\n        } else {\n          reject(generatePathOccupiedByNotDirectoryError(path));\n        }\n      })\n      .catch(err => {\n        if (err.code === \"ENOENT\") {\n          // Path doesn't exist\n          resolve(undefined);\n        } else {\n          // This is other error that nonexistent path, so end here.\n          reject(err);\n        }\n      });\n  });\n};\n\n// Delete all files and directores inside given directory\nconst emptyAsync = path => {\n  return new Promise((resolve, reject) => {\n    fs.readdir(path)\n      .then(list => {\n        const doOne = index => {\n          if (index === list.length) {\n            resolve();\n          } else {\n            const subPath = pathUtil.resolve(path, list[index]);\n            remove.async(subPath).then(() => {\n              doOne(index + 1);\n            });\n          }\n        };\n\n        doOne(0);\n      })\n      .catch(reject);\n  });\n};\n\nconst checkExistingDirectoryFulfillsCriteriaAsync = (path, stat, criteria) => {\n  return new Promise((resolve, reject) => {\n    const checkMode = () => {\n      const mode = modeUtil.normalizeFileMode(stat.mode);\n      if (criteria.mode !== undefined && criteria.mode !== mode) {\n        return fs.chmod(path, criteria.mode);\n      }\n      return Promise.resolve();\n    };\n\n    const checkEmptiness = () => {\n      if (criteria.empty) {\n        return emptyAsync(path);\n      }\n      return Promise.resolve();\n    };\n\n    checkMode()\n      .then(checkEmptiness)\n      .then(resolve, reject);\n  });\n};\n\nconst createBrandNewDirectoryAsync = (path, opts) => {\n  const options = opts || {};\n\n  return new Promise((resolve, reject) => {\n    fs.mkdir(path, options.mode)\n      .then(resolve)\n      .catch(err => {\n        if (err.code === \"ENOENT\") {\n          // Parent directory doesn't exist. Need to create it first.\n          createBrandNewDirectoryAsync(pathUtil.dirname(path), options)\n            .then(() => {\n              // Now retry creating this directory.\n              return fs.mkdir(path, options.mode);\n            })\n            .then(resolve)\n            .catch(err2 => {\n              if (err2.code === \"EEXIST\") {\n                // Hmm, something other have already created the directory?\n                // No problem for us.\n                resolve();\n              } else {\n                reject(err2);\n              }\n            });\n        } else if (err.code === \"EEXIST\") {\n          // The path already exists. We're fine.\n          resolve();\n        } else {\n          reject(err);\n        }\n      });\n  });\n};\n\nconst dirAsync = (path, passedCriteria) => {\n  return new Promise((resolve, reject) => {\n    const criteria = getCriteriaDefaults(passedCriteria);\n\n    checkWhatAlreadyOccupiesPathAsync(path)\n      .then(stat => {\n        if (stat !== undefined) {\n          return checkExistingDirectoryFulfillsCriteriaAsync(\n            path,\n            stat,\n            criteria\n          );\n        }\n        return createBrandNewDirectoryAsync(path, criteria);\n      })\n      .then(resolve, reject);\n  });\n};\n\n// ---------------------------------------------------------\n// API\n// ---------------------------------------------------------\n\nexports.validateInput = validateInput;\nexports.sync = dirSync;\nexports.createSync = createBrandNewDirectorySync;\nexports.async = dirAsync;\nexports.createAsync = createBrandNewDirectoryAsync;\n"]},"metadata":{},"sourceType":"script"}