@markuplint/ml-core 4.13.2 → 5.0.0-alpha.0
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/ARCHITECTURE.ja.md +524 -0
- package/ARCHITECTURE.md +524 -0
- package/CHANGELOG.md +52 -2
- package/README.md +5 -0
- package/SKILL.md +61 -0
- package/docs/linting-pipeline.ja.md +307 -0
- package/docs/linting-pipeline.md +307 -0
- package/docs/maintenance.ja.md +210 -0
- package/docs/maintenance.md +210 -0
- package/docs/ml-dom/attr.ja.md +103 -0
- package/docs/ml-dom/attr.md +103 -0
- package/docs/ml-dom/block.ja.md +272 -0
- package/docs/ml-dom/block.md +272 -0
- package/docs/ml-dom/document.ja.md +141 -0
- package/docs/ml-dom/document.md +141 -0
- package/docs/ml-dom/element.ja.md +176 -0
- package/docs/ml-dom/element.md +176 -0
- package/docs/ml-dom/helpers.ja.md +203 -0
- package/docs/ml-dom/helpers.md +203 -0
- package/docs/ml-dom/node.ja.md +199 -0
- package/docs/ml-dom/node.md +199 -0
- package/docs/ml-dom/others.ja.md +120 -0
- package/docs/ml-dom/others.md +120 -0
- package/docs/ml-dom/overview.ja.md +102 -0
- package/docs/ml-dom/overview.md +102 -0
- package/docs/ml-dom/pretender.ja.md +269 -0
- package/docs/ml-dom/pretender.md +269 -0
- package/docs/ml-dom/rule-mapping.ja.md +371 -0
- package/docs/ml-dom/rule-mapping.md +371 -0
- package/docs/ml-dom.ja.md +18 -0
- package/docs/ml-dom.md +18 -0
- package/docs/rule-system.ja.md +287 -0
- package/docs/rule-system.md +287 -0
- package/lib/convert-ruleset.d.ts +7 -0
- package/lib/convert-ruleset.js +7 -0
- package/lib/debug.d.ts +4 -0
- package/lib/debug.js +4 -0
- package/lib/index.d.ts +4 -3
- package/lib/index.js +1 -1
- package/lib/ml-core.d.ts +37 -1
- package/lib/ml-core.js +171 -82
- package/lib/ml-dom/helper/accname.d.ts +8 -0
- package/lib/ml-dom/helper/accname.js +71 -55
- package/lib/ml-dom/helper/create-node.js +1 -0
- package/lib/ml-dom/helper/get-indent.d.ts +4 -1
- package/lib/ml-dom/helper/get-indent.js +21 -30
- package/lib/ml-dom/node/attr.d.ts +65 -4
- package/lib/ml-dom/node/attr.js +151 -53
- package/lib/ml-dom/node/block.d.ts +23 -2
- package/lib/ml-dom/node/block.js +24 -1
- package/lib/ml-dom/node/child-node.d.ts +9 -0
- package/lib/ml-dom/node/child-node.js +9 -0
- package/lib/ml-dom/node/comment.d.ts +7 -0
- package/lib/ml-dom/node/comment.js +7 -0
- package/lib/ml-dom/node/document-fragment.d.ts +8 -0
- package/lib/ml-dom/node/document-fragment.js +8 -0
- package/lib/ml-dom/node/document-type.d.ts +22 -0
- package/lib/ml-dom/node/document-type.js +25 -0
- package/lib/ml-dom/node/document.d.ts +88 -7
- package/lib/ml-dom/node/document.js +128 -32
- package/lib/ml-dom/node/dom-token-list.js +17 -30
- package/lib/ml-dom/node/element-close-tag.js +1 -0
- package/lib/ml-dom/node/element.d.ts +151 -5
- package/lib/ml-dom/node/element.js +242 -50
- package/lib/ml-dom/node/node-store.js +6 -15
- package/lib/ml-dom/node/node.d.ts +19 -1
- package/lib/ml-dom/node/node.js +175 -166
- package/lib/ml-dom/node/parent-node.js +14 -30
- package/lib/ml-dom/node/rule-mapper.js +7 -20
- package/lib/ml-dom/node/text.d.ts +19 -0
- package/lib/ml-dom/node/text.js +21 -0
- package/lib/ml-dom/node/types.d.ts +68 -0
- package/lib/ml-dom/token/token.d.ts +42 -0
- package/lib/ml-dom/token/token.js +59 -39
- package/lib/ml-rule/create-rule.d.ts +17 -1
- package/lib/ml-rule/ml-rule-context.js +7 -11
- package/lib/ml-rule/ml-rule.d.ts +66 -1
- package/lib/ml-rule/ml-rule.js +95 -25
- package/lib/ml-rule/types.d.ts +41 -0
- package/lib/plugin/plugin.d.ts +8 -0
- package/lib/plugin/plugin.js +8 -0
- package/lib/plugin/types.d.ts +21 -0
- package/lib/ruleset/index.d.ts +10 -0
- package/lib/ruleset/index.js +13 -0
- package/lib/test/index.d.ts +42 -1
- package/lib/test/index.js +39 -2
- package/lib/types.d.ts +10 -1
- package/lib/violation-collector.d.ts +33 -0
- package/lib/violation-collector.js +48 -28
- package/lib/virtual-rule.d.ts +72 -0
- package/lib/virtual-rule.js +233 -0
- package/package.json +16 -13
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { AnyMLRule } from './ml-rule/index.js';
|
|
2
|
+
import type { Rules, SpecConformance } from '@markuplint/ml-config';
|
|
3
|
+
/**
|
|
4
|
+
* Common shape of a nodeRule/childNodeRule entry that supports naming.
|
|
5
|
+
*/
|
|
6
|
+
type NameableNodeRule = {
|
|
7
|
+
readonly name?: string;
|
|
8
|
+
readonly specConformance?: SpecConformance;
|
|
9
|
+
readonly rules?: {
|
|
10
|
+
readonly [ruleName: string]: unknown;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Result of expanding named nodeRules into virtual rules.
|
|
15
|
+
*/
|
|
16
|
+
export type ExpandResult<T> = {
|
|
17
|
+
/** Virtual MLRule instances created from named nodeRules */
|
|
18
|
+
readonly virtualRules: readonly AnyMLRule[];
|
|
19
|
+
/** NodeRules array with named entries transformed (rules key changed to alias name) */
|
|
20
|
+
readonly transformedNodeRules: readonly T[];
|
|
21
|
+
/** Validation errors encountered during expansion */
|
|
22
|
+
readonly errors: readonly Error[];
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Expands named nodeRules (or childNodeRules) into virtual MLRule instances.
|
|
26
|
+
*
|
|
27
|
+
* Named entries (those with a `name` property containing `/`) are converted into
|
|
28
|
+
* independent virtual rules that reuse the base rule's verify/fix logic but run
|
|
29
|
+
* under their own alias name. This enables per-check control:
|
|
30
|
+
* - Each virtual rule can be independently enabled/disabled via `rules["alias/name"]: false`
|
|
31
|
+
* - Violations report both the base `ruleId` and the alias `name`
|
|
32
|
+
*
|
|
33
|
+
* **false entry separation**: When a named nodeRule has `rules` entries set to `false`,
|
|
34
|
+
* those entries are separated into unnamed nodeRules. This preserves their semantics
|
|
35
|
+
* as base-rule specificity overrides (disabling the base rule on matching nodes)
|
|
36
|
+
* rather than creating virtual rules that would only disable themselves.
|
|
37
|
+
*
|
|
38
|
+
* **Multi-entry support**: When a named nodeRule has 2+ non-false entries, each
|
|
39
|
+
* entry gets its own virtual rule with a derived name (`name/baseRuleName`).
|
|
40
|
+
* A `groupName` is set so the entire group can be disabled via `rules["groupName"]: false`.
|
|
41
|
+
*
|
|
42
|
+
* Unnamed nodeRules pass through unchanged.
|
|
43
|
+
*
|
|
44
|
+
* @param nodeRules - The nodeRules (or childNodeRules) array from the config
|
|
45
|
+
* @param existingRules - All registered MLRule instances (for base rule lookup)
|
|
46
|
+
* @returns Virtual rules, transformed nodeRules, and any validation errors
|
|
47
|
+
*/
|
|
48
|
+
export declare function expandNamedNodeRules<T extends NameableNodeRule>(nodeRules: readonly T[], existingRules: readonly Readonly<AnyMLRule>[]): ExpandResult<T>;
|
|
49
|
+
/**
|
|
50
|
+
* Result of expanding named rule groups in the `rules` section.
|
|
51
|
+
*/
|
|
52
|
+
export type ExpandNamedRulesResult = {
|
|
53
|
+
/** Virtual MLRule instances created from named rule groups */
|
|
54
|
+
readonly virtualRules: readonly AnyMLRule[];
|
|
55
|
+
/** Rules dict with named groups expanded into their virtual rule entries */
|
|
56
|
+
readonly resolvedRules: Rules;
|
|
57
|
+
/** Validation errors encountered during expansion */
|
|
58
|
+
readonly errors: readonly Error[];
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Expands named rule groups in the `rules` section into virtual MLRule instances.
|
|
62
|
+
*
|
|
63
|
+
* Named rule groups (keys containing `/` whose values are {@link NamedRuleGroup} objects)
|
|
64
|
+
* are converted into independent virtual rules, similar to how `expandNamedNodeRules`
|
|
65
|
+
* handles named nodeRules. This enables per-check control at the global rules level.
|
|
66
|
+
*
|
|
67
|
+
* @param rules - The rules dict from the config
|
|
68
|
+
* @param existingRules - All registered MLRule instances (for base rule lookup)
|
|
69
|
+
* @returns Virtual rules, resolved rules dict, and any validation errors
|
|
70
|
+
*/
|
|
71
|
+
export declare function expandNamedRules(rules: Rules, existingRules: readonly Readonly<AnyMLRule>[]): ExpandNamedRulesResult;
|
|
72
|
+
export {};
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { isNamedRuleGroup } from '@markuplint/ml-config';
|
|
2
|
+
const NAMED_NODE_RULE_PATTERN = /^[^/]+\/.+$/;
|
|
3
|
+
/**
|
|
4
|
+
* Expands named nodeRules (or childNodeRules) into virtual MLRule instances.
|
|
5
|
+
*
|
|
6
|
+
* Named entries (those with a `name` property containing `/`) are converted into
|
|
7
|
+
* independent virtual rules that reuse the base rule's verify/fix logic but run
|
|
8
|
+
* under their own alias name. This enables per-check control:
|
|
9
|
+
* - Each virtual rule can be independently enabled/disabled via `rules["alias/name"]: false`
|
|
10
|
+
* - Violations report both the base `ruleId` and the alias `name`
|
|
11
|
+
*
|
|
12
|
+
* **false entry separation**: When a named nodeRule has `rules` entries set to `false`,
|
|
13
|
+
* those entries are separated into unnamed nodeRules. This preserves their semantics
|
|
14
|
+
* as base-rule specificity overrides (disabling the base rule on matching nodes)
|
|
15
|
+
* rather than creating virtual rules that would only disable themselves.
|
|
16
|
+
*
|
|
17
|
+
* **Multi-entry support**: When a named nodeRule has 2+ non-false entries, each
|
|
18
|
+
* entry gets its own virtual rule with a derived name (`name/baseRuleName`).
|
|
19
|
+
* A `groupName` is set so the entire group can be disabled via `rules["groupName"]: false`.
|
|
20
|
+
*
|
|
21
|
+
* Unnamed nodeRules pass through unchanged.
|
|
22
|
+
*
|
|
23
|
+
* @param nodeRules - The nodeRules (or childNodeRules) array from the config
|
|
24
|
+
* @param existingRules - All registered MLRule instances (for base rule lookup)
|
|
25
|
+
* @returns Virtual rules, transformed nodeRules, and any validation errors
|
|
26
|
+
*/
|
|
27
|
+
export function expandNamedNodeRules(nodeRules, existingRules) {
|
|
28
|
+
const virtualRules = [];
|
|
29
|
+
const transformedNodeRules = [];
|
|
30
|
+
const errors = [];
|
|
31
|
+
const existingRuleMap = new Map(existingRules.map(r => [r.name, r]));
|
|
32
|
+
const usedAliasNames = new Set();
|
|
33
|
+
for (const nodeRule of nodeRules) {
|
|
34
|
+
if (!nodeRule.name) {
|
|
35
|
+
// Unnamed nodeRule: pass through unchanged
|
|
36
|
+
transformedNodeRules.push(nodeRule);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const namedRuleName = nodeRule.name;
|
|
40
|
+
// Validate name format (must contain /)
|
|
41
|
+
if (!NAMED_NODE_RULE_PATTERN.test(namedRuleName)) {
|
|
42
|
+
errors.push(new Error(`Named nodeRule name must contain "/" (e.g., "scope/rule-name"): "${namedRuleName}"`));
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// Separate false entries from non-false entries
|
|
46
|
+
const allEntries = Object.entries(nodeRule.rules ?? {});
|
|
47
|
+
const nonFalseEntries = allEntries.filter(([, config]) => config !== false);
|
|
48
|
+
const falseEntries = allEntries.filter(([, config]) => config === false);
|
|
49
|
+
if (nonFalseEntries.length === 0) {
|
|
50
|
+
errors.push(new Error(`Named nodeRule "${namedRuleName}" must have at least one non-false rule entry`));
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Check for duplicate alias names
|
|
54
|
+
if (usedAliasNames.has(namedRuleName)) {
|
|
55
|
+
errors.push(new Error(`Duplicate named nodeRule: "${namedRuleName}"`));
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
usedAliasNames.add(namedRuleName);
|
|
59
|
+
// Check for name collision with existing rules
|
|
60
|
+
if (existingRuleMap.has(namedRuleName)) {
|
|
61
|
+
errors.push(new Error(`Named nodeRule "${namedRuleName}" conflicts with an existing rule of the same name`));
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
// Emit false entries as unnamed nodeRules (base-rule specificity overrides)
|
|
65
|
+
if (falseEntries.length > 0) {
|
|
66
|
+
const falseRules = {};
|
|
67
|
+
for (const [key] of falseEntries) {
|
|
68
|
+
falseRules[key] = false;
|
|
69
|
+
}
|
|
70
|
+
// Safety: stripNamedProperties copies all properties except name/specConformance/rules,
|
|
71
|
+
// then adds replacement rules. T's extra properties (e.g., ChildNodeRule.inheritance) are preserved.
|
|
72
|
+
transformedNodeRules.push(stripNamedProperties(nodeRule, falseRules));
|
|
73
|
+
}
|
|
74
|
+
// Determine whether we need derived names (multi-entry)
|
|
75
|
+
const useGroupName = nonFalseEntries.length > 1;
|
|
76
|
+
const groupName = useGroupName ? namedRuleName : undefined;
|
|
77
|
+
for (const [baseRuleName, ruleConfig] of nonFalseEntries) {
|
|
78
|
+
const baseRule = existingRuleMap.get(baseRuleName);
|
|
79
|
+
if (!baseRule) {
|
|
80
|
+
errors.push(new Error(`Base rule "${baseRuleName}" not found for named nodeRule "${namedRuleName}"`));
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
// For multi-entry: derived name = "groupName/baseRuleName"
|
|
84
|
+
// For single-entry: use the name directly
|
|
85
|
+
const aliasName = useGroupName ? `${namedRuleName}/${baseRuleName}` : namedRuleName;
|
|
86
|
+
// Check derived name collision
|
|
87
|
+
if (existingRuleMap.has(aliasName)) {
|
|
88
|
+
errors.push(new Error(`Named nodeRule "${aliasName}" conflicts with an existing rule of the same name`));
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (usedAliasNames.has(aliasName) && aliasName !== namedRuleName) {
|
|
92
|
+
errors.push(new Error(`Duplicate named nodeRule: "${aliasName}"`));
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (aliasName !== namedRuleName) {
|
|
96
|
+
usedAliasNames.add(aliasName);
|
|
97
|
+
}
|
|
98
|
+
// Create virtual rule by aliasing the base rule
|
|
99
|
+
const virtualRule = baseRule.createAlias(aliasName, {
|
|
100
|
+
specConformance: nodeRule.specConformance,
|
|
101
|
+
groupName,
|
|
102
|
+
});
|
|
103
|
+
virtualRules.push(virtualRule);
|
|
104
|
+
// Transform the nodeRule: change the rules key from base rule name to alias name,
|
|
105
|
+
// and strip the name/specConformance properties (consumed by the virtual rule)
|
|
106
|
+
// Safety: same as above — T's structural properties are preserved by stripNamedProperties.
|
|
107
|
+
transformedNodeRules.push(stripNamedProperties(nodeRule, { [aliasName]: ruleConfig }));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return { virtualRules, transformedNodeRules, errors };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Creates a copy of the nodeRule with `name`, `specConformance`, and `rules` removed,
|
|
114
|
+
* then adds the given replacement rules. Used to transform named nodeRules into
|
|
115
|
+
* their expanded form.
|
|
116
|
+
*/
|
|
117
|
+
function stripNamedProperties(nodeRule, replacementRules) {
|
|
118
|
+
const result = {};
|
|
119
|
+
for (const [key, value] of Object.entries(nodeRule)) {
|
|
120
|
+
if (key !== 'name' && key !== 'specConformance' && key !== 'rules') {
|
|
121
|
+
result[key] = value;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
result['rules'] = replacementRules;
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Expands named rule groups in the `rules` section into virtual MLRule instances.
|
|
129
|
+
*
|
|
130
|
+
* Named rule groups (keys containing `/` whose values are {@link NamedRuleGroup} objects)
|
|
131
|
+
* are converted into independent virtual rules, similar to how `expandNamedNodeRules`
|
|
132
|
+
* handles named nodeRules. This enables per-check control at the global rules level.
|
|
133
|
+
*
|
|
134
|
+
* @param rules - The rules dict from the config
|
|
135
|
+
* @param existingRules - All registered MLRule instances (for base rule lookup)
|
|
136
|
+
* @returns Virtual rules, resolved rules dict, and any validation errors
|
|
137
|
+
*/
|
|
138
|
+
export function expandNamedRules(rules, existingRules) {
|
|
139
|
+
const virtualRules = [];
|
|
140
|
+
const resolvedRules = {};
|
|
141
|
+
const errors = [];
|
|
142
|
+
const existingRuleMap = new Map(existingRules.map(r => [r.name, r]));
|
|
143
|
+
const usedAliasNames = new Set();
|
|
144
|
+
for (const [key, value] of Object.entries(rules)) {
|
|
145
|
+
// Non-namespaced keys: pass through as regular rules
|
|
146
|
+
if (!key.includes('/')) {
|
|
147
|
+
resolvedRules[key] = value;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
// Wildcard patterns (e.g., "a11y/*"): pass through
|
|
151
|
+
if (key.endsWith('/*')) {
|
|
152
|
+
resolvedRules[key] = value;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
// `false`: disable signal — pass through
|
|
156
|
+
if (value === false) {
|
|
157
|
+
resolvedRules[key] = false;
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
// NamedRuleGroup: expand into virtual rules
|
|
161
|
+
if (isNamedRuleGroup(value)) {
|
|
162
|
+
const groupKey = key;
|
|
163
|
+
const { specConformance, severity: groupSeverity } = value;
|
|
164
|
+
const groupRules = value.rules;
|
|
165
|
+
const entries = Object.entries(groupRules);
|
|
166
|
+
const nonFalseEntries = entries.filter(([, v]) => v !== false);
|
|
167
|
+
if (nonFalseEntries.length === 0) {
|
|
168
|
+
errors.push(new Error(`Named rule group "${groupKey}" must have at least one non-false rule entry`));
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
// Check for duplicate
|
|
172
|
+
if (usedAliasNames.has(groupKey)) {
|
|
173
|
+
errors.push(new Error(`Duplicate named rule group: "${groupKey}"`));
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
usedAliasNames.add(groupKey);
|
|
177
|
+
// Check for name collision with existing rules
|
|
178
|
+
if (existingRuleMap.has(groupKey)) {
|
|
179
|
+
errors.push(new Error(`Named rule group "${groupKey}" conflicts with an existing rule of the same name`));
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
const useGroupName = nonFalseEntries.length > 1;
|
|
183
|
+
const gName = useGroupName ? groupKey : undefined;
|
|
184
|
+
// Determine the defaultSeverity for virtual rules:
|
|
185
|
+
// 1. Group-level severity override (from user config merge)
|
|
186
|
+
// 2. undefined (use base rule's default)
|
|
187
|
+
const effectiveDefaultSeverity = groupSeverity;
|
|
188
|
+
for (const [baseRuleName, ruleConfig] of nonFalseEntries) {
|
|
189
|
+
const baseRule = existingRuleMap.get(baseRuleName);
|
|
190
|
+
if (!baseRule) {
|
|
191
|
+
errors.push(new Error(`Base rule "${baseRuleName}" not found for named rule group "${groupKey}"`));
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const aliasName = useGroupName ? `${groupKey}/${baseRuleName}` : groupKey;
|
|
195
|
+
// Check collisions
|
|
196
|
+
if (existingRuleMap.has(aliasName)) {
|
|
197
|
+
errors.push(new Error(`Named rule group "${aliasName}" conflicts with an existing rule of the same name`));
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (usedAliasNames.has(aliasName) && aliasName !== groupKey) {
|
|
201
|
+
errors.push(new Error(`Duplicate named rule: "${aliasName}"`));
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
if (aliasName !== groupKey) {
|
|
205
|
+
usedAliasNames.add(aliasName);
|
|
206
|
+
}
|
|
207
|
+
// Create virtual rule
|
|
208
|
+
const virtualRule = baseRule.createAlias(aliasName, {
|
|
209
|
+
specConformance,
|
|
210
|
+
groupName: gName,
|
|
211
|
+
defaultSeverity: effectiveDefaultSeverity,
|
|
212
|
+
});
|
|
213
|
+
virtualRules.push(virtualRule);
|
|
214
|
+
// Add the rule config under the alias name
|
|
215
|
+
resolvedRules[aliasName] = ruleConfig;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
// Not a NamedRuleGroup — treat as regular rule (e.g., user config for a virtual rule)
|
|
220
|
+
resolvedRules[key] = value;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// Backwards compatibility: if a base rule is set to false in the rules dict,
|
|
224
|
+
// also disable any virtual rules from named rule groups that wrap it.
|
|
225
|
+
// This ensures `"id-duplication": false` still works when the preset wraps
|
|
226
|
+
// the rule in a named rule group like `"a11y/id-duplication"`.
|
|
227
|
+
for (const vRule of virtualRules) {
|
|
228
|
+
if (vRule.baseRuleId && resolvedRules[vRule.baseRuleId] === false) {
|
|
229
|
+
resolvedRules[vRule.name] = false;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return { virtualRules, resolvedRules: resolvedRules, errors };
|
|
233
|
+
}
|
package/package.json
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@markuplint/ml-core",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0-alpha.0",
|
|
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>",
|
|
7
7
|
"license": "MIT",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=22"
|
|
10
|
+
},
|
|
8
11
|
"type": "module",
|
|
9
12
|
"exports": {
|
|
10
13
|
".": {
|
|
@@ -27,20 +30,20 @@
|
|
|
27
30
|
"./lib/configs.js": "./lib/configs.browser.js"
|
|
28
31
|
},
|
|
29
32
|
"dependencies": {
|
|
30
|
-
"@markuplint/config-presets": "
|
|
31
|
-
"@markuplint/html-parser": "
|
|
32
|
-
"@markuplint/html-spec": "
|
|
33
|
-
"@markuplint/i18n": "
|
|
34
|
-
"@markuplint/ml-ast": "
|
|
35
|
-
"@markuplint/ml-config": "
|
|
36
|
-
"@markuplint/ml-spec": "
|
|
37
|
-
"@markuplint/parser-utils": "
|
|
38
|
-
"@markuplint/selector": "
|
|
39
|
-
"@markuplint/shared": "
|
|
33
|
+
"@markuplint/config-presets": "5.0.0-alpha.0",
|
|
34
|
+
"@markuplint/html-parser": "5.0.0-alpha.0",
|
|
35
|
+
"@markuplint/html-spec": "5.0.0-alpha.0",
|
|
36
|
+
"@markuplint/i18n": "5.0.0-alpha.0",
|
|
37
|
+
"@markuplint/ml-ast": "5.0.0-alpha.0",
|
|
38
|
+
"@markuplint/ml-config": "5.0.0-alpha.0",
|
|
39
|
+
"@markuplint/ml-spec": "5.0.0-alpha.0",
|
|
40
|
+
"@markuplint/parser-utils": "5.0.0-alpha.0",
|
|
41
|
+
"@markuplint/selector": "5.0.0-alpha.0",
|
|
42
|
+
"@markuplint/shared": "5.0.0-alpha.0",
|
|
40
43
|
"@types/debug": "4.1.12",
|
|
41
44
|
"debug": "4.4.3",
|
|
42
45
|
"is-plain-object": "5.0.0",
|
|
43
|
-
"type-fest": "4.
|
|
46
|
+
"type-fest": "5.4.4"
|
|
44
47
|
},
|
|
45
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "13dcfc84ec83d87360c720e253383b60767e1b56"
|
|
46
49
|
}
|