1
1
mirror of https://github.com/theoludwig/html-w3c-validator.git synced 2025-05-21 23:21:29 +02:00

7 Commits

17 changed files with 1068 additions and 4840 deletions

View File

@ -10,7 +10,7 @@ jobs:
build: build:
runs-on: 'ubuntu-latest' runs-on: 'ubuntu-latest'
steps: steps:
- uses: 'actions/checkout@v3.5.2' - uses: 'actions/checkout@v3.5.3'
- name: 'Setup Node.js' - name: 'Setup Node.js'
uses: 'actions/setup-node@v3.6.0' uses: 'actions/setup-node@v3.6.0'

View File

@ -10,7 +10,7 @@ jobs:
lint: lint:
runs-on: 'ubuntu-latest' runs-on: 'ubuntu-latest'
steps: steps:
- uses: 'actions/checkout@v3.5.2' - uses: 'actions/checkout@v3.5.3'
- name: 'Setup Node.js' - name: 'Setup Node.js'
uses: 'actions/setup-node@v3.6.0' uses: 'actions/setup-node@v3.6.0'

View File

@ -13,7 +13,7 @@ jobs:
pull-requests: 'write' pull-requests: 'write'
id-token: 'write' id-token: 'write'
steps: steps:
- uses: 'actions/checkout@v3.5.2' - uses: 'actions/checkout@v3.5.3'
with: with:
fetch-depth: 0 fetch-depth: 0
persist-credentials: false persist-credentials: false

View File

@ -10,7 +10,7 @@ jobs:
test: test:
runs-on: 'ubuntu-latest' runs-on: 'ubuntu-latest'
steps: steps:
- uses: 'actions/checkout@v3.5.2' - uses: 'actions/checkout@v3.5.3'
- name: 'Setup Node.js' - name: 'Setup Node.js'
uses: 'actions/setup-node@v3.6.0' uses: 'actions/setup-node@v3.6.0'

1
.swcrc
View File

@ -1,4 +1,5 @@
{ {
"sourceMaps": true,
"jsc": { "jsc": {
"parser": { "parser": {
"syntax": "typescript", "syntax": "typescript",

9
.taprc
View File

@ -1,9 +0,0 @@
ts: false
jsx: false
flow: false
check-coverage: false
coverage: false
timeout: 120000
files:
- 'build/**/*.test.js'

View File

@ -60,7 +60,7 @@ representative at an online or offline event.
Instances of abusive, harassing, or otherwise unacceptable behavior may be Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at reported to the community leaders responsible for enforcement at
<contact@divlo.fr>. <contact@theoludwig.fr>.
All complaints will be reviewed and investigated promptly and fairly. All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the All community leaders are obligated to respect the privacy and security of the

View File

@ -19,7 +19,7 @@ All work on **html-w3c-validator** happens directly on this repository. Both cor
## Pull Requests ## Pull Requests
- **Please first discuss** the change you wish to make via [issue](https://github.com/Divlo/html-w3c-validator/issues) before making a change. It might avoid a waste of your time. - **Please first discuss** the change you wish to make via [issue](https://github.com/theoludwig/html-w3c-validator/issues) before making a change. It might avoid a waste of your time.
- Ensure your code respect linting. - Ensure your code respect linting.

View File

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) Divlo Copyright (c) Théo LUDWIG
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -11,9 +11,9 @@
<a href="./LICENSE"><img src="https://img.shields.io/badge/licence-MIT-blue.svg" alt="Licence MIT"/></a> <a href="./LICENSE"><img src="https://img.shields.io/badge/licence-MIT-blue.svg" alt="Licence MIT"/></a>
<a href="./CODE_OF_CONDUCT.md"><img src="https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg" alt="Contributor Covenant" /></a> <a href="./CODE_OF_CONDUCT.md"><img src="https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg" alt="Contributor Covenant" /></a>
<br /> <br />
<a href="https://github.com/Divlo/html-w3c-validator/actions/workflows/build.yml"><img src="https://github.com/Divlo/html-w3c-validator/actions/workflows/build.yml/badge.svg?branch=develop" /></a> <a href="https://github.com/theoludwig/html-w3c-validator/actions/workflows/build.yml"><img src="https://github.com/theoludwig/html-w3c-validator/actions/workflows/build.yml/badge.svg?branch=develop" /></a>
<a href="https://github.com/Divlo/html-w3c-validator/actions/workflows/lint.yml"><img src="https://github.com/Divlo/html-w3c-validator/actions/workflows/lint.yml/badge.svg?branch=develop" /></a> <a href="https://github.com/theoludwig/html-w3c-validator/actions/workflows/lint.yml"><img src="https://github.com/theoludwig/html-w3c-validator/actions/workflows/lint.yml/badge.svg?branch=develop" /></a>
<a href="https://github.com/Divlo/html-w3c-validator/actions/workflows/test.yml"><img src="https://github.com/Divlo/html-w3c-validator/actions/workflows/test.yml/badge.svg?branch=develop" /></a> <a href="https://github.com/theoludwig/html-w3c-validator/actions/workflows/test.yml"><img src="https://github.com/theoludwig/html-w3c-validator/actions/workflows/test.yml/badge.svg?branch=develop" /></a>
<br /> <br />
<a href="https://conventionalcommits.org"><img src="https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg" alt="Conventional Commits" /></a> <a href="https://conventionalcommits.org"><img src="https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg" alt="Conventional Commits" /></a>
<a href="https://github.com/semantic-release/semantic-release"><img src="https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg" alt="semantic-release" /></a> <a href="https://github.com/semantic-release/semantic-release"><img src="https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg" alt="semantic-release" /></a>
@ -71,7 +71,10 @@ npm install --save-dev html-w3c-validator start-server-and-test
"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"],
// You can also specify HTML files instead of URLs // You can also specify HTML files instead of URLs
"files": ["./index.html", "./about.html"] "files": ["./index.html", "./about.html"],
// Specify the severities of the validator (default: ["warning", "error"])
"severities": ["info", "warning", "error"]
} }
``` ```

View File

@ -16,11 +16,11 @@
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"chalk": "5.2.0", "chalk": "5.3.0",
"clipanion": "3.2.0", "clipanion": "3.2.1",
"html-validator": "6.0.1", "html-validator": "6.0.1",
"log-symbols": "5.1.0", "log-symbols": "5.1.0",
"ora": "6.3.0", "ora": "6.3.1",
"read-pkg": "8.0.0", "read-pkg": "8.0.0",
"table": "6.8.1" "table": "6.8.1"
}, },
@ -28,18 +28,18 @@
"html-w3c-validator": "build/index.js" "html-w3c-validator": "build/index.js"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "17.6.3", "@commitlint/cli": "17.6.6",
"@commitlint/config-conventional": "17.6.3", "@commitlint/config-conventional": "17.6.6",
"@swc/cli": "0.1.62", "@swc/cli": "0.1.62",
"@swc/core": "1.3.57", "@swc/core": "1.3.67",
"@tsconfig/strictest": "2.0.1", "@tsconfig/strictest": "2.0.1",
"@types/html-validator": "5.0.3", "@types/html-validator": "5.0.3",
"@types/mock-fs": "4.13.1", "@types/mock-fs": "4.13.1",
"@types/node": "20.1.3", "@types/node": "20.3.3",
"@types/tap": "15.0.8", "@types/tap": "15.0.8",
"@typescript-eslint/eslint-plugin": "5.59.5", "@typescript-eslint/eslint-plugin": "5.60.1",
"editorconfig-checker": "5.0.1", "editorconfig-checker": "5.1.1",
"eslint": "8.40.0", "eslint": "8.44.0",
"eslint-config-conventions": "9.0.0", "eslint-config-conventions": "9.0.0",
"eslint-config-prettier": "8.8.0", "eslint-config-prettier": "8.8.0",
"eslint-plugin-import": "2.27.5", "eslint-plugin-import": "2.27.5",
@ -47,15 +47,14 @@
"eslint-plugin-promise": "6.1.1", "eslint-plugin-promise": "6.1.1",
"eslint-plugin-unicorn": "47.0.0", "eslint-plugin-unicorn": "47.0.0",
"execa": "7.1.1", "execa": "7.1.1",
"lint-staged": "13.2.2", "lint-staged": "13.2.3",
"markdownlint-cli2": "0.7.1", "markdownlint-cli2": "0.8.1",
"markdownlint-rule-relative-links": "1.2.0", "markdownlint-rule-relative-links": "2.1.0",
"mock-fs": "5.2.0", "mock-fs": "5.2.0",
"prettier": "2.8.8", "prettier": "2.8.8",
"rimraf": "5.0.0", "rimraf": "5.0.1",
"semantic-release": "21.0.2", "semantic-release": "21.0.6",
"serve": "14.2.0", "serve": "14.2.0",
"tap": "16.3.4",
"typescript": "5.0.4" "typescript": "5.0.4"
}, },
"engines": { "engines": {
@ -1188,9 +1187,9 @@
} }
}, },
"node_modules/strip-ansi": { "node_modules/strip-ansi": {
"version": "7.0.1", "version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"ansi-regex": "^6.0.1" "ansi-regex": "^6.0.1"
@ -1239,9 +1238,9 @@
"dev": true "dev": true
}, },
"node_modules/tslib": { "node_modules/tslib": {
"version": "2.5.0", "version": "2.6.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==",
"dev": true "dev": true
}, },
"node_modules/type-fest": { "node_modules/type-fest": {

View File

@ -2,7 +2,7 @@
"name": "example", "name": "example",
"private": true, "private": true,
"scripts": { "scripts": {
"start": "serve \"./build\"", "start": "serve ./build",
"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": {

5674
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -4,16 +4,16 @@
"public": true, "public": true,
"description": "CLI for validating multiple html pages using validator.w3.org.", "description": "CLI for validating multiple html pages using validator.w3.org.",
"type": "module", "type": "module",
"author": "Divlo <contact@divlo.fr>", "author": "Théo LUDWIG <contact@theoludwig.fr>",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/Divlo/html-w3c-validator.git" "url": "https://github.com/theoludwig/html-w3c-validator.git"
}, },
"bugs": { "bugs": {
"url": "https://github.com/Divlo/html-w3c-validator/issues" "url": "https://github.com/theoludwig/html-w3c-validator/issues"
}, },
"homepage": "https://github.com/Divlo/html-w3c-validator#readme", "homepage": "https://github.com/theoludwig/html-w3c-validator#readme",
"keywords": [ "keywords": [
"cli", "cli",
"html-validator", "html-validator",
@ -23,7 +23,9 @@
"main": "build/index.js", "main": "build/index.js",
"bin": "build/index.js", "bin": "build/index.js",
"files": [ "files": [
"build" "build",
"!**/*.test.js",
"!**/*.map"
], ],
"publishConfig": { "publishConfig": {
"access": "public", "access": "public",
@ -36,37 +38,38 @@
"scripts": { "scripts": {
"build": "rimraf ./build && swc ./src --out-dir ./build", "build": "rimraf ./build && swc ./src --out-dir ./build",
"build:typescript": "tsc", "build:typescript": "tsc",
"start": "node --enable-source-maps build/index.js",
"lint:commit": "commitlint", "lint:commit": "commitlint",
"lint:editorconfig": "editorconfig-checker", "lint:editorconfig": "editorconfig-checker",
"lint:markdown": "markdownlint-cli2", "lint:markdown": "markdownlint-cli2",
"lint:eslint": "eslint \".\" --ignore-path \".gitignore\"", "lint:eslint": "eslint . --ignore-path .gitignore",
"lint:prettier": "prettier \".\" --check --ignore-path \".gitignore\"", "lint:prettier": "prettier . --check --ignore-path .gitignore",
"lint:staged": "lint-staged", "lint:staged": "lint-staged",
"test": "tap", "test": "node --enable-source-maps --test build/",
"release": "semantic-release" "release": "semantic-release"
}, },
"dependencies": { "dependencies": {
"chalk": "5.2.0", "chalk": "5.3.0",
"clipanion": "3.2.0", "clipanion": "3.2.1",
"html-validator": "6.0.1", "html-validator": "6.0.1",
"log-symbols": "5.1.0", "log-symbols": "5.1.0",
"ora": "6.3.0", "ora": "6.3.1",
"read-pkg": "8.0.0", "read-pkg": "8.0.0",
"table": "6.8.1" "table": "6.8.1"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "17.6.3", "@commitlint/cli": "17.6.6",
"@commitlint/config-conventional": "17.6.3", "@commitlint/config-conventional": "17.6.6",
"@swc/cli": "0.1.62", "@swc/cli": "0.1.62",
"@swc/core": "1.3.57", "@swc/core": "1.3.67",
"@tsconfig/strictest": "2.0.1", "@tsconfig/strictest": "2.0.1",
"@types/html-validator": "5.0.3", "@types/html-validator": "5.0.3",
"@types/mock-fs": "4.13.1", "@types/mock-fs": "4.13.1",
"@types/node": "20.1.3", "@types/node": "20.3.3",
"@types/tap": "15.0.8", "@types/tap": "15.0.8",
"@typescript-eslint/eslint-plugin": "5.59.5", "@typescript-eslint/eslint-plugin": "5.60.1",
"editorconfig-checker": "5.0.1", "editorconfig-checker": "5.1.1",
"eslint": "8.40.0", "eslint": "8.44.0",
"eslint-config-conventions": "9.0.0", "eslint-config-conventions": "9.0.0",
"eslint-config-prettier": "8.8.0", "eslint-config-prettier": "8.8.0",
"eslint-plugin-import": "2.27.5", "eslint-plugin-import": "2.27.5",
@ -74,15 +77,14 @@
"eslint-plugin-promise": "6.1.1", "eslint-plugin-promise": "6.1.1",
"eslint-plugin-unicorn": "47.0.0", "eslint-plugin-unicorn": "47.0.0",
"execa": "7.1.1", "execa": "7.1.1",
"lint-staged": "13.2.2", "lint-staged": "13.2.3",
"markdownlint-cli2": "0.7.1", "markdownlint-cli2": "0.8.1",
"markdownlint-rule-relative-links": "1.2.0", "markdownlint-rule-relative-links": "2.1.0",
"mock-fs": "5.2.0", "mock-fs": "5.2.0",
"prettier": "2.8.8", "prettier": "2.8.8",
"rimraf": "5.0.0", "rimraf": "5.0.1",
"semantic-release": "21.0.2", "semantic-release": "21.0.6",
"serve": "14.2.0", "serve": "14.2.0",
"tap": "16.3.4",
"typescript": "5.0.4" "typescript": "5.0.4"
} }
} }

View File

@ -17,9 +17,14 @@ import { isExistingPath } from './utils/isExistingPath.js'
const CURRENT_DIRECTORY = process.cwd() const CURRENT_DIRECTORY = process.cwd()
const CONFIG_FILE_NAME = '.html-w3c-validatorrc.json' const CONFIG_FILE_NAME = '.html-w3c-validatorrc.json'
const severities = ['error', 'warning', 'info'] as const
export type Severity = (typeof severities)[number]
interface Config { interface Config {
urls?: string[] urls?: string[]
files?: string[] files?: string[]
severities?: Severity[]
} }
interface Error { interface Error {
@ -53,7 +58,7 @@ export class HTMLValidatorCommand extends Command {
try { try {
if (!(await isExistingPath(configPath))) { if (!(await isExistingPath(configPath))) {
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}".`
) )
} }
const configData = await fs.promises.readFile(configPath, { const configData = await fs.promises.readFile(configPath, {
@ -66,12 +71,19 @@ export class HTMLValidatorCommand extends Command {
} catch { } catch {
isValidConfig = false isValidConfig = false
} }
isValidConfig =
isValidConfig &&
(Array.isArray(config.urls) || Array.isArray(config.urls))
if (!isValidConfig) { if (!isValidConfig) {
throw new Error( throw new Error(
`Invalid config file at ${configPath}. Please check the syntax.` `Invalid config file at "${configPath}". Please check the JSON syntax.`
)
}
if (config.urls != null && !Array.isArray(config.urls)) {
throw new Error(
`Invalid config file at "${configPath}". Please include an array of URLs.`
)
}
if (config.files != null && !Array.isArray(config.files)) {
throw new Error(
`Invalid config file at "${configPath}". Please include an array of files.`
) )
} }
const urls = const urls =
@ -87,6 +99,31 @@ export class HTMLValidatorCommand extends Command {
return { type: 'file', data: file } return { type: 'file', data: file }
}) })
const dataToValidate = [...urls, ...files] const dataToValidate = [...urls, ...files]
if (dataToValidate.length === 0) {
throw new Error(
`Invalid config file at "${configPath}". Please add URLs or files.`
)
}
const configSeverities: Severity[] = config.severities ?? [
'warning',
'error'
]
for (const severity of configSeverities) {
if (!severities.includes(severity)) {
throw new Error(
`Invalid config file at "${configPath}". Please add valid severities (${severities.join(
', '
)}).`
)
}
}
if (configSeverities.length === 0) {
throw new Error(
`Invalid config file at "${configPath}". Please add valid severities (${severities.join(
', '
)}).`
)
}
const errors: Error[] = [] const errors: Error[] = []
let isValid = true let isValid = true
const loader = ora(`Validating HTML (W3C)...`).start() const loader = ora(`Validating HTML (W3C)...`).start()
@ -108,7 +145,7 @@ export class HTMLValidatorCommand extends Command {
const htmlPath = path.resolve(CURRENT_DIRECTORY, data) const htmlPath = path.resolve(CURRENT_DIRECTORY, data)
if (!(await isExistingPath(htmlPath))) { if (!(await isExistingPath(htmlPath))) {
throw new Error( throw new Error(
`No file found at ${htmlPath}. Please check the path.` `No file found at "${htmlPath}". Please check the path.`
) )
} }
const html = await fs.promises.readFile(htmlPath, { const html = await fs.promises.readFile(htmlPath, {
@ -122,7 +159,10 @@ export class HTMLValidatorCommand extends Command {
throw new Error('Invalid type') throw new Error('Invalid type')
} }
const hasErrors = result.messages.some((message) => { const hasErrors = result.messages.some((message) => {
return message.type === 'error' return (
configSeverities.includes(message.type as Severity) ||
configSeverities.includes(message.subType as Severity)
)
}) })
if (!hasErrors) { if (!hasErrors) {
results.push({ data, isSuccess: true }) results.push({ data, isSuccess: true })
@ -130,18 +170,24 @@ export class HTMLValidatorCommand extends Command {
results.push({ data, isSuccess: false }) results.push({ data, isSuccess: false })
const messagesTable: string[][] = [] const messagesTable: string[][] = []
for (const message of result.messages) { for (const message of result.messages) {
if (message.type === 'error') { const row: string[] = []
const row: string[] = [] if (message.type === 'info') {
row.push(chalk.red(message.type)) if (message.subType === 'warning') {
row.push(message.message) row.push(chalk.yellow(message.subType))
const violation = message as ValidationMessageLocationObject } else {
if (violation.extract != null) { row.push(chalk.blue(message.type))
row.push(
`line: ${violation.lastLine}, column: ${violation.firstColumn}-${violation.lastColumn}`
)
} }
messagesTable.push(row) } else {
row.push(chalk.red(message.type))
} }
row.push(message.message)
const violation = message as ValidationMessageLocationObject
if (violation.extract != null) {
row.push(
`line: ${violation.lastLine}, column: ${violation.firstColumn}-${violation.lastColumn}`
)
}
messagesTable.push(row)
} }
errors.push({ data, messagesTable }) errors.push({ data, messagesTable })
isValid = false isValid = false

View File

@ -1,21 +1,23 @@
import tap from 'tap' import test from 'node:test'
import assert from 'node:assert/strict'
import { execa } from 'execa' import { execa } from 'execa'
import { cli } from '../cli.js' import { cli } from '../cli.js'
import { HTMLValidatorCommand } from '../HTMLValidatorCommand.js' import { HTMLValidatorCommand } from '../HTMLValidatorCommand.js'
await tap.test('html-w3c-validator', async (t) => { await test('html-w3c-validator', async (t) => {
await t.test('should be instance of the command', async (t) => { await t.test('should be instance of the command', async () => {
const command = cli.process([]) const command = cli.process([])
t.equal(command instanceof HTMLValidatorCommand, true) assert(command instanceof HTMLValidatorCommand)
}) })
await t.test('succeeds and validate the html correctly', async (t) => { await t.test('succeeds and validate the html correctly', async () => {
const exampleURL = new URL('../../example', import.meta.url) const exampleURL = new URL('../../example', import.meta.url)
process.chdir(exampleURL.pathname) process.chdir(exampleURL.pathname)
await execa('rimraf', ['node_modules']) await execa('rimraf', ['node_modules'])
await execa('npm', ['install']) await execa('npm', ['install'])
const { exitCode } = await execa('npm', ['run', 'test:html-w3c-validator']) const { exitCode } = await execa('npm', ['run', 'test:html-w3c-validator'])
t.equal(exitCode, 0) assert.strictEqual(exitCode, 0)
}) })
}) })

View File

@ -1,9 +1,11 @@
import test from 'node:test'
import assert from 'node:assert/strict'
import fsMock from 'mock-fs' import fsMock from 'mock-fs'
import tap from 'tap'
import { isExistingPath } from '../isExistingPath.js' import { isExistingPath } from '../isExistingPath.js'
await tap.test('utils/isExistingPath', async (t) => { await test('utils/isExistingPath', async (t) => {
t.afterEach(() => { t.afterEach(() => {
fsMock.restore() fsMock.restore()
}) })
@ -12,13 +14,13 @@ await tap.test('utils/isExistingPath', async (t) => {
fsMock({ fsMock({
'/file.txt': '' '/file.txt': ''
}) })
t.equal(await isExistingPath('/file.txt'), true) assert.strictEqual(await isExistingPath('/file.txt'), true)
}) })
await t.test("should return false if the file doesn't exists", async () => { await t.test("should return false if the file doesn't exists", async () => {
fsMock({ fsMock({
'/file.txt': '' '/file.txt': ''
}) })
t.equal(await isExistingPath('/randomfile.txt'), false) assert.strictEqual(await isExistingPath('/randomfile.txt'), false)
}) })
}) })