Skip to content

Commit 25728c2

Browse files
chore(website): show tsconfig parsing errors in tab (typescript-eslint#10991)
* WIP * feat: add tsconfig error * fix: remove console.log & not use code * fix: fix code review --------- Co-authored-by: Kirk Waiblinger <53019676+kirkwaiblinger@users.noreply.github.com>
1 parent c81ba15 commit 25728c2

File tree

7 files changed

+75
-11
lines changed

7 files changed

+75
-11
lines changed

packages/website/src/components/ErrorsViewer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ function ErrorBlock({
8686
</FixButton>
8787
)}
8888
</div>
89-
{item.suggestions.length > 0 && (
89+
{item.suggestions && item.suggestions.length > 0 && (
9090
<div>
9191
{item.suggestions.map((fixer, index) => (
9292
<div

packages/website/src/components/Playground.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@ function Playground(): React.JSX.Element {
3333
const windowSize = useWindowSize();
3434
const [state, setState] = useHashState(defaultConfig);
3535
const [astModel, setAstModel] = useState<UpdateModel>();
36-
const [markers, setMarkers] = useState<ErrorGroup[]>();
36+
const [markers, setMarkers] = useState<Record<TabType, ErrorGroup[]>>({
37+
code: [],
38+
eslintrc: [],
39+
tsconfig: [],
40+
});
3741
const [ruleNames, setRuleNames] = useState<RuleDetails[]>([]);
3842
const [isLoading, setIsLoading] = useState(true);
3943
const [tsVersions, setTSVersion] = useState<readonly string[]>([]);
@@ -165,8 +169,10 @@ function Playground(): React.JSX.Element {
165169
active={state.showAST ?? false}
166170
additionalTabsInfo={{
167171
Errors:
168-
markers?.reduce((prev, cur) => prev + cur.items.length, 0) ||
169-
0,
172+
markers[activeTab].reduce(
173+
(prev, cur) => prev + cur.items.length,
174+
0,
175+
) || 0,
170176
}}
171177
change={showAST => setState({ showAST })}
172178
tabs={detailTabs}
@@ -216,7 +222,7 @@ function Playground(): React.JSX.Element {
216222
/>
217223
)
218224
) : (
219-
<ErrorsViewer value={markers} />
225+
<ErrorsViewer value={markers[activeTab]} />
220226
)}
221227
</div>
222228
</Panel>

packages/website/src/components/editor/LoadedEditor.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,23 @@ export const LoadedEditor: React.FC<LoadedEditorProps> = ({
8383
const markers = monaco.editor.getModelMarkers({
8484
resource: model.uri,
8585
});
86-
onMarkersChange(parseMarkers(markers, codeActions, editor));
87-
}, [codeActions, onMarkersChange, editor, monaco.editor]);
86+
87+
const errors = parseMarkers(markers, codeActions, editor);
88+
89+
onMarkersChange(prev => {
90+
const tsconfigErrors =
91+
activeTab === 'tsconfig' &&
92+
!errors.length &&
93+
Object.values(prev[activeTab]).filter(
94+
error => error.group === 'TypeScript',
95+
);
96+
97+
return {
98+
...prev,
99+
[activeTab]: tsconfigErrors || errors,
100+
};
101+
});
102+
}, [activeTab, codeActions, onMarkersChange, editor, monaco.editor]);
88103

89104
useEffect(() => {
90105
webLinter.updateParserOptions(sourceType);

packages/website/src/components/editor/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ export interface CommonEditorProps extends ConfigModel {
55
readonly activeTab: TabType;
66
readonly onASTChange: (value: UpdateModel | undefined) => void;
77
readonly onChange: (cfg: Partial<ConfigModel>) => void;
8-
readonly onMarkersChange: (value: ErrorGroup[]) => void;
8+
readonly onMarkersChange: React.Dispatch<
9+
React.SetStateAction<Record<TabType, ErrorGroup[]>>
10+
>;
911
readonly onSelect: (position?: number) => void;
1012
readonly selectedRange?: SelectedRange;
1113
}

packages/website/src/components/editor/useSandboxServices.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ export const useSandboxServices = (
119119
system,
120120
lintUtils,
121121
sandboxInstance.tsvfs,
122+
props.onMarkersChange,
122123
);
123124
onModelCreate.register(webLinter.registerFile);
124125

packages/website/src/components/linter/createLinter.ts

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import type {
77
} from '@typescript-eslint/utils/ts-eslint';
88
import type * as ts from 'typescript';
99

10+
import type {
11+
ErrorGroup,
12+
TabType,
13+
} from '../../../../website/src/components/types';
1014
import type {
1115
LinterOnLint,
1216
LinterOnParse,
@@ -44,6 +48,9 @@ export function createLinter(
4448
system: PlaygroundSystem,
4549
webLinterModule: WebLinterModule,
4650
vfs: typeof tsvfs,
51+
onMarkersChange: React.Dispatch<
52+
React.SetStateAction<Record<TabType, ErrorGroup[]>>
53+
>,
4754
): CreateLinter {
4855
const rules: CreateLinter['rules'] = new Map();
4956
const configs = new Map(Object.entries(webLinterModule.configs));
@@ -155,14 +162,47 @@ export function createLinter(
155162
};
156163

157164
const applyTSConfig = (fileName: string): void => {
165+
let error: ErrorGroup | null = null;
166+
158167
try {
159168
const file = system.readFile(fileName) ?? '{}';
160169
const parsed = parseTSConfig(file).compilerOptions;
161170
compilerOptions = createCompilerOptions(parsed);
162171
console.log('[Editor] Updating', fileName, compilerOptions);
163172
parser.updateConfig(compilerOptions);
164173
} catch (e) {
165-
console.error(e);
174+
if (e instanceof Error) {
175+
error = {
176+
group: 'TypeScript',
177+
items: e.message
178+
.trim()
179+
.split('\n')
180+
.map((message: string) => {
181+
return {
182+
message,
183+
severity: 8, // MarkerSeverity.Error
184+
};
185+
}),
186+
uri: undefined,
187+
};
188+
}
189+
} finally {
190+
onMarkersChange(prev => {
191+
const activeTabErrors = Object.fromEntries(
192+
prev.tsconfig.map(error => [error.group, error]),
193+
);
194+
195+
if (error) {
196+
activeTabErrors.TypeScript = error;
197+
} else {
198+
delete activeTabErrors.TypeScript;
199+
}
200+
201+
return {
202+
...prev,
203+
tsconfig: Object.values(activeTabErrors),
204+
};
205+
});
166206
}
167207
};
168208

packages/website/src/components/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ export type SelectedRange = [number, number];
4040

4141
export interface ErrorItem {
4242
fixer?: { fix(): void; message: string };
43-
location: string;
43+
location?: string;
4444
message: string;
4545
severity: number;
46-
suggestions: { fix(): void; message: string }[];
46+
suggestions?: { fix(): void; message: string }[];
4747
}
4848

4949
export interface ErrorGroup {

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy