1
1
mirror of https://github.com/theoludwig/html-w3c-validator.git synced 2024-12-08 00:45:37 +01:00

Compare commits

...

4 Commits

Author SHA1 Message Date
fbe3830db7
feat: json $schema locally => ./node_modules/html-w3c-validator/schema/schema.json 2024-11-09 16:42:44 +01:00
58d392d320
chore: allow to publish pre-release beta version 2024-11-09 16:22:14 +01:00
e9a62072cf
chore: remove usage of git hooks (husky, lint-staged, commitlint) + usage of node --run 2024-11-09 16:10:02 +01:00
cc6a1278a1
fix: print correctly validation results
There was an error thrown by `table` library to print validation results
when there were 2 (or more) errors, with one error with line/column
and the other error without specified line/column.

Fixes #6
2024-11-09 15:45:31 +01:00
34 changed files with 2410 additions and 4573 deletions

View File

@ -1 +0,0 @@
{ "extends": ["@commitlint/config-conventional"] }

View File

@ -1,18 +1,17 @@
{ {
"root": true, "root": true,
"extends": ["conventions"], "extends": ["conventions"],
"plugins": ["import", "promise", "unicorn"], "plugins": ["promise", "unicorn"],
"rules": {
"import/extensions": ["error", "always"],
"unicorn/prevent-abbreviations": "error"
},
"overrides": [ "overrides": [
{ {
"files": ["*.ts", "*.tsx"], "files": ["*.ts", "*.tsx"],
"parser": "@typescript-eslint/parser", "parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"], "plugins": ["@typescript-eslint"],
"parserOptions": { "parserOptions": {
"project": "./tsconfig.json" "projectService": true
},
"rules": {
"@typescript-eslint/no-unnecessary-condition": "off"
} }
} }
] ]

View File

@ -6,8 +6,8 @@ labels: "bug"
--- ---
<!-- <!--
Please provide a clear and concise description of what the bug is. Include Please provide a clear and concise description of what the bug is.
screenshots if needed. Please make sure your issue has not already been fixed. Include screenshots if needed. Please make sure your issue has not already been fixed.
--> -->
## Steps To Reproduce ## Steps To Reproduce

View File

@ -4,16 +4,16 @@ on:
push: push:
branches: [develop] branches: [develop]
pull_request: pull_request:
branches: [master, develop] branches: [main, develop]
jobs: jobs:
build: build:
runs-on: "ubuntu-latest" runs-on: "ubuntu-latest"
steps: steps:
- uses: "actions/checkout@v4.1.6" - uses: "actions/checkout@v4.2.2"
- name: "Setup Node.js" - name: "Setup Node.js"
uses: "actions/setup-node@v4.0.2" uses: "actions/setup-node@v4.1.0"
with: with:
node-version: "lts/*" node-version: "lts/*"
cache: "npm" cache: "npm"
@ -22,6 +22,6 @@ jobs:
run: "npm clean-install" run: "npm clean-install"
- name: "Build" - name: "Build"
run: "npm run build" run: "node --run build"
- run: "npm run build:typescript" - run: "node --run build:typescript"

View File

@ -4,16 +4,16 @@ on:
push: push:
branches: [develop] branches: [develop]
pull_request: pull_request:
branches: [master, develop] branches: [main, develop]
jobs: jobs:
lint: lint:
runs-on: "ubuntu-latest" runs-on: "ubuntu-latest"
steps: steps:
- uses: "actions/checkout@v4.1.6" - uses: "actions/checkout@v4.2.2"
- name: "Setup Node.js" - name: "Setup Node.js"
uses: "actions/setup-node@v4.0.2" uses: "actions/setup-node@v4.1.0"
with: with:
node-version: "lts/*" node-version: "lts/*"
cache: "npm" cache: "npm"
@ -21,7 +21,6 @@ jobs:
- name: "Install dependencies" - name: "Install dependencies"
run: "npm clean-install" run: "npm clean-install"
- run: 'npm run lint:commit -- --to "${{ github.sha }}"' - run: "node --run lint:editorconfig"
- run: "npm run lint:editorconfig" - run: "node --run lint:eslint"
- run: "npm run lint:eslint" - run: "node --run lint:prettier"
- run: "npm run lint:prettier"

View File

@ -2,7 +2,7 @@ name: "Release"
on: on:
push: push:
branches: [master] branches: [main, beta]
jobs: jobs:
release: release:
@ -13,13 +13,13 @@ jobs:
pull-requests: "write" pull-requests: "write"
id-token: "write" id-token: "write"
steps: steps:
- uses: "actions/checkout@v4.1.6" - uses: "actions/checkout@v4.2.2"
with: with:
fetch-depth: 0 fetch-depth: 0
persist-credentials: false persist-credentials: false
- name: "Setup Node.js" - name: "Setup Node.js"
uses: "actions/setup-node@v4.0.2" uses: "actions/setup-node@v4.1.0"
with: with:
node-version: "lts/*" node-version: "lts/*"
cache: "npm" cache: "npm"
@ -28,15 +28,15 @@ jobs:
run: "npm clean-install" run: "npm clean-install"
- name: "Build" - name: "Build"
run: "npm run build" run: "node --run build"
- run: "npm run build:typescript" - run: "node --run build:typescript"
- name: "Verify the integrity of provenance attestations and registry signatures for installed dependencies" - name: "Verify the integrity of provenance attestations and registry signatures for installed dependencies"
run: "npm audit signatures" run: "npm audit signatures"
- name: "Release" - name: "Release"
run: "npm run release" run: "node --run release"
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@ -4,16 +4,16 @@ on:
push: push:
branches: [develop] branches: [develop]
pull_request: pull_request:
branches: [master, develop] branches: [main, develop]
jobs: jobs:
test: test:
runs-on: "ubuntu-latest" runs-on: "ubuntu-latest"
steps: steps:
- uses: "actions/checkout@v4.1.6" - uses: "actions/checkout@v4.2.2"
- name: "Setup Node.js" - name: "Setup Node.js"
uses: "actions/setup-node@v4.0.2" uses: "actions/setup-node@v4.1.0"
with: with:
node-version: "lts/*" node-version: "lts/*"
cache: "npm" cache: "npm"
@ -22,7 +22,7 @@ jobs:
run: "npm clean-install" run: "npm clean-install"
- name: "Build" - name: "Build"
run: "npm run build" run: "node --run build"
- name: "Test" - name: "Test"
run: "npm run test" run: "node --run test"

View File

@ -1,3 +0,0 @@
#!/usr/bin/env sh
npm run lint:commit -- --edit

View File

@ -1,4 +0,0 @@
#!/usr/bin/env sh
npm run lint:staged
npm run build:typescript

View File

@ -1,6 +0,0 @@
{
"**/*": ["editorconfig-checker", "prettier --write --ignore-unknown"],
"**/*.{js,jsx,ts,tsx}": [
"eslint --fix --max-warnings 0 --report-unused-disable-directives"
]
}

4
.npmrc
View File

@ -1,2 +1,2 @@
save-exact=true save-exact = true
provenance=true provenance = true

View File

@ -1,18 +1,8 @@
{ {
"branches": ["master"], "branches": ["main", { "name": "beta", "prerelease": true }],
"plugins": [ "plugins": [
[ "@semantic-release/commit-analyzer",
"@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator",
{
"preset": "conventionalcommits"
}
],
[
"@semantic-release/release-notes-generator",
{
"preset": "conventionalcommits"
}
],
"@semantic-release/npm", "@semantic-release/npm",
"@semantic-release/github" "@semantic-release/github"
] ]

View File

@ -1,8 +0,0 @@
{
"recommendations": [
"editorconfig.editorconfig",
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint",
"davidanson.vscode-markdownlint"
]
}

14
.vscode/settings.json vendored
View File

@ -1,14 +0,0 @@
{
"typescript.tsdk": "node_modules/typescript/lib",
"typescript.preferences.importModuleSpecifierEnding": "js",
"editor.defaultFormatter": "esbenp.prettier-vscode",
"prettier.configPath": ".prettierrc.json",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll": "explicit"
},
"eslint.options": {
"ignorePath": ".gitignore"
},
"prettier.ignorePath": ".gitignore"
}

View File

@ -66,7 +66,7 @@ npm install --save-dev html-w3c-validator start-server-and-test
```jsonc ```jsonc
{ {
"$schema": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/master/schema/html-w3c-validatorrc-schema.json", "$schema": "./node_modules/html-w3c-validator/schema/schema.json",
// URLs to validate. // URLs to validate.
"urls": ["http://127.0.0.1:3000/", "http://127.0.0.1:3000/about"], "urls": ["http://127.0.0.1:3000/", "http://127.0.0.1:3000/about"],
@ -82,7 +82,7 @@ npm install --save-dev html-w3c-validator start-server-and-test
## Usage ## Usage
```sh ```sh
npm run test:html-w3c-validator node --run test:html-w3c-validator
``` ```
Example of output (in case of success): Example of output (in case of success):

View File

@ -1,5 +1,5 @@
{ {
"$schema": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/develop/schema/html-w3c-validatorrc-schema.json", "$schema": "./node_modules/html-w3c-validator/schema/schema.json",
"urls": ["http://127.0.0.1:3000/", "http://127.0.0.1:3000/about"], "urls": ["http://127.0.0.1:3000/", "http://127.0.0.1:3000/about"],
"files": ["./build/index.html", "./build/about.html"] "files": ["./build/index.html", "./build/about.html"]
} }

View File

@ -7,20 +7,19 @@
"name": "example", "name": "example",
"devDependencies": { "devDependencies": {
"html-w3c-validator": "file:..", "html-w3c-validator": "file:..",
"serve": "14.2.3", "serve": "14.2.4",
"start-server-and-test": "2.0.3" "start-server-and-test": "2.0.8"
} }
}, },
"..": { "..": {
"version": "0.0.0-development", "version": "0.0.0-development",
"dev": true, "dev": true,
"hasInstallScript": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"chalk": "5.3.0", "chalk": "5.3.0",
"clipanion": "3.2.1", "clipanion": "3.2.1",
"log-symbols": "6.0.0", "log-symbols": "6.0.0",
"ora": "8.0.1", "ora": "8.1.1",
"read-pkg": "9.0.1", "read-pkg": "9.0.1",
"table": "6.8.2" "table": "6.8.2"
}, },
@ -28,30 +27,24 @@
"html-w3c-validator": "build/index.js" "html-w3c-validator": "build/index.js"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "19.2.2", "@swc/cli": "0.5.0",
"@commitlint/config-conventional": "19.2.2", "@swc/core": "1.9.1",
"@swc/cli": "0.3.12",
"@swc/core": "1.5.7",
"@tsconfig/strictest": "2.0.5", "@tsconfig/strictest": "2.0.5",
"@types/node": "20.12.12", "@types/node": "22.9.0",
"@types/sinon": "17.0.3", "@types/sinon": "17.0.3",
"@typescript-eslint/eslint-plugin": "7.10.0", "@typescript-eslint/eslint-plugin": "8.13.0",
"@typescript-eslint/parser": "7.10.0", "@typescript-eslint/parser": "8.13.0",
"editorconfig-checker": "5.1.5", "editorconfig-checker": "6.0.0",
"eslint": "8.57.0", "eslint": "8.57.1",
"eslint-config-conventions": "14.2.0", "eslint-config-conventions": "16.0.1",
"eslint-plugin-import": "2.29.1", "eslint-plugin-promise": "7.1.0",
"eslint-plugin-promise": "6.1.1", "eslint-plugin-unicorn": "55.0.0",
"eslint-plugin-unicorn": "53.0.0", "execa": "9.5.1",
"execa": "9.1.0", "prettier": "3.3.3",
"husky": "9.0.11",
"lint-staged": "15.2.4",
"pinst": "3.0.0",
"prettier": "3.2.5",
"semantic-release": "23.1.1", "semantic-release": "23.1.1",
"serve": "14.2.3", "serve": "14.2.4",
"sinon": "18.0.0", "sinon": "19.0.2",
"typescript": "5.4.5" "typescript": "5.6.3"
}, },
"engines": { "engines": {
"node": ">=16.0.0" "node": ">=16.0.0"
@ -192,9 +185,9 @@
} }
}, },
"node_modules/ansi-regex": { "node_modules/ansi-regex": {
"version": "6.0.1", "version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -253,9 +246,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.7.2", "version": "1.7.7",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
"integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -521,9 +514,9 @@
} }
}, },
"node_modules/cross-spawn": { "node_modules/cross-spawn": {
"version": "7.0.3", "version": "7.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -633,20 +626,10 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/fast-url-parser": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz",
"integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"punycode": "^1.3.2"
}
},
"node_modules/follow-redirects": { "node_modules/follow-redirects": {
"version": "1.15.6", "version": "1.15.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -665,9 +648,9 @@
} }
}, },
"node_modules/form-data": { "node_modules/form-data": {
"version": "4.0.0", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -803,9 +786,9 @@
"license": "ISC" "license": "ISC"
}, },
"node_modules/joi": { "node_modules/joi": {
"version": "17.13.1", "version": "17.13.3",
"resolved": "https://registry.npmjs.org/joi/-/joi-17.13.1.tgz", "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz",
"integrity": "sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==", "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==",
"dev": true, "dev": true,
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"dependencies": { "dependencies": {
@ -854,9 +837,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/mime-db": { "node_modules/mime-db": {
"version": "1.52.0", "version": "1.53.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -876,6 +859,16 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/mime-types/node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mimic-fn": { "node_modules/mimic-fn": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
@ -983,9 +976,9 @@
} }
}, },
"node_modules/path-to-regexp": { "node_modules/path-to-regexp": {
"version": "2.2.1", "version": "3.3.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz",
"integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==", "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
@ -1026,11 +1019,14 @@
} }
}, },
"node_modules/punycode": { "node_modules/punycode": {
"version": "1.4.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT",
"engines": {
"node": ">=6"
}
}, },
"node_modules/range-parser": { "node_modules/range-parser": {
"version": "1.2.0", "version": "1.2.0",
@ -1110,9 +1106,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/serve": { "node_modules/serve": {
"version": "14.2.3", "version": "14.2.4",
"resolved": "https://registry.npmjs.org/serve/-/serve-14.2.3.tgz", "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.4.tgz",
"integrity": "sha512-VqUFMC7K3LDGeGnJM9h56D3XGKb6KGgOw0cVNtA26yYXHCcpxf3xwCTUaQoWlVS7i8Jdh3GjQkOB23qsXyjoyQ==", "integrity": "sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -1125,7 +1121,7 @@
"clipboardy": "3.0.0", "clipboardy": "3.0.0",
"compression": "1.7.4", "compression": "1.7.4",
"is-port-reachable": "4.0.0", "is-port-reachable": "4.0.0",
"serve-handler": "6.1.5", "serve-handler": "6.1.6",
"update-check": "1.5.4" "update-check": "1.5.4"
}, },
"bin": { "bin": {
@ -1136,19 +1132,18 @@
} }
}, },
"node_modules/serve-handler": { "node_modules/serve-handler": {
"version": "6.1.5", "version": "6.1.6",
"resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz",
"integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"bytes": "3.0.0", "bytes": "3.0.0",
"content-disposition": "0.5.2", "content-disposition": "0.5.2",
"fast-url-parser": "1.1.3",
"mime-types": "2.1.18", "mime-types": "2.1.18",
"minimatch": "3.1.2", "minimatch": "3.1.2",
"path-is-inside": "1.0.2", "path-is-inside": "1.0.2",
"path-to-regexp": "2.2.1", "path-to-regexp": "3.3.0",
"range-parser": "1.2.0" "range-parser": "1.2.0"
} }
}, },
@ -1219,20 +1214,20 @@
} }
}, },
"node_modules/start-server-and-test": { "node_modules/start-server-and-test": {
"version": "2.0.3", "version": "2.0.8",
"resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.0.3.tgz", "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.0.8.tgz",
"integrity": "sha512-QsVObjfjFZKJE6CS6bSKNwWZCKBG6975/jKRPPGFfFh+yOQglSeGXiNWjzgQNXdphcBI9nXbyso9tPfX4YAUhg==", "integrity": "sha512-v2fV6NV2F7tL1ocwfI4Wpait+IKjRbT5l3ZZ+ZikXdMLmxYsS8ynGAsCQAUVXkVyGyS+UibsRnvgHkMvJIvCsw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"arg": "^5.0.2", "arg": "^5.0.2",
"bluebird": "3.7.2", "bluebird": "3.7.2",
"check-more-types": "2.24.0", "check-more-types": "2.24.0",
"debug": "4.3.4", "debug": "4.3.7",
"execa": "5.1.1", "execa": "5.1.1",
"lazy-ass": "1.6.0", "lazy-ass": "1.6.0",
"ps-tree": "1.2.0", "ps-tree": "1.2.0",
"wait-on": "7.2.0" "wait-on": "8.0.1"
}, },
"bin": { "bin": {
"server-test": "src/bin/start.js", "server-test": "src/bin/start.js",
@ -1244,13 +1239,13 @@
} }
}, },
"node_modules/start-server-and-test/node_modules/debug": { "node_modules/start-server-and-test/node_modules/debug": {
"version": "4.3.4", "version": "4.3.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"ms": "2.1.2" "ms": "^2.1.3"
}, },
"engines": { "engines": {
"node": ">=6.0" "node": ">=6.0"
@ -1262,9 +1257,9 @@
} }
}, },
"node_modules/start-server-and-test/node_modules/ms": { "node_modules/start-server-and-test/node_modules/ms": {
"version": "2.1.2", "version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
@ -1353,9 +1348,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/tslib": { "node_modules/tslib": {
"version": "2.6.2", "version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"dev": true, "dev": true,
"license": "0BSD" "license": "0BSD"
}, },
@ -1393,16 +1388,6 @@
"punycode": "^2.1.0" "punycode": "^2.1.0"
} }
}, },
"node_modules/uri-js/node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/vary": { "node_modules/vary": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@ -1414,14 +1399,14 @@
} }
}, },
"node_modules/wait-on": { "node_modules/wait-on": {
"version": "7.2.0", "version": "8.0.1",
"resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.1.tgz",
"integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", "integrity": "sha512-1wWQOyR2LVVtaqrcIL2+OM+x7bkpmzVROa0Nf6FryXkS+er5Sa1kzFGjzZRqLnHa3n1rACFLeTwUqE1ETL9Mig==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"axios": "^1.6.1", "axios": "^1.7.7",
"joi": "^17.11.0", "joi": "^17.13.3",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"minimist": "^1.2.8", "minimist": "^1.2.8",
"rxjs": "^7.8.1" "rxjs": "^7.8.1"

View File

@ -6,8 +6,8 @@
"test:html-w3c-validator": "start-server-and-test \"start\" \"http://127.0.0.1:3000\" \"html-w3c-validator\"" "test:html-w3c-validator": "start-server-and-test \"start\" \"http://127.0.0.1:3000\" \"html-w3c-validator\""
}, },
"devDependencies": { "devDependencies": {
"serve": "14.2.3", "serve": "14.2.4",
"start-server-and-test": "2.0.3", "start-server-and-test": "2.0.8",
"html-w3c-validator": "file:.." "html-w3c-validator": "file:.."
} }
} }

6495
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -25,6 +25,7 @@
"bin": "build/index.js", "bin": "build/index.js",
"files": [ "files": [
"build", "build",
"./schema/schema.json",
"!**/*.test.js", "!**/*.test.js",
"!**/*.map" "!**/*.map"
], ],
@ -39,49 +40,38 @@
"build": "swc ./src --out-dir ./build --strip-leading-paths --delete-dir-on-start", "build": "swc ./src --out-dir ./build --strip-leading-paths --delete-dir-on-start",
"build:typescript": "tsc", "build:typescript": "tsc",
"start": "node --enable-source-maps build/index.js", "start": "node --enable-source-maps build/index.js",
"lint:commit": "commitlint",
"lint:editorconfig": "editorconfig-checker", "lint:editorconfig": "editorconfig-checker",
"lint:eslint": "eslint . --max-warnings 0 --report-unused-disable-directives --ignore-path .gitignore", "lint:eslint": "eslint . --max-warnings 0 --report-unused-disable-directives --ignore-path .gitignore",
"lint:prettier": "prettier . --check", "lint:prettier": "prettier . --check",
"lint:staged": "lint-staged",
"test": "node --enable-source-maps --test", "test": "node --enable-source-maps --test",
"release": "semantic-release", "release": "semantic-release"
"postinstall": "husky",
"prepublishOnly": "pinst --disable",
"postpublish": "pinst --enable"
}, },
"dependencies": { "dependencies": {
"chalk": "5.3.0", "chalk": "5.3.0",
"clipanion": "3.2.1", "clipanion": "3.2.1",
"log-symbols": "6.0.0", "log-symbols": "6.0.0",
"ora": "8.0.1", "ora": "8.1.1",
"read-pkg": "9.0.1", "read-pkg": "9.0.1",
"table": "6.8.2" "table": "6.8.2"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "19.2.2", "@swc/cli": "0.5.0",
"@commitlint/config-conventional": "19.2.2", "@swc/core": "1.9.1",
"@swc/cli": "0.3.12",
"@swc/core": "1.5.7",
"@tsconfig/strictest": "2.0.5", "@tsconfig/strictest": "2.0.5",
"@types/node": "20.12.12", "@types/node": "22.9.0",
"@types/sinon": "17.0.3", "@types/sinon": "17.0.3",
"@typescript-eslint/eslint-plugin": "7.10.0", "@typescript-eslint/eslint-plugin": "8.13.0",
"@typescript-eslint/parser": "7.10.0", "@typescript-eslint/parser": "8.13.0",
"editorconfig-checker": "5.1.5", "editorconfig-checker": "6.0.0",
"eslint": "8.57.0", "eslint": "8.57.1",
"eslint-config-conventions": "14.2.0", "eslint-config-conventions": "16.0.1",
"eslint-plugin-import": "2.29.1", "eslint-plugin-promise": "7.1.0",
"eslint-plugin-promise": "6.1.1", "eslint-plugin-unicorn": "55.0.0",
"eslint-plugin-unicorn": "53.0.0", "execa": "9.5.1",
"execa": "9.1.0", "prettier": "3.3.3",
"husky": "9.0.11",
"lint-staged": "15.2.4",
"pinst": "3.0.0",
"prettier": "3.2.5",
"semantic-release": "23.1.1", "semantic-release": "23.1.1",
"serve": "14.2.3", "serve": "14.2.4",
"sinon": "18.0.0", "sinon": "19.0.2",
"typescript": "5.4.5" "typescript": "5.6.3"
} }
} }

View File

@ -1,14 +1,12 @@
{ {
"$schema": "http://json-schema.org/draft-07/schema#", "$schema": "http://json-schema.org/draft-07/schema",
"$id": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/master/schema/html-w3c-validatorrc-schema.json", "$id": "html-w3c-validator://config/schema.json",
"title": "html-w3c-validator configuration schema", "title": "html-w3c-validator configuration schema",
"type": "object", "type": "object",
"properties": { "properties": {
"$schema": { "$schema": {
"description": "JSON Schema URI", "description": "JSON Schema",
"type": "string", "type": "string"
"format": "uri",
"default": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/master/schema/html-w3c-validatorrc-schema.json"
}, },
"urls": { "urls": {
"description": "URLs to validate.", "description": "URLs to validate.",

View File

@ -66,7 +66,7 @@ export class HTMLValidatorCommand extends Command {
configData = await fs.promises.readFile(configPath, { configData = await fs.promises.readFile(configPath, {
encoding: "utf-8", encoding: "utf-8",
}) })
} catch (error) { } catch {
throw new Error( throw new Error(
`No config file found at ${configPath}. Please create "${CONFIG_FILE_NAME}".`, `No config file found at ${configPath}. Please create "${CONFIG_FILE_NAME}".`,
) )
@ -143,7 +143,7 @@ export class HTMLValidatorCommand extends Command {
html = await fs.promises.readFile(htmlPath, { html = await fs.promises.readFile(htmlPath, {
encoding: "utf-8", encoding: "utf-8",
}) })
} catch (error) { } catch {
throw new Error( throw new Error(
`No file found at "${htmlPath}". Please check the path.`, `No file found at "${htmlPath}". Please check the path.`,
) )
@ -184,10 +184,17 @@ export class HTMLValidatorCommand extends Command {
row.push(chalk.red(message.type)) row.push(chalk.red(message.type))
} }
row.push(message.message) row.push(message.message)
if (message.extract != null) { if (
message.extract != null &&
message.lastLine != null &&
message.firstColumn != null &&
message.lastColumn != null
) {
row.push( row.push(
`line: ${message.lastLine}, column: ${message.firstColumn}-${message.lastColumn}`, `line: ${message.lastLine}, column: ${message.firstColumn}-${message.lastColumn}`,
) )
} else {
row.push("")
} }
messagesTable.push(row) messagesTable.push(row)
} }

View File

@ -40,8 +40,8 @@ await test("html-w3c-validator", async (t) => {
{ recursive: true, force: true }, { recursive: true, force: true },
) )
await execa("npm", ["install"]) await execa("npm", ["install"])
const { exitCode } = await execa("npm", [ const { exitCode } = await execa("node", [
"run", "--run",
"test:html-w3c-validator", "test:html-w3c-validator",
]) ])
assert.strictEqual(exitCode, 0) assert.strictEqual(exitCode, 0)
@ -52,8 +52,8 @@ await test("html-w3c-validator", async (t) => {
"succeeds and validate the html correctly (example without working directory)", "succeeds and validate the html correctly (example without working directory)",
async () => { async () => {
const logs: string[] = [] const logs: string[] = []
sinon.stub(console, "log").value((log: string) => { sinon.stub(console, "log").value((...log: string[]) => {
logs.push(log) logs.push(...log)
}) })
const consoleLogSpy = sinon.spy(console, "log") const consoleLogSpy = sinon.spy(console, "log")
const stream = new PassThrough() const stream = new PassThrough()
@ -63,7 +63,7 @@ await test("html-w3c-validator", async (t) => {
stderr: stream, stderr: stream,
}) })
stream.end() stream.end()
assert.strictEqual(exitCode, 0) assert.strictEqual(exitCode, 0, logs.join("\n"))
assert.strictEqual( assert.strictEqual(
consoleLogSpy.calledWith( consoleLogSpy.calledWith(
logSymbols.success, logSymbols.success,
@ -88,8 +88,8 @@ await test("html-w3c-validator", async (t) => {
async () => { async () => {
const workingDirectory = path.join(FIXTURES_PATH, "success") const workingDirectory = path.join(FIXTURES_PATH, "success")
const logs: string[] = [] const logs: string[] = []
sinon.stub(console, "log").value((log: string) => { sinon.stub(console, "log").value((...log: string[]) => {
logs.push(log) logs.push(...log)
}) })
const consoleLogSpy = sinon.spy(console, "log") const consoleLogSpy = sinon.spy(console, "log")
const stream = new PassThrough() const stream = new PassThrough()
@ -102,7 +102,7 @@ await test("html-w3c-validator", async (t) => {
}, },
) )
stream.end() stream.end()
assert.strictEqual(exitCode, 0) assert.strictEqual(exitCode, 0, logs.join("\n"))
assert.strictEqual( assert.strictEqual(
consoleLogSpy.calledWith(logSymbols.success, "./build/index.html"), consoleLogSpy.calledWith(logSymbols.success, "./build/index.html"),
true, true,
@ -116,6 +116,53 @@ await test("html-w3c-validator", async (t) => {
}, },
) )
await t.test(
"fails by validating the html correctly with 2 errors: one with line/column, the other without (GitHub issue #6)",
async () => {
const workingDirectory = path.join(FIXTURES_PATH, "issue-6")
const errors: string[] = []
sinon.stub(console, "error").value((error: string) => {
errors.push(error)
})
const consoleErrorSpy = sinon.spy(console, "error")
const stream = new PassThrough()
const exitCode = await cli.run(
[`--current-working-directory=${workingDirectory}`],
{
stdin: process.stdin,
stdout: stream,
stderr: stream,
},
)
stream.end()
assert.strictEqual(exitCode, 1)
const messagesTable = [
[
chalk.red("error"),
"The character encoding was not declared. Proceeding using “windows-1252”.",
"",
],
[
chalk.yellow("warning"),
"Consider adding a “lang” attribute to the “html” start tag to declare the language of this document.",
"line: 2, column: 16-7",
],
]
assert.strictEqual(
consoleErrorSpy.calledWith(
chalk.bold.red("Error:") + " HTML validation (W3C) failed!",
),
true,
errors.join("\n"),
)
assert.strictEqual(
consoleErrorSpy.calledWith(table(messagesTable)),
true,
errors.join("\n"),
)
},
)
await t.test("fails with not found config", async () => { await t.test("fails with not found config", async () => {
const workingDirectory = path.join(FIXTURES_PATH, "error-config-not-found") const workingDirectory = path.join(FIXTURES_PATH, "error-config-not-found")
const configPath = path.join(workingDirectory, CONFIG_FILE_NAME) const configPath = path.join(workingDirectory, CONFIG_FILE_NAME)

View File

@ -1,5 +1,5 @@
{ {
"$schema": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/develop/schema/html-w3c-validatorrc-schema.json", "$schema": "../../../../schema/schema.json",
"urls": [], "urls": [],
"files": [] "files": []
} }

View File

@ -1,4 +1,4 @@
{ {
"$schema": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/develop/schema/html-w3c-validatorrc-schema.json", "$schema": "../../../../schema/schema.json",
"files": "Invalid" "files": "Invalid"
} }

View File

@ -1,5 +1,5 @@
{ {
"$schema": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/develop/schema/html-w3c-validatorrc-schema.json", "$schema": "../../../../schema/schema.json",
"files": ["./index.html"], "files": ["./index.html"],
"severities": [] "severities": []
} }

View File

@ -1,5 +1,5 @@
{ {
"$schema": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/develop/schema/html-w3c-validatorrc-schema.json", "$schema": "../../../../schema/schema.json",
"files": ["./index.html"], "files": ["./index.html"],
"severities": ["errors-invalid"] "severities": ["errors-invalid"]
} }

View File

@ -1,4 +1,4 @@
{ {
"$schema": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/develop/schema/html-w3c-validatorrc-schema.json", "$schema": "../../../../schema/schema.json",
"urls": "Invalid" "urls": "Invalid"
} }

View File

@ -1,4 +1,4 @@
{ {
"$schema": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/develop/schema/html-w3c-validatorrc-schema.json", "$schema": "../../../../schema/schema.json",
"files": ["./index.html"] "files": ["./index.html"]
} }

View File

@ -1,4 +1,4 @@
{ {
"$schema": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/develop/schema/html-w3c-validatorrc-schema.json", "$schema": "../../../../schema/schema.json",
"files": ["./build/index.html", "./build/about.html"] "files": ["./build/index.html", "./build/about.html"]
} }

View File

@ -0,0 +1,5 @@
{
"$schema": "../../../../schema/schema.json",
"files": ["./build/index.html"],
"severities": ["info", "warning", "error"]
}

View File

@ -0,0 +1,12 @@
<!DOCTYPE html>
<title>Have We Stopped Killing Yet?</title>
<link rel=icon href=favicon.ico>
<link rel=stylesheet href=setup/default.css>
<meta name=viewport content="initial-scale=1,width=device-width">
<meta property="og:image" content="https://mirrors.meiert.org/havewestoppedkillingyet.org/media/redrum.png">
<h1>Have We Stopped Killing Yet?</h1>
<p><strong>No.</strong>
<p>This is <a href=https://meiert.com/en/blog/on-taking-life/>unacceptable</a>.
<p>We dont need arms and armies and industrial slaughterhouses.
<p>We need respect for life.
<p>Everyone can <em>do something</em>. Speaking up is doing something. <a href=https://meiert.com/en/><img src=https://hell.meiert.org/core/png/meiert-logo-80x80-alt.png alt="Jens Oliver Meiert"></a>

View File

@ -1,4 +1,4 @@
{ {
"$schema": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/develop/schema/html-w3c-validatorrc-schema.json", "$schema": "../../../../schema/schema.json",
"files": ["./build/index.html", "./build/about.html"] "files": ["./build/index.html", "./build/about.html"]
} }

View File

@ -7,9 +7,9 @@ export interface ValidationMessage {
subType?: "warning" | "fatal" | "internal" | "io" | "schema" subType?: "warning" | "fatal" | "internal" | "io" | "schema"
message: string message: string
extract?: string extract?: string
lastLine: number lastLine?: number
firstColumn: number firstColumn?: number
lastColumn: number lastColumn?: number
} }
export interface ValidateHTMLResult { export interface ValidateHTMLResult {
@ -30,7 +30,7 @@ export const validateHTML = async (
}, },
}) })
if (!response.ok) { if (!response.ok) {
throw new Error(`Failed to validate HTML`) throw new Error(response.statusText)
} }
const result = (await response.json()) as ValidateHTMLResult const result = (await response.json()) as ValidateHTMLResult
return result return result