spacetimedb 2.5.0 → 2.6.0

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 (180) hide show
  1. package/LICENSE.txt +759 -759
  2. package/README.md +211 -211
  3. package/dist/angular/index.cjs.map +1 -1
  4. package/dist/angular/index.mjs.map +1 -1
  5. package/dist/browser/angular/index.mjs.map +1 -1
  6. package/dist/browser/react/index.mjs +129 -57
  7. package/dist/browser/react/index.mjs.map +1 -1
  8. package/dist/browser/solid/index.mjs +120 -50
  9. package/dist/browser/solid/index.mjs.map +1 -1
  10. package/dist/browser/svelte/index.mjs.map +1 -1
  11. package/dist/browser/vue/index.mjs.map +1 -1
  12. package/dist/index.browser.mjs +10 -2
  13. package/dist/index.browser.mjs.map +1 -1
  14. package/dist/index.cjs +10 -2
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.mjs +10 -2
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/min/index.browser.mjs +1 -1
  19. package/dist/min/index.browser.mjs.map +1 -1
  20. package/dist/min/react/index.mjs +1 -1
  21. package/dist/min/react/index.mjs.map +1 -1
  22. package/dist/min/sdk/index.browser.mjs +1 -1
  23. package/dist/min/sdk/index.browser.mjs.map +1 -1
  24. package/dist/react/index.cjs +129 -57
  25. package/dist/react/index.cjs.map +1 -1
  26. package/dist/react/index.mjs +129 -57
  27. package/dist/react/index.mjs.map +1 -1
  28. package/dist/react/useTable.d.ts.map +1 -1
  29. package/dist/sdk/connection_manager.d.ts +8 -0
  30. package/dist/sdk/connection_manager.d.ts.map +1 -1
  31. package/dist/sdk/db_connection_impl.d.ts +7 -0
  32. package/dist/sdk/db_connection_impl.d.ts.map +1 -1
  33. package/dist/sdk/index.browser.mjs +10 -2
  34. package/dist/sdk/index.browser.mjs.map +1 -1
  35. package/dist/sdk/index.cjs +10 -2
  36. package/dist/sdk/index.cjs.map +1 -1
  37. package/dist/sdk/index.mjs +10 -2
  38. package/dist/sdk/index.mjs.map +1 -1
  39. package/dist/sdk/websocket_test_adapter.d.ts +2 -1
  40. package/dist/sdk/websocket_test_adapter.d.ts.map +1 -1
  41. package/dist/server/index.mjs.map +1 -1
  42. package/dist/server/runtime.d.ts.map +1 -1
  43. package/dist/solid/index.cjs +120 -50
  44. package/dist/solid/index.cjs.map +1 -1
  45. package/dist/solid/index.mjs +120 -50
  46. package/dist/solid/index.mjs.map +1 -1
  47. package/dist/svelte/index.cjs.map +1 -1
  48. package/dist/svelte/index.mjs.map +1 -1
  49. package/dist/tanstack/index.cjs +120 -50
  50. package/dist/tanstack/index.cjs.map +1 -1
  51. package/dist/tanstack/index.mjs +120 -50
  52. package/dist/tanstack/index.mjs.map +1 -1
  53. package/dist/vue/index.cjs.map +1 -1
  54. package/dist/vue/index.mjs.map +1 -1
  55. package/package.json +1 -1
  56. package/src/angular/connection_state.ts +19 -19
  57. package/src/angular/index.ts +3 -3
  58. package/src/angular/injectors/index.ts +4 -4
  59. package/src/angular/injectors/inject-reducer.ts +62 -62
  60. package/src/angular/injectors/inject-spacetimedb-connected.ts +13 -13
  61. package/src/angular/injectors/inject-spacetimedb.ts +10 -10
  62. package/src/angular/injectors/inject-table.ts +234 -234
  63. package/src/angular/providers/index.ts +1 -1
  64. package/src/angular/providers/provide-spacetimedb.ts +96 -96
  65. package/src/index.ts +16 -16
  66. package/src/lib/algebraic_type.ts +819 -819
  67. package/src/lib/algebraic_type_variants.ts +26 -26
  68. package/src/lib/algebraic_value.ts +10 -10
  69. package/src/lib/autogen/types.ts +746 -746
  70. package/src/lib/binary_reader.ts +188 -188
  71. package/src/lib/binary_writer.ts +213 -213
  72. package/src/lib/connection_id.ts +102 -102
  73. package/src/lib/constraints.ts +48 -48
  74. package/src/lib/errors.ts +26 -26
  75. package/src/lib/filter.ts +195 -195
  76. package/src/lib/identity.ts +83 -83
  77. package/src/lib/indexes.ts +251 -251
  78. package/src/lib/option.ts +34 -34
  79. package/src/lib/query.ts +1019 -1019
  80. package/src/lib/reducer_schema.ts +38 -38
  81. package/src/lib/reducers.ts +116 -116
  82. package/src/lib/result.ts +36 -36
  83. package/src/lib/schedule_at.ts +86 -86
  84. package/src/lib/schema.ts +420 -420
  85. package/src/lib/table.ts +548 -548
  86. package/src/lib/table_schema.ts +64 -64
  87. package/src/lib/time_duration.ts +77 -77
  88. package/src/lib/timestamp.ts +148 -148
  89. package/src/lib/type_builders.test-d.ts +128 -128
  90. package/src/lib/type_builders.ts +4014 -4014
  91. package/src/lib/type_util.ts +124 -124
  92. package/src/lib/util.ts +196 -196
  93. package/src/lib/uuid.ts +337 -337
  94. package/src/react/SpacetimeDBProvider.ts +84 -84
  95. package/src/react/connection_state.ts +6 -6
  96. package/src/react/index.ts +5 -5
  97. package/src/react/useProcedure.ts +60 -60
  98. package/src/react/useReducer.ts +53 -53
  99. package/src/react/useSpacetimeDB.ts +18 -18
  100. package/src/react/useTable.ts +256 -251
  101. package/src/sdk/client_api/index.ts +114 -114
  102. package/src/sdk/client_api/types/procedures.ts +8 -8
  103. package/src/sdk/client_api/types/reducers.ts +8 -8
  104. package/src/sdk/client_api/types.ts +288 -288
  105. package/src/sdk/client_cache.ts +129 -129
  106. package/src/sdk/client_table.ts +179 -179
  107. package/src/sdk/connection_manager.ts +352 -237
  108. package/src/sdk/db_connection_builder.ts +290 -290
  109. package/src/sdk/db_connection_impl.ts +1356 -1347
  110. package/src/sdk/db_context.ts +28 -28
  111. package/src/sdk/db_view.ts +12 -12
  112. package/src/sdk/decompress.ts +51 -51
  113. package/src/sdk/event.ts +18 -18
  114. package/src/sdk/event_context.ts +51 -51
  115. package/src/sdk/event_emitter.ts +32 -32
  116. package/src/sdk/index.ts +14 -14
  117. package/src/sdk/internal.ts +2 -2
  118. package/src/sdk/json_api.ts +46 -46
  119. package/src/sdk/logger.ts +134 -134
  120. package/src/sdk/message_types.ts +46 -46
  121. package/src/sdk/procedures.ts +83 -83
  122. package/src/sdk/reducer_event.ts +20 -20
  123. package/src/sdk/reducer_handle.ts +12 -12
  124. package/src/sdk/reducers.ts +159 -159
  125. package/src/sdk/schema.ts +45 -45
  126. package/src/sdk/spacetime_module.ts +28 -28
  127. package/src/sdk/subscription_builder_impl.ts +275 -275
  128. package/src/sdk/table_cache.ts +581 -581
  129. package/src/sdk/type_utils.ts +19 -19
  130. package/src/sdk/version.ts +133 -133
  131. package/src/sdk/websocket_decompress_adapter.ts +63 -63
  132. package/src/sdk/websocket_protocols.ts +25 -25
  133. package/src/sdk/websocket_test_adapter.ts +107 -100
  134. package/src/sdk/websocket_v3_frames.ts +126 -126
  135. package/src/sdk/ws.ts +105 -105
  136. package/src/server/console.ts +81 -81
  137. package/src/server/db_view.ts +21 -21
  138. package/src/server/errors.ts +138 -138
  139. package/src/server/http.test-d.ts +80 -80
  140. package/src/server/http.ts +14 -14
  141. package/src/server/http_handlers.ts +413 -413
  142. package/src/server/http_internal.ts +79 -79
  143. package/src/server/http_shared.ts +186 -186
  144. package/src/server/index.ts +37 -37
  145. package/src/server/polyfills.ts +4 -4
  146. package/src/server/procedures.ts +239 -239
  147. package/src/server/query.ts +1 -1
  148. package/src/server/range.ts +53 -53
  149. package/src/server/reducers.ts +113 -113
  150. package/src/server/rng.ts +113 -113
  151. package/src/server/runtime.ts +1102 -1102
  152. package/src/server/schema.test-d.ts +99 -99
  153. package/src/server/schema.ts +663 -663
  154. package/src/server/sys.d.ts +125 -125
  155. package/src/server/view.test-d.ts +194 -194
  156. package/src/server/views.ts +340 -340
  157. package/src/solid/SpacetimeDBProvider.ts +97 -97
  158. package/src/solid/connection_state.ts +6 -6
  159. package/src/solid/index.ts +5 -5
  160. package/src/solid/useProcedure.ts +57 -57
  161. package/src/solid/useReducer.ts +50 -50
  162. package/src/solid/useSpacetimeDB.ts +18 -18
  163. package/src/solid/useTable.ts +203 -203
  164. package/src/svelte/SpacetimeDBProvider.ts +101 -101
  165. package/src/svelte/connection_state.ts +16 -16
  166. package/src/svelte/index.ts +4 -4
  167. package/src/svelte/useReducer.ts +61 -61
  168. package/src/svelte/useSpacetimeDB.ts +22 -22
  169. package/src/svelte/useTable.ts +218 -218
  170. package/src/tanstack/SpacetimeDBQueryClient.ts +330 -330
  171. package/src/tanstack/hooks.ts +83 -83
  172. package/src/tanstack/index.ts +16 -16
  173. package/src/util-stub.ts +1 -1
  174. package/src/vue/SpacetimeDBProvider.ts +157 -157
  175. package/src/vue/connection_state.ts +19 -19
  176. package/src/vue/index.ts +5 -5
  177. package/src/vue/useProcedure.ts +62 -62
  178. package/src/vue/useReducer.ts +55 -55
  179. package/src/vue/useSpacetimeDB.ts +18 -18
  180. package/src/vue/useTable.ts +229 -229
@@ -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
+ });