Skip to content

Commit 624b1ea

Browse files
cmdcolinclaude
andcommitted
update typescript to latest
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 63bd0ed commit 624b1ea

File tree

10 files changed

+128
-68
lines changed

10 files changed

+128
-68
lines changed

eslint.config.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ export default defineConfig(
4949
curly: 'error',
5050
'@typescript-eslint/consistent-type-imports': 'error',
5151
'@typescript-eslint/no-explicit-any': 'warn',
52-
'@typescript-eslint/ban-ts-comment': ['error', { 'ts-expect-error': 'allow-with-description', 'ts-ignore': true }],
52+
'@typescript-eslint/ban-ts-comment': [
53+
'error',
54+
{ 'ts-expect-error': 'allow-with-description', 'ts-ignore': true },
55+
],
5356
semi: ['error', 'never'],
5457
'unicorn/no-new-array': 'off',
5558
'unicorn/no-empty-file': 'off',

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
"range-parser": "^1.2.1",
6161
"rimraf": "^6.0.0",
6262
"standard-changelog": "^7.0.1",
63-
"typescript": "^5.7.0",
63+
"typescript": "^5.9.3",
6464
"typescript-eslint": "^8.18.0",
6565
"vitest": "^4.0.15"
6666
},

src/blobFile.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type {
2+
BufferEncoding,
23
FilehandleOptions,
34
GenericFilehandle,
45
Stats,

src/filehandle.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
// avoids needing to have @types/node as a dependency of the consuming code
2+
export type BufferEncoding =
3+
| 'ascii'
4+
| 'utf8'
5+
| 'utf-8'
6+
| 'utf16le'
7+
| 'utf-16le'
8+
| 'ucs2'
9+
| 'ucs-2'
10+
| 'base64'
11+
| 'base64url'
12+
| 'latin1'
13+
| 'binary'
14+
| 'hex'
15+
116
export type Fetcher = (
217
input: RequestInfo,
318
init?: RequestInit,

src/localFile.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { open, readFile, stat } from 'fs/promises'
22

3-
import type { FilehandleOptions, GenericFilehandle } from './filehandle.ts'
3+
import type {
4+
BufferEncoding,
5+
FilehandleOptions,
6+
GenericFilehandle,
7+
} from './filehandle.ts'
48

59
export default class LocalFile implements GenericFilehandle {
610
private filename: string

src/remoteFile.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type {
2+
BufferEncoding,
23
Fetcher,
34
FilehandleOptions,
45
GenericFilehandle,
@@ -71,6 +72,11 @@ export default class RemoteFile implements GenericFilehandle {
7172
if (length === 0) {
7273
return new Uint8Array(0)
7374
}
75+
if (Number.isNaN(length) || Number.isNaN(position)) {
76+
throw new TypeError(
77+
`read() called with NaN length or position (length=${length}, position=${position}). The index file may be corrupt.`,
78+
)
79+
}
7480
const { headers = {}, signal, overrides = {} } = opts
7581
if (length < Infinity) {
7682
headers.range = `bytes=${position}-${position + length - 1}`

test/auth.test.ts

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,15 @@ afterEach(() => {
5353
})
5454

5555
test('auth token', async () => {
56-
mockFetch = vi.fn().mockImplementation(async (_url: string, args: { headers: Record<string, string> }) => {
57-
return args.headers.Authorization
58-
? createResponse('hello world', 200)
59-
: createResponse('Unauthorized', 403)
60-
})
56+
mockFetch = vi
57+
.fn()
58+
.mockImplementation(
59+
async (_url: string, args: { headers: Record<string, string> }) => {
60+
return args.headers.Authorization
61+
? createResponse('hello world', 200)
62+
: createResponse('Unauthorized', 403)
63+
},
64+
)
6165

6266
const f = new RemoteFile('http://fakehost/test.txt', {
6367
fetch: mockFetch,
@@ -72,16 +76,20 @@ test('auth token', async () => {
7276
})
7377

7478
test('auth token with range request', async () => {
75-
mockFetch = vi.fn().mockImplementation(async (_url: string, args: { headers: Record<string, string> }) => {
76-
if (args.headers.Authorization && args.headers.range) {
77-
return createResponse('hello', 206)
78-
} else if (!args.headers.Authorization) {
79-
return createResponse('Unauthorized', 403)
80-
} else if (!args.headers.Range) {
81-
return createResponse('Bad Request', 400)
82-
}
83-
return createResponse('Unknown error', 500)
84-
})
79+
mockFetch = vi
80+
.fn()
81+
.mockImplementation(
82+
async (_url: string, args: { headers: Record<string, string> }) => {
83+
if (args.headers.Authorization && args.headers.range) {
84+
return createResponse('hello', 206)
85+
} else if (!args.headers.Authorization) {
86+
return createResponse('Unauthorized', 403)
87+
} else if (!args.headers.Range) {
88+
return createResponse('Bad Request', 400)
89+
}
90+
return createResponse('Unknown error', 500)
91+
},
92+
)
8593

8694
const f = new RemoteFile('http://fakehost/test.txt', {
8795
fetch: mockFetch,

test/remoteFile.test.ts

Lines changed: 70 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -103,37 +103,45 @@ test('reads file with encoding', async () => {
103103
})
104104

105105
test('reads remote partially', async () => {
106-
mockFetch = vi.fn().mockImplementation(async (url: string, args: { headers: Record<string, string> }) => {
107-
const file = getFile(url)
108-
const range = rangeParser(10000, args.headers.range)
109-
const { start, end } = range[0]
110-
const len = end - start + 1
111-
const buf = await file.read(len, start)
112-
const stat = await file.stat()
113-
114-
return createResponse(buf, 206, {
115-
'content-range': `${start}-${end}/${stat.size}`,
116-
})
117-
})
106+
mockFetch = vi
107+
.fn()
108+
.mockImplementation(
109+
async (url: string, args: { headers: Record<string, string> }) => {
110+
const file = getFile(url)
111+
const range = rangeParser(10000, args.headers.range)
112+
const { start, end } = range[0]
113+
const len = end - start + 1
114+
const buf = await file.read(len, start)
115+
const stat = await file.stat()
116+
117+
return createResponse(buf, 206, {
118+
'content-range': `${start}-${end}/${stat.size}`,
119+
})
120+
},
121+
)
118122

119123
const f = new RemoteFile('http://fakehost/test.txt', { fetch: mockFetch })
120124
const buf = await f.read(3, 0)
121125
expect(toString(buf)).toEqual('tes')
122126
})
123127

124128
test('reads remote clipped at the end', async () => {
125-
mockFetch = vi.fn().mockImplementation(async (url: string, args: { headers: Record<string, string> }) => {
126-
const file = getFile(url)
127-
const range = rangeParser(10000, args.headers.range)
128-
const { start, end } = range[0]
129-
const len = end - start + 1
130-
const buf = await file.read(len, start)
131-
const stat = await file.stat()
132-
133-
return createResponse(buf, 206, {
134-
'content-range': `${start}-${end}/${stat.size}`,
135-
})
136-
})
129+
mockFetch = vi
130+
.fn()
131+
.mockImplementation(
132+
async (url: string, args: { headers: Record<string, string> }) => {
133+
const file = getFile(url)
134+
const range = rangeParser(10000, args.headers.range)
135+
const { start, end } = range[0]
136+
const len = end - start + 1
137+
const buf = await file.read(len, start)
138+
const stat = await file.stat()
139+
140+
return createResponse(buf, 206, {
141+
'content-range': `${start}-${end}/${stat.size}`,
142+
})
143+
},
144+
)
137145

138146
const f = new RemoteFile('http://fakehost/test.txt', { fetch: mockFetch })
139147
const buf = await f.read(3, 6)
@@ -160,38 +168,52 @@ test('throws error if file missing', async () => {
160168
await expect(res).rejects.toThrow(/HTTP 404/)
161169
})
162170

171+
test('throws on NaN length or position', async () => {
172+
const f = new RemoteFile('http://fakehost/test.txt', { fetch: mockFetch })
173+
await expect(f.read(NaN, 0)).rejects.toThrow(/NaN length or position/)
174+
await expect(f.read(10, NaN)).rejects.toThrow(/NaN length or position/)
175+
})
176+
163177
test('zero read', async () => {
164-
mockFetch = vi.fn().mockImplementation(async (url: string, args: { headers: Record<string, string> }) => {
165-
const file = getFile(url)
166-
const range = rangeParser(10000, args.headers.range)
167-
const { start, end } = range[0]
168-
const len = end - start + 1
169-
const buf = await file.read(len, start)
170-
const stat = await file.stat()
171-
172-
return createResponse(buf, 206, {
173-
'content-range': `${start}-${end}/${stat.size}`,
174-
})
175-
})
178+
mockFetch = vi
179+
.fn()
180+
.mockImplementation(
181+
async (url: string, args: { headers: Record<string, string> }) => {
182+
const file = getFile(url)
183+
const range = rangeParser(10000, args.headers.range)
184+
const { start, end } = range[0]
185+
const len = end - start + 1
186+
const buf = await file.read(len, start)
187+
const stat = await file.stat()
188+
189+
return createResponse(buf, 206, {
190+
'content-range': `${start}-${end}/${stat.size}`,
191+
})
192+
},
193+
)
176194

177195
const f = new RemoteFile('http://fakehost/test.txt', { fetch: mockFetch })
178196
const buf = toString(await f.read(0, 0))
179197
expect(buf).toBe('')
180198
})
181199

182200
test('stat', async () => {
183-
mockFetch = vi.fn().mockImplementation(async (url: string, args: { headers: Record<string, string> }) => {
184-
const file = getFile(url)
185-
const range = rangeParser(10000, args.headers.range)
186-
const { start, end } = range[0]
187-
const len = end - start + 1
188-
const buf = await file.read(len, start)
189-
const stat = await file.stat()
190-
191-
return createResponse(buf, 206, {
192-
'content-range': `${start}-${end}/${stat.size}`,
193-
})
194-
})
201+
mockFetch = vi
202+
.fn()
203+
.mockImplementation(
204+
async (url: string, args: { headers: Record<string, string> }) => {
205+
const file = getFile(url)
206+
const range = rangeParser(10000, args.headers.range)
207+
const { start, end } = range[0]
208+
const len = end - start + 1
209+
const buf = await file.read(len, start)
210+
const stat = await file.stat()
211+
212+
return createResponse(buf, 206, {
213+
'content-range': `${start}-${end}/${stat.size}`,
214+
})
215+
},
216+
)
195217

196218
const f = new RemoteFile('http://fakehost/test.txt', { fetch: mockFetch })
197219
const stat = await f.stat()

tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"types": ["node"],
55
"lib": ["dom", "esnext"],
66
"target": "es2020",
7-
"moduleResolution": "node",
7+
"moduleResolution": "nodenext",
8+
"module": "nodenext",
89
"sourceMap": true,
910
"outDir": "./dist",
1011
"strict": true,

yarn.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2692,7 +2692,7 @@ typescript-eslint@^8.18.0:
26922692
"@typescript-eslint/typescript-estree" "8.50.1"
26932693
"@typescript-eslint/utils" "8.50.1"
26942694

2695-
typescript@^5.7.0:
2695+
typescript@^5.9.3:
26962696
version "5.9.3"
26972697
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f"
26982698
integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==

0 commit comments

Comments
 (0)