spacetimedb 2.0.3 → 2.1.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 (88) hide show
  1. package/LICENSE.txt +2 -2
  2. package/dist/angular/index.cjs +5 -1
  3. package/dist/angular/index.cjs.map +1 -1
  4. package/dist/angular/index.mjs +5 -1
  5. package/dist/angular/index.mjs.map +1 -1
  6. package/dist/browser/angular/index.mjs +5 -1
  7. package/dist/browser/angular/index.mjs.map +1 -1
  8. package/dist/browser/react/index.mjs +8 -1
  9. package/dist/browser/react/index.mjs.map +1 -1
  10. package/dist/browser/svelte/index.mjs +5 -1
  11. package/dist/browser/svelte/index.mjs.map +1 -1
  12. package/dist/browser/vue/index.mjs +5 -1
  13. package/dist/browser/vue/index.mjs.map +1 -1
  14. package/dist/index.browser.mjs +148 -100
  15. package/dist/index.browser.mjs.map +1 -1
  16. package/dist/index.cjs +148 -100
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.mjs +148 -100
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/lib/algebraic_type.d.ts.map +1 -1
  21. package/dist/lib/binary_writer.d.ts +1 -0
  22. package/dist/lib/binary_writer.d.ts.map +1 -1
  23. package/dist/lib/indexes.d.ts +1 -1
  24. package/dist/lib/indexes.d.ts.map +1 -1
  25. package/dist/lib/query.d.ts +14 -7
  26. package/dist/lib/query.d.ts.map +1 -1
  27. package/dist/lib/schema.d.ts +2 -0
  28. package/dist/lib/schema.d.ts.map +1 -1
  29. package/dist/lib/table.d.ts +25 -2
  30. package/dist/lib/table.d.ts.map +1 -1
  31. package/dist/min/index.browser.mjs +1 -1
  32. package/dist/min/index.browser.mjs.map +1 -1
  33. package/dist/min/react/index.mjs +1 -1
  34. package/dist/min/react/index.mjs.map +1 -1
  35. package/dist/min/sdk/index.browser.mjs +1 -1
  36. package/dist/min/sdk/index.browser.mjs.map +1 -1
  37. package/dist/react/index.cjs +8 -1
  38. package/dist/react/index.cjs.map +1 -1
  39. package/dist/react/index.mjs +8 -1
  40. package/dist/react/index.mjs.map +1 -1
  41. package/dist/react/useTable.d.ts.map +1 -1
  42. package/dist/sdk/db_connection_impl.d.ts.map +1 -1
  43. package/dist/sdk/index.browser.mjs +144 -98
  44. package/dist/sdk/index.browser.mjs.map +1 -1
  45. package/dist/sdk/index.cjs +144 -98
  46. package/dist/sdk/index.cjs.map +1 -1
  47. package/dist/sdk/index.mjs +144 -98
  48. package/dist/sdk/index.mjs.map +1 -1
  49. package/dist/sdk/table_cache.d.ts.map +1 -1
  50. package/dist/sdk/websocket_decompress_adapter.d.ts +17 -7
  51. package/dist/sdk/websocket_decompress_adapter.d.ts.map +1 -1
  52. package/dist/sdk/websocket_test_adapter.d.ts +3 -2
  53. package/dist/sdk/websocket_test_adapter.d.ts.map +1 -1
  54. package/dist/server/index.d.ts +1 -0
  55. package/dist/server/index.d.ts.map +1 -1
  56. package/dist/server/index.mjs +88 -30
  57. package/dist/server/index.mjs.map +1 -1
  58. package/dist/svelte/index.cjs +5 -1
  59. package/dist/svelte/index.cjs.map +1 -1
  60. package/dist/svelte/index.mjs +5 -1
  61. package/dist/svelte/index.mjs.map +1 -1
  62. package/dist/tanstack/SpacetimeDBQueryClient.d.ts +1 -0
  63. package/dist/tanstack/SpacetimeDBQueryClient.d.ts.map +1 -1
  64. package/dist/tanstack/index.cjs +26 -1
  65. package/dist/tanstack/index.cjs.map +1 -1
  66. package/dist/tanstack/index.mjs +26 -1
  67. package/dist/tanstack/index.mjs.map +1 -1
  68. package/dist/vue/index.cjs +5 -1
  69. package/dist/vue/index.cjs.map +1 -1
  70. package/dist/vue/index.mjs +5 -1
  71. package/dist/vue/index.mjs.map +1 -1
  72. package/package.json +1 -1
  73. package/src/lib/algebraic_type.ts +5 -1
  74. package/src/lib/binary_writer.ts +4 -0
  75. package/src/lib/indexes.ts +1 -1
  76. package/src/lib/query.ts +90 -25
  77. package/src/lib/schema.ts +66 -24
  78. package/src/lib/table.ts +47 -10
  79. package/src/react/useTable.ts +5 -0
  80. package/src/sdk/db_connection_impl.ts +38 -43
  81. package/src/sdk/table_cache.ts +14 -11
  82. package/src/sdk/websocket_decompress_adapter.ts +42 -45
  83. package/src/sdk/websocket_test_adapter.ts +3 -2
  84. package/src/server/index.ts +1 -0
  85. package/src/server/runtime.ts +7 -3
  86. package/src/server/schema.test-d.ts +37 -0
  87. package/src/server/view.test-d.ts +6 -0
  88. package/src/tanstack/SpacetimeDBQueryClient.ts +24 -0
package/dist/index.cjs CHANGED
@@ -583,6 +583,9 @@ var BinaryWriter = class {
583
583
  constructor(init) {
584
584
  this.buffer = typeof init === "number" ? new ResizableBuffer(init) : init;
585
585
  }
586
+ clear() {
587
+ this.offset = 0;
588
+ }
586
589
  reset(buffer) {
587
590
  this.buffer = buffer;
588
591
  this.offset = 0;
@@ -1222,7 +1225,8 @@ writer.offset += ${primitiveSizes[tag]};` : `writer.write${tag}(value.${name});`
1222
1225
  const result = { ${ty.elements.map(getElementInitializer).join(", ")} };
1223
1226
  const view = reader.view;
1224
1227
  ${ty.elements.map(
1225
- ({ name, algebraicType: { tag } }) => tag in primitiveJSName ? `result.${name} = view.get${primitiveJSName[tag]}(reader.offset, ${primitiveSizes[tag] > 1 ? "true" : ""});
1228
+ ({ name, algebraicType: { tag } }) => tag in primitiveJSName ? tag === "Bool" ? `result.${name} = view.getUint8(reader.offset) !== 0;
1229
+ reader.offset += 1;` : `result.${name} = view.get${primitiveJSName[tag]}(reader.offset, ${primitiveSizes[tag] > 1 ? "true" : ""});
1226
1230
  reader.offset += ${primitiveSizes[tag]};` : `result.${name} = reader.read${tag}();`
1227
1231
  ).join("\n")}
1228
1232
  return result;`;
@@ -1630,7 +1634,7 @@ var FromBuilder = class _FromBuilder {
1630
1634
  }
1631
1635
  [QueryBrand] = true;
1632
1636
  where(predicate) {
1633
- const newCondition = predicate(this.table.cols);
1637
+ const newCondition = normalizePredicateExpr(predicate(this.table.cols));
1634
1638
  const nextWhere = this.whereClause ? this.whereClause.and(newCondition) : newCondition;
1635
1639
  return new _FromBuilder(this.table, nextWhere);
1636
1640
  }
@@ -1725,7 +1729,8 @@ function createRowExpr(tableDef) {
1725
1729
  const column = new ColumnExpression(
1726
1730
  tableDef.sourceName,
1727
1731
  columnName,
1728
- columnBuilder.typeBuilder.algebraicType
1732
+ columnBuilder.typeBuilder.algebraicType,
1733
+ columnBuilder.columnMetadata.name
1729
1734
  );
1730
1735
  row[columnName] = Object.freeze(column);
1731
1736
  }
@@ -1743,14 +1748,18 @@ function renderSelectSqlWithJoins(table2, where, extraClauses = []) {
1743
1748
  }
1744
1749
  var ColumnExpression = class {
1745
1750
  type = "column";
1751
+ // This is the column accessor
1746
1752
  column;
1753
+ // The name of the column in the database.
1754
+ columnName;
1747
1755
  table;
1748
1756
  // phantom: actual runtime value is undefined
1749
1757
  tsValueType;
1750
1758
  spacetimeType;
1751
- constructor(table2, column, spacetimeType) {
1759
+ constructor(table2, column, spacetimeType, columnName) {
1752
1760
  this.table = table2;
1753
1761
  this.column = column;
1762
+ this.columnName = columnName || column;
1754
1763
  this.spacetimeType = spacetimeType;
1755
1764
  }
1756
1765
  eq(x) {
@@ -1807,15 +1816,36 @@ function normalizeValue(val) {
1807
1816
  }
1808
1817
  return literal(val);
1809
1818
  }
1819
+ function normalizePredicateExpr(value) {
1820
+ if (value instanceof BooleanExpr) return value;
1821
+ if (typeof value === "boolean") {
1822
+ return new BooleanExpr({
1823
+ type: "eq",
1824
+ left: literal(value),
1825
+ right: literal(true)
1826
+ });
1827
+ }
1828
+ return new BooleanExpr({
1829
+ type: "eq",
1830
+ left: value,
1831
+ right: literal(true)
1832
+ });
1833
+ }
1810
1834
  var BooleanExpr = class _BooleanExpr {
1811
1835
  constructor(data) {
1812
1836
  this.data = data;
1813
1837
  }
1814
1838
  and(other) {
1815
- return new _BooleanExpr({ type: "and", clauses: [this.data, other.data] });
1839
+ return new _BooleanExpr({
1840
+ type: "and",
1841
+ clauses: [this.data, other.data]
1842
+ });
1816
1843
  }
1817
1844
  or(other) {
1818
- return new _BooleanExpr({ type: "or", clauses: [this.data, other.data] });
1845
+ return new _BooleanExpr({
1846
+ type: "or",
1847
+ clauses: [this.data, other.data]
1848
+ });
1819
1849
  }
1820
1850
  not() {
1821
1851
  return new _BooleanExpr({ type: "not", clause: this.data });
@@ -1824,13 +1854,15 @@ var BooleanExpr = class _BooleanExpr {
1824
1854
  function not(clause) {
1825
1855
  return new BooleanExpr({ type: "not", clause: clause.data });
1826
1856
  }
1827
- function and(...clauses) {
1857
+ function and(first, second, ...rest) {
1858
+ const clauses = [first, second, ...rest];
1828
1859
  return new BooleanExpr({
1829
1860
  type: "and",
1830
1861
  clauses: clauses.map((c) => c.data)
1831
1862
  });
1832
1863
  }
1833
- function or(...clauses) {
1864
+ function or(first, second, ...rest) {
1865
+ const clauses = [first, second, ...rest];
1834
1866
  return new BooleanExpr({
1835
1867
  type: "or",
1836
1868
  clauses: clauses.map((c) => c.data)
@@ -1867,7 +1899,7 @@ function valueExprToSql(expr, tableAlias) {
1867
1899
  return literalValueToSql(expr.value);
1868
1900
  }
1869
1901
  const table2 = expr.table;
1870
- return `${quoteIdentifier(table2)}.${quoteIdentifier(expr.column)}`;
1902
+ return `${quoteIdentifier(table2)}.${quoteIdentifier(expr.columnName)}`;
1871
1903
  }
1872
1904
  function literalValueToSql(value) {
1873
1905
  if (value === null || value === void 0) {
@@ -4448,9 +4480,7 @@ var TableCacheImpl = class {
4448
4480
  this.tableDef = tableDef;
4449
4481
  this.rows = /* @__PURE__ */ new Map();
4450
4482
  this.emitter = new EventEmitter();
4451
- const indexesDef = this.tableDef.indexes || [];
4452
- for (const idx of indexesDef) {
4453
- const idxDef = idx;
4483
+ for (const idxDef of this.tableDef.resolvedIndexes) {
4454
4484
  const index = this.#makeReadonlyIndex(this.tableDef, idxDef);
4455
4485
  this[idxDef.name] = index;
4456
4486
  }
@@ -5007,37 +5037,39 @@ async function resolveWS() {
5007
5037
 
5008
5038
  // src/sdk/websocket_decompress_adapter.ts
5009
5039
  var WebsocketDecompressAdapter = class _WebsocketDecompressAdapter {
5010
- onclose;
5011
- onopen;
5012
- onmessage;
5013
- onerror;
5014
- #ws;
5015
- async #handleOnMessage(msg) {
5016
- const buffer = new Uint8Array(msg.data);
5017
- let decompressed;
5018
- if (buffer[0] === 0) {
5019
- decompressed = buffer.slice(1);
5020
- } else if (buffer[0] === 1) {
5021
- throw new Error(
5022
- "Brotli Compression not supported. Please use gzip or none compression in withCompression method on DbConnection."
5023
- );
5024
- } else if (buffer[0] === 2) {
5025
- decompressed = await decompress(buffer.slice(1), "gzip");
5026
- } else {
5027
- throw new Error(
5028
- "Unexpected Compression Algorithm. Please use `gzip` or `none`"
5029
- );
5030
- }
5031
- this.onmessage?.({ data: decompressed });
5040
+ set onclose(handler) {
5041
+ this.#ws.onclose = handler;
5032
5042
  }
5033
- #handleOnOpen(msg) {
5034
- this.onopen?.(msg);
5043
+ set onopen(handler) {
5044
+ this.#ws.onopen = handler;
5035
5045
  }
5036
- #handleOnError(msg) {
5037
- this.onerror?.(msg);
5046
+ set onmessage(handler) {
5047
+ this.#ws.onmessage = async (msg) => {
5048
+ const data = await this.#decompress(new Uint8Array(msg.data));
5049
+ handler({ data });
5050
+ };
5038
5051
  }
5039
- #handleOnClose(msg) {
5040
- this.onclose?.(msg);
5052
+ set onerror(handler) {
5053
+ this.#ws.onerror = handler;
5054
+ }
5055
+ #ws;
5056
+ async #decompress(buffer) {
5057
+ const tag = buffer[0];
5058
+ const data = buffer.subarray(1);
5059
+ switch (tag) {
5060
+ case 0:
5061
+ return data;
5062
+ case 1:
5063
+ throw new Error(
5064
+ "Brotli Compression not supported. Please use gzip or none compression in withCompression method on DbConnection."
5065
+ );
5066
+ case 2:
5067
+ return await decompress(data, "gzip");
5068
+ default:
5069
+ throw new Error(
5070
+ "Unexpected Compression Algorithm. Please use `gzip` or `none`"
5071
+ );
5072
+ }
5041
5073
  }
5042
5074
  send(msg) {
5043
5075
  this.#ws.send(msg);
@@ -5046,14 +5078,6 @@ var WebsocketDecompressAdapter = class _WebsocketDecompressAdapter {
5046
5078
  this.#ws.close();
5047
5079
  }
5048
5080
  constructor(ws) {
5049
- this.onmessage = void 0;
5050
- this.onopen = void 0;
5051
- this.onmessage = void 0;
5052
- this.onerror = void 0;
5053
- ws.onmessage = this.#handleOnMessage.bind(this);
5054
- ws.onerror = this.#handleOnError.bind(this);
5055
- ws.onclose = this.#handleOnClose.bind(this);
5056
- ws.onopen = this.#handleOnOpen.bind(this);
5057
5081
  ws.binaryType = "arraybuffer";
5058
5082
  this.#ws = ws;
5059
5083
  }
@@ -5690,12 +5714,13 @@ var DbConnectionImpl = class {
5690
5714
  }
5691
5715
  #makeReducers(def) {
5692
5716
  const out = {};
5717
+ const writer = new BinaryWriter(1024);
5693
5718
  for (const reducer of def.reducers) {
5694
5719
  const reducerName = reducer.name;
5695
5720
  const key = reducer.accessorName;
5696
5721
  const { serialize: serializeArgs } = this.#reducerArgsSerializers[reducerName];
5697
5722
  out[key] = (params) => {
5698
- const writer = new BinaryWriter(1024);
5723
+ writer.clear();
5699
5724
  serializeArgs(writer, params);
5700
5725
  const argsBuffer = writer.getBuffer();
5701
5726
  return this.callReducer(reducerName, argsBuffer, params);
@@ -5705,12 +5730,13 @@ var DbConnectionImpl = class {
5705
5730
  }
5706
5731
  #makeProcedures(def) {
5707
5732
  const out = {};
5733
+ const writer = new BinaryWriter(1024);
5708
5734
  for (const procedure of def.procedures) {
5709
5735
  const procedureName = procedure.name;
5710
5736
  const key = procedure.accessorName;
5711
5737
  const { serializeArgs, deserializeReturn } = this.#procedureSerializers[procedureName];
5712
5738
  out[key] = (params) => {
5713
- const writer = new BinaryWriter(1024);
5739
+ writer.clear();
5714
5740
  serializeArgs(writer, params);
5715
5741
  const argsBuffer = writer.getBuffer();
5716
5742
  return this.callProcedure(procedureName, argsBuffer).then((returnBuf) => {
@@ -5865,34 +5891,32 @@ var DbConnectionImpl = class {
5865
5891
  }
5866
5892
  return this.#mergeTableUpdates(updates);
5867
5893
  }
5868
- #sendEncoded(wsResolved, message) {
5869
- stdbLogger(
5870
- "trace",
5871
- () => `Sending message to server: ${stringify(message)}`
5872
- );
5873
- const writer = new BinaryWriter(1024);
5874
- ClientMessage.serialize(writer, message);
5875
- const encoded = writer.getBuffer();
5876
- wsResolved.send(encoded);
5877
- }
5878
5894
  #flushOutboundQueue(wsResolved) {
5879
- if (!this.isActive || this.#outboundQueue.length === 0) {
5880
- return;
5881
- }
5882
5895
  const pending = this.#outboundQueue.splice(0);
5883
5896
  for (const message of pending) {
5884
- this.#sendEncoded(wsResolved, message);
5897
+ wsResolved.send(message);
5885
5898
  }
5886
5899
  }
5900
+ #clientMessageEncoder = new BinaryWriter(1024);
5887
5901
  #sendMessage(message) {
5888
- this.wsPromise.then((wsResolved) => {
5889
- if (!wsResolved || !this.isActive) {
5890
- this.#outboundQueue.push(message);
5891
- return;
5892
- }
5893
- this.#flushOutboundQueue(wsResolved);
5894
- this.#sendEncoded(wsResolved, message);
5895
- });
5902
+ const writer = this.#clientMessageEncoder;
5903
+ writer.clear();
5904
+ ClientMessage.serialize(writer, message);
5905
+ const encoded = writer.getBuffer();
5906
+ if (this.ws && this.isActive) {
5907
+ if (this.#outboundQueue.length) this.#flushOutboundQueue(this.ws);
5908
+ stdbLogger(
5909
+ "trace",
5910
+ () => `Sending message to server: ${stringify(message)}`
5911
+ );
5912
+ this.ws.send(encoded);
5913
+ } else {
5914
+ stdbLogger(
5915
+ "trace",
5916
+ () => `Queuing message to server: ${stringify(message)}`
5917
+ );
5918
+ this.#outboundQueue.push(encoded.slice());
5919
+ }
5896
5920
  }
5897
5921
  #nextEventId() {
5898
5922
  this.#eventId += 1;
@@ -6234,11 +6258,7 @@ var DbConnectionImpl = class {
6234
6258
  * ```
6235
6259
  */
6236
6260
  disconnect() {
6237
- this.wsPromise.then((wsResolved) => {
6238
- if (wsResolved) {
6239
- wsResolved.close();
6240
- }
6241
- });
6261
+ this.wsPromise.then((ws) => ws?.close());
6242
6262
  }
6243
6263
  on(eventName, callback) {
6244
6264
  this.#emitter.on(eventName, callback);
@@ -6268,17 +6288,45 @@ var DbConnectionImpl = class {
6268
6288
 
6269
6289
  // src/lib/schema.ts
6270
6290
  function tablesToSchema(ctx, tables) {
6291
+ const tableDefs = /* @__PURE__ */ Object.create(null);
6292
+ for (const [accName, schema2] of Object.entries(tables)) {
6293
+ tableDefs[accName] = tableToSchema(
6294
+ accName,
6295
+ schema2,
6296
+ schema2.tableDef(ctx, accName)
6297
+ );
6298
+ }
6271
6299
  return {
6272
- tables: Object.fromEntries(
6273
- Object.entries(tables).map(([accName, schema2]) => [
6274
- accName,
6275
- tableToSchema(accName, schema2, schema2.tableDef(ctx, accName))
6276
- ])
6277
- )
6300
+ tables: tableDefs
6278
6301
  };
6279
6302
  }
6280
6303
  function tableToSchema(accName, schema2, tableDef) {
6281
6304
  const getColName = (i) => schema2.rowType.algebraicType.value.elements[i].name;
6305
+ const resolvedIndexes = tableDef.indexes.map(
6306
+ (idx) => {
6307
+ const accessorName = idx.accessorName;
6308
+ if (typeof accessorName !== "string" || accessorName.length === 0) {
6309
+ throw new TypeError(
6310
+ `Index '${idx.sourceName ?? "<unknown>"}' on table '${tableDef.sourceName}' is missing accessor name`
6311
+ );
6312
+ }
6313
+ const columnIds = idx.algorithm.tag === "Direct" ? [idx.algorithm.value] : idx.algorithm.value;
6314
+ const unique = tableDef.constraints.some(
6315
+ (c) => c.data.tag === "Unique" && c.data.value.columns.every((col) => columnIds.includes(col))
6316
+ );
6317
+ const algorithm = {
6318
+ BTree: "btree",
6319
+ Hash: "hash",
6320
+ Direct: "direct"
6321
+ }[idx.algorithm.tag];
6322
+ return {
6323
+ name: accessorName,
6324
+ unique,
6325
+ algorithm,
6326
+ columns: columnIds.map(getColName)
6327
+ };
6328
+ }
6329
+ );
6282
6330
  return {
6283
6331
  // For client,`schama.tableName` will always be there as canonical name.
6284
6332
  // For module, if explicit name is not provided via `name`, accessor name will
@@ -6288,26 +6336,16 @@ function tableToSchema(accName, schema2, tableDef) {
6288
6336
  columns: schema2.rowType.row,
6289
6337
  // typed as T[i]['rowType']['row'] under TablesToSchema<T>
6290
6338
  rowType: schema2.rowSpacetimeType,
6339
+ // Keep declarative indexes in their original shape for type-level consumers.
6340
+ indexes: schema2.idxs,
6291
6341
  constraints: tableDef.constraints.map((c) => ({
6292
6342
  name: c.sourceName,
6293
6343
  constraint: "unique",
6294
6344
  columns: c.data.value.columns.map(getColName)
6295
6345
  })),
6296
- // TODO: horrible horrible horrible. we smuggle this `Array<UntypedIndex>`
6297
- // by casting it to an `Array<IndexOpts>` as `TableToSchema` expects.
6298
- // This is then used in `TableCacheImpl.constructor` and who knows where else.
6299
- // We should stop lying about our types.
6300
- indexes: tableDef.indexes.map((idx) => {
6301
- const columnIds = idx.algorithm.tag === "Direct" ? [idx.algorithm.value] : idx.algorithm.value;
6302
- return {
6303
- name: idx.accessorName,
6304
- unique: tableDef.constraints.some(
6305
- (c) => c.data.value.columns.every((col) => columnIds.includes(col))
6306
- ),
6307
- algorithm: idx.algorithm.tag.toLowerCase(),
6308
- columns: columnIds.map(getColName)
6309
- };
6310
- }),
6346
+ // Expose resolved runtime indexes separately so runtime users don't have to
6347
+ // reinterpret `indexes` with unsafe casts.
6348
+ resolvedIndexes,
6311
6349
  tableDef,
6312
6350
  ...tableDef.isEvent ? { isEvent: true } : {}
6313
6351
  };
@@ -7131,6 +7169,14 @@ function table(opts, row, ..._) {
7131
7169
  }
7132
7170
  }
7133
7171
  for (const indexOpts of userIndexes ?? []) {
7172
+ const accessor = indexOpts.accessor;
7173
+ if (typeof accessor !== "string" || accessor.length === 0) {
7174
+ const tableLabel = name ?? "<unnamed>";
7175
+ const indexLabel = indexOpts.name ?? "<unnamed>";
7176
+ throw new TypeError(
7177
+ `Index '${indexLabel}' on table '${tableLabel}' must define a non-empty 'accessor'`
7178
+ );
7179
+ }
7134
7180
  let algorithm;
7135
7181
  switch (indexOpts.algorithm) {
7136
7182
  case "btree":
@@ -7151,7 +7197,7 @@ function table(opts, row, ..._) {
7151
7197
  }
7152
7198
  indexes.push({
7153
7199
  sourceName: void 0,
7154
- accessorName: indexOpts.accessor,
7200
+ accessorName: accessor,
7155
7201
  algorithm,
7156
7202
  canonicalName: indexOpts.name
7157
7203
  });
@@ -7201,7 +7247,9 @@ function table(opts, row, ..._) {
7201
7247
  isEvent
7202
7248
  };
7203
7249
  },
7204
- idxs: {},
7250
+ // Preserve the declared index options as runtime data so `tableToSchema`
7251
+ // can expose them without type-smuggling.
7252
+ idxs: userIndexes,
7205
7253
  constraints,
7206
7254
  schedule
7207
7255
  };