The difference between ~ (tilde) and ^ (caret) used to specify acceptable versions in package.json was always a blur in my mind for a while. So this article is probably more for me than you, but here it is.

Given the following version definition:

x.x.x = major.minor.patch

~ matches the patch version only, so
~1.2.0 will match versions 1.2.x but will ignore 1.3.x

^ matches the minor version and patch versions, so
^1.2.0 will match 1.x.x including 1.3.x but will ignore 2.x.x.