Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
strategy:
fail-fast: false
matrix:
node: [18]
node: [20]
os: [ubuntu-latest]

steps:
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,7 @@ node_modules
.DS_Store
*.vsix
*.zip

# TypeScript build info files
.tsbuildinfo
*/.tsbuildinfo
51 changes: 35 additions & 16 deletions htmlhint-server/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ interface Settings {
[key: string]: any;
}

let settings: Settings = null;
let settings: Settings | null = null;
let linter: any = null;

/**
Expand All @@ -34,6 +34,20 @@ let htmlhintrcOptions: any = {};
*/
function getRange(error: htmlhint.Error, lines: string[]): any {
let line = lines[error.line - 1];
if (!line) {
// Fallback if line doesn't exist
return {
start: {
line: error.line - 1,
character: error.col - 1,
},
end: {
line: error.line - 1,
character: error.col - 1,
},
};
}

let isWhitespace = false;
let curr = error.col;
while (curr < line.length && !isWhitespace) {
Expand Down Expand Up @@ -84,7 +98,7 @@ function makeDiagnostic(
*/
function getConfiguration(filePath: string): any {
let options: any;
if (settings.htmlhint) {
if (settings?.htmlhint) {
if (
settings.htmlhint.configFile &&
settings.htmlhint.options &&
Expand Down Expand Up @@ -159,7 +173,7 @@ function findConfigForHtmlFile(base: string) {
/**
* Given a path to a .htmlhintrc file, load it into a javascript object and return it.
*/
function loadConfigurationFile(configFile): any {
function loadConfigurationFile(configFile: string): any {
let ruleset: any = null;
if (fs.existsSync(configFile)) {
let config = fs.readFileSync(configFile, "utf8");
Expand All @@ -170,16 +184,23 @@ function loadConfigurationFile(configFile): any {
return ruleset;
}

function getErrorMessage(err: any, document: server.TextDocument): string {
let result: string = null;
if (typeof err.message === "string" || err.message instanceof String) {
result = <string>err.message;
} else {
result = `An unknown error occurred while validating file: ${server.Files.uriToFilePath(
document.uri,
)}`;
function isErrorWithMessage(err: unknown): err is { message: string } {
return (
typeof err === "object" &&
err !== null &&
"message" in err &&
typeof (err as Record<string, unknown>).message === "string"
);
}

function getErrorMessage(err: unknown, document: server.TextDocument): string {
if (isErrorWithMessage(err)) {
return err.message;
}
return result;

return `An unknown error occurred while validating file: ${server.Files.uriToFilePath(
document.uri,
)}`;
}

function validateAllTextDocuments(
Expand Down Expand Up @@ -284,10 +305,8 @@ function doValidate(
}
connection.sendDiagnostics({ uri, diagnostics });
} catch (err) {
let message: string = null;
if (typeof err.message === "string" || err.message instanceof String) {
message = <string>err.message;
throw new Error(message);
if (isErrorWithMessage(err)) {
throw new Error(err.message);
}
throw err;
}
Expand Down
36 changes: 30 additions & 6 deletions htmlhint-server/src/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,37 @@
{
"compilerOptions": {
"forceConsistentCasingInFileNames": true,
"target": "es6",
"module": "commonjs",
"target": "ES2022",
"lib": ["ES2022"],
"moduleResolution": "node",
"skipLibCheck": true,
"sourceMap": true,
"outDir": "../../htmlhint/server",
"lib": ["es6"]
"sourceMap": true,
"declaration": true,
"declarationMap": true,
"strict": true,
"noImplicitAny": false,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitOverride": true,
"strictNullChecks": false,
"strictFunctionTypes": true,
"strictBindCallApply": true,
"strictPropertyInitialization": false,
"alwaysStrict": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"exactOptionalPropertyTypes": false,
"noFallthroughCasesInSwitch": true,
"noUncheckedIndexedAccess": false,
"noPropertyAccessFromIndexSignature": false,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"resolveJsonModule": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
"incremental": true,
"tsBuildInfoFile": ".tsbuildinfo"
},
"exclude": ["node_modules"]
"include": ["**/*.ts"],
"exclude": ["node_modules", "**/*.test.ts", "**/*.spec.ts"]
}
2 changes: 1 addition & 1 deletion htmlhint/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export function activate(context: ExtensionContext) {

// Get file types to lint from user settings
let config = workspace.getConfiguration("htmlhint");
let languages: string[] = config.get("documentSelector");
let languages: string[] = config.get("documentSelector") || ["html", "htm"];
let documentSelector = languages.map((language) => ({
language,
scheme: "file",
Expand Down
35 changes: 30 additions & 5 deletions htmlhint/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,37 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"target": "ES2022",
"lib": ["ES2022", "DOM"],
"moduleResolution": "node",
"outDir": "out",
"lib": ["es6", "dom"],
"skipLibCheck": true,
"sourceMap": true,
"forceConsistentCasingInFileNames": true
"declaration": true,
"declarationMap": true,
"strict": true,
"noImplicitAny": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitOverride": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictBindCallApply": true,
"strictPropertyInitialization": true,
"alwaysStrict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"exactOptionalPropertyTypes": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedIndexedAccess": true,
"noPropertyAccessFromIndexSignature": false,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"resolveJsonModule": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
"incremental": true,
"tsBuildInfoFile": ".tsbuildinfo"
},
"exclude": ["node_modules", "server"]
"include": ["extension.ts", "**/*.ts"],
"exclude": ["node_modules", "server", "out", "**/*.test.ts", "**/*.spec.ts"]
}
29 changes: 23 additions & 6 deletions test/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,30 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"target": "ES2022",
"lib": ["ES2022", "DOM"],
"moduleResolution": "node",
"outDir": "out",
"lib": ["es6", "dom"],
"types": ["node", "mocha"],
"sourceMap": true,
"strict": true,
"noImplicitAny": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictBindCallApply": true,
"alwaysStrict": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"noFallthroughCasesInSwitch": true,
"noUncheckedIndexedAccess": false,
"esModuleInterop": true,
"skipLibCheck": true,
"sourceMap": true
"allowSyntheticDefaultImports": true,
"resolveJsonModule": true,
"forceConsistentCasingInFileNames": true,
"types": ["node", "mocha"],
"skipLibCheck": true
},
"include": ["suite/**/*.ts", "runTest.ts"]
"include": ["suite/**/*.ts", "runTest.ts"],
"exclude": ["node_modules"]
}