repograph
Version:
Generate rich, semantic, and interactive codemaps with a functional, composable API for Node.js.
70 lines (68 loc) • 2.81 kB
JavaScript
import * as Parser from 'web-tree-sitter';
import path from 'path';
import fs from 'fs';
import { fileURLToPath } from 'url';
import { analyzeFileContent, logger, ParserError } from 'repograph-core';
// src/tree-sitter/languages.ts
var getDirname = () => path.dirname(fileURLToPath(import.meta.url));
var loadedLanguages = /* @__PURE__ */ new Map();
var isInitialized = false;
var initializeParser = async () => {
if (isInitialized) return;
await Parser.Parser.init();
isInitialized = true;
};
var findWasmFile = async (config) => {
const wasmFileName = path.basename(config.wasmPath);
if (!wasmFileName) {
throw new ParserError(`Invalid wasmPath format for ${config.name}: ${config.wasmPath}.`, config.name);
}
const currentDir = getDirname();
const distWasmPath = path.resolve(currentDir, "wasm", wasmFileName);
if (fs.existsSync(distWasmPath)) return distWasmPath;
const projectDistWasmPath = path.resolve(currentDir, "../../dist/wasm", wasmFileName);
if (fs.existsSync(projectDistWasmPath)) return projectDistWasmPath;
try {
const [pkgName, ...rest] = config.wasmPath.split("/");
const wasmPathInPkg = rest.join("/");
const pkgJsonUrl = await import.meta.resolve(`${pkgName}/package.json`);
const pkgDir = path.dirname(fileURLToPath(pkgJsonUrl));
const resolvedWasmPath = path.join(pkgDir, wasmPathInPkg);
if (fs.existsSync(resolvedWasmPath)) {
return resolvedWasmPath;
}
} catch (e) {
}
throw new ParserError(`WASM file for ${config.name} not found. Looked in ${distWasmPath}, ${projectDistWasmPath}, and tried resolving from node_modules.`, config.name);
};
var loadLanguage = async (config) => {
if (loadedLanguages.has(config.name)) {
return loadedLanguages.get(config.name);
}
await initializeParser();
try {
const wasmPath = await findWasmFile(config);
logger.debug(`Loading WASM for ${config.name} from: ${wasmPath}`);
const language = await Parser.Language.load(wasmPath);
const loadedLanguage = { config, language };
loadedLanguages.set(config.name, loadedLanguage);
return loadedLanguage;
} catch (error) {
const message = `Failed to load Tree-sitter WASM file for ${config.name}.`;
logger.error(message, error);
throw new ParserError(message, config.name, error);
}
};
var createParserForLanguage = async (config) => {
const { language } = await loadLanguage(config);
const parser = new Parser.Parser();
parser.setLanguage(language);
return parser;
};
async function processFileInWorker({ file, langConfig }) {
const parser = await createParserForLanguage(langConfig);
return analyzeFileContent({ file, langConfig, parser });
}
export { processFileInWorker as default };
//# sourceMappingURL=analyzer.worker.js.map
//# sourceMappingURL=analyzer.worker.js.map