comty/scripts/utils/getPackages.js

58 lines
1.6 KiB
JavaScript

const fs = require("fs")
const path = require("path")
const rootPath = process.cwd()
const packagesPath = path.resolve(rootPath, "packages")
async function readIgnoredPackages() {
const packages = await fs.promises.readFile(path.resolve(rootPath, ".ignorepackages"), "utf-8").catch(() => "")
return packages.split("\n")
}
async function filterPackages(packages, ignore = []) {
const gitIgnore = fs.readFileSync(path.resolve(rootPath, ".gitignore"), "utf-8")
// create a regex to match all packages that are in the gitignore file
const gitIgnoreRegex = gitIgnore.split("\n").map((line) => {
// remove comments
if (line.startsWith("#")) return
return line.replace(/(\/)/g, "\\/").replace(/(\*)/g, "(.*)")
}).filter((line) => line)
// filter packages that are in the gitignore file
packages = packages.filter((packageName) => {
// filter ignored packages
if (ignore.includes(packageName)) {
return false
}
const resolvedPath = path.resolve(packagesPath, packageName)
return !gitIgnoreRegex.some((regex) => {
return resolvedPath.match(regex)
})
})
packages = packages.filter((packageName) => {
return fs.statSync(path.resolve(packagesPath, packageName)).isDirectory()
})
return packages
}
async function getPackages({ ignore = [] } = {}) {
let packages = await fs.promises.readdir(packagesPath)
const ignoredPackages = await readIgnoredPackages()
packages = filterPackages(packages, [
...ignore,
...ignoredPackages,
])
return packages
}
module.exports = getPackages