diff --git a/.eslintrc.cjs b/.eslintrc.cjs index cef29130e..13c349892 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -20,9 +20,6 @@ module.exports = { "unicorn", "@typescript-eslint", ], - settings: { - "import/internal-regex": "^linguist-languages/", - }, rules: { "@typescript-eslint/prefer-ts-expect-error": "error", "arrow-body-style": ["error", "as-needed"], diff --git a/scripts/build/esbuild-plugins/evaluate.mjs b/scripts/build/esbuild-plugins/evaluate.mjs index 052c94c12..ef9d02c07 100644 --- a/scripts/build/esbuild-plugins/evaluate.mjs +++ b/scripts/build/esbuild-plugins/evaluate.mjs @@ -18,12 +18,16 @@ export default function esbuildPluginEvaluate() { data = data.default; } - const json = JSON.stringify(data, (_, v) => { - if (typeof v === "function") { - throw new TypeError("Cannot evaluate functions."); - } - return v; - }); + const json = JSON.stringify( + data, + (_, v) => { + if (typeof v === "function") { + throw new TypeError("Cannot evaluate functions."); + } + return v; + }, + 2 + ); return { loader: "json", contents: json }; }); diff --git a/src/language-css/index.js b/src/language-css/index.js index 90299cbfc..ce49aace5 100644 --- a/src/language-css/index.js +++ b/src/language-css/index.js @@ -1,49 +1,8 @@ -import { createRequire } from "node:module"; -import createLanguage from "../utils/create-language.js"; import printer from "./printer-postcss.js"; -import options from "./options.js"; -import parsers from "./parsers.js"; -const require = createRequire(import.meta.url); - -const languages = [ - createLanguage(require("linguist-languages/data/CSS.json"), (data) => ({ - since: "1.4.0", - parsers: ["css"], - vscodeLanguageIds: ["css"], - extensions: [ - ...data.extensions, - // `WeiXin Style Sheets`(Weixin Mini Programs) - // https://developers.weixin.qq.com/miniprogram/en/dev/framework/view/wxs/ - ".wxss", - ], - })), - createLanguage(require("linguist-languages/data/PostCSS.json"), () => ({ - since: "1.4.0", - parsers: ["css"], - vscodeLanguageIds: ["postcss"], - })), - createLanguage(require("linguist-languages/data/Less.json"), () => ({ - since: "1.4.0", - parsers: ["less"], - vscodeLanguageIds: ["less"], - })), - createLanguage(require("linguist-languages/data/SCSS.json"), () => ({ - since: "1.4.0", - parsers: ["scss"], - vscodeLanguageIds: ["scss"], - })), -]; - -const printers = { +export const printers = { postcss: printer, }; - -const language = { - languages, - options, - printers, - parsers, -}; - -export default language; +export { default as languages } from "./languages.evaluate.js"; +export { default as options } from "./options.js"; +export { default as parsers } from "./parsers.js"; diff --git a/src/language-css/languages.evaluate.js b/src/language-css/languages.evaluate.js new file mode 100644 index 000000000..96ce0c50a --- /dev/null +++ b/src/language-css/languages.evaluate.js @@ -0,0 +1,33 @@ +import linguistLanguages from "linguist-languages"; +import createLanguage from "../utils/create-language.js"; + +const languages = [ + createLanguage(linguistLanguages.CSS, (data) => ({ + since: "1.4.0", + parsers: ["css"], + vscodeLanguageIds: ["css"], + extensions: [ + ...data.extensions, + // `WeiXin Style Sheets`(Weixin Mini Programs) + // https://developers.weixin.qq.com/miniprogram/en/dev/framework/view/wxs/ + ".wxss", + ], + })), + createLanguage(linguistLanguages.PostCSS, () => ({ + since: "1.4.0", + parsers: ["css"], + vscodeLanguageIds: ["postcss"], + })), + createLanguage(linguistLanguages.Less, () => ({ + since: "1.4.0", + parsers: ["less"], + vscodeLanguageIds: ["less"], + })), + createLanguage(linguistLanguages.SCSS, () => ({ + since: "1.4.0", + parsers: ["scss"], + vscodeLanguageIds: ["scss"], + })), +]; + +export default languages; diff --git a/src/language-graphql/index.js b/src/language-graphql/index.js index bba85d210..903f953c7 100644 --- a/src/language-graphql/index.js +++ b/src/language-graphql/index.js @@ -1,28 +1,8 @@ -import { createRequire } from "node:module"; -import createLanguage from "../utils/create-language.js"; import printer from "./printer-graphql.js"; -import options from "./options.js"; -import parsers from "./parsers.js"; -const require = createRequire(import.meta.url); - -const languages = [ - createLanguage(require("linguist-languages/data/GraphQL.json"), () => ({ - since: "1.5.0", - parsers: ["graphql"], - vscodeLanguageIds: ["graphql"], - })), -]; - -const printers = { +export const printers = { graphql: printer, }; - -const language = { - languages, - options, - printers, - parsers, -}; - -export default language; +export { default as languages } from "./languages.evaluate.js"; +export { default as options } from "./options.js"; +export { default as parsers } from "./parsers.js"; diff --git a/src/language-graphql/languages.evaluate.js b/src/language-graphql/languages.evaluate.js new file mode 100644 index 000000000..63c3d1421 --- /dev/null +++ b/src/language-graphql/languages.evaluate.js @@ -0,0 +1,12 @@ +import linguistLanguages from "linguist-languages"; +import createLanguage from "../utils/create-language.js"; + +const languages = [ + createLanguage(linguistLanguages.GraphQL, () => ({ + since: "1.5.0", + parsers: ["graphql"], + vscodeLanguageIds: ["graphql"], + })), +]; + +export default languages; diff --git a/src/language-handlebars/index.js b/src/language-handlebars/index.js index b8af42e0e..0d67ef58a 100644 --- a/src/language-handlebars/index.js +++ b/src/language-handlebars/index.js @@ -1,26 +1,7 @@ -import { createRequire } from "node:module"; -import createLanguage from "../utils/create-language.js"; import printer from "./printer-glimmer.js"; -import parsers from "./parsers.js"; -const require = createRequire(import.meta.url); - -const languages = [ - createLanguage(require("linguist-languages/data/Handlebars.json"), () => ({ - since: "2.3.0", - parsers: ["glimmer"], - vscodeLanguageIds: ["handlebars"], - })), -]; - -const printers = { +export const printers = { glimmer: printer, }; - -const language = { - languages, - printers, - parsers, -}; - -export default language; +export { default as languages } from "./languages.evaluate.js"; +export { default as parsers } from "./parsers.js"; diff --git a/src/language-handlebars/languages.evaluate.js b/src/language-handlebars/languages.evaluate.js new file mode 100644 index 000000000..722bce415 --- /dev/null +++ b/src/language-handlebars/languages.evaluate.js @@ -0,0 +1,12 @@ +import linguistLanguages from "linguist-languages"; +import createLanguage from "../utils/create-language.js"; + +const languages = [ + createLanguage(linguistLanguages.Handlebars, () => ({ + since: "2.3.0", + parsers: ["glimmer"], + vscodeLanguageIds: ["handlebars"], + })), +]; + +export default languages; diff --git a/src/language-html/index.js b/src/language-html/index.js index 7abc16fab..193f19d27 100644 --- a/src/language-html/index.js +++ b/src/language-html/index.js @@ -1,53 +1,8 @@ -import { createRequire } from "node:module"; -import createLanguage from "../utils/create-language.js"; import printer from "./printer-html.js"; -import options from "./options.js"; -import parsers from "./parsers.js"; -const require = createRequire(import.meta.url); - -const languages = [ - createLanguage(require("linguist-languages/data/HTML.json"), () => ({ - name: "Angular", - since: "1.15.0", - parsers: ["angular"], - vscodeLanguageIds: ["html"], - extensions: [".component.html"], - filenames: [], - })), - createLanguage(require("linguist-languages/data/HTML.json"), (data) => ({ - since: "1.15.0", - parsers: ["html"], - vscodeLanguageIds: ["html"], - extensions: [ - ...data.extensions, - ".mjml", // MJML is considered XML in Linguist but it should be formatted as HTML - ], - })), - createLanguage(require("linguist-languages/data/HTML.json"), () => ({ - name: "Lightning Web Components", - since: "1.17.0", - parsers: ["lwc"], - vscodeLanguageIds: ["html"], - extensions: [], - filenames: [], - })), - createLanguage(require("linguist-languages/data/Vue.json"), () => ({ - since: "1.10.0", - parsers: ["vue"], - vscodeLanguageIds: ["vue"], - })), -]; - -const printers = { +export const printers = { html: printer, }; - -const language = { - languages, - printers, - options, - parsers, -}; - -export default language; +export { default as languages } from "./languages.evaluate.js"; +export { default as options } from "./options.js"; +export { default as parsers } from "./parsers.js"; diff --git a/src/language-html/languages.evaluate.js b/src/language-html/languages.evaluate.js new file mode 100644 index 000000000..cfc1ebe99 --- /dev/null +++ b/src/language-html/languages.evaluate.js @@ -0,0 +1,37 @@ +import linguistLanguages from "linguist-languages"; +import createLanguage from "../utils/create-language.js"; + +const languages = [ + createLanguage(linguistLanguages.HTML, () => ({ + name: "Angular", + since: "1.15.0", + parsers: ["angular"], + vscodeLanguageIds: ["html"], + extensions: [".component.html"], + filenames: [], + })), + createLanguage(linguistLanguages.HTML, (data) => ({ + since: "1.15.0", + parsers: ["html"], + vscodeLanguageIds: ["html"], + extensions: [ + ...data.extensions, + ".mjml", // MJML is considered XML in Linguist but it should be formatted as HTML + ], + })), + createLanguage(linguistLanguages.HTML, () => ({ + name: "Lightning Web Components", + since: "1.17.0", + parsers: ["lwc"], + vscodeLanguageIds: ["html"], + extensions: [], + filenames: [], + })), + createLanguage(linguistLanguages.Vue, () => ({ + since: "1.10.0", + parsers: ["vue"], + vscodeLanguageIds: ["vue"], + })), +]; + +export default languages; diff --git a/src/language-js/index.js b/src/language-js/index.js index 0acdeaefc..039dd3de9 100644 --- a/src/language-js/index.js +++ b/src/language-js/index.js @@ -1,128 +1,10 @@ -import { createRequire } from "node:module"; -import createLanguage from "../utils/create-language.js"; import estreePrinter from "./printer-estree.js"; import estreeJsonPrinter from "./printer-estree-json.js"; -import options from "./options.js"; -import parsers from "./parse/parsers.js"; -const require = createRequire(import.meta.url); - -const languages = [ - createLanguage( - require("linguist-languages/data/JavaScript.json"), - (data) => ({ - since: "0.0.0", - parsers: [ - "babel", - "acorn", - "espree", - "meriyah", - "babel-flow", - "babel-ts", - "flow", - "typescript", - ], - vscodeLanguageIds: ["javascript", "mongo"], - interpreters: [ - ...data.interpreters, - // https://github.com/google/zx - "zx", - ], - extensions: [ - ...data.extensions.filter((extension) => extension !== ".jsx"), - // WeiXin Script (Weixin Mini Programs) - // https://developers.weixin.qq.com/miniprogram/en/dev/framework/view/wxs/ - ".wxs", - ], - }) - ), - createLanguage(require("linguist-languages/data/JavaScript.json"), () => ({ - name: "Flow", - since: "0.0.0", - parsers: ["flow", "babel-flow"], - vscodeLanguageIds: ["javascript"], - aliases: [], - filenames: [], - extensions: [".js.flow"], - })), - createLanguage(require("linguist-languages/data/JavaScript.json"), () => ({ - name: "JSX", - since: "0.0.0", - parsers: [ - "babel", - "babel-flow", - "babel-ts", - "flow", - "typescript", - "espree", - "meriyah", - ], - vscodeLanguageIds: ["javascriptreact"], - aliases: undefined, - filenames: undefined, - extensions: [".jsx"], - group: "JavaScript", - interpreters: undefined, - tmScope: "source.js.jsx", - aceMode: "javascript", - codemirrorMode: "jsx", - codemirrorMimeType: "text/jsx", - color: undefined, - })), - createLanguage( - require("linguist-languages/data/TypeScript.json"), - (data) => ({ - since: "1.4.0", - parsers: ["typescript", "babel-ts"], - vscodeLanguageIds: ["typescript"], - extensions: [...data.extensions, ".mts", ".cts"], - }) - ), - createLanguage(require("linguist-languages/data/TSX.json"), () => ({ - since: "1.4.0", - parsers: ["typescript", "babel-ts"], - vscodeLanguageIds: ["typescriptreact"], - })), - createLanguage(require("linguist-languages/data/JSON.json"), () => ({ - name: "JSON.stringify", - since: "1.13.0", - parsers: ["json-stringify"], - vscodeLanguageIds: ["json"], - extensions: [".importmap"], // .json file defaults to json instead of json-stringify - filenames: ["package.json", "package-lock.json", "composer.json"], - })), - createLanguage(require("linguist-languages/data/JSON.json"), (data) => ({ - since: "1.5.0", - parsers: ["json"], - vscodeLanguageIds: ["json"], - extensions: data.extensions.filter((extension) => extension !== ".jsonl"), - })), - createLanguage( - require("linguist-languages/data/JSON with Comments.json"), - (data) => ({ - since: "1.5.0", - parsers: ["json"], - vscodeLanguageIds: ["jsonc"], - filenames: [...data.filenames, ".eslintrc", ".swcrc"], - }) - ), - createLanguage(require("linguist-languages/data/JSON5.json"), () => ({ - since: "1.13.0", - parsers: ["json5"], - vscodeLanguageIds: ["json5"], - })), -]; - -const printers = { +export const printers = { estree: estreePrinter, "estree-json": estreeJsonPrinter, }; - -const language = { - languages, - options, - printers, - parsers, -}; - -export default language; +export { default as languages } from "./languages.evaluate.js"; +export { default as options } from "./options.js"; +export { default as parsers } from "./parse/parsers.js"; diff --git a/src/language-js/languages.evaluate.js b/src/language-js/languages.evaluate.js new file mode 100644 index 000000000..245bf2051 --- /dev/null +++ b/src/language-js/languages.evaluate.js @@ -0,0 +1,101 @@ +import linguistLanguages from "linguist-languages"; +import createLanguage from "../utils/create-language.js"; + +const languages = [ + createLanguage(linguistLanguages.JavaScript, (data) => ({ + since: "0.0.0", + parsers: [ + "babel", + "acorn", + "espree", + "meriyah", + "babel-flow", + "babel-ts", + "flow", + "typescript", + ], + vscodeLanguageIds: ["javascript", "mongo"], + interpreters: [ + ...data.interpreters, + // https://github.com/google/zx + "zx", + ], + extensions: [ + ...data.extensions.filter((extension) => extension !== ".jsx"), + // WeiXin Script (Weixin Mini Programs) + // https://developers.weixin.qq.com/miniprogram/en/dev/framework/view/wxs/ + ".wxs", + ], + })), + createLanguage(linguistLanguages.JavaScript, () => ({ + name: "Flow", + since: "0.0.0", + parsers: ["flow", "babel-flow"], + vscodeLanguageIds: ["javascript"], + aliases: [], + filenames: [], + extensions: [".js.flow"], + })), + createLanguage(linguistLanguages.JavaScript, () => ({ + name: "JSX", + since: "0.0.0", + parsers: [ + "babel", + "babel-flow", + "babel-ts", + "flow", + "typescript", + "espree", + "meriyah", + ], + vscodeLanguageIds: ["javascriptreact"], + aliases: undefined, + filenames: undefined, + extensions: [".jsx"], + group: "JavaScript", + interpreters: undefined, + tmScope: "source.js.jsx", + aceMode: "javascript", + codemirrorMode: "jsx", + codemirrorMimeType: "text/jsx", + color: undefined, + })), + createLanguage(linguistLanguages.TypeScript, (data) => ({ + since: "1.4.0", + parsers: ["typescript", "babel-ts"], + vscodeLanguageIds: ["typescript"], + extensions: [...data.extensions, ".mts", ".cts"], + })), + createLanguage(linguistLanguages.TSX, () => ({ + since: "1.4.0", + parsers: ["typescript", "babel-ts"], + vscodeLanguageIds: ["typescriptreact"], + })), + createLanguage(linguistLanguages.JSON, () => ({ + name: "JSON.stringify", + since: "1.13.0", + parsers: ["json-stringify"], + vscodeLanguageIds: ["json"], + extensions: [".importmap"], // .json file defaults to json instead of json-stringify + filenames: ["package.json", "package-lock.json", "composer.json"], + })), + createLanguage(linguistLanguages.JSON, (data) => ({ + since: "1.5.0", + parsers: ["json"], + vscodeLanguageIds: ["json"], + extensions: data.extensions.filter((extension) => extension !== ".jsonl"), + })), + createLanguage(linguistLanguages["JSON with Comments"], (data) => ({ + since: "1.5.0", + parsers: ["json"], + vscodeLanguageIds: ["jsonc"], + filenames: [...data.filenames, ".eslintrc", ".swcrc"], + })), + createLanguage(linguistLanguages.JSON5, () => ({ + since: "1.13.0", + parsers: ["json5"], + vscodeLanguageIds: ["json5"], + })), +]; + +export default languages; diff --git a/src/language-markdown/index.js b/src/language-markdown/index.js index 8a5a1d9c8..475ed81e8 100644 --- a/src/language-markdown/index.js +++ b/src/language-markdown/index.js @@ -1,38 +1,8 @@ -import { createRequire } from "node:module"; -import createLanguage from "../utils/create-language.js"; import printer from "./printer-markdown.js"; -import options from "./options.js"; -import parsers from "./parsers.js"; -const require = createRequire(import.meta.url); - -const languages = [ - createLanguage(require("linguist-languages/data/Markdown.json"), (data) => ({ - since: "1.8.0", - parsers: ["markdown"], - vscodeLanguageIds: ["markdown"], - filenames: [...data.filenames, "README"], - extensions: data.extensions.filter((extension) => extension !== ".mdx"), - })), - createLanguage(require("linguist-languages/data/Markdown.json"), () => ({ - name: "MDX", - since: "1.15.0", - parsers: ["mdx"], - vscodeLanguageIds: ["mdx"], - filenames: [], - extensions: [".mdx"], - })), -]; - -const printers = { +export const printers = { mdast: printer, }; - -const language = { - languages, - options, - printers, - parsers, -}; - -export default language; +export { default as languages } from "./languages.evaluate.js"; +export { default as options } from "./options.js"; +export { default as parsers } from "./parsers.js"; diff --git a/src/language-markdown/languages.evaluate.js b/src/language-markdown/languages.evaluate.js new file mode 100644 index 000000000..037e71d5e --- /dev/null +++ b/src/language-markdown/languages.evaluate.js @@ -0,0 +1,22 @@ +import linguistLanguages from "linguist-languages"; +import createLanguage from "../utils/create-language.js"; + +const languages = [ + createLanguage(linguistLanguages.Markdown, (data) => ({ + since: "1.8.0", + parsers: ["markdown"], + vscodeLanguageIds: ["markdown"], + filenames: [...data.filenames, "README"], + extensions: data.extensions.filter((extension) => extension !== ".mdx"), + })), + createLanguage(linguistLanguages.Markdown, () => ({ + name: "MDX", + since: "1.15.0", + parsers: ["mdx"], + vscodeLanguageIds: ["mdx"], + filenames: [], + extensions: [".mdx"], + })), +]; + +export default languages; diff --git a/src/language-yaml/index.js b/src/language-yaml/index.js index f18ce46f7..55c1301fc 100644 --- a/src/language-yaml/index.js +++ b/src/language-yaml/index.js @@ -1,30 +1,8 @@ -import { createRequire } from "node:module"; -import createLanguage from "../utils/create-language.js"; import printer from "./printer-yaml.js"; -import options from "./options.js"; -import parsers from "./parsers.js"; -const require = createRequire(import.meta.url); - -const languages = [ - createLanguage(require("linguist-languages/data/YAML.json"), (data) => ({ - since: "1.14.0", - parsers: ["yaml"], - vscodeLanguageIds: ["yaml", "ansible", "home-assistant"], - // yarn.lock is not YAML: https://github.com/yarnpkg/yarn/issues/5629 - filenames: [ - ...data.filenames.filter((filename) => filename !== "yarn.lock"), - ".prettierrc", - ".stylelintrc", - ], - })), -]; - -const language = { - languages, - printers: { yaml: printer }, - options, - parsers, +export const printers = { + yaml: printer, }; - -export default language; +export { default as languages } from "./languages.evaluate.js"; +export { default as options } from "./options.js"; +export { default as parsers } from "./parsers.js"; diff --git a/src/language-yaml/languages.evaluate.js b/src/language-yaml/languages.evaluate.js new file mode 100644 index 000000000..701f6dcbe --- /dev/null +++ b/src/language-yaml/languages.evaluate.js @@ -0,0 +1,18 @@ +import linguistLanguages from "linguist-languages"; +import createLanguage from "../utils/create-language.js"; + +const languages = [ + createLanguage(linguistLanguages.YAML, (data) => ({ + since: "1.14.0", + parsers: ["yaml"], + vscodeLanguageIds: ["yaml", "ansible", "home-assistant"], + // yarn.lock is not YAML: https://github.com/yarnpkg/yarn/issues/5629 + filenames: [ + ...data.filenames.filter((filename) => filename !== "yarn.lock"), + ".prettierrc", + ".stylelintrc", + ], + })), +]; + +export default languages; diff --git a/src/languages.js b/src/languages.js index 73b7d426e..0b43a2085 100644 --- a/src/languages.js +++ b/src/languages.js @@ -1,10 +1,10 @@ -import js from "./language-js/index.js"; -import css from "./language-css/index.js"; -import handlebars from "./language-handlebars/index.js"; -import graphql from "./language-graphql/index.js"; -import markdown from "./language-markdown/index.js"; -import html from "./language-html/index.js"; -import yaml from "./language-yaml/index.js"; +import * as js from "./language-js/index.js"; +import * as css from "./language-css/index.js"; +import * as handlebars from "./language-handlebars/index.js"; +import * as graphql from "./language-graphql/index.js"; +import * as markdown from "./language-markdown/index.js"; +import * as html from "./language-html/index.js"; +import * as yaml from "./language-yaml/index.js"; // We need to list the parsers and getters so we can load them only when necessary. const languages = [