-
Notifications
You must be signed in to change notification settings - Fork 648
/
hint.ts
62 lines (48 loc) 路 2.32 KB
/
hint.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/**
* @fileoverview Check if `.webmanifest` is used as the file extension
* for the web app manifest file.
*/
/*
* ------------------------------------------------------------------------------
* Requirements
* ------------------------------------------------------------------------------
*/
import { normalizeString } from '@hint/utils-string';
import { fileExtension as getFileExtension } from '@hint/utils-fs';
import { ElementFound, IHint } from 'hint/dist/src/lib/types';
import { HintContext } from 'hint/dist/src/lib/hint-context';
import { Severity } from '@hint/utils-types';
import meta from './meta';
import { getMessage } from './i18n.import';
/*
* ------------------------------------------------------------------------------
* Public
* ------------------------------------------------------------------------------
*/
export default class ManifestFileExtensionHint implements IHint {
public static readonly meta = meta;
public constructor(context: HintContext) {
const standardManifestFileExtension: string = 'webmanifest';
const validate = ({ element, resource }: ElementFound) => {
if (normalizeString(element.getAttribute('rel')) === 'manifest') {
const href = element.resolveUrl(element.getAttribute('href') || /* istanbul ignore next */ '');
const fileExtension: string = getFileExtension(normalizeString(href) || /* istanbul ignore next */ '');
if (fileExtension !== standardManifestFileExtension) {
let message: string;
let severity: Severity;
if (fileExtension) {
message = getMessage('shouldHaveFileExtensionNot', context.language, [standardManifestFileExtension, fileExtension]);
severity = fileExtension === 'json' ?
Severity.hint :
Severity.warning;
} else {
message = getMessage('shouldHaveFileExtension', context.language, standardManifestFileExtension);
severity = Severity.warning;
}
context.report(resource, message, { content: fileExtension, element, severity });
}
}
};
context.on('element::link', validate);
}
}