package main func init() { register(Check{ Seq: 130, ID: "13", Title: "RPC query/mutation error handling", Run: func(ctx *ScanContext, rep *Reporter) { if len(ctx.frontendTargets) > 0 { var rpcViolations []rpcErrorViolation var rpcWarnings []rpcErrorViolation for _, target := range ctx.frontendTargets { pv, pw := checkRPCErrors(target.dir) for _, v := range pv { v.file = prefixDisplayPath(target.label, v.file) rpcViolations = append(rpcViolations, v) } for _, w := range pw { w.file = prefixDisplayPath(target.label, w.file) rpcWarnings = append(rpcWarnings, w) } } if len(rpcViolations) > 0 { rep.Fail("%d mutation(s) with no error handling", len(rpcViolations)) for _, v := range rpcViolations { rep.Findingf("%s:%d [%s] %s", v.file, v.line, v.rule, v.snippet) } if len(rpcWarnings) > 0 { rep.Findingf("%d useQuery call(s) without error destructuring (global handler covers these)", len(rpcWarnings)) } } else if len(rpcWarnings) > 0 { rep.OK("All mutations have error handling (%d queries rely on global error handler)", len(rpcWarnings)) } else { rep.OK("All mutations have error handling") } } else { rep.Skip("no frontend sources found") } }, }) }