summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAxetroy <troy450409405@gmail.com>2019-05-25 22:17:56 +0800
committerRyan Dahl <ry@tinyclouds.org>2019-05-25 17:17:56 +0300
commit74498f1e0c586eaa9b81809a2fedd22038d3e53d (patch)
treefeff9993ab96a9090114810ba28009b628525d8f
parentaed65ff3335b1da49c69e33746240e66d301fe41 (diff)
Prettier: support for specified files and glob mode (denoland/deno_std#438)
Original: https://github.com/denoland/deno_std/commit/1083db10ed64647db70e23aff8cebc1022582f00
-rwxr-xr-xprettier/main.ts81
1 files changed, 71 insertions, 10 deletions
diff --git a/prettier/main.ts b/prettier/main.ts
index e1b1b6418..584b90b39 100755
--- a/prettier/main.ts
+++ b/prettier/main.ts
@@ -12,7 +12,7 @@
// This script formats the given source files. If the files are omitted, it
// formats the all files in the repository.
const { args, exit, readFile, writeFile, stdout } = Deno;
-import { glob } from "../fs/glob.ts";
+import { glob, isGlob, GlobOptions } from "../fs/glob.ts";
import { walk, WalkInfo } from "../fs/walk.ts";
import { parse } from "../flags/mod.ts";
import { prettier, prettierPlugins } from "./prettier.ts";
@@ -227,6 +227,68 @@ async function formatSourceFiles(
exit(0);
}
+/**
+ * Get the files to format.
+ * @param selectors The glob patterns to select the files.
+ * eg `cmd/*.ts` to select all the typescript files in cmd directory.
+ * eg `cmd/run.ts` to select `cmd/run.ts` file as only.
+ * @param ignore The glob patterns to ignore files.
+ * eg `*_test.ts` to ignore all the test file.
+ * @param options options to pass to `glob(selector, options)`
+ * @returns returns an async iterable object
+ */
+function getTargetFiles(
+ selectors: string[],
+ ignore: string[] = [],
+ options: GlobOptions = {}
+): AsyncIterableIterator<WalkInfo> {
+ const matchers: Array<string | RegExp> = [];
+
+ const selectorMap: { [k: string]: boolean } = {};
+
+ for (const selector of selectors) {
+ // If the selector already exists then ignore it.
+ if (selectorMap[selector]) continue;
+ selectorMap[selector] = true;
+ if (isGlob(selector) || selector === ".") {
+ matchers.push(glob(selector, options));
+ } else {
+ matchers.push(selector);
+ }
+ }
+
+ const skip = ignore.map((i: string): RegExp => glob(i, options));
+
+ return (async function*(): AsyncIterableIterator<WalkInfo> {
+ for (const match of matchers) {
+ if (typeof match === "string") {
+ const fileInfo = await Deno.stat(match);
+
+ if (fileInfo.isDirectory()) {
+ const files = walk(match, { skip });
+
+ for await (const info of files) {
+ yield info;
+ }
+ } else {
+ const info: WalkInfo = {
+ filename: match,
+ info: fileInfo
+ };
+
+ yield info;
+ }
+ } else {
+ const files = walk(".", { match: [match], skip });
+
+ for await (const info of files) {
+ yield info;
+ }
+ }
+ }
+ })();
+}
+
async function main(opts): Promise<void> {
const { help, ignore, check, _: args } = opts;
@@ -248,15 +310,14 @@ async function main(opts): Promise<void> {
console.log(HELP_MESSAGE);
exit(0);
}
- const options = { flags: "g" };
- const skip = Array.isArray(ignore)
- ? ignore.map((i: string): RegExp => glob(i, options))
- : [glob(ignore, options)];
- const match =
- args.length > 0
- ? args.map((a: string): RegExp => glob(a, options))
- : undefined;
- const files = walk(".", { match, skip });
+ const options: GlobOptions = { flags: "g" };
+
+ const files = getTargetFiles(
+ args.length ? args : ["."],
+ Array.isArray(ignore) ? ignore : [ignore],
+ options
+ );
+
try {
if (check) {
await checkSourceFiles(files, prettierOpts);