html-validate 9.5.1 → 9.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/cli.js +1 -3
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/core-nodejs.js +1 -4
- package/dist/cjs/core-nodejs.js.map +1 -1
- package/dist/cjs/core.js +10 -13
- package/dist/cjs/core.js.map +1 -1
- package/dist/cjs/jest-diff.js.map +1 -1
- package/dist/cjs/jest-worker.js.map +1 -1
- package/dist/cjs/matcher-utils.js +1 -1
- package/dist/cjs/matcher-utils.js.map +1 -1
- package/dist/cjs/tsdoc-metadata.json +1 -1
- package/dist/es/cli.js +1 -3
- package/dist/es/cli.js.map +1 -1
- package/dist/es/core-nodejs.js +1 -4
- package/dist/es/core-nodejs.js.map +1 -1
- package/dist/es/core.js +10 -13
- package/dist/es/core.js.map +1 -1
- package/dist/es/jest-diff.js.map +1 -1
- package/dist/es/jest-worker.js.map +1 -1
- package/dist/es/matcher-utils.js +1 -1
- package/dist/es/matcher-utils.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jest-diff.js","sources":["../../src/jest/utils/diff.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment
|
|
1
|
+
{"version":3,"file":"jest-diff.js","sources":["../../src/jest/utils/diff.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment --\n * this code needs to work with multiple different versions of jest and it does\n * verification of which one is actually present but the other variants will\n * cause errors, as is expected */\n\nimport jestDiffDefault, * as jestDiff from \"jest-diff\";\n\n/**\n * @internal\n */\nexport interface DiffOptions {\n\taAnnotation?: string;\n\tbAnnotation?: string;\n\texpand?: boolean;\n}\n\n/**\n * @internal\n */\nexport type DiffFunction = (a: any, b: any, options?: DiffOptions) => string | null;\n\n/* ignore typing for compatibility so it will seem \"impossible\" but different\n * version will yield different source */\n/* istanbul ignore next: this is covered by integration tests */\nconst diffCandidates: Array<DiffFunction | undefined> = [\n\t// @ts-ignore\n\tjestDiffDefault?.diff,\n\t// @ts-ignore\n\tjestDiffDefault,\n\t// @ts-ignore\n\tjestDiff?.diff,\n\t// @ts-ignore\n\tjestDiff,\n];\n\nconst isFunction = (fn: unknown): boolean => typeof fn === \"function\";\n\n/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- assume\n * one of the candidate matches, there will be a reasonable error later on if\n * not */\nexport const diff: DiffFunction = diffCandidates.find(isFunction)!;\n"],"names":["jestDiffDefault","jestDiff"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,cAAkD,GAAA;AAAA;AAAA,EAEvDA,kCAAiB,EAAA,IAAA;AAAA;AAAA,EAEjBA,kCAAA;AAAA;AAAA,EAEAC,0BAAU,EAAA,IAAA;AAAA;AAAA,EAEVA;AACD,CAAA;AAEA,MAAM,UAAa,GAAA,CAAC,EAAyB,KAAA,OAAO,EAAO,KAAA,UAAA;AAK9C,MAAA,IAAA,GAAqB,cAAe,CAAA,IAAA,CAAK,UAAU;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jest-worker.js","sources":["../../src/jest/worker/worker.ts"],"sourcesContent":["import { type MessagePort, parentPort, workerData } from \"node:worker_threads\";\nimport { type ConfigData } from \"../../config\";\nimport { FileSystemConfigLoader } from \"../../config/loaders/file-system\";\nimport { HtmlValidate } from \"../../htmlvalidate\";\nimport { type Report } from \"../../reporter\";\nimport {\n\ttype AnyAsyncFn,\n\ttype MainToWorkerCommandMessage,\n\ttype MainToWorkerMessage,\n\ttype WorkerToMainMessage,\n} from \"./types\";\n\ninterface WorkerData {\n\tsharedBuffer: SharedArrayBuffer;\n\tworkerPort: MessagePort;\n}\n\n/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- false positive, it is used in nested functions */\nfunction runAsWorker<R = unknown, T extends AnyAsyncFn<R> = AnyAsyncFn<R>>(fn: T): void {\n\tif (!workerData) {\n\t\treturn;\n\t}\n\n\tconst { workerPort, sharedBuffer } = workerData as WorkerData;\n\tconst sharedBufferView = new Int32Array(sharedBuffer, 0, 1);\n\n\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- better crash at runtime if not set */\n\tparentPort!.on(\"message\", ({ id, args }: MainToWorkerMessage<Parameters<T>>) => {\n\t\tasync function inner(): Promise<void> {\n\t\t\tlet isAborted = false;\n\t\t\tconst handleAbortMessage = (msg: MainToWorkerCommandMessage): void => {\n\t\t\t\tif (msg.id === id && msg.cmd === \"abort\") {\n\t\t\t\t\tisAborted = true;\n\t\t\t\t}\n\t\t\t};\n\t\t\tworkerPort.on(\"message\", handleAbortMessage);\n\t\t\tlet msg: WorkerToMainMessage<R>;\n\t\t\ttry {\n\t\t\t\tmsg = { id, result: await fn(...args) };\n\t\t\t} catch (error: unknown) {\n\t\t\t\tmsg = {\n\t\t\t\t\tid,\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t};\n\t\t\t}\n\t\t\tworkerPort.off(\"message\", handleAbortMessage);\n\
|
|
1
|
+
{"version":3,"file":"jest-worker.js","sources":["../../src/jest/worker/worker.ts"],"sourcesContent":["import { type MessagePort, parentPort, workerData } from \"node:worker_threads\";\nimport { type ConfigData } from \"../../config\";\nimport { FileSystemConfigLoader } from \"../../config/loaders/file-system\";\nimport { HtmlValidate } from \"../../htmlvalidate\";\nimport { type Report } from \"../../reporter\";\nimport {\n\ttype AnyAsyncFn,\n\ttype MainToWorkerCommandMessage,\n\ttype MainToWorkerMessage,\n\ttype WorkerToMainMessage,\n} from \"./types\";\n\ninterface WorkerData {\n\tsharedBuffer: SharedArrayBuffer;\n\tworkerPort: MessagePort;\n}\n\n/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- false positive, it is used in nested functions */\nfunction runAsWorker<R = unknown, T extends AnyAsyncFn<R> = AnyAsyncFn<R>>(fn: T): void {\n\tif (!workerData) {\n\t\treturn;\n\t}\n\n\tconst { workerPort, sharedBuffer } = workerData as WorkerData;\n\tconst sharedBufferView = new Int32Array(sharedBuffer, 0, 1);\n\n\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- better crash at runtime if not set */\n\tparentPort!.on(\"message\", ({ id, args }: MainToWorkerMessage<Parameters<T>>) => {\n\t\tasync function inner(): Promise<void> {\n\t\t\tlet isAborted = false;\n\t\t\tconst handleAbortMessage = (msg: MainToWorkerCommandMessage): void => {\n\t\t\t\tif (msg.id === id && msg.cmd === \"abort\") {\n\t\t\t\t\tisAborted = true;\n\t\t\t\t}\n\t\t\t};\n\t\t\tworkerPort.on(\"message\", handleAbortMessage);\n\t\t\tlet msg: WorkerToMainMessage<R>;\n\t\t\ttry {\n\t\t\t\tmsg = { id, result: await fn(...args) };\n\t\t\t} catch (error: unknown) {\n\t\t\t\tmsg = {\n\t\t\t\t\tid,\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t};\n\t\t\t}\n\t\t\tworkerPort.off(\"message\", handleAbortMessage);\n\n\t\t\tif (isAborted) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tworkerPort.postMessage(msg);\n\t\t\tAtomics.add(sharedBufferView, 0, 1);\n\t\t\tAtomics.notify(sharedBufferView, 0);\n\t\t}\n\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises -- should not happen\n\t\tinner();\n\t});\n}\n\nfunction validateString(markup: string, filename: string, config: ConfigData): Promise<Report> {\n\tconst loader = new FileSystemConfigLoader({\n\t\textends: [\"html-validate:recommended\"],\n\t});\n\tconst htmlvalidate = new HtmlValidate(loader);\n\treturn htmlvalidate.validateString(markup, filename, config);\n}\n\nexport type ValidateStringFn = typeof validateString;\n\nrunAsWorker(validateString);\n"],"names":["workerData","parentPort","msg","FileSystemConfigLoader","HtmlValidate"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,SAAS,YAAkE,EAAa,EAAA;AACvF,EAAA,IAAI,CAACA,8BAAY,EAAA;AAChB,IAAA;AAAA;AAGD,EAAM,MAAA,EAAE,UAAY,EAAA,YAAA,EAAiB,GAAAA,8BAAA;AACrC,EAAA,MAAM,gBAAmB,GAAA,IAAI,UAAW,CAAA,YAAA,EAAc,GAAG,CAAC,CAAA;AAG1D,EAAAC,8BAAA,CAAY,GAAG,SAAW,EAAA,CAAC,EAAE,EAAA,EAAI,MAA+C,KAAA;AAC/E,IAAA,eAAe,KAAuB,GAAA;AACrC,MAAA,IAAI,SAAY,GAAA,KAAA;AAChB,MAAM,MAAA,kBAAA,GAAqB,CAACC,IAA0C,KAAA;AACrE,QAAA,IAAIA,IAAI,CAAA,EAAA,KAAO,EAAMA,IAAAA,IAAAA,CAAI,QAAQ,OAAS,EAAA;AACzC,UAAY,SAAA,GAAA,IAAA;AAAA;AACb,OACD;AACA,MAAW,UAAA,CAAA,EAAA,CAAG,WAAW,kBAAkB,CAAA;AAC3C,MAAI,IAAA,GAAA;AACJ,MAAI,IAAA;AACH,QAAA,GAAA,GAAM,EAAE,EAAI,EAAA,MAAA,EAAQ,MAAM,EAAG,CAAA,GAAG,IAAI,CAAE,EAAA;AAAA,eAC9B,KAAgB,EAAA;AACxB,QAAM,GAAA,GAAA;AAAA,UACL,EAAA;AAAA,UACA,OAAO,KAAiB,YAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D;AAAA;AAED,MAAW,UAAA,CAAA,GAAA,CAAI,WAAW,kBAAkB,CAAA;AAE5C,MAAA,IAAI,SAAW,EAAA;AACd,QAAA;AAAA;AAED,MAAA,UAAA,CAAW,YAAY,GAAG,CAAA;AAC1B,MAAQ,OAAA,CAAA,GAAA,CAAI,gBAAkB,EAAA,CAAA,EAAG,CAAC,CAAA;AAClC,MAAQ,OAAA,CAAA,MAAA,CAAO,kBAAkB,CAAC,CAAA;AAAA;AAGnC,IAAM,KAAA,EAAA;AAAA,GACN,CAAA;AACF;AAEA,SAAS,cAAA,CAAe,MAAgB,EAAA,QAAA,EAAkB,MAAqC,EAAA;AAC9F,EAAM,MAAA,MAAA,GAAS,IAAIC,iCAAuB,CAAA;AAAA,IACzC,OAAA,EAAS,CAAC,2BAA2B;AAAA,GACrC,CAAA;AACD,EAAM,MAAA,YAAA,GAAe,IAAIC,uBAAA,CAAa,MAAM,CAAA;AAC5C,EAAA,OAAO,YAAa,CAAA,cAAA,CAAe,MAAQ,EAAA,QAAA,EAAU,MAAM,CAAA;AAC5D;AAIA,WAAA,CAAY,cAAc,CAAA;;"}
|
|
@@ -32,7 +32,7 @@ function isWorkerError(value) {
|
|
|
32
32
|
return "error" in value;
|
|
33
33
|
}
|
|
34
34
|
function receiveMessageWithId(port, expectedId) {
|
|
35
|
-
const timeout =
|
|
35
|
+
const timeout = 3e4;
|
|
36
36
|
const status = Atomics.wait(sharedBufferView, 0, 0, timeout);
|
|
37
37
|
Atomics.store(sharedBufferView, 0, 0);
|
|
38
38
|
if (!["ok", "not-equal"].includes(status)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matcher-utils.js","sources":["../../src/jest/utils/is-thenable.ts","../../src/jest/utils/diverge.ts","../../src/jest/utils/flatten-messages.ts","../../src/jest/worker/create-sync-fn.ts"],"sourcesContent":["/**\n * @internal\n */\nexport function isThenable<T>(value: T | Promise<T>): value is Promise<T> {\n\treturn value && typeof value === \"object\" && \"then\" in value && typeof value.then === \"function\";\n}\n","import { isThenable } from \"./is-thenable\";\nimport { type MatcherContext } from \"./matcher-context\";\nimport { type MatcherResult } from \"./matcher-result\";\n\ntype SyncCallback<T, TArgs extends any[]> = (\n\tthis: MatcherContext,\n\tactual: T,\n\t...args: TArgs\n) => MatcherResult;\n\n/**\n * @internal\n */\nexport interface MaybeAsyncCallback<TActual, TArgs extends any[]> {\n\t(this: MatcherContext, actual: TActual, ...args: TArgs): MatcherResult;\n\t(this: MatcherContext, actual: Promise<TActual>, ...args: TArgs): Promise<MatcherResult>;\n}\n\n/**\n * Creates a wrapped function based on the passed function.\n *\n * The returned function takes either a `T` or `Promise<T>`. If `T` the result\n * will be synchronous or if `Promise<T>` the result will be asynchronous.\n *\n * In practice this means that if you pass a synchronous object into it you will\n * maintain synchronous code but if you pass an asynchronous object you must\n * await the result.\n *\n * @internal\n */\nexport function diverge<T, TArgs extends any[]>(\n\tfn: SyncCallback<T, TArgs>,\n): MaybeAsyncCallback<T, TArgs> {\n\tfunction diverged(this: MatcherContext, actual: T, ...args: TArgs): MatcherResult;\n\tfunction diverged(\n\t\tthis: MatcherContext,\n\t\tactual: Promise<T>,\n\t\t...args: TArgs\n\t): Promise<MatcherResult>;\n\tfunction diverged(\n\t\tthis: MatcherContext,\n\t\tactual: T | Promise<T>,\n\t\t...args: TArgs\n\t): MatcherResult | Promise<MatcherResult> {\n\t\tif (isThenable(actual)) {\n\t\t\treturn actual.then((resolved) => fn.call(this, resolved, ...args));\n\t\t} else {\n\t\t\treturn fn.call(this, actual, ...args);\n\t\t}\n\t}\n\treturn diverged;\n}\n","import { type Message } from \"../../message\";\nimport { type Report, type Result } from \"../../reporter\";\n\n/**\n * Takes all messages from all files and flattens to a single array.\n */\nexport function flattenMessages(report: Report): Message[] {\n\treturn report.results.reduce((aggregated: Message[], result: Result) => {\n\t\treturn aggregated.concat(result.messages);\n\t}, []);\n}\n","import {\n\ttype MessagePort,\n\tMessageChannel,\n\tWorker,\n\treceiveMessageOnPort,\n} from \"node:worker_threads\";\nimport { legacyRequire } from \"../../resolve\";\nimport {\n\ttype AnyAsyncFn,\n\ttype AnyFn,\n\ttype MainToWorkerCommandMessage,\n\ttype MainToWorkerMessage,\n\ttype Syncify,\n\ttype WorkerToMainError,\n\ttype WorkerToMainMessage,\n} from \"./types\";\n\n/**\n * This is all based on the synckit library but without all the extra stuff such\n * as typescript, esbuld, pnp etc.\n */\n\nconst INT32_BYTES = 4;\nconst syncFnCache = new Map<string, AnyFn>();\nconst sharedBuffer = new SharedArrayBuffer(INT32_BYTES);\nconst sharedBufferView = new Int32Array(sharedBuffer, 0, 1);\n\nfunction isWorkerError<T>(value: WorkerToMainMessage<T>): value is WorkerToMainError {\n\treturn \"error\" in value;\n}\n\nfunction receiveMessageWithId<R>(port: MessagePort, expectedId: number): WorkerToMainMessage<R> {\n\tconst timeout =
|
|
1
|
+
{"version":3,"file":"matcher-utils.js","sources":["../../src/jest/utils/is-thenable.ts","../../src/jest/utils/diverge.ts","../../src/jest/utils/flatten-messages.ts","../../src/jest/worker/create-sync-fn.ts"],"sourcesContent":["/**\n * @internal\n */\nexport function isThenable<T>(value: T | Promise<T>): value is Promise<T> {\n\treturn value && typeof value === \"object\" && \"then\" in value && typeof value.then === \"function\";\n}\n","import { isThenable } from \"./is-thenable\";\nimport { type MatcherContext } from \"./matcher-context\";\nimport { type MatcherResult } from \"./matcher-result\";\n\ntype SyncCallback<T, TArgs extends any[]> = (\n\tthis: MatcherContext,\n\tactual: T,\n\t...args: TArgs\n) => MatcherResult;\n\n/**\n * @internal\n */\nexport interface MaybeAsyncCallback<TActual, TArgs extends any[]> {\n\t(this: MatcherContext, actual: TActual, ...args: TArgs): MatcherResult;\n\t(this: MatcherContext, actual: Promise<TActual>, ...args: TArgs): Promise<MatcherResult>;\n}\n\n/**\n * Creates a wrapped function based on the passed function.\n *\n * The returned function takes either a `T` or `Promise<T>`. If `T` the result\n * will be synchronous or if `Promise<T>` the result will be asynchronous.\n *\n * In practice this means that if you pass a synchronous object into it you will\n * maintain synchronous code but if you pass an asynchronous object you must\n * await the result.\n *\n * @internal\n */\nexport function diverge<T, TArgs extends any[]>(\n\tfn: SyncCallback<T, TArgs>,\n): MaybeAsyncCallback<T, TArgs> {\n\tfunction diverged(this: MatcherContext, actual: T, ...args: TArgs): MatcherResult;\n\tfunction diverged(\n\t\tthis: MatcherContext,\n\t\tactual: Promise<T>,\n\t\t...args: TArgs\n\t): Promise<MatcherResult>;\n\tfunction diverged(\n\t\tthis: MatcherContext,\n\t\tactual: T | Promise<T>,\n\t\t...args: TArgs\n\t): MatcherResult | Promise<MatcherResult> {\n\t\tif (isThenable(actual)) {\n\t\t\treturn actual.then((resolved) => fn.call(this, resolved, ...args));\n\t\t} else {\n\t\t\treturn fn.call(this, actual, ...args);\n\t\t}\n\t}\n\treturn diverged;\n}\n","import { type Message } from \"../../message\";\nimport { type Report, type Result } from \"../../reporter\";\n\n/**\n * Takes all messages from all files and flattens to a single array.\n */\nexport function flattenMessages(report: Report): Message[] {\n\treturn report.results.reduce((aggregated: Message[], result: Result) => {\n\t\treturn aggregated.concat(result.messages);\n\t}, []);\n}\n","import {\n\ttype MessagePort,\n\tMessageChannel,\n\tWorker,\n\treceiveMessageOnPort,\n} from \"node:worker_threads\";\nimport { legacyRequire } from \"../../resolve\";\nimport {\n\ttype AnyAsyncFn,\n\ttype AnyFn,\n\ttype MainToWorkerCommandMessage,\n\ttype MainToWorkerMessage,\n\ttype Syncify,\n\ttype WorkerToMainError,\n\ttype WorkerToMainMessage,\n} from \"./types\";\n\n/**\n * This is all based on the synckit library but without all the extra stuff such\n * as typescript, esbuld, pnp etc.\n */\n\nconst INT32_BYTES = 4;\nconst syncFnCache = new Map<string, AnyFn>();\nconst sharedBuffer = new SharedArrayBuffer(INT32_BYTES);\nconst sharedBufferView = new Int32Array(sharedBuffer, 0, 1);\n\nfunction isWorkerError<T>(value: WorkerToMainMessage<T>): value is WorkerToMainError {\n\treturn \"error\" in value;\n}\n\nfunction receiveMessageWithId<R>(port: MessagePort, expectedId: number): WorkerToMainMessage<R> {\n\tconst timeout = 30000;\n\tconst status = Atomics.wait(sharedBufferView, 0, 0, timeout);\n\tAtomics.store(sharedBufferView, 0, 0);\n\n\tif (![\"ok\", \"not-equal\"].includes(status)) {\n\t\tconst abortMsg: MainToWorkerCommandMessage = {\n\t\t\tid: expectedId,\n\t\t\tcmd: \"abort\",\n\t\t};\n\t\tport.postMessage(abortMsg);\n\t\tthrow new Error(`Internal error: Atomics.wait() failed: ${status}`);\n\t}\n\n\tconst reply = receiveMessageOnPort(port) as { message: WorkerToMainMessage<R> };\n\tconst { id, ...message } = reply.message;\n\n\tif (id < expectedId) {\n\t\treturn receiveMessageWithId(port, expectedId);\n\t}\n\n\tif (expectedId !== id) {\n\t\tthrow new Error(`Internal error: Expected id ${String(expectedId)} but got id ${String(id)}`);\n\t}\n\n\treturn { id, ...message };\n}\n\nfunction startWorkerThread<R, T extends AnyAsyncFn<R>>(\n\tworkerPath: string,\n): (...args: Parameters<T>) => R {\n\tconst { port1: mainPort, port2: workerPort } = new MessageChannel();\n\tconst workerPathUrl = legacyRequire.resolve(workerPath);\n\tconst worker = new Worker(workerPathUrl, {\n\t\teval: false,\n\t\tworkerData: { sharedBuffer, workerPort },\n\t\ttransferList: [workerPort],\n\t});\n\n\tlet nextID = 0;\n\n\tconst syncFn = (...args: Parameters<T>): R => {\n\t\tconst id = nextID++;\n\t\tconst msg: MainToWorkerMessage<Parameters<T>> = { id, args };\n\n\t\tworker.postMessage(msg);\n\n\t\tconst reply = receiveMessageWithId<R>(mainPort, id);\n\n\t\tif (isWorkerError(reply)) {\n\t\t\tthrow new Error(reply.error);\n\t\t}\n\n\t\treturn reply.result;\n\t};\n\n\tworker.unref();\n\n\treturn syncFn;\n}\n\nexport function createSyncFn<T extends AnyAsyncFn<R>, R = unknown>(workerPath: string): Syncify<T> {\n\tconst cachedSyncFn = syncFnCache.get(workerPath);\n\tif (cachedSyncFn) {\n\t\treturn cachedSyncFn as Syncify<T>;\n\t}\n\n\tconst syncFn = startWorkerThread<R, T>(workerPath);\n\tsyncFnCache.set(workerPath, syncFn);\n\treturn syncFn as Syncify<T>;\n}\n"],"names":["receiveMessageOnPort","MessageChannel","legacyRequire","Worker"],"mappings":"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"}
|
package/dist/es/cli.js
CHANGED
package/dist/es/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sources":["../../src/cli/expand-files.ts","../../src/cli/formatter.ts","../../src/cli/is-ignored.ts","../../src/cli/init.ts","../../src/cli/parse-severity.ts","../../src/cli/get-rule-config.ts","../../src/cli/cli.ts","../../src/cli/errors/handle-schema-validation-error.ts","../../src/cli/errors/import-resolve-missing-error.ts","../../src/cli/mode.ts","../../src/cli/actions/lint.ts","../../src/cli/actions/init.ts","../../src/cli/actions/print-config.ts","../../src/cli/json.ts","../../src/cli/actions/dump.ts","../../src/cli/have-import-meta-resolve.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"node:path\";\nimport { globSync } from \"glob\";\n\nconst DEFAULT_EXTENSIONS = [\"html\"];\n\n/**\n * @public\n */\nexport interface ExpandOptions {\n\t/**\n\t * Working directory. Defaults to `process.cwd()`.\n\t */\n\tcwd?: string;\n\n\t/**\n\t * List of extensions to search for when expanding directories. Extensions\n\t * should be passed without leading dot, e.g. \"html\" instead of \".html\".\n\t */\n\textensions?: string[];\n}\n\nfunction isDirectory(filename: string): boolean {\n\tconst st = fs.statSync(filename);\n\treturn st.isDirectory();\n}\n\nfunction join(stem: string, filename: string): string {\n\tif (path.isAbsolute(filename)) {\n\t\treturn path.normalize(filename);\n\t} else {\n\t\treturn path.normalize(path.join(stem, filename));\n\t}\n}\n\nfunction directoryPattern(extensions: string[]): string {\n\tswitch (extensions.length) {\n\t\tcase 0:\n\t\t\treturn \"**/*\";\n\t\tcase 1:\n\t\t\treturn `**/*.${extensions[0]}`;\n\t\tdefault:\n\t\t\treturn `**/*.{${extensions.join(\",\")}}`;\n\t}\n}\n\n/**\n * Takes a number of file patterns (globs) and returns array of expanded\n * filenames.\n */\nexport function expandFiles(patterns: string[], options: ExpandOptions): string[] {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst extensions = options.extensions ?? DEFAULT_EXTENSIONS;\n\n\tconst files = patterns.reduce((result: string[], pattern: string) => {\n\t\t/* process - as standard input */\n\t\tif (pattern === \"-\") {\n\t\t\tresult.push(\"/dev/stdin\");\n\t\t\treturn result;\n\t\t}\n\n\t\tfor (const filename of globSync(pattern, { cwd })) {\n\t\t\t/* if file is a directory recursively expand files from it */\n\t\t\tconst fullpath = join(cwd, filename);\n\t\t\tif (isDirectory(fullpath)) {\n\t\t\t\tconst dir = expandFiles([directoryPattern(extensions)], { ...options, cwd: fullpath });\n\t\t\t\tresult = result.concat(dir.map((cur) => join(filename, cur)));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tresult.push(fullpath);\n\t\t}\n\n\t\treturn result.sort((a, b) => {\n\t\t\tconst pa = a.split(\"/\").length;\n\t\t\tconst pb = b.split(\"/\").length;\n\t\t\tif (pa !== pb) {\n\t\t\t\treturn pa - pb;\n\t\t\t} else {\n\t\t\t\treturn a > b ? 1 : -1;\n\t\t\t}\n\t\t});\n\t}, []);\n\n\t/* only return unique matches */\n\treturn Array.from(new Set(files));\n}\n","import fs from \"fs\";\nimport path from \"node:path\";\nimport { type Formatter, type Report, type Result, UserError, formatterFactory } from \"..\";\nimport { ensureError } from \"../error\";\nimport { legacyRequire } from \"../resolve\";\n\ntype WrappedFormatter = (results: Result[]) => string;\n\nfunction wrap(formatter: Formatter, dst: string): (results: Result[]) => string {\n\treturn (results: Result[]) => {\n\t\tconst output = formatter(results);\n\t\tif (dst) {\n\t\t\tconst dir = path.dirname(dst);\n\t\t\tif (!fs.existsSync(dir)) {\n\t\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t\t}\n\t\t\tfs.writeFileSync(dst, output, \"utf-8\");\n\t\t\treturn \"\";\n\t\t} else {\n\t\t\treturn output;\n\t\t}\n\t};\n}\n\nfunction loadFormatter(name: string): Formatter {\n\tconst fn = formatterFactory(name);\n\tif (fn) {\n\t\treturn fn;\n\t}\n\n\ttry {\n\t\treturn legacyRequire(name) as Formatter;\n\t} catch (error: unknown) {\n\t\tthrow new UserError(`No formatter named \"${name}\"`, ensureError(error));\n\t}\n}\n\nexport function getFormatter(formatters: string): (report: Report) => string {\n\tconst fn: WrappedFormatter[] = formatters.split(\",\").map((cur) => {\n\t\tconst [name, dst] = cur.split(\"=\", 2);\n\t\tconst fn = loadFormatter(name);\n\t\treturn wrap(fn, dst);\n\t});\n\treturn (report: Report) => {\n\t\treturn fn\n\t\t\t.map((formatter: WrappedFormatter) => formatter(report.results))\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"\\n\");\n\t};\n}\n","import fs from \"fs\";\nimport path from \"node:path\";\nimport ignore, { type Ignore } from \"ignore\";\n\nexport class IsIgnored {\n\t/** Cache for parsed .htmlvalidateignore files */\n\tprivate cacheIgnore: Map<string, Ignore | undefined>;\n\n\tpublic constructor() {\n\t\tthis.cacheIgnore = new Map();\n\t}\n\n\t/**\n\t * Searches \".htmlvalidateignore\" files from filesystem and returns `true` if\n\t * one of them contains a pattern matching given filename.\n\t */\n\tpublic isIgnored(filename: string): boolean {\n\t\treturn this.match(filename);\n\t}\n\n\t/**\n\t * Clear cache\n\t */\n\tpublic clearCache(): void {\n\t\tthis.cacheIgnore.clear();\n\t}\n\n\tprivate match(target: string): boolean {\n\t\tlet current = path.dirname(target);\n\n\t\t// eslint-disable-next-line no-constant-condition, @typescript-eslint/no-unnecessary-condition -- breaks out when filesystem is traversed\n\t\twhile (true) {\n\t\t\tconst relative = path.relative(current, target);\n\t\t\tconst filename = path.join(current, \".htmlvalidateignore\");\n\n\t\t\t/* test filename (relative to the ignore file) against the patterns */\n\t\t\tconst ig = this.parseFile(filename);\n\t\t\tif (ig?.ignores(relative)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t/* get the parent directory */\n\t\t\tconst child = current;\n\t\t\tcurrent = path.dirname(current);\n\n\t\t\t/* stop if this is the root directory */\n\t\t\tif (current === child) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate parseFile(filename: string): Ignore | undefined {\n\t\tif (this.cacheIgnore.has(filename)) {\n\t\t\treturn this.cacheIgnore.get(filename);\n\t\t}\n\n\t\tif (!fs.existsSync(filename)) {\n\t\t\tthis.cacheIgnore.set(filename, undefined);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst content = fs.readFileSync(filename, \"utf-8\");\n\t\tconst ig = ignore().add(content);\n\t\tthis.cacheIgnore.set(filename, ig);\n\t\treturn ig;\n\t}\n}\n","import fs from \"fs\";\nimport deepmerge from \"deepmerge\";\nimport prompts from \"prompts\";\nimport { type ConfigData } from \"..\";\n\n/**\n * @public\n */\nexport interface InitResult {\n\tfilename: string;\n}\n\nexport enum Frameworks {\n\tangularjs = \"AngularJS\",\n\tvuejs = \"Vue.js\",\n\tmarkdown = \"Markdown\",\n}\n\nconst frameworkConfig: Record<string, ConfigData> = {\n\t[Frameworks.angularjs]: {\n\t\ttransform: {\n\t\t\t\"^.*\\\\.js$\": \"html-validate-angular/js\",\n\t\t\t\"^.*\\\\.html$\": \"html-validate-angular/html\",\n\t\t},\n\t},\n\t[Frameworks.vuejs]: {\n\t\tplugins: [\"html-validate-vue\"],\n\t\textends: [\"html-validate-vue:recommended\"],\n\t\ttransform: {\n\t\t\t\"^.*\\\\.vue$\": \"html-validate-vue\",\n\t\t},\n\t},\n\t[Frameworks.markdown]: {\n\t\ttransform: {\n\t\t\t\"^.*\\\\.md$\": \"html-validate-markdown\",\n\t\t},\n\t},\n};\n\nfunction addFrameworks(src: ConfigData, frameworks: string[]): ConfigData {\n\tlet config = src;\n\tfor (const framework of frameworks) {\n\t\tconfig = deepmerge(config, frameworkConfig[framework]);\n\t}\n\treturn config;\n}\n\nfunction writeConfig(dst: string, config: ConfigData): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tfs.writeFile(dst, JSON.stringify(config, null, 2), (err) => {\n\t\t\tif (err) reject(err);\n\t\t\tresolve();\n\t\t});\n\t});\n}\n\nexport async function init(cwd: string): Promise<InitResult> {\n\tconst filename = `${cwd}/.htmlvalidate.json`;\n\tconst exists = fs.existsSync(filename);\n\tconst initialConfig: ConfigData = {\n\t\telements: [\"html5\"],\n\t\textends: [\"html-validate:recommended\"],\n\t};\n\n\t/* confirm overwrite */\n\tif (exists) {\n\t\tconst result = await prompts({\n\t\t\tname: \"overwrite\",\n\t\t\ttype: \"confirm\",\n\t\t\tmessage: \"A .htmlvalidate.json file already exists, do you want to overwrite it?\",\n\t\t});\n\t\tif (!result.overwrite) {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- technical debt, should not result in failure at all */\n\t\t\treturn Promise.reject();\n\t\t}\n\t}\n\n\tconst questions: prompts.PromptObject[] = [\n\t\t{\n\t\t\tname: \"frameworks\",\n\t\t\ttype: \"multiselect\",\n\t\t\tchoices: [\n\t\t\t\t{ title: Frameworks.angularjs, value: Frameworks.angularjs },\n\t\t\t\t{ title: Frameworks.vuejs, value: Frameworks.vuejs },\n\t\t\t\t{ title: Frameworks.markdown, value: Frameworks.markdown },\n\t\t\t],\n\t\t\tmessage: \"Support additional frameworks?\",\n\t\t},\n\t];\n\n\t/* prompt user for questions */\n\tconst answers = await prompts(questions);\n\n\t/* write configuration to file */\n\tlet config = initialConfig;\n\tconfig = addFrameworks(config, answers.frameworks as string[]);\n\tawait writeConfig(filename, config);\n\n\treturn {\n\t\tfilename,\n\t};\n}\n","import { type RuleSeverity } from \"../config\";\n\n/**\n * @internal\n */\nexport function parseSeverity(ruleId: string, severity: string): RuleSeverity {\n\tswitch (severity) {\n\t\tcase \"off\":\n\t\tcase \"0\":\n\t\t\treturn \"off\";\n\t\tcase \"warn\":\n\t\tcase \"1\":\n\t\t\treturn \"warn\";\n\t\tcase \"error\":\n\t\tcase \"2\":\n\t\t\treturn \"error\";\n\t\tdefault:\n\t\t\tthrow new Error(`Invalid severity \"${severity}\" for rule \"${ruleId}\"`);\n\t}\n}\n","import { type RuleConfig, type RuleSeverity } from \"../config\";\nimport { parseSeverity } from \"./parse-severity\";\n\nfunction parseItem(value: string): { ruleId: string; severity: RuleSeverity } {\n\tconst [ruleId, severity = \"error\"] = value.split(\":\", 2);\n\treturn { ruleId, severity: parseSeverity(ruleId, severity) };\n}\n\n/**\n * @internal\n */\nexport function getRuleConfig(values: string | string[]): RuleConfig {\n\tif (typeof values === \"string\") {\n\t\treturn getRuleConfig([values]);\n\t}\n\n\treturn values.reduce<RuleConfig>((parsedRules, value) => {\n\t\tconst { ruleId, severity } = parseItem(value.trim());\n\t\treturn { [ruleId]: severity, ...parsedRules };\n\t}, {});\n}\n","import path from \"node:path/posix\";\nimport {\n\ttype ConfigData,\n\ttype ConfigLoader,\n\ttype Report,\n\tFileSystemConfigLoader,\n\tUserError,\n\tHtmlValidate,\n\tesmResolver,\n} from \"..\";\nimport { type ExpandOptions, expandFiles } from \"./expand-files\";\nimport { getFormatter } from \"./formatter\";\nimport { IsIgnored } from \"./is-ignored\";\nimport { type InitResult, init } from \"./init\";\nimport { getRuleConfig } from \"./get-rule-config\";\n\nconst resolver = esmResolver();\n\nfunction defaultConfig(preset: string): ConfigData {\n\tconst presets = preset.split(\",\").map((it) => `html-validate:${it}`);\n\treturn {\n\t\textends: presets,\n\t};\n}\n\n/**\n * @public\n */\nexport interface CLIOptions {\n\tconfigFile?: string;\n\t/** Comma-separated list of presets to use */\n\tpreset?: string;\n\trules?: string | string[];\n}\n\nasync function getBaseConfig(preset?: string, filename?: string): Promise<ConfigData> {\n\tif (filename) {\n\t\tconst configData = await resolver.resolveConfig(path.resolve(filename), { cache: false });\n\t\tif (!configData) {\n\t\t\tthrow new UserError(`Failed to read configuration from \"${filename}\"`);\n\t\t}\n\t\treturn configData;\n\t} else {\n\t\treturn defaultConfig(preset ?? \"recommended\");\n\t}\n}\n\n/**\n * @public\n */\nexport class CLI {\n\tprivate options: CLIOptions;\n\tprivate config: ConfigData | null;\n\tprivate loader: ConfigLoader | null;\n\tprivate ignored: IsIgnored;\n\n\t/**\n\t * Create new CLI helper.\n\t *\n\t * Can be used to create tooling with similar properties to bundled CLI\n\t * script.\n\t */\n\tpublic constructor(options?: CLIOptions) {\n\t\tthis.options = options ?? {};\n\t\tthis.config = null;\n\t\tthis.loader = null;\n\t\tthis.ignored = new IsIgnored();\n\t}\n\n\t/**\n\t * Returns list of files matching patterns and are not ignored. Filenames will\n\t * have absolute paths.\n\t *\n\t * @public\n\t */\n\tpublic async expandFiles(patterns: string[], options: ExpandOptions = {}): Promise<string[]> {\n\t\t/* technical debt: expandFiles(..) should actually be async as well */\n\t\tconst files = expandFiles(patterns, options).filter((filename) => !this.isIgnored(filename));\n\t\treturn Promise.resolve(files);\n\t}\n\n\tpublic getFormatter(formatters: string): Promise<(report: Report) => string> {\n\t\t/* while not actually async the API boundary returns a Promise in case it needs to in the future, i.e a ESM-based formatter */\n\t\treturn Promise.resolve(getFormatter(formatters));\n\t}\n\n\t/**\n\t * Initialize project with a new configuration.\n\t *\n\t * A new `.htmlvalidate.json` file will be placed in the path provided by\n\t * `cwd`.\n\t */\n\tpublic init(cwd: string): Promise<InitResult> {\n\t\treturn init(cwd);\n\t}\n\n\t/**\n\t * Clear cache.\n\t *\n\t * Previously fetched [[HtmlValidate]] instances must either be fetched again\n\t * or call [[HtmlValidate.flushConfigCache]].\n\t */\n\t/* istanbul ignore next: each method is tested separately */\n\tpublic clearCache(): Promise<void> {\n\t\tif (this.loader) {\n\t\t\tthis.loader.flushCache();\n\t\t}\n\t\tthis.ignored.clearCache();\n\t\treturn Promise.resolve();\n\t}\n\n\t/**\n\t * Get HtmlValidate instance with configuration based on options passed to the\n\t * constructor.\n\t *\n\t * @internal\n\t */\n\tpublic async getLoader(): Promise<ConfigLoader> {\n\t\tif (!this.loader) {\n\t\t\tconst config = await this.getConfig();\n\t\t\tthis.loader = new FileSystemConfigLoader([resolver], config);\n\t\t}\n\t\treturn this.loader;\n\t}\n\n\t/**\n\t * Get HtmlValidate instance with configuration based on options passed to the\n\t * constructor.\n\t *\n\t * @public\n\t */\n\tpublic async getValidator(): Promise<HtmlValidate> {\n\t\tconst loader = await this.getLoader();\n\t\treturn new HtmlValidate(loader);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic async getConfig(): Promise<ConfigData> {\n\t\tif (!this.config) {\n\t\t\tthis.config = await this.resolveConfig();\n\t\t}\n\t\treturn this.config;\n\t}\n\n\t/**\n\t * Searches \".htmlvalidateignore\" files from filesystem and returns `true` if\n\t * one of them contains a pattern matching given filename.\n\t */\n\tprivate isIgnored(filename: string): boolean {\n\t\treturn this.ignored.isIgnored(filename);\n\t}\n\n\tprivate async resolveConfig(): Promise<ConfigData> {\n\t\tconst { options } = this;\n\t\tconst havePreset = Boolean(options.preset);\n\t\tconst haveConfig = Boolean(options.configFile);\n\t\tconst config = await getBaseConfig(options.preset, options.configFile);\n\t\tif (options.rules) {\n\t\t\tif (havePreset || haveConfig) {\n\t\t\t\t/* when rules are explicitly specified and combined with an explicit\n\t\t\t\t * preset or configuration file we merge the result as the user would\n\t\t\t\texpect rules from the preset or configuration files to be used */\n\t\t\t\tconfig.rules = { ...config.rules, ...getRuleConfig(options.rules) };\n\t\t\t} else {\n\t\t\t\t/* if neither an explicit configuration file or preset is passed as a\n\t\t\t\t * CLI argument a default configuration is loaded but since the user has\n\t\t\t\t * specified one or more rules explicitly we overwrite both the default\n\t\t\t\t * preset and the default rules with the explicit rules */\n\t\t\t\tconfig.extends = [];\n\t\t\t\tconfig.rules = getRuleConfig(options.rules);\n\t\t\t}\n\t\t}\n\t\treturn config;\n\t}\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport betterAjvErrors from \"@sidvind/better-ajv-errors\";\nimport kleur from \"kleur\";\nimport { type SchemaValidationError } from \"../../error\";\n\nfunction prettyError(err: SchemaValidationError): string {\n\tlet json: string | undefined;\n\tif (err.filename && fs.existsSync(err.filename)) {\n\t\tjson = fs.readFileSync(err.filename, \"utf-8\");\n\t}\n\treturn betterAjvErrors(err.schema, err.obj, err.errors, {\n\t\tformat: \"cli\",\n\t\tindent: 2,\n\t\tjson,\n\t});\n}\n\n/**\n * @internal\n */\nexport function handleSchemaValidationError(console: Console, err: SchemaValidationError): void {\n\tif (err.filename) {\n\t\tconst filename = path.relative(process.cwd(), err.filename);\n\t\tconsole.error(kleur.red(`A configuration error was found in \"${filename}\":`));\n\t} else {\n\t\tconsole.error(kleur.red(`A configuration error was found:`));\n\t}\n\tconsole.group();\n\t{\n\t\tconsole.error(prettyError(err));\n\t}\n\tconsole.groupEnd();\n}\n","import kleur from \"kleur\";\nimport { UserError } from \"../../error\";\nimport { engines } from \"../../../package.json\";\n\n/**\n * @internal\n */\nexport class ImportResolveMissingError extends UserError {\n\tpublic constructor() {\n\t\tconst message = `import.meta.resolve(..) is not available on this system`;\n\t\tsuper(message);\n\t\tError.captureStackTrace(this, ImportResolveMissingError);\n\t\tthis.name = ImportResolveMissingError.name;\n\t}\n\n\tpublic prettyFormat(): string {\n\t\tconst { message } = this;\n\t\tconst currentVersion = process.version;\n\t\tconst requiredVersion = engines.node\n\t\t\t.split(\"||\")\n\t\t\t.map((it) => `v${it.replace(/^[^\\d]+/, \"\").trim()}`);\n\t\treturn [\n\t\t\tkleur.red(`Error: ${message}.`),\n\t\t\t\"\",\n\t\t\t`Either ensure you are running a supported NodeJS version:`,\n\t\t\t` Current: ${currentVersion}`,\n\t\t\t` Required: ${requiredVersion.join(\", \")}, or later`,\n\t\t\t`Or set NODE_OPTIONS=\"--experimental-import-meta-resolve\"`,\n\t\t].join(\"\\n\");\n\t}\n}\n","/**\n * @internal\n */\nexport enum Mode {\n\tLINT,\n\tINIT,\n\tDUMP_EVENTS,\n\tDUMP_TOKENS,\n\tDUMP_TREE,\n\tDUMP_SOURCE,\n\tPRINT_CONFIG,\n}\n\n/**\n * @internal\n */\nexport function modeToFlag(mode: Mode.LINT): null;\nexport function modeToFlag(mode: Exclude<Mode, Mode.LINT>): string;\nexport function modeToFlag(mode: Mode): string | null {\n\tswitch (mode) {\n\t\tcase Mode.LINT:\n\t\t\treturn null;\n\t\tcase Mode.INIT:\n\t\t\treturn \"--init\";\n\t\tcase Mode.DUMP_EVENTS:\n\t\t\treturn \"--dump-events\";\n\t\tcase Mode.DUMP_TOKENS:\n\t\t\treturn \"--dump-tokens\";\n\t\tcase Mode.DUMP_TREE:\n\t\t\treturn \"--dump-tree\";\n\t\tcase Mode.DUMP_SOURCE:\n\t\t\treturn \"--dump-source\";\n\t\tcase Mode.PRINT_CONFIG:\n\t\t\treturn \"--print-config\";\n\t}\n}\n","import kleur from \"kleur\";\nimport { type HtmlValidate, type Report, type Result, Reporter } from \"../..\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport interface LintOptions {\n\tformatter: (report: Report) => string;\n\tmaxWarnings: number;\n\tstdinFilename: false | string;\n}\n\nfunction renameStdin(report: Report, filename: string): void {\n\tconst stdin = report.results.find((cur: Result) => cur.filePath === \"/dev/stdin\");\n\tif (stdin) {\n\t\tstdin.filePath = filename;\n\t}\n}\n\nexport async function lint(\n\thtmlvalidate: HtmlValidate,\n\toutput: WritableStreamLike,\n\tfiles: string[],\n\toptions: LintOptions,\n): Promise<boolean> {\n\tconst reports: Report[] = [];\n\tfor (const filename of files) {\n\t\ttry {\n\t\t\treports.push(await htmlvalidate.validateFile(filename));\n\t\t} catch (err) {\n\t\t\tconst message = kleur.red(`Validator crashed when parsing \"${filename}\"`);\n\t\t\toutput.write(`${message}\\n`);\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tconst merged = Reporter.merge(reports);\n\n\t/* rename stdin if an explicit filename was passed */\n\tif (options.stdinFilename) {\n\t\trenameStdin(merged, options.stdinFilename);\n\t}\n\n\toutput.write(options.formatter(merged));\n\n\tif (options.maxWarnings >= 0 && merged.warningCount > options.maxWarnings) {\n\t\toutput.write(\n\t\t\t`\\nhtml-validate found too many warnings (maximum: ${String(options.maxWarnings)}).\\n`,\n\t\t);\n\t\treturn false;\n\t}\n\n\treturn merged.valid;\n}\n","import { type CLI } from \"../cli\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport interface InitOptions {\n\tcwd: string;\n}\n\nexport async function init(\n\tcli: CLI,\n\toutput: WritableStreamLike,\n\toptions: InitOptions,\n): Promise<boolean> {\n\tconst result = await cli.init(options.cwd);\n\toutput.write(`Configuration written to \"${result.filename}\"\\n`);\n\treturn true;\n}\n","import { type HtmlValidate } from \"../..\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport async function printConfig(\n\thtmlvalidate: HtmlValidate,\n\toutput: WritableStreamLike,\n\tfiles: string[],\n): Promise<boolean> {\n\tif (files.length > 1) {\n\t\toutput.write(`\\`--print-config\\` expected a single filename but got multiple:\\n\\n`);\n\t\tfor (const filename of files) {\n\t\t\toutput.write(` - ${filename}\\n`);\n\t\t}\n\t\toutput.write(\"\\n\");\n\t\treturn false;\n\t}\n\tconst config = await htmlvalidate.getConfigFor(files[0]);\n\tconst json = JSON.stringify(config.getConfigData(), null, 2);\n\toutput.write(`${json}\\n`);\n\treturn true;\n}\n","import { type EventDump, type Location } from \"..\";\n\nconst jsonIgnored = [\n\t\"annotation\",\n\t\"blockedRules\",\n\t\"cache\",\n\t\"closed\",\n\t\"depth\",\n\t\"disabledRules\",\n\t\"nodeType\",\n\t\"unique\",\n\t\"voidElement\",\n];\nconst jsonFiltered = [\n\t\"childNodes\",\n\t\"children\",\n\t\"data\",\n\t\"meta\",\n\t\"metaElement\",\n\t\"originalData\",\n\t\"parent\",\n];\n\nfunction isLocation(key: string, value: unknown): value is Location {\n\treturn Boolean(value && (key === \"location\" || key.endsWith(\"Location\")));\n}\n\nfunction isIgnored(key: string): boolean {\n\treturn Boolean(key.startsWith(\"_\") || jsonIgnored.includes(key));\n}\n\nfunction isFiltered(key: string, value: unknown): boolean {\n\treturn Boolean(value && jsonFiltered.includes(key));\n}\n\nexport function eventReplacer<T>(this: void, key: string, value: T): T | string | undefined {\n\tif (isLocation(key, value)) {\n\t\tconst filename = value.filename;\n\t\tconst line = String(value.line);\n\t\tconst column = String(value.column);\n\t\treturn `${filename}:${line}:${column}`;\n\t}\n\tif (isIgnored(key)) {\n\t\treturn undefined;\n\t}\n\tif (isFiltered(key, value)) {\n\t\treturn \"[truncated]\";\n\t}\n\treturn value;\n}\n\nexport function eventFormatter(entry: EventDump): string {\n\tconst strdata = JSON.stringify(entry.data, eventReplacer, 2);\n\treturn `${entry.event}: ${strdata}`;\n}\n","import { type HtmlValidate, type TokenDump } from \"../..\";\nimport { eventFormatter } from \"../json\";\nimport { Mode } from \"../mode\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport async function dump(\n\thtmlvalidate: HtmlValidate,\n\toutput: WritableStreamLike,\n\tfiles: string[],\n\tmode: Mode,\n): Promise<boolean> {\n\tlet lines: Array<Promise<string[]>>;\n\tswitch (mode) {\n\t\tcase Mode.DUMP_EVENTS:\n\t\t\tlines = files.map(async (filename: string) => {\n\t\t\t\tconst lines = await htmlvalidate.dumpEvents(filename);\n\t\t\t\treturn lines.map(eventFormatter);\n\t\t\t});\n\t\t\tbreak;\n\t\tcase Mode.DUMP_TOKENS:\n\t\t\tlines = files.map(async (filename: string) => {\n\t\t\t\tconst lines = await htmlvalidate.dumpTokens(filename);\n\t\t\t\treturn lines.map((entry: TokenDump) => {\n\t\t\t\t\tconst data = JSON.stringify(entry.data);\n\t\t\t\t\treturn `TOKEN: ${entry.token}\\n Data: ${data}\\n Location: ${entry.location}`;\n\t\t\t\t});\n\t\t\t});\n\t\t\tbreak;\n\t\tcase Mode.DUMP_TREE:\n\t\t\tlines = files.map((filename: string) => htmlvalidate.dumpTree(filename));\n\t\t\tbreak;\n\t\tcase Mode.DUMP_SOURCE:\n\t\t\tlines = files.map((filename: string) => htmlvalidate.dumpSource(filename));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown mode \"${String(mode)}\"`);\n\t}\n\tconst flat = (await Promise.all(lines)).reduce((s: string[], c: string[]) => s.concat(c), []);\n\toutput.write(flat.join(\"\\n\"));\n\toutput.write(\"\\n\");\n\treturn Promise.resolve(true);\n}\n","/**\n * @internal\n */\nexport function haveImportMetaResolve(): boolean {\n\treturn \"resolve\" in import.meta;\n}\n"],"names":["formatterFactory","fn","init","path","fs","Mode","lines"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sources":["../../src/cli/expand-files.ts","../../src/cli/formatter.ts","../../src/cli/is-ignored.ts","../../src/cli/init.ts","../../src/cli/parse-severity.ts","../../src/cli/get-rule-config.ts","../../src/cli/cli.ts","../../src/cli/errors/handle-schema-validation-error.ts","../../src/cli/errors/import-resolve-missing-error.ts","../../src/cli/mode.ts","../../src/cli/actions/lint.ts","../../src/cli/actions/init.ts","../../src/cli/actions/print-config.ts","../../src/cli/json.ts","../../src/cli/actions/dump.ts","../../src/cli/have-import-meta-resolve.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"node:path\";\nimport { globSync } from \"glob\";\n\nconst DEFAULT_EXTENSIONS = [\"html\"];\n\n/**\n * @public\n */\nexport interface ExpandOptions {\n\t/**\n\t * Working directory. Defaults to `process.cwd()`.\n\t */\n\tcwd?: string;\n\n\t/**\n\t * List of extensions to search for when expanding directories. Extensions\n\t * should be passed without leading dot, e.g. \"html\" instead of \".html\".\n\t */\n\textensions?: string[];\n}\n\nfunction isDirectory(filename: string): boolean {\n\tconst st = fs.statSync(filename);\n\treturn st.isDirectory();\n}\n\nfunction join(stem: string, filename: string): string {\n\tif (path.isAbsolute(filename)) {\n\t\treturn path.normalize(filename);\n\t} else {\n\t\treturn path.normalize(path.join(stem, filename));\n\t}\n}\n\nfunction directoryPattern(extensions: string[]): string {\n\tswitch (extensions.length) {\n\t\tcase 0:\n\t\t\treturn \"**/*\";\n\t\tcase 1:\n\t\t\treturn `**/*.${extensions[0]}`;\n\t\tdefault:\n\t\t\treturn `**/*.{${extensions.join(\",\")}}`;\n\t}\n}\n\n/**\n * Takes a number of file patterns (globs) and returns array of expanded\n * filenames.\n */\nexport function expandFiles(patterns: string[], options: ExpandOptions): string[] {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst extensions = options.extensions ?? DEFAULT_EXTENSIONS;\n\n\tconst files = patterns.reduce((result: string[], pattern: string) => {\n\t\t/* process - as standard input */\n\t\tif (pattern === \"-\") {\n\t\t\tresult.push(\"/dev/stdin\");\n\t\t\treturn result;\n\t\t}\n\n\t\tfor (const filename of globSync(pattern, { cwd })) {\n\t\t\t/* if file is a directory recursively expand files from it */\n\t\t\tconst fullpath = join(cwd, filename);\n\t\t\tif (isDirectory(fullpath)) {\n\t\t\t\tconst dir = expandFiles([directoryPattern(extensions)], { ...options, cwd: fullpath });\n\t\t\t\tresult = result.concat(dir.map((cur) => join(filename, cur)));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tresult.push(fullpath);\n\t\t}\n\n\t\treturn result.sort((a, b) => {\n\t\t\tconst pa = a.split(\"/\").length;\n\t\t\tconst pb = b.split(\"/\").length;\n\t\t\tif (pa !== pb) {\n\t\t\t\treturn pa - pb;\n\t\t\t} else {\n\t\t\t\treturn a > b ? 1 : -1;\n\t\t\t}\n\t\t});\n\t}, []);\n\n\t/* only return unique matches */\n\treturn Array.from(new Set(files));\n}\n","import fs from \"fs\";\nimport path from \"node:path\";\nimport { type Formatter, type Report, type Result, UserError, formatterFactory } from \"..\";\nimport { ensureError } from \"../error\";\nimport { legacyRequire } from \"../resolve\";\n\ntype WrappedFormatter = (results: Result[]) => string;\n\nfunction wrap(formatter: Formatter, dst: string): (results: Result[]) => string {\n\treturn (results: Result[]) => {\n\t\tconst output = formatter(results);\n\t\tif (dst) {\n\t\t\tconst dir = path.dirname(dst);\n\t\t\tif (!fs.existsSync(dir)) {\n\t\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t\t}\n\t\t\tfs.writeFileSync(dst, output, \"utf-8\");\n\t\t\treturn \"\";\n\t\t} else {\n\t\t\treturn output;\n\t\t}\n\t};\n}\n\nfunction loadFormatter(name: string): Formatter {\n\tconst fn = formatterFactory(name);\n\tif (fn) {\n\t\treturn fn;\n\t}\n\n\ttry {\n\t\treturn legacyRequire(name) as Formatter;\n\t} catch (error: unknown) {\n\t\tthrow new UserError(`No formatter named \"${name}\"`, ensureError(error));\n\t}\n}\n\nexport function getFormatter(formatters: string): (report: Report) => string {\n\tconst fn: WrappedFormatter[] = formatters.split(\",\").map((cur) => {\n\t\tconst [name, dst] = cur.split(\"=\", 2);\n\t\tconst fn = loadFormatter(name);\n\t\treturn wrap(fn, dst);\n\t});\n\treturn (report: Report) => {\n\t\treturn fn\n\t\t\t.map((formatter: WrappedFormatter) => formatter(report.results))\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"\\n\");\n\t};\n}\n","import fs from \"fs\";\nimport path from \"node:path\";\nimport ignore, { type Ignore } from \"ignore\";\n\nexport class IsIgnored {\n\t/** Cache for parsed .htmlvalidateignore files */\n\tprivate cacheIgnore: Map<string, Ignore | undefined>;\n\n\tpublic constructor() {\n\t\tthis.cacheIgnore = new Map();\n\t}\n\n\t/**\n\t * Searches \".htmlvalidateignore\" files from filesystem and returns `true` if\n\t * one of them contains a pattern matching given filename.\n\t */\n\tpublic isIgnored(filename: string): boolean {\n\t\treturn this.match(filename);\n\t}\n\n\t/**\n\t * Clear cache\n\t */\n\tpublic clearCache(): void {\n\t\tthis.cacheIgnore.clear();\n\t}\n\n\tprivate match(target: string): boolean {\n\t\tlet current = path.dirname(target);\n\n\t\twhile (true) {\n\t\t\tconst relative = path.relative(current, target);\n\t\t\tconst filename = path.join(current, \".htmlvalidateignore\");\n\n\t\t\t/* test filename (relative to the ignore file) against the patterns */\n\t\t\tconst ig = this.parseFile(filename);\n\t\t\tif (ig?.ignores(relative)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t/* get the parent directory */\n\t\t\tconst child = current;\n\t\t\tcurrent = path.dirname(current);\n\n\t\t\t/* stop if this is the root directory */\n\t\t\tif (current === child) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate parseFile(filename: string): Ignore | undefined {\n\t\tif (this.cacheIgnore.has(filename)) {\n\t\t\treturn this.cacheIgnore.get(filename);\n\t\t}\n\n\t\tif (!fs.existsSync(filename)) {\n\t\t\tthis.cacheIgnore.set(filename, undefined);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst content = fs.readFileSync(filename, \"utf-8\");\n\t\tconst ig = ignore().add(content);\n\t\tthis.cacheIgnore.set(filename, ig);\n\t\treturn ig;\n\t}\n}\n","import fs from \"fs\";\nimport deepmerge from \"deepmerge\";\nimport prompts from \"prompts\";\nimport { type ConfigData } from \"..\";\n\n/**\n * @public\n */\nexport interface InitResult {\n\tfilename: string;\n}\n\nexport enum Frameworks {\n\tangularjs = \"AngularJS\",\n\tvuejs = \"Vue.js\",\n\tmarkdown = \"Markdown\",\n}\n\nconst frameworkConfig: Record<string, ConfigData> = {\n\t[Frameworks.angularjs]: {\n\t\ttransform: {\n\t\t\t\"^.*\\\\.js$\": \"html-validate-angular/js\",\n\t\t\t\"^.*\\\\.html$\": \"html-validate-angular/html\",\n\t\t},\n\t},\n\t[Frameworks.vuejs]: {\n\t\tplugins: [\"html-validate-vue\"],\n\t\textends: [\"html-validate-vue:recommended\"],\n\t\ttransform: {\n\t\t\t\"^.*\\\\.vue$\": \"html-validate-vue\",\n\t\t},\n\t},\n\t[Frameworks.markdown]: {\n\t\ttransform: {\n\t\t\t\"^.*\\\\.md$\": \"html-validate-markdown\",\n\t\t},\n\t},\n};\n\nfunction addFrameworks(src: ConfigData, frameworks: string[]): ConfigData {\n\tlet config = src;\n\tfor (const framework of frameworks) {\n\t\tconfig = deepmerge(config, frameworkConfig[framework]);\n\t}\n\treturn config;\n}\n\nfunction writeConfig(dst: string, config: ConfigData): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tfs.writeFile(dst, JSON.stringify(config, null, 2), (err) => {\n\t\t\tif (err) reject(err);\n\t\t\tresolve();\n\t\t});\n\t});\n}\n\nexport async function init(cwd: string): Promise<InitResult> {\n\tconst filename = `${cwd}/.htmlvalidate.json`;\n\tconst exists = fs.existsSync(filename);\n\tconst initialConfig: ConfigData = {\n\t\telements: [\"html5\"],\n\t\textends: [\"html-validate:recommended\"],\n\t};\n\n\t/* confirm overwrite */\n\tif (exists) {\n\t\tconst result = await prompts({\n\t\t\tname: \"overwrite\",\n\t\t\ttype: \"confirm\",\n\t\t\tmessage: \"A .htmlvalidate.json file already exists, do you want to overwrite it?\",\n\t\t});\n\t\tif (!result.overwrite) {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- technical debt, should not result in failure at all */\n\t\t\treturn Promise.reject();\n\t\t}\n\t}\n\n\tconst questions: prompts.PromptObject[] = [\n\t\t{\n\t\t\tname: \"frameworks\",\n\t\t\ttype: \"multiselect\",\n\t\t\tchoices: [\n\t\t\t\t{ title: Frameworks.angularjs, value: Frameworks.angularjs },\n\t\t\t\t{ title: Frameworks.vuejs, value: Frameworks.vuejs },\n\t\t\t\t{ title: Frameworks.markdown, value: Frameworks.markdown },\n\t\t\t],\n\t\t\tmessage: \"Support additional frameworks?\",\n\t\t},\n\t];\n\n\t/* prompt user for questions */\n\tconst answers = await prompts(questions);\n\n\t/* write configuration to file */\n\tlet config = initialConfig;\n\tconfig = addFrameworks(config, answers.frameworks as string[]);\n\tawait writeConfig(filename, config);\n\n\treturn {\n\t\tfilename,\n\t};\n}\n","import { type RuleSeverity } from \"../config\";\n\n/**\n * @internal\n */\nexport function parseSeverity(ruleId: string, severity: string): RuleSeverity {\n\tswitch (severity) {\n\t\tcase \"off\":\n\t\tcase \"0\":\n\t\t\treturn \"off\";\n\t\tcase \"warn\":\n\t\tcase \"1\":\n\t\t\treturn \"warn\";\n\t\tcase \"error\":\n\t\tcase \"2\":\n\t\t\treturn \"error\";\n\t\tdefault:\n\t\t\tthrow new Error(`Invalid severity \"${severity}\" for rule \"${ruleId}\"`);\n\t}\n}\n","import { type RuleConfig, type RuleSeverity } from \"../config\";\nimport { parseSeverity } from \"./parse-severity\";\n\nfunction parseItem(value: string): { ruleId: string; severity: RuleSeverity } {\n\tconst [ruleId, severity = \"error\"] = value.split(\":\", 2);\n\treturn { ruleId, severity: parseSeverity(ruleId, severity) };\n}\n\n/**\n * @internal\n */\nexport function getRuleConfig(values: string | string[]): RuleConfig {\n\tif (typeof values === \"string\") {\n\t\treturn getRuleConfig([values]);\n\t}\n\n\treturn values.reduce<RuleConfig>((parsedRules, value) => {\n\t\tconst { ruleId, severity } = parseItem(value.trim());\n\t\treturn { [ruleId]: severity, ...parsedRules };\n\t}, {});\n}\n","import path from \"node:path/posix\";\nimport {\n\ttype ConfigData,\n\ttype ConfigLoader,\n\ttype Report,\n\tFileSystemConfigLoader,\n\tUserError,\n\tHtmlValidate,\n\tesmResolver,\n} from \"..\";\nimport { type ExpandOptions, expandFiles } from \"./expand-files\";\nimport { getFormatter } from \"./formatter\";\nimport { IsIgnored } from \"./is-ignored\";\nimport { type InitResult, init } from \"./init\";\nimport { getRuleConfig } from \"./get-rule-config\";\n\nconst resolver = esmResolver();\n\nfunction defaultConfig(preset: string): ConfigData {\n\tconst presets = preset.split(\",\").map((it) => `html-validate:${it}`);\n\treturn {\n\t\textends: presets,\n\t};\n}\n\n/**\n * @public\n */\nexport interface CLIOptions {\n\tconfigFile?: string;\n\t/** Comma-separated list of presets to use */\n\tpreset?: string;\n\trules?: string | string[];\n}\n\nasync function getBaseConfig(preset?: string, filename?: string): Promise<ConfigData> {\n\tif (filename) {\n\t\tconst configData = await resolver.resolveConfig(path.resolve(filename), { cache: false });\n\t\tif (!configData) {\n\t\t\tthrow new UserError(`Failed to read configuration from \"${filename}\"`);\n\t\t}\n\t\treturn configData;\n\t} else {\n\t\treturn defaultConfig(preset ?? \"recommended\");\n\t}\n}\n\n/**\n * @public\n */\nexport class CLI {\n\tprivate options: CLIOptions;\n\tprivate config: ConfigData | null;\n\tprivate loader: ConfigLoader | null;\n\tprivate ignored: IsIgnored;\n\n\t/**\n\t * Create new CLI helper.\n\t *\n\t * Can be used to create tooling with similar properties to bundled CLI\n\t * script.\n\t */\n\tpublic constructor(options?: CLIOptions) {\n\t\tthis.options = options ?? {};\n\t\tthis.config = null;\n\t\tthis.loader = null;\n\t\tthis.ignored = new IsIgnored();\n\t}\n\n\t/**\n\t * Returns list of files matching patterns and are not ignored. Filenames will\n\t * have absolute paths.\n\t *\n\t * @public\n\t */\n\tpublic async expandFiles(patterns: string[], options: ExpandOptions = {}): Promise<string[]> {\n\t\t/* technical debt: expandFiles(..) should actually be async as well */\n\t\tconst files = expandFiles(patterns, options).filter((filename) => !this.isIgnored(filename));\n\t\treturn Promise.resolve(files);\n\t}\n\n\tpublic getFormatter(formatters: string): Promise<(report: Report) => string> {\n\t\t/* while not actually async the API boundary returns a Promise in case it needs to in the future, i.e a ESM-based formatter */\n\t\treturn Promise.resolve(getFormatter(formatters));\n\t}\n\n\t/**\n\t * Initialize project with a new configuration.\n\t *\n\t * A new `.htmlvalidate.json` file will be placed in the path provided by\n\t * `cwd`.\n\t */\n\tpublic init(cwd: string): Promise<InitResult> {\n\t\treturn init(cwd);\n\t}\n\n\t/**\n\t * Clear cache.\n\t *\n\t * Previously fetched [[HtmlValidate]] instances must either be fetched again\n\t * or call [[HtmlValidate.flushConfigCache]].\n\t */\n\t/* istanbul ignore next: each method is tested separately */\n\tpublic clearCache(): Promise<void> {\n\t\tif (this.loader) {\n\t\t\tthis.loader.flushCache();\n\t\t}\n\t\tthis.ignored.clearCache();\n\t\treturn Promise.resolve();\n\t}\n\n\t/**\n\t * Get HtmlValidate instance with configuration based on options passed to the\n\t * constructor.\n\t *\n\t * @internal\n\t */\n\tpublic async getLoader(): Promise<ConfigLoader> {\n\t\tif (!this.loader) {\n\t\t\tconst config = await this.getConfig();\n\t\t\tthis.loader = new FileSystemConfigLoader([resolver], config);\n\t\t}\n\t\treturn this.loader;\n\t}\n\n\t/**\n\t * Get HtmlValidate instance with configuration based on options passed to the\n\t * constructor.\n\t *\n\t * @public\n\t */\n\tpublic async getValidator(): Promise<HtmlValidate> {\n\t\tconst loader = await this.getLoader();\n\t\treturn new HtmlValidate(loader);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic async getConfig(): Promise<ConfigData> {\n\t\tthis.config ??= await this.resolveConfig();\n\t\treturn this.config;\n\t}\n\n\t/**\n\t * Searches \".htmlvalidateignore\" files from filesystem and returns `true` if\n\t * one of them contains a pattern matching given filename.\n\t */\n\tprivate isIgnored(filename: string): boolean {\n\t\treturn this.ignored.isIgnored(filename);\n\t}\n\n\tprivate async resolveConfig(): Promise<ConfigData> {\n\t\tconst { options } = this;\n\t\tconst havePreset = Boolean(options.preset);\n\t\tconst haveConfig = Boolean(options.configFile);\n\t\tconst config = await getBaseConfig(options.preset, options.configFile);\n\t\tif (options.rules) {\n\t\t\tif (havePreset || haveConfig) {\n\t\t\t\t/* when rules are explicitly specified and combined with an explicit\n\t\t\t\t * preset or configuration file we merge the result as the user would\n\t\t\t\texpect rules from the preset or configuration files to be used */\n\t\t\t\tconfig.rules = { ...config.rules, ...getRuleConfig(options.rules) };\n\t\t\t} else {\n\t\t\t\t/* if neither an explicit configuration file or preset is passed as a\n\t\t\t\t * CLI argument a default configuration is loaded but since the user has\n\t\t\t\t * specified one or more rules explicitly we overwrite both the default\n\t\t\t\t * preset and the default rules with the explicit rules */\n\t\t\t\tconfig.extends = [];\n\t\t\t\tconfig.rules = getRuleConfig(options.rules);\n\t\t\t}\n\t\t}\n\t\treturn config;\n\t}\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport betterAjvErrors from \"@sidvind/better-ajv-errors\";\nimport kleur from \"kleur\";\nimport { type SchemaValidationError } from \"../../error\";\n\nfunction prettyError(err: SchemaValidationError): string {\n\tlet json: string | undefined;\n\tif (err.filename && fs.existsSync(err.filename)) {\n\t\tjson = fs.readFileSync(err.filename, \"utf-8\");\n\t}\n\treturn betterAjvErrors(err.schema, err.obj, err.errors, {\n\t\tformat: \"cli\",\n\t\tindent: 2,\n\t\tjson,\n\t});\n}\n\n/**\n * @internal\n */\nexport function handleSchemaValidationError(console: Console, err: SchemaValidationError): void {\n\tif (err.filename) {\n\t\tconst filename = path.relative(process.cwd(), err.filename);\n\t\tconsole.error(kleur.red(`A configuration error was found in \"${filename}\":`));\n\t} else {\n\t\tconsole.error(kleur.red(`A configuration error was found:`));\n\t}\n\tconsole.group();\n\t{\n\t\tconsole.error(prettyError(err));\n\t}\n\tconsole.groupEnd();\n}\n","import kleur from \"kleur\";\nimport { UserError } from \"../../error\";\nimport { engines } from \"../../../package.json\";\n\n/**\n * @internal\n */\nexport class ImportResolveMissingError extends UserError {\n\tpublic constructor() {\n\t\tconst message = `import.meta.resolve(..) is not available on this system`;\n\t\tsuper(message);\n\t\tError.captureStackTrace(this, ImportResolveMissingError);\n\t\tthis.name = ImportResolveMissingError.name;\n\t}\n\n\tpublic prettyFormat(): string {\n\t\tconst { message } = this;\n\t\tconst currentVersion = process.version;\n\t\tconst requiredVersion = engines.node\n\t\t\t.split(\"||\")\n\t\t\t.map((it) => `v${it.replace(/^[^\\d]+/, \"\").trim()}`);\n\t\treturn [\n\t\t\tkleur.red(`Error: ${message}.`),\n\t\t\t\"\",\n\t\t\t`Either ensure you are running a supported NodeJS version:`,\n\t\t\t` Current: ${currentVersion}`,\n\t\t\t` Required: ${requiredVersion.join(\", \")}, or later`,\n\t\t\t`Or set NODE_OPTIONS=\"--experimental-import-meta-resolve\"`,\n\t\t].join(\"\\n\");\n\t}\n}\n","/**\n * @internal\n */\nexport enum Mode {\n\tLINT,\n\tINIT,\n\tDUMP_EVENTS,\n\tDUMP_TOKENS,\n\tDUMP_TREE,\n\tDUMP_SOURCE,\n\tPRINT_CONFIG,\n}\n\n/**\n * @internal\n */\nexport function modeToFlag(mode: Mode.LINT): null;\nexport function modeToFlag(mode: Exclude<Mode, Mode.LINT>): string;\nexport function modeToFlag(mode: Mode): string | null {\n\tswitch (mode) {\n\t\tcase Mode.LINT:\n\t\t\treturn null;\n\t\tcase Mode.INIT:\n\t\t\treturn \"--init\";\n\t\tcase Mode.DUMP_EVENTS:\n\t\t\treturn \"--dump-events\";\n\t\tcase Mode.DUMP_TOKENS:\n\t\t\treturn \"--dump-tokens\";\n\t\tcase Mode.DUMP_TREE:\n\t\t\treturn \"--dump-tree\";\n\t\tcase Mode.DUMP_SOURCE:\n\t\t\treturn \"--dump-source\";\n\t\tcase Mode.PRINT_CONFIG:\n\t\t\treturn \"--print-config\";\n\t}\n}\n","import kleur from \"kleur\";\nimport { type HtmlValidate, type Report, type Result, Reporter } from \"../..\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport interface LintOptions {\n\tformatter: (report: Report) => string;\n\tmaxWarnings: number;\n\tstdinFilename: false | string;\n}\n\nfunction renameStdin(report: Report, filename: string): void {\n\tconst stdin = report.results.find((cur: Result) => cur.filePath === \"/dev/stdin\");\n\tif (stdin) {\n\t\tstdin.filePath = filename;\n\t}\n}\n\nexport async function lint(\n\thtmlvalidate: HtmlValidate,\n\toutput: WritableStreamLike,\n\tfiles: string[],\n\toptions: LintOptions,\n): Promise<boolean> {\n\tconst reports: Report[] = [];\n\tfor (const filename of files) {\n\t\ttry {\n\t\t\treports.push(await htmlvalidate.validateFile(filename));\n\t\t} catch (err) {\n\t\t\tconst message = kleur.red(`Validator crashed when parsing \"${filename}\"`);\n\t\t\toutput.write(`${message}\\n`);\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tconst merged = Reporter.merge(reports);\n\n\t/* rename stdin if an explicit filename was passed */\n\tif (options.stdinFilename) {\n\t\trenameStdin(merged, options.stdinFilename);\n\t}\n\n\toutput.write(options.formatter(merged));\n\n\tif (options.maxWarnings >= 0 && merged.warningCount > options.maxWarnings) {\n\t\toutput.write(\n\t\t\t`\\nhtml-validate found too many warnings (maximum: ${String(options.maxWarnings)}).\\n`,\n\t\t);\n\t\treturn false;\n\t}\n\n\treturn merged.valid;\n}\n","import { type CLI } from \"../cli\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport interface InitOptions {\n\tcwd: string;\n}\n\nexport async function init(\n\tcli: CLI,\n\toutput: WritableStreamLike,\n\toptions: InitOptions,\n): Promise<boolean> {\n\tconst result = await cli.init(options.cwd);\n\toutput.write(`Configuration written to \"${result.filename}\"\\n`);\n\treturn true;\n}\n","import { type HtmlValidate } from \"../..\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport async function printConfig(\n\thtmlvalidate: HtmlValidate,\n\toutput: WritableStreamLike,\n\tfiles: string[],\n): Promise<boolean> {\n\tif (files.length > 1) {\n\t\toutput.write(`\\`--print-config\\` expected a single filename but got multiple:\\n\\n`);\n\t\tfor (const filename of files) {\n\t\t\toutput.write(` - ${filename}\\n`);\n\t\t}\n\t\toutput.write(\"\\n\");\n\t\treturn false;\n\t}\n\tconst config = await htmlvalidate.getConfigFor(files[0]);\n\tconst json = JSON.stringify(config.getConfigData(), null, 2);\n\toutput.write(`${json}\\n`);\n\treturn true;\n}\n","import { type EventDump, type Location } from \"..\";\n\nconst jsonIgnored = [\n\t\"annotation\",\n\t\"blockedRules\",\n\t\"cache\",\n\t\"closed\",\n\t\"depth\",\n\t\"disabledRules\",\n\t\"nodeType\",\n\t\"unique\",\n\t\"voidElement\",\n];\nconst jsonFiltered = [\n\t\"childNodes\",\n\t\"children\",\n\t\"data\",\n\t\"meta\",\n\t\"metaElement\",\n\t\"originalData\",\n\t\"parent\",\n];\n\nfunction isLocation(key: string, value: unknown): value is Location {\n\treturn Boolean(value && (key === \"location\" || key.endsWith(\"Location\")));\n}\n\nfunction isIgnored(key: string): boolean {\n\treturn Boolean(key.startsWith(\"_\") || jsonIgnored.includes(key));\n}\n\nfunction isFiltered(key: string, value: unknown): boolean {\n\treturn Boolean(value && jsonFiltered.includes(key));\n}\n\nexport function eventReplacer<T>(this: void, key: string, value: T): T | string | undefined {\n\tif (isLocation(key, value)) {\n\t\tconst filename = value.filename;\n\t\tconst line = String(value.line);\n\t\tconst column = String(value.column);\n\t\treturn `${filename}:${line}:${column}`;\n\t}\n\tif (isIgnored(key)) {\n\t\treturn undefined;\n\t}\n\tif (isFiltered(key, value)) {\n\t\treturn \"[truncated]\";\n\t}\n\treturn value;\n}\n\nexport function eventFormatter(entry: EventDump): string {\n\tconst strdata = JSON.stringify(entry.data, eventReplacer, 2);\n\treturn `${entry.event}: ${strdata}`;\n}\n","import { type HtmlValidate, type TokenDump } from \"../..\";\nimport { eventFormatter } from \"../json\";\nimport { Mode } from \"../mode\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport async function dump(\n\thtmlvalidate: HtmlValidate,\n\toutput: WritableStreamLike,\n\tfiles: string[],\n\tmode: Mode,\n): Promise<boolean> {\n\tlet lines: Array<Promise<string[]>>;\n\tswitch (mode) {\n\t\tcase Mode.DUMP_EVENTS:\n\t\t\tlines = files.map(async (filename: string) => {\n\t\t\t\tconst lines = await htmlvalidate.dumpEvents(filename);\n\t\t\t\treturn lines.map(eventFormatter);\n\t\t\t});\n\t\t\tbreak;\n\t\tcase Mode.DUMP_TOKENS:\n\t\t\tlines = files.map(async (filename: string) => {\n\t\t\t\tconst lines = await htmlvalidate.dumpTokens(filename);\n\t\t\t\treturn lines.map((entry: TokenDump) => {\n\t\t\t\t\tconst data = JSON.stringify(entry.data);\n\t\t\t\t\treturn `TOKEN: ${entry.token}\\n Data: ${data}\\n Location: ${entry.location}`;\n\t\t\t\t});\n\t\t\t});\n\t\t\tbreak;\n\t\tcase Mode.DUMP_TREE:\n\t\t\tlines = files.map((filename: string) => htmlvalidate.dumpTree(filename));\n\t\t\tbreak;\n\t\tcase Mode.DUMP_SOURCE:\n\t\t\tlines = files.map((filename: string) => htmlvalidate.dumpSource(filename));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown mode \"${String(mode)}\"`);\n\t}\n\tconst flat = (await Promise.all(lines)).reduce((s: string[], c: string[]) => s.concat(c), []);\n\toutput.write(flat.join(\"\\n\"));\n\toutput.write(\"\\n\");\n\treturn Promise.resolve(true);\n}\n","/**\n * @internal\n */\nexport function haveImportMetaResolve(): boolean {\n\treturn \"resolve\" in import.meta;\n}\n"],"names":["formatterFactory","fn","init","path","fs","Mode","lines"],"mappings":"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"}
|
package/dist/es/core-nodejs.js
CHANGED
|
@@ -462,9 +462,7 @@ function determineRootDirImpl(intial, fs2) {
|
|
|
462
462
|
return intial;
|
|
463
463
|
}
|
|
464
464
|
function determineRootDir() {
|
|
465
|
-
|
|
466
|
-
cachedRootDir = determineRootDirImpl(process.cwd(), fs);
|
|
467
|
-
}
|
|
465
|
+
cachedRootDir ??= determineRootDirImpl(process.cwd(), fs);
|
|
468
466
|
return cachedRootDir;
|
|
469
467
|
}
|
|
470
468
|
|
|
@@ -698,7 +696,6 @@ class FileSystemConfigLoader extends ConfigLoader {
|
|
|
698
696
|
* This configuration is not merged with global configuration and may return
|
|
699
697
|
* `null` if no configuration files are found.
|
|
700
698
|
*/
|
|
701
|
-
/* eslint-disable-next-line sonarjs/cognitive-complexity -- technical debt */
|
|
702
699
|
fromFilename(filename) {
|
|
703
700
|
if (filename === "inline") {
|
|
704
701
|
return null;
|