{"version":3,"sources":["../../src/utilities/readDirectory.js"],"names":["hasNoExtension","fileName","matches","match","hasMultipleExtensions","length","isSafeName","test","stripExtension","pos","lastIndexOf","substr","removeDuplicates","files","preferredExtension","filter","withoutExtension","mainAlternative","includes","removeIgnoredFiles","ignorePatterns","patterns","map","pattern","startsWith","endsWith","patternWithoutSlashes","slice","RegExp","directoryPath","options","silent","extensions","config","children","readdirSync","absolutePath","resolve","isDirectory","statSync","some","ext","ignore","sort"],"mappings":"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","file":"readDirectory.js","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport _ from 'lodash';\nimport hasIndex from './hasIndex';\nimport validateTargetDirectory from './validateTargetDirectory';\n\nconst hasNoExtension = (fileName) => {\n const matches = fileName.match(/\\./g);\n\n return !matches;\n};\n\nconst hasMultipleExtensions = (fileName) => {\n const matches = fileName.match(/\\./g);\n\n return matches && matches.length > 1;\n};\n\nconst isSafeName = (fileName) => {\n return /^[a-z][a-z0-9._]+$/i.test(fileName);\n};\n\nconst stripExtension = (fileName) => {\n const pos = fileName.lastIndexOf('.');\n\n if (pos === -1) {\n return fileName;\n }\n\n return fileName.substr(0, pos);\n};\n\nconst removeDuplicates = (files, preferredExtension) => {\n return _.filter(files, (fileName) => {\n const withoutExtension = stripExtension(fileName);\n const mainAlternative = withoutExtension + '.' + preferredExtension;\n\n if (mainAlternative === fileName) {\n return true;\n }\n\n return !_.includes(files, mainAlternative);\n });\n};\n\nconst removeIgnoredFiles = (files, ignorePatterns = []) => {\n if (ignorePatterns.length === 0) {\n return files;\n }\n\n const patterns = ignorePatterns.map((pattern) => {\n if (_.startsWith(pattern, '/') && _.endsWith(pattern, '/')) {\n const patternWithoutSlashes = pattern.slice(1, -1);\n\n return new RegExp(patternWithoutSlashes);\n }\n\n return new RegExp(pattern);\n });\n\n return _.filter(files, (fileName) => {\n let pattern;\n\n for (pattern of patterns) {\n if (fileName.match(pattern) !== null) {\n return false;\n }\n }\n\n return true;\n });\n};\n\nexport default (directoryPath, options = {}) => {\n if (!validateTargetDirectory(directoryPath, {silent: options.silent})) {\n return false;\n }\n\n const {\n extensions = ['js'],\n config = {}\n } = options;\n\n let children;\n\n children = fs.readdirSync(directoryPath);\n\n children = _.filter(children, (fileName) => {\n const absolutePath = path.resolve(directoryPath, fileName);\n const isDirectory = fs.statSync(absolutePath).isDirectory();\n\n if (!isSafeName(fileName)) {\n return false;\n }\n\n if (hasNoExtension(fileName) && !isDirectory) {\n return false;\n }\n\n if (hasMultipleExtensions(fileName)) {\n return false;\n }\n\n if (_.startsWith(fileName, 'index.js')) {\n return false;\n }\n\n if (!isDirectory && !extensions.some((ext) => {\n return _.endsWith(fileName, '.' + ext);\n })) {\n return false;\n }\n\n if (isDirectory && !hasIndex(absolutePath)) {\n return false;\n }\n\n return true;\n });\n\n children = removeDuplicates(children, extensions[0]);\n children = removeIgnoredFiles(children, config.ignore);\n\n return children.sort();\n};\n"]}