js-style-kit 0.1.6 → 0.2.0

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.
Files changed (102) hide show
  1. package/dist/bin/index.js +3531 -0
  2. package/dist/bin/index.js.map +1 -0
  3. package/dist/chunk-2EXCSH5L.js +21 -0
  4. package/dist/chunk-2EXCSH5L.js.map +1 -0
  5. package/dist/{chunk-LODDGOPW.js → chunk-BDTLNELO.js} +4 -2
  6. package/dist/{chunk-LODDGOPW.js.map → chunk-BDTLNELO.js.map} +1 -1
  7. package/dist/{chunk-MQCYNRXY.js → chunk-C63QD4BT.js} +6 -2
  8. package/dist/chunk-C63QD4BT.js.map +1 -0
  9. package/dist/{chunk-MICOVBJ4.js → chunk-DR4DHSO2.js} +2 -2
  10. package/dist/{chunk-67MZ7HGN.js → chunk-FJNJWCYG.js} +2 -2
  11. package/dist/{chunk-H2WBGBO4.js → chunk-HN2CEVC4.js} +2 -2
  12. package/dist/{chunk-PHFQMAHS.js → chunk-HOZDQJWG.js} +2 -2
  13. package/dist/chunk-HOZDQJWG.js.map +1 -0
  14. package/dist/{chunk-GMXUFYEC.js → chunk-I4GUWATW.js} +2 -2
  15. package/dist/{chunk-D3SKAD35.js → chunk-IKA5P3EP.js} +36 -12
  16. package/dist/chunk-IKA5P3EP.js.map +1 -0
  17. package/dist/{chunk-2DEE5IMM.js → chunk-LYJZ2BXK.js} +2 -2
  18. package/dist/{chunk-IDOXOS33.js → chunk-NPTVKFZO.js} +2 -2
  19. package/dist/{chunk-4JICVSDT.js → chunk-PB5PHG6U.js} +2 -2
  20. package/dist/chunk-PSSB4TGO.js +29 -0
  21. package/dist/chunk-PSSB4TGO.js.map +1 -0
  22. package/dist/{chunk-67I7QCZW.js → chunk-TA2KEF22.js} +2 -2
  23. package/dist/{chunk-3A7OYQSX.js → chunk-UV6CA4PE.js} +2 -2
  24. package/dist/chunk-UV6CA4PE.js.map +1 -0
  25. package/dist/chunk-V3QNQKET.js +20 -0
  26. package/dist/chunk-V3QNQKET.js.map +1 -0
  27. package/dist/{chunk-V34MGXE7.js → chunk-XHFTPVHK.js} +5 -6
  28. package/dist/chunk-XHFTPVHK.js.map +1 -0
  29. package/dist/chunk-YZG34ZNI.js +80 -0
  30. package/dist/chunk-YZG34ZNI.js.map +1 -0
  31. package/dist/eslint/base/config.js +2 -3
  32. package/dist/eslint/base/rules.js +0 -1
  33. package/dist/eslint/constants.d.ts +2 -0
  34. package/dist/eslint/constants.js +1 -2
  35. package/dist/eslint/ignores.js +2 -3
  36. package/dist/eslint/index.d.ts +5 -1
  37. package/dist/eslint/index.js +17 -14
  38. package/dist/eslint/jsdoc/config.js +2 -3
  39. package/dist/eslint/jsdoc/rules.js +0 -1
  40. package/dist/eslint/perfectionist/config.js +2 -3
  41. package/dist/eslint/perfectionist/rules.js +0 -1
  42. package/dist/eslint/prefer-arrow-function/config.js +2 -3
  43. package/dist/eslint/react/config.js +2 -3
  44. package/dist/eslint/react/rules.js +0 -1
  45. package/dist/eslint/react-compiler/config.js +2 -3
  46. package/dist/eslint/testing/config.js +4 -5
  47. package/dist/eslint/testing/jest-rules.js +7 -0
  48. package/dist/eslint/testing/vitest-rules.js +7 -0
  49. package/dist/eslint/turbo/config.d.ts +12 -0
  50. package/dist/eslint/turbo/config.js +8 -0
  51. package/dist/eslint/turbo/types.d.ts +11 -0
  52. package/dist/eslint/turbo/types.js +1 -0
  53. package/dist/eslint/typescript/config.js +2 -3
  54. package/dist/eslint/typescript/rules.js +0 -1
  55. package/dist/eslint/unicorn/config.d.ts +11 -0
  56. package/dist/eslint/unicorn/config.js +9 -0
  57. package/dist/eslint/unicorn/config.js.map +1 -0
  58. package/dist/eslint/unicorn/rules.d.ts +8 -0
  59. package/dist/eslint/unicorn/rules.js +7 -0
  60. package/dist/eslint/unicorn/rules.js.map +1 -0
  61. package/dist/index.js +20 -18
  62. package/dist/prettier/index.js +2 -2
  63. package/dist/utils/is-type.d.ts +44 -0
  64. package/dist/utils/is-type.js +17 -0
  65. package/dist/utils/is-type.js.map +1 -0
  66. package/package.json +25 -18
  67. package/dist/chunk-3A7OYQSX.js.map +0 -1
  68. package/dist/chunk-7D4SUZUM.js +0 -38
  69. package/dist/chunk-D3SKAD35.js.map +0 -1
  70. package/dist/chunk-ETHEVVRU.js +0 -1
  71. package/dist/chunk-LQQAQ4PJ.js +0 -17936
  72. package/dist/chunk-LQQAQ4PJ.js.map +0 -1
  73. package/dist/chunk-MQCYNRXY.js.map +0 -1
  74. package/dist/chunk-PHFQMAHS.js.map +0 -1
  75. package/dist/chunk-V34MGXE7.js.map +0 -1
  76. package/dist/eslint/index.test.d.ts +0 -2
  77. package/dist/eslint/index.test.js +0 -409
  78. package/dist/eslint/index.test.js.map +0 -1
  79. package/dist/eslint/testing/config.test.d.ts +0 -2
  80. package/dist/eslint/testing/config.test.js +0 -124
  81. package/dist/eslint/testing/config.test.js.map +0 -1
  82. package/dist/eslint/testing/jestRules.js +0 -8
  83. package/dist/eslint/testing/vitestRules.js +0 -8
  84. package/dist/magic-string.es-HYRYIEM3.js +0 -1300
  85. package/dist/magic-string.es-HYRYIEM3.js.map +0 -1
  86. package/dist/prettier/index.test.d.ts +0 -2
  87. package/dist/prettier/index.test.js +0 -137
  88. package/dist/prettier/index.test.js.map +0 -1
  89. /package/dist/{chunk-MICOVBJ4.js.map → chunk-DR4DHSO2.js.map} +0 -0
  90. /package/dist/{chunk-67MZ7HGN.js.map → chunk-FJNJWCYG.js.map} +0 -0
  91. /package/dist/{chunk-H2WBGBO4.js.map → chunk-HN2CEVC4.js.map} +0 -0
  92. /package/dist/{chunk-GMXUFYEC.js.map → chunk-I4GUWATW.js.map} +0 -0
  93. /package/dist/{chunk-2DEE5IMM.js.map → chunk-LYJZ2BXK.js.map} +0 -0
  94. /package/dist/{chunk-IDOXOS33.js.map → chunk-NPTVKFZO.js.map} +0 -0
  95. /package/dist/{chunk-4JICVSDT.js.map → chunk-PB5PHG6U.js.map} +0 -0
  96. /package/dist/{chunk-67I7QCZW.js.map → chunk-TA2KEF22.js.map} +0 -0
  97. /package/dist/eslint/testing/{jestRules.d.ts → jest-rules.d.ts} +0 -0
  98. /package/dist/{chunk-7D4SUZUM.js.map → eslint/testing/jest-rules.js.map} +0 -0
  99. /package/dist/eslint/testing/{vitestRules.d.ts → vitest-rules.d.ts} +0 -0
  100. /package/dist/{chunk-ETHEVVRU.js.map → eslint/testing/vitest-rules.js.map} +0 -0
  101. /package/dist/eslint/{testing/jestRules.js.map → turbo/config.js.map} +0 -0
  102. /package/dist/eslint/{testing/vitestRules.js.map → turbo/types.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/prettier/index.ts"],"sourcesContent":["import type { Config as PrettierConfig } from \"prettier\";\nimport type { SortJsonOptions as SortJsonPluginOptions } from \"prettier-plugin-sort-json\";\nimport type { PluginOptions as TailwindPluginOptions } from \"prettier-plugin-tailwindcss\";\n\nimport { isArray, isObject } from \"is-type-of\";\n\ninterface PrettierConfigOptions extends PrettierConfig {\n cssOrderPlugin?: boolean;\n jsonSortPlugin?: boolean | SortJsonPluginOptions;\n packageJsonPlugin?: boolean;\n tailwindPlugin?: boolean | string[] | TailwindPluginOptions;\n}\n\nexport interface PrettierConfigWithPlugins\n extends PrettierConfig,\n SortJsonPluginOptions,\n TailwindPluginOptions {}\n\n/**\n * Creates a Prettier configuration object with optional Tailwind support\n *\n * @param options - Configuration options for Prettier\n * @param options.cssOrderPlugin CSS order sorting support\n * @param options.jsonSortPlugin JSON sorting support\n * @param options.packageJsonPlugin Package.json sorting support\n * @param options.tailwindPlugin Tailwind CSS formatting support\n * @returns Prettier configuration object with:\n * - Default Prettier configuration\n * - Experimental ternaries enabled\n * - CSS order plugin\n * - JSON sorting plugin\n * - Package.json sorting plugin\n * - Optional Tailwind plugin and functions\n */\nexport const prettierConfig = (\n options: PrettierConfigOptions = {},\n): PrettierConfigWithPlugins => {\n const {\n cssOrderPlugin = true,\n jsonSortPlugin = true,\n packageJsonPlugin = true,\n tailwindPlugin = false,\n ...rest\n } = options;\n\n const plugins: string[] = [];\n const config: PrettierConfigWithPlugins = {\n experimentalTernaries: true,\n ...rest,\n };\n\n if (cssOrderPlugin) {\n plugins.push(\"prettier-plugin-css-order\");\n }\n\n if (jsonSortPlugin) {\n plugins.push(\"prettier-plugin-sort-json\");\n\n if (isObject(jsonSortPlugin)) {\n Object.assign(config, jsonSortPlugin);\n } else {\n config.jsonRecursiveSort = true;\n }\n }\n\n if (packageJsonPlugin) {\n plugins.push(\"prettier-plugin-packagejson\");\n }\n\n if (tailwindPlugin) {\n plugins.push(\"prettier-plugin-tailwindcss\");\n const defaultTailwindFunctions = [\"clsx\", \"cva\", \"cn\"];\n\n if (isArray(tailwindPlugin)) {\n config.tailwindFunctions = [\n ...defaultTailwindFunctions,\n ...tailwindPlugin,\n ];\n } else if (isObject(tailwindPlugin)) {\n Object.assign(config, tailwindPlugin);\n } else {\n config.tailwindFunctions = defaultTailwindFunctions;\n }\n }\n\n // Set plugins after all configurations are done\n config.plugins = plugins;\n\n return config;\n};\n"],"mappings":";AAIA,SAAS,SAAS,gBAAgB;AA8B3B,IAAM,iBAAiB,CAC5B,UAAiC,CAAC,MACJ;AAC9B,QAAM;AAAA,IACJ,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,UAAoB,CAAC;AAC3B,QAAM,SAAoC;AAAA,IACxC,uBAAuB;AAAA,IACvB,GAAG;AAAA,EACL;AAEA,MAAI,gBAAgB;AAClB,YAAQ,KAAK,2BAA2B;AAAA,EAC1C;AAEA,MAAI,gBAAgB;AAClB,YAAQ,KAAK,2BAA2B;AAExC,QAAI,SAAS,cAAc,GAAG;AAC5B,aAAO,OAAO,QAAQ,cAAc;AAAA,IACtC,OAAO;AACL,aAAO,oBAAoB;AAAA,IAC7B;AAAA,EACF;AAEA,MAAI,mBAAmB;AACrB,YAAQ,KAAK,6BAA6B;AAAA,EAC5C;AAEA,MAAI,gBAAgB;AAClB,YAAQ,KAAK,6BAA6B;AAC1C,UAAM,2BAA2B,CAAC,QAAQ,OAAO,IAAI;AAErD,QAAI,QAAQ,cAAc,GAAG;AAC3B,aAAO,oBAAoB;AAAA,QACzB,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,IACF,WAAW,SAAS,cAAc,GAAG;AACnC,aAAO,OAAO,QAAQ,cAAc;AAAA,IACtC,OAAO;AACL,aAAO,oBAAoB;AAAA,IAC7B;AAAA,EACF;AAGA,SAAO,UAAU;AAEjB,SAAO;AACT;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/eslint/testing/vitestRules.ts"],"sourcesContent":["import type { EslintRuleConfig } from \"../types.js\";\n\ntype VitestRules = Record<`vitest/${string}`, EslintRuleConfig>;\n\n/**\n * Creates an object containing the ESLint rules for vitest.\n *\n * @param itOrTest - \"it\" or \"test\"\n * @returns An object containing the ESLint rules for vitest.\n */\nexport const vitestRules = (itOrTest: \"it\" | \"test\" = \"test\"): VitestRules => ({\n \"vitest/consistent-test-it\": [\n \"warn\",\n { fn: itOrTest, withinDescribe: itOrTest },\n ],\n \"vitest/expect-expect\": \"warn\",\n \"vitest/no-commented-out-tests\": \"warn\",\n \"vitest/no-conditional-in-test\": \"warn\",\n \"vitest/no-disabled-tests\": \"warn\",\n \"vitest/no-duplicate-hooks\": \"warn\",\n \"vitest/no-focused-tests\": \"warn\",\n \"vitest/no-identical-title\": \"warn\",\n \"vitest/no-import-node-test\": \"warn\",\n \"vitest/no-interpolation-in-snapshots\": \"warn\", // Avoid dynamic snapshots\n \"vitest/no-large-snapshots\": [\"warn\", { inlineMaxSize: 50, maxSize: 100 }], // Keep snapshots manageable\n \"vitest/no-standalone-expect\": \"warn\",\n \"vitest/no-test-return-statement\": \"warn\", // Tests shouldn't return values\n \"vitest/prefer-comparison-matcher\": \"warn\", // Use comparison matchers\n \"vitest/prefer-equality-matcher\": \"warn\", // Use equality matchers\n \"vitest/prefer-hooks-in-order\": \"warn\", // Keep hooks in a predictable order\n \"vitest/prefer-hooks-on-top\": \"warn\", // Keep hooks organized\n \"vitest/prefer-lowercase-title\": [\"warn\", { ignoreTopLevelDescribe: true }], // Consistent casing\n \"vitest/prefer-strict-equal\": \"warn\", // Prefer .toStrictEqual() over .toEqual()\n \"vitest/prefer-to-be\": \"warn\", // Use .toBe() for primitives\n \"vitest/prefer-to-contain\": \"warn\", // Use .toContain() for array/string includes\n \"vitest/prefer-to-have-length\": \"warn\", // Use .toHaveLength() for checking length\n \"vitest/require-local-test-context-for-concurrent-snapshots\": \"warn\",\n \"vitest/require-top-level-describe\": \"warn\", // Group tests in describe blocks\n \"vitest/valid-describe-callback\": \"warn\",\n \"vitest/valid-expect\": \"warn\",\n \"vitest/valid-title\": \"warn\",\n});\n"],"mappings":";AAUO,IAAM,cAAc,CAAC,WAA0B,YAAyB;AAAA,EAC7E,6BAA6B;AAAA,IAC3B;AAAA,IACA,EAAE,IAAI,UAAU,gBAAgB,SAAS;AAAA,EAC3C;AAAA,EACA,wBAAwB;AAAA,EACxB,iCAAiC;AAAA,EACjC,iCAAiC;AAAA,EACjC,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,2BAA2B;AAAA,EAC3B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,wCAAwC;AAAA;AAAA,EACxC,6BAA6B,CAAC,QAAQ,EAAE,eAAe,IAAI,SAAS,IAAI,CAAC;AAAA;AAAA,EACzE,+BAA+B;AAAA,EAC/B,mCAAmC;AAAA;AAAA,EACnC,oCAAoC;AAAA;AAAA,EACpC,kCAAkC;AAAA;AAAA,EAClC,gCAAgC;AAAA;AAAA,EAChC,8BAA8B;AAAA;AAAA,EAC9B,iCAAiC,CAAC,QAAQ,EAAE,wBAAwB,KAAK,CAAC;AAAA;AAAA,EAC1E,8BAA8B;AAAA;AAAA,EAC9B,uBAAuB;AAAA;AAAA,EACvB,4BAA4B;AAAA;AAAA,EAC5B,gCAAgC;AAAA;AAAA,EAChC,8DAA8D;AAAA,EAC9D,qCAAqC;AAAA;AAAA,EACrC,kCAAkC;AAAA,EAClC,uBAAuB;AAAA,EACvB,sBAAsB;AACxB;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/eslint/testing/config.ts"],"sourcesContent":["import jest from \"eslint-plugin-jest\";\nimport vitest from \"eslint-plugin-vitest\";\n\nimport type { EslintConfigObject } from \"../types.js\";\n\nimport { configNames } from \"../constants.js\";\nimport { jestRules } from \"./jestRules.js\";\nimport { vitestRules } from \"./vitestRules.js\";\n\nexport interface TestingConfig {\n filenamePattern?: \"spec\" | \"test\";\n files?: string[];\n formattingRules?: boolean;\n framework?: \"bun\" | \"jest\" | \"node\" | \"vitest\";\n itOrTest?: \"it\" | \"test\";\n}\n\n/**\n * Creates an ESLint configuration object for testing.\n *\n * @param options - Configuration options\n * @param options.files - Files to include in the configuration\n * @param options.filenamePattern - \".test\" or \".spec\" filename pattern\n * @param options.itOrTest - \"it\" or \"test\"\n * @param options.framework - \"jest\" or \"vitest\"\n * @param options.formattingRules - Whether to include formatting rules like padding around blocks\n * @returns ESLint configuration object\n */\nexport const testingConfig = (\n {\n filenamePattern,\n files,\n formattingRules,\n framework,\n itOrTest,\n }: TestingConfig = {\n filenamePattern: \"test\",\n formattingRules: true,\n framework: \"vitest\",\n itOrTest: \"test\",\n },\n): EslintConfigObject => ({\n files: files ?? [\"**/*.{test,spec}.{ts,tsx,js,jsx}\"],\n languageOptions: {\n globals:\n framework === \"vitest\" ?\n { ...vitest.environments.env.globals }\n : jest.environments.globals.globals,\n },\n name: configNames.testing,\n plugins: {\n jest,\n vitest,\n },\n rules: {\n // jest doesn't have a file name rule, so we'll use this one for both\n \"vitest/consistent-test-filename\": [\n \"warn\",\n {\n allTestPattern: \".*\\\\.(test|spec)\\\\.[tj]sx?$\",\n pattern: `.*\\\\.${filenamePattern}\\\\.[tj]sx?$`,\n },\n ],\n ...(framework === \"vitest\" ? vitestRules(itOrTest) : {}),\n ...(framework === \"jest\" ? jestRules(itOrTest) : {}),\n ...(formattingRules ?\n {\n \"jest/padding-around-after-all-blocks\": \"warn\",\n \"jest/padding-around-after-each-blocks\": \"warn\",\n \"jest/padding-around-before-all-blocks\": \"warn\",\n \"jest/padding-around-before-each-blocks\": \"warn\",\n \"jest/padding-around-describe-blocks\": \"warn\",\n \"jest/padding-around-expect-groups\": \"warn\",\n \"jest/padding-around-test-blocks\": \"warn\",\n }\n : {}),\n },\n ...(framework !== \"jest\" && framework !== \"vitest\" ?\n {\n settings: {\n jest: {\n globalPackage: framework === \"node\" ? \"node:test\" : \"bun:test\",\n },\n },\n }\n : {}),\n});\n"],"mappings":";;;;;;;;;;;AAAA,OAAO,UAAU;AACjB,OAAO,YAAY;AA2BZ,IAAM,gBAAgB,CAC3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,IAAmB;AAAA,EACjB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,UAAU;AACZ,OACwB;AAAA,EACxB,OAAO,SAAS,CAAC,kCAAkC;AAAA,EACnD,iBAAiB;AAAA,IACf,SACE,cAAc,WACZ,EAAE,GAAG,OAAO,aAAa,IAAI,QAAQ,IACrC,KAAK,aAAa,QAAQ;AAAA,EAChC;AAAA,EACA,MAAM,YAAY;AAAA,EAClB,SAAS;AAAA,IACP;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAAA,IAEL,mCAAmC;AAAA,MACjC;AAAA,MACA;AAAA,QACE,gBAAgB;AAAA,QAChB,SAAS,QAAQ,eAAe;AAAA,MAClC;AAAA,IACF;AAAA,IACA,GAAI,cAAc,WAAW,YAAY,QAAQ,IAAI,CAAC;AAAA,IACtD,GAAI,cAAc,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,IAClD,GAAI,kBACF;AAAA,MACE,wCAAwC;AAAA,MACxC,yCAAyC;AAAA,MACzC,yCAAyC;AAAA,MACzC,0CAA0C;AAAA,MAC1C,uCAAuC;AAAA,MACvC,qCAAqC;AAAA,MACrC,mCAAmC;AAAA,IACrC,IACA,CAAC;AAAA,EACL;AAAA,EACA,GAAI,cAAc,UAAU,cAAc,WACxC;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,eAAe,cAAc,SAAS,cAAc;AAAA,MACtD;AAAA,IACF;AAAA,EACF,IACA,CAAC;AACL;","names":[]}
@@ -1,2 +0,0 @@
1
-
2
- export { }
@@ -1,409 +0,0 @@
1
- import {
2
- describe,
3
- globalExpect,
4
- it
5
- } from "../chunk-LQQAQ4PJ.js";
6
- import {
7
- eslintConfig
8
- } from "../chunk-D3SKAD35.js";
9
- import "../chunk-GMXUFYEC.js";
10
- import "../chunk-LITSWCYQ.js";
11
- import "../chunk-H2WBGBO4.js";
12
- import "../chunk-2DEE5IMM.js";
13
- import "../chunk-26SVGV32.js";
14
- import "../chunk-IDOXOS33.js";
15
- import "../chunk-V34MGXE7.js";
16
- import "../chunk-3A7OYQSX.js";
17
- import "../chunk-PHFQMAHS.js";
18
- import "../chunk-67MZ7HGN.js";
19
- import "../chunk-ZOCL6XIB.js";
20
- import "../chunk-MICOVBJ4.js";
21
- import "../chunk-XCPOAYGQ.js";
22
- import "../chunk-67I7QCZW.js";
23
- import "../chunk-3SHRYTUT.js";
24
- import "../chunk-4JICVSDT.js";
25
- import {
26
- configNames
27
- } from "../chunk-LODDGOPW.js";
28
- import "../chunk-7D4SUZUM.js";
29
-
30
- // src/eslint/index.test.ts
31
- describe("eslintConfig", () => {
32
- describe("default configuration", () => {
33
- it("returns expected default configs", () => {
34
- const config = eslintConfig();
35
- const names = config.map((c) => c.name);
36
- const expectedConfigs = [
37
- configNames.ignores,
38
- configNames.base,
39
- configNames.jsdoc,
40
- configNames.typescript,
41
- configNames.perfectionist,
42
- configNames.testing,
43
- configNames.preferArrowFunction,
44
- configNames.disableTypeChecked,
45
- // the disable type checked config comes with an additional un-named config
46
- void 0
47
- ];
48
- globalExpect(config).toBeInstanceOf(Array);
49
- expectedConfigs.forEach((expectedName) => {
50
- globalExpect(names).toContain(expectedName);
51
- });
52
- });
53
- });
54
- describe("function style options", () => {
55
- it("applies 'arrow' function style by default", () => {
56
- const config = eslintConfig();
57
- const baseConfig = config.find((c) => c.name === configNames.base);
58
- globalExpect(baseConfig?.rules?.["func-style"]).toBe("off");
59
- });
60
- it("applies 'declaration' function style when specified", () => {
61
- const config = eslintConfig({ functionStyle: "declaration" });
62
- const baseConfig = config.find((c) => c.name === configNames.base);
63
- globalExpect(baseConfig?.rules?.["func-style"]).toStrictEqual([
64
- "warn",
65
- "declaration",
66
- { allowArrowFunctions: true }
67
- ]);
68
- });
69
- it("applies 'expression' function style when specified", () => {
70
- const config = eslintConfig({ functionStyle: "expression" });
71
- const baseConfig = config.find((c) => c.name === configNames.base);
72
- globalExpect(baseConfig?.rules?.["func-style"]).toStrictEqual([
73
- "warn",
74
- "expression",
75
- { allowArrowFunctions: true }
76
- ]);
77
- });
78
- it("disables function style rule when 'off' is specified", () => {
79
- const config = eslintConfig({ functionStyle: "off" });
80
- const baseConfig = config.find((c) => c.name === configNames.base);
81
- globalExpect(baseConfig?.rules?.["func-style"]).toBe("off");
82
- });
83
- it("applies function style to React component definition when React is enabled", () => {
84
- const config = eslintConfig({
85
- functionStyle: "declaration",
86
- react: true
87
- });
88
- const reactConfig = config.find((c) => c.name === configNames.react);
89
- globalExpect(
90
- reactConfig?.rules?.["react/function-component-definition"]
91
- ).toStrictEqual([
92
- "warn",
93
- {
94
- namedComponents: "function-declaration",
95
- unnamedComponents: "function-expression"
96
- }
97
- ]);
98
- });
99
- });
100
- describe("react configuration", () => {
101
- it("includes React config when enabled", () => {
102
- const config = eslintConfig({ react: true });
103
- globalExpect(config.some((c) => c.name === configNames.react)).toBe(true);
104
- });
105
- it("includes React compiler config by default when React is enabled", () => {
106
- const config = eslintConfig({ react: true });
107
- globalExpect(config.some((c) => c.name === configNames.reactCompiler)).toBe(
108
- true
109
- );
110
- });
111
- it("excludes React compiler config when React is enabled but React compiler is not", () => {
112
- const config = eslintConfig({ react: { reactCompiler: false } });
113
- globalExpect(config.some((c) => c.name === configNames.reactCompiler)).toBe(
114
- false
115
- );
116
- });
117
- it("enables React with Next.js support when next is true", () => {
118
- const config = eslintConfig({ react: { next: true } });
119
- const ignoresConfig = config[0];
120
- globalExpect(config.some((c) => c.name === configNames.react)).toBe(true);
121
- globalExpect(ignoresConfig?.ignores).toStrictEqual(
122
- globalExpect.arrayContaining([".next"])
123
- );
124
- });
125
- });
126
- describe("jSDoc configuration", () => {
127
- it("includes JSDoc config by default with requirements disabled", () => {
128
- const config = eslintConfig();
129
- const jsdocConfig = config.find((c) => c.name === configNames.jsdoc);
130
- globalExpect(jsdocConfig).toBeDefined();
131
- globalExpect(jsdocConfig?.rules?.["jsdoc/require-jsdoc"]).toBe("off");
132
- });
133
- it("excludes JSDoc config entirely when disabled", () => {
134
- const config = eslintConfig({ jsdoc: false });
135
- globalExpect(config.some((c) => c.name === configNames.jsdoc)).toBe(false);
136
- });
137
- it("enables JSDoc requirements when configured", () => {
138
- const config = eslintConfig({ jsdoc: { requireJsdoc: true } });
139
- const jsdocConfig = config.find((c) => c.name === configNames.jsdoc);
140
- globalExpect(jsdocConfig).toBeDefined();
141
- globalExpect(jsdocConfig?.rules?.["jsdoc/require-jsdoc"]).toStrictEqual(
142
- globalExpect.arrayContaining(["warn"])
143
- );
144
- });
145
- it("keeps JSDoc requirements disabled when explicitly set", () => {
146
- const config = eslintConfig({ jsdoc: { requireJsdoc: false } });
147
- const jsdocConfig = config.find((c) => c.name === configNames.jsdoc);
148
- globalExpect(jsdocConfig).toBeDefined();
149
- globalExpect(jsdocConfig?.rules?.["jsdoc/require-jsdoc"]).toBeDefined();
150
- });
151
- });
152
- describe("optional configurations", () => {
153
- it("excludes TypeScript config when disabled", () => {
154
- const config = eslintConfig({ typescript: false });
155
- globalExpect(config.some((c) => c.name === configNames.typescript)).toBe(false);
156
- });
157
- it("excludes sorting config when disabled", () => {
158
- const config = eslintConfig({ sorting: false });
159
- globalExpect(config.some((c) => c.name === configNames.perfectionist)).toBe(
160
- false
161
- );
162
- });
163
- });
164
- describe("ignore patterns", () => {
165
- it("applies custom ignores", () => {
166
- const customIgnores = ["*.test.ts", "*.spec.ts"];
167
- const config = eslintConfig({ ignores: customIgnores });
168
- globalExpect(config[0]?.ignores).toStrictEqual(
169
- globalExpect.arrayContaining(customIgnores)
170
- );
171
- });
172
- it("handles empty ignores array", () => {
173
- const config = eslintConfig({ ignores: [] });
174
- const ignoresConfig = config[0];
175
- globalExpect(ignoresConfig?.ignores?.length).toBeGreaterThan(0);
176
- globalExpect(ignoresConfig?.ignores).toStrictEqual(
177
- globalExpect.arrayContaining(["**/node_modules/", "**/dist/"])
178
- );
179
- });
180
- it("adds '.next' to ignores when `react.next` is true", () => {
181
- const config = eslintConfig({ react: { next: true } });
182
- const ignoresConfig = config[0];
183
- globalExpect(ignoresConfig?.ignores).toStrictEqual(
184
- globalExpect.arrayContaining([".next"])
185
- );
186
- });
187
- });
188
- describe("additional config objects", () => {
189
- it("includes additional config objects in the returned array", () => {
190
- const additionalConfig = {
191
- name: "custom-config",
192
- rules: {
193
- "no-console": 2
194
- }
195
- };
196
- const config = eslintConfig({}, additionalConfig);
197
- globalExpect(config).toContainEqual(additionalConfig);
198
- });
199
- it("appends multiple additional config objects to the returned array", () => {
200
- const additionalConfig1 = {
201
- name: "custom-config-1",
202
- rules: {
203
- "custom-rule-1": "error"
204
- }
205
- };
206
- const additionalConfig2 = {
207
- name: "custom-config-2",
208
- rules: {
209
- "custom-rule-2": "warn"
210
- }
211
- };
212
- const config = eslintConfig({}, additionalConfig1, additionalConfig2);
213
- globalExpect(config).toContainEqual(additionalConfig1);
214
- globalExpect(config).toContainEqual(additionalConfig2);
215
- });
216
- it("maintains the order of additional config objects", () => {
217
- const additionalConfig1 = { name: "custom-config-1" };
218
- const additionalConfig2 = { name: "custom-config-2" };
219
- const config = eslintConfig({}, additionalConfig1, additionalConfig2);
220
- const index1 = config.findIndex((c) => c.name === "custom-config-1");
221
- const index2 = config.findIndex((c) => c.name === "custom-config-2");
222
- globalExpect(index1).toBeGreaterThanOrEqual(0);
223
- globalExpect(index2).toBeGreaterThanOrEqual(0);
224
- globalExpect(index1).toBeLessThan(index2);
225
- });
226
- });
227
- describe("prefer arrow functions configuration", () => {
228
- it("includes prefer-arrow-function config when function style is 'arrow'", () => {
229
- const config = eslintConfig({ functionStyle: "arrow" });
230
- globalExpect(
231
- config.some((c) => c.name === configNames.preferArrowFunction)
232
- ).toBe(true);
233
- });
234
- it("excludes prefer-arrow-function config when function style is not 'arrow'", () => {
235
- const config = eslintConfig({ functionStyle: "declaration" });
236
- globalExpect(
237
- config.some((c) => c.name === configNames.preferArrowFunction)
238
- ).toBe(false);
239
- });
240
- it("applies expected rules in prefer-arrow-function config", () => {
241
- const config = eslintConfig({ functionStyle: "arrow" });
242
- const arrowConfig = config.find(
243
- (c) => c.name === configNames.preferArrowFunction
244
- );
245
- globalExpect(arrowConfig).toBeDefined();
246
- globalExpect(
247
- arrowConfig?.rules?.["prefer-arrow-functions/prefer-arrow-functions"]
248
- ).toStrictEqual([
249
- "warn",
250
- {
251
- returnStyle: "unchanged",
252
- singleReturnOnly: false
253
- }
254
- ]);
255
- });
256
- it("includes prefer-arrow-function config by default", () => {
257
- const config = eslintConfig();
258
- globalExpect(
259
- config.some((c) => c.name === configNames.preferArrowFunction)
260
- ).toBe(true);
261
- });
262
- });
263
- describe("edge cases", () => {
264
- it("works when all optional features are disabled", () => {
265
- const config = eslintConfig({
266
- jsdoc: false,
267
- react: false,
268
- sorting: false,
269
- testing: false,
270
- typescript: false
271
- });
272
- const names = config.map((c) => c.name);
273
- globalExpect(names).toContain(configNames.base);
274
- globalExpect(names).toContain(configNames.ignores);
275
- globalExpect(names).not.toContain(configNames.typescript);
276
- globalExpect(names).not.toContain(configNames.react);
277
- globalExpect(names).not.toContain(configNames.reactCompiler);
278
- globalExpect(names).not.toContain(configNames.jsdoc);
279
- globalExpect(names).not.toContain(configNames.perfectionist);
280
- globalExpect(names).not.toContain(configNames.testing);
281
- });
282
- it("handles React options without TypeScript", () => {
283
- const config = eslintConfig({
284
- react: true,
285
- typescript: false
286
- });
287
- const reactConfig = config.find((c) => c.name === configNames.react);
288
- globalExpect(reactConfig).toBeDefined();
289
- globalExpect(reactConfig?.rules?.["react/prop-types"]).toBe("warn");
290
- });
291
- });
292
- describe("testing configuration", () => {
293
- it("includes vitest config by default", () => {
294
- const config = eslintConfig();
295
- globalExpect(config.some((c) => c.name === configNames.testing)).toBe(true);
296
- });
297
- it("excludes testing config when testing is false", () => {
298
- const config = eslintConfig({ testing: false });
299
- globalExpect(config.some((c) => c.name === configNames.testing)).toBe(false);
300
- });
301
- it("applies default testing configuration when testing is not provided", () => {
302
- const config = eslintConfig();
303
- const testingConfigObj = config.find(
304
- (c) => c.name === configNames.testing
305
- );
306
- globalExpect(testingConfigObj).toBeDefined();
307
- globalExpect(testingConfigObj?.files).toStrictEqual([
308
- "**/*.{test,spec}.{ts,tsx,js,jsx}"
309
- ]);
310
- globalExpect(testingConfigObj?.languageOptions?.globals).toBeDefined();
311
- globalExpect(testingConfigObj?.rules?.["jest/padding-around-test-blocks"]).toBe(
312
- "warn"
313
- );
314
- });
315
- it("applies custom testing configuration when provided", () => {
316
- const customFiles = ["**/*.spec.{ts,tsx}"];
317
- const config = eslintConfig({
318
- testing: {
319
- filenamePattern: "spec",
320
- files: customFiles,
321
- framework: "vitest",
322
- itOrTest: "test"
323
- }
324
- });
325
- const testingConfigObj = config.find(
326
- (c) => c.name === configNames.testing
327
- );
328
- globalExpect(testingConfigObj).toBeDefined();
329
- globalExpect(testingConfigObj?.files).toStrictEqual(customFiles);
330
- });
331
- it("merges custom testing configuration with defaults", () => {
332
- const config = eslintConfig({
333
- testing: {
334
- itOrTest: "test"
335
- }
336
- });
337
- const testingConfigObj = config.find(
338
- (c) => c.name === configNames.testing
339
- );
340
- globalExpect(testingConfigObj).toBeDefined();
341
- globalExpect(testingConfigObj?.files).toStrictEqual([
342
- "**/*.{test,spec}.{ts,tsx,js,jsx}"
343
- ]);
344
- });
345
- it("applies jest framework when specified", () => {
346
- const config = eslintConfig({
347
- testing: {
348
- framework: "jest"
349
- }
350
- });
351
- const testingConfigObj = config.find(
352
- (c) => c.name === configNames.testing
353
- );
354
- globalExpect(testingConfigObj).toBeDefined();
355
- globalExpect(testingConfigObj?.languageOptions?.globals).toBeDefined();
356
- globalExpect(testingConfigObj?.rules?.["jest/expect-expect"]).toBeDefined();
357
- });
358
- it("applies node framework when specified", () => {
359
- const config = eslintConfig({
360
- testing: {
361
- framework: "node"
362
- }
363
- });
364
- const testingConfigObj = config.find(
365
- (c) => c.name === configNames.testing
366
- );
367
- globalExpect(testingConfigObj).toBeDefined();
368
- globalExpect(testingConfigObj?.settings).toStrictEqual({
369
- jest: {
370
- globalPackage: "node:test"
371
- }
372
- });
373
- });
374
- it("applies bun framework when specified", () => {
375
- const config = eslintConfig({
376
- testing: {
377
- framework: "bun"
378
- }
379
- });
380
- const testingConfigObj = config.find(
381
- (c) => c.name === configNames.testing
382
- );
383
- globalExpect(testingConfigObj).toBeDefined();
384
- globalExpect(testingConfigObj?.settings).toStrictEqual({
385
- jest: {
386
- globalPackage: "bun:test"
387
- }
388
- });
389
- });
390
- it("disables formatting rules when formattingRules is false", () => {
391
- const config = eslintConfig({
392
- testing: {
393
- formattingRules: false
394
- }
395
- });
396
- const testingConfigObj = config.find(
397
- (c) => c.name === configNames.testing
398
- );
399
- globalExpect(testingConfigObj).toBeDefined();
400
- globalExpect(
401
- testingConfigObj?.rules?.["jest/padding-around-test-blocks"]
402
- ).toBeUndefined();
403
- globalExpect(
404
- testingConfigObj?.rules?.["jest/padding-around-describe-blocks"]
405
- ).toBeUndefined();
406
- });
407
- });
408
- });
409
- //# sourceMappingURL=index.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/eslint/index.test.ts"],"sourcesContent":["import type { Linter } from \"eslint\";\n\nimport { describe, expect, it } from \"vitest\";\n\nimport { configNames } from \"./constants.js\";\nimport { eslintConfig } from \"./index.js\";\n\ndescribe(\"eslintConfig\", () => {\n describe(\"default configuration\", () => {\n it(\"returns expected default configs\", () => {\n const config = eslintConfig();\n const names = config.map((c) => c.name);\n const expectedConfigs = [\n configNames.ignores,\n configNames.base,\n configNames.jsdoc,\n configNames.typescript,\n configNames.perfectionist,\n configNames.testing,\n configNames.preferArrowFunction,\n configNames.disableTypeChecked,\n // the disable type checked config comes with an additional un-named config\n undefined,\n ];\n\n expect(config).toBeInstanceOf(Array);\n\n expectedConfigs.forEach((expectedName) => {\n expect(names).toContain(expectedName);\n });\n });\n });\n\n describe(\"function style options\", () => {\n it(\"applies 'arrow' function style by default\", () => {\n const config = eslintConfig();\n const baseConfig = config.find((c) => c.name === configNames.base);\n\n // it is enforced by prefer-arrow-functions when functionStyle is \"arrow\"\n expect(baseConfig?.rules?.[\"func-style\"]).toBe(\"off\");\n });\n\n it(\"applies 'declaration' function style when specified\", () => {\n const config = eslintConfig({ functionStyle: \"declaration\" });\n const baseConfig = config.find((c) => c.name === configNames.base);\n\n expect(baseConfig?.rules?.[\"func-style\"]).toStrictEqual([\n \"warn\",\n \"declaration\",\n { allowArrowFunctions: true },\n ]);\n });\n\n it(\"applies 'expression' function style when specified\", () => {\n const config = eslintConfig({ functionStyle: \"expression\" });\n const baseConfig = config.find((c) => c.name === configNames.base);\n\n expect(baseConfig?.rules?.[\"func-style\"]).toStrictEqual([\n \"warn\",\n \"expression\",\n { allowArrowFunctions: true },\n ]);\n });\n\n it(\"disables function style rule when 'off' is specified\", () => {\n const config = eslintConfig({ functionStyle: \"off\" });\n const baseConfig = config.find((c) => c.name === configNames.base);\n\n expect(baseConfig?.rules?.[\"func-style\"]).toBe(\"off\");\n });\n\n it(\"applies function style to React component definition when React is enabled\", () => {\n const config = eslintConfig({\n functionStyle: \"declaration\",\n react: true,\n });\n const reactConfig = config.find((c) => c.name === configNames.react);\n\n expect(\n reactConfig?.rules?.[\"react/function-component-definition\"],\n ).toStrictEqual([\n \"warn\",\n {\n namedComponents: \"function-declaration\",\n unnamedComponents: \"function-expression\",\n },\n ]);\n });\n });\n\n describe(\"react configuration\", () => {\n it(\"includes React config when enabled\", () => {\n const config = eslintConfig({ react: true });\n\n expect(config.some((c) => c.name === configNames.react)).toBe(true);\n });\n\n it(\"includes React compiler config by default when React is enabled\", () => {\n const config = eslintConfig({ react: true });\n\n expect(config.some((c) => c.name === configNames.reactCompiler)).toBe(\n true,\n );\n });\n\n it(\"excludes React compiler config when React is enabled but React compiler is not\", () => {\n const config = eslintConfig({ react: { reactCompiler: false } });\n\n expect(config.some((c) => c.name === configNames.reactCompiler)).toBe(\n false,\n );\n });\n\n it(\"enables React with Next.js support when next is true\", () => {\n const config = eslintConfig({ react: { next: true } });\n const ignoresConfig = config[0];\n\n expect(config.some((c) => c.name === configNames.react)).toBe(true);\n expect(ignoresConfig?.ignores).toStrictEqual(\n expect.arrayContaining([\".next\"]),\n );\n });\n });\n\n describe(\"jSDoc configuration\", () => {\n it(\"includes JSDoc config by default with requirements disabled\", () => {\n const config = eslintConfig();\n const jsdocConfig = config.find((c) => c.name === configNames.jsdoc);\n\n expect(jsdocConfig).toBeDefined();\n expect(jsdocConfig?.rules?.[\"jsdoc/require-jsdoc\"]).toBe(\"off\");\n });\n\n it(\"excludes JSDoc config entirely when disabled\", () => {\n const config = eslintConfig({ jsdoc: false });\n\n expect(config.some((c) => c.name === configNames.jsdoc)).toBe(false);\n });\n\n it(\"enables JSDoc requirements when configured\", () => {\n const config = eslintConfig({ jsdoc: { requireJsdoc: true } });\n const jsdocConfig = config.find((c) => c.name === configNames.jsdoc);\n\n expect(jsdocConfig).toBeDefined();\n expect(jsdocConfig?.rules?.[\"jsdoc/require-jsdoc\"]).toStrictEqual(\n expect.arrayContaining([\"warn\"]),\n );\n });\n\n it(\"keeps JSDoc requirements disabled when explicitly set\", () => {\n const config = eslintConfig({ jsdoc: { requireJsdoc: false } });\n const jsdocConfig = config.find((c) => c.name === configNames.jsdoc);\n\n expect(jsdocConfig).toBeDefined();\n expect(jsdocConfig?.rules?.[\"jsdoc/require-jsdoc\"]).toBeDefined();\n });\n });\n\n describe(\"optional configurations\", () => {\n it(\"excludes TypeScript config when disabled\", () => {\n const config = eslintConfig({ typescript: false });\n\n expect(config.some((c) => c.name === configNames.typescript)).toBe(false);\n });\n\n it(\"excludes sorting config when disabled\", () => {\n const config = eslintConfig({ sorting: false });\n\n expect(config.some((c) => c.name === configNames.perfectionist)).toBe(\n false,\n );\n });\n });\n\n describe(\"ignore patterns\", () => {\n it(\"applies custom ignores\", () => {\n const customIgnores = [\"*.test.ts\", \"*.spec.ts\"];\n const config = eslintConfig({ ignores: customIgnores });\n\n expect(config[0]?.ignores).toStrictEqual(\n expect.arrayContaining(customIgnores),\n );\n });\n\n it(\"handles empty ignores array\", () => {\n const config = eslintConfig({ ignores: [] });\n const ignoresConfig = config[0];\n\n // Should still include default ignores\n expect(ignoresConfig?.ignores?.length).toBeGreaterThan(0);\n expect(ignoresConfig?.ignores).toStrictEqual(\n expect.arrayContaining([\"**/node_modules/\", \"**/dist/\"]),\n );\n });\n\n it(\"adds '.next' to ignores when `react.next` is true\", () => {\n const config = eslintConfig({ react: { next: true } });\n const ignoresConfig = config[0];\n\n expect(ignoresConfig?.ignores).toStrictEqual(\n expect.arrayContaining([\".next\"]),\n );\n });\n });\n\n describe(\"additional config objects\", () => {\n it(\"includes additional config objects in the returned array\", () => {\n const additionalConfig: Linter.Config = {\n name: \"custom-config\",\n rules: {\n \"no-console\": 2,\n },\n };\n\n const config = eslintConfig({}, additionalConfig);\n\n expect(config).toContainEqual(additionalConfig);\n });\n\n it(\"appends multiple additional config objects to the returned array\", () => {\n const additionalConfig1: Linter.Config = {\n name: \"custom-config-1\",\n rules: {\n \"custom-rule-1\": \"error\",\n },\n };\n\n const additionalConfig2: Linter.Config = {\n name: \"custom-config-2\",\n rules: {\n \"custom-rule-2\": \"warn\",\n },\n };\n\n const config = eslintConfig({}, additionalConfig1, additionalConfig2);\n\n expect(config).toContainEqual(additionalConfig1);\n expect(config).toContainEqual(additionalConfig2);\n });\n\n it(\"maintains the order of additional config objects\", () => {\n const additionalConfig1: Linter.Config = { name: \"custom-config-1\" };\n const additionalConfig2: Linter.Config = { name: \"custom-config-2\" };\n\n const config = eslintConfig({}, additionalConfig1, additionalConfig2);\n const index1 = config.findIndex((c) => c.name === \"custom-config-1\");\n const index2 = config.findIndex((c) => c.name === \"custom-config-2\");\n\n expect(index1).toBeGreaterThanOrEqual(0);\n expect(index2).toBeGreaterThanOrEqual(0);\n expect(index1).toBeLessThan(index2);\n });\n });\n\n describe(\"prefer arrow functions configuration\", () => {\n it(\"includes prefer-arrow-function config when function style is 'arrow'\", () => {\n const config = eslintConfig({ functionStyle: \"arrow\" });\n\n expect(\n config.some((c) => c.name === configNames.preferArrowFunction),\n ).toBe(true);\n });\n\n it(\"excludes prefer-arrow-function config when function style is not 'arrow'\", () => {\n const config = eslintConfig({ functionStyle: \"declaration\" });\n\n expect(\n config.some((c) => c.name === configNames.preferArrowFunction),\n ).toBe(false);\n });\n\n it(\"applies expected rules in prefer-arrow-function config\", () => {\n const config = eslintConfig({ functionStyle: \"arrow\" });\n const arrowConfig = config.find(\n (c) => c.name === configNames.preferArrowFunction,\n );\n\n expect(arrowConfig).toBeDefined();\n expect(\n arrowConfig?.rules?.[\"prefer-arrow-functions/prefer-arrow-functions\"],\n ).toStrictEqual([\n \"warn\",\n {\n returnStyle: \"unchanged\",\n singleReturnOnly: false,\n },\n ]);\n });\n\n it(\"includes prefer-arrow-function config by default\", () => {\n const config = eslintConfig();\n\n expect(\n config.some((c) => c.name === configNames.preferArrowFunction),\n ).toBe(true);\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"works when all optional features are disabled\", () => {\n const config = eslintConfig({\n jsdoc: false,\n react: false,\n sorting: false,\n testing: false,\n typescript: false,\n });\n\n const names = config.map((c) => c.name);\n\n expect(names).toContain(configNames.base);\n expect(names).toContain(configNames.ignores);\n\n // These should be excluded\n expect(names).not.toContain(configNames.typescript);\n expect(names).not.toContain(configNames.react);\n expect(names).not.toContain(configNames.reactCompiler);\n expect(names).not.toContain(configNames.jsdoc);\n expect(names).not.toContain(configNames.perfectionist);\n expect(names).not.toContain(configNames.testing);\n });\n\n it(\"handles React options without TypeScript\", () => {\n const config = eslintConfig({\n react: true,\n typescript: false,\n });\n\n const reactConfig = config.find((c) => c.name === configNames.react);\n\n // Should still include React configs\n expect(reactConfig).toBeDefined();\n // React config should be initialized with typescript=false\n expect(reactConfig?.rules?.[\"react/prop-types\"]).toBe(\"warn\");\n });\n });\n\n describe(\"testing configuration\", () => {\n it(\"includes vitest config by default\", () => {\n const config = eslintConfig();\n\n expect(config.some((c) => c.name === configNames.testing)).toBe(true);\n });\n\n it(\"excludes testing config when testing is false\", () => {\n const config = eslintConfig({ testing: false });\n\n expect(config.some((c) => c.name === configNames.testing)).toBe(false);\n });\n\n it(\"applies default testing configuration when testing is not provided\", () => {\n const config = eslintConfig();\n const testingConfigObj = config.find(\n (c) => c.name === configNames.testing,\n );\n\n expect(testingConfigObj).toBeDefined();\n expect(testingConfigObj?.files).toStrictEqual([\n \"**/*.{test,spec}.{ts,tsx,js,jsx}\",\n ]);\n // Default framework should be vitest\n expect(testingConfigObj?.languageOptions?.globals).toBeDefined();\n // Default formattingRules should be true\n expect(testingConfigObj?.rules?.[\"jest/padding-around-test-blocks\"]).toBe(\n \"warn\",\n );\n });\n\n it(\"applies custom testing configuration when provided\", () => {\n const customFiles = [\"**/*.spec.{ts,tsx}\"];\n const config = eslintConfig({\n testing: {\n filenamePattern: \"spec\",\n files: customFiles,\n framework: \"vitest\",\n itOrTest: \"test\",\n },\n });\n const testingConfigObj = config.find(\n (c) => c.name === configNames.testing,\n );\n\n expect(testingConfigObj).toBeDefined();\n expect(testingConfigObj?.files).toStrictEqual(customFiles);\n });\n\n it(\"merges custom testing configuration with defaults\", () => {\n const config = eslintConfig({\n testing: {\n itOrTest: \"test\",\n },\n });\n const testingConfigObj = config.find(\n (c) => c.name === configNames.testing,\n );\n\n expect(testingConfigObj).toBeDefined();\n // Should still have default files pattern\n expect(testingConfigObj?.files).toStrictEqual([\n \"**/*.{test,spec}.{ts,tsx,js,jsx}\",\n ]);\n });\n\n it(\"applies jest framework when specified\", () => {\n const config = eslintConfig({\n testing: {\n framework: \"jest\",\n },\n });\n const testingConfigObj = config.find(\n (c) => c.name === configNames.testing,\n );\n\n expect(testingConfigObj).toBeDefined();\n // Should have jest globals\n expect(testingConfigObj?.languageOptions?.globals).toBeDefined();\n // Should have jest rules\n expect(testingConfigObj?.rules?.[\"jest/expect-expect\"]).toBeDefined();\n });\n\n it(\"applies node framework when specified\", () => {\n const config = eslintConfig({\n testing: {\n framework: \"node\",\n },\n });\n const testingConfigObj = config.find(\n (c) => c.name === configNames.testing,\n );\n\n expect(testingConfigObj).toBeDefined();\n // Should have node:test settings\n expect(testingConfigObj?.settings).toStrictEqual({\n jest: {\n globalPackage: \"node:test\",\n },\n });\n });\n\n it(\"applies bun framework when specified\", () => {\n const config = eslintConfig({\n testing: {\n framework: \"bun\",\n },\n });\n const testingConfigObj = config.find(\n (c) => c.name === configNames.testing,\n );\n\n expect(testingConfigObj).toBeDefined();\n // Should have bun:test settings\n expect(testingConfigObj?.settings).toStrictEqual({\n jest: {\n globalPackage: \"bun:test\",\n },\n });\n });\n\n it(\"disables formatting rules when formattingRules is false\", () => {\n const config = eslintConfig({\n testing: {\n formattingRules: false,\n },\n });\n const testingConfigObj = config.find(\n (c) => c.name === configNames.testing,\n );\n\n expect(testingConfigObj).toBeDefined();\n // Formatting rules should be undefined\n expect(\n testingConfigObj?.rules?.[\"jest/padding-around-test-blocks\"],\n ).toBeUndefined();\n expect(\n testingConfigObj?.rules?.[\"jest/padding-around-describe-blocks\"],\n ).toBeUndefined();\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,2 +0,0 @@
1
-
2
- export { }
@@ -1,124 +0,0 @@
1
- import {
2
- describe,
3
- globalExpect,
4
- it
5
- } from "../../chunk-LQQAQ4PJ.js";
6
- import {
7
- testingConfig
8
- } from "../../chunk-V34MGXE7.js";
9
- import {
10
- jestRules
11
- } from "../../chunk-3A7OYQSX.js";
12
- import "../../chunk-PHFQMAHS.js";
13
- import {
14
- configNames
15
- } from "../../chunk-LODDGOPW.js";
16
- import "../../chunk-7D4SUZUM.js";
17
-
18
- // src/eslint/testing/config.test.ts
19
- import jest from "eslint-plugin-jest";
20
- import vitest from "eslint-plugin-vitest";
21
- describe("testingConfig", () => {
22
- it("returns an ESLint configuration object", () => {
23
- const config = testingConfig();
24
- globalExpect(config.name).toBe(configNames.testing);
25
- });
26
- it("replaces `files` with user provided files", () => {
27
- const config = testingConfig({
28
- files: ["some different stuff"]
29
- });
30
- globalExpect(config.files).toStrictEqual(["some different stuff"]);
31
- });
32
- it("honors `filenamePattern` for consistent-test-filename rule", () => {
33
- const config = testingConfig({
34
- filenamePattern: "spec"
35
- });
36
- globalExpect(config.rules?.["vitest/consistent-test-filename"]).toStrictEqual([
37
- "warn",
38
- {
39
- allTestPattern: ".*\\.(test|spec)\\.[tj]sx?$",
40
- pattern: ".*\\.spec\\.[tj]sx?$"
41
- }
42
- ]);
43
- });
44
- it("honors `itOrTest` with 'test' value", () => {
45
- const config = testingConfig({
46
- framework: "vitest",
47
- itOrTest: "test"
48
- });
49
- globalExpect(config.rules?.["vitest/consistent-test-it"]).toStrictEqual([
50
- "warn",
51
- { fn: "test", withinDescribe: "test" }
52
- ]);
53
- });
54
- it("honors `itOrTest` with 'it' value", () => {
55
- const config = testingConfig({
56
- framework: "vitest",
57
- itOrTest: "it"
58
- });
59
- globalExpect(config.rules?.["vitest/consistent-test-it"]).toStrictEqual([
60
- "warn",
61
- { fn: "it", withinDescribe: "it" }
62
- ]);
63
- });
64
- it("uses default values when no options are provided", () => {
65
- const config = testingConfig();
66
- globalExpect(config.rules?.["vitest/consistent-test-filename"]).toStrictEqual([
67
- "warn",
68
- {
69
- allTestPattern: ".*\\.(test|spec)\\.[tj]sx?$",
70
- pattern: ".*\\.test\\.[tj]sx?$"
71
- }
72
- ]);
73
- globalExpect(config.rules?.["vitest/consistent-test-it"]).toStrictEqual([
74
- "warn",
75
- { fn: "test", withinDescribe: "test" }
76
- ]);
77
- globalExpect(config.languageOptions?.globals).toStrictEqual({
78
- ...vitest.environments.env.globals
79
- });
80
- globalExpect(config.rules?.["jest/padding-around-test-blocks"]).toBe("warn");
81
- });
82
- it("configures jest framework when specified", () => {
83
- const config = testingConfig({
84
- framework: "jest",
85
- itOrTest: "test"
86
- });
87
- globalExpect(config.languageOptions?.globals).toStrictEqual(
88
- jest.environments.globals.globals
89
- );
90
- globalExpect(config.rules).toMatchObject(jestRules("test"));
91
- globalExpect(config.settings).toBeUndefined();
92
- });
93
- it("configures node framework when specified", () => {
94
- const config = testingConfig({
95
- framework: "node"
96
- });
97
- globalExpect(config.settings).toStrictEqual({
98
- jest: {
99
- globalPackage: "node:test"
100
- }
101
- });
102
- });
103
- it("configures bun framework when specified", () => {
104
- const config = testingConfig({
105
- framework: "bun"
106
- });
107
- globalExpect(config.settings).toStrictEqual({
108
- jest: {
109
- globalPackage: "bun:test"
110
- }
111
- });
112
- });
113
- it("disables formatting rules when formattingRules is false", () => {
114
- const config = testingConfig({
115
- formattingRules: false
116
- });
117
- globalExpect(config.rules?.["jest/padding-around-test-blocks"]).toBeUndefined();
118
- globalExpect(
119
- config.rules?.["jest/padding-around-describe-blocks"]
120
- ).toBeUndefined();
121
- globalExpect(config.rules?.["jest/padding-around-expect-groups"]).toBeUndefined();
122
- });
123
- });
124
- //# sourceMappingURL=config.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/eslint/testing/config.test.ts"],"sourcesContent":["import jest from \"eslint-plugin-jest\";\nimport vitest from \"eslint-plugin-vitest\";\nimport { describe, expect, it } from \"vitest\";\n\nimport type { EslintConfigObject } from \"../types.js\";\n\nimport { configNames } from \"../constants.js\";\nimport { testingConfig } from \"./config.js\";\nimport { jestRules } from \"./jestRules.js\";\n\ndescribe(\"testingConfig\", () => {\n it(\"returns an ESLint configuration object\", () => {\n const config: EslintConfigObject = testingConfig();\n\n expect(config.name).toBe(configNames.testing);\n });\n\n it(\"replaces `files` with user provided files\", () => {\n const config: EslintConfigObject = testingConfig({\n files: [\"some different stuff\"],\n });\n\n expect(config.files).toStrictEqual([\"some different stuff\"]);\n });\n\n it(\"honors `filenamePattern` for consistent-test-filename rule\", () => {\n const config: EslintConfigObject = testingConfig({\n filenamePattern: \"spec\",\n });\n\n expect(config.rules?.[\"vitest/consistent-test-filename\"]).toStrictEqual([\n \"warn\",\n {\n allTestPattern: \".*\\\\.(test|spec)\\\\.[tj]sx?$\",\n pattern: \".*\\\\.spec\\\\.[tj]sx?$\",\n },\n ]);\n });\n\n it(\"honors `itOrTest` with 'test' value\", () => {\n const config: EslintConfigObject = testingConfig({\n framework: \"vitest\",\n itOrTest: \"test\",\n });\n\n expect(config.rules?.[\"vitest/consistent-test-it\"]).toStrictEqual([\n \"warn\",\n { fn: \"test\", withinDescribe: \"test\" },\n ]);\n });\n\n it(\"honors `itOrTest` with 'it' value\", () => {\n const config: EslintConfigObject = testingConfig({\n framework: \"vitest\",\n itOrTest: \"it\",\n });\n\n expect(config.rules?.[\"vitest/consistent-test-it\"]).toStrictEqual([\n \"warn\",\n { fn: \"it\", withinDescribe: \"it\" },\n ]);\n });\n\n it(\"uses default values when no options are provided\", () => {\n const config: EslintConfigObject = testingConfig();\n\n expect(config.rules?.[\"vitest/consistent-test-filename\"]).toStrictEqual([\n \"warn\",\n {\n allTestPattern: \".*\\\\.(test|spec)\\\\.[tj]sx?$\",\n pattern: \".*\\\\.test\\\\.[tj]sx?$\",\n },\n ]);\n expect(config.rules?.[\"vitest/consistent-test-it\"]).toStrictEqual([\n \"warn\",\n { fn: \"test\", withinDescribe: \"test\" },\n ]);\n // Default framework should be vitest\n expect(config.languageOptions?.globals).toStrictEqual({\n ...vitest.environments.env.globals,\n });\n // Default formattingRules should be true\n expect(config.rules?.[\"jest/padding-around-test-blocks\"]).toBe(\"warn\");\n });\n\n it(\"configures jest framework when specified\", () => {\n const config: EslintConfigObject = testingConfig({\n framework: \"jest\",\n itOrTest: \"test\",\n });\n\n expect(config.languageOptions?.globals).toStrictEqual(\n jest.environments.globals.globals,\n );\n expect(config.rules).toMatchObject(jestRules(\"test\"));\n expect(config.settings).toBeUndefined();\n });\n\n it(\"configures node framework when specified\", () => {\n const config: EslintConfigObject = testingConfig({\n framework: \"node\",\n });\n\n expect(config.settings).toStrictEqual({\n jest: {\n globalPackage: \"node:test\",\n },\n });\n });\n\n it(\"configures bun framework when specified\", () => {\n const config: EslintConfigObject = testingConfig({\n framework: \"bun\",\n });\n\n expect(config.settings).toStrictEqual({\n jest: {\n globalPackage: \"bun:test\",\n },\n });\n });\n\n it(\"disables formatting rules when formattingRules is false\", () => {\n const config: EslintConfigObject = testingConfig({\n formattingRules: false,\n });\n\n expect(config.rules?.[\"jest/padding-around-test-blocks\"]).toBeUndefined();\n expect(\n config.rules?.[\"jest/padding-around-describe-blocks\"],\n ).toBeUndefined();\n expect(config.rules?.[\"jest/padding-around-expect-groups\"]).toBeUndefined();\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,8 +0,0 @@
1
- import {
2
- jestRules
3
- } from "../../chunk-3A7OYQSX.js";
4
- import "../../chunk-7D4SUZUM.js";
5
- export {
6
- jestRules
7
- };
8
- //# sourceMappingURL=jestRules.js.map