Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 79 additions & 2 deletions extensions/langs/gen-langs-map.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, () => LanguageSupport | StreamLanguage<unknown>>;\n\n`;
Expand All @@ -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);
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 依赖已是最新,无需更新。');
}
28 changes: 24 additions & 4 deletions extensions/langs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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"
}
}
11 changes: 7 additions & 4 deletions extensions/langs/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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';
Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -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),
Expand Down