Skip to content

Commit 595dfc6

Browse files
authored
Merge branch 'master' into jdetter/remove-docker-build
2 parents 3bd42d6 + 934158a commit 595dfc6

15 files changed

Lines changed: 109 additions & 27 deletions

File tree

crates/bindings-typescript/src/lib/type_builders.test-d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ const rowOptionOptional = {
3535
};
3636
type RowOptionOptional = InferTypeOfRow<typeof rowOptionOptional>;
3737
// eslint-disable-next-line @typescript-eslint/no-unused-vars
38+
const _rowOptionOptionalOmitted: RowOptionOptional = {};
39+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
3840
const _rowOptionOptionalNone: RowOptionOptional = {
3941
foo: undefined,
4042
};

crates/bindings-typescript/src/lib/type_builders.ts

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,45 @@ export type Infer<T> = T extends RowObj
3939
/**
4040
* Helper type to extract the type of a row from an object.
4141
*/
42-
export type InferTypeOfRow<T extends RowObj> = {
43-
[K in keyof T & string]: InferTypeOfTypeBuilder<CollapseColumn<T[K]>>;
44-
};
42+
type OptionalRowKeys<T extends RowObj> = {
43+
[K in keyof T & string]-?: CollapseColumn<T[K]> extends OptionBuilder<any>
44+
? K
45+
: never;
46+
}[keyof T & string];
47+
48+
type RequiredRowKeys<T extends RowObj> = Exclude<
49+
keyof T & string,
50+
OptionalRowKeys<T>
51+
>;
52+
53+
export type InferTypeOfRow<T extends RowObj> = Prettify<
54+
{
55+
[K in RequiredRowKeys<T>]: InferTypeOfTypeBuilder<CollapseColumn<T[K]>>;
56+
} & {
57+
[K in OptionalRowKeys<T>]?: InferTypeOfTypeBuilder<CollapseColumn<T[K]>>;
58+
}
59+
>;
60+
61+
type OptionalParamKeys<T extends RowObj> = {
62+
[K in keyof T & string]-?: undefined extends InferTypeOfTypeBuilder<
63+
CollapseColumn<T[K]>
64+
>
65+
? K
66+
: never;
67+
}[keyof T & string];
68+
69+
type RequiredParamKeys<T extends RowObj> = Exclude<
70+
keyof T & string,
71+
OptionalParamKeys<T>
72+
>;
73+
74+
export type InferTypeOfParams<T extends RowObj> = Prettify<
75+
{
76+
[K in RequiredParamKeys<T>]: InferTypeOfTypeBuilder<CollapseColumn<T[K]>>;
77+
} & {
78+
[K in OptionalParamKeys<T>]?: InferTypeOfTypeBuilder<CollapseColumn<T[K]>>;
79+
}
80+
>;
4581

4682
/**
4783
* Helper type to extract the type of a row from an object.

crates/bindings-typescript/src/sdk/db_connection_impl.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@ import {
2323
type SubscriptionEventContextInterface,
2424
} from './event_context.ts';
2525
import { EventEmitter } from './event_emitter.ts';
26-
import type { Deserializer, Identity, InferTypeOfRow, Serializer } from '../';
26+
import type {
27+
Deserializer,
28+
Identity,
29+
InferTypeOfParams,
30+
Serializer,
31+
} from '../';
2732
import type {
2833
ProcedureResultMessage,
2934
ReducerResultMessage,
@@ -383,7 +388,9 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
383388
const { serialize: serializeArgs } =
384389
this.#reducerArgsSerializers[reducerName];
385390

386-
(out as any)[key] = (params: InferTypeOfRow<typeof reducer.params>) => {
391+
(out as any)[key] = (
392+
params: InferTypeOfParams<typeof reducer.params>
393+
) => {
387394
const writer = this.#reducerArgsEncoder;
388395
writer.clear();
389396
serializeArgs(writer, params);
@@ -414,7 +421,7 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
414421
this.#procedureSerializers[procedureName];
415422

416423
(out as any)[key] = (
417-
params: InferTypeOfRow<typeof procedure.params>
424+
params: InferTypeOfParams<typeof procedure.params>
418425
): Promise<any> => {
419426
writer.clear();
420427
serializeArgs(writer, params);
@@ -436,7 +443,7 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
436443
event: Event<
437444
ReducerEventInfo<
438445
RemoteModule['reducers'][number]['name'],
439-
InferTypeOfRow<RemoteModule['reducers'][number]['params']>
446+
InferTypeOfParams<RemoteModule['reducers'][number]['params']>
440447
>
441448
>
442449
): EventContextInterface<RemoteModule> {

crates/bindings-typescript/src/sdk/event_context.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { InferTypeOfRow } from '../lib/type_builders.ts';
1+
import type { InferTypeOfParams } from '../lib/type_builders.ts';
22
import type { DbContext } from './db_context';
33
import type { Event } from './event.ts';
44
import type { ReducerEvent } from './reducer_event.ts';
@@ -13,7 +13,7 @@ export interface EventContextInterface<RemoteModule extends UntypedRemoteModule>
1313
event: Event<
1414
ReducerEventInfo<
1515
RemoteModule['reducers'][number]['name'],
16-
InferTypeOfRow<RemoteModule['reducers'][number]['params']>
16+
InferTypeOfParams<RemoteModule['reducers'][number]['params']>
1717
>
1818
>;
1919
}
@@ -25,7 +25,7 @@ export interface ReducerEventContextInterface<
2525
event: ReducerEvent<
2626
ReducerEventInfo<
2727
RemoteModule['reducers'][number]['name'],
28-
InferTypeOfRow<RemoteModule['reducers'][number]['params']>
28+
InferTypeOfParams<RemoteModule['reducers'][number]['params']>
2929
>
3030
>;
3131
}

crates/bindings-typescript/src/sdk/procedures.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import type { ParamsObj } from '../lib/reducers';
2-
import type { Infer, InferTypeOfRow, TypeBuilder } from '../lib/type_builders';
2+
import type {
3+
Infer,
4+
InferTypeOfParams,
5+
TypeBuilder,
6+
} from '../lib/type_builders';
37
import type { CamelCase } from '../lib/type_util';
48
import { coerceParams, toCamelCase, type CoerceParams } from '../lib/util';
59
import type { UntypedRemoteModule } from './spacetime_module';
@@ -20,7 +24,7 @@ export type ProceduresView<RemoteModule> = IfAny<
2024
? // x: camelCase(name)
2125
{
2226
[K in RemoteModule['procedures'][number] as K['accessorName']]: (
23-
params: InferTypeOfRow<K['params']>
27+
params: InferTypeOfParams<K['params']>
2428
) => Promise<Infer<K['returnType']>>;
2529
}
2630
: never

crates/bindings-typescript/src/sdk/reducers.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import type { ProductType } from '../lib/algebraic_type';
22
import type { ReducerSchema } from '../lib/reducer_schema';
33
import type { ParamsObj } from '../lib/reducers';
4-
import type { CoerceRow } from '../lib/table';
5-
import { RowBuilder, type InferTypeOfRow } from '../lib/type_builders';
4+
import { RowBuilder, type InferTypeOfParams } from '../lib/type_builders';
65
import { toCamelCase } from '../lib/util';
76
import type { SubscriptionEventContextInterface } from './event_context';
87
import type { UntypedRemoteModule } from './spacetime_module';
@@ -26,7 +25,7 @@ export type ReducersView<RemoteModule> = IfAny<
2625
RemoteModule extends UntypedRemoteModule
2726
? {
2827
[K in RemoteModule['reducers'][number] as K['accessorName']]: (
29-
params: InferTypeOfRow<K['params']>
28+
params: InferTypeOfParams<K['params']>
3029
) => Promise<void>;
3130
}
3231
: never
@@ -43,7 +42,7 @@ export type ReducerEventInfo<
4342
export type UntypedReducerDef = {
4443
name: string;
4544
accessorName: string;
46-
params: CoerceRow<ParamsObj>;
45+
params: ParamsObj;
4746
paramsType: ProductType;
4847
};
4948

crates/bindings-typescript/src/sdk/table_cache.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,8 @@ export class TableCacheImpl<
123123
const columns = idx.columns;
124124

125125
// Extract the tuple key for this btree index (column order preserved)
126-
const getKey = (row: Row): readonly unknown[] => columns.map(c => row[c]);
126+
const getKey = (row: Row): readonly unknown[] =>
127+
columns.map(c => (row as Record<string, unknown>)[c]);
127128

128129
// The server’s ranged scan fixes all prefix cols to equality and applies
129130
// the bound only to the *last* term. We mirror that.

crates/bindings-typescript/src/sdk/type_utils.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Infer, InferTypeOfRow } from '.';
1+
import type { Infer, InferTypeOfParams } from '.';
22
import type { Prettify } from '../lib/type_util';
33
import type { UntypedProcedureDef } from './procedures';
44
import type { UntypedReducerDef } from './reducers';
@@ -7,11 +7,11 @@ export type IsEmptyObject<T> = [keyof T] extends [never] ? true : false;
77
export type MaybeParams<T> = IsEmptyObject<T> extends true ? [] : [params: T];
88

99
export type ParamsType<R extends UntypedReducerDef> = MaybeParams<
10-
Prettify<InferTypeOfRow<R['params']>>
10+
Prettify<InferTypeOfParams<R['params']>>
1111
>;
1212

1313
export type ProcedureParamsType<P extends UntypedProcedureDef> = MaybeParams<
14-
Prettify<InferTypeOfRow<P['params']>>
14+
Prettify<InferTypeOfParams<P['params']>>
1515
>;
1616

1717
export type ProcedureReturnType<P extends UntypedProcedureDef> = Infer<

crates/bindings-typescript/src/server/views.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,8 +327,11 @@ type ViewInfo<F> = {
327327
returnTypeBaseSize: number;
328328
};
329329

330-
export type Views = ViewInfo<ViewFn<any, any, any>>[];
331-
export type AnonViews = ViewInfo<AnonymousViewFn<any, any, any>>[];
330+
type AnyViewFn = (ctx: ViewCtx<any>, params: any) => any;
331+
type AnyAnonymousViewFn = (ctx: AnonymousViewCtx<any>, params: any) => any;
332+
333+
export type Views = ViewInfo<AnyViewFn>[];
334+
export type AnonViews = ViewInfo<AnyAnonymousViewFn>[];
332335

333336
// A helper to get the product type out of a type builder.
334337
// This is only non-never if the type builder is an array.

crates/bindings-typescript/src/svelte/useReducer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { onDestroy } from 'svelte';
22
import { get } from 'svelte/store';
3-
import type { InferTypeOfRow } from '../lib/type_builders';
3+
import type { InferTypeOfParams } from '../lib/type_builders';
44
import type { UntypedReducerDef } from '../sdk/reducers';
55
import { useSpacetimeDB } from './useSpacetimeDB';
66
import type { Prettify } from '../lib/type_util';
@@ -9,7 +9,7 @@ type IsEmptyObject<T> = [keyof T] extends [never] ? true : false;
99
type MaybeParams<T> = IsEmptyObject<T> extends true ? [] : [params: T];
1010

1111
type ParamsType<R extends UntypedReducerDef> = MaybeParams<
12-
Prettify<InferTypeOfRow<R['params']>>
12+
Prettify<InferTypeOfParams<R['params']>>
1313
>;
1414

1515
export function useReducer<ReducerDef extends UntypedReducerDef>(

0 commit comments

Comments
 (0)