Você já sabe que o package.json é um arquivo de manifesto que cuida de metadados do projeto, script e dependencias, certo?
Já o package-lock.json também é um arquivo de manifesto, mas ele cuida das dependencias, e das dependencias das dependencias.
Isso simplesmente porque assim como seu projeto possuí dependencias, muitas dessas bibliotecas terão suas próprias dependencias também.
Por exemplo o Next e o React.