@markuplint/ml-core 2.2.3 → 2.3.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.
Files changed (59) hide show
  1. package/lib/ml-core.d.ts +1 -1
  2. package/lib/ml-dom/helper/accname.js +1 -0
  3. package/lib/ml-dom/helper/selector.d.ts +1 -1
  4. package/lib/ml-dom/manipulations/child-node-methods.d.ts +33 -0
  5. package/lib/ml-dom/manipulations/child-node-methods.js +73 -0
  6. package/lib/ml-dom/manipulations/get-children.d.ts +4 -0
  7. package/lib/ml-dom/manipulations/get-children.js +10 -0
  8. package/lib/ml-dom/node/attr.d.ts +93 -0
  9. package/lib/ml-dom/node/attr.js +144 -0
  10. package/lib/ml-dom/node/block.d.ts +38 -0
  11. package/lib/ml-dom/node/block.js +53 -0
  12. package/lib/ml-dom/node/character-data.d.ts +57 -0
  13. package/lib/ml-dom/node/character-data.js +87 -0
  14. package/lib/ml-dom/node/child-node.d.ts +9 -0
  15. package/lib/ml-dom/node/child-node.js +10 -0
  16. package/lib/ml-dom/node/comment.d.ts +17 -0
  17. package/lib/ml-dom/node/comment.js +24 -0
  18. package/lib/ml-dom/node/document-fragment.d.ts +24 -0
  19. package/lib/ml-dom/node/document-fragment.js +33 -0
  20. package/lib/ml-dom/node/document-type.d.ts +38 -0
  21. package/lib/ml-dom/node/document-type.js +52 -0
  22. package/lib/ml-dom/node/document.d.ts +1554 -0
  23. package/lib/ml-dom/node/document.js +2117 -0
  24. package/lib/ml-dom/node/dom-token-list.d.ts +15 -0
  25. package/lib/ml-dom/node/dom-token-list.js +61 -0
  26. package/lib/ml-dom/node/element.d.ts +1832 -0
  27. package/lib/ml-dom/node/element.js +2483 -0
  28. package/lib/ml-dom/node/named-node-map.d.ts +42 -0
  29. package/lib/ml-dom/node/named-node-map.js +64 -0
  30. package/lib/ml-dom/node/node-list.d.ts +6 -0
  31. package/lib/ml-dom/node/node-list.js +39 -0
  32. package/lib/ml-dom/node/node-store.d.ts +14 -0
  33. package/lib/ml-dom/node/node-store.js +32 -0
  34. package/lib/ml-dom/node/node.d.ts +475 -0
  35. package/lib/ml-dom/node/node.js +672 -0
  36. package/lib/ml-dom/node/parent-node.d.ts +66 -0
  37. package/lib/ml-dom/node/parent-node.js +131 -0
  38. package/lib/ml-dom/node/rule-mapper.d.ts +17 -0
  39. package/lib/ml-dom/node/rule-mapper.js +49 -0
  40. package/lib/ml-dom/node/text.d.ts +51 -0
  41. package/lib/ml-dom/node/text.js +76 -0
  42. package/lib/ml-dom/node/types.d.ts +25 -0
  43. package/lib/ml-dom/node/types.js +2 -0
  44. package/lib/ml-dom/node/unexpected-call-error.d.ts +2 -0
  45. package/lib/ml-dom/node/unexpected-call-error.js +5 -0
  46. package/lib/ml-dom/token/token.d.ts +47 -0
  47. package/lib/ml-dom/token/token.js +89 -0
  48. package/lib/ml-dom/tokens/abstract-element.d.ts +1 -2
  49. package/lib/ml-dom/tokens/abstract-element.js +0 -4
  50. package/lib/ml-dom/tokens/node.d.ts +1 -0
  51. package/lib/ml-dom/tokens/node.js +8 -0
  52. package/lib/selector/is-pure-html-element.d.ts +1 -0
  53. package/lib/selector/is-pure-html-element.js +7 -0
  54. package/lib/selector/match-selector.d.ts +14 -0
  55. package/lib/selector/match-selector.js +230 -0
  56. package/lib/selector/selector.d.ts +9 -0
  57. package/lib/selector/selector.js +561 -0
  58. package/package.json +5 -5
  59. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,561 @@
1
+ "use strict";
2
+ var _Selector_ruleset, _Ruleset_selectorGroup, _StructuredSelector_edge, _StructuredSelector_selector, _SelectorTarget_combinatedFrom, _SelectorTarget_isAdded;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.compareSpecificity = exports.createSelector = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const postcss_selector_parser_1 = tslib_1.__importDefault(require("postcss-selector-parser"));
7
+ const debug_1 = require("../debug");
8
+ const is_pure_html_element_1 = require("./is-pure-html-element");
9
+ const log = debug_1.log.extend('selector');
10
+ const resLog = log.extend('result');
11
+ const caches = new Map();
12
+ function createSelector(selector) {
13
+ let instance = caches.get(selector);
14
+ if (instance) {
15
+ return instance;
16
+ }
17
+ instance = new Selector(selector);
18
+ caches.set(selector, instance);
19
+ return instance;
20
+ }
21
+ exports.createSelector = createSelector;
22
+ function compareSpecificity(a, b) {
23
+ if (a[0] < b[0]) {
24
+ return -1;
25
+ }
26
+ else if (a[0] > b[0]) {
27
+ return 1;
28
+ }
29
+ else if (a[1] < b[1]) {
30
+ return -1;
31
+ }
32
+ else if (a[1] > b[1]) {
33
+ return 1;
34
+ }
35
+ else if (a[2] < b[2]) {
36
+ return -1;
37
+ }
38
+ else if (a[2] > b[2]) {
39
+ return 1;
40
+ }
41
+ return 0;
42
+ }
43
+ exports.compareSpecificity = compareSpecificity;
44
+ class Selector {
45
+ constructor(selector) {
46
+ _Selector_ruleset.set(this, void 0);
47
+ tslib_1.__classPrivateFieldSet(this, _Selector_ruleset, Ruleset.parse(selector), "f");
48
+ }
49
+ match(el, caller = el) {
50
+ const results = tslib_1.__classPrivateFieldGet(this, _Selector_ruleset, "f").match(el, caller);
51
+ for (const result of results) {
52
+ if (result.matched) {
53
+ return result.specificity;
54
+ }
55
+ }
56
+ return false;
57
+ }
58
+ }
59
+ _Selector_ruleset = new WeakMap();
60
+ class Ruleset {
61
+ constructor(selectors) {
62
+ _Ruleset_selectorGroup.set(this, []);
63
+ tslib_1.__classPrivateFieldGet(this, _Ruleset_selectorGroup, "f").push(...selectors.map(selector => new StructuredSelector(selector)));
64
+ }
65
+ static parse(selector) {
66
+ const selectors = [];
67
+ (0, postcss_selector_parser_1.default)(root => {
68
+ selectors.push(...root.nodes);
69
+ }).processSync(selector);
70
+ return new Ruleset(selectors);
71
+ }
72
+ match(el, caller) {
73
+ log('%s', el.localName);
74
+ return tslib_1.__classPrivateFieldGet(this, _Ruleset_selectorGroup, "f").map(selector => {
75
+ const res = selector.match(el, caller);
76
+ resLog('%s => %o', selector.selector, res);
77
+ return res;
78
+ });
79
+ }
80
+ }
81
+ _Ruleset_selectorGroup = new WeakMap();
82
+ class StructuredSelector {
83
+ constructor(selector) {
84
+ _StructuredSelector_edge.set(this, void 0);
85
+ _StructuredSelector_selector.set(this, void 0);
86
+ tslib_1.__classPrivateFieldSet(this, _StructuredSelector_selector, selector, "f");
87
+ tslib_1.__classPrivateFieldSet(this, _StructuredSelector_edge, new SelectorTarget(), "f");
88
+ tslib_1.__classPrivateFieldGet(this, _StructuredSelector_selector, "f").nodes.forEach(node => {
89
+ switch (node.type) {
90
+ case 'combinator': {
91
+ const combinatedTarget = new SelectorTarget();
92
+ combinatedTarget.from(tslib_1.__classPrivateFieldGet(this, _StructuredSelector_edge, "f"), node);
93
+ tslib_1.__classPrivateFieldSet(this, _StructuredSelector_edge, combinatedTarget, "f");
94
+ break;
95
+ }
96
+ case 'root':
97
+ case 'string': {
98
+ throw new Error(`Unsupported selector: ${selector.toString()}`);
99
+ }
100
+ case 'nesting': {
101
+ throw new Error(`Unsupported nested selector: ${selector.toString()}`);
102
+ }
103
+ case 'comment': {
104
+ throw new Error(`Unsupported comment in selector: ${selector.toString()}`);
105
+ }
106
+ default: {
107
+ tslib_1.__classPrivateFieldGet(this, _StructuredSelector_edge, "f").add(node);
108
+ }
109
+ }
110
+ });
111
+ }
112
+ get selector() {
113
+ return tslib_1.__classPrivateFieldGet(this, _StructuredSelector_selector, "f").nodes.join('');
114
+ }
115
+ match(el, caller) {
116
+ return tslib_1.__classPrivateFieldGet(this, _StructuredSelector_edge, "f").match(el, caller);
117
+ }
118
+ }
119
+ _StructuredSelector_edge = new WeakMap(), _StructuredSelector_selector = new WeakMap();
120
+ class SelectorTarget {
121
+ constructor() {
122
+ _SelectorTarget_combinatedFrom.set(this, null);
123
+ _SelectorTarget_isAdded.set(this, false);
124
+ this.attr = [];
125
+ this.class = [];
126
+ this.id = [];
127
+ this.pseudo = [];
128
+ this.tag = null;
129
+ }
130
+ add(selector) {
131
+ tslib_1.__classPrivateFieldSet(this, _SelectorTarget_isAdded, true, "f");
132
+ switch (selector.type) {
133
+ case 'tag':
134
+ case 'universal': {
135
+ this.tag = selector;
136
+ break;
137
+ }
138
+ case 'id': {
139
+ this.id.push(selector);
140
+ break;
141
+ }
142
+ case 'class': {
143
+ this.class.push(selector);
144
+ break;
145
+ }
146
+ case 'attribute': {
147
+ this.attr.push(selector);
148
+ break;
149
+ }
150
+ case 'pseudo': {
151
+ this.pseudo.push(selector);
152
+ break;
153
+ }
154
+ }
155
+ }
156
+ from(target, combinator) {
157
+ tslib_1.__classPrivateFieldSet(this, _SelectorTarget_combinatedFrom, { target, combinator }, "f");
158
+ }
159
+ match(el, caller) {
160
+ const unitCheck = this._matchWithoutCombinateChecking(el, caller);
161
+ if (!unitCheck.matched) {
162
+ return unitCheck;
163
+ }
164
+ if (!tslib_1.__classPrivateFieldGet(this, _SelectorTarget_combinatedFrom, "f")) {
165
+ return unitCheck;
166
+ }
167
+ const { target, combinator } = tslib_1.__classPrivateFieldGet(this, _SelectorTarget_combinatedFrom, "f");
168
+ switch (combinator.value) {
169
+ // Descendant combinator
170
+ case ' ': {
171
+ let ancestor = el.parentElement;
172
+ let matched = false;
173
+ let specificity;
174
+ while (ancestor) {
175
+ const res = target.match(ancestor, caller);
176
+ if (!specificity) {
177
+ specificity = [
178
+ unitCheck.specificity[0] + res.specificity[0],
179
+ unitCheck.specificity[1] + res.specificity[1],
180
+ unitCheck.specificity[2] + res.specificity[2],
181
+ ];
182
+ }
183
+ if (res.matched) {
184
+ matched = true;
185
+ }
186
+ ancestor = ancestor.parentElement;
187
+ }
188
+ if (!specificity) {
189
+ const res = target.match(el, caller);
190
+ specificity = [
191
+ unitCheck.specificity[0] + res.specificity[0],
192
+ unitCheck.specificity[1] + res.specificity[1],
193
+ unitCheck.specificity[2] + res.specificity[2],
194
+ ];
195
+ }
196
+ return {
197
+ specificity,
198
+ matched,
199
+ };
200
+ }
201
+ // Child combinator
202
+ case '>': {
203
+ let matched;
204
+ const specificity = unitCheck.specificity;
205
+ const parentNode = el.parentElement;
206
+ if (parentNode) {
207
+ const res = target.match(parentNode, caller);
208
+ specificity[0] += res.specificity[0];
209
+ specificity[1] += res.specificity[1];
210
+ specificity[2] += res.specificity[2];
211
+ matched = res.matched;
212
+ }
213
+ else {
214
+ const res = target.match(el, caller);
215
+ specificity[0] += res.specificity[0];
216
+ specificity[1] += res.specificity[1];
217
+ specificity[2] += res.specificity[2];
218
+ matched = false;
219
+ }
220
+ return {
221
+ specificity,
222
+ matched,
223
+ };
224
+ }
225
+ // Next-sibling combinator
226
+ case '+': {
227
+ let matched;
228
+ const specificity = unitCheck.specificity;
229
+ if (el.previousElementSibling) {
230
+ const res = target.match(el.previousElementSibling, caller);
231
+ specificity[0] += res.specificity[0];
232
+ specificity[1] += res.specificity[1];
233
+ specificity[2] += res.specificity[2];
234
+ matched = res.matched;
235
+ }
236
+ else {
237
+ const res = target.match(el, caller);
238
+ specificity[0] += res.specificity[0];
239
+ specificity[1] += res.specificity[1];
240
+ specificity[2] += res.specificity[2];
241
+ matched = false;
242
+ }
243
+ return {
244
+ specificity,
245
+ matched,
246
+ };
247
+ }
248
+ // Subsequent-sibling combinator
249
+ case '~': {
250
+ let prev = el.previousElementSibling;
251
+ let matched = false;
252
+ let specificity;
253
+ while (prev) {
254
+ const res = target.match(prev, caller);
255
+ if (!specificity) {
256
+ specificity = [
257
+ unitCheck.specificity[0] + res.specificity[0],
258
+ unitCheck.specificity[1] + res.specificity[1],
259
+ unitCheck.specificity[2] + res.specificity[2],
260
+ ];
261
+ }
262
+ if (res.matched) {
263
+ matched = true;
264
+ }
265
+ prev = prev.previousElementSibling;
266
+ }
267
+ if (!specificity) {
268
+ const res = target.match(el, caller);
269
+ specificity = [
270
+ unitCheck.specificity[0] + res.specificity[0],
271
+ unitCheck.specificity[1] + res.specificity[1],
272
+ unitCheck.specificity[2] + res.specificity[2],
273
+ ];
274
+ }
275
+ return {
276
+ specificity,
277
+ matched,
278
+ };
279
+ }
280
+ // Column combinator
281
+ case '||': {
282
+ throw new Error('Unsupported column combinator yet. If you want it, please request it as the issue (https://github.com/markuplint/markuplint/issues/new).');
283
+ }
284
+ default: {
285
+ throw new Error(`Unsupported ${tslib_1.__classPrivateFieldGet(this, _SelectorTarget_combinatedFrom, "f").combinator.value} combinator in selector`);
286
+ }
287
+ }
288
+ }
289
+ _matchWithoutCombinateChecking(el, caller) {
290
+ const specificity = [0, 0, 0];
291
+ let matched = true;
292
+ if (!tslib_1.__classPrivateFieldGet(this, _SelectorTarget_isAdded, "f") && !isScope(el, caller)) {
293
+ matched = false;
294
+ }
295
+ if (!this.id.every(id => id.value === el.id)) {
296
+ matched = false;
297
+ }
298
+ specificity[0] += this.id.length;
299
+ if (!this.class.every(className => el.classList.contains(className.value))) {
300
+ matched = false;
301
+ }
302
+ specificity[1] += this.class.length;
303
+ if (!this.attr.every(attr => attrMatch(attr, el))) {
304
+ matched = false;
305
+ }
306
+ specificity[1] += this.attr.length;
307
+ for (const pseudo of this.pseudo) {
308
+ const pseudoRes = pseudoMatch(pseudo, el, caller);
309
+ specificity[0] += pseudoRes.specificity[0];
310
+ specificity[1] += pseudoRes.specificity[1];
311
+ specificity[2] += pseudoRes.specificity[2];
312
+ if (!pseudoRes.matched) {
313
+ matched = false;
314
+ }
315
+ }
316
+ if (this.tag && this.tag.type === 'tag') {
317
+ specificity[2] += 1;
318
+ let a = this.tag.value;
319
+ let b = el.localName;
320
+ if ((0, is_pure_html_element_1.isPureHTMLElement)(el)) {
321
+ a = a.toLowerCase();
322
+ b = b.toLowerCase();
323
+ }
324
+ if (a !== b) {
325
+ matched = false;
326
+ }
327
+ }
328
+ return {
329
+ specificity,
330
+ matched,
331
+ };
332
+ }
333
+ }
334
+ _SelectorTarget_combinatedFrom = new WeakMap(), _SelectorTarget_isAdded = new WeakMap();
335
+ function attrMatch(attr, el) {
336
+ return Array.from(el.attributes).some(attrOfEl => {
337
+ if (attr.attribute !== attrOfEl.name) {
338
+ return false;
339
+ }
340
+ if (attr.value != null) {
341
+ let value = attr.value;
342
+ let valueOfEl = attrOfEl.value;
343
+ if (attr.insensitive) {
344
+ value = value.toLowerCase();
345
+ valueOfEl = valueOfEl.toLowerCase();
346
+ }
347
+ switch (attr.operator) {
348
+ case '=': {
349
+ if (value !== valueOfEl) {
350
+ return false;
351
+ }
352
+ break;
353
+ }
354
+ case '~=': {
355
+ if (!valueOfEl.split(/\s+/).includes(value)) {
356
+ return false;
357
+ }
358
+ break;
359
+ }
360
+ case '|=': {
361
+ if (!new RegExp(`^${value}(?:$|-)`).test(valueOfEl)) {
362
+ return false;
363
+ }
364
+ break;
365
+ }
366
+ case '*=': {
367
+ if (valueOfEl.indexOf(value) === -1) {
368
+ return false;
369
+ }
370
+ break;
371
+ }
372
+ case '^=': {
373
+ if (valueOfEl.indexOf(value) !== 0) {
374
+ return false;
375
+ }
376
+ break;
377
+ }
378
+ case '$=': {
379
+ if (valueOfEl.lastIndexOf(value) !== valueOfEl.length - value.length) {
380
+ return false;
381
+ }
382
+ break;
383
+ }
384
+ }
385
+ }
386
+ return true;
387
+ });
388
+ }
389
+ function pseudoMatch(pseudo, el, caller) {
390
+ switch (pseudo.value) {
391
+ //
392
+ /**
393
+ * Below, markuplint Specific Selector
394
+ */
395
+ case ':closest': {
396
+ const ruleset = new Ruleset(pseudo.nodes);
397
+ const specificity = getSpecificity(ruleset.match(el, caller));
398
+ let parent = el.parentElement;
399
+ while (parent) {
400
+ if (ruleset.match(parent, caller).some(r => r.matched)) {
401
+ return {
402
+ specificity,
403
+ matched: true,
404
+ };
405
+ }
406
+ parent = parent.parentElement;
407
+ }
408
+ return {
409
+ specificity,
410
+ matched: false,
411
+ };
412
+ }
413
+ /**
414
+ * Below, Selector Level 4
415
+ */
416
+ case ':not': {
417
+ const ruleset = new Ruleset(pseudo.nodes);
418
+ const resList = ruleset.match(el, caller);
419
+ const specificity = getSpecificity(resList);
420
+ const matched = resList.every(r => !r.matched);
421
+ return {
422
+ specificity,
423
+ matched,
424
+ };
425
+ }
426
+ case ':is': {
427
+ const ruleset = new Ruleset(pseudo.nodes);
428
+ const resList = ruleset.match(el, caller);
429
+ const specificity = getSpecificity(resList);
430
+ const matched = resList.some(r => r.matched);
431
+ return {
432
+ specificity,
433
+ matched,
434
+ };
435
+ }
436
+ case ':has': {
437
+ const ruleset = new Ruleset(pseudo.nodes);
438
+ const specificity = getSpecificity(ruleset.match(el, caller));
439
+ const descendants = getDescendants(el);
440
+ const matched = descendants.some(desc => ruleset.match(desc, caller).some(m => m.matched));
441
+ return {
442
+ specificity,
443
+ matched,
444
+ };
445
+ }
446
+ case ':where': {
447
+ const ruleset = new Ruleset(pseudo.nodes);
448
+ const resList = ruleset.match(el, caller);
449
+ const matched = resList.some(r => r.matched);
450
+ return {
451
+ specificity: [0, 0, 0],
452
+ matched,
453
+ };
454
+ }
455
+ case ':scope': {
456
+ if (isScope(el, caller)) {
457
+ return {
458
+ specificity: [0, 1, 0],
459
+ matched: true,
460
+ };
461
+ }
462
+ return {
463
+ specificity: [0, 1, 0],
464
+ matched: false,
465
+ };
466
+ }
467
+ case ':root': {
468
+ if (el.localName === 'html') {
469
+ return {
470
+ specificity: [0, 1, 0],
471
+ matched: true,
472
+ };
473
+ }
474
+ return {
475
+ specificity: [0, 1, 0],
476
+ matched: false,
477
+ };
478
+ }
479
+ case ':enable':
480
+ case ':disable':
481
+ case ':read-write':
482
+ case ':read-only':
483
+ case ':placeholder-shown':
484
+ case ':default':
485
+ case ':checked':
486
+ case ':indeterminate':
487
+ case ':valid':
488
+ case ':invalid':
489
+ case ':in-range':
490
+ case ':out-of-range':
491
+ case ':required':
492
+ case ':optional':
493
+ case ':blank':
494
+ case ':user-invalid':
495
+ case ':empty':
496
+ case ':nth-child':
497
+ case ':nth-last-child':
498
+ case ':first-child':
499
+ case ':last-child':
500
+ case ':only-child':
501
+ case ':nth-of-type':
502
+ case ':nth-last-of-type':
503
+ case ':first-of-type':
504
+ case ':last-of-type':
505
+ case ':only-of-type':
506
+ case ':nth-last-col':
507
+ case ':nth-col': {
508
+ throw new Error(`Unsupported pseudo ${pseudo.toString()} selector yet. If you want it, please request it as the issue (https://github.com/markuplint/markuplint/issues/new).`);
509
+ }
510
+ case ':dir':
511
+ case ':lang':
512
+ case ':any-link':
513
+ case ':link':
514
+ case ':visited':
515
+ case ':local-link':
516
+ case ':target':
517
+ case ':target-within':
518
+ case ':current':
519
+ case ':past':
520
+ case ':future':
521
+ case ':active':
522
+ case ':hover':
523
+ case ':focus':
524
+ case ':focus-within':
525
+ case ':focus-visible':
526
+ case '::before':
527
+ case '::after':
528
+ default: {
529
+ throw new Error(`Unsupported pseudo ${pseudo.toString()} selector.`);
530
+ }
531
+ }
532
+ }
533
+ function isScope(el, caller) {
534
+ return el === caller || el.parentNode === null;
535
+ }
536
+ function getDescendants(el, includeSelf = false) {
537
+ return [
538
+ ...Array.from(el.children)
539
+ .map(child => getDescendants(child, true))
540
+ .flat(),
541
+ ...(includeSelf ? [el] : []),
542
+ ];
543
+ }
544
+ function getSpecificity(result) {
545
+ let specificity;
546
+ for (const res of result) {
547
+ if (specificity) {
548
+ const order = compareSpecificity(specificity, res.specificity);
549
+ if (order === -1) {
550
+ specificity = res.specificity;
551
+ }
552
+ }
553
+ else {
554
+ specificity = res.specificity;
555
+ }
556
+ }
557
+ if (!specificity) {
558
+ throw new Error('Result is empty');
559
+ }
560
+ return specificity;
561
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@markuplint/ml-core",
3
- "version": "2.2.3",
3
+ "version": "2.3.2",
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,9 +17,9 @@
17
17
  "clean": "tsc --build --clean"
18
18
  },
19
19
  "dependencies": {
20
- "@markuplint/i18n": "2.1.0",
20
+ "@markuplint/i18n": "2.1.1",
21
21
  "@markuplint/ml-ast": "2.0.1-dev.20220307.0",
22
- "@markuplint/ml-config": "2.0.1-dev.20220307.0",
22
+ "@markuplint/ml-config": "2.1.0",
23
23
  "@markuplint/ml-spec": "2.1.0",
24
24
  "@markuplint/parser-utils": "2.2.0",
25
25
  "debug": "^4.3.4",
@@ -28,8 +28,8 @@
28
28
  "tslib": "^2.3.1"
29
29
  },
30
30
  "devDependencies": {
31
- "@markuplint/html-parser": "2.2.0",
31
+ "@markuplint/html-parser": "2.2.1",
32
32
  "@types/debug": "^4.1.7"
33
33
  },
34
- "gitHead": "98a5617d19cd2c6ccc23dce045dc0af8d261cb5a"
34
+ "gitHead": "0c774ce046ebc8a9c494e9884a4bfcd72a66250d"
35
35
  }