Você já sabe que o package.json é um arquivo de manifesto que cuida de metadados do projeto, script e dependencias, certo?

image.png

Já o package-lock.json também é um arquivo de manifesto, mas ele cuida das dependencias, e das dependencias das dependencias.

image.png

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.

image.png

image.png