Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make options argument in parsers optional #11892

Merged
merged 2 commits into from Dec 2, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/language-css/parser-postcss.js
Expand Up @@ -619,7 +619,7 @@ function parseWithParser(parse, text, options) {
}

// TODO: make this only work on css
function parseCss(text, parsers, options) {
function parseCss(text, parsers, options = {}) {
const isSCSSParser = isSCSS(options.parser, text);
const parseFunctions = isSCSSParser
? [parseScss, parseLess]
Expand All @@ -640,7 +640,7 @@ function parseCss(text, parsers, options) {
}
}

function parseLess(text, parsers, options) {
function parseLess(text, parsers, options = {}) {
const lessParser = require("postcss-less");
return parseWithParser(
// Workaround for https://github.com/shellscape/postcss-less/issues/145
Expand All @@ -651,7 +651,7 @@ function parseLess(text, parsers, options) {
);
}

function parseScss(text, parsers, options) {
function parseScss(text, parsers, options = {}) {
const { parse } = require("postcss-scss");
return parseWithParser(parse, text, options);
}
Expand Down
28 changes: 18 additions & 10 deletions src/language-html/parser-html.js
Expand Up @@ -25,6 +25,7 @@ const { locStart, locEnd } = require("./loc.js");
* @typedef {import('angular-html-parser/lib/compiler/src/ml_parser/ast').Element} Element
* @typedef {import('angular-html-parser/lib/compiler/src/ml_parser/parser').ParseTreeResult} ParserTreeResult
* @typedef {Omit<import('angular-html-parser').ParseOptions, 'canSelfClose'> & {
* name?: 'html' | 'angular' | 'vue' | 'lwc';
* recognizeSelfClosing?: boolean;
* normalizeTagName?: boolean;
* normalizeAttributeName?: boolean;
Expand Down Expand Up @@ -365,6 +366,7 @@ function _parse(text, options, parserOptions, shouldParseFrontMatter = true) {
* @param {ParserOptions} parserOptions
*/
function createParser({
name,
recognizeSelfClosing = false,
normalizeTagName = false,
normalizeAttributeName = false,
Expand All @@ -374,14 +376,18 @@ function createParser({
} = {}) {
return {
parse: (text, parsers, options) =>
_parse(text, options, {
recognizeSelfClosing,
normalizeTagName,
normalizeAttributeName,
allowHtmComponentClosingTags,
isTagNameCaseSensitive,
getTagContentType,
}),
_parse(
text,
{ parser: name, ...options },
{
recognizeSelfClosing,
normalizeTagName,
normalizeAttributeName,
allowHtmComponentClosingTags,
isTagNameCaseSensitive,
getTagContentType,
}
),
hasPragma,
astFormat: "html",
locStart,
Expand All @@ -392,13 +398,15 @@ function createParser({
module.exports = {
parsers: {
html: createParser({
name: "html",
recognizeSelfClosing: true,
normalizeTagName: true,
normalizeAttributeName: true,
allowHtmComponentClosingTags: true,
}),
angular: createParser(),
angular: createParser({ name: "angular" }),
vue: createParser({
name: "vue",
recognizeSelfClosing: true,
isTagNameCaseSensitive: true,
getTagContentType: (tagName, prefix, hasParent, attrs) => {
Expand All @@ -414,6 +422,6 @@ module.exports = {
}
},
}),
lwc: createParser(),
lwc: createParser({ name: "lwc" }),
},
};
2 changes: 1 addition & 1 deletion src/language-js/parse/espree.js
Expand Up @@ -32,7 +32,7 @@ function createParseError(error) {
return createError(message, { start: { line: lineNumber, column } });
}

function parse(originalText, parsers, options) {
function parse(originalText, parsers, options = {}) {
const { parse } = require("espree");

const textToParse = replaceHashbang(originalText);
Expand Down
6 changes: 3 additions & 3 deletions src/language-js/parse/flow.js
Expand Up @@ -45,7 +45,7 @@ function createParseError(error) {
});
}

function parse(text, parsers, opts) {
function parse(text, parsers, options = {}) {
// Inline the require to avoid loading all the JS if we don't use it
const { parse } = require("flow-parser");
const ast = parse(replaceHashbang(text), parseOptions);
Expand All @@ -54,8 +54,8 @@ function parse(text, parsers, opts) {
throw createParseError(error);
}

opts.originalText = text;
return postprocess(ast, opts);
options.originalText = text;
return postprocess(ast, options);
}

// Export as a plugin so we can reuse the same bundle for UMD loading
Expand Down
2 changes: 1 addition & 1 deletion src/language-js/parse/meriyah.js
Expand Up @@ -71,7 +71,7 @@ function createParseError(error) {
return createError(message, { start: { line, column } });
}

function parse(text, parsers, options) {
function parse(text, parsers, options = {}) {
const { result: ast, error: moduleParseError } = tryCombinations(
() => parseWithOptions(text, /* module */ true),
() => parseWithOptions(text, /* module */ false)
Expand Down
8 changes: 4 additions & 4 deletions src/language-js/parse/typescript.js
Expand Up @@ -32,7 +32,7 @@ function createParseError(error) {
});
}

function parse(text, parsers, opts) {
function parse(text, parsers, options = {}) {
const textToParse = replaceHashbang(text);
const jsx = isProbablyJsx(text);

Expand All @@ -49,9 +49,9 @@ function parse(text, parsers, opts) {
throw createParseError(firstError);
}

opts.originalText = text;
opts.tsParseResult = result;
return postprocess(result.ast, opts);
options.originalText = text;
options.tsParseResult = result;
return postprocess(result.ast, options);
}

/**
Expand Down
27 changes: 27 additions & 0 deletions tests/integration/__tests__/parser-api.js
Expand Up @@ -29,6 +29,33 @@ test("allows usage of prettier's supported parsers", () => {
expect(output).toBe("bar();\n");
});

test("parsers should allow omit optional arguments", () => {
let parsers;
try {
prettier.format("{}", {
parser(text, builtinParsers) {
parsers = builtinParsers;
},
});
} catch {
// noop
}

expect(typeof parsers.babel).toBe("function");
const code = {
graphql: "type A {hero: Character}",
default: "{}",
};
for (const [name, parse] of Object.entries(parsers)) {
// Private parser should not be used by users
if (name.startsWith("__")) {
continue;
}

expect(() => parse(code[name] || code.default)).not.toThrow();
}
});

test("allows add empty `trailingComments` array", () => {
const output = prettier.format("(foo /* comment */)( )", {
parser(text, parsers) {
Expand Down