/* eslint-disable no-console -- 构建脚本,向终端打印进度是它的正当输出 */ import { copyFileSync, mkdirSync } from 'node:fs' import { createRequire } from 'node:module' import path from 'node:path' import process from 'node:process' import * as esbuild from 'esbuild' import { getWasmPath } from 'tree-sitter-wasm' const production = process.argv.includes('--production') const watch = process.argv.includes('--watch') /** @type {import('esbuild').BuildOptions} */ const options = { entryPoints: ['src/extension.ts'], bundle: true, outfile: 'dist/index.cjs', external: ['vscode'], format: 'cjs', platform: 'node', target: 'node20', sourcemap: !production, minify: production, logLevel: 'info', } // 代码阅读的解析运行时(web-tree-sitter,由 esbuild 打进 index.cjs)和它要加载的 wasm: // 运行时按 __dirname 找 dist/tree-sitter/,语法包只带用到的几种语言 const TREE_SITTER_WASM = [ 'tree-sitter.wasm', 'tree-sitter-typescript.wasm', 'tree-sitter-tsx.wasm', 'tree-sitter-javascript.wasm', 'tree-sitter-python.wasm', 'tree-sitter-bash.wasm', ] // @vscode/tree-sitter-wasm 没有的语法包,从 tree-sitter-wasm(预编译、签过名的各家语法包)拿:语言名 → 它的 wasm const EXTRA_GRAMMARS = ['dockerfile'] function copyTreeSitterWasm() { const from = path.dirname(createRequire(import.meta.url).resolve('@vscode/tree-sitter-wasm')) const to = 'dist/tree-sitter' mkdirSync(to, { recursive: true }) for (const file of TREE_SITTER_WASM) copyFileSync(path.join(from, file), path.join(to, file)) for (const language of EXTRA_GRAMMARS) copyFileSync(getWasmPath(language), path.join(to, `tree-sitter-${language}.wasm`)) } async function main() { copyTreeSitterWasm() if (watch) { const ctx = await esbuild.context(options) await ctx.watch() console.log('[esbuild] watching...') } else { await esbuild.build(options) } } main().catch((err) => { console.error(err) process.exit(1) })