The previous API was inconsistent. The new one is
```js
--parser flow
--parser babylon
{parser: 'flow'}
{parser: 'babylon'}
```
if we ever want to add new parsers in the future it'll allow that more easily.
I put a console.log in parser.js in both functions and tested that the test suite worked both with and without the change in run_spec. I also tested that both the previous and new command line options are working.
At some point in the future we'll likely want to get rid of the old api but might as well keep supporting it so we don't break anyone for now.
93 lines
2.3 KiB
JavaScript
93 lines
2.3 KiB
JavaScript
"use strict";
|
|
const fs = require('fs');
|
|
const prettier = require("../");
|
|
const types = require("ast-types");
|
|
const parser = require('../src/parser');
|
|
|
|
const RUN_AST_TESTS = process.env["AST_COMPARE"];
|
|
|
|
// Ignoring empty statements that are added into the output removes a
|
|
// lot of noise from test failures and let's us focus on the real
|
|
// failures when comparing asts
|
|
function removeEmptyStatements(ast) {
|
|
return types.visit(ast, {
|
|
visitEmptyStatement: function(path) {
|
|
path.prune();
|
|
return false;
|
|
}
|
|
});
|
|
}
|
|
|
|
function run_spec(dirname, options) {
|
|
fs.readdirSync(dirname).forEach(filename => {
|
|
if (filename.endsWith('.js') && filename !== 'jsfmt.spec.js') {
|
|
const path = dirname + '/' + filename;
|
|
|
|
if (!RUN_AST_TESTS) {
|
|
const source = read(path).replace(/\r\n/g, '\n');
|
|
const output = prettyprint(source, path, options || {});
|
|
test(filename, () => {
|
|
expect(source + '~'.repeat(80) + '\n' + output).toMatchSnapshot();
|
|
});
|
|
}
|
|
|
|
if (RUN_AST_TESTS) {
|
|
const source = read(dirname + '/' + filename);
|
|
const ast = removeEmptyStatements(parse(source));
|
|
let prettyprinted = false;
|
|
let ppast;
|
|
let pperr = null;
|
|
try {
|
|
ppast = removeEmptyStatements(parse(prettyprint(source, path)));
|
|
}
|
|
catch(e) {
|
|
pperr = e.stack;
|
|
}
|
|
|
|
test(path + ' parse', () => {
|
|
expect(pperr).toBe(null);
|
|
expect(ppast).toBeDefined();
|
|
if(ast.errors.length === 0) {
|
|
expect(ast).toEqual(ppast);
|
|
}
|
|
});
|
|
}
|
|
|
|
}
|
|
});
|
|
}
|
|
global.run_spec = run_spec;
|
|
|
|
function stripLocation(ast) {
|
|
if (Array.isArray(ast)) {
|
|
return ast.map(e => stripLocation(e));
|
|
}
|
|
if (typeof ast === 'object') {
|
|
const newObj = {};
|
|
for (var key in ast) {
|
|
if (key === 'loc' || key === 'range' || key === 'raw' || key === 'comments') {
|
|
continue;
|
|
}
|
|
newObj[key] = stripLocation(ast[key]);
|
|
}
|
|
return newObj;
|
|
}
|
|
return ast;
|
|
}
|
|
|
|
function parse(string) {
|
|
return stripLocation(parser.parseWithFlow(string));
|
|
}
|
|
|
|
function prettyprint(src, filename, options) {
|
|
return prettier.format(src, Object.assign({
|
|
filename,
|
|
parser: 'flow',
|
|
printWidth: 80,
|
|
}, options));
|
|
}
|
|
|
|
function read(filename) {
|
|
return fs.readFileSync(filename, 'utf8');
|
|
}
|