@saasmakers/eslint 1.0.7 → 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.
@@ -10867,76 +10867,13 @@ const eslint_config = antfu__default(
10867
10867
  {
10868
10868
  plugins: { saasmakers: saasmakers__default },
10869
10869
  rules: {
10870
- "saasmakers/ts-padding-await-statements": "error",
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: {
@@ -147,76 +147,13 @@ var eslint_config = antfu(
147
147
  {
148
148
  plugins: { saasmakers },
149
149
  rules: {
150
- "saasmakers/ts-padding-await-statements": "error",
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: {
@@ -147,76 +147,13 @@ var eslint_config = antfu(
147
147
  {
148
148
  plugins: { saasmakers },
149
149
  rules: {
150
- "saasmakers/ts-padding-await-statements": "error",
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: {
@@ -147,76 +147,13 @@ var eslint_config = antfu(
147
147
  {
148
148
  plugins: { saasmakers },
149
149
  rules: {
150
- "saasmakers/ts-padding-await-statements": "error",
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: {
@@ -10841,76 +10841,13 @@ const eslint_config = antfu(
10841
10841
  {
10842
10842
  plugins: { saasmakers },
10843
10843
  rules: {
10844
- "saasmakers/ts-padding-await-statements": "error",
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,60 @@ function getActualLastToken(node, sourceCode) {
151
151
  }
152
152
  return semiToken;
153
153
  }
154
- function getBlankLineRequirement(prevNode, nextNode) {
155
- if (!isAwaitStatement(prevNode)) {
154
+ function getBlankLineRequirement(prevNode, nextNode, sourceCode) {
155
+ const prevKind = getStatementKind(prevNode);
156
+ if (!prevKind) {
156
157
  return null;
157
158
  }
158
- if (!isAwaitStatement(nextNode)) {
159
+ if (hasLineCommentBetween(prevNode, nextNode, sourceCode)) {
159
160
  return "always";
160
161
  }
161
- if (isSingleLine(prevNode) && isSingleLine(nextNode)) {
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 hasBlankLineBetween(prevNode, nextNode) {
167
- return nextNode.loc.start.line - prevNode.loc.end.line > 1;
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 && 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;
190
+ }
191
+ }
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
+ });
168
201
  }
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;
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("//");
171
208
  }
172
209
  function isSingleLine(node) {
173
210
  return node.loc.start.line === node.loc.end.line;
@@ -175,10 +212,11 @@ function isSingleLine(node) {
175
212
  const rule$a = {
176
213
  defaultOptions: [],
177
214
  meta: {
178
- 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" },
179
216
  fixable: "whitespace",
180
217
  messages: {
181
218
  expectedBlankLine: "Expected blank line before this statement.",
219
+ expectedBlankLineBeforeComment: "Expected blank line before this comment.",
182
220
  unexpectedBlankLine: "Unexpected blank line before this statement."
183
221
  },
184
222
  schema: [],
@@ -198,6 +236,57 @@ const rule$a = {
198
236
  scopeInfo = scopeInfo.upper;
199
237
  }
200
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
+ }
201
290
  function verify(node) {
202
291
  const parentType = node.parent?.type;
203
292
  const allowedParents = /* @__PURE__ */ new Set([
@@ -211,37 +300,13 @@ const rule$a = {
211
300
  }
212
301
  const prevNode = scopeInfo?.prevNode;
213
302
  if (prevNode) {
214
- const requirement = getBlankLineRequirement(prevNode, node);
303
+ const requirement = getBlankLineRequirement(prevNode, node, sourceCode);
215
304
  if (requirement) {
216
- const hasBlank = hasBlankLineBetween(prevNode, node);
305
+ const hasBlank = hasEmptyLineBetween(prevNode, node, sourceCode);
217
306
  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
- });
307
+ reportUnexpectedBlankLine(prevNode, node);
233
308
  } 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
- });
309
+ reportMissingBlankLine(prevNode, node);
245
310
  }
246
311
  }
247
312
  }
@@ -257,6 +322,7 @@ const rule$a = {
257
322
  ":statement": verify,
258
323
  "BlockStatement": enterScope,
259
324
  "BlockStatement:exit": exitScope,
325
+ "LineComment": verifyComment,
260
326
  "Program": enterScope,
261
327
  "Program:exit": exitScope,
262
328
  "StaticBlock": enterScope,
@@ -995,7 +1061,7 @@ const index = {
995
1061
  rules: {
996
1062
  "ts-multiline-ternary": rule$c,
997
1063
  "ts-multiline-union": rule$b,
998
- "ts-padding-await-statements": rule$a,
1064
+ "ts-padding-statements": rule$a,
999
1065
  "ts-sort-tests": rule$9,
1000
1066
  "vue-i18n-consistent-locales": rule$8,
1001
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-await-statements': RuleModule<"expectedBlankLine" | "unexpectedBlankLine", [], unknown, RuleListener>;
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-await-statements': RuleModule<"expectedBlankLine" | "unexpectedBlankLine", [], unknown, RuleListener>;
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-await-statements': RuleModule<"expectedBlankLine" | "unexpectedBlankLine", [], unknown, RuleListener>;
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,60 @@ function getActualLastToken(node, sourceCode) {
149
149
  }
150
150
  return semiToken;
151
151
  }
152
- function getBlankLineRequirement(prevNode, nextNode) {
153
- if (!isAwaitStatement(prevNode)) {
152
+ function getBlankLineRequirement(prevNode, nextNode, sourceCode) {
153
+ const prevKind = getStatementKind(prevNode);
154
+ if (!prevKind) {
154
155
  return null;
155
156
  }
156
- if (!isAwaitStatement(nextNode)) {
157
+ if (hasLineCommentBetween(prevNode, nextNode, sourceCode)) {
157
158
  return "always";
158
159
  }
159
- if (isSingleLine(prevNode) && isSingleLine(nextNode)) {
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 hasBlankLineBetween(prevNode, nextNode) {
165
- return nextNode.loc.start.line - prevNode.loc.end.line > 1;
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 && 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;
188
+ }
189
+ }
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
+ });
166
199
  }
167
- function isAwaitStatement(node) {
168
- return node.type === distExports.AST_NODE_TYPES.ExpressionStatement && node.expression.type === distExports.AST_NODE_TYPES.AwaitExpression;
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("//");
169
206
  }
170
207
  function isSingleLine(node) {
171
208
  return node.loc.start.line === node.loc.end.line;
@@ -173,10 +210,11 @@ function isSingleLine(node) {
173
210
  const rule$a = {
174
211
  defaultOptions: [],
175
212
  meta: {
176
- 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" },
177
214
  fixable: "whitespace",
178
215
  messages: {
179
216
  expectedBlankLine: "Expected blank line before this statement.",
217
+ expectedBlankLineBeforeComment: "Expected blank line before this comment.",
180
218
  unexpectedBlankLine: "Unexpected blank line before this statement."
181
219
  },
182
220
  schema: [],
@@ -196,6 +234,57 @@ const rule$a = {
196
234
  scopeInfo = scopeInfo.upper;
197
235
  }
198
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
+ }
199
288
  function verify(node) {
200
289
  const parentType = node.parent?.type;
201
290
  const allowedParents = /* @__PURE__ */ new Set([
@@ -209,37 +298,13 @@ const rule$a = {
209
298
  }
210
299
  const prevNode = scopeInfo?.prevNode;
211
300
  if (prevNode) {
212
- const requirement = getBlankLineRequirement(prevNode, node);
301
+ const requirement = getBlankLineRequirement(prevNode, node, sourceCode);
213
302
  if (requirement) {
214
- const hasBlank = hasBlankLineBetween(prevNode, node);
303
+ const hasBlank = hasEmptyLineBetween(prevNode, node, sourceCode);
215
304
  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
- });
305
+ reportUnexpectedBlankLine(prevNode, node);
231
306
  } 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
- });
307
+ reportMissingBlankLine(prevNode, node);
243
308
  }
244
309
  }
245
310
  }
@@ -255,6 +320,7 @@ const rule$a = {
255
320
  ":statement": verify,
256
321
  "BlockStatement": enterScope,
257
322
  "BlockStatement:exit": exitScope,
323
+ "LineComment": verifyComment,
258
324
  "Program": enterScope,
259
325
  "Program:exit": exitScope,
260
326
  "StaticBlock": enterScope,
@@ -993,7 +1059,7 @@ const index = {
993
1059
  rules: {
994
1060
  "ts-multiline-ternary": rule$c,
995
1061
  "ts-multiline-union": rule$b,
996
- "ts-padding-await-statements": rule$a,
1062
+ "ts-padding-statements": rule$a,
997
1063
  "ts-sort-tests": rule$9,
998
1064
  "vue-i18n-consistent-locales": rule$8,
999
1065
  "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.7",
3
+ "version": "1.0.8",
4
4
  "private": false,
5
5
  "description": "Shared ESLint config and rules for SaaS Makers projects",
6
6
  "license": "MIT",