@skapxd/eslint-opinionated 3.0.0 → 4.0.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 (53) hide show
  1. package/README.md +4 -1
  2. package/dist/astro/index.d.mts +52 -45
  3. package/dist/astro/index.d.ts +52 -45
  4. package/dist/astro/index.js +2 -0
  5. package/dist/astro/index.js.map +1 -1
  6. package/dist/astro/index.mjs +2 -2
  7. package/dist/{chunk-PDE4244X.mjs → chunk-24YEIN4M.mjs} +2 -2
  8. package/dist/chunk-24YEIN4M.mjs.map +1 -0
  9. package/dist/{chunk-EZWYBV2K.mjs → chunk-LHB5QN6B.mjs} +781 -12
  10. package/dist/chunk-LHB5QN6B.mjs.map +1 -0
  11. package/dist/{chunk-2PDLILVN.mjs → chunk-SU7QO6Z2.mjs} +3 -1
  12. package/dist/chunk-SU7QO6Z2.mjs.map +1 -0
  13. package/dist/{chunk-WMGL4DXL.mjs → chunk-T6OT6UUF.mjs} +2 -2
  14. package/dist/chunk-T6OT6UUF.mjs.map +1 -0
  15. package/dist/{chunk-4S3RPDX7.mjs → chunk-ZLLDTBKQ.mjs} +2 -2
  16. package/dist/chunk-ZLLDTBKQ.mjs.map +1 -0
  17. package/dist/cli.js +1551 -3388
  18. package/dist/cli.js.map +1 -1
  19. package/dist/cli.mjs +1550 -3387
  20. package/dist/cli.mjs.map +1 -1
  21. package/dist/index.d.mts +1460 -22
  22. package/dist/index.d.ts +1460 -22
  23. package/dist/index.js +791 -16
  24. package/dist/index.js.map +1 -1
  25. package/dist/index.mjs +14 -10
  26. package/dist/index.mjs.map +1 -1
  27. package/dist/nest/index.d.mts +60 -55
  28. package/dist/nest/index.d.ts +60 -55
  29. package/dist/nest/index.js +2 -0
  30. package/dist/nest/index.js.map +1 -1
  31. package/dist/nest/index.mjs +2 -2
  32. package/dist/next/index.d.mts +58 -51
  33. package/dist/next/index.d.ts +58 -51
  34. package/dist/next/index.js +2 -0
  35. package/dist/next/index.js.map +1 -1
  36. package/dist/next/index.mjs +2 -2
  37. package/dist/rules-BI9wL85g.d.ts +68 -0
  38. package/dist/rules-C6E7Lk2q.d.mts +68 -0
  39. package/dist/shared/index.d.mts +149 -139
  40. package/dist/shared/index.d.ts +149 -139
  41. package/dist/shared/index.js +782 -11
  42. package/dist/shared/index.js.map +1 -1
  43. package/dist/shared/index.mjs +2 -2
  44. package/dist/types-CYktcbmS.d.mts +83 -0
  45. package/dist/types-CYktcbmS.d.ts +83 -0
  46. package/package.json +8 -4
  47. package/dist/chunk-2PDLILVN.mjs.map +0 -1
  48. package/dist/chunk-4S3RPDX7.mjs.map +0 -1
  49. package/dist/chunk-EZWYBV2K.mjs.map +0 -1
  50. package/dist/chunk-PDE4244X.mjs.map +0 -1
  51. package/dist/chunk-WMGL4DXL.mjs.map +0 -1
  52. package/dist/rules-qISQhAKV.d.mts +0 -5
  53. package/dist/rules-qISQhAKV.d.ts +0 -5
package/README.md CHANGED
@@ -39,7 +39,7 @@ Los enlaces apuntan a GitHub de forma absoluta para que funcionen tambien desde
39
39
  | [Adopcion incremental y legacy](https://github.com/skapxd/eslint-opinionated/blob/main/docs/adopcion-legacy.md) | Lint sobre cambios, olas de adopcion, overrides y propuestas de reglas. |
40
40
  | [Pipeline Result](https://github.com/skapxd/eslint-opinionated/blob/main/docs/pipeline-result.md) | Como encajan @skapxd/result, ts-pattern y el trace global. |
41
41
  | [Notas type-aware](https://github.com/skapxd/eslint-opinionated/blob/main/docs/notas-type-aware.md) | Supuestos, limites conocidos y notas de reglas que dependen del checker. |
42
- | [Indice de reglas](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/README.md) | Las 50 fichas individuales en docs/reglas/. |
42
+ | [Indice de reglas](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/README.md) | Las 53 fichas individuales en docs/reglas/. |
43
43
 
44
44
  ## Reglas
45
45
 
@@ -65,6 +65,7 @@ Los enlaces apuntan a GitHub de forma absoluta para que funcionen tambien desde
65
65
  | [`skapxd/nest-no-swagger-in-controllers`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/nest-no-swagger-in-controllers.md) | Los controllers no se llenan de decoradores de swagger; el plugin introspecciona los DTOs. Preset `nest`. |
66
66
  | [`skapxd/nest-requires-swagger-plugin`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/nest-requires-swagger-plugin.md) | `nest-cli.json` debe tener el plugin `@nestjs/swagger`: la premisa de las reglas de swagger, verificada. Preset `nest`. |
67
67
  | [`skapxd/nest-validation-pipe-config`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/nest-validation-pipe-config.md) | Todo `new ValidationPipe` configura `transform` y `whitelist`: la premisa de las reglas de DTOs. Preset `nest`. |
68
+ | [`skapxd/nested-function-requires-capture`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/nested-function-requires-capture.md) | Una funcion anidada nombrada debe capturar scope local; si no, es un helper extraible. Preset `shared`, en `error`. |
68
69
  | [`skapxd/no-anonymous-condition`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/no-anonymous-condition.md) | El `if` solo acepta condiciones ya nombradas; todo cómputo (llamada, comparación, `&&`/`||`) se extrae a una `const` con nombre semántico. |
69
70
  | [`skapxd/no-deep-relative-imports`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/no-deep-relative-imports.md) | Limita la profundidad de los imports relativos (`../`). |
70
71
  | [`skapxd/no-default-export`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/no-default-export.md) | Prohíbe `export default`; el nombre del símbolo es el contrato. Exime configs/stories y, en el preset `next`, los entrypoints del App Router. |
@@ -86,6 +87,7 @@ Los enlaces apuntan a GitHub de forma absoluta para que funcionen tambien desde
86
87
  | [`skapxd/no-silenced-compiler`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/no-silenced-compiler.md) | Prohíbe `@ts-ignore`/`@ts-nocheck`: silenciar la alarma no arregla el incendio. `@ts-expect-error` con descripción queda para tests de tipos. Wrapper de `ban-ts-comment`. |
87
88
  | [`skapxd/no-tunnel-props`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/no-tunnel-props.md) | Ninguna prop viaja más de un nivel: quien la recibe no puede reenviarla a otro componente. Mata el prop drilling. |
88
89
  | [`skapxd/prefer-abort-signal`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/prefer-abort-signal.md) | Listeners en efectos se limpian con `AbortController` (`{ signal }` + `abort()`), no con `removeEventListener`. |
90
+ | [`skapxd/prefer-node-protocol-for-builtins`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/prefer-node-protocol-for-builtins.md) | Builtins de Node siempre con protocolo `node:`: separa runtime de npm y evita ambigüedad cross-runtime. |
89
91
  | [`skapxd/prefer-tagged-union-state`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/prefer-tagged-union-state.md) | Prohíbe estados inconsistentes representables: flag de loading + campo de error independientes → unión etiquetada. |
90
92
  | [`skapxd/prefer-type-over-interface`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/prefer-type-over-interface.md) | Las uniones discriminadas son types; un `type` no crece en silencio por declaration merging. Wrapper de `consistent-type-definitions`. |
91
93
  | [`skapxd/no-functions-inside-components`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/no-functions-inside-components.md) | Prohíbe definir funciones dentro de componentes React. |
@@ -95,6 +97,7 @@ Los enlaces apuntan a GitHub de forma absoluta para que funcionen tambien desde
95
97
  | [`skapxd/package-requires-typed-exports`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/package-requires-typed-exports.md) | Los `exports` del package.json declaran `types` por condición (`import` → `.d.mts`, `require` → `.d.ts`): mata el bug FalseCJS. Preset `package`. |
96
98
  | [`skapxd/untrusted-module-requires-adapter`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/untrusted-module-requires-adapter.md) | Los paquetes con tipos mentirosos (@types desfasados) solo se importan desde su adaptador: la mentira vive en UN archivo. Preset `package`. |
97
99
  | [`skapxd/no-jsx-ternary-null`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/no-jsx-ternary-null.md) | Prefiere `cond && <El />` sobre `cond ? <El /> : null` en JSX. |
100
+ | [`skapxd/repeated-jsx-requires-component`](https://github.com/skapxd/eslint-opinionated/blob/main/docs/reglas/repeated-jsx-requires-component.md) | Detecta patrones JSX repetidos tres veces que ya son un componente sin nombre. |
98
101
 
99
102
  ## Licencia
100
103
 
@@ -1,61 +1,68 @@
1
1
  import * as typescript_eslint from 'typescript-eslint';
2
+ import { O as OpinionatedPluginReference } from '../types-CYktcbmS.mjs';
3
+ import 'eslint';
4
+ import '@typescript-eslint/utils';
2
5
 
3
- declare function createAstroConfigs(pluginReference: unknown): ({
6
+ declare function createAstroConfigs(pluginReference: OpinionatedPluginReference): ({
4
7
  files: string[];
5
8
  languageOptions: {
6
9
  parser: typescript_eslint.CompatibleParser;
7
10
  };
8
11
  name: string;
9
12
  plugins: {
10
- skapxd: unknown;
13
+ skapxd: OpinionatedPluginReference;
11
14
  };
12
15
  rules: {
13
- "skapxd/class-properties-require-readonly": string;
14
- "skapxd/max-public-methods": string;
15
- "skapxd/no-accessors": string;
16
- "skapxd/no-ad-hoc-ok-result": string;
17
- "skapxd/no-anonymous-condition": string;
18
- "skapxd/no-deep-relative-imports": string;
19
- "skapxd/no-default-export": string;
20
- "skapxd/no-else": string;
21
- "skapxd/no-emoji": string;
22
- "skapxd/no-nested-if": string;
23
- "skapxd/no-runtime-state-guard": string;
24
- "skapxd/no-promise-chain": string;
25
- "skapxd/no-try-catch": string;
26
- "skapxd/one-root-function-per-file": string;
27
- "skapxd/prefer-tagged-union-state": string;
28
- "skapxd/requires-strict-tsconfig": string;
29
- "skapxd/prefer-ts-pattern": string;
30
- "skapxd/result-error-requires-cause": string;
31
- "skapxd/result-error-requires-handling": string;
16
+ "skapxd/class-properties-require-readonly": "error";
17
+ "skapxd/max-public-methods": "error";
18
+ "skapxd/no-accessors": "error";
19
+ "skapxd/no-ad-hoc-ok-result": "error";
20
+ "skapxd/no-anonymous-condition": "error";
21
+ "skapxd/no-deep-relative-imports": "error";
22
+ "skapxd/no-default-export": "error";
23
+ "skapxd/no-else": "error";
24
+ "skapxd/no-emoji": "error";
25
+ "skapxd/no-nested-if": "error";
26
+ "skapxd/nested-function-requires-capture": "error";
27
+ "skapxd/no-runtime-state-guard": "error";
28
+ "skapxd/no-promise-chain": "error";
29
+ "skapxd/no-try-catch": "error";
30
+ "skapxd/one-root-function-per-file": "error";
31
+ "skapxd/prefer-node-protocol-for-builtins": "error";
32
+ "skapxd/prefer-tagged-union-state": "error";
33
+ "skapxd/requires-strict-tsconfig": "error";
34
+ "skapxd/prefer-ts-pattern": "error";
35
+ "skapxd/result-error-requires-cause": "error";
36
+ "skapxd/result-error-requires-handling": "error";
32
37
  };
33
38
  } | {
34
39
  files: string[];
35
40
  name: string;
36
41
  plugins: {
37
- skapxd: unknown;
42
+ skapxd: OpinionatedPluginReference;
38
43
  };
39
44
  rules: {
40
- "skapxd/class-properties-require-readonly": string;
41
- "skapxd/max-public-methods": string;
42
- "skapxd/no-accessors": string;
43
- "skapxd/no-ad-hoc-ok-result": string;
44
- "skapxd/no-anonymous-condition": string;
45
- "skapxd/no-deep-relative-imports": string;
46
- "skapxd/no-default-export": string;
47
- "skapxd/no-else": string;
48
- "skapxd/no-emoji": string;
49
- "skapxd/no-nested-if": string;
50
- "skapxd/no-runtime-state-guard": string;
51
- "skapxd/no-promise-chain": string;
52
- "skapxd/no-try-catch": string;
53
- "skapxd/one-root-function-per-file": string;
54
- "skapxd/prefer-tagged-union-state": string;
55
- "skapxd/requires-strict-tsconfig": string;
56
- "skapxd/prefer-ts-pattern": string;
57
- "skapxd/result-error-requires-cause": string;
58
- "skapxd/result-error-requires-handling": string;
45
+ "skapxd/class-properties-require-readonly": "error";
46
+ "skapxd/max-public-methods": "error";
47
+ "skapxd/no-accessors": "error";
48
+ "skapxd/no-ad-hoc-ok-result": "error";
49
+ "skapxd/no-anonymous-condition": "error";
50
+ "skapxd/no-deep-relative-imports": "error";
51
+ "skapxd/no-default-export": "error";
52
+ "skapxd/no-else": "error";
53
+ "skapxd/no-emoji": "error";
54
+ "skapxd/no-nested-if": "error";
55
+ "skapxd/nested-function-requires-capture": "error";
56
+ "skapxd/no-runtime-state-guard": "error";
57
+ "skapxd/no-promise-chain": "error";
58
+ "skapxd/no-try-catch": "error";
59
+ "skapxd/one-root-function-per-file": "error";
60
+ "skapxd/prefer-node-protocol-for-builtins": "error";
61
+ "skapxd/prefer-tagged-union-state": "error";
62
+ "skapxd/requires-strict-tsconfig": "error";
63
+ "skapxd/prefer-ts-pattern": "error";
64
+ "skapxd/result-error-requires-cause": "error";
65
+ "skapxd/result-error-requires-handling": "error";
59
66
  };
60
67
  languageOptions?: undefined;
61
68
  } | {
@@ -68,12 +75,12 @@ declare function createAstroConfigs(pluginReference: unknown): ({
68
75
  };
69
76
  name: string;
70
77
  plugins: {
71
- skapxd: unknown;
78
+ skapxd: OpinionatedPluginReference;
72
79
  };
73
80
  rules: {
74
- "skapxd/await-requires-result": string;
75
- "skapxd/result-error-requires-cause": string;
76
- "skapxd/result-error-requires-handling": string;
81
+ "skapxd/await-requires-result": "error";
82
+ "skapxd/result-error-requires-cause": "error";
83
+ "skapxd/result-error-requires-handling": "error";
77
84
  };
78
85
  })[];
79
86
 
@@ -1,61 +1,68 @@
1
1
  import * as typescript_eslint from 'typescript-eslint';
2
+ import { O as OpinionatedPluginReference } from '../types-CYktcbmS.js';
3
+ import 'eslint';
4
+ import '@typescript-eslint/utils';
2
5
 
3
- declare function createAstroConfigs(pluginReference: unknown): ({
6
+ declare function createAstroConfigs(pluginReference: OpinionatedPluginReference): ({
4
7
  files: string[];
5
8
  languageOptions: {
6
9
  parser: typescript_eslint.CompatibleParser;
7
10
  };
8
11
  name: string;
9
12
  plugins: {
10
- skapxd: unknown;
13
+ skapxd: OpinionatedPluginReference;
11
14
  };
12
15
  rules: {
13
- "skapxd/class-properties-require-readonly": string;
14
- "skapxd/max-public-methods": string;
15
- "skapxd/no-accessors": string;
16
- "skapxd/no-ad-hoc-ok-result": string;
17
- "skapxd/no-anonymous-condition": string;
18
- "skapxd/no-deep-relative-imports": string;
19
- "skapxd/no-default-export": string;
20
- "skapxd/no-else": string;
21
- "skapxd/no-emoji": string;
22
- "skapxd/no-nested-if": string;
23
- "skapxd/no-runtime-state-guard": string;
24
- "skapxd/no-promise-chain": string;
25
- "skapxd/no-try-catch": string;
26
- "skapxd/one-root-function-per-file": string;
27
- "skapxd/prefer-tagged-union-state": string;
28
- "skapxd/requires-strict-tsconfig": string;
29
- "skapxd/prefer-ts-pattern": string;
30
- "skapxd/result-error-requires-cause": string;
31
- "skapxd/result-error-requires-handling": string;
16
+ "skapxd/class-properties-require-readonly": "error";
17
+ "skapxd/max-public-methods": "error";
18
+ "skapxd/no-accessors": "error";
19
+ "skapxd/no-ad-hoc-ok-result": "error";
20
+ "skapxd/no-anonymous-condition": "error";
21
+ "skapxd/no-deep-relative-imports": "error";
22
+ "skapxd/no-default-export": "error";
23
+ "skapxd/no-else": "error";
24
+ "skapxd/no-emoji": "error";
25
+ "skapxd/no-nested-if": "error";
26
+ "skapxd/nested-function-requires-capture": "error";
27
+ "skapxd/no-runtime-state-guard": "error";
28
+ "skapxd/no-promise-chain": "error";
29
+ "skapxd/no-try-catch": "error";
30
+ "skapxd/one-root-function-per-file": "error";
31
+ "skapxd/prefer-node-protocol-for-builtins": "error";
32
+ "skapxd/prefer-tagged-union-state": "error";
33
+ "skapxd/requires-strict-tsconfig": "error";
34
+ "skapxd/prefer-ts-pattern": "error";
35
+ "skapxd/result-error-requires-cause": "error";
36
+ "skapxd/result-error-requires-handling": "error";
32
37
  };
33
38
  } | {
34
39
  files: string[];
35
40
  name: string;
36
41
  plugins: {
37
- skapxd: unknown;
42
+ skapxd: OpinionatedPluginReference;
38
43
  };
39
44
  rules: {
40
- "skapxd/class-properties-require-readonly": string;
41
- "skapxd/max-public-methods": string;
42
- "skapxd/no-accessors": string;
43
- "skapxd/no-ad-hoc-ok-result": string;
44
- "skapxd/no-anonymous-condition": string;
45
- "skapxd/no-deep-relative-imports": string;
46
- "skapxd/no-default-export": string;
47
- "skapxd/no-else": string;
48
- "skapxd/no-emoji": string;
49
- "skapxd/no-nested-if": string;
50
- "skapxd/no-runtime-state-guard": string;
51
- "skapxd/no-promise-chain": string;
52
- "skapxd/no-try-catch": string;
53
- "skapxd/one-root-function-per-file": string;
54
- "skapxd/prefer-tagged-union-state": string;
55
- "skapxd/requires-strict-tsconfig": string;
56
- "skapxd/prefer-ts-pattern": string;
57
- "skapxd/result-error-requires-cause": string;
58
- "skapxd/result-error-requires-handling": string;
45
+ "skapxd/class-properties-require-readonly": "error";
46
+ "skapxd/max-public-methods": "error";
47
+ "skapxd/no-accessors": "error";
48
+ "skapxd/no-ad-hoc-ok-result": "error";
49
+ "skapxd/no-anonymous-condition": "error";
50
+ "skapxd/no-deep-relative-imports": "error";
51
+ "skapxd/no-default-export": "error";
52
+ "skapxd/no-else": "error";
53
+ "skapxd/no-emoji": "error";
54
+ "skapxd/no-nested-if": "error";
55
+ "skapxd/nested-function-requires-capture": "error";
56
+ "skapxd/no-runtime-state-guard": "error";
57
+ "skapxd/no-promise-chain": "error";
58
+ "skapxd/no-try-catch": "error";
59
+ "skapxd/one-root-function-per-file": "error";
60
+ "skapxd/prefer-node-protocol-for-builtins": "error";
61
+ "skapxd/prefer-tagged-union-state": "error";
62
+ "skapxd/requires-strict-tsconfig": "error";
63
+ "skapxd/prefer-ts-pattern": "error";
64
+ "skapxd/result-error-requires-cause": "error";
65
+ "skapxd/result-error-requires-handling": "error";
59
66
  };
60
67
  languageOptions?: undefined;
61
68
  } | {
@@ -68,12 +75,12 @@ declare function createAstroConfigs(pluginReference: unknown): ({
68
75
  };
69
76
  name: string;
70
77
  plugins: {
71
- skapxd: unknown;
78
+ skapxd: OpinionatedPluginReference;
72
79
  };
73
80
  rules: {
74
- "skapxd/await-requires-result": string;
75
- "skapxd/result-error-requires-cause": string;
76
- "skapxd/result-error-requires-handling": string;
81
+ "skapxd/await-requires-result": "error";
82
+ "skapxd/result-error-requires-cause": "error";
83
+ "skapxd/result-error-requires-handling": "error";
77
84
  };
78
85
  })[];
79
86
 
@@ -49,10 +49,12 @@ var baseRules = {
49
49
  "skapxd/no-else": "error",
50
50
  "skapxd/no-emoji": "error",
51
51
  "skapxd/no-nested-if": "error",
52
+ "skapxd/nested-function-requires-capture": "error",
52
53
  "skapxd/no-runtime-state-guard": "error",
53
54
  "skapxd/no-promise-chain": "error",
54
55
  "skapxd/no-try-catch": "error",
55
56
  "skapxd/one-root-function-per-file": "error",
57
+ "skapxd/prefer-node-protocol-for-builtins": "error",
56
58
  "skapxd/prefer-tagged-union-state": "error",
57
59
  "skapxd/requires-strict-tsconfig": "error",
58
60
  "skapxd/prefer-ts-pattern": "error",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/astro/index.ts","../../src/shared/configs/base-rules.ts","../../src/shared/configs/create-base-language-options.ts","../../src/shared/configs/create-typed-language-options.ts","../../src/astro/configs.ts"],"sourcesContent":["export { createAstroConfigs } from \"./configs\";\n","export const baseRules = {\n \"skapxd/class-properties-require-readonly\": \"error\",\n \"skapxd/max-public-methods\": \"error\",\n \"skapxd/no-accessors\": \"error\",\n \"skapxd/no-ad-hoc-ok-result\": \"error\",\n // En las bases por decisión del dueño (issue #2): con poca adopción\n // todavía, es el momento de subir la vara; los legacy la apagan en su\n // lista de pendientes (playbook de adopción del README).\n \"skapxd/no-anonymous-condition\": \"error\",\n \"skapxd/no-deep-relative-imports\": \"error\",\n \"skapxd/no-default-export\": \"error\",\n \"skapxd/no-else\": \"error\",\n \"skapxd/no-emoji\": \"error\",\n \"skapxd/no-nested-if\": \"error\",\n \"skapxd/no-runtime-state-guard\": \"error\",\n \"skapxd/no-promise-chain\": \"error\",\n \"skapxd/no-try-catch\": \"error\",\n \"skapxd/one-root-function-per-file\": \"error\",\n \"skapxd/prefer-tagged-union-state\": \"error\",\n \"skapxd/requires-strict-tsconfig\": \"error\",\n \"skapxd/prefer-ts-pattern\": \"error\",\n \"skapxd/result-error-requires-cause\": \"error\",\n \"skapxd/result-error-requires-handling\": \"error\",\n};\n","import tseslint from \"typescript-eslint\";\n\n// Variante sin type-checking: solo el parser, para presets que aplican a TS\n// pero no necesitan projectService (base, package, next/base, next/react).\nexport function createBaseLanguageOptions() {\n return {\n parser: tseslint.parser,\n };\n}\n","import tseslint from \"typescript-eslint\";\n\nexport function createTypedLanguageOptions() {\n return {\n // Sin el parser explícito, un consumidor que use solo estos presets\n // obtiene \"Parsing error\" en cada archivo TS (espree no parsea TS).\n parser: tseslint.parser,\n parserOptions: {\n projectService: true,\n },\n };\n}\n","import {\n baseRules,\n createBaseLanguageOptions,\n createTypedLanguageOptions,\n} from \"#/shared/configs\";\n\nexport function createAstroConfigs(pluginReference: unknown) {\n const baseLanguageOptions = createBaseLanguageOptions();\n const typedLanguageOptions = createTypedLanguageOptions();\n\n return [\n {\n files: [\"src/**/*.{ts,tsx}\"],\n languageOptions: baseLanguageOptions,\n name: \"skapxd/astro/base\",\n plugins: { skapxd: pluginReference },\n rules: baseRules,\n },\n // Los .astro no llevan parser propio: lo aporta eslint-plugin-astro,\n // que el consumidor debe tener configurado.\n {\n files: [\"src/**/*.astro\"],\n name: \"skapxd/astro/astro-files\",\n plugins: { skapxd: pluginReference },\n rules: baseRules,\n },\n {\n files: [\"src/**/*.{ts,tsx}\"],\n languageOptions: typedLanguageOptions,\n name: \"skapxd/astro/typescript\",\n plugins: { skapxd: pluginReference },\n rules: {\n \"skapxd/await-requires-result\": \"error\",\n \"skapxd/result-error-requires-cause\": \"error\",\n \"skapxd/result-error-requires-handling\": \"error\",\n },\n },\n ];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,YAAY;AAAA,EACvB,4CAA4C;AAAA,EAC5C,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,8BAA8B;AAAA;AAAA;AAAA;AAAA,EAI9B,iCAAiC;AAAA,EACjC,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,iCAAiC;AAAA,EACjC,2BAA2B;AAAA,EAC3B,uBAAuB;AAAA,EACvB,qCAAqC;AAAA,EACrC,oCAAoC;AAAA,EACpC,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,sCAAsC;AAAA,EACtC,yCAAyC;AAC3C;;;ACvBA,+BAAqB;AAId,SAAS,4BAA4B;AAC1C,SAAO;AAAA,IACL,QAAQ,yBAAAA,QAAS;AAAA,EACnB;AACF;;;ACRA,IAAAC,4BAAqB;AAEd,SAAS,6BAA6B;AAC3C,SAAO;AAAA;AAAA;AAAA,IAGL,QAAQ,0BAAAC,QAAS;AAAA,IACjB,eAAe;AAAA,MACb,gBAAgB;AAAA,IAClB;AAAA,EACF;AACF;;;ACLO,SAAS,mBAAmB,iBAA0B;AAC3D,QAAM,sBAAsB,0BAA0B;AACtD,QAAM,uBAAuB,2BAA2B;AAExD,SAAO;AAAA,IACL;AAAA,MACE,OAAO,CAAC,mBAAmB;AAAA,MAC3B,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,IACT;AAAA;AAAA;AAAA,IAGA;AAAA,MACE,OAAO,CAAC,gBAAgB;AAAA,MACxB,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO,CAAC,mBAAmB;AAAA,MAC3B,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,QACL,gCAAgC;AAAA,QAChC,sCAAsC;AAAA,QACtC,yCAAyC;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACF;","names":["tseslint","import_typescript_eslint","tseslint"]}
1
+ {"version":3,"sources":["../../src/astro/index.ts","../../src/shared/configs/base-rules.ts","../../src/shared/configs/create-base-language-options.ts","../../src/shared/configs/create-typed-language-options.ts","../../src/astro/configs.ts"],"sourcesContent":["export { createAstroConfigs } from \"./configs\";\n","import type { Linter } from \"eslint\";\n\nexport const baseRules = {\n \"skapxd/class-properties-require-readonly\": \"error\",\n \"skapxd/max-public-methods\": \"error\",\n \"skapxd/no-accessors\": \"error\",\n \"skapxd/no-ad-hoc-ok-result\": \"error\",\n // En las bases por decisión del dueño (issue #2): con poca adopción\n // todavía, es el momento de subir la vara; los legacy la apagan en su\n // lista de pendientes (playbook de adopción del README).\n \"skapxd/no-anonymous-condition\": \"error\",\n \"skapxd/no-deep-relative-imports\": \"error\",\n \"skapxd/no-default-export\": \"error\",\n \"skapxd/no-else\": \"error\",\n \"skapxd/no-emoji\": \"error\",\n \"skapxd/no-nested-if\": \"error\",\n \"skapxd/nested-function-requires-capture\": \"error\",\n \"skapxd/no-runtime-state-guard\": \"error\",\n \"skapxd/no-promise-chain\": \"error\",\n \"skapxd/no-try-catch\": \"error\",\n \"skapxd/one-root-function-per-file\": \"error\",\n \"skapxd/prefer-node-protocol-for-builtins\": \"error\",\n \"skapxd/prefer-tagged-union-state\": \"error\",\n \"skapxd/requires-strict-tsconfig\": \"error\",\n \"skapxd/prefer-ts-pattern\": \"error\",\n \"skapxd/result-error-requires-cause\": \"error\",\n \"skapxd/result-error-requires-handling\": \"error\",\n} satisfies Linter.RulesRecord;\n","import tseslint from \"typescript-eslint\";\n\n// Variante sin type-checking: solo el parser, para presets que aplican a TS\n// pero no necesitan projectService (base, package, next/base, next/react).\nexport function createBaseLanguageOptions() {\n return {\n parser: tseslint.parser,\n };\n}\n","import tseslint from \"typescript-eslint\";\n\nexport function createTypedLanguageOptions() {\n return {\n // Sin el parser explícito, un consumidor que use solo estos presets\n // obtiene \"Parsing error\" en cada archivo TS (espree no parsea TS).\n parser: tseslint.parser,\n parserOptions: {\n projectService: true,\n },\n };\n}\n","import {\n baseRules,\n createBaseLanguageOptions,\n createTypedLanguageOptions,\n type OpinionatedConfigList,\n type OpinionatedPluginReference,\n} from \"#/shared/configs\";\n\nexport function createAstroConfigs(\n pluginReference: OpinionatedPluginReference,\n) {\n const baseLanguageOptions = createBaseLanguageOptions();\n const typedLanguageOptions = createTypedLanguageOptions();\n\n return [\n {\n files: [\"src/**/*.{ts,tsx}\"],\n languageOptions: baseLanguageOptions,\n name: \"skapxd/astro/base\",\n plugins: { skapxd: pluginReference },\n rules: baseRules,\n },\n // Los .astro no llevan parser propio: lo aporta eslint-plugin-astro,\n // que el consumidor debe tener configurado.\n {\n files: [\"src/**/*.astro\"],\n name: \"skapxd/astro/astro-files\",\n plugins: { skapxd: pluginReference },\n rules: baseRules,\n },\n {\n files: [\"src/**/*.{ts,tsx}\"],\n languageOptions: typedLanguageOptions,\n name: \"skapxd/astro/typescript\",\n plugins: { skapxd: pluginReference },\n rules: {\n \"skapxd/await-requires-result\": \"error\",\n \"skapxd/result-error-requires-cause\": \"error\",\n \"skapxd/result-error-requires-handling\": \"error\",\n },\n },\n ] satisfies OpinionatedConfigList;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,YAAY;AAAA,EACvB,4CAA4C;AAAA,EAC5C,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,8BAA8B;AAAA;AAAA;AAAA;AAAA,EAI9B,iCAAiC;AAAA,EACjC,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,2CAA2C;AAAA,EAC3C,iCAAiC;AAAA,EACjC,2BAA2B;AAAA,EAC3B,uBAAuB;AAAA,EACvB,qCAAqC;AAAA,EACrC,4CAA4C;AAAA,EAC5C,oCAAoC;AAAA,EACpC,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,sCAAsC;AAAA,EACtC,yCAAyC;AAC3C;;;AC3BA,+BAAqB;AAId,SAAS,4BAA4B;AAC1C,SAAO;AAAA,IACL,QAAQ,yBAAAA,QAAS;AAAA,EACnB;AACF;;;ACRA,IAAAC,4BAAqB;AAEd,SAAS,6BAA6B;AAC3C,SAAO;AAAA;AAAA;AAAA,IAGL,QAAQ,0BAAAC,QAAS;AAAA,IACjB,eAAe;AAAA,MACb,gBAAgB;AAAA,IAClB;AAAA,EACF;AACF;;;ACHO,SAAS,mBACd,iBACA;AACA,QAAM,sBAAsB,0BAA0B;AACtD,QAAM,uBAAuB,2BAA2B;AAExD,SAAO;AAAA,IACL;AAAA,MACE,OAAO,CAAC,mBAAmB;AAAA,MAC3B,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,IACT;AAAA;AAAA;AAAA,IAGA;AAAA,MACE,OAAO,CAAC,gBAAgB;AAAA,MACxB,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO,CAAC,mBAAmB;AAAA,MAC3B,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,QACL,gCAAgC;AAAA,QAChC,sCAAsC;AAAA,QACtC,yCAAyC;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACF;","names":["tseslint","import_typescript_eslint","tseslint"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createAstroConfigs
3
- } from "../chunk-4S3RPDX7.mjs";
4
- import "../chunk-2PDLILVN.mjs";
3
+ } from "../chunk-ZLLDTBKQ.mjs";
4
+ import "../chunk-SU7QO6Z2.mjs";
5
5
  export {
6
6
  createAstroConfigs
7
7
  };
@@ -2,7 +2,7 @@ import {
2
2
  baseRules,
3
3
  createTypedLanguageOptions,
4
4
  typeDrivenRules
5
- } from "./chunk-2PDLILVN.mjs";
5
+ } from "./chunk-SU7QO6Z2.mjs";
6
6
 
7
7
  // src/constants/nest-entrypoint-file-patterns.ts
8
8
  var nestEntrypointFilePatterns = [
@@ -130,4 +130,4 @@ function createNestConfigs(pluginReference) {
130
130
  export {
131
131
  createNestConfigs
132
132
  };
133
- //# sourceMappingURL=chunk-PDE4244X.mjs.map
133
+ //# sourceMappingURL=chunk-24YEIN4M.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants/nest-entrypoint-file-patterns.ts","../src/constants/nest-framework-hook-names.ts","../src/nest/configs.ts"],"sourcesContent":["// Entrypoints de un proyecto Nest donde exigir Promise<Result> no aplica:\n// el bootstrap debe crashear ruidoso, no modelar errores de dominio.\n// Globs (matchean en cualquier carpeta), basados en proyectos reales:\n// main.ts, main.module.ts/app.module.ts, instrumentation.ts, app-cluster.ts.\nexport const nestEntrypointFilePatterns = [\n \"src/main.ts\",\n \"src/app-cluster.ts\",\n \"src/instrumentation.ts\",\n];\n","// Métodos públicos que NO cuentan hacia el límite porque son callbacks del\n// framework (NestJS): los llama el container/router/HTTP layer, nunca el\n// código de negocio. Contarlos forzaría refactors sin semántica.\nexport const nestFrameworkHookNames = [\n // Lifecycle hooks — https://docs.nestjs.com/fundamentals/lifecycle-events\n \"onModuleInit\",\n \"onModuleDestroy\",\n \"onApplicationBootstrap\",\n \"onApplicationShutdown\",\n \"beforeApplicationShutdown\",\n // Interfaces del request pipeline\n \"canActivate\", // CanActivate (Guard)\n \"intercept\", // NestInterceptor\n \"transform\", // PipeTransform\n \"catch\", // ExceptionFilter\n \"use\", // NestMiddleware\n];\n","import { nestEntrypointFilePatterns } from \"#/constants/nest-entrypoint-file-patterns\";\nimport { nestFrameworkHookNames } from \"#/constants/nest-framework-hook-names\";\nimport {\n baseRules,\n createTypedLanguageOptions,\n type OpinionatedConfigList,\n type OpinionatedPluginReference,\n typeDrivenRules,\n} from \"#/shared/configs\";\n\nexport function createNestConfigs(\n pluginReference: OpinionatedPluginReference,\n) {\n const typedLanguageOptions = createTypedLanguageOptions();\n\n return [\n // El dominio completo (services, controllers, modules, guards, ...).\n // Las carpetas fuera de src (dev/, scripts/, e2e/, integration-test/)\n // quedan fuera del preset a propósito: no son la app.\n {\n files: [\"src/**/*.ts\"],\n languageOptions: typedLanguageOptions,\n name: \"skapxd/nest/base\",\n // Solo el plugin skapxd: las reglas de typescript-eslint entran\n // re-registradas bajo nuestro namespace (typeDrivenRules).\n plugins: { skapxd: pluginReference },\n rules: {\n ...baseRules,\n ...typeDrivenRules,\n // Nota: class-properties-require-readonly viene de las bases sin\n // override — la exención de la capa de persistencia es por\n // PROPIEDAD (decoradores @Prop/@Column verificados contra los\n // imports de @nestjs/mongoose/typeorm), no por nombre de archivo.\n // La regla agnóstica de las bases, con el conocimiento del\n // framework inyectado: los hooks de Nest (onModuleInit,\n // canActivate, intercept, ...) no cuentan como superficie pública.\n \"skapxd/max-public-methods\": [\n \"error\",\n { ignore: [...nestFrameworkHookNames] },\n ],\n // Todo await resuelve en Result, salvo los entrypoints (main.ts,\n // instrumentation): ahí el bootstrap debe crashear ruidoso.\n \"skapxd/await-requires-result\": [\n \"error\",\n { allowFilePatterns: [...nestEntrypointFilePatterns] },\n ],\n // El contrato HTTP se documenta en los DTOs (@ApiProperty), no en el\n // controller: el plugin @nestjs/swagger introspecciona el resto.\n \"skapxd/nest-dto-requires-api-property\": \"error\",\n // Los DTOs de input validan en runtime con class-validator (+ @Type\n // de class-transformer para anidados); los out-*/-response quedan\n // exentos: el server los produce, no los recibe.\n \"skapxd/nest-dto-requires-validation\": \"error\",\n // El controller es la frontera: consume el Result con match() y\n // traduce a DTO o HttpException. Devolverlo crudo serializa el\n // envelope { ok, error } al cliente.\n \"skapxd/nest-no-result-response\": \"error\",\n \"skapxd/nest-no-swagger-in-controllers\": \"error\",\n // Configuración del proyecto verificada por el lint: el plugin de\n // swagger en nest-cli.json (la premisa de las reglas de swagger) y\n // un ValidationPipe con transform + whitelist (la premisa de las\n // reglas de DTOs).\n \"skapxd/nest-requires-swagger-plugin\": \"error\",\n \"skapxd/nest-validation-pipe-config\": \"error\",\n },\n },\n // En services, las dependencias entran por el constructor (DI), no con\n // `new`.\n {\n files: [\"src/**/*.service.ts\"],\n name: \"skapxd/nest/services\",\n plugins: { skapxd: pluginReference },\n rules: {\n \"skapxd/nest-no-direct-instantiation\": \"error\",\n },\n },\n // La forma de controllers y gateways la dicta el framework (un método\n // por ruta/evento): ahí el límite de métodos públicos no aporta\n // semántica. Y 2+ query params individuales son un DTO disfrazado.\n {\n files: [\"src/**/*.controller.ts\", \"src/**/*.gateway.ts\"],\n name: \"skapxd/nest/controllers\",\n plugins: { skapxd: pluginReference },\n rules: {\n \"skapxd/max-public-methods\": \"off\",\n \"skapxd/nest-no-inline-query-params\": \"error\",\n },\n },\n // Specs colocados: los tests awaitean helpers y SUTs libremente, y\n // descartar un Result en una aserción no es perder un trace.\n {\n files: [\"**/*.spec.ts\", \"**/*.e2e-spec.ts\"],\n name: \"skapxd/nest/tests\",\n plugins: { skapxd: pluginReference },\n rules: {\n // El `!` sobre un fixture cuya existencia el propio test garantiza\n // no es mentirle al compilador: es el arrange. no-floating-promises\n // sí queda activa — un await olvidado en un spec es un falso verde.\n \"skapxd/await-requires-result\": \"off\",\n \"skapxd/no-non-null-assertion\": \"off\",\n \"skapxd/no-try-catch\": \"off\",\n \"skapxd/result-error-requires-handling\": \"off\",\n },\n },\n ] satisfies OpinionatedConfigList;\n}\n"],"mappings":";;;;;;;AAIO,IAAM,6BAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AACF;;;ACLO,IAAM,yBAAyB;AAAA;AAAA,EAEpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;;;ACNO,SAAS,kBACd,iBACA;AACA,QAAM,uBAAuB,2BAA2B;AAExD,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL;AAAA,MACE,OAAO,CAAC,aAAa;AAAA,MACrB,iBAAiB;AAAA,MACjB,MAAM;AAAA;AAAA;AAAA,MAGN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQH,6BAA6B;AAAA,UAC3B;AAAA,UACA,EAAE,QAAQ,CAAC,GAAG,sBAAsB,EAAE;AAAA,QACxC;AAAA;AAAA;AAAA,QAGA,gCAAgC;AAAA,UAC9B;AAAA,UACA,EAAE,mBAAmB,CAAC,GAAG,0BAA0B,EAAE;AAAA,QACvD;AAAA;AAAA;AAAA,QAGA,yCAAyC;AAAA;AAAA;AAAA;AAAA,QAIzC,uCAAuC;AAAA;AAAA;AAAA;AAAA,QAIvC,kCAAkC;AAAA,QAClC,yCAAyC;AAAA;AAAA;AAAA;AAAA;AAAA,QAKzC,uCAAuC;AAAA,QACvC,sCAAsC;AAAA,MACxC;AAAA,IACF;AAAA;AAAA;AAAA,IAGA;AAAA,MACE,OAAO,CAAC,qBAAqB;AAAA,MAC7B,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,QACL,uCAAuC;AAAA,MACzC;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA,MACE,OAAO,CAAC,0BAA0B,qBAAqB;AAAA,MACvD,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,QACL,6BAA6B;AAAA,QAC7B,sCAAsC;AAAA,MACxC;AAAA,IACF;AAAA;AAAA;AAAA,IAGA;AAAA,MACE,OAAO,CAAC,gBAAgB,kBAAkB;AAAA,MAC1C,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA;AAAA;AAAA;AAAA,QAIL,gCAAgC;AAAA,QAChC,gCAAgC;AAAA,QAChC,uBAAuB;AAAA,QACvB,yCAAyC;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACF;","names":[]}