eslint-plugin-nextfriday 0.1.0 → 1.0.1

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/CHANGELOG.md ADDED
@@ -0,0 +1,13 @@
1
+ # eslint-plugin-nextfriday
2
+
3
+ ## 1.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#6](https://github.com/next-friday/eslint-plugin-nextfriday/pull/6) [`db5e411`](https://github.com/next-friday/eslint-plugin-nextfriday/commit/db5e411e110bcdb626ae3176644e4093b120e800) Thanks [@nextfridaydeveloper](https://github.com/nextfridaydeveloper)! - Restructured the ESLint plugin by consolidating all exports into a single `index.ts` file and removing deprecated separate configuration and rule files. This simplifies the plugin architecture and improves maintainability.
8
+
9
+ ## 1.0.0
10
+
11
+ ### Major Changes
12
+
13
+ - [#3](https://github.com/next-friday/eslint-plugin-nextfriday/pull/3) [`3263f66`](https://github.com/next-friday/eslint-plugin-nextfriday/commit/3263f663678b194263c258275c83a866ddd666a8) Thanks [@nextfridaydeveloper](https://github.com/nextfridaydeveloper)! - Initial Release
package/lib/index.cjs CHANGED
@@ -30,16 +30,17 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
- configs: () => configs_default,
34
- meta: () => meta_default,
35
- rules: () => rules_default
33
+ configs: () => configs,
34
+ default: () => index_default,
35
+ meta: () => meta,
36
+ rules: () => rules
36
37
  });
37
38
  module.exports = __toCommonJS(index_exports);
38
39
 
39
40
  // package.json
40
41
  var package_default = {
41
42
  name: "eslint-plugin-nextfriday",
42
- version: "0.1.0",
43
+ version: "1.0.1",
43
44
  description: "A comprehensive ESLint plugin providing custom rules and configurations for Next Friday development workflows.",
44
45
  keywords: [
45
46
  "eslint",
@@ -154,56 +155,10 @@ var package_default = {
154
155
  }
155
156
  };
156
157
 
157
- // src/meta.ts
158
- var meta = {
159
- name: package_default.name,
160
- version: package_default.version
161
- };
162
- var meta_default = meta;
163
-
164
- // src/rules/no-emoji.ts
165
- var import_emoji_regex = __toESM(require("emoji-regex"), 1);
166
- var import_utils = require("@typescript-eslint/utils");
167
- var createRule = import_utils.ESLintUtils.RuleCreator(
168
- (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`
169
- );
170
- var noEmoji = createRule({
171
- name: "no-emoji",
172
- meta: {
173
- type: "problem",
174
- docs: {
175
- description: "Disallow emoji characters in source code"
176
- },
177
- messages: {
178
- noEmoji: "Emoji are not allowed in source code"
179
- },
180
- schema: []
181
- },
182
- defaultOptions: [],
183
- create(context) {
184
- const { sourceCode } = context;
185
- return {
186
- Program() {
187
- const text = sourceCode.getText();
188
- const regex = (0, import_emoji_regex.default)();
189
- const matches = Array.from(text.matchAll(regex));
190
- matches.forEach((match) => {
191
- const loc = sourceCode.getLocFromIndex(match.index);
192
- context.report({
193
- loc,
194
- messageId: "noEmoji"
195
- });
196
- });
197
- }
198
- };
199
- }
200
- });
201
- var no_emoji_default = noEmoji;
202
-
203
158
  // src/rules/file-kebab-case.ts
204
159
  var import_path = __toESM(require("path"), 1);
205
- var import_utils2 = require("@typescript-eslint/utils");
206
- var createRule2 = import_utils2.ESLintUtils.RuleCreator(
160
+ var import_utils = require("@typescript-eslint/utils");
161
+ var createRule = import_utils.ESLintUtils.RuleCreator(
207
162
  (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`
208
163
  );
209
164
  var isKebabCase = (str) => {
@@ -212,7 +167,7 @@ var isKebabCase = (str) => {
212
167
  }
213
168
  return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(str);
214
169
  };
215
- var fileKebabCase = createRule2({
170
+ var fileKebabCase = createRule({
216
171
  name: "file-kebab-case",
217
172
  meta: {
218
173
  type: "problem",
@@ -248,12 +203,12 @@ var file_kebab_case_default = fileKebabCase;
248
203
 
249
204
  // src/rules/jsx-pascal-case.ts
250
205
  var import_path2 = __toESM(require("path"), 1);
251
- var import_utils3 = require("@typescript-eslint/utils");
252
- var createRule3 = import_utils3.ESLintUtils.RuleCreator(
206
+ var import_utils2 = require("@typescript-eslint/utils");
207
+ var createRule2 = import_utils2.ESLintUtils.RuleCreator(
253
208
  (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`
254
209
  );
255
210
  var isPascalCase = (str) => /^[A-Z][a-zA-Z0-9]*$/.test(str) && !/^[A-Z]+$/.test(str);
256
- var jsxPascalCase = createRule3({
211
+ var jsxPascalCase = createRule2({
257
212
  name: "jsx-pascal-case",
258
213
  meta: {
259
214
  type: "problem",
@@ -287,47 +242,90 @@ var jsxPascalCase = createRule3({
287
242
  });
288
243
  var jsx_pascal_case_default = jsxPascalCase;
289
244
 
290
- // src/rules/prefer-destructuring-params.ts
245
+ // src/rules/md-filename-case-restriction.ts
246
+ var import_path3 = __toESM(require("path"), 1);
247
+ var import_utils3 = require("@typescript-eslint/utils");
248
+ var createRule3 = import_utils3.ESLintUtils.RuleCreator(
249
+ (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`
250
+ );
251
+ var mdFilenameCaseRestriction = createRule3({
252
+ name: "md-filename-case-restriction",
253
+ meta: {
254
+ type: "problem",
255
+ docs: {
256
+ description: "Enforce .md filenames to be SNAKE_CASE only"
257
+ },
258
+ messages: {
259
+ invalidFilenameCase: "Markdown filename must be SNAKE_CASE (UPPERCASE with underscores). Found: '{{ filename }}'"
260
+ },
261
+ schema: []
262
+ },
263
+ defaultOptions: [],
264
+ create(context) {
265
+ return {
266
+ Program() {
267
+ const { filename } = context;
268
+ if (!filename.endsWith(".md")) {
269
+ return;
270
+ }
271
+ const basename = import_path3.default.basename(filename, ".md");
272
+ function isSnakeCase(text) {
273
+ return /^[A-Z][A-Z0-9_]*$/.test(text);
274
+ }
275
+ function isValidCase(text) {
276
+ return isSnakeCase(text);
277
+ }
278
+ if (!isValidCase(basename)) {
279
+ context.report({
280
+ node: context.sourceCode.ast,
281
+ messageId: "invalidFilenameCase",
282
+ data: { filename: basename }
283
+ });
284
+ }
285
+ }
286
+ };
287
+ }
288
+ });
289
+ var md_filename_case_restriction_default = mdFilenameCaseRestriction;
290
+
291
+ // src/rules/no-emoji.ts
292
+ var import_emoji_regex = __toESM(require("emoji-regex"), 1);
291
293
  var import_utils4 = require("@typescript-eslint/utils");
292
294
  var createRule4 = import_utils4.ESLintUtils.RuleCreator(
293
295
  (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`
294
296
  );
295
- var preferDestructuringParams = createRule4({
296
- name: "prefer-destructuring-params",
297
+ var noEmoji = createRule4({
298
+ name: "no-emoji",
297
299
  meta: {
298
- type: "suggestion",
300
+ type: "problem",
299
301
  docs: {
300
- description: "Enforce destructuring for functions with multiple parameters"
302
+ description: "Disallow emoji characters in source code"
301
303
  },
302
304
  messages: {
303
- preferDestructuring: "Functions with multiple parameters should use destructuring"
305
+ noEmoji: "Emoji are not allowed in source code"
304
306
  },
305
307
  schema: []
306
308
  },
307
309
  defaultOptions: [],
308
310
  create(context) {
309
- const checkFunction = (node) => {
310
- if (node.params.length <= 1) {
311
- return;
312
- }
313
- const hasNonDestructuredParams = node.params.some(
314
- (param) => param.type !== import_utils4.AST_NODE_TYPES.ObjectPattern && param.type !== import_utils4.AST_NODE_TYPES.RestElement
315
- );
316
- if (hasNonDestructuredParams) {
317
- context.report({
318
- node,
319
- messageId: "preferDestructuring"
311
+ const { sourceCode } = context;
312
+ return {
313
+ Program() {
314
+ const text = sourceCode.getText();
315
+ const regex = (0, import_emoji_regex.default)();
316
+ const matches = Array.from(text.matchAll(regex));
317
+ matches.forEach((match) => {
318
+ const loc = sourceCode.getLocFromIndex(match.index);
319
+ context.report({
320
+ loc,
321
+ messageId: "noEmoji"
322
+ });
320
323
  });
321
324
  }
322
325
  };
323
- return {
324
- FunctionDeclaration: checkFunction,
325
- FunctionExpression: checkFunction,
326
- ArrowFunctionExpression: checkFunction
327
- };
328
326
  }
329
327
  });
330
- var prefer_destructuring_params_default = preferDestructuringParams;
328
+ var no_emoji_default = noEmoji;
331
329
 
332
330
  // src/rules/no-explicit-return-type.ts
333
331
  var import_utils5 = require("@typescript-eslint/utils");
@@ -373,12 +371,54 @@ var noExplicitReturnType = createRule5({
373
371
  });
374
372
  var no_explicit_return_type_default = noExplicitReturnType;
375
373
 
376
- // src/rules/prefer-import-type.ts
374
+ // src/rules/prefer-destructuring-params.ts
377
375
  var import_utils6 = require("@typescript-eslint/utils");
378
376
  var createRule6 = import_utils6.ESLintUtils.RuleCreator(
379
377
  (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`
380
378
  );
381
- var preferImportType = createRule6({
379
+ var preferDestructuringParams = createRule6({
380
+ name: "prefer-destructuring-params",
381
+ meta: {
382
+ type: "suggestion",
383
+ docs: {
384
+ description: "Enforce destructuring for functions with multiple parameters"
385
+ },
386
+ messages: {
387
+ preferDestructuring: "Functions with multiple parameters should use destructuring"
388
+ },
389
+ schema: []
390
+ },
391
+ defaultOptions: [],
392
+ create(context) {
393
+ const checkFunction = (node) => {
394
+ if (node.params.length <= 1) {
395
+ return;
396
+ }
397
+ const hasNonDestructuredParams = node.params.some(
398
+ (param) => param.type !== import_utils6.AST_NODE_TYPES.ObjectPattern && param.type !== import_utils6.AST_NODE_TYPES.RestElement
399
+ );
400
+ if (hasNonDestructuredParams) {
401
+ context.report({
402
+ node,
403
+ messageId: "preferDestructuring"
404
+ });
405
+ }
406
+ };
407
+ return {
408
+ FunctionDeclaration: checkFunction,
409
+ FunctionExpression: checkFunction,
410
+ ArrowFunctionExpression: checkFunction
411
+ };
412
+ }
413
+ });
414
+ var prefer_destructuring_params_default = preferDestructuringParams;
415
+
416
+ // src/rules/prefer-import-type.ts
417
+ var import_utils7 = require("@typescript-eslint/utils");
418
+ var createRule7 = import_utils7.ESLintUtils.RuleCreator(
419
+ (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`
420
+ );
421
+ var preferImportType = createRule7({
382
422
  name: "prefer-import-type",
383
423
  meta: {
384
424
  type: "suggestion",
@@ -401,15 +441,16 @@ var preferImportType = createRule6({
401
441
  return;
402
442
  }
403
443
  const isTypeOnlyImport = node.specifiers.every((specifier) => {
404
- if (specifier.type === import_utils6.AST_NODE_TYPES.ImportDefaultSpecifier) {
444
+ if (specifier.type === import_utils7.AST_NODE_TYPES.ImportDefaultSpecifier) {
405
445
  return false;
406
446
  }
407
- if (specifier.type === import_utils6.AST_NODE_TYPES.ImportNamespaceSpecifier) {
447
+ if (specifier.type === import_utils7.AST_NODE_TYPES.ImportNamespaceSpecifier) {
408
448
  return false;
409
449
  }
410
- if (specifier.type === import_utils6.AST_NODE_TYPES.ImportSpecifier) {
411
- const importedName = specifier.imported.type === import_utils6.AST_NODE_TYPES.Identifier ? specifier.imported.name : specifier.imported.value;
412
- return importedName[0] === importedName[0].toUpperCase() && !["ESLintUtils", "RuleTester"].includes(importedName);
450
+ if (specifier.type === import_utils7.AST_NODE_TYPES.ImportSpecifier) {
451
+ const importedName = specifier.imported.type === import_utils7.AST_NODE_TYPES.Identifier ? specifier.imported.name : specifier.imported.value;
452
+ const isKnownTypeOnly = node.source.value === "@typescript-eslint/utils" && ["TSESTree", "RuleContext"].includes(importedName) || node.source.value === "react" && ["Component", "ComponentProps", "ReactNode", "FC", "JSX"].includes(importedName) || importedName.endsWith("Type") || importedName.endsWith("Interface") || importedName.endsWith("Props");
453
+ return isKnownTypeOnly;
413
454
  }
414
455
  return false;
415
456
  });
@@ -432,53 +473,11 @@ var preferImportType = createRule6({
432
473
  });
433
474
  var prefer_import_type_default = preferImportType;
434
475
 
435
- // src/rules/md-filename-case-restriction.ts
436
- var import_path3 = __toESM(require("path"), 1);
437
- var import_utils7 = require("@typescript-eslint/utils");
438
- var createRule7 = import_utils7.ESLintUtils.RuleCreator(
439
- (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`
440
- );
441
- var mdFilenameCaseRestriction = createRule7({
442
- name: "md-filename-case-restriction",
443
- meta: {
444
- type: "problem",
445
- docs: {
446
- description: "Enforce .md filenames to be SNAKE_CASE only"
447
- },
448
- messages: {
449
- invalidFilenameCase: "Markdown filename must be SNAKE_CASE (UPPERCASE with underscores). Found: '{{ filename }}'"
450
- },
451
- schema: []
452
- },
453
- defaultOptions: [],
454
- create(context) {
455
- return {
456
- Program() {
457
- const { filename } = context;
458
- if (!filename.endsWith(".md")) {
459
- return;
460
- }
461
- const basename = import_path3.default.basename(filename, ".md");
462
- function isSnakeCase(text) {
463
- return /^[A-Z][A-Z0-9_]*$/.test(text);
464
- }
465
- function isValidCase(text) {
466
- return isSnakeCase(text);
467
- }
468
- if (!isValidCase(basename)) {
469
- context.report({
470
- node: context.sourceCode.ast,
471
- messageId: "invalidFilenameCase",
472
- data: { filename: basename }
473
- });
474
- }
475
- }
476
- };
477
- }
478
- });
479
- var md_filename_case_restriction_default = mdFilenameCaseRestriction;
480
-
481
- // src/rules.ts
476
+ // src/index.ts
477
+ var meta = {
478
+ name: package_default.name,
479
+ version: package_default.version
480
+ };
482
481
  var rules = {
483
482
  "file-kebab-case": file_kebab_case_default,
484
483
  "jsx-pascal-case": jsx_pascal_case_default,
@@ -488,10 +487,10 @@ var rules = {
488
487
  "prefer-destructuring-params": prefer_destructuring_params_default,
489
488
  "prefer-import-type": prefer_import_type_default
490
489
  };
491
- var rules_default = rules;
492
-
493
- // src/configs.ts
494
- var plugin = { rules: rules_default };
490
+ var plugin = {
491
+ meta,
492
+ rules
493
+ };
495
494
  var baseRules = {
496
495
  "nextfriday/no-emoji": "warn",
497
496
  "nextfriday/file-kebab-case": "warn",
@@ -540,7 +539,12 @@ var configs = {
540
539
  ...jsxRecommendedRules
541
540
  })
542
541
  };
543
- var configs_default = configs;
542
+ var nextfridayPlugin = {
543
+ meta,
544
+ configs,
545
+ rules
546
+ };
547
+ var index_default = nextfridayPlugin;
544
548
  // Annotate the CommonJS export names for ESM import in node:
545
549
  0 && (module.exports = {
546
550
  configs,
package/lib/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../package.json","../src/meta.ts","../src/rules/no-emoji.ts","../src/rules/file-kebab-case.ts","../src/rules/jsx-pascal-case.ts","../src/rules/prefer-destructuring-params.ts","../src/rules/no-explicit-return-type.ts","../src/rules/prefer-import-type.ts","../src/rules/md-filename-case-restriction.ts","../src/rules.ts","../src/configs.ts"],"sourcesContent":["export { default as meta } from \"./meta\";\nexport { default as configs } from \"./configs\";\nexport { default as rules } from \"./rules\";\n","{\n \"name\": \"eslint-plugin-nextfriday\",\n \"version\": \"0.1.0\",\n \"description\": \"A comprehensive ESLint plugin providing custom rules and configurations for Next Friday development workflows.\",\n \"keywords\": [\n \"eslint\",\n \"eslintplugin\",\n \"eslint-plugin\",\n \"nextfriday\",\n \"next-friday\",\n \"linting\",\n \"code-quality\",\n \"javascript\",\n \"typescript\",\n \"development-tools\"\n ],\n \"homepage\": \"https://github.com/next-friday/eslint-plugin-nextfriday\",\n \"bugs\": {\n \"url\": \"https://github.com/next-friday/eslint-plugin-nextfriday/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/next-friday/eslint-plugin-nextfriday.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"Next Friday <nextfriday.developer@gmail.com>\",\n \"contributors\": [\n \"@joetakara\"\n ],\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./lib/index.d.ts\",\n \"import\": \"./lib/index.js\",\n \"require\": \"./lib/index.cjs\"\n }\n },\n \"main\": \"lib/index.js\",\n \"types\": \"lib/index.d.ts\",\n \"files\": [\n \"LICENSE\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"docs\",\n \"lib\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"changeset\": \"changeset\",\n \"changeset:publish\": \"npm publish --provenance --access public\",\n \"changeset:version\": \"changeset version\",\n \"clear\": \"rm -rf lib node_modules/.cache .eslintcache\",\n \"eslint\": \"eslint src --ext .js,.ts,.mjs --fix\",\n \"eslint:check\": \"eslint src --ext .js,.ts,.mjs\",\n \"preinstall\": \"npx only-allow pnpm\",\n \"prepare\": \"husky\",\n \"prepublishOnly\": \"pnpm run build\",\n \"prettier\": \"prettier --write .\",\n \"prettier:check\": \"prettier --check .\",\n \"sort-package-json\": \"pnpm exec sort-package-json\",\n \"sort-package-json:check\": \"pnpm exec sort-package-json --check\",\n \"test\": \"jest\",\n \"test:coverage\": \"jest --coverage\",\n \"test:watch\": \"jest --watch\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@typescript-eslint/utils\": \"^8.42.0\",\n \"emoji-regex\": \"^10.5.0\",\n \"tsup\": \"^8.5.0\"\n },\n \"devDependencies\": {\n \"@changesets/changelog-github\": \"^0.5.1\",\n \"@changesets/cli\": \"^2.29.6\",\n \"@commitlint/cli\": \"^19.8.1\",\n \"@commitlint/config-conventional\": \"^19.8.1\",\n \"@eslint/js\": \"^9.35.0\",\n \"@jest/globals\": \"^30.1.2\",\n \"@stylistic/eslint-plugin\": \"^3.1.0\",\n \"@swc/core\": \"^1.13.5\",\n \"@types/eslint\": \"^9.6.1\",\n \"@types/jest\": \"^30.0.0\",\n \"@types/node\": \"^22.5.4\",\n \"@types/ramda\": \"^0.31.0\",\n \"@typescript-eslint/parser\": \"^8.42.0\",\n \"@typescript-eslint/rule-tester\": \"^8.42.0\",\n \"eslint\": \"^9.35.0\",\n \"eslint-config-airbnb-extended\": \"^2.2.0\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-import-resolver-typescript\": \"^4.4.4\",\n \"eslint-plugin-import-x\": \"^4.16.1\",\n \"eslint-plugin-jest\": \"^29.0.1\",\n \"eslint-plugin-prettier\": \"^5.5.4\",\n \"eslint-plugin-sonarjs\": \"^3.0.5\",\n \"husky\": \"^9.1.7\",\n \"jest\": \"^29.7.0\",\n \"lint-staged\": \"^16.1.6\",\n \"prettier\": \"^3.6.2\",\n \"sort-package-json\": \"^3.4.0\",\n \"ts-jest\": \"^29.4.1\",\n \"ts-node\": \"^10.9.2\",\n \"typescript\": \"^5.6.2\",\n \"typescript-eslint\": \"^8.42.0\"\n },\n \"peerDependencies\": {\n \"eslint\": \"^9.0.0\"\n },\n \"packageManager\": \"pnpm@9.12.0\",\n \"engines\": {\n \"node\": \">=22.0.0\",\n \"pnpm\": \">=9.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import packageJson from \"../package.json\" assert { type: \"json\" };\n\nconst meta = {\n name: packageJson.name,\n version: packageJson.version,\n};\n\nexport default meta;\n","import emojiRegex from \"emoji-regex\";\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst noEmoji = createRule({\n name: \"no-emoji\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow emoji characters in source code\",\n },\n messages: {\n noEmoji: \"Emoji are not allowed in source code\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { sourceCode } = context;\n\n return {\n Program() {\n const text = sourceCode.getText();\n const regex = emojiRegex();\n const matches = Array.from(text.matchAll(regex));\n\n matches.forEach((match) => {\n const loc = sourceCode.getLocFromIndex(match.index);\n\n context.report({\n loc,\n messageId: \"noEmoji\",\n });\n });\n },\n };\n },\n});\n\nexport default noEmoji;\n","import path from \"path\";\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst isKebabCase = (str: string) => {\n if (/\\.(config|rc|setup|spec|test)$/.test(str)) {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\.[a-z0-9]+)*$/.test(str);\n }\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(str);\n};\n\nconst fileKebabCase = createRule({\n name: \"file-kebab-case\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce kebab-case filenames for .ts and .js files\",\n },\n messages: {\n fileKebabCase: \"File names must be kebab-case\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Program() {\n const { filename } = context;\n const ext = path.extname(filename);\n\n if (ext !== \".ts\" && ext !== \".js\") {\n return;\n }\n\n const basename = path.basename(filename, ext);\n\n if (!isKebabCase(basename)) {\n context.report({\n loc: { line: 1, column: 0 },\n messageId: \"fileKebabCase\",\n });\n }\n },\n };\n },\n});\n\nexport default fileKebabCase;\n","import path from \"path\";\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst isPascalCase = (str: string) => /^[A-Z][a-zA-Z0-9]*$/.test(str) && !/^[A-Z]+$/.test(str);\n\nconst jsxPascalCase = createRule({\n name: \"jsx-pascal-case\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce PascalCase filenames for .jsx and .tsx files\",\n },\n messages: {\n jsxPascalCase: \"JSX/TSX file names must be PascalCase\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Program() {\n const { filename } = context;\n const ext = path.extname(filename);\n\n if (ext !== \".jsx\" && ext !== \".tsx\") {\n return;\n }\n\n const basename = path.basename(filename, ext);\n\n if (!isPascalCase(basename)) {\n context.report({\n loc: { line: 1, column: 0 },\n messageId: \"jsxPascalCase\",\n });\n }\n },\n };\n },\n});\n\nexport default jsxPascalCase;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst preferDestructuringParams = createRule({\n name: \"prefer-destructuring-params\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce destructuring for functions with multiple parameters\",\n },\n messages: {\n preferDestructuring: \"Functions with multiple parameters should use destructuring\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const checkFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression,\n ) => {\n if (node.params.length <= 1) {\n return;\n }\n\n const hasNonDestructuredParams = node.params.some(\n (param: TSESTree.Parameter) =>\n param.type !== AST_NODE_TYPES.ObjectPattern && param.type !== AST_NODE_TYPES.RestElement,\n );\n\n if (hasNonDestructuredParams) {\n context.report({\n node,\n messageId: \"preferDestructuring\",\n });\n }\n };\n\n return {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n };\n },\n});\n\nexport default preferDestructuringParams;\n","import { ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst noExplicitReturnType = createRule({\n name: \"no-explicit-return-type\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow explicit return types on functions\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n noExplicitReturnType: \"Remove explicit return type '{{returnType}}' - TypeScript can infer it automatically\",\n },\n },\n defaultOptions: [],\n create(context) {\n const checkFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression,\n ) => {\n if (node.returnType) {\n const returnTypeText = context.sourceCode.getText(node.returnType);\n context.report({\n node: node.returnType,\n messageId: \"noExplicitReturnType\",\n data: {\n returnType: returnTypeText,\n },\n fix(fixer) {\n return fixer.remove(node.returnType!);\n },\n });\n }\n };\n\n return {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n };\n },\n});\n\nexport default noExplicitReturnType;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst preferImportType = createRule({\n name: \"prefer-import-type\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce using 'import type' for type-only imports\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n preferImportType: \"Use 'import type' for type-only imports\",\n },\n },\n defaultOptions: [],\n create(context) {\n function checkImportDeclaration(node: TSESTree.ImportDeclaration) {\n if (node.importKind === \"type\") {\n return;\n }\n\n if (\n context.filename.includes(\".test.\") ||\n context.filename.includes(\".spec.\") ||\n context.filename.includes(\"__tests__\")\n ) {\n return;\n }\n\n const isTypeOnlyImport = node.specifiers.every((specifier) => {\n if (specifier.type === AST_NODE_TYPES.ImportDefaultSpecifier) {\n return false;\n }\n if (specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier) {\n return false;\n }\n if (specifier.type === AST_NODE_TYPES.ImportSpecifier) {\n const importedName =\n specifier.imported.type === AST_NODE_TYPES.Identifier ? specifier.imported.name : specifier.imported.value;\n return (\n importedName[0] === importedName[0].toUpperCase() && ![\"ESLintUtils\", \"RuleTester\"].includes(importedName)\n );\n }\n return false;\n });\n\n if (isTypeOnlyImport) {\n context.report({\n node,\n messageId: \"preferImportType\",\n fix(fixer) {\n const source = context.sourceCode.getText(node);\n const fixedSource = source.replace(/^import\\s+/, \"import type \");\n return fixer.replaceText(node, fixedSource);\n },\n });\n }\n }\n\n return {\n ImportDeclaration: checkImportDeclaration,\n };\n },\n});\n\nexport default preferImportType;\n","import path from \"path\";\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst mdFilenameCaseRestriction = createRule({\n name: \"md-filename-case-restriction\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce .md filenames to be SNAKE_CASE only\",\n },\n messages: {\n invalidFilenameCase: \"Markdown filename must be SNAKE_CASE (UPPERCASE with underscores). Found: '{{ filename }}'\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Program() {\n const { filename } = context;\n\n if (!filename.endsWith(\".md\")) {\n return;\n }\n\n const basename = path.basename(filename, \".md\");\n\n function isSnakeCase(text: string): boolean {\n return /^[A-Z][A-Z0-9_]*$/.test(text);\n }\n\n function isValidCase(text: string): boolean {\n return isSnakeCase(text);\n }\n\n if (!isValidCase(basename)) {\n context.report({\n node: context.sourceCode.ast,\n messageId: \"invalidFilenameCase\",\n data: { filename: basename },\n });\n }\n },\n };\n },\n});\n\nexport default mdFilenameCaseRestriction;\n","import noEmoji from \"./rules/no-emoji\";\nimport fileKebabCase from \"./rules/file-kebab-case\";\nimport jsxPascalCase from \"./rules/jsx-pascal-case\";\nimport preferDestructuringParams from \"./rules/prefer-destructuring-params\";\nimport noExplicitReturnType from \"./rules/no-explicit-return-type\";\nimport preferImportType from \"./rules/prefer-import-type\";\nimport mdFilenameCaseRestriction from \"./rules/md-filename-case-restriction\";\n\nimport type { TSESLint } from \"@typescript-eslint/utils\";\n\nconst rules: Record<string, TSESLint.RuleModule<string, readonly unknown[]>> = {\n \"file-kebab-case\": fileKebabCase,\n \"jsx-pascal-case\": jsxPascalCase,\n \"md-filename-case-restriction\": mdFilenameCaseRestriction,\n \"no-emoji\": noEmoji,\n \"no-explicit-return-type\": noExplicitReturnType,\n \"prefer-destructuring-params\": preferDestructuringParams,\n \"prefer-import-type\": preferImportType,\n};\n\nexport default rules;\n","import rules from \"./rules\";\n\nconst plugin = { rules };\n\nconst baseRules = {\n \"nextfriday/no-emoji\": \"warn\",\n \"nextfriday/file-kebab-case\": \"warn\",\n \"nextfriday/md-filename-case-restriction\": \"warn\",\n \"nextfriday/prefer-destructuring-params\": \"warn\",\n \"nextfriday/no-explicit-return-type\": \"warn\",\n \"nextfriday/prefer-import-type\": \"warn\",\n} as const;\n\nconst baseRecommendedRules = {\n \"nextfriday/no-emoji\": \"error\",\n \"nextfriday/file-kebab-case\": \"error\",\n \"nextfriday/md-filename-case-restriction\": \"error\",\n \"nextfriday/prefer-destructuring-params\": \"error\",\n \"nextfriday/no-explicit-return-type\": \"error\",\n \"nextfriday/prefer-import-type\": \"error\",\n} as const;\n\nconst jsxRules = {\n \"nextfriday/jsx-pascal-case\": \"warn\",\n} as const;\n\nconst jsxRecommendedRules = {\n \"nextfriday/jsx-pascal-case\": \"error\",\n} as const;\n\nconst createConfig = (configRules: Record<string, string>) => ({\n plugins: {\n nextfriday: plugin,\n },\n rules: configRules,\n});\n\nconst configs = {\n base: createConfig(baseRules),\n \"base/recommended\": createConfig(baseRecommendedRules),\n react: createConfig({\n ...baseRules,\n ...jsxRules,\n }),\n \"react/recommended\": createConfig({\n ...baseRecommendedRules,\n ...jsxRecommendedRules,\n }),\n nextjs: createConfig({\n ...baseRules,\n ...jsxRules,\n }),\n \"nextjs/recommended\": createConfig({\n ...baseRecommendedRules,\n ...jsxRecommendedRules,\n }),\n};\n\nexport default configs;\n"],"mappings":"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","names":["emojiRegex","import_utils","createRule","path","import_path","import_utils","createRule","path","import_utils","createRule","import_utils","createRule","import_utils","createRule","import_path","import_utils","createRule","path"]}
1
+ {"version":3,"sources":["../src/index.ts","../package.json","../src/rules/file-kebab-case.ts","../src/rules/jsx-pascal-case.ts","../src/rules/md-filename-case-restriction.ts","../src/rules/no-emoji.ts","../src/rules/no-explicit-return-type.ts","../src/rules/prefer-destructuring-params.ts","../src/rules/prefer-import-type.ts"],"sourcesContent":["import packageJson from \"../package.json\" assert { type: \"json\" };\n\nimport fileKebabCase from \"./rules/file-kebab-case\";\nimport jsxPascalCase from \"./rules/jsx-pascal-case\";\nimport mdFilenameCaseRestriction from \"./rules/md-filename-case-restriction\";\nimport noEmoji from \"./rules/no-emoji\";\nimport noExplicitReturnType from \"./rules/no-explicit-return-type\";\nimport preferDestructuringParams from \"./rules/prefer-destructuring-params\";\nimport preferImportType from \"./rules/prefer-import-type\";\n\nimport type { TSESLint } from \"@typescript-eslint/utils\";\n\nconst meta = {\n name: packageJson.name,\n version: packageJson.version,\n} as const;\n\nconst rules = {\n \"file-kebab-case\": fileKebabCase,\n \"jsx-pascal-case\": jsxPascalCase,\n \"md-filename-case-restriction\": mdFilenameCaseRestriction,\n \"no-emoji\": noEmoji,\n \"no-explicit-return-type\": noExplicitReturnType,\n \"prefer-destructuring-params\": preferDestructuringParams,\n \"prefer-import-type\": preferImportType,\n} as const satisfies Record<string, TSESLint.RuleModule<string, readonly unknown[]>>;\n\nconst plugin = {\n meta,\n rules,\n} as const;\n\nconst baseRules = {\n \"nextfriday/no-emoji\": \"warn\",\n \"nextfriday/file-kebab-case\": \"warn\",\n \"nextfriday/md-filename-case-restriction\": \"warn\",\n \"nextfriday/prefer-destructuring-params\": \"warn\",\n \"nextfriday/no-explicit-return-type\": \"warn\",\n \"nextfriday/prefer-import-type\": \"warn\",\n} as const;\n\nconst baseRecommendedRules = {\n \"nextfriday/no-emoji\": \"error\",\n \"nextfriday/file-kebab-case\": \"error\",\n \"nextfriday/md-filename-case-restriction\": \"error\",\n \"nextfriday/prefer-destructuring-params\": \"error\",\n \"nextfriday/no-explicit-return-type\": \"error\",\n \"nextfriday/prefer-import-type\": \"error\",\n} as const;\n\nconst jsxRules = {\n \"nextfriday/jsx-pascal-case\": \"warn\",\n} as const;\n\nconst jsxRecommendedRules = {\n \"nextfriday/jsx-pascal-case\": \"error\",\n} as const;\n\nconst createConfig = (configRules: Record<string, string>) => ({\n plugins: {\n nextfriday: plugin,\n },\n rules: configRules,\n});\n\nconst configs = {\n base: createConfig(baseRules),\n \"base/recommended\": createConfig(baseRecommendedRules),\n react: createConfig({\n ...baseRules,\n ...jsxRules,\n }),\n \"react/recommended\": createConfig({\n ...baseRecommendedRules,\n ...jsxRecommendedRules,\n }),\n nextjs: createConfig({\n ...baseRules,\n ...jsxRules,\n }),\n \"nextjs/recommended\": createConfig({\n ...baseRecommendedRules,\n ...jsxRecommendedRules,\n }),\n} as const;\n\nconst nextfridayPlugin = {\n meta,\n configs,\n rules,\n} as const;\n\nexport { meta, configs, rules };\n\nexport default nextfridayPlugin;\n","{\n \"name\": \"eslint-plugin-nextfriday\",\n \"version\": \"1.0.1\",\n \"description\": \"A comprehensive ESLint plugin providing custom rules and configurations for Next Friday development workflows.\",\n \"keywords\": [\n \"eslint\",\n \"eslintplugin\",\n \"eslint-plugin\",\n \"nextfriday\",\n \"next-friday\",\n \"linting\",\n \"code-quality\",\n \"javascript\",\n \"typescript\",\n \"development-tools\"\n ],\n \"homepage\": \"https://github.com/next-friday/eslint-plugin-nextfriday\",\n \"bugs\": {\n \"url\": \"https://github.com/next-friday/eslint-plugin-nextfriday/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/next-friday/eslint-plugin-nextfriday.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"Next Friday <nextfriday.developer@gmail.com>\",\n \"contributors\": [\n \"@joetakara\"\n ],\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./lib/index.d.ts\",\n \"import\": \"./lib/index.js\",\n \"require\": \"./lib/index.cjs\"\n }\n },\n \"main\": \"lib/index.js\",\n \"types\": \"lib/index.d.ts\",\n \"files\": [\n \"LICENSE\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"docs\",\n \"lib\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"changeset\": \"changeset\",\n \"changeset:publish\": \"npm publish --provenance --access public\",\n \"changeset:version\": \"changeset version\",\n \"clear\": \"rm -rf lib node_modules/.cache .eslintcache\",\n \"eslint\": \"eslint src --ext .js,.ts,.mjs --fix\",\n \"eslint:check\": \"eslint src --ext .js,.ts,.mjs\",\n \"preinstall\": \"npx only-allow pnpm\",\n \"prepare\": \"husky\",\n \"prepublishOnly\": \"pnpm run build\",\n \"prettier\": \"prettier --write .\",\n \"prettier:check\": \"prettier --check .\",\n \"sort-package-json\": \"pnpm exec sort-package-json\",\n \"sort-package-json:check\": \"pnpm exec sort-package-json --check\",\n \"test\": \"jest\",\n \"test:coverage\": \"jest --coverage\",\n \"test:watch\": \"jest --watch\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@typescript-eslint/utils\": \"^8.42.0\",\n \"emoji-regex\": \"^10.5.0\",\n \"tsup\": \"^8.5.0\"\n },\n \"devDependencies\": {\n \"@changesets/changelog-github\": \"^0.5.1\",\n \"@changesets/cli\": \"^2.29.6\",\n \"@commitlint/cli\": \"^19.8.1\",\n \"@commitlint/config-conventional\": \"^19.8.1\",\n \"@eslint/js\": \"^9.35.0\",\n \"@jest/globals\": \"^30.1.2\",\n \"@stylistic/eslint-plugin\": \"^3.1.0\",\n \"@swc/core\": \"^1.13.5\",\n \"@types/eslint\": \"^9.6.1\",\n \"@types/jest\": \"^30.0.0\",\n \"@types/node\": \"^22.5.4\",\n \"@types/ramda\": \"^0.31.0\",\n \"@typescript-eslint/parser\": \"^8.42.0\",\n \"@typescript-eslint/rule-tester\": \"^8.42.0\",\n \"eslint\": \"^9.35.0\",\n \"eslint-config-airbnb-extended\": \"^2.2.0\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-import-resolver-typescript\": \"^4.4.4\",\n \"eslint-plugin-import-x\": \"^4.16.1\",\n \"eslint-plugin-jest\": \"^29.0.1\",\n \"eslint-plugin-prettier\": \"^5.5.4\",\n \"eslint-plugin-sonarjs\": \"^3.0.5\",\n \"husky\": \"^9.1.7\",\n \"jest\": \"^29.7.0\",\n \"lint-staged\": \"^16.1.6\",\n \"prettier\": \"^3.6.2\",\n \"sort-package-json\": \"^3.4.0\",\n \"ts-jest\": \"^29.4.1\",\n \"ts-node\": \"^10.9.2\",\n \"typescript\": \"^5.6.2\",\n \"typescript-eslint\": \"^8.42.0\"\n },\n \"peerDependencies\": {\n \"eslint\": \"^9.0.0\"\n },\n \"packageManager\": \"pnpm@9.12.0\",\n \"engines\": {\n \"node\": \">=22.0.0\",\n \"pnpm\": \">=9.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import path from \"path\";\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst isKebabCase = (str: string) => {\n if (/\\.(config|rc|setup|spec|test)$/.test(str)) {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\.[a-z0-9]+)*$/.test(str);\n }\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(str);\n};\n\nconst fileKebabCase = createRule({\n name: \"file-kebab-case\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce kebab-case filenames for .ts and .js files\",\n },\n messages: {\n fileKebabCase: \"File names must be kebab-case\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Program() {\n const { filename } = context;\n const ext = path.extname(filename);\n\n if (ext !== \".ts\" && ext !== \".js\") {\n return;\n }\n\n const basename = path.basename(filename, ext);\n\n if (!isKebabCase(basename)) {\n context.report({\n loc: { line: 1, column: 0 },\n messageId: \"fileKebabCase\",\n });\n }\n },\n };\n },\n});\n\nexport default fileKebabCase;\n","import path from \"path\";\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst isPascalCase = (str: string) => /^[A-Z][a-zA-Z0-9]*$/.test(str) && !/^[A-Z]+$/.test(str);\n\nconst jsxPascalCase = createRule({\n name: \"jsx-pascal-case\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce PascalCase filenames for .jsx and .tsx files\",\n },\n messages: {\n jsxPascalCase: \"JSX/TSX file names must be PascalCase\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Program() {\n const { filename } = context;\n const ext = path.extname(filename);\n\n if (ext !== \".jsx\" && ext !== \".tsx\") {\n return;\n }\n\n const basename = path.basename(filename, ext);\n\n if (!isPascalCase(basename)) {\n context.report({\n loc: { line: 1, column: 0 },\n messageId: \"jsxPascalCase\",\n });\n }\n },\n };\n },\n});\n\nexport default jsxPascalCase;\n","import path from \"path\";\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst mdFilenameCaseRestriction = createRule({\n name: \"md-filename-case-restriction\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce .md filenames to be SNAKE_CASE only\",\n },\n messages: {\n invalidFilenameCase: \"Markdown filename must be SNAKE_CASE (UPPERCASE with underscores). Found: '{{ filename }}'\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Program() {\n const { filename } = context;\n\n if (!filename.endsWith(\".md\")) {\n return;\n }\n\n const basename = path.basename(filename, \".md\");\n\n function isSnakeCase(text: string): boolean {\n return /^[A-Z][A-Z0-9_]*$/.test(text);\n }\n\n function isValidCase(text: string): boolean {\n return isSnakeCase(text);\n }\n\n if (!isValidCase(basename)) {\n context.report({\n node: context.sourceCode.ast,\n messageId: \"invalidFilenameCase\",\n data: { filename: basename },\n });\n }\n },\n };\n },\n});\n\nexport default mdFilenameCaseRestriction;\n","import emojiRegex from \"emoji-regex\";\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst noEmoji = createRule({\n name: \"no-emoji\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow emoji characters in source code\",\n },\n messages: {\n noEmoji: \"Emoji are not allowed in source code\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { sourceCode } = context;\n\n return {\n Program() {\n const text = sourceCode.getText();\n const regex = emojiRegex();\n const matches = Array.from(text.matchAll(regex));\n\n matches.forEach((match) => {\n const loc = sourceCode.getLocFromIndex(match.index);\n\n context.report({\n loc,\n messageId: \"noEmoji\",\n });\n });\n },\n };\n },\n});\n\nexport default noEmoji;\n","import { ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst noExplicitReturnType = createRule({\n name: \"no-explicit-return-type\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow explicit return types on functions\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n noExplicitReturnType: \"Remove explicit return type '{{returnType}}' - TypeScript can infer it automatically\",\n },\n },\n defaultOptions: [],\n create(context) {\n const checkFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression,\n ) => {\n if (node.returnType) {\n const returnTypeText = context.sourceCode.getText(node.returnType);\n context.report({\n node: node.returnType,\n messageId: \"noExplicitReturnType\",\n data: {\n returnType: returnTypeText,\n },\n fix(fixer) {\n return fixer.remove(node.returnType!);\n },\n });\n }\n };\n\n return {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n };\n },\n});\n\nexport default noExplicitReturnType;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst preferDestructuringParams = createRule({\n name: \"prefer-destructuring-params\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce destructuring for functions with multiple parameters\",\n },\n messages: {\n preferDestructuring: \"Functions with multiple parameters should use destructuring\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const checkFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression,\n ) => {\n if (node.params.length <= 1) {\n return;\n }\n\n const hasNonDestructuredParams = node.params.some(\n (param: TSESTree.Parameter) =>\n param.type !== AST_NODE_TYPES.ObjectPattern && param.type !== AST_NODE_TYPES.RestElement,\n );\n\n if (hasNonDestructuredParams) {\n context.report({\n node,\n messageId: \"preferDestructuring\",\n });\n }\n };\n\n return {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n };\n },\n});\n\nexport default preferDestructuringParams;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst preferImportType = createRule({\n name: \"prefer-import-type\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce using 'import type' for type-only imports\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n preferImportType: \"Use 'import type' for type-only imports\",\n },\n },\n defaultOptions: [],\n create(context) {\n function checkImportDeclaration(node: TSESTree.ImportDeclaration) {\n if (node.importKind === \"type\") {\n return;\n }\n\n if (\n context.filename.includes(\".test.\") ||\n context.filename.includes(\".spec.\") ||\n context.filename.includes(\"__tests__\")\n ) {\n return;\n }\n\n const isTypeOnlyImport = node.specifiers.every((specifier) => {\n if (specifier.type === AST_NODE_TYPES.ImportDefaultSpecifier) {\n return false;\n }\n if (specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier) {\n return false;\n }\n if (specifier.type === AST_NODE_TYPES.ImportSpecifier) {\n const importedName =\n specifier.imported.type === AST_NODE_TYPES.Identifier ? specifier.imported.name : specifier.imported.value;\n\n const isKnownTypeOnly =\n (node.source.value === \"@typescript-eslint/utils\" && [\"TSESTree\", \"RuleContext\"].includes(importedName)) ||\n (node.source.value === \"react\" &&\n [\"Component\", \"ComponentProps\", \"ReactNode\", \"FC\", \"JSX\"].includes(importedName)) ||\n importedName.endsWith(\"Type\") ||\n importedName.endsWith(\"Interface\") ||\n importedName.endsWith(\"Props\");\n\n return isKnownTypeOnly;\n }\n return false;\n });\n\n if (isTypeOnlyImport) {\n context.report({\n node,\n messageId: \"preferImportType\",\n fix(fixer) {\n const source = context.sourceCode.getText(node);\n const fixedSource = source.replace(/^import\\s+/, \"import type \");\n return fixer.replaceText(node, fixedSource);\n },\n });\n }\n }\n\n return {\n ImportDeclaration: checkImportDeclaration,\n };\n },\n});\n\nexport default preferImportType;\n"],"mappings":"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","names":["path","import_path","import_utils","createRule","path","import_path","import_utils","createRule","path","import_utils","createRule","emojiRegex","import_utils","createRule","import_utils","createRule","import_utils","createRule"]}