@saasmakers/eslint 1.0.7 → 1.0.9
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 +116 -38
- 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 +116 -38
- 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,23 +151,72 @@ 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
|
-
|
|
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;
|
|
180
|
+
}
|
|
181
|
+
if (node.type === index$1.distExports.AST_NODE_TYPES.ExpressionStatement) {
|
|
182
|
+
if (node.expression.type === index$1.distExports.AST_NODE_TYPES.AwaitExpression) {
|
|
183
|
+
return isSingleLine(node) ? "singleline-await" : "multiline-await";
|
|
184
|
+
}
|
|
185
|
+
if (isDirectivePrologue(node)) {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
return isSingleLine(node) ? "singleline-expression" : "multiline-expression";
|
|
189
|
+
}
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
function hasEmptyLineBetween(prevNode, nextNode, sourceCode) {
|
|
193
|
+
for (let line = prevNode.loc.end.line + 1; line < nextNode.loc.start.line; line++) {
|
|
194
|
+
if (sourceCode.lines[line - 1]?.trim() === "") {
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
function hasLineCommentBetween(prevNode, nextNode, sourceCode) {
|
|
201
|
+
return sourceCode.getAllComments().some((comment) => {
|
|
202
|
+
if (comment.type !== "Line") {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
return comment.range[0] >= prevNode.range[1] && comment.range[1] <= nextNode.range[0];
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
function isDirectivePrologue(node) {
|
|
209
|
+
if (node.expression.type !== index$1.distExports.AST_NODE_TYPES.Literal) {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
return typeof node.expression.value === "string";
|
|
168
213
|
}
|
|
169
|
-
function
|
|
170
|
-
|
|
214
|
+
function isOwnLineComment(comment, sourceCode) {
|
|
215
|
+
if (comment.type !== "Line") {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
const lineText = sourceCode.lines[comment.loc.start.line - 1] ?? "";
|
|
219
|
+
return lineText.trimStart().startsWith("//");
|
|
171
220
|
}
|
|
172
221
|
function isSingleLine(node) {
|
|
173
222
|
return node.loc.start.line === node.loc.end.line;
|
|
@@ -175,10 +224,11 @@ function isSingleLine(node) {
|
|
|
175
224
|
const rule$a = {
|
|
176
225
|
defaultOptions: [],
|
|
177
226
|
meta: {
|
|
178
|
-
docs: { description: "Require or disallow padding lines between
|
|
227
|
+
docs: { description: "Require or disallow padding lines between const, let, await, and expression statements" },
|
|
179
228
|
fixable: "whitespace",
|
|
180
229
|
messages: {
|
|
181
230
|
expectedBlankLine: "Expected blank line before this statement.",
|
|
231
|
+
expectedBlankLineBeforeComment: "Expected blank line before this comment.",
|
|
182
232
|
unexpectedBlankLine: "Unexpected blank line before this statement."
|
|
183
233
|
},
|
|
184
234
|
schema: [],
|
|
@@ -198,6 +248,57 @@ const rule$a = {
|
|
|
198
248
|
scopeInfo = scopeInfo.upper;
|
|
199
249
|
}
|
|
200
250
|
}
|
|
251
|
+
function reportMissingBlankLine(prevNode, node) {
|
|
252
|
+
context.report({
|
|
253
|
+
fix(fixer) {
|
|
254
|
+
const lastToken = getActualLastToken(prevNode, sourceCode);
|
|
255
|
+
if (!lastToken) {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
return fixer.insertTextAfter(lastToken, "\n");
|
|
259
|
+
},
|
|
260
|
+
messageId: "expectedBlankLine",
|
|
261
|
+
node
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
function reportUnexpectedBlankLine(prevNode, node) {
|
|
265
|
+
context.report({
|
|
266
|
+
fix(fixer) {
|
|
267
|
+
const lastToken = getActualLastToken(prevNode, sourceCode);
|
|
268
|
+
const firstToken = sourceCode.getFirstToken(node);
|
|
269
|
+
if (!lastToken || !firstToken) {
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
272
|
+
const start = lastToken.range[1];
|
|
273
|
+
const end = firstToken.range[0];
|
|
274
|
+
const text = collapseBlankLine(sourceCode.text.slice(start, end));
|
|
275
|
+
return fixer.replaceTextRange([start, end], text);
|
|
276
|
+
},
|
|
277
|
+
messageId: "unexpectedBlankLine",
|
|
278
|
+
node
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
function verifyComment(comment) {
|
|
282
|
+
if (!isOwnLineComment(comment, sourceCode)) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
const commentLine = comment.loc.start.line;
|
|
286
|
+
if (commentLine <= 1) {
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
const previousLine = sourceCode.lines[commentLine - 2] ?? "";
|
|
290
|
+
if (previousLine.trim() === "" || previousLine.trimEnd().endsWith("{")) {
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
context.report({
|
|
294
|
+
fix(fixer) {
|
|
295
|
+
return fixer.insertTextBefore(comment, "\n");
|
|
296
|
+
},
|
|
297
|
+
loc: comment.loc,
|
|
298
|
+
messageId: "expectedBlankLineBeforeComment",
|
|
299
|
+
node: comment
|
|
300
|
+
});
|
|
301
|
+
}
|
|
201
302
|
function verify(node) {
|
|
202
303
|
const parentType = node.parent?.type;
|
|
203
304
|
const allowedParents = /* @__PURE__ */ new Set([
|
|
@@ -211,37 +312,13 @@ const rule$a = {
|
|
|
211
312
|
}
|
|
212
313
|
const prevNode = scopeInfo?.prevNode;
|
|
213
314
|
if (prevNode) {
|
|
214
|
-
const requirement = getBlankLineRequirement(prevNode, node);
|
|
315
|
+
const requirement = getBlankLineRequirement(prevNode, node, sourceCode);
|
|
215
316
|
if (requirement) {
|
|
216
|
-
const hasBlank =
|
|
317
|
+
const hasBlank = hasEmptyLineBetween(prevNode, node, sourceCode);
|
|
217
318
|
if (requirement === "never" && hasBlank) {
|
|
218
|
-
|
|
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
|
-
});
|
|
319
|
+
reportUnexpectedBlankLine(prevNode, node);
|
|
233
320
|
} else if (requirement === "always" && !hasBlank) {
|
|
234
|
-
|
|
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
|
-
});
|
|
321
|
+
reportMissingBlankLine(prevNode, node);
|
|
245
322
|
}
|
|
246
323
|
}
|
|
247
324
|
}
|
|
@@ -257,6 +334,7 @@ const rule$a = {
|
|
|
257
334
|
":statement": verify,
|
|
258
335
|
"BlockStatement": enterScope,
|
|
259
336
|
"BlockStatement:exit": exitScope,
|
|
337
|
+
"LineComment": verifyComment,
|
|
260
338
|
"Program": enterScope,
|
|
261
339
|
"Program:exit": exitScope,
|
|
262
340
|
"StaticBlock": enterScope,
|
|
@@ -995,7 +1073,7 @@ const index = {
|
|
|
995
1073
|
rules: {
|
|
996
1074
|
"ts-multiline-ternary": rule$c,
|
|
997
1075
|
"ts-multiline-union": rule$b,
|
|
998
|
-
"ts-padding-
|
|
1076
|
+
"ts-padding-statements": rule$a,
|
|
999
1077
|
"ts-sort-tests": rule$9,
|
|
1000
1078
|
"vue-i18n-consistent-locales": rule$8,
|
|
1001
1079
|
"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,23 +149,72 @@ 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
|
-
|
|
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;
|
|
178
|
+
}
|
|
179
|
+
if (node.type === distExports.AST_NODE_TYPES.ExpressionStatement) {
|
|
180
|
+
if (node.expression.type === distExports.AST_NODE_TYPES.AwaitExpression) {
|
|
181
|
+
return isSingleLine(node) ? "singleline-await" : "multiline-await";
|
|
182
|
+
}
|
|
183
|
+
if (isDirectivePrologue(node)) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
return isSingleLine(node) ? "singleline-expression" : "multiline-expression";
|
|
187
|
+
}
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
function hasEmptyLineBetween(prevNode, nextNode, sourceCode) {
|
|
191
|
+
for (let line = prevNode.loc.end.line + 1; line < nextNode.loc.start.line; line++) {
|
|
192
|
+
if (sourceCode.lines[line - 1]?.trim() === "") {
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
function hasLineCommentBetween(prevNode, nextNode, sourceCode) {
|
|
199
|
+
return sourceCode.getAllComments().some((comment) => {
|
|
200
|
+
if (comment.type !== "Line") {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
return comment.range[0] >= prevNode.range[1] && comment.range[1] <= nextNode.range[0];
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
function isDirectivePrologue(node) {
|
|
207
|
+
if (node.expression.type !== distExports.AST_NODE_TYPES.Literal) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
return typeof node.expression.value === "string";
|
|
166
211
|
}
|
|
167
|
-
function
|
|
168
|
-
|
|
212
|
+
function isOwnLineComment(comment, sourceCode) {
|
|
213
|
+
if (comment.type !== "Line") {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
const lineText = sourceCode.lines[comment.loc.start.line - 1] ?? "";
|
|
217
|
+
return lineText.trimStart().startsWith("//");
|
|
169
218
|
}
|
|
170
219
|
function isSingleLine(node) {
|
|
171
220
|
return node.loc.start.line === node.loc.end.line;
|
|
@@ -173,10 +222,11 @@ function isSingleLine(node) {
|
|
|
173
222
|
const rule$a = {
|
|
174
223
|
defaultOptions: [],
|
|
175
224
|
meta: {
|
|
176
|
-
docs: { description: "Require or disallow padding lines between
|
|
225
|
+
docs: { description: "Require or disallow padding lines between const, let, await, and expression statements" },
|
|
177
226
|
fixable: "whitespace",
|
|
178
227
|
messages: {
|
|
179
228
|
expectedBlankLine: "Expected blank line before this statement.",
|
|
229
|
+
expectedBlankLineBeforeComment: "Expected blank line before this comment.",
|
|
180
230
|
unexpectedBlankLine: "Unexpected blank line before this statement."
|
|
181
231
|
},
|
|
182
232
|
schema: [],
|
|
@@ -196,6 +246,57 @@ const rule$a = {
|
|
|
196
246
|
scopeInfo = scopeInfo.upper;
|
|
197
247
|
}
|
|
198
248
|
}
|
|
249
|
+
function reportMissingBlankLine(prevNode, node) {
|
|
250
|
+
context.report({
|
|
251
|
+
fix(fixer) {
|
|
252
|
+
const lastToken = getActualLastToken(prevNode, sourceCode);
|
|
253
|
+
if (!lastToken) {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
return fixer.insertTextAfter(lastToken, "\n");
|
|
257
|
+
},
|
|
258
|
+
messageId: "expectedBlankLine",
|
|
259
|
+
node
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
function reportUnexpectedBlankLine(prevNode, node) {
|
|
263
|
+
context.report({
|
|
264
|
+
fix(fixer) {
|
|
265
|
+
const lastToken = getActualLastToken(prevNode, sourceCode);
|
|
266
|
+
const firstToken = sourceCode.getFirstToken(node);
|
|
267
|
+
if (!lastToken || !firstToken) {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
const start = lastToken.range[1];
|
|
271
|
+
const end = firstToken.range[0];
|
|
272
|
+
const text = collapseBlankLine(sourceCode.text.slice(start, end));
|
|
273
|
+
return fixer.replaceTextRange([start, end], text);
|
|
274
|
+
},
|
|
275
|
+
messageId: "unexpectedBlankLine",
|
|
276
|
+
node
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
function verifyComment(comment) {
|
|
280
|
+
if (!isOwnLineComment(comment, sourceCode)) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
const commentLine = comment.loc.start.line;
|
|
284
|
+
if (commentLine <= 1) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
const previousLine = sourceCode.lines[commentLine - 2] ?? "";
|
|
288
|
+
if (previousLine.trim() === "" || previousLine.trimEnd().endsWith("{")) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
context.report({
|
|
292
|
+
fix(fixer) {
|
|
293
|
+
return fixer.insertTextBefore(comment, "\n");
|
|
294
|
+
},
|
|
295
|
+
loc: comment.loc,
|
|
296
|
+
messageId: "expectedBlankLineBeforeComment",
|
|
297
|
+
node: comment
|
|
298
|
+
});
|
|
299
|
+
}
|
|
199
300
|
function verify(node) {
|
|
200
301
|
const parentType = node.parent?.type;
|
|
201
302
|
const allowedParents = /* @__PURE__ */ new Set([
|
|
@@ -209,37 +310,13 @@ const rule$a = {
|
|
|
209
310
|
}
|
|
210
311
|
const prevNode = scopeInfo?.prevNode;
|
|
211
312
|
if (prevNode) {
|
|
212
|
-
const requirement = getBlankLineRequirement(prevNode, node);
|
|
313
|
+
const requirement = getBlankLineRequirement(prevNode, node, sourceCode);
|
|
213
314
|
if (requirement) {
|
|
214
|
-
const hasBlank =
|
|
315
|
+
const hasBlank = hasEmptyLineBetween(prevNode, node, sourceCode);
|
|
215
316
|
if (requirement === "never" && hasBlank) {
|
|
216
|
-
|
|
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
|
-
});
|
|
317
|
+
reportUnexpectedBlankLine(prevNode, node);
|
|
231
318
|
} else if (requirement === "always" && !hasBlank) {
|
|
232
|
-
|
|
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
|
-
});
|
|
319
|
+
reportMissingBlankLine(prevNode, node);
|
|
243
320
|
}
|
|
244
321
|
}
|
|
245
322
|
}
|
|
@@ -255,6 +332,7 @@ const rule$a = {
|
|
|
255
332
|
":statement": verify,
|
|
256
333
|
"BlockStatement": enterScope,
|
|
257
334
|
"BlockStatement:exit": exitScope,
|
|
335
|
+
"LineComment": verifyComment,
|
|
258
336
|
"Program": enterScope,
|
|
259
337
|
"Program:exit": exitScope,
|
|
260
338
|
"StaticBlock": enterScope,
|
|
@@ -993,7 +1071,7 @@ const index = {
|
|
|
993
1071
|
rules: {
|
|
994
1072
|
"ts-multiline-ternary": rule$c,
|
|
995
1073
|
"ts-multiline-union": rule$b,
|
|
996
|
-
"ts-padding-
|
|
1074
|
+
"ts-padding-statements": rule$a,
|
|
997
1075
|
"ts-sort-tests": rule$9,
|
|
998
1076
|
"vue-i18n-consistent-locales": rule$8,
|
|
999
1077
|
"vue-i18n-consistent-t": rule$7,
|