@saasmakers/eslint 1.0.5 → 1.0.6

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.
@@ -10866,11 +10866,77 @@ const eslint_config = antfu__default(
10866
10866
  // SaaS Makers
10867
10867
  {
10868
10868
  plugins: { saasmakers: saasmakers__default },
10869
- rules: { "saasmakers/ts-sort-tests": "error" }
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: {
@@ -146,11 +146,77 @@ var eslint_config = antfu(
146
146
  // SaaS Makers
147
147
  {
148
148
  plugins: { saasmakers },
149
- rules: { "saasmakers/ts-sort-tests": "error" }
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: {
@@ -146,11 +146,77 @@ var eslint_config = antfu(
146
146
  // SaaS Makers
147
147
  {
148
148
  plugins: { saasmakers },
149
- rules: { "saasmakers/ts-sort-tests": "error" }
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: {
@@ -146,11 +146,77 @@ var eslint_config = antfu(
146
146
  // SaaS Makers
147
147
  {
148
148
  plugins: { saasmakers },
149
- rules: { "saasmakers/ts-sort-tests": "error" }
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: {
@@ -10840,11 +10840,77 @@ const eslint_config = antfu(
10840
10840
  // SaaS Makers
10841
10841
  {
10842
10842
  plugins: { saasmakers },
10843
- rules: { "saasmakers/ts-sort-tests": "error" }
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$b = {
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$a = {
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,166 @@ 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 getPaddingLineSequences(prevNode, nextNode, sourceCode) {
167
+ const pairs = [];
168
+ const prevToken = getActualLastToken(prevNode, sourceCode);
169
+ if (!prevToken) {
170
+ return pairs;
171
+ }
172
+ if (nextNode.loc.start.line - prevToken.loc.end.line >= 2) {
173
+ let currentToken = prevToken;
174
+ while (currentToken.range[0] < nextNode.range[0]) {
175
+ const token = sourceCode.getTokenAfter(currentToken, { includeComments: true });
176
+ if (!token || token.range[0] >= nextNode.range[0]) {
177
+ break;
178
+ }
179
+ if (token.loc.start.line - currentToken.loc.end.line >= 2) {
180
+ pairs.push([currentToken, token]);
181
+ }
182
+ currentToken = token;
183
+ }
184
+ }
185
+ return pairs;
186
+ }
187
+ function isAwaitStatement(node) {
188
+ return node.type === index$1.distExports.AST_NODE_TYPES.ExpressionStatement && node.expression.type === index$1.distExports.AST_NODE_TYPES.AwaitExpression;
189
+ }
190
+ function isSingleLine(node) {
191
+ return node.loc.start.line === node.loc.end.line;
192
+ }
193
+ const rule$a = {
194
+ defaultOptions: [],
195
+ meta: {
196
+ docs: { description: "Require or disallow padding lines between standalone await statements" },
197
+ fixable: "whitespace",
198
+ messages: {
199
+ expectedBlankLine: "Expected blank line before this statement.",
200
+ unexpectedBlankLine: "Unexpected blank line before this statement."
201
+ },
202
+ schema: [],
203
+ type: "layout"
204
+ },
205
+ create(context) {
206
+ const sourceCode = context.sourceCode;
207
+ let scopeInfo = null;
208
+ function enterScope() {
209
+ scopeInfo = {
210
+ prevNode: null,
211
+ upper: scopeInfo
212
+ };
213
+ }
214
+ function exitScope() {
215
+ if (scopeInfo) {
216
+ scopeInfo = scopeInfo.upper;
217
+ }
218
+ }
219
+ function verify(node) {
220
+ const parentType = node.parent?.type;
221
+ const allowedParents = /* @__PURE__ */ new Set([
222
+ index$1.distExports.AST_NODE_TYPES.BlockStatement,
223
+ index$1.distExports.AST_NODE_TYPES.Program,
224
+ index$1.distExports.AST_NODE_TYPES.StaticBlock,
225
+ index$1.distExports.AST_NODE_TYPES.SwitchCase
226
+ ]);
227
+ if (!parentType || !allowedParents.has(parentType)) {
228
+ return;
229
+ }
230
+ const prevNode = scopeInfo?.prevNode;
231
+ if (prevNode) {
232
+ const requirement = getBlankLineRequirement(prevNode, node);
233
+ if (requirement) {
234
+ const paddingLines = getPaddingLineSequences(prevNode, node, sourceCode);
235
+ if (requirement === "never" && paddingLines.length > 0) {
236
+ context.report({
237
+ fix(fixer) {
238
+ if (paddingLines.length >= 2) {
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
+ });
274
+ }
275
+ }
276
+ }
277
+ if (scopeInfo) {
278
+ scopeInfo.prevNode = node;
279
+ }
280
+ }
281
+ function verifyThenEnterScope(node) {
282
+ verify(node);
283
+ enterScope();
284
+ }
285
+ return {
286
+ ":statement": verify,
287
+ "BlockStatement": enterScope,
288
+ "BlockStatement:exit": exitScope,
289
+ "Program": enterScope,
290
+ "Program:exit": exitScope,
291
+ "StaticBlock": enterScope,
292
+ "StaticBlock:exit": exitScope,
293
+ "SwitchCase": verifyThenEnterScope,
294
+ "SwitchCase:exit": exitScope
295
+ };
296
+ }
297
+ };
298
+
139
299
  function compareTests(testA, testB) {
140
300
  const functionA = getFunctionName(testA);
141
301
  const functionB = getFunctionName(testB);
@@ -862,8 +1022,9 @@ const rule = {
862
1022
 
863
1023
  const index = {
864
1024
  rules: {
865
- "ts-multiline-ternary": rule$b,
866
- "ts-multiline-union": rule$a,
1025
+ "ts-multiline-ternary": rule$c,
1026
+ "ts-multiline-union": rule$b,
1027
+ "ts-padding-await-statements": rule$a,
867
1028
  "ts-sort-tests": rule$9,
868
1029
  "vue-i18n-consistent-locales": rule$8,
869
1030
  "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$b = {
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$a = {
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,166 @@ 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 getPaddingLineSequences(prevNode, nextNode, sourceCode) {
165
+ const pairs = [];
166
+ const prevToken = getActualLastToken(prevNode, sourceCode);
167
+ if (!prevToken) {
168
+ return pairs;
169
+ }
170
+ if (nextNode.loc.start.line - prevToken.loc.end.line >= 2) {
171
+ let currentToken = prevToken;
172
+ while (currentToken.range[0] < nextNode.range[0]) {
173
+ const token = sourceCode.getTokenAfter(currentToken, { includeComments: true });
174
+ if (!token || token.range[0] >= nextNode.range[0]) {
175
+ break;
176
+ }
177
+ if (token.loc.start.line - currentToken.loc.end.line >= 2) {
178
+ pairs.push([currentToken, token]);
179
+ }
180
+ currentToken = token;
181
+ }
182
+ }
183
+ return pairs;
184
+ }
185
+ function isAwaitStatement(node) {
186
+ return node.type === distExports.AST_NODE_TYPES.ExpressionStatement && node.expression.type === distExports.AST_NODE_TYPES.AwaitExpression;
187
+ }
188
+ function isSingleLine(node) {
189
+ return node.loc.start.line === node.loc.end.line;
190
+ }
191
+ const rule$a = {
192
+ defaultOptions: [],
193
+ meta: {
194
+ docs: { description: "Require or disallow padding lines between standalone await statements" },
195
+ fixable: "whitespace",
196
+ messages: {
197
+ expectedBlankLine: "Expected blank line before this statement.",
198
+ unexpectedBlankLine: "Unexpected blank line before this statement."
199
+ },
200
+ schema: [],
201
+ type: "layout"
202
+ },
203
+ create(context) {
204
+ const sourceCode = context.sourceCode;
205
+ let scopeInfo = null;
206
+ function enterScope() {
207
+ scopeInfo = {
208
+ prevNode: null,
209
+ upper: scopeInfo
210
+ };
211
+ }
212
+ function exitScope() {
213
+ if (scopeInfo) {
214
+ scopeInfo = scopeInfo.upper;
215
+ }
216
+ }
217
+ function verify(node) {
218
+ const parentType = node.parent?.type;
219
+ const allowedParents = /* @__PURE__ */ new Set([
220
+ distExports.AST_NODE_TYPES.BlockStatement,
221
+ distExports.AST_NODE_TYPES.Program,
222
+ distExports.AST_NODE_TYPES.StaticBlock,
223
+ distExports.AST_NODE_TYPES.SwitchCase
224
+ ]);
225
+ if (!parentType || !allowedParents.has(parentType)) {
226
+ return;
227
+ }
228
+ const prevNode = scopeInfo?.prevNode;
229
+ if (prevNode) {
230
+ const requirement = getBlankLineRequirement(prevNode, node);
231
+ if (requirement) {
232
+ const paddingLines = getPaddingLineSequences(prevNode, node, sourceCode);
233
+ if (requirement === "never" && paddingLines.length > 0) {
234
+ context.report({
235
+ fix(fixer) {
236
+ if (paddingLines.length >= 2) {
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
+ });
272
+ }
273
+ }
274
+ }
275
+ if (scopeInfo) {
276
+ scopeInfo.prevNode = node;
277
+ }
278
+ }
279
+ function verifyThenEnterScope(node) {
280
+ verify(node);
281
+ enterScope();
282
+ }
283
+ return {
284
+ ":statement": verify,
285
+ "BlockStatement": enterScope,
286
+ "BlockStatement:exit": exitScope,
287
+ "Program": enterScope,
288
+ "Program:exit": exitScope,
289
+ "StaticBlock": enterScope,
290
+ "StaticBlock:exit": exitScope,
291
+ "SwitchCase": verifyThenEnterScope,
292
+ "SwitchCase:exit": exitScope
293
+ };
294
+ }
295
+ };
296
+
137
297
  function compareTests(testA, testB) {
138
298
  const functionA = getFunctionName(testA);
139
299
  const functionB = getFunctionName(testB);
@@ -860,8 +1020,9 @@ const rule = {
860
1020
 
861
1021
  const index = {
862
1022
  rules: {
863
- "ts-multiline-ternary": rule$b,
864
- "ts-multiline-union": rule$a,
1023
+ "ts-multiline-ternary": rule$c,
1024
+ "ts-multiline-union": rule$b,
1025
+ "ts-padding-await-statements": rule$a,
865
1026
  "ts-sort-tests": rule$9,
866
1027
  "vue-i18n-consistent-locales": rule$8,
867
1028
  "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.5",
3
+ "version": "1.0.6",
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.17",
33
+ "eslint-plugin-turbo": "2.9.18",
34
34
  "eslint-plugin-zod": "3.4.0",
35
35
  "typescript-eslint": "8.61.0"
36
36
  },