@saasmakers/eslint 1.0.5 → 1.0.7
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/eslint.config.cjs +67 -1
- package/dist/eslint.config.d.cts +67 -1
- package/dist/eslint.config.d.mts +67 -1
- package/dist/eslint.config.d.ts +67 -1
- package/dist/eslint.config.mjs +67 -1
- package/dist/index.cjs +136 -4
- package/dist/index.d.cts +1 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +136 -4
- package/package.json +2 -2
package/dist/eslint.config.cjs
CHANGED
|
@@ -10866,11 +10866,77 @@ const eslint_config = antfu__default(
|
|
|
10866
10866
|
// SaaS Makers
|
|
10867
10867
|
{
|
|
10868
10868
|
plugins: { saasmakers: saasmakers__default },
|
|
10869
|
-
rules: {
|
|
10869
|
+
rules: {
|
|
10870
|
+
"saasmakers/ts-padding-await-statements": "error",
|
|
10871
|
+
"saasmakers/ts-sort-tests": "error"
|
|
10872
|
+
}
|
|
10870
10873
|
},
|
|
10871
10874
|
// Stylistic
|
|
10872
10875
|
{
|
|
10873
10876
|
rules: {
|
|
10877
|
+
"style/padding-line-between-statements": [
|
|
10878
|
+
"error",
|
|
10879
|
+
{
|
|
10880
|
+
blankLine: "always",
|
|
10881
|
+
next: "*",
|
|
10882
|
+
prev: "singleline-const"
|
|
10883
|
+
},
|
|
10884
|
+
{
|
|
10885
|
+
blankLine: "always",
|
|
10886
|
+
next: "*",
|
|
10887
|
+
prev: "multiline-const"
|
|
10888
|
+
},
|
|
10889
|
+
{
|
|
10890
|
+
blankLine: "always",
|
|
10891
|
+
next: "*",
|
|
10892
|
+
prev: "singleline-let"
|
|
10893
|
+
},
|
|
10894
|
+
{
|
|
10895
|
+
blankLine: "always",
|
|
10896
|
+
next: "*",
|
|
10897
|
+
prev: "multiline-let"
|
|
10898
|
+
},
|
|
10899
|
+
{
|
|
10900
|
+
blankLine: "never",
|
|
10901
|
+
next: "singleline-const",
|
|
10902
|
+
prev: "singleline-const"
|
|
10903
|
+
},
|
|
10904
|
+
{
|
|
10905
|
+
blankLine: "never",
|
|
10906
|
+
next: "singleline-let",
|
|
10907
|
+
prev: "singleline-let"
|
|
10908
|
+
},
|
|
10909
|
+
{
|
|
10910
|
+
blankLine: "always",
|
|
10911
|
+
next: "multiline-const",
|
|
10912
|
+
prev: "multiline-const"
|
|
10913
|
+
},
|
|
10914
|
+
{
|
|
10915
|
+
blankLine: "always",
|
|
10916
|
+
next: "multiline-let",
|
|
10917
|
+
prev: "multiline-let"
|
|
10918
|
+
},
|
|
10919
|
+
{
|
|
10920
|
+
blankLine: "always",
|
|
10921
|
+
next: "multiline-const",
|
|
10922
|
+
prev: "singleline-const"
|
|
10923
|
+
},
|
|
10924
|
+
{
|
|
10925
|
+
blankLine: "always",
|
|
10926
|
+
next: "singleline-const",
|
|
10927
|
+
prev: "multiline-const"
|
|
10928
|
+
},
|
|
10929
|
+
{
|
|
10930
|
+
blankLine: "always",
|
|
10931
|
+
next: "multiline-let",
|
|
10932
|
+
prev: "singleline-let"
|
|
10933
|
+
},
|
|
10934
|
+
{
|
|
10935
|
+
blankLine: "always",
|
|
10936
|
+
next: "singleline-let",
|
|
10937
|
+
prev: "multiline-let"
|
|
10938
|
+
}
|
|
10939
|
+
],
|
|
10874
10940
|
"style/object-property-newline": ["error", { allowAllPropertiesOnSameLine: false }],
|
|
10875
10941
|
"style/object-curly-newline": ["error", {
|
|
10876
10942
|
ExportDeclaration: {
|
package/dist/eslint.config.d.cts
CHANGED
|
@@ -146,11 +146,77 @@ var eslint_config = antfu(
|
|
|
146
146
|
// SaaS Makers
|
|
147
147
|
{
|
|
148
148
|
plugins: { saasmakers },
|
|
149
|
-
rules: {
|
|
149
|
+
rules: {
|
|
150
|
+
"saasmakers/ts-padding-await-statements": "error",
|
|
151
|
+
"saasmakers/ts-sort-tests": "error"
|
|
152
|
+
}
|
|
150
153
|
},
|
|
151
154
|
// Stylistic
|
|
152
155
|
{
|
|
153
156
|
rules: {
|
|
157
|
+
"style/padding-line-between-statements": [
|
|
158
|
+
"error",
|
|
159
|
+
{
|
|
160
|
+
blankLine: "always",
|
|
161
|
+
next: "*",
|
|
162
|
+
prev: "singleline-const"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
blankLine: "always",
|
|
166
|
+
next: "*",
|
|
167
|
+
prev: "multiline-const"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
blankLine: "always",
|
|
171
|
+
next: "*",
|
|
172
|
+
prev: "singleline-let"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
blankLine: "always",
|
|
176
|
+
next: "*",
|
|
177
|
+
prev: "multiline-let"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
blankLine: "never",
|
|
181
|
+
next: "singleline-const",
|
|
182
|
+
prev: "singleline-const"
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
blankLine: "never",
|
|
186
|
+
next: "singleline-let",
|
|
187
|
+
prev: "singleline-let"
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
blankLine: "always",
|
|
191
|
+
next: "multiline-const",
|
|
192
|
+
prev: "multiline-const"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
blankLine: "always",
|
|
196
|
+
next: "multiline-let",
|
|
197
|
+
prev: "multiline-let"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
blankLine: "always",
|
|
201
|
+
next: "multiline-const",
|
|
202
|
+
prev: "singleline-const"
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
blankLine: "always",
|
|
206
|
+
next: "singleline-const",
|
|
207
|
+
prev: "multiline-const"
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
blankLine: "always",
|
|
211
|
+
next: "multiline-let",
|
|
212
|
+
prev: "singleline-let"
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
blankLine: "always",
|
|
216
|
+
next: "singleline-let",
|
|
217
|
+
prev: "multiline-let"
|
|
218
|
+
}
|
|
219
|
+
],
|
|
154
220
|
"style/object-property-newline": ["error", { allowAllPropertiesOnSameLine: false }],
|
|
155
221
|
"style/object-curly-newline": ["error", {
|
|
156
222
|
ExportDeclaration: {
|
package/dist/eslint.config.d.mts
CHANGED
|
@@ -146,11 +146,77 @@ var eslint_config = antfu(
|
|
|
146
146
|
// SaaS Makers
|
|
147
147
|
{
|
|
148
148
|
plugins: { saasmakers },
|
|
149
|
-
rules: {
|
|
149
|
+
rules: {
|
|
150
|
+
"saasmakers/ts-padding-await-statements": "error",
|
|
151
|
+
"saasmakers/ts-sort-tests": "error"
|
|
152
|
+
}
|
|
150
153
|
},
|
|
151
154
|
// Stylistic
|
|
152
155
|
{
|
|
153
156
|
rules: {
|
|
157
|
+
"style/padding-line-between-statements": [
|
|
158
|
+
"error",
|
|
159
|
+
{
|
|
160
|
+
blankLine: "always",
|
|
161
|
+
next: "*",
|
|
162
|
+
prev: "singleline-const"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
blankLine: "always",
|
|
166
|
+
next: "*",
|
|
167
|
+
prev: "multiline-const"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
blankLine: "always",
|
|
171
|
+
next: "*",
|
|
172
|
+
prev: "singleline-let"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
blankLine: "always",
|
|
176
|
+
next: "*",
|
|
177
|
+
prev: "multiline-let"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
blankLine: "never",
|
|
181
|
+
next: "singleline-const",
|
|
182
|
+
prev: "singleline-const"
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
blankLine: "never",
|
|
186
|
+
next: "singleline-let",
|
|
187
|
+
prev: "singleline-let"
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
blankLine: "always",
|
|
191
|
+
next: "multiline-const",
|
|
192
|
+
prev: "multiline-const"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
blankLine: "always",
|
|
196
|
+
next: "multiline-let",
|
|
197
|
+
prev: "multiline-let"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
blankLine: "always",
|
|
201
|
+
next: "multiline-const",
|
|
202
|
+
prev: "singleline-const"
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
blankLine: "always",
|
|
206
|
+
next: "singleline-const",
|
|
207
|
+
prev: "multiline-const"
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
blankLine: "always",
|
|
211
|
+
next: "multiline-let",
|
|
212
|
+
prev: "singleline-let"
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
blankLine: "always",
|
|
216
|
+
next: "singleline-let",
|
|
217
|
+
prev: "multiline-let"
|
|
218
|
+
}
|
|
219
|
+
],
|
|
154
220
|
"style/object-property-newline": ["error", { allowAllPropertiesOnSameLine: false }],
|
|
155
221
|
"style/object-curly-newline": ["error", {
|
|
156
222
|
ExportDeclaration: {
|
package/dist/eslint.config.d.ts
CHANGED
|
@@ -146,11 +146,77 @@ var eslint_config = antfu(
|
|
|
146
146
|
// SaaS Makers
|
|
147
147
|
{
|
|
148
148
|
plugins: { saasmakers },
|
|
149
|
-
rules: {
|
|
149
|
+
rules: {
|
|
150
|
+
"saasmakers/ts-padding-await-statements": "error",
|
|
151
|
+
"saasmakers/ts-sort-tests": "error"
|
|
152
|
+
}
|
|
150
153
|
},
|
|
151
154
|
// Stylistic
|
|
152
155
|
{
|
|
153
156
|
rules: {
|
|
157
|
+
"style/padding-line-between-statements": [
|
|
158
|
+
"error",
|
|
159
|
+
{
|
|
160
|
+
blankLine: "always",
|
|
161
|
+
next: "*",
|
|
162
|
+
prev: "singleline-const"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
blankLine: "always",
|
|
166
|
+
next: "*",
|
|
167
|
+
prev: "multiline-const"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
blankLine: "always",
|
|
171
|
+
next: "*",
|
|
172
|
+
prev: "singleline-let"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
blankLine: "always",
|
|
176
|
+
next: "*",
|
|
177
|
+
prev: "multiline-let"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
blankLine: "never",
|
|
181
|
+
next: "singleline-const",
|
|
182
|
+
prev: "singleline-const"
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
blankLine: "never",
|
|
186
|
+
next: "singleline-let",
|
|
187
|
+
prev: "singleline-let"
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
blankLine: "always",
|
|
191
|
+
next: "multiline-const",
|
|
192
|
+
prev: "multiline-const"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
blankLine: "always",
|
|
196
|
+
next: "multiline-let",
|
|
197
|
+
prev: "multiline-let"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
blankLine: "always",
|
|
201
|
+
next: "multiline-const",
|
|
202
|
+
prev: "singleline-const"
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
blankLine: "always",
|
|
206
|
+
next: "singleline-const",
|
|
207
|
+
prev: "multiline-const"
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
blankLine: "always",
|
|
211
|
+
next: "multiline-let",
|
|
212
|
+
prev: "singleline-let"
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
blankLine: "always",
|
|
216
|
+
next: "singleline-let",
|
|
217
|
+
prev: "multiline-let"
|
|
218
|
+
}
|
|
219
|
+
],
|
|
154
220
|
"style/object-property-newline": ["error", { allowAllPropertiesOnSameLine: false }],
|
|
155
221
|
"style/object-curly-newline": ["error", {
|
|
156
222
|
ExportDeclaration: {
|
package/dist/eslint.config.mjs
CHANGED
|
@@ -10840,11 +10840,77 @@ const eslint_config = antfu(
|
|
|
10840
10840
|
// SaaS Makers
|
|
10841
10841
|
{
|
|
10842
10842
|
plugins: { saasmakers },
|
|
10843
|
-
rules: {
|
|
10843
|
+
rules: {
|
|
10844
|
+
"saasmakers/ts-padding-await-statements": "error",
|
|
10845
|
+
"saasmakers/ts-sort-tests": "error"
|
|
10846
|
+
}
|
|
10844
10847
|
},
|
|
10845
10848
|
// Stylistic
|
|
10846
10849
|
{
|
|
10847
10850
|
rules: {
|
|
10851
|
+
"style/padding-line-between-statements": [
|
|
10852
|
+
"error",
|
|
10853
|
+
{
|
|
10854
|
+
blankLine: "always",
|
|
10855
|
+
next: "*",
|
|
10856
|
+
prev: "singleline-const"
|
|
10857
|
+
},
|
|
10858
|
+
{
|
|
10859
|
+
blankLine: "always",
|
|
10860
|
+
next: "*",
|
|
10861
|
+
prev: "multiline-const"
|
|
10862
|
+
},
|
|
10863
|
+
{
|
|
10864
|
+
blankLine: "always",
|
|
10865
|
+
next: "*",
|
|
10866
|
+
prev: "singleline-let"
|
|
10867
|
+
},
|
|
10868
|
+
{
|
|
10869
|
+
blankLine: "always",
|
|
10870
|
+
next: "*",
|
|
10871
|
+
prev: "multiline-let"
|
|
10872
|
+
},
|
|
10873
|
+
{
|
|
10874
|
+
blankLine: "never",
|
|
10875
|
+
next: "singleline-const",
|
|
10876
|
+
prev: "singleline-const"
|
|
10877
|
+
},
|
|
10878
|
+
{
|
|
10879
|
+
blankLine: "never",
|
|
10880
|
+
next: "singleline-let",
|
|
10881
|
+
prev: "singleline-let"
|
|
10882
|
+
},
|
|
10883
|
+
{
|
|
10884
|
+
blankLine: "always",
|
|
10885
|
+
next: "multiline-const",
|
|
10886
|
+
prev: "multiline-const"
|
|
10887
|
+
},
|
|
10888
|
+
{
|
|
10889
|
+
blankLine: "always",
|
|
10890
|
+
next: "multiline-let",
|
|
10891
|
+
prev: "multiline-let"
|
|
10892
|
+
},
|
|
10893
|
+
{
|
|
10894
|
+
blankLine: "always",
|
|
10895
|
+
next: "multiline-const",
|
|
10896
|
+
prev: "singleline-const"
|
|
10897
|
+
},
|
|
10898
|
+
{
|
|
10899
|
+
blankLine: "always",
|
|
10900
|
+
next: "singleline-const",
|
|
10901
|
+
prev: "multiline-const"
|
|
10902
|
+
},
|
|
10903
|
+
{
|
|
10904
|
+
blankLine: "always",
|
|
10905
|
+
next: "multiline-let",
|
|
10906
|
+
prev: "singleline-let"
|
|
10907
|
+
},
|
|
10908
|
+
{
|
|
10909
|
+
blankLine: "always",
|
|
10910
|
+
next: "singleline-let",
|
|
10911
|
+
prev: "multiline-let"
|
|
10912
|
+
}
|
|
10913
|
+
],
|
|
10848
10914
|
"style/object-property-newline": ["error", { allowAllPropertiesOnSameLine: false }],
|
|
10849
10915
|
"style/object-curly-newline": ["error", {
|
|
10850
10916
|
ExportDeclaration: {
|
package/dist/index.cjs
CHANGED
|
@@ -4,7 +4,7 @@ const index$1 = require('./shared/eslint.DhFjwkxh.cjs');
|
|
|
4
4
|
require('eslint');
|
|
5
5
|
require('eslint/use-at-your-own-risk');
|
|
6
6
|
|
|
7
|
-
const rule$
|
|
7
|
+
const rule$c = {
|
|
8
8
|
meta: {
|
|
9
9
|
docs: {
|
|
10
10
|
description: "Enforce one-line ternaries if under a character limit, multiline otherwise",
|
|
@@ -66,7 +66,7 @@ const rule$b = {
|
|
|
66
66
|
}
|
|
67
67
|
};
|
|
68
68
|
|
|
69
|
-
const rule$
|
|
69
|
+
const rule$b = {
|
|
70
70
|
meta: {
|
|
71
71
|
docs: {
|
|
72
72
|
description: "Enforce multiline formatting for union types with more than N items",
|
|
@@ -136,6 +136,137 @@ const rule$a = {
|
|
|
136
136
|
}
|
|
137
137
|
};
|
|
138
138
|
|
|
139
|
+
function collapseBlankLine(text) {
|
|
140
|
+
return text.replace(/\n[^\S\n]*\n[^\S\n]*/, "\n");
|
|
141
|
+
}
|
|
142
|
+
function getActualLastToken(node, sourceCode) {
|
|
143
|
+
const semiToken = sourceCode.getLastToken(node);
|
|
144
|
+
if (!semiToken) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
const prevToken = sourceCode.getTokenBefore(semiToken);
|
|
148
|
+
const nextToken = sourceCode.getTokenAfter(semiToken);
|
|
149
|
+
if (prevToken && nextToken && prevToken.range[0] >= node.range[0] && semiToken.type === "Punctuator" && semiToken.value === ";" && prevToken.loc.end.line < semiToken.loc.start.line && semiToken.loc.end.line === nextToken.loc.start.line) {
|
|
150
|
+
return prevToken;
|
|
151
|
+
}
|
|
152
|
+
return semiToken;
|
|
153
|
+
}
|
|
154
|
+
function getBlankLineRequirement(prevNode, nextNode) {
|
|
155
|
+
if (!isAwaitStatement(prevNode)) {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
if (!isAwaitStatement(nextNode)) {
|
|
159
|
+
return "always";
|
|
160
|
+
}
|
|
161
|
+
if (isSingleLine(prevNode) && isSingleLine(nextNode)) {
|
|
162
|
+
return "never";
|
|
163
|
+
}
|
|
164
|
+
return "always";
|
|
165
|
+
}
|
|
166
|
+
function hasBlankLineBetween(prevNode, nextNode) {
|
|
167
|
+
return nextNode.loc.start.line - prevNode.loc.end.line > 1;
|
|
168
|
+
}
|
|
169
|
+
function isAwaitStatement(node) {
|
|
170
|
+
return node.type === index$1.distExports.AST_NODE_TYPES.ExpressionStatement && node.expression.type === index$1.distExports.AST_NODE_TYPES.AwaitExpression;
|
|
171
|
+
}
|
|
172
|
+
function isSingleLine(node) {
|
|
173
|
+
return node.loc.start.line === node.loc.end.line;
|
|
174
|
+
}
|
|
175
|
+
const rule$a = {
|
|
176
|
+
defaultOptions: [],
|
|
177
|
+
meta: {
|
|
178
|
+
docs: { description: "Require or disallow padding lines between standalone await statements" },
|
|
179
|
+
fixable: "whitespace",
|
|
180
|
+
messages: {
|
|
181
|
+
expectedBlankLine: "Expected blank line before this statement.",
|
|
182
|
+
unexpectedBlankLine: "Unexpected blank line before this statement."
|
|
183
|
+
},
|
|
184
|
+
schema: [],
|
|
185
|
+
type: "layout"
|
|
186
|
+
},
|
|
187
|
+
create(context) {
|
|
188
|
+
const sourceCode = context.sourceCode;
|
|
189
|
+
let scopeInfo = null;
|
|
190
|
+
function enterScope() {
|
|
191
|
+
scopeInfo = {
|
|
192
|
+
prevNode: null,
|
|
193
|
+
upper: scopeInfo
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function exitScope() {
|
|
197
|
+
if (scopeInfo) {
|
|
198
|
+
scopeInfo = scopeInfo.upper;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function verify(node) {
|
|
202
|
+
const parentType = node.parent?.type;
|
|
203
|
+
const allowedParents = /* @__PURE__ */ new Set([
|
|
204
|
+
index$1.distExports.AST_NODE_TYPES.BlockStatement,
|
|
205
|
+
index$1.distExports.AST_NODE_TYPES.Program,
|
|
206
|
+
index$1.distExports.AST_NODE_TYPES.StaticBlock,
|
|
207
|
+
index$1.distExports.AST_NODE_TYPES.SwitchCase
|
|
208
|
+
]);
|
|
209
|
+
if (!parentType || !allowedParents.has(parentType)) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const prevNode = scopeInfo?.prevNode;
|
|
213
|
+
if (prevNode) {
|
|
214
|
+
const requirement = getBlankLineRequirement(prevNode, node);
|
|
215
|
+
if (requirement) {
|
|
216
|
+
const hasBlank = hasBlankLineBetween(prevNode, node);
|
|
217
|
+
if (requirement === "never" && hasBlank) {
|
|
218
|
+
context.report({
|
|
219
|
+
fix(fixer) {
|
|
220
|
+
const lastToken = getActualLastToken(prevNode, sourceCode);
|
|
221
|
+
const firstToken = sourceCode.getFirstToken(node);
|
|
222
|
+
if (!lastToken || !firstToken) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
const start = lastToken.range[1];
|
|
226
|
+
const end = firstToken.range[0];
|
|
227
|
+
const text = collapseBlankLine(sourceCode.text.slice(start, end));
|
|
228
|
+
return fixer.replaceTextRange([start, end], text);
|
|
229
|
+
},
|
|
230
|
+
messageId: "unexpectedBlankLine",
|
|
231
|
+
node
|
|
232
|
+
});
|
|
233
|
+
} else if (requirement === "always" && !hasBlank) {
|
|
234
|
+
context.report({
|
|
235
|
+
fix(fixer) {
|
|
236
|
+
const lastToken = getActualLastToken(prevNode, sourceCode);
|
|
237
|
+
if (!lastToken) {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
return fixer.insertTextAfter(lastToken, "\n");
|
|
241
|
+
},
|
|
242
|
+
messageId: "expectedBlankLine",
|
|
243
|
+
node
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (scopeInfo) {
|
|
249
|
+
scopeInfo.prevNode = node;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function verifyThenEnterScope(node) {
|
|
253
|
+
verify(node);
|
|
254
|
+
enterScope();
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
":statement": verify,
|
|
258
|
+
"BlockStatement": enterScope,
|
|
259
|
+
"BlockStatement:exit": exitScope,
|
|
260
|
+
"Program": enterScope,
|
|
261
|
+
"Program:exit": exitScope,
|
|
262
|
+
"StaticBlock": enterScope,
|
|
263
|
+
"StaticBlock:exit": exitScope,
|
|
264
|
+
"SwitchCase": verifyThenEnterScope,
|
|
265
|
+
"SwitchCase:exit": exitScope
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
|
|
139
270
|
function compareTests(testA, testB) {
|
|
140
271
|
const functionA = getFunctionName(testA);
|
|
141
272
|
const functionB = getFunctionName(testB);
|
|
@@ -862,8 +993,9 @@ const rule = {
|
|
|
862
993
|
|
|
863
994
|
const index = {
|
|
864
995
|
rules: {
|
|
865
|
-
"ts-multiline-ternary": rule$
|
|
866
|
-
"ts-multiline-union": rule$
|
|
996
|
+
"ts-multiline-ternary": rule$c,
|
|
997
|
+
"ts-multiline-union": rule$b,
|
|
998
|
+
"ts-padding-await-statements": rule$a,
|
|
867
999
|
"ts-sort-tests": rule$9,
|
|
868
1000
|
"vue-i18n-consistent-locales": rule$8,
|
|
869
1001
|
"vue-i18n-consistent-t": rule$7,
|
package/dist/index.d.cts
CHANGED
|
@@ -7526,6 +7526,7 @@ declare const _default: {
|
|
|
7526
7526
|
rules: {
|
|
7527
7527
|
'ts-multiline-ternary': eslint.Rule.RuleModule;
|
|
7528
7528
|
'ts-multiline-union': eslint.Rule.RuleModule;
|
|
7529
|
+
'ts-padding-await-statements': RuleModule<"expectedBlankLine" | "unexpectedBlankLine", [], unknown, RuleListener>;
|
|
7529
7530
|
'ts-sort-tests': eslint.Rule.RuleModule;
|
|
7530
7531
|
'vue-i18n-consistent-locales': eslint.Rule.RuleModule;
|
|
7531
7532
|
'vue-i18n-consistent-t': eslint.Rule.RuleModule;
|
package/dist/index.d.mts
CHANGED
|
@@ -7526,6 +7526,7 @@ declare const _default: {
|
|
|
7526
7526
|
rules: {
|
|
7527
7527
|
'ts-multiline-ternary': eslint.Rule.RuleModule;
|
|
7528
7528
|
'ts-multiline-union': eslint.Rule.RuleModule;
|
|
7529
|
+
'ts-padding-await-statements': RuleModule<"expectedBlankLine" | "unexpectedBlankLine", [], unknown, RuleListener>;
|
|
7529
7530
|
'ts-sort-tests': eslint.Rule.RuleModule;
|
|
7530
7531
|
'vue-i18n-consistent-locales': eslint.Rule.RuleModule;
|
|
7531
7532
|
'vue-i18n-consistent-t': eslint.Rule.RuleModule;
|
package/dist/index.d.ts
CHANGED
|
@@ -7526,6 +7526,7 @@ declare const _default: {
|
|
|
7526
7526
|
rules: {
|
|
7527
7527
|
'ts-multiline-ternary': eslint.Rule.RuleModule;
|
|
7528
7528
|
'ts-multiline-union': eslint.Rule.RuleModule;
|
|
7529
|
+
'ts-padding-await-statements': RuleModule<"expectedBlankLine" | "unexpectedBlankLine", [], unknown, RuleListener>;
|
|
7529
7530
|
'ts-sort-tests': eslint.Rule.RuleModule;
|
|
7530
7531
|
'vue-i18n-consistent-locales': eslint.Rule.RuleModule;
|
|
7531
7532
|
'vue-i18n-consistent-t': eslint.Rule.RuleModule;
|
package/dist/index.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { d as distExports } from './shared/eslint.CohBuu1-.mjs';
|
|
|
2
2
|
import 'eslint';
|
|
3
3
|
import 'eslint/use-at-your-own-risk';
|
|
4
4
|
|
|
5
|
-
const rule$
|
|
5
|
+
const rule$c = {
|
|
6
6
|
meta: {
|
|
7
7
|
docs: {
|
|
8
8
|
description: "Enforce one-line ternaries if under a character limit, multiline otherwise",
|
|
@@ -64,7 +64,7 @@ const rule$b = {
|
|
|
64
64
|
}
|
|
65
65
|
};
|
|
66
66
|
|
|
67
|
-
const rule$
|
|
67
|
+
const rule$b = {
|
|
68
68
|
meta: {
|
|
69
69
|
docs: {
|
|
70
70
|
description: "Enforce multiline formatting for union types with more than N items",
|
|
@@ -134,6 +134,137 @@ const rule$a = {
|
|
|
134
134
|
}
|
|
135
135
|
};
|
|
136
136
|
|
|
137
|
+
function collapseBlankLine(text) {
|
|
138
|
+
return text.replace(/\n[^\S\n]*\n[^\S\n]*/, "\n");
|
|
139
|
+
}
|
|
140
|
+
function getActualLastToken(node, sourceCode) {
|
|
141
|
+
const semiToken = sourceCode.getLastToken(node);
|
|
142
|
+
if (!semiToken) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
const prevToken = sourceCode.getTokenBefore(semiToken);
|
|
146
|
+
const nextToken = sourceCode.getTokenAfter(semiToken);
|
|
147
|
+
if (prevToken && nextToken && prevToken.range[0] >= node.range[0] && semiToken.type === "Punctuator" && semiToken.value === ";" && prevToken.loc.end.line < semiToken.loc.start.line && semiToken.loc.end.line === nextToken.loc.start.line) {
|
|
148
|
+
return prevToken;
|
|
149
|
+
}
|
|
150
|
+
return semiToken;
|
|
151
|
+
}
|
|
152
|
+
function getBlankLineRequirement(prevNode, nextNode) {
|
|
153
|
+
if (!isAwaitStatement(prevNode)) {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
if (!isAwaitStatement(nextNode)) {
|
|
157
|
+
return "always";
|
|
158
|
+
}
|
|
159
|
+
if (isSingleLine(prevNode) && isSingleLine(nextNode)) {
|
|
160
|
+
return "never";
|
|
161
|
+
}
|
|
162
|
+
return "always";
|
|
163
|
+
}
|
|
164
|
+
function hasBlankLineBetween(prevNode, nextNode) {
|
|
165
|
+
return nextNode.loc.start.line - prevNode.loc.end.line > 1;
|
|
166
|
+
}
|
|
167
|
+
function isAwaitStatement(node) {
|
|
168
|
+
return node.type === distExports.AST_NODE_TYPES.ExpressionStatement && node.expression.type === distExports.AST_NODE_TYPES.AwaitExpression;
|
|
169
|
+
}
|
|
170
|
+
function isSingleLine(node) {
|
|
171
|
+
return node.loc.start.line === node.loc.end.line;
|
|
172
|
+
}
|
|
173
|
+
const rule$a = {
|
|
174
|
+
defaultOptions: [],
|
|
175
|
+
meta: {
|
|
176
|
+
docs: { description: "Require or disallow padding lines between standalone await statements" },
|
|
177
|
+
fixable: "whitespace",
|
|
178
|
+
messages: {
|
|
179
|
+
expectedBlankLine: "Expected blank line before this statement.",
|
|
180
|
+
unexpectedBlankLine: "Unexpected blank line before this statement."
|
|
181
|
+
},
|
|
182
|
+
schema: [],
|
|
183
|
+
type: "layout"
|
|
184
|
+
},
|
|
185
|
+
create(context) {
|
|
186
|
+
const sourceCode = context.sourceCode;
|
|
187
|
+
let scopeInfo = null;
|
|
188
|
+
function enterScope() {
|
|
189
|
+
scopeInfo = {
|
|
190
|
+
prevNode: null,
|
|
191
|
+
upper: scopeInfo
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function exitScope() {
|
|
195
|
+
if (scopeInfo) {
|
|
196
|
+
scopeInfo = scopeInfo.upper;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
function verify(node) {
|
|
200
|
+
const parentType = node.parent?.type;
|
|
201
|
+
const allowedParents = /* @__PURE__ */ new Set([
|
|
202
|
+
distExports.AST_NODE_TYPES.BlockStatement,
|
|
203
|
+
distExports.AST_NODE_TYPES.Program,
|
|
204
|
+
distExports.AST_NODE_TYPES.StaticBlock,
|
|
205
|
+
distExports.AST_NODE_TYPES.SwitchCase
|
|
206
|
+
]);
|
|
207
|
+
if (!parentType || !allowedParents.has(parentType)) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const prevNode = scopeInfo?.prevNode;
|
|
211
|
+
if (prevNode) {
|
|
212
|
+
const requirement = getBlankLineRequirement(prevNode, node);
|
|
213
|
+
if (requirement) {
|
|
214
|
+
const hasBlank = hasBlankLineBetween(prevNode, node);
|
|
215
|
+
if (requirement === "never" && hasBlank) {
|
|
216
|
+
context.report({
|
|
217
|
+
fix(fixer) {
|
|
218
|
+
const lastToken = getActualLastToken(prevNode, sourceCode);
|
|
219
|
+
const firstToken = sourceCode.getFirstToken(node);
|
|
220
|
+
if (!lastToken || !firstToken) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
const start = lastToken.range[1];
|
|
224
|
+
const end = firstToken.range[0];
|
|
225
|
+
const text = collapseBlankLine(sourceCode.text.slice(start, end));
|
|
226
|
+
return fixer.replaceTextRange([start, end], text);
|
|
227
|
+
},
|
|
228
|
+
messageId: "unexpectedBlankLine",
|
|
229
|
+
node
|
|
230
|
+
});
|
|
231
|
+
} else if (requirement === "always" && !hasBlank) {
|
|
232
|
+
context.report({
|
|
233
|
+
fix(fixer) {
|
|
234
|
+
const lastToken = getActualLastToken(prevNode, sourceCode);
|
|
235
|
+
if (!lastToken) {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
return fixer.insertTextAfter(lastToken, "\n");
|
|
239
|
+
},
|
|
240
|
+
messageId: "expectedBlankLine",
|
|
241
|
+
node
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (scopeInfo) {
|
|
247
|
+
scopeInfo.prevNode = node;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
function verifyThenEnterScope(node) {
|
|
251
|
+
verify(node);
|
|
252
|
+
enterScope();
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
":statement": verify,
|
|
256
|
+
"BlockStatement": enterScope,
|
|
257
|
+
"BlockStatement:exit": exitScope,
|
|
258
|
+
"Program": enterScope,
|
|
259
|
+
"Program:exit": exitScope,
|
|
260
|
+
"StaticBlock": enterScope,
|
|
261
|
+
"StaticBlock:exit": exitScope,
|
|
262
|
+
"SwitchCase": verifyThenEnterScope,
|
|
263
|
+
"SwitchCase:exit": exitScope
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
|
|
137
268
|
function compareTests(testA, testB) {
|
|
138
269
|
const functionA = getFunctionName(testA);
|
|
139
270
|
const functionB = getFunctionName(testB);
|
|
@@ -860,8 +991,9 @@ const rule = {
|
|
|
860
991
|
|
|
861
992
|
const index = {
|
|
862
993
|
rules: {
|
|
863
|
-
"ts-multiline-ternary": rule$
|
|
864
|
-
"ts-multiline-union": rule$
|
|
994
|
+
"ts-multiline-ternary": rule$c,
|
|
995
|
+
"ts-multiline-union": rule$b,
|
|
996
|
+
"ts-padding-await-statements": rule$a,
|
|
865
997
|
"ts-sort-tests": rule$9,
|
|
866
998
|
"vue-i18n-consistent-locales": rule$8,
|
|
867
999
|
"vue-i18n-consistent-t": rule$7,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@saasmakers/eslint",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Shared ESLint config and rules for SaaS Makers projects",
|
|
6
6
|
"license": "MIT",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"@unocss/eslint-plugin": "66.7.0",
|
|
31
31
|
"@vitest/eslint-plugin": "1.6.20",
|
|
32
32
|
"eslint-plugin-package-json": "0.31.0",
|
|
33
|
-
"eslint-plugin-turbo": "2.9.
|
|
33
|
+
"eslint-plugin-turbo": "2.9.18",
|
|
34
34
|
"eslint-plugin-zod": "3.4.0",
|
|
35
35
|
"typescript-eslint": "8.61.0"
|
|
36
36
|
},
|