spaider
Version:
Deterministic-first AI code assistant that crawls your codebase to implement changes using open source LLMs
162 lines • 6.7 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AST = void 0;
const ts_morph_1 = require("ts-morph");
const path = __importStar(require("path"));
var AST;
(function (AST) {
const project = new ts_morph_1.Project({
useInMemoryFileSystem: true,
compilerOptions: {
allowJs: true,
allowSyntheticDefaultImports: true,
esModuleInterop: true,
jsx: 1, // React JSX
target: 99, // ESNext
},
});
async function parseFile(file) {
try {
// Create source file in ts-morph
const sourceFile = project.createSourceFile(`temp_${Date.now()}_${path.basename(file.path)}`, file.content, { overwrite: true });
const semanticInfo = {
imports: [],
exports: [],
functions: [],
classes: [],
dependencies: new Set(),
};
// Extract imports
sourceFile.getImportDeclarations().forEach((importDecl) => {
const source = importDecl.getModuleSpecifierValue();
const specifiers = [];
// Default import
const defaultImport = importDecl.getDefaultImport();
if (defaultImport) {
specifiers.push(`default as ${defaultImport.getText()}`);
}
// Namespace import
const namespaceImport = importDecl.getNamespaceImport();
if (namespaceImport) {
specifiers.push(`* as ${namespaceImport.getText()}`);
}
// Named imports
importDecl.getNamedImports().forEach((namedImport) => {
const name = namedImport.getName();
const alias = namedImport.getAliasNode();
specifiers.push(alias ? `${name} as ${alias.getText()}` : name);
});
semanticInfo.imports.push({ source, specifiers });
if (source.startsWith("./") || source.startsWith("../")) {
semanticInfo.dependencies.add(source);
}
});
// Extract exports
sourceFile.getExportDeclarations().forEach((exportDecl) => {
exportDecl.getNamedExports().forEach((namedExport) => {
const name = namedExport.getName();
semanticInfo.exports.push({ name, type: "export" });
});
});
// Export assignments and default exports
sourceFile.getExportAssignments().forEach((exportAssign) => {
semanticInfo.exports.push({
name: exportAssign.isExportEquals() ? "export=" : "default",
type: "default",
});
});
// Functions (both declarations and exports)
sourceFile.getFunctions().forEach((func) => {
const name = func.getName() || "anonymous";
const params = func.getParameters().map((param) => {
const paramName = param.getName();
if (param.hasQuestionToken())
return `${paramName}?`;
if (param.isRestParameter())
return `...${paramName}`;
return paramName;
});
semanticInfo.functions.push({
name,
params,
line: func.getStartLineNumber(),
});
// If it's exported, add to exports
if (func.isExported()) {
semanticInfo.exports.push({ name, type: "function" });
}
});
// Classes
sourceFile.getClasses().forEach((cls) => {
const name = cls.getName() || "anonymous";
const methods = cls.getMethods().map((method) => method.getName());
semanticInfo.classes.push({
name,
methods,
line: cls.getStartLineNumber(),
});
// If it's exported, add to exports
if (cls.isExported()) {
semanticInfo.exports.push({ name, type: "class" });
}
});
// Variable exports
sourceFile.getVariableStatements().forEach((varStatement) => {
if (varStatement.isExported()) {
varStatement.getDeclarations().forEach((decl) => {
const name = decl.getName();
semanticInfo.exports.push({ name, type: "variable" });
});
}
});
// Clean up the temporary file
sourceFile.delete();
return semanticInfo;
}
catch (error) {
console.warn(`Failed to parse file ${file.path}:`, error);
return {
imports: [],
exports: [],
functions: [],
classes: [],
dependencies: new Set(),
};
}
}
AST.parseFile = parseFile;
})(AST || (exports.AST = AST = {}));
//# sourceMappingURL=ast.js.map