On a dynamic SPA site that I'm working with right now, we have no server generated data layer. however, I've added two sequential scripts that first: defined window.digitalData and some assumed static properties.
The second uses Object.assign() to merge a new object with actual data into the existing digitalData structure.
This enabled a semi-dynamic data layer, that was created at pageload, but before the initial pageBottom trigger was fired.