Earlier quoted context omitted.
I don't know if it was done with modding in mind or not, but the transition to data packs was a non-trivial addition of mod support.
At the cost of inner-platform-effecting all the game code. Long-time software engineers know all about the inner platform effect - if not, see [1]. Instead of writing directly what you want, something like: new Block("mymod:mystone").setShape(Shapes.CUBE).setTexture("mymod:stone_texture").setStepSound(Sounds.STEP_ON_STONE)... you now have to do some of this inline (the part that can't be customized in data packs): ne…
Yes, having to declare json files for your new block in your mod is a pain...
Meanwhile what it was built for, resource packs, this actually gives a good amount of power to the pack maker without having to ask the client to run untrusted java code.