@taiga-ui/eslint-plugin-experience-next 0.482.0 → 0.484.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/README.md +14 -13
- package/index.esm.js +1114 -1115
- package/package.json +2 -4
- /package/rules/{attrs-newline.d.ts → recommended/attrs-newline.d.ts} +0 -0
- /package/rules/{element-newline.d.ts → recommended/element-newline.d.ts} +0 -0
- /package/rules/{no-duplicate-attrs.d.ts → recommended/no-duplicate-attrs.d.ts} +0 -0
- /package/rules/{no-duplicate-id.d.ts → recommended/no-duplicate-id.d.ts} +0 -0
- /package/rules/{no-duplicate-in-head.d.ts → recommended/no-duplicate-in-head.d.ts} +0 -0
- /package/rules/{no-obsolete-attrs.d.ts → recommended/no-obsolete-attrs.d.ts} +0 -0
- /package/rules/{no-obsolete-tags.d.ts → recommended/no-obsolete-tags.d.ts} +0 -0
- /package/rules/{quotes.d.ts → recommended/quotes.d.ts} +0 -0
- /package/rules/{require-doctype.d.ts → recommended/require-doctype.d.ts} +0 -0
- /package/rules/{require-img-alt.d.ts → recommended/require-img-alt.d.ts} +0 -0
- /package/rules/{require-lang.d.ts → recommended/require-lang.d.ts} +0 -0
- /package/rules/{require-li-container.d.ts → recommended/require-li-container.d.ts} +0 -0
- /package/rules/{require-title.d.ts → recommended/require-title.d.ts} +0 -0
package/index.esm.js
CHANGED
|
@@ -46296,6 +46296,72 @@ const rule$M = createRule({
|
|
|
46296
46296
|
},
|
|
46297
46297
|
});
|
|
46298
46298
|
|
|
46299
|
+
function sameOrder(a, b) {
|
|
46300
|
+
return a.length === b.length && a.every((value, index) => value === b[index]);
|
|
46301
|
+
}
|
|
46302
|
+
|
|
46303
|
+
const config$5 = {
|
|
46304
|
+
create(context) {
|
|
46305
|
+
const order = context.options[0] || {};
|
|
46306
|
+
return {
|
|
46307
|
+
ClassDeclaration(node) {
|
|
46308
|
+
const decorators = Array.from(node.decorators ?? []);
|
|
46309
|
+
for (const decorator of decorators) {
|
|
46310
|
+
const { expression } = decorator;
|
|
46311
|
+
const decoratorName = expression.callee?.name ?? '';
|
|
46312
|
+
if (decoratorName in (order || {})) {
|
|
46313
|
+
const orderList = order[decoratorName];
|
|
46314
|
+
const decoratorArguments = Array.from(expression.arguments ?? []);
|
|
46315
|
+
for (const argument of decoratorArguments) {
|
|
46316
|
+
const properties = Array.from(argument.properties ?? []);
|
|
46317
|
+
const current = properties
|
|
46318
|
+
.map((prop) => prop.key?.name)
|
|
46319
|
+
.filter(Boolean);
|
|
46320
|
+
const correct = getCorrectOrderRelative(orderList, current);
|
|
46321
|
+
if (!sameOrder(correct, current.filter((item) => correct.includes(item)))) {
|
|
46322
|
+
context.report({
|
|
46323
|
+
fix: (fixer) => {
|
|
46324
|
+
const fileContent = context.sourceCode.text;
|
|
46325
|
+
const forgottenProps = current.filter((key) => !orderList.includes(key));
|
|
46326
|
+
const sortedDecoratorProperties = [
|
|
46327
|
+
...correct,
|
|
46328
|
+
...forgottenProps,
|
|
46329
|
+
].map((key) => properties.find((prop) => prop.key.name === key));
|
|
46330
|
+
const newDecoratorArgument = `{${sortedDecoratorProperties
|
|
46331
|
+
.map(({ range }) => fileContent.slice(...range))
|
|
46332
|
+
.toString()}}`;
|
|
46333
|
+
return fixer.replaceTextRange(argument.range, newDecoratorArgument);
|
|
46334
|
+
},
|
|
46335
|
+
message: `Incorrect order keys in @${decoratorName} decorator, please sort by [${correct.join(' -> ')}]`,
|
|
46336
|
+
node: expression,
|
|
46337
|
+
});
|
|
46338
|
+
}
|
|
46339
|
+
}
|
|
46340
|
+
}
|
|
46341
|
+
}
|
|
46342
|
+
},
|
|
46343
|
+
};
|
|
46344
|
+
},
|
|
46345
|
+
meta: {
|
|
46346
|
+
fixable: 'code',
|
|
46347
|
+
schema: [
|
|
46348
|
+
{
|
|
46349
|
+
additionalProperties: true,
|
|
46350
|
+
description: 'Decorators names and their keys order',
|
|
46351
|
+
type: 'object',
|
|
46352
|
+
},
|
|
46353
|
+
],
|
|
46354
|
+
type: 'problem',
|
|
46355
|
+
},
|
|
46356
|
+
};
|
|
46357
|
+
function getCorrectOrderRelative(correct, current) {
|
|
46358
|
+
return correct.filter((item) => current.includes(item));
|
|
46359
|
+
}
|
|
46360
|
+
const rule$L = createRule({
|
|
46361
|
+
name: 'decorator-key-sort',
|
|
46362
|
+
rule: config$5,
|
|
46363
|
+
});
|
|
46364
|
+
|
|
46299
46365
|
const INLINE_HTML_ELEMENTS = new Set([
|
|
46300
46366
|
'a',
|
|
46301
46367
|
'abbr',
|
|
@@ -46355,7 +46421,7 @@ function getNodeLabel(node) {
|
|
|
46355
46421
|
}
|
|
46356
46422
|
return 'text';
|
|
46357
46423
|
}
|
|
46358
|
-
const rule$
|
|
46424
|
+
const rule$K = createRule({
|
|
46359
46425
|
name: 'element-newline',
|
|
46360
46426
|
rule: {
|
|
46361
46427
|
create(context) {
|
|
@@ -46429,802 +46495,6 @@ const rule$L = createRule({
|
|
|
46429
46495
|
},
|
|
46430
46496
|
});
|
|
46431
46497
|
|
|
46432
|
-
const noDuplicateAttributesRule = angular.templatePlugin.rules?.['no-duplicate-attributes'];
|
|
46433
|
-
if (!noDuplicateAttributesRule) {
|
|
46434
|
-
throw new Error('angular-eslint template rule "no-duplicate-attributes" is not available');
|
|
46435
|
-
}
|
|
46436
|
-
const rule$K = createRule({
|
|
46437
|
-
name: 'no-duplicate-attrs',
|
|
46438
|
-
rule: noDuplicateAttributesRule,
|
|
46439
|
-
});
|
|
46440
|
-
|
|
46441
|
-
const MESSAGE_ID$f = 'duplicateId';
|
|
46442
|
-
const rule$J = createRule({
|
|
46443
|
-
name: 'no-duplicate-id',
|
|
46444
|
-
rule: {
|
|
46445
|
-
create(context) {
|
|
46446
|
-
const ids = new Map();
|
|
46447
|
-
return {
|
|
46448
|
-
Element(rawNode) {
|
|
46449
|
-
const node = rawNode;
|
|
46450
|
-
const idAttr = node.attributes.find((attr) => attr.name === 'id');
|
|
46451
|
-
if (!idAttr) {
|
|
46452
|
-
return;
|
|
46453
|
-
}
|
|
46454
|
-
ids.set(idAttr.value, [...(ids.get(idAttr.value) ?? []), idAttr]);
|
|
46455
|
-
},
|
|
46456
|
-
'Program:exit'() {
|
|
46457
|
-
for (const [id, attrs] of ids) {
|
|
46458
|
-
if (attrs.length <= 1) {
|
|
46459
|
-
continue;
|
|
46460
|
-
}
|
|
46461
|
-
for (const attr of attrs) {
|
|
46462
|
-
context.report({
|
|
46463
|
-
data: { id },
|
|
46464
|
-
loc: sourceSpanToLoc(attr.sourceSpan),
|
|
46465
|
-
messageId: MESSAGE_ID$f,
|
|
46466
|
-
});
|
|
46467
|
-
}
|
|
46468
|
-
}
|
|
46469
|
-
},
|
|
46470
|
-
};
|
|
46471
|
-
},
|
|
46472
|
-
meta: {
|
|
46473
|
-
docs: { description: 'Disallow duplicate static id attributes' },
|
|
46474
|
-
messages: { [MESSAGE_ID$f]: "The id '{{id}}' is duplicated." },
|
|
46475
|
-
schema: [],
|
|
46476
|
-
type: 'problem',
|
|
46477
|
-
},
|
|
46478
|
-
},
|
|
46479
|
-
});
|
|
46480
|
-
|
|
46481
|
-
const MESSAGE_ID$e = 'duplicateTag';
|
|
46482
|
-
function findAttr(node, attrName) {
|
|
46483
|
-
return node.attributes.find((attr) => attr.name === attrName);
|
|
46484
|
-
}
|
|
46485
|
-
function getTrackingKey(node) {
|
|
46486
|
-
if (node.name === 'title' || node.name === 'base') {
|
|
46487
|
-
return node.name;
|
|
46488
|
-
}
|
|
46489
|
-
if (node.name === 'meta') {
|
|
46490
|
-
if (findAttr(node, 'charset')) {
|
|
46491
|
-
return 'meta[charset]';
|
|
46492
|
-
}
|
|
46493
|
-
if (findAttr(node, 'name')?.value === 'viewport') {
|
|
46494
|
-
return 'meta[name=viewport]';
|
|
46495
|
-
}
|
|
46496
|
-
}
|
|
46497
|
-
if (node.name === 'link' &&
|
|
46498
|
-
findAttr(node, 'rel')?.value === 'canonical' &&
|
|
46499
|
-
findAttr(node, 'href')) {
|
|
46500
|
-
return 'link[rel=canonical]';
|
|
46501
|
-
}
|
|
46502
|
-
return null;
|
|
46503
|
-
}
|
|
46504
|
-
const rule$I = createRule({
|
|
46505
|
-
name: 'no-duplicate-in-head',
|
|
46506
|
-
rule: {
|
|
46507
|
-
create(context) {
|
|
46508
|
-
const nodes = new Map();
|
|
46509
|
-
let headDepth = 0;
|
|
46510
|
-
return {
|
|
46511
|
-
Element(rawNode) {
|
|
46512
|
-
const node = rawNode;
|
|
46513
|
-
if (node.name === 'head') {
|
|
46514
|
-
headDepth++;
|
|
46515
|
-
return;
|
|
46516
|
-
}
|
|
46517
|
-
if (headDepth === 0) {
|
|
46518
|
-
return;
|
|
46519
|
-
}
|
|
46520
|
-
const trackingKey = getTrackingKey(node);
|
|
46521
|
-
if (!trackingKey) {
|
|
46522
|
-
return;
|
|
46523
|
-
}
|
|
46524
|
-
nodes.set(trackingKey, [...(nodes.get(trackingKey) ?? []), node]);
|
|
46525
|
-
},
|
|
46526
|
-
'Element:exit'(rawNode) {
|
|
46527
|
-
const node = rawNode;
|
|
46528
|
-
if (node.name === 'head') {
|
|
46529
|
-
headDepth--;
|
|
46530
|
-
}
|
|
46531
|
-
},
|
|
46532
|
-
'Program:exit'() {
|
|
46533
|
-
for (const [tag, duplicates] of nodes) {
|
|
46534
|
-
if (duplicates.length <= 1) {
|
|
46535
|
-
continue;
|
|
46536
|
-
}
|
|
46537
|
-
for (const duplicate of duplicates.slice(1)) {
|
|
46538
|
-
context.report({
|
|
46539
|
-
data: { tag },
|
|
46540
|
-
loc: sourceSpanToLoc(duplicate.startSourceSpan),
|
|
46541
|
-
messageId: MESSAGE_ID$e,
|
|
46542
|
-
});
|
|
46543
|
-
}
|
|
46544
|
-
}
|
|
46545
|
-
},
|
|
46546
|
-
};
|
|
46547
|
-
},
|
|
46548
|
-
meta: {
|
|
46549
|
-
docs: {
|
|
46550
|
-
description: 'Disallow duplicate title/base/meta/link tags inside head',
|
|
46551
|
-
},
|
|
46552
|
-
messages: { [MESSAGE_ID$e]: 'Duplicate <{{tag}}> tag in <head>.' },
|
|
46553
|
-
schema: [],
|
|
46554
|
-
type: 'problem',
|
|
46555
|
-
},
|
|
46556
|
-
},
|
|
46557
|
-
});
|
|
46558
|
-
|
|
46559
|
-
const OBSOLETE_HTML_ATTRS = {
|
|
46560
|
-
abbr: [
|
|
46561
|
-
{
|
|
46562
|
-
elements: ['td'],
|
|
46563
|
-
suggestion: "Use text that begins in an unambiguous and terse manner, and include any more elaborate text after that. The title attribute can also be useful in including more detailed text, so that the cell's contents can be made terse. If it's a heading, use th (which has an abbr attribute).",
|
|
46564
|
-
},
|
|
46565
|
-
],
|
|
46566
|
-
accept: [
|
|
46567
|
-
{
|
|
46568
|
-
elements: ['form'],
|
|
46569
|
-
suggestion: 'Use the accept attribute directly on the input elements instead.',
|
|
46570
|
-
},
|
|
46571
|
-
],
|
|
46572
|
-
align: [
|
|
46573
|
-
{
|
|
46574
|
-
elements: [
|
|
46575
|
-
'caption',
|
|
46576
|
-
'col',
|
|
46577
|
-
'div',
|
|
46578
|
-
'embed',
|
|
46579
|
-
'h1',
|
|
46580
|
-
'h2',
|
|
46581
|
-
'h3',
|
|
46582
|
-
'h4',
|
|
46583
|
-
'h5',
|
|
46584
|
-
'h6',
|
|
46585
|
-
'hr',
|
|
46586
|
-
'iframe',
|
|
46587
|
-
'input',
|
|
46588
|
-
'img',
|
|
46589
|
-
'legend',
|
|
46590
|
-
'object',
|
|
46591
|
-
'p',
|
|
46592
|
-
'table',
|
|
46593
|
-
'tbody',
|
|
46594
|
-
'thead',
|
|
46595
|
-
'tfoot',
|
|
46596
|
-
'td',
|
|
46597
|
-
'th',
|
|
46598
|
-
'tr',
|
|
46599
|
-
],
|
|
46600
|
-
suggestion: 'Use CSS instead.',
|
|
46601
|
-
},
|
|
46602
|
-
],
|
|
46603
|
-
alink: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
46604
|
-
allowtransparency: [{ elements: ['iframe'], suggestion: 'Use CSS instead.' }],
|
|
46605
|
-
archive: [
|
|
46606
|
-
{
|
|
46607
|
-
elements: ['object'],
|
|
46608
|
-
suggestion: 'Use the data and type attributes to invoke plugins.',
|
|
46609
|
-
},
|
|
46610
|
-
],
|
|
46611
|
-
axis: [
|
|
46612
|
-
{
|
|
46613
|
-
elements: ['td', 'th'],
|
|
46614
|
-
suggestion: 'Use the scope attribute on the relevant th.',
|
|
46615
|
-
},
|
|
46616
|
-
],
|
|
46617
|
-
background: [
|
|
46618
|
-
{
|
|
46619
|
-
elements: ['body', 'table', 'thead', 'tbody', 'tfoot', 'tr', 'td', 'th'],
|
|
46620
|
-
suggestion: 'Use CSS instead.',
|
|
46621
|
-
},
|
|
46622
|
-
],
|
|
46623
|
-
bgcolor: [
|
|
46624
|
-
{
|
|
46625
|
-
elements: ['body', 'table', 'td', 'th', 'tr'],
|
|
46626
|
-
suggestion: 'Use CSS instead.',
|
|
46627
|
-
},
|
|
46628
|
-
],
|
|
46629
|
-
border: [
|
|
46630
|
-
{
|
|
46631
|
-
elements: ['input', 'img', 'object', 'table'],
|
|
46632
|
-
suggestion: 'Use CSS instead.',
|
|
46633
|
-
},
|
|
46634
|
-
],
|
|
46635
|
-
bordercolor: [{ elements: ['table'], suggestion: 'Use CSS instead.' }],
|
|
46636
|
-
bottommargin: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
46637
|
-
cellpadding: [{ elements: ['table'], suggestion: 'Use CSS instead.' }],
|
|
46638
|
-
cellspacing: [{ elements: ['table'], suggestion: 'Use CSS instead.' }],
|
|
46639
|
-
char: [
|
|
46640
|
-
{
|
|
46641
|
-
elements: ['col', 'tbody', 'thead', 'tfoot', 'td', 'th', 'tr'],
|
|
46642
|
-
suggestion: 'Use CSS instead.',
|
|
46643
|
-
},
|
|
46644
|
-
],
|
|
46645
|
-
charoff: [
|
|
46646
|
-
{
|
|
46647
|
-
elements: ['col', 'tbody', 'thead', 'tfoot', 'td', 'th', 'tr'],
|
|
46648
|
-
suggestion: 'Use CSS instead.',
|
|
46649
|
-
},
|
|
46650
|
-
],
|
|
46651
|
-
charset: [
|
|
46652
|
-
{
|
|
46653
|
-
elements: ['a', 'link'],
|
|
46654
|
-
suggestion: 'Use an HTTP `Content-Type` header on the linked resource instead.',
|
|
46655
|
-
},
|
|
46656
|
-
{
|
|
46657
|
-
elements: ['script'],
|
|
46658
|
-
suggestion: 'It is redundant to specify it on the script element since it inherits from the document.',
|
|
46659
|
-
},
|
|
46660
|
-
],
|
|
46661
|
-
classid: [
|
|
46662
|
-
{
|
|
46663
|
-
elements: ['object'],
|
|
46664
|
-
suggestion: 'Use the data and type attributes to invoke plugins.',
|
|
46665
|
-
},
|
|
46666
|
-
],
|
|
46667
|
-
clear: [{ elements: ['br'], suggestion: 'Use CSS instead.' }],
|
|
46668
|
-
code: [
|
|
46669
|
-
{
|
|
46670
|
-
elements: ['object'],
|
|
46671
|
-
suggestion: 'Use the data and type attributes to invoke plugins.',
|
|
46672
|
-
},
|
|
46673
|
-
],
|
|
46674
|
-
codebase: [
|
|
46675
|
-
{
|
|
46676
|
-
elements: ['object'],
|
|
46677
|
-
suggestion: 'Use the data and type attributes to invoke plugins.',
|
|
46678
|
-
},
|
|
46679
|
-
],
|
|
46680
|
-
codetype: [
|
|
46681
|
-
{
|
|
46682
|
-
elements: ['object'],
|
|
46683
|
-
suggestion: 'Use the data and type attributes to invoke plugins.',
|
|
46684
|
-
},
|
|
46685
|
-
],
|
|
46686
|
-
color: [{ elements: ['hr'], suggestion: 'Use CSS instead.' }],
|
|
46687
|
-
compact: [
|
|
46688
|
-
{
|
|
46689
|
-
elements: ['dl', 'menu', 'ol', 'ul'],
|
|
46690
|
-
suggestion: 'Use CSS instead.',
|
|
46691
|
-
},
|
|
46692
|
-
],
|
|
46693
|
-
contextmenu: [
|
|
46694
|
-
{
|
|
46695
|
-
elements: ['*'],
|
|
46696
|
-
suggestion: 'To implement a custom context menu, use script to handle the contextmenu event.',
|
|
46697
|
-
},
|
|
46698
|
-
],
|
|
46699
|
-
coords: [{ elements: ['a'], suggestion: 'Use area instead of a for image maps.' }],
|
|
46700
|
-
datafld: [
|
|
46701
|
-
{
|
|
46702
|
-
elements: [
|
|
46703
|
-
'a',
|
|
46704
|
-
'button',
|
|
46705
|
-
'div',
|
|
46706
|
-
'fieldset',
|
|
46707
|
-
'frame',
|
|
46708
|
-
'iframe',
|
|
46709
|
-
'img',
|
|
46710
|
-
'input',
|
|
46711
|
-
'label',
|
|
46712
|
-
'legend',
|
|
46713
|
-
'marquee',
|
|
46714
|
-
'object',
|
|
46715
|
-
'select',
|
|
46716
|
-
'span',
|
|
46717
|
-
'textarea',
|
|
46718
|
-
],
|
|
46719
|
-
suggestion: 'Use script and a mechanism such as XMLHttpRequest to populate the page dynamically.',
|
|
46720
|
-
},
|
|
46721
|
-
],
|
|
46722
|
-
dataformatas: [
|
|
46723
|
-
{
|
|
46724
|
-
elements: [
|
|
46725
|
-
'button',
|
|
46726
|
-
'div',
|
|
46727
|
-
'input',
|
|
46728
|
-
'label',
|
|
46729
|
-
'legend',
|
|
46730
|
-
'marquee',
|
|
46731
|
-
'object',
|
|
46732
|
-
'option',
|
|
46733
|
-
'select',
|
|
46734
|
-
'span',
|
|
46735
|
-
'table',
|
|
46736
|
-
],
|
|
46737
|
-
suggestion: 'Use script and a mechanism such as XMLHttpRequest to populate the page dynamically.',
|
|
46738
|
-
},
|
|
46739
|
-
],
|
|
46740
|
-
datapagesize: [
|
|
46741
|
-
{
|
|
46742
|
-
elements: ['table'],
|
|
46743
|
-
suggestion: 'Unnecessary. Omit it altogether.',
|
|
46744
|
-
},
|
|
46745
|
-
],
|
|
46746
|
-
datasrc: [
|
|
46747
|
-
{
|
|
46748
|
-
elements: [
|
|
46749
|
-
'a',
|
|
46750
|
-
'button',
|
|
46751
|
-
'div',
|
|
46752
|
-
'frame',
|
|
46753
|
-
'iframe',
|
|
46754
|
-
'img',
|
|
46755
|
-
'input',
|
|
46756
|
-
'label',
|
|
46757
|
-
'legend',
|
|
46758
|
-
'marquee',
|
|
46759
|
-
'object',
|
|
46760
|
-
'option',
|
|
46761
|
-
'select',
|
|
46762
|
-
'span',
|
|
46763
|
-
'table',
|
|
46764
|
-
'textarea',
|
|
46765
|
-
],
|
|
46766
|
-
suggestion: 'Use script and a mechanism such as XMLHttpRequest to populate the page dynamically.',
|
|
46767
|
-
},
|
|
46768
|
-
],
|
|
46769
|
-
declare: [
|
|
46770
|
-
{
|
|
46771
|
-
elements: ['object'],
|
|
46772
|
-
suggestion: 'Repeat the object element completely each time the resource is to be reused.',
|
|
46773
|
-
},
|
|
46774
|
-
],
|
|
46775
|
-
dropzone: [
|
|
46776
|
-
{
|
|
46777
|
-
elements: ['*'],
|
|
46778
|
-
suggestion: 'Use script to handle the dragenter and dragover events instead.',
|
|
46779
|
-
},
|
|
46780
|
-
],
|
|
46781
|
-
event: [
|
|
46782
|
-
{
|
|
46783
|
-
elements: ['script'],
|
|
46784
|
-
suggestion: 'Use DOM events mechanisms to register event listeners.',
|
|
46785
|
-
},
|
|
46786
|
-
],
|
|
46787
|
-
for: [
|
|
46788
|
-
{
|
|
46789
|
-
elements: ['script'],
|
|
46790
|
-
suggestion: 'Use DOM events mechanisms to register event listeners.',
|
|
46791
|
-
},
|
|
46792
|
-
],
|
|
46793
|
-
frame: [{ elements: ['table'], suggestion: 'Use CSS instead.' }],
|
|
46794
|
-
frameborder: [{ elements: ['iframe'], suggestion: 'Use CSS instead.' }],
|
|
46795
|
-
framespacing: [{ elements: ['iframe'], suggestion: 'Use CSS instead.' }],
|
|
46796
|
-
height: [
|
|
46797
|
-
{
|
|
46798
|
-
elements: ['table', 'thead', 'tbody', 'tfoot', 'td', 'th', 'tr'],
|
|
46799
|
-
suggestion: 'Use CSS instead.',
|
|
46800
|
-
},
|
|
46801
|
-
],
|
|
46802
|
-
hreflang: [
|
|
46803
|
-
{
|
|
46804
|
-
elements: ['area'],
|
|
46805
|
-
suggestion: 'These attributes do not do anything useful, and for historical reasons there are no corresponding IDL attributes on area elements. Omit them altogether.',
|
|
46806
|
-
},
|
|
46807
|
-
],
|
|
46808
|
-
hspace: [
|
|
46809
|
-
{
|
|
46810
|
-
elements: ['embed', 'iframe', 'input', 'img', 'object'],
|
|
46811
|
-
suggestion: 'Use CSS instead.',
|
|
46812
|
-
},
|
|
46813
|
-
],
|
|
46814
|
-
ismap: [
|
|
46815
|
-
{
|
|
46816
|
-
elements: ['input'],
|
|
46817
|
-
suggestion: 'Unnecessary. Omit it altogether. All input elements with a type attribute in the Image Button state are processed as server-side image maps.',
|
|
46818
|
-
},
|
|
46819
|
-
],
|
|
46820
|
-
label: [
|
|
46821
|
-
{
|
|
46822
|
-
elements: ['menu'],
|
|
46823
|
-
suggestion: 'To implement a custom context menu, use script to handle the contextmenu event.',
|
|
46824
|
-
},
|
|
46825
|
-
],
|
|
46826
|
-
language: [
|
|
46827
|
-
{
|
|
46828
|
-
elements: ['script'],
|
|
46829
|
-
suggestion: 'Omit the attribute for JavaScript; for data blocks, use the type attribute instead.',
|
|
46830
|
-
},
|
|
46831
|
-
],
|
|
46832
|
-
leftmargin: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
46833
|
-
link: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
46834
|
-
longdesc: [
|
|
46835
|
-
{
|
|
46836
|
-
elements: ['iframe', 'img'],
|
|
46837
|
-
suggestion: "Use a regular a element to link to the description, or (in the case of images) use an image map to provide a link from the image to the image's description.",
|
|
46838
|
-
},
|
|
46839
|
-
],
|
|
46840
|
-
lowsrc: [
|
|
46841
|
-
{
|
|
46842
|
-
elements: ['img'],
|
|
46843
|
-
suggestion: 'Use a progressive JPEG image (given in the src attribute), instead of using two separate images.',
|
|
46844
|
-
},
|
|
46845
|
-
],
|
|
46846
|
-
manifest: [{ elements: ['html'], suggestion: 'Use service workers instead.' }],
|
|
46847
|
-
marginheight: [
|
|
46848
|
-
{
|
|
46849
|
-
elements: ['body', 'iframe'],
|
|
46850
|
-
suggestion: 'Use CSS instead.',
|
|
46851
|
-
},
|
|
46852
|
-
],
|
|
46853
|
-
marginwidth: [
|
|
46854
|
-
{
|
|
46855
|
-
elements: ['body', 'iframe'],
|
|
46856
|
-
suggestion: 'Use CSS instead.',
|
|
46857
|
-
},
|
|
46858
|
-
],
|
|
46859
|
-
methods: [
|
|
46860
|
-
{
|
|
46861
|
-
elements: ['a', 'link'],
|
|
46862
|
-
suggestion: 'Use the HTTP OPTIONS feature instead.',
|
|
46863
|
-
},
|
|
46864
|
-
],
|
|
46865
|
-
name: [
|
|
46866
|
-
{
|
|
46867
|
-
elements: ['a', 'embed', 'img', 'option'],
|
|
46868
|
-
suggestion: 'Use the id attribute instead.',
|
|
46869
|
-
},
|
|
46870
|
-
],
|
|
46871
|
-
nohref: [
|
|
46872
|
-
{
|
|
46873
|
-
elements: ['area'],
|
|
46874
|
-
suggestion: 'Omitting the href attribute is sufficient; the nohref attribute is unnecessary. Omit it altogether.',
|
|
46875
|
-
},
|
|
46876
|
-
],
|
|
46877
|
-
noshade: [{ elements: ['hr'], suggestion: 'Use CSS instead.' }],
|
|
46878
|
-
nowrap: [{ elements: ['td', 'th'], suggestion: 'Use CSS instead.' }],
|
|
46879
|
-
onshow: [
|
|
46880
|
-
{
|
|
46881
|
-
elements: ['*'],
|
|
46882
|
-
suggestion: 'To implement a custom context menu, use script to handle the contextmenu event.',
|
|
46883
|
-
},
|
|
46884
|
-
],
|
|
46885
|
-
profile: [{ elements: ['head'], suggestion: 'Unnecessary. Omit it altogether.' }],
|
|
46886
|
-
rev: [
|
|
46887
|
-
{
|
|
46888
|
-
elements: ['a', 'link'],
|
|
46889
|
-
suggestion: 'Use the rel attribute instead, with an opposite term. (For example, instead of rev="made", use rel="author".)',
|
|
46890
|
-
},
|
|
46891
|
-
],
|
|
46892
|
-
rightmargin: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
46893
|
-
scheme: [
|
|
46894
|
-
{
|
|
46895
|
-
elements: ['meta'],
|
|
46896
|
-
suggestion: 'Use only one scheme per field, or make the scheme declaration part of the value.',
|
|
46897
|
-
},
|
|
46898
|
-
],
|
|
46899
|
-
scope: [
|
|
46900
|
-
{
|
|
46901
|
-
elements: ['td'],
|
|
46902
|
-
suggestion: 'Use th elements for heading cells.',
|
|
46903
|
-
},
|
|
46904
|
-
],
|
|
46905
|
-
scrolling: [{ elements: ['iframe'], suggestion: 'Use CSS instead.' }],
|
|
46906
|
-
shape: [{ elements: ['a'], suggestion: 'Use area instead of a for image maps.' }],
|
|
46907
|
-
size: [{ elements: ['hr'], suggestion: 'Use CSS instead.' }],
|
|
46908
|
-
standby: [
|
|
46909
|
-
{
|
|
46910
|
-
elements: ['object'],
|
|
46911
|
-
suggestion: 'Optimize the linked resource so that it loads quickly or, at least, incrementally.',
|
|
46912
|
-
},
|
|
46913
|
-
],
|
|
46914
|
-
summary: [
|
|
46915
|
-
{
|
|
46916
|
-
elements: ['table'],
|
|
46917
|
-
suggestion: 'Use one of the techniques for describing tables given in the table section instead.',
|
|
46918
|
-
},
|
|
46919
|
-
],
|
|
46920
|
-
target: [{ elements: ['link'], suggestion: 'Unnecessary. Omit it altogether.' }],
|
|
46921
|
-
text: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
46922
|
-
topmargin: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
46923
|
-
type: [
|
|
46924
|
-
{
|
|
46925
|
-
elements: ['area'],
|
|
46926
|
-
suggestion: 'These attributes do not do anything useful, and for historical reasons there are no corresponding IDL attributes on area elements. Omit them altogether.',
|
|
46927
|
-
},
|
|
46928
|
-
{ elements: ['li'], suggestion: 'Use CSS instead.' },
|
|
46929
|
-
{
|
|
46930
|
-
elements: ['menu'],
|
|
46931
|
-
suggestion: 'To implement a custom context menu, use script to handle the contextmenu event. For toolbar menus, omit the attribute.',
|
|
46932
|
-
},
|
|
46933
|
-
{
|
|
46934
|
-
elements: ['style'],
|
|
46935
|
-
suggestion: 'Omit the attribute for CSS; for data blocks, use script as the container instead of style.',
|
|
46936
|
-
},
|
|
46937
|
-
{ elements: ['ul'], suggestion: 'Use CSS instead.' },
|
|
46938
|
-
],
|
|
46939
|
-
typemustmatch: [
|
|
46940
|
-
{
|
|
46941
|
-
elements: ['object'],
|
|
46942
|
-
suggestion: 'Avoid using object elements with untrusted resources.',
|
|
46943
|
-
},
|
|
46944
|
-
],
|
|
46945
|
-
urn: [
|
|
46946
|
-
{
|
|
46947
|
-
elements: ['a', 'link'],
|
|
46948
|
-
suggestion: 'Specify the preferred persistent identifier using the href attribute instead.',
|
|
46949
|
-
},
|
|
46950
|
-
],
|
|
46951
|
-
usemap: [
|
|
46952
|
-
{
|
|
46953
|
-
elements: ['input', 'object'],
|
|
46954
|
-
suggestion: 'Use the img element for image maps.',
|
|
46955
|
-
},
|
|
46956
|
-
],
|
|
46957
|
-
valign: [
|
|
46958
|
-
{
|
|
46959
|
-
elements: ['col', 'tbody', 'thead', 'tfoot', 'td', 'th', 'tr'],
|
|
46960
|
-
suggestion: 'Use CSS instead.',
|
|
46961
|
-
},
|
|
46962
|
-
],
|
|
46963
|
-
version: [{ elements: ['html'], suggestion: 'Unnecessary. Omit it altogether.' }],
|
|
46964
|
-
vlink: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
46965
|
-
vspace: [
|
|
46966
|
-
{
|
|
46967
|
-
elements: ['embed', 'iframe', 'input', 'img', 'object'],
|
|
46968
|
-
suggestion: 'Use CSS instead.',
|
|
46969
|
-
},
|
|
46970
|
-
],
|
|
46971
|
-
width: [
|
|
46972
|
-
{
|
|
46973
|
-
elements: ['col', 'hr', 'pre', 'table', 'td', 'th'],
|
|
46974
|
-
suggestion: 'Use CSS instead.',
|
|
46975
|
-
},
|
|
46976
|
-
],
|
|
46977
|
-
rules: [{ elements: ['table'], suggestion: 'Use CSS instead.' }],
|
|
46978
|
-
};
|
|
46979
|
-
|
|
46980
|
-
const MESSAGE_ID$d = 'obsolete';
|
|
46981
|
-
const rule$H = createRule({
|
|
46982
|
-
name: 'no-obsolete-attrs',
|
|
46983
|
-
rule: {
|
|
46984
|
-
create(context) {
|
|
46985
|
-
return {
|
|
46986
|
-
Element(rawNode) {
|
|
46987
|
-
const node = rawNode;
|
|
46988
|
-
const elementName = node.name.toLowerCase();
|
|
46989
|
-
for (const attr of node.attributes) {
|
|
46990
|
-
if (!attr.valueSpan) {
|
|
46991
|
-
continue;
|
|
46992
|
-
}
|
|
46993
|
-
const attrName = attr.name.toLowerCase();
|
|
46994
|
-
const obsoleteConfigs = OBSOLETE_HTML_ATTRS[attrName];
|
|
46995
|
-
if (!obsoleteConfigs) {
|
|
46996
|
-
continue;
|
|
46997
|
-
}
|
|
46998
|
-
const obsoleteConfig = obsoleteConfigs.find((config) => config.elements.includes('*') ||
|
|
46999
|
-
config.elements.includes(elementName));
|
|
47000
|
-
if (!obsoleteConfig) {
|
|
47001
|
-
continue;
|
|
47002
|
-
}
|
|
47003
|
-
context.report({
|
|
47004
|
-
data: {
|
|
47005
|
-
attr: attrName,
|
|
47006
|
-
element: elementName,
|
|
47007
|
-
suggestion: obsoleteConfig.suggestion,
|
|
47008
|
-
},
|
|
47009
|
-
loc: sourceSpanToLoc(attr.keySpan ?? attr.sourceSpan),
|
|
47010
|
-
messageId: MESSAGE_ID$d,
|
|
47011
|
-
});
|
|
47012
|
-
}
|
|
47013
|
-
},
|
|
47014
|
-
};
|
|
47015
|
-
},
|
|
47016
|
-
meta: {
|
|
47017
|
-
docs: { description: 'Disallow obsolete HTML attributes' },
|
|
47018
|
-
messages: {
|
|
47019
|
-
[MESSAGE_ID$d]: 'The {{attr}} attribute on <{{element}}> is obsolete. {{suggestion}}',
|
|
47020
|
-
},
|
|
47021
|
-
schema: [],
|
|
47022
|
-
type: 'problem',
|
|
47023
|
-
},
|
|
47024
|
-
},
|
|
47025
|
-
});
|
|
47026
|
-
|
|
47027
|
-
const OBSOLETE_HTML_TAGS = new Set([
|
|
47028
|
-
'acronym',
|
|
47029
|
-
'applet',
|
|
47030
|
-
'basefont',
|
|
47031
|
-
'bgsound',
|
|
47032
|
-
'big',
|
|
47033
|
-
'blink',
|
|
47034
|
-
'center',
|
|
47035
|
-
'dir',
|
|
47036
|
-
'font',
|
|
47037
|
-
'frame',
|
|
47038
|
-
'frameset',
|
|
47039
|
-
'isindex',
|
|
47040
|
-
'keygen',
|
|
47041
|
-
'listing',
|
|
47042
|
-
'marquee',
|
|
47043
|
-
'menuitem',
|
|
47044
|
-
'multicol',
|
|
47045
|
-
'nextid',
|
|
47046
|
-
'nobr',
|
|
47047
|
-
'noembed',
|
|
47048
|
-
'noframes',
|
|
47049
|
-
'plaintext',
|
|
47050
|
-
'rb',
|
|
47051
|
-
'rtc',
|
|
47052
|
-
'spacer',
|
|
47053
|
-
'strike',
|
|
47054
|
-
'tt',
|
|
47055
|
-
'xmp',
|
|
47056
|
-
]);
|
|
47057
|
-
|
|
47058
|
-
const MESSAGE_ID$c = 'unexpected';
|
|
47059
|
-
const rule$G = createRule({
|
|
47060
|
-
name: 'no-obsolete-tags',
|
|
47061
|
-
rule: {
|
|
47062
|
-
create(context) {
|
|
47063
|
-
return {
|
|
47064
|
-
Element(rawNode) {
|
|
47065
|
-
const node = rawNode;
|
|
47066
|
-
if (!OBSOLETE_HTML_TAGS.has(node.name)) {
|
|
47067
|
-
return;
|
|
47068
|
-
}
|
|
47069
|
-
context.report({
|
|
47070
|
-
data: { tag: node.name },
|
|
47071
|
-
loc: sourceSpanToLoc(node.startSourceSpan),
|
|
47072
|
-
messageId: MESSAGE_ID$c,
|
|
47073
|
-
});
|
|
47074
|
-
},
|
|
47075
|
-
};
|
|
47076
|
-
},
|
|
47077
|
-
meta: {
|
|
47078
|
-
docs: { description: 'Disallow obsolete HTML tags' },
|
|
47079
|
-
messages: { [MESSAGE_ID$c]: 'Unexpected use of obsolete tag <{{tag}}>' },
|
|
47080
|
-
schema: [],
|
|
47081
|
-
type: 'problem',
|
|
47082
|
-
},
|
|
47083
|
-
},
|
|
47084
|
-
});
|
|
47085
|
-
|
|
47086
|
-
const MESSAGE_IDS$2 = {
|
|
47087
|
-
MISSING: 'missing',
|
|
47088
|
-
UNEXPECTED: 'unexpected',
|
|
47089
|
-
};
|
|
47090
|
-
const EXPECTED_QUOTE = '"';
|
|
47091
|
-
const SINGLE_QUOTE = "'";
|
|
47092
|
-
const DOUBLE_QUOTE = '"';
|
|
47093
|
-
function isQuotableAttribute(attr) {
|
|
47094
|
-
return 'sourceSpan' in attr;
|
|
47095
|
-
}
|
|
47096
|
-
const rule$F = createRule({
|
|
47097
|
-
name: 'quotes',
|
|
47098
|
-
rule: {
|
|
47099
|
-
create(context) {
|
|
47100
|
-
const sourceText = context.sourceCode.getText();
|
|
47101
|
-
return {
|
|
47102
|
-
Element(rawNode) {
|
|
47103
|
-
const node = rawNode;
|
|
47104
|
-
for (const attr of [
|
|
47105
|
-
...node.attributes,
|
|
47106
|
-
...node.inputs,
|
|
47107
|
-
...node.outputs,
|
|
47108
|
-
].filter(isQuotableAttribute)) {
|
|
47109
|
-
const valueSpan = getAttributeValueSpan(attr);
|
|
47110
|
-
if (!valueSpan) {
|
|
47111
|
-
continue;
|
|
47112
|
-
}
|
|
47113
|
-
const rawValue = sourceText.slice(valueSpan.start.offset, valueSpan.end.offset);
|
|
47114
|
-
if (rawValue.includes(EXPECTED_QUOTE)) {
|
|
47115
|
-
continue;
|
|
47116
|
-
}
|
|
47117
|
-
const openingQuote = sourceText[valueSpan.start.offset - 1];
|
|
47118
|
-
const closingQuote = sourceText[valueSpan.end.offset];
|
|
47119
|
-
const hasMatchingQuotes = (openingQuote === SINGLE_QUOTE ||
|
|
47120
|
-
openingQuote === DOUBLE_QUOTE) &&
|
|
47121
|
-
openingQuote === closingQuote;
|
|
47122
|
-
if (hasMatchingQuotes && openingQuote !== EXPECTED_QUOTE) {
|
|
47123
|
-
context.report({
|
|
47124
|
-
data: {
|
|
47125
|
-
actual: `single(${openingQuote})`,
|
|
47126
|
-
expected: `double(${EXPECTED_QUOTE})`,
|
|
47127
|
-
},
|
|
47128
|
-
fix: (fixer) => fixer.replaceTextRange([
|
|
47129
|
-
valueSpan.start.offset - 1,
|
|
47130
|
-
valueSpan.end.offset + 1,
|
|
47131
|
-
], `${EXPECTED_QUOTE}${rawValue}${EXPECTED_QUOTE}`),
|
|
47132
|
-
loc: sourceSpanToLoc(attr.sourceSpan),
|
|
47133
|
-
messageId: MESSAGE_IDS$2.UNEXPECTED,
|
|
47134
|
-
});
|
|
47135
|
-
continue;
|
|
47136
|
-
}
|
|
47137
|
-
if (!hasMatchingQuotes) {
|
|
47138
|
-
context.report({
|
|
47139
|
-
data: { expected: `double(${EXPECTED_QUOTE})` },
|
|
47140
|
-
fix: (fixer) => fixer.replaceTextRange([valueSpan.start.offset, valueSpan.end.offset], `${EXPECTED_QUOTE}${rawValue}${EXPECTED_QUOTE}`),
|
|
47141
|
-
loc: sourceSpanToLoc(attr.sourceSpan),
|
|
47142
|
-
messageId: MESSAGE_IDS$2.MISSING,
|
|
47143
|
-
});
|
|
47144
|
-
}
|
|
47145
|
-
}
|
|
47146
|
-
},
|
|
47147
|
-
};
|
|
47148
|
-
},
|
|
47149
|
-
meta: {
|
|
47150
|
-
docs: { description: 'Enforce double quotes around HTML attribute values' },
|
|
47151
|
-
fixable: 'code',
|
|
47152
|
-
messages: {
|
|
47153
|
-
[MESSAGE_IDS$2.MISSING]: 'Expected {{expected}} quotes but no quotes found.',
|
|
47154
|
-
[MESSAGE_IDS$2.UNEXPECTED]: 'Expected {{expected}} quotes but found {{actual}}.',
|
|
47155
|
-
},
|
|
47156
|
-
schema: [],
|
|
47157
|
-
type: 'layout',
|
|
47158
|
-
},
|
|
47159
|
-
},
|
|
47160
|
-
});
|
|
47161
|
-
|
|
47162
|
-
function sameOrder(a, b) {
|
|
47163
|
-
return a.length === b.length && a.every((value, index) => value === b[index]);
|
|
47164
|
-
}
|
|
47165
|
-
|
|
47166
|
-
const config$5 = {
|
|
47167
|
-
create(context) {
|
|
47168
|
-
const order = context.options[0] || {};
|
|
47169
|
-
return {
|
|
47170
|
-
ClassDeclaration(node) {
|
|
47171
|
-
const decorators = Array.from(node.decorators ?? []);
|
|
47172
|
-
for (const decorator of decorators) {
|
|
47173
|
-
const { expression } = decorator;
|
|
47174
|
-
const decoratorName = expression.callee?.name ?? '';
|
|
47175
|
-
if (decoratorName in (order || {})) {
|
|
47176
|
-
const orderList = order[decoratorName];
|
|
47177
|
-
const decoratorArguments = Array.from(expression.arguments ?? []);
|
|
47178
|
-
for (const argument of decoratorArguments) {
|
|
47179
|
-
const properties = Array.from(argument.properties ?? []);
|
|
47180
|
-
const current = properties
|
|
47181
|
-
.map((prop) => prop.key?.name)
|
|
47182
|
-
.filter(Boolean);
|
|
47183
|
-
const correct = getCorrectOrderRelative(orderList, current);
|
|
47184
|
-
if (!sameOrder(correct, current.filter((item) => correct.includes(item)))) {
|
|
47185
|
-
context.report({
|
|
47186
|
-
fix: (fixer) => {
|
|
47187
|
-
const fileContent = context.sourceCode.text;
|
|
47188
|
-
const forgottenProps = current.filter((key) => !orderList.includes(key));
|
|
47189
|
-
const sortedDecoratorProperties = [
|
|
47190
|
-
...correct,
|
|
47191
|
-
...forgottenProps,
|
|
47192
|
-
].map((key) => properties.find((prop) => prop.key.name === key));
|
|
47193
|
-
const newDecoratorArgument = `{${sortedDecoratorProperties
|
|
47194
|
-
.map(({ range }) => fileContent.slice(...range))
|
|
47195
|
-
.toString()}}`;
|
|
47196
|
-
return fixer.replaceTextRange(argument.range, newDecoratorArgument);
|
|
47197
|
-
},
|
|
47198
|
-
message: `Incorrect order keys in @${decoratorName} decorator, please sort by [${correct.join(' -> ')}]`,
|
|
47199
|
-
node: expression,
|
|
47200
|
-
});
|
|
47201
|
-
}
|
|
47202
|
-
}
|
|
47203
|
-
}
|
|
47204
|
-
}
|
|
47205
|
-
},
|
|
47206
|
-
};
|
|
47207
|
-
},
|
|
47208
|
-
meta: {
|
|
47209
|
-
fixable: 'code',
|
|
47210
|
-
schema: [
|
|
47211
|
-
{
|
|
47212
|
-
additionalProperties: true,
|
|
47213
|
-
description: 'Decorators names and their keys order',
|
|
47214
|
-
type: 'object',
|
|
47215
|
-
},
|
|
47216
|
-
],
|
|
47217
|
-
type: 'problem',
|
|
47218
|
-
},
|
|
47219
|
-
};
|
|
47220
|
-
function getCorrectOrderRelative(correct, current) {
|
|
47221
|
-
return correct.filter((item) => current.includes(item));
|
|
47222
|
-
}
|
|
47223
|
-
const rule$E = createRule({
|
|
47224
|
-
name: 'decorator-key-sort',
|
|
47225
|
-
rule: config$5,
|
|
47226
|
-
});
|
|
47227
|
-
|
|
47228
46498
|
function isObject(node) {
|
|
47229
46499
|
return node?.type === dist$2.AST_NODE_TYPES.ObjectExpression;
|
|
47230
46500
|
}
|
|
@@ -47382,7 +46652,7 @@ const PRESETS = {
|
|
|
47382
46652
|
$VUE: ['$CLASS', '$ID', '$VUE_ATTRIBUTE'],
|
|
47383
46653
|
$VUE_ATTRIBUTE: /^v-/,
|
|
47384
46654
|
};
|
|
47385
|
-
const rule$
|
|
46655
|
+
const rule$J = createRule({
|
|
47386
46656
|
create(context, [options]) {
|
|
47387
46657
|
const sourceCode = context.sourceCode;
|
|
47388
46658
|
const settings = {
|
|
@@ -47664,7 +46934,7 @@ const DIRECTIONAL_TO_LOGICAL = {
|
|
|
47664
46934
|
top: 'inset-block-start',
|
|
47665
46935
|
};
|
|
47666
46936
|
const STYLE_PREFIX = 'style.';
|
|
47667
|
-
const MESSAGE_ID$
|
|
46937
|
+
const MESSAGE_ID$f = 'html-logical-properties';
|
|
47668
46938
|
const MESSAGE = `
|
|
47669
46939
|
Use logical CSS properties instead of directional properties. Replace:
|
|
47670
46940
|
• left → inset-inline-start
|
|
@@ -47702,7 +46972,7 @@ const config$4 = {
|
|
|
47702
46972
|
context.report({
|
|
47703
46973
|
fix: (fixer) => fixer.replaceTextRange([propertyStart, propertyEnd], logicalProperty),
|
|
47704
46974
|
loc: sourceSpanToLoc(keySpan),
|
|
47705
|
-
messageId: MESSAGE_ID$
|
|
46975
|
+
messageId: MESSAGE_ID$f,
|
|
47706
46976
|
});
|
|
47707
46977
|
},
|
|
47708
46978
|
};
|
|
@@ -47710,17 +46980,17 @@ const config$4 = {
|
|
|
47710
46980
|
meta: {
|
|
47711
46981
|
docs: { description: MESSAGE },
|
|
47712
46982
|
fixable: 'code',
|
|
47713
|
-
messages: { [MESSAGE_ID$
|
|
46983
|
+
messages: { [MESSAGE_ID$f]: MESSAGE },
|
|
47714
46984
|
schema: [],
|
|
47715
46985
|
type: 'suggestion',
|
|
47716
46986
|
},
|
|
47717
46987
|
};
|
|
47718
|
-
const rule$
|
|
46988
|
+
const rule$I = createRule({
|
|
47719
46989
|
name: 'html-logical-properties',
|
|
47720
46990
|
rule: config$4,
|
|
47721
46991
|
});
|
|
47722
46992
|
|
|
47723
|
-
const MESSAGE_ID$
|
|
46993
|
+
const MESSAGE_ID$e = 'invalid-injection-token-description';
|
|
47724
46994
|
const ERROR_MESSAGE$3 = "InjectionToken's description should contain token's name";
|
|
47725
46995
|
const NG_DEV_MODE = 'ngDevMode';
|
|
47726
46996
|
function getVariableName(node) {
|
|
@@ -47790,7 +47060,7 @@ function getNgDevModeDeclarationFix(program, fixer) {
|
|
|
47790
47060
|
}
|
|
47791
47061
|
return fixer.insertTextBeforeRange([0, 0], 'declare const ngDevMode: boolean;\n');
|
|
47792
47062
|
}
|
|
47793
|
-
const rule$
|
|
47063
|
+
const rule$H = createRule({
|
|
47794
47064
|
create(context) {
|
|
47795
47065
|
const { sourceCode } = context;
|
|
47796
47066
|
const program = sourceCode.ast;
|
|
@@ -47822,7 +47092,7 @@ const rule$B = createRule({
|
|
|
47822
47092
|
}
|
|
47823
47093
|
return fixes;
|
|
47824
47094
|
},
|
|
47825
|
-
messageId: MESSAGE_ID$
|
|
47095
|
+
messageId: MESSAGE_ID$e,
|
|
47826
47096
|
node: description,
|
|
47827
47097
|
});
|
|
47828
47098
|
}
|
|
@@ -47832,7 +47102,7 @@ const rule$B = createRule({
|
|
|
47832
47102
|
meta: {
|
|
47833
47103
|
docs: { description: ERROR_MESSAGE$3 },
|
|
47834
47104
|
fixable: 'code',
|
|
47835
|
-
messages: { [MESSAGE_ID$
|
|
47105
|
+
messages: { [MESSAGE_ID$e]: ERROR_MESSAGE$3 },
|
|
47836
47106
|
schema: [],
|
|
47837
47107
|
type: 'problem',
|
|
47838
47108
|
},
|
|
@@ -47844,7 +47114,7 @@ function getResolvedVariable(sourceCode, node) {
|
|
|
47844
47114
|
const reference = scope.references.find((item) => item.identifier === node);
|
|
47845
47115
|
return reference?.resolved ?? null;
|
|
47846
47116
|
}
|
|
47847
|
-
const rule$
|
|
47117
|
+
const rule$G = createRule({
|
|
47848
47118
|
create(context) {
|
|
47849
47119
|
const { sourceCode } = context;
|
|
47850
47120
|
const namespaceImports = new Map();
|
|
@@ -47920,7 +47190,7 @@ const rule$A = createRule({
|
|
|
47920
47190
|
name: 'no-commonjs-import-patterns',
|
|
47921
47191
|
});
|
|
47922
47192
|
|
|
47923
|
-
const MESSAGE_ID$
|
|
47193
|
+
const MESSAGE_ID$d = 'no-deep-imports';
|
|
47924
47194
|
const ERROR_MESSAGE$2 = 'Deep imports of Taiga UI packages are prohibited';
|
|
47925
47195
|
const CODE_EXTENSIONS = new Set([
|
|
47926
47196
|
'.cjs',
|
|
@@ -47939,7 +47209,7 @@ const DEFAULT_OPTIONS = {
|
|
|
47939
47209
|
importDeclaration: '^@taiga-ui*',
|
|
47940
47210
|
projectName: String.raw `(?<=^@taiga-ui/)([-\w]+)`,
|
|
47941
47211
|
};
|
|
47942
|
-
const rule$
|
|
47212
|
+
const rule$F = createRule({
|
|
47943
47213
|
create(context) {
|
|
47944
47214
|
const { currentProject, deepImport, ignoreImports, importDeclaration, projectName, } = { ...DEFAULT_OPTIONS, ...context.options[0] };
|
|
47945
47215
|
const hasNonCodeExtension = (source) => {
|
|
@@ -47981,7 +47251,7 @@ const rule$z = createRule({
|
|
|
47981
47251
|
const [start, end] = node.source.range;
|
|
47982
47252
|
return fixer.replaceTextRange([start + 1, end - 1], importSource.replaceAll(new RegExp(deepImport, 'g'), ''));
|
|
47983
47253
|
},
|
|
47984
|
-
messageId: MESSAGE_ID$
|
|
47254
|
+
messageId: MESSAGE_ID$d,
|
|
47985
47255
|
node: node.source,
|
|
47986
47256
|
});
|
|
47987
47257
|
},
|
|
@@ -47991,7 +47261,7 @@ const rule$z = createRule({
|
|
|
47991
47261
|
defaultOptions: [DEFAULT_OPTIONS],
|
|
47992
47262
|
docs: { description: ERROR_MESSAGE$2 },
|
|
47993
47263
|
fixable: 'code',
|
|
47994
|
-
messages: { [MESSAGE_ID$
|
|
47264
|
+
messages: { [MESSAGE_ID$d]: ERROR_MESSAGE$2 },
|
|
47995
47265
|
schema: [
|
|
47996
47266
|
{
|
|
47997
47267
|
additionalProperties: false,
|
|
@@ -248675,7 +247945,7 @@ const nearestFileUpCache = new Map();
|
|
|
248675
247945
|
const markerCache = new Map();
|
|
248676
247946
|
const indexFileCache = new Map();
|
|
248677
247947
|
const indexExportsCache = new Map();
|
|
248678
|
-
const rule$
|
|
247948
|
+
const rule$E = createRule({
|
|
248679
247949
|
create(context) {
|
|
248680
247950
|
const parserServices = dist$3.ESLintUtils.getParserServices(context);
|
|
248681
247951
|
const program = parserServices.program;
|
|
@@ -248868,6 +248138,133 @@ function stripKnownExtensions(filePathOrSpecifier) {
|
|
|
248868
248138
|
return filePathOrSpecifier.replace(/\.(?:d\.ts|ts|tsx|js|jsx|mjs|cjs)$/, '');
|
|
248869
248139
|
}
|
|
248870
248140
|
|
|
248141
|
+
const noDuplicateAttributesRule = angular.templatePlugin.rules?.['no-duplicate-attributes'];
|
|
248142
|
+
if (!noDuplicateAttributesRule) {
|
|
248143
|
+
throw new Error('angular-eslint template rule "no-duplicate-attributes" is not available');
|
|
248144
|
+
}
|
|
248145
|
+
const rule$D = createRule({
|
|
248146
|
+
name: 'no-duplicate-attrs',
|
|
248147
|
+
rule: noDuplicateAttributesRule,
|
|
248148
|
+
});
|
|
248149
|
+
|
|
248150
|
+
const MESSAGE_ID$c = 'duplicateId';
|
|
248151
|
+
const rule$C = createRule({
|
|
248152
|
+
name: 'no-duplicate-id',
|
|
248153
|
+
rule: {
|
|
248154
|
+
create(context) {
|
|
248155
|
+
const ids = new Map();
|
|
248156
|
+
return {
|
|
248157
|
+
Element(rawNode) {
|
|
248158
|
+
const node = rawNode;
|
|
248159
|
+
const idAttr = node.attributes.find((attr) => attr.name === 'id');
|
|
248160
|
+
if (!idAttr) {
|
|
248161
|
+
return;
|
|
248162
|
+
}
|
|
248163
|
+
ids.set(idAttr.value, [...(ids.get(idAttr.value) ?? []), idAttr]);
|
|
248164
|
+
},
|
|
248165
|
+
'Program:exit'() {
|
|
248166
|
+
for (const [id, attrs] of ids) {
|
|
248167
|
+
if (attrs.length <= 1) {
|
|
248168
|
+
continue;
|
|
248169
|
+
}
|
|
248170
|
+
for (const attr of attrs) {
|
|
248171
|
+
context.report({
|
|
248172
|
+
data: { id },
|
|
248173
|
+
loc: sourceSpanToLoc(attr.sourceSpan),
|
|
248174
|
+
messageId: MESSAGE_ID$c,
|
|
248175
|
+
});
|
|
248176
|
+
}
|
|
248177
|
+
}
|
|
248178
|
+
},
|
|
248179
|
+
};
|
|
248180
|
+
},
|
|
248181
|
+
meta: {
|
|
248182
|
+
docs: { description: 'Disallow duplicate static id attributes' },
|
|
248183
|
+
messages: { [MESSAGE_ID$c]: "The id '{{id}}' is duplicated." },
|
|
248184
|
+
schema: [],
|
|
248185
|
+
type: 'problem',
|
|
248186
|
+
},
|
|
248187
|
+
},
|
|
248188
|
+
});
|
|
248189
|
+
|
|
248190
|
+
const MESSAGE_ID$b = 'duplicateTag';
|
|
248191
|
+
function findAttr(node, attrName) {
|
|
248192
|
+
return node.attributes.find((attr) => attr.name === attrName);
|
|
248193
|
+
}
|
|
248194
|
+
function getTrackingKey(node) {
|
|
248195
|
+
if (node.name === 'title' || node.name === 'base') {
|
|
248196
|
+
return node.name;
|
|
248197
|
+
}
|
|
248198
|
+
if (node.name === 'meta') {
|
|
248199
|
+
if (findAttr(node, 'charset')) {
|
|
248200
|
+
return 'meta[charset]';
|
|
248201
|
+
}
|
|
248202
|
+
if (findAttr(node, 'name')?.value === 'viewport') {
|
|
248203
|
+
return 'meta[name=viewport]';
|
|
248204
|
+
}
|
|
248205
|
+
}
|
|
248206
|
+
if (node.name === 'link' &&
|
|
248207
|
+
findAttr(node, 'rel')?.value === 'canonical' &&
|
|
248208
|
+
findAttr(node, 'href')) {
|
|
248209
|
+
return 'link[rel=canonical]';
|
|
248210
|
+
}
|
|
248211
|
+
return null;
|
|
248212
|
+
}
|
|
248213
|
+
const rule$B = createRule({
|
|
248214
|
+
name: 'no-duplicate-in-head',
|
|
248215
|
+
rule: {
|
|
248216
|
+
create(context) {
|
|
248217
|
+
const nodes = new Map();
|
|
248218
|
+
let headDepth = 0;
|
|
248219
|
+
return {
|
|
248220
|
+
Element(rawNode) {
|
|
248221
|
+
const node = rawNode;
|
|
248222
|
+
if (node.name === 'head') {
|
|
248223
|
+
headDepth++;
|
|
248224
|
+
return;
|
|
248225
|
+
}
|
|
248226
|
+
if (headDepth === 0) {
|
|
248227
|
+
return;
|
|
248228
|
+
}
|
|
248229
|
+
const trackingKey = getTrackingKey(node);
|
|
248230
|
+
if (!trackingKey) {
|
|
248231
|
+
return;
|
|
248232
|
+
}
|
|
248233
|
+
nodes.set(trackingKey, [...(nodes.get(trackingKey) ?? []), node]);
|
|
248234
|
+
},
|
|
248235
|
+
'Element:exit'(rawNode) {
|
|
248236
|
+
const node = rawNode;
|
|
248237
|
+
if (node.name === 'head') {
|
|
248238
|
+
headDepth--;
|
|
248239
|
+
}
|
|
248240
|
+
},
|
|
248241
|
+
'Program:exit'() {
|
|
248242
|
+
for (const [tag, duplicates] of nodes) {
|
|
248243
|
+
if (duplicates.length <= 1) {
|
|
248244
|
+
continue;
|
|
248245
|
+
}
|
|
248246
|
+
for (const duplicate of duplicates.slice(1)) {
|
|
248247
|
+
context.report({
|
|
248248
|
+
data: { tag },
|
|
248249
|
+
loc: sourceSpanToLoc(duplicate.startSourceSpan),
|
|
248250
|
+
messageId: MESSAGE_ID$b,
|
|
248251
|
+
});
|
|
248252
|
+
}
|
|
248253
|
+
}
|
|
248254
|
+
},
|
|
248255
|
+
};
|
|
248256
|
+
},
|
|
248257
|
+
meta: {
|
|
248258
|
+
docs: {
|
|
248259
|
+
description: 'Disallow duplicate title/base/meta/link tags inside head',
|
|
248260
|
+
},
|
|
248261
|
+
messages: { [MESSAGE_ID$b]: 'Duplicate <{{tag}}> tag in <head>.' },
|
|
248262
|
+
schema: [],
|
|
248263
|
+
type: 'problem',
|
|
248264
|
+
},
|
|
248265
|
+
},
|
|
248266
|
+
});
|
|
248267
|
+
|
|
248871
248268
|
function isFunctionLike(node) {
|
|
248872
248269
|
return (node.type === dist$3.AST_NODE_TYPES.ArrowFunctionExpression ||
|
|
248873
248270
|
node.type === dist$3.AST_NODE_TYPES.FunctionDeclaration ||
|
|
@@ -249412,7 +248809,7 @@ function getTypeAwareRuleContext(context) {
|
|
|
249412
248809
|
};
|
|
249413
248810
|
}
|
|
249414
248811
|
|
|
249415
|
-
const rule$
|
|
248812
|
+
const rule$A = createUntrackedRule({
|
|
249416
248813
|
create(context) {
|
|
249417
248814
|
const { checker, esTreeNodeToTSNodeMap, program } = getTypeAwareRuleContext(context);
|
|
249418
248815
|
const signalNodeMap = esTreeNodeToTSNodeMap;
|
|
@@ -249450,7 +248847,7 @@ const rule$x = createUntrackedRule({
|
|
|
249450
248847
|
name: 'no-fully-untracked-effect',
|
|
249451
248848
|
});
|
|
249452
248849
|
|
|
249453
|
-
const MESSAGE_ID$
|
|
248850
|
+
const MESSAGE_ID$a = 'no-href-with-router-link';
|
|
249454
248851
|
const ERROR_MESSAGE$1 = 'Do not use href and routerLink attributes together on the same element';
|
|
249455
248852
|
const config$3 = {
|
|
249456
248853
|
create(context) {
|
|
@@ -249472,7 +248869,7 @@ const config$3 = {
|
|
|
249472
248869
|
hrefAttr.sourceSpan.end.offset,
|
|
249473
248870
|
]),
|
|
249474
248871
|
loc: sourceSpanToLoc(hrefAttr.sourceSpan),
|
|
249475
|
-
messageId: MESSAGE_ID$
|
|
248872
|
+
messageId: MESSAGE_ID$a,
|
|
249476
248873
|
});
|
|
249477
248874
|
},
|
|
249478
248875
|
};
|
|
@@ -249480,12 +248877,12 @@ const config$3 = {
|
|
|
249480
248877
|
meta: {
|
|
249481
248878
|
docs: { description: ERROR_MESSAGE$1 },
|
|
249482
248879
|
fixable: 'code',
|
|
249483
|
-
messages: { [MESSAGE_ID$
|
|
248880
|
+
messages: { [MESSAGE_ID$a]: ERROR_MESSAGE$1 },
|
|
249484
248881
|
schema: [],
|
|
249485
248882
|
type: 'problem',
|
|
249486
248883
|
},
|
|
249487
248884
|
};
|
|
249488
|
-
const rule$
|
|
248885
|
+
const rule$z = createRule({
|
|
249489
248886
|
name: 'no-href-with-router-link',
|
|
249490
248887
|
rule: config$3,
|
|
249491
248888
|
});
|
|
@@ -249546,7 +248943,7 @@ function getScopeRoot(node) {
|
|
|
249546
248943
|
return (findAncestor(node, (ancestor) => ancestor.type === dist$3.AST_NODE_TYPES.Program || isFunctionLike(ancestor)) ?? node);
|
|
249547
248944
|
}
|
|
249548
248945
|
|
|
249549
|
-
const rule$
|
|
248946
|
+
const rule$y = createRule({
|
|
249550
248947
|
create(context) {
|
|
249551
248948
|
const checkImplicitPublic = (node) => {
|
|
249552
248949
|
const classRef = getEnclosingClass(node);
|
|
@@ -249608,7 +249005,7 @@ const rule$v = createRule({
|
|
|
249608
249005
|
name: 'no-implicit-public',
|
|
249609
249006
|
});
|
|
249610
249007
|
|
|
249611
|
-
const rule$
|
|
249008
|
+
const rule$x = createRule({
|
|
249612
249009
|
create(context) {
|
|
249613
249010
|
const { sourceCode } = context;
|
|
249614
249011
|
return {
|
|
@@ -249666,7 +249063,7 @@ function isInfiniteLoopLiteral(node) {
|
|
|
249666
249063
|
function isInfiniteLoopTest(test) {
|
|
249667
249064
|
return test === null || isInfiniteLoopLiteral(test);
|
|
249668
249065
|
}
|
|
249669
|
-
const rule$
|
|
249066
|
+
const rule$w = createRule({
|
|
249670
249067
|
create(context) {
|
|
249671
249068
|
return {
|
|
249672
249069
|
DoWhileStatement(node) {
|
|
@@ -249711,7 +249108,7 @@ const rule$t = createRule({
|
|
|
249711
249108
|
});
|
|
249712
249109
|
|
|
249713
249110
|
const LEGACY_PEER_DEPS_PATTERN = /^legacy-peer-deps\s*=\s*true$/i;
|
|
249714
|
-
const rule$
|
|
249111
|
+
const rule$v = createRule({
|
|
249715
249112
|
create(context) {
|
|
249716
249113
|
return {
|
|
249717
249114
|
Program(node) {
|
|
@@ -249749,7 +249146,534 @@ const rule$s = createRule({
|
|
|
249749
249146
|
name: 'no-legacy-peer-deps',
|
|
249750
249147
|
});
|
|
249751
249148
|
|
|
249752
|
-
const
|
|
249149
|
+
const OBSOLETE_HTML_ATTRS = {
|
|
249150
|
+
abbr: [
|
|
249151
|
+
{
|
|
249152
|
+
elements: ['td'],
|
|
249153
|
+
suggestion: "Use text that begins in an unambiguous and terse manner, and include any more elaborate text after that. The title attribute can also be useful in including more detailed text, so that the cell's contents can be made terse. If it's a heading, use th (which has an abbr attribute).",
|
|
249154
|
+
},
|
|
249155
|
+
],
|
|
249156
|
+
accept: [
|
|
249157
|
+
{
|
|
249158
|
+
elements: ['form'],
|
|
249159
|
+
suggestion: 'Use the accept attribute directly on the input elements instead.',
|
|
249160
|
+
},
|
|
249161
|
+
],
|
|
249162
|
+
align: [
|
|
249163
|
+
{
|
|
249164
|
+
elements: [
|
|
249165
|
+
'caption',
|
|
249166
|
+
'col',
|
|
249167
|
+
'div',
|
|
249168
|
+
'embed',
|
|
249169
|
+
'h1',
|
|
249170
|
+
'h2',
|
|
249171
|
+
'h3',
|
|
249172
|
+
'h4',
|
|
249173
|
+
'h5',
|
|
249174
|
+
'h6',
|
|
249175
|
+
'hr',
|
|
249176
|
+
'iframe',
|
|
249177
|
+
'input',
|
|
249178
|
+
'img',
|
|
249179
|
+
'legend',
|
|
249180
|
+
'object',
|
|
249181
|
+
'p',
|
|
249182
|
+
'table',
|
|
249183
|
+
'tbody',
|
|
249184
|
+
'thead',
|
|
249185
|
+
'tfoot',
|
|
249186
|
+
'td',
|
|
249187
|
+
'th',
|
|
249188
|
+
'tr',
|
|
249189
|
+
],
|
|
249190
|
+
suggestion: 'Use CSS instead.',
|
|
249191
|
+
},
|
|
249192
|
+
],
|
|
249193
|
+
alink: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
249194
|
+
allowtransparency: [{ elements: ['iframe'], suggestion: 'Use CSS instead.' }],
|
|
249195
|
+
archive: [
|
|
249196
|
+
{
|
|
249197
|
+
elements: ['object'],
|
|
249198
|
+
suggestion: 'Use the data and type attributes to invoke plugins.',
|
|
249199
|
+
},
|
|
249200
|
+
],
|
|
249201
|
+
axis: [
|
|
249202
|
+
{
|
|
249203
|
+
elements: ['td', 'th'],
|
|
249204
|
+
suggestion: 'Use the scope attribute on the relevant th.',
|
|
249205
|
+
},
|
|
249206
|
+
],
|
|
249207
|
+
background: [
|
|
249208
|
+
{
|
|
249209
|
+
elements: ['body', 'table', 'thead', 'tbody', 'tfoot', 'tr', 'td', 'th'],
|
|
249210
|
+
suggestion: 'Use CSS instead.',
|
|
249211
|
+
},
|
|
249212
|
+
],
|
|
249213
|
+
bgcolor: [
|
|
249214
|
+
{
|
|
249215
|
+
elements: ['body', 'table', 'td', 'th', 'tr'],
|
|
249216
|
+
suggestion: 'Use CSS instead.',
|
|
249217
|
+
},
|
|
249218
|
+
],
|
|
249219
|
+
border: [
|
|
249220
|
+
{
|
|
249221
|
+
elements: ['input', 'img', 'object', 'table'],
|
|
249222
|
+
suggestion: 'Use CSS instead.',
|
|
249223
|
+
},
|
|
249224
|
+
],
|
|
249225
|
+
bordercolor: [{ elements: ['table'], suggestion: 'Use CSS instead.' }],
|
|
249226
|
+
bottommargin: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
249227
|
+
cellpadding: [{ elements: ['table'], suggestion: 'Use CSS instead.' }],
|
|
249228
|
+
cellspacing: [{ elements: ['table'], suggestion: 'Use CSS instead.' }],
|
|
249229
|
+
char: [
|
|
249230
|
+
{
|
|
249231
|
+
elements: ['col', 'tbody', 'thead', 'tfoot', 'td', 'th', 'tr'],
|
|
249232
|
+
suggestion: 'Use CSS instead.',
|
|
249233
|
+
},
|
|
249234
|
+
],
|
|
249235
|
+
charoff: [
|
|
249236
|
+
{
|
|
249237
|
+
elements: ['col', 'tbody', 'thead', 'tfoot', 'td', 'th', 'tr'],
|
|
249238
|
+
suggestion: 'Use CSS instead.',
|
|
249239
|
+
},
|
|
249240
|
+
],
|
|
249241
|
+
charset: [
|
|
249242
|
+
{
|
|
249243
|
+
elements: ['a', 'link'],
|
|
249244
|
+
suggestion: 'Use an HTTP `Content-Type` header on the linked resource instead.',
|
|
249245
|
+
},
|
|
249246
|
+
{
|
|
249247
|
+
elements: ['script'],
|
|
249248
|
+
suggestion: 'It is redundant to specify it on the script element since it inherits from the document.',
|
|
249249
|
+
},
|
|
249250
|
+
],
|
|
249251
|
+
classid: [
|
|
249252
|
+
{
|
|
249253
|
+
elements: ['object'],
|
|
249254
|
+
suggestion: 'Use the data and type attributes to invoke plugins.',
|
|
249255
|
+
},
|
|
249256
|
+
],
|
|
249257
|
+
clear: [{ elements: ['br'], suggestion: 'Use CSS instead.' }],
|
|
249258
|
+
code: [
|
|
249259
|
+
{
|
|
249260
|
+
elements: ['object'],
|
|
249261
|
+
suggestion: 'Use the data and type attributes to invoke plugins.',
|
|
249262
|
+
},
|
|
249263
|
+
],
|
|
249264
|
+
codebase: [
|
|
249265
|
+
{
|
|
249266
|
+
elements: ['object'],
|
|
249267
|
+
suggestion: 'Use the data and type attributes to invoke plugins.',
|
|
249268
|
+
},
|
|
249269
|
+
],
|
|
249270
|
+
codetype: [
|
|
249271
|
+
{
|
|
249272
|
+
elements: ['object'],
|
|
249273
|
+
suggestion: 'Use the data and type attributes to invoke plugins.',
|
|
249274
|
+
},
|
|
249275
|
+
],
|
|
249276
|
+
color: [{ elements: ['hr'], suggestion: 'Use CSS instead.' }],
|
|
249277
|
+
compact: [
|
|
249278
|
+
{
|
|
249279
|
+
elements: ['dl', 'menu', 'ol', 'ul'],
|
|
249280
|
+
suggestion: 'Use CSS instead.',
|
|
249281
|
+
},
|
|
249282
|
+
],
|
|
249283
|
+
contextmenu: [
|
|
249284
|
+
{
|
|
249285
|
+
elements: ['*'],
|
|
249286
|
+
suggestion: 'To implement a custom context menu, use script to handle the contextmenu event.',
|
|
249287
|
+
},
|
|
249288
|
+
],
|
|
249289
|
+
coords: [{ elements: ['a'], suggestion: 'Use area instead of a for image maps.' }],
|
|
249290
|
+
datafld: [
|
|
249291
|
+
{
|
|
249292
|
+
elements: [
|
|
249293
|
+
'a',
|
|
249294
|
+
'button',
|
|
249295
|
+
'div',
|
|
249296
|
+
'fieldset',
|
|
249297
|
+
'frame',
|
|
249298
|
+
'iframe',
|
|
249299
|
+
'img',
|
|
249300
|
+
'input',
|
|
249301
|
+
'label',
|
|
249302
|
+
'legend',
|
|
249303
|
+
'marquee',
|
|
249304
|
+
'object',
|
|
249305
|
+
'select',
|
|
249306
|
+
'span',
|
|
249307
|
+
'textarea',
|
|
249308
|
+
],
|
|
249309
|
+
suggestion: 'Use script and a mechanism such as XMLHttpRequest to populate the page dynamically.',
|
|
249310
|
+
},
|
|
249311
|
+
],
|
|
249312
|
+
dataformatas: [
|
|
249313
|
+
{
|
|
249314
|
+
elements: [
|
|
249315
|
+
'button',
|
|
249316
|
+
'div',
|
|
249317
|
+
'input',
|
|
249318
|
+
'label',
|
|
249319
|
+
'legend',
|
|
249320
|
+
'marquee',
|
|
249321
|
+
'object',
|
|
249322
|
+
'option',
|
|
249323
|
+
'select',
|
|
249324
|
+
'span',
|
|
249325
|
+
'table',
|
|
249326
|
+
],
|
|
249327
|
+
suggestion: 'Use script and a mechanism such as XMLHttpRequest to populate the page dynamically.',
|
|
249328
|
+
},
|
|
249329
|
+
],
|
|
249330
|
+
datapagesize: [
|
|
249331
|
+
{
|
|
249332
|
+
elements: ['table'],
|
|
249333
|
+
suggestion: 'Unnecessary. Omit it altogether.',
|
|
249334
|
+
},
|
|
249335
|
+
],
|
|
249336
|
+
datasrc: [
|
|
249337
|
+
{
|
|
249338
|
+
elements: [
|
|
249339
|
+
'a',
|
|
249340
|
+
'button',
|
|
249341
|
+
'div',
|
|
249342
|
+
'frame',
|
|
249343
|
+
'iframe',
|
|
249344
|
+
'img',
|
|
249345
|
+
'input',
|
|
249346
|
+
'label',
|
|
249347
|
+
'legend',
|
|
249348
|
+
'marquee',
|
|
249349
|
+
'object',
|
|
249350
|
+
'option',
|
|
249351
|
+
'select',
|
|
249352
|
+
'span',
|
|
249353
|
+
'table',
|
|
249354
|
+
'textarea',
|
|
249355
|
+
],
|
|
249356
|
+
suggestion: 'Use script and a mechanism such as XMLHttpRequest to populate the page dynamically.',
|
|
249357
|
+
},
|
|
249358
|
+
],
|
|
249359
|
+
declare: [
|
|
249360
|
+
{
|
|
249361
|
+
elements: ['object'],
|
|
249362
|
+
suggestion: 'Repeat the object element completely each time the resource is to be reused.',
|
|
249363
|
+
},
|
|
249364
|
+
],
|
|
249365
|
+
dropzone: [
|
|
249366
|
+
{
|
|
249367
|
+
elements: ['*'],
|
|
249368
|
+
suggestion: 'Use script to handle the dragenter and dragover events instead.',
|
|
249369
|
+
},
|
|
249370
|
+
],
|
|
249371
|
+
event: [
|
|
249372
|
+
{
|
|
249373
|
+
elements: ['script'],
|
|
249374
|
+
suggestion: 'Use DOM events mechanisms to register event listeners.',
|
|
249375
|
+
},
|
|
249376
|
+
],
|
|
249377
|
+
for: [
|
|
249378
|
+
{
|
|
249379
|
+
elements: ['script'],
|
|
249380
|
+
suggestion: 'Use DOM events mechanisms to register event listeners.',
|
|
249381
|
+
},
|
|
249382
|
+
],
|
|
249383
|
+
frame: [{ elements: ['table'], suggestion: 'Use CSS instead.' }],
|
|
249384
|
+
frameborder: [{ elements: ['iframe'], suggestion: 'Use CSS instead.' }],
|
|
249385
|
+
framespacing: [{ elements: ['iframe'], suggestion: 'Use CSS instead.' }],
|
|
249386
|
+
height: [
|
|
249387
|
+
{
|
|
249388
|
+
elements: ['table', 'thead', 'tbody', 'tfoot', 'td', 'th', 'tr'],
|
|
249389
|
+
suggestion: 'Use CSS instead.',
|
|
249390
|
+
},
|
|
249391
|
+
],
|
|
249392
|
+
hreflang: [
|
|
249393
|
+
{
|
|
249394
|
+
elements: ['area'],
|
|
249395
|
+
suggestion: 'These attributes do not do anything useful, and for historical reasons there are no corresponding IDL attributes on area elements. Omit them altogether.',
|
|
249396
|
+
},
|
|
249397
|
+
],
|
|
249398
|
+
hspace: [
|
|
249399
|
+
{
|
|
249400
|
+
elements: ['embed', 'iframe', 'input', 'img', 'object'],
|
|
249401
|
+
suggestion: 'Use CSS instead.',
|
|
249402
|
+
},
|
|
249403
|
+
],
|
|
249404
|
+
ismap: [
|
|
249405
|
+
{
|
|
249406
|
+
elements: ['input'],
|
|
249407
|
+
suggestion: 'Unnecessary. Omit it altogether. All input elements with a type attribute in the Image Button state are processed as server-side image maps.',
|
|
249408
|
+
},
|
|
249409
|
+
],
|
|
249410
|
+
label: [
|
|
249411
|
+
{
|
|
249412
|
+
elements: ['menu'],
|
|
249413
|
+
suggestion: 'To implement a custom context menu, use script to handle the contextmenu event.',
|
|
249414
|
+
},
|
|
249415
|
+
],
|
|
249416
|
+
language: [
|
|
249417
|
+
{
|
|
249418
|
+
elements: ['script'],
|
|
249419
|
+
suggestion: 'Omit the attribute for JavaScript; for data blocks, use the type attribute instead.',
|
|
249420
|
+
},
|
|
249421
|
+
],
|
|
249422
|
+
leftmargin: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
249423
|
+
link: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
249424
|
+
longdesc: [
|
|
249425
|
+
{
|
|
249426
|
+
elements: ['iframe', 'img'],
|
|
249427
|
+
suggestion: "Use a regular a element to link to the description, or (in the case of images) use an image map to provide a link from the image to the image's description.",
|
|
249428
|
+
},
|
|
249429
|
+
],
|
|
249430
|
+
lowsrc: [
|
|
249431
|
+
{
|
|
249432
|
+
elements: ['img'],
|
|
249433
|
+
suggestion: 'Use a progressive JPEG image (given in the src attribute), instead of using two separate images.',
|
|
249434
|
+
},
|
|
249435
|
+
],
|
|
249436
|
+
manifest: [{ elements: ['html'], suggestion: 'Use service workers instead.' }],
|
|
249437
|
+
marginheight: [
|
|
249438
|
+
{
|
|
249439
|
+
elements: ['body', 'iframe'],
|
|
249440
|
+
suggestion: 'Use CSS instead.',
|
|
249441
|
+
},
|
|
249442
|
+
],
|
|
249443
|
+
marginwidth: [
|
|
249444
|
+
{
|
|
249445
|
+
elements: ['body', 'iframe'],
|
|
249446
|
+
suggestion: 'Use CSS instead.',
|
|
249447
|
+
},
|
|
249448
|
+
],
|
|
249449
|
+
methods: [
|
|
249450
|
+
{
|
|
249451
|
+
elements: ['a', 'link'],
|
|
249452
|
+
suggestion: 'Use the HTTP OPTIONS feature instead.',
|
|
249453
|
+
},
|
|
249454
|
+
],
|
|
249455
|
+
name: [
|
|
249456
|
+
{
|
|
249457
|
+
elements: ['a', 'embed', 'img', 'option'],
|
|
249458
|
+
suggestion: 'Use the id attribute instead.',
|
|
249459
|
+
},
|
|
249460
|
+
],
|
|
249461
|
+
nohref: [
|
|
249462
|
+
{
|
|
249463
|
+
elements: ['area'],
|
|
249464
|
+
suggestion: 'Omitting the href attribute is sufficient; the nohref attribute is unnecessary. Omit it altogether.',
|
|
249465
|
+
},
|
|
249466
|
+
],
|
|
249467
|
+
noshade: [{ elements: ['hr'], suggestion: 'Use CSS instead.' }],
|
|
249468
|
+
nowrap: [{ elements: ['td', 'th'], suggestion: 'Use CSS instead.' }],
|
|
249469
|
+
onshow: [
|
|
249470
|
+
{
|
|
249471
|
+
elements: ['*'],
|
|
249472
|
+
suggestion: 'To implement a custom context menu, use script to handle the contextmenu event.',
|
|
249473
|
+
},
|
|
249474
|
+
],
|
|
249475
|
+
profile: [{ elements: ['head'], suggestion: 'Unnecessary. Omit it altogether.' }],
|
|
249476
|
+
rev: [
|
|
249477
|
+
{
|
|
249478
|
+
elements: ['a', 'link'],
|
|
249479
|
+
suggestion: 'Use the rel attribute instead, with an opposite term. (For example, instead of rev="made", use rel="author".)',
|
|
249480
|
+
},
|
|
249481
|
+
],
|
|
249482
|
+
rightmargin: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
249483
|
+
scheme: [
|
|
249484
|
+
{
|
|
249485
|
+
elements: ['meta'],
|
|
249486
|
+
suggestion: 'Use only one scheme per field, or make the scheme declaration part of the value.',
|
|
249487
|
+
},
|
|
249488
|
+
],
|
|
249489
|
+
scope: [
|
|
249490
|
+
{
|
|
249491
|
+
elements: ['td'],
|
|
249492
|
+
suggestion: 'Use th elements for heading cells.',
|
|
249493
|
+
},
|
|
249494
|
+
],
|
|
249495
|
+
scrolling: [{ elements: ['iframe'], suggestion: 'Use CSS instead.' }],
|
|
249496
|
+
shape: [{ elements: ['a'], suggestion: 'Use area instead of a for image maps.' }],
|
|
249497
|
+
size: [{ elements: ['hr'], suggestion: 'Use CSS instead.' }],
|
|
249498
|
+
standby: [
|
|
249499
|
+
{
|
|
249500
|
+
elements: ['object'],
|
|
249501
|
+
suggestion: 'Optimize the linked resource so that it loads quickly or, at least, incrementally.',
|
|
249502
|
+
},
|
|
249503
|
+
],
|
|
249504
|
+
summary: [
|
|
249505
|
+
{
|
|
249506
|
+
elements: ['table'],
|
|
249507
|
+
suggestion: 'Use one of the techniques for describing tables given in the table section instead.',
|
|
249508
|
+
},
|
|
249509
|
+
],
|
|
249510
|
+
target: [{ elements: ['link'], suggestion: 'Unnecessary. Omit it altogether.' }],
|
|
249511
|
+
text: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
249512
|
+
topmargin: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
249513
|
+
type: [
|
|
249514
|
+
{
|
|
249515
|
+
elements: ['area'],
|
|
249516
|
+
suggestion: 'These attributes do not do anything useful, and for historical reasons there are no corresponding IDL attributes on area elements. Omit them altogether.',
|
|
249517
|
+
},
|
|
249518
|
+
{ elements: ['li'], suggestion: 'Use CSS instead.' },
|
|
249519
|
+
{
|
|
249520
|
+
elements: ['menu'],
|
|
249521
|
+
suggestion: 'To implement a custom context menu, use script to handle the contextmenu event. For toolbar menus, omit the attribute.',
|
|
249522
|
+
},
|
|
249523
|
+
{
|
|
249524
|
+
elements: ['style'],
|
|
249525
|
+
suggestion: 'Omit the attribute for CSS; for data blocks, use script as the container instead of style.',
|
|
249526
|
+
},
|
|
249527
|
+
{ elements: ['ul'], suggestion: 'Use CSS instead.' },
|
|
249528
|
+
],
|
|
249529
|
+
typemustmatch: [
|
|
249530
|
+
{
|
|
249531
|
+
elements: ['object'],
|
|
249532
|
+
suggestion: 'Avoid using object elements with untrusted resources.',
|
|
249533
|
+
},
|
|
249534
|
+
],
|
|
249535
|
+
urn: [
|
|
249536
|
+
{
|
|
249537
|
+
elements: ['a', 'link'],
|
|
249538
|
+
suggestion: 'Specify the preferred persistent identifier using the href attribute instead.',
|
|
249539
|
+
},
|
|
249540
|
+
],
|
|
249541
|
+
usemap: [
|
|
249542
|
+
{
|
|
249543
|
+
elements: ['input', 'object'],
|
|
249544
|
+
suggestion: 'Use the img element for image maps.',
|
|
249545
|
+
},
|
|
249546
|
+
],
|
|
249547
|
+
valign: [
|
|
249548
|
+
{
|
|
249549
|
+
elements: ['col', 'tbody', 'thead', 'tfoot', 'td', 'th', 'tr'],
|
|
249550
|
+
suggestion: 'Use CSS instead.',
|
|
249551
|
+
},
|
|
249552
|
+
],
|
|
249553
|
+
version: [{ elements: ['html'], suggestion: 'Unnecessary. Omit it altogether.' }],
|
|
249554
|
+
vlink: [{ elements: ['body'], suggestion: 'Use CSS instead.' }],
|
|
249555
|
+
vspace: [
|
|
249556
|
+
{
|
|
249557
|
+
elements: ['embed', 'iframe', 'input', 'img', 'object'],
|
|
249558
|
+
suggestion: 'Use CSS instead.',
|
|
249559
|
+
},
|
|
249560
|
+
],
|
|
249561
|
+
width: [
|
|
249562
|
+
{
|
|
249563
|
+
elements: ['col', 'hr', 'pre', 'table', 'td', 'th'],
|
|
249564
|
+
suggestion: 'Use CSS instead.',
|
|
249565
|
+
},
|
|
249566
|
+
],
|
|
249567
|
+
rules: [{ elements: ['table'], suggestion: 'Use CSS instead.' }],
|
|
249568
|
+
};
|
|
249569
|
+
|
|
249570
|
+
const MESSAGE_ID$9 = 'obsolete';
|
|
249571
|
+
const rule$u = createRule({
|
|
249572
|
+
name: 'no-obsolete-attrs',
|
|
249573
|
+
rule: {
|
|
249574
|
+
create(context) {
|
|
249575
|
+
return {
|
|
249576
|
+
Element(rawNode) {
|
|
249577
|
+
const node = rawNode;
|
|
249578
|
+
const elementName = node.name.toLowerCase();
|
|
249579
|
+
for (const attr of node.attributes) {
|
|
249580
|
+
if (!attr.valueSpan) {
|
|
249581
|
+
continue;
|
|
249582
|
+
}
|
|
249583
|
+
const attrName = attr.name.toLowerCase();
|
|
249584
|
+
const obsoleteConfigs = OBSOLETE_HTML_ATTRS[attrName];
|
|
249585
|
+
if (!obsoleteConfigs) {
|
|
249586
|
+
continue;
|
|
249587
|
+
}
|
|
249588
|
+
const obsoleteConfig = obsoleteConfigs.find((config) => config.elements.includes('*') ||
|
|
249589
|
+
config.elements.includes(elementName));
|
|
249590
|
+
if (!obsoleteConfig) {
|
|
249591
|
+
continue;
|
|
249592
|
+
}
|
|
249593
|
+
context.report({
|
|
249594
|
+
data: {
|
|
249595
|
+
attr: attrName,
|
|
249596
|
+
element: elementName,
|
|
249597
|
+
suggestion: obsoleteConfig.suggestion,
|
|
249598
|
+
},
|
|
249599
|
+
loc: sourceSpanToLoc(attr.keySpan ?? attr.sourceSpan),
|
|
249600
|
+
messageId: MESSAGE_ID$9,
|
|
249601
|
+
});
|
|
249602
|
+
}
|
|
249603
|
+
},
|
|
249604
|
+
};
|
|
249605
|
+
},
|
|
249606
|
+
meta: {
|
|
249607
|
+
docs: { description: 'Disallow obsolete HTML attributes' },
|
|
249608
|
+
messages: {
|
|
249609
|
+
[MESSAGE_ID$9]: 'The {{attr}} attribute on <{{element}}> is obsolete. {{suggestion}}',
|
|
249610
|
+
},
|
|
249611
|
+
schema: [],
|
|
249612
|
+
type: 'problem',
|
|
249613
|
+
},
|
|
249614
|
+
},
|
|
249615
|
+
});
|
|
249616
|
+
|
|
249617
|
+
const OBSOLETE_HTML_TAGS = new Set([
|
|
249618
|
+
'acronym',
|
|
249619
|
+
'applet',
|
|
249620
|
+
'basefont',
|
|
249621
|
+
'bgsound',
|
|
249622
|
+
'big',
|
|
249623
|
+
'blink',
|
|
249624
|
+
'center',
|
|
249625
|
+
'dir',
|
|
249626
|
+
'font',
|
|
249627
|
+
'frame',
|
|
249628
|
+
'frameset',
|
|
249629
|
+
'isindex',
|
|
249630
|
+
'keygen',
|
|
249631
|
+
'listing',
|
|
249632
|
+
'marquee',
|
|
249633
|
+
'menuitem',
|
|
249634
|
+
'multicol',
|
|
249635
|
+
'nextid',
|
|
249636
|
+
'nobr',
|
|
249637
|
+
'noembed',
|
|
249638
|
+
'noframes',
|
|
249639
|
+
'plaintext',
|
|
249640
|
+
'rb',
|
|
249641
|
+
'rtc',
|
|
249642
|
+
'spacer',
|
|
249643
|
+
'strike',
|
|
249644
|
+
'tt',
|
|
249645
|
+
'xmp',
|
|
249646
|
+
]);
|
|
249647
|
+
|
|
249648
|
+
const MESSAGE_ID$8 = 'unexpected';
|
|
249649
|
+
const rule$t = createRule({
|
|
249650
|
+
name: 'no-obsolete-tags',
|
|
249651
|
+
rule: {
|
|
249652
|
+
create(context) {
|
|
249653
|
+
return {
|
|
249654
|
+
Element(rawNode) {
|
|
249655
|
+
const node = rawNode;
|
|
249656
|
+
if (!OBSOLETE_HTML_TAGS.has(node.name)) {
|
|
249657
|
+
return;
|
|
249658
|
+
}
|
|
249659
|
+
context.report({
|
|
249660
|
+
data: { tag: node.name },
|
|
249661
|
+
loc: sourceSpanToLoc(node.startSourceSpan),
|
|
249662
|
+
messageId: MESSAGE_ID$8,
|
|
249663
|
+
});
|
|
249664
|
+
},
|
|
249665
|
+
};
|
|
249666
|
+
},
|
|
249667
|
+
meta: {
|
|
249668
|
+
docs: { description: 'Disallow obsolete HTML tags' },
|
|
249669
|
+
messages: { [MESSAGE_ID$8]: 'Unexpected use of obsolete tag <{{tag}}>' },
|
|
249670
|
+
schema: [],
|
|
249671
|
+
type: 'problem',
|
|
249672
|
+
},
|
|
249673
|
+
},
|
|
249674
|
+
});
|
|
249675
|
+
|
|
249676
|
+
const rule$s = createRule({
|
|
249753
249677
|
create(context) {
|
|
249754
249678
|
const { checker, esTreeNodeToTSNodeMap, sourceCode } = getTypeAwareRuleContext(context);
|
|
249755
249679
|
return {
|
|
@@ -249893,7 +249817,7 @@ const config$2 = {
|
|
|
249893
249817
|
type: 'problem',
|
|
249894
249818
|
},
|
|
249895
249819
|
};
|
|
249896
|
-
const rule$
|
|
249820
|
+
const rule$r = createRule({
|
|
249897
249821
|
name: 'no-project-as-in-ng-template',
|
|
249898
249822
|
rule: config$2,
|
|
249899
249823
|
});
|
|
@@ -249923,7 +249847,7 @@ function collectArrayExpressions(node) {
|
|
|
249923
249847
|
}
|
|
249924
249848
|
return result;
|
|
249925
249849
|
}
|
|
249926
|
-
const rule$
|
|
249850
|
+
const rule$q = createRule({
|
|
249927
249851
|
create(context) {
|
|
249928
249852
|
const { checker: typeChecker, esTreeNodeToTSNodeMap } = getTypeAwareRuleContext(context);
|
|
249929
249853
|
const ignoreTupleContextualTyping = context.options[0]?.ignoreTupleContextualTyping ?? true;
|
|
@@ -250348,7 +250272,7 @@ function inspectComputedBody(root, context, localScopes, visitedFunctions, repor
|
|
|
250348
250272
|
return;
|
|
250349
250273
|
});
|
|
250350
250274
|
}
|
|
250351
|
-
const rule$
|
|
250275
|
+
const rule$p = createRule({
|
|
250352
250276
|
create(context) {
|
|
250353
250277
|
const { checker, esTreeNodeToTSNodeMap, program, sourceCode, tsNodeToESTreeNodeMap, } = getTypeAwareRuleContext(context);
|
|
250354
250278
|
const signalNodeMap = esTreeNodeToTSNodeMap;
|
|
@@ -250391,7 +250315,7 @@ const rule$o = createRule({
|
|
|
250391
250315
|
name: 'no-side-effects-in-computed',
|
|
250392
250316
|
});
|
|
250393
250317
|
|
|
250394
|
-
const rule$
|
|
250318
|
+
const rule$o = createUntrackedRule({
|
|
250395
250319
|
create(context) {
|
|
250396
250320
|
const { checker, esTreeNodeToTSNodeMap, program, sourceCode } = getTypeAwareRuleContext(context);
|
|
250397
250321
|
const signalNodeMap = esTreeNodeToTSNodeMap;
|
|
@@ -250445,8 +250369,7 @@ function collectParts(node) {
|
|
|
250445
250369
|
}
|
|
250446
250370
|
function isRootConcat(node) {
|
|
250447
250371
|
const { parent } = node;
|
|
250448
|
-
return
|
|
250449
|
-
parent.operator !== '+');
|
|
250372
|
+
return parent.type !== dist$3.AST_NODE_TYPES.BinaryExpression || parent.operator !== '+';
|
|
250450
250373
|
}
|
|
250451
250374
|
function isStringType(type, checker) {
|
|
250452
250375
|
if (type.isUnion()) {
|
|
@@ -250486,7 +250409,7 @@ function templateContent(template, renderExpr) {
|
|
|
250486
250409
|
: ''}`)
|
|
250487
250410
|
.join('');
|
|
250488
250411
|
}
|
|
250489
|
-
const rule$
|
|
250412
|
+
const rule$n = createRule({
|
|
250490
250413
|
create(context) {
|
|
250491
250414
|
const { sourceCode } = context;
|
|
250492
250415
|
let parserServices = null;
|
|
@@ -250821,7 +250744,7 @@ function buildReactiveCallReplacement(outerUntrackedCall, reactiveCall, sourceCo
|
|
|
250821
250744
|
}
|
|
250822
250745
|
return dedent(text, reactiveCall.loc.start.column - outerUntrackedCall.parent.loc.start.column);
|
|
250823
250746
|
}
|
|
250824
|
-
const rule$
|
|
250747
|
+
const rule$m = createUntrackedRule({
|
|
250825
250748
|
create(context) {
|
|
250826
250749
|
const { checker, esTreeNodeToTSNodeMap, program, sourceCode } = getTypeAwareRuleContext(context);
|
|
250827
250750
|
const signalNodeMap = esTreeNodeToTSNodeMap;
|
|
@@ -250950,7 +250873,7 @@ function hasOpaqueSynchronousCalls(root, checker, esTreeNodeToTSNodeMap, program
|
|
|
250950
250873
|
});
|
|
250951
250874
|
return found;
|
|
250952
250875
|
}
|
|
250953
|
-
const rule$
|
|
250876
|
+
const rule$l = createUntrackedRule({
|
|
250954
250877
|
create(context) {
|
|
250955
250878
|
const { checker, esTreeNodeToTSNodeMap, program, sourceCode } = getTypeAwareRuleContext(context);
|
|
250956
250879
|
const signalNodeMap = esTreeNodeToTSNodeMap;
|
|
@@ -251032,7 +250955,7 @@ const rule$k = createUntrackedRule({
|
|
|
251032
250955
|
name: 'no-useless-untracked',
|
|
251033
250956
|
});
|
|
251034
250957
|
|
|
251035
|
-
const rule$
|
|
250958
|
+
const rule$k = createRule({
|
|
251036
250959
|
create(context, [{ printWidth }]) {
|
|
251037
250960
|
const sourceCode = context.sourceCode;
|
|
251038
250961
|
const getLineEndIndex = (lineStartIndex) => {
|
|
@@ -251353,7 +251276,7 @@ function renderTest(node, sourceCode) {
|
|
|
251353
251276
|
const text = sourceCode.getText(node);
|
|
251354
251277
|
return needsParenthesesInOrChain(node) ? `(${text})` : text;
|
|
251355
251278
|
}
|
|
251356
|
-
const rule$
|
|
251279
|
+
const rule$j = createRule({
|
|
251357
251280
|
create(context) {
|
|
251358
251281
|
const { sourceCode } = context;
|
|
251359
251282
|
function checkBody(statements) {
|
|
@@ -251456,7 +251379,7 @@ function getPushCall(node) {
|
|
|
251456
251379
|
}
|
|
251457
251380
|
return call;
|
|
251458
251381
|
}
|
|
251459
|
-
const rule$
|
|
251382
|
+
const rule$i = createRule({
|
|
251460
251383
|
create(context) {
|
|
251461
251384
|
const { sourceCode } = context;
|
|
251462
251385
|
function checkBody(statements) {
|
|
@@ -251550,7 +251473,7 @@ function getModuleKeywordToken(sourceCode, node) {
|
|
|
251550
251473
|
}
|
|
251551
251474
|
return firstToken;
|
|
251552
251475
|
}
|
|
251553
|
-
const rule$
|
|
251476
|
+
const rule$h = createRule({
|
|
251554
251477
|
create(context) {
|
|
251555
251478
|
const { sourceCode } = context;
|
|
251556
251479
|
return {
|
|
@@ -251820,7 +251743,7 @@ function collectSuspiciousReads(scope, checker, esTreeNodeToTSNodeMap, tsNodeToE
|
|
|
251820
251743
|
});
|
|
251821
251744
|
return [...suspicious.values()];
|
|
251822
251745
|
}
|
|
251823
|
-
const rule$
|
|
251746
|
+
const rule$g = createUntrackedRule({
|
|
251824
251747
|
create(context) {
|
|
251825
251748
|
const { checker, esTreeNodeToTSNodeMap, program, sourceCode, tsNodeToESTreeNodeMap, } = getTypeAwareRuleContext(context);
|
|
251826
251749
|
const signalNodeMap = esTreeNodeToTSNodeMap;
|
|
@@ -251908,7 +251831,7 @@ function getWrappedSignalGetter(node, checker, esTreeNodeToTSNodeMap) {
|
|
|
251908
251831
|
}
|
|
251909
251832
|
return isSignalType(getter, checker, esTreeNodeToTSNodeMap) ? body.callee : null;
|
|
251910
251833
|
}
|
|
251911
|
-
const rule$
|
|
251834
|
+
const rule$f = createUntrackedRule({
|
|
251912
251835
|
create(context) {
|
|
251913
251836
|
const { checker, esTreeNodeToTSNodeMap, program, sourceCode } = getTypeAwareRuleContext(context);
|
|
251914
251837
|
const signalNodeMap = esTreeNodeToTSNodeMap;
|
|
@@ -251944,6 +251867,313 @@ const rule$e = createUntrackedRule({
|
|
|
251944
251867
|
name: 'prefer-untracked-signal-getter',
|
|
251945
251868
|
});
|
|
251946
251869
|
|
|
251870
|
+
const MESSAGE_IDS$2 = {
|
|
251871
|
+
MISSING: 'missing',
|
|
251872
|
+
UNEXPECTED: 'unexpected',
|
|
251873
|
+
};
|
|
251874
|
+
const EXPECTED_QUOTE = '"';
|
|
251875
|
+
const SINGLE_QUOTE = "'";
|
|
251876
|
+
const DOUBLE_QUOTE = '"';
|
|
251877
|
+
function isQuotableAttribute(attr) {
|
|
251878
|
+
return 'sourceSpan' in attr;
|
|
251879
|
+
}
|
|
251880
|
+
const rule$e = createRule({
|
|
251881
|
+
name: 'quotes',
|
|
251882
|
+
rule: {
|
|
251883
|
+
create(context) {
|
|
251884
|
+
const sourceText = context.sourceCode.getText();
|
|
251885
|
+
return {
|
|
251886
|
+
Element(rawNode) {
|
|
251887
|
+
const node = rawNode;
|
|
251888
|
+
for (const attr of [
|
|
251889
|
+
...node.attributes,
|
|
251890
|
+
...node.inputs,
|
|
251891
|
+
...node.outputs,
|
|
251892
|
+
].filter(isQuotableAttribute)) {
|
|
251893
|
+
const valueSpan = getAttributeValueSpan(attr);
|
|
251894
|
+
if (!valueSpan) {
|
|
251895
|
+
continue;
|
|
251896
|
+
}
|
|
251897
|
+
const rawValue = sourceText.slice(valueSpan.start.offset, valueSpan.end.offset);
|
|
251898
|
+
if (rawValue.includes(EXPECTED_QUOTE)) {
|
|
251899
|
+
continue;
|
|
251900
|
+
}
|
|
251901
|
+
const openingQuote = sourceText[valueSpan.start.offset - 1];
|
|
251902
|
+
const closingQuote = sourceText[valueSpan.end.offset];
|
|
251903
|
+
const hasMatchingQuotes = (openingQuote === SINGLE_QUOTE ||
|
|
251904
|
+
openingQuote === DOUBLE_QUOTE) &&
|
|
251905
|
+
openingQuote === closingQuote;
|
|
251906
|
+
if (hasMatchingQuotes && openingQuote !== EXPECTED_QUOTE) {
|
|
251907
|
+
context.report({
|
|
251908
|
+
data: {
|
|
251909
|
+
actual: `single(${openingQuote})`,
|
|
251910
|
+
expected: `double(${EXPECTED_QUOTE})`,
|
|
251911
|
+
},
|
|
251912
|
+
fix: (fixer) => fixer.replaceTextRange([
|
|
251913
|
+
valueSpan.start.offset - 1,
|
|
251914
|
+
valueSpan.end.offset + 1,
|
|
251915
|
+
], `${EXPECTED_QUOTE}${rawValue}${EXPECTED_QUOTE}`),
|
|
251916
|
+
loc: sourceSpanToLoc(attr.sourceSpan),
|
|
251917
|
+
messageId: MESSAGE_IDS$2.UNEXPECTED,
|
|
251918
|
+
});
|
|
251919
|
+
continue;
|
|
251920
|
+
}
|
|
251921
|
+
if (!hasMatchingQuotes) {
|
|
251922
|
+
context.report({
|
|
251923
|
+
data: { expected: `double(${EXPECTED_QUOTE})` },
|
|
251924
|
+
fix: (fixer) => fixer.replaceTextRange([valueSpan.start.offset, valueSpan.end.offset], `${EXPECTED_QUOTE}${rawValue}${EXPECTED_QUOTE}`),
|
|
251925
|
+
loc: sourceSpanToLoc(attr.sourceSpan),
|
|
251926
|
+
messageId: MESSAGE_IDS$2.MISSING,
|
|
251927
|
+
});
|
|
251928
|
+
}
|
|
251929
|
+
}
|
|
251930
|
+
},
|
|
251931
|
+
};
|
|
251932
|
+
},
|
|
251933
|
+
meta: {
|
|
251934
|
+
docs: { description: 'Enforce double quotes around HTML attribute values' },
|
|
251935
|
+
fixable: 'code',
|
|
251936
|
+
messages: {
|
|
251937
|
+
[MESSAGE_IDS$2.MISSING]: 'Expected {{expected}} quotes but no quotes found.',
|
|
251938
|
+
[MESSAGE_IDS$2.UNEXPECTED]: 'Expected {{expected}} quotes but found {{actual}}.',
|
|
251939
|
+
},
|
|
251940
|
+
schema: [],
|
|
251941
|
+
type: 'layout',
|
|
251942
|
+
},
|
|
251943
|
+
},
|
|
251944
|
+
});
|
|
251945
|
+
|
|
251946
|
+
const MESSAGE_ID$6 = 'missing';
|
|
251947
|
+
const DOCTYPE_REGEXP = /^\s*<!doctype html>/i;
|
|
251948
|
+
const rule$d = createRule({
|
|
251949
|
+
name: 'require-doctype',
|
|
251950
|
+
rule: {
|
|
251951
|
+
create(context) {
|
|
251952
|
+
const sourceText = context.sourceCode.getText();
|
|
251953
|
+
let reported = false;
|
|
251954
|
+
return {
|
|
251955
|
+
Element(rawNode) {
|
|
251956
|
+
const node = rawNode;
|
|
251957
|
+
if (reported ||
|
|
251958
|
+
node.name !== 'html' ||
|
|
251959
|
+
DOCTYPE_REGEXP.test(sourceText)) {
|
|
251960
|
+
return;
|
|
251961
|
+
}
|
|
251962
|
+
reported = true;
|
|
251963
|
+
context.report({
|
|
251964
|
+
fix: (fixer) => fixer.insertTextBeforeRange([0, 0], '<!DOCTYPE html>\n'),
|
|
251965
|
+
loc: sourceSpanToLoc(node.startSourceSpan),
|
|
251966
|
+
messageId: MESSAGE_ID$6,
|
|
251967
|
+
});
|
|
251968
|
+
},
|
|
251969
|
+
};
|
|
251970
|
+
},
|
|
251971
|
+
meta: {
|
|
251972
|
+
docs: { description: 'Require <!DOCTYPE html> in HTML documents' },
|
|
251973
|
+
fixable: 'code',
|
|
251974
|
+
messages: { [MESSAGE_ID$6]: 'Missing `<!DOCTYPE html>`' },
|
|
251975
|
+
schema: [],
|
|
251976
|
+
type: 'problem',
|
|
251977
|
+
},
|
|
251978
|
+
},
|
|
251979
|
+
});
|
|
251980
|
+
|
|
251981
|
+
const MESSAGE_ID$5 = 'missingAlt';
|
|
251982
|
+
function hasAlt(node) {
|
|
251983
|
+
return (node.attributes.some((attr) => attr.name === 'alt') ||
|
|
251984
|
+
node.inputs.some((input) => input.name === 'alt' || input.keySpan.details === 'attr.alt'));
|
|
251985
|
+
}
|
|
251986
|
+
const rule$c = createRule({
|
|
251987
|
+
name: 'require-img-alt',
|
|
251988
|
+
rule: {
|
|
251989
|
+
create(context) {
|
|
251990
|
+
return {
|
|
251991
|
+
Element(rawNode) {
|
|
251992
|
+
const node = rawNode;
|
|
251993
|
+
if (node.name !== 'img' || hasAlt(node)) {
|
|
251994
|
+
return;
|
|
251995
|
+
}
|
|
251996
|
+
context.report({
|
|
251997
|
+
loc: sourceSpanToLoc(node.startSourceSpan),
|
|
251998
|
+
messageId: MESSAGE_ID$5,
|
|
251999
|
+
});
|
|
252000
|
+
},
|
|
252001
|
+
};
|
|
252002
|
+
},
|
|
252003
|
+
meta: {
|
|
252004
|
+
docs: { description: 'Require alt or attr.alt on img elements' },
|
|
252005
|
+
messages: { [MESSAGE_ID$5]: 'Missing `alt` attribute at `<img>` tag' },
|
|
252006
|
+
schema: [],
|
|
252007
|
+
type: 'suggestion',
|
|
252008
|
+
},
|
|
252009
|
+
},
|
|
252010
|
+
});
|
|
252011
|
+
|
|
252012
|
+
const MESSAGE_IDS$1 = {
|
|
252013
|
+
EMPTY: 'empty',
|
|
252014
|
+
MISSING: 'missing',
|
|
252015
|
+
};
|
|
252016
|
+
const rule$b = createRule({
|
|
252017
|
+
name: 'require-lang',
|
|
252018
|
+
rule: {
|
|
252019
|
+
create(context) {
|
|
252020
|
+
return {
|
|
252021
|
+
Element(rawNode) {
|
|
252022
|
+
const node = rawNode;
|
|
252023
|
+
if (node.name !== 'html') {
|
|
252024
|
+
return;
|
|
252025
|
+
}
|
|
252026
|
+
const langAttr = node.attributes.find((attr) => attr.name === 'lang');
|
|
252027
|
+
const hasBoundLang = node.inputs.some((input) => input.name === 'lang' ||
|
|
252028
|
+
input.keySpan.details === 'attr.lang');
|
|
252029
|
+
if (!langAttr && !hasBoundLang) {
|
|
252030
|
+
context.report({
|
|
252031
|
+
loc: sourceSpanToLoc(node.startSourceSpan),
|
|
252032
|
+
messageId: MESSAGE_IDS$1.MISSING,
|
|
252033
|
+
});
|
|
252034
|
+
return;
|
|
252035
|
+
}
|
|
252036
|
+
if (langAttr?.value.trim().length === 0) {
|
|
252037
|
+
context.report({
|
|
252038
|
+
loc: sourceSpanToLoc(langAttr.sourceSpan),
|
|
252039
|
+
messageId: MESSAGE_IDS$1.EMPTY,
|
|
252040
|
+
});
|
|
252041
|
+
}
|
|
252042
|
+
},
|
|
252043
|
+
};
|
|
252044
|
+
},
|
|
252045
|
+
meta: {
|
|
252046
|
+
docs: { description: 'Require a non-empty lang attribute on the html element' },
|
|
252047
|
+
messages: {
|
|
252048
|
+
[MESSAGE_IDS$1.EMPTY]: 'Unexpected empty `lang` in in `<html>` tag.',
|
|
252049
|
+
[MESSAGE_IDS$1.MISSING]: 'Missing `lang` attribute in `<html>` tag.',
|
|
252050
|
+
},
|
|
252051
|
+
schema: [],
|
|
252052
|
+
type: 'problem',
|
|
252053
|
+
},
|
|
252054
|
+
},
|
|
252055
|
+
});
|
|
252056
|
+
|
|
252057
|
+
const MESSAGE_ID$4 = 'invalid';
|
|
252058
|
+
const VALID_CONTAINERS = new Set(['menu', 'ol', 'ul']);
|
|
252059
|
+
function getClosestParentElement(node) {
|
|
252060
|
+
let parent = node.parent;
|
|
252061
|
+
while (parent) {
|
|
252062
|
+
if (parent instanceof dist$4.TmplAstElement) {
|
|
252063
|
+
return parent;
|
|
252064
|
+
}
|
|
252065
|
+
if (parent instanceof dist$4.TmplAstTemplate) {
|
|
252066
|
+
parent = parent.parent;
|
|
252067
|
+
continue;
|
|
252068
|
+
}
|
|
252069
|
+
break;
|
|
252070
|
+
}
|
|
252071
|
+
return null;
|
|
252072
|
+
}
|
|
252073
|
+
const rule$a = createRule({
|
|
252074
|
+
name: 'require-li-container',
|
|
252075
|
+
rule: {
|
|
252076
|
+
create(context) {
|
|
252077
|
+
return {
|
|
252078
|
+
Element(rawNode) {
|
|
252079
|
+
const node = rawNode;
|
|
252080
|
+
if (node.name !== 'li') {
|
|
252081
|
+
return;
|
|
252082
|
+
}
|
|
252083
|
+
const parent = getClosestParentElement(node);
|
|
252084
|
+
if (parent && VALID_CONTAINERS.has(parent.name)) {
|
|
252085
|
+
return;
|
|
252086
|
+
}
|
|
252087
|
+
context.report({
|
|
252088
|
+
loc: sourceSpanToLoc(node.startSourceSpan),
|
|
252089
|
+
messageId: MESSAGE_ID$4,
|
|
252090
|
+
});
|
|
252091
|
+
},
|
|
252092
|
+
};
|
|
252093
|
+
},
|
|
252094
|
+
meta: {
|
|
252095
|
+
docs: {
|
|
252096
|
+
description: 'Require li elements to be placed inside ul, ol, or menu',
|
|
252097
|
+
},
|
|
252098
|
+
messages: {
|
|
252099
|
+
[MESSAGE_ID$4]: 'Invalid container of `<li>`. <li>` should be in `<ul>`, `<ol>` or `<menu>`.',
|
|
252100
|
+
},
|
|
252101
|
+
schema: [],
|
|
252102
|
+
type: 'problem',
|
|
252103
|
+
},
|
|
252104
|
+
},
|
|
252105
|
+
});
|
|
252106
|
+
|
|
252107
|
+
const MESSAGE_IDS = {
|
|
252108
|
+
EMPTY_TITLE: 'empty',
|
|
252109
|
+
MISSING_TITLE: 'missing',
|
|
252110
|
+
};
|
|
252111
|
+
function hasMeaningfulTitleContent(node) {
|
|
252112
|
+
return node.children.some((child) => {
|
|
252113
|
+
if (!('value' in child)) {
|
|
252114
|
+
return false;
|
|
252115
|
+
}
|
|
252116
|
+
const { value } = child;
|
|
252117
|
+
return (typeof value === 'object' ||
|
|
252118
|
+
(typeof value === 'string' && value.trim().length > 0));
|
|
252119
|
+
});
|
|
252120
|
+
}
|
|
252121
|
+
const rule$9 = createRule({
|
|
252122
|
+
name: 'require-title',
|
|
252123
|
+
rule: {
|
|
252124
|
+
create(context) {
|
|
252125
|
+
let headNode;
|
|
252126
|
+
let headDepth = 0;
|
|
252127
|
+
let titleNode;
|
|
252128
|
+
return {
|
|
252129
|
+
Element(rawNode) {
|
|
252130
|
+
const node = rawNode;
|
|
252131
|
+
if (node.name === 'head') {
|
|
252132
|
+
headNode = node;
|
|
252133
|
+
headDepth++;
|
|
252134
|
+
}
|
|
252135
|
+
else if (headDepth > 0 && node.name === 'title') {
|
|
252136
|
+
titleNode = node;
|
|
252137
|
+
}
|
|
252138
|
+
},
|
|
252139
|
+
'Element:exit'(rawNode) {
|
|
252140
|
+
const node = rawNode;
|
|
252141
|
+
if (node.name === 'head') {
|
|
252142
|
+
headDepth--;
|
|
252143
|
+
}
|
|
252144
|
+
},
|
|
252145
|
+
'Program:exit'() {
|
|
252146
|
+
if (!headNode) {
|
|
252147
|
+
return;
|
|
252148
|
+
}
|
|
252149
|
+
if (!titleNode) {
|
|
252150
|
+
context.report({
|
|
252151
|
+
loc: sourceSpanToLoc(headNode.startSourceSpan),
|
|
252152
|
+
messageId: MESSAGE_IDS.MISSING_TITLE,
|
|
252153
|
+
});
|
|
252154
|
+
return;
|
|
252155
|
+
}
|
|
252156
|
+
if (!hasMeaningfulTitleContent(titleNode)) {
|
|
252157
|
+
context.report({
|
|
252158
|
+
loc: sourceSpanToLoc(titleNode.startSourceSpan),
|
|
252159
|
+
messageId: MESSAGE_IDS.EMPTY_TITLE,
|
|
252160
|
+
});
|
|
252161
|
+
}
|
|
252162
|
+
},
|
|
252163
|
+
};
|
|
252164
|
+
},
|
|
252165
|
+
meta: {
|
|
252166
|
+
docs: { description: 'Require a non-empty title element inside head' },
|
|
252167
|
+
messages: {
|
|
252168
|
+
[MESSAGE_IDS.EMPTY_TITLE]: 'Unexpected empty text in `<title></title>`',
|
|
252169
|
+
[MESSAGE_IDS.MISSING_TITLE]: 'Missing `<title></title>` in the `<head></head>`',
|
|
252170
|
+
},
|
|
252171
|
+
schema: [],
|
|
252172
|
+
type: 'problem',
|
|
252173
|
+
},
|
|
252174
|
+
},
|
|
252175
|
+
});
|
|
252176
|
+
|
|
251947
252177
|
function isArray(node) {
|
|
251948
252178
|
return node?.type === dist$2.AST_NODE_TYPES.ArrayExpression;
|
|
251949
252179
|
}
|
|
@@ -251962,7 +252192,7 @@ function getImportedName(spec) {
|
|
|
251962
252192
|
return spec.imported.value;
|
|
251963
252193
|
}
|
|
251964
252194
|
|
|
251965
|
-
const MESSAGE_ID$
|
|
252195
|
+
const MESSAGE_ID$3 = 'replaceTuiImport';
|
|
251966
252196
|
const DEFAULT_DECORATORS = ['Component', 'Directive', 'NgModule', 'Pipe'];
|
|
251967
252197
|
const DEFAULT_EXCEPTIONS = [
|
|
251968
252198
|
{ from: 'TuiTextfieldOptionsDirective', to: 'TuiTextfield' },
|
|
@@ -251971,7 +252201,7 @@ const DEFAULT_EXCEPTIONS = [
|
|
|
251971
252201
|
{ from: 'TuiIslandDirective', to: 'TuiIsland' },
|
|
251972
252202
|
{ from: 'TuiTableBarsHostComponent', to: 'TuiTableBarsHost' },
|
|
251973
252203
|
];
|
|
251974
|
-
const rule$
|
|
252204
|
+
const rule$8 = createRule({
|
|
251975
252205
|
create(context, [{ decorators = DEFAULT_DECORATORS, exceptions = DEFAULT_EXCEPTIONS }]) {
|
|
251976
252206
|
const sourceCode = context.getSourceCode();
|
|
251977
252207
|
const importedFromTaiga = {};
|
|
@@ -252055,7 +252285,7 @@ const rule$d = createRule({
|
|
|
252055
252285
|
fixer.replaceText(importName, short),
|
|
252056
252286
|
];
|
|
252057
252287
|
},
|
|
252058
|
-
messageId: MESSAGE_ID$
|
|
252288
|
+
messageId: MESSAGE_ID$3,
|
|
252059
252289
|
node: importName,
|
|
252060
252290
|
});
|
|
252061
252291
|
}
|
|
@@ -252180,7 +252410,7 @@ function getLeadingIndentation(text) {
|
|
|
252180
252410
|
return text.slice(0, index);
|
|
252181
252411
|
}
|
|
252182
252412
|
|
|
252183
|
-
const rule$
|
|
252413
|
+
const rule$7 = createRule({
|
|
252184
252414
|
create(context) {
|
|
252185
252415
|
const sourceCode = context.sourceCode;
|
|
252186
252416
|
const getIndentation = (line) => getLeadingIndentation(sourceCode.lines[line - 1] ?? '');
|
|
@@ -252341,7 +252571,7 @@ function getSortedNames(elements, source) {
|
|
|
252341
252571
|
return [...sortedRegular, ...sortedSpreads].map((n) => nameOf(n, source));
|
|
252342
252572
|
}
|
|
252343
252573
|
|
|
252344
|
-
const rule$
|
|
252574
|
+
const rule$6 = createRule({
|
|
252345
252575
|
create(context, [options]) {
|
|
252346
252576
|
const allowed = new Set(options.decorators);
|
|
252347
252577
|
const source = context.sourceCode;
|
|
@@ -252397,237 +252627,6 @@ const rule$b = createRule({
|
|
|
252397
252627
|
name: 'standalone-imports-sort',
|
|
252398
252628
|
});
|
|
252399
252629
|
|
|
252400
|
-
const MESSAGE_ID$5 = 'missing';
|
|
252401
|
-
const DOCTYPE_REGEXP = /^\s*<!doctype html>/i;
|
|
252402
|
-
const rule$a = createRule({
|
|
252403
|
-
name: 'require-doctype',
|
|
252404
|
-
rule: {
|
|
252405
|
-
create(context) {
|
|
252406
|
-
const sourceText = context.sourceCode.getText();
|
|
252407
|
-
let reported = false;
|
|
252408
|
-
return {
|
|
252409
|
-
Element(rawNode) {
|
|
252410
|
-
const node = rawNode;
|
|
252411
|
-
if (reported ||
|
|
252412
|
-
node.name !== 'html' ||
|
|
252413
|
-
DOCTYPE_REGEXP.test(sourceText)) {
|
|
252414
|
-
return;
|
|
252415
|
-
}
|
|
252416
|
-
reported = true;
|
|
252417
|
-
context.report({
|
|
252418
|
-
fix: (fixer) => fixer.insertTextBeforeRange([0, 0], '<!DOCTYPE html>\n'),
|
|
252419
|
-
loc: sourceSpanToLoc(node.startSourceSpan),
|
|
252420
|
-
messageId: MESSAGE_ID$5,
|
|
252421
|
-
});
|
|
252422
|
-
},
|
|
252423
|
-
};
|
|
252424
|
-
},
|
|
252425
|
-
meta: {
|
|
252426
|
-
docs: { description: 'Require <!DOCTYPE html> in HTML documents' },
|
|
252427
|
-
fixable: 'code',
|
|
252428
|
-
messages: { [MESSAGE_ID$5]: 'Missing `<!DOCTYPE html>`' },
|
|
252429
|
-
schema: [],
|
|
252430
|
-
type: 'problem',
|
|
252431
|
-
},
|
|
252432
|
-
},
|
|
252433
|
-
});
|
|
252434
|
-
|
|
252435
|
-
const MESSAGE_ID$4 = 'missingAlt';
|
|
252436
|
-
function hasAlt(node) {
|
|
252437
|
-
return (node.attributes.some((attr) => attr.name === 'alt') ||
|
|
252438
|
-
node.inputs.some((input) => input.name === 'alt' || input.keySpan.details === 'attr.alt'));
|
|
252439
|
-
}
|
|
252440
|
-
const rule$9 = createRule({
|
|
252441
|
-
name: 'require-img-alt',
|
|
252442
|
-
rule: {
|
|
252443
|
-
create(context) {
|
|
252444
|
-
return {
|
|
252445
|
-
Element(rawNode) {
|
|
252446
|
-
const node = rawNode;
|
|
252447
|
-
if (node.name !== 'img' || hasAlt(node)) {
|
|
252448
|
-
return;
|
|
252449
|
-
}
|
|
252450
|
-
context.report({
|
|
252451
|
-
loc: sourceSpanToLoc(node.startSourceSpan),
|
|
252452
|
-
messageId: MESSAGE_ID$4,
|
|
252453
|
-
});
|
|
252454
|
-
},
|
|
252455
|
-
};
|
|
252456
|
-
},
|
|
252457
|
-
meta: {
|
|
252458
|
-
docs: { description: 'Require alt or attr.alt on img elements' },
|
|
252459
|
-
messages: { [MESSAGE_ID$4]: 'Missing `alt` attribute at `<img>` tag' },
|
|
252460
|
-
schema: [],
|
|
252461
|
-
type: 'suggestion',
|
|
252462
|
-
},
|
|
252463
|
-
},
|
|
252464
|
-
});
|
|
252465
|
-
|
|
252466
|
-
const MESSAGE_IDS$1 = {
|
|
252467
|
-
EMPTY: 'empty',
|
|
252468
|
-
MISSING: 'missing',
|
|
252469
|
-
};
|
|
252470
|
-
const rule$8 = createRule({
|
|
252471
|
-
name: 'require-lang',
|
|
252472
|
-
rule: {
|
|
252473
|
-
create(context) {
|
|
252474
|
-
return {
|
|
252475
|
-
Element(rawNode) {
|
|
252476
|
-
const node = rawNode;
|
|
252477
|
-
if (node.name !== 'html') {
|
|
252478
|
-
return;
|
|
252479
|
-
}
|
|
252480
|
-
const langAttr = node.attributes.find((attr) => attr.name === 'lang');
|
|
252481
|
-
const hasBoundLang = node.inputs.some((input) => input.name === 'lang' ||
|
|
252482
|
-
input.keySpan.details === 'attr.lang');
|
|
252483
|
-
if (!langAttr && !hasBoundLang) {
|
|
252484
|
-
context.report({
|
|
252485
|
-
loc: sourceSpanToLoc(node.startSourceSpan),
|
|
252486
|
-
messageId: MESSAGE_IDS$1.MISSING,
|
|
252487
|
-
});
|
|
252488
|
-
return;
|
|
252489
|
-
}
|
|
252490
|
-
if (langAttr?.value.trim().length === 0) {
|
|
252491
|
-
context.report({
|
|
252492
|
-
loc: sourceSpanToLoc(langAttr.sourceSpan),
|
|
252493
|
-
messageId: MESSAGE_IDS$1.EMPTY,
|
|
252494
|
-
});
|
|
252495
|
-
}
|
|
252496
|
-
},
|
|
252497
|
-
};
|
|
252498
|
-
},
|
|
252499
|
-
meta: {
|
|
252500
|
-
docs: { description: 'Require a non-empty lang attribute on the html element' },
|
|
252501
|
-
messages: {
|
|
252502
|
-
[MESSAGE_IDS$1.EMPTY]: 'Unexpected empty `lang` in in `<html>` tag.',
|
|
252503
|
-
[MESSAGE_IDS$1.MISSING]: 'Missing `lang` attribute in `<html>` tag.',
|
|
252504
|
-
},
|
|
252505
|
-
schema: [],
|
|
252506
|
-
type: 'problem',
|
|
252507
|
-
},
|
|
252508
|
-
},
|
|
252509
|
-
});
|
|
252510
|
-
|
|
252511
|
-
const MESSAGE_ID$3 = 'invalid';
|
|
252512
|
-
const VALID_CONTAINERS = new Set(['menu', 'ol', 'ul']);
|
|
252513
|
-
function getClosestParentElement(node) {
|
|
252514
|
-
let parent = node.parent;
|
|
252515
|
-
while (parent) {
|
|
252516
|
-
if (parent instanceof dist$4.TmplAstElement) {
|
|
252517
|
-
return parent;
|
|
252518
|
-
}
|
|
252519
|
-
if (parent instanceof dist$4.TmplAstTemplate) {
|
|
252520
|
-
parent = parent.parent;
|
|
252521
|
-
continue;
|
|
252522
|
-
}
|
|
252523
|
-
break;
|
|
252524
|
-
}
|
|
252525
|
-
return null;
|
|
252526
|
-
}
|
|
252527
|
-
const rule$7 = createRule({
|
|
252528
|
-
name: 'require-li-container',
|
|
252529
|
-
rule: {
|
|
252530
|
-
create(context) {
|
|
252531
|
-
return {
|
|
252532
|
-
Element(rawNode) {
|
|
252533
|
-
const node = rawNode;
|
|
252534
|
-
if (node.name !== 'li') {
|
|
252535
|
-
return;
|
|
252536
|
-
}
|
|
252537
|
-
const parent = getClosestParentElement(node);
|
|
252538
|
-
if (parent && VALID_CONTAINERS.has(parent.name)) {
|
|
252539
|
-
return;
|
|
252540
|
-
}
|
|
252541
|
-
context.report({
|
|
252542
|
-
loc: sourceSpanToLoc(node.startSourceSpan),
|
|
252543
|
-
messageId: MESSAGE_ID$3,
|
|
252544
|
-
});
|
|
252545
|
-
},
|
|
252546
|
-
};
|
|
252547
|
-
},
|
|
252548
|
-
meta: {
|
|
252549
|
-
docs: {
|
|
252550
|
-
description: 'Require li elements to be placed inside ul, ol, or menu',
|
|
252551
|
-
},
|
|
252552
|
-
messages: {
|
|
252553
|
-
[MESSAGE_ID$3]: 'Invalid container of `<li>`. <li>` should be in `<ul>`, `<ol>` or `<menu>`.',
|
|
252554
|
-
},
|
|
252555
|
-
schema: [],
|
|
252556
|
-
type: 'problem',
|
|
252557
|
-
},
|
|
252558
|
-
},
|
|
252559
|
-
});
|
|
252560
|
-
|
|
252561
|
-
const MESSAGE_IDS = {
|
|
252562
|
-
EMPTY_TITLE: 'empty',
|
|
252563
|
-
MISSING_TITLE: 'missing',
|
|
252564
|
-
};
|
|
252565
|
-
function hasMeaningfulTitleContent(node) {
|
|
252566
|
-
return node.children.some((child) => {
|
|
252567
|
-
if (!('value' in child)) {
|
|
252568
|
-
return false;
|
|
252569
|
-
}
|
|
252570
|
-
const { value } = child;
|
|
252571
|
-
return (typeof value === 'object' ||
|
|
252572
|
-
(typeof value === 'string' && value.trim().length > 0));
|
|
252573
|
-
});
|
|
252574
|
-
}
|
|
252575
|
-
const rule$6 = createRule({
|
|
252576
|
-
name: 'require-title',
|
|
252577
|
-
rule: {
|
|
252578
|
-
create(context) {
|
|
252579
|
-
let headNode;
|
|
252580
|
-
let headDepth = 0;
|
|
252581
|
-
let titleNode;
|
|
252582
|
-
return {
|
|
252583
|
-
Element(rawNode) {
|
|
252584
|
-
const node = rawNode;
|
|
252585
|
-
if (node.name === 'head') {
|
|
252586
|
-
headNode = node;
|
|
252587
|
-
headDepth++;
|
|
252588
|
-
}
|
|
252589
|
-
else if (headDepth > 0 && node.name === 'title') {
|
|
252590
|
-
titleNode = node;
|
|
252591
|
-
}
|
|
252592
|
-
},
|
|
252593
|
-
'Element:exit'(rawNode) {
|
|
252594
|
-
const node = rawNode;
|
|
252595
|
-
if (node.name === 'head') {
|
|
252596
|
-
headDepth--;
|
|
252597
|
-
}
|
|
252598
|
-
},
|
|
252599
|
-
'Program:exit'() {
|
|
252600
|
-
if (!headNode) {
|
|
252601
|
-
return;
|
|
252602
|
-
}
|
|
252603
|
-
if (!titleNode) {
|
|
252604
|
-
context.report({
|
|
252605
|
-
loc: sourceSpanToLoc(headNode.startSourceSpan),
|
|
252606
|
-
messageId: MESSAGE_IDS.MISSING_TITLE,
|
|
252607
|
-
});
|
|
252608
|
-
return;
|
|
252609
|
-
}
|
|
252610
|
-
if (!hasMeaningfulTitleContent(titleNode)) {
|
|
252611
|
-
context.report({
|
|
252612
|
-
loc: sourceSpanToLoc(titleNode.startSourceSpan),
|
|
252613
|
-
messageId: MESSAGE_IDS.EMPTY_TITLE,
|
|
252614
|
-
});
|
|
252615
|
-
}
|
|
252616
|
-
},
|
|
252617
|
-
};
|
|
252618
|
-
},
|
|
252619
|
-
meta: {
|
|
252620
|
-
docs: { description: 'Require a non-empty title element inside head' },
|
|
252621
|
-
messages: {
|
|
252622
|
-
[MESSAGE_IDS.EMPTY_TITLE]: 'Unexpected empty text in `<title><title/>`',
|
|
252623
|
-
[MESSAGE_IDS.MISSING_TITLE]: 'Missing `<title><title/>` in the `<head><head/>`',
|
|
252624
|
-
},
|
|
252625
|
-
schema: [],
|
|
252626
|
-
type: 'problem',
|
|
252627
|
-
},
|
|
252628
|
-
},
|
|
252629
|
-
});
|
|
252630
|
-
|
|
252631
252630
|
const config$1 = {
|
|
252632
252631
|
create(context) {
|
|
252633
252632
|
const classesInFile = new Map();
|
|
@@ -253495,51 +253494,51 @@ const plugin = {
|
|
|
253495
253494
|
'array-as-const': rule$5,
|
|
253496
253495
|
'attrs-newline': rule$M,
|
|
253497
253496
|
'class-property-naming': rule$4,
|
|
253498
|
-
'decorator-key-sort': rule$
|
|
253499
|
-
'element-newline': rule$
|
|
253497
|
+
'decorator-key-sort': rule$L,
|
|
253498
|
+
'element-newline': rule$K,
|
|
253500
253499
|
'flat-exports': rule$3,
|
|
253501
|
-
'host-attributes-sort': rule$
|
|
253502
|
-
'html-logical-properties': rule$
|
|
253503
|
-
'injection-token-description': rule$
|
|
253504
|
-
'no-commonjs-import-patterns': rule$
|
|
253505
|
-
'no-deep-imports': rule$
|
|
253506
|
-
'no-deep-imports-to-indexed-packages': rule$
|
|
253507
|
-
'no-duplicate-attrs': rule$
|
|
253508
|
-
'no-duplicate-id': rule$
|
|
253509
|
-
'no-duplicate-in-head': rule$
|
|
253510
|
-
'no-fully-untracked-effect': rule$
|
|
253511
|
-
'no-href-with-router-link': rule$
|
|
253512
|
-
'no-implicit-public': rule$
|
|
253513
|
-
'no-import-assertions': rule$
|
|
253514
|
-
'no-infinite-loop': rule$
|
|
253515
|
-
'no-legacy-peer-deps': rule$
|
|
253516
|
-
'no-obsolete-attrs': rule$
|
|
253517
|
-
'no-obsolete-tags': rule$
|
|
253518
|
-
'no-playwright-empty-fill': rule$
|
|
253519
|
-
'no-project-as-in-ng-template': rule$
|
|
253520
|
-
'no-redundant-type-annotation': rule$
|
|
253500
|
+
'host-attributes-sort': rule$J,
|
|
253501
|
+
'html-logical-properties': rule$I,
|
|
253502
|
+
'injection-token-description': rule$H,
|
|
253503
|
+
'no-commonjs-import-patterns': rule$G,
|
|
253504
|
+
'no-deep-imports': rule$F,
|
|
253505
|
+
'no-deep-imports-to-indexed-packages': rule$E,
|
|
253506
|
+
'no-duplicate-attrs': rule$D,
|
|
253507
|
+
'no-duplicate-id': rule$C,
|
|
253508
|
+
'no-duplicate-in-head': rule$B,
|
|
253509
|
+
'no-fully-untracked-effect': rule$A,
|
|
253510
|
+
'no-href-with-router-link': rule$z,
|
|
253511
|
+
'no-implicit-public': rule$y,
|
|
253512
|
+
'no-import-assertions': rule$x,
|
|
253513
|
+
'no-infinite-loop': rule$w,
|
|
253514
|
+
'no-legacy-peer-deps': rule$v,
|
|
253515
|
+
'no-obsolete-attrs': rule$u,
|
|
253516
|
+
'no-obsolete-tags': rule$t,
|
|
253517
|
+
'no-playwright-empty-fill': rule$s,
|
|
253518
|
+
'no-project-as-in-ng-template': rule$r,
|
|
253519
|
+
'no-redundant-type-annotation': rule$q,
|
|
253521
253520
|
'no-restricted-attr-values': rule$2,
|
|
253522
|
-
'no-side-effects-in-computed': rule$
|
|
253523
|
-
'no-signal-reads-after-await-in-reactive-context': rule$
|
|
253524
|
-
'no-string-literal-concat': rule$
|
|
253525
|
-
'no-untracked-outside-reactive-context': rule$
|
|
253526
|
-
'no-useless-untracked': rule$
|
|
253527
|
-
'object-single-line': rule$
|
|
253528
|
-
'prefer-combined-if-control-flow': rule$
|
|
253521
|
+
'no-side-effects-in-computed': rule$p,
|
|
253522
|
+
'no-signal-reads-after-await-in-reactive-context': rule$o,
|
|
253523
|
+
'no-string-literal-concat': rule$n,
|
|
253524
|
+
'no-untracked-outside-reactive-context': rule$m,
|
|
253525
|
+
'no-useless-untracked': rule$l,
|
|
253526
|
+
'object-single-line': rule$k,
|
|
253527
|
+
'prefer-combined-if-control-flow': rule$j,
|
|
253529
253528
|
'prefer-deep-imports': rule$1,
|
|
253530
|
-
'prefer-multi-arg-push': rule$
|
|
253531
|
-
'prefer-namespace-keyword': rule$
|
|
253532
|
-
'prefer-untracked-incidental-signal-reads': rule$
|
|
253533
|
-
'prefer-untracked-signal-getter': rule$
|
|
253534
|
-
quotes: rule$
|
|
253535
|
-
'require-doctype': rule$
|
|
253536
|
-
'require-img-alt': rule$
|
|
253537
|
-
'require-lang': rule$
|
|
253538
|
-
'require-li-container': rule$
|
|
253539
|
-
'require-title': rule$
|
|
253540
|
-
'short-tui-imports': rule$
|
|
253541
|
-
'single-line-class-property-spacing': rule$
|
|
253542
|
-
'standalone-imports-sort': rule$
|
|
253529
|
+
'prefer-multi-arg-push': rule$i,
|
|
253530
|
+
'prefer-namespace-keyword': rule$h,
|
|
253531
|
+
'prefer-untracked-incidental-signal-reads': rule$g,
|
|
253532
|
+
'prefer-untracked-signal-getter': rule$f,
|
|
253533
|
+
quotes: rule$e,
|
|
253534
|
+
'require-doctype': rule$d,
|
|
253535
|
+
'require-img-alt': rule$c,
|
|
253536
|
+
'require-lang': rule$b,
|
|
253537
|
+
'require-li-container': rule$a,
|
|
253538
|
+
'require-title': rule$9,
|
|
253539
|
+
'short-tui-imports': rule$8,
|
|
253540
|
+
'single-line-class-property-spacing': rule$7,
|
|
253541
|
+
'standalone-imports-sort': rule$6,
|
|
253543
253542
|
'strict-tui-doc-example': rule,
|
|
253544
253543
|
},
|
|
253545
253544
|
};
|