eslint-plugin-baseline-js 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -7,6 +7,7 @@
7
7
  Enforce the JavaScript Baseline (`widely` / `newly` / `year`) with a single ESLint rule powered by web‑features.
8
8
  This plugin delegates detection to eslint-plugin-es-x and ESLint core (plus a few small gap‑filling rules) and reports with one consistent Baseline message.
9
9
 
10
+ [![npm](https://img.shields.io/npm/v/eslint-plugin-baseline-js?logoColor=green&color=green)](https://www.npmjs.com/package/eslint-plugin-baseline-js)
10
11
  [![CI](https://github.com/3ru/eslint-plugin-baseline-js/actions/workflows/ci.yml/badge.svg)](https://github.com/3ru/eslint-plugin-baseline-js/actions/workflows/ci.yml)
11
12
  [![Release](https://github.com/3ru/eslint-plugin-baseline-js/actions/workflows/release.yml/badge.svg)](https://github.com/3ru/eslint-plugin-baseline-js/actions/workflows/release.yml)
12
13
  <img alt="License" src="https://img.shields.io/badge/license-MIT-blue" />
@@ -56,11 +57,11 @@ export default [
56
57
 
57
58
  // Recommended: enables Web APIs & JS builtins detection with `preset: 'auto'`.
58
59
  // Level defaults to 'error'; pass level to change severity
59
- ...baselineJs.configs.recommended({ available: "widely", level: "warn" }),
60
+ baselineJs.configs.recommended({ available: "widely", level: "warn" }),
60
61
 
61
62
  // TypeScript-aware: requires type info for instance-member checks (`preset: 'type-aware'`).
62
63
  // Works best with @typescript-eslint/parser and a proper tsconfig.
63
- // ...baselineJs.configs["recommended-ts"]({ available: "widely", level: "error" }),
64
+ // baselineJs.configs["recommended-ts"]({ available: "widely", level: "error" }),
64
65
  ];
65
66
  ```
66
67
 
@@ -117,9 +118,9 @@ export default [
117
118
 
118
119
  ## How It Works
119
120
 
120
- 1. Data → `scripts/build-features.mjs`
121
- - Extracts the minimal JavaScript subset from [`web‑features`](https://github.com/web-platform-dx/web-features) into `src/baseline/features.ts`.
122
- 2. Mapping → `src/baseline/mapping.mjs`
121
+ 1. Data → `scripts/data/build-features.mjs`
122
+ - Extracts the minimal JavaScript subset from [`web‑features`](https://github.com/web-platform-dx/web-features) into `src/baseline/data/features.javascript.ts`.
123
+ 2. Mapping → `src/baseline/mapping/syntax.ts`
123
124
  - Maps web‑features IDs to underlying rules (prefer `eslint-plugin-es-x` / ESLint core; custom rules only when necessary).
124
125
  3. Resolution → `src/baseline/resolve.ts`
125
126
  - Classifies “beyond baseline” by bucket (`high/low/false → widely/newly/limited`) or year.
@@ -131,7 +132,7 @@ and shows which ones are currently mapped by this plugin.
131
132
 
132
133
  - Report: [docs/coverage.md](docs/coverage.md)
133
134
  - Regenerate locally: `pnpm gen:coverage`
134
- - The release workflow also regenerates and commits this file.
135
+ - Generator: `scripts/coverage/generate-coverage.mjs`
135
136
 
136
137
  ## Options (rule)
137
138
 
package/dist/index.cjs CHANGED
@@ -26,13 +26,10 @@ let eslint_use_at_your_own_risk = require("eslint/use-at-your-own-risk");
26
26
  eslint_use_at_your_own_risk = __toESM(eslint_use_at_your_own_risk);
27
27
  let eslint_plugin_es_x = require("eslint-plugin-es-x");
28
28
  eslint_plugin_es_x = __toESM(eslint_plugin_es_x);
29
+ let node_module = require("node:module");
30
+ node_module = __toESM(node_module);
29
31
 
30
32
  //#region src/configs/baseline.ts
31
- function baselineConfigs(opts = {}) {
32
- const available = opts.available ?? opts.baseline ?? "widely";
33
- const level = opts.level ?? "error";
34
- return [{ rules: { "baseline-js/use-baseline": [level, { available }] } }];
35
- }
36
33
  /**
37
34
  * Recommended config: enable Baseline with Web APIs and JS builtins detection on auto preset.
38
35
  * - baseline: defaults to 'widely'
@@ -41,11 +38,14 @@ function baselineConfigs(opts = {}) {
41
38
  function recommendedConfig(opts = {}) {
42
39
  const available = opts.available ?? opts.baseline ?? "widely";
43
40
  const level = opts.level ?? "error";
44
- return [{ rules: { "baseline-js/use-baseline": [level, {
45
- available,
46
- includeWebApis: { preset: "auto" },
47
- includeJsBuiltins: { preset: "auto" }
48
- }] } }];
41
+ return {
42
+ files: ["**/*.{js,cjs,mjs,jsx}"],
43
+ rules: { "baseline-js/use-baseline": [level, {
44
+ available,
45
+ includeWebApis: { preset: "auto" },
46
+ includeJsBuiltins: { preset: "auto" }
47
+ }] }
48
+ };
49
49
  }
50
50
  /**
51
51
  * Recommended config for TypeScript-aware projects:
@@ -55,11 +55,14 @@ function recommendedConfig(opts = {}) {
55
55
  function recommendedTsConfig(opts = {}) {
56
56
  const available = opts.available ?? opts.baseline ?? "widely";
57
57
  const level = opts.level ?? "error";
58
- return [{ rules: { "baseline-js/use-baseline": [level, {
59
- available,
60
- includeWebApis: { preset: "type-aware" },
61
- includeJsBuiltins: { preset: "type-aware" }
62
- }] } }];
58
+ return {
59
+ files: ["**/*.{ts,tsx}"],
60
+ rules: { "baseline-js/use-baseline": [level, {
61
+ available,
62
+ includeWebApis: { preset: "type-aware" },
63
+ includeJsBuiltins: { preset: "type-aware" }
64
+ }] }
65
+ };
63
66
  }
64
67
 
65
68
  //#endregion
@@ -45259,9 +45262,6 @@ function getIncludedDescriptors(opts) {
45259
45262
 
45260
45263
  //#endregion
45261
45264
  //#region src/baseline/mapping/syntax.ts
45262
- /**
45263
- * @fileoverview Mapping of web-features JavaScript feature IDs to delegate ESLint rules.
45264
- */
45265
45265
  var syntax_default = {
45266
45266
  "nullish-coalescing": {
45267
45267
  kind: "syntax",
@@ -45295,7 +45295,7 @@ var syntax_default = {
45295
45295
  level: "error"
45296
45296
  }]
45297
45297
  },
45298
- "numeric-seperators": {
45298
+ "numeric-separators": {
45299
45299
  kind: "syntax",
45300
45300
  delegates: [{
45301
45301
  plugin: "es-x",
@@ -45491,6 +45491,14 @@ var syntax_default = {
45491
45491
  level: "error"
45492
45492
  }]
45493
45493
  },
45494
+ iterators: {
45495
+ kind: "syntax",
45496
+ delegates: [{
45497
+ plugin: "es-x",
45498
+ rule: "no-for-of-loops",
45499
+ level: "error"
45500
+ }]
45501
+ },
45494
45502
  bigint64array: {
45495
45503
  kind: "syntax",
45496
45504
  delegates: [{
@@ -53363,7 +53371,7 @@ var features_javascript_default = {
53363
53371
  "arguments-callee": {
53364
53372
  "id": "arguments-callee",
53365
53373
  "name": "arguments.callee",
53366
- "group": "javascript",
53374
+ "group": ["javascript"],
53367
53375
  "status": {
53368
53376
  "baseline": false,
53369
53377
  "support": {
@@ -53381,7 +53389,7 @@ var features_javascript_default = {
53381
53389
  "async-await": {
53382
53390
  "id": "async-await",
53383
53391
  "name": "Async functions",
53384
- "group": "javascript",
53392
+ "group": ["javascript"],
53385
53393
  "status": {
53386
53394
  "baseline": "high",
53387
53395
  "baseline_low_date": "2017-04-05",
@@ -53400,7 +53408,7 @@ var features_javascript_default = {
53400
53408
  "async-generators": {
53401
53409
  "id": "async-generators",
53402
53410
  "name": "Async generators",
53403
- "group": "javascript",
53411
+ "group": ["javascript"],
53404
53412
  "status": {
53405
53413
  "baseline": "high",
53406
53414
  "baseline_low_date": "2020-01-15",
@@ -53419,7 +53427,7 @@ var features_javascript_default = {
53419
53427
  "atomics-wait-async": {
53420
53428
  "id": "atomics-wait-async",
53421
53429
  "name": "Atomics.waitAsync",
53422
- "group": "javascript",
53430
+ "group": ["javascript"],
53423
53431
  "status": {
53424
53432
  "baseline": false,
53425
53433
  "support": {
@@ -53434,7 +53442,7 @@ var features_javascript_default = {
53434
53442
  "bigint": {
53435
53443
  "id": "bigint",
53436
53444
  "name": "BigInt",
53437
- "group": "javascript",
53445
+ "group": ["javascript"],
53438
53446
  "status": {
53439
53447
  "baseline": "high",
53440
53448
  "baseline_low_date": "2020-09-16",
@@ -53453,7 +53461,7 @@ var features_javascript_default = {
53453
53461
  "bigint64array": {
53454
53462
  "id": "bigint64array",
53455
53463
  "name": "BigInt64Array",
53456
- "group": "javascript",
53464
+ "group": ["javascript"],
53457
53465
  "status": {
53458
53466
  "baseline": "high",
53459
53467
  "baseline_low_date": "2021-09-20",
@@ -53472,7 +53480,7 @@ var features_javascript_default = {
53472
53480
  "class-syntax": {
53473
53481
  "id": "class-syntax",
53474
53482
  "name": "Classes",
53475
- "group": "javascript",
53483
+ "group": ["javascript"],
53476
53484
  "status": {
53477
53485
  "baseline": "high",
53478
53486
  "baseline_low_date": "2016-03-08",
@@ -53491,7 +53499,7 @@ var features_javascript_default = {
53491
53499
  "date-get-year-set-year": {
53492
53500
  "id": "date-get-year-set-year",
53493
53501
  "name": "getYear() and setYear()",
53494
- "group": "javascript",
53502
+ "group": ["javascript"],
53495
53503
  "status": {
53496
53504
  "baseline": false,
53497
53505
  "support": {
@@ -53509,7 +53517,7 @@ var features_javascript_default = {
53509
53517
  "destructuring": {
53510
53518
  "id": "destructuring",
53511
53519
  "name": "Destructuring",
53512
- "group": "javascript",
53520
+ "group": ["javascript"],
53513
53521
  "status": {
53514
53522
  "baseline": "high",
53515
53523
  "baseline_low_date": "2020-01-15",
@@ -53528,7 +53536,7 @@ var features_javascript_default = {
53528
53536
  "escape-unescape": {
53529
53537
  "id": "escape-unescape",
53530
53538
  "name": "escape() and unescape()",
53531
- "group": "javascript",
53539
+ "group": ["javascript"],
53532
53540
  "status": {
53533
53541
  "baseline": false,
53534
53542
  "support": {
@@ -53546,7 +53554,7 @@ var features_javascript_default = {
53546
53554
  "exponentiation": {
53547
53555
  "id": "exponentiation",
53548
53556
  "name": "Exponentiation operator",
53549
- "group": "javascript",
53557
+ "group": ["javascript"],
53550
53558
  "status": {
53551
53559
  "baseline": "high",
53552
53560
  "baseline_low_date": "2017-03-27",
@@ -53565,7 +53573,7 @@ var features_javascript_default = {
53565
53573
  "functions": {
53566
53574
  "id": "functions",
53567
53575
  "name": "Functions",
53568
- "group": "javascript",
53576
+ "group": ["javascript"],
53569
53577
  "status": {
53570
53578
  "baseline": "high",
53571
53579
  "baseline_low_date": "2015-07-29",
@@ -53584,7 +53592,7 @@ var features_javascript_default = {
53584
53592
  "functions-caller-arguments": {
53585
53593
  "id": "functions-caller-arguments",
53586
53594
  "name": "Function caller and arguments",
53587
- "group": "javascript",
53595
+ "group": ["javascript"],
53588
53596
  "status": {
53589
53597
  "baseline": false,
53590
53598
  "support": {
@@ -53602,7 +53610,7 @@ var features_javascript_default = {
53602
53610
  "generators": {
53603
53611
  "id": "generators",
53604
53612
  "name": "Generators",
53605
- "group": "javascript",
53613
+ "group": ["javascript"],
53606
53614
  "status": {
53607
53615
  "baseline": "high",
53608
53616
  "baseline_low_date": "2016-09-20",
@@ -53621,7 +53629,7 @@ var features_javascript_default = {
53621
53629
  "globalthis": {
53622
53630
  "id": "globalthis",
53623
53631
  "name": "globalThis",
53624
- "group": "javascript",
53632
+ "group": ["javascript"],
53625
53633
  "status": {
53626
53634
  "baseline": "high",
53627
53635
  "baseline_low_date": "2020-01-15",
@@ -53640,7 +53648,7 @@ var features_javascript_default = {
53640
53648
  "hashbang-comments": {
53641
53649
  "id": "hashbang-comments",
53642
53650
  "name": "Hashbang comments",
53643
- "group": "javascript",
53651
+ "group": ["javascript"],
53644
53652
  "status": {
53645
53653
  "baseline": "high",
53646
53654
  "baseline_low_date": "2020-03-24",
@@ -53659,7 +53667,7 @@ var features_javascript_default = {
53659
53667
  "html-wrapper-methods": {
53660
53668
  "id": "html-wrapper-methods",
53661
53669
  "name": "HTML wrapper methods",
53662
- "group": "javascript",
53670
+ "group": ["javascript"],
53663
53671
  "status": {
53664
53672
  "baseline": false,
53665
53673
  "support": {
@@ -53680,7 +53688,7 @@ var features_javascript_default = {
53680
53688
  "javascript": {
53681
53689
  "id": "javascript",
53682
53690
  "name": "JavaScript (initial core language support)",
53683
- "group": "javascript",
53691
+ "group": ["javascript"],
53684
53692
  "status": {
53685
53693
  "baseline": "high",
53686
53694
  "baseline_low_date": "2015-07-29",
@@ -53699,7 +53707,7 @@ var features_javascript_default = {
53699
53707
  "let-const": {
53700
53708
  "id": "let-const",
53701
53709
  "name": "Let and const",
53702
- "group": "javascript",
53710
+ "group": ["javascript"],
53703
53711
  "status": {
53704
53712
  "baseline": "high",
53705
53713
  "baseline_low_date": "2016-09-20",
@@ -53718,7 +53726,7 @@ var features_javascript_default = {
53718
53726
  "logical-assignments": {
53719
53727
  "id": "logical-assignments",
53720
53728
  "name": "Logical assignments",
53721
- "group": "javascript",
53729
+ "group": ["javascript"],
53722
53730
  "status": {
53723
53731
  "baseline": "high",
53724
53732
  "baseline_low_date": "2020-09-16",
@@ -53737,7 +53745,7 @@ var features_javascript_default = {
53737
53745
  "math-sum-precise": {
53738
53746
  "id": "math-sum-precise",
53739
53747
  "name": "Math.sumPrecise()",
53740
- "group": "javascript",
53748
+ "group": ["javascript"],
53741
53749
  "status": {
53742
53750
  "baseline": false,
53743
53751
  "support": {
@@ -53749,7 +53757,7 @@ var features_javascript_default = {
53749
53757
  "nullish-coalescing": {
53750
53758
  "id": "nullish-coalescing",
53751
53759
  "name": "Nullish coalescing",
53752
- "group": "javascript",
53760
+ "group": ["javascript"],
53753
53761
  "status": {
53754
53762
  "baseline": "high",
53755
53763
  "baseline_low_date": "2020-09-16",
@@ -53765,10 +53773,10 @@ var features_javascript_default = {
53765
53773
  }
53766
53774
  }
53767
53775
  },
53768
- "numeric-seperators": {
53769
- "id": "numeric-seperators",
53776
+ "numeric-separators": {
53777
+ "id": "numeric-separators",
53770
53778
  "name": "Numeric separators",
53771
- "group": "javascript",
53779
+ "group": ["javascript"],
53772
53780
  "status": {
53773
53781
  "baseline": "high",
53774
53782
  "baseline_low_date": "2020-07-28",
@@ -53787,7 +53795,7 @@ var features_javascript_default = {
53787
53795
  "optional-catch-binding": {
53788
53796
  "id": "optional-catch-binding",
53789
53797
  "name": "Optional catch binding",
53790
- "group": "javascript",
53798
+ "group": ["javascript"],
53791
53799
  "status": {
53792
53800
  "baseline": "high",
53793
53801
  "baseline_low_date": "2020-01-15",
@@ -53806,7 +53814,7 @@ var features_javascript_default = {
53806
53814
  "proxy-reflect": {
53807
53815
  "id": "proxy-reflect",
53808
53816
  "name": "Proxy and Reflect",
53809
- "group": "javascript",
53817
+ "group": ["javascript"],
53810
53818
  "status": {
53811
53819
  "baseline": "high",
53812
53820
  "baseline_low_date": "2016-09-20",
@@ -53825,7 +53833,7 @@ var features_javascript_default = {
53825
53833
  "shared-memory": {
53826
53834
  "id": "shared-memory",
53827
53835
  "name": "SharedArrayBuffer and Atomics",
53828
- "group": "javascript",
53836
+ "group": ["javascript"],
53829
53837
  "status": {
53830
53838
  "baseline": "high",
53831
53839
  "baseline_low_date": "2021-12-13",
@@ -53844,7 +53852,7 @@ var features_javascript_default = {
53844
53852
  "spread": {
53845
53853
  "id": "spread",
53846
53854
  "name": "Spread syntax",
53847
- "group": "javascript",
53855
+ "group": ["javascript"],
53848
53856
  "status": {
53849
53857
  "baseline": "high",
53850
53858
  "baseline_low_date": "2020-01-15",
@@ -53863,7 +53871,7 @@ var features_javascript_default = {
53863
53871
  "template-literals": {
53864
53872
  "id": "template-literals",
53865
53873
  "name": "Template literals",
53866
- "group": "javascript",
53874
+ "group": ["javascript"],
53867
53875
  "status": {
53868
53876
  "baseline": "high",
53869
53877
  "baseline_low_date": "2020-01-15",
@@ -53882,7 +53890,7 @@ var features_javascript_default = {
53882
53890
  "temporal": {
53883
53891
  "id": "temporal",
53884
53892
  "name": "Temporal",
53885
- "group": "javascript",
53893
+ "group": ["javascript"],
53886
53894
  "status": {
53887
53895
  "baseline": false,
53888
53896
  "support": {
@@ -53894,7 +53902,7 @@ var features_javascript_default = {
53894
53902
  "top-level-await": {
53895
53903
  "id": "top-level-await",
53896
53904
  "name": "Top-level await",
53897
- "group": "javascript",
53905
+ "group": ["javascript"],
53898
53906
  "status": {
53899
53907
  "baseline": "high",
53900
53908
  "baseline_low_date": "2021-09-20",
@@ -53913,7 +53921,7 @@ var features_javascript_default = {
53913
53921
  "unicode-point-escapes": {
53914
53922
  "id": "unicode-point-escapes",
53915
53923
  "name": "Unicode point escapes",
53916
- "group": "javascript",
53924
+ "group": ["javascript"],
53917
53925
  "status": {
53918
53926
  "baseline": "high",
53919
53927
  "baseline_low_date": "2015-09-30",
@@ -53932,7 +53940,7 @@ var features_javascript_default = {
53932
53940
  "weak-references": {
53933
53941
  "id": "weak-references",
53934
53942
  "name": "Weak references",
53935
- "group": "javascript",
53943
+ "group": ["javascript"],
53936
53944
  "status": {
53937
53945
  "baseline": "high",
53938
53946
  "baseline_low_date": "2021-04-26",
@@ -53951,7 +53959,7 @@ var features_javascript_default = {
53951
53959
  "with": {
53952
53960
  "id": "with",
53953
53961
  "name": "with",
53954
- "group": "javascript",
53962
+ "group": ["javascript"],
53955
53963
  "status": {
53956
53964
  "baseline": false,
53957
53965
  "support": {
@@ -55813,6 +55821,7 @@ function isBeyondBaseline(featureId, baseline) {
55813
55821
  if (baseline === "widely") return bucket !== "widely";
55814
55822
  if (baseline === "newly") return bucket === "limited";
55815
55823
  if (typeof baseline === "number") {
55824
+ if (bucket === "limited") return true;
55816
55825
  const y = yearFrom(rec.status?.baseline_low_date) ?? yearFrom(rec.status?.baseline_high_date);
55817
55826
  if (y == null) return false;
55818
55827
  return y > baseline;
@@ -56201,6 +56210,8 @@ const rule$2 = {
56201
56210
  },
56202
56211
  MemberExpression(node) {
56203
56212
  const m = node;
56213
+ const parent = m.parent;
56214
+ if (parent?.type === "CallExpression" && parent.callee === node) return;
56204
56215
  if (m.computed === false && m.object?.type === "Identifier" && m.object?.name === "Math" && m.property?.type === "Identifier" && m.property?.name === "sumPrecise") report(m.property);
56205
56216
  }
56206
56217
  };
@@ -56242,8 +56253,87 @@ const rule$1 = {
56242
56253
  };
56243
56254
  var no_temporal_default = rule$1;
56244
56255
 
56256
+ //#endregion
56257
+ //#region src/utils/rule-resolver.ts
56258
+ /**
56259
+ * Normalize ESM/CJS export shapes for ESLint plugins.
56260
+ * Some toolchains expose plugins as `{ rules }` or under `{ default: { rules } }`.
56261
+ * This helper selects whichever shape is present and returns the rules map.
56262
+ */
56263
+ function resolvePluginRules(mod) {
56264
+ if (!mod || typeof mod !== "object" && typeof mod !== "function") return void 0;
56265
+ const m = mod;
56266
+ const rules$1 = m.rules ?? m.default?.rules;
56267
+ if (rules$1 && typeof rules$1 === "object") return rules$1;
56268
+ }
56269
+ /**
56270
+ * Resolve rules for eslint-plugin-es-x in a robust way.
56271
+ * Why: In CI (Node 22 / ESLint 9), ESM interop may attach rules under
56272
+ * `default.rules` instead of `rules`. Only checking `esx.rules` meant no
56273
+ * delegates were created and tests failed.
56274
+ * Approach: Prefer loading the CommonJS entry via `createRequire` to avoid
56275
+ * interop variance, then normalize the export with `resolvePluginRules()`.
56276
+ */
56277
+ function resolveEsxRules() {
56278
+ try {
56279
+ const m = (0, node_module.createRequire)(require("url").pathToFileURL(__filename).href)("eslint-plugin-es-x");
56280
+ const rules$1 = resolvePluginRules(m);
56281
+ if (rules$1) return rules$1;
56282
+ } catch {}
56283
+ }
56284
+ /**
56285
+ * Try resolving es-x rules from a provided module first (ESM import),
56286
+ * then fall back to the CommonJS `require` path if needed.
56287
+ */
56288
+ function resolveEsxRulesFrom(mod) {
56289
+ const fromImport = mod ? resolvePluginRules(mod) : void 0;
56290
+ if (fromImport) return fromImport;
56291
+ return resolveEsxRules();
56292
+ }
56293
+ function getEsxRule(name) {
56294
+ if (!esxRulesResolved) {
56295
+ esxRulesCache = resolveEsxRules();
56296
+ esxRulesResolved = true;
56297
+ }
56298
+ return esxRulesCache?.[name];
56299
+ }
56300
+ let esxRulesCache;
56301
+ let esxRulesResolved = false;
56302
+
56303
+ //#endregion
56304
+ //#region src/utils/delegate-resolver.ts
56305
+ let selfRules = null;
56306
+ function registerSelfRules(rules$1) {
56307
+ selfRules = rules$1;
56308
+ }
56309
+ function resolveEsx(name) {
56310
+ return resolveEsxRulesFrom(eslint_plugin_es_x.default)?.[name] || getEsxRule(name);
56311
+ }
56312
+ const registry = {
56313
+ "es-x": resolveEsx,
56314
+ self: (name) => selfRules ? selfRules[name] : void 0,
56315
+ core: (name) => eslint_use_at_your_own_risk.builtinRules.get(name)
56316
+ };
56317
+ function resolveDelegateRule(plugin, name) {
56318
+ const resolver = registry[plugin];
56319
+ if (!resolver) return void 0;
56320
+ return resolver(name);
56321
+ }
56322
+ /**
56323
+ * Debug helper: list available resolver aliases. Used when BASELINE_DEBUG=1.
56324
+ */
56325
+ function listResolverPlugins() {
56326
+ return Object.keys(registry).sort();
56327
+ }
56328
+
56245
56329
  //#endregion
56246
56330
  //#region src/orchestrator/use-baseline.ts
56331
+ registerSelfRules({
56332
+ "no-bigint64array": no_bigint64array_default,
56333
+ "no-function-caller-arguments": no_function_caller_arguments_default,
56334
+ "no-math-sum-precise": no_math_sum_precise_default,
56335
+ "no-temporal": no_temporal_default
56336
+ });
56247
56337
  function mergeListeners(target, add) {
56248
56338
  const tgt = target;
56249
56339
  for (const [event, handler] of Object.entries(add)) {
@@ -56259,11 +56349,14 @@ function mergeListeners(target, add) {
56259
56349
  }
56260
56350
  }
56261
56351
  function baselineMessage(featureId, baseline) {
56262
- if (baseline === "widely") return `Feature '${featureId}' is not a widely available Baseline feature.`;
56263
- if (baseline === "newly") return `Feature '${featureId}' is not a newly available Baseline feature.`;
56264
56352
  const rec = getFeatureRecord(featureId);
56353
+ const label = rec?.name || featureId;
56354
+ const idSuffix = rec?.name ? ` (${featureId})` : "";
56355
+ if (baseline === "widely") return `Feature '${label}'${idSuffix} is not a widely available Baseline feature.`;
56356
+ if (baseline === "newly") return `Feature '${label}'${idSuffix} is not a newly available Baseline feature.`;
56357
+ if (rec?.status?.baseline === false) return `Feature '${label}'${idSuffix} has Limited availability and exceeds ${baseline}.`;
56265
56358
  const year = rec?.status?.baseline_low_date?.slice(0, 4) || rec?.status?.baseline_high_date?.slice(0, 4) || "unknown";
56266
- return `Feature '${featureId}' became Baseline in ${year} and exceeds ${baseline}.`;
56359
+ return `Feature '${label}'${idSuffix} became Baseline in ${year} and exceeds ${baseline}.`;
56267
56360
  }
56268
56361
  const rule = {
56269
56362
  meta: {
@@ -56353,6 +56446,15 @@ const rule = {
56353
56446
  }]
56354
56447
  },
56355
56448
  create(ctx) {
56449
+ const _DEBUG = process.env.BASELINE_DEBUG === "1";
56450
+ const getFilename = ctx.getFilename;
56451
+ let filename = null;
56452
+ if (typeof getFilename === "function") try {
56453
+ filename = getFilename();
56454
+ } catch {}
56455
+ if (filename) {
56456
+ if (!/\.(?:[mc]?[jt]s|[jt]sx)$/i.test(filename)) return {};
56457
+ }
56356
56458
  const opt = ctx.options[0] ?? {};
56357
56459
  const baseline = getBaselineValue(opt);
56358
56460
  const ignoreFeaturePatterns = opt.ignoreFeatures ?? [];
@@ -56390,6 +56492,9 @@ const rule = {
56390
56492
  }
56391
56493
  const listeners = {};
56392
56494
  const mappedFeatureIds = new Set(entries.map((e) => e.featureId));
56495
+ if (_DEBUG) try {
56496
+ console.log(`[baseline-js] resolvers=${listResolverPlugins().join(",")} entries=${entries.length}`);
56497
+ } catch {}
56393
56498
  for (const { featureId, delegateRule } of entries) {
56394
56499
  let impl;
56395
56500
  let delegateOptions = [];
@@ -56400,21 +56505,10 @@ const rule = {
56400
56505
  if (d?.options) delegateOptions = Array.isArray(d.options) ? d.options : [d.options];
56401
56506
  }
56402
56507
  const { plugin, name } = parseDelegateRuleKey(delegateRule);
56403
- if (plugin === "core") {
56404
- const coreName = name;
56405
- impl = eslint_use_at_your_own_risk.builtinRules.get(coreName);
56406
- } else if (plugin === "self") {
56407
- const selfName = name;
56408
- impl = {
56409
- "no-bigint64array": no_bigint64array_default,
56410
- "no-function-caller-arguments": no_function_caller_arguments_default,
56411
- "no-math-sum-precise": no_math_sum_precise_default,
56412
- "no-temporal": no_temporal_default
56413
- }[selfName];
56414
- } else impl = eslint_plugin_es_x.default.rules?.[name];
56508
+ impl = resolveDelegateRule(plugin, name);
56415
56509
  if (!impl?.create) continue;
56416
56510
  const delegateCtx = {};
56417
- const fwd = [
56511
+ for (const k of [
56418
56512
  "getSourceCode",
56419
56513
  "getCwd",
56420
56514
  "getFilename",
@@ -56423,15 +56517,13 @@ const rule = {
56423
56517
  "getDeclaredVariables",
56424
56518
  "markVariableAsUsed",
56425
56519
  "getScope"
56426
- ];
56427
- for (const k of fwd) {
56520
+ ]) {
56428
56521
  const v = ctx[k];
56429
56522
  if (typeof v === "function") delegateCtx[k] = v.bind(ctx);
56430
56523
  }
56431
56524
  for (const k of [
56432
56525
  "settings",
56433
56526
  "parserPath",
56434
- "parserOptions",
56435
56527
  "parserServices",
56436
56528
  "languageOptions",
56437
56529
  "sourceCode"
@@ -56439,6 +56531,10 @@ const rule = {
56439
56531
  const src = ctx;
56440
56532
  if (src[k] != null) delegateCtx[k] = src[k];
56441
56533
  }
56534
+ delegateCtx.parserOptions = {
56535
+ ...ctx.parserOptions ?? {},
56536
+ ecmaVersion: 3
56537
+ };
56442
56538
  delegateCtx.options = delegateOptions;
56443
56539
  delegateCtx.report = function report(arg) {
56444
56540
  const node = typeof arg === "object" && arg !== null && "node" in arg ? arg.node : arg;
@@ -56482,7 +56578,7 @@ const rule = {
56482
56578
  const messages = {};
56483
56579
  for (const d of descriptors$2) messages[d.featureId] = baselineMessage(d.featureId, baseline);
56484
56580
  const delegateCtx = {};
56485
- const fwd = [
56581
+ for (const k of [
56486
56582
  "getSourceCode",
56487
56583
  "getCwd",
56488
56584
  "getFilename",
@@ -56491,8 +56587,7 @@ const rule = {
56491
56587
  "getDeclaredVariables",
56492
56588
  "markVariableAsUsed",
56493
56589
  "getScope"
56494
- ];
56495
- for (const k of fwd) {
56590
+ ]) {
56496
56591
  const v = ctx[k];
56497
56592
  if (typeof v === "function") delegateCtx[k] = v.bind(ctx);
56498
56593
  }
@@ -56522,7 +56617,8 @@ const rule = {
56522
56617
  const t = node?.type;
56523
56618
  if (t && matchIgnoreNodeType(t)) return;
56524
56619
  }
56525
- const msg = isObj && arg.message || void 0;
56620
+ let msg;
56621
+ if (isObj && typeof arg.message === "string") msg = arg.message;
56526
56622
  ctx.report({
56527
56623
  node,
56528
56624
  message: msg
@@ -56548,7 +56644,6 @@ const rules = {
56548
56644
  var src_default = {
56549
56645
  rules,
56550
56646
  configs: {
56551
- baseline: baselineConfigs,
56552
56647
  recommended: recommendedConfig,
56553
56648
  "recommended-ts": recommendedTsConfig
56554
56649
  }