Here’s the definition of “declarative programming” from Wikipedia:
Many languages that apply this style attempt to minimize or eliminate side effects by describing what the program must accomplish in terms of the problem domain, rather than describe how to accomplish it as a sequence of the programming language primitives
Any programming language that lacks side effects (or more specifically, is referentially transparent)
To be even more specific:
Declarative programming is a non-imperative style of programming in which programs describe their desired results without explicitly listing commands or steps that must be performed
.mergeMap(() => getJSON()) is “listing the commands or steps” to be performed in the outside world.
Contrary to what you stated, side-effects and declarative programming are very much related concepts.