@zthun/janitor-lint 19.2.0 → 19.2.2

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.
@@ -1,819 +0,0 @@
1
- "use strict";
2
- const chalk = require("chalk");
3
- const node_module = require("node:module");
4
- const cosmiconfig = require("cosmiconfig");
5
- const path = require("path");
6
- const prettier = require("prettier");
7
- const htmlhint = require("htmlhint");
8
- const jsYaml = require("js-yaml");
9
- const eslint = require("eslint");
10
- const lodashEs = require("lodash-es");
11
- const fs = require("fs");
12
- const glob = require("glob");
13
- const util = require("util");
14
- const promise = require("markdownlint/promise");
15
- const cspell = require("cspell");
16
- const stylelint = require("stylelint");
17
- var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
18
- function $require(id) {
19
- const require$1 = node_module.createRequire(typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("janitor-lint-Cq53L9m4.cjs", document.baseURI).href);
20
- return require$1(id);
21
- }
22
- function $resolve(id, options) {
23
- const require$1 = node_module.createRequire(typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("janitor-lint-Cq53L9m4.cjs", document.baseURI).href);
24
- return require$1.resolve(id, options);
25
- }
26
- class ZConfigExtender {
27
- /**
28
- * Initializes a new instance of this object.
29
- *
30
- * @param key
31
- * - The key to extend.
32
- */
33
- constructor(key = "extends") {
34
- this.key = key;
35
- }
36
- /**
37
- * Extends the configuration value.
38
- *
39
- * This is similar to how eslint works. This will do an
40
- * asynchronous require on each configuration under the key in the
41
- * config. If the key in the config is falsy, then the config is returned.
42
- *
43
- * The actual key in the config is deleted.
44
- *
45
- * @param config
46
- * - The config to extend.
47
- *
48
- * @returns
49
- * A promise that resolves the extended configuration.
50
- */
51
- async extend(config) {
52
- if (config == null || !Object.hasOwnProperty.call(config, this.key)) {
53
- return config;
54
- }
55
- const extensions = config[this.key];
56
- const modules = Array.isArray(extensions) ? extensions : [extensions];
57
- const resolved = await Promise.all(modules.map((m) => this._read(m)));
58
- let updated = resolved.reduce(
59
- (last, current) => Object.assign({}, last, current),
60
- {}
61
- );
62
- updated = Object.assign({}, updated, config);
63
- delete updated[this.key];
64
- return updated;
65
- }
66
- /**
67
- * Reads a module recursively.
68
- *
69
- * @param module
70
- * - The module to read.
71
- *
72
- * @returns
73
- * A promise that resolves the extended inner module.
74
- */
75
- async _read(module2) {
76
- const data = $require(module2);
77
- return await this.extend(data);
78
- }
79
- }
80
- class ZConfigReaderCosmic {
81
- /**
82
- * Initializes a new instance of this object.
83
- *
84
- * @param name -
85
- * The name of the application to load.
86
- * @param extender -
87
- * The extender to expand upon the read configuration.
88
- * @param paths -
89
- * The additional paths to read if cosmic config does not find a valid config. Remember that these
90
- * are paths, not modules in this case, so you can't load things from the node modules directory
91
- * using these values. These only affect the search for the config file, not the actual
92
- * read of the config.
93
- */
94
- constructor(name, extender, paths = []) {
95
- this.name = name;
96
- this.extender = extender;
97
- this.paths = paths;
98
- }
99
- /**
100
- * Runs a search for the appropriate configuration file.
101
- *
102
- * The extension keyword is deleted from the config.
103
- *
104
- * @returns
105
- * A promise that resolves with the expanded configuration.
106
- */
107
- async search() {
108
- const explorer = cosmiconfig.cosmiconfig(this.name, { searchStrategy: "project" });
109
- const searched = await explorer.search();
110
- if (searched) {
111
- return searched.filepath;
112
- }
113
- for (const path$1 of this.paths) {
114
- const full = path.resolve(path$1);
115
- const result = await explorer.load(full).catch(() => null);
116
- if (result) {
117
- return result.filepath;
118
- }
119
- }
120
- return null;
121
- }
122
- /**
123
- * Reads the config file.
124
- *
125
- * @param config -
126
- * The optional configuration file. If this is null then the cosmiconfig path is searched on the name.
127
- *
128
- * @returns
129
- * A promise that resolves the json object that represents the config.
130
- */
131
- async read(config) {
132
- const configLoad = config ? Promise.resolve(config) : this.search();
133
- const configFile = await configLoad;
134
- if (!configFile) {
135
- return {};
136
- }
137
- const path2 = $resolve(configFile, { paths: [process.cwd()] });
138
- const buffer = await cosmiconfig.cosmiconfig(this.name).load(path2);
139
- return await this.extender.extend(buffer.config);
140
- }
141
- }
142
- class ZConfigReaderNull {
143
- /**
144
- * Returns a null resolved promise.
145
- *
146
- * @returns
147
- * A promise that resolves to null.
148
- */
149
- async read() {
150
- return null;
151
- }
152
- }
153
- class ZConfigReaderPrettier {
154
- /**
155
- * Reads the configuration file.
156
- *
157
- * @param config -
158
- * The config module to load. If this value is falsy,
159
- * then prettier will be used to retrieve the configuration.
160
- *
161
- * @returns
162
- * The options for the config file.
163
- */
164
- async read(config) {
165
- const cwd = process.cwd();
166
- const configFile = config ? $resolve(config, { paths: [cwd] }) : void 0;
167
- const ops = { config: configFile };
168
- const options = await prettier.resolveConfig(
169
- path.resolve(process.cwd(), "some-prettier-config"),
170
- ops
171
- );
172
- return options || {};
173
- }
174
- }
175
- class ZContentLinterHtml {
176
- constructor() {
177
- this._formatOptions = { colors: true };
178
- }
179
- /**
180
- * Lints the content.
181
- *
182
- * @param content -
183
- * The content to check.
184
- * @param contentPath -
185
- * The path of the content data.
186
- * @param options -
187
- * The htmlhint options.
188
- *
189
- * @returns
190
- * A promise that resolves if the content is lint free, and rejects if it has lint errors.
191
- */
192
- lint(content, contentPath, options) {
193
- const messages = htmlhint.HTMLHint.verify(content, options);
194
- if (messages.length > 0) {
195
- const logs = htmlhint.HTMLHint.format(messages, this._formatOptions);
196
- return Promise.reject(logs);
197
- }
198
- return Promise.resolve(`${contentPath} is lint free.`);
199
- }
200
- }
201
- class ZContentLinterJson {
202
- /**
203
- * Lints the collection of json files.
204
- *
205
- * @param contents -
206
- * The json file contents.
207
- */
208
- async lint(contents) {
209
- return JSON.parse(contents);
210
- }
211
- }
212
- class ZContentLinterPretty {
213
- /**
214
- * Lints the content.
215
- *
216
- * @param content -
217
- * The content to check.
218
- * @param contentPath -
219
- * The path of the content data.
220
- * @param options -
221
- * The htmlhint options.
222
- *
223
- * @returns
224
- * A promise that resolves if the content is lint free, and rejects if it has lint errors.
225
- */
226
- async lint(content, contentPath, options) {
227
- const file = await prettier.getFileInfo(contentPath);
228
- const finalOptions = Object.assign(
229
- {},
230
- { parser: file.inferredParser },
231
- options
232
- );
233
- const formatted = await prettier.check(content, finalOptions);
234
- if (!formatted) {
235
- return Promise.reject(`${contentPath} is not formatted.`);
236
- }
237
- return Promise.resolve(`${contentPath} is properly formatted.`);
238
- }
239
- }
240
- class ZContentLinterYaml {
241
- /**
242
- * Lints yml files.
243
- *
244
- * @param contents -
245
- * Yaml formatted string.
246
- *
247
- * @returns
248
- * A promise that resolves if successful, or rejects if failed.
249
- */
250
- async lint(contents) {
251
- return jsYaml.load(contents);
252
- }
253
- }
254
- class ZLinterEs {
255
- /**
256
- * Initializes a new instance of this object.
257
- *
258
- * @param _logger -
259
- * The logger to output to.
260
- */
261
- constructor(_logger) {
262
- this._logger = _logger;
263
- this.engineFactory = (options) => new eslint.ESLint(options);
264
- }
265
- /**
266
- * Runs the lint given the specified config and source files.
267
- *
268
- * @param src -
269
- * The list of files globs to lint.
270
- * @param config -
271
- * The optional lint config file.
272
- *
273
- * @returns
274
- * A promise that resolves to true if the lint is
275
- * fully successful, and false if the lint
276
- * has errors.
277
- */
278
- async lint(src, config) {
279
- const esOptions = {
280
- errorOnUnmatchedPattern: false
281
- };
282
- if (config) {
283
- esOptions.overrideConfigFile = $resolve(config, {
284
- paths: [process.cwd()]
285
- });
286
- }
287
- try {
288
- const engine = this.engineFactory(esOptions);
289
- const formatter = await engine.loadFormatter();
290
- const report = await engine.lintFiles(src);
291
- const output = formatter.format(report);
292
- this._logger.log(output);
293
- return lodashEs.every(report, (r) => r.errorCount === 0);
294
- } catch (err) {
295
- this._logger.log(err);
296
- return false;
297
- }
298
- }
299
- }
300
- class ZLinterFile {
301
- /**
302
- * Initializes a new instance of this object.
303
- *
304
- * @param _contentLint -
305
- * The linter for an individual file.
306
- * @param _configReader -
307
- * The config reader.
308
- * @param _logger -
309
- * The logger to use.
310
- * @param _type -
311
- * The file type.
312
- */
313
- constructor(_contentLint, _configReader, _logger, _type) {
314
- this._contentLint = _contentLint;
315
- this._configReader = _configReader;
316
- this._logger = _logger;
317
- this._type = _type;
318
- }
319
- /**
320
- * Lints the collection of json files.
321
- *
322
- * @param src -
323
- * The file list of blobs to lint.
324
- * @param config -
325
- * The optional path to the config file.
326
- * @param exclude -
327
- * The list of globs to exclude.
328
- */
329
- async lint(src, config, exclude) {
330
- const readFileAsync = util.promisify(fs.readFile);
331
- let options = {};
332
- const globOptions = {
333
- dot: true,
334
- ignore: exclude
335
- };
336
- let files = [];
337
- src.forEach(
338
- (pattern) => files = files.concat(glob.sync(pattern, globOptions))
339
- );
340
- if (files.length === 0) {
341
- this._logger.log(chalk.yellow.italic("No globs matched any files."));
342
- return true;
343
- }
344
- try {
345
- options = await this._configReader.read(config);
346
- } catch (err) {
347
- this._logger.error(chalk.red(err));
348
- return false;
349
- }
350
- this._logger.log(
351
- chalk.green.italic(
352
- `Checking syntax for ${files.length} ${this._type} files.`
353
- )
354
- );
355
- this._logger.log();
356
- let result = true;
357
- for (const file of files) {
358
- const fullFilePath = path.resolve(file);
359
- try {
360
- const content = await readFileAsync(fullFilePath, "utf-8");
361
- await this._contentLint.lint(content, fullFilePath, options, config);
362
- } catch (err) {
363
- result = false;
364
- this._format(fullFilePath, err);
365
- }
366
- }
367
- return result;
368
- }
369
- /**
370
- * Formats a file error to the logger.
371
- *
372
- * @param file -
373
- * The file that failed to parse.
374
- * @param err -
375
- * The error that occurred.Ø
376
- */
377
- _format(file, err) {
378
- const fileFormat = `Errors in ${file}`;
379
- this._logger.error(chalk.green.underline(fileFormat));
380
- if (Array.isArray(err)) {
381
- err.forEach((log) => this._logger.error(chalk.red(log)));
382
- } else {
383
- this._logger.error(chalk.red(err));
384
- }
385
- }
386
- }
387
- class ZLinterMarkdown {
388
- /**
389
- * Initializes a new instance of this object.
390
- *
391
- * @param _logger -
392
- * The logger to write messages to.
393
- * @param _reader -
394
- * The configuration reader.
395
- */
396
- constructor(_logger, _reader) {
397
- this._logger = _logger;
398
- this._reader = _reader;
399
- }
400
- /**
401
- * Lints all files matched by the specified glob pattern.
402
- *
403
- * @param src -
404
- * The glob patterns to match and lint.
405
- * @param cfg -
406
- * The optional config for the linter.
407
- * @param exclude -
408
- * The glob patterns to exclude.
409
- *
410
- * @returns A promise that resolves to true if the linting is ok, and false if the linting fails.
411
- */
412
- async lint(src, cfg, exclude = []) {
413
- let config;
414
- try {
415
- config = await this._reader.read(cfg);
416
- } catch (err) {
417
- this._logger.error(chalk.red(err));
418
- return false;
419
- }
420
- const globOptions = {
421
- dot: true,
422
- ignore: exclude
423
- };
424
- let files = [];
425
- src.forEach(
426
- (pattern) => files = files.concat(glob.sync(pattern, globOptions))
427
- );
428
- const options = { files, config };
429
- const result = await promise.lint(options);
430
- this._logger.log(`${result.toString().trim()}`);
431
- return !lodashEs.some(lodashEs.values(result), (val) => val.length > 0);
432
- }
433
- }
434
- class ZLinterReport {
435
- /**
436
- * Initializes a new instance of this object.
437
- *
438
- * @param _child -
439
- * The child linter to pass the operation off to.
440
- * @param _logger -
441
- * The logger to use.
442
- * @param _type -
443
- * The file type.
444
- */
445
- constructor(_child, _logger, _type) {
446
- this._child = _child;
447
- this._logger = _logger;
448
- this._type = _type;
449
- }
450
- /**
451
- * Lints the collection of json files.
452
- *
453
- * @param src -
454
- * The file list of blobs to lint.
455
- * @param config -
456
- * The optional path to the config file.
457
- * @param exclude -
458
- * The list of globs to exclude.
459
- */
460
- async lint(src, config, exclude) {
461
- const globOptions = {
462
- dot: true,
463
- ignore: exclude
464
- };
465
- let files = [];
466
- src.forEach(
467
- (pattern) => files = files.concat(glob.sync(pattern, globOptions))
468
- );
469
- files = lodashEs.uniq(files);
470
- if (files.length === 0) {
471
- this._logger.log(chalk.yellow.italic("No globs matched any files."));
472
- return true;
473
- }
474
- this._logger.log(
475
- chalk.green.italic(
476
- `Checking syntax for ${files.length} ${this._type} files.`
477
- )
478
- );
479
- return this._child.lint(src, config, exclude);
480
- }
481
- }
482
- class ZLinterSpelling {
483
- /**
484
- * Initializes a new instance of this object.
485
- *
486
- * @param _logger -
487
- * The logger to output to.
488
- */
489
- constructor(_logger) {
490
- this._logger = _logger;
491
- }
492
- /**
493
- * Runs the lint given the specified config and source files.
494
- *
495
- * @param src -
496
- * The list of files globs to lint.
497
- * @param config -
498
- * The optional lint config file.
499
- * @param exclude -
500
- * The list of file globs to exclude.
501
- *
502
- * @returns
503
- * A promise that resolves to true if the
504
- * lint is fully successful, and false if the lint
505
- * has errors.
506
- */
507
- async lint(src, config, exclude) {
508
- const options = { exclude };
509
- if (config) {
510
- options.config = $resolve(config, { paths: [process.cwd()] });
511
- }
512
- const info = lodashEs.noop;
513
- const debug = lodashEs.noop;
514
- const error = lodashEs.noop;
515
- const progress = lodashEs.noop;
516
- const result = lodashEs.noop;
517
- const issue = (issue2) => {
518
- const position = `${issue2.row}:${issue2.col}`;
519
- this._logger.log(
520
- `${chalk.green(issue2.uri)}:${chalk.yellow(position)} - Unknown word (${chalk.red(issue2.text)})`
521
- );
522
- };
523
- const emitters = {
524
- info,
525
- debug,
526
- error,
527
- progress,
528
- issue,
529
- result
530
- };
531
- const runResult = await cspell.lint(src, options, emitters);
532
- if (runResult.errors > 0 || runResult.issues > 0) {
533
- return false;
534
- }
535
- this._logger.log();
536
- return true;
537
- }
538
- }
539
- class ZLinterStyle {
540
- /**
541
- * Initializes a new instance of this object.
542
- *
543
- * @param _logger -
544
- * The logger to log the output to.
545
- */
546
- constructor(_logger) {
547
- this._logger = _logger;
548
- }
549
- /**
550
- * Runs the file globs through the stylelint application.
551
- *
552
- * @param content -
553
- * The list of globs to lint.
554
- * @param config -
555
- * The linter config file.
556
- * @param exclude
557
- * The globs to exclude.
558
- *
559
- * @returns
560
- * A promise that, when resolved, returns true
561
- * if there are no lint errors, or
562
- * false if errors are present.
563
- */
564
- async lint(content, config, exclude) {
565
- const options = {
566
- files: content,
567
- ignorePattern: exclude
568
- };
569
- if (config) {
570
- options.configFile = $resolve(config, { paths: [process.cwd()] });
571
- }
572
- const result = await stylelint.lint(options);
573
- const verbose = await stylelint.formatters.verbose;
574
- if (result.errored) {
575
- const output = verbose(result.results, result);
576
- this._logger.log(output);
577
- return false;
578
- }
579
- this._logger.log("");
580
- return true;
581
- }
582
- }
583
- class ZJanitorLint {
584
- /**
585
- * Initializes a new instance of this object.
586
- *
587
- * @param _logger -
588
- * The logger to use when formatting output.
589
- */
590
- constructor(_logger) {
591
- this._logger = _logger;
592
- this.esLint = new ZLinterReport(
593
- new ZLinterEs(this._logger),
594
- this._logger,
595
- "es"
596
- );
597
- this.spellLint = new ZLinterReport(
598
- new ZLinterSpelling(this._logger),
599
- this._logger,
600
- "various"
601
- );
602
- this.prettyLint = new ZLinterFile(
603
- new ZContentLinterPretty(),
604
- new ZConfigReaderPrettier(),
605
- this._logger,
606
- "pretty"
607
- );
608
- this.styleLint = new ZLinterReport(
609
- new ZLinterStyle(this._logger),
610
- this._logger,
611
- "style"
612
- );
613
- this.htmlHint = new ZLinterFile(
614
- new ZContentLinterHtml(),
615
- new ZConfigReaderCosmic("htmlhint", new ZConfigExtender()),
616
- this._logger,
617
- "html"
618
- );
619
- this.jsonLint = new ZLinterFile(
620
- new ZContentLinterJson(),
621
- new ZConfigReaderNull(),
622
- this._logger,
623
- "json"
624
- );
625
- this.yamlLint = new ZLinterFile(
626
- new ZContentLinterYaml(),
627
- new ZConfigReaderNull(),
628
- this._logger,
629
- "yaml"
630
- );
631
- this.markdownLint = new ZLinterReport(
632
- new ZLinterMarkdown(
633
- this._logger,
634
- new ZConfigReaderCosmic("markdownlint", new ZConfigExtender(), [
635
- ".markdownlint.json",
636
- ".markdownlint.yaml",
637
- ".markdownlint.cjs"
638
- ])
639
- ),
640
- this._logger,
641
- "markdown"
642
- );
643
- this.config = new ZConfigReaderCosmic("janitor", new ZConfigExtender());
644
- }
645
- /**
646
- * Runs the lint given the required options.
647
- *
648
- * @param options -
649
- * The lint options.
650
- *
651
- * @returns
652
- * A promise that returns 0 if all linting was successful,
653
- * and 1 if any of the linting failed.
654
- */
655
- async lint(options) {
656
- let current = true;
657
- let result = true;
658
- const { lint = {} } = options;
659
- const {
660
- jsonFiles,
661
- jsonFilesExclude,
662
- yamlFiles,
663
- yamlFilesExclude,
664
- markdownConfig,
665
- markdownFiles,
666
- markdownFilesExclude,
667
- esConfig,
668
- esFiles,
669
- styleConfig,
670
- styleFiles,
671
- styleFilesExclude,
672
- htmlConfig,
673
- htmlFiles,
674
- htmlFilesExclude,
675
- spellingConfig,
676
- spellingFiles,
677
- spellingFilesExclude,
678
- prettyConfig,
679
- prettyFiles,
680
- prettyFilesExclude
681
- } = lint;
682
- if (jsonFiles) {
683
- this._logger.log(
684
- chalk.magenta.underline(
685
- `Linting json files from ${jsonFiles.length} globs.`
686
- )
687
- );
688
- current = await this.jsonLint.lint(
689
- jsonFiles,
690
- void 0,
691
- jsonFilesExclude
692
- );
693
- result = result && current;
694
- }
695
- if (yamlFiles) {
696
- this._logger.log(
697
- chalk.magenta.underline(
698
- `Linting yaml files from ${yamlFiles.length} globs.`
699
- )
700
- );
701
- current = await this.yamlLint.lint(
702
- yamlFiles,
703
- void 0,
704
- yamlFilesExclude
705
- );
706
- result = result && current;
707
- }
708
- if (markdownFiles) {
709
- this._logger.log(
710
- chalk.magenta.underline(
711
- `Linting markdown files from ${markdownFiles.length} globs.`
712
- )
713
- );
714
- current = await this.markdownLint.lint(
715
- markdownFiles,
716
- markdownConfig,
717
- markdownFilesExclude
718
- );
719
- result = result && current;
720
- }
721
- if (esFiles) {
722
- this._logger.log(
723
- chalk.magenta.underline(
724
- `Linting ecmaScript files from ${esFiles.length} globs.`
725
- )
726
- );
727
- current = await this.esLint.lint(esFiles, esConfig, void 0);
728
- result = result && current;
729
- }
730
- if (styleFiles) {
731
- this._logger.log(
732
- chalk.magenta.underline(
733
- `Linting style files from ${styleFiles.length} globs.`
734
- )
735
- );
736
- current = await this.styleLint.lint(
737
- styleFiles,
738
- styleConfig,
739
- styleFilesExclude
740
- );
741
- result = result && current;
742
- }
743
- if (htmlFiles) {
744
- this._logger.log(
745
- chalk.magenta.underline(
746
- `Linting html files from ${htmlFiles.length} globs.`
747
- )
748
- );
749
- current = await this.htmlHint.lint(
750
- htmlFiles,
751
- htmlConfig,
752
- htmlFilesExclude
753
- );
754
- result = result && current;
755
- }
756
- if (spellingFiles) {
757
- this._logger.log(
758
- chalk.magenta.underline(
759
- `Checking spelling for ${spellingFiles.length} globs.`
760
- )
761
- );
762
- current = await this.spellLint.lint(
763
- spellingFiles,
764
- spellingConfig,
765
- spellingFilesExclude
766
- );
767
- result = result && current;
768
- }
769
- if (prettyFiles) {
770
- this._logger.log(
771
- chalk.magenta.underline(
772
- `Checking formatting for ${prettyFiles.length} globs.`
773
- )
774
- );
775
- current = await this.prettyLint.lint(
776
- prettyFiles,
777
- prettyConfig,
778
- prettyFilesExclude
779
- );
780
- result = result && current;
781
- }
782
- return result ? 0 : 1;
783
- }
784
- /**
785
- * Runs the application.
786
- *
787
- * @param args -
788
- * The command line arguments.
789
- *
790
- * @returns
791
- * A promise that returns 0 if all linting was
792
- * successful, and 1 if any of the linting failed.
793
- */
794
- async run(args) {
795
- try {
796
- const options = await this.config.read(args.config);
797
- return this.lint(options);
798
- } catch (err) {
799
- this._logger.error(err);
800
- return 1;
801
- }
802
- }
803
- }
804
- exports.ZConfigExtender = ZConfigExtender;
805
- exports.ZConfigReaderCosmic = ZConfigReaderCosmic;
806
- exports.ZConfigReaderNull = ZConfigReaderNull;
807
- exports.ZConfigReaderPrettier = ZConfigReaderPrettier;
808
- exports.ZContentLinterHtml = ZContentLinterHtml;
809
- exports.ZContentLinterJson = ZContentLinterJson;
810
- exports.ZContentLinterPretty = ZContentLinterPretty;
811
- exports.ZContentLinterYaml = ZContentLinterYaml;
812
- exports.ZJanitorLint = ZJanitorLint;
813
- exports.ZLinterEs = ZLinterEs;
814
- exports.ZLinterFile = ZLinterFile;
815
- exports.ZLinterMarkdown = ZLinterMarkdown;
816
- exports.ZLinterReport = ZLinterReport;
817
- exports.ZLinterSpelling = ZLinterSpelling;
818
- exports.ZLinterStyle = ZLinterStyle;
819
- //# sourceMappingURL=janitor-lint-Cq53L9m4.cjs.map