spacetimedb 2.6.0 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/README.md +211 -211
  2. package/dist/angular/index.cjs.map +1 -1
  3. package/dist/angular/index.mjs.map +1 -1
  4. package/dist/browser/angular/index.mjs.map +1 -1
  5. package/dist/browser/react/index.mjs.map +1 -1
  6. package/dist/browser/solid/index.mjs.map +1 -1
  7. package/dist/browser/svelte/index.mjs.map +1 -1
  8. package/dist/browser/vue/index.mjs.map +1 -1
  9. package/dist/index.browser.mjs.map +1 -1
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/lib/type_builders.d.ts +18 -3
  13. package/dist/lib/type_builders.d.ts.map +1 -1
  14. package/dist/min/index.browser.mjs.map +1 -1
  15. package/dist/min/react/index.mjs.map +1 -1
  16. package/dist/min/sdk/index.browser.mjs.map +1 -1
  17. package/dist/react/index.cjs.map +1 -1
  18. package/dist/react/index.mjs.map +1 -1
  19. package/dist/sdk/db_connection_impl.d.ts.map +1 -1
  20. package/dist/sdk/event_context.d.ts +3 -3
  21. package/dist/sdk/event_context.d.ts.map +1 -1
  22. package/dist/sdk/index.browser.mjs.map +1 -1
  23. package/dist/sdk/index.cjs.map +1 -1
  24. package/dist/sdk/index.mjs.map +1 -1
  25. package/dist/sdk/procedures.d.ts +2 -2
  26. package/dist/sdk/procedures.d.ts.map +1 -1
  27. package/dist/sdk/reducers.d.ts +3 -4
  28. package/dist/sdk/reducers.d.ts.map +1 -1
  29. package/dist/sdk/table_cache.d.ts.map +1 -1
  30. package/dist/sdk/type_utils.d.ts +3 -3
  31. package/dist/sdk/type_utils.d.ts.map +1 -1
  32. package/dist/server/index.mjs.map +1 -1
  33. package/dist/server/runtime.d.ts.map +1 -1
  34. package/dist/server/views.d.ts +4 -2
  35. package/dist/server/views.d.ts.map +1 -1
  36. package/dist/solid/index.cjs.map +1 -1
  37. package/dist/solid/index.mjs.map +1 -1
  38. package/dist/svelte/index.cjs.map +1 -1
  39. package/dist/svelte/index.mjs.map +1 -1
  40. package/dist/svelte/useReducer.d.ts +2 -2
  41. package/dist/svelte/useReducer.d.ts.map +1 -1
  42. package/dist/tanstack/index.cjs.map +1 -1
  43. package/dist/tanstack/index.mjs.map +1 -1
  44. package/dist/vue/index.cjs.map +1 -1
  45. package/dist/vue/index.mjs.map +1 -1
  46. package/package.json +22 -21
  47. package/src/angular/connection_state.ts +19 -19
  48. package/src/angular/index.ts +3 -3
  49. package/src/angular/injectors/index.ts +4 -4
  50. package/src/angular/injectors/inject-reducer.ts +62 -62
  51. package/src/angular/injectors/inject-spacetimedb-connected.ts +13 -13
  52. package/src/angular/injectors/inject-spacetimedb.ts +10 -10
  53. package/src/angular/injectors/inject-table.ts +234 -234
  54. package/src/angular/providers/index.ts +1 -1
  55. package/src/angular/providers/provide-spacetimedb.ts +96 -96
  56. package/src/index.ts +16 -16
  57. package/src/lib/algebraic_type.ts +819 -819
  58. package/src/lib/algebraic_type_variants.ts +26 -26
  59. package/src/lib/algebraic_value.ts +10 -10
  60. package/src/lib/autogen/types.ts +746 -746
  61. package/src/lib/binary_reader.ts +188 -188
  62. package/src/lib/binary_writer.ts +213 -213
  63. package/src/lib/connection_id.ts +102 -102
  64. package/src/lib/constraints.ts +48 -48
  65. package/src/lib/errors.ts +26 -26
  66. package/src/lib/filter.ts +195 -195
  67. package/src/lib/identity.ts +83 -83
  68. package/src/lib/indexes.ts +251 -251
  69. package/src/lib/option.ts +34 -34
  70. package/src/lib/query.ts +1019 -1019
  71. package/src/lib/reducer_schema.ts +38 -38
  72. package/src/lib/reducers.ts +116 -116
  73. package/src/lib/result.ts +36 -36
  74. package/src/lib/schedule_at.ts +86 -86
  75. package/src/lib/schema.ts +420 -420
  76. package/src/lib/table.ts +548 -548
  77. package/src/lib/table_schema.ts +64 -64
  78. package/src/lib/time_duration.ts +77 -77
  79. package/src/lib/timestamp.ts +148 -148
  80. package/src/lib/type_builders.test-d.ts +130 -128
  81. package/src/lib/type_builders.ts +4050 -4014
  82. package/src/lib/type_util.ts +124 -124
  83. package/src/lib/util.ts +196 -196
  84. package/src/lib/uuid.ts +337 -337
  85. package/src/react/SpacetimeDBProvider.ts +84 -84
  86. package/src/react/connection_state.ts +6 -6
  87. package/src/react/index.ts +5 -5
  88. package/src/react/useProcedure.ts +60 -60
  89. package/src/react/useReducer.ts +53 -53
  90. package/src/react/useSpacetimeDB.ts +18 -18
  91. package/src/react/useTable.ts +256 -256
  92. package/src/sdk/client_api/index.ts +114 -114
  93. package/src/sdk/client_api/types/procedures.ts +8 -8
  94. package/src/sdk/client_api/types/reducers.ts +8 -8
  95. package/src/sdk/client_api/types.ts +288 -288
  96. package/src/sdk/client_cache.ts +129 -129
  97. package/src/sdk/client_table.ts +179 -179
  98. package/src/sdk/connection_manager.ts +352 -352
  99. package/src/sdk/db_connection_builder.ts +290 -290
  100. package/src/sdk/db_connection_impl.ts +1363 -1356
  101. package/src/sdk/db_context.ts +28 -28
  102. package/src/sdk/db_view.ts +12 -12
  103. package/src/sdk/decompress.ts +51 -51
  104. package/src/sdk/event.ts +18 -18
  105. package/src/sdk/event_context.ts +51 -51
  106. package/src/sdk/event_emitter.ts +32 -32
  107. package/src/sdk/index.ts +14 -14
  108. package/src/sdk/internal.ts +2 -2
  109. package/src/sdk/json_api.ts +46 -46
  110. package/src/sdk/logger.ts +134 -134
  111. package/src/sdk/message_types.ts +46 -46
  112. package/src/sdk/procedures.ts +87 -83
  113. package/src/sdk/reducer_event.ts +20 -20
  114. package/src/sdk/reducer_handle.ts +12 -12
  115. package/src/sdk/reducers.ts +158 -159
  116. package/src/sdk/schema.ts +45 -45
  117. package/src/sdk/spacetime_module.ts +28 -28
  118. package/src/sdk/subscription_builder_impl.ts +275 -275
  119. package/src/sdk/table_cache.ts +582 -581
  120. package/src/sdk/type_utils.ts +19 -19
  121. package/src/sdk/version.ts +133 -133
  122. package/src/sdk/websocket_decompress_adapter.ts +63 -63
  123. package/src/sdk/websocket_protocols.ts +25 -25
  124. package/src/sdk/websocket_test_adapter.ts +107 -107
  125. package/src/sdk/websocket_v3_frames.ts +126 -126
  126. package/src/sdk/ws.ts +105 -105
  127. package/src/server/console.ts +81 -81
  128. package/src/server/db_view.ts +21 -21
  129. package/src/server/errors.ts +138 -138
  130. package/src/server/http.test-d.ts +80 -80
  131. package/src/server/http.ts +14 -14
  132. package/src/server/http_handlers.ts +413 -413
  133. package/src/server/http_internal.ts +79 -79
  134. package/src/server/http_shared.ts +186 -186
  135. package/src/server/index.ts +37 -37
  136. package/src/server/polyfills.ts +4 -4
  137. package/src/server/procedures.ts +239 -239
  138. package/src/server/query.ts +1 -1
  139. package/src/server/range.ts +53 -53
  140. package/src/server/reducers.ts +113 -113
  141. package/src/server/rng.ts +113 -113
  142. package/src/server/runtime.ts +1102 -1102
  143. package/src/server/schema.test-d.ts +99 -99
  144. package/src/server/schema.ts +663 -663
  145. package/src/server/sys.d.ts +125 -125
  146. package/src/server/view.test-d.ts +194 -194
  147. package/src/server/views.ts +343 -340
  148. package/src/solid/SpacetimeDBProvider.ts +97 -97
  149. package/src/solid/connection_state.ts +6 -6
  150. package/src/solid/index.ts +5 -5
  151. package/src/solid/useProcedure.ts +57 -57
  152. package/src/solid/useReducer.ts +50 -50
  153. package/src/solid/useSpacetimeDB.ts +18 -18
  154. package/src/solid/useTable.ts +203 -203
  155. package/src/svelte/SpacetimeDBProvider.ts +101 -101
  156. package/src/svelte/connection_state.ts +16 -16
  157. package/src/svelte/index.ts +4 -4
  158. package/src/svelte/useReducer.ts +61 -61
  159. package/src/svelte/useSpacetimeDB.ts +22 -22
  160. package/src/svelte/useTable.ts +218 -218
  161. package/src/tanstack/SpacetimeDBQueryClient.ts +330 -330
  162. package/src/tanstack/hooks.ts +83 -83
  163. package/src/tanstack/index.ts +16 -16
  164. package/src/util-stub.ts +1 -1
  165. package/src/vue/SpacetimeDBProvider.ts +157 -157
  166. package/src/vue/connection_state.ts +19 -19
  167. package/src/vue/index.ts +5 -5
  168. package/src/vue/useProcedure.ts +62 -62
  169. package/src/vue/useReducer.ts +55 -55
  170. package/src/vue/useSpacetimeDB.ts +18 -18
  171. package/src/vue/useTable.ts +229 -229
  172. package/LICENSE.txt +0 -759
@@ -1,125 +1,125 @@
1
- declare module 'spacetime:sys@2.0' {
2
- export type u8 = number;
3
- export type u16 = number;
4
- export type u32 = number;
5
- export type u64 = bigint;
6
- export type u128 = bigint;
7
- export type u256 = bigint;
8
-
9
- export const moduleHooks: unique symbol;
10
-
11
- interface ModuleDefaultExport {
12
- [moduleHooks](exports: object): ModuleHooks;
13
- }
14
-
15
- export interface ModuleHooks {
16
- __describe_module__(): Uint8Array;
17
-
18
- __get_error_constructor__(code: number): new (msg: string) => Error;
19
- __sender_error_class__: new (msg: string) => Error;
20
-
21
- __call_reducer__(
22
- reducerId: u32,
23
- sender: u256,
24
- connId: u128,
25
- timestamp: bigint,
26
- argsBuf: DataView
27
- ): void;
28
-
29
- __call_view__(id: u32, sender: u256, args: Uint8Array): Uint8Array | object;
30
-
31
- __call_view_anon__(id: u32, args: Uint8Array): Uint8Array | object;
32
-
33
- __call_procedure__(
34
- id: u32,
35
- sender: u256,
36
- connection_id: u128,
37
- timestamp: bigint,
38
- args: Uint8Array
39
- ): Uint8Array;
40
-
41
- __call_http_handler__(
42
- id: u32,
43
- timestamp: bigint,
44
- request: Uint8Array,
45
- body: Uint8Array
46
- ): [response: Uint8Array, body: Uint8Array];
47
- }
48
-
49
- export function register_hooks(hooks: ModuleHooks);
50
-
51
- export function table_id_from_name(name: string): u32;
52
- export function index_id_from_name(name: string): u32;
53
- export function datastore_table_row_count(table_id: u32): u64;
54
- export function datastore_table_scan_bsatn(table_id: u32): u32;
55
- export function datastore_index_scan_range_bsatn(
56
- index_id: u32,
57
- buf: ArrayBuffer,
58
- prefix_len: u32,
59
- prefix_elems: u16,
60
- rstart_len: u32,
61
- rend_len: u32
62
- ): u32;
63
- export function row_iter_bsatn_advance(iter: u32, buffer: ArrayBuffer): u32;
64
- export function row_iter_bsatn_close(iter: u32): void;
65
- export function datastore_insert_bsatn(
66
- table_id: u32,
67
- row: ArrayBuffer,
68
- row_len: u32
69
- ): u32;
70
- export function datastore_update_bsatn(
71
- table_id: u32,
72
- index_id: u32,
73
- row: ArrayBuffer,
74
- row_len: u32
75
- ): u32;
76
- export function datastore_delete_by_index_scan_range_bsatn(
77
- index_id: u32,
78
- buf: ArrayBuffer,
79
- prefix_len: u32,
80
- prefix_elems: u16,
81
- rstart_len: u32,
82
- rend_len: u32
83
- ): u32;
84
- export function datastore_delete_all_by_eq_bsatn(
85
- table_id: u32,
86
- relation: ArrayBuffer,
87
- relation_len: u32
88
- ): u32;
89
- export function volatile_nonatomic_schedule_immediate(
90
- reducer_name: string,
91
- args: Uint8Array
92
- ): void;
93
- export function console_log(level: u8, message: string): void;
94
- export function console_timer_start(name: string): u32;
95
- export function console_timer_end(span_id: u32): void;
96
- export function identity(): u256;
97
- export function get_jwt_payload(connection_id: u128): Uint8Array;
98
-
99
- export function procedure_http_request(
100
- request: Uint8Array,
101
- body: Uint8Array | string
102
- ): [response: Uint8Array, body: Uint8Array];
103
-
104
- export function procedure_start_mut_tx(): bigint;
105
-
106
- export function procedure_commit_mut_tx();
107
-
108
- export function procedure_abort_mut_tx();
109
-
110
- export function datastore_index_scan_point_bsatn(
111
- index_id: u32,
112
- point: ArrayBuffer,
113
- point_len: u32
114
- ): u32;
115
-
116
- export function datastore_delete_by_index_scan_point_bsatn(
117
- index_id: u32,
118
- point: ArrayBuffer,
119
- point_len: u32
120
- ): u32;
121
- }
122
-
123
- declare module 'spacetime:sys@2.1' {
124
- export function datastore_clear(table_id: u32): u64;
125
- }
1
+ declare module 'spacetime:sys@2.0' {
2
+ export type u8 = number;
3
+ export type u16 = number;
4
+ export type u32 = number;
5
+ export type u64 = bigint;
6
+ export type u128 = bigint;
7
+ export type u256 = bigint;
8
+
9
+ export const moduleHooks: unique symbol;
10
+
11
+ interface ModuleDefaultExport {
12
+ [moduleHooks](exports: object): ModuleHooks;
13
+ }
14
+
15
+ export interface ModuleHooks {
16
+ __describe_module__(): Uint8Array;
17
+
18
+ __get_error_constructor__(code: number): new (msg: string) => Error;
19
+ __sender_error_class__: new (msg: string) => Error;
20
+
21
+ __call_reducer__(
22
+ reducerId: u32,
23
+ sender: u256,
24
+ connId: u128,
25
+ timestamp: bigint,
26
+ argsBuf: DataView
27
+ ): void;
28
+
29
+ __call_view__(id: u32, sender: u256, args: Uint8Array): Uint8Array | object;
30
+
31
+ __call_view_anon__(id: u32, args: Uint8Array): Uint8Array | object;
32
+
33
+ __call_procedure__(
34
+ id: u32,
35
+ sender: u256,
36
+ connection_id: u128,
37
+ timestamp: bigint,
38
+ args: Uint8Array
39
+ ): Uint8Array;
40
+
41
+ __call_http_handler__(
42
+ id: u32,
43
+ timestamp: bigint,
44
+ request: Uint8Array,
45
+ body: Uint8Array
46
+ ): [response: Uint8Array, body: Uint8Array];
47
+ }
48
+
49
+ export function register_hooks(hooks: ModuleHooks);
50
+
51
+ export function table_id_from_name(name: string): u32;
52
+ export function index_id_from_name(name: string): u32;
53
+ export function datastore_table_row_count(table_id: u32): u64;
54
+ export function datastore_table_scan_bsatn(table_id: u32): u32;
55
+ export function datastore_index_scan_range_bsatn(
56
+ index_id: u32,
57
+ buf: ArrayBuffer,
58
+ prefix_len: u32,
59
+ prefix_elems: u16,
60
+ rstart_len: u32,
61
+ rend_len: u32
62
+ ): u32;
63
+ export function row_iter_bsatn_advance(iter: u32, buffer: ArrayBuffer): u32;
64
+ export function row_iter_bsatn_close(iter: u32): void;
65
+ export function datastore_insert_bsatn(
66
+ table_id: u32,
67
+ row: ArrayBuffer,
68
+ row_len: u32
69
+ ): u32;
70
+ export function datastore_update_bsatn(
71
+ table_id: u32,
72
+ index_id: u32,
73
+ row: ArrayBuffer,
74
+ row_len: u32
75
+ ): u32;
76
+ export function datastore_delete_by_index_scan_range_bsatn(
77
+ index_id: u32,
78
+ buf: ArrayBuffer,
79
+ prefix_len: u32,
80
+ prefix_elems: u16,
81
+ rstart_len: u32,
82
+ rend_len: u32
83
+ ): u32;
84
+ export function datastore_delete_all_by_eq_bsatn(
85
+ table_id: u32,
86
+ relation: ArrayBuffer,
87
+ relation_len: u32
88
+ ): u32;
89
+ export function volatile_nonatomic_schedule_immediate(
90
+ reducer_name: string,
91
+ args: Uint8Array
92
+ ): void;
93
+ export function console_log(level: u8, message: string): void;
94
+ export function console_timer_start(name: string): u32;
95
+ export function console_timer_end(span_id: u32): void;
96
+ export function identity(): u256;
97
+ export function get_jwt_payload(connection_id: u128): Uint8Array;
98
+
99
+ export function procedure_http_request(
100
+ request: Uint8Array,
101
+ body: Uint8Array | string
102
+ ): [response: Uint8Array, body: Uint8Array];
103
+
104
+ export function procedure_start_mut_tx(): bigint;
105
+
106
+ export function procedure_commit_mut_tx();
107
+
108
+ export function procedure_abort_mut_tx();
109
+
110
+ export function datastore_index_scan_point_bsatn(
111
+ index_id: u32,
112
+ point: ArrayBuffer,
113
+ point_len: u32
114
+ ): u32;
115
+
116
+ export function datastore_delete_by_index_scan_point_bsatn(
117
+ index_id: u32,
118
+ point: ArrayBuffer,
119
+ point_len: u32
120
+ ): u32;
121
+ }
122
+
123
+ declare module 'spacetime:sys@2.1' {
124
+ export function datastore_clear(table_id: u32): u64;
125
+ }
@@ -1,194 +1,194 @@
1
- import { schema } from './schema';
2
- import { table } from '../lib/table';
3
- import t from '../lib/type_builders';
4
-
5
- const person = table(
6
- {
7
- name: 'person',
8
- indexes: [
9
- {
10
- accessor: 'name_id_idx',
11
- name: 'name_id_idx',
12
- algorithm: 'btree',
13
- columns: ['name', 'id'] as const,
14
- },
15
- ],
16
- },
17
- {
18
- id: t.u32().primaryKey(),
19
- name: t.string(),
20
- }
21
- );
22
-
23
- const personWithExtra = table(
24
- { name: 'personWithExtra' },
25
- {
26
- id: t.u32(),
27
- name: t.string(),
28
- extraField: t.string(),
29
- }
30
- );
31
-
32
- const personWithMissing = table(
33
- { name: 'personWithMissing' },
34
- {
35
- id: t.u32(),
36
- }
37
- );
38
-
39
- const personReordered = table(
40
- { name: 'personReordered' },
41
- {
42
- name: t.string(),
43
- id: t.u32(),
44
- }
45
- );
46
-
47
- const order = table(
48
- {
49
- name: 'order',
50
- indexes: [
51
- {
52
- accessor: 'id_person_id',
53
- name: 'id_person_id', // We are adding this to make sure `person_id` still isn't considered indexed.
54
- algorithm: 'btree',
55
- columns: ['id', 'person_id'] as const,
56
- },
57
- ],
58
- },
59
- {
60
- id: t.u32().primaryKey(),
61
- person_name: t.string().index(),
62
- person_id: t.u32(),
63
- }
64
- );
65
-
66
- const spacetime = schema({
67
- person,
68
- order,
69
- personWithExtra,
70
- personReordered,
71
- personWithMissing,
72
- });
73
-
74
- const arrayRetValue = t.array(person.rowType);
75
- const optionalPerson = t.option(person.rowType);
76
- const multiplePrimaryKeyRows = t.array(
77
- t.row('MultiplePrimaryKeyRows', {
78
- id: t.u32().primaryKey(),
79
- name: t.string().primaryKey(),
80
- })
81
- );
82
-
83
- spacetime.anonymousView({ name: 'v1', public: true }, arrayRetValue, ctx => {
84
- return ctx.from.person.build();
85
- });
86
-
87
- // @ts-expect-error views can have at most one primaryKey column on the returned row type.
88
- spacetime.anonymousView(
89
- { name: 'multiplePrimaryRows', public: true },
90
- multiplePrimaryKeyRows,
91
- () => []
92
- );
93
-
94
- // @ts-expect-error the same multiple-primary-key check also applies to query-builder views.
95
- spacetime.anonymousView(
96
- { name: 'multiplePrimaryRowsQuery', public: true },
97
- multiplePrimaryKeyRows,
98
- ctx => {
99
- return ctx.from.person;
100
- }
101
- );
102
-
103
- spacetime.anonymousView(
104
- { name: 'optionalPerson', public: true },
105
- optionalPerson,
106
- ctx => {
107
- return ctx.db.person.iter().next().value;
108
- }
109
- );
110
-
111
- spacetime.anonymousView(
112
- { name: 'optionalPersonWrong', public: true },
113
- optionalPerson,
114
- // @ts-expect-error returns a value of the wrong type.
115
- ctx => {
116
- return ctx.db.order.iter().next().value;
117
- }
118
- );
119
-
120
- // Extra fields are only an issue for queries.
121
- spacetime.anonymousView(
122
- { name: 'optionalPersonWithExtra', public: true },
123
- optionalPerson,
124
- ctx => {
125
- return ctx.db.personWithExtra.iter().next().value;
126
- }
127
- );
128
-
129
- spacetime.anonymousView(
130
- { name: 'v2', public: true },
131
- arrayRetValue,
132
- // @ts-expect-error returns a query of the wrong type.
133
- ctx => {
134
- return ctx.from.order.build();
135
- }
136
- );
137
-
138
- // For queries, we can't return rows with extra fields.
139
- spacetime.anonymousView(
140
- { name: 'v3', public: true },
141
- arrayRetValue,
142
- // @ts-expect-error returns a query of the wrong type.
143
- ctx => {
144
- return ctx.from.personWithExtra.build();
145
- }
146
- );
147
-
148
- // Ideally this would fail, since we depend on the field ordering for serialization.
149
- spacetime.anonymousView(
150
- { name: 'reorderedPerson', public: true },
151
- arrayRetValue,
152
- // Comment this out if we can fix the types.
153
- // // @ts-expect-error returns a query of the wrong type.
154
- ctx => {
155
- return ctx.from.personReordered.build();
156
- }
157
- );
158
-
159
- // Fails because it is missing a field.
160
- spacetime.anonymousView(
161
- { name: 'missingField', public: true },
162
- arrayRetValue,
163
- // @ts-expect-error returns a query of the wrong type.
164
- ctx => {
165
- return ctx.from.personWithMissing.build();
166
- }
167
- );
168
-
169
- spacetime.anonymousView({ name: 'v4', public: true }, arrayRetValue, ctx => {
170
- // @ts-expect-error returns a query of the wrong type.
171
- const _invalid = ctx.from.person.where(row => row.id.eq('string')).build();
172
- const _columnEqs = ctx.from.person.where(row => row.id.eq(row.id)).build();
173
- return ctx.from.person.where(row => row.id.eq(5)).build();
174
- });
175
-
176
- spacetime.anonymousView({ name: 'v5', public: true }, arrayRetValue, ctx => {
177
- const _nonIndexedSemijoin = ctx.from.person
178
- .where(row => row.id.eq(5))
179
- // @ts-expect-error person_id is not indexed.
180
- .leftSemijoin(ctx.from.order, (p, o) => p.id.eq(o.person_id))
181
- .build();
182
- const _fromCompositeIndex = ctx.from.person
183
- .where(row => row.id.eq(5))
184
- .leftSemijoin(ctx.from.order, (p, o) => p.name.eq(o.person_name))
185
- .build();
186
- const _mixedScopeAndInJoinPredicate = ctx.from.person
187
- // @ts-expect-error semijoin on(...) only supports one table scope for and/or clauses.
188
- .leftSemijoin(ctx.from.order, (p, o) => p.id.eq(o.id).and(o.id.eq(5)))
189
- .build();
190
- return ctx.from.person
191
- .where(row => row.id.eq(5))
192
- .leftSemijoin(ctx.from.order, (p, o) => p.id.eq(o.id))
193
- .build();
194
- });
1
+ import { schema } from './schema';
2
+ import { table } from '../lib/table';
3
+ import t from '../lib/type_builders';
4
+
5
+ const person = table(
6
+ {
7
+ name: 'person',
8
+ indexes: [
9
+ {
10
+ accessor: 'name_id_idx',
11
+ name: 'name_id_idx',
12
+ algorithm: 'btree',
13
+ columns: ['name', 'id'] as const,
14
+ },
15
+ ],
16
+ },
17
+ {
18
+ id: t.u32().primaryKey(),
19
+ name: t.string(),
20
+ }
21
+ );
22
+
23
+ const personWithExtra = table(
24
+ { name: 'personWithExtra' },
25
+ {
26
+ id: t.u32(),
27
+ name: t.string(),
28
+ extraField: t.string(),
29
+ }
30
+ );
31
+
32
+ const personWithMissing = table(
33
+ { name: 'personWithMissing' },
34
+ {
35
+ id: t.u32(),
36
+ }
37
+ );
38
+
39
+ const personReordered = table(
40
+ { name: 'personReordered' },
41
+ {
42
+ name: t.string(),
43
+ id: t.u32(),
44
+ }
45
+ );
46
+
47
+ const order = table(
48
+ {
49
+ name: 'order',
50
+ indexes: [
51
+ {
52
+ accessor: 'id_person_id',
53
+ name: 'id_person_id', // We are adding this to make sure `person_id` still isn't considered indexed.
54
+ algorithm: 'btree',
55
+ columns: ['id', 'person_id'] as const,
56
+ },
57
+ ],
58
+ },
59
+ {
60
+ id: t.u32().primaryKey(),
61
+ person_name: t.string().index(),
62
+ person_id: t.u32(),
63
+ }
64
+ );
65
+
66
+ const spacetime = schema({
67
+ person,
68
+ order,
69
+ personWithExtra,
70
+ personReordered,
71
+ personWithMissing,
72
+ });
73
+
74
+ const arrayRetValue = t.array(person.rowType);
75
+ const optionalPerson = t.option(person.rowType);
76
+ const multiplePrimaryKeyRows = t.array(
77
+ t.row('MultiplePrimaryKeyRows', {
78
+ id: t.u32().primaryKey(),
79
+ name: t.string().primaryKey(),
80
+ })
81
+ );
82
+
83
+ spacetime.anonymousView({ name: 'v1', public: true }, arrayRetValue, ctx => {
84
+ return ctx.from.person.build();
85
+ });
86
+
87
+ // @ts-expect-error views can have at most one primaryKey column on the returned row type.
88
+ spacetime.anonymousView(
89
+ { name: 'multiplePrimaryRows', public: true },
90
+ multiplePrimaryKeyRows,
91
+ () => []
92
+ );
93
+
94
+ // @ts-expect-error the same multiple-primary-key check also applies to query-builder views.
95
+ spacetime.anonymousView(
96
+ { name: 'multiplePrimaryRowsQuery', public: true },
97
+ multiplePrimaryKeyRows,
98
+ ctx => {
99
+ return ctx.from.person;
100
+ }
101
+ );
102
+
103
+ spacetime.anonymousView(
104
+ { name: 'optionalPerson', public: true },
105
+ optionalPerson,
106
+ ctx => {
107
+ return ctx.db.person.iter().next().value;
108
+ }
109
+ );
110
+
111
+ spacetime.anonymousView(
112
+ { name: 'optionalPersonWrong', public: true },
113
+ optionalPerson,
114
+ // @ts-expect-error returns a value of the wrong type.
115
+ ctx => {
116
+ return ctx.db.order.iter().next().value;
117
+ }
118
+ );
119
+
120
+ // Extra fields are only an issue for queries.
121
+ spacetime.anonymousView(
122
+ { name: 'optionalPersonWithExtra', public: true },
123
+ optionalPerson,
124
+ ctx => {
125
+ return ctx.db.personWithExtra.iter().next().value;
126
+ }
127
+ );
128
+
129
+ spacetime.anonymousView(
130
+ { name: 'v2', public: true },
131
+ arrayRetValue,
132
+ // @ts-expect-error returns a query of the wrong type.
133
+ ctx => {
134
+ return ctx.from.order.build();
135
+ }
136
+ );
137
+
138
+ // For queries, we can't return rows with extra fields.
139
+ spacetime.anonymousView(
140
+ { name: 'v3', public: true },
141
+ arrayRetValue,
142
+ // @ts-expect-error returns a query of the wrong type.
143
+ ctx => {
144
+ return ctx.from.personWithExtra.build();
145
+ }
146
+ );
147
+
148
+ // Ideally this would fail, since we depend on the field ordering for serialization.
149
+ spacetime.anonymousView(
150
+ { name: 'reorderedPerson', public: true },
151
+ arrayRetValue,
152
+ // Comment this out if we can fix the types.
153
+ // // @ts-expect-error returns a query of the wrong type.
154
+ ctx => {
155
+ return ctx.from.personReordered.build();
156
+ }
157
+ );
158
+
159
+ // Fails because it is missing a field.
160
+ spacetime.anonymousView(
161
+ { name: 'missingField', public: true },
162
+ arrayRetValue,
163
+ // @ts-expect-error returns a query of the wrong type.
164
+ ctx => {
165
+ return ctx.from.personWithMissing.build();
166
+ }
167
+ );
168
+
169
+ spacetime.anonymousView({ name: 'v4', public: true }, arrayRetValue, ctx => {
170
+ // @ts-expect-error returns a query of the wrong type.
171
+ const _invalid = ctx.from.person.where(row => row.id.eq('string')).build();
172
+ const _columnEqs = ctx.from.person.where(row => row.id.eq(row.id)).build();
173
+ return ctx.from.person.where(row => row.id.eq(5)).build();
174
+ });
175
+
176
+ spacetime.anonymousView({ name: 'v5', public: true }, arrayRetValue, ctx => {
177
+ const _nonIndexedSemijoin = ctx.from.person
178
+ .where(row => row.id.eq(5))
179
+ // @ts-expect-error person_id is not indexed.
180
+ .leftSemijoin(ctx.from.order, (p, o) => p.id.eq(o.person_id))
181
+ .build();
182
+ const _fromCompositeIndex = ctx.from.person
183
+ .where(row => row.id.eq(5))
184
+ .leftSemijoin(ctx.from.order, (p, o) => p.name.eq(o.person_name))
185
+ .build();
186
+ const _mixedScopeAndInJoinPredicate = ctx.from.person
187
+ // @ts-expect-error semijoin on(...) only supports one table scope for and/or clauses.
188
+ .leftSemijoin(ctx.from.order, (p, o) => p.id.eq(o.id).and(o.id.eq(5)))
189
+ .build();
190
+ return ctx.from.person
191
+ .where(row => row.id.eq(5))
192
+ .leftSemijoin(ctx.from.order, (p, o) => p.id.eq(o.id))
193
+ .build();
194
+ });