That’s not a downside. That’s part of building and being a team. We’re human, not machines. If you hire the right people, they’ll know when to have a laugh and when to work their ass off.
I think the majority of people here understands the commercial considerations Apple makes.
But you asked what would you expect. At least don’t block me to update. Tell me it’s not officially supported. But let me install whatever OS I want, at my own risk.
The problem is not even the OS. It’s the whole ecosystem of apps that require a certain OS version.
I’m stuck on 10.13 with my iMac from 2012. The hardware serves me well, it does exactly what I need it to do. I’m just stuck on an old OS.
There is a difference with approaches like openapi/swagger/graphql though.
With Phero you define your models with plain TS. Our code-gen will "just" copy the exact same models to your client SDK. The DX is night and day.
We believe domain models are the most important part of your codebase. We don't like to define them in an intermediate language like graphql/swagger/graphql/you-name-it.
Because we support plain TS as "input" if you will, you can use all features and greatness TS comes with. Like generics, conditional types, mapped types, even template literal types!
Yes, Phero has a build step. Phero does come with a CLI and will watch code changes, build your TS alongside with an client SDK.
In our experience the latency between changing something in your API, and seeing compile errors arise in the client is just a few seconds. And this only matters when your API contract changes, which is of course not always. Not a biggy in our eyes. In order to run, you'd need to compile TS anyways. :)
In our opinion this is well worth the "magic" Phero adds: it will work with plain TS. No "t.string" like apis to build your apis/models. Matter of taste I guess :)
We use Phero extensively in mobile apps projects, so we know the pain of maintaining API versions and backward compatibility hell.
Phero generates a declaration file with all functions you expose, and bundles dependent domain models (interfaces, type aliases, enums, etc) with it. Currently there's only one version. Our plan is to let users pin versions of this declaration file (we call it the manifest file).
Then we build cli commands to compare them and actually tell if they are compatible. This way you know if it's safe to deploy a new version of your API without breaking existing clients. These are all future plans of course, but in the scope of the project.
Shameless plug:
I’m one of the authors of Phero [1]. It’s goal is similar to tRPC: fullstack typesafety between your server and client(s).
One difference is syntax: Phero leverages the TS compiler api to generate parsers for your backend functions. It will parse input and output of your api functions, automatically, based on the types you define for your functions. It will generate a declaration file of your api and generate an RPC style client SDK for your frontend. Another difference is that it aims to be more batteries includes.
Please keep in mind, he didn't send you there personally. The algorithm did. I've experienced this several times my self, very frustrating and sometimes even dangerous. I think it's unavoidable if you take into account that they operate on planet-scale. Not saying that they can't do better, but probably it's not "someone's" fault.
For instance, I know Turkish is very consistent: it was refactored in 1928 with the birth of Turkey. Turkish is quite high in the rankings. I don't think because there's loads of data available, but because of its consistency. Contrary, English has loads of data, which should compensate for it inconsistency.
Shameless plug to my project Phero [0]. It’s a bit like gRPC but specifically for full stack TypeScript projects.
It has a minimal API, literally one function, with which you can expose your server’s functions. It will generate a Typesafe SDK for your frontend(s), packed with all models you’re using. It will also generate a server which will automatically validate input & output to your server.
One thing I’ve seen no other similar solution do is the way we do error handling: throw an error on the server and catch it on the client as if it was a local error.
As I said, it’s only meant for teams who have full stack TypeScript. For teams with polyglot stacks an intermediate like protobuf or GraphQL might make more sense. We generate a TS declaration file instead.
Interesting, we’re the opposite: use enums where possible. We think it adds more clarity to the reader.
Besides, sometimes number values make more sense then string values. Especially when you want to do bitwise operations, which are not possible on string unions.
For me moving farther away from my family has been key to spend more time with them.
They live about 150km away from me. Because it’s a relative long distance they will always sleep over when they come (and me when I go to them), and we get to spend the weekend together in one house.
My brother, who lives in the same city, meets them more often but for just an evening or afternoon. He always complains I get to spend more time with them even though he lives 10m away.
BTW, I realize that 150km would be “close” for US and other big countries. In the Netherlands that’s the difference between east and west. :-)