eslint-plugin-perfectionist 0.2.0 → 0.4.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/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";const u=require("@typescript-eslint/types"),h=require("@typescript-eslint/utils"),y="eslint-plugin-perfectionist",_="azat-io/eslint-plugin-perfectionist";let S=h.ESLintUtils.RuleCreator(a=>`https://github.com/${_}/blob/main/docs/rules/${a}.md`),g=a=>{let[i,o]=a;return o-i},I=(a,i,o)=>{let e=[...o].sort((t,r)=>r.size-t.size),s=t=>[t.range.at(0),t.range.at(1)];return o.map(({node:t},r)=>a.replaceTextRange(s(t),i.slice(...s(e[r].node))))};const E="sort-interfaces",z=S({name:E,meta:{type:"suggestion",docs:{description:"Enforce sorted interface properties",recommended:!1},messages:{unexpectedInterfacePropertiesOrder:'Expected "{{second}}" to come before "{{first}}"'},fixable:"code",schema:[]},defaultOptions:[],create:a=>({TSInterfaceBody:i=>{let o=i.body.map(e=>{let s="",t=0,r=n=>{t+=n},d=n=>{r(g(n.key.range))},f=n=>{let{length:p}="[]";r(n.parameters.reduce((x,{range:O})=>x+g(O),p))},c=n=>{if(n.optional){let{length:p}="?";r(p)}},m=n=>{var x;let p=(x=n.typeAnnotation)==null?void 0:x.range;p&&r(g(p))},l=n=>{if(n.type===u.AST_NODE_TYPES.Identifier)({name:s}=n);else if(n.type===u.AST_NODE_TYPES.TSIndexSignature){let p=n.parameters.at(0);p&&l(p)}};return e.type===u.AST_NODE_TYPES.TSPropertySignature?(l(e.key),d(e),c(e),m(e)):e.type===u.AST_NODE_TYPES.TSIndexSignature&&(l(e),f(e),m(e)),{node:e,name:s,size:t}});for(let e=1;e<o.length;e++){let s=e-1,t=e,r=o.at(s),d=o.at(t);if(r.size<d.size){let f=i.body[t];a.report({messageId:"unexpectedInterfacePropertiesOrder",data:{first:r.name,second:d.name},node:f,fix:c=>{let m=a.getSourceCode(),{text:l}=m;return I(c,l,o)}})}}}})}),T="sort-jsx-props",A=S({name:T,meta:{type:"suggestion",docs:{description:"Enforce sorted interface properties",recommended:!1},messages:{unexpectedJSXPropsOrder:'Expected "{{second}}" to come before "{{first}}"'},fixable:"code",schema:[]},defaultOptions:[],create:a=>({JSXElement:i=>{i.openingElement.attributes.reduce((e,s)=>(s.type==="JSXAttribute"?e.at(-1).push(s):e.push([]),e),[[]]).forEach(e=>{let s=e.map(t=>({name:t.name.type===u.AST_NODE_TYPES.JSXNamespacedName?`${t.name.namespace.name}:${t.name.name.name}`:t.name.name,size:g(t.range),node:t}));for(let t=1;t<s.length;t++){let r=t-1,d=t,f=s.at(r),c=s.at(d);f.size<c.size&&a.report({messageId:"unexpectedJSXPropsOrder",data:{first:f.name,second:c.name},node:c.node,fix:m=>{let l=a.getSourceCode(),{text:n}=l;return I(m,n,s)}})}})}})}),N="sort-named-imports",P=S({name:N,meta:{type:"suggestion",docs:{description:"Enforce sorted interface properties",recommended:!1},messages:{unexpectedNamedImportsOrder:'Expected "{{second}}" to come before "{{first}}"'},fixable:"code",schema:[]},defaultOptions:[],create:a=>({ImportDeclaration:i=>{if(i.specifiers.length>1){let o=i.specifiers.map(e=>{let{range:s,local:{name:t}}=e;return{size:g(s),node:e,name:t}});for(let e=1;e<o.length;e++){let s=e-1,t=e,r=o.at(s),d=o.at(t);if(r.size<d.size){let f=i.specifiers[t];a.report({messageId:"unexpectedNamedImportsOrder",data:{first:r.name,second:d.name},node:f,fix:c=>{let m=a.getSourceCode(),{text:l}=m;return I(c,l,o)}})}}}}})}),R={name:y,rules:{[E]:z,[T]:A,[N]:P}};module.exports=R;
1
+ "use strict";const h=require("@typescript-eslint/types"),j=require("@typescript-eslint/utils"),U=require("natural-compare-lite"),z="eslint-plugin-perfectionist",D="azat-io/eslint-plugin-perfectionist";let S=j.ESLintUtils.RuleCreator(t=>`https://github.com/${D}/blob/main/docs/rules/${t}.md`),x=t=>{let[n,a]=t;return a-n};var i=(t=>(t.natural="natural",t["line-length"]="line-length",t))(i||{}),l=(t=>(t.asc="asc",t.desc="desc",t))(l||{});let E=(t,n,a)=>(a.order==="asc"?1:-1)*(a.type===i.natural?U(t.name,n.name):t.size-n.size)>0,I=(t,n,a,d)=>{let e=[...a].sort((r,o)=>Number(E(r,o,d))||-1),s=r=>[r.range.at(0),r.range.at(1)];return a.map(({node:r},o)=>t.replaceTextRange(s(r),n.slice(...s(e[o].node))))},N=(t={},n)=>Object.assign(n,t);const T="sort-interfaces",$=S({name:T,meta:{type:"suggestion",docs:{description:"Enforce sorted interface properties",recommended:!1},messages:{unexpectedInterfacePropertiesOrder:'Expected "{{second}}" to come before "{{first}}"'},fixable:"code",schema:[{type:"object",properties:{type:{enum:[i.natural,i["line-length"]]},order:{enum:[l.asc,l.desc]}},additionalProperties:!1}]},defaultOptions:[{type:i.natural,order:l.asc}],create:t=>({TSInterfaceBody:n=>{let a=N(t.options.at(0),{type:i.natural,order:l.asc}),d=n.body.map(e=>{let s="",r=0,o=c=>{r+=c},p=c=>{o(x(c.key.range))},m=c=>{let{length:y}="[]";o(c.parameters.reduce((O,{range:R})=>O+x(R),y))},u=c=>{if(c.optional){let{length:y}="?";o(y)}},g=c=>{var O;let y=(O=c.typeAnnotation)==null?void 0:O.range;y&&o(x(y))},f=c=>{if(c.type===h.AST_NODE_TYPES.Identifier)({name:s}=c);else if(c.type===h.AST_NODE_TYPES.TSIndexSignature){let y=c.parameters.at(0);y&&f(y)}};return e.type===h.AST_NODE_TYPES.TSPropertySignature?(f(e.key),p(e),u(e),g(e)):e.type===h.AST_NODE_TYPES.TSIndexSignature&&(f(e),m(e),g(e)),{node:e,name:s,size:r}});for(let e=1;e<d.length;e++){let s=e-1,r=e,o=d.at(s),p=d.at(r);if(E(o,p,a)){let m=n.body[r];t.report({messageId:"unexpectedInterfacePropertiesOrder",data:{first:o.name,second:p.name},node:m,fix:u=>{let g=t.getSourceCode(),{text:f}=g;return I(u,f,d,a)}})}}}})}),b="sort-jsx-props",v=S({name:b,meta:{type:"suggestion",docs:{description:"Enforce sorted interface properties",recommended:!1},messages:{unexpectedJSXPropsOrder:'Expected "{{second}}" to come before "{{first}}"'},fixable:"code",schema:[{type:"object",properties:{type:{enum:[i.natural,i["line-length"]]},order:{enum:[l.asc,l.desc]}},additionalProperties:!1}]},defaultOptions:[{type:i.natural,order:l.asc}],create:t=>({JSXElement:n=>{let a=N(t.options.at(0),{type:i.natural,order:l.asc});n.openingElement.attributes.reduce((e,s)=>(s.type==="JSXAttribute"?e.at(-1).push(s):e.push([]),e),[[]]).forEach(e=>{let s=e.map(r=>({name:r.name.type===h.AST_NODE_TYPES.JSXNamespacedName?`${r.name.namespace.name}:${r.name.name.name}`:r.name.name,size:x(r.range),node:r}));for(let r=1;r<s.length;r++){let o=r-1,p=r,m=s.at(o),u=s.at(p);E(m,u,a)&&t.report({messageId:"unexpectedJSXPropsOrder",data:{first:m.name,second:u.name},node:u.node,fix:g=>{let f=t.getSourceCode(),{text:c}=f;return I(g,c,s,a)}})}})}})}),P="sort-named-exports",J=S({name:P,meta:{type:"suggestion",docs:{description:"Enforce sorted interface properties",recommended:!1},messages:{unexpectedNamedExportsOrder:'Expected "{{second}}" to come before "{{first}}"'},fixable:"code",schema:[{type:"object",properties:{type:{enum:[i.natural,i["line-length"]]},order:{enum:[l.asc,l.desc]}},additionalProperties:!1}]},defaultOptions:[{type:i.natural,order:l.asc}],create:t=>({ExportNamedDeclaration:n=>{let a=N(t.options.at(0),{type:i.natural,order:l.asc});if(n.specifiers.length>1){let d=n.specifiers.map(e=>{let{range:s,local:{name:r}}=e;return{size:x(s),node:e,name:r}});for(let e=1;e<d.length;e++){let s=e-1,r=e,o=d.at(s),p=d.at(r);if(E(o,p,a)){let m=n.specifiers[r];t.report({messageId:"unexpectedNamedExportsOrder",data:{first:o.name,second:p.name},node:m,fix:u=>{let g=t.getSourceCode(),{text:f}=g;return I(u,f,d,a)}})}}}}})}),_="sort-named-imports",L=S({name:_,meta:{type:"suggestion",docs:{description:"Enforce sorted interface properties",recommended:!1},messages:{unexpectedNamedImportsOrder:'Expected "{{second}}" to come before "{{first}}"'},fixable:"code",schema:[{type:"object",properties:{type:{enum:[i.natural,i["line-length"]]},order:{enum:[l.asc,l.desc]}},additionalProperties:!1}]},defaultOptions:[{type:i.natural,order:l.asc}],create:t=>({ImportDeclaration:n=>{let a=N(t.options.at(0),{type:i.natural,order:l.asc});if(n.specifiers.length>1){let d=n.specifiers.map(e=>{let{range:s,local:{name:r}}=e;return{size:x(s),node:e,name:r}});for(let e=1;e<d.length;e++){let s=e-1,r=e,o=d.at(s),p=d.at(r);if(E(o,p,a)){let m=n.specifiers[r];t.report({messageId:"unexpectedNamedImportsOrder",data:{first:o.name,second:p.name},node:m,fix:u=>{let g=t.getSourceCode(),{text:f}=g;return I(u,f,d,a)}})}}}}})}),A="sort-union-types",M=S({name:A,meta:{type:"suggestion",docs:{description:"Enforce sorted union types",recommended:!1},messages:{unexpectedUnionTypesOrder:'Expected "{{second}}" to come before "{{first}}"'},fixable:"code",schema:[{type:"object",properties:{type:{enum:[i.natural,i["line-length"]]},order:{enum:[l.asc,l.desc]}},additionalProperties:!1}]},defaultOptions:[{type:i.natural,order:l.asc}],create:t=>({TSUnionType:n=>{let a=t.getSourceCode().text,d=N(t.options.at(0),{type:i.natural,order:l.asc}),e=n.types.map(s=>{let{range:r}=s,o=a.slice(...r);return{size:x(r),node:s,name:o}});for(let s=1;s<e.length;s++){let r=s-1,o=s,p=e.at(r),m=e.at(o);if(E(p,m,d)){let u=n.types[o];t.report({messageId:"unexpectedUnionTypesOrder",data:{first:p.name,second:m.name},node:u,fix:g=>{let f=t.getSourceCode(),{text:c}=f;return I(g,c,e,d)}})}}}})});let C=t=>{let n={[T]:["error"],[b]:["error"],[P]:["error"],[_]:["error"],[A]:["error"]};return Object.fromEntries(Object.entries(n).map(([a,[d,e={}]])=>[a,[d,Object.assign(e,t)]]))};const X={name:z,rules:{[T]:$,[b]:v,[P]:J,[_]:L,[A]:M},configs:{"recommended-natural":C({type:"natural",order:"asc"}),"recommended-line-length":C({type:"line-length",order:"desc"})}};module.exports=X;
package/dist/index.mjs CHANGED
@@ -1,25 +1,22 @@
1
- import { AST_NODE_TYPES as g } from "@typescript-eslint/types";
2
- import { ESLintUtils as O } from "@typescript-eslint/utils";
3
- const E = "eslint-plugin-perfectionist", R = "azat-io/eslint-plugin-perfectionist";
4
- let I = O.RuleCreator(
5
- (a) => `https://github.com/${R}/blob/main/docs/rules/${a}.md`
6
- ), u = (a) => {
7
- let [i, n] = a;
8
- return n - i;
9
- }, S = (a, i, n) => {
10
- let e = [...n].sort((t, r) => r.size - t.size), s = (t) => [
11
- t.range.at(0),
12
- t.range.at(1)
13
- ];
14
- return n.map(
15
- ({ node: t }, r) => a.replaceTextRange(
16
- s(t),
17
- i.slice(...s(e[r].node))
18
- )
19
- );
1
+ import { AST_NODE_TYPES as I } from "@typescript-eslint/types";
2
+ import { ESLintUtils as U } from "@typescript-eslint/utils";
3
+ import z from "natural-compare-lite";
4
+ const $ = "eslint-plugin-perfectionist", v = "azat-io/eslint-plugin-perfectionist";
5
+ let E = U.RuleCreator(
6
+ (t) => `https://github.com/${v}/blob/main/docs/rules/${t}.md`
7
+ ), y = (t) => {
8
+ let [o, a] = t;
9
+ return a - o;
20
10
  };
21
- const h = "sort-interfaces", T = I({
22
- name: h,
11
+ var i = /* @__PURE__ */ ((t) => (t.natural = "natural", t["line-length"] = "line-length", t))(i || {}), l = /* @__PURE__ */ ((t) => (t.asc = "asc", t.desc = "desc", t))(l || {});
12
+ let h = (t, o, a) => (a.order === "asc" ? 1 : -1) * (a.type === i.natural ? z(t.name, o.name) : t.size - o.size) > 0, N = (t, o, a, d) => {
13
+ let e = [...a].sort((r, n) => Number(h(r, n, d)) || -1), s = (r) => [r.range.at(0), r.range.at(1)];
14
+ return a.map(
15
+ ({ node: r }, n) => t.replaceTextRange(s(r), o.slice(...s(e[n].node)))
16
+ );
17
+ }, O = (t = {}, o) => Object.assign(o, t);
18
+ const b = "sort-interfaces", _ = E({
19
+ name: b,
23
20
  meta: {
24
21
  type: "suggestion",
25
22
  docs: {
@@ -30,64 +27,85 @@ const h = "sort-interfaces", T = I({
30
27
  unexpectedInterfacePropertiesOrder: 'Expected "{{second}}" to come before "{{first}}"'
31
28
  },
32
29
  fixable: "code",
33
- schema: []
30
+ schema: [
31
+ {
32
+ type: "object",
33
+ properties: {
34
+ type: {
35
+ enum: [i.natural, i["line-length"]]
36
+ },
37
+ order: {
38
+ enum: [l.asc, l.desc]
39
+ }
40
+ },
41
+ additionalProperties: !1
42
+ }
43
+ ]
34
44
  },
35
- defaultOptions: [],
36
- create: (a) => ({
37
- TSInterfaceBody: (i) => {
38
- let n = i.body.map((e) => {
39
- let s = "", t = 0, r = (o) => {
40
- t += o;
41
- }, d = (o) => {
42
- r(u(o.key.range));
43
- }, f = (o) => {
44
- let { length: p } = "[]";
45
- r(o.parameters.reduce((x, { range: N }) => x + u(N), p));
46
- }, c = (o) => {
47
- if (o.optional) {
48
- let { length: p } = "?";
49
- r(p);
45
+ defaultOptions: [
46
+ {
47
+ type: i.natural,
48
+ order: l.asc
49
+ }
50
+ ],
51
+ create: (t) => ({
52
+ TSInterfaceBody: (o) => {
53
+ let a = O(t.options.at(0), {
54
+ type: i.natural,
55
+ order: l.asc
56
+ }), d = o.body.map((e) => {
57
+ let s = "", r = 0, n = (c) => {
58
+ r += c;
59
+ }, p = (c) => {
60
+ n(y(c.key.range));
61
+ }, m = (c) => {
62
+ let { length: x } = "[]";
63
+ n(c.parameters.reduce((S, { range: A }) => S + y(A), x));
64
+ }, u = (c) => {
65
+ if (c.optional) {
66
+ let { length: x } = "?";
67
+ n(x);
50
68
  }
51
- }, m = (o) => {
52
- var x;
53
- let p = (x = o.typeAnnotation) == null ? void 0 : x.range;
54
- p && r(u(p));
55
- }, l = (o) => {
56
- if (o.type === g.Identifier)
57
- ({ name: s } = o);
58
- else if (o.type === g.TSIndexSignature) {
59
- let p = o.parameters.at(0);
60
- p && l(p);
69
+ }, g = (c) => {
70
+ var S;
71
+ let x = (S = c.typeAnnotation) == null ? void 0 : S.range;
72
+ x && n(y(x));
73
+ }, f = (c) => {
74
+ if (c.type === I.Identifier)
75
+ ({ name: s } = c);
76
+ else if (c.type === I.TSIndexSignature) {
77
+ let x = c.parameters.at(0);
78
+ x && f(x);
61
79
  }
62
80
  };
63
- return e.type === g.TSPropertySignature ? (l(e.key), d(e), c(e), m(e)) : e.type === g.TSIndexSignature && (l(e), f(e), m(e)), {
81
+ return e.type === I.TSPropertySignature ? (f(e.key), p(e), u(e), g(e)) : e.type === I.TSIndexSignature && (f(e), m(e), g(e)), {
64
82
  node: e,
65
83
  name: s,
66
- size: t
84
+ size: r
67
85
  };
68
86
  });
69
- for (let e = 1; e < n.length; e++) {
70
- let s = e - 1, t = e, r = n.at(s), d = n.at(t);
71
- if (r.size < d.size) {
72
- let f = i.body[t];
73
- a.report({
87
+ for (let e = 1; e < d.length; e++) {
88
+ let s = e - 1, r = e, n = d.at(s), p = d.at(r);
89
+ if (h(n, p, a)) {
90
+ let m = o.body[r];
91
+ t.report({
74
92
  messageId: "unexpectedInterfacePropertiesOrder",
75
93
  data: {
76
- first: r.name,
77
- second: d.name
94
+ first: n.name,
95
+ second: p.name
78
96
  },
79
- node: f,
80
- fix: (c) => {
81
- let m = a.getSourceCode(), { text: l } = m;
82
- return S(c, l, n);
97
+ node: m,
98
+ fix: (u) => {
99
+ let g = t.getSourceCode(), { text: f } = g;
100
+ return N(u, f, d, a);
83
101
  }
84
102
  });
85
103
  }
86
104
  }
87
105
  }
88
106
  })
89
- }), y = "sort-jsx-props", A = I({
90
- name: y,
107
+ }), C = "sort-jsx-props", J = E({
108
+ name: C,
91
109
  meta: {
92
110
  type: "suggestion",
93
111
  docs: {
@@ -98,40 +116,134 @@ const h = "sort-interfaces", T = I({
98
116
  unexpectedJSXPropsOrder: 'Expected "{{second}}" to come before "{{first}}"'
99
117
  },
100
118
  fixable: "code",
101
- schema: []
119
+ schema: [
120
+ {
121
+ type: "object",
122
+ properties: {
123
+ type: {
124
+ enum: [i.natural, i["line-length"]]
125
+ },
126
+ order: {
127
+ enum: [l.asc, l.desc]
128
+ }
129
+ },
130
+ additionalProperties: !1
131
+ }
132
+ ]
102
133
  },
103
- defaultOptions: [],
104
- create: (a) => ({
105
- JSXElement: (i) => {
106
- i.openingElement.attributes.reduce(
134
+ defaultOptions: [
135
+ {
136
+ type: i.natural,
137
+ order: l.asc
138
+ }
139
+ ],
140
+ create: (t) => ({
141
+ JSXElement: (o) => {
142
+ let a = O(t.options.at(0), {
143
+ type: i.natural,
144
+ order: l.asc
145
+ });
146
+ o.openingElement.attributes.reduce(
107
147
  (e, s) => (s.type === "JSXAttribute" ? e.at(-1).push(s) : e.push([]), e),
108
148
  [[]]
109
149
  ).forEach((e) => {
110
- let s = e.map((t) => ({
111
- name: t.name.type === g.JSXNamespacedName ? `${t.name.namespace.name}:${t.name.name.name}` : t.name.name,
112
- size: u(t.range),
113
- node: t
150
+ let s = e.map((r) => ({
151
+ name: r.name.type === I.JSXNamespacedName ? `${r.name.namespace.name}:${r.name.name.name}` : r.name.name,
152
+ size: y(r.range),
153
+ node: r
114
154
  }));
115
- for (let t = 1; t < s.length; t++) {
116
- let r = t - 1, d = t, f = s.at(r), c = s.at(d);
117
- f.size < c.size && a.report({
155
+ for (let r = 1; r < s.length; r++) {
156
+ let n = r - 1, p = r, m = s.at(n), u = s.at(p);
157
+ h(m, u, a) && t.report({
118
158
  messageId: "unexpectedJSXPropsOrder",
119
159
  data: {
120
- first: f.name,
121
- second: c.name
160
+ first: m.name,
161
+ second: u.name
122
162
  },
123
- node: c.node,
124
- fix: (m) => {
125
- let l = a.getSourceCode(), { text: o } = l;
126
- return S(m, o, s);
163
+ node: u.node,
164
+ fix: (g) => {
165
+ let f = t.getSourceCode(), { text: c } = f;
166
+ return N(g, c, s, a);
127
167
  }
128
168
  });
129
169
  }
130
170
  });
131
171
  }
132
172
  })
133
- }), z = "sort-named-imports", b = I({
134
- name: z,
173
+ }), R = "sort-named-exports", L = E({
174
+ name: R,
175
+ meta: {
176
+ type: "suggestion",
177
+ docs: {
178
+ description: "Enforce sorted interface properties",
179
+ recommended: !1
180
+ },
181
+ messages: {
182
+ unexpectedNamedExportsOrder: 'Expected "{{second}}" to come before "{{first}}"'
183
+ },
184
+ fixable: "code",
185
+ schema: [
186
+ {
187
+ type: "object",
188
+ properties: {
189
+ type: {
190
+ enum: [i.natural, i["line-length"]]
191
+ },
192
+ order: {
193
+ enum: [l.asc, l.desc]
194
+ }
195
+ },
196
+ additionalProperties: !1
197
+ }
198
+ ]
199
+ },
200
+ defaultOptions: [
201
+ {
202
+ type: i.natural,
203
+ order: l.asc
204
+ }
205
+ ],
206
+ create: (t) => ({
207
+ ExportNamedDeclaration: (o) => {
208
+ let a = O(t.options.at(0), {
209
+ type: i.natural,
210
+ order: l.asc
211
+ });
212
+ if (o.specifiers.length > 1) {
213
+ let d = o.specifiers.map((e) => {
214
+ let {
215
+ range: s,
216
+ local: { name: r }
217
+ } = e;
218
+ return {
219
+ size: y(s),
220
+ node: e,
221
+ name: r
222
+ };
223
+ });
224
+ for (let e = 1; e < d.length; e++) {
225
+ let s = e - 1, r = e, n = d.at(s), p = d.at(r);
226
+ if (h(n, p, a)) {
227
+ let m = o.specifiers[r];
228
+ t.report({
229
+ messageId: "unexpectedNamedExportsOrder",
230
+ data: {
231
+ first: n.name,
232
+ second: p.name
233
+ },
234
+ node: m,
235
+ fix: (u) => {
236
+ let g = t.getSourceCode(), { text: f } = g;
237
+ return N(u, f, d, a);
238
+ }
239
+ });
240
+ }
241
+ }
242
+ }
243
+ }
244
+ })
245
+ }), T = "sort-named-imports", M = E({
246
+ name: T,
135
247
  meta: {
136
248
  type: "suggestion",
137
249
  docs: {
@@ -142,37 +254,59 @@ const h = "sort-interfaces", T = I({
142
254
  unexpectedNamedImportsOrder: 'Expected "{{second}}" to come before "{{first}}"'
143
255
  },
144
256
  fixable: "code",
145
- schema: []
257
+ schema: [
258
+ {
259
+ type: "object",
260
+ properties: {
261
+ type: {
262
+ enum: [i.natural, i["line-length"]]
263
+ },
264
+ order: {
265
+ enum: [l.asc, l.desc]
266
+ }
267
+ },
268
+ additionalProperties: !1
269
+ }
270
+ ]
146
271
  },
147
- defaultOptions: [],
148
- create: (a) => ({
149
- ImportDeclaration: (i) => {
150
- if (i.specifiers.length > 1) {
151
- let n = i.specifiers.map((e) => {
272
+ defaultOptions: [
273
+ {
274
+ type: i.natural,
275
+ order: l.asc
276
+ }
277
+ ],
278
+ create: (t) => ({
279
+ ImportDeclaration: (o) => {
280
+ let a = O(t.options.at(0), {
281
+ type: i.natural,
282
+ order: l.asc
283
+ });
284
+ if (o.specifiers.length > 1) {
285
+ let d = o.specifiers.map((e) => {
152
286
  let {
153
287
  range: s,
154
- local: { name: t }
288
+ local: { name: r }
155
289
  } = e;
156
290
  return {
157
- size: u(s),
291
+ size: y(s),
158
292
  node: e,
159
- name: t
293
+ name: r
160
294
  };
161
295
  });
162
- for (let e = 1; e < n.length; e++) {
163
- let s = e - 1, t = e, r = n.at(s), d = n.at(t);
164
- if (r.size < d.size) {
165
- let f = i.specifiers[t];
166
- a.report({
296
+ for (let e = 1; e < d.length; e++) {
297
+ let s = e - 1, r = e, n = d.at(s), p = d.at(r);
298
+ if (h(n, p, a)) {
299
+ let m = o.specifiers[r];
300
+ t.report({
167
301
  messageId: "unexpectedNamedImportsOrder",
168
302
  data: {
169
- first: r.name,
170
- second: d.name
303
+ first: n.name,
304
+ second: p.name
171
305
  },
172
- node: f,
173
- fix: (c) => {
174
- let m = a.getSourceCode(), { text: l } = m;
175
- return S(c, l, n);
306
+ node: m,
307
+ fix: (u) => {
308
+ let g = t.getSourceCode(), { text: f } = g;
309
+ return N(u, f, d, a);
176
310
  }
177
311
  });
178
312
  }
@@ -180,14 +314,102 @@ const h = "sort-interfaces", T = I({
180
314
  }
181
315
  }
182
316
  })
183
- }), J = {
184
- name: E,
317
+ }), P = "sort-union-types", X = E({
318
+ name: P,
319
+ meta: {
320
+ type: "suggestion",
321
+ docs: {
322
+ description: "Enforce sorted union types",
323
+ recommended: !1
324
+ },
325
+ messages: {
326
+ unexpectedUnionTypesOrder: 'Expected "{{second}}" to come before "{{first}}"'
327
+ },
328
+ fixable: "code",
329
+ schema: [
330
+ {
331
+ type: "object",
332
+ properties: {
333
+ type: {
334
+ enum: [i.natural, i["line-length"]]
335
+ },
336
+ order: {
337
+ enum: [l.asc, l.desc]
338
+ }
339
+ },
340
+ additionalProperties: !1
341
+ }
342
+ ]
343
+ },
344
+ defaultOptions: [
345
+ {
346
+ type: i.natural,
347
+ order: l.asc
348
+ }
349
+ ],
350
+ create: (t) => ({
351
+ TSUnionType: (o) => {
352
+ let a = t.getSourceCode().text, d = O(t.options.at(0), {
353
+ type: i.natural,
354
+ order: l.asc
355
+ }), e = o.types.map((s) => {
356
+ let { range: r } = s, n = a.slice(...r);
357
+ return {
358
+ size: y(r),
359
+ node: s,
360
+ name: n
361
+ };
362
+ });
363
+ for (let s = 1; s < e.length; s++) {
364
+ let r = s - 1, n = s, p = e.at(r), m = e.at(n);
365
+ if (h(p, m, d)) {
366
+ let u = o.types[n];
367
+ t.report({
368
+ messageId: "unexpectedUnionTypesOrder",
369
+ data: {
370
+ first: p.name,
371
+ second: m.name
372
+ },
373
+ node: u,
374
+ fix: (g) => {
375
+ let f = t.getSourceCode(), { text: c } = f;
376
+ return N(g, c, e, d);
377
+ }
378
+ });
379
+ }
380
+ }
381
+ }
382
+ })
383
+ });
384
+ let j = (t) => {
385
+ let o = {
386
+ [b]: ["error"],
387
+ [C]: ["error"],
388
+ [R]: ["error"],
389
+ [T]: ["error"],
390
+ [P]: ["error"]
391
+ };
392
+ return Object.fromEntries(
393
+ Object.entries(o).map(([a, [d, e = {}]]) => [
394
+ a,
395
+ [d, Object.assign(e, t)]
396
+ ])
397
+ );
398
+ };
399
+ const B = {
400
+ name: $,
185
401
  rules: {
186
- [h]: T,
187
- [y]: A,
188
- [z]: b
402
+ [b]: _,
403
+ [C]: J,
404
+ [R]: L,
405
+ [T]: M,
406
+ [P]: X
407
+ },
408
+ configs: {
409
+ "recommended-natural": j({ type: "natural", order: "asc" }),
410
+ "recommended-line-length": j({ type: "line-length", order: "desc" })
189
411
  }
190
412
  };
191
413
  export {
192
- J as default
414
+ B as default
193
415
  };
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "eslint-plugin-perfectionist",
3
3
  "description": "ESLint plugin for code formatting in perfectionist style",
4
- "version": "0.2.0",
4
+ "version": "0.4.0",
5
+ "homepage": "https://eslint-plugin-perfectionist.azat.io",
5
6
  "repository": "azat-io/eslint-plugin-perfectionist",
6
7
  "author": "Azat S. <to@azat.io>",
7
8
  "license": "MIT",
@@ -18,8 +19,8 @@
18
19
  ],
19
20
  "exports": {
20
21
  ".": {
21
- "require": "./dist/index.cjs.js",
22
- "import": "./dist/index.es.js"
22
+ "require": "./dist/index.js",
23
+ "import": "./dist/index.mjs"
23
24
  },
24
25
  "./package.json": "./package.json"
25
26
  },
@@ -27,7 +28,8 @@
27
28
  "eslint": "^8.39.0"
28
29
  },
29
30
  "dependencies": {
30
- "@typescript-eslint/types": "^5.59.2",
31
- "@typescript-eslint/utils": "^5.59.2"
31
+ "@typescript-eslint/types": "^5.59.6",
32
+ "@typescript-eslint/utils": "^5.59.6",
33
+ "natural-compare-lite": "^1.4.0"
32
34
  }
33
35
  }
package/readme.md CHANGED
@@ -26,7 +26,9 @@ npm install --save-dev eslint-plugin-perfectionist
26
26
  | :----------------------------------------------------------------------------------------- | :---------------------------------- | :-- | :-- |
27
27
  | [sort-interfaces](https://eslint-plugin-perfectionist.azat.io/rules/sort-interfaces) | Enforce sorted interface properties | ✅ | 🔧 |
28
28
  | [sort-jsx-props](https://eslint-plugin-perfectionist.azat.io/rules/sort-jsx-props) | Enforce sorted JSX props | ✅ | 🔧 |
29
+ | [sort-named-exports](https://eslint-plugin-perfectionist.azat.io/rules/sort-named-exports) | Enforce sorted named exports | ✅ | 🔧 |
29
30
  | [sort-named-imports](https://eslint-plugin-perfectionist.azat.io/rules/sort-named-imports) | Enforce sorted named imports | ✅ | 🔧 |
31
+ | [sort-union-types](https://eslint-plugin-perfectionist.azat.io/rules/sort-union-types) | Enforce sorted union types | ✅ | 🔧 |
30
32
 
31
33
  ## See also
32
34