diff --git a/assets/codemirror-languages.json b/assets/codemirror-languages.json index 0ec2dd8276..1ec42c9e05 100644 --- a/assets/codemirror-languages.json +++ b/assets/codemirror-languages.json @@ -453,7 +453,6 @@ ".htmlhintrc", ".imgbotconfig", ".nycrc", - ".secrets.baseline", ".tern-config", ".tern-project", ".watchmanconfig", diff --git a/package.json b/package.json index 9e79cb805d..2b24d7e798 100644 --- a/package.json +++ b/package.json @@ -98,6 +98,7 @@ "globals": "17.7.0", "happy-dom": "20.10.6", "jiti": "2.7.0", + "linguist-languages": "9.4.0", "markdownlint-cli": "0.49.1", "material-icon-theme": "5.36.1", "postcss-html": "1.8.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fe5e221d42..9a0a347885 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -276,6 +276,9 @@ importers: jiti: specifier: 2.7.0 version: 2.7.0 + linguist-languages: + specifier: 9.4.0 + version: 9.4.0 markdownlint-cli: specifier: 0.49.1 version: 0.49.1 @@ -3190,6 +3193,9 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linguist-languages@9.4.0: + resolution: {integrity: sha512-mYnFVrsWg5Bex0Kl5EDcXhrjXZ5DqMlBDXo7EUWLMTLDpxbuHvgBb2aOvGWC5ZmMJ2HXEKJiuFie9NEs8NUMXg==} + linkify-it@5.0.2: resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==} @@ -7653,6 +7659,8 @@ snapshots: lines-and-columns@1.2.4: {} + linguist-languages@9.4.0: {} + linkify-it@5.0.2: dependencies: uc.micro: 2.1.0 diff --git a/renovate.json5 b/renovate.json5 index 98b79270e2..e263bf06da 100644 --- a/renovate.json5 +++ b/renovate.json5 @@ -114,17 +114,22 @@ { "matchManagers": ["npm"], "postUpdateOptions": ["pnpmDedupe"], + }, + { + "matchPackageNames": ["@primer/octicons", "material-icon-theme", "svgo"], "postUpgradeTasks": { - "commands": ["make svg", "make generate-codemirror-languages"], + "commands": ["make svg"], "fileFilters": [ - "package.json", - "pnpm-lock.yaml", - "pnpm-workspace.yaml", "public/assets/img/svg/**", "options/fileicon/**", - "assets/codemirror-languages.json", ], - "executionMode": "branch", + }, + }, + { + "matchPackageNames": ["@codemirror/language-data", "linguist-languages"], + "postUpgradeTasks": { + "commands": ["make generate-codemirror-languages"], + "fileFilters": ["assets/codemirror-languages.json"], }, }, ], diff --git a/tools/generate-codemirror-languages.ts b/tools/generate-codemirror-languages.ts index 28636dee82..7d3c1ca878 100755 --- a/tools/generate-codemirror-languages.ts +++ b/tools/generate-codemirror-languages.ts @@ -1,9 +1,8 @@ #!/usr/bin/env node -import {load as parseYaml} from 'js-yaml'; import {writeFile} from 'node:fs/promises'; import {languages as cmLanguages} from '@codemirror/language-data'; - -const linguistUrl = 'https://raw.githubusercontent.com/github-linguist/linguist/main/lib/linguist/languages.yml'; +import * as linguist from 'linguist-languages'; +import type {Language} from 'linguist-languages'; const renames: Record = { 'Protocol Buffer': 'ProtoBuf', @@ -35,22 +34,12 @@ const extraExtensions: Record = { 'Properties files': ['conf'], }; -type LinguistEntry = { - type: string; - extensions?: string[]; - filenames?: string[]; -}; - type CmLanguage = { name: string; extensions: string[]; filenames: string[]; }; -const res = await fetch(linguistUrl); -if (!res.ok) throw new Error(`fetch ${linguistUrl} failed: ${res.status}`); -const linguist = parseYaml(await res.text()) as Record; - const cmByAlias = new Map(); // Map of extension -> the CM language that originally owns it. Used to prevent Linguist // from broadening one language's extension claim into another's territory (e.g. Linguist's @@ -66,7 +55,7 @@ for (const lang of cmLanguages) { const out: CmLanguage[] = []; const seen = new Set(); -for (const [linguistName, entry] of Object.entries(linguist)) { +for (const [linguistName, entry] of Object.entries(linguist as Record)) { const cmName = renames[linguistName] ?? cmByAlias.get(linguistName.toLowerCase()); // Multiple Linguist entries can alias to the same CM language (e.g. JSON5 → JSON). if (!cmName || skipNames.has(cmName) || seen.has(cmName)) continue;