semantic versioning explained in node.js