@saasmakers/eslint 1.0.6 → 1.0.8
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 +1 -64
- package/dist/eslint.config.d.cts +1 -64
- package/dist/eslint.config.d.mts +1 -64
- package/dist/eslint.config.d.ts +1 -64
- package/dist/eslint.config.mjs +1 -64
- package/dist/index.cjs +103 -66
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +103 -66
- package/package.json +1 -1
package/dist/eslint.config.cjs
CHANGED
|
@@ -10867,76 +10867,13 @@ const eslint_config = antfu__default(
|
|
|
10867
10867
|
{
|
|
10868
10868
|
plugins: { saasmakers: saasmakers__default },
|
|
10869
10869
|
rules: {
|
|
10870
|
-
"saasmakers/ts-padding-
|
|
10870
|
+
"saasmakers/ts-padding-statements": "error",
|
|
10871
10871
|
"saasmakers/ts-sort-tests": "error"
|
|
10872
10872
|
}
|
|
10873
10873
|
},
|
|
10874
10874
|
// Stylistic
|
|
10875
10875
|
{
|
|
10876
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
|
-
],
|
|
10940
10877
|
"style/object-property-newline": ["error", { allowAllPropertiesOnSameLine: false }],
|
|
10941
10878
|
"style/object-curly-newline": ["error", {
|
|
10942
10879
|
ExportDeclaration: {
|
package/dist/eslint.config.d.cts
CHANGED
|
@@ -147,76 +147,13 @@ var eslint_config = antfu(
|
|
|
147
147
|
{
|
|
148
148
|
plugins: { saasmakers },
|
|
149
149
|
rules: {
|
|
150
|
-
"saasmakers/ts-padding-
|
|
150
|
+
"saasmakers/ts-padding-statements": "error",
|
|
151
151
|
"saasmakers/ts-sort-tests": "error"
|
|
152
152
|
}
|
|
153
153
|
},
|
|
154
154
|
// Stylistic
|
|
155
155
|
{
|
|
156
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
|
-
],
|
|
220
157
|
"style/object-property-newline": ["error", { allowAllPropertiesOnSameLine: false }],
|
|
221
158
|
"style/object-curly-newline": ["error", {
|
|
222
159
|
ExportDeclaration: {
|
package/dist/eslint.config.d.mts
CHANGED
|
@@ -147,76 +147,13 @@ var eslint_config = antfu(
|
|
|
147
147
|
{
|
|
148
148
|
plugins: { saasmakers },
|
|
149
149
|
rules: {
|
|
150
|
-
"saasmakers/ts-padding-
|
|
150
|
+
"saasmakers/ts-padding-statements": "error",
|
|
151
151
|
"saasmakers/ts-sort-tests": "error"
|
|
152
152
|
}
|
|
153
153
|
},
|
|
154
154
|
// Stylistic
|
|
155
155
|
{
|
|
156
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
|
-
],
|
|
220
157
|
"style/object-property-newline": ["error", { allowAllPropertiesOnSameLine: false }],
|
|
221
158
|
"style/object-curly-newline": ["error", {
|
|
222
159
|
ExportDeclaration: {
|
package/dist/eslint.config.d.ts
CHANGED
|
@@ -147,76 +147,13 @@ var eslint_config = antfu(
|
|
|
147
147
|
{
|
|
148
148
|
plugins: { saasmakers },
|
|
149
149
|
rules: {
|
|
150
|
-
"saasmakers/ts-padding-
|
|
150
|
+
"saasmakers/ts-padding-statements": "error",
|
|
151
151
|
"saasmakers/ts-sort-tests": "error"
|
|
152
152
|
}
|
|
153
153
|
},
|
|
154
154
|
// Stylistic
|
|
155
155
|
{
|
|
156
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
|
-
],
|
|
220
157
|
"style/object-property-newline": ["error", { allowAllPropertiesOnSameLine: false }],
|
|
221
158
|
"style/object-curly-newline": ["error", {
|
|
222
159
|
ExportDeclaration: {
|
package/dist/eslint.config.mjs
CHANGED
|
@@ -10841,76 +10841,13 @@ const eslint_config = antfu(
|
|
|
10841
10841
|
{
|
|
10842
10842
|
plugins: { saasmakers },
|
|
10843
10843
|
rules: {
|
|
10844
|
-
"saasmakers/ts-padding-
|
|
10844
|
+
"saasmakers/ts-padding-statements": "error",
|
|
10845
10845
|
"saasmakers/ts-sort-tests": "error"
|
|
10846
10846
|
}
|
|
10847
10847
|
},
|
|
10848
10848
|
// Stylistic
|
|
10849
10849
|
{
|
|
10850
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
|
-
],
|
|
10914
10851
|
"style/object-property-newline": ["error", { allowAllPropertiesOnSameLine: false }],
|
|
10915
10852
|
"style/object-curly-newline": ["error", {
|
|
10916
10853
|
ExportDeclaration: {
|
package/dist/index.cjs
CHANGED
|
@@ -151,41 +151,60 @@ function getActualLastToken(node, sourceCode) {
|
|
|
151
151
|
}
|
|
152
152
|
return semiToken;
|
|
153
153
|
}
|
|
154
|
-
function getBlankLineRequirement(prevNode, nextNode) {
|
|
155
|
-
|
|
154
|
+
function getBlankLineRequirement(prevNode, nextNode, sourceCode) {
|
|
155
|
+
const prevKind = getStatementKind(prevNode);
|
|
156
|
+
if (!prevKind) {
|
|
156
157
|
return null;
|
|
157
158
|
}
|
|
158
|
-
if (
|
|
159
|
+
if (hasLineCommentBetween(prevNode, nextNode, sourceCode)) {
|
|
159
160
|
return "always";
|
|
160
161
|
}
|
|
161
|
-
|
|
162
|
+
const nextKind = getStatementKind(nextNode);
|
|
163
|
+
if (!nextKind) {
|
|
164
|
+
return "always";
|
|
165
|
+
}
|
|
166
|
+
if (prevKind === nextKind && prevKind.startsWith("singleline-")) {
|
|
162
167
|
return "never";
|
|
163
168
|
}
|
|
164
169
|
return "always";
|
|
165
170
|
}
|
|
166
|
-
function
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
+
function getStatementKind(node) {
|
|
172
|
+
if (node.type === index$1.distExports.AST_NODE_TYPES.VariableDeclaration) {
|
|
173
|
+
if (node.kind === "const") {
|
|
174
|
+
return isSingleLine(node) ? "singleline-const" : "multiline-const";
|
|
175
|
+
}
|
|
176
|
+
if (node.kind === "let") {
|
|
177
|
+
return isSingleLine(node) ? "singleline-let" : "multiline-let";
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
171
180
|
}
|
|
172
|
-
if (
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}
|
|
182
|
-
currentToken = token;
|
|
181
|
+
if (node.type === index$1.distExports.AST_NODE_TYPES.ExpressionStatement && node.expression.type === index$1.distExports.AST_NODE_TYPES.AwaitExpression) {
|
|
182
|
+
return isSingleLine(node) ? "singleline-await" : "multiline-await";
|
|
183
|
+
}
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
function hasEmptyLineBetween(prevNode, nextNode, sourceCode) {
|
|
187
|
+
for (let line = prevNode.loc.end.line + 1; line < nextNode.loc.start.line; line++) {
|
|
188
|
+
if (sourceCode.lines[line - 1]?.trim() === "") {
|
|
189
|
+
return true;
|
|
183
190
|
}
|
|
184
191
|
}
|
|
185
|
-
return
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
function hasLineCommentBetween(prevNode, nextNode, sourceCode) {
|
|
195
|
+
return sourceCode.getAllComments().some((comment) => {
|
|
196
|
+
if (comment.type !== "Line") {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
return comment.range[0] >= prevNode.range[1] && comment.range[1] <= nextNode.range[0];
|
|
200
|
+
});
|
|
186
201
|
}
|
|
187
|
-
function
|
|
188
|
-
|
|
202
|
+
function isOwnLineComment(comment, sourceCode) {
|
|
203
|
+
if (comment.type !== "Line") {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
const lineText = sourceCode.lines[comment.loc.start.line - 1] ?? "";
|
|
207
|
+
return lineText.trimStart().startsWith("//");
|
|
189
208
|
}
|
|
190
209
|
function isSingleLine(node) {
|
|
191
210
|
return node.loc.start.line === node.loc.end.line;
|
|
@@ -193,10 +212,11 @@ function isSingleLine(node) {
|
|
|
193
212
|
const rule$a = {
|
|
194
213
|
defaultOptions: [],
|
|
195
214
|
meta: {
|
|
196
|
-
docs: { description: "Require or disallow padding lines between standalone await statements" },
|
|
215
|
+
docs: { description: "Require or disallow padding lines between const, let, and standalone await statements" },
|
|
197
216
|
fixable: "whitespace",
|
|
198
217
|
messages: {
|
|
199
218
|
expectedBlankLine: "Expected blank line before this statement.",
|
|
219
|
+
expectedBlankLineBeforeComment: "Expected blank line before this comment.",
|
|
200
220
|
unexpectedBlankLine: "Unexpected blank line before this statement."
|
|
201
221
|
},
|
|
202
222
|
schema: [],
|
|
@@ -216,6 +236,57 @@ const rule$a = {
|
|
|
216
236
|
scopeInfo = scopeInfo.upper;
|
|
217
237
|
}
|
|
218
238
|
}
|
|
239
|
+
function reportMissingBlankLine(prevNode, node) {
|
|
240
|
+
context.report({
|
|
241
|
+
fix(fixer) {
|
|
242
|
+
const lastToken = getActualLastToken(prevNode, sourceCode);
|
|
243
|
+
if (!lastToken) {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
return fixer.insertTextAfter(lastToken, "\n");
|
|
247
|
+
},
|
|
248
|
+
messageId: "expectedBlankLine",
|
|
249
|
+
node
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
function reportUnexpectedBlankLine(prevNode, node) {
|
|
253
|
+
context.report({
|
|
254
|
+
fix(fixer) {
|
|
255
|
+
const lastToken = getActualLastToken(prevNode, sourceCode);
|
|
256
|
+
const firstToken = sourceCode.getFirstToken(node);
|
|
257
|
+
if (!lastToken || !firstToken) {
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
const start = lastToken.range[1];
|
|
261
|
+
const end = firstToken.range[0];
|
|
262
|
+
const text = collapseBlankLine(sourceCode.text.slice(start, end));
|
|
263
|
+
return fixer.replaceTextRange([start, end], text);
|
|
264
|
+
},
|
|
265
|
+
messageId: "unexpectedBlankLine",
|
|
266
|
+
node
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
function verifyComment(comment) {
|
|
270
|
+
if (!isOwnLineComment(comment, sourceCode)) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
const commentLine = comment.loc.start.line;
|
|
274
|
+
if (commentLine <= 1) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
const previousLine = sourceCode.lines[commentLine - 2] ?? "";
|
|
278
|
+
if (previousLine.trim() === "" || previousLine.trimEnd().endsWith("{")) {
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
context.report({
|
|
282
|
+
fix(fixer) {
|
|
283
|
+
return fixer.insertTextBefore(comment, "\n");
|
|
284
|
+
},
|
|
285
|
+
loc: comment.loc,
|
|
286
|
+
messageId: "expectedBlankLineBeforeComment",
|
|
287
|
+
node: comment
|
|
288
|
+
});
|
|
289
|
+
}
|
|
219
290
|
function verify(node) {
|
|
220
291
|
const parentType = node.parent?.type;
|
|
221
292
|
const allowedParents = /* @__PURE__ */ new Set([
|
|
@@ -229,48 +300,13 @@ const rule$a = {
|
|
|
229
300
|
}
|
|
230
301
|
const prevNode = scopeInfo?.prevNode;
|
|
231
302
|
if (prevNode) {
|
|
232
|
-
const requirement = getBlankLineRequirement(prevNode, node);
|
|
303
|
+
const requirement = getBlankLineRequirement(prevNode, node, sourceCode);
|
|
233
304
|
if (requirement) {
|
|
234
|
-
const
|
|
235
|
-
if (requirement === "never" &&
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
return null;
|
|
240
|
-
}
|
|
241
|
-
const [prevToken, nextToken] = paddingLines[0];
|
|
242
|
-
const start = prevToken.range[1];
|
|
243
|
-
const end = nextToken.range[0];
|
|
244
|
-
const text = collapseBlankLine(sourceCode.text.slice(start, end));
|
|
245
|
-
return fixer.replaceTextRange([start, end], text);
|
|
246
|
-
},
|
|
247
|
-
messageId: "unexpectedBlankLine",
|
|
248
|
-
node
|
|
249
|
-
});
|
|
250
|
-
} else if (requirement === "always" && paddingLines.length === 0) {
|
|
251
|
-
context.report({
|
|
252
|
-
fix(fixer) {
|
|
253
|
-
const lastToken = getActualLastToken(prevNode, sourceCode);
|
|
254
|
-
if (!lastToken) {
|
|
255
|
-
return null;
|
|
256
|
-
}
|
|
257
|
-
let currentPrevToken = lastToken;
|
|
258
|
-
const nextToken = sourceCode.getFirstTokenBetween(currentPrevToken, node, {
|
|
259
|
-
filter(token) {
|
|
260
|
-
if (token.loc.start.line === currentPrevToken.loc.start.line) {
|
|
261
|
-
currentPrevToken = token;
|
|
262
|
-
return false;
|
|
263
|
-
}
|
|
264
|
-
return true;
|
|
265
|
-
},
|
|
266
|
-
includeComments: true
|
|
267
|
-
}) || node;
|
|
268
|
-
const insertText = currentPrevToken.loc.end.line === nextToken.loc.start.line ? "\n\n" : "\n";
|
|
269
|
-
return fixer.insertTextAfter(currentPrevToken, insertText);
|
|
270
|
-
},
|
|
271
|
-
messageId: "expectedBlankLine",
|
|
272
|
-
node
|
|
273
|
-
});
|
|
305
|
+
const hasBlank = hasEmptyLineBetween(prevNode, node, sourceCode);
|
|
306
|
+
if (requirement === "never" && hasBlank) {
|
|
307
|
+
reportUnexpectedBlankLine(prevNode, node);
|
|
308
|
+
} else if (requirement === "always" && !hasBlank) {
|
|
309
|
+
reportMissingBlankLine(prevNode, node);
|
|
274
310
|
}
|
|
275
311
|
}
|
|
276
312
|
}
|
|
@@ -286,6 +322,7 @@ const rule$a = {
|
|
|
286
322
|
":statement": verify,
|
|
287
323
|
"BlockStatement": enterScope,
|
|
288
324
|
"BlockStatement:exit": exitScope,
|
|
325
|
+
"LineComment": verifyComment,
|
|
289
326
|
"Program": enterScope,
|
|
290
327
|
"Program:exit": exitScope,
|
|
291
328
|
"StaticBlock": enterScope,
|
|
@@ -1024,7 +1061,7 @@ const index = {
|
|
|
1024
1061
|
rules: {
|
|
1025
1062
|
"ts-multiline-ternary": rule$c,
|
|
1026
1063
|
"ts-multiline-union": rule$b,
|
|
1027
|
-
"ts-padding-
|
|
1064
|
+
"ts-padding-statements": rule$a,
|
|
1028
1065
|
"ts-sort-tests": rule$9,
|
|
1029
1066
|
"vue-i18n-consistent-locales": rule$8,
|
|
1030
1067
|
"vue-i18n-consistent-t": rule$7,
|
package/dist/index.d.cts
CHANGED
|
@@ -7526,7 +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-
|
|
7529
|
+
'ts-padding-statements': RuleModule<"expectedBlankLine" | "expectedBlankLineBeforeComment" | "unexpectedBlankLine", [], unknown, RuleListener>;
|
|
7530
7530
|
'ts-sort-tests': eslint.Rule.RuleModule;
|
|
7531
7531
|
'vue-i18n-consistent-locales': eslint.Rule.RuleModule;
|
|
7532
7532
|
'vue-i18n-consistent-t': eslint.Rule.RuleModule;
|
package/dist/index.d.mts
CHANGED
|
@@ -7526,7 +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-
|
|
7529
|
+
'ts-padding-statements': RuleModule<"expectedBlankLine" | "expectedBlankLineBeforeComment" | "unexpectedBlankLine", [], unknown, RuleListener>;
|
|
7530
7530
|
'ts-sort-tests': eslint.Rule.RuleModule;
|
|
7531
7531
|
'vue-i18n-consistent-locales': eslint.Rule.RuleModule;
|
|
7532
7532
|
'vue-i18n-consistent-t': eslint.Rule.RuleModule;
|
package/dist/index.d.ts
CHANGED
|
@@ -7526,7 +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-
|
|
7529
|
+
'ts-padding-statements': RuleModule<"expectedBlankLine" | "expectedBlankLineBeforeComment" | "unexpectedBlankLine", [], unknown, RuleListener>;
|
|
7530
7530
|
'ts-sort-tests': eslint.Rule.RuleModule;
|
|
7531
7531
|
'vue-i18n-consistent-locales': eslint.Rule.RuleModule;
|
|
7532
7532
|
'vue-i18n-consistent-t': eslint.Rule.RuleModule;
|
package/dist/index.mjs
CHANGED
|
@@ -149,41 +149,60 @@ function getActualLastToken(node, sourceCode) {
|
|
|
149
149
|
}
|
|
150
150
|
return semiToken;
|
|
151
151
|
}
|
|
152
|
-
function getBlankLineRequirement(prevNode, nextNode) {
|
|
153
|
-
|
|
152
|
+
function getBlankLineRequirement(prevNode, nextNode, sourceCode) {
|
|
153
|
+
const prevKind = getStatementKind(prevNode);
|
|
154
|
+
if (!prevKind) {
|
|
154
155
|
return null;
|
|
155
156
|
}
|
|
156
|
-
if (
|
|
157
|
+
if (hasLineCommentBetween(prevNode, nextNode, sourceCode)) {
|
|
157
158
|
return "always";
|
|
158
159
|
}
|
|
159
|
-
|
|
160
|
+
const nextKind = getStatementKind(nextNode);
|
|
161
|
+
if (!nextKind) {
|
|
162
|
+
return "always";
|
|
163
|
+
}
|
|
164
|
+
if (prevKind === nextKind && prevKind.startsWith("singleline-")) {
|
|
160
165
|
return "never";
|
|
161
166
|
}
|
|
162
167
|
return "always";
|
|
163
168
|
}
|
|
164
|
-
function
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
+
function getStatementKind(node) {
|
|
170
|
+
if (node.type === distExports.AST_NODE_TYPES.VariableDeclaration) {
|
|
171
|
+
if (node.kind === "const") {
|
|
172
|
+
return isSingleLine(node) ? "singleline-const" : "multiline-const";
|
|
173
|
+
}
|
|
174
|
+
if (node.kind === "let") {
|
|
175
|
+
return isSingleLine(node) ? "singleline-let" : "multiline-let";
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
169
178
|
}
|
|
170
|
-
if (
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
}
|
|
180
|
-
currentToken = token;
|
|
179
|
+
if (node.type === distExports.AST_NODE_TYPES.ExpressionStatement && node.expression.type === distExports.AST_NODE_TYPES.AwaitExpression) {
|
|
180
|
+
return isSingleLine(node) ? "singleline-await" : "multiline-await";
|
|
181
|
+
}
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
function hasEmptyLineBetween(prevNode, nextNode, sourceCode) {
|
|
185
|
+
for (let line = prevNode.loc.end.line + 1; line < nextNode.loc.start.line; line++) {
|
|
186
|
+
if (sourceCode.lines[line - 1]?.trim() === "") {
|
|
187
|
+
return true;
|
|
181
188
|
}
|
|
182
189
|
}
|
|
183
|
-
return
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
function hasLineCommentBetween(prevNode, nextNode, sourceCode) {
|
|
193
|
+
return sourceCode.getAllComments().some((comment) => {
|
|
194
|
+
if (comment.type !== "Line") {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
return comment.range[0] >= prevNode.range[1] && comment.range[1] <= nextNode.range[0];
|
|
198
|
+
});
|
|
184
199
|
}
|
|
185
|
-
function
|
|
186
|
-
|
|
200
|
+
function isOwnLineComment(comment, sourceCode) {
|
|
201
|
+
if (comment.type !== "Line") {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
const lineText = sourceCode.lines[comment.loc.start.line - 1] ?? "";
|
|
205
|
+
return lineText.trimStart().startsWith("//");
|
|
187
206
|
}
|
|
188
207
|
function isSingleLine(node) {
|
|
189
208
|
return node.loc.start.line === node.loc.end.line;
|
|
@@ -191,10 +210,11 @@ function isSingleLine(node) {
|
|
|
191
210
|
const rule$a = {
|
|
192
211
|
defaultOptions: [],
|
|
193
212
|
meta: {
|
|
194
|
-
docs: { description: "Require or disallow padding lines between standalone await statements" },
|
|
213
|
+
docs: { description: "Require or disallow padding lines between const, let, and standalone await statements" },
|
|
195
214
|
fixable: "whitespace",
|
|
196
215
|
messages: {
|
|
197
216
|
expectedBlankLine: "Expected blank line before this statement.",
|
|
217
|
+
expectedBlankLineBeforeComment: "Expected blank line before this comment.",
|
|
198
218
|
unexpectedBlankLine: "Unexpected blank line before this statement."
|
|
199
219
|
},
|
|
200
220
|
schema: [],
|
|
@@ -214,6 +234,57 @@ const rule$a = {
|
|
|
214
234
|
scopeInfo = scopeInfo.upper;
|
|
215
235
|
}
|
|
216
236
|
}
|
|
237
|
+
function reportMissingBlankLine(prevNode, node) {
|
|
238
|
+
context.report({
|
|
239
|
+
fix(fixer) {
|
|
240
|
+
const lastToken = getActualLastToken(prevNode, sourceCode);
|
|
241
|
+
if (!lastToken) {
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
return fixer.insertTextAfter(lastToken, "\n");
|
|
245
|
+
},
|
|
246
|
+
messageId: "expectedBlankLine",
|
|
247
|
+
node
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
function reportUnexpectedBlankLine(prevNode, node) {
|
|
251
|
+
context.report({
|
|
252
|
+
fix(fixer) {
|
|
253
|
+
const lastToken = getActualLastToken(prevNode, sourceCode);
|
|
254
|
+
const firstToken = sourceCode.getFirstToken(node);
|
|
255
|
+
if (!lastToken || !firstToken) {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
const start = lastToken.range[1];
|
|
259
|
+
const end = firstToken.range[0];
|
|
260
|
+
const text = collapseBlankLine(sourceCode.text.slice(start, end));
|
|
261
|
+
return fixer.replaceTextRange([start, end], text);
|
|
262
|
+
},
|
|
263
|
+
messageId: "unexpectedBlankLine",
|
|
264
|
+
node
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
function verifyComment(comment) {
|
|
268
|
+
if (!isOwnLineComment(comment, sourceCode)) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
const commentLine = comment.loc.start.line;
|
|
272
|
+
if (commentLine <= 1) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
const previousLine = sourceCode.lines[commentLine - 2] ?? "";
|
|
276
|
+
if (previousLine.trim() === "" || previousLine.trimEnd().endsWith("{")) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
context.report({
|
|
280
|
+
fix(fixer) {
|
|
281
|
+
return fixer.insertTextBefore(comment, "\n");
|
|
282
|
+
},
|
|
283
|
+
loc: comment.loc,
|
|
284
|
+
messageId: "expectedBlankLineBeforeComment",
|
|
285
|
+
node: comment
|
|
286
|
+
});
|
|
287
|
+
}
|
|
217
288
|
function verify(node) {
|
|
218
289
|
const parentType = node.parent?.type;
|
|
219
290
|
const allowedParents = /* @__PURE__ */ new Set([
|
|
@@ -227,48 +298,13 @@ const rule$a = {
|
|
|
227
298
|
}
|
|
228
299
|
const prevNode = scopeInfo?.prevNode;
|
|
229
300
|
if (prevNode) {
|
|
230
|
-
const requirement = getBlankLineRequirement(prevNode, node);
|
|
301
|
+
const requirement = getBlankLineRequirement(prevNode, node, sourceCode);
|
|
231
302
|
if (requirement) {
|
|
232
|
-
const
|
|
233
|
-
if (requirement === "never" &&
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
return null;
|
|
238
|
-
}
|
|
239
|
-
const [prevToken, nextToken] = paddingLines[0];
|
|
240
|
-
const start = prevToken.range[1];
|
|
241
|
-
const end = nextToken.range[0];
|
|
242
|
-
const text = collapseBlankLine(sourceCode.text.slice(start, end));
|
|
243
|
-
return fixer.replaceTextRange([start, end], text);
|
|
244
|
-
},
|
|
245
|
-
messageId: "unexpectedBlankLine",
|
|
246
|
-
node
|
|
247
|
-
});
|
|
248
|
-
} else if (requirement === "always" && paddingLines.length === 0) {
|
|
249
|
-
context.report({
|
|
250
|
-
fix(fixer) {
|
|
251
|
-
const lastToken = getActualLastToken(prevNode, sourceCode);
|
|
252
|
-
if (!lastToken) {
|
|
253
|
-
return null;
|
|
254
|
-
}
|
|
255
|
-
let currentPrevToken = lastToken;
|
|
256
|
-
const nextToken = sourceCode.getFirstTokenBetween(currentPrevToken, node, {
|
|
257
|
-
filter(token) {
|
|
258
|
-
if (token.loc.start.line === currentPrevToken.loc.start.line) {
|
|
259
|
-
currentPrevToken = token;
|
|
260
|
-
return false;
|
|
261
|
-
}
|
|
262
|
-
return true;
|
|
263
|
-
},
|
|
264
|
-
includeComments: true
|
|
265
|
-
}) || node;
|
|
266
|
-
const insertText = currentPrevToken.loc.end.line === nextToken.loc.start.line ? "\n\n" : "\n";
|
|
267
|
-
return fixer.insertTextAfter(currentPrevToken, insertText);
|
|
268
|
-
},
|
|
269
|
-
messageId: "expectedBlankLine",
|
|
270
|
-
node
|
|
271
|
-
});
|
|
303
|
+
const hasBlank = hasEmptyLineBetween(prevNode, node, sourceCode);
|
|
304
|
+
if (requirement === "never" && hasBlank) {
|
|
305
|
+
reportUnexpectedBlankLine(prevNode, node);
|
|
306
|
+
} else if (requirement === "always" && !hasBlank) {
|
|
307
|
+
reportMissingBlankLine(prevNode, node);
|
|
272
308
|
}
|
|
273
309
|
}
|
|
274
310
|
}
|
|
@@ -284,6 +320,7 @@ const rule$a = {
|
|
|
284
320
|
":statement": verify,
|
|
285
321
|
"BlockStatement": enterScope,
|
|
286
322
|
"BlockStatement:exit": exitScope,
|
|
323
|
+
"LineComment": verifyComment,
|
|
287
324
|
"Program": enterScope,
|
|
288
325
|
"Program:exit": exitScope,
|
|
289
326
|
"StaticBlock": enterScope,
|
|
@@ -1022,7 +1059,7 @@ const index = {
|
|
|
1022
1059
|
rules: {
|
|
1023
1060
|
"ts-multiline-ternary": rule$c,
|
|
1024
1061
|
"ts-multiline-union": rule$b,
|
|
1025
|
-
"ts-padding-
|
|
1062
|
+
"ts-padding-statements": rule$a,
|
|
1026
1063
|
"ts-sort-tests": rule$9,
|
|
1027
1064
|
"vue-i18n-consistent-locales": rule$8,
|
|
1028
1065
|
"vue-i18n-consistent-t": rule$7,
|