@taiga-ui/eslint-plugin-experience-next 0.481.0 → 0.483.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.
Files changed (37) hide show
  1. package/README.md +14 -13
  2. package/index.d.ts +19 -19
  3. package/index.esm.js +1113 -1090
  4. package/package.json +1 -1
  5. package/rules/recommended/attrs-newline.d.ts +5 -0
  6. package/rules/recommended/decorator-key-sort.d.ts +2 -1
  7. package/rules/recommended/element-newline.d.ts +5 -0
  8. package/rules/recommended/html-logical-properties.d.ts +2 -1
  9. package/rules/recommended/no-duplicate-attrs.d.ts +5 -0
  10. package/rules/recommended/no-duplicate-id.d.ts +5 -0
  11. package/rules/recommended/no-duplicate-in-head.d.ts +5 -0
  12. package/rules/recommended/no-href-with-router-link.d.ts +2 -1
  13. package/rules/recommended/no-obsolete-attrs.d.ts +5 -0
  14. package/rules/recommended/no-obsolete-tags.d.ts +5 -0
  15. package/rules/recommended/no-project-as-in-ng-template.d.ts +2 -1
  16. package/rules/recommended/quotes.d.ts +5 -0
  17. package/rules/recommended/require-doctype.d.ts +5 -0
  18. package/rules/recommended/require-img-alt.d.ts +5 -0
  19. package/rules/recommended/require-lang.d.ts +5 -0
  20. package/rules/recommended/require-li-container.d.ts +5 -0
  21. package/rules/recommended/require-title.d.ts +5 -0
  22. package/rules/taiga-specific/array-as-const.d.ts +2 -1
  23. package/rules/taiga-specific/no-restricted-attr-values.d.ts +2 -1
  24. package/rules/utils/create-rule.d.ts +3 -3
  25. package/rules/attrs-newline.d.ts +0 -4
  26. package/rules/element-newline.d.ts +0 -4
  27. package/rules/no-duplicate-attrs.d.ts +0 -4
  28. package/rules/no-duplicate-id.d.ts +0 -4
  29. package/rules/no-duplicate-in-head.d.ts +0 -4
  30. package/rules/no-obsolete-attrs.d.ts +0 -4
  31. package/rules/no-obsolete-tags.d.ts +0 -4
  32. package/rules/quotes.d.ts +0 -4
  33. package/rules/require-doctype.d.ts +0 -4
  34. package/rules/require-img-alt.d.ts +0 -4
  35. package/rules/require-lang.d.ts +0 -4
  36. package/rules/require-li-container.d.ts +0 -4
  37. package/rules/require-title.d.ts +0 -4
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;
@@ -250486,7 +250410,7 @@ function templateContent(template, renderExpr) {
250486
250410
  : ''}`)
250487
250411
  .join('');
250488
250412
  }
250489
- const rule$m = createRule({
250413
+ const rule$n = createRule({
250490
250414
  create(context) {
250491
250415
  const { sourceCode } = context;
250492
250416
  let parserServices = null;
@@ -250821,7 +250745,7 @@ function buildReactiveCallReplacement(outerUntrackedCall, reactiveCall, sourceCo
250821
250745
  }
250822
250746
  return dedent(text, reactiveCall.loc.start.column - outerUntrackedCall.parent.loc.start.column);
250823
250747
  }
250824
- const rule$l = createUntrackedRule({
250748
+ const rule$m = createUntrackedRule({
250825
250749
  create(context) {
250826
250750
  const { checker, esTreeNodeToTSNodeMap, program, sourceCode } = getTypeAwareRuleContext(context);
250827
250751
  const signalNodeMap = esTreeNodeToTSNodeMap;
@@ -250950,7 +250874,7 @@ function hasOpaqueSynchronousCalls(root, checker, esTreeNodeToTSNodeMap, program
250950
250874
  });
250951
250875
  return found;
250952
250876
  }
250953
- const rule$k = createUntrackedRule({
250877
+ const rule$l = createUntrackedRule({
250954
250878
  create(context) {
250955
250879
  const { checker, esTreeNodeToTSNodeMap, program, sourceCode } = getTypeAwareRuleContext(context);
250956
250880
  const signalNodeMap = esTreeNodeToTSNodeMap;
@@ -251032,7 +250956,7 @@ const rule$k = createUntrackedRule({
251032
250956
  name: 'no-useless-untracked',
251033
250957
  });
251034
250958
 
251035
- const rule$j = createRule({
250959
+ const rule$k = createRule({
251036
250960
  create(context, [{ printWidth }]) {
251037
250961
  const sourceCode = context.sourceCode;
251038
250962
  const getLineEndIndex = (lineStartIndex) => {
@@ -251353,7 +251277,7 @@ function renderTest(node, sourceCode) {
251353
251277
  const text = sourceCode.getText(node);
251354
251278
  return needsParenthesesInOrChain(node) ? `(${text})` : text;
251355
251279
  }
251356
- const rule$i = createRule({
251280
+ const rule$j = createRule({
251357
251281
  create(context) {
251358
251282
  const { sourceCode } = context;
251359
251283
  function checkBody(statements) {
@@ -251456,7 +251380,7 @@ function getPushCall(node) {
251456
251380
  }
251457
251381
  return call;
251458
251382
  }
251459
- const rule$h = createRule({
251383
+ const rule$i = createRule({
251460
251384
  create(context) {
251461
251385
  const { sourceCode } = context;
251462
251386
  function checkBody(statements) {
@@ -251550,7 +251474,7 @@ function getModuleKeywordToken(sourceCode, node) {
251550
251474
  }
251551
251475
  return firstToken;
251552
251476
  }
251553
- const rule$g = createRule({
251477
+ const rule$h = createRule({
251554
251478
  create(context) {
251555
251479
  const { sourceCode } = context;
251556
251480
  return {
@@ -251820,7 +251744,7 @@ function collectSuspiciousReads(scope, checker, esTreeNodeToTSNodeMap, tsNodeToE
251820
251744
  });
251821
251745
  return [...suspicious.values()];
251822
251746
  }
251823
- const rule$f = createUntrackedRule({
251747
+ const rule$g = createUntrackedRule({
251824
251748
  create(context) {
251825
251749
  const { checker, esTreeNodeToTSNodeMap, program, sourceCode, tsNodeToESTreeNodeMap, } = getTypeAwareRuleContext(context);
251826
251750
  const signalNodeMap = esTreeNodeToTSNodeMap;
@@ -251908,7 +251832,7 @@ function getWrappedSignalGetter(node, checker, esTreeNodeToTSNodeMap) {
251908
251832
  }
251909
251833
  return isSignalType(getter, checker, esTreeNodeToTSNodeMap) ? body.callee : null;
251910
251834
  }
251911
- const rule$e = createUntrackedRule({
251835
+ const rule$f = createUntrackedRule({
251912
251836
  create(context) {
251913
251837
  const { checker, esTreeNodeToTSNodeMap, program, sourceCode } = getTypeAwareRuleContext(context);
251914
251838
  const signalNodeMap = esTreeNodeToTSNodeMap;
@@ -251944,6 +251868,313 @@ const rule$e = createUntrackedRule({
251944
251868
  name: 'prefer-untracked-signal-getter',
251945
251869
  });
251946
251870
 
251871
+ const MESSAGE_IDS$2 = {
251872
+ MISSING: 'missing',
251873
+ UNEXPECTED: 'unexpected',
251874
+ };
251875
+ const EXPECTED_QUOTE = '"';
251876
+ const SINGLE_QUOTE = "'";
251877
+ const DOUBLE_QUOTE = '"';
251878
+ function isQuotableAttribute(attr) {
251879
+ return 'sourceSpan' in attr;
251880
+ }
251881
+ const rule$e = createRule({
251882
+ name: 'quotes',
251883
+ rule: {
251884
+ create(context) {
251885
+ const sourceText = context.sourceCode.getText();
251886
+ return {
251887
+ Element(rawNode) {
251888
+ const node = rawNode;
251889
+ for (const attr of [
251890
+ ...node.attributes,
251891
+ ...node.inputs,
251892
+ ...node.outputs,
251893
+ ].filter(isQuotableAttribute)) {
251894
+ const valueSpan = getAttributeValueSpan(attr);
251895
+ if (!valueSpan) {
251896
+ continue;
251897
+ }
251898
+ const rawValue = sourceText.slice(valueSpan.start.offset, valueSpan.end.offset);
251899
+ if (rawValue.includes(EXPECTED_QUOTE)) {
251900
+ continue;
251901
+ }
251902
+ const openingQuote = sourceText[valueSpan.start.offset - 1];
251903
+ const closingQuote = sourceText[valueSpan.end.offset];
251904
+ const hasMatchingQuotes = (openingQuote === SINGLE_QUOTE ||
251905
+ openingQuote === DOUBLE_QUOTE) &&
251906
+ openingQuote === closingQuote;
251907
+ if (hasMatchingQuotes && openingQuote !== EXPECTED_QUOTE) {
251908
+ context.report({
251909
+ data: {
251910
+ actual: `single(${openingQuote})`,
251911
+ expected: `double(${EXPECTED_QUOTE})`,
251912
+ },
251913
+ fix: (fixer) => fixer.replaceTextRange([
251914
+ valueSpan.start.offset - 1,
251915
+ valueSpan.end.offset + 1,
251916
+ ], `${EXPECTED_QUOTE}${rawValue}${EXPECTED_QUOTE}`),
251917
+ loc: sourceSpanToLoc(attr.sourceSpan),
251918
+ messageId: MESSAGE_IDS$2.UNEXPECTED,
251919
+ });
251920
+ continue;
251921
+ }
251922
+ if (!hasMatchingQuotes) {
251923
+ context.report({
251924
+ data: { expected: `double(${EXPECTED_QUOTE})` },
251925
+ fix: (fixer) => fixer.replaceTextRange([valueSpan.start.offset, valueSpan.end.offset], `${EXPECTED_QUOTE}${rawValue}${EXPECTED_QUOTE}`),
251926
+ loc: sourceSpanToLoc(attr.sourceSpan),
251927
+ messageId: MESSAGE_IDS$2.MISSING,
251928
+ });
251929
+ }
251930
+ }
251931
+ },
251932
+ };
251933
+ },
251934
+ meta: {
251935
+ docs: { description: 'Enforce double quotes around HTML attribute values' },
251936
+ fixable: 'code',
251937
+ messages: {
251938
+ [MESSAGE_IDS$2.MISSING]: 'Expected {{expected}} quotes but no quotes found.',
251939
+ [MESSAGE_IDS$2.UNEXPECTED]: 'Expected {{expected}} quotes but found {{actual}}.',
251940
+ },
251941
+ schema: [],
251942
+ type: 'layout',
251943
+ },
251944
+ },
251945
+ });
251946
+
251947
+ const MESSAGE_ID$6 = 'missing';
251948
+ const DOCTYPE_REGEXP = /^\s*<!doctype html>/i;
251949
+ const rule$d = createRule({
251950
+ name: 'require-doctype',
251951
+ rule: {
251952
+ create(context) {
251953
+ const sourceText = context.sourceCode.getText();
251954
+ let reported = false;
251955
+ return {
251956
+ Element(rawNode) {
251957
+ const node = rawNode;
251958
+ if (reported ||
251959
+ node.name !== 'html' ||
251960
+ DOCTYPE_REGEXP.test(sourceText)) {
251961
+ return;
251962
+ }
251963
+ reported = true;
251964
+ context.report({
251965
+ fix: (fixer) => fixer.insertTextBeforeRange([0, 0], '<!DOCTYPE html>\n'),
251966
+ loc: sourceSpanToLoc(node.startSourceSpan),
251967
+ messageId: MESSAGE_ID$6,
251968
+ });
251969
+ },
251970
+ };
251971
+ },
251972
+ meta: {
251973
+ docs: { description: 'Require <!DOCTYPE html> in HTML documents' },
251974
+ fixable: 'code',
251975
+ messages: { [MESSAGE_ID$6]: 'Missing `<!DOCTYPE html>`' },
251976
+ schema: [],
251977
+ type: 'problem',
251978
+ },
251979
+ },
251980
+ });
251981
+
251982
+ const MESSAGE_ID$5 = 'missingAlt';
251983
+ function hasAlt(node) {
251984
+ return (node.attributes.some((attr) => attr.name === 'alt') ||
251985
+ node.inputs.some((input) => input.name === 'alt' || input.keySpan.details === 'attr.alt'));
251986
+ }
251987
+ const rule$c = createRule({
251988
+ name: 'require-img-alt',
251989
+ rule: {
251990
+ create(context) {
251991
+ return {
251992
+ Element(rawNode) {
251993
+ const node = rawNode;
251994
+ if (node.name !== 'img' || hasAlt(node)) {
251995
+ return;
251996
+ }
251997
+ context.report({
251998
+ loc: sourceSpanToLoc(node.startSourceSpan),
251999
+ messageId: MESSAGE_ID$5,
252000
+ });
252001
+ },
252002
+ };
252003
+ },
252004
+ meta: {
252005
+ docs: { description: 'Require alt or attr.alt on img elements' },
252006
+ messages: { [MESSAGE_ID$5]: 'Missing `alt` attribute at `<img>` tag' },
252007
+ schema: [],
252008
+ type: 'suggestion',
252009
+ },
252010
+ },
252011
+ });
252012
+
252013
+ const MESSAGE_IDS$1 = {
252014
+ EMPTY: 'empty',
252015
+ MISSING: 'missing',
252016
+ };
252017
+ const rule$b = createRule({
252018
+ name: 'require-lang',
252019
+ rule: {
252020
+ create(context) {
252021
+ return {
252022
+ Element(rawNode) {
252023
+ const node = rawNode;
252024
+ if (node.name !== 'html') {
252025
+ return;
252026
+ }
252027
+ const langAttr = node.attributes.find((attr) => attr.name === 'lang');
252028
+ const hasBoundLang = node.inputs.some((input) => input.name === 'lang' ||
252029
+ input.keySpan.details === 'attr.lang');
252030
+ if (!langAttr && !hasBoundLang) {
252031
+ context.report({
252032
+ loc: sourceSpanToLoc(node.startSourceSpan),
252033
+ messageId: MESSAGE_IDS$1.MISSING,
252034
+ });
252035
+ return;
252036
+ }
252037
+ if (langAttr?.value.trim().length === 0) {
252038
+ context.report({
252039
+ loc: sourceSpanToLoc(langAttr.sourceSpan),
252040
+ messageId: MESSAGE_IDS$1.EMPTY,
252041
+ });
252042
+ }
252043
+ },
252044
+ };
252045
+ },
252046
+ meta: {
252047
+ docs: { description: 'Require a non-empty lang attribute on the html element' },
252048
+ messages: {
252049
+ [MESSAGE_IDS$1.EMPTY]: 'Unexpected empty `lang` in in `<html>` tag.',
252050
+ [MESSAGE_IDS$1.MISSING]: 'Missing `lang` attribute in `<html>` tag.',
252051
+ },
252052
+ schema: [],
252053
+ type: 'problem',
252054
+ },
252055
+ },
252056
+ });
252057
+
252058
+ const MESSAGE_ID$4 = 'invalid';
252059
+ const VALID_CONTAINERS = new Set(['menu', 'ol', 'ul']);
252060
+ function getClosestParentElement(node) {
252061
+ let parent = node.parent;
252062
+ while (parent) {
252063
+ if (parent instanceof dist$4.TmplAstElement) {
252064
+ return parent;
252065
+ }
252066
+ if (parent instanceof dist$4.TmplAstTemplate) {
252067
+ parent = parent.parent;
252068
+ continue;
252069
+ }
252070
+ break;
252071
+ }
252072
+ return null;
252073
+ }
252074
+ const rule$a = createRule({
252075
+ name: 'require-li-container',
252076
+ rule: {
252077
+ create(context) {
252078
+ return {
252079
+ Element(rawNode) {
252080
+ const node = rawNode;
252081
+ if (node.name !== 'li') {
252082
+ return;
252083
+ }
252084
+ const parent = getClosestParentElement(node);
252085
+ if (parent && VALID_CONTAINERS.has(parent.name)) {
252086
+ return;
252087
+ }
252088
+ context.report({
252089
+ loc: sourceSpanToLoc(node.startSourceSpan),
252090
+ messageId: MESSAGE_ID$4,
252091
+ });
252092
+ },
252093
+ };
252094
+ },
252095
+ meta: {
252096
+ docs: {
252097
+ description: 'Require li elements to be placed inside ul, ol, or menu',
252098
+ },
252099
+ messages: {
252100
+ [MESSAGE_ID$4]: 'Invalid container of `<li>`. <li>` should be in `<ul>`, `<ol>` or `<menu>`.',
252101
+ },
252102
+ schema: [],
252103
+ type: 'problem',
252104
+ },
252105
+ },
252106
+ });
252107
+
252108
+ const MESSAGE_IDS = {
252109
+ EMPTY_TITLE: 'empty',
252110
+ MISSING_TITLE: 'missing',
252111
+ };
252112
+ function hasMeaningfulTitleContent(node) {
252113
+ return node.children.some((child) => {
252114
+ if (!('value' in child)) {
252115
+ return false;
252116
+ }
252117
+ const { value } = child;
252118
+ return (typeof value === 'object' ||
252119
+ (typeof value === 'string' && value.trim().length > 0));
252120
+ });
252121
+ }
252122
+ const rule$9 = createRule({
252123
+ name: 'require-title',
252124
+ rule: {
252125
+ create(context) {
252126
+ let headNode;
252127
+ let headDepth = 0;
252128
+ let titleNode;
252129
+ return {
252130
+ Element(rawNode) {
252131
+ const node = rawNode;
252132
+ if (node.name === 'head') {
252133
+ headNode = node;
252134
+ headDepth++;
252135
+ }
252136
+ else if (headDepth > 0 && node.name === 'title') {
252137
+ titleNode = node;
252138
+ }
252139
+ },
252140
+ 'Element:exit'(rawNode) {
252141
+ const node = rawNode;
252142
+ if (node.name === 'head') {
252143
+ headDepth--;
252144
+ }
252145
+ },
252146
+ 'Program:exit'() {
252147
+ if (!headNode) {
252148
+ return;
252149
+ }
252150
+ if (!titleNode) {
252151
+ context.report({
252152
+ loc: sourceSpanToLoc(headNode.startSourceSpan),
252153
+ messageId: MESSAGE_IDS.MISSING_TITLE,
252154
+ });
252155
+ return;
252156
+ }
252157
+ if (!hasMeaningfulTitleContent(titleNode)) {
252158
+ context.report({
252159
+ loc: sourceSpanToLoc(titleNode.startSourceSpan),
252160
+ messageId: MESSAGE_IDS.EMPTY_TITLE,
252161
+ });
252162
+ }
252163
+ },
252164
+ };
252165
+ },
252166
+ meta: {
252167
+ docs: { description: 'Require a non-empty title element inside head' },
252168
+ messages: {
252169
+ [MESSAGE_IDS.EMPTY_TITLE]: 'Unexpected empty text in `<title><title/>`',
252170
+ [MESSAGE_IDS.MISSING_TITLE]: 'Missing `<title><title/>` in the `<head><head/>`',
252171
+ },
252172
+ schema: [],
252173
+ type: 'problem',
252174
+ },
252175
+ },
252176
+ });
252177
+
251947
252178
  function isArray(node) {
251948
252179
  return node?.type === dist$2.AST_NODE_TYPES.ArrayExpression;
251949
252180
  }
@@ -251962,7 +252193,7 @@ function getImportedName(spec) {
251962
252193
  return spec.imported.value;
251963
252194
  }
251964
252195
 
251965
- const MESSAGE_ID$6 = 'replaceTuiImport';
252196
+ const MESSAGE_ID$3 = 'replaceTuiImport';
251966
252197
  const DEFAULT_DECORATORS = ['Component', 'Directive', 'NgModule', 'Pipe'];
251967
252198
  const DEFAULT_EXCEPTIONS = [
251968
252199
  { from: 'TuiTextfieldOptionsDirective', to: 'TuiTextfield' },
@@ -251971,7 +252202,7 @@ const DEFAULT_EXCEPTIONS = [
251971
252202
  { from: 'TuiIslandDirective', to: 'TuiIsland' },
251972
252203
  { from: 'TuiTableBarsHostComponent', to: 'TuiTableBarsHost' },
251973
252204
  ];
251974
- const rule$d = createRule({
252205
+ const rule$8 = createRule({
251975
252206
  create(context, [{ decorators = DEFAULT_DECORATORS, exceptions = DEFAULT_EXCEPTIONS }]) {
251976
252207
  const sourceCode = context.getSourceCode();
251977
252208
  const importedFromTaiga = {};
@@ -252055,7 +252286,7 @@ const rule$d = createRule({
252055
252286
  fixer.replaceText(importName, short),
252056
252287
  ];
252057
252288
  },
252058
- messageId: MESSAGE_ID$6,
252289
+ messageId: MESSAGE_ID$3,
252059
252290
  node: importName,
252060
252291
  });
252061
252292
  }
@@ -252180,7 +252411,7 @@ function getLeadingIndentation(text) {
252180
252411
  return text.slice(0, index);
252181
252412
  }
252182
252413
 
252183
- const rule$c = createRule({
252414
+ const rule$7 = createRule({
252184
252415
  create(context) {
252185
252416
  const sourceCode = context.sourceCode;
252186
252417
  const getIndentation = (line) => getLeadingIndentation(sourceCode.lines[line - 1] ?? '');
@@ -252341,7 +252572,7 @@ function getSortedNames(elements, source) {
252341
252572
  return [...sortedRegular, ...sortedSpreads].map((n) => nameOf(n, source));
252342
252573
  }
252343
252574
 
252344
- const rule$b = createRule({
252575
+ const rule$6 = createRule({
252345
252576
  create(context, [options]) {
252346
252577
  const allowed = new Set(options.decorators);
252347
252578
  const source = context.sourceCode;
@@ -252397,214 +252628,6 @@ const rule$b = createRule({
252397
252628
  name: 'standalone-imports-sort',
252398
252629
  });
252399
252630
 
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) => child instanceof dist$4.TmplAstBoundText ||
252567
- (child instanceof dist$4.TmplAstText && child.value.trim().length > 0));
252568
- }
252569
- const rule$6 = createRule({
252570
- name: 'require-title',
252571
- rule: {
252572
- create(context) {
252573
- return {
252574
- Element(rawNode) {
252575
- const node = rawNode;
252576
- if (node.name !== 'head') {
252577
- return;
252578
- }
252579
- const title = node.children.find((child) => child instanceof dist$4.TmplAstElement && child.name === 'title');
252580
- if (!title) {
252581
- context.report({
252582
- loc: sourceSpanToLoc(node.startSourceSpan),
252583
- messageId: MESSAGE_IDS.MISSING_TITLE,
252584
- });
252585
- return;
252586
- }
252587
- if (!hasMeaningfulTitleContent(title)) {
252588
- context.report({
252589
- loc: sourceSpanToLoc(title.startSourceSpan),
252590
- messageId: MESSAGE_IDS.EMPTY_TITLE,
252591
- });
252592
- }
252593
- },
252594
- };
252595
- },
252596
- meta: {
252597
- docs: { description: 'Require a non-empty title element inside head' },
252598
- messages: {
252599
- [MESSAGE_IDS.EMPTY_TITLE]: 'Unexpected empty text in `<title><title/>`',
252600
- [MESSAGE_IDS.MISSING_TITLE]: 'Missing `<title><title/>` in the `<head><head/>`',
252601
- },
252602
- schema: [],
252603
- type: 'problem',
252604
- },
252605
- },
252606
- });
252607
-
252608
252631
  const config$1 = {
252609
252632
  create(context) {
252610
252633
  const classesInFile = new Map();
@@ -253472,51 +253495,51 @@ const plugin = {
253472
253495
  'array-as-const': rule$5,
253473
253496
  'attrs-newline': rule$M,
253474
253497
  'class-property-naming': rule$4,
253475
- 'decorator-key-sort': rule$E,
253476
- 'element-newline': rule$L,
253498
+ 'decorator-key-sort': rule$L,
253499
+ 'element-newline': rule$K,
253477
253500
  'flat-exports': rule$3,
253478
- 'host-attributes-sort': rule$D,
253479
- 'html-logical-properties': rule$C,
253480
- 'injection-token-description': rule$B,
253481
- 'no-commonjs-import-patterns': rule$A,
253482
- 'no-deep-imports': rule$z,
253483
- 'no-deep-imports-to-indexed-packages': rule$y,
253484
- 'no-duplicate-attrs': rule$K,
253485
- 'no-duplicate-id': rule$J,
253486
- 'no-duplicate-in-head': rule$I,
253487
- 'no-fully-untracked-effect': rule$x,
253488
- 'no-href-with-router-link': rule$w,
253489
- 'no-implicit-public': rule$v,
253490
- 'no-import-assertions': rule$u,
253491
- 'no-infinite-loop': rule$t,
253492
- 'no-legacy-peer-deps': rule$s,
253493
- 'no-obsolete-attrs': rule$H,
253494
- 'no-obsolete-tags': rule$G,
253495
- 'no-playwright-empty-fill': rule$r,
253496
- 'no-project-as-in-ng-template': rule$q,
253497
- 'no-redundant-type-annotation': rule$p,
253501
+ 'host-attributes-sort': rule$J,
253502
+ 'html-logical-properties': rule$I,
253503
+ 'injection-token-description': rule$H,
253504
+ 'no-commonjs-import-patterns': rule$G,
253505
+ 'no-deep-imports': rule$F,
253506
+ 'no-deep-imports-to-indexed-packages': rule$E,
253507
+ 'no-duplicate-attrs': rule$D,
253508
+ 'no-duplicate-id': rule$C,
253509
+ 'no-duplicate-in-head': rule$B,
253510
+ 'no-fully-untracked-effect': rule$A,
253511
+ 'no-href-with-router-link': rule$z,
253512
+ 'no-implicit-public': rule$y,
253513
+ 'no-import-assertions': rule$x,
253514
+ 'no-infinite-loop': rule$w,
253515
+ 'no-legacy-peer-deps': rule$v,
253516
+ 'no-obsolete-attrs': rule$u,
253517
+ 'no-obsolete-tags': rule$t,
253518
+ 'no-playwright-empty-fill': rule$s,
253519
+ 'no-project-as-in-ng-template': rule$r,
253520
+ 'no-redundant-type-annotation': rule$q,
253498
253521
  'no-restricted-attr-values': rule$2,
253499
- 'no-side-effects-in-computed': rule$o,
253500
- 'no-signal-reads-after-await-in-reactive-context': rule$n,
253501
- 'no-string-literal-concat': rule$m,
253502
- 'no-untracked-outside-reactive-context': rule$l,
253503
- 'no-useless-untracked': rule$k,
253504
- 'object-single-line': rule$j,
253505
- 'prefer-combined-if-control-flow': rule$i,
253522
+ 'no-side-effects-in-computed': rule$p,
253523
+ 'no-signal-reads-after-await-in-reactive-context': rule$o,
253524
+ 'no-string-literal-concat': rule$n,
253525
+ 'no-untracked-outside-reactive-context': rule$m,
253526
+ 'no-useless-untracked': rule$l,
253527
+ 'object-single-line': rule$k,
253528
+ 'prefer-combined-if-control-flow': rule$j,
253506
253529
  'prefer-deep-imports': rule$1,
253507
- 'prefer-multi-arg-push': rule$h,
253508
- 'prefer-namespace-keyword': rule$g,
253509
- 'prefer-untracked-incidental-signal-reads': rule$f,
253510
- 'prefer-untracked-signal-getter': rule$e,
253511
- quotes: rule$F,
253512
- 'require-doctype': rule$a,
253513
- 'require-img-alt': rule$9,
253514
- 'require-lang': rule$8,
253515
- 'require-li-container': rule$7,
253516
- 'require-title': rule$6,
253517
- 'short-tui-imports': rule$d,
253518
- 'single-line-class-property-spacing': rule$c,
253519
- 'standalone-imports-sort': rule$b,
253530
+ 'prefer-multi-arg-push': rule$i,
253531
+ 'prefer-namespace-keyword': rule$h,
253532
+ 'prefer-untracked-incidental-signal-reads': rule$g,
253533
+ 'prefer-untracked-signal-getter': rule$f,
253534
+ quotes: rule$e,
253535
+ 'require-doctype': rule$d,
253536
+ 'require-img-alt': rule$c,
253537
+ 'require-lang': rule$b,
253538
+ 'require-li-container': rule$a,
253539
+ 'require-title': rule$9,
253540
+ 'short-tui-imports': rule$8,
253541
+ 'single-line-class-property-spacing': rule$7,
253542
+ 'standalone-imports-sort': rule$6,
253520
253543
  'strict-tui-doc-example': rule,
253521
253544
  },
253522
253545
  };