Skip to content

Conversation

@joshua-spacetime
Copy link
Collaborator

NOTE: Cherry-picking #4127 from the 2.0-breaking-changes branch.

Original PR Description

This changes generated types in ts client bindings. We currently generate a few different types of types: reducer args, procedure args, rows, and user defined types. To avoid potential conflicts between these types (for example, if a user defined a type called FooRow, and also had a tabled named foo, we would end up with two types named FooRow), this puts each set of types in a different file and namespace. We also stopped exporting the xxxRow types, because there is always another type generated for those. We now have a types directory, which has an index.ts with user defined types, along with reducers.ts and procedures.ts for the types generated for reducer/procedure parameters.

import type * as Types from './module_bindings/types';

var currentMessages: Types.Message[] = [];

or

import { type Message } from './module_bindings/types';

var currentMessages: Message[] = [];

This has a couple other changes:

  • For procedure and reducer types, this adds a suffix of Args, since we may want types for the return values in the future.
  • For all of the types, instead of exposing the schema object, we are now giving the typescript type (e.g. export type Message = __Infer<typeof MessageRow>;). I couldn't think of a reason for users to want the schema object, so this should save users from needing to do all of the Infer boilerplate.

This is a breaking change for v2.

  1. This only changes typescript, and it should generally make thing easier to use.

This changes generated types in ts client bindings. We currently
generate a few different types of types: reducer args, procedure args,
rows, and user defined types. To avoid potential conflicts between these
types (for example, if a user defined a type called `FooRow`, and also
had a tabled named `foo`, we would end up with two types named
`FooRow`), this puts each set of types in a different file and
namespace. We also stopped exporting the `xxxRow` types, because there
is always another type generated for those. We now have a `types`
directory, which has an `index.ts` with user defined types, along with
`reducers.ts` and `procedures.ts` for the types generated for
reducer/procedure parameters.

```
import type * as Types from './module_bindings/types';

var currentMessages: Types.Message[] = [];
```

or

```
import { type Message } from './module_bindings/types';

var currentMessages: Message[] = [];
```

This has a couple other changes:
- For procedure and reducer types, this adds a suffix of `Args`, since
we may want types for the return values in the future.
- For all of the types, instead of exposing the schema object, we are
now giving the typescript type (e.g. `export type Message =
__Infer<typeof MessageRow>;`). I couldn't think of a reason for users to
want the schema object, so this should save users from needing to do all
of the `Infer` boilerplate.

This is a breaking change for v2.

2. This only changes typescript, and it should generally make thing
easier to use.

<!-- Describe any testing you've done, and any testing you'd like your
reviewers to do,
so that you're confident that all the changes work as expected! -->

- [ ] <!-- maybe a test you want to do -->
- [ ] <!-- maybe a test you want a reviewer to do, so they can check it
off when they're satisfied. -->
@joshua-spacetime joshua-spacetime added this pull request to the merge queue Feb 11, 2026
@joshua-spacetime joshua-spacetime removed this pull request from the merge queue due to a manual request Feb 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants