astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
167 lines (137 loc) • 13.9 kB
JavaScript
import fs from 'fs-extra'
import Gitignore from 'gitignore-fs'
import path from 'path'
import 'minimatch'
import __minimatch from 'minimatch'
const { Minimatch } = __minimatch
const defaultFs = {
async readdir(dir) {
return await fs.readdir(dir, {
withFileTypes: true,
})
},
async realpath(path) {
return await fs.realpath(path)
},
}
async function* globDir({
includeMatcher,
excludeMatcher,
gitignore,
cwd,
dir,
fs,
visited,
nodir,
includeDir,
}) {
const isAbsolute = path.isAbsolute(dir)
dir = path.resolve(cwd, dir)
const entries = []
if (includeDir) {
entries.push(dir.replace(/[/\\]?$/, '/'))
}
let readdir
try {
readdir = (await fs.readdir(dir)).map(
(entry) => path.join(dir, entry.name) + (entry.isDirectory() ? '/' : '')
)
} catch (error) {
if (error.code !== 'ENOTDIR') {
throw error
}
readdir = [dir]
}
await Promise.all(
readdir.map(async (fullpath) => {
if (gitignore && (await gitignore.ignores(fullpath))) return
const matchpath = isAbsolute ? fullpath : path.relative(cwd, fullpath)
if (
(includeMatcher &&
!includeMatcher.match(matchpath, fullpath.endsWith('/'))) ||
(excludeMatcher !== null &&
excludeMatcher !== void 0 &&
excludeMatcher.match(matchpath))
) {
return
}
const realpath = await fs.realpath(fullpath)
if (visited.has(realpath)) return
visited.add(realpath)
entries.push(fullpath)
})
)
for (const entry of entries) {
if (entry.endsWith('/')) {
if (!nodir) {
const matchpath = isAbsolute ? entry : path.relative(cwd, entry)
if (!includeMatcher || includeMatcher.match(matchpath)) {
yield entry
}
}
for await (const sub of globDir({
gitignore,
cwd,
dir: isAbsolute ? entry : path.relative(cwd, entry),
fs,
visited,
includeMatcher,
excludeMatcher,
nodir,
})) {
yield sub
}
} else {
yield entry
}
}
}
export default async function* glob({
include,
exclude,
dot,
includeMatcher = include
? new Minimatch(include, {
dot,
})
: undefined,
excludeMatcher = exclude
? new Minimatch(exclude, {
dot,
})
: undefined,
gitignore = new Gitignore(),
cwd = process.cwd(),
fs = defaultFs,
visited = new Set(),
...rest
}) {
const opts = {
...rest,
includeMatcher,
excludeMatcher,
gitignore,
cwd,
fs,
visited,
}
function* getDirs() {
if (includeMatcher) {
for (const splitPath of includeMatcher.set) {
const magicIndex = splitPath.findIndex((e) => typeof e !== 'string')
yield magicIndex === 0
? cwd
: (magicIndex < 0 ? splitPath : splitPath.slice(0, magicIndex)).join(
'/'
)
}
} else {
yield cwd
}
}
for (const dir of getDirs()) {
for await (const entry of globDir({ ...opts, dir, includeDir: true })) {
yield entry
}
}
} //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmcyIsIkdpdGlnbm9yZSIsInBhdGgiLCJNaW5pbWF0Y2giLCJkZWZhdWx0RnMiLCJyZWFkZGlyIiwiZGlyIiwid2l0aEZpbGVUeXBlcyIsInJlYWxwYXRoIiwiZ2xvYkRpciIsImluY2x1ZGVNYXRjaGVyIiwiZXhjbHVkZU1hdGNoZXIiLCJnaXRpZ25vcmUiLCJjd2QiLCJ2aXNpdGVkIiwibm9kaXIiLCJpbmNsdWRlRGlyIiwiaXNBYnNvbHV0ZSIsInJlc29sdmUiLCJlbnRyaWVzIiwicHVzaCIsInJlcGxhY2UiLCJtYXAiLCJlbnRyeSIsImpvaW4iLCJuYW1lIiwiaXNEaXJlY3RvcnkiLCJlcnJvciIsImNvZGUiLCJQcm9taXNlIiwiYWxsIiwiZnVsbHBhdGgiLCJpZ25vcmVzIiwibWF0Y2hwYXRoIiwicmVsYXRpdmUiLCJtYXRjaCIsImVuZHNXaXRoIiwiaGFzIiwiYWRkIiwic3ViIiwiZ2xvYiIsImluY2x1ZGUiLCJleGNsdWRlIiwiZG90IiwidW5kZWZpbmVkIiwicHJvY2VzcyIsIlNldCIsInJlc3QiLCJvcHRzIiwiZ2V0RGlycyIsInNwbGl0UGF0aCIsInNldCIsIm1hZ2ljSW5kZXgiLCJmaW5kSW5kZXgiLCJlIiwic2xpY2UiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbm9kZS9nbG9iLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBHaXRpZ25vcmUgZnJvbSAnZ2l0aWdub3JlLWZzJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IE1pbmltYXRjaCB9IGZyb20gJ21pbmltYXRjaCdcblxuaW50ZXJmYWNlIEZzRW50cnkge1xuICBuYW1lOiBzdHJpbmdcbiAgaXNEaXJlY3RvcnkoKTogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZzIHtcbiAgcmVhZGRpcihkaXI6IHN0cmluZyk6IFByb21pc2U8RnNFbnRyeVtdPlxuICByZWFscGF0aChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz5cbn1cblxuY29uc3QgZGVmYXVsdEZzOiBGcyA9IHtcbiAgYXN5bmMgcmVhZGRpcihkaXI6IHN0cmluZyk6IFByb21pc2U8RnNFbnRyeVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRkaXIoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcbiAgfSxcbiAgYXN5bmMgcmVhbHBhdGgocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgZnMucmVhbHBhdGgocGF0aClcbiAgfSxcbn1cblxudHlwZSBPcHRpb25zID0ge1xuICBpbmNsdWRlPzogc3RyaW5nXG4gIGV4Y2x1ZGU/OiBzdHJpbmdcbiAgaW5jbHVkZU1hdGNoZXI/OiBNaW5pbWF0Y2hcbiAgZXhjbHVkZU1hdGNoZXI/OiBNaW5pbWF0Y2hcbiAgZ2l0aWdub3JlPzogR2l0aWdub3JlIHwgbnVsbFxuICBjd2Q/OiBzdHJpbmdcbiAgZnM/OiBGc1xuICB2aXNpdGVkPzogU2V0PHN0cmluZz5cbiAgbm9kaXI/OiBib29sZWFuXG4gIGRvdD86IGJvb2xlYW5cbn1cblxuYXN5bmMgZnVuY3Rpb24qIGdsb2JEaXIoe1xuICBpbmNsdWRlTWF0Y2hlcixcbiAgZXhjbHVkZU1hdGNoZXIsXG4gIGdpdGlnbm9yZSxcbiAgY3dkLFxuICBkaXIsXG4gIGZzLFxuICB2aXNpdGVkLFxuICBub2RpcixcbiAgaW5jbHVkZURpcixcbn06IHtcbiAgaW5jbHVkZU1hdGNoZXI/OiBNaW5pbWF0Y2hcbiAgZXhjbHVkZU1hdGNoZXI/OiBNaW5pbWF0Y2hcbiAgZ2l0aWdub3JlOiBHaXRpZ25vcmUgfCBudWxsXG4gIGN3ZDogc3RyaW5nXG4gIGRpcjogc3RyaW5nXG4gIGZzOiBGc1xuICB2aXNpdGVkOiBTZXQ8c3RyaW5nPlxuICBub2Rpcj86IGJvb2xlYW5cbiAgaW5jbHVkZURpcj86IGJvb2xlYW5cbn0pOiBBc3luY0l0ZXJhYmxlPHN0cmluZz4ge1xuICBjb25zdCBpc0Fic29sdXRlID0gcGF0aC5pc0Fic29sdXRlKGRpcilcbiAgZGlyID0gcGF0aC5yZXNvbHZlKGN3ZCwgZGlyKVxuICBjb25zdCBlbnRyaWVzOiBzdHJpbmdbXSA9IFtdXG4gIGlmIChpbmNsdWRlRGlyKSB7XG4gICAgZW50cmllcy5wdXNoKGRpci5yZXBsYWNlKC9bL1xcXFxdPyQvLCAnLycpKVxuICB9XG4gIGxldCByZWFkZGlyXG4gIHRyeSB7XG4gICAgcmVhZGRpciA9IChhd2FpdCBmcy5yZWFkZGlyKGRpcikpLm1hcChcbiAgICAgIChlbnRyeSkgPT4gcGF0aC5qb2luKGRpciwgZW50cnkubmFtZSkgKyAoZW50cnkuaXNEaXJlY3RvcnkoKSA/ICcvJyA6ICcnKVxuICAgIClcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGlmIChlcnJvci5jb2RlICE9PSAnRU5PVERJUicpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICAgIHJlYWRkaXIgPSBbZGlyXVxuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHJlYWRkaXIubWFwKGFzeW5jIChmdWxscGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZ2l0aWdub3JlICYmIChhd2FpdCBnaXRpZ25vcmUuaWdub3JlcyhmdWxscGF0aCkpKSByZXR1cm5cbiAgICAgIGNvbnN0IG1hdGNocGF0aCA9IGlzQWJzb2x1dGUgPyBmdWxscGF0aCA6IHBhdGgucmVsYXRpdmUoY3dkLCBmdWxscGF0aClcbiAgICAgIGlmIChcbiAgICAgICAgKGluY2x1ZGVNYXRjaGVyICYmXG4gICAgICAgICAgIWluY2x1ZGVNYXRjaGVyLm1hdGNoKG1hdGNocGF0aCwgZnVsbHBhdGguZW5kc1dpdGgoJy8nKSkpIHx8XG4gICAgICAgIGV4Y2x1ZGVNYXRjaGVyPy5tYXRjaChtYXRjaHBhdGgpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCByZWFscGF0aCA9IGF3YWl0IGZzLnJlYWxwYXRoKGZ1bGxwYXRoKVxuICAgICAgaWYgKHZpc2l0ZWQuaGFzKHJlYWxwYXRoKSkgcmV0dXJuXG4gICAgICB2aXNpdGVkLmFkZChyZWFscGF0aClcbiAgICAgIGVudHJpZXMucHVzaChmdWxscGF0aClcbiAgICB9KVxuICApXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGlmIChlbnRyeS5lbmRzV2l0aCgnLycpKSB7XG4gICAgICBpZiAoIW5vZGlyKSB7XG4gICAgICAgIGNvbnN0IG1hdGNocGF0aCA9IGlzQWJzb2x1dGUgPyBlbnRyeSA6IHBhdGgucmVsYXRpdmUoY3dkLCBlbnRyeSlcbiAgICAgICAgaWYgKCFpbmNsdWRlTWF0Y2hlciB8fCBpbmNsdWRlTWF0Y2hlci5tYXRjaChtYXRjaHBhdGgpKSB7XG4gICAgICAgICAgeWllbGQgZW50cnlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIGF3YWl0IChjb25zdCBzdWIgb2YgZ2xvYkRpcih7XG4gICAgICAgIGdpdGlnbm9yZSxcbiAgICAgICAgY3dkLFxuICAgICAgICBkaXI6IGlzQWJzb2x1dGUgPyBlbnRyeSA6IHBhdGgucmVsYXRpdmUoY3dkLCBlbnRyeSksXG4gICAgICAgIGZzLFxuICAgICAgICB2aXNpdGVkLFxuICAgICAgICBpbmNsdWRlTWF0Y2hlcixcbiAgICAgICAgZXhjbHVkZU1hdGNoZXIsXG4gICAgICAgIG5vZGlyLFxuICAgICAgfSkpIHtcbiAgICAgICAgeWllbGQgc3ViXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHlpZWxkIGVudHJ5XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uKiBnbG9iKHtcbiAgaW5jbHVkZSxcbiAgZXhjbHVkZSxcbiAgZG90LFxuICBpbmNsdWRlTWF0Y2hlciA9IGluY2x1ZGUgPyBuZXcgTWluaW1hdGNoKGluY2x1ZGUsIHsgZG90IH0pIDogdW5kZWZpbmVkLFxuICBleGNsdWRlTWF0Y2hlciA9IGV4Y2x1ZGUgPyBuZXcgTWluaW1hdGNoKGV4Y2x1ZGUsIHsgZG90IH0pIDogdW5kZWZpbmVkLFxuICBnaXRpZ25vcmUgPSBuZXcgR2l0aWdub3JlKCksXG4gIGN3ZCA9IHByb2Nlc3MuY3dkKCksXG4gIGZzID0gZGVmYXVsdEZzLFxuICB2aXNpdGVkID0gbmV3IFNldCgpLFxuICAuLi5yZXN0XG59OiBPcHRpb25zKTogQXN5bmNJdGVyYWJsZTxzdHJpbmc+IHtcbiAgY29uc3Qgb3B0cyA9IHtcbiAgICAuLi5yZXN0LFxuICAgIGluY2x1ZGVNYXRjaGVyLFxuICAgIGV4Y2x1ZGVNYXRjaGVyLFxuICAgIGdpdGlnbm9yZSxcbiAgICBjd2QsXG4gICAgZnMsXG4gICAgdmlzaXRlZCxcbiAgfVxuICBmdW5jdGlvbiogZ2V0RGlycygpOiBJdGVyYWJsZTxzdHJpbmc+IHtcbiAgICBpZiAoaW5jbHVkZU1hdGNoZXIpIHtcbiAgICAgIGZvciAoY29uc3Qgc3BsaXRQYXRoIG9mIGluY2x1ZGVNYXRjaGVyLnNldCkge1xuICAgICAgICBjb25zdCBtYWdpY0luZGV4ID0gc3BsaXRQYXRoLmZpbmRJbmRleCgoZSkgPT4gdHlwZW9mIGUgIT09ICdzdHJpbmcnKVxuICAgICAgICB5aWVsZCBtYWdpY0luZGV4ID09PSAwXG4gICAgICAgICAgPyBjd2RcbiAgICAgICAgICA6IChtYWdpY0luZGV4IDwgMCA/IHNwbGl0UGF0aCA6IHNwbGl0UGF0aC5zbGljZSgwLCBtYWdpY0luZGV4KSkuam9pbihcbiAgICAgICAgICAgICAgJy8nXG4gICAgICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHlpZWxkIGN3ZFxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGRpciBvZiBnZXREaXJzKCkpIHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGVudHJ5IG9mIGdsb2JEaXIoeyAuLi5vcHRzLCBkaXIsIGluY2x1ZGVEaXI6IHRydWUgfSkpIHtcbiAgICAgIHlpZWxkIGVudHJ5XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLEVBQVAsTUFBZSxVQUFmO0FBQ0Es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