Skip to content

Commit c3138bc

Browse files
committed
fix: resolve lint warnings
1 parent ac5eb1a commit c3138bc

File tree

11 files changed

+121
-57
lines changed

11 files changed

+121
-57
lines changed

packages/rslint/src/browser.ts

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,26 @@ import type {
1111
IpcMessage,
1212
} from './types.js';
1313

14+
function isIpcMessage(value: unknown): value is IpcMessage {
15+
return (
16+
typeof value === 'object' &&
17+
value !== null &&
18+
'id' in value &&
19+
'kind' in value &&
20+
'data' in value
21+
);
22+
}
23+
24+
function getErrorMessage(data: unknown): string {
25+
if (typeof data === 'object' && data !== null && 'message' in data) {
26+
const record = data as Record<string, unknown>;
27+
if (typeof record.message === 'string') {
28+
return record.message;
29+
}
30+
}
31+
return String(data);
32+
}
33+
1434
/**
1535
* Browser implementation of RslintService using web workers
1636
*/
@@ -39,18 +59,18 @@ export class BrowserRslintService implements RslintServiceInterface {
3959
/**
4060
* Initialize the web worker
4161
*/
42-
private async ensureWorker(wasmUrl: string): Promise<Worker> {
62+
private ensureWorker(wasmUrl: string): void {
4363
if (!this.worker) {
4464
this.worker = new Worker(this.workerUrl, { name: 'rslint-worker.js' });
4565

46-
this.worker.onmessage = event => {
66+
this.worker.onmessage = (event: MessageEvent<Uint8Array>) => {
4767
this.handlePacket(event.data);
4868
};
4969

50-
this.worker.onerror = error => {
70+
this.worker.onerror = (error: ErrorEvent) => {
5171
console.error('Worker error:', error);
5272
// Reject all pending messages
53-
for (const [id, pending] of this.pendingMessages) {
73+
for (const [, pending] of this.pendingMessages) {
5474
pending.reject(new Error(`Worker error: ${error.message}`));
5575
}
5676
this.pendingMessages.clear();
@@ -60,7 +80,6 @@ export class BrowserRslintService implements RslintServiceInterface {
6080
data: { version: '1.0.0', wasmURL: wasmUrl },
6181
});
6282
}
63-
return this.worker;
6483
}
6584

6685
/**
@@ -100,8 +119,12 @@ export class BrowserRslintService implements RslintServiceInterface {
100119

101120
// Handle the message
102121
try {
103-
const parsed: IpcMessage = JSON.parse(message);
104-
this.handleResponse(parsed);
122+
const parsed = JSON.parse(message) as unknown;
123+
if (isIpcMessage(parsed)) {
124+
this.handleResponse(parsed);
125+
} else {
126+
console.error('Invalid message format:', parsed);
127+
}
105128
} catch (err) {
106129
console.error('Error parsing message:', err);
107130
}
@@ -139,8 +162,8 @@ export class BrowserRslintService implements RslintServiceInterface {
139162
/**
140163
* Send a message to the worker
141164
*/
142-
async sendMessage(kind: string, data: any): Promise<any> {
143-
return new Promise((resolve, reject) => {
165+
async sendMessage(kind: string, data: unknown): Promise<unknown> {
166+
const result = await new Promise<unknown>((resolve, reject) => {
144167
const id = this.nextMessageId++;
145168
const message: IpcMessage = { id, kind, data };
146169

@@ -150,6 +173,7 @@ export class BrowserRslintService implements RslintServiceInterface {
150173
// Send message to worker
151174
this.worker!.postMessage(message);
152175
});
176+
return result;
153177
}
154178

155179
/**
@@ -163,7 +187,7 @@ export class BrowserRslintService implements RslintServiceInterface {
163187
this.pendingMessages.delete(id);
164188

165189
if (kind === 'error') {
166-
pending.reject(new Error(data.message));
190+
pending.reject(new Error(getErrorMessage(data)));
167191
} else {
168192
pending.resolve(data);
169193
}

packages/rslint/src/node.ts

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,26 @@ import type {
1111
IpcMessage,
1212
} from './types.js';
1313

14+
function isIpcMessage(value: unknown): value is IpcMessage {
15+
return (
16+
typeof value === 'object' &&
17+
value !== null &&
18+
'id' in value &&
19+
'kind' in value &&
20+
'data' in value
21+
);
22+
}
23+
24+
function getErrorMessage(data: unknown): string {
25+
if (typeof data === 'object' && data !== null && 'message' in data) {
26+
const record = data as Record<string, unknown>;
27+
if (typeof record.message === 'string') {
28+
return record.message;
29+
}
30+
}
31+
return String(data);
32+
}
33+
1434
/**
1535
* Node.js implementation of RslintService using child processes
1636
*/
@@ -38,7 +58,7 @@ export class NodeRslintService implements RslintServiceInterface {
3858
});
3959

4060
// Set up binary message reading
41-
this.process.stdout!.on('data', data => {
61+
this.process.stdout!.on('data', (data: Buffer) => {
4262
this.handleChunk(data);
4363
});
4464
this.chunks = [];
@@ -49,8 +69,8 @@ export class NodeRslintService implements RslintServiceInterface {
4969
/**
5070
* Send a message to the rslint process
5171
*/
52-
async sendMessage(kind: string, data: any): Promise<any> {
53-
return new Promise((resolve, reject) => {
72+
async sendMessage(kind: string, data: unknown): Promise<unknown> {
73+
const result = await new Promise<unknown>((resolve, reject) => {
5474
const id = this.nextMessageId++;
5575
const message: IpcMessage = { id, kind, data };
5676

@@ -67,6 +87,7 @@ export class NodeRslintService implements RslintServiceInterface {
6787
Buffer.concat([length, Buffer.from(json, 'utf8')]),
6888
);
6989
});
90+
return result;
7091
}
7192

7293
/**
@@ -100,8 +121,12 @@ export class NodeRslintService implements RslintServiceInterface {
100121

101122
// Handle the message
102123
try {
103-
const parsed: IpcMessage = JSON.parse(message);
104-
this.handleMessage(parsed);
124+
const parsed = JSON.parse(message) as unknown;
125+
if (isIpcMessage(parsed)) {
126+
this.handleMessage(parsed);
127+
} else {
128+
console.error('Invalid message format:', parsed);
129+
}
105130
} catch (err) {
106131
console.error('Error parsing message:', err);
107132
}
@@ -124,7 +149,7 @@ export class NodeRslintService implements RslintServiceInterface {
124149
this.pendingMessages.delete(id);
125150

126151
if (kind === 'error') {
127-
pending.reject(new Error(data.message));
152+
pending.reject(new Error(getErrorMessage(data)));
128153
} else {
129154
pending.resolve(data);
130155
}

packages/rslint/src/service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export class RSLintService {
6767
*/
6868
async close(): Promise<void> {
6969
return new Promise(resolve => {
70-
this.service.sendMessage('exit', {}).finally(() => {
70+
void this.service.sendMessage('exit', {}).finally(() => {
7171
this.service.terminate();
7272
resolve();
7373
});

packages/rslint/src/types.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export interface Diagnostic {
1818
filePath: string;
1919
range: Range;
2020
severity?: string;
21-
suggestions: any[];
21+
suggestions: unknown[];
2222
}
2323

2424
export interface LintResponse {
@@ -67,18 +67,18 @@ export interface RSlintOptions {
6767
}
6868

6969
export interface PendingMessage {
70-
resolve: (data: any) => void;
70+
resolve: (data: unknown) => void;
7171
reject: (error: Error) => void;
7272
}
7373

7474
export interface IpcMessage {
7575
id: number;
7676
kind: string;
77-
data: any;
77+
data: unknown;
7878
}
7979

8080
// Service interface that all implementations must follow
8181
export interface RslintServiceInterface {
82-
sendMessage(kind: string, data: any): Promise<any>;
82+
sendMessage(kind: string, data: unknown): Promise<unknown>;
8383
terminate(): void;
8484
}

packages/rslint/src/worker.ts

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
88
interface IpcMessage {
99
id: number;
1010
kind: string;
11-
data: any;
11+
data: unknown;
1212
}
1313

1414
// Global state for the worker
15-
let rslintProcess: any = null;
15+
let rslintProcess: unknown = null;
1616
let nextMessageId = 1;
1717
let pendingMessages = new Map<
1818
number,
19-
{ resolve: (data: any) => void; reject: (error: Error) => void }
19+
{ resolve: (data: unknown) => void; reject: (error: Error) => void }
2020
>();
2121

2222
/**
@@ -42,51 +42,58 @@ async function initializeRslint(): Promise<void> {
4242
/**
4343
* Send a message to the rslint process
4444
*/
45-
async function sendToRslint(kind: string, data: any): Promise<any> {
45+
function sendToRslint(kind: string, data: unknown): Promise<unknown> {
4646
if (!rslintProcess) {
47-
throw new Error('Rslint process not initialized');
47+
return Promise.reject(new Error('Rslint process not initialized'));
4848
}
4949

5050
// In a real implementation, this would call the appropriate method on the rslint process
5151
// For now, we'll simulate the response
5252

5353
switch (kind) {
5454
case 'handshake':
55-
return { version: '1.0.0', status: 'ok' };
55+
return Promise.resolve({ version: '1.0.0', status: 'ok' });
5656

57-
case 'lint':
57+
case 'lint': {
58+
const files = (data as { files?: unknown[] }).files;
5859
// Simulate linting response
59-
return {
60+
return Promise.resolve({
6061
diagnostics: [],
6162
errorCount: 0,
62-
fileCount: data.files?.length || 0,
63+
fileCount: files?.length || 0,
6364
ruleCount: 0,
6465
duration: '0ms',
65-
};
66+
});
67+
}
6668

67-
case 'applyFixes':
69+
case 'applyFixes': {
70+
const fixData = data as {
71+
fileContent: string;
72+
diagnostics?: unknown[];
73+
};
6874
// Simulate apply fixes response
69-
return {
70-
fixedContent: [data.fileContent],
75+
return Promise.resolve({
76+
fixedContent: [fixData.fileContent],
7177
wasFixed: false,
7278
appliedCount: 0,
73-
unappliedCount: data.diagnostics?.length || 0,
74-
};
79+
unappliedCount: fixData.diagnostics?.length || 0,
80+
});
81+
}
7582

7683
case 'exit':
7784
rslintProcess = null;
78-
return { status: 'ok' };
85+
return Promise.resolve({ status: 'ok' });
7986

8087
default:
81-
throw new Error(`Unknown message kind: ${kind}`);
88+
return Promise.reject(new Error(`Unknown message kind: ${kind}`));
8289
}
8390
}
8491

8592
/**
8693
* Handle messages from the main thread
8794
*/
88-
async function handleMessage(event: MessageEvent): Promise<void> {
89-
const { id, kind, data } = event.data as IpcMessage;
95+
async function handleMessage(event: MessageEvent<IpcMessage>): Promise<void> {
96+
const { id, kind, data } = event.data;
9097

9198
try {
9299
// Ensure rslint is initialized
@@ -135,7 +142,9 @@ function handleError(error: ErrorEvent): void {
135142
}
136143

137144
// Set up event listeners
138-
self.addEventListener('message', handleMessage);
145+
self.addEventListener('message', (event: MessageEvent<IpcMessage>) => {
146+
void handleMessage(event);
147+
});
139148
self.addEventListener('error', handleError);
140149

141150
// Initialize the worker

packages/utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable @typescript-eslint/no-explicit-any */
12
export const AST_NODE_TYPES: any = {};
23
export enum AST_TOKEN_TYPES {
34
Identifier,

packages/vscode-extension/__tests__/runTest.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ async function main() {
2525
}
2626
}
2727

28-
main();
28+
void main();

packages/vscode-extension/src/Extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export class Extension implements Disposable {
5656
this.logger.info('Rslint extension deactivating...');
5757

5858
const stopPromises = Array.from(this.rslintInstances.values()).map(
59-
instance => instance.stop(),
59+
async instance => instance.stop(),
6060
);
6161

6262
try {

packages/vscode-extension/src/Rslint.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
LanguageClientOptions,
1313
ServerOptions,
1414
State,
15+
StateChangeEvent,
1516
Trace,
1617
} from 'vscode-languageclient/node';
1718
import { Logger } from './logger';
@@ -138,7 +139,9 @@ export class Rslint implements Disposable {
138139
return this.client;
139140
}
140141

141-
public onDidChangeState(listener: (event: any) => void): Disposable {
142+
public onDidChangeState(
143+
listener: (event: StateChangeEvent) => void,
144+
): Disposable {
142145
if (!this.client) {
143146
throw new Error('Client is not initialized');
144147
}
@@ -223,8 +226,10 @@ export class Rslint implements Disposable {
223226

224227
try {
225228
this.logger.debug('Looking for Rslint binary in PnP mode');
226-
// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports
227-
const yarnPnpApi = require(yarnPnpFile.fsPath);
229+
// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports, @typescript-eslint/no-unsafe-type-assertion
230+
const yarnPnpApi = require(yarnPnpFile.fsPath) as {
231+
resolveRequest(request: string, issuer: string): string | null;
232+
};
228233

229234
const rslintCorePackage = yarnPnpApi.resolveRequest(
230235
'@rslint/core/package.json',
@@ -235,12 +240,14 @@ export class Rslint implements Disposable {
235240
continue;
236241
}
237242

238-
const rslintPlatformPkg = Uri.file(
239-
yarnPnpApi.resolveRequest(
240-
PLATFORM_BIN_REQUEST,
241-
rslintCorePackage,
242-
) as string,
243+
const platformPath = yarnPnpApi.resolveRequest(
244+
PLATFORM_BIN_REQUEST,
245+
rslintCorePackage,
243246
);
247+
if (!platformPath) {
248+
continue;
249+
}
250+
const rslintPlatformPkg = Uri.file(platformPath);
244251

245252
if (await fileExists(rslintPlatformPkg)) {
246253
this.logger.debug(

0 commit comments

Comments
 (0)