From e428728aaf6eb4c7c216b7e7e429c697a70db4ed Mon Sep 17 00:00:00 2001 From: ecmel Date: Sun, 28 Jan 2024 14:20:20 +0300 Subject: [PATCH] refactored auto validation --- README.md | 6 ------ package-lock.json | 34 ++++++++++++++++++++++------------ package.json | 28 ++++++++++++++-------------- src/extension.ts | 45 ++++++++++++++++++++++++++------------------- src/provider.ts | 18 +++++++----------- src/settings.ts | 25 ++++++++++++------------- 6 files changed, 81 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index bbda534..9703f1f 100644 --- a/README.md +++ b/README.md @@ -72,12 +72,6 @@ Configuration depends on your layout of the project but some samples are below: } ``` -```json -{ - "css.vaildOnSaveOrChange": "Always" -} -``` - ### Lit ```json diff --git a/package-lock.json b/package-lock.json index 495a563..d777116 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,11 +15,11 @@ "@rollup/plugin-typescript": "^11.1.6", "@types/line-column": "^1.0.2", "@types/mocha": "^10.0.6", - "@types/node": "^20.11.5", + "@types/node": "^20.11.9", "@types/sinon": "^17.0.3", "@types/vscode": "^1.75.0", - "@vscode/test-electron": "^2.3.8", - "@vscode/vsce": "^2.22.0", + "@vscode/test-electron": "^2.3.9", + "@vscode/vsce": "^2.23.0", "c8": "^9.1.0", "fast-glob": "^3.3.2", "line-column": "^1.0.2", @@ -519,9 +519,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", - "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", + "version": "20.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.9.tgz", + "integrity": "sha512-CQXNuMoS/VcoAMISe5pm4JnEd1Br5jildbQEToEMQvutmv+EaQr90ry9raiudgpyDuqFiV9e4rnjSfLNq12M5w==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -555,9 +555,9 @@ "dev": true }, "node_modules/@vscode/test-electron": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.8.tgz", - "integrity": "sha512-b4aZZsBKtMGdDljAsOPObnAi7+VWIaYl3ylCz1jTs+oV6BZ4TNHcVNC3xUn0azPeszBmwSBDQYfFESIaUQnrOg==", + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.9.tgz", + "integrity": "sha512-z3eiChaCQXMqBnk2aHHSEkobmC2VRalFQN0ApOAtydL172zXGxTwGrRtviT5HnUB+Q+G3vtEYFtuQkYqBzYgMA==", "dev": true, "dependencies": { "http-proxy-agent": "^4.0.1", @@ -570,15 +570,16 @@ } }, "node_modules/@vscode/vsce": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.22.0.tgz", - "integrity": "sha512-8df4uJiM3C6GZ2Sx/KilSKVxsetrTBBIUb3c0W4B1EWHcddioVs5mkyDKtMNP0khP/xBILVSzlXxhV+nm2rC9A==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.23.0.tgz", + "integrity": "sha512-Wf9yN8feZf4XmUW/erXyKQvCL577u72AQv4AI4Cwt5o5NyE49C5mpfw3pN78BJYYG3qnSIxwRo7JPvEurkQuNA==", "dev": true, "dependencies": { "azure-devops-node-api": "^11.0.1", "chalk": "^2.4.2", "cheerio": "^1.0.0-rc.9", "commander": "^6.2.1", + "find-yarn-workspace-root": "^2.0.0", "glob": "^7.0.6", "hosted-git-info": "^4.0.2", "jsonc-parser": "^3.2.0", @@ -1375,6 +1376,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "dependencies": { + "micromatch": "^4.0.2" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", diff --git a/package.json b/package.json index da3c5b0..e23e4ef 100644 --- a/package.json +++ b/package.json @@ -60,16 +60,16 @@ "description": "List of local or remote style sheets for suggestions.", "default": [] }, - "css.vaildOnSaveOrChange": { - "enum": [ - "Always", - "OnChange", - "OnSave", - "Never" - ], - "default": "Never", + "css.autoValidation": { + "type": "string", "scope": "resource", - "description": "Verify label class names when saving files." + "description": "When to validate class selectors.", + "default": "Never", + "enum": [ + "Never", + "Save", + "Always" + ] } } }, @@ -103,7 +103,7 @@ "pretest": "npm run build && npm run compile", "test": "node ./out/test/runTest.js", "coverage": "c8 -n out/src npm run test", - "update": "ncu -u -x prettier -x @types/vscode", + "update": "npx npm-check-updates -u -x prettier -x @types/vscode", "vscode:prepublish": "npm run build", "package": "vsce package", "publish": "vsce publish" @@ -118,11 +118,11 @@ "@rollup/plugin-typescript": "^11.1.6", "@types/line-column": "^1.0.2", "@types/mocha": "^10.0.6", - "@types/node": "^20.11.5", + "@types/node": "^20.11.9", "@types/sinon": "^17.0.3", "@types/vscode": "^1.75.0", - "@vscode/test-electron": "^2.3.8", - "@vscode/vsce": "^2.22.0", + "@vscode/test-electron": "^2.3.9", + "@vscode/vsce": "^2.23.0", "c8": "^9.1.0", "fast-glob": "^3.3.2", "line-column": "^1.0.2", @@ -134,4 +134,4 @@ "tslib": "^2.6.2", "typescript": "^5.3.3" } -} \ No newline at end of file +} diff --git a/src/extension.ts b/src/extension.ts index f943a9b..8450551 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -10,7 +10,11 @@ import { window, workspace, } from "vscode"; -import { getEnabledLanguages, getVaildOnSaveOrChange, VaildOnSaveOrChange } from "./settings"; +import { + AutoValidation, + getAutoValidation, + getEnabledLanguages, +} from "./settings"; import { Provider, clear, invalidate } from "./provider"; export function activate(context: ExtensionContext) { @@ -21,26 +25,29 @@ export function activate(context: ExtensionContext) { context.subscriptions.push( languages.registerCompletionItemProvider(enabledLanguages, provider), languages.registerDefinitionProvider(enabledLanguages, provider), - workspace.onDidSaveTextDocument((document) => { - const vaildOnSaveOrChange = getVaildOnSaveOrChange(); - if (vaildOnSaveOrChange == VaildOnSaveOrChange.Always || vaildOnSaveOrChange == VaildOnSaveOrChange.OnSave) { - commands.executeCommand("vscode-html-css.validate") - } else { - invalidate(document.uri.toString()) + workspace.onDidSaveTextDocument(async (document) => { + invalidate(document.uri.toString()); + if (enabledLanguages.includes(document.languageId)) { + const validation = getAutoValidation(document); + if (validation === AutoValidation.SAVE) { + validations.set(document.uri, await provider.validate(document)); + } } }), - workspace.onDidCloseTextDocument((document) => - validations.delete(document.uri) - ), - workspace.onDidChangeTextDocument((event) => { - const vaildOnSaveOrChange = getVaildOnSaveOrChange(); - if (vaildOnSaveOrChange == VaildOnSaveOrChange.Always || vaildOnSaveOrChange == VaildOnSaveOrChange.OnChange) { - commands.executeCommand("vscode-html-css.validate") - } else { - validations.delete(event.document.uri) + workspace.onDidChangeTextDocument(async (event) => { + const document = event.document; + if (enabledLanguages.includes(document.languageId)) { + const validation = getAutoValidation(document); + if (validation === AutoValidation.ALWAYS) { + validations.set(document.uri, await provider.validate(document)); + } else { + validations.delete(document.uri); + } } - } - ), + }), + workspace.onDidCloseTextDocument((document) => { + validations.delete(document.uri); + }), commands.registerCommand("vscode-html-css.validate", async () => { const editor = window.activeTextEditor; if (editor) { @@ -54,4 +61,4 @@ export function activate(context: ExtensionContext) { ); } -export function deactivate() { } +export function deactivate() {} diff --git a/src/provider.ts b/src/provider.ts index 87ea50d..3d8ef7a 100644 --- a/src/provider.ts +++ b/src/provider.ts @@ -28,7 +28,6 @@ import { } from "vscode"; import { getStyleSheets } from "./settings"; import { Style, StyleType, parse } from "./parser"; -import path from "path"; const start = new Position(0, 0); const cache = new Map(); @@ -109,14 +108,11 @@ export class Provider implements CompletionItemProvider, DefinitionProvider { const map = new Map(); const styles = await this.getStyles(document); - for (const [key, value] of styles) { + for (const value of styles.values()) { for (const style of value) { if (style.type === type) { const item = new CompletionItem( - { - label: style.selector, - description: path.basename(key) - }, + style.selector, style.type === StyleType.ID ? CompletionItemKind.Value : CompletionItemKind.Enum @@ -157,12 +153,12 @@ export class Provider implements CompletionItemProvider, DefinitionProvider { return new Promise((resolve, reject) => match && !token.isCancellationRequested ? resolve( - this.getCompletionItems( - document, - position, - match[1] === "id" ? StyleType.ID : StyleType.CLASS + this.getCompletionItems( + document, + position, + match[1] === "id" ? StyleType.ID : StyleType.CLASS + ) ) - ) : reject() ); } diff --git a/src/settings.ts b/src/settings.ts index c12d877..3c5a64a 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License */ -import { Uri, workspace } from "vscode"; +import { ConfigurationScope, workspace } from "vscode"; export function getEnabledLanguages(): string[] { return workspace @@ -11,21 +11,20 @@ export function getEnabledLanguages(): string[] { .get("enabledLanguages", ["html"]); } -export function getStyleSheets(uri: Uri): string[] { +export function getStyleSheets(scope: ConfigurationScope): string[] { return workspace - .getConfiguration("css", uri) + .getConfiguration("css", scope) .get("styleSheets", []); } -export function getVaildOnSaveOrChange(): VaildOnSaveOrChange { - return workspace - .getConfiguration("css") - .get("vaildOnSaveOrChange", VaildOnSaveOrChange.Never); +export const enum AutoValidation { + NEVER = "Never", + SAVE = "Save", + ALWAYS = "Always", } -export enum VaildOnSaveOrChange { - Always = "Always", - OnChange = "OnChange", - OnSave = "OnSave", - Never = "Never" -} \ No newline at end of file +export function getAutoValidation(scope: ConfigurationScope): AutoValidation { + return workspace + .getConfiguration("css", scope) + .get("autoValidation", AutoValidation.NEVER); +}