eslint-config-functype 2.0.1 → 2.0.3

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/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # eslint-config-functype
2
+
3
+ Curated ESLint flat config for functional TypeScript with [functype](https://github.com/jordanburke/functype). Composes rules from `eslint-plugin-functional`, `typescript-eslint`, `prettier`, and `simple-import-sort` into opinionated `recommended` and `strict` presets.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -D eslint-config-functype eslint eslint-plugin-functional @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-plugin-prettier prettier eslint-plugin-simple-import-sort
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```js
14
+ // eslint.config.mjs
15
+ import recommended from "eslint-config-functype/recommended"
16
+ import testOverrides from "eslint-config-functype/test-overrides"
17
+
18
+ export default [
19
+ recommended,
20
+ testOverrides, // relaxes functional rules for test files
21
+ ]
22
+ ```
23
+
24
+ ### Strict mode
25
+
26
+ ```js
27
+ import strict from "eslint-config-functype/strict"
28
+ import testOverrides from "eslint-config-functype/test-overrides"
29
+
30
+ export default [strict, testOverrides]
31
+ ```
32
+
33
+ ## Configs
34
+
35
+ ### `recommended`
36
+
37
+ - `prefer-const`, `no-var`, `no-throw-literal`
38
+ - `@typescript-eslint/consistent-type-imports`, `no-explicit-any`, `no-floating-promises`, `await-thenable`
39
+ - `functional/no-let`, `functional/immutable-data` (warn), `functional/no-throw-statements` (warn, allows reject)
40
+ - `functional/prefer-immutable-types` is **off** - functype types are immutable by design
41
+ - Prettier formatting and import sorting
42
+
43
+ ### `strict`
44
+
45
+ Everything in `recommended` plus:
46
+
47
+ - `functional/no-loop-statements` (error)
48
+ - `functional/immutable-data` (error)
49
+ - `functional/prefer-immutable-types` (warn)
50
+ - `@typescript-eslint/explicit-function-return-type` (error)
51
+ - `@typescript-eslint/strict-boolean-expressions` (error, default strict)
52
+
53
+ ### `test-overrides`
54
+
55
+ Disables `functional/no-let`, `immutable-data`, `no-throw-statements`, and `no-try-statements` for test files (`*.test.ts`, `*.spec.ts`, `test/**`, `tests/**`, `__tests__/**`).
56
+
57
+ ## CLI
58
+
59
+ ```bash
60
+ npx functype-list-rules # list all configured rules
61
+ npx functype-list-rules --verbose # with rule details
62
+ npx functype-list-rules --check-deps # verify peer dependencies
63
+ ```
64
+
65
+ ## License
66
+
67
+ MIT
@@ -51,7 +51,7 @@ declare const _default: {
51
51
  "functional/no-mixed-types": string;
52
52
  "functional/functional-parameters": string;
53
53
  "functional/no-throw-statements": (string | {
54
- allowToRejectWith: boolean;
54
+ allowToRejectPromises: boolean;
55
55
  })[];
56
56
  "functional/no-try-statements": (string | {
57
57
  allowCatch: boolean;
@@ -60,7 +60,7 @@ var recommended_default = {
60
60
  "functional/prefer-immutable-types": "off",
61
61
  "functional/no-mixed-types": "off",
62
62
  "functional/functional-parameters": "off",
63
- "functional/no-throw-statements": ["warn", { allowToRejectWith: true }],
63
+ "functional/no-throw-statements": ["warn", { allowToRejectPromises: true }],
64
64
  "functional/no-try-statements": ["warn", { allowCatch: true }],
65
65
  "functional/no-conditional-statements": "off",
66
66
  "functional/no-expression-statements": "off",
@@ -1 +1 @@
1
- {"version":3,"file":"recommended.js","names":[],"sources":["../../src/configs/recommended.ts"],"sourcesContent":["import {\n createValidationError,\n shouldValidateDependencies,\n validatePeerDependencies,\n} from \"../utils/dependency-validator\"\n\n// Validate peer dependencies on config load\nif (shouldValidateDependencies()) {\n const result = validatePeerDependencies()\n if (!result.isValid) {\n throw createValidationError(result)\n }\n\n // Log warnings for missing optional dependencies\n if (result.warnings.length > 0) {\n console.warn(\"\\n⚠️ eslint-config-functype warnings:\")\n result.warnings.forEach((warning) => console.warn(` ${warning}`))\n console.warn(\"\")\n }\n}\n\n// ESLint 9.x Flat Config Format\n// Complete functional TypeScript config with formatting and import organization\nexport default {\n name: \"functype/recommended\",\n rules: {\n // Core JavaScript immutability\n \"prefer-const\": \"error\",\n \"no-var\": \"error\",\n \"no-throw-literal\": \"error\",\n \"no-mixed-spaces-and-tabs\": \"error\",\n \"no-extra-semi\": \"error\",\n \"object-shorthand\": \"error\",\n \"prefer-template\": \"error\",\n \"prefer-destructuring\": [\n \"error\",\n {\n array: false,\n object: true,\n },\n ],\n\n // TypeScript functional patterns (when @typescript-eslint is available)\n \"@typescript-eslint/consistent-type-imports\": \"error\",\n \"@typescript-eslint/no-explicit-any\": \"error\",\n \"@typescript-eslint/no-unused-vars\": [\n \"error\",\n {\n argsIgnorePattern: \"^_\", // Only underscore-prefixed parameters\n varsIgnorePattern: \"^(_|[A-Z]$)\", // Allow underscore-prefixed vars and single uppercase letters (interface generics)\n caughtErrors: \"all\", // Require using catch block errors or prefix with _\n caughtErrorsIgnorePattern: \"^_\", // Allow _error, _e, etc. in catch blocks\n destructuredArrayIgnorePattern: \"^_\",\n ignoreRestSiblings: true,\n args: \"after-used\",\n },\n ],\n \"@typescript-eslint/no-unused-expressions\": [\n \"error\",\n {\n allowShortCircuit: true,\n allowTernary: true,\n },\n ],\n \"@typescript-eslint/no-floating-promises\": \"error\",\n \"@typescript-eslint/await-thenable\": \"error\",\n \"@typescript-eslint/no-misused-promises\": \"error\",\n \"@typescript-eslint/require-await\": \"error\",\n \"@typescript-eslint/prefer-nullish-coalescing\": \"error\",\n \"@typescript-eslint/prefer-optional-chain\": \"error\",\n \"@typescript-eslint/no-unnecessary-condition\": \"warn\",\n // Relax strict-boolean-expressions for functional library patterns\n // This rule is valuable for applications but creates excessive noise in a functional library where:\n // 1. Optional chaining patterns like `if (options?.prop)` are idiomatic and safe\n // 2. String/object truthiness checks are common and intentional (e.g., `if (message)`)\n // 3. The functional design already provides safety through Option/Either patterns\n // 4. Library code often needs flexibility for performance and interoperability\n \"@typescript-eslint/strict-boolean-expressions\": [\n \"warn\",\n {\n allowString: true, // Allow `if (str)` patterns\n allowNumber: true, // Allow `if (num)` patterns\n allowNullableObject: true, // Allow `if (obj?.prop)` patterns\n allowNullableBoolean: true, // Allow `if (bool)` where bool might be null/undefined\n allowNullableString: true, // Allow `if (str)` where str might be null/undefined\n allowNullableNumber: true, // Allow `if (num)` where num might be null/undefined\n allowAny: true, // Allow `if (value)` where value is any type\n },\n ],\n\n // Functional programming rules (when eslint-plugin-functional is available)\n \"functional/no-let\": \"error\",\n \"functional/immutable-data\": \"warn\",\n \"functional/no-loop-statements\": \"off\", // Start disabled, can enable later\n \"functional/prefer-immutable-types\": \"off\",\n \"functional/no-mixed-types\": \"off\",\n \"functional/functional-parameters\": \"off\",\n \"functional/no-throw-statements\": [\"warn\", { allowToRejectWith: true }],\n \"functional/no-try-statements\": [\"warn\", { allowCatch: true }],\n\n // Allow some flexibility\n \"functional/no-conditional-statements\": \"off\",\n \"functional/no-expression-statements\": \"off\",\n \"functional/no-return-void\": \"off\",\n\n // Code formatting (when eslint-plugin-prettier is available)\n \"prettier/prettier\": [\n \"error\",\n {},\n {\n usePrettierrc: true,\n },\n ],\n\n // Import organization (when eslint-plugin-simple-import-sort is available)\n \"simple-import-sort/imports\": \"error\",\n \"simple-import-sort/exports\": \"error\",\n },\n}\n"],"mappings":";;AAOA,IAAI,4BAA4B,EAAE;CAChC,MAAM,SAAS,0BAA0B;AACzC,KAAI,CAAC,OAAO,QACV,OAAM,sBAAsB,OAAO;AAIrC,KAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,UAAQ,KAAK,yCAAyC;AACtD,SAAO,SAAS,SAAS,YAAY,QAAQ,KAAK,MAAM,UAAU,CAAC;AACnE,UAAQ,KAAK,GAAG;;;AAMpB,IAAA,sBAAe;CACb,MAAM;CACN,OAAO;EAEL,gBAAgB;EAChB,UAAU;EACV,oBAAoB;EACpB,4BAA4B;EAC5B,iBAAiB;EACjB,oBAAoB;EACpB,mBAAmB;EACnB,wBAAwB,CACtB,SACA;GACE,OAAO;GACP,QAAQ;GACT,CACF;EAGD,8CAA8C;EAC9C,sCAAsC;EACtC,qCAAqC,CACnC,SACA;GACE,mBAAmB;GACnB,mBAAmB;GACnB,cAAc;GACd,2BAA2B;GAC3B,gCAAgC;GAChC,oBAAoB;GACpB,MAAM;GACP,CACF;EACD,4CAA4C,CAC1C,SACA;GACE,mBAAmB;GACnB,cAAc;GACf,CACF;EACD,2CAA2C;EAC3C,qCAAqC;EACrC,0CAA0C;EAC1C,oCAAoC;EACpC,gDAAgD;EAChD,4CAA4C;EAC5C,+CAA+C;EAO/C,iDAAiD,CAC/C,QACA;GACE,aAAa;GACb,aAAa;GACb,qBAAqB;GACrB,sBAAsB;GACtB,qBAAqB;GACrB,qBAAqB;GACrB,UAAU;GACX,CACF;EAGD,qBAAqB;EACrB,6BAA6B;EAC7B,iCAAiC;EACjC,qCAAqC;EACrC,6BAA6B;EAC7B,oCAAoC;EACpC,kCAAkC,CAAC,QAAQ,EAAE,mBAAmB,MAAM,CAAC;EACvE,gCAAgC,CAAC,QAAQ,EAAE,YAAY,MAAM,CAAC;EAG9D,wCAAwC;EACxC,uCAAuC;EACvC,6BAA6B;EAG7B,qBAAqB;GACnB;GACA,EAAE;GACF,EACE,eAAe,MAChB;GACF;EAGD,8BAA8B;EAC9B,8BAA8B;EAC/B;CACF"}
1
+ {"version":3,"file":"recommended.js","names":[],"sources":["../../src/configs/recommended.ts"],"sourcesContent":["import {\n createValidationError,\n shouldValidateDependencies,\n validatePeerDependencies,\n} from \"../utils/dependency-validator\"\n\n// Validate peer dependencies on config load\nif (shouldValidateDependencies()) {\n const result = validatePeerDependencies()\n if (!result.isValid) {\n throw createValidationError(result)\n }\n\n // Log warnings for missing optional dependencies\n if (result.warnings.length > 0) {\n console.warn(\"\\n⚠️ eslint-config-functype warnings:\")\n result.warnings.forEach((warning) => console.warn(` ${warning}`))\n console.warn(\"\")\n }\n}\n\n// ESLint 9.x Flat Config Format\n// Complete functional TypeScript config with formatting and import organization\nexport default {\n name: \"functype/recommended\",\n rules: {\n // Core JavaScript immutability\n \"prefer-const\": \"error\",\n \"no-var\": \"error\",\n \"no-throw-literal\": \"error\",\n \"no-mixed-spaces-and-tabs\": \"error\",\n \"no-extra-semi\": \"error\",\n \"object-shorthand\": \"error\",\n \"prefer-template\": \"error\",\n \"prefer-destructuring\": [\n \"error\",\n {\n array: false,\n object: true,\n },\n ],\n\n // TypeScript functional patterns (when @typescript-eslint is available)\n \"@typescript-eslint/consistent-type-imports\": \"error\",\n \"@typescript-eslint/no-explicit-any\": \"error\",\n \"@typescript-eslint/no-unused-vars\": [\n \"error\",\n {\n argsIgnorePattern: \"^_\", // Only underscore-prefixed parameters\n varsIgnorePattern: \"^(_|[A-Z]$)\", // Allow underscore-prefixed vars and single uppercase letters (interface generics)\n caughtErrors: \"all\", // Require using catch block errors or prefix with _\n caughtErrorsIgnorePattern: \"^_\", // Allow _error, _e, etc. in catch blocks\n destructuredArrayIgnorePattern: \"^_\",\n ignoreRestSiblings: true,\n args: \"after-used\",\n },\n ],\n \"@typescript-eslint/no-unused-expressions\": [\n \"error\",\n {\n allowShortCircuit: true,\n allowTernary: true,\n },\n ],\n \"@typescript-eslint/no-floating-promises\": \"error\",\n \"@typescript-eslint/await-thenable\": \"error\",\n \"@typescript-eslint/no-misused-promises\": \"error\",\n \"@typescript-eslint/require-await\": \"error\",\n \"@typescript-eslint/prefer-nullish-coalescing\": \"error\",\n \"@typescript-eslint/prefer-optional-chain\": \"error\",\n \"@typescript-eslint/no-unnecessary-condition\": \"warn\",\n // Relax strict-boolean-expressions for functional library patterns\n // This rule is valuable for applications but creates excessive noise in a functional library where:\n // 1. Optional chaining patterns like `if (options?.prop)` are idiomatic and safe\n // 2. String/object truthiness checks are common and intentional (e.g., `if (message)`)\n // 3. The functional design already provides safety through Option/Either patterns\n // 4. Library code often needs flexibility for performance and interoperability\n \"@typescript-eslint/strict-boolean-expressions\": [\n \"warn\",\n {\n allowString: true, // Allow `if (str)` patterns\n allowNumber: true, // Allow `if (num)` patterns\n allowNullableObject: true, // Allow `if (obj?.prop)` patterns\n allowNullableBoolean: true, // Allow `if (bool)` where bool might be null/undefined\n allowNullableString: true, // Allow `if (str)` where str might be null/undefined\n allowNullableNumber: true, // Allow `if (num)` where num might be null/undefined\n allowAny: true, // Allow `if (value)` where value is any type\n },\n ],\n\n // Functional programming rules (when eslint-plugin-functional is available)\n \"functional/no-let\": \"error\",\n \"functional/immutable-data\": \"warn\",\n \"functional/no-loop-statements\": \"off\", // Start disabled, can enable later\n \"functional/prefer-immutable-types\": \"off\",\n \"functional/no-mixed-types\": \"off\",\n \"functional/functional-parameters\": \"off\",\n \"functional/no-throw-statements\": [\"warn\", { allowToRejectPromises: true }],\n \"functional/no-try-statements\": [\"warn\", { allowCatch: true }],\n\n // Allow some flexibility\n \"functional/no-conditional-statements\": \"off\",\n \"functional/no-expression-statements\": \"off\",\n \"functional/no-return-void\": \"off\",\n\n // Code formatting (when eslint-plugin-prettier is available)\n \"prettier/prettier\": [\n \"error\",\n {},\n {\n usePrettierrc: true,\n },\n ],\n\n // Import organization (when eslint-plugin-simple-import-sort is available)\n \"simple-import-sort/imports\": \"error\",\n \"simple-import-sort/exports\": \"error\",\n },\n}\n"],"mappings":";;AAOA,IAAI,4BAA4B,EAAE;CAChC,MAAM,SAAS,0BAA0B;AACzC,KAAI,CAAC,OAAO,QACV,OAAM,sBAAsB,OAAO;AAIrC,KAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,UAAQ,KAAK,yCAAyC;AACtD,SAAO,SAAS,SAAS,YAAY,QAAQ,KAAK,MAAM,UAAU,CAAC;AACnE,UAAQ,KAAK,GAAG;;;AAMpB,IAAA,sBAAe;CACb,MAAM;CACN,OAAO;EAEL,gBAAgB;EAChB,UAAU;EACV,oBAAoB;EACpB,4BAA4B;EAC5B,iBAAiB;EACjB,oBAAoB;EACpB,mBAAmB;EACnB,wBAAwB,CACtB,SACA;GACE,OAAO;GACP,QAAQ;GACT,CACF;EAGD,8CAA8C;EAC9C,sCAAsC;EACtC,qCAAqC,CACnC,SACA;GACE,mBAAmB;GACnB,mBAAmB;GACnB,cAAc;GACd,2BAA2B;GAC3B,gCAAgC;GAChC,oBAAoB;GACpB,MAAM;GACP,CACF;EACD,4CAA4C,CAC1C,SACA;GACE,mBAAmB;GACnB,cAAc;GACf,CACF;EACD,2CAA2C;EAC3C,qCAAqC;EACrC,0CAA0C;EAC1C,oCAAoC;EACpC,gDAAgD;EAChD,4CAA4C;EAC5C,+CAA+C;EAO/C,iDAAiD,CAC/C,QACA;GACE,aAAa;GACb,aAAa;GACb,qBAAqB;GACrB,sBAAsB;GACtB,qBAAqB;GACrB,qBAAqB;GACrB,UAAU;GACX,CACF;EAGD,qBAAqB;EACrB,6BAA6B;EAC7B,iCAAiC;EACjC,qCAAqC;EACrC,6BAA6B;EAC7B,oCAAoC;EACpC,kCAAkC,CAAC,QAAQ,EAAE,uBAAuB,MAAM,CAAC;EAC3E,gCAAgC,CAAC,QAAQ,EAAE,YAAY,MAAM,CAAC;EAG9D,wCAAwC;EACxC,uCAAuC;EACvC,6BAA6B;EAG7B,qBAAqB;GACnB;GACA,EAAE;GACF,EACE,eAAe,MAChB;GACF;EAGD,8BAA8B;EAC9B,8BAA8B;EAC/B;CACF"}
@@ -45,7 +45,7 @@ declare const _default: {
45
45
  "functional/no-let": string;
46
46
  "functional/no-mixed-types": string;
47
47
  "functional/no-throw-statements": (string | {
48
- allowToRejectWith: boolean;
48
+ allowToRejectPromises: boolean;
49
49
  })[];
50
50
  "functional/no-try-statements": (string | {
51
51
  allowCatch: boolean;
package/dist/index.d.ts CHANGED
@@ -53,7 +53,7 @@ declare const plugin: {
53
53
  "functional/no-mixed-types": string;
54
54
  "functional/functional-parameters": string;
55
55
  "functional/no-throw-statements": (string | {
56
- allowToRejectWith: boolean;
56
+ allowToRejectPromises: boolean;
57
57
  })[];
58
58
  "functional/no-try-statements": (string | {
59
59
  allowCatch: boolean;
@@ -116,7 +116,7 @@ declare const plugin: {
116
116
  "functional/no-let": string;
117
117
  "functional/no-mixed-types": string;
118
118
  "functional/no-throw-statements": (string | {
119
- allowToRejectWith: boolean;
119
+ allowToRejectPromises: boolean;
120
120
  })[];
121
121
  "functional/no-try-statements": (string | {
122
122
  allowCatch: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-config-functype",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "type": "module",
5
5
  "description": "Curated ESLint flat config bundle for functional TypeScript programming (ESLint 9.x+)",
6
6
  "main": "dist/index.js",
@@ -29,7 +29,8 @@
29
29
  }
30
30
  },
31
31
  "files": [
32
- "dist"
32
+ "dist",
33
+ "README.md"
33
34
  ],
34
35
  "bin": {
35
36
  "functype-list-rules": "dist/cli/list-rules.js"