diff --git a/src/cli/format.js b/src/cli/format.js index fc58f0081..535611c79 100644 --- a/src/cli/format.js +++ b/src/cli/format.js @@ -1,6 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import chalk from "chalk"; +import { createTwoFilesPatch } from "diff"; import * as prettier from "../index.js"; import thirdParty from "../common/third-party.js"; import { createIsIgnoredFunction, errors } from "./prettier-internal.js"; @@ -13,12 +14,7 @@ import { statSafe } from "./utils.js"; const { getStdin } = thirdParty; -let createTwoFilesPatch; -async function diff(a, b) { - if (!createTwoFilesPatch) { - ({ createTwoFilesPatch } = await import("diff")); - } - +function diff(a, b) { return createTwoFilesPatch("", "", a, b, "", "", { context: 2 }); } @@ -137,8 +133,7 @@ async function format(context, input, opt) { const pppp = await prettier.format(pp, opt); if (pp !== pppp) { throw new errors.DebugError( - "prettier(input) !== prettier(prettier(input))\n" + - (await diff(pp, pppp)) + "prettier(input) !== prettier(prettier(input))\n" + diff(pp, pppp) ); } else { const stringify = (obj) => JSON.stringify(obj, null, 2); @@ -155,12 +150,12 @@ async function format(context, input, opt) { const astDiff = ast.length > MAX_AST_SIZE || past.length > MAX_AST_SIZE ? "AST diff too large to render" - : await diff(ast, past); + : diff(ast, past); throw new errors.DebugError( "ast(input) !== ast(prettier(input))\n" + astDiff + "\n" + - (await diff(input, pp)) + diff(input, pp) ); } /* c8 ignore end */ diff --git a/src/language-css/parser-postcss.js b/src/language-css/parser-postcss.js index b7ff26953..37f907850 100644 --- a/src/language-css/parser-postcss.js +++ b/src/language-css/parser-postcss.js @@ -1,3 +1,9 @@ +import postcssParse from "postcss/lib/parse"; +import postcssLess from "postcss-less"; +import postcssScssParse from "postcss-scss/lib/scss-parse"; +import PostcssValuesParser from "postcss-values-parser/lib/parser.js"; +import PostcssSelectorParser from "postcss-selector-parser/dist/processor.js"; +import postcssMediaQueryParser from "postcss-media-query-parser"; import createError from "../common/parser-create-error.js"; import parseFrontMatter from "../utils/front-matter/parse.js"; import { hasPragma } from "./pragma.js"; @@ -21,7 +27,7 @@ const getHighestAncestor = (node) => { return node; }; -async function parseValueNode(valueNode, options) { +function parseValueNode(valueNode, options) { const { nodes } = valueNode; let parenGroup = { open: null, @@ -55,7 +61,7 @@ async function parseValueNode(valueNode, options) { if (node.type === "func" && node.value === "selector") { node.group.groups = [ - await parseSelector( + parseSelector( getHighestAncestor(valueNode).text.slice( node.group.open.sourceIndex + 1, node.group.close.sourceIndex @@ -190,13 +196,13 @@ function addMissingType(node) { return node; } -async function parseNestedValue(node, options) { +function parseNestedValue(node, options) { if (node && typeof node === "object") { for (const key in node) { if (key !== "parent") { - await parseNestedValue(node[key], options); + parseNestedValue(node[key], options); if (key === "nodes") { - node.group = flattenGroups(await parseValueNode(node, options)); + node.group = flattenGroups(parseValueNode(node, options)); delete node[key]; } } @@ -206,16 +212,14 @@ async function parseNestedValue(node, options) { return node; } -async function parseValue(value, options) { +function parseValue(value, options) { // Inline javascript in Less if (options.parser === "less" && value.startsWith("~`")) { return { type: "value-unknown", value }; } - const Parser = await import("postcss-values-parser/lib/parser.js").then( - (m) => m.default - ); - const valueParser = (source, options) => new Parser(source, options); + const valueParser = (source, options) => + new PostcssValuesParser(source, options); let result = null; @@ -230,12 +234,12 @@ async function parseValue(value, options) { result.text = value; - const parsedResult = await parseNestedValue(result, options); + const parsedResult = parseNestedValue(result, options); return addTypePrefix(parsedResult, "value-", /^selector-/); } -async function parseSelector(selector) { +function parseSelector(selector) { // If there's a comment inside of a selector, the parser tries to parse // the content of the comment as selectors which turns it into complete // garbage. Better to print the whole selector as-is and not try to parse @@ -247,10 +251,7 @@ async function parseSelector(selector) { }; } - const SelectorProcessor = await import( - "postcss-selector-parser/dist/processor.js" - ).then((m) => m.default); - const selectorParser = (processor) => new SelectorProcessor(processor); + const selectorParser = (processor) => new PostcssSelectorParser(processor); let result = null; @@ -274,15 +275,11 @@ async function parseSelector(selector) { return addTypePrefix(result, "selector-"); } -async function parseMediaQuery(params) { - const mediaParser = await import("postcss-media-query-parser").then( - (m) => m.default.default - ); - +function parseMediaQuery(params) { let result = null; try { - result = mediaParser(params); + result = postcssMediaQueryParser.default(params); } catch { // Ignore bad media queries /* c8 ignore next 4 */ @@ -298,12 +295,12 @@ async function parseMediaQuery(params) { const DEFAULT_SCSS_DIRECTIVE = /(\s*)(!default).*$/; const GLOBAL_SCSS_DIRECTIVE = /(\s*)(!global).*$/; -async function parseNestedCSS(node, options) { +function parseNestedCSS(node, options) { if (node && typeof node === "object") { delete node.parent; for (const key in node) { - await parseNestedCSS(node[key], options); + parseNestedCSS(node[key], options); } if (!node.type) { @@ -344,7 +341,7 @@ async function parseNestedCSS(node, options) { } let ast; try { - ast = await parse(fakeContent, { ...options }); + ast = parse(fakeContent, { ...options }); } catch { // noop } @@ -424,7 +421,7 @@ async function parseNestedCSS(node, options) { /* c8 ignore next 6 */ // Ignore LESS mixins if (node.mixin) { - node.selector = await parseValue(selector, options); + node.selector = parseValue(selector, options); return node; } @@ -434,7 +431,7 @@ async function parseNestedCSS(node, options) { node.isSCSSNesterProperty = true; } - node.selector = await parseSelector(selector); + node.selector = parseSelector(selector); return node; } @@ -469,7 +466,7 @@ async function parseNestedCSS(node, options) { }; } - node.value = await parseValue(value, options); + node.value = parseValue(value, options); } if ( @@ -483,7 +480,7 @@ async function parseNestedCSS(node, options) { // `:extend()` is parsed as value if (node.extend && !node.selector) { delete node.value; - node.selector = await parseSelector(value.slice("extend(".length, -1)); + node.selector = parseSelector(value.slice("extend(".length, -1)); } } @@ -496,7 +493,7 @@ async function parseNestedCSS(node, options) { node.name + node.raws.afterName + node.raws.params; - node.selector = await parseSelector(source); + node.selector = parseSelector(source); delete node.params; return node; } @@ -511,7 +508,7 @@ async function parseNestedCSS(node, options) { if (options.parser === "css" && node.name === "custom-selector") { const customSelector = node.params.match(/:--\S+\s+/)[0].trim(); node.customSelector = customSelector; - node.selector = await parseSelector( + node.selector = parseSelector( node.params.slice(customSelector.length).trim() ); delete node.params; @@ -527,7 +524,7 @@ async function parseNestedCSS(node, options) { node.variable = true; const parts = node.name.split(":"); node.name = parts[0]; - node.value = await parseValue(parts.slice(1).join(":"), options); + node.value = parseValue(parts.slice(1).join(":"), options); } // `@color :blue;` @@ -538,7 +535,7 @@ async function parseNestedCSS(node, options) { node.variable = true; const text = node.params.slice(1); if (text) { - node.value = await parseValue(text, options); + node.value = parseValue(text, options); } node.raws.afterName += ":"; } @@ -570,7 +567,7 @@ async function parseNestedCSS(node, options) { } if (name === "extend" || name === "nest") { - node.selector = await parseSelector(params); + node.selector = parseSelector(params); delete node.params; return node; @@ -578,9 +575,9 @@ async function parseNestedCSS(node, options) { if (name === "at-root") { if (/^\(\s*(?:without|with)\s*:.+\)$/s.test(params)) { - node.params = await parseValue(params, options); + node.params = parseValue(params, options); } else { - node.selector = await parseSelector(params); + node.selector = parseSelector(params); delete node.params; } @@ -590,7 +587,7 @@ async function parseNestedCSS(node, options) { if (isModuleRuleName(lowercasedName)) { node.import = true; delete node.filename; - node.params = await parseValue(params, options); + node.params = parseValue(params, options); return node; } @@ -619,7 +616,7 @@ async function parseNestedCSS(node, options) { // Move spaces after the `(`, so we can keep the range correct params = params.replace(/^(?!if)(\S+)(\s+)\(/, "$1($2"); - node.value = await parseValue(params, options); + node.value = parseValue(params, options); delete node.params; return node; @@ -634,7 +631,7 @@ async function parseNestedCSS(node, options) { }; } - node.params = await parseMediaQuery(params); + node.params = parseMediaQuery(params); return node; } @@ -648,7 +645,7 @@ async function parseNestedCSS(node, options) { return node; } -async function parseWithParser(parse, text, options) { +function parseWithParser(parse, text, options) { const parsed = parseFrontMatter(text); const { frontMatter } = parsed; text = parsed.content; @@ -674,7 +671,7 @@ async function parseWithParser(parse, text, options) { } options.originalText = text; - result = await parseNestedCSS(addTypePrefix(result, "css-"), options); + result = parseNestedCSS(addTypePrefix(result, "css-"), options); calculateLoc(result, text); @@ -689,26 +686,22 @@ async function parseWithParser(parse, text, options) { return result; } -async function parseCss(text, options = {}) { - const parse = await import("postcss/lib/parse").then((m) => m.default); - return parseWithParser(parse, text, options); +function parseCss(text, options = {}) { + return parseWithParser(postcssParse.default, text, options); } -async function parseLess(text, options = {}) { - const less = await import("postcss-less"); - +function parseLess(text, options = {}) { return parseWithParser( // Workaround for https://github.com/shellscape/postcss-less/issues/145 // See comments for `replaceQuotesInInlineComments` in `loc.js`. - (text) => less.parse(replaceQuotesInInlineComments(text)), + (text) => postcssLess.parse(replaceQuotesInInlineComments(text)), text, options ); } -async function parseScss(text, options = {}) { - const { default: parse } = await import("postcss-scss/lib/scss-parse"); - return parseWithParser(parse, text, options); +function parseScss(text, options = {}) { + return parseWithParser(postcssScssParse, text, options); } const postCssParser = { diff --git a/src/language-graphql/parser-graphql.js b/src/language-graphql/parser-graphql.js index 277bd2de8..2696d64bd 100644 --- a/src/language-graphql/parser-graphql.js +++ b/src/language-graphql/parser-graphql.js @@ -1,3 +1,4 @@ +import { parse as parseGraphql } from "graphql/language/parser.mjs"; import createError from "../common/parser-create-error.js"; import { hasPragma } from "./pragma.js"; import { locStart, locEnd } from "./loc.js"; @@ -31,14 +32,11 @@ function createParseError(error) { return error; } -async function parse(text /*, options */) { - // Inline `import()` to avoid loading all the JS if we don't use it - const { parse } = await import("graphql/language/parser.mjs"); - +function parse(text /*, options */) { /** @type {any} */ let ast; try { - ast = parse(text, parseOptions); + ast = parseGraphql(text, parseOptions); } catch (error) { throw createParseError(error); } diff --git a/src/language-handlebars/parser-glimmer.js b/src/language-handlebars/parser-glimmer.js index b527ce304..981882d10 100644 --- a/src/language-handlebars/parser-glimmer.js +++ b/src/language-handlebars/parser-glimmer.js @@ -1,3 +1,9 @@ +/* + The module version `@glimmer/syntax/dist/modules/es2017/lib/parser/tokenizer-event-handlers.js` + can't be be imported since it use `.js` extension, and don't have `type: module` in `package.json` + We'll replace it during build + */ +import { preprocess as parseGlimmer } from "@glimmer/syntax/dist/commonjs/es2017/lib/parser/tokenizer-event-handlers.js"; import { LinesAndColumns } from "lines-and-columns"; import createError from "../common/parser-create-error.js"; import { locStart, locEnd } from "./loc.js"; @@ -47,19 +53,10 @@ function createPlugin(text) { }); } -async function parse(text /*, options */) { - // Inline `import()` to avoid loading all the JS if we don't use it - /* - The module version `@glimmer/syntax/dist/modules/es2017/lib/parser/tokenizer-event-handlers.js` - can't be be imported since it use `.js` extension, and don't have `type: module` in `package.json` - We'll replace it during build - */ - const { preprocess: glimmer } = await import( - "@glimmer/syntax/dist/commonjs/es2017/lib/parser/tokenizer-event-handlers.js" - ); +function parse(text /*, options */) { let ast; try { - ast = glimmer(text, { + ast = parseGlimmer(text, { mode: "codemod", plugins: { ast: [createPlugin(text)] }, }); diff --git a/src/language-html/conditional-comment.js b/src/language-html/conditional-comment.js index eb9640da4..9cc8ce44b 100644 --- a/src/language-html/conditional-comment.js +++ b/src/language-html/conditional-comment.js @@ -1,3 +1,5 @@ +import { ParseSourceSpan } from "angular-html-parser"; + // https://css-tricks.com/how-to-create-an-ie-only-stylesheet const parseFunctions = [ @@ -18,29 +20,23 @@ const parseFunctions = [ }, ]; -function parseIeConditionalComment(angularHtmlParser, node, parseHtml) { +function parseIeConditionalComment(node, parseHtml) { if (node.value) { for (const { regex, parse } of parseFunctions) { const match = node.value.match(regex); if (match) { - return parse(angularHtmlParser, node, parseHtml, match); + return parse(node, parseHtml, match); } } } return null; } -function parseIeConditionalStartEndComment( - angularHtmlParser, - node, - parseHtml, - match -) { +function parseIeConditionalStartEndComment(node, parseHtml, match) { const [, openingTagSuffix, condition, data] = match; const offset = "