html-validate 9.0.0-rc.2 → 9.0.0-rc.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/README.md +2 -0
- package/dist/cjs/browser.js +2 -2
- package/dist/cjs/cli.js +58 -46
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/core-browser.js.map +1 -1
- package/dist/cjs/core-nodejs.js +114 -25
- package/dist/cjs/core-nodejs.js.map +1 -1
- package/dist/cjs/core.js +7869 -7394
- package/dist/cjs/core.js.map +1 -1
- package/dist/cjs/elements.js +2 -2
- package/dist/cjs/elements.js.map +1 -1
- package/dist/cjs/html-validate.js +68 -51
- package/dist/cjs/html-validate.js.map +1 -1
- package/dist/cjs/index.js +5 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/jest-diff.js +6 -7
- package/dist/cjs/jest-diff.js.map +1 -1
- package/dist/cjs/jest.js +2 -2
- package/dist/cjs/jest.js.map +1 -1
- package/dist/cjs/matcher-utils.js.map +1 -1
- package/dist/cjs/matchers-jestonly.js.map +1 -1
- package/dist/cjs/matchers.js.map +1 -1
- package/dist/cjs/meta-helper.js.map +1 -1
- package/dist/cjs/test-utils.js +3 -2
- package/dist/cjs/test-utils.js.map +1 -1
- package/dist/cjs/tsdoc-metadata.json +1 -1
- package/dist/cjs/utils/natural-join.js.map +1 -1
- package/dist/cjs/vitest.js +2 -2
- package/dist/cjs/vitest.js.map +1 -1
- package/dist/es/browser.js +2 -2
- package/dist/es/cli.js +60 -48
- package/dist/es/cli.js.map +1 -1
- package/dist/es/core-browser.js.map +1 -1
- package/dist/es/core-nodejs.js +113 -26
- package/dist/es/core-nodejs.js.map +1 -1
- package/dist/es/core.js +7867 -7392
- package/dist/es/core.js.map +1 -1
- package/dist/es/elements.js +2 -2
- package/dist/es/elements.js.map +1 -1
- package/dist/es/html-validate.js +46 -29
- package/dist/es/html-validate.js.map +1 -1
- package/dist/es/index.js +5 -4
- package/dist/es/index.js.map +1 -1
- package/dist/es/jest-diff.js +6 -7
- package/dist/es/jest-diff.js.map +1 -1
- package/dist/es/jest.js +2 -2
- package/dist/es/jest.js.map +1 -1
- package/dist/es/matcher-utils.js.map +1 -1
- package/dist/es/matchers-jestonly.js.map +1 -1
- package/dist/es/matchers.js.map +1 -1
- package/dist/es/meta-helper.js.map +1 -1
- package/dist/es/test-utils.js +3 -2
- package/dist/es/test-utils.js.map +1 -1
- package/dist/es/utils/natural-join.js.map +1 -1
- package/dist/es/vitest.js +2 -2
- package/dist/es/vitest.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/dist/types/browser.d.ts +26 -84
- package/dist/types/index.d.ts +64 -95
- package/dist/types/test-utils.d.ts +4 -4
- package/package.json +9 -162
package/README.md
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
Offline HTML5 validator. Validates either a full document or a smaller
|
|
7
7
|
(incomplete) template, e.g. from an AngularJS or Vue.js component.
|
|
8
8
|
|
|
9
|
+
Read the full documentation at https://html-validate.org/
|
|
10
|
+
|
|
9
11
|
## Features
|
|
10
12
|
|
|
11
13
|
- Can test fragments of HTML, for instance a component template.
|
package/dist/cjs/browser.js
CHANGED
|
@@ -7,7 +7,7 @@ require('ajv');
|
|
|
7
7
|
require('./elements.js');
|
|
8
8
|
require('@sidvind/better-ajv-errors');
|
|
9
9
|
require('./utils/natural-join.js');
|
|
10
|
-
require('fs');
|
|
10
|
+
require('node:fs');
|
|
11
11
|
require('kleur');
|
|
12
12
|
require('@html-validate/stylish');
|
|
13
13
|
require('semver');
|
|
@@ -46,7 +46,7 @@ exports.Validator = core.Validator;
|
|
|
46
46
|
exports.WrappedError = core.WrappedError;
|
|
47
47
|
exports.ariaNaming = core.ariaNaming;
|
|
48
48
|
exports.classifyNodeText = core.classifyNodeText;
|
|
49
|
-
exports.configPresets = core.
|
|
49
|
+
exports.configPresets = core.presets;
|
|
50
50
|
exports.defineConfig = core.defineConfig;
|
|
51
51
|
exports.definePlugin = core.definePlugin;
|
|
52
52
|
exports.keywordPatternMatcher = core.keywordPatternMatcher;
|
package/dist/cjs/cli.js
CHANGED
|
@@ -110,6 +110,8 @@ function getFormatter(formatters) {
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
class IsIgnored {
|
|
113
|
+
/** Cache for parsed .htmlvalidateignore files */
|
|
114
|
+
cacheIgnore;
|
|
113
115
|
constructor() {
|
|
114
116
|
this.cacheIgnore = /* @__PURE__ */ new Map();
|
|
115
117
|
}
|
|
@@ -132,7 +134,7 @@ class IsIgnored {
|
|
|
132
134
|
const relative = path__default.default.relative(current, target);
|
|
133
135
|
const filename = path__default.default.join(current, ".htmlvalidateignore");
|
|
134
136
|
const ig = this.parseFile(filename);
|
|
135
|
-
if (ig
|
|
137
|
+
if (ig?.ignores(relative)) {
|
|
136
138
|
return true;
|
|
137
139
|
}
|
|
138
140
|
const child = current;
|
|
@@ -236,25 +238,21 @@ function parseSeverity(ruleId, severity) {
|
|
|
236
238
|
switch (severity) {
|
|
237
239
|
case "off":
|
|
238
240
|
case "0":
|
|
239
|
-
return
|
|
241
|
+
return "off";
|
|
240
242
|
case "warn":
|
|
241
243
|
case "1":
|
|
242
|
-
return
|
|
244
|
+
return "warn";
|
|
243
245
|
case "error":
|
|
244
246
|
case "2":
|
|
245
|
-
return
|
|
247
|
+
return "error";
|
|
246
248
|
default:
|
|
247
249
|
throw new Error(`Invalid severity "${severity}" for rule "${ruleId}"`);
|
|
248
250
|
}
|
|
249
251
|
}
|
|
250
252
|
|
|
251
253
|
function parseItem(value) {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
return { ruleId, severity: parseSeverity(ruleId, severity) };
|
|
255
|
-
} else {
|
|
256
|
-
return { ruleId: value, severity: core.Severity.ERROR };
|
|
257
|
-
}
|
|
254
|
+
const [ruleId, severity = "error"] = value.split(":", 2);
|
|
255
|
+
return { ruleId, severity: parseSeverity(ruleId, severity) };
|
|
258
256
|
}
|
|
259
257
|
function getRuleConfig(values) {
|
|
260
258
|
if (typeof values === "string") {
|
|
@@ -266,22 +264,29 @@ function getRuleConfig(values) {
|
|
|
266
264
|
}, {});
|
|
267
265
|
}
|
|
268
266
|
|
|
269
|
-
const
|
|
270
|
-
|
|
271
|
-
};
|
|
272
|
-
|
|
267
|
+
const resolver = coreNodejs.esmResolver();
|
|
268
|
+
function defaultConfig(preset) {
|
|
269
|
+
const presets = preset.split(",").map((it) => `html-validate:${it}`);
|
|
270
|
+
return {
|
|
271
|
+
extends: presets
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
async function getBaseConfig(preset, filename) {
|
|
273
275
|
if (filename) {
|
|
274
|
-
const
|
|
275
|
-
const configData = resolver.resolveConfig(path__default.default.resolve(filename), { cache: false });
|
|
276
|
+
const configData = await resolver.resolveConfig(path__default.default.resolve(filename), { cache: false });
|
|
276
277
|
if (!configData) {
|
|
277
278
|
throw new core.UserError(`Failed to read configuration from "${filename}"`);
|
|
278
279
|
}
|
|
279
280
|
return configData;
|
|
280
281
|
} else {
|
|
281
|
-
return defaultConfig;
|
|
282
|
+
return defaultConfig(preset ?? "recommended");
|
|
282
283
|
}
|
|
283
284
|
}
|
|
284
285
|
class CLI {
|
|
286
|
+
options;
|
|
287
|
+
config;
|
|
288
|
+
loader;
|
|
289
|
+
ignored;
|
|
285
290
|
/**
|
|
286
291
|
* Create new CLI helper.
|
|
287
292
|
*
|
|
@@ -300,11 +305,12 @@ class CLI {
|
|
|
300
305
|
*
|
|
301
306
|
* @public
|
|
302
307
|
*/
|
|
303
|
-
expandFiles(patterns, options = {}) {
|
|
304
|
-
|
|
308
|
+
async expandFiles(patterns, options = {}) {
|
|
309
|
+
const files = expandFiles(patterns, options).filter((filename) => !this.isIgnored(filename));
|
|
310
|
+
return Promise.resolve(files);
|
|
305
311
|
}
|
|
306
312
|
getFormatter(formatters) {
|
|
307
|
-
return getFormatter(formatters);
|
|
313
|
+
return Promise.resolve(getFormatter(formatters));
|
|
308
314
|
}
|
|
309
315
|
/**
|
|
310
316
|
* Initialize project with a new configuration.
|
|
@@ -315,13 +321,6 @@ class CLI {
|
|
|
315
321
|
init(cwd) {
|
|
316
322
|
return init$1(cwd);
|
|
317
323
|
}
|
|
318
|
-
/**
|
|
319
|
-
* Searches ".htmlvalidateignore" files from filesystem and returns `true` if
|
|
320
|
-
* one of them contains a pattern matching given filename.
|
|
321
|
-
*/
|
|
322
|
-
isIgnored(filename) {
|
|
323
|
-
return this.ignored.isIgnored(filename);
|
|
324
|
-
}
|
|
325
324
|
/**
|
|
326
325
|
* Clear cache.
|
|
327
326
|
*
|
|
@@ -334,6 +333,7 @@ class CLI {
|
|
|
334
333
|
this.loader.flushCache();
|
|
335
334
|
}
|
|
336
335
|
this.ignored.clearCache();
|
|
336
|
+
return Promise.resolve();
|
|
337
337
|
}
|
|
338
338
|
/**
|
|
339
339
|
* Get HtmlValidate instance with configuration based on options passed to the
|
|
@@ -341,9 +341,10 @@ class CLI {
|
|
|
341
341
|
*
|
|
342
342
|
* @internal
|
|
343
343
|
*/
|
|
344
|
-
getLoader() {
|
|
344
|
+
async getLoader() {
|
|
345
345
|
if (!this.loader) {
|
|
346
|
-
|
|
346
|
+
const config = await this.getConfig();
|
|
347
|
+
this.loader = new coreNodejs.FileSystemConfigLoader([resolver], config);
|
|
347
348
|
}
|
|
348
349
|
return this.loader;
|
|
349
350
|
}
|
|
@@ -353,24 +354,33 @@ class CLI {
|
|
|
353
354
|
*
|
|
354
355
|
* @public
|
|
355
356
|
*/
|
|
356
|
-
getValidator() {
|
|
357
|
-
const loader = this.getLoader();
|
|
357
|
+
async getValidator() {
|
|
358
|
+
const loader = await this.getLoader();
|
|
358
359
|
return new core.HtmlValidate(loader);
|
|
359
360
|
}
|
|
360
361
|
/**
|
|
361
362
|
* @internal
|
|
362
363
|
*/
|
|
363
|
-
getConfig() {
|
|
364
|
+
async getConfig() {
|
|
364
365
|
if (!this.config) {
|
|
365
|
-
this.config = this.resolveConfig();
|
|
366
|
+
this.config = await this.resolveConfig();
|
|
366
367
|
}
|
|
367
368
|
return this.config;
|
|
368
369
|
}
|
|
369
|
-
|
|
370
|
+
/**
|
|
371
|
+
* Searches ".htmlvalidateignore" files from filesystem and returns `true` if
|
|
372
|
+
* one of them contains a pattern matching given filename.
|
|
373
|
+
*/
|
|
374
|
+
isIgnored(filename) {
|
|
375
|
+
return this.ignored.isIgnored(filename);
|
|
376
|
+
}
|
|
377
|
+
async resolveConfig() {
|
|
370
378
|
const { options } = this;
|
|
371
|
-
const config = getBaseConfig(options.configFile);
|
|
379
|
+
const config = await getBaseConfig(options.preset, options.configFile);
|
|
372
380
|
if (options.rules) {
|
|
373
|
-
|
|
381
|
+
if (!options.preset) {
|
|
382
|
+
config.extends = [];
|
|
383
|
+
}
|
|
374
384
|
config.rules = getRuleConfig(options.rules);
|
|
375
385
|
}
|
|
376
386
|
return config;
|
|
@@ -539,23 +549,25 @@ function eventFormatter(entry) {
|
|
|
539
549
|
return `${entry.event}: ${strdata}`;
|
|
540
550
|
}
|
|
541
551
|
|
|
542
|
-
function dump(htmlvalidate, output, files, mode) {
|
|
543
|
-
let lines
|
|
552
|
+
async function dump(htmlvalidate, output, files, mode) {
|
|
553
|
+
let lines;
|
|
544
554
|
switch (mode) {
|
|
545
555
|
case Mode.DUMP_EVENTS:
|
|
546
|
-
lines = files.map(
|
|
547
|
-
|
|
548
|
-
|
|
556
|
+
lines = files.map(async (filename) => {
|
|
557
|
+
const lines2 = await htmlvalidate.dumpEvents(filename);
|
|
558
|
+
return lines2.map(eventFormatter);
|
|
559
|
+
});
|
|
549
560
|
break;
|
|
550
561
|
case Mode.DUMP_TOKENS:
|
|
551
|
-
lines = files.map(
|
|
552
|
-
|
|
562
|
+
lines = files.map(async (filename) => {
|
|
563
|
+
const lines2 = await htmlvalidate.dumpTokens(filename);
|
|
564
|
+
return lines2.map((entry) => {
|
|
553
565
|
const data = JSON.stringify(entry.data);
|
|
554
566
|
return `TOKEN: ${entry.token}
|
|
555
567
|
Data: ${data}
|
|
556
568
|
Location: ${entry.location}`;
|
|
557
|
-
})
|
|
558
|
-
);
|
|
569
|
+
});
|
|
570
|
+
});
|
|
559
571
|
break;
|
|
560
572
|
case Mode.DUMP_TREE:
|
|
561
573
|
lines = files.map((filename) => htmlvalidate.dumpTree(filename));
|
|
@@ -566,7 +578,7 @@ function dump(htmlvalidate, output, files, mode) {
|
|
|
566
578
|
default:
|
|
567
579
|
throw new Error(`Unknown mode "${String(mode)}"`);
|
|
568
580
|
}
|
|
569
|
-
const flat = lines.reduce((s, c) => s.concat(c), []);
|
|
581
|
+
const flat = (await Promise.all(lines)).reduce((s, c) => s.concat(c), []);
|
|
570
582
|
output.write(flat.join("\n"));
|
|
571
583
|
output.write("\n");
|
|
572
584
|
return Promise.resolve(true);
|
package/dist/cjs/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/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"],"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 { Severity } from \"..\";\n\n/**\n * @internal\n */\nexport function parseSeverity(ruleId: string, severity: string): Severity {\n\tswitch (severity) {\n\t\tcase \"off\":\n\t\tcase \"0\":\n\t\t\treturn Severity.DISABLED;\n\t\tcase \"warn\":\n\t\tcase \"1\":\n\t\t\treturn Severity.WARN;\n\t\tcase \"error\":\n\t\tcase \"2\":\n\t\t\treturn Severity.ERROR;\n\t\tdefault:\n\t\t\tthrow new Error(`Invalid severity \"${severity}\" for rule \"${ruleId}\"`);\n\t}\n}\n","import { Severity, type RuleConfig } from \"..\";\nimport { parseSeverity } from \"./parse-severity\";\n\nfunction parseItem(value: string): { ruleId: string; severity: Severity } {\n\tif (value.includes(\":\")) {\n\t\tconst [ruleId, severity] = value.split(\":\", 2);\n\t\treturn { ruleId, severity: parseSeverity(ruleId, severity) };\n\t} else {\n\t\treturn { ruleId: value, severity: Severity.ERROR };\n\t}\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\";\nimport {\n\ttype ConfigData,\n\ttype ConfigLoader,\n\ttype Report,\n\tFileSystemConfigLoader,\n\tUserError,\n\tHtmlValidate,\n\tcjsResolver,\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 defaultConfig: ConfigData = {\n\textends: [\"html-validate:recommended\"],\n};\n\n/**\n * @public\n */\nexport interface CLIOptions {\n\tconfigFile?: string;\n\trules?: string | string[];\n}\n\nfunction getBaseConfig(filename?: string): ConfigData {\n\tif (filename) {\n\t\tconst resolver = cjsResolver();\n\t\tconst configData = 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;\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 expandFiles(patterns: string[], options: ExpandOptions = {}): string[] {\n\t\treturn expandFiles(patterns, options).filter((filename) => !this.isIgnored(filename));\n\t}\n\n\tpublic getFormatter(formatters: string): (report: Report) => string {\n\t\treturn 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 * 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.ignored.isIgnored(filename);\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(): void {\n\t\tif (this.loader) {\n\t\t\tthis.loader.flushCache();\n\t\t}\n\t\tthis.ignored.clearCache();\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 getLoader(): ConfigLoader {\n\t\tif (!this.loader) {\n\t\t\tthis.loader = new FileSystemConfigLoader(this.getConfig());\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 getValidator(): HtmlValidate {\n\t\tconst loader = this.getLoader();\n\t\treturn new HtmlValidate(loader);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic getConfig(): ConfigData {\n\t\tif (!this.config) {\n\t\t\tthis.config = this.resolveConfig();\n\t\t}\n\t\treturn this.config;\n\t}\n\n\tprivate resolveConfig(): ConfigData {\n\t\tconst { options } = this;\n\t\tconst config = getBaseConfig(options.configFile);\n\t\tif (options.rules) {\n\t\t\tconfig.extends = [];\n\t\t\tconfig.rules = getRuleConfig(options.rules);\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","/**\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 = files.map(async (filename: string) => {\n\t\ttry {\n\t\t\treturn 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 = await 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 function dump(\n\thtmlvalidate: HtmlValidate,\n\toutput: WritableStreamLike,\n\tfiles: string[],\n\tmode: Mode,\n): Promise<boolean> {\n\tlet lines: string[][] = [];\n\tswitch (mode) {\n\t\tcase Mode.DUMP_EVENTS:\n\t\t\tlines = files.map((filename: string) =>\n\t\t\t\thtmlvalidate.dumpEvents(filename).map(eventFormatter),\n\t\t\t);\n\t\t\tbreak;\n\t\tcase Mode.DUMP_TOKENS:\n\t\t\tlines = files.map((filename: string) =>\n\t\t\t\thtmlvalidate.dumpTokens(filename).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 = 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"],"names":["fs","path","globSync","formatterFactory","legacyRequire","UserError","ensureError","fn","ignore","deepmerge","init","prompts","Severity","cjsResolver","FileSystemConfigLoader","HtmlValidate","betterAjvErrors","kleur","Mode","Reporter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAIA,MAAM,kBAAA,GAAqB,CAAC,MAAM,CAAA,CAAA;AAkBlC,SAAS,YAAY,QAA2B,EAAA;AAC/C,EAAM,MAAA,EAAA,GAAKA,mBAAG,CAAA,QAAA,CAAS,QAAQ,CAAA,CAAA;AAC/B,EAAA,OAAO,GAAG,WAAY,EAAA,CAAA;AACvB,CAAA;AAEA,SAAS,IAAA,CAAK,MAAc,QAA0B,EAAA;AACrD,EAAI,IAAAC,qBAAA,CAAK,UAAW,CAAA,QAAQ,CAAG,EAAA;AAC9B,IAAO,OAAAA,qBAAA,CAAK,UAAU,QAAQ,CAAA,CAAA;AAAA,GACxB,MAAA;AACN,IAAA,OAAOA,sBAAK,SAAU,CAAAA,qBAAA,CAAK,IAAK,CAAA,IAAA,EAAM,QAAQ,CAAC,CAAA,CAAA;AAAA,GAChD;AACD,CAAA;AAEA,SAAS,iBAAiB,UAA8B,EAAA;AACvD,EAAA,QAAQ,WAAW,MAAQ;AAAA,IAC1B,KAAK,CAAA;AACJ,MAAO,OAAA,MAAA,CAAA;AAAA,IACR,KAAK,CAAA;AACJ,MAAO,OAAA,CAAA,KAAA,EAAQ,UAAW,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,IAC7B;AACC,MAAA,OAAO,CAAS,MAAA,EAAA,UAAA,CAAW,IAAK,CAAA,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA;AAAA,GACtC;AACD,CAAA;AAMgB,SAAA,WAAA,CAAY,UAAoB,OAAkC,EAAA;AACjF,EAAA,MAAM,GAAM,GAAA,OAAA,CAAQ,GAAO,IAAA,OAAA,CAAQ,GAAI,EAAA,CAAA;AACvC,EAAM,MAAA,UAAA,GAAa,QAAQ,UAAc,IAAA,kBAAA,CAAA;AAEzC,EAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,MAAO,CAAA,CAAC,QAAkB,OAAoB,KAAA;AAEpE,IAAA,IAAI,YAAY,GAAK,EAAA;AACpB,MAAA,MAAA,CAAO,KAAK,YAAY,CAAA,CAAA;AACxB,MAAO,OAAA,MAAA,CAAA;AAAA,KACR;AAEA,IAAA,KAAA,MAAW,YAAYC,aAAS,CAAA,OAAA,EAAS,EAAE,GAAA,EAAK,CAAG,EAAA;AAElD,MAAM,MAAA,QAAA,GAAW,IAAK,CAAA,GAAA,EAAK,QAAQ,CAAA,CAAA;AACnC,MAAI,IAAA,WAAA,CAAY,QAAQ,CAAG,EAAA;AAC1B,QAAA,MAAM,GAAM,GAAA,WAAA,CAAY,CAAC,gBAAA,CAAiB,UAAU,CAAC,CAAG,EAAA,EAAE,GAAG,OAAA,EAAS,GAAK,EAAA,QAAA,EAAU,CAAA,CAAA;AACrF,QAAS,MAAA,GAAA,MAAA,CAAO,MAAO,CAAA,GAAA,CAAI,GAAI,CAAA,CAAC,QAAQ,IAAK,CAAA,QAAA,EAAU,GAAG,CAAC,CAAC,CAAA,CAAA;AAC5D,QAAA,SAAA;AAAA,OACD;AAEA,MAAA,MAAA,CAAO,KAAK,QAAQ,CAAA,CAAA;AAAA,KACrB;AAEA,IAAA,OAAO,MAAO,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAM,KAAA;AAC5B,MAAA,MAAM,EAAK,GAAA,CAAA,CAAE,KAAM,CAAA,GAAG,CAAE,CAAA,MAAA,CAAA;AACxB,MAAA,MAAM,EAAK,GAAA,CAAA,CAAE,KAAM,CAAA,GAAG,CAAE,CAAA,MAAA,CAAA;AACxB,MAAA,IAAI,OAAO,EAAI,EAAA;AACd,QAAA,OAAO,EAAK,GAAA,EAAA,CAAA;AAAA,OACN,MAAA;AACN,QAAO,OAAA,CAAA,GAAI,IAAI,CAAI,GAAA,CAAA,CAAA,CAAA;AAAA,OACpB;AAAA,KACA,CAAA,CAAA;AAAA,GACF,EAAG,EAAE,CAAA,CAAA;AAGL,EAAA,OAAO,KAAM,CAAA,IAAA,CAAK,IAAI,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA;AACjC;;AC9EA,SAAS,IAAA,CAAK,WAAsB,GAA4C,EAAA;AAC/E,EAAA,OAAO,CAAC,OAAsB,KAAA;AAC7B,IAAM,MAAA,MAAA,GAAS,UAAU,OAAO,CAAA,CAAA;AAChC,IAAA,IAAI,GAAK,EAAA;AACR,MAAM,MAAA,GAAA,GAAMD,qBAAK,CAAA,OAAA,CAAQ,GAAG,CAAA,CAAA;AAC5B,MAAA,IAAI,CAACD,mBAAA,CAAG,UAAW,CAAA,GAAG,CAAG,EAAA;AACxB,QAAAA,mBAAA,CAAG,SAAU,CAAA,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA,CAAA;AAAA,OACtC;AACA,MAAGA,mBAAA,CAAA,aAAA,CAAc,GAAK,EAAA,MAAA,EAAQ,OAAO,CAAA,CAAA;AACrC,MAAO,OAAA,EAAA,CAAA;AAAA,KACD,MAAA;AACN,MAAO,OAAA,MAAA,CAAA;AAAA,KACR;AAAA,GACD,CAAA;AACD,CAAA;AAEA,SAAS,cAAc,IAAyB,EAAA;AAC/C,EAAM,MAAA,EAAA,GAAKG,kBAAiB,IAAI,CAAA,CAAA;AAChC,EAAA,IAAI,EAAI,EAAA;AACP,IAAO,OAAA,EAAA,CAAA;AAAA,GACR;AAEA,EAAI,IAAA;AACH,IAAA,OAAOC,yBAAc,IAAI,CAAA,CAAA;AAAA,WACjB,KAAgB,EAAA;AACxB,IAAA,MAAM,IAAIC,cAAU,CAAA,CAAA,oBAAA,EAAuB,IAAI,CAAK,CAAA,CAAA,EAAAC,gBAAA,CAAY,KAAK,CAAC,CAAA,CAAA;AAAA,GACvE;AACD,CAAA;AAEO,SAAS,aAAa,UAAgD,EAAA;AAC5E,EAAA,MAAM,KAAyB,UAAW,CAAA,KAAA,CAAM,GAAG,CAAE,CAAA,GAAA,CAAI,CAAC,GAAQ,KAAA;AACjE,IAAA,MAAM,CAAC,IAAM,EAAA,GAAG,IAAI,GAAI,CAAA,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AACpC,IAAMC,MAAAA,GAAAA,GAAK,cAAc,IAAI,CAAA,CAAA;AAC7B,IAAO,OAAA,IAAA,CAAKA,KAAI,GAAG,CAAA,CAAA;AAAA,GACnB,CAAA,CAAA;AACD,EAAA,OAAO,CAAC,MAAmB,KAAA;AAC1B,IAAA,OAAO,EACL,CAAA,GAAA,CAAI,CAAC,SAAA,KAAgC,SAAU,CAAA,MAAA,CAAO,OAAO,CAAC,CAC9D,CAAA,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,IAAI,CAAA,CAAA;AAAA,GACZ,CAAA;AACD;;AC7CO,MAAM,SAAU,CAAA;AAAA,EAIf,WAAc,GAAA;AACpB,IAAK,IAAA,CAAA,WAAA,uBAAkB,GAAI,EAAA,CAAA;AAAA,GAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,UAAU,QAA2B,EAAA;AAC3C,IAAO,OAAA,IAAA,CAAK,MAAM,QAAQ,CAAA,CAAA;AAAA,GAC3B;AAAA;AAAA;AAAA;AAAA,EAKO,UAAmB,GAAA;AACzB,IAAA,IAAA,CAAK,YAAY,KAAM,EAAA,CAAA;AAAA,GACxB;AAAA,EAEQ,MAAM,MAAyB,EAAA;AACtC,IAAI,IAAA,OAAA,GAAUN,qBAAK,CAAA,OAAA,CAAQ,MAAM,CAAA,CAAA;AAGjC,IAAA,OAAO,IAAM,EAAA;AACZ,MAAA,MAAM,QAAW,GAAAA,qBAAA,CAAK,QAAS,CAAA,OAAA,EAAS,MAAM,CAAA,CAAA;AAC9C,MAAA,MAAM,QAAW,GAAAA,qBAAA,CAAK,IAAK,CAAA,OAAA,EAAS,qBAAqB,CAAA,CAAA;AAGzD,MAAM,MAAA,EAAA,GAAK,IAAK,CAAA,SAAA,CAAU,QAAQ,CAAA,CAAA;AAClC,MAAI,IAAA,EAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAI,QAAQ,QAAW,CAAA,EAAA;AAC1B,QAAO,OAAA,IAAA,CAAA;AAAA,OACR;AAGA,MAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AACd,MAAU,OAAA,GAAAA,qBAAA,CAAK,QAAQ,OAAO,CAAA,CAAA;AAG9B,MAAA,IAAI,YAAY,KAAO,EAAA;AACtB,QAAA,MAAA;AAAA,OACD;AAAA,KACD;AAEA,IAAO,OAAA,KAAA,CAAA;AAAA,GACR;AAAA,EAEQ,UAAU,QAAsC,EAAA;AACvD,IAAA,IAAI,IAAK,CAAA,WAAA,CAAY,GAAI,CAAA,QAAQ,CAAG,EAAA;AACnC,MAAO,OAAA,IAAA,CAAK,WAAY,CAAA,GAAA,CAAI,QAAQ,CAAA,CAAA;AAAA,KACrC;AAEA,IAAA,IAAI,CAACD,mBAAA,CAAG,UAAW,CAAA,QAAQ,CAAG,EAAA;AAC7B,MAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,QAAA,EAAU,KAAS,CAAA,CAAA,CAAA;AACxC,MAAO,OAAA,KAAA,CAAA,CAAA;AAAA,KACR;AAEA,IAAA,MAAM,OAAU,GAAAA,mBAAA,CAAG,YAAa,CAAA,QAAA,EAAU,OAAO,CAAA,CAAA;AACjD,IAAA,MAAM,EAAK,GAAAQ,WAAA,EAAS,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAC/B,IAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,QAAA,EAAU,EAAE,CAAA,CAAA;AACjC,IAAO,OAAA,EAAA,CAAA;AAAA,GACR;AACD;;ACnDA,MAAM,eAA8C,GAAA;AAAA,EACnD,CAAC,8BAAuB;AAAA,IACvB,SAAW,EAAA;AAAA,MACV,WAAa,EAAA,0BAAA;AAAA,MACb,aAAe,EAAA,4BAAA;AAAA,KAChB;AAAA,GACD;AAAA,EACA,CAAC,uBAAmB;AAAA,IACnB,OAAA,EAAS,CAAC,mBAAmB,CAAA;AAAA,IAC7B,OAAA,EAAS,CAAC,+BAA+B,CAAA;AAAA,IACzC,SAAW,EAAA;AAAA,MACV,YAAc,EAAA,mBAAA;AAAA,KACf;AAAA,GACD;AAAA,EACA,CAAC,4BAAsB;AAAA,IACtB,SAAW,EAAA;AAAA,MACV,WAAa,EAAA,wBAAA;AAAA,KACd;AAAA,GACD;AACD,CAAA,CAAA;AAEA,SAAS,aAAA,CAAc,KAAiB,UAAkC,EAAA;AACzE,EAAA,IAAI,MAAS,GAAA,GAAA,CAAA;AACb,EAAA,KAAA,MAAW,aAAa,UAAY,EAAA;AACnC,IAAA,MAAA,GAASC,cAAU,CAAA,MAAA,EAAQ,eAAgB,CAAA,SAAS,CAAC,CAAA,CAAA;AAAA,GACtD;AACA,EAAO,OAAA,MAAA,CAAA;AACR,CAAA;AAEA,SAAS,WAAA,CAAY,KAAa,MAAmC,EAAA;AACpE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACvC,IAAGT,mBAAA,CAAA,SAAA,CAAU,KAAK,IAAK,CAAA,SAAA,CAAU,QAAQ,IAAM,EAAA,CAAC,CAAG,EAAA,CAAC,GAAQ,KAAA;AAC3D,MAAI,IAAA,GAAA;AAAK,QAAA,MAAA,CAAO,GAAG,CAAA,CAAA;AACnB,MAAQ,OAAA,EAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACD,CAAA,CAAA;AACF,CAAA;AAEA,eAAsBU,OAAK,GAAkC,EAAA;AAC5D,EAAM,MAAA,QAAA,GAAW,GAAG,GAAG,CAAA,mBAAA,CAAA,CAAA;AACvB,EAAM,MAAA,MAAA,GAASV,mBAAG,CAAA,UAAA,CAAW,QAAQ,CAAA,CAAA;AACrC,EAAA,MAAM,aAA4B,GAAA;AAAA,IACjC,QAAA,EAAU,CAAC,OAAO,CAAA;AAAA,IAClB,OAAA,EAAS,CAAC,2BAA2B,CAAA;AAAA,GACtC,CAAA;AAGA,EAAA,IAAI,MAAQ,EAAA;AACX,IAAM,MAAA,MAAA,GAAS,MAAMW,wBAAQ,CAAA;AAAA,MAC5B,IAAM,EAAA,WAAA;AAAA,MACN,IAAM,EAAA,SAAA;AAAA,MACN,OAAS,EAAA,wEAAA;AAAA,KACT,CAAA,CAAA;AACD,IAAI,IAAA,CAAC,OAAO,SAAW,EAAA;AAEtB,MAAA,OAAO,QAAQ,MAAO,EAAA,CAAA;AAAA,KACvB;AAAA,GACD;AAEA,EAAA,MAAM,SAAoC,GAAA;AAAA,IACzC;AAAA,MACC,IAAM,EAAA,YAAA;AAAA,MACN,IAAM,EAAA,aAAA;AAAA,MACN,OAAS,EAAA;AAAA,QACR,EAAE,KAAA,EAAO,WAAsB,kBAAA,KAAA,EAAO,WAAqB,kBAAA;AAAA,QAC3D,EAAE,KAAA,EAAO,QAAkB,cAAA,KAAA,EAAO,QAAiB,cAAA;AAAA,QACnD,EAAE,KAAA,EAAO,UAAqB,iBAAA,KAAA,EAAO,UAAoB,iBAAA;AAAA,OAC1D;AAAA,MACA,OAAS,EAAA,gCAAA;AAAA,KACV;AAAA,GACD,CAAA;AAGA,EAAM,MAAA,OAAA,GAAU,MAAMA,wBAAA,CAAQ,SAAS,CAAA,CAAA;AAGvC,EAAA,IAAI,MAAS,GAAA,aAAA,CAAA;AACb,EAAS,MAAA,GAAA,aAAA,CAAc,MAAQ,EAAA,OAAA,CAAQ,UAAsB,CAAA,CAAA;AAC7D,EAAM,MAAA,WAAA,CAAY,UAAU,MAAM,CAAA,CAAA;AAElC,EAAO,OAAA;AAAA,IACN,QAAA;AAAA,GACD,CAAA;AACD;;AChGgB,SAAA,aAAA,CAAc,QAAgB,QAA4B,EAAA;AACzE,EAAA,QAAQ,QAAU;AAAA,IACjB,KAAK,KAAA,CAAA;AAAA,IACL,KAAK,GAAA;AACJ,MAAA,OAAOC,aAAS,CAAA,QAAA,CAAA;AAAA,IACjB,KAAK,MAAA,CAAA;AAAA,IACL,KAAK,GAAA;AACJ,MAAA,OAAOA,aAAS,CAAA,IAAA,CAAA;AAAA,IACjB,KAAK,OAAA,CAAA;AAAA,IACL,KAAK,GAAA;AACJ,MAAA,OAAOA,aAAS,CAAA,KAAA,CAAA;AAAA,IACjB;AACC,MAAA,MAAM,IAAI,KAAM,CAAA,CAAA,kBAAA,EAAqB,QAAQ,CAAA,YAAA,EAAe,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,GACvE;AACD;;AChBA,SAAS,UAAU,KAAuD,EAAA;AACzE,EAAI,IAAA,KAAA,CAAM,QAAS,CAAA,GAAG,CAAG,EAAA;AACxB,IAAA,MAAM,CAAC,MAAQ,EAAA,QAAQ,IAAI,KAAM,CAAA,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AAC7C,IAAA,OAAO,EAAE,MAAQ,EAAA,QAAA,EAAU,aAAc,CAAA,MAAA,EAAQ,QAAQ,CAAE,EAAA,CAAA;AAAA,GACrD,MAAA;AACN,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAO,EAAA,QAAA,EAAUA,cAAS,KAAM,EAAA,CAAA;AAAA,GAClD;AACD,CAAA;AAKO,SAAS,cAAc,MAAuC,EAAA;AACpE,EAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC/B,IAAO,OAAA,aAAA,CAAc,CAAC,MAAM,CAAC,CAAA,CAAA;AAAA,GAC9B;AAEA,EAAA,OAAO,MAAO,CAAA,MAAA,CAAmB,CAAC,WAAA,EAAa,KAAU,KAAA;AACxD,IAAA,MAAM,EAAE,MAAQ,EAAA,QAAA,KAAa,SAAU,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AACnD,IAAA,OAAO,EAAE,CAAC,MAAM,GAAG,QAAA,EAAU,GAAG,WAAY,EAAA,CAAA;AAAA,GAC7C,EAAG,EAAE,CAAA,CAAA;AACN;;ACRA,MAAM,aAA4B,GAAA;AAAA,EACjC,OAAA,EAAS,CAAC,2BAA2B,CAAA;AACtC,CAAA,CAAA;AAUA,SAAS,cAAc,QAA+B,EAAA;AACrD,EAAA,IAAI,QAAU,EAAA;AACb,IAAA,MAAM,WAAWC,sBAAY,EAAA,CAAA;AAC7B,IAAM,MAAA,UAAA,GAAa,QAAS,CAAA,aAAA,CAAcZ,qBAAK,CAAA,OAAA,CAAQ,QAAQ,CAAG,EAAA,EAAE,KAAO,EAAA,KAAA,EAAO,CAAA,CAAA;AAClF,IAAA,IAAI,CAAC,UAAY,EAAA;AAChB,MAAA,MAAM,IAAII,cAAA,CAAU,CAAsC,mCAAA,EAAA,QAAQ,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,KACtE;AACA,IAAO,OAAA,UAAA,CAAA;AAAA,GACD,MAAA;AACN,IAAO,OAAA,aAAA,CAAA;AAAA,GACR;AACD,CAAA;AAKO,MAAM,GAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYT,YAAY,OAAsB,EAAA;AACxC,IAAK,IAAA,CAAA,OAAA,GAAU,WAAW,EAAC,CAAA;AAC3B,IAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAA;AACd,IAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAA;AACd,IAAK,IAAA,CAAA,OAAA,GAAU,IAAI,SAAU,EAAA,CAAA;AAAA,GAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,WAAY,CAAA,QAAA,EAAoB,OAAyB,GAAA,EAAc,EAAA;AAC7E,IAAO,OAAA,WAAA,CAAY,QAAU,EAAA,OAAO,CAAE,CAAA,MAAA,CAAO,CAAC,QAAA,KAAa,CAAC,IAAA,CAAK,SAAU,CAAA,QAAQ,CAAC,CAAA,CAAA;AAAA,GACrF;AAAA,EAEO,aAAa,UAAgD,EAAA;AACnE,IAAA,OAAO,aAAa,UAAU,CAAA,CAAA;AAAA,GAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,KAAK,GAAkC,EAAA;AAC7C,IAAA,OAAOK,OAAK,GAAG,CAAA,CAAA;AAAA,GAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,UAAU,QAA2B,EAAA;AAC3C,IAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,SAAA,CAAU,QAAQ,CAAA,CAAA;AAAA,GACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,UAAmB,GAAA;AACzB,IAAA,IAAI,KAAK,MAAQ,EAAA;AAChB,MAAA,IAAA,CAAK,OAAO,UAAW,EAAA,CAAA;AAAA,KACxB;AACA,IAAA,IAAA,CAAK,QAAQ,UAAW,EAAA,CAAA;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,SAA0B,GAAA;AAChC,IAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AACjB,MAAA,IAAA,CAAK,MAAS,GAAA,IAAII,iCAAuB,CAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AAAA,KAC1D;AACA,IAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,GACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,YAA6B,GAAA;AACnC,IAAM,MAAA,MAAA,GAAS,KAAK,SAAU,EAAA,CAAA;AAC9B,IAAO,OAAA,IAAIC,kBAAa,MAAM,CAAA,CAAA;AAAA,GAC/B;AAAA;AAAA;AAAA;AAAA,EAKO,SAAwB,GAAA;AAC9B,IAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AACjB,MAAK,IAAA,CAAA,MAAA,GAAS,KAAK,aAAc,EAAA,CAAA;AAAA,KAClC;AACA,IAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,GACb;AAAA,EAEQ,aAA4B,GAAA;AACnC,IAAM,MAAA,EAAE,SAAY,GAAA,IAAA,CAAA;AACpB,IAAM,MAAA,MAAA,GAAS,aAAc,CAAA,OAAA,CAAQ,UAAU,CAAA,CAAA;AAC/C,IAAA,IAAI,QAAQ,KAAO,EAAA;AAClB,MAAA,MAAA,CAAO,UAAU,EAAC,CAAA;AAClB,MAAO,MAAA,CAAA,KAAA,GAAQ,aAAc,CAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,KAC3C;AACA,IAAO,OAAA,MAAA,CAAA;AAAA,GACR;AACD;;AClJA,SAAS,YAAY,GAAoC,EAAA;AACxD,EAAI,IAAA,IAAA,CAAA;AACJ,EAAA,IAAI,IAAI,QAAY,IAAAf,qBAAA,CAAG,UAAW,CAAA,GAAA,CAAI,QAAQ,CAAG,EAAA;AAChD,IAAA,IAAA,GAAOA,qBAAG,CAAA,YAAA,CAAa,GAAI,CAAA,QAAA,EAAU,OAAO,CAAA,CAAA;AAAA,GAC7C;AACA,EAAA,OAAOgB,iCAAgB,GAAI,CAAA,MAAA,EAAQ,GAAI,CAAA,GAAA,EAAK,IAAI,MAAQ,EAAA;AAAA,IACvD,MAAQ,EAAA,KAAA;AAAA,IACR,MAAQ,EAAA,CAAA;AAAA,IACR,IAAA;AAAA,GACA,CAAA,CAAA;AACF,CAAA;AAKgB,SAAA,2BAAA,CAA4B,SAAkB,GAAkC,EAAA;AAC/F,EAAA,IAAI,IAAI,QAAU,EAAA;AACjB,IAAA,MAAM,WAAWf,qBAAK,CAAA,QAAA,CAAS,QAAQ,GAAI,EAAA,EAAG,IAAI,QAAQ,CAAA,CAAA;AAC1D,IAAA,OAAA,CAAQ,MAAMgB,sBAAM,CAAA,GAAA,CAAI,CAAuC,oCAAA,EAAA,QAAQ,IAAI,CAAC,CAAA,CAAA;AAAA,GACtE,MAAA;AACN,IAAA,OAAA,CAAQ,KAAM,CAAAA,sBAAA,CAAM,GAAI,CAAA,CAAA,gCAAA,CAAkC,CAAC,CAAA,CAAA;AAAA,GAC5D;AACA,EAAA,OAAA,CAAQ,KAAM,EAAA,CAAA;AACd,EAAA;AACC,IAAQ,OAAA,CAAA,KAAA,CAAM,WAAY,CAAA,GAAG,CAAC,CAAA,CAAA;AAAA,GAC/B;AACA,EAAA,OAAA,CAAQ,QAAS,EAAA,CAAA;AAClB;;AC9BY,IAAA,IAAA,qBAAAC,KAAL,KAAA;AACN,EAAAA,KAAA,CAAA,KAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA,CAAA;AACA,EAAAA,KAAA,CAAA,KAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA,CAAA;AACA,EAAAA,KAAA,CAAA,KAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,GAAA,aAAA,CAAA;AACA,EAAAA,KAAA,CAAA,KAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,GAAA,aAAA,CAAA;AACA,EAAAA,KAAA,CAAA,KAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAA,CAAA;AACA,EAAAA,KAAA,CAAA,KAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,GAAA,aAAA,CAAA;AACA,EAAAA,KAAA,CAAA,KAAA,CAAA,cAAA,CAAA,GAAA,CAAA,CAAA,GAAA,cAAA,CAAA;AAPW,EAAAA,OAAAA,KAAAA,CAAAA;AAAA,CAAA,EAAA,IAAA,IAAA,EAAA,EAAA;AAeL,SAAS,WAAW,IAA2B,EAAA;AACrD,EAAA,QAAQ,IAAM;AAAA,IACb,KAAK,CAAA;AACJ,MAAO,OAAA,IAAA,CAAA;AAAA,IACR,KAAK,CAAA;AACJ,MAAO,OAAA,QAAA,CAAA;AAAA,IACR,KAAK,CAAA;AACJ,MAAO,OAAA,eAAA,CAAA;AAAA,IACR,KAAK,CAAA;AACJ,MAAO,OAAA,eAAA,CAAA;AAAA,IACR,KAAK,CAAA;AACJ,MAAO,OAAA,aAAA,CAAA;AAAA,IACR,KAAK,CAAA;AACJ,MAAO,OAAA,eAAA,CAAA;AAAA,IACR,KAAK,CAAA;AACJ,MAAO,OAAA,gBAAA,CAAA;AAAA,GACT;AACD;;ACzBA,SAAS,WAAA,CAAY,QAAgB,QAAwB,EAAA;AAC5D,EAAM,MAAA,KAAA,GAAQ,OAAO,OAAQ,CAAA,IAAA,CAAK,CAAC,GAAgB,KAAA,GAAA,CAAI,aAAa,YAAY,CAAA,CAAA;AAChF,EAAA,IAAI,KAAO,EAAA;AACV,IAAA,KAAA,CAAM,QAAW,GAAA,QAAA,CAAA;AAAA,GAClB;AACD,CAAA;AAEA,eAAsB,IACrB,CAAA,YAAA,EACA,MACA,EAAA,KAAA,EACA,OACmB,EAAA;AACnB,EAAA,MAAM,OAAU,GAAA,KAAA,CAAM,GAAI,CAAA,OAAO,QAAqB,KAAA;AACrD,IAAI,IAAA;AACH,MAAO,OAAA,MAAM,YAAa,CAAA,YAAA,CAAa,QAAQ,CAAA,CAAA;AAAA,aACvC,GAAK,EAAA;AACb,MAAA,MAAM,OAAU,GAAAD,sBAAA,CAAM,GAAI,CAAA,CAAA,gCAAA,EAAmC,QAAQ,CAAG,CAAA,CAAA,CAAA,CAAA;AACxE,MAAO,MAAA,CAAA,KAAA,CAAM,GAAG,OAAO,CAAA;AAAA,CAAI,CAAA,CAAA;AAC3B,MAAM,MAAA,GAAA,CAAA;AAAA,KACP;AAAA,GACA,CAAA,CAAA;AAED,EAAA,MAAM,MAAS,GAAA,MAAME,aAAS,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAG3C,EAAA,IAAI,QAAQ,aAAe,EAAA;AAC1B,IAAY,WAAA,CAAA,MAAA,EAAQ,QAAQ,aAAa,CAAA,CAAA;AAAA,GAC1C;AAEA,EAAA,MAAA,CAAO,KAAM,CAAA,OAAA,CAAQ,SAAU,CAAA,MAAM,CAAC,CAAA,CAAA;AAEtC,EAAA,IAAI,QAAQ,WAAe,IAAA,CAAA,IAAK,MAAO,CAAA,YAAA,GAAe,QAAQ,WAAa,EAAA;AAC1E,IAAO,MAAA,CAAA,KAAA;AAAA,MACN,CAAA;AAAA,gDAAqD,EAAA,MAAA,CAAO,OAAQ,CAAA,WAAW,CAAC,CAAA;AAAA,CAAA;AAAA,KACjF,CAAA;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACR;AAEA,EAAA,OAAO,MAAO,CAAA,KAAA,CAAA;AACf;;AC3CsB,eAAA,IAAA,CACrB,GACA,EAAA,MAAA,EACA,OACmB,EAAA;AACnB,EAAA,MAAM,MAAS,GAAA,MAAM,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA,CAAA;AACzC,EAAO,MAAA,CAAA,KAAA,CAAM,CAA6B,0BAAA,EAAA,MAAA,CAAO,QAAQ,CAAA;AAAA,CAAK,CAAA,CAAA;AAC9D,EAAO,OAAA,IAAA,CAAA;AACR;;ACZsB,eAAA,WAAA,CACrB,YACA,EAAA,MAAA,EACA,KACmB,EAAA;AACnB,EAAI,IAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACrB,IAAA,MAAA,CAAO,KAAM,CAAA,CAAA;AAAA;AAAA,CAAqE,CAAA,CAAA;AAClF,IAAA,KAAA,MAAW,YAAY,KAAO,EAAA;AAC7B,MAAO,MAAA,CAAA,KAAA,CAAM,OAAO,QAAQ,CAAA;AAAA,CAAI,CAAA,CAAA;AAAA,KACjC;AACA,IAAA,MAAA,CAAO,MAAM,IAAI,CAAA,CAAA;AACjB,IAAO,OAAA,KAAA,CAAA;AAAA,GACR;AACA,EAAA,MAAM,SAAS,MAAM,YAAA,CAAa,YAAa,CAAA,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACvD,EAAA,MAAM,OAAO,IAAK,CAAA,SAAA,CAAU,OAAO,aAAc,EAAA,EAAG,MAAM,CAAC,CAAA,CAAA;AAC3D,EAAO,MAAA,CAAA,KAAA,CAAM,GAAG,IAAI,CAAA;AAAA,CAAI,CAAA,CAAA;AACxB,EAAO,OAAA,IAAA,CAAA;AACR;;AClBA,MAAM,WAAc,GAAA;AAAA,EACnB,YAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AACD,CAAA,CAAA;AACA,MAAM,YAAe,GAAA;AAAA,EACpB,YAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AACD,CAAA,CAAA;AAEA,SAAS,UAAA,CAAW,KAAa,KAAmC,EAAA;AACnE,EAAA,OAAO,QAAQ,KAAU,KAAA,GAAA,KAAQ,cAAc,GAAI,CAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA,CAAA;AACzE,CAAA;AAEA,SAAS,UAAU,GAAsB,EAAA;AACxC,EAAO,OAAA,OAAA,CAAQ,IAAI,UAAW,CAAA,GAAG,KAAK,WAAY,CAAA,QAAA,CAAS,GAAG,CAAC,CAAA,CAAA;AAChE,CAAA;AAEA,SAAS,UAAA,CAAW,KAAa,KAAyB,EAAA;AACzD,EAAA,OAAO,OAAQ,CAAA,KAAA,IAAS,YAAa,CAAA,QAAA,CAAS,GAAG,CAAC,CAAA,CAAA;AACnD,CAAA;AAEgB,SAAA,aAAA,CAA6B,KAAa,KAAkC,EAAA;AAC3F,EAAI,IAAA,UAAA,CAAW,GAAK,EAAA,KAAK,CAAG,EAAA;AAC3B,IAAA,MAAM,WAAW,KAAM,CAAA,QAAA,CAAA;AACvB,IAAM,MAAA,IAAA,GAAO,MAAO,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAC9B,IAAM,MAAA,MAAA,GAAS,MAAO,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAClC,IAAA,OAAO,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,IAAI,IAAI,MAAM,CAAA,CAAA,CAAA;AAAA,GACrC;AACA,EAAI,IAAA,SAAA,CAAU,GAAG,CAAG,EAAA;AACnB,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACR;AACA,EAAI,IAAA,UAAA,CAAW,GAAK,EAAA,KAAK,CAAG,EAAA;AAC3B,IAAO,OAAA,aAAA,CAAA;AAAA,GACR;AACA,EAAO,OAAA,KAAA,CAAA;AACR,CAAA;AAEO,SAAS,eAAe,KAA0B,EAAA;AACxD,EAAA,MAAM,UAAU,IAAK,CAAA,SAAA,CAAU,KAAM,CAAA,IAAA,EAAM,eAAe,CAAC,CAAA,CAAA;AAC3D,EAAA,OAAO,CAAG,EAAA,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAClC;;ACjDO,SAAS,IACf,CAAA,YAAA,EACA,MACA,EAAA,KAAA,EACA,IACmB,EAAA;AACnB,EAAA,IAAI,QAAoB,EAAC,CAAA;AACzB,EAAA,QAAQ,IAAM;AAAA,IACb,KAAK,IAAK,CAAA,WAAA;AACT,MAAA,KAAA,GAAQ,KAAM,CAAA,GAAA;AAAA,QAAI,CAAC,QAClB,KAAA,YAAA,CAAa,WAAW,QAAQ,CAAA,CAAE,IAAI,cAAc,CAAA;AAAA,OACrD,CAAA;AACA,MAAA,MAAA;AAAA,IACD,KAAK,IAAK,CAAA,WAAA;AACT,MAAA,KAAA,GAAQ,KAAM,CAAA,GAAA;AAAA,QAAI,CAAC,aAClB,YAAa,CAAA,UAAA,CAAW,QAAQ,CAAE,CAAA,GAAA,CAAI,CAAC,KAAqB,KAAA;AAC3D,UAAA,MAAM,IAAO,GAAA,IAAA,CAAK,SAAU,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AACtC,UAAO,OAAA,CAAA,OAAA,EAAU,MAAM,KAAK,CAAA;AAAA,QAAA,EAAa,IAAI,CAAA;AAAA,YAAA,EAAiB,MAAM,QAAQ,CAAA,CAAA,CAAA;AAAA,SAC5E,CAAA;AAAA,OACF,CAAA;AACA,MAAA,MAAA;AAAA,IACD,KAAK,IAAK,CAAA,SAAA;AACT,MAAA,KAAA,GAAQ,MAAM,GAAI,CAAA,CAAC,aAAqB,YAAa,CAAA,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAA;AACvE,MAAA,MAAA;AAAA,IACD,KAAK,IAAK,CAAA,WAAA;AACT,MAAA,KAAA,GAAQ,MAAM,GAAI,CAAA,CAAC,aAAqB,YAAa,CAAA,UAAA,CAAW,QAAQ,CAAC,CAAA,CAAA;AACzE,MAAA,MAAA;AAAA,IACD;AACC,MAAA,MAAM,IAAI,KAAM,CAAA,CAAA,cAAA,EAAiB,MAAO,CAAA,IAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,GAClD;AACA,EAAM,MAAA,IAAA,GAAO,KAAM,CAAA,MAAA,CAAO,CAAC,CAAA,EAAa,CAAgB,KAAA,CAAA,CAAE,MAAO,CAAA,CAAC,CAAG,EAAA,EAAE,CAAA,CAAA;AACvE,EAAA,MAAA,CAAO,KAAM,CAAA,IAAA,CAAK,IAAK,CAAA,IAAI,CAAC,CAAA,CAAA;AAC5B,EAAA,MAAA,CAAO,MAAM,IAAI,CAAA,CAAA;AACjB,EAAO,OAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA,CAAA;AAC5B;;;;;;;;;;;"}
|
|
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/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"],"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\";\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 config = await getBaseConfig(options.preset, options.configFile);\n\t\tif (options.rules) {\n\t\t\tif (!options.preset) {\n\t\t\t\tconfig.extends = [];\n\t\t\t}\n\t\t\tconfig.rules = getRuleConfig(options.rules);\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","/**\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 = files.map(async (filename: string) => {\n\t\ttry {\n\t\t\treturn 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 = await 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"],"names":["fs","path","globSync","formatterFactory","legacyRequire","UserError","ensureError","fn","ignore","deepmerge","init","prompts","esmResolver","FileSystemConfigLoader","HtmlValidate","betterAjvErrors","kleur","Mode","Reporter","lines"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-browser.js","sources":["../../src/utils/compatibility-check.browser.ts"],"sourcesContent":["import { version } from \"../generated/package\";\nimport { type CompatibilityOptions, compatibilityCheckImpl } from \"./compatibility-check\";\n\nconst defaults: CompatibilityOptions = {\n\tsilent: false,\n\tversion,\n\tlogger(text: string): void {\n\t\t/* eslint-disable-next-line no-console -- expected to log */\n\t\tconsole.error(text);\n\t},\n};\n\n/**\n * Tests if plugin is compatible with html-validate library. Unless the `silent`\n * option is used a warning is displayed on the console.\n *\n * @public\n * @since v5.0.0\n * @param name - Name of plugin\n * @param declared - What library versions the plugin support (e.g. declared peerDependencies)\n * @returns - `true` if version is compatible\n */\nexport function compatibilityCheck(\n\tname: string,\n\tdeclared: string,\n\toptions?: Partial<CompatibilityOptions>,\n): boolean {\n\treturn compatibilityCheckImpl(name, declared, {\n\t\t...defaults,\n\t\t...options,\n\t});\n}\n"],"names":["version","compatibilityCheckImpl"],"mappings":";;;;AAGA,MAAM,QAAiC,GAAA;AAAA,EACtC,MAAQ,EAAA,KAAA;AAAA,WACRA,YAAA;AAAA,EACA,OAAO,IAAoB,EAAA;AAE1B,IAAA,OAAA,CAAQ,MAAM,IAAI,CAAA
|
|
1
|
+
{"version":3,"file":"core-browser.js","sources":["../../src/utils/compatibility-check.browser.ts"],"sourcesContent":["import { version } from \"../generated/package\";\nimport { type CompatibilityOptions, compatibilityCheckImpl } from \"./compatibility-check\";\n\nconst defaults: CompatibilityOptions = {\n\tsilent: false,\n\tversion,\n\tlogger(text: string): void {\n\t\t/* eslint-disable-next-line no-console -- expected to log */\n\t\tconsole.error(text);\n\t},\n};\n\n/**\n * Tests if plugin is compatible with html-validate library. Unless the `silent`\n * option is used a warning is displayed on the console.\n *\n * @public\n * @since v5.0.0\n * @param name - Name of plugin\n * @param declared - What library versions the plugin support (e.g. declared peerDependencies)\n * @returns - `true` if version is compatible\n */\nexport function compatibilityCheck(\n\tname: string,\n\tdeclared: string,\n\toptions?: Partial<CompatibilityOptions>,\n): boolean {\n\treturn compatibilityCheckImpl(name, declared, {\n\t\t...defaults,\n\t\t...options,\n\t});\n}\n"],"names":["version","compatibilityCheckImpl"],"mappings":";;;;AAGA,MAAM,QAAiC,GAAA;AAAA,EACtC,MAAQ,EAAA,KAAA;AAAA,WACRA,YAAA;AAAA,EACA,OAAO,IAAoB,EAAA;AAE1B,IAAA,OAAA,CAAQ,MAAM,IAAI,CAAA;AAAA;AAEpB,CAAA;AAYgB,SAAA,kBAAA,CACf,IACA,EAAA,QAAA,EACA,OACU,EAAA;AACV,EAAO,OAAAC,2BAAA,CAAuB,MAAM,QAAU,EAAA;AAAA,IAC7C,GAAG,QAAA;AAAA,IACH,GAAG;AAAA,GACH,CAAA;AACF;;;;"}
|