Skip to content

Commit c777e7b

Browse files
No primary key with t.array()
1 parent 01bffad commit c777e7b

2 files changed

Lines changed: 37 additions & 9 deletions

File tree

crates/bindings-typescript/src/server/view.test-d.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,22 @@ const spacetime = schema({
7272
});
7373

7474
const queryRetValue = t.query(person.rowType);
75+
const arrayRetValue = t.array(person.rowType);
7576
const optionalPerson = t.option(person.rowType);
7677

7778
spacetime.anonymousView({ name: 'v1', public: true }, queryRetValue, ctx => {
7879
return ctx.from.person.build();
7980
});
8081

82+
// Legacy compatibility: query-builder views can still be declared with array return types.
83+
spacetime.anonymousView(
84+
{ name: 'v1_legacy_array_query', public: true },
85+
arrayRetValue,
86+
ctx => {
87+
return ctx.from.person.build();
88+
}
89+
);
90+
8191
spacetime.anonymousView(
8292
{ name: 'optionalPerson', public: true },
8393
optionalPerson,

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

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,21 @@ export type ViewOpts = {
8989
public: true;
9090
};
9191

92+
type FlattenedArray<T> = T extends readonly (infer E)[] ? E : never;
93+
94+
type ArrayViewReturnTypeBuilder = TypeBuilder<
95+
readonly object[],
96+
{ tag: 'Array'; value: AlgebraicTypeVariants.Product }
97+
>;
98+
99+
type OptionViewReturnTypeBuilder = TypeBuilder<
100+
object | undefined,
101+
OptionAlgebraicType<AlgebraicTypeVariants.Product>
102+
>;
103+
92104
type ProceduralViewReturnTypeBuilder =
93-
| TypeBuilder<
94-
readonly object[],
95-
{ tag: 'Array'; value: AlgebraicTypeVariants.Product }
96-
>
97-
| TypeBuilder<
98-
object | undefined,
99-
OptionAlgebraicType<AlgebraicTypeVariants.Product>
100-
>;
105+
| ArrayViewReturnTypeBuilder
106+
| OptionViewReturnTypeBuilder;
101107

102108
export type QueryViewReturnTypeBuilder = QueryTypeBuilder<
103109
TypeBuilder<object, any>
@@ -120,10 +126,22 @@ type QueryReturnProduct<Ret extends QueryViewReturnTypeBuilder> =
120126
? ExtractProductFromTypeBuilder<Row>
121127
: never;
122128

129+
type ExtractArrayProduct<T extends TypeBuilder<any, any>> =
130+
InferSpacetimeTypeOfTypeBuilder<T> extends { tag: 'Array'; value: infer V }
131+
? V extends { tag: 'Product'; value: infer P }
132+
? P
133+
: never
134+
: never;
135+
136+
type LegacyArrayQueryReturn<Ret extends ArrayViewReturnTypeBuilder> =
137+
RowTypedQuery<FlattenedArray<Infer<Ret>>, ExtractArrayProduct<Ret>>;
138+
123139
type ViewReturn<Ret extends ViewReturnTypeBuilder> =
124140
Ret extends QueryViewReturnTypeBuilder
125141
? RowTypedQuery<QueryReturnRow<Ret>, QueryReturnProduct<Ret>>
126-
: Infer<Ret>;
142+
: Ret extends ArrayViewReturnTypeBuilder
143+
? Infer<Ret> | LegacyArrayQueryReturn<Ret>
144+
: Infer<Ret>;
127145

128146
// // If we allowed functions to return either.
129147
// type ViewReturn<Ret extends ViewReturnTypeBuilder> =

0 commit comments

Comments
 (0)