{"files":{"src/plugin/vault.ts":{"language":"typescript","mutants":[{"id":"4","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":51,"line":34},"start":{"column":11,"line":34}}},{"id":"0","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":41},"start":{"column":94,"line":28}}},{"id":"5","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":51,"line":34},"start":{"column":11,"line":34}}},{"id":"8","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":37},"start":{"column":44,"line":35}}},{"id":"1","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":39},"start":{"column":40,"line":30}}},{"id":"6","mutatorName":"LogicalOperator","replacement":"node instanceof TFolder || node.children","status":"Timeout","location":{"end":{"column":51,"line":34},"start":{"column":11,"line":34}}},{"id":"2","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":28,"line":31},"start":{"column":11,"line":31}}},{"id":"10","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":43,"line":53},"start":{"column":32,"line":53}}},{"id":"9","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":50},"start":{"column":31,"line":48}}},{"id":"7","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":38},"start":{"column":53,"line":34}}},{"id":"3","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":28,"line":31},"start":{"column":11,"line":31}}},{"id":"17","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":73,"line":125},"start":{"column":65,"line":125}}},{"id":"22","mutatorName":"ArrowFunction","replacement":"() => undefined","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":83,"line":127},"start":{"column":28,"line":127}}},{"id":"16","mutatorName":"ArrowFunction","replacement":"() => undefined","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":83,"line":125},"start":{"column":28,"line":125}}},{"id":"11","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":4,"line":115},"start":{"column":107,"line":113}}},{"id":"12","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":26,"line":124},"start":{"column":18,"line":124}}},{"id":"13","mutatorName":"ArrowFunction","replacement":"() => undefined","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":83,"line":124},"start":{"column":28,"line":124}}},{"id":"18","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":26,"line":126},"start":{"column":18,"line":126}}},{"id":"14","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":73,"line":124},"start":{"column":65,"line":124}}},{"id":"15","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":26,"line":125},"start":{"column":18,"line":125}}},{"id":"20","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":73,"line":126},"start":{"column":65,"line":126}}},{"id":"19","mutatorName":"ArrowFunction","replacement":"() => undefined","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":83,"line":126},"start":{"column":28,"line":126}}},{"id":"21","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":26,"line":127},"start":{"column":18,"line":127}}},{"id":"23","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":73,"line":127},"start":{"column":65,"line":127}}},{"id":"26","mutatorName":"StringLiteral","replacement":"``","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":89,"line":132},"start":{"column":38,"line":132}}},{"id":"24","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":6,"line":133},"start":{"column":80,"line":131}}},{"id":"25","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":92,"line":132},"start":{"column":20,"line":132}}},{"id":"27","mutatorName":"ObjectLiteral","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":6,"line":324},"start":{"column":20,"line":134}}},{"id":"28","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":8,"line":142},"start":{"column":32,"line":135}}},{"id":"30","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":18,"line":137},"start":{"column":13,"line":137}}},{"id":"32","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":34,"line":138},"start":{"column":13,"line":138}}},{"id":"34","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":10,"line":140},"start":{"column":36,"line":138}}},{"id":"35","mutatorName":"ObjectLiteral","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":113,"line":139},"start":{"column":18,"line":139}}},{"id":"36","mutatorName":"ObjectLiteral","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":72,"line":141},"start":{"column":16,"line":141}}},{"id":"37","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":8,"line":145},"start":{"column":34,"line":143}}},{"id":"38","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":8,"line":154},"start":{"column":32,"line":146}}},{"id":"40","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":30,"line":148},"start":{"column":13,"line":148}}},{"id":"39","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":30,"line":148},"start":{"column":13,"line":148}}},{"id":"41","mutatorName":"EqualityOperator","replacement":"url !== undefined","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":30,"line":148},"start":{"column":13,"line":148}}},{"id":"42","mutatorName":"StringLiteral","replacement":"``","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":73,"line":148},"start":{"column":48,"line":148}}},{"id":"29","mutatorName":"BooleanLiteral","replacement":"file","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":18,"line":137},"start":{"column":13,"line":137}}},{"id":"31","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":18,"line":137},"start":{"column":13,"line":137}}},{"id":"46","mutatorName":"BooleanLiteral","replacement":"entry","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":19,"line":150},"start":{"column":13,"line":150}}},{"id":"33","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":34,"line":138},"start":{"column":13,"line":138}}},{"id":"47","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":44,"line":150},"start":{"column":23,"line":150}}},{"id":"48","mutatorName":"EqualityOperator","replacement":"entry.type === 'file'","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":44,"line":150},"start":{"column":23,"line":150}}},{"id":"49","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":44,"line":150},"start":{"column":38,"line":150}}},{"id":"51","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":28,"line":152},"start":{"column":13,"line":152}}},{"id":"53","mutatorName":"EqualityOperator","replacement":"content != null","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":28,"line":152},"start":{"column":13,"line":152}}},{"id":"55","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":8,"line":167},"start":{"column":47,"line":155}}},{"id":"56","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":30,"line":157},"start":{"column":13,"line":157}}},{"id":"57","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":30,"line":157},"start":{"column":13,"line":157}}},{"id":"44","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":44,"line":150},"start":{"column":13,"line":150}}},{"id":"43","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":44,"line":150},"start":{"column":13,"line":150}}},{"id":"45","mutatorName":"LogicalOperator","replacement":"!entry && entry.type !== 'file'","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":44,"line":150},"start":{"column":13,"line":150}}},{"id":"58","mutatorName":"EqualityOperator","replacement":"url === undefined","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":30,"line":157},"start":{"column":13,"line":157}}},{"id":"59","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":10,"line":165},"start":{"column":32,"line":157}}},{"id":"62","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":12,"line":164},"start":{"column":21,"line":159}}},{"id":"60","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":19,"line":159},"start":{"column":15,"line":159}}},{"id":"61","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":19,"line":159},"start":{"column":15,"line":159}}},{"id":"50","mutatorName":"StringLiteral","replacement":"``","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":87,"line":150},"start":{"column":62,"line":150}}},{"id":"64","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":44,"line":171},"start":{"column":32,"line":171}}},{"id":"54","mutatorName":"StringLiteral","replacement":"``","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":77,"line":152},"start":{"column":46,"line":152}}},{"id":"52","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":28,"line":152},"start":{"column":13,"line":152}}},{"id":"67","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":44,"line":171},"start":{"column":41,"line":171}}},{"id":"66","mutatorName":"EqualityOperator","replacement":"path !== '/'","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":44,"line":171},"start":{"column":32,"line":171}}},{"id":"68","mutatorName":"StringLiteral","replacement":"\"Stryker was here!\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":49,"line":171},"start":{"column":47,"line":171}}},{"id":"69","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":45,"line":172},"start":{"column":24,"line":172}}},{"id":"70","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":45,"line":172},"start":{"column":24,"line":172}}},{"id":"72","mutatorName":"StringLiteral","replacement":"\"Stryker was here!\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":20,"killedBy":["241"],"location":{"end":{"column":45,"line":172},"start":{"column":43,"line":172}}},{"id":"76","mutatorName":"BlockStatement","replacement":"{}","statusReason":"expected 10.836502999998629 to be less than 5","status":"Killed","testsCompleted":19,"killedBy":["240"],"location":{"end":{"column":10,"line":179},"start":{"column":22,"line":176}}},{"id":"73","mutatorName":"BooleanLiteral","replacement":"folder","statusReason":"expected 29.17716200000723 to be less than 5","status":"Killed","testsCompleted":45,"killedBy":["240"],"location":{"end":{"column":20,"line":176},"start":{"column":13,"line":176}}},{"id":"74","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":46,"killedBy":["241"],"location":{"end":{"column":20,"line":176},"start":{"column":13,"line":176}}},{"id":"82","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":10,"line":190},"start":{"column":46,"line":184}}},{"id":"63","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":193},"start":{"column":81,"line":169}}},{"id":"65","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":44,"line":171},"start":{"column":32,"line":171}}},{"id":"83","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":37,"line":185},"start":{"column":15,"line":185}}},{"id":"71","mutatorName":"EqualityOperator","replacement":"normalizedPath !== ''","status":"Timeout","location":{"end":{"column":45,"line":172},"start":{"column":24,"line":172}}},{"id":"75","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":20,"line":176},"start":{"column":13,"line":176}}},{"id":"77","mutatorName":"ObjectLiteral","replacement":"{}","status":"Timeout","location":{"end":{"column":44,"line":178},"start":{"column":18,"line":178}}},{"id":"78","mutatorName":"ArrayDeclaration","replacement":"[\"Stryker was here\"]","status":"Timeout","location":{"end":{"column":29,"line":178},"start":{"column":27,"line":178}}},{"id":"79","mutatorName":"ArrayDeclaration","replacement":"[\"Stryker was here\"]","status":"Timeout","location":{"end":{"column":42,"line":178},"start":{"column":40,"line":178}}},{"id":"80","mutatorName":"ArrayDeclaration","replacement":"[\"Stryker was here\"]","status":"Timeout","location":{"end":{"column":35,"line":181},"start":{"column":33,"line":181}}},{"id":"81","mutatorName":"ArrayDeclaration","replacement":"[\"Stryker was here\"]","status":"Timeout","location":{"end":{"column":37,"line":182},"start":{"column":35,"line":182}}},{"id":"84","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":37,"line":185},"start":{"column":15,"line":185}}},{"id":"85","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":12,"line":187},"start":{"column":39,"line":185}}},{"id":"86","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":46,"line":187},"start":{"column":22,"line":187}}},{"id":"87","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":46,"line":187},"start":{"column":22,"line":187}}},{"id":"88","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":12,"line":189},"start":{"column":48,"line":187}}},{"id":"89","mutatorName":"ObjectLiteral","replacement":"{}","status":"Timeout","location":{"end":{"column":34,"line":192},"start":{"column":16,"line":192}}},{"id":"91","mutatorName":"BooleanLiteral","replacement":"true","status":"Timeout","location":{"end":{"column":50,"line":199},"start":{"column":45,"line":199}}},{"id":"92","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":208},"start":{"column":67,"line":199}}},{"id":"90","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":197},"start":{"column":48,"line":195}}},{"id":"93","mutatorName":"BooleanLiteral","replacement":"folder","status":"Timeout","location":{"end":{"column":20,"line":201},"start":{"column":13,"line":201}}},{"id":"94","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":20,"line":201},"start":{"column":13,"line":201}}},{"id":"95","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":20,"line":201},"start":{"column":13,"line":201}}},{"id":"96","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":203},"start":{"column":22,"line":201}}},{"id":"97","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":54,"line":202},"start":{"column":27,"line":202}}},{"id":"98","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":53,"line":204},"start":{"column":13,"line":204}}},{"id":"99","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":53,"line":204},"start":{"column":13,"line":204}}},{"id":"100","mutatorName":"LogicalOperator","replacement":"!recursive || folder.children.length > 0","status":"Timeout","location":{"end":{"column":53,"line":204},"start":{"column":13,"line":204}}},{"id":"101","mutatorName":"BooleanLiteral","replacement":"recursive","status":"Timeout","location":{"end":{"column":23,"line":204},"start":{"column":13,"line":204}}},{"id":"103","mutatorName":"EqualityOperator","replacement":"folder.children.length >= 0","status":"Timeout","location":{"end":{"column":53,"line":204},"start":{"column":27,"line":204}}},{"id":"102","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":53,"line":204},"start":{"column":27,"line":204}}},{"id":"104","mutatorName":"EqualityOperator","replacement":"folder.children.length <= 0","status":"Timeout","location":{"end":{"column":53,"line":204},"start":{"column":27,"line":204}}},{"id":"105","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":206},"start":{"column":55,"line":204}}},{"id":"106","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":106,"line":205},"start":{"column":27,"line":205}}},{"id":"107","mutatorName":"BooleanLiteral","replacement":"false","status":"Timeout","location":{"end":{"column":39,"line":207},"start":{"column":35,"line":207}}},{"id":"108","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":216},"start":{"column":49,"line":210}}},{"id":"109","mutatorName":"BooleanLiteral","replacement":"file","status":"Timeout","location":{"end":{"column":18,"line":212},"start":{"column":13,"line":212}}},{"id":"110","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":18,"line":212},"start":{"column":13,"line":212}}},{"id":"111","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":18,"line":212},"start":{"column":13,"line":212}}},{"id":"113","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":62,"line":213},"start":{"column":27,"line":213}}},{"id":"112","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":214},"start":{"column":20,"line":212}}},{"id":"114","mutatorName":"BooleanLiteral","replacement":"false","status":"Timeout","location":{"end":{"column":37,"line":215},"start":{"column":33,"line":215}}},{"id":"115","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":224},"start":{"column":69,"line":218}}},{"id":"116","mutatorName":"BooleanLiteral","replacement":"file","status":"Timeout","location":{"end":{"column":18,"line":220},"start":{"column":13,"line":220}}},{"id":"117","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":18,"line":220},"start":{"column":13,"line":220}}},{"id":"118","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":18,"line":220},"start":{"column":13,"line":220}}},{"id":"119","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":222},"start":{"column":20,"line":220}}},{"id":"120","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":65,"line":221},"start":{"column":27,"line":221}}},{"id":"121","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":232},"start":{"column":61,"line":226}}},{"id":"122","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":61,"line":228},"start":{"column":11,"line":228}}},{"id":"123","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":98,"line":229},"start":{"column":11,"line":229}}},{"id":"125","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":247},"start":{"column":60,"line":234}}},{"id":"124","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":93,"line":230},"start":{"column":11,"line":230}}},{"id":"126","mutatorName":"BooleanLiteral","replacement":"file","status":"Timeout","location":{"end":{"column":18,"line":236},"start":{"column":13,"line":236}}},{"id":"127","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":18,"line":236},"start":{"column":13,"line":236}}},{"id":"128","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":18,"line":236},"start":{"column":13,"line":236}}},{"id":"129","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":238},"start":{"column":20,"line":236}}},{"id":"130","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":52,"line":237},"start":{"column":27,"line":237}}},{"id":"131","mutatorName":"BooleanLiteral","replacement":"data","status":"Timeout","location":{"end":{"column":18,"line":240},"start":{"column":13,"line":240}}},{"id":"132","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":18,"line":240},"start":{"column":13,"line":240}}},{"id":"133","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":18,"line":240},"start":{"column":13,"line":240}}},{"id":"134","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":242},"start":{"column":20,"line":240}}},{"id":"135","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":64,"line":241},"start":{"column":27,"line":241}}},{"id":"136","mutatorName":"MethodExpression","replacement":"data","status":"Timeout","location":{"end":{"column":28,"line":246},"start":{"column":16,"line":246}}},{"id":"141","mutatorName":"BooleanLiteral","replacement":"url","statusReason":"expected 5.1894219999958295 to be less than 5","status":"Killed","testsCompleted":45,"killedBy":["240"],"location":{"end":{"column":19,"line":256},"start":{"column":15,"line":256}}},{"id":"137","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":268},"start":{"column":73,"line":249}}},{"id":"138","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":25,"line":253},"start":{"column":13,"line":253}}},{"id":"147","mutatorName":"MethodExpression","replacement":"path","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":81,"line":264},"start":{"column":44,"line":264}}},{"id":"140","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":119,"killedBy":["319"],"location":{"end":{"column":10,"line":261},"start":{"column":27,"line":253}}},{"id":"143","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":30,"killedBy":["319"],"location":{"end":{"column":19,"line":256},"start":{"column":15,"line":256}}},{"id":"149","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":75,"line":264},"start":{"column":72,"line":264}}},{"id":"150","mutatorName":"StringLiteral","replacement":"\"Stryker was here!\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":86,"line":264},"start":{"column":84,"line":264}}},{"id":"139","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":25,"line":253},"start":{"column":13,"line":253}}},{"id":"148","mutatorName":"ArithmeticOperator","replacement":"path.lastIndexOf('.') - 1","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":30,"killedBy":["319"],"location":{"end":{"column":80,"line":264},"start":{"column":55,"line":264}}},{"id":"142","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":19,"line":256},"start":{"column":15,"line":256}}},{"id":"152","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"expected 8.175721000006888 to be less than 5","status":"Killed","testsCompleted":45,"killedBy":["240"],"location":{"end":{"column":25,"line":272},"start":{"column":13,"line":272}}},{"id":"144","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":62,"line":256},"start":{"column":37,"line":256}}},{"id":"145","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":267},"start":{"column":16,"line":261}}},{"id":"146","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":40,"line":264},"start":{"column":37,"line":264}}},{"id":"151","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":278},"start":{"column":63,"line":270}}},{"id":"154","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":275},"start":{"column":27,"line":272}}},{"id":"153","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":25,"line":272},"start":{"column":13,"line":272}}},{"id":"155","mutatorName":"ArithmeticOperator","replacement":"existingContent - data","status":"Timeout","location":{"end":{"column":65,"line":274},"start":{"column":43,"line":274}}},{"id":"156","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":277},"start":{"column":16,"line":275}}},{"id":"157","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":286},"start":{"column":29,"line":280}}},{"id":"158","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":66,"line":282},"start":{"column":11,"line":282}}},{"id":"159","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":69,"line":283},"start":{"column":11,"line":283}}},{"id":"160","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":83,"line":284},"start":{"column":11,"line":284}}},{"id":"162","mutatorName":"BooleanLiteral","replacement":"file","status":"Timeout","location":{"end":{"column":18,"line":290},"start":{"column":13,"line":290}}},{"id":"161","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":323},"start":{"column":45,"line":288}}},{"id":"163","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":18,"line":290},"start":{"column":13,"line":290}}},{"id":"165","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":292},"start":{"column":20,"line":290}}},{"id":"164","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":18,"line":290},"start":{"column":13,"line":290}}},{"id":"166","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":52,"line":291},"start":{"column":27,"line":291}}},{"id":"168","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":59,"line":297},"start":{"column":13,"line":297}}},{"id":"167","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":59,"line":297},"start":{"column":13,"line":297}}},{"id":"169","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":314},"start":{"column":61,"line":297}}},{"id":"170","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":58,"line":299},"start":{"column":15,"line":299}}},{"id":"171","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":58,"line":299},"start":{"column":15,"line":299}}},{"id":"172","mutatorName":"LogicalOperator","replacement":"typeof window !== 'undefined' || window.app","status":"Timeout","location":{"end":{"column":58,"line":299},"start":{"column":15,"line":299}}},{"id":"173","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":44,"line":299},"start":{"column":15,"line":299}}},{"id":"174","mutatorName":"EqualityOperator","replacement":"typeof window === 'undefined'","status":"Timeout","location":{"end":{"column":44,"line":299},"start":{"column":15,"line":299}}},{"id":"176","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":12,"line":307},"start":{"column":60,"line":299}}},{"id":"175","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":44,"line":299},"start":{"column":33,"line":299}}},{"id":"177","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":82,"line":301},"start":{"column":17,"line":301}}},{"id":"179","mutatorName":"LogicalOperator","replacement":"imageResolver || typeof imageResolver.getCachedUrl === 'function'","status":"Timeout","location":{"end":{"column":82,"line":301},"start":{"column":17,"line":301}}},{"id":"178","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":82,"line":301},"start":{"column":17,"line":301}}},{"id":"180","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":82,"line":301},"start":{"column":34,"line":301}}},{"id":"181","mutatorName":"EqualityOperator","replacement":"typeof imageResolver.getCachedUrl !== 'function'","status":"Timeout","location":{"end":{"column":82,"line":301},"start":{"column":34,"line":301}}},{"id":"182","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":82,"line":301},"start":{"column":72,"line":301}}},{"id":"183","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":14,"line":306},"start":{"column":84,"line":301}}},{"id":"184","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":28,"line":303},"start":{"column":19,"line":303}}},{"id":"185","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":28,"line":303},"start":{"column":19,"line":303}}},{"id":"187","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":48,"line":310},"start":{"column":13,"line":310}}},{"id":"186","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":16,"line":305},"start":{"column":30,"line":303}}},{"id":"188","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":88,"line":311},"start":{"column":13,"line":311}}},{"id":"189","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":128,"line":312},"start":{"column":13,"line":312}}},{"id":"190","mutatorName":"BooleanLiteral","replacement":"url","status":"Timeout","location":{"end":{"column":17,"line":319},"start":{"column":13,"line":319}}},{"id":"191","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":17,"line":319},"start":{"column":13,"line":319}}},{"id":"192","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":17,"line":319},"start":{"column":13,"line":319}}},{"id":"193","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":321},"start":{"column":19,"line":319}}},{"id":"195","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":332},"start":{"column":31,"line":330}}},{"id":"194","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":52,"line":320},"start":{"column":27,"line":320}}},{"id":"198","mutatorName":"BlockStatement","replacement":"{}","statusReason":"expected \"Mock\" to be called with arguments: [ 'foo', 'automerge:new-file' ]\u001b[90m\n\nReceived:\n\n\u001b[1m 1st Mock call:\n\n\u001b[22m\u001b[2m [\u001b[22m\n\u001b[2m \"foo\",\u001b[22m\n\u001b[32m- \"automerge:new-file\",\u001b[90m\n\u001b[31m+ null,\u001b[90m\n\u001b[2m ]\u001b[22m\n\u001b[39m\u001b[90m\n\nNumber of calls: \u001b[1m1\u001b[22m\n\u001b[39m","status":"Killed","testsCompleted":130,"killedBy":["330"],"location":{"end":{"column":4,"line":349},"start":{"column":45,"line":347}}},{"id":"196","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":339},"start":{"column":21,"line":337}}},{"id":"197","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":345},"start":{"column":22,"line":343}}},{"id":"199","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":353},"start":{"column":49,"line":351}}},{"id":"200","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":357},"start":{"column":61,"line":355}}},{"id":"201","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":361},"start":{"column":31,"line":359}}},{"id":"204","mutatorName":"BlockStatement","replacement":"{}","statusReason":"expected \"Mock\" to be called with arguments: [ 'foo', undefined ]\u001b[90m\n\nReceived:\n\n\u001b[1m 1st Mock call:\n\n\u001b[22m\u001b[2m [\u001b[22m\n\u001b[2m \"foo\",\u001b[22m\n\u001b[32m- undefined,\u001b[90m\n\u001b[31m+ null,\u001b[90m\n\u001b[2m ]\u001b[22m\n\u001b[39m\u001b[90m\n\nNumber of calls: \u001b[1m1\u001b[22m\n\u001b[39m","status":"Killed","testsCompleted":112,"killedBy":["330"],"location":{"end":{"column":4,"line":373},"start":{"column":57,"line":371}}},{"id":"202","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":365},"start":{"column":23,"line":363}}},{"id":"203","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":369},"start":{"column":40,"line":367}}},{"id":"206","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":381},"start":{"column":65,"line":379}}},{"id":"205","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":377},"start":{"column":49,"line":375}}},{"id":"209","mutatorName":"BlockStatement","replacement":"{}","statusReason":"expected \"Mock\" to be called with arguments: [ 'foo', undefined ]\u001b[90m\n\nReceived:\n\n\u001b[1m 1st Mock call:\n\n\u001b[22m\u001b[2m [\u001b[22m\n\u001b[2m \"foo\",\u001b[22m\n\u001b[32m- undefined,\u001b[90m\n\u001b[31m+ null,\u001b[90m\n\u001b[2m ]\u001b[22m\n\u001b[39m\u001b[90m\n\nNumber of calls: \u001b[1m1\u001b[22m\n\u001b[39m","status":"Killed","testsCompleted":130,"killedBy":["330"],"location":{"end":{"column":4,"line":433},"start":{"column":60,"line":402}}},{"id":"207","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":385},"start":{"column":56,"line":383}}},{"id":"208","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":393},"start":{"column":37,"line":391}}},{"id":"210","mutatorName":"BooleanLiteral","replacement":"fileName","statusReason":"Invalid path: 'notes/welcome.md' — empty filename","status":"Killed","testsCompleted":130,"killedBy":["330"],"location":{"end":{"column":18,"line":405},"start":{"column":9,"line":405}}},{"id":"211","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Invalid path: 'notes/welcome.md' — empty filename","status":"Killed","testsCompleted":130,"killedBy":["330"],"location":{"end":{"column":18,"line":405},"start":{"column":9,"line":405}}},{"id":"215","mutatorName":"StringLiteral","replacement":"``","statusReason":"File already exists: ","status":"Killed","testsCompleted":41,"killedBy":["330"],"location":{"end":{"column":68,"line":409},"start":{"column":41,"line":409}}},{"id":"212","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":18,"line":405},"start":{"column":9,"line":405}}},{"id":"213","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":407},"start":{"column":20,"line":405}}},{"id":"216","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"File already exists: notes/welcome.md","status":"Killed","testsCompleted":112,"killedBy":["330"],"location":{"end":{"column":17,"line":413},"start":{"column":9,"line":413}}},{"id":"214","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":65,"line":406},"start":{"column":23,"line":406}}},{"id":"217","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":17,"line":413},"start":{"column":9,"line":413}}},{"id":"220","mutatorName":"LogicalOperator","replacement":"this.fileIndex.getFolderByPath(parentPath) && this.fileIndex.getRoot()","statusReason":"expected \"Mock\" to be called with arguments: [ 'foo', undefined ]\u001b[90m\n\nReceived:\n\n\u001b[1m 1st Mock call:\n\n\u001b[22m\u001b[2m [\u001b[22m\n\u001b[2m \"foo\",\u001b[22m\n\u001b[32m- undefined,\u001b[90m\n\u001b[31m+ null,\u001b[90m\n\u001b[2m ]\u001b[22m\n\u001b[39m\u001b[90m\n\nNumber of calls: \u001b[1m1\u001b[22m\n\u001b[39m","status":"Killed","testsCompleted":130,"killedBy":["330"],"location":{"end":{"column":90,"line":424},"start":{"column":20,"line":424}}},{"id":"219","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":63,"line":414},"start":{"column":23,"line":414}}},{"id":"218","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":415},"start":{"column":19,"line":413}}},{"id":"221","mutatorName":"ObjectLiteral","replacement":"{}","status":"Timeout","location":{"end":{"column":88,"line":425},"start":{"column":29,"line":425}}},{"id":"222","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":467},"start":{"column":88,"line":439}}},{"id":"223","mutatorName":"BooleanLiteral","replacement":"fileName","status":"Timeout","location":{"end":{"column":18,"line":442},"start":{"column":9,"line":442}}},{"id":"224","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":18,"line":442},"start":{"column":9,"line":442}}},{"id":"226","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":444},"start":{"column":20,"line":442}}},{"id":"225","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":18,"line":442},"start":{"column":9,"line":442}}},{"id":"227","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":65,"line":443},"start":{"column":23,"line":443}}},{"id":"228","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":68,"line":446},"start":{"column":41,"line":446}}},{"id":"229","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":17,"line":450},"start":{"column":9,"line":450}}},{"id":"230","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":17,"line":450},"start":{"column":9,"line":450}}},{"id":"231","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":452},"start":{"column":19,"line":450}}},{"id":"237","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"expected true to be false // Object.is equality","status":"Killed","testsCompleted":92,"killedBy":["65"],"location":{"end":{"column":13,"line":474},"start":{"column":9,"line":474}}},{"id":"232","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":63,"line":451},"start":{"column":23,"line":451}}},{"id":"233","mutatorName":"LogicalOperator","replacement":"this.fileIndex.getFolderByPath(parentPath) && this.fileIndex.getRoot()","status":"Timeout","location":{"end":{"column":90,"line":458},"start":{"column":20,"line":458}}},{"id":"234","mutatorName":"ObjectLiteral","replacement":"{}","status":"Timeout","location":{"end":{"column":88,"line":459},"start":{"column":29,"line":459}}},{"id":"235","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":476},"start":{"column":66,"line":472}}},{"id":"236","mutatorName":"BooleanLiteral","replacement":"url","status":"Timeout","location":{"end":{"column":13,"line":474},"start":{"column":9,"line":474}}},{"id":"238","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":13,"line":474},"start":{"column":9,"line":474}}},{"id":"239","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":61,"line":474},"start":{"column":31,"line":474}}},{"id":"240","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":490},"start":{"column":54,"line":481}}},{"id":"241","mutatorName":"BooleanLiteral","replacement":"folder","status":"Timeout","location":{"end":{"column":16,"line":485},"start":{"column":9,"line":485}}},{"id":"242","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":16,"line":485},"start":{"column":9,"line":485}}},{"id":"243","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":16,"line":485},"start":{"column":9,"line":485}}},{"id":"244","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":487},"start":{"column":18,"line":485}}},{"id":"245","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":57,"line":486},"start":{"column":23,"line":486}}},{"id":"246","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":501},"start":{"column":44,"line":495}}},{"id":"247","mutatorName":"BooleanLiteral","replacement":"url","status":"Timeout","location":{"end":{"column":13,"line":497},"start":{"column":9,"line":497}}},{"id":"248","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":13,"line":497},"start":{"column":9,"line":497}}},{"id":"249","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":13,"line":497},"start":{"column":9,"line":497}}},{"id":"252","mutatorName":"StringLiteral","replacement":"\"Stryker was here!\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":119,"killedBy":["319"],"location":{"end":{"column":25,"line":500},"start":{"column":23,"line":500}}},{"id":"258","mutatorName":"StringLiteral","replacement":"``","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":61,"line":515},"start":{"column":31,"line":515}}},{"id":"253","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":119,"killedBy":["319"],"location":{"end":{"column":4,"line":508},"start":{"column":50,"line":506}}},{"id":"250","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":61,"line":497},"start":{"column":31,"line":497}}},{"id":"255","mutatorName":"BooleanLiteral","replacement":"url","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":101,"killedBy":["319"],"location":{"end":{"column":13,"line":515},"start":{"column":9,"line":515}}},{"id":"259","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":4,"line":531},"start":{"column":77,"line":526}}},{"id":"251","mutatorName":"LogicalOperator","replacement":"content && ''","status":"Timeout","location":{"end":{"column":25,"line":500},"start":{"column":12,"line":500}}},{"id":"260","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":4,"line":547},"start":{"column":64,"line":536}}},{"id":"254","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":521},"start":{"column":58,"line":513}}},{"id":"256","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":13,"line":515},"start":{"column":9,"line":515}}},{"id":"257","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":13,"line":515},"start":{"column":9,"line":515}}},{"id":"262","mutatorName":"ArrayDeclaration","replacement":"[]","status":"Timeout","location":{"end":{"column":45,"line":539},"start":{"column":25,"line":539}}},{"id":"261","mutatorName":"ArrayDeclaration","replacement":"[\"Stryker was here\"]","status":"Timeout","location":{"end":{"column":39,"line":537},"start":{"column":37,"line":537}}},{"id":"263","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":544},"start":{"column":47,"line":539}}},{"id":"264","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":35,"line":540},"start":{"column":11,"line":540}}},{"id":"267","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":607},"start":{"column":70,"line":552}}},{"id":"266","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":542},"start":{"column":37,"line":540}}},{"id":"265","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":35,"line":540},"start":{"column":11,"line":540}}},{"id":"268","mutatorName":"BooleanLiteral","replacement":"fileUrl","status":"Timeout","location":{"end":{"column":17,"line":554},"start":{"column":9,"line":554}}},{"id":"269","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":17,"line":554},"start":{"column":9,"line":554}}},{"id":"270","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":17,"line":554},"start":{"column":9,"line":554}}},{"id":"271","mutatorName":"BooleanLiteral","replacement":"entry","status":"Timeout","location":{"end":{"column":15,"line":556},"start":{"column":9,"line":556}}},{"id":"273","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":15,"line":556},"start":{"column":9,"line":556}}},{"id":"272","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":15,"line":556},"start":{"column":9,"line":556}}},{"id":"274","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":59,"line":559},"start":{"column":9,"line":559}}},{"id":"275","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":59,"line":559},"start":{"column":9,"line":559}}},{"id":"277","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":32,"line":559},"start":{"column":9,"line":559}}},{"id":"278","mutatorName":"EqualityOperator","replacement":"entry.type !== 'folder'","status":"Timeout","location":{"end":{"column":32,"line":559},"start":{"column":9,"line":559}}},{"id":"276","mutatorName":"LogicalOperator","replacement":"entry.type === 'folder' || file instanceof TFolder","status":"Timeout","location":{"end":{"column":59,"line":559},"start":{"column":9,"line":559}}},{"id":"279","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":32,"line":559},"start":{"column":24,"line":559}}},{"id":"280","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":587},"start":{"column":61,"line":559}}},{"id":"281","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":586},"start":{"column":45,"line":562}}},{"id":"282","mutatorName":"BooleanLiteral","replacement":"descUrl","status":"Timeout","location":{"end":{"column":21,"line":564},"start":{"column":13,"line":564}}},{"id":"283","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":21,"line":564},"start":{"column":13,"line":564}}},{"id":"284","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":21,"line":564},"start":{"column":13,"line":564}}},{"id":"285","mutatorName":"BooleanLiteral","replacement":"descEntry","status":"Timeout","location":{"end":{"column":23,"line":566},"start":{"column":13,"line":566}}},{"id":"286","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":23,"line":566},"start":{"column":13,"line":566}}},{"id":"287","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":23,"line":566},"start":{"column":13,"line":566}}},{"id":"288","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":32,"line":568},"start":{"column":13,"line":568}}},{"id":"289","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":32,"line":568},"start":{"column":13,"line":568}}},{"id":"290","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":574},"start":{"column":34,"line":568}}},{"id":"291","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":40,"line":569},"start":{"column":15,"line":569}}},{"id":"292","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":40,"line":569},"start":{"column":15,"line":569}}},{"id":"293","mutatorName":"EqualityOperator","replacement":"descEntry.type !== 'file'","status":"Timeout","location":{"end":{"column":40,"line":569},"start":{"column":15,"line":569}}},{"id":"294","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":40,"line":569},"start":{"column":34,"line":569}}},{"id":"295","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":12,"line":571},"start":{"column":42,"line":569}}},{"id":"296","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":12,"line":573},"start":{"column":18,"line":571}}},{"id":"297","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":30,"line":577},"start":{"column":13,"line":577}}},{"id":"298","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":30,"line":577},"start":{"column":13,"line":577}}},{"id":"300","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":27,"line":579},"start":{"column":15,"line":579}}},{"id":"299","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":582},"start":{"column":32,"line":577}}},{"id":"301","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":27,"line":579},"start":{"column":15,"line":579}}},{"id":"302","mutatorName":"EqualityOperator","replacement":"index === -1","status":"Timeout","location":{"end":{"column":27,"line":579},"start":{"column":15,"line":579}}},{"id":"303","mutatorName":"UnaryOperator","replacement":"+1","status":"Timeout","location":{"end":{"column":27,"line":579},"start":{"column":25,"line":579}}},{"id":"304","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":12,"line":581},"start":{"column":29,"line":579}}},{"id":"305","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":24,"line":590},"start":{"column":9,"line":590}}},{"id":"306","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":24,"line":590},"start":{"column":9,"line":590}}},{"id":"307","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":596},"start":{"column":26,"line":590}}},{"id":"313","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":146,"killedBy":["319"],"location":{"end":{"column":8,"line":595},"start":{"column":14,"line":593}}},{"id":"309","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":32,"line":591},"start":{"column":11,"line":591}}},{"id":"308","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":32,"line":591},"start":{"column":11,"line":591}}},{"id":"316","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":6,"line":603},"start":{"column":22,"line":598}}},{"id":"317","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":23,"line":600},"start":{"column":11,"line":600}}},{"id":"310","mutatorName":"EqualityOperator","replacement":"entry.type !== 'file'","status":"Timeout","location":{"end":{"column":32,"line":591},"start":{"column":11,"line":591}}},{"id":"311","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":32,"line":591},"start":{"column":26,"line":591}}},{"id":"312","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":593},"start":{"column":34,"line":591}}},{"id":"318","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":23,"line":600},"start":{"column":11,"line":600}}},{"id":"314","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":20,"line":598},"start":{"column":9,"line":598}}},{"id":"315","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":20,"line":598},"start":{"column":9,"line":598}}},{"id":"319","mutatorName":"EqualityOperator","replacement":"index === -1","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":30,"killedBy":["319"],"location":{"end":{"column":23,"line":600},"start":{"column":11,"line":600}}},{"id":"328","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":15,"line":616},"start":{"column":9,"line":616}}},{"id":"322","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":101,"killedBy":["319"],"location":{"end":{"column":4,"line":669},"start":{"column":69,"line":612}}},{"id":"329","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":15,"line":616},"start":{"column":9,"line":616}}},{"id":"323","mutatorName":"BooleanLiteral","replacement":"url","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":101,"killedBy":["319"],"location":{"end":{"column":13,"line":614},"start":{"column":9,"line":614}}},{"id":"321","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":602},"start":{"column":25,"line":600}}},{"id":"320","mutatorName":"UnaryOperator","replacement":"+1","status":"Timeout","location":{"end":{"column":23,"line":600},"start":{"column":21,"line":600}}},{"id":"324","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":13,"line":614},"start":{"column":9,"line":614}}},{"id":"325","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":13,"line":614},"start":{"column":9,"line":614}}},{"id":"326","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":61,"line":614},"start":{"column":31,"line":614}}},{"id":"327","mutatorName":"BooleanLiteral","replacement":"entry","status":"Timeout","location":{"end":{"column":15,"line":616},"start":{"column":9,"line":616}}},{"id":"336","mutatorName":"EqualityOperator","replacement":"conflicting === file","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":44,"line":624},"start":{"column":24,"line":624}}},{"id":"330","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":63,"line":616},"start":{"column":33,"line":616}}},{"id":"331","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":76,"line":620},"start":{"column":47,"line":620}}},{"id":"333","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":101,"killedBy":["319"],"location":{"end":{"column":44,"line":624},"start":{"column":9,"line":624}}},{"id":"332","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":101,"killedBy":["319"],"location":{"end":{"column":44,"line":624},"start":{"column":9,"line":624}}},{"id":"334","mutatorName":"LogicalOperator","replacement":"conflicting || conflicting !== file","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":101,"killedBy":["319"],"location":{"end":{"column":44,"line":624},"start":{"column":9,"line":624}}},{"id":"340","mutatorName":"StringLiteral","replacement":"\"Stryker was here!\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":92,"line":628},"start":{"column":90,"line":628}}},{"id":"341","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":72,"killedBy":["196"],"location":{"end":{"column":58,"line":630},"start":{"column":27,"line":630}}},{"id":"342","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":58,"line":630},"start":{"column":27,"line":630}}},{"id":"335","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":44,"line":624},"start":{"column":24,"line":624}}},{"id":"337","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":626},"start":{"column":46,"line":624}}},{"id":"346","mutatorName":"EqualityOperator","replacement":"newName === file.name","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":30,"killedBy":["319"],"location":{"end":{"column":46,"line":631},"start":{"column":25,"line":631}}},{"id":"338","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":85,"line":625},"start":{"column":23,"line":625}}},{"id":"339","mutatorName":"StringLiteral","replacement":"\"Stryker was here!\"","status":"Timeout","location":{"end":{"column":67,"line":628},"start":{"column":65,"line":628}}},{"id":"348","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":72,"killedBy":["196"],"location":{"end":{"column":22,"line":635},"start":{"column":9,"line":635}}},{"id":"349","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":72,"killedBy":["196"],"location":{"end":{"column":6,"line":653},"start":{"column":24,"line":635}}},{"id":"343","mutatorName":"EqualityOperator","replacement":"newParentPath === oldParentPath","status":"Timeout","location":{"end":{"column":58,"line":630},"start":{"column":27,"line":630}}},{"id":"344","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":46,"line":631},"start":{"column":25,"line":631}}},{"id":"345","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":46,"line":631},"start":{"column":25,"line":631}}},{"id":"347","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":22,"line":635},"start":{"column":9,"line":635}}},{"id":"350","mutatorName":"LogicalOperator","replacement":"entry.parentUrl && this.rootUrl","status":"Timeout","location":{"end":{"column":59,"line":637},"start":{"column":28,"line":637}}},{"id":"351","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":22,"line":643},"start":{"column":11,"line":643}}},{"id":"353","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":648},"start":{"column":24,"line":643}}},{"id":"352","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":22,"line":643},"start":{"column":11,"line":643}}},{"id":"354","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":25,"line":645},"start":{"column":13,"line":645}}},{"id":"355","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":25,"line":645},"start":{"column":13,"line":645}}},{"id":"356","mutatorName":"EqualityOperator","replacement":"index === -1","status":"Timeout","location":{"end":{"column":25,"line":645},"start":{"column":13,"line":645}}},{"id":"357","mutatorName":"UnaryOperator","replacement":"+1","status":"Timeout","location":{"end":{"column":25,"line":645},"start":{"column":23,"line":645}}},{"id":"359","mutatorName":"LogicalOperator","replacement":"this.fileIndex.getFolderByPath(newParentPath) && this.fileIndex.getRoot()","status":"Timeout","location":{"end":{"column":98,"line":650},"start":{"column":25,"line":650}}},{"id":"358","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":10,"line":647},"start":{"column":27,"line":645}}},{"id":"360","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":20,"line":655},"start":{"column":9,"line":655}}},{"id":"361","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":20,"line":655},"start":{"column":9,"line":655}}},{"id":"362","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":665},"start":{"column":22,"line":655}}},{"id":"363","mutatorName":"LogicalOperator","replacement":"entry.parentUrl && this.rootUrl","status":"Timeout","location":{"end":{"column":63,"line":656},"start":{"column":32,"line":656}}},{"id":"364","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":32,"line":658},"start":{"column":11,"line":658}}},{"id":"366","mutatorName":"EqualityOperator","replacement":"entry.type !== 'file'","status":"Timeout","location":{"end":{"column":32,"line":658},"start":{"column":11,"line":658}}},{"id":"365","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":32,"line":658},"start":{"column":11,"line":658}}},{"id":"367","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":32,"line":658},"start":{"column":26,"line":658}}},{"id":"368","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":660},"start":{"column":34,"line":658}}},{"id":"369","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":662},"start":{"column":14,"line":660}}},{"id":"370","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":4,"line":747},"start":{"column":77,"line":674}}},{"id":"371","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":26,"line":675},"start":{"column":9,"line":675}}},{"id":"373","mutatorName":"EqualityOperator","replacement":"folderPath !== ''","statusReason":"expected \"Mock\" to be called with arguments: [ 'foo', undefined ]\u001b[90m\n\nReceived:\n\n\u001b[1m 1st Mock call:\n\n\u001b[22m\u001b[2m [\u001b[22m\n\u001b[2m \"foo\",\u001b[22m\n\u001b[32m- undefined,\u001b[90m\n\u001b[31m+ null,\u001b[90m\n\u001b[2m ]\u001b[22m\n\u001b[39m\u001b[90m\n\nNumber of calls: \u001b[1m1\u001b[22m\n\u001b[39m","status":"Killed","testsCompleted":112,"killedBy":["330"],"location":{"end":{"column":26,"line":675},"start":{"column":9,"line":675}}},{"id":"372","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":26,"line":675},"start":{"column":9,"line":675}}},{"id":"377","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"expected \"Mock\" to be called with arguments: [ 'foo', undefined ]\u001b[90m\n\nReceived:\n\n\u001b[1m 1st Mock call:\n\n\u001b[22m\u001b[2m [\u001b[22m\n\u001b[2m \"foo\",\u001b[22m\n\u001b[32m- undefined,\u001b[90m\n\u001b[31m+ null,\u001b[90m\n\u001b[2m ]\u001b[22m\n\u001b[39m\u001b[90m\n\nNumber of calls: \u001b[1m1\u001b[22m\n\u001b[39m","status":"Killed","testsCompleted":112,"killedBy":["330"],"location":{"end":{"column":42,"line":679},"start":{"column":39,"line":679}}},{"id":"378","mutatorName":"ArrowFunction","replacement":"() => undefined","statusReason":"expected \"Mock\" to be called with arguments: [ 'foo', undefined ]\u001b[90m\n\nReceived:\n\n\u001b[1m 1st Mock call:\n\n\u001b[22m\u001b[2m [\u001b[22m\n\u001b[2m \"foo\",\u001b[22m\n\u001b[32m- undefined,\u001b[90m\n\u001b[31m+ null,\u001b[90m\n\u001b[2m ]\u001b[22m\n\u001b[39m\u001b[90m\n\nNumber of calls: \u001b[1m1\u001b[22m\n\u001b[39m","status":"Killed","testsCompleted":112,"killedBy":["330"],"location":{"end":{"column":68,"line":679},"start":{"column":51,"line":679}}},{"id":"374","mutatorName":"StringLiteral","replacement":"\"Stryker was here!\"","status":"Timeout","location":{"end":{"column":26,"line":675},"start":{"column":24,"line":675}}},{"id":"376","mutatorName":"MethodExpression","replacement":"folderPath.split('/')","status":"Timeout","location":{"end":{"column":69,"line":679},"start":{"column":22,"line":679}}},{"id":"375","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":677},"start":{"column":28,"line":675}}},{"id":"383","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"expected \"Mock\" to be called with arguments: [ 'foo', undefined ]\u001b[90m\n\nReceived:\n\n\u001b[1m 1st Mock call:\n\n\u001b[22m\u001b[2m [\u001b[22m\n\u001b[2m \"foo\",\u001b[22m\n\u001b[32m- undefined,\u001b[90m\n\u001b[31m+ null,\u001b[90m\n\u001b[2m ]\u001b[22m\n\u001b[39m\u001b[90m\n\nNumber of calls: \u001b[1m1\u001b[22m\n\u001b[39m","status":"Killed","testsCompleted":112,"killedBy":["330"],"location":{"end":{"column":30,"line":681},"start":{"column":9,"line":681}}},{"id":"379","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":68,"line":679},"start":{"column":56,"line":679}}},{"id":"380","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":68,"line":679},"start":{"column":56,"line":679}}},{"id":"381","mutatorName":"EqualityOperator","replacement":"s.length >= 0","status":"Timeout","location":{"end":{"column":68,"line":679},"start":{"column":56,"line":679}}},{"id":"382","mutatorName":"EqualityOperator","replacement":"s.length <= 0","status":"Timeout","location":{"end":{"column":68,"line":679},"start":{"column":56,"line":679}}},{"id":"385","mutatorName":"EqualityOperator","replacement":"segments.length !== 0","statusReason":"expected \"Mock\" to be called with arguments: [ 'foo', undefined ]\u001b[90m\n\nReceived:\n\n\u001b[1m 1st Mock call:\n\n\u001b[22m\u001b[2m [\u001b[22m\n\u001b[2m \"foo\",\u001b[22m\n\u001b[32m- undefined,\u001b[90m\n\u001b[31m+ null,\u001b[90m\n\u001b[2m ]\u001b[22m\n\u001b[39m\u001b[90m\n\nNumber of calls: \u001b[1m1\u001b[22m\n\u001b[39m","status":"Killed","testsCompleted":112,"killedBy":["330"],"location":{"end":{"column":30,"line":681},"start":{"column":9,"line":681}}},{"id":"384","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":30,"line":681},"start":{"column":9,"line":681}}},{"id":"390","mutatorName":"EqualityOperator","replacement":"existingUrl === undefined","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":101,"killedBy":["319"],"location":{"end":{"column":34,"line":689},"start":{"column":9,"line":689}}},{"id":"386","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":683},"start":{"column":32,"line":681}}},{"id":"387","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":45,"line":685},"start":{"column":42,"line":685}}},{"id":"388","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":34,"line":689},"start":{"column":9,"line":689}}},{"id":"389","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":34,"line":689},"start":{"column":9,"line":689}}},{"id":"396","mutatorName":"EqualityOperator","replacement":"existingEntry.type !== 'folder'","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":59,"line":691},"start":{"column":28,"line":691}}},{"id":"391","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":694},"start":{"column":36,"line":689}}},{"id":"393","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":59,"line":691},"start":{"column":11,"line":691}}},{"id":"394","mutatorName":"LogicalOperator","replacement":"existingEntry || existingEntry.type === 'folder'","status":"Timeout","location":{"end":{"column":59,"line":691},"start":{"column":11,"line":691}}},{"id":"392","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":59,"line":691},"start":{"column":11,"line":691}}},{"id":"395","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":59,"line":691},"start":{"column":28,"line":691}}},{"id":"400","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":30,"killedBy":["319"],"location":{"end":{"column":6,"line":744},"start":{"column":37,"line":699}}},{"id":"407","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":53,"line":705},"start":{"column":13,"line":705}}},{"id":"397","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":59,"line":691},"start":{"column":51,"line":691}}},{"id":"398","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":693},"start":{"column":61,"line":691}}},{"id":"399","mutatorName":"StringLiteral","replacement":"\"Stryker was here!\"","status":"Timeout","location":{"end":{"column":25,"line":696},"start":{"column":23,"line":696}}},{"id":"401","mutatorName":"StringLiteral","replacement":"``","status":"Timeout","location":{"end":{"column":65,"line":700},"start":{"column":38,"line":700}}},{"id":"402","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":32,"line":703},"start":{"column":11,"line":703}}},{"id":"411","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":53,"line":705},"start":{"column":45,"line":705}}},{"id":"403","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":32,"line":703},"start":{"column":11,"line":703}}},{"id":"404","mutatorName":"EqualityOperator","replacement":"nextUrl === undefined","status":"Timeout","location":{"end":{"column":32,"line":703},"start":{"column":11,"line":703}}},{"id":"412","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":10,"line":709},"start":{"column":55,"line":705}}},{"id":"405","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":710},"start":{"column":34,"line":703}}},{"id":"406","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":53,"line":705},"start":{"column":13,"line":705}}},{"id":"413","mutatorName":"ArrowFunction","replacement":"() => undefined","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":55,"line":715},"start":{"column":9,"line":715}}},{"id":"408","mutatorName":"LogicalOperator","replacement":"nextEntry || nextEntry.type === 'folder'","status":"Timeout","location":{"end":{"column":53,"line":705},"start":{"column":13,"line":705}}},{"id":"409","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":53,"line":705},"start":{"column":26,"line":705}}},{"id":"416","mutatorName":"LogicalOperator","replacement":"e.type === 'folder' || e.name === segment","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":55,"line":715},"start":{"column":14,"line":715}}},{"id":"410","mutatorName":"EqualityOperator","replacement":"nextEntry.type !== 'folder'","status":"Timeout","location":{"end":{"column":53,"line":705},"start":{"column":26,"line":705}}},{"id":"422","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":25,"line":718},"start":{"column":11,"line":718}}},{"id":"414","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":55,"line":715},"start":{"column":14,"line":715}}},{"id":"415","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":55,"line":715},"start":{"column":14,"line":715}}},{"id":"419","mutatorName":"StringLiteral","replacement":"\"\"","status":"Timeout","location":{"end":{"column":33,"line":715},"start":{"column":25,"line":715}}},{"id":"417","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":33,"line":715},"start":{"column":14,"line":715}}},{"id":"418","mutatorName":"EqualityOperator","replacement":"e.type !== 'folder'","status":"Timeout","location":{"end":{"column":33,"line":715},"start":{"column":14,"line":715}}},{"id":"420","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":55,"line":715},"start":{"column":37,"line":715}}},{"id":"421","mutatorName":"EqualityOperator","replacement":"e.name !== segment","status":"Timeout","location":{"end":{"column":55,"line":715},"start":{"column":37,"line":715}}},{"id":"424","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":8,"line":730},"start":{"column":27,"line":718}}},{"id":"423","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":25,"line":718},"start":{"column":11,"line":718}}},{"id":"425","mutatorName":"LogicalOperator","replacement":"this.fileIndex.getFolderByPath(currentPath) && this.fileIndex.getRoot()","status":"Timeout","location":{"end":{"column":95,"line":719},"start":{"column":24,"line":719}}},{"id":"426","mutatorName":"BooleanLiteral","replacement":"parent.children.some(c => c.name === segment)","status":"Timeout","location":{"end":{"column":59,"line":722},"start":{"column":13,"line":722}}},{"id":"427","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":101,"killedBy":["319"],"location":{"end":{"column":59,"line":722},"start":{"column":13,"line":722}}},{"id":"434","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":10,"line":724},"start":{"column":61,"line":722}}},{"id":"435","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":8,"line":743},"start":{"column":14,"line":730}}},{"id":"428","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":59,"line":722},"start":{"column":13,"line":722}}},{"id":"436","mutatorName":"LogicalOperator","replacement":"this.fileIndex.getFolderByPath(currentPath) && this.fileIndex.getRoot()","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":95,"line":734},"start":{"column":24,"line":734}}},{"id":"429","mutatorName":"MethodExpression","replacement":"parent.children.every(c => c.name === segment)","status":"Timeout","location":{"end":{"column":59,"line":722},"start":{"column":14,"line":722}}},{"id":"432","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":58,"line":722},"start":{"column":40,"line":722}}},{"id":"430","mutatorName":"ArrowFunction","replacement":"() => undefined","status":"Timeout","location":{"end":{"column":58,"line":722},"start":{"column":35,"line":722}}},{"id":"431","mutatorName":"ConditionalExpression","replacement":"true","status":"Timeout","location":{"end":{"column":58,"line":722},"start":{"column":40,"line":722}}},{"id":"437","mutatorName":"BlockStatement","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":4,"line":766},"start":{"column":77,"line":752}}},{"id":"433","mutatorName":"EqualityOperator","replacement":"c.name !== segment","status":"Timeout","location":{"end":{"column":58,"line":722},"start":{"column":40,"line":722}}},{"id":"442","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":62,"line":753},"start":{"column":50,"line":753}}},{"id":"439","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":72,"killedBy":["196"],"location":{"end":{"column":36,"line":753},"start":{"column":33,"line":753}}},{"id":"441","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":62,"line":753},"start":{"column":50,"line":753}}},{"id":"440","mutatorName":"ArrowFunction","replacement":"() => undefined","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":72,"killedBy":["196"],"location":{"end":{"column":62,"line":753},"start":{"column":45,"line":753}}},{"id":"438","mutatorName":"MethodExpression","replacement":"path.split('/')","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":30,"killedBy":["319"],"location":{"end":{"column":63,"line":753},"start":{"column":22,"line":753}}},{"id":"447","mutatorName":"EqualityOperator","replacement":"segments.length !== 0","statusReason":"expected true to be false // Object.is equality","status":"Killed","testsCompleted":66,"killedBy":["65"],"location":{"end":{"column":30,"line":755},"start":{"column":9,"line":755}}},{"id":"443","mutatorName":"EqualityOperator","replacement":"s.length >= 0","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":62,"line":753},"start":{"column":50,"line":753}}},{"id":"449","mutatorName":"ObjectLiteral","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":46,"line":756},"start":{"column":14,"line":756}}},{"id":"444","mutatorName":"EqualityOperator","replacement":"s.length <= 0","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":62,"line":753},"start":{"column":50,"line":753}}},{"id":"445","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":30,"line":755},"start":{"column":9,"line":755}}},{"id":"446","mutatorName":"ConditionalExpression","replacement":"false","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":30,"line":755},"start":{"column":9,"line":755}}},{"id":"452","mutatorName":"ConditionalExpression","replacement":"true","statusReason":"expected true to be false // Object.is equality","status":"Killed","testsCompleted":66,"killedBy":["65"],"location":{"end":{"column":30,"line":759},"start":{"column":9,"line":759}}},{"id":"458","mutatorName":"ArithmeticOperator","replacement":"segments.length + 1","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":50,"line":763},"start":{"column":31,"line":763}}},{"id":"456","mutatorName":"ObjectLiteral","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":55,"line":760},"start":{"column":14,"line":760}}},{"id":"457","mutatorName":"StringLiteral","replacement":"\"Stryker was here!\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":30,"line":760},"start":{"column":28,"line":760}}},{"id":"450","mutatorName":"StringLiteral","replacement":"\"Stryker was here!\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":72,"killedBy":["196"],"location":{"end":{"column":30,"line":756},"start":{"column":28,"line":756}}},{"id":"454","mutatorName":"EqualityOperator","replacement":"segments.length !== 1","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":72,"killedBy":["196"],"location":{"end":{"column":30,"line":759},"start":{"column":9,"line":759}}},{"id":"451","mutatorName":"StringLiteral","replacement":"\"Stryker was here!\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":72,"killedBy":["196"],"location":{"end":{"column":44,"line":756},"start":{"column":42,"line":756}}},{"id":"461","mutatorName":"StringLiteral","replacement":"\"\"","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":54,"line":764},"start":{"column":51,"line":764}}},{"id":"462","mutatorName":"ObjectLiteral","replacement":"{}","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":1,"killedBy":["196"],"location":{"end":{"column":36,"line":765},"start":{"column":12,"line":765}}},{"id":"448","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":757},"start":{"column":32,"line":755}}},{"id":"460","mutatorName":"UnaryOperator","replacement":"+1","statusReason":"Test timed out in 5000ms.\nIf this is a long-running test, pass a timeout value as the last argument or configure it globally with \"testTimeout\".","status":"Killed","testsCompleted":72,"killedBy":["196"],"location":{"end":{"column":44,"line":764},"start":{"column":42,"line":764}}},{"id":"453","mutatorName":"ConditionalExpression","replacement":"false","status":"Timeout","location":{"end":{"column":30,"line":759},"start":{"column":9,"line":759}}},{"id":"455","mutatorName":"BlockStatement","replacement":"{}","status":"Timeout","location":{"end":{"column":6,"line":761},"start":{"column":32,"line":759}}},{"id":"459","mutatorName":"MethodExpression","replacement":"segments","status":"Timeout","location":{"end":{"column":45,"line":764},"start":{"column":24,"line":764}}}],"source":"// src/plugin/vault.ts\nimport type { AutomergeUrl } from '@automerge/automerge-repo'\nimport { Events } from './events'\nimport { TFile, TFolder, TAbstractFile, type FileStats } from './files'\nimport type { DocumentManager } from '../services/document-manager'\nimport type { FileIndex } from '../services/file-index'\nimport { ImageResolver } from '../services/image-resolver'\nimport { mimeTypeFromExtension } from '../types/pushwork'\n\n/** Vault event types for typed subscriptions */\nexport interface VaultEvents {\n create: [file: TAbstractFile]\n modify: [file: TFile]\n delete: [file: TAbstractFile]\n rename: [file: TAbstractFile, oldPath: string]\n}\n\n/**\n * Vault class providing file system operations.\n * Thin Obsidian-compatible wrapper delegating lookups and events to FileIndex,\n * and orchestrating mutations via DocumentManager + FileIndex.\n */\nexport class Vault extends Events {\n /**\n * Recursively traverse a folder and its children.\n * Static method matching Obsidian's Vault.recurseChildren().\n */\n static recurseChildren(root: TAbstractFile, callback: (file: TAbstractFile) => void): void {\n const visited = new Set()\n function walk(node: TAbstractFile) {\n if (visited.has(node)) return\n visited.add(node)\n callback(node)\n if (node instanceof TFolder && node.children) {\n for (const child of node.children) {\n walk(child)\n }\n }\n }\n walk(root)\n }\n\n private name: string\n private readonly fileIndex: FileIndex\n private readonly documentManager: DocumentManager\n\n /** Root URL stored for future file tree traversal */\n get rootUrl(): AutomergeUrl {\n return this.fileIndex.getVaultRootUrl()\n }\n\n /** Config directory path (typically .obsidian) */\n readonly configDir: string = '.obsidian'\n\n /**\n * Low-level filesystem adapter (Obsidian-compatible).\n *\n * Implements the subset of Obsidian's DataAdapter that makes sense in a\n * browser PWA context. Methods that require filesystem access not available\n * in browsers throw with clear error messages.\n */\n readonly adapter: {\n /** Get stat info for a path. Returns null if path doesn't exist. */\n stat(path: string): Promise<{ type: 'file' | 'folder'; ctime: number; mtime: number; size: number } | null>\n /** Check if a path exists. */\n exists(path: string): Promise\n /** Read text content of a file. Throws if file doesn't exist. */\n read(path: string): Promise\n /** Write text content to a file. Creates file if it doesn't exist. */\n write(path: string, data: string): Promise\n /**\n * List contents of a folder.\n * Returns { files: string[], folders: string[] } with names relative to the folder.\n * Returns empty arrays if the path doesn't exist.\n */\n list(path: string): Promise<{ files: string[]; folders: string[] }>\n /** Create a folder. No-op if folder already exists. */\n mkdir(path: string): Promise\n /** Remove a folder. Throws if folder is not empty and recursive is false. */\n rmdir(path: string, recursive?: boolean): Promise\n /** Remove a file or folder. */\n remove(path: string): Promise\n /** Rename/move a file or folder. */\n rename(oldPath: string, newPath: string): Promise\n /** Copy a file. Throws with clear message - not yet implemented. */\n copy(src: string, dst: string): Promise\n /** Read binary content of a file. Returns ArrayBuffer. Throws if file doesn't exist. */\n readBinary(path: string): Promise\n /** Write binary content to a file. Creates or overwrites. */\n writeBinary(path: string, data: ArrayBuffer): Promise\n /** Append text to a file. Creates file if it doesn't exist. */\n append(path: string, data: string): Promise\n /**\n * Get the base filesystem path.\n * Throws in Reams - browser PWA has no filesystem path.\n */\n getBasePath(): string\n /**\n * Get a resource path/URL for a file that can be used in etc.\n * For images: returns blob URL if cached, otherwise throws.\n * For non-images: returns automerge:// URL.\n */\n getResourcePath(path: string): string\n }\n\n // Typed event overloads\n on(\n name: K,\n callback: (...args: VaultEvents[K]) => unknown,\n ctx?: unknown\n ): import('./events').EventRef\n on(name: string, callback: (...data: unknown[]) => unknown, ctx?: unknown): import('./events').EventRef\n on(name: string, callback: (...data: unknown[]) => unknown, ctx?: unknown): import('./events').EventRef {\n return super.on(name, callback, ctx)\n }\n\n constructor(name: string, fileIndex: FileIndex, documentManager: DocumentManager) {\n super()\n this.name = name\n this.fileIndex = fileIndex\n this.documentManager = documentManager\n\n // Forward FileIndex events to Vault subscribers\n fileIndex.on('create', (...args: unknown[]) => this.trigger('create', ...args))\n fileIndex.on('modify', (...args: unknown[]) => this.trigger('modify', ...args))\n fileIndex.on('delete', (...args: unknown[]) => this.trigger('delete', ...args))\n fileIndex.on('rename', (...args: unknown[]) => this.trigger('rename', ...args))\n\n // Initialize adapter with closures over private fields\n const self = this\n function notImplemented(methodName: string): (...args: unknown[]) => never {\n return () => { throw new Error(`Not implemented in Reams: adapter.${methodName}()`) }\n }\n this.adapter = {\n async stat(path: string) {\n const file = self.fileIndex.getAbstractFileByPath(path)\n if (!file) return null\n if (file instanceof TFile) {\n return { type: 'file' as const, ctime: file.stat.ctime, mtime: file.stat.mtime, size: file.stat.size }\n }\n return { type: 'folder' as const, ctime: 0, mtime: 0, size: 0 }\n },\n async exists(path: string) {\n return self.fileIndex.hasPath(path)\n },\n async read(path: string) {\n const url = self.fileIndex.getUrlForPath(path)\n if (url === undefined) throw new Error(`File not found: ${path}`)\n const entry = self.fileIndex.getByUrl(url)\n if (!entry || entry.type !== 'file') throw new Error(`File not found: ${path}`)\n const content = await self.documentManager.readContent(url)\n if (content == null) throw new Error(`File content is null: ${path}`)\n return content\n },\n async write(path: string, data: string) {\n const url = self.fileIndex.getUrlForPath(path)\n if (url !== undefined) {\n const file = self.fileIndex.getFileByPath(path)\n if (file) {\n await self.documentManager.updateContent(url, data)\n file.stat.size = data.length\n self.fileIndex.notifyModified(file)\n return\n }\n }\n await self.create(path, data)\n },\n\n async list(path: string): Promise<{ files: string[]; folders: string[] }> {\n // Normalize path: empty string or \"/\" means root\n const normalizedPath = path === '/' ? '' : path\n const folder = normalizedPath === ''\n ? self.fileIndex.getRoot()\n : self.fileIndex.getFolderByPath(normalizedPath)\n\n if (!folder) {\n // Path doesn't exist - return empty arrays (matches Obsidian behavior)\n return { files: [], folders: [] }\n }\n\n const files: string[] = []\n const folders: string[] = []\n\n for (const child of folder.children) {\n if (child instanceof TFile) {\n files.push(child.name)\n } else if (child instanceof TFolder) {\n folders.push(child.name)\n }\n }\n\n return { files, folders }\n },\n\n async mkdir(path: string): Promise {\n await self.createFolder(path)\n },\n\n async rmdir(path: string, recursive = false): Promise {\n const folder = self.fileIndex.getFolderByPath(path)\n if (!folder) {\n throw new Error(`Folder not found: ${path}`)\n }\n if (!recursive && folder.children.length > 0) {\n throw new Error(`Folder is not empty: ${path}. Use recursive=true to delete non-empty folders.`)\n }\n await self.delete(folder, true)\n },\n\n async remove(path: string): Promise {\n const file = self.fileIndex.getAbstractFileByPath(path)\n if (!file) {\n throw new Error(`File or folder not found: ${path}`)\n }\n await self.delete(file, true)\n },\n\n async rename(oldPath: string, newPath: string): Promise {\n const file = self.fileIndex.getAbstractFileByPath(oldPath)\n if (!file) {\n throw new Error(`File or folder not found: ${oldPath}`)\n }\n await self.rename(file, newPath)\n },\n\n async copy(_src: string, _dst: string): Promise {\n throw new Error(\n 'Vault.adapter.copy is not implemented in Reams. ' +\n 'To copy files, use app.vault.read(sourceFile) + app.vault.create(destPath, content), ' +\n 'or file an issue at https://github.com/anomalyco/reams if you need this feature.'\n )\n },\n\n async readBinary(path: string): Promise {\n const file = self.fileIndex.getFileByPath(path)\n if (!file) {\n throw new Error(`File not found: ${path}`)\n }\n const data = await self.readBinary(file)\n if (!data) {\n throw new Error(`File has no binary content: ${path}`)\n }\n // Defensive copy: Automerge may return a view into its internal buffer.\n // Copying prevents callers from accidentally mutating CRDT state.\n // Convert Uint8Array to ArrayBuffer (Obsidian returns ArrayBuffer)\n return data.slice().buffer\n },\n\n async writeBinary(path: string, data: ArrayBuffer): Promise {\n const uint8Data = new Uint8Array(data)\n const existingFile = self.fileIndex.getFileByPath(path)\n\n if (existingFile) {\n // File exists - update binary content\n const url = self.fileIndex.getUrlForPath(path)\n if (!url) throw new Error(`File not found: ${path}`)\n await self.documentManager.updateBinaryContent(url, uint8Data)\n existingFile.stat.size = uint8Data.length\n existingFile.stat.mtime = Date.now()\n self.fileIndex.notifyModified(existingFile)\n } else {\n // File doesn't exist - create it\n // Infer mime type from extension\n const ext = path.includes('.') ? path.slice(path.lastIndexOf('.') + 1) : ''\n const mimeType = mimeTypeFromExtension(ext)\n await self.createBinary(path, uint8Data, mimeType)\n }\n },\n\n async append(path: string, data: string): Promise {\n const existingFile = self.fileIndex.getFileByPath(path)\n if (existingFile) {\n const existingContent = await self.read(existingFile)\n await self.modify(existingFile, existingContent + data)\n } else {\n await self.create(path, data)\n }\n },\n\n getBasePath(): string {\n throw new Error(\n 'Vault.adapter.getBasePath is not available in Reams. ' +\n 'Reams is a browser-based PWA without filesystem access. ' +\n 'Files are stored in IndexedDB via Automerge, not on a filesystem path.'\n )\n },\n\n getResourcePath(path: string): string {\n const file = self.fileIndex.getFileByPath(path)\n if (!file) {\n throw new Error(`File not found: ${path}`)\n }\n\n // For images, we need blob URLs which require async resolution.\n // Check ImageResolver cache via window.app (runtime coupling is unavoidable\n // due to circular dependency: ImageResolver already depends on Vault).\n if (ImageResolver.isImageExtension(file.extension)) {\n // Safe access to window.app.imageResolver with proper type narrowing\n if (typeof window !== 'undefined' && window.app) {\n const imageResolver = (window.app as { imageResolver?: ImageResolver }).imageResolver\n if (imageResolver && typeof imageResolver.getCachedUrl === 'function') {\n const cachedUrl = imageResolver.getCachedUrl(path)\n if (cachedUrl) {\n return cachedUrl\n }\n }\n }\n // No cached URL available - provide clear guidance\n throw new Error(\n `Image not yet resolved: ${path}. ` +\n 'In Reams, image URLs are blob URLs that must be resolved asynchronously. ' +\n 'Call await app.imageResolver.resolveImageUrl(path) first, then getResourcePath() will return the cached blob URL.'\n )\n }\n\n // For non-images, return an automerge URL that uniquely identifies the file.\n // The fragment contains the filename for debugging/display purposes.\n const url = self.fileIndex.getUrlForPath(path)\n if (!url) {\n throw new Error(`File not found: ${path}`)\n }\n return url\n },\n }\n }\n\n /**\n * Initialize the vault by delegating to FileIndex.init().\n */\n async init(): Promise {\n await this.fileIndex.init()\n }\n\n /**\n * Get vault name.\n */\n getName(): string {\n return this.name\n }\n\n // --- Lookup methods (delegate to FileIndex) ---\n\n getRoot(): TFolder {\n return this.fileIndex.getRoot()\n }\n\n getFileByPath(path: string): TFile | null {\n return this.fileIndex.getFileByPath(path)\n }\n\n getFolderByPath(path: string): TFolder | null {\n return this.fileIndex.getFolderByPath(path)\n }\n\n getAbstractFileByPath(path: string): TAbstractFile | null {\n return this.fileIndex.getAbstractFileByPath(path)\n }\n\n getMarkdownFiles(): TFile[] {\n return this.fileIndex.getMarkdownFiles()\n }\n\n getFiles(): TFile[] {\n return this.fileIndex.getFiles()\n }\n\n getAllLoadedFiles(): TAbstractFile[] {\n return this.fileIndex.getAllLoadedFiles()\n }\n\n getUrlForPath(path: string): AutomergeUrl | undefined {\n return this.fileIndex.getUrlForPath(path)\n }\n\n getFileByUrl(url: AutomergeUrl): TFile | null {\n return this.fileIndex.getFileByUrl(url)\n }\n\n getAbstractFileByUrl(url: AutomergeUrl): TAbstractFile | null {\n return this.fileIndex.getAbstractFileByUrl(url)\n }\n\n getPathForUrl(url: AutomergeUrl): string | undefined {\n return this.fileIndex.getPathForUrl(url)\n }\n\n /**\n * Notify that a file was modified externally (e.g. debounced saver).\n * Delegates to FileIndex which updates mtime and fires the event.\n */\n notifyModified(file: TFile): void {\n this.fileIndex.notifyModified(file)\n }\n\n // --- Mutation methods ---\n\n /**\n * Create a new text file.\n * Throws if a file already exists at the given path (matches Obsidian API).\n * Use getFileByPath() to check existence first, or modify() to update content.\n */\n async create(path: string, data: string): Promise {\n const { parentPath, fileName } = this.parsePath(path)\n\n if (!fileName) {\n throw new Error(`Invalid path: '${path}' — empty filename`)\n }\n\n const normalizedPath = parentPath ? `${parentPath}/${fileName}` : fileName\n\n // Throw if path already exists as file or folder (Obsidian API contract)\n const existing = this.fileIndex.getAbstractFileByPath(normalizedPath)\n if (existing) {\n throw new Error(`File already exists: ${normalizedPath}`)\n }\n\n // Ensure parent folder exists\n const parentUrl = await this.ensureFolderPath(parentPath)\n\n // Create file in the parent folder\n const url = await this.documentManager.createFileInFolder(parentUrl, fileName)\n await this.documentManager.updateContent(url, data)\n\n const parent = this.fileIndex.getFolderByPath(parentPath) ?? this.fileIndex.getRoot()\n const stat: FileStats = { ctime: Date.now(), mtime: Date.now(), size: data.length }\n const file = new TFile(fileName, parent, stat)\n\n parent.children.push(file)\n this.fileIndex.registerFile(url, parentUrl, file)\n this.fileIndex.notifyCreated(file)\n\n return file\n }\n\n /**\n * Create a new binary file.\n * Throws if a file already exists at the given path (matches Obsidian API).\n */\n async createBinary(path: string, data: Uint8Array, mimeType: string): Promise {\n const { parentPath, fileName } = this.parsePath(path)\n\n if (!fileName) {\n throw new Error(`Invalid path: '${path}' — empty filename`)\n }\n\n const normalizedPath = parentPath ? `${parentPath}/${fileName}` : fileName\n\n // Throw if path already exists as file or folder (Obsidian API contract)\n const existing = this.fileIndex.getAbstractFileByPath(normalizedPath)\n if (existing) {\n throw new Error(`File already exists: ${normalizedPath}`)\n }\n\n const parentUrl = await this.ensureFolderPath(parentPath)\n\n const url = await this.documentManager.createBinaryFileInFolder(parentUrl, fileName, data, mimeType)\n\n const parent = this.fileIndex.getFolderByPath(parentPath) ?? this.fileIndex.getRoot()\n const stat: FileStats = { ctime: Date.now(), mtime: Date.now(), size: data.length }\n const file = new TFile(fileName, parent, stat)\n\n parent.children.push(file)\n this.fileIndex.registerFile(url, parentUrl, file)\n this.fileIndex.notifyCreated(file)\n\n return file\n }\n\n /**\n * Read binary content of a file.\n */\n async readBinary(file: TFile): Promise {\n const url = this.fileIndex.getUrlForPath(file.path)\n if (!url) throw new Error(`File not found: ${file.path}`)\n return this.documentManager.readBinaryContent(url)\n }\n\n /**\n * Create a new folder.\n */\n async createFolder(path: string): Promise {\n await this.ensureFolderPath(path)\n\n const folder = this.fileIndex.getFolderByPath(path)\n if (!folder) {\n throw new Error(`Failed to create folder: ${path}`)\n }\n\n return folder\n }\n\n /**\n * Read file content.\n */\n async read(file: TFile): Promise {\n const url = this.fileIndex.getUrlForPath(file.path)\n if (!url) throw new Error(`File not found: ${file.path}`)\n\n const content = await this.documentManager.readContent(url)\n return content ?? ''\n }\n\n /**\n * Read file content from cache (same as read for Reams).\n */\n async cachedRead(file: TFile): Promise {\n return this.read(file)\n }\n\n /**\n * Modify file content.\n */\n async modify(file: TFile, data: string): Promise {\n const url = this.fileIndex.getUrlForPath(file.path)\n if (!url) throw new Error(`File not found: ${file.path}`)\n\n await this.documentManager.updateContent(url, data)\n\n file.stat.size = data.length\n this.fileIndex.notifyModified(file)\n }\n\n /**\n * Read a file, apply a transform function, and write the result back.\n */\n async process(file: TFile, fn: (data: string) => string): Promise {\n const data = await this.read(file)\n const result = fn(data)\n await this.modify(file, result)\n return result\n }\n\n /**\n * Collect all descendant entries of a folder from the TFolder.children tree.\n */\n private collectDescendants(folder: TFolder): TAbstractFile[] {\n const result: TAbstractFile[] = []\n\n for (const child of [...folder.children]) {\n if (child instanceof TFolder) {\n result.push(...this.collectDescendants(child))\n }\n result.push(child)\n }\n\n return result\n }\n\n /**\n * Delete a file or folder.\n */\n async delete(file: TAbstractFile, _force?: boolean): Promise {\n const fileUrl = this.fileIndex.getUrlForPath(file.path)\n if (!fileUrl) return\n const entry = this.fileIndex.getByUrl(fileUrl)\n if (!entry) return\n\n // For folders, recursively delete all descendants first\n if (entry.type === 'folder' && file instanceof TFolder) {\n const descendants = this.collectDescendants(file)\n\n for (const descendant of descendants) {\n const descUrl = this.fileIndex.getUrlForPath(descendant.path)\n if (!descUrl) continue\n const descEntry = this.fileIndex.getByUrl(descUrl)\n if (!descEntry) continue\n\n if (descEntry.parentUrl) {\n if (descEntry.type === 'file') {\n await this.documentManager.deleteFile(descUrl, descEntry.parentUrl)\n } else {\n await this.documentManager.deleteFolder(descUrl, descEntry.parentUrl)\n }\n }\n\n // Remove from parent's children array\n if (descendant.parent) {\n const index = descendant.parent.children.indexOf(descendant)\n if (index !== -1) {\n descendant.parent.children.splice(index, 1)\n }\n }\n\n // FileIndex.remove fires 'delete' event\n this.fileIndex.remove(descUrl)\n }\n }\n\n // Delete the item itself\n if (entry.parentUrl) {\n if (entry.type === 'file') {\n await this.documentManager.deleteFile(fileUrl, entry.parentUrl)\n } else {\n await this.documentManager.deleteFolder(fileUrl, entry.parentUrl)\n }\n }\n\n if (file.parent) {\n const index = file.parent.children.indexOf(file)\n if (index !== -1) {\n file.parent.children.splice(index, 1)\n }\n }\n\n // FileIndex.remove fires 'delete' event\n this.fileIndex.remove(fileUrl)\n }\n\n /**\n * Rename or move a file/folder.\n */\n async rename(file: TAbstractFile, newPath: string): Promise {\n const url = this.fileIndex.getUrlForPath(file.path)\n if (!url) throw new Error(`File not found: ${file.path}`)\n const entry = this.fileIndex.getByUrl(url)\n if (!entry) throw new Error(`File not found: ${file.path}`)\n\n const oldPath = file.path\n const { parentPath: newParentPath, fileName: newName } = this.parsePath(newPath)\n const normalizedNewPath = newParentPath ? `${newParentPath}/${newName}` : newName\n\n // Check for conflict\n const conflicting = this.fileIndex.getAbstractFileByPath(normalizedNewPath)\n if (conflicting && conflicting !== file) {\n throw new Error(`Cannot rename to \"${normalizedNewPath}\": path already exists`)\n }\n\n const oldParentPath = file.parent ? (file.parent.isRoot() ? '' : file.parent.path) : ''\n\n const parentChanged = newParentPath !== oldParentPath\n const nameChanged = newName !== file.name\n\n // --- Phase 1: DocumentManager operations ---\n\n if (parentChanged) {\n const newParentUrl = await this.ensureFolderPath(newParentPath)\n const oldParentUrl = entry.parentUrl ?? this.rootUrl\n\n await this.documentManager.moveFile(url, oldParentUrl, newParentUrl)\n\n this.fileIndex.updateParentUrl(url, newParentUrl)\n\n if (file.parent) {\n const index = file.parent.children.indexOf(file)\n if (index !== -1) {\n file.parent.children.splice(index, 1)\n }\n }\n\n const newParent = this.fileIndex.getFolderByPath(newParentPath) ?? this.fileIndex.getRoot()\n newParent.children.push(file)\n file.parent = newParent\n }\n\n if (nameChanged) {\n const currentParentUrl = entry.parentUrl ?? this.rootUrl\n\n if (entry.type === 'file') {\n await this.documentManager.renameFile(url, currentParentUrl, newName)\n } else {\n await this.documentManager.renameEntry(url, currentParentUrl, newName)\n }\n\n file.name = newName\n }\n\n // --- Phase 2: Re-key FileIndex ---\n this.fileIndex.rekey(url, oldPath)\n }\n\n /**\n * Ensure all folders in a path exist, creating them if necessary.\n */\n private async ensureFolderPath(folderPath: string): Promise {\n if (folderPath === '') {\n return this.rootUrl\n }\n\n const segments = folderPath.split('/').filter(s => s.length > 0)\n\n if (segments.length === 0) {\n return this.rootUrl\n }\n\n const normalizedPath = segments.join('/')\n\n // Fast path: check if folder already exists\n const existingUrl = this.fileIndex.getUrlForPath(normalizedPath)\n if (existingUrl !== undefined) {\n const existingEntry = this.fileIndex.getByUrl(existingUrl)\n if (existingEntry && existingEntry.type === 'folder') {\n return existingUrl\n }\n }\n\n let currentPath = ''\n let currentUrl = this.rootUrl\n\n for (const segment of segments) {\n const nextPath = currentPath ? `${currentPath}/${segment}` : segment\n const nextUrl = this.fileIndex.getUrlForPath(nextPath)\n\n if (nextUrl !== undefined) {\n const nextEntry = this.fileIndex.getByUrl(nextUrl)\n if (nextEntry && nextEntry.type === 'folder') {\n currentPath = nextPath\n currentUrl = nextUrl\n continue\n }\n }\n\n // Not in index — check if folder exists in parent via listFolder\n const parentContents = await this.documentManager.listFolder(currentUrl)\n const existingFolder = parentContents.find(\n e => e.type === 'folder' && e.name === segment\n )\n\n if (existingFolder) {\n const parent = this.fileIndex.getFolderByPath(currentPath) ?? this.fileIndex.getRoot()\n const folder = new TFolder(segment, parent)\n\n if (!parent.children.some(c => c.name === segment)) {\n parent.children.push(folder)\n }\n\n this.fileIndex.registerFolder(existingFolder.url, currentUrl, folder)\n\n currentPath = nextPath\n currentUrl = existingFolder.url\n } else {\n // Create new folder\n const newUrl = await this.documentManager.createSubfolder(currentUrl, segment)\n\n const parent = this.fileIndex.getFolderByPath(currentPath) ?? this.fileIndex.getRoot()\n const folder = new TFolder(segment, parent)\n\n parent.children.push(folder)\n this.fileIndex.registerFolder(newUrl, currentUrl, folder)\n this.fileIndex.notifyCreated(folder)\n\n currentPath = nextPath\n currentUrl = newUrl\n }\n }\n\n return currentUrl\n }\n\n /**\n * Parse path into parent path and file name.\n */\n private parsePath(path: string): { parentPath: string; fileName: string } {\n const segments = path.split('/').filter(s => s.length > 0)\n\n if (segments.length === 0) {\n return { parentPath: '', fileName: '' }\n }\n\n if (segments.length === 1) {\n return { parentPath: '', fileName: segments[0] }\n }\n\n const fileName = segments[segments.length - 1]\n const parentPath = segments.slice(0, -1).join('/')\n return { parentPath, fileName }\n }\n}\n"}},"schemaVersion":"1.0","thresholds":{"high":90,"low":80,"break":60},"testFiles":{"src/editor/__tests__/builtin-formatting-actions.test.ts":{"tests":[{"id":"0","name":"builtin formatting actions (CM6) creates expected actions"},{"id":"1","name":"builtin formatting actions (CM6) every builtin action resolves to a registered icon (either map)"},{"id":"2","name":"builtin formatting actions (CM6) bold wraps selection with **"},{"id":"3","name":"builtin formatting actions (CM6) bold selects the wrapped content after bold"},{"id":"4","name":"builtin formatting actions (CM6) bold inserts empty ** pair when no selection"},{"id":"5","name":"builtin formatting actions (CM6) heading adds # prefix to line"},{"id":"6","name":"builtin formatting actions (CM6) heading cycles heading levels"},{"id":"7","name":"builtin formatting actions (CM6) bullet-list adds - prefix"},{"id":"8","name":"builtin formatting actions (CM6) link wraps selection in link template"},{"id":"9","name":"builtin formatting actions (CM6) wikilink inserts `[[` at the cursor when there is no selection; cursor is parked after `[[`"},{"id":"10","name":"builtin formatting actions (CM6) wikilink wraps selection as `[[` (no trailing `]]`)"},{"id":"11","name":"builtin formatting actions (CM6) wikilink is registered with id `builtin:wikilink`"},{"id":"12","name":"builtin formatting actions (CM6) wikilink uses the `square-brackets` icon and `Insert wikilink` title"},{"id":"13","name":"builtin formatting actions (CM6) footnote is registered as builtin:footnote with asterisk icon, insert group"},{"id":"14","name":"builtin formatting actions (CM6) footnote asterisk icon string resolves to lucide-react Asterisk component"},{"id":"15","name":"builtin formatting actions (CM6) footnote inserts [^1] + creates ## Footnotes section in an empty doc"},{"id":"16","name":"builtin formatting actions (CM6) footnote appends def under existing Footnotes section, picks next int, preserves trailing content"},{"id":"17","name":"builtin formatting actions (CM6) footnote replaces selection with [^N] and uses selected text as def body"},{"id":"18","name":"builtin formatting actions (CM6) footnote parks cursor at end of def body (no selection)"},{"id":"19","name":"builtin formatting actions (CM6) footnote parks cursor at end of def body (with selection)"},{"id":"20","name":"builtin formatting actions (CM6) footnote skips named footnotes when picking integer id"},{"id":"21","name":"builtin formatting actions (CM6) footnote uses a SINGLE CM6 transaction (one undo step) — verified by undo round-trip"},{"id":"22","name":"builtin formatting actions (CM6) footnote no-ops when cursor is inside an existing footnote def body"},{"id":"23","name":"builtin formatting actions (CM6) footnote shows a Notice when cursor is inside an existing footnote def body (T6.10.b)"},{"id":"24","name":"builtin formatting actions (CM6) undo atomicity bold action is a single undo step"},{"id":"25","name":"builtin formatting actions (CM6) undo atomicity heading action is a single undo step"},{"id":"26","name":"builtin formatting actions (CM6) undo atomicity bold action dispatches to CM6 view exactly once for the formatting"},{"id":"27","name":"builtin formatting actions (CM6) undo atomicity falls back to Editor API when getView is not available"},{"id":"28","name":"builtin formatting actions (CM6) italic wraps selection with *"},{"id":"29","name":"builtin formatting actions (CM6) italic selects the wrapped content after italic"},{"id":"30","name":"builtin formatting actions (CM6) italic inserts empty * pair when no selection"},{"id":"31","name":"builtin formatting actions (CM6) strikethrough wraps selection with ~~"},{"id":"32","name":"builtin formatting actions (CM6) strikethrough selects the wrapped content after strikethrough"},{"id":"33","name":"builtin formatting actions (CM6) code wraps selection with backticks"},{"id":"34","name":"builtin formatting actions (CM6) code selects the wrapped content after code"},{"id":"35","name":"builtin formatting actions (CM6) numbered-list adds 1. prefix"},{"id":"36","name":"builtin formatting actions (CM6) numbered-list removes 1. prefix when toggling"},{"id":"37","name":"builtin formatting actions (CM6) todo adds - [ ] prefix"},{"id":"38","name":"builtin formatting actions (CM6) todo removes - [ ] prefix when toggling"},{"id":"39","name":"builtin formatting actions (CM6) indent adds indentation"},{"id":"40","name":"builtin formatting actions (CM6) outdent removes indentation"},{"id":"41","name":"builtin formatting actions (CM6) outdent does nothing when no indentation exists"},{"id":"42","name":"builtin formatting actions (CM6) blockquote adds > prefix"},{"id":"43","name":"builtin formatting actions (CM6) blockquote removes > prefix when toggling"},{"id":"44","name":"builtin formatting actions (CM6) heading cycling (full cycle) cycles H1 → H2 → H3 → plain → H1"},{"id":"45","name":"builtin formatting actions (CM6) link edge cases inserts empty link template when no selection"},{"id":"46","name":"builtin formatting actions (CM6) offsetToLineCol edge cases (via multiline formatting) correctly positions selection on second line after bold"},{"id":"47","name":"builtin formatting actions (CM6) offsetToLineCol edge cases (via multiline formatting) selection after bold on third line has correct line number"},{"id":"48","name":"builtin formatting actions (CM6) offsetToLineCol edge cases (via multiline formatting) bold at end of first line: selection stays on line 0"},{"id":"49","name":"builtin formatting actions (CM6) bold toggle (unwrap) unwraps bold when selection is already bold"},{"id":"50","name":"builtin formatting actions (CM6) bold toggle (unwrap) wraps non-bold text normally"},{"id":"51","name":"builtin formatting actions (CM6) action metadata each action has an id, icon, title, group, and callback"},{"id":"52","name":"builtin formatting actions (CM6) action metadata registers all expected builtin actions including builtin:image"},{"id":"53","name":"builtin formatting actions (CM6) action metadata all groups are one of inline, block, insert, table"},{"id":"54","name":"builtin formatting actions (CM6) table actions registers the 8 builtin table actions with stable ids"},{"id":"55","name":"builtin formatting actions (CM6) table actions builtin:insert-table.isVisible returns true outside a table, false inside"},{"id":"56","name":"builtin formatting actions (CM6) table actions all 7 in-table actions return isVisible=false outside a table"},{"id":"57","name":"builtin formatting actions (CM6) table actions all 5 unconditional in-table actions return isVisible=true in a body cell"},{"id":"58","name":"builtin formatting actions (CM6) table actions builtin:delete-row.isVisible: false on header, false on separator, true on body"},{"id":"59","name":"builtin formatting actions (CM6) table actions column-targeted actions ARE visible at the leading-pipe edge of a row (revised convention)"},{"id":"60","name":"builtin formatting actions (CM6) table actions all in-table actions are visible when cursor is in a real TableCell"},{"id":"61","name":"builtin formatting actions (CM6) table actions builtin:delete-column.isVisible: false when columnCount === 1, true otherwise"},{"id":"62","name":"builtin formatting actions (CM6) table actions add-row-below callback dispatches expected ChangeSet"},{"id":"63","name":"builtin formatting actions (CM6) table actions insert-table callback inserts the template at the cursor"},{"id":"64","name":"builtin formatting actions (CM6) table actions isVisible predicate errors are caught and treated as visible (documents the invariant)"},{"id":"65","name":"builtin formatting actions (CM6) table actions round-trip: insertTable.isVisible flips true → false after invocation"},{"id":"66","name":"builtin formatting actions (CM6) table actions round-trip: in-table actions isVisible flips false → true after insertTable"},{"id":"67","name":"builtin formatting actions (CM6) table action integration Click \"Add row below\" toolbar action ≡ addRowBelow command"},{"id":"68","name":"builtin formatting actions (CM6) table action integration Click \"Toggle column alignment\" three times cycles through states and back to left"},{"id":"69","name":"builtin formatting actions (CM6) table action integration insertTable lands cursor at first cell content"},{"id":"70","name":"builtin formatting actions (CM6) formatting-action-manager round-trip registering an action with isVisible preserves the predicate"}],"source":"import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'\nimport { EditorState } from '@codemirror/state'\nimport { EditorView } from '@codemirror/view'\nimport { history, undo } from '@codemirror/commands'\nimport { Asterisk } from 'lucide-react'\nimport { CM6EditorAdapter } from '../../plugin/cm6-editor'\nimport { createBuiltinFormattingActions } from '../builtin-formatting-actions'\nimport { FORMATTING_ICON_MAP } from '../formatting-icon-map'\nimport type { FormattingAction } from '../../plugin/ui/formatting-action-types'\nimport type { Vault } from '../../plugin/vault'\nimport type { App } from '../../plugin/app'\nimport { TFile, TFolder } from '../../plugin/files'\n\nfunction asAppFromVault(vault: Vault): App {\n return { vault, workspace: { getActiveFile: () => null } } as unknown as App\n}\n\n// Mock the obsidian compat module so we can spy on Notice constructor\n// for the cursor-in-def-body guardrail (T6.10.b — recommended addition).\nvi.mock('obsidian', async () => {\n const actual = await vi.importActual('../../plugin/obsidian-compat')\n const NoticeMock = vi.fn()\n return {\n ...actual,\n Notice: NoticeMock,\n }\n})\n\nfunction createMockVault(): Vault {\n const root = new TFolder('', null)\n return {\n createBinary: vi.fn(async (p: string) => new TFile(p, root, { ctime: 0, mtime: 0, size: 0 })),\n } as unknown as Vault\n}\n\nconst createdViews: EditorView[] = []\n\nfunction createTestEditor(content: string, extensions: import('@codemirror/state').Extension[] = []): { adapter: CM6EditorAdapter; view: EditorView } {\n const view = new EditorView({\n state: EditorState.create({ doc: content, extensions }),\n })\n createdViews.push(view)\n const adapter = new CM6EditorAdapter()\n adapter.setView(view)\n return { adapter, view }\n}\n\nfunction findAction(actions: FormattingAction[], id: string): FormattingAction {\n const action = actions.find(a => a.id === id)\n if (!action) throw new Error(`Action ${id} not found`)\n return action\n}\n\ndescribe('builtin formatting actions (CM6)', () => {\n let actions: FormattingAction[]\n\n beforeEach(async () => {\n actions = createBuiltinFormattingActions(asAppFromVault(createMockVault()))\n // Review minor #8: clear the mocked `Notice` constructor between\n // every test so a Notice fired by one case doesn't leak into the\n // call-count assertions of another. Without this, T6.10.b's count\n // assertion can pass spuriously if a previous test (in any\n // describe block) instantiated a Notice.\n const obsidian = await import('obsidian')\n const NoticeMock = obsidian.Notice as unknown as ReturnType\n NoticeMock.mockClear()\n })\n\n afterEach(() => {\n for (const v of createdViews) v.destroy()\n createdViews.length = 0\n })\n\n it('creates expected actions', () => {\n const ids = actions.map(a => a.id)\n expect(ids).toContain('builtin:bold')\n expect(ids).toContain('builtin:italic')\n expect(ids).toContain('builtin:heading')\n expect(ids).toContain('builtin:bullet-list')\n expect(ids).toContain('builtin:link')\n expect(ids).toContain('builtin:wikilink')\n })\n\n // Lock-in test: every builtin action's `icon` field must resolve to a\n // registered icon via either of the two paths the FormattingToolbar\n // checks: (1) the lucide-react `FORMATTING_ICON_MAP` (fast path), or\n // (2) the lucide-icons `setIcon` fallback (slow path, reads from\n // ICON_REGISTRY in `plugin/ui/icon.ts`). If an icon resolves to\n // NEITHER, the toolbar renders an empty