@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/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$L = createRule({
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$D = createRule({
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$b = 'html-logical-properties';
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$b,
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$b]: MESSAGE },
46983
+ messages: { [MESSAGE_ID$f]: MESSAGE },
47714
46984
  schema: [],
47715
46985
  type: 'suggestion',
47716
46986
  },
47717
46987
  };
47718
- const rule$C = createRule({
46988
+ const rule$I = createRule({
47719
46989
  name: 'html-logical-properties',
47720
46990
  rule: config$4,
47721
46991
  });
47722
46992
 
47723
- const MESSAGE_ID$a = 'invalid-injection-token-description';
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$B = createRule({
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$a,
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$a]: ERROR_MESSAGE$3 },
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$A = createRule({
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$9 = 'no-deep-imports';
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$z = createRule({
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$9,
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$9]: ERROR_MESSAGE$2 },
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$y = createRule({
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$x = createUntrackedRule({
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$8 = 'no-href-with-router-link';
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$8,
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$8]: ERROR_MESSAGE$1 },
248880
+ messages: { [MESSAGE_ID$a]: ERROR_MESSAGE$1 },
249484
248881
  schema: [],
249485
248882
  type: 'problem',
249486
248883
  },
249487
248884
  };
249488
- const rule$w = createRule({
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$v = createRule({
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$u = createRule({
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$t = createRule({
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$s = createRule({
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 rule$r = createRule({
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$q = createRule({
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$p = createRule({
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$o = createRule({
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$n = createUntrackedRule({
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 (parent.type !== dist$3.AST_NODE_TYPES.BinaryExpression ||
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$m = createRule({
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$l = createUntrackedRule({
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$k = createUntrackedRule({
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$j = createRule({
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$i = createRule({
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$h = createRule({
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$g = createRule({
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$f = createUntrackedRule({
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$e = createUntrackedRule({
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$6 = 'replaceTuiImport';
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$d = createRule({
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$6,
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$c = createRule({
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$b = createRule({
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$E,
253499
- 'element-newline': rule$L,
253497
+ 'decorator-key-sort': rule$L,
253498
+ 'element-newline': rule$K,
253500
253499
  'flat-exports': rule$3,
253501
- 'host-attributes-sort': rule$D,
253502
- 'html-logical-properties': rule$C,
253503
- 'injection-token-description': rule$B,
253504
- 'no-commonjs-import-patterns': rule$A,
253505
- 'no-deep-imports': rule$z,
253506
- 'no-deep-imports-to-indexed-packages': rule$y,
253507
- 'no-duplicate-attrs': rule$K,
253508
- 'no-duplicate-id': rule$J,
253509
- 'no-duplicate-in-head': rule$I,
253510
- 'no-fully-untracked-effect': rule$x,
253511
- 'no-href-with-router-link': rule$w,
253512
- 'no-implicit-public': rule$v,
253513
- 'no-import-assertions': rule$u,
253514
- 'no-infinite-loop': rule$t,
253515
- 'no-legacy-peer-deps': rule$s,
253516
- 'no-obsolete-attrs': rule$H,
253517
- 'no-obsolete-tags': rule$G,
253518
- 'no-playwright-empty-fill': rule$r,
253519
- 'no-project-as-in-ng-template': rule$q,
253520
- 'no-redundant-type-annotation': rule$p,
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$o,
253523
- 'no-signal-reads-after-await-in-reactive-context': rule$n,
253524
- 'no-string-literal-concat': rule$m,
253525
- 'no-untracked-outside-reactive-context': rule$l,
253526
- 'no-useless-untracked': rule$k,
253527
- 'object-single-line': rule$j,
253528
- 'prefer-combined-if-control-flow': rule$i,
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$h,
253531
- 'prefer-namespace-keyword': rule$g,
253532
- 'prefer-untracked-incidental-signal-reads': rule$f,
253533
- 'prefer-untracked-signal-getter': rule$e,
253534
- quotes: rule$F,
253535
- 'require-doctype': rule$a,
253536
- 'require-img-alt': rule$9,
253537
- 'require-lang': rule$8,
253538
- 'require-li-container': rule$7,
253539
- 'require-title': rule$6,
253540
- 'short-tui-imports': rule$d,
253541
- 'single-line-class-property-spacing': rule$c,
253542
- 'standalone-imports-sort': rule$b,
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
  };