Skip to content

Commit 2454de2

Browse files
committed
Add support for ignoring native browserslist resolution
1 parent b2cd1c6 commit 2454de2

File tree

6 files changed

+137
-20
lines changed

6 files changed

+137
-20
lines changed

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,22 @@ Add polyfills to the settings section of your eslint config. Append the name of
7373
}
7474
```
7575

76+
## Ignoring Browserslist native resolution
77+
78+
To exclude targets picked up by your browserslist config and only use targets explictly provided via ESLint:
79+
80+
```jsonc
81+
{
82+
// ...
83+
"rules": {
84+
"compat/compat": [ "error", {
85+
"query": "node 18",
86+
"ignoreBrowserslistTargets": true
87+
} ]
88+
}
89+
}
90+
```
91+
7692
## Linting ES APIs (Experimental)
7793

7894
This plugin also supports linting the compatibility of ES APIs in addition to Web APIs. This is an experimental feature and is disabled by default. To enable this feature, add the following to your eslint config:

src/helpers.ts

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -185,31 +185,32 @@ export function determineTargetsFromConfig(
185185
const browserslistOpts = { path: configPath };
186186

187187
const eslintTargets = (() => {
188-
// Get targets from eslint settings
189-
if (Array.isArray(config) || typeof config === "string") {
190-
return browserslist(config, browserslistOpts);
191-
}
192-
if (config && typeof config === "object") {
193-
return browserslist(
194-
[...(config.production || []), ...(config.development || [])],
195-
browserslistOpts
196-
);
197-
}
198-
return [];
188+
const query = config
189+
? Array.isArray(config) || typeof config === "string"
190+
? config
191+
: "query" in config
192+
? config.query
193+
: [...(config.production || []), ...(config.development || [])]
194+
: [];
195+
return query.length ? browserslist(query, browserslistOpts) : [];
199196
})();
200197

201-
if (browserslist.findConfig(configPath)) {
202-
// If targets are defined in ESLint and browerslist configs, merge the targets together
203-
if (eslintTargets.length) {
204-
const browserslistTargets = browserslist(undefined, browserslistOpts);
205-
return Array.from(new Set(eslintTargets.concat(browserslistTargets)));
206-
}
207-
} else if (eslintTargets.length) {
198+
// Determine if targets picked up by browserslist should be included
199+
const ignoreBrowserslistTargets =
200+
config && "object" === typeof config && "query" in config
201+
? Boolean(config.ignoreBrowserslistTargets)
202+
: // Included for backwards-compatibility; remove in next major version (return false instead)
203+
!browserslist.findConfig(configPath) && eslintTargets.length > 0;
204+
205+
if (ignoreBrowserslistTargets) {
208206
return eslintTargets;
209207
}
210208

211209
// Get targets fron browserslist configs
212-
return browserslist(undefined, browserslistOpts);
210+
const browserslistTargets = browserslist(undefined, browserslistOpts);
211+
212+
// If targets are defined in ESLint and browerslist configs, merge the targets together
213+
return Array.from(new Set(eslintTargets.concat(browserslistTargets)));
213214
}
214215

215216
/**

src/rules/compat.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,29 @@ export default {
146146
recommended: true,
147147
},
148148
type: "problem",
149-
schema: [{ type: "string" }],
149+
schema: [
150+
{
151+
oneOf: [
152+
{ type: "string" },
153+
{
154+
additionalProperties: false,
155+
properties: {
156+
ignoreBrowserslistTargets: {
157+
type: "boolean",
158+
},
159+
query: {
160+
oneOf: [
161+
{ type: "string" },
162+
{ items: { type: "string" }, type: "array" },
163+
],
164+
},
165+
},
166+
required: ["query"],
167+
type: "object",
168+
},
169+
],
170+
},
171+
],
150172
},
151173
create(context: Context): ESLint {
152174
// Determine lowest targets from browserslist config, which reads user's

src/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ export type BrowserListConfig =
99
production?: Array<string>;
1010
development?: Array<string>;
1111
}
12+
| {
13+
ignoreBrowserslistTargets?: boolean;
14+
query: string | Array<string>;
15+
}
1216
| null;
1317

1418
// @TODO Replace with types from ast-metadata-inferer

test/__snapshots__/helpers.spec.ts.snap

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,46 @@ exports[`Versioning should support multi env config in browserslist package.json
120120
]
121121
`;
122122

123+
exports[`Versioning should support object config in rule option 1`] = `
124+
[
125+
{
126+
"parsedVersion": 18.14,
127+
"target": "node",
128+
"version": "18.14.0",
129+
},
130+
{
131+
"parsedVersion": 70,
132+
"target": "chrome",
133+
"version": "70",
134+
},
135+
]
136+
`;
137+
138+
exports[`Versioning should support object config with ignore option in rule option 1`] = `
139+
[
140+
{
141+
"parsedVersion": 18.14,
142+
"target": "node",
143+
"version": "18.14.0",
144+
},
145+
]
146+
`;
147+
148+
exports[`Versioning should support object config with query array in rule option 1`] = `
149+
[
150+
{
151+
"parsedVersion": 18.14,
152+
"target": "node",
153+
"version": "18.14.0",
154+
},
155+
{
156+
"parsedVersion": 70,
157+
"target": "chrome",
158+
"version": "70",
159+
},
160+
]
161+
`;
162+
123163
exports[`Versioning should support resolving browserslist config in subdirectory 1`] = `
124164
[
125165
{

test/helpers.spec.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,40 @@ describe("Versioning", () => {
9191
expect(result).toMatchSnapshot();
9292
});
9393

94+
it("should support object config in rule option", () => {
95+
const config = determineTargetsFromConfig(
96+
path.join(__dirname, ".browserslistrc"),
97+
{
98+
query: "node 18",
99+
}
100+
);
101+
const result = parseBrowsersListVersion(config);
102+
expect(result).toMatchSnapshot();
103+
});
104+
105+
it("should support object config with query array in rule option", () => {
106+
const config = determineTargetsFromConfig(
107+
path.join(__dirname, ".browserslistrc"),
108+
{
109+
query: ["node 18"],
110+
}
111+
);
112+
const result = parseBrowsersListVersion(config);
113+
expect(result).toMatchSnapshot();
114+
});
115+
116+
it("should support object config with ignore option in rule option", () => {
117+
const config = determineTargetsFromConfig(
118+
path.join(__dirname, ".browserslistrc"),
119+
{
120+
query: "node 18",
121+
ignoreBrowserslistTargets: true,
122+
}
123+
);
124+
const result = parseBrowsersListVersion(config);
125+
expect(result).toMatchSnapshot();
126+
});
127+
94128
it("should fail on incorrect browserslist target version", () => {
95129
expect(() => {
96130
determineTargetsFromConfig(".", "edge 100000");

0 commit comments

Comments
 (0)