denoify
Version:
For NPM module authors that would like to support Deno but do not want to write and maintain a port.
52 lines (40 loc) • 2.16 kB
text/typescript
import { globProxyFactory } from "./globProxy";
import * as fs from "fs";
import { crawl } from "./crawl";
import * as path from "path";
function resolvePathsWithWildcards_noPriority(params: { pathWithWildcards: string[] }): string[] {
const { pathWithWildcards } = params;
const { globProxy } = globProxyFactory({ "cwdAndRoot": "." });
const flat = [(prev: string[], curr: string[]) => [...prev, ...curr], [] as string[]] as const;
const resolvePaths = (pathWithWildcards: string[]): string[] =>
pathWithWildcards
.map(pathWithWildcard => globProxy({ pathWithWildcard }))
.reduce(...flat)
//Next op is to get the appropriate case in the outputs
//Ex if we have README.md as input but readme.md is the
//file that is actually there we want readme.md as output.
.map(fileOrDirPath =>
path.join(
path.dirname(fileOrDirPath),
fs.readdirSync(path.dirname(fileOrDirPath)).find(basename => path.relative(basename, path.basename(fileOrDirPath)) === "")!
)
)
.map(fileOrDirPath =>
!fs.lstatSync(fileOrDirPath).isDirectory()
? [fileOrDirPath]
: crawl(fileOrDirPath).map(filePath => path.join(fileOrDirPath, filePath))
)
.reduce(...flat);
const filesToInclude = resolvePaths(pathWithWildcards.filter(p => !p.startsWith("!")));
const filesToExclude = resolvePaths(pathWithWildcards.filter(p => p.startsWith("!")).map(p => p.replace(/^\!/, "")));
return Array.from(new Set(filesToInclude.filter(p => !filesToExclude.includes(p))));
}
export function resolvePathsWithWildcards(params: { pathWithWildcards: string[] }): string[] {
const { pathWithWildcards } = params;
let resolvedPaths: string[] = [];
for (const pathWithWildcard of pathWithWildcards) {
const resolvedPaths_i = resolvePathsWithWildcards_noPriority({ "pathWithWildcards": [...resolvedPaths, pathWithWildcard] });
resolvedPaths = resolvedPaths_i;
}
return resolvedPaths;
}