Skip to content

Commit 5c1f9a1

Browse files
authored
refactor: Use standard dispose (#8559)
1 parent 42842bf commit 5c1f9a1

File tree

9 files changed

+45
-28
lines changed

9 files changed

+45
-28
lines changed

packages/cspell-io/src/VirtualFS/CVirtualFS.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { urlOrReferenceToUrl } from '../common/index.js';
22
import type { CSpellIO } from '../CSpellIO.js';
33
import { getDefaultCSpellIO } from '../CSpellIONode.js';
4-
import type { Disposable } from '../models/index.js';
4+
import type { DisposableEx } from '../models/index.js';
55
import type { LogEvent } from '../models/LogEvent.js';
66
import { CSPELL_VFS_PROTOCOL } from './constants.js';
77
import { CVFileSystem } from './CVFileSystem.js';
@@ -45,20 +45,19 @@ class CVirtualFS implements VirtualFS {
4545
}
4646
};
4747

48-
registerFileSystemProvider(...providers: VFileSystemProvider[]): Disposable {
48+
registerFileSystemProvider(...providers: VFileSystemProvider[]): DisposableEx {
4949
providers.forEach((provider) => this.providers.add(provider));
5050
this.reset();
51-
return {
52-
dispose: () => {
53-
for (const provider of providers) {
54-
for (const key of this.revCacheFs.get(provider) || []) {
55-
this.cachedFs.delete(key);
56-
}
57-
this.providers.delete(provider) && undefined;
51+
const dispose = () => {
52+
for (const provider of providers) {
53+
for (const key of this.revCacheFs.get(provider) || []) {
54+
this.cachedFs.delete(key);
5855
}
59-
this.reset();
60-
},
56+
this.providers.delete(provider) && undefined;
57+
}
58+
this.reset();
6159
};
60+
return { dispose, [Symbol.dispose]: dispose };
6261
}
6362

6463
getFS(url: URL): VFileSystem {
@@ -131,6 +130,10 @@ class CVirtualFS implements VirtualFS {
131130
}
132131
}
133132
}
133+
134+
[Symbol.dispose](): void {
135+
this.dispose();
136+
}
134137
}
135138

136139
function fsPassThroughCore(fs: (url: URL) => WrappedProviderFs): Required<VFileSystemCore> {

packages/cspell-io/src/VirtualFS/MemVfsProvider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { urlOrReferenceToUrl } from '../common/index.js';
2-
import type { Disposable } from '../models/index.js';
2+
import type { DisposableEx } from '../models/index.js';
33
import { type FileReference, type FileResource, FileType, type Stats } from '../models/index.js';
44
import { VFSNotFoundError, VFSNotSupported } from './errors.js';
55
import type { FileSystemProviderInfo, UrlOrReference, VfsDirEntry } from './VFileSystem.js';
66
import { FSCapabilityFlags } from './VFileSystem.js';
77
import type { VFileSystemProvider, VProviderFileSystem, VProviderFileSystemReadFileOptions } from './VirtualFS.js';
88

9-
export class MemFileSystemProvider implements VFileSystemProvider, Disposable {
9+
export class MemFileSystemProvider implements VFileSystemProvider, DisposableEx {
1010
readonly name: string;
1111
readonly protocol: string;
1212
#vfs: MemVFileSystem;

packages/cspell-io/src/VirtualFS/VirtualFS.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { DirEntry, Disposable, FileReference, FileResource, Stats } from '../models/index.js';
1+
import type { DirEntry, DisposableEx, FileReference, FileResource, Stats } from '../models/index.js';
22
import type {
33
FileSystemProviderInfo,
44
FSCapabilities,
@@ -12,8 +12,8 @@ export type NextProvider = (url: URL) => VProviderFileSystem | undefined;
1212

1313
export const debug = false;
1414

15-
export interface VirtualFS extends Disposable {
16-
registerFileSystemProvider(provider: VFileSystemProvider, ...providers: VFileSystemProvider[]): Disposable;
15+
export interface VirtualFS extends DisposableEx {
16+
registerFileSystemProvider(provider: VFileSystemProvider, ...providers: VFileSystemProvider[]): DisposableEx;
1717
/**
1818
* Get the fs for a given url.
1919
*/
@@ -50,7 +50,7 @@ export type VProviderFileSystemReadFileOptions = OptionAbort;
5050

5151
export type VProviderFileSystemReadDirectoryOptions = OptionAbort;
5252

53-
export interface VProviderFileSystem extends Disposable {
53+
export interface VProviderFileSystem extends DisposableEx {
5454
readFile(url: UrlOrReference, options?: VProviderFileSystemReadFileOptions): Promise<FileResource>;
5555
writeFile(file: FileResource): Promise<FileReference>;
5656
/**
@@ -75,7 +75,7 @@ export interface VProviderFileSystem extends Disposable {
7575
getCapabilities?: (url: URL) => FSCapabilities;
7676
}
7777

78-
export interface VFileSystemProvider extends Partial<Disposable> {
78+
export interface VFileSystemProvider extends Partial<DisposableEx> {
7979
/** Name of the Provider */
8080
name: string;
8181
/**

packages/cspell-io/src/VirtualFS/VirtualFs.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ describe('VirtualFs', () => {
245245
const provider = mockFileSystemProvider();
246246
const mfs = mockFileSystem();
247247
vi.mocked(provider.getFileSystem).mockImplementation((_url) => mfs);
248-
const d = virtualFs.registerFileSystemProvider(provider);
248+
using _d = virtualFs.registerFileSystemProvider(provider);
249249
const mockedWriteFile = vi.mocked(mfs.writeFile);
250250
mockedWriteFile.mockImplementation((file) => Promise.resolve({ url: file.url }));
251251
const fs = virtualFs.fs;
@@ -255,7 +255,6 @@ describe('VirtualFs', () => {
255255
expect(mockedWriteFile).toHaveBeenLastCalledWith(file);
256256
expect(result).not.toBe(file);
257257
expect(result).toStrictEqual(oc({ url: file.url }));
258-
d.dispose();
259258
});
260259

261260
test('fsCapabilities', () => {
@@ -303,6 +302,7 @@ function mockFileSystem(): VProviderFileSystem {
303302
writeFile: vi.fn(),
304303
dispose: vi.fn(),
305304
getCapabilities: vi.fn(),
305+
[Symbol.dispose]: vi.fn(),
306306
};
307307
return p;
308308
}

packages/cspell-io/src/VirtualFS/WrappedProviderFs.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,19 @@ export function cspellIOToFsProvider(cspellIO: CSpellIO): VFileSystemProvider {
2828
};
2929
const name = 'CSpellIO';
3030
const supportedProtocols = new Set(['file:', 'http:', 'https:']);
31+
const dispose = () => undefined;
3132
const fs: VProviderFileSystem = {
3233
providerInfo: { name },
3334
stat: (url) => cspellIO.getStat(url),
3435
readFile: (url, options) => cspellIO.readFile(url, options),
3536
readDirectory: (url) => cspellIO.readDirectory(url),
3637
writeFile: (file) => cspellIO.writeFile(file.url, file.content),
37-
dispose: () => undefined,
38+
dispose,
3839
capabilities,
3940
getCapabilities(url) {
4041
return fsCapabilities(capMap[url.protocol] || FSCapabilityFlags.None);
4142
},
43+
[Symbol.dispose]: dispose,
4244
};
4345

4446
return {

packages/cspell-io/src/VirtualFS/redirectProvider.test.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,11 @@ describe('Validate RedirectProvider', () => {
3838
test('createRedirectProvider.fs.dispose', async () => {
3939
const mockFS = createMockFS();
4040
const provider = createRedirectProvider('test', new URL('file:///public/'), new URL('file:///private/'));
41-
const fs = provider.getFileSystem(new URL('file:///public/'), () => mockFS);
42-
assert(fs);
43-
expect(() => fs.dispose()).not.toThrow();
41+
{
42+
using fs = provider.getFileSystem(new URL('file:///public/'), () => mockFS);
43+
expect(fs?.dispose).toBeDefined();
44+
}
45+
expect(mockFS.dispose).toHaveBeenCalled();
4446
});
4547

4648
test.each`
@@ -190,13 +192,15 @@ function createVFS(publicURL: URL, pathnameOrURL: string | URL) {
190192
}
191193

192194
function createMockFS(): VProviderFileSystem {
195+
const dispose = vi.fn();
193196
return {
194197
capabilities: 0,
195198
providerInfo: { name: 'mock' },
196199
stat: vi.fn(() => Promise.reject(new VFSErrorUnsupportedRequest('stat'))),
197200
readFile: vi.fn(() => Promise.reject(new VFSErrorUnsupportedRequest('readFile'))),
198201
readDirectory: vi.fn(() => Promise.reject(new VFSErrorUnsupportedRequest('readDirectory'))),
199202
writeFile: vi.fn(() => Promise.reject(new VFSErrorUnsupportedRequest('writeFile'))),
200-
dispose: vi.fn(() => undefined),
203+
dispose,
204+
[Symbol.dispose]: dispose,
201205
};
202206
}

packages/cspell-io/src/VirtualFS/redirectProvider.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ function remapFS(
126126
return { ...de, dir };
127127
};
128128

129+
const dispose = () => fs.dispose();
130+
129131
const fs2: VProviderFileSystem = {
130132
stat: async (url) => {
131133
const url2 = mapUrlOrReferenceToPrivate(url);
@@ -151,7 +153,8 @@ function remapFS(
151153
},
152154
providerInfo: { ...fs.providerInfo, name },
153155
capabilities: capabilities ?? fs.capabilities & capabilitiesMask,
154-
dispose: () => fs.dispose(),
156+
dispose,
157+
[Symbol.dispose]: dispose,
155158
};
156159

157160
return fsPassThrough(fs2, shadowFs, publicRoot);
@@ -192,6 +195,9 @@ function fsPassThrough(
192195
fs.dispose();
193196
shadowFs?.dispose();
194197
},
198+
[Symbol.dispose]() {
199+
this.dispose();
200+
},
195201
};
196202
return passThroughFs;
197203
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
export interface Disposable {
1+
export type DisposableEx = LegacyDisposable & Disposable;
2+
3+
export interface LegacyDisposable {
24
dispose(): void;
35
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export type { BufferEncoding, TextEncoding } from './BufferEncoding.js';
2-
export type { Disposable } from './disposable.js';
2+
export type { DisposableEx } from './disposable.js';
33
export type { FileReference, FileResource, TextFileResource, UrlOrReference } from './FileResource.js';
44
export type { DirEntry, Stats } from './Stats.js';
55
export { FileType } from './Stats.js';

0 commit comments

Comments
 (0)