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.
- package/LICENSE.txt +2 -2
- package/dist/angular/index.cjs +5 -1
- package/dist/angular/index.cjs.map +1 -1
- package/dist/angular/index.mjs +5 -1
- package/dist/angular/index.mjs.map +1 -1
- package/dist/browser/angular/index.mjs +5 -1
- package/dist/browser/angular/index.mjs.map +1 -1
- package/dist/browser/react/index.mjs +8 -1
- package/dist/browser/react/index.mjs.map +1 -1
- package/dist/browser/svelte/index.mjs +5 -1
- package/dist/browser/svelte/index.mjs.map +1 -1
- package/dist/browser/vue/index.mjs +5 -1
- package/dist/browser/vue/index.mjs.map +1 -1
- package/dist/index.browser.mjs +148 -100
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.cjs +148 -100
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +148 -100
- package/dist/index.mjs.map +1 -1
- package/dist/lib/algebraic_type.d.ts.map +1 -1
- package/dist/lib/binary_writer.d.ts +1 -0
- package/dist/lib/binary_writer.d.ts.map +1 -1
- package/dist/lib/indexes.d.ts +1 -1
- package/dist/lib/indexes.d.ts.map +1 -1
- package/dist/lib/query.d.ts +14 -7
- package/dist/lib/query.d.ts.map +1 -1
- package/dist/lib/schema.d.ts +2 -0
- package/dist/lib/schema.d.ts.map +1 -1
- package/dist/lib/table.d.ts +25 -2
- package/dist/lib/table.d.ts.map +1 -1
- package/dist/min/index.browser.mjs +1 -1
- package/dist/min/index.browser.mjs.map +1 -1
- package/dist/min/react/index.mjs +1 -1
- package/dist/min/react/index.mjs.map +1 -1
- package/dist/min/sdk/index.browser.mjs +1 -1
- package/dist/min/sdk/index.browser.mjs.map +1 -1
- package/dist/react/index.cjs +8 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.mjs +8 -1
- package/dist/react/index.mjs.map +1 -1
- package/dist/react/useTable.d.ts.map +1 -1
- package/dist/sdk/db_connection_impl.d.ts.map +1 -1
- package/dist/sdk/index.browser.mjs +144 -98
- package/dist/sdk/index.browser.mjs.map +1 -1
- package/dist/sdk/index.cjs +144 -98
- package/dist/sdk/index.cjs.map +1 -1
- package/dist/sdk/index.mjs +144 -98
- package/dist/sdk/index.mjs.map +1 -1
- package/dist/sdk/table_cache.d.ts.map +1 -1
- package/dist/sdk/websocket_decompress_adapter.d.ts +17 -7
- package/dist/sdk/websocket_decompress_adapter.d.ts.map +1 -1
- package/dist/sdk/websocket_test_adapter.d.ts +3 -2
- package/dist/sdk/websocket_test_adapter.d.ts.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.mjs +88 -30
- package/dist/server/index.mjs.map +1 -1
- package/dist/svelte/index.cjs +5 -1
- package/dist/svelte/index.cjs.map +1 -1
- package/dist/svelte/index.mjs +5 -1
- package/dist/svelte/index.mjs.map +1 -1
- package/dist/tanstack/SpacetimeDBQueryClient.d.ts +1 -0
- package/dist/tanstack/SpacetimeDBQueryClient.d.ts.map +1 -1
- package/dist/tanstack/index.cjs +26 -1
- package/dist/tanstack/index.cjs.map +1 -1
- package/dist/tanstack/index.mjs +26 -1
- package/dist/tanstack/index.mjs.map +1 -1
- package/dist/vue/index.cjs +5 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.mjs +5 -1
- package/dist/vue/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/algebraic_type.ts +5 -1
- package/src/lib/binary_writer.ts +4 -0
- package/src/lib/indexes.ts +1 -1
- package/src/lib/query.ts +90 -25
- package/src/lib/schema.ts +66 -24
- package/src/lib/table.ts +47 -10
- package/src/react/useTable.ts +5 -0
- package/src/sdk/db_connection_impl.ts +38 -43
- package/src/sdk/table_cache.ts +14 -11
- package/src/sdk/websocket_decompress_adapter.ts +42 -45
- package/src/sdk/websocket_test_adapter.ts +3 -2
- package/src/server/index.ts +1 -0
- package/src/server/runtime.ts +7 -3
- package/src/server/schema.test-d.ts +37 -0
- package/src/server/view.test-d.ts +6 -0
- 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.
|
|
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({
|
|
1839
|
+
return new _BooleanExpr({
|
|
1840
|
+
type: "and",
|
|
1841
|
+
clauses: [this.data, other.data]
|
|
1842
|
+
});
|
|
1816
1843
|
}
|
|
1817
1844
|
or(other) {
|
|
1818
|
-
return new _BooleanExpr({
|
|
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(...
|
|
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(...
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
5034
|
-
this.onopen
|
|
5043
|
+
set onopen(handler) {
|
|
5044
|
+
this.#ws.onopen = handler;
|
|
5035
5045
|
}
|
|
5036
|
-
|
|
5037
|
-
this.
|
|
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
|
-
|
|
5040
|
-
this.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
5897
|
+
wsResolved.send(message);
|
|
5885
5898
|
}
|
|
5886
5899
|
}
|
|
5900
|
+
#clientMessageEncoder = new BinaryWriter(1024);
|
|
5887
5901
|
#sendMessage(message) {
|
|
5888
|
-
|
|
5889
|
-
|
|
5890
|
-
|
|
5891
|
-
|
|
5892
|
-
|
|
5893
|
-
this.#flushOutboundQueue(
|
|
5894
|
-
|
|
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((
|
|
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:
|
|
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
|
-
//
|
|
6297
|
-
//
|
|
6298
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
};
|