⬅️ Back to Table of Contents
📄 utils.ts
📊 Analysis Summary
Metric |
Count |
🔧 Functions |
7 |
📦 Imports |
3 |
📊 Variables & Constants |
6 |
📐 Interfaces |
1 |
📚 Table of Contents
🛠️ File Location:
📂 packages/website/src/components/linter/utils.ts
📦 Imports
Name |
Source |
TSESLint |
@typescript-eslint/utils |
Monaco |
monaco-editor |
ErrorGroup |
../types |
Variables & Constants
Name |
Type |
Kind |
Value |
Exported |
result |
Record<string, ErrorGroup> |
const |
{} |
✗ |
fixers |
{ fix(): void; isPreferred: boolean; message: string; }[] |
const |
`fixes.get(uri)?.map(item => ({ |
|
fix(): void { |
|
|
|
|
const model = editor.getModel(); |
|
|
|
|
if (model) { |
|
|
|
|
editor.executeEdits('eslint', [createEditOperation(model, item)]); |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
isPreferred: item.isPreferred, |
|
|
|
|
message: item.message, |
|
|
|
|
})) ?? []` |
✗ |
|
|
|
group |
any |
const |
`marker.owner === 'eslint' |
|
? code.value |
|
|
|
|
: marker.owner === 'typescript' |
|
|
|
|
? 'TypeScript' |
|
|
|
|
: marker.owner` |
✗ |
|
|
|
markers |
Monaco.editor.IMarkerData[] |
const |
[] |
✗ |
marker |
Monaco.editor.IMarkerData |
const |
`{ |
|
code: message.ruleId |
|
|
|
|
? { |
|
|
|
|
target: ruleUri(message.ruleId), |
|
|
|
|
value: message.ruleId, |
|
|
|
|
} |
|
|
|
|
: 'Internal error', |
|
|
|
|
endColumn, |
|
|
|
|
endLineNumber, |
|
|
|
|
message: message.message, |
|
|
|
|
severity: |
|
|
|
|
message.severity === 2 |
|
|
|
|
? 8 // MarkerSeverity.Error |
|
|
|
|
: 4, // MarkerSeverity.Warning |
|
|
|
|
source: 'ESLint', |
|
|
|
|
startColumn, |
|
|
|
|
startLineNumber, |
|
|
|
|
}` |
✗ |
|
|
|
fixes |
LintCodeAction[] |
const |
[] |
✗ |
Functions
ensurePositiveInt(value: number | undefined, defaultValue: number): number
Code
export function ensurePositiveInt(
value: number | undefined,
defaultValue: number,
): number {
return Math.max(1, (value ?? defaultValue) | 0);
}
- Parameters:
value: number | undefined
defaultValue: number
- Return Type:
number
- Calls:
Math.max
createURI(marker: Monaco.editor.IMarkerData): string
Code
export function createURI(marker: Monaco.editor.IMarkerData): string {
return `[${[
marker.startLineNumber,
marker.startColumn,
marker.startColumn,
marker.endLineNumber,
marker.endColumn,
(typeof marker.code === 'string' ? marker.code : marker.code?.value) ?? '',
].join('|')}]`;
}
- Parameters:
marker: Monaco.editor.IMarkerData
- Return Type:
string
- Calls:
[
marker.startLineNumber,
marker.startColumn,
marker.startColumn,
marker.endLineNumber,
marker.endColumn,
(typeof marker.code === 'string' ? marker.code : marker.code?.value) ?? '',
].join
createEditOperation(model: Monaco.editor.ITextModel, action: LintCodeAction): { range: Monaco.IRange; text: string }
Code
export function createEditOperation(
model: Monaco.editor.ITextModel,
action: LintCodeAction,
): { range: Monaco.IRange; text: string } {
const start = model.getPositionAt(action.fix.range[0]);
const end = model.getPositionAt(action.fix.range[1]);
return {
range: {
endColumn: end.column,
endLineNumber: end.lineNumber,
startColumn: start.column,
startLineNumber: start.lineNumber,
},
text: action.fix.text,
};
}
- Parameters:
model: Monaco.editor.ITextModel
action: LintCodeAction
- Return Type:
{ range: Monaco.IRange; text: string }
- Calls:
model.getPositionAt
`normalizeCode(code: Monaco.editor.IMarker['code']): {
target?: string;
value: string;
}`
Code
function normalizeCode(code: Monaco.editor.IMarker['code']): {
target?: string;
value: string;
} {
if (!code) {
return { value: '' };
}
if (typeof code === 'string') {
return { value: code };
}
return {
target: code.target.toString(),
value: code.value,
};
}
- Parameters:
code: Monaco.editor.IMarker['code']
- Return Type:
{
target?: string;
value: string;
}
- Calls:
code.target.toString
parseMarkers(markers: Monaco.editor.IMarker[], fixes: Map<string, LintCodeAction[]>, editor: Monaco.editor.IStandaloneCodeEditor): ErrorGroup[]
Code
export function parseMarkers(
markers: Monaco.editor.IMarker[],
fixes: Map<string, LintCodeAction[]>,
editor: Monaco.editor.IStandaloneCodeEditor,
): ErrorGroup[] {
const result: Record<string, ErrorGroup> = {};
for (const marker of markers) {
const code = normalizeCode(marker.code);
const uri = createURI(marker);
const fixers =
fixes.get(uri)?.map(item => ({
fix(): void {
const model = editor.getModel();
if (model) {
editor.executeEdits('eslint', [createEditOperation(model, item)]);
}
},
isPreferred: item.isPreferred,
message: item.message,
})) ?? [];
const group =
marker.owner === 'eslint'
? code.value
: marker.owner === 'typescript'
? 'TypeScript'
: marker.owner;
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
result[group] ||= {
group,
items: [],
uri: code.target,
};
result[group].items.push({
fixer: fixers.find(item => item.isPreferred),
location: `${marker.startLineNumber}:${marker.startColumn} - ${marker.endLineNumber}:${marker.endColumn}`,
message:
(marker.owner !== 'eslint' && marker.owner !== 'json' && code.value
? `${code.value}: `
: '') + marker.message,
severity: marker.severity,
suggestions: fixers.filter(item => !item.isPreferred),
});
}
return Object.values(result).sort((a, b) => a.group.localeCompare(b.group));
}
- Parameters:
markers: Monaco.editor.IMarker[]
fixes: Map<string, LintCodeAction[]>
editor: Monaco.editor.IStandaloneCodeEditor
- Return Type:
ErrorGroup[]
- Calls:
normalizeCode
createURI
fixes.get(uri)?.map
editor.getModel
editor.executeEdits
createEditOperation
result[group].items.push
fixers.find
fixers.filter
Object.values(result).sort
a.group.localeCompare
- Internal Comments:
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition (x4)
parseLintResults(messages: TSESLint.Linter.LintMessage[], codeActions: Map<string, LintCodeAction[]>, ruleUri: (ruleId: string) => Monaco.Uri): Monaco.editor.IMarkerData[]
Code
export function parseLintResults(
messages: TSESLint.Linter.LintMessage[],
codeActions: Map<string, LintCodeAction[]>,
ruleUri: (ruleId: string) => Monaco.Uri,
): Monaco.editor.IMarkerData[] {
const markers: Monaco.editor.IMarkerData[] = [];
codeActions.clear();
for (const message of messages) {
const startLineNumber = ensurePositiveInt(message.line, 1);
const startColumn = ensurePositiveInt(message.column, 1);
const endLineNumber = ensurePositiveInt(message.endLine, startLineNumber);
const endColumn = ensurePositiveInt(message.endColumn, startColumn + 1);
const marker: Monaco.editor.IMarkerData = {
code: message.ruleId
? {
target: ruleUri(message.ruleId),
value: message.ruleId,
}
: 'Internal error',
endColumn,
endLineNumber,
message: message.message,
severity:
message.severity === 2
? 8 // MarkerSeverity.Error
: 4, // MarkerSeverity.Warning
source: 'ESLint',
startColumn,
startLineNumber,
};
const markerUri = createURI(marker);
const fixes: LintCodeAction[] = [];
if (message.fix) {
fixes.push({
fix: message.fix,
isPreferred: true,
message: `Fix this ${message.ruleId ?? 'unknown'} problem`,
});
}
if (message.suggestions) {
for (const suggestion of message.suggestions) {
fixes.push({
code: message.ruleId,
fix: suggestion.fix,
isPreferred: false,
message: suggestion.desc,
});
}
}
if (fixes.length > 0) {
codeActions.set(markerUri, fixes);
}
markers.push(marker);
}
return markers;
}
- Parameters:
messages: TSESLint.Linter.LintMessage[]
codeActions: Map<string, LintCodeAction[]>
ruleUri: (ruleId: string) => Monaco.Uri
- Return Type:
Monaco.editor.IMarkerData[]
- Calls:
codeActions.clear
ensurePositiveInt
ruleUri
createURI
fixes.push
codeActions.set
markers.push
getPathRegExp(path: string): RegExp
Code
export function getPathRegExp(path: string): RegExp {
const escapedPath = path.replaceAll('.', '\\.').replaceAll('*', '[^/]+');
return new RegExp(`^${escapedPath}$`, '');
}
- Parameters:
path: string
- Return Type:
RegExp
- Calls:
path.replaceAll('.', '\\.').replaceAll
Interfaces
LintCodeAction
Interface Code
export interface LintCodeAction {
code?: string | null;
fix: {
range: Readonly<[number, number]>;
text: string;
};
isPreferred: boolean;
message: string;
}
Properties
Name |
Type |
Optional |
Description |
code |
string | null |
✓ |
|
fix |
`{ |
|
|
range: Readonly<[number, number]>; |
|
|
|
text: string; |
|
|
|
}` |
✗ |
|
|
isPreferred |
boolean |
✗ |
|
message |
string |
✗ |
|