Good news: Pulumi is also entirely declarative. The model is what matters in this regard, not the syntax used to express it.
To add to this, having the full expressive power of a programming language for syntax is the way to go. When you have to add explicit looping in your DSL, it’s time to not use a DSL.
HCL is my least favorite part of the hashicorp ecosystem.
Also it’s not like you have to take my word for it — the trend towards CDKs shows that pulumis approach was right. They were just early
When you write a Pulumi program you’re effectively creating a DAG in memory. The resources will be created in whatever order and with the maximum parallelization the dependencies allow.
The other aspect of this is how it adds another requirement to your project - the setup and management of the language environment for the target language. Suddenly you've got another npm/bundler/etc. lockfile to keep up to date, your CI container images are double the size, your developers have another thing to fight homebrew to cooperate with...