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

Compare commits

..

No commits in common. "fbe3830db7522056a425d22aeb8cfe0d274812bb" and "e53c80d5789312d7728d3ac82cdccf196ced6d52" have entirely different histories.

34 changed files with 4598 additions and 2435 deletions

1
.commitlintrc.json Normal file
View File

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

View File

@ -1,17 +1,18 @@
{ {
"root": true, "root": true,
"extends": ["conventions"], "extends": ["conventions"],
"plugins": ["promise", "unicorn"], "plugins": ["import", "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": {
"projectService": true "project": "./tsconfig.json"
},
"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. Please provide a clear and concise description of what the bug is. Include
Include screenshots if needed. Please make sure your issue has not already been fixed. 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: [main, develop] branches: [master, develop]
jobs: jobs:
build: build:
runs-on: "ubuntu-latest" runs-on: "ubuntu-latest"
steps: steps:
- uses: "actions/checkout@v4.2.2" - uses: "actions/checkout@v4.1.6"
- name: "Setup Node.js" - name: "Setup Node.js"
uses: "actions/setup-node@v4.1.0" uses: "actions/setup-node@v4.0.2"
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: "node --run build" run: "npm run build"
- run: "node --run build:typescript" - run: "npm run build:typescript"

View File

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

View File

@ -2,7 +2,7 @@ name: "Release"
on: on:
push: push:
branches: [main, beta] branches: [master]
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.2.2" - uses: "actions/checkout@v4.1.6"
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.1.0" uses: "actions/setup-node@v4.0.2"
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: "node --run build" run: "npm run build"
- run: "node --run build:typescript" - run: "npm 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: "node --run release" run: "npm 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: [main, develop] branches: [master, develop]
jobs: jobs:
test: test:
runs-on: "ubuntu-latest" runs-on: "ubuntu-latest"
steps: steps:
- uses: "actions/checkout@v4.2.2" - uses: "actions/checkout@v4.1.6"
- name: "Setup Node.js" - name: "Setup Node.js"
uses: "actions/setup-node@v4.1.0" uses: "actions/setup-node@v4.0.2"
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: "node --run build" run: "npm run build"
- name: "Test" - name: "Test"
run: "node --run test" run: "npm run test"

3
.husky/commit-msg Executable file
View File

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

4
.husky/pre-commit Executable file
View File

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

6
.lintstagedrc.json Normal file
View File

@ -0,0 +1,6 @@
{
"**/*": ["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,8 +1,18 @@
{ {
"branches": ["main", { "name": "beta", "prerelease": true }], "branches": ["master"],
"plugins": [ "plugins": [
"@semantic-release/commit-analyzer", [
"@semantic-release/release-notes-generator", "@semantic-release/commit-analyzer",
{
"preset": "conventionalcommits"
}
],
[
"@semantic-release/release-notes-generator",
{
"preset": "conventionalcommits"
}
],
"@semantic-release/npm", "@semantic-release/npm",
"@semantic-release/github" "@semantic-release/github"
] ]

8
.vscode/extensions.json vendored Normal file
View File

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

14
.vscode/settings.json vendored Normal file
View File

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

6545
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -25,7 +25,6 @@
"bin": "build/index.js", "bin": "build/index.js",
"files": [ "files": [
"build", "build",
"./schema/schema.json",
"!**/*.test.js", "!**/*.test.js",
"!**/*.map" "!**/*.map"
], ],
@ -40,38 +39,49 @@
"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.1.1", "ora": "8.0.1",
"read-pkg": "9.0.1", "read-pkg": "9.0.1",
"table": "6.8.2" "table": "6.8.2"
}, },
"devDependencies": { "devDependencies": {
"@swc/cli": "0.5.0", "@commitlint/cli": "19.2.2",
"@swc/core": "1.9.1", "@commitlint/config-conventional": "19.2.2",
"@swc/cli": "0.3.12",
"@swc/core": "1.5.7",
"@tsconfig/strictest": "2.0.5", "@tsconfig/strictest": "2.0.5",
"@types/node": "22.9.0", "@types/node": "20.12.12",
"@types/sinon": "17.0.3", "@types/sinon": "17.0.3",
"@typescript-eslint/eslint-plugin": "8.13.0", "@typescript-eslint/eslint-plugin": "7.10.0",
"@typescript-eslint/parser": "8.13.0", "@typescript-eslint/parser": "7.10.0",
"editorconfig-checker": "6.0.0", "editorconfig-checker": "5.1.5",
"eslint": "8.57.1", "eslint": "8.57.0",
"eslint-config-conventions": "16.0.1", "eslint-config-conventions": "14.2.0",
"eslint-plugin-promise": "7.1.0", "eslint-plugin-import": "2.29.1",
"eslint-plugin-unicorn": "55.0.0", "eslint-plugin-promise": "6.1.1",
"execa": "9.5.1", "eslint-plugin-unicorn": "53.0.0",
"prettier": "3.3.3", "execa": "9.1.0",
"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.4", "serve": "14.2.3",
"sinon": "19.0.2", "sinon": "18.0.0",
"typescript": "5.6.3" "typescript": "5.4.5"
} }
} }

View File

@ -1,12 +1,14 @@
{ {
"$schema": "http://json-schema.org/draft-07/schema", "$schema": "http://json-schema.org/draft-07/schema#",
"$id": "html-w3c-validator://config/schema.json", "$id": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/master/schema/html-w3c-validatorrc-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", "description": "JSON Schema URI",
"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 { } catch (error) {
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 { } catch (error) {
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,17 +184,10 @@ 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 ( if (message.extract != null) {
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("node", [ const { exitCode } = await execa("npm", [
"--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, logs.join("\n")) assert.strictEqual(exitCode, 0)
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, logs.join("\n")) assert.strictEqual(exitCode, 0)
assert.strictEqual( assert.strictEqual(
consoleLogSpy.calledWith(logSymbols.success, "./build/index.html"), consoleLogSpy.calledWith(logSymbols.success, "./build/index.html"),
true, true,
@ -116,53 +116,6 @@ 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": "../../../../schema/schema.json", "$schema": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/develop/schema/html-w3c-validatorrc-schema.json",
"urls": [], "urls": [],
"files": [] "files": []
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,12 +0,0 @@
<!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": "../../../../schema/schema.json", "$schema": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/develop/schema/html-w3c-validatorrc-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(response.statusText) throw new Error(`Failed to validate HTML`)
} }
const result = (await response.json()) as ValidateHTMLResult const result = (await response.json()) as ValidateHTMLResult
return result return result