Skip to content

Commit 97b579b

Browse files
committed
Support TypeScript 5.6 and 5.7 (#241)
TypeScript 5.7 made TypeArray objects generic over an `ArrayBufferLike` source. We only use `ArrayBuffer` internally, so isdeally we would be explicit about the generic parameter in our return types. However, older versions of TS will fail with an explicit generic parameter (i.e., `Uint8Array<ArrayBuffer>`). The biggest issue is a mismatch between `ndarray` types and our own. This change vendors the types for `ndarray`, to align them with our own.
1 parent 7756cdc commit 97b579b

File tree

8 files changed

+124
-42
lines changed

8 files changed

+124
-42
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"@svitejs/changesets-changelog-github-compact": "^1.2.0",
1717
"@types/node": "^22.10.1",
1818
"publint": "^0.2.12",
19-
"typescript": "5.6.3",
19+
"typescript": "5.7.2",
2020
"vitest": "^2.1.8"
2121
},
2222
"packageManager": "[email protected]"

packages/core/src/codecs/vlen-utf8.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ export class VLenUTF8 {
2626
for (let i = 0; i < data.length; i++) {
2727
let item_length = view.getUint32(pos, true);
2828
pos += 4;
29-
data[i] = decoder.decode(bytes.buffer.slice(pos, pos + item_length));
29+
// @ts-expect-error - we know this is an ArrayBuffer, TS just isn't smart enough to know it's not a SharedArrayBuffer
30+
let buffer: ArrayBuffer = bytes.buffer;
31+
data[i] = decoder.decode(buffer.slice(pos, pos + item_length));
3032
pos += item_length;
3133
}
3234
return { data, shape: this.#shape, stride: this.#strides };

packages/indexing/__tests__/setter.test.ts

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ function to_c<D extends DataType>({ data, shape, stride }: Chunk<D>): Chunk<D> {
3636
let size = shape.reduce((a, b) => a * b, 1);
3737
// @ts-expect-error - We know constructor exists on TypedArray
3838
let out = ndarray(new data.constructor(size), shape);
39+
// @ts-expect-error - ndarray types are a mismatch with ours but this operation is safe
3940
assign(out, ndarray(data, shape, stride));
4041
return out;
4142
}
@@ -59,7 +60,7 @@ describe("setter", () => {
5960
1, 1, 1, 1,
6061
1, 1, 1, 1,
6162
1, 1, 1, 1,
62-
63+
6364
1, 1, 1, 1,
6465
1, 1, 1, 1,
6566
1, 1, 1, 1,
@@ -79,7 +80,7 @@ describe("setter", () => {
7980
1, 0, 0, 0,
8081
0, 0, 0, 0,
8182
0, 0, 0, 0,
82-
83+
8384
0, 0, 0, 0,
8485
0, 0, 0, 0,
8586
0, 0, 0, 0,
@@ -91,7 +92,7 @@ describe("setter", () => {
9192
1, 0, 0, 0,
9293
0, 0, 0, 0,
9394
0, 0, 0, 0,
94-
95+
9596
0, 0, 0, 0,
9697
0, 2, 0, 0,
9798
0, 0, 0, 0,
@@ -103,7 +104,7 @@ describe("setter", () => {
103104
1, 0, 0, 0,
104105
0, 0, 0, 0,
105106
0, 0, 0, 0,
106-
107+
107108
0, 0, 0, 0,
108109
0, 2, 0, 0,
109110
0, 0, 0, 3,
@@ -115,7 +116,7 @@ describe("setter", () => {
115116
1, 0, 0, 0,
116117
0, 0, 0, 0,
117118
0, 0, 0, 0,
118-
119+
119120
0, 0, 0, 0,
120121
0, 2, 0, 0,
121122
0, 0, 4, 3,
@@ -136,7 +137,7 @@ describe("setter", () => {
136137
1, 0, 0, 0,
137138
1, 0, 0, 0,
138139
0, 0, 0, 0,
139-
140+
140141
1, 0, 0, 0,
141142
1, 0, 0, 0,
142143
0, 0, 0, 0,
@@ -150,7 +151,7 @@ describe("setter", () => {
150151
2, 2, 2, 2,
151152
2, 2, 2, 2,
152153
2, 2, 2, 2,
153-
154+
154155
1, 0, 0, 0,
155156
1, 0, 0, 0,
156157
0, 0, 0, 0,
@@ -190,7 +191,7 @@ describe("setter", () => {
190191
2, 2, 2, 2,
191192
2, 2, 2, 2,
192193
2, 2, 2, 2,
193-
194+
194195
1, 0, 0, 0,
195196
1, 0, 0, 0,
196197
0, 0, 0, 0,
@@ -222,7 +223,7 @@ describe("setter", () => {
222223
1, 1, 0, 0,
223224
1, 1, 0, 0,
224225
0, 0, 0, 0,
225-
226+
226227
1, 1, 0, 0,
227228
1, 1, 0, 0,
228229
0, 0, 0, 0,
@@ -254,7 +255,7 @@ describe("setter", () => {
254255
2, 0, 2, 0,
255256
0, 0, 0, 0,
256257
2, 0, 2, 0,
257-
258+
258259
2, 0, 2, 0,
259260
0, 0, 0, 0,
260261
2, 0, 2, 0,
@@ -274,7 +275,7 @@ describe("setter", () => {
274275
2, 0, 2, 0,
275276
0, 0, 0, 0,
276277
2, 0, 2, 0,
277-
278+
278279
2, 0, 2, 0,
279280
0, 0, 0, 0,
280281
2, 0, 2, 0,
@@ -318,7 +319,7 @@ describe("setter", () => {
318319
0, 2, 0, 0,
319320
0, 0, 0, 0,
320321
0, 2, 0, 0,
321-
322+
322323
0, 0, 0, 0,
323324
0, 0, 0, 0,
324325
0, 0, 0, 0,
@@ -334,7 +335,7 @@ describe("setter", () => {
334335
0, 2, 0, 0,
335336
0, 0, 0, 0,
336337
0, 2, 0, 0,
337-
338+
338339
0, 0, 0, 0,
339340
0, 0, 0, 0,
340341
0, 0, 0, 0,
@@ -378,7 +379,7 @@ describe("setter", () => {
378379
1, 1, 0, 0,
379380
1, 1, 0, 0,
380381
0, 0, 0, 0,
381-
382+
382383
1, 1, 0, 0,
383384
1, 1, 0, 0,
384385
0, 0, 0, 0,
@@ -439,14 +440,14 @@ describe("setter", () => {
439440
setter.set_from_chunk(dest, src, mapping);
440441
// biome-ignore format: the array should not be formatted
441442
expect(to_c(dest).data).toStrictEqual(new Float32Array([
442-
0, 2, 0, 0,
443-
0, 0, 0, 0,
444-
0, 2, 0, 0,
443+
0, 2, 0, 0,
444+
0, 0, 0, 0,
445+
0, 2, 0, 0,
445446

446-
0, 0, 0, 0,
447-
0, 0, 0, 0,
448-
0, 0, 0, 0,
449-
]));
447+
0, 0, 0, 0,
448+
0, 0, 0, 0,
449+
0, 0, 0, 0,
450+
]));
450451
});
451452

452453
it("set_from_chunk - dest=C order, src=F order", async () => {

packages/ndarray/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
}
1212
},
1313
"dependencies": {
14-
"@types/ndarray": "^1.0.11",
1514
"@types/ndarray-ops": "^1.2.4",
1615
"@zarrita/core": "workspace:^",
1716
"@zarrita/indexing": "workspace:^",
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
declare module "ndarray" {
2+
declare function ndarray<D extends ndarray.Data = ndarray.Data<number>>(
3+
data: D,
4+
shape?: number[],
5+
stride?: number[],
6+
offset?: number,
7+
): ndarray.NdArray<D>;
8+
9+
declare namespace ndarray {
10+
interface NdArray<D extends Data = Data<number>> {
11+
data: D;
12+
shape: number[];
13+
stride: number[];
14+
offset: number;
15+
dtype: DataType<D>;
16+
size: number;
17+
order: number[];
18+
dimension: number;
19+
get(...args: number[]): Value<D>;
20+
set(...args: number[]): Value<D>;
21+
index(...args: number[]): Value<D>;
22+
lo(...args: number[]): NdArray<D>;
23+
hi(...args: number[]): NdArray<D>;
24+
step(...args: number[]): NdArray<D>;
25+
transpose(...args: number[]): NdArray<D>;
26+
pick(...args: Array<number | null>): NdArray<D>;
27+
T: NdArray<D>;
28+
}
29+
30+
interface GenericArray<T> {
31+
get(idx: number): T;
32+
set(idx: number, value: T): void;
33+
length: number;
34+
}
35+
36+
// biome-ignore lint/suspicious/noExplicitAny: not our library
37+
type Data<T = any> = T extends number
38+
? GenericArray<T> | T[] | TypedArray
39+
: T extends bigint
40+
? GenericArray<T> | T[] | BigInt64Array | BigUint64Array
41+
: GenericArray<T> | T[];
42+
43+
type TypedArray =
44+
| Int8Array
45+
| Int16Array
46+
| Int32Array
47+
| Uint8Array
48+
| Uint8ClampedArray
49+
| Uint16Array
50+
| Uint32Array
51+
| Float32Array
52+
| Float64Array;
53+
54+
type Value<D extends Data> = D extends
55+
| GenericArray<infer T>
56+
// biome-ignore lint/suspicious/noRedeclare: not our library
57+
| Record<number, infer T>
58+
? T
59+
: never;
60+
61+
type DataType<D extends Data = Data> = D extends Int8Array
62+
? "int8"
63+
: D extends Int16Array
64+
? "int16"
65+
: D extends Int32Array
66+
? "int32"
67+
: D extends Uint8Array
68+
? "uint8"
69+
: D extends Uint8ClampedArray
70+
? "uint8_clamped"
71+
: D extends Uint16Array
72+
? "uint16"
73+
: D extends Uint32Array
74+
? "uint32"
75+
: D extends Float32Array
76+
? "float32"
77+
: D extends Float64Array
78+
? "float64"
79+
: D extends BigInt64Array
80+
? "bigint64"
81+
: D extends BigUint64Array
82+
? "biguint64"
83+
: D extends GenericArray<unknown>
84+
? "generic"
85+
: "array";
86+
}
87+
88+
export = ndarray;
89+
}

packages/typedarray/__tests__/index.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,9 @@ describe("ByteStringArray", () => {
188188
let data = new TextEncoder().encode(
189189
"Hello\x00world!\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
190190
);
191-
let arr = new ByteStringArray(2, data.buffer, 3, 4);
191+
// @ts-expect-error - we know this is an ArrayBuffer, TS just isn't smart enough to know it's not a SharedArrayBuffer
192+
let buffer: ArrayBuffer = data.buffer;
193+
let arr = new ByteStringArray(2, buffer, 3, 4);
192194
expect({
193195
length: arr.length,
194196
BYTES_PER_ELEMENT: arr.BYTES_PER_ELEMENT,

packages/typedarray/src/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export class BoolArray {
3131
}
3232

3333
get buffer(): ArrayBuffer {
34-
return this.#bytes.buffer;
34+
return this.#bytes.buffer as ArrayBuffer;
3535
}
3636

3737
get length(): number {
@@ -106,7 +106,7 @@ export class ByteStringArray {
106106
}
107107

108108
get buffer(): ArrayBuffer {
109-
return this._data.buffer;
109+
return this._data.buffer as ArrayBuffer;
110110
}
111111

112112
get length(): number {
@@ -198,7 +198,7 @@ export class UnicodeStringArray {
198198
}
199199

200200
get buffer(): ArrayBuffer {
201-
return this.#data.buffer;
201+
return this.#data.buffer as ArrayBuffer;
202202
}
203203

204204
get length(): number {

pnpm-lock.yaml

Lines changed: 3 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)