Skip to content

Commit 035453d

Browse files
committed
bin/validate
1 parent 898b1a9 commit 035453d

File tree

8 files changed

+172
-11
lines changed

8 files changed

+172
-11
lines changed

bin/format.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import parseArgs from "minimist";
22
import {Resource} from "../format/resource";
33
import {fromFile, fromStdin} from "../lib/input";
4-
import {formatResource} from "../lib/tools";
4+
import {formatMessage, formatResource} from "../lib/tools";
55

66
const argv = parseArgs(process.argv.slice(2), {
7-
boolean: ["help", "group"],
7+
boolean: ["help"],
8+
string: ["message"],
89
alias: {
910
help: "h",
10-
group: "g",
11+
message: "m",
1112
},
1213
});
1314

@@ -38,13 +39,19 @@ function exitHelp(exitCode: number) {
3839
3940
Options:
4041
41-
-h, --help Display help and quit.
42+
-h, --help Display help and quit.
43+
-m, --message ID Format only the message called ID.
4244
`);
4345
process.exit(exitCode);
4446
}
4547

4648
function print(source: string) {
4749
let resource = new Resource(source);
48-
let results = formatResource(resource, new Map());
50+
let results;
51+
if (argv.message) {
52+
results = formatMessage(resource, new Map(), argv.message);
53+
} else {
54+
results = formatResource(resource, new Map());
55+
}
4956
console.log(JSON.stringify(results, null, 4));
5057
}

bin/validate.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import parseArgs from "minimist";
2+
import {fromFile} from "../lib/input";
3+
import {validate} from "../lib/validate";
4+
5+
const argv = parseArgs(process.argv.slice(2), {
6+
boolean: ["help"],
7+
alias: {
8+
help: "h",
9+
},
10+
});
11+
12+
let [exePath, mdPath] = argv._;
13+
if (exePath && mdPath) {
14+
fromFile(mdPath, source => validate(exePath, mdPath, source));
15+
} else if (argv.help) {
16+
exitHelp(0);
17+
} else {
18+
exitHelp(1);
19+
}
20+
21+
function exitHelp(exitCode: number) {
22+
console.log(`
23+
Usage: node validate.js <EXECUTABLE> <SPEC>
24+
25+
Examples:
26+
27+
node validate.js build/bin/format.js spec/format/text_element.md
28+
29+
Options:
30+
31+
-h, --help Display help and quit.
32+
`);
33+
process.exit(exitCode);
34+
}

lib/tools.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,13 @@ export function formatResource(resource: Resource, variables: Variables) {
3131
}
3232
return results;
3333
}
34+
35+
export function formatMessage(resource: Resource, variables: Variables, id: string) {
36+
let bundle = new Bundle();
37+
bundle.addResource(resource);
38+
39+
let message = bundle.getMessage(id);
40+
if (message && message.value) {
41+
return bundle.formatPattern(message.value, variables);
42+
}
43+
}

lib/types.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
declare module "json-diff" {
2+
export function diffString(actual: string, expected: string): string;
3+
}

lib/validate.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import {deepStrictEqual} from "assert";
2+
import {execSync} from "child_process";
3+
import {Parser as MarkdownParser} from "commonmark";
4+
import {diffString} from "json-diff";
5+
6+
export function validate(exe: string, spec: string, source: string) {
7+
// https://github.com/commonmark/commonmark.js/blob/master/README.md#usage
8+
let reader = new MarkdownParser();
9+
let parsed = reader.parse(source);
10+
let walker = parsed.walker();
11+
12+
let counter = 1;
13+
let actual = null;
14+
let current;
15+
while ((current = walker.next())) {
16+
let {entering, node} = current;
17+
if (entering && node.type === "code_block" && node.literal !== null) {
18+
if (node.info === "properties") {
19+
actual = execSync(exe, {
20+
input: node.literal,
21+
encoding: "utf8",
22+
});
23+
} else if (node.info === "json" && actual) {
24+
let expected = node.literal;
25+
26+
try {
27+
deepStrictEqual(JSON.parse(actual), JSON.parse(expected));
28+
console.log(`${spec} Example ${counter++} PASS`);
29+
} catch (err) {
30+
console.log(`${spec} Example ${counter++} FAIL`);
31+
console.log(diffString(err.actual, err.expected));
32+
}
33+
actual = null;
34+
}
35+
}
36+
}
37+
}

package-lock.json

Lines changed: 40 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,24 +33,24 @@
3333
"url": "https://github.com/projectfluent/fluent/issues"
3434
},
3535
"devDependencies": {
36+
"@types/commonmark": "^0.27.4",
3637
"@types/minimist": "^1.2.0",
3738
"@types/mocha": "^5.2.7",
3839
"@types/node": "^12.0.4",
3940
"babylon": "^6.18.0",
4041
"cli-color": "^1.2.0",
42+
"commonmark": "^0.29.0",
4143
"difflib": "^0.2.4",
44+
"esm": "^3.2.25",
4245
"fluent": "^0.6.4",
4346
"fluent-syntax": "^0.7.0",
4447
"gh-pages": "^1.1.0",
4548
"gitbook-cli": "^2.3.0",
4649
"json-diff": "^0.5.2",
50+
"minimist": "^1.2.0",
4751
"prettier": "^1.17.1",
4852
"mocha": "^6.1.4",
4953
"ts-node": "^8.2.0",
5054
"typescript": "^3.5.1"
51-
},
52-
"dependencies": {
53-
"esm": "^3.2.25",
54-
"minimist": "^1.2.0"
5555
}
5656
}

spec/format/text_element.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# TextElement
2+
3+
Patterns are composed of `PatternElements`, which can be `TextElements` or
4+
`Placeables`. `TextElements` represent the verbatim content of the
5+
translation.
6+
7+
```properties
8+
test = Text
9+
```
10+
11+
```json
12+
{
13+
"value": "Text",
14+
"errors": []
15+
}
16+
```
17+
18+
Multiline `TextElements` must be formatted without changes to newlines and
19+
whitespace.
20+
21+
```properties
22+
test =
23+
Multiline
24+
Content
25+
```
26+
27+
```json
28+
{
29+
"value": "Multiline\n Content",
30+
"errors": []
31+
}
32+
```

0 commit comments

Comments
 (0)