Skip to content

Commit

Permalink
Port prettier (#156)
Browse files Browse the repository at this point in the history
  • Loading branch information
kt3k authored and ry committed Jan 27, 2019
1 parent 37e3239 commit b792fe8
Show file tree
Hide file tree
Showing 10 changed files with 30,853 additions and 26 deletions.
3 changes: 3 additions & 0 deletions azure-pipelines.yml
Expand Up @@ -10,6 +10,7 @@ jobs:
- script: curl -L https://deno.land/x/install/install.sh | sh -s $(DENO_VERSION)
- script: echo '##vso[task.prependpath]$(HOME)/.deno/bin/'
- script: deno test.ts --allow-run --allow-net --allow-write
- script: deno format.ts --allow-run --allow-write --check

- job: 'Mac'
pool:
Expand All @@ -18,6 +19,7 @@ jobs:
- script: curl -L https://deno.land/x/install/install.sh | sh -s $(DENO_VERSION)
- script: echo '##vso[task.prependpath]$(HOME)/.deno/bin/'
- script: deno test.ts --allow-run --allow-net --allow-write
- script: deno format.ts --allow-run --allow-write --check

- job: 'Windows'
pool:
Expand All @@ -26,3 +28,4 @@ jobs:
- powershell: iwr https://deno.land/x/install/install.ps1 -out install.ps1; .\install.ps1 $(DENO_VERSION)
- script: echo '##vso[task.prependpath]C:\Users\VssAdministrator\.deno\bin\'
- script: 'C:\Users\VssAdministrator\.deno\bin\deno.exe test.ts --allow-run --allow-net --allow-write'
- script: 'C:\Users\VssAdministrator\.deno\bin\deno.exe format.ts --allow-run --allow-write --check'
Empty file modified flags/tests/parse.ts 100644 → 100755
Empty file.
145 changes: 122 additions & 23 deletions format.ts
@@ -1,36 +1,135 @@
#!/usr/bin/env deno --allow-run
#!/usr/bin/env deno --allow-run --allow-write
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
/**
* This script formats the source files in the repository.
*
* Usage: deno format.ts [--check]
*
* Options:
* --check Checks if the source files are formatted.
*/
import { args, platform, readAll, exit, run, readFile, writeFile } from "deno";
import { parse } from "./flags/mod.ts";
import { prettier, prettierPlugins } from "./prettier/prettier.ts";

import { readAll, exit, run } from "deno";
const encoder = new TextEncoder();
const decoder = new TextDecoder();

async function checkVersion() {
const prettierVersion = run({
args: ["bash", "-c", "prettier --version"],
stdout: "piped"
// Runs commands in cross-platform way
function xrun(opts) {
return run({
...opts,
args: platform.os === "win" ? ["cmd.exe", "/c", ...opts.args] : opts.args
});
const b = await readAll(prettierVersion.stdout);
const s = await prettierVersion.status();
if (s.code != 0) {
console.log("error calling prettier --version error");
exit(s.code);
}

// Gets the source files in the repository
async function getSourceFiles() {
return decoder
.decode(
await readAll(
xrun({
args: ["git", "ls-files"],
stdout: "piped"
}).stdout
)
)
.trim()
.split(/\r?\n/);
}

/**
* Checks if the file has been formatted with prettier.
*/
async function checkFile(
filename: string,
parser: "typescript" | "markdown"
): Promise<boolean> {
const text = decoder.decode(await readFile(filename));
const formatted = prettier.check(text, {
parser,
plugins: prettierPlugins
});

if (!formatted) {
// TODO: print some diff info here to show why this failed
console.error(`${filename} ... Not formatted`);
}

return formatted;
}

/**
* Formats the given file.
*/
async function formatFile(
filename: string,
parser: "typescript" | "markdown"
): Promise<void> {
const text = decoder.decode(await readFile(filename));
const formatted = prettier.format(text, {
parser,
plugins: prettierPlugins
});

if (text !== formatted) {
console.log(`Formatting ${filename}`);
await writeFile(filename, encoder.encode(formatted));
}
const version = new TextDecoder().decode(b).trim();
const requiredVersion = "1.15";
if (!version.startsWith(requiredVersion)) {
console.log(`Required prettier version: ${requiredVersion}`);
console.log(`Installed prettier version: ${version}`);
}

/**
* Checks if the all files have been formatted with prettier.
*/
async function checkSourceFiles() {
const checks = [];

(await getSourceFiles()).forEach(file => {
if (/\.ts$/.test(file)) {
checks.push(checkFile(file, "typescript"));
} else if (/\.md$/.test(file)) {
checks.push(checkFile(file, "markdown"));
}
});

const results = await Promise.all(checks);

if (results.every(result => result)) {
exit(0);
} else {
exit(1);
}
}

async function main() {
await checkVersion();
/**
* Formats the all files with prettier.
*/
async function formatSourceFiles() {
const formats = [];

const prettier = run({
args: ["bash", "-c", "prettier --write '**/*.ts' '**/*.md'"]
(await getSourceFiles()).forEach(file => {
if (/\.ts$/.test(file)) {
formats.push(formatFile(file, "typescript"));
} else if (/\.md$/.test(file)) {
formats.push(formatFile(file, "markdown"));
}
});
const s = await prettier.status();
exit(s.code);

await Promise.all(formats);
exit(0);
}

async function main(opts) {
try {
if (opts.check) {
await checkSourceFiles();
} else {
await formatSourceFiles();
}
} catch (e) {
console.log(e);
exit(1);
}
}

main();
main(parse(args));
2 changes: 1 addition & 1 deletion fs/path/interface.ts
Expand Up @@ -24,4 +24,4 @@ export interface ParsedPath {
name: string;
}

export type FormatInputPathObject = Partial<ParsedPath>
export type FormatInputPathObject = Partial<ParsedPath>;
2 changes: 1 addition & 1 deletion fs/path/mod.ts
Expand Up @@ -980,7 +980,7 @@ export const win32 = {
} else {
ret.name = path.slice(startPart, startDot);
ret.base = path.slice(startPart, end);
ret.ext = path.slice(startDot, end);
ret.ext = path.slice(startDot, end);
}

// If the directory is the root, use the entire root as the `dir` including
Expand Down
11 changes: 11 additions & 0 deletions prettier/parser_markdown.js

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions prettier/parser_typescript.js

Large diffs are not rendered by default.

9 changes: 9 additions & 0 deletions prettier/prettier.ts
@@ -0,0 +1,9 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import "./standalone.js";
import "./parser_typescript.js";
import "./parser_markdown.js";

// TODO: provide decent type declarions for these
const { prettier, prettierPlugins } = window as any;

export { prettier, prettierPlugins };

0 comments on commit b792fe8

Please sign in to comment.