Can someone explain the difference between auth0-js, auth0-spa-js and auth0-lock?

Also this one in terms of comparing auth0.js to the SPA version: