8000
We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
polyfilled
prefer-primordials
1 parent 00a2fc7 commit 0b3fb34Copy full SHA for 0b3fb34
lib/.eslintrc.yaml
@@ -243,6 +243,9 @@ rules:
243
into: Safe
244
- name: String
245
- name: Symbol
246
+ polyfilled:
247
+ - asyncDispose
248
+ - dispose
249
- name: SyntaxError
250
- name: TypeError
251
- name: Uint16Array
test/parallel/test-eslint-prefer-primordials.js
@@ -176,6 +176,22 @@ new RuleTester({
176
options: [{ name: 'Symbol' }],
177
errors: [{ message: /const { SymbolIterator } = primordials/ }]
178
},
179
+ {
180
+ code: `
181
+ const { SymbolAsyncDispose } = primordials;
182
+ const a = { [SymbolAsyncDispose] () {} }
183
+ `,
184
+ options: [{ name: 'Symbol', polyfilled: ['asyncDispose', 'dispose'] }],
185
+ errors: [{ message: /const { SymbolAsyncDispose } = require\("internal\/util"\)/ }]
186
+ },
187
188
189
+ const { SymbolDispose } = primordials;
190
+ const a = { [SymbolDispose] () {} }
191
192
193
+ errors: [{ message: /const { SymbolDispose } = require\("internal\/util"\)/ }]
194
195
{
196
code: `
197
const { ObjectDefineProperty, Symbol } = primordials;
tools/eslint-rules/prefer-primordials.js
@@ -74,6 +74,7 @@ module.exports = {
74
meta: {
75
messages: {
76
error: 'Use `const { {{name}} } = primordials;` instead of the global.',
77
+ errorPolyfill: 'Use `const { {{name}} } = require("internal/util");` instead of the primordial.',
78
79
schema: {
80
type: 'array',
@@ -88,6 +89,10 @@ module.exports = {
88
89
items: { type: 'string' },
90
91
into: { type: 'string' },
92
+ polyfilled: {
93
+ type: 'array',
94
+ items: { type: 'string' },
95
96
97
additionalProperties: false,
98
@@ -99,6 +104,7 @@ module.exports = {
99
104
100
105
const nameMap = new Map();
101
106
const renameMap = new Map();
107
+ const polyfilledSet = new Set();
102
108
103
109
for (const option of context.options) {
110
const names = option.ignore || [];
@@ -109,6 +115,11 @@ module.exports = {
115
if (option.into) {
116
renameMap.set(option.name, option.into);
111
117
}
118
+ if (option.polyfilled) {
119
+ for (const propertyName of option.polyfilled) {
120
+ polyfilledSet.add(`${option.name}${propertyName[0].toUpperCase()}${propertyName.slice(1)}`);
121
+ }
122
112
123
113
124
114
125
let reported;
@@ -186,6 +197,17 @@ module.exports = {
198
VariableDeclarator(node) {
199
const name = node.init?.name;
200
+ if (name === 'primordials' && node.id.type === 'ObjectPattern') {
201
+ const name = node.id.properties.find(({ key }) => polyfilledSet.has(key.name))?.key.name;
202
+ if (name) {
203
+ context.report({
204
+ node,
205
+ messageId: 'errorPolyfill',
206
+ data: { name },
207
+ });
208
+ return;
209
210
211
if (name !== undefined && isTarget(nameMap, name) &&
212
node.id.type === 'Identifier' &&
213
!globalScope.set.get(name)?.defs.length) {