@markuplint/ml-core 2.0.0-rc.0 → 2.0.0-rc.1
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/lib/index.d.ts +1 -0
- package/lib/index.js +3 -1
- package/lib/ml-core.d.ts +1 -1
- package/lib/ml-core.js +16 -14
- package/lib/ml-dom/document.js +32 -23
- package/lib/ml-dom/helper/match-selector.d.ts +12 -1
- package/lib/ml-dom/helper/match-selector.js +103 -85
- package/lib/ml-dom/helper/selector.d.ts +3 -1
- package/lib/ml-dom/helper/selector.js +237 -66
- package/lib/ml-dom/rule-mapper.d.ts +2 -1
- package/lib/ml-dom/rule-mapper.js +15 -9
- package/lib/ml-dom/tokens/abstract-element.d.ts +1 -0
- package/lib/ml-dom/tokens/abstract-element.js +31 -6
- package/lib/ml-dom/tokens/attribute.d.ts +1 -0
- package/lib/ml-dom/tokens/attribute.js +7 -0
- package/lib/ml-dom/tokens/node.d.ts +6 -5
- package/lib/ml-dom/tokens/node.js +20 -9
- package/lib/ml-dom/tokens/preprocessor-specific-attribute.d.ts +1 -0
- package/lib/ml-dom/tokens/preprocessor-specific-attribute.js +3 -0
- package/lib/ml-rule/ml-rule.d.ts +5 -2
- package/lib/ml-rule/ml-rule.js +17 -3
- package/lib/ml-rule/types.d.ts +3 -3
- package/markuplint-recommended.json +144 -11
- package/package.json +7 -7
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -70,23 +70,34 @@ class MLDOMNode extends token_1.default {
|
|
|
70
70
|
get nodeStore() {
|
|
71
71
|
return (0, tslib_1.__classPrivateFieldGet)(this, _MLDOMNode_doc, "f").nodeStore;
|
|
72
72
|
}
|
|
73
|
-
toString() {
|
|
74
|
-
return this.raw;
|
|
75
|
-
}
|
|
76
|
-
is(type) {
|
|
77
|
-
return this.type === type;
|
|
78
|
-
}
|
|
79
73
|
get rule() {
|
|
80
74
|
if (!(0, tslib_1.__classPrivateFieldGet)(this, _MLDOMNode_doc, "f").currentRule) {
|
|
81
75
|
throw new Error('Invalid call.');
|
|
82
76
|
}
|
|
83
77
|
const name = (0, tslib_1.__classPrivateFieldGet)(this, _MLDOMNode_doc, "f").currentRule.name;
|
|
84
78
|
const rule = this.rules[name];
|
|
85
|
-
if (rule == null) {
|
|
86
|
-
throw new Error('Invalid call "rule" property.');
|
|
87
|
-
}
|
|
88
79
|
return (0, tslib_1.__classPrivateFieldGet)(this, _MLDOMNode_doc, "f").currentRule.optimizeOption(rule);
|
|
89
80
|
}
|
|
81
|
+
getParentElement() {
|
|
82
|
+
let parent = this.parentNode;
|
|
83
|
+
if (!parent) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
while (parent) {
|
|
87
|
+
if (parent.type === 'PSBlock') {
|
|
88
|
+
parent = parent.parentNode;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
return parent;
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
is(type) {
|
|
96
|
+
return this.type === type;
|
|
97
|
+
}
|
|
98
|
+
toString() {
|
|
99
|
+
return this.raw;
|
|
100
|
+
}
|
|
90
101
|
}
|
|
91
102
|
exports.default = MLDOMNode;
|
|
92
103
|
_MLDOMNode_doc = new WeakMap(), _MLDOMNode_prevToken = new WeakMap();
|
package/lib/ml-rule/ml-rule.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import type { Ruleset } from '..';
|
|
1
2
|
import type Document from '../ml-dom/document';
|
|
2
3
|
import type { RuleSeed } from './types';
|
|
3
4
|
import type { LocaleSet } from '@markuplint/i18n';
|
|
4
|
-
import type { RuleConfig, RuleConfigValue, RuleInfo, Severity, Violation } from '@markuplint/ml-config';
|
|
5
|
+
import type { GlobalRuleInfo, RuleConfig, RuleConfigValue, RuleInfo, Rules, Severity, Violation } from '@markuplint/ml-config';
|
|
5
6
|
export declare class MLRule<T extends RuleConfigValue, O = null> {
|
|
6
7
|
#private;
|
|
7
8
|
readonly name: string;
|
|
@@ -22,6 +23,8 @@ export declare class MLRule<T extends RuleConfigValue, O = null> {
|
|
|
22
23
|
name: string;
|
|
23
24
|
});
|
|
24
25
|
verify(document: Document<T, O>, locale: LocaleSet, globalRule: RuleInfo<T, O>, fix: boolean): Promise<Violation[]>;
|
|
25
|
-
|
|
26
|
+
getRuleInfo(ruleSet: Ruleset, ruleName: string): GlobalRuleInfo<T, O>;
|
|
27
|
+
_optimize(rules: Rules | undefined, ruleName: string): RuleInfo<T, O>;
|
|
28
|
+
optimizeOption(configSettings: T | RuleConfig<T, O> | undefined): RuleInfo<T, O>;
|
|
26
29
|
}
|
|
27
30
|
export declare type AnyMLRule = MLRule<RuleConfigValue, unknown>;
|
package/lib/ml-rule/ml-rule.js
CHANGED
|
@@ -6,12 +6,13 @@ const tslib_1 = require("tslib");
|
|
|
6
6
|
const ml_rule_context_1 = require("./ml-rule-context");
|
|
7
7
|
class MLRule {
|
|
8
8
|
constructor(o) {
|
|
9
|
+
var _a, _b;
|
|
9
10
|
_MLRule_v.set(this, void 0);
|
|
10
11
|
_MLRule_f.set(this, void 0);
|
|
11
12
|
this.name = o.name;
|
|
12
13
|
this.defaultServerity = o.defaultServerity || 'error';
|
|
13
|
-
this.defaultValue = o.defaultValue;
|
|
14
|
-
this.defaultOptions = o.defaultOptions;
|
|
14
|
+
this.defaultValue = (_a = o.defaultValue) !== null && _a !== void 0 ? _a : true;
|
|
15
|
+
this.defaultOptions = (_b = o.defaultOptions) !== null && _b !== void 0 ? _b : null;
|
|
15
16
|
(0, tslib_1.__classPrivateFieldSet)(this, _MLRule_v, o.verify, "f");
|
|
16
17
|
(0, tslib_1.__classPrivateFieldSet)(this, _MLRule_f, o.fix, "f");
|
|
17
18
|
}
|
|
@@ -79,8 +80,21 @@ class MLRule {
|
|
|
79
80
|
document.setRule(null);
|
|
80
81
|
return violation;
|
|
81
82
|
}
|
|
83
|
+
getRuleInfo(ruleSet, ruleName) {
|
|
84
|
+
const info = this._optimize(ruleSet.rules, ruleName);
|
|
85
|
+
return {
|
|
86
|
+
...info,
|
|
87
|
+
nodeRules: ruleSet.nodeRules.map(r => this._optimize(r.rules, ruleName)).filter(r => !r.disabled),
|
|
88
|
+
childNodeRules: ruleSet.childNodeRules.map(r => this._optimize(r.rules, ruleName)).filter(r => !r.disabled),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
_optimize(rules, ruleName) {
|
|
92
|
+
const rule = (rules && rules[ruleName]) || false;
|
|
93
|
+
const info = this.optimizeOption(rule);
|
|
94
|
+
return info;
|
|
95
|
+
}
|
|
82
96
|
optimizeOption(configSettings) {
|
|
83
|
-
if (typeof configSettings === 'boolean') {
|
|
97
|
+
if (configSettings === undefined || typeof configSettings === 'boolean') {
|
|
84
98
|
return {
|
|
85
99
|
disabled: !configSettings,
|
|
86
100
|
severity: this.defaultServerity,
|
package/lib/ml-rule/types.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { MLRuleContext } from './ml-rule-context';
|
|
2
2
|
import type { RuleConfigValue, Severity } from '@markuplint/ml-config';
|
|
3
|
-
export declare type RuleSeed<T extends RuleConfigValue, O = null> = {
|
|
3
|
+
export declare type RuleSeed<T extends RuleConfigValue = boolean, O = null> = {
|
|
4
4
|
defaultServerity?: Severity;
|
|
5
|
-
defaultValue
|
|
6
|
-
defaultOptions
|
|
5
|
+
defaultValue?: T;
|
|
6
|
+
defaultOptions?: O;
|
|
7
7
|
verify(context: ReturnType<MLRuleContext<T, O>['provide']>): void | Promise<void>;
|
|
8
8
|
fix?(context: ReturnType<MLRuleContext<T, O>['provide']>): void | Promise<void>;
|
|
9
9
|
};
|
|
@@ -1,54 +1,187 @@
|
|
|
1
1
|
{
|
|
2
2
|
"rules": {
|
|
3
3
|
"attr-duplication": true,
|
|
4
|
+
"attr-equal-space-after": false,
|
|
5
|
+
"attr-equal-space-before": false,
|
|
6
|
+
"attr-spacing": false,
|
|
7
|
+
"attr-value-quotes": false,
|
|
8
|
+
"case-sensitive-attr-name": false,
|
|
9
|
+
"case-sensitive-tag-name": false,
|
|
4
10
|
"character-reference": true,
|
|
11
|
+
"class-naming": false,
|
|
5
12
|
"deprecated-attr": true,
|
|
6
13
|
"deprecated-element": true,
|
|
14
|
+
"disallowed-element": ["hgroup"],
|
|
7
15
|
"doctype": true,
|
|
8
16
|
"id-duplication": true,
|
|
17
|
+
"indentation": false,
|
|
18
|
+
"ineffective-attr": true,
|
|
19
|
+
"invalid-attr": {
|
|
20
|
+
"option": {
|
|
21
|
+
"attrs": {
|
|
22
|
+
"autofocus": {
|
|
23
|
+
"disallowed": true
|
|
24
|
+
},
|
|
25
|
+
"accesskey": {
|
|
26
|
+
"disallowed": true
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"landmark-roles": true,
|
|
32
|
+
"no-boolean-attr-value": true,
|
|
33
|
+
"no-default-value": false,
|
|
34
|
+
"no-hard-code-id": false,
|
|
35
|
+
"no-refer-to-non-existent-id": true,
|
|
36
|
+
"no-use-event-handler-attr": false,
|
|
9
37
|
"permitted-contents": true,
|
|
10
38
|
"required-attr": true,
|
|
11
|
-
"
|
|
12
|
-
"landmark-roles": true,
|
|
39
|
+
"required-element": false,
|
|
13
40
|
"required-h1": true,
|
|
14
41
|
"wai-aria": true
|
|
15
42
|
},
|
|
16
43
|
"nodeRules": [
|
|
17
44
|
{
|
|
18
|
-
"selector": "html",
|
|
45
|
+
"selector": ":where(html)",
|
|
19
46
|
"rules": {
|
|
20
47
|
"required-attr": ["lang"]
|
|
21
48
|
}
|
|
22
49
|
},
|
|
23
50
|
{
|
|
24
|
-
"selector": "
|
|
51
|
+
"selector": ":where(head)",
|
|
52
|
+
"rules": {
|
|
53
|
+
"required-element": ["meta[charset=\"UTF-8\" i]"]
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"selector": ":where(meta[property])",
|
|
58
|
+
"rules": {
|
|
59
|
+
"invalid-attr": {
|
|
60
|
+
"option": {
|
|
61
|
+
"attrs": {
|
|
62
|
+
"property": {
|
|
63
|
+
"pattern": "/^og:[a-z_]+/"
|
|
64
|
+
},
|
|
65
|
+
"content": {
|
|
66
|
+
"type": "NoEmptyAny"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"required-attr": false
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"selector": ":where(meta[itemprop])",
|
|
76
|
+
"rules": {
|
|
77
|
+
"invalid-attr": {
|
|
78
|
+
"option": {
|
|
79
|
+
"attrs": {
|
|
80
|
+
"content": {
|
|
81
|
+
"type": "NoEmptyAny"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"selector": ":where(script[src])",
|
|
25
90
|
"rules": {
|
|
26
91
|
"required-attr": ["defer"]
|
|
27
92
|
}
|
|
28
93
|
},
|
|
29
94
|
{
|
|
30
|
-
"selector": "
|
|
95
|
+
"selector": "h1, h2, h3, h4, h5, h6",
|
|
96
|
+
"rules": {
|
|
97
|
+
"disallowed-element": {
|
|
98
|
+
"value": ["small"],
|
|
99
|
+
"reason": "The small element must not be used for subheadings. https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-small-element"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"selector": ":where(img)",
|
|
31
105
|
"rules": {
|
|
32
|
-
"required-attr": [
|
|
106
|
+
"required-attr": [
|
|
107
|
+
"width",
|
|
108
|
+
"height",
|
|
109
|
+
"alt",
|
|
110
|
+
{
|
|
111
|
+
"name": "decoding",
|
|
112
|
+
"value": "async"
|
|
113
|
+
}
|
|
114
|
+
]
|
|
33
115
|
}
|
|
34
116
|
},
|
|
35
117
|
{
|
|
36
|
-
"selector": "iframe",
|
|
118
|
+
"selector": ":where(iframe)",
|
|
37
119
|
"rules": {
|
|
38
|
-
"required-attr": [
|
|
120
|
+
"required-attr": [
|
|
121
|
+
"title",
|
|
122
|
+
{
|
|
123
|
+
"name": "loading",
|
|
124
|
+
"value": "lazy"
|
|
125
|
+
}
|
|
126
|
+
]
|
|
39
127
|
}
|
|
40
128
|
},
|
|
41
129
|
{
|
|
42
|
-
"selector": "a[target=_blank], area[target=_blank]",
|
|
130
|
+
"selector": ":where(a[target=_blank], area[target=_blank])",
|
|
43
131
|
"rules": {
|
|
44
|
-
"required-attr": [
|
|
132
|
+
"required-attr": [
|
|
133
|
+
{
|
|
134
|
+
"name": "rel",
|
|
135
|
+
"value": "noreferrer"
|
|
136
|
+
}
|
|
137
|
+
]
|
|
45
138
|
}
|
|
46
139
|
},
|
|
47
140
|
{
|
|
48
|
-
"selector": "abbr",
|
|
141
|
+
"selector": ":where(abbr)",
|
|
49
142
|
"rules": {
|
|
50
143
|
"required-attr": ["title"]
|
|
51
144
|
}
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"selector": ":where(video, audio)",
|
|
148
|
+
"rules": {
|
|
149
|
+
"required-element": ["track"]
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"selector": ":where(video[autoplay])",
|
|
154
|
+
"rules": {
|
|
155
|
+
"required-attr": ["muted"]
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"selector": ":where(th, td)",
|
|
160
|
+
"rules": {
|
|
161
|
+
"invalid-attr": {
|
|
162
|
+
"option": {
|
|
163
|
+
"attrs": {
|
|
164
|
+
"span": {
|
|
165
|
+
"disallowed": false
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"selector": ":where(body :not(button))",
|
|
174
|
+
"rules": {
|
|
175
|
+
"invalid-attr": {
|
|
176
|
+
"option": {
|
|
177
|
+
"attrs": {
|
|
178
|
+
"onclick": {
|
|
179
|
+
"disallowed": false
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
52
185
|
}
|
|
53
186
|
]
|
|
54
187
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@markuplint/ml-core",
|
|
3
|
-
"version": "2.0.0-rc.
|
|
3
|
+
"version": "2.0.0-rc.1",
|
|
4
4
|
"description": "The core module of markuplint",
|
|
5
5
|
"repository": "git@github.com:markuplint/markuplint.git",
|
|
6
6
|
"author": "Yusuke Hirao <yusukehirao@me.com>",
|
|
@@ -17,17 +17,17 @@
|
|
|
17
17
|
"clean": "tsc --build --clean"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@markuplint/i18n": "2.0.0-rc.
|
|
21
|
-
"@markuplint/ml-ast": "2.0.0-rc.
|
|
22
|
-
"@markuplint/ml-config": "2.0.0-rc.
|
|
23
|
-
"@markuplint/ml-spec": "2.0.0-rc.
|
|
20
|
+
"@markuplint/i18n": "2.0.0-rc.1",
|
|
21
|
+
"@markuplint/ml-ast": "2.0.0-rc.1",
|
|
22
|
+
"@markuplint/ml-config": "2.0.0-rc.1",
|
|
23
|
+
"@markuplint/ml-spec": "2.0.0-rc.1",
|
|
24
24
|
"debug": "^4.3.2",
|
|
25
25
|
"postcss-selector-parser": "^6.0.6",
|
|
26
26
|
"tslib": "^2.3.1"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@markuplint/html-parser": "2.0.0-rc.
|
|
29
|
+
"@markuplint/html-parser": "2.0.0-rc.1",
|
|
30
30
|
"@types/debug": "^4.1.7"
|
|
31
31
|
},
|
|
32
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "34dbaf8bc5ee499315a32857c59b9c6f6bb73594"
|
|
33
33
|
}
|