eslint-plugin-perfectionist 3.0.0 → 3.1.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 (45) hide show
  1. package/dist/index.d.ts +20 -6
  2. package/dist/rules/sort-array-includes.js +1 -1
  3. package/dist/rules/sort-array-includes.mjs +1 -1
  4. package/dist/rules/sort-astro-attributes.js +1 -1
  5. package/dist/rules/sort-astro-attributes.mjs +1 -1
  6. package/dist/rules/sort-classes.js +21 -1
  7. package/dist/rules/sort-classes.mjs +21 -1
  8. package/dist/rules/sort-enums.js +5 -5
  9. package/dist/rules/sort-enums.mjs +5 -5
  10. package/dist/rules/sort-exports.js +1 -1
  11. package/dist/rules/sort-exports.mjs +1 -1
  12. package/dist/rules/sort-imports.js +21 -8
  13. package/dist/rules/sort-imports.mjs +19 -8
  14. package/dist/rules/sort-interfaces.js +1 -1
  15. package/dist/rules/sort-interfaces.mjs +1 -1
  16. package/dist/rules/sort-intersection-types.js +1 -1
  17. package/dist/rules/sort-intersection-types.mjs +1 -1
  18. package/dist/rules/sort-jsx-props.js +102 -117
  19. package/dist/rules/sort-jsx-props.mjs +91 -104
  20. package/dist/rules/sort-maps.js +1 -1
  21. package/dist/rules/sort-maps.mjs +1 -1
  22. package/dist/rules/sort-named-exports.js +1 -1
  23. package/dist/rules/sort-named-exports.mjs +1 -1
  24. package/dist/rules/sort-named-imports.js +1 -1
  25. package/dist/rules/sort-named-imports.mjs +1 -1
  26. package/dist/rules/sort-object-types.js +1 -1
  27. package/dist/rules/sort-object-types.mjs +1 -1
  28. package/dist/rules/sort-objects.js +9 -12
  29. package/dist/rules/sort-objects.mjs +9 -12
  30. package/dist/rules/sort-svelte-attributes.js +1 -1
  31. package/dist/rules/sort-svelte-attributes.mjs +1 -1
  32. package/dist/rules/sort-switch-case.js +68 -15
  33. package/dist/rules/sort-switch-case.mjs +63 -15
  34. package/dist/rules/sort-union-types.js +1 -1
  35. package/dist/rules/sort-union-types.mjs +1 -1
  36. package/dist/rules/sort-variable-declarations.js +1 -1
  37. package/dist/rules/sort-variable-declarations.mjs +1 -1
  38. package/dist/rules/sort-vue-attributes.js +1 -1
  39. package/dist/rules/sort-vue-attributes.mjs +1 -1
  40. package/dist/utils/get-group-number.js +1 -1
  41. package/dist/utils/get-group-number.mjs +1 -1
  42. package/dist/utils/make-fixes.js +1 -1
  43. package/dist/utils/make-fixes.mjs +1 -1
  44. package/package.json +3 -3
  45. package/readme.md +49 -24
package/dist/index.d.ts CHANGED
@@ -1,7 +1,5 @@
1
1
  import { ClassicConfig } from '@typescript-eslint/utils/ts-eslint'
2
2
  import { FlatConfig } from '@typescript-eslint/utils/ts-eslint'
3
- import { ObjectExpression } from 'node_modules/@typescript-eslint/types/dist/generated/ast-spec'
4
- import { ObjectPattern } from 'node_modules/@typescript-eslint/types/dist/generated/ast-spec'
5
3
  import { RuleListener } from '@typescript-eslint/utils/ts-eslint'
6
4
  import { RuleModule } from '@typescript-eslint/utils/ts-eslint'
7
5
 
@@ -24,6 +22,7 @@ declare const _default: {
24
22
  ignoreCase: boolean
25
23
  }>,
26
24
  ],
25
+ unknown,
27
26
  RuleListener
28
27
  >
29
28
  'sort-intersection-types': RuleModule<
@@ -67,6 +66,7 @@ declare const _default: {
67
66
  ignoreCase: boolean
68
67
  }>,
69
68
  ],
69
+ unknown,
70
70
  RuleListener
71
71
  >
72
72
  'sort-svelte-attributes': RuleModule<
@@ -82,6 +82,7 @@ declare const _default: {
82
82
  ignoreCase: boolean
83
83
  }>,
84
84
  ],
85
+ unknown,
85
86
  RuleListener
86
87
  >
87
88
  'sort-astro-attributes': RuleModule<
@@ -97,6 +98,7 @@ declare const _default: {
97
98
  ignoreCase: boolean
98
99
  }>,
99
100
  ],
101
+ unknown,
100
102
  RuleListener
101
103
  >
102
104
  'sort-vue-attributes': RuleModule<
@@ -112,6 +114,7 @@ declare const _default: {
112
114
  ignoreCase: boolean
113
115
  }>,
114
116
  ],
117
+ unknown,
115
118
  RuleListener
116
119
  >
117
120
  'sort-array-includes': RuleModule<
@@ -124,6 +127,7 @@ declare const _default: {
124
127
  ignoreCase: boolean
125
128
  }>,
126
129
  ],
130
+ unknown,
127
131
  RuleListener
128
132
  >
129
133
  'sort-named-imports': RuleModule<
@@ -137,6 +141,7 @@ declare const _default: {
137
141
  ignoreCase: boolean
138
142
  }>,
139
143
  ],
144
+ unknown,
140
145
  RuleListener
141
146
  >
142
147
  'sort-named-exports': RuleModule<
@@ -149,6 +154,7 @@ declare const _default: {
149
154
  ignoreCase: boolean
150
155
  }>,
151
156
  ],
157
+ unknown,
152
158
  RuleListener
153
159
  >
154
160
  'sort-object-types': RuleModule<
@@ -164,6 +170,7 @@ declare const _default: {
164
170
  customGroups: {}
165
171
  }>,
166
172
  ],
173
+ unknown,
167
174
  RuleListener
168
175
  >
169
176
  'sort-union-types': RuleModule<
@@ -207,6 +214,7 @@ declare const _default: {
207
214
  ignoreCase: boolean
208
215
  }>,
209
216
  ],
217
+ unknown,
210
218
  RuleListener
211
219
  >
212
220
  'sort-switch-case': RuleModule<
@@ -218,6 +226,7 @@ declare const _default: {
218
226
  ignoreCase: boolean
219
227
  }>,
220
228
  ],
229
+ unknown,
221
230
  RuleListener
222
231
  >
223
232
  'sort-interfaces': RuleModule<
@@ -236,6 +245,7 @@ declare const _default: {
236
245
  ignoreCase: boolean
237
246
  }>,
238
247
  ],
248
+ unknown,
239
249
  RuleListener
240
250
  >
241
251
  'sort-jsx-props': RuleModule<
@@ -252,6 +262,7 @@ declare const _default: {
252
262
  ignoreCase: boolean
253
263
  }>,
254
264
  ],
265
+ unknown,
255
266
  RuleListener
256
267
  >
257
268
  'sort-classes': RuleModule<
@@ -268,6 +279,7 @@ declare const _default: {
268
279
  ignoreCase: boolean
269
280
  }>,
270
281
  ],
282
+ unknown,
271
283
  RuleListener
272
284
  >
273
285
  'sort-imports': RuleModule<
@@ -298,6 +310,7 @@ declare const _default: {
298
310
  ignoreCase: boolean
299
311
  }>,
300
312
  ],
313
+ unknown,
301
314
  RuleListener
302
315
  >
303
316
  'sort-exports': RuleModule<
@@ -309,16 +322,13 @@ declare const _default: {
309
322
  ignoreCase: boolean
310
323
  }>,
311
324
  ],
325
+ unknown,
312
326
  RuleListener
313
327
  >
314
328
  'sort-objects': RuleModule<
315
329
  'unexpectedObjectsOrder',
316
330
  [
317
331
  Partial<{
318
- customIgnore: ((
319
- object: ObjectExpression | ObjectPattern,
320
- filename: string,
321
- ) => boolean)[]
322
332
  customGroups: {
323
333
  [key: string]: string[] | string
324
334
  }
@@ -327,11 +337,13 @@ declare const _default: {
327
337
  groups: (string[] | string)[]
328
338
  partitionByNewLine: boolean
329
339
  styledComponents: boolean
340
+ destructureOnly: boolean
330
341
  ignorePattern: string[]
331
342
  order: 'desc' | 'asc'
332
343
  ignoreCase: boolean
333
344
  }>,
334
345
  ],
346
+ unknown,
335
347
  RuleListener
336
348
  >
337
349
  'sort-enums': RuleModule<
@@ -344,6 +356,7 @@ declare const _default: {
344
356
  ignoreCase: boolean
345
357
  }>,
346
358
  ],
359
+ unknown,
347
360
  RuleListener
348
361
  >
349
362
  'sort-maps': RuleModule<
@@ -355,6 +368,7 @@ declare const _default: {
355
368
  ignoreCase: boolean
356
369
  }>,
357
370
  ],
371
+ unknown,
358
372
  RuleListener
359
373
  >
360
374
  }
@@ -95,8 +95,8 @@ const sortArrayIncludes = createEslintRule.createEslintRule({
95
95
  ? `${element.value}`
96
96
  : sourceCode.text.slice(...element.range),
97
97
  size: rangeToDiff.rangeToDiff(element.range),
98
+ node: structuredClone(element),
98
99
  type: element.type,
99
- node: element,
100
100
  group,
101
101
  })
102
102
  }
@@ -94,8 +94,8 @@ const sortArrayIncludes = createEslintRule({
94
94
  ? `${element.value}`
95
95
  : sourceCode.text.slice(...element.range),
96
96
  size: rangeToDiff(element.range),
97
+ node: structuredClone(element),
97
98
  type: element.type,
98
- node: element,
99
99
  group,
100
100
  })
101
101
  }
@@ -132,8 +132,8 @@ const sortAstroAttributes = createEslintRule.createEslintRule({
132
132
  defineGroup('multiline')
133
133
  }
134
134
  accumulator.at(-1).push({
135
+ node: structuredClone(attribute),
135
136
  size: rangeToDiff.rangeToDiff(attribute.range),
136
- node: attribute,
137
137
  group: getGroup(),
138
138
  name,
139
139
  })
@@ -132,8 +132,8 @@ const sortAstroAttributes = createEslintRule({
132
132
  defineGroup('multiline')
133
133
  }
134
134
  accumulator.at(-1).push({
135
+ node: structuredClone(attribute),
135
136
  size: rangeToDiff(attribute.range),
136
- node: attribute,
137
137
  group: getGroup(),
138
138
  name,
139
139
  })
@@ -110,10 +110,12 @@ const sortClasses = createEslintRule.createEslintRule({
110
110
  groups: [
111
111
  'index-signature',
112
112
  'static-property',
113
+ 'protected-property',
113
114
  'private-property',
114
115
  'property',
115
116
  'constructor',
116
117
  'static-method',
118
+ 'protected-method',
117
119
  'private-method',
118
120
  'method',
119
121
  ['get-method', 'set-method'],
@@ -129,10 +131,12 @@ const sortClasses = createEslintRule.createEslintRule({
129
131
  groups: [
130
132
  'index-signature',
131
133
  'static-property',
134
+ 'protected-property',
132
135
  'private-property',
133
136
  'property',
134
137
  'constructor',
135
138
  'static-method',
139
+ 'protected-method',
136
140
  'private-method',
137
141
  'method',
138
142
  ['get-method', 'set-method'],
@@ -224,6 +228,7 @@ const sortClasses = createEslintRule.createEslintRule({
224
228
  if (member.kind === 'constructor') {
225
229
  defineGroup('constructor')
226
230
  }
231
+ let isProtectedMethod = member.accessibility === 'protected'
227
232
  let isPrivateMethod =
228
233
  member.accessibility === 'private' || isPrivate
229
234
  let isStaticMethod = member.static
@@ -245,6 +250,12 @@ const sortClasses = createEslintRule.createEslintRule({
245
250
  if (isStaticMethod) {
246
251
  defineGroup('static-method')
247
252
  }
253
+ if (isProtectedMethod && isStaticMethod) {
254
+ defineGroup('static-protected-method')
255
+ }
256
+ if (isProtectedMethod) {
257
+ defineGroup('protected-method')
258
+ }
248
259
  if (member.kind === 'get') {
249
260
  defineGroup('get-method')
250
261
  }
@@ -256,6 +267,9 @@ const sortClasses = createEslintRule.createEslintRule({
256
267
  defineGroup('index-signature')
257
268
  } else if (member.type === 'AccessorProperty') {
258
269
  if (decorated) {
270
+ if (member.accessibility === 'protected') {
271
+ defineGroup('protected-decorated-accessor-property')
272
+ }
259
273
  if (member.accessibility === 'private' || isPrivate) {
260
274
  defineGroup('private-decorated-accessor-property')
261
275
  }
@@ -263,11 +277,17 @@ const sortClasses = createEslintRule.createEslintRule({
263
277
  }
264
278
  } else if (member.type === 'PropertyDefinition') {
265
279
  if (decorated) {
280
+ if (member.accessibility === 'protected') {
281
+ defineGroup('protected-decorated-property')
282
+ }
266
283
  if (member.accessibility === 'private' || isPrivate) {
267
284
  defineGroup('private-decorated-property')
268
285
  }
269
286
  defineGroup('decorated-property')
270
287
  }
288
+ if (member.accessibility === 'protected') {
289
+ defineGroup('protected-property')
290
+ }
271
291
  if (member.accessibility === 'private' || isPrivate) {
272
292
  defineGroup('private-property')
273
293
  }
@@ -284,9 +304,9 @@ const sortClasses = createEslintRule.createEslintRule({
284
304
  }
285
305
  let value = {
286
306
  size: rangeToDiff.rangeToDiff(member.range),
307
+ node: structuredClone(member),
287
308
  group: getGroup(),
288
309
  dependencies,
289
- node: member,
290
310
  name,
291
311
  }
292
312
  accumulator.at(-1).push(value)
@@ -109,10 +109,12 @@ const sortClasses = createEslintRule({
109
109
  groups: [
110
110
  'index-signature',
111
111
  'static-property',
112
+ 'protected-property',
112
113
  'private-property',
113
114
  'property',
114
115
  'constructor',
115
116
  'static-method',
117
+ 'protected-method',
116
118
  'private-method',
117
119
  'method',
118
120
  ['get-method', 'set-method'],
@@ -128,10 +130,12 @@ const sortClasses = createEslintRule({
128
130
  groups: [
129
131
  'index-signature',
130
132
  'static-property',
133
+ 'protected-property',
131
134
  'private-property',
132
135
  'property',
133
136
  'constructor',
134
137
  'static-method',
138
+ 'protected-method',
135
139
  'private-method',
136
140
  'method',
137
141
  ['get-method', 'set-method'],
@@ -221,6 +225,7 @@ const sortClasses = createEslintRule({
221
225
  if (member.kind === 'constructor') {
222
226
  defineGroup('constructor')
223
227
  }
228
+ let isProtectedMethod = member.accessibility === 'protected'
224
229
  let isPrivateMethod =
225
230
  member.accessibility === 'private' || isPrivate
226
231
  let isStaticMethod = member.static
@@ -242,6 +247,12 @@ const sortClasses = createEslintRule({
242
247
  if (isStaticMethod) {
243
248
  defineGroup('static-method')
244
249
  }
250
+ if (isProtectedMethod && isStaticMethod) {
251
+ defineGroup('static-protected-method')
252
+ }
253
+ if (isProtectedMethod) {
254
+ defineGroup('protected-method')
255
+ }
245
256
  if (member.kind === 'get') {
246
257
  defineGroup('get-method')
247
258
  }
@@ -253,6 +264,9 @@ const sortClasses = createEslintRule({
253
264
  defineGroup('index-signature')
254
265
  } else if (member.type === 'AccessorProperty') {
255
266
  if (decorated) {
267
+ if (member.accessibility === 'protected') {
268
+ defineGroup('protected-decorated-accessor-property')
269
+ }
256
270
  if (member.accessibility === 'private' || isPrivate) {
257
271
  defineGroup('private-decorated-accessor-property')
258
272
  }
@@ -260,11 +274,17 @@ const sortClasses = createEslintRule({
260
274
  }
261
275
  } else if (member.type === 'PropertyDefinition') {
262
276
  if (decorated) {
277
+ if (member.accessibility === 'protected') {
278
+ defineGroup('protected-decorated-property')
279
+ }
263
280
  if (member.accessibility === 'private' || isPrivate) {
264
281
  defineGroup('private-decorated-property')
265
282
  }
266
283
  defineGroup('decorated-property')
267
284
  }
285
+ if (member.accessibility === 'protected') {
286
+ defineGroup('protected-property')
287
+ }
268
288
  if (member.accessibility === 'private' || isPrivate) {
269
289
  defineGroup('private-property')
270
290
  }
@@ -281,9 +301,9 @@ const sortClasses = createEslintRule({
281
301
  }
282
302
  let value = {
283
303
  size: rangeToDiff(member.range),
304
+ node: structuredClone(member),
284
305
  group: getGroup(),
285
306
  dependencies,
286
- node: member,
287
307
  name,
288
308
  }
289
309
  accumulator.at(-1).push(value)
@@ -76,8 +76,8 @@ const sortEnums = createEslintRule.createEslintRule({
76
76
  create: context => ({
77
77
  TSEnumDeclaration: node => {
78
78
  if (
79
- node.members.length > 1 &&
80
- node.members.every(({ initializer }) => initializer)
79
+ node.body.members.length > 1 &&
80
+ node.body.members.every(({ initializer }) => initializer)
81
81
  ) {
82
82
  let options = complete.complete(context.options.at(0), {
83
83
  partitionByComment: false,
@@ -87,7 +87,7 @@ const sortEnums = createEslintRule.createEslintRule({
87
87
  })
88
88
  let sourceCode = getSourceCode.getSourceCode(context)
89
89
  let partitionComment = options.partitionByComment
90
- let formattedMembers = node.members.reduce(
90
+ let formattedMembers = node.body.members.reduce(
91
91
  (accumulator, member) => {
92
92
  let comment = getCommentBefore.getCommentBefore(member, sourceCode)
93
93
  if (
@@ -105,9 +105,9 @@ const sortEnums = createEslintRule.createEslintRule({
105
105
  ? `${member.id.value}`
106
106
  : `${sourceCode.text.slice(...member.id.range)}`
107
107
  let sortingNode = {
108
- name,
109
- node: member,
110
108
  size: rangeToDiff.rangeToDiff(member.range),
109
+ node: structuredClone(member),
110
+ name,
111
111
  }
112
112
  accumulator.at(-1).push(sortingNode)
113
113
  return accumulator
@@ -75,8 +75,8 @@ const sortEnums = createEslintRule({
75
75
  create: context => ({
76
76
  TSEnumDeclaration: node => {
77
77
  if (
78
- node.members.length > 1 &&
79
- node.members.every(({ initializer }) => initializer)
78
+ node.body.members.length > 1 &&
79
+ node.body.members.every(({ initializer }) => initializer)
80
80
  ) {
81
81
  let options = complete(context.options.at(0), {
82
82
  partitionByComment: false,
@@ -86,7 +86,7 @@ const sortEnums = createEslintRule({
86
86
  })
87
87
  let sourceCode = getSourceCode(context)
88
88
  let partitionComment = options.partitionByComment
89
- let formattedMembers = node.members.reduce(
89
+ let formattedMembers = node.body.members.reduce(
90
90
  (accumulator, member) => {
91
91
  let comment = getCommentBefore(member, sourceCode)
92
92
  if (
@@ -101,9 +101,9 @@ const sortEnums = createEslintRule({
101
101
  ? `${member.id.value}`
102
102
  : `${sourceCode.text.slice(...member.id.range)}`
103
103
  let sortingNode = {
104
- name,
105
- node: member,
106
104
  size: rangeToDiff(member.range),
105
+ node: structuredClone(member),
106
+ name,
107
107
  }
108
108
  accumulator.at(-1).push(sortingNode)
109
109
  return accumulator
@@ -61,8 +61,8 @@ const sortExports = createEslintRule.createEslintRule({
61
61
  let registerNode = node => {
62
62
  parts.at(-1).push({
63
63
  size: rangeToDiff.rangeToDiff(node.range),
64
+ node: structuredClone(node),
64
65
  name: node.source.value,
65
- node,
66
66
  })
67
67
  }
68
68
  return {
@@ -60,8 +60,8 @@ const sortExports = createEslintRule({
60
60
  let registerNode = node => {
61
61
  parts.at(-1).push({
62
62
  size: rangeToDiff(node.range),
63
+ node: structuredClone(node),
63
64
  name: node.source.value,
64
- node,
65
65
  })
66
66
  }
67
67
  return {
@@ -245,10 +245,14 @@ const sortImports = createEslintRule.createEslintRule({
245
245
  'undici',
246
246
  'ws',
247
247
  ]
248
+ let builtinPrefixOnlyModules = ['sea', 'sqlite', 'test']
248
249
  return (
249
250
  node_module.builtinModules.includes(
250
251
  value.startsWith('node:') ? value.split('node:')[1] : value,
251
252
  ) ||
253
+ builtinPrefixOnlyModules.some(
254
+ module2 => `node:${module2}` === value,
255
+ ) ||
252
256
  (options.environment === 'bun' ? bunModules.includes(value) : false)
253
257
  )
254
258
  }
@@ -282,10 +286,14 @@ const sortImports = createEslintRule.createEslintRule({
282
286
  node.type === 'ImportDeclaration' ||
283
287
  node.type === 'VariableDeclaration'
284
288
  ) {
285
- let value =
286
- node.type === 'ImportDeclaration'
287
- ? node.source.value
288
- : node.declarations[0].init.arguments[0].value.toString().toString()
289
+ let value
290
+ if (node.type === 'ImportDeclaration') {
291
+ ;({ value } = node.source)
292
+ } else {
293
+ let decl = node.declarations[0].init
294
+ let declValue = decl.arguments[0].value
295
+ value = declValue.toString()
296
+ }
289
297
  setCustomGroups(options.customGroups.value, value)
290
298
  if (isSideEffectImport(node) && isStyle(value)) {
291
299
  defineGroup('side-effect-style')
@@ -330,13 +338,14 @@ const sortImports = createEslintRule.createEslintRule({
330
338
  }
331
339
  } else {
332
340
  let decl = node.declarations[0].init
333
- name = decl.arguments[0].value.toString()
341
+ let { value } = decl.arguments[0]
342
+ name = value.toString()
334
343
  }
335
344
  nodes.push({
336
345
  size: rangeToDiff.rangeToDiff(node.range),
346
+ node: structuredClone(node),
337
347
  group: computeGroup(node),
338
348
  name,
339
- node,
340
349
  ...(options.type === 'line-length' &&
341
350
  options.maxLineLength && {
342
351
  hasMultipleImportDeclarations: hasMultipleImportDeclarations(node),
@@ -347,11 +356,15 @@ const sortImports = createEslintRule.createEslintRule({
347
356
  TSImportEqualsDeclaration: registerNode,
348
357
  ImportDeclaration: registerNode,
349
358
  VariableDeclaration: node => {
359
+ var _a
350
360
  if (
351
361
  node.declarations[0].init &&
352
362
  node.declarations[0].init.type === 'CallExpression' &&
353
363
  node.declarations[0].init.callee.type === 'Identifier' &&
354
- node.declarations[0].init.callee.name === 'require'
364
+ node.declarations[0].init.callee.name === 'require' &&
365
+ ((_a = node.declarations[0].init.arguments[0]) == null
366
+ ? void 0
367
+ : _a.type) === 'Literal'
355
368
  ) {
356
369
  registerNode(node)
357
370
  }
@@ -387,7 +400,7 @@ const sortImports = createEslintRule.createEslintRule({
387
400
  (accumulator, group) => [...accumulator, ...grouped[group]],
388
401
  [],
389
402
  )
390
- for (let i = 0, max = formatted.length; i < max; i++) {
403
+ for (let max = formatted.length, i = 0; i < max; i++) {
391
404
  let node = formatted.at(i)
392
405
  fixes.push(
393
406
  fixer.replaceTextRange(
@@ -242,10 +242,12 @@ const sortImports = createEslintRule({
242
242
  'undici',
243
243
  'ws',
244
244
  ]
245
+ let builtinPrefixOnlyModules = ['sea', 'sqlite', 'test']
245
246
  return (
246
247
  builtinModules.includes(
247
248
  value.startsWith('node:') ? value.split('node:')[1] : value,
248
249
  ) ||
250
+ builtinPrefixOnlyModules.some(module => `node:${module}` === value) ||
249
251
  (options.environment === 'bun' ? bunModules.includes(value) : false)
250
252
  )
251
253
  }
@@ -279,10 +281,14 @@ const sortImports = createEslintRule({
279
281
  node.type === 'ImportDeclaration' ||
280
282
  node.type === 'VariableDeclaration'
281
283
  ) {
282
- let value =
283
- node.type === 'ImportDeclaration'
284
- ? node.source.value
285
- : node.declarations[0].init.arguments[0].value.toString().toString()
284
+ let value
285
+ if (node.type === 'ImportDeclaration') {
286
+ ;({ value } = node.source)
287
+ } else {
288
+ let decl = node.declarations[0].init
289
+ let declValue = decl.arguments[0].value
290
+ value = declValue.toString()
291
+ }
286
292
  setCustomGroups(options.customGroups.value, value)
287
293
  if (isSideEffectImport(node) && isStyle(value)) {
288
294
  defineGroup('side-effect-style')
@@ -327,13 +333,14 @@ const sortImports = createEslintRule({
327
333
  }
328
334
  } else {
329
335
  let decl = node.declarations[0].init
330
- name = decl.arguments[0].value.toString()
336
+ let { value } = decl.arguments[0]
337
+ name = value.toString()
331
338
  }
332
339
  nodes.push({
333
340
  size: rangeToDiff(node.range),
341
+ node: structuredClone(node),
334
342
  group: computeGroup(node),
335
343
  name,
336
- node,
337
344
  ...(options.type === 'line-length' &&
338
345
  options.maxLineLength && {
339
346
  hasMultipleImportDeclarations: hasMultipleImportDeclarations(node),
@@ -344,11 +351,15 @@ const sortImports = createEslintRule({
344
351
  TSImportEqualsDeclaration: registerNode,
345
352
  ImportDeclaration: registerNode,
346
353
  VariableDeclaration: node => {
354
+ var _a
347
355
  if (
348
356
  node.declarations[0].init &&
349
357
  node.declarations[0].init.type === 'CallExpression' &&
350
358
  node.declarations[0].init.callee.type === 'Identifier' &&
351
- node.declarations[0].init.callee.name === 'require'
359
+ node.declarations[0].init.callee.name === 'require' &&
360
+ ((_a = node.declarations[0].init.arguments[0]) == null
361
+ ? void 0
362
+ : _a.type) === 'Literal'
352
363
  ) {
353
364
  registerNode(node)
354
365
  }
@@ -383,7 +394,7 @@ const sortImports = createEslintRule({
383
394
  (accumulator, group) => [...accumulator, ...grouped[group]],
384
395
  [],
385
396
  )
386
- for (let i = 0, max = formatted.length; i < max; i++) {
397
+ for (let max = formatted.length, i = 0; i < max; i++) {
387
398
  let node = formatted.at(i)
388
399
  fixes.push(
389
400
  fixer.replaceTextRange(
@@ -176,7 +176,7 @@ const sortInterfaces = createEslintRule.createEslintRule({
176
176
  }
177
177
  let elementSortingNode = {
178
178
  size: rangeToDiff.rangeToDiff(element.range),
179
- node: element,
179
+ node: structuredClone(element),
180
180
  name,
181
181
  }
182
182
  if (
@@ -176,7 +176,7 @@ const sortInterfaces = createEslintRule({
176
176
  }
177
177
  let elementSortingNode = {
178
178
  size: rangeToDiff(element.range),
179
- node: element,
179
+ node: structuredClone(element),
180
180
  name,
181
181
  }
182
182
  if (
@@ -145,8 +145,8 @@ const sortIntersectionTypes = createEslintRule.createEslintRule({
145
145
  return {
146
146
  name: sourceCode.text.slice(...type.range),
147
147
  size: rangeToDiff.rangeToDiff(type.range),
148
+ node: structuredClone(type),
148
149
  group: getGroup(),
149
- node: type,
150
150
  }
151
151
  })
152
152
  pairwise.pairwise(nodes, (left, right) => {
@@ -144,8 +144,8 @@ const sortIntersectionTypes = createEslintRule({
144
144
  return {
145
145
  name: sourceCode.text.slice(...type.range),
146
146
  size: rangeToDiff(type.range),
147
+ node: structuredClone(type),
147
148
  group: getGroup(),
148
- node: type,
149
149
  }
150
150
  })
151
151
  pairwise(nodes, (left, right) => {