UNPKG

repograph

Version:

Generate rich, semantic, and interactive codemaps with a functional, composable API for Node.js.

70 lines (68 loc) 2.81 kB
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