{"metadata":{"repo_dir":"/Users/wellingtonsantana/Documents/kodus-git/kodus-graph/tests/fixtures/sample-repo","files_parsed":5,"total_nodes":20,"total_edges":24,"duration_ms":40,"parse_errors":0,"extract_errors":0},"nodes":[ {"kind":"Function","ast_kind":"call_expression","name":"AuthService","qualified_name":"tests/auth.test.ts::AuthService","file_path":"tests/auth.test.ts","line_start":2,"line_end":12,"language":"typescript","is_test":false,"file_hash":"0eaee881e15b1779029ca9f1642b8165db0d0c3763c265b7262aa72bb15b9b9a","content_hash":"27a5760e1484f2780ba1056b833f0dc9111f4e7e332ca63d61ad5995310ab49a"}, {"kind":"Function","ast_kind":"call_expression","name":"should authenticate valid user","qualified_name":"tests/auth.test.ts::should authenticate valid user","file_path":"tests/auth.test.ts","line_start":3,"line_end":6,"language":"typescript","is_test":false,"file_hash":"0eaee881e15b1779029ca9f1642b8165db0d0c3763c265b7262aa72bb15b9b9a","content_hash":"a05fd413d73d474cacb0f096940838e7c08a91b4e7ef99bd3e75c7bf3b6bdd13"}, {"kind":"Function","ast_kind":"call_expression","name":"verifyToken returns true for non-empty","qualified_name":"tests/auth.test.ts::verifyToken returns true for non-empty","file_path":"tests/auth.test.ts","line_start":8,"line_end":11,"language":"typescript","is_test":false,"file_hash":"0eaee881e15b1779029ca9f1642b8165db0d0c3763c265b7262aa72bb15b9b9a","content_hash":"fc57696babdd2781291da0e8a38a411f84de6ef5357a98b85834109e72e2319c"}, {"kind":"Method","ast_kind":"method_definition","name":"getProfile","qualified_name":"src/user.service.ts::UserService.getProfile","file_path":"src/user.service.ts","line_start":1,"line_end":3,"language":"typescript","parent_name":"UserService","params":"(userId: number)","return_type":"Promise","is_test":false,"file_hash":"812161c35b8ddf7e0108f138224f08298d03211a7b5697b6ce683f6e8e91555b","content_hash":"1429446d602c5f2dac86b86ba8b84b932bc2c032ee1eb1e6c35e68c09aa7df4e","is_exported":true,"is_async":true}, {"kind":"Constructor","ast_kind":"method_definition","name":"AuthController.constructor","qualified_name":"src/controller.ts::AuthController.AuthController.constructor","file_path":"src/controller.ts","line_start":4,"line_end":7,"language":"typescript","parent_name":"AuthController","params":"(\n private readonly authService: AuthService,\n private readonly userService: UserService,\n )","is_test":false,"file_hash":"b3efa29415716f1ea22d6247e699e96c347856d6ba37752178c0f9c8a6e48cf2","content_hash":"813be258320164c25be9d1d2da3c53d5db513991cb01bbafd4e882010dd22e62","is_exported":true}, {"kind":"Method","ast_kind":"method_definition","name":"login","qualified_name":"src/controller.ts::AuthController.login","file_path":"src/controller.ts","line_start":9,"line_end":12,"language":"typescript","parent_name":"AuthController","params":"(req: Request)","return_type":"Promise","is_test":false,"file_hash":"b3efa29415716f1ea22d6247e699e96c347856d6ba37752178c0f9c8a6e48cf2","content_hash":"f8d1878536827f9372ac45cd039ed484f959f3b74646a4fe2dfc2f0c989f0c75","is_exported":true,"is_async":true}, {"kind":"Function","ast_kind":"function_declaration","name":"findUser","qualified_name":"src/db.ts::findUser","file_path":"src/db.ts","line_start":0,"line_end":2,"language":"typescript","params":"(id: number)","return_type":"Promise","is_test":false,"file_hash":"3709c3b9e7d13f288436d11607397672c1bd71930ee58583936c81fa512ce54f","content_hash":"e1c23d205f61473f9f25f7d984d00239049996966d1feec8e4a9a774764017b9","is_exported":true,"is_async":true}, {"kind":"Function","ast_kind":"function_declaration","name":"saveUser","qualified_name":"src/db.ts::saveUser","file_path":"src/db.ts","line_start":4,"line_end":4,"language":"typescript","params":"(user: User)","return_type":"Promise","is_test":false,"file_hash":"3709c3b9e7d13f288436d11607397672c1bd71930ee58583936c81fa512ce54f","content_hash":"c692bfaaf80164098d1126fd11914034731f6384f41c58f5e7c24cd69d8574b3","is_exported":true,"is_async":true}, {"kind":"Constructor","ast_kind":"method_definition","name":"AuthService.constructor","qualified_name":"src/auth.ts::AuthService.AuthService.constructor","file_path":"src/auth.ts","line_start":8,"line_end":8,"language":"typescript","parent_name":"AuthService","params":"(private readonly config: AuthConfig)","is_test":false,"file_hash":"eeb3e626616885f9278dda74860345065a31937d19ce76199bd422cf286a5d9e","content_hash":"7c4569d532c69328ec6f1354f2139fbda05369536465e12b89523c55c5234549","is_exported":true}, {"kind":"Method","ast_kind":"method_definition","name":"authenticate","qualified_name":"src/auth.ts::AuthService.authenticate","file_path":"src/auth.ts","line_start":10,"line_end":14,"language":"typescript","parent_name":"AuthService","params":"(ctx: Context)","return_type":"Promise","is_test":false,"file_hash":"eeb3e626616885f9278dda74860345065a31937d19ce76199bd422cf286a5d9e","content_hash":"6b0fbc161c5b356dee65c673faf5fffb48c2372583074f84a2af9a1ffa1e87cf","is_exported":true,"is_async":true}, {"kind":"Method","ast_kind":"method_definition","name":"verifyToken","qualified_name":"src/auth.ts::AuthService.verifyToken","file_path":"src/auth.ts","line_start":16,"line_end":18,"language":"typescript","parent_name":"AuthService","params":"(token: string)","return_type":"boolean","is_test":false,"file_hash":"eeb3e626616885f9278dda74860345065a31937d19ce76199bd422cf286a5d9e","content_hash":"805832f70ee62e8958a486b6af63dc7cbbfb5a6352051937f9fc7a65e607f92f","is_exported":true}, {"kind":"Function","ast_kind":"function_declaration","name":"hashPassword","qualified_name":"src/auth.ts::hashPassword","file_path":"src/auth.ts","line_start":21,"line_end":23,"language":"typescript","params":"(password: string)","return_type":"string","is_test":false,"file_hash":"eeb3e626616885f9278dda74860345065a31937d19ce76199bd422cf286a5d9e","content_hash":"35dfdf6bf22a2d7b67129eaea4625f17bbfc922c88548ebb26bdd36ffaaec8b3","is_exported":true}, {"kind":"Function","ast_kind":"arrow_function","name":"validateEmail","qualified_name":"src/auth.ts::validateEmail","file_path":"src/auth.ts","line_start":25,"line_end":27,"language":"typescript","params":"(email: string)","return_type":"boolean","is_test":false,"file_hash":"eeb3e626616885f9278dda74860345065a31937d19ce76199bd422cf286a5d9e","content_hash":"cf5e26647fb5296b40576c2563e934f9c8450a97bdc48639ce0263c254102e3c"}, {"kind":"Class","ast_kind":"class_declaration","name":"UserService","qualified_name":"src/user.service.ts::UserService","file_path":"src/user.service.ts","line_start":0,"line_end":4,"language":"typescript","is_test":false,"file_hash":"812161c35b8ddf7e0108f138224f08298d03211a7b5697b6ce683f6e8e91555b","content_hash":"6f918c30b8354011c4f0a56816160430bdcec5d2f70f0388b0fcc151961f1b4e","is_exported":true}, {"kind":"Class","ast_kind":"class_declaration","name":"AuthController","qualified_name":"src/controller.ts::AuthController","file_path":"src/controller.ts","line_start":3,"line_end":13,"language":"typescript","is_test":false,"file_hash":"b3efa29415716f1ea22d6247e699e96c347856d6ba37752178c0f9c8a6e48cf2","content_hash":"d1af9f5d21a9bfcded01aadd26878227a265cc7726c38f3f0ad2ddb65a20b8ab","is_exported":true}, {"kind":"Class","ast_kind":"class_declaration","name":"AuthService","qualified_name":"src/auth.ts::AuthService","file_path":"src/auth.ts","line_start":7,"line_end":19,"language":"typescript","is_test":false,"file_hash":"eeb3e626616885f9278dda74860345065a31937d19ce76199bd422cf286a5d9e","content_hash":"72d835e026126f79a2b2c538e6388c4aed73c4903c0a3f5498209cd25db0ead8","is_exported":true}, {"kind":"Interface","ast_kind":"interface_declaration","name":"AuthConfig","qualified_name":"src/auth.ts::AuthConfig","file_path":"src/auth.ts","line_start":2,"line_end":5,"language":"typescript","is_test":false,"file_hash":"eeb3e626616885f9278dda74860345065a31937d19ce76199bd422cf286a5d9e","content_hash":"23cf2fcb9b456e6fc979dce6cc18f4d302607f5fc29a00643d3ad8ab1768ca9f","is_exported":true}, {"kind":"Test","ast_kind":"call_expression","name":"AuthService","qualified_name":"tests/auth.test.ts::AuthService","file_path":"tests/auth.test.ts","line_start":2,"line_end":12,"language":"typescript","is_test":true,"file_hash":"0eaee881e15b1779029ca9f1642b8165db0d0c3763c265b7262aa72bb15b9b9a","content_hash":"27a5760e1484f2780ba1056b833f0dc9111f4e7e332ca63d61ad5995310ab49a"}, {"kind":"Test","ast_kind":"call_expression","name":"should authenticate valid user","qualified_name":"tests/auth.test.ts::should authenticate valid user","file_path":"tests/auth.test.ts","line_start":3,"line_end":6,"language":"typescript","is_test":true,"file_hash":"0eaee881e15b1779029ca9f1642b8165db0d0c3763c265b7262aa72bb15b9b9a","content_hash":"a05fd413d73d474cacb0f096940838e7c08a91b4e7ef99bd3e75c7bf3b6bdd13"}, {"kind":"Test","ast_kind":"call_expression","name":"verifyToken returns true for non-empty","qualified_name":"tests/auth.test.ts::verifyToken returns true for non-empty","file_path":"tests/auth.test.ts","line_start":8,"line_end":11,"language":"typescript","is_test":true,"file_hash":"0eaee881e15b1779029ca9f1642b8165db0d0c3763c265b7262aa72bb15b9b9a","content_hash":"fc57696babdd2781291da0e8a38a411f84de6ef5357a98b85834109e72e2319c"} ],"edges":[ {"kind":"CALLS","source_qualified":"tests/auth.test.ts::verifyToken returns true for non-empty","target_qualified":"src/auth.ts::AuthService.verifyToken","file_path":"tests/auth.test.ts","line":10,"confidence":0.5}, {"kind":"CALLS","source_qualified":"src/controller.ts::AuthController.login","target_qualified":"tests/auth.test.ts::AuthService.authenticate","file_path":"src/controller.ts","line":10,"confidence":0.95}, {"kind":"CALLS","source_qualified":"src/auth.ts::AuthService.authenticate","target_qualified":"src/db.ts::findUser","file_path":"src/auth.ts","line":11,"confidence":0.9}, {"kind":"IMPORTS","source_qualified":"tests/auth.test.ts","target_qualified":"src/auth.ts","file_path":"tests/auth.test.ts","line":0}, {"kind":"IMPORTS","source_qualified":"src/controller.ts","target_qualified":"src/auth.ts","file_path":"src/controller.ts","line":0}, {"kind":"IMPORTS","source_qualified":"src/controller.ts","target_qualified":"src/user.service.ts","file_path":"src/controller.ts","line":1}, {"kind":"IMPORTS","source_qualified":"src/auth.ts","target_qualified":"src/db.ts","file_path":"src/auth.ts","line":0}, {"kind":"TESTED_BY","source_qualified":"src/auth.ts","target_qualified":"tests/auth.test.ts","file_path":"tests/auth.test.ts","line":0}, {"kind":"CONTAINS","source_qualified":"tests/auth.test.ts","target_qualified":"tests/auth.test.ts::AuthService","file_path":"tests/auth.test.ts","line":0}, {"kind":"CONTAINS","source_qualified":"tests/auth.test.ts","target_qualified":"tests/auth.test.ts::should authenticate valid user","file_path":"tests/auth.test.ts","line":0}, {"kind":"CONTAINS","source_qualified":"tests/auth.test.ts","target_qualified":"tests/auth.test.ts::verifyToken returns true for non-empty","file_path":"tests/auth.test.ts","line":0}, {"kind":"CONTAINS","source_qualified":"src/user.service.ts","target_qualified":"src/user.service.ts::UserService.getProfile","file_path":"src/user.service.ts","line":0}, {"kind":"CONTAINS","source_qualified":"src/controller.ts","target_qualified":"src/controller.ts::AuthController.AuthController.constructor","file_path":"src/controller.ts","line":0}, {"kind":"CONTAINS","source_qualified":"src/controller.ts","target_qualified":"src/controller.ts::AuthController.login","file_path":"src/controller.ts","line":0}, {"kind":"CONTAINS","source_qualified":"src/db.ts","target_qualified":"src/db.ts::findUser","file_path":"src/db.ts","line":0}, {"kind":"CONTAINS","source_qualified":"src/db.ts","target_qualified":"src/db.ts::saveUser","file_path":"src/db.ts","line":0}, {"kind":"CONTAINS","source_qualified":"src/auth.ts","target_qualified":"src/auth.ts::AuthService.AuthService.constructor","file_path":"src/auth.ts","line":0}, {"kind":"CONTAINS","source_qualified":"src/auth.ts","target_qualified":"src/auth.ts::AuthService.authenticate","file_path":"src/auth.ts","line":0}, {"kind":"CONTAINS","source_qualified":"src/auth.ts","target_qualified":"src/auth.ts::AuthService.verifyToken","file_path":"src/auth.ts","line":0}, {"kind":"CONTAINS","source_qualified":"src/auth.ts","target_qualified":"src/auth.ts::hashPassword","file_path":"src/auth.ts","line":0}, {"kind":"CONTAINS","source_qualified":"src/auth.ts","target_qualified":"src/auth.ts::validateEmail","file_path":"src/auth.ts","line":0}, {"kind":"CONTAINS","source_qualified":"src/user.service.ts","target_qualified":"src/user.service.ts::UserService","file_path":"src/user.service.ts","line":0}, {"kind":"CONTAINS","source_qualified":"src/controller.ts","target_qualified":"src/controller.ts::AuthController","file_path":"src/controller.ts","line":0}, {"kind":"CONTAINS","source_qualified":"src/auth.ts","target_qualified":"src/auth.ts::AuthService","file_path":"src/auth.ts","line":0} ]}