Alternative solution to versioned dependencies etc: * Copy all imported function definitions to a "local" file in the project where they are used. * The file needs to contain both the function definitions as well as the library name. - Maybe there could be one section per library or something like that. - For types, the library name might be that of a transitive dependency. Advantages: * Projects can always be built without fetching any dependencies! - Runtime dependencies still need to be fetched obviously. - But it makes one-off patching/debugging/contributions much easier. * It makes it clear that interfaces/API cannot change * It makes it clear which functions are imported. * It *might* remove the need for since-versioning. - When you copy something from an exports file of a dependency to the imports file of your own project, you'd also copy the type definitions. - Type definitions would then be duplicated everywhere where they are used, but that might be fine? - Note that fields can be added to non-closed non-opaque types. So the type checker needs to allow that.