diff --git a/extensions/langs/gen-langs-map.cjs b/extensions/langs/gen-langs-map.cjs index c93d979f0..ad1f9c7ed 100644 --- a/extensions/langs/gen-langs-map.cjs +++ b/extensions/langs/gen-langs-map.cjs @@ -259,7 +259,6 @@ out += `// auto-generated by gen-langs-map.cjs – DO NOT EDIT\n`; out += importLines.join('\n') + (importLines.length ? '\n\n' : ''); out += `export const langs = {\n`; for (const [k, v] of sorted) { - const key = /^[a-z0-9_+-]+$/i.test(k) ? k : JSON.stringify(k); out += ` ${JSON.stringify(k)}: ${v},\n`; } out += `} satisfies Record LanguageSupport | StreamLanguage>;\n\n`; @@ -270,4 +269,82 @@ out += `export function loadLanguage(name: LanguageName) {\n`; out += ` return langs[name] ? langs[name]() : null;\n`; out += `}\n`; -process.stdout.write(out); \ No newline at end of file +process.stdout.write(out); + +// ── 自动同步 package.json 依赖 ────────────────────────────────── + +function extractPkgName(modulePath) { + // @scope/pkg/sub → @scope/pkg ; pkg/sub → pkg + if (modulePath.startsWith('@')) { + const parts = modulePath.split('/'); + return parts.slice(0, 2).join('/'); + } + return modulePath.split('/')[0]; +} + +function resolveVersionRange(pkgName) { + // 先找本包 node_modules,再找 monorepo 根 node_modules + const candidates = [ + path.resolve(__dirname, 'node_modules', pkgName, 'package.json'), + path.resolve(__dirname, '../../node_modules', pkgName, 'package.json'), + ]; + for (const p of candidates) { + if (fs.existsSync(p)) { + const { version } = JSON.parse(fs.readFileSync(p, 'utf8')); + const [major, minor] = version.split('.'); + // 0.x 版本下 ^0.0.0 范围太窄(仅匹配 <0.1.0),需用 ^0.minor.0 + return major === '0' ? `^0.${minor}.0` : `^${major}.0.0`; + } + } + return null; +} + +// 1) 收集所有被导入的包名 +const allModules = new Set(); + +if (needsStreamLanguage) { + allModules.add('@codemirror/language'); +} +for (const mod of namedImports.keys()) { + allModules.add(extractPkgName(mod)); +} +for (const mod of starImports.keys()) { + allModules.add(extractPkgName(mod)); +} +// 硬编码的 @replit 包 +allModules.add('@replit/codemirror-lang-nix'); +allModules.add('@replit/codemirror-lang-svelte'); +allModules.add('@replit/codemirror-lang-solidity'); + +// 2) 读取 package.json 并合并依赖 +const pkgJsonPath = path.resolve(__dirname, 'package.json'); +const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8')); +const deps = pkgJson.dependencies || {}; + +const added = []; +for (const mod of allModules) { + if (deps[mod]) continue; // 已有声明的保留原版本号不动 + const range = resolveVersionRange(mod); + if (range) { + deps[mod] = range; + added.push(` + ${mod}: ${range}`); + } else { + console.error(`[warn] 无法解析 ${mod} 的版本,跳过`); + } +} + +// 按字母序排列 +const sortedDeps = {}; +for (const key of Object.keys(deps).sort()) { + sortedDeps[key] = deps[key]; +} +pkgJson.dependencies = sortedDeps; + +fs.writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + '\n', 'utf8'); + +if (added.length) { + console.error(`[gen-langs-map] 已向 package.json 新增 ${added.length} 个依赖:`); + added.forEach(l => console.error(l)); +} else { + console.error('[gen-langs-map] package.json 依赖已是最新,无需更新。'); +} \ No newline at end of file diff --git a/extensions/langs/package.json b/extensions/langs/package.json index 49708dd35..40c8c9f92 100644 --- a/extensions/langs/package.json +++ b/extensions/langs/package.json @@ -30,12 +30,31 @@ "cjs" ], "peerDependencies": { - "@codemirror/language": ">=6.0.0", - "@codemirror/language-data": ">=6.0.0" + "@codemirror/language": ">=6.0.0" }, "dependencies": { + "@codemirror/lang-cpp": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-go": "^6.0.0", + "@codemirror/lang-html": "^6.0.0", + "@codemirror/lang-java": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/lang-jinja": "^6.0.0", + "@codemirror/lang-json": "^6.0.0", + "@codemirror/lang-less": "^6.0.0", + "@codemirror/lang-liquid": "^6.0.0", + "@codemirror/lang-markdown": "^6.0.0", + "@codemirror/lang-php": "^6.0.0", + "@codemirror/lang-python": "^6.0.0", + "@codemirror/lang-rust": "^6.0.0", + "@codemirror/lang-sass": "^6.0.0", + "@codemirror/lang-sql": "^6.0.0", + "@codemirror/lang-vue": "^0.1.0", + "@codemirror/lang-wast": "^6.0.0", + "@codemirror/lang-xml": "^6.0.0", + "@codemirror/lang-yaml": "^6.0.0", "@codemirror/language": "^6.0.0", - "@codemirror/language-data": "^6.5.1", + "@codemirror/legacy-modes": "^6.0.0", "@replit/codemirror-lang-nix": "^6.0.1", "@replit/codemirror-lang-solidity": "^6.0.1", "@replit/codemirror-lang-svelte": "^6.0.0", @@ -58,6 +77,7 @@ "devDependencies": { "@babel/generator": "^7.28.0", "@babel/parser": "^7.28.0", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.0", + "@codemirror/language-data": "6.5.2" } } diff --git a/extensions/langs/src/index.ts b/extensions/langs/src/index.ts index f79e1e0cf..3f434fa3b 100644 --- a/extensions/langs/src/index.ts +++ b/extensions/langs/src/index.ts @@ -6,6 +6,7 @@ import { go } from '@codemirror/lang-go'; import { html } from '@codemirror/lang-html'; import { java } from '@codemirror/lang-java'; import { javascript } from '@codemirror/lang-javascript'; +import { jinja } from '@codemirror/lang-jinja'; import { json } from '@codemirror/lang-json'; import { less } from '@codemirror/lang-less'; import { liquid } from '@codemirror/lang-liquid'; @@ -50,7 +51,6 @@ import { haskell } from '@codemirror/legacy-modes/mode/haskell'; import { haxe, hxml } from '@codemirror/legacy-modes/mode/haxe'; import { idl } from '@codemirror/legacy-modes/mode/idl'; import { jsonld } from '@codemirror/legacy-modes/mode/javascript'; -import { jinja2 } from '@codemirror/legacy-modes/mode/jinja2'; import { julia } from '@codemirror/legacy-modes/mode/julia'; import { liveScript } from '@codemirror/legacy-modes/mode/livescript'; import { lua } from '@codemirror/legacy-modes/mode/lua'; @@ -195,11 +195,11 @@ export const langs = { ini: () => StreamLanguage.define(properties), ino: () => cpp(), intr: () => StreamLanguage.define(dylan), - j2: () => StreamLanguage.define(jinja2), + j2: () => jinja(), jade: () => StreamLanguage.define(pug), java: () => java(), - jinja: () => StreamLanguage.define(jinja2), - jinja2: () => StreamLanguage.define(jinja2), + jinja: () => jinja(), + jinja2: () => jinja(), jl: () => StreamLanguage.define(julia), js: () => javascript(), json: () => json(), @@ -323,7 +323,10 @@ export const langs = { wl: () => StreamLanguage.define(mathematica), wls: () => StreamLanguage.define(mathematica), xml: () => xml(), + xq: () => StreamLanguage.define(xQuery), + xqm: () => StreamLanguage.define(xQuery), xquery: () => StreamLanguage.define(xQuery), + xqy: () => StreamLanguage.define(xQuery), xsd: () => xml(), xsl: () => xml(), xu: () => StreamLanguage.define(xu),