type ProfileSpec = Frond.NodeSpec<{
readonly args: Frond.Args.None;
readonly key: Frond.Key.Singleton;
readonly deps: {
readonly http: Frond.Dep<typeof HttpTransportNode>;
};
readonly result: Profile;
}>;
This begs to be its own DSL rather than TypeScript-type-meta-programming.
romanonthego•3h ago
The shape: your app is a graph of nodes — services, resources, screens. Each node declares its dependencies, how it's acquired, how it's cancelled, and how it's released, all in one place. The runtime resolves them in dependency order and tracks readiness, so React stays a renderer — it consumes a node that's already ready (useNode suspends until it is) instead of re-deriving that logic inside components.
Two engines run underneath. Effect handles the async work — execution guarantees, cleanup correctness, cancellation, and typed error channels. MobX handles state — granular observable state and live updates. You declare a node's dependencies, acquire, and release; Frond runs the rest on those two.
It's v0 and the API will still move.
charucharu•44m ago