@skapxd/eslint-opinionated 0.15.0 → 0.16.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.
- package/README.md +117 -35
- package/dist/astro/index.js +0 -3
- package/dist/astro/index.js.map +1 -1
- package/dist/astro/index.mjs +2 -2
- package/dist/{chunk-F6GJW5A4.mjs → chunk-4FQ7SFU4.mjs} +31 -35
- package/dist/chunk-4FQ7SFU4.mjs.map +1 -0
- package/dist/{chunk-DJDXQWCP.mjs → chunk-7OIMY5TI.mjs} +2 -2
- package/dist/{chunk-O5BXMSNR.mjs → chunk-LSLLVT64.mjs} +7 -14
- package/dist/chunk-LSLLVT64.mjs.map +1 -0
- package/dist/{chunk-MLFXSEY7.mjs → chunk-X2DU5BAB.mjs} +101 -27
- package/dist/chunk-X2DU5BAB.mjs.map +1 -0
- package/dist/{chunk-OVC5GQV3.mjs → chunk-YRWX3POD.mjs} +2 -2
- package/dist/index.js +135 -72
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -6
- package/dist/index.mjs.map +1 -1
- package/dist/nest/index.d.mts +9 -13
- package/dist/nest/index.d.ts +9 -13
- package/dist/nest/index.js +29 -38
- package/dist/nest/index.js.map +1 -1
- package/dist/nest/index.mjs +2 -2
- package/dist/next/index.js +0 -3
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs +2 -2
- package/dist/shared/index.d.mts +12 -14
- package/dist/shared/index.d.ts +12 -14
- package/dist/shared/index.js +129 -59
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/index.mjs +2 -2
- package/package.json +1 -1
- package/dist/chunk-F6GJW5A4.mjs.map +0 -1
- package/dist/chunk-MLFXSEY7.mjs.map +0 -1
- package/dist/chunk-O5BXMSNR.mjs.map +0 -1
- /package/dist/{chunk-DJDXQWCP.mjs.map → chunk-7OIMY5TI.mjs.map} +0 -0
- /package/dist/{chunk-OVC5GQV3.mjs.map → chunk-YRWX3POD.mjs.map} +0 -0
package/README.md
CHANGED
|
@@ -98,11 +98,11 @@ la que defiende el axioma más fundamental (el orden es jerárquico).
|
|
|
98
98
|
|
|
99
99
|
| # | Axioma | Reglas que lo ejecutan |
|
|
100
100
|
| --- | --- | --- |
|
|
101
|
-
| A1 | **Los estados imposibles son irrepresentables.** El tipo modela exactamente los estados válidos; lo inválido no compila. | `prefer-tagged-union-state`, `no-runtime-state-guard`, `requires-strict-tsconfig`, `no-impossible-branch`, `no-explicit-any`, `
|
|
102
|
-
| A2 | **Ningún efecto es invisible al tipo.** Si una operación puede fallar, su firma lo confiesa — no una convención oral ni un `throw` sorpresa. | `await-requires-result`, `no-try-catch`, `no-promise-chain`, `no-ad-hoc-ok-result`,
|
|
101
|
+
| A1 | **Los estados imposibles son irrepresentables.** El tipo modela exactamente los estados válidos; lo inválido no compila. | `prefer-tagged-union-state`, `no-runtime-state-guard`, `requires-strict-tsconfig`, `no-impossible-branch`, `no-explicit-any`, `prefer-type-over-interface` |
|
|
102
|
+
| A2 | **Ningún efecto es invisible al tipo.** Si una operación puede fallar, su firma lo confiesa — no una convención oral ni un `throw` sorpresa. | `await-requires-result`, `no-try-catch`, `no-promise-chain`, `no-ad-hoc-ok-result`, `no-floating-promises` |
|
|
103
103
|
| A3 | **La información no se destruye.** Un error que se transforma conserva su `cause`; uno que se detecta llega a alguien. Nadie decide "esto no importa" en silencio. | `result-error-requires-cause`, `result-error-requires-handling` |
|
|
104
104
|
| A4 | **Una unidad, una responsabilidad, un nombre semántico.** El árbol de archivos cuenta una historia; una clase expone una intención. | `one-root-function-per-file`, `max-public-methods`, `no-default-export`, `jsx-return-name-pascal-case`, `max-hook-size` |
|
|
105
|
-
| A5 | **Las decisiones se declaran, no se interpretan.** Cada rama es explícita y exhaustiva; un caso ignorado es una decisión visible, no un hueco. | `no-else`, `no-nested-if`, `prefer-ts-pattern`,
|
|
105
|
+
| A5 | **Las decisiones se declaran, no se interpretan.** Cada rama es explícita y exhaustiva; un caso ignorado es una decisión visible, no un hueco. | `no-else`, `no-nested-if`, `prefer-ts-pattern`, `no-silenced-compiler`, el `void promesa()` de `no-floating-promises` |
|
|
106
106
|
| A6 | **Evidencia sobre convención.** Una regla decide por lo que el type-checker o los imports demuestran, no por cómo se llama un archivo o un campo. | la implementación type-aware de las reglas de Result, `nest-no-direct-instantiation` (@Injectable resuelto por símbolo), la exención ORM por decorador de `class-properties-require-readonly` |
|
|
107
107
|
| A7 | **Las fronteras son explícitas y únicas.** Lo que cruza una capa lo hace por un contrato, una sola vez, sin túneles. | `no-deep-relative-imports`, `no-tunnel-props`, `nest-no-result-response`, `nest-no-swagger-in-controllers`, `nest-no-inline-query-params` |
|
|
108
108
|
| A8 | **Inmutable por defecto.** La mutación es la excepción que se pide con evidencia, no el estado natural de las cosas. | `class-properties-require-readonly`, `no-accessors` |
|
|
@@ -333,7 +333,7 @@ El orden no es arbitrario: va de "cada hallazgo es un bug que ya tienes" hacia
|
|
|
333
333
|
**Ola 1 — bugs gratis y fixes únicos.** Señal pura, arreglo puntual, cero
|
|
334
334
|
rediseño. Aquí el equipo aprende que el linter encuentra cosas reales:
|
|
335
335
|
|
|
336
|
-
-
|
|
336
|
+
- `skapxd/no-floating-promises` — cada hallazgo es un error que
|
|
337
337
|
hoy muere sin que nadie lo vea (en un backend real en producción: 12).
|
|
338
338
|
- `skapxd/nest-requires-swagger-plugin` y `skapxd/nest-validation-pipe-config`
|
|
339
339
|
— un hallazgo por proyecto, un fix de configuración, y quedan vigiladas las
|
|
@@ -398,8 +398,9 @@ diseño, no solo disciplina. Para cuando el equipo ya vio el patrón en la ola 3
|
|
|
398
398
|
- `requires-strict-tsconfig` al máximo: `["strict", "noImplicitReturns",
|
|
399
399
|
"noUncheckedIndexedAccess"]`. Sube un flag a la vez — cada uno aflora
|
|
400
400
|
errores de compilación que son bugs latentes, no burocracia.
|
|
401
|
-
-
|
|
402
|
-
`
|
|
401
|
+
- `skapxd/no-explicit-any`, `skapxd/no-non-null-assertion` y
|
|
402
|
+
`skapxd/no-silenced-compiler` — se cierran las tres puertas de escape del
|
|
403
|
+
compilador.
|
|
403
404
|
- `skapxd/class-properties-require-readonly` — el cambio se modela con
|
|
404
405
|
instancias nuevas.
|
|
405
406
|
- `skapxd/prefer-tagged-union-state` y `skapxd/no-runtime-state-guard` — los
|
|
@@ -677,7 +678,7 @@ Detalles del preset:
|
|
|
677
678
|
se escribe `void bootstrap();` — fire-and-forget declarado.
|
|
678
679
|
- Los specs colocados (`*.spec.ts`, `*.e2e-spec.ts`) relajan
|
|
679
680
|
`await-requires-result`, `no-try-catch`, `result-error-requires-handling` y
|
|
680
|
-
|
|
681
|
+
`no-non-null-assertion` (el `!` sobre un fixture es el
|
|
681
682
|
arrange del test): un test awaitea helpers libremente y descartar un Result
|
|
682
683
|
en una aserción no es perder un trace. `no-floating-promises` sigue activa
|
|
683
684
|
en specs: un `await` olvidado es un falso verde.
|
|
@@ -819,7 +820,11 @@ de cada regla):
|
|
|
819
820
|
| `no-default-export` | `allowFilePatterns` (globs, aditivos a los integrados) |
|
|
820
821
|
| `no-else` | `allowFilePatterns` (globs) |
|
|
821
822
|
| `no-emoji` | `allowFilePatterns` (globs) |
|
|
823
|
+
| `no-explicit-any` | las de la regla original de typescript-eslint (`fixToUnknown`, ...) |
|
|
824
|
+
| `no-floating-promises` | las de la regla original de typescript-eslint (`ignoreVoid`, `allowList`, ...) |
|
|
822
825
|
| `no-impossible-branch` | las de la regla original de typescript-eslint (`allowConstantLoopConditions`, ...) |
|
|
826
|
+
| `no-silenced-compiler` | las de `ban-ts-comment` (`ts-expect-error`, `ts-ignore`, `ts-nocheck`, `minimumDescriptionLength`) |
|
|
827
|
+
| `prefer-type-over-interface` | la de `consistent-type-definitions` (`"type"` o `"interface"`; los presets pasan `"type"`) |
|
|
823
828
|
| `no-functions-inside-components` | `allowJsxCallbacks`, `allowArrayMapCallbacks` (ambas `true` por defecto) |
|
|
824
829
|
| `no-nested-if` | `allowFilePatterns` (globs) |
|
|
825
830
|
| `no-promise-chain` | `methods` |
|
|
@@ -863,12 +868,17 @@ matchea en cualquier carpeta). Las 7 reglas restantes no tienen opciones: su
|
|
|
863
868
|
| `skapxd/no-default-export` | 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. |
|
|
864
869
|
| `skapxd/no-else` | Prohíbe `else`/`else if`: el else es el estado sin nombre. Retorno anticipado, ternario simple o `match()`. |
|
|
865
870
|
| `skapxd/no-emoji` | Prohíbe emojis en strings y JSX; cada sistema los renderiza distinto. Usa un icono SVG. |
|
|
871
|
+
| `skapxd/no-explicit-any` | Prohíbe `any`: apaga el sistema de tipos donde más se necesita. `unknown` para lo desconocido, el tipo real para lo demás. Wrapper de typescript-eslint. |
|
|
872
|
+
| `skapxd/no-floating-promises` | Promesas sin `await` ni `void`: el rechazo muere sin pasar por trySafe. El mensaje corrige el consejo upstream (`.then/.catch` aquí están prohibidos). Wrapper de typescript-eslint. |
|
|
866
873
|
| `skapxd/no-impossible-branch` | Condiciones que el type-checker demuestra constantes: la pregunta ya tiene respuesta. Es `@typescript-eslint/no-unnecessary-condition` con nombre semántico y mensajes que enseñan el fix. |
|
|
867
874
|
| `skapxd/no-nested-if` | Prohíbe `if` anidados: retorno anticipado o `match()`. Menos carga cognitiva y sin puntos ciegos para las demás reglas. |
|
|
875
|
+
| `skapxd/no-non-null-assertion` | Prohíbe el `!`: es "cállate, yo sé más que tú" dicho al compilador. Modela el tipo o maneja la duda. Wrapper de typescript-eslint. |
|
|
868
876
|
| `skapxd/no-runtime-state-guard` | Prohíbe `if (this.x) throw` en métodos: el estado inválido se hace irrepresentable en el tipo, no se vigila en runtime. |
|
|
877
|
+
| `skapxd/no-silenced-compiler` | 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`. |
|
|
869
878
|
| `skapxd/no-tunnel-props` | Ninguna prop viaja más de un nivel: quien la recibe no puede reenviarla a otro componente. Mata el prop drilling. |
|
|
870
879
|
| `skapxd/prefer-abort-signal` | Listeners en efectos se limpian con `AbortController` (`{ signal }` + `abort()`), no con `removeEventListener`. |
|
|
871
880
|
| `skapxd/prefer-tagged-union-state` | Prohíbe estados inconsistentes representables: flag de loading + campo de error independientes → unión etiquetada. |
|
|
881
|
+
| `skapxd/prefer-type-over-interface` | Las uniones discriminadas son types; un `type` no crece en silencio por declaration merging. Wrapper de `consistent-type-definitions`. |
|
|
872
882
|
| `skapxd/no-functions-inside-components` | Prohíbe definir funciones dentro de componentes React. |
|
|
873
883
|
| `skapxd/no-try-catch` | Prohíbe `try/catch`; usa `trySafe` de `@skapxd/result`. |
|
|
874
884
|
| `skapxd/no-promise-chain` | Prohíbe `.then/.catch/.finally`; usa `await` (+ `trySafe`). |
|
|
@@ -995,34 +1005,29 @@ Fuera del default, a propósito: `exactOptionalPropertyTypes` y
|
|
|
995
1005
|
con muchas librerías — se agregan vía `requiredCompilerOptions` si el
|
|
996
1006
|
proyecto los soporta.
|
|
997
1007
|
|
|
998
|
-
Además, los **presets tipados activan reglas curadas de typescript-eslint
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
`array[i]` miente y la regla acusaría guards necesarios.
|
|
1022
|
-
- `@typescript-eslint/ban-ts-comment` — un error de tipos se arregla
|
|
1023
|
-
modelando mejor, no silenciando la alarma: `@ts-ignore` y `@ts-nocheck`
|
|
1024
|
-
prohibidos. `@ts-expect-error` **con descripción** queda permitido: es la
|
|
1025
|
-
forma legítima de testear que un estado inválido de verdad no compila.
|
|
1008
|
+
Además, los **presets tipados activan reglas curadas de typescript-eslint**,
|
|
1009
|
+
todas **re-registradas bajo el namespace skapxd** (mismo motor, cero
|
|
1010
|
+
reimplementación — typescript-eslint ya es peer dependency): nombres que
|
|
1011
|
+
dicen lo que defienden, mensajes en español que enseñan el fix, y un solo
|
|
1012
|
+
namespace en toda tu lista de pendientes. Cada una tiene su sección propia:
|
|
1013
|
+
|
|
1014
|
+
- `skapxd/no-explicit-any` — `any` apaga el sistema de tipos: todo el
|
|
1015
|
+
esfuerzo muere donde aparece uno.
|
|
1016
|
+
- `skapxd/prefer-type-over-interface` (era `consistent-type-definitions`) —
|
|
1017
|
+
las uniones discriminadas son types.
|
|
1018
|
+
- `skapxd/no-floating-promises` — cierra el hueco que `await-requires-result`
|
|
1019
|
+
no ve: una llamada async **sin** `await` no produce `AwaitExpression`, así
|
|
1020
|
+
que el rechazo muere sin pasar por `trySafe` (medido: 12 promesas
|
|
1021
|
+
flotantes vivas en un backend Nest real).
|
|
1022
|
+
- `skapxd/no-non-null-assertion` — `!` es "cállate, yo sé más que tú" dicho
|
|
1023
|
+
al compilador. (En `nest/tests` queda apagada: el `!` sobre un fixture es
|
|
1024
|
+
el arrange, no una mentira.)
|
|
1025
|
+
- `skapxd/no-impossible-branch` (era `no-unnecessary-condition`) — la
|
|
1026
|
+
generalización type-aware de `no-runtime-state-guard`. Va de la mano de
|
|
1027
|
+
`requires-strict-tsconfig`: sin `noUncheckedIndexedAccess`, `array[i]`
|
|
1028
|
+
miente y la regla acusaría guards necesarios.
|
|
1029
|
+
- `skapxd/no-silenced-compiler` (era `ban-ts-comment`) — un error de tipos
|
|
1030
|
+
se arregla modelando mejor, no silenciando la alarma.
|
|
1026
1031
|
|
|
1027
1032
|
Ausencias deliberadas, no olvidos:
|
|
1028
1033
|
|
|
@@ -1907,6 +1912,83 @@ del críptico "Unnecessary conditional". Los presets tipados activan este
|
|
|
1907
1912
|
nombre y **no** el original: una sola fuente de verdad para configurarla,
|
|
1908
1913
|
silenciarla o buscarla.
|
|
1909
1914
|
|
|
1915
|
+
### `skapxd/no-explicit-any`
|
|
1916
|
+
|
|
1917
|
+
Prohíbe `any`. No es una regla de estilo: `any` apaga el sistema de tipos en
|
|
1918
|
+
todo lo que toca — el esfuerzo de modelar estados imposibles muere donde
|
|
1919
|
+
aparece uno, y se propaga en silencio a cada valor derivado. El mensaje
|
|
1920
|
+
enseña la salida: `unknown` para lo genuinamente desconocido (obliga a
|
|
1921
|
+
estrechar antes de usar — la duda queda declarada y verificada), el tipo
|
|
1922
|
+
real para lo que tiene forma conocida.
|
|
1923
|
+
|
|
1924
|
+
Bajo el capó es `@typescript-eslint/no-explicit-any`
|
|
1925
|
+
([doc original](https://typescript-eslint.io/rules/no-explicit-any/))
|
|
1926
|
+
re-registrada bajo nuestro namespace con mensajes que enseñan (ver
|
|
1927
|
+
`skapxd/no-impossible-branch` para el patrón). Los presets tipados activan
|
|
1928
|
+
este nombre, no el original.
|
|
1929
|
+
|
|
1930
|
+
### `skapxd/no-floating-promises`
|
|
1931
|
+
|
|
1932
|
+
Una llamada async **sin** `await` no produce `AwaitExpression` — es el punto
|
|
1933
|
+
ciego de `await-requires-result`: el rechazo muere sin pasar por `trySafe`,
|
|
1934
|
+
sin trace y sin que nadie lo decidiera (medido al absorberla: 12 promesas
|
|
1935
|
+
flotantes vivas en un backend en producción).
|
|
1936
|
+
|
|
1937
|
+
Esta regla existía en typescript-eslint
|
|
1938
|
+
([doc original](https://typescript-eslint.io/rules/no-floating-promises/)),
|
|
1939
|
+
pero su mensaje recomendaba *"end with a call to `.catch`, or end with a
|
|
1940
|
+
call to `.then` with a rejection handler"* — **dos caminos que
|
|
1941
|
+
`no-promise-chain` prohíbe**. Obedecer a una regla te estrellaba con la
|
|
1942
|
+
otra. El wrapper corrige el consejo para este sistema: las dos salidas
|
|
1943
|
+
legales son `await` (y ahí entra el pipeline de Result) o `void promesa()`
|
|
1944
|
+
— el fire-and-forget declarado y greppeable del axioma A5 (así se escribe
|
|
1945
|
+
el `bootstrap()` del `main.ts` de Nest: `void bootstrap();`).
|
|
1946
|
+
|
|
1947
|
+
### `skapxd/no-non-null-assertion`
|
|
1948
|
+
|
|
1949
|
+
Prohíbe el `!` (non-null assertion): es "cállate, yo sé más que tú" dicho al
|
|
1950
|
+
compilador — y un `!` equivocado es un crash en runtime que el tipo juraba
|
|
1951
|
+
imposible. Si el valor de verdad no puede ser nulo, que lo diga el tipo
|
|
1952
|
+
(modela mejor, o estrecha con un guard que el compilador verifique); si
|
|
1953
|
+
puede serlo, el `!` no resuelve la duda: la esconde.
|
|
1954
|
+
|
|
1955
|
+
La excepción legítima vive en los tests: el `!` sobre un fixture cuya
|
|
1956
|
+
existencia el propio test garantiza es el arrange, no una mentira — por eso
|
|
1957
|
+
`nest/tests` la apaga en specs. Bajo el capó es
|
|
1958
|
+
`@typescript-eslint/no-non-null-assertion`
|
|
1959
|
+
([doc original](https://typescript-eslint.io/rules/no-non-null-assertion/))
|
|
1960
|
+
re-registrada con mensajes propios.
|
|
1961
|
+
|
|
1962
|
+
### `skapxd/no-silenced-compiler`
|
|
1963
|
+
|
|
1964
|
+
No silencies al compilador: `@ts-ignore` y `@ts-nocheck` apagan la alarma en
|
|
1965
|
+
vez de arreglar el incendio. Si el compilador es el muro de contención del
|
|
1966
|
+
sistema, nadie lo apaga cuando el modelado se pone difícil — un error de
|
|
1967
|
+
tipos se resuelve modelando mejor el dominio.
|
|
1968
|
+
|
|
1969
|
+
La puerta que queda abierta, a propósito: `@ts-expect-error` **con
|
|
1970
|
+
descripción**. Es la forma legítima de testear que un estado inválido de
|
|
1971
|
+
verdad NO compila (la otra mitad son los tests de tipos con `expectTypeOf`,
|
|
1972
|
+
ver la sección de `requires-strict-tsconfig`) — y a diferencia de
|
|
1973
|
+
`@ts-ignore`, avisa cuando la supresión deja de hacer falta. Bajo el capó es
|
|
1974
|
+
`@typescript-eslint/ban-ts-comment`
|
|
1975
|
+
([doc original](https://typescript-eslint.io/rules/ban-ts-comment/)) con un
|
|
1976
|
+
nombre que dice lo que defiende y mensajes propios.
|
|
1977
|
+
|
|
1978
|
+
### `skapxd/prefer-type-over-interface`
|
|
1979
|
+
|
|
1980
|
+
Usa `type`, no `interface`. Las uniones discriminadas — la columna vertebral
|
|
1981
|
+
del modelado de estados de este paquete — son types, y la homogeneidad
|
|
1982
|
+
elimina la pregunta "¿esto puede crecer por declaration merging?": un `type`
|
|
1983
|
+
no puede ser extendido en silencio desde otro archivo; lo que declara es
|
|
1984
|
+
todo lo que hay.
|
|
1985
|
+
|
|
1986
|
+
Bajo el capó es `@typescript-eslint/consistent-type-definitions`
|
|
1987
|
+
([doc original](https://typescript-eslint.io/rules/consistent-type-definitions/))
|
|
1988
|
+
re-registrada con un nombre que declara la opinión (como los demás
|
|
1989
|
+
`prefer-*`). Ojo si la activas suelta: el default upstream prefiere
|
|
1990
|
+
`interface` — los presets la pasan como `["error", "type"]`.
|
|
1991
|
+
|
|
1910
1992
|
### `skapxd/no-functions-inside-components`
|
|
1911
1993
|
|
|
1912
1994
|
Prohíbe definir funciones **con peso propio** dentro de un componente React
|
package/dist/astro/index.js
CHANGED
|
@@ -64,9 +64,6 @@ function createBaseLanguageOptions() {
|
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
// src/shared/configs/create-shared-configs.ts
|
|
68
|
-
var import_typescript_eslint3 = __toESM(require("typescript-eslint"));
|
|
69
|
-
|
|
70
67
|
// src/shared/configs/create-typed-language-options.ts
|
|
71
68
|
var import_typescript_eslint2 = __toESM(require("typescript-eslint"));
|
|
72
69
|
function createTypedLanguageOptions() {
|
package/dist/astro/index.js.map
CHANGED
|
@@ -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-
|
|
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 \"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,EAC9B,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;;;ACnBA,+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"]}
|
package/dist/astro/index.mjs
CHANGED
|
@@ -11,9 +11,6 @@ function createTypedLanguageOptions() {
|
|
|
11
11
|
};
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
// src/shared/configs/create-shared-configs.ts
|
|
15
|
-
import tseslint3 from "typescript-eslint";
|
|
16
|
-
|
|
17
14
|
// src/shared/configs/base-rules.ts
|
|
18
15
|
var baseRules = {
|
|
19
16
|
"skapxd/class-properties-require-readonly": "error",
|
|
@@ -46,11 +43,30 @@ function createBaseLanguageOptions() {
|
|
|
46
43
|
|
|
47
44
|
// src/shared/configs/type-driven-rules.ts
|
|
48
45
|
var typeDrivenRules = {
|
|
46
|
+
// `any` apaga el sistema de tipos: todo el esfuerzo de modelar estados
|
|
47
|
+
// irrepresentables muere donde aparece uno. (Era no-explicit-any.)
|
|
48
|
+
"skapxd/no-explicit-any": "error",
|
|
49
|
+
// El hueco que await-requires-result no ve: una llamada async SIN await no
|
|
50
|
+
// produce AwaitExpression — el rechazo muere sin pasar por trySafe. La
|
|
51
|
+
// única salida sin await es `void promesa()`: fire-and-forget declarado.
|
|
52
|
+
// (Era no-floating-promises; el mensaje upstream recomendaba .then/.catch,
|
|
53
|
+
// que no-promise-chain prohíbe — el nuestro corrige el consejo.)
|
|
54
|
+
"skapxd/no-floating-promises": "error",
|
|
55
|
+
// La generalización type-aware de no-runtime-state-guard: si el tipo dice
|
|
56
|
+
// que un estado es imposible, el guard defensivo sobra — y si el guard
|
|
57
|
+
// hace falta, lo que está mal es el tipo. Requiere el tsconfig de
|
|
58
|
+
// requires-strict-tsconfig para ser sólida: sin noUncheckedIndexedAccess,
|
|
59
|
+
// `array[i]` miente y esta regla acusaría guards necesarios.
|
|
60
|
+
// (Era no-unnecessary-condition.)
|
|
61
|
+
"skapxd/no-impossible-branch": "error",
|
|
62
|
+
// `!` es "cállate, yo sé más que tú" dicho al compilador. Si el valor no
|
|
63
|
+
// puede ser nulo, que lo diga el tipo; si puede serlo, hay que modelarlo.
|
|
64
|
+
"skapxd/no-non-null-assertion": "error",
|
|
49
65
|
// Silenciar la alarma no arregla el incendio: un error de tipos se
|
|
50
66
|
// resuelve modelando mejor, no apagando el compilador. @ts-expect-error
|
|
51
67
|
// queda permitido CON descripción: es la forma legítima de testear que un
|
|
52
|
-
// estado inválido de verdad no compila.
|
|
53
|
-
"
|
|
68
|
+
// estado inválido de verdad no compila. (Era ban-ts-comment.)
|
|
69
|
+
"skapxd/no-silenced-compiler": [
|
|
54
70
|
"error",
|
|
55
71
|
{
|
|
56
72
|
"ts-expect-error": "allow-with-description",
|
|
@@ -60,27 +76,9 @@ var typeDrivenRules = {
|
|
|
60
76
|
],
|
|
61
77
|
// `type` en vez de `interface`: las uniones discriminadas son types, y la
|
|
62
78
|
// homogeneidad evita el "¿esto se puede extender por declaration merging?"
|
|
63
|
-
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
"@typescript-eslint/no-explicit-any": "error",
|
|
67
|
-
// El hueco que await-requires-result no ve: una llamada async SIN await no
|
|
68
|
-
// produce AwaitExpression — el rechazo muere sin pasar por trySafe. Esta
|
|
69
|
-
// regla obliga a awaitear (y ahí entra el pipeline de Result). El operador
|
|
70
|
-
// `void promesa` queda como única salida: fire-and-forget declarado y
|
|
71
|
-
// greppeable, no interpretado.
|
|
72
|
-
"@typescript-eslint/no-floating-promises": "error",
|
|
73
|
-
// `!` es "cállate, yo sé más que tú" dicho al compilador. Si el valor no
|
|
74
|
-
// puede ser nulo, que lo diga el tipo; si puede serlo, hay que modelarlo.
|
|
75
|
-
"@typescript-eslint/no-non-null-assertion": "error",
|
|
76
|
-
// La generalización type-aware de no-runtime-state-guard: si el tipo dice
|
|
77
|
-
// que un estado es imposible, el guard defensivo sobra — y si el guard
|
|
78
|
-
// hace falta, lo que está mal es el tipo. Requiere el tsconfig de
|
|
79
|
-
// requires-strict-tsconfig para ser sólida: sin noUncheckedIndexedAccess,
|
|
80
|
-
// `array[i]` miente y esta regla acusaría guards necesarios.
|
|
81
|
-
// Es @typescript-eslint/no-unnecessary-condition re-registrada bajo un
|
|
82
|
-
// nombre que dice lo que defiende, con mensajes que enseñan el fix.
|
|
83
|
-
"skapxd/no-impossible-branch": "error"
|
|
79
|
+
// (Era consistent-type-definitions, cuyo default upstream es `interface` —
|
|
80
|
+
// por eso la opción explícita.)
|
|
81
|
+
"skapxd/prefer-type-over-interface": ["error", "type"]
|
|
84
82
|
};
|
|
85
83
|
|
|
86
84
|
// src/shared/configs/create-shared-configs.ts
|
|
@@ -91,10 +89,11 @@ function createSharedConfigs(pluginReference) {
|
|
|
91
89
|
backend: {
|
|
92
90
|
languageOptions: typedLanguageOptions,
|
|
93
91
|
name: "skapxd/shared/backend",
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
92
|
+
// Solo el plugin skapxd: las reglas de typescript-eslint entran
|
|
93
|
+
// re-registradas bajo nuestro namespace (typeDrivenRules), así el
|
|
94
|
+
// consumidor puede registrar su propia instancia de tseslint sin
|
|
95
|
+
// chocar con "Cannot redefine plugin".
|
|
96
|
+
plugins: { skapxd: pluginReference },
|
|
98
97
|
rules: {
|
|
99
98
|
...baseRules,
|
|
100
99
|
...typeDrivenRules,
|
|
@@ -116,10 +115,7 @@ function createSharedConfigs(pluginReference) {
|
|
|
116
115
|
frontend: {
|
|
117
116
|
languageOptions: typedLanguageOptions,
|
|
118
117
|
name: "skapxd/shared/frontend",
|
|
119
|
-
plugins: {
|
|
120
|
-
"@typescript-eslint": tseslint3.plugin,
|
|
121
|
-
skapxd: pluginReference
|
|
122
|
-
},
|
|
118
|
+
plugins: { skapxd: pluginReference },
|
|
123
119
|
rules: {
|
|
124
120
|
...baseRules,
|
|
125
121
|
...typeDrivenRules,
|
|
@@ -174,4 +170,4 @@ export {
|
|
|
174
170
|
createSharedConfigs,
|
|
175
171
|
strictConfig
|
|
176
172
|
};
|
|
177
|
-
//# sourceMappingURL=chunk-
|
|
173
|
+
//# sourceMappingURL=chunk-4FQ7SFU4.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/configs/create-typed-language-options.ts","../src/shared/configs/base-rules.ts","../src/shared/configs/create-base-language-options.ts","../src/shared/configs/type-driven-rules.ts","../src/shared/configs/create-shared-configs.ts","../src/shared/configs/strict-config.ts"],"sourcesContent":["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","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 \"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","// Reglas de typescript-eslint que el diseño guiado por tipos exige, todas\n// re-registradas bajo el namespace skapxd (ver src/utils/wrap-tseslint-rule.ts):\n// mismo motor, cero reimplementación, pero con nombres que dicen lo que\n// defienden y mensajes que enseñan el fix — un solo namespace en toda la\n// lista de pendientes del consumidor.\n//\n// Ausencias deliberadas (no son olvidos):\n// - switch-exhaustiveness-check: prefer-ts-pattern prohíbe el switch entero;\n// match().exhaustive() da la misma garantía sin él.\n// - prefer-readonly: superada por class-properties-require-readonly, que\n// exige readonly en la declaración (no solo en privados nunca reasignados).\n// - strict-boolean-expressions: castiga narrowing legítimo por cientos\n// (560 hallazgos en un backend real) sin hacer irrepresentable ningún\n// estado nuevo. Ruido, no señal.\n// - explicit-module-boundary-types: los contratos que importan ya están\n// gobernados (Result en await-requires-result, respuestas de controller en\n// nest-no-result-response); anotar todo lo demás es ceremonia (198\n// hallazgos) que la inferencia resuelve sin perder garantías.\n// - prefer-readonly-parameter-types: impracticable con cualquier parámetro\n// que venga de una librería externa.\nexport const typeDrivenRules = {\n // `any` apaga el sistema de tipos: todo el esfuerzo de modelar estados\n // irrepresentables muere donde aparece uno. (Era no-explicit-any.)\n \"skapxd/no-explicit-any\": \"error\",\n // El hueco que await-requires-result no ve: una llamada async SIN await no\n // produce AwaitExpression — el rechazo muere sin pasar por trySafe. La\n // única salida sin await es `void promesa()`: fire-and-forget declarado.\n // (Era no-floating-promises; el mensaje upstream recomendaba .then/.catch,\n // que no-promise-chain prohíbe — el nuestro corrige el consejo.)\n \"skapxd/no-floating-promises\": \"error\",\n // La generalización type-aware de no-runtime-state-guard: si el tipo dice\n // que un estado es imposible, el guard defensivo sobra — y si el guard\n // hace falta, lo que está mal es el tipo. Requiere el tsconfig de\n // requires-strict-tsconfig para ser sólida: sin noUncheckedIndexedAccess,\n // `array[i]` miente y esta regla acusaría guards necesarios.\n // (Era no-unnecessary-condition.)\n \"skapxd/no-impossible-branch\": \"error\",\n // `!` es \"cállate, yo sé más que tú\" dicho al compilador. Si el valor no\n // puede ser nulo, que lo diga el tipo; si puede serlo, hay que modelarlo.\n \"skapxd/no-non-null-assertion\": \"error\",\n // Silenciar la alarma no arregla el incendio: un error de tipos se\n // resuelve modelando mejor, no apagando el compilador. @ts-expect-error\n // queda permitido CON descripción: es la forma legítima de testear que un\n // estado inválido de verdad no compila. (Era ban-ts-comment.)\n \"skapxd/no-silenced-compiler\": [\n \"error\",\n {\n \"ts-expect-error\": \"allow-with-description\",\n \"ts-ignore\": true,\n \"ts-nocheck\": true,\n },\n ],\n // `type` en vez de `interface`: las uniones discriminadas son types, y la\n // homogeneidad evita el \"¿esto se puede extender por declaration merging?\"\n // (Era consistent-type-definitions, cuyo default upstream es `interface` —\n // por eso la opción explícita.)\n \"skapxd/prefer-type-over-interface\": [\"error\", \"type\"],\n};\n","import { baseRules } from \"./base-rules\";\nimport { createBaseLanguageOptions } from \"./create-base-language-options\";\nimport { createTypedLanguageOptions } from \"./create-typed-language-options\";\nimport { typeDrivenRules } from \"./type-driven-rules\";\n\nexport function createSharedConfigs(pluginReference: unknown) {\n const baseLanguageOptions = createBaseLanguageOptions();\n const typedLanguageOptions = createTypedLanguageOptions();\n\n return {\n backend: {\n languageOptions: typedLanguageOptions,\n name: \"skapxd/shared/backend\",\n // Solo el plugin skapxd: las reglas de typescript-eslint entran\n // re-registradas bajo nuestro namespace (typeDrivenRules), así el\n // consumidor puede registrar su propia instancia de tseslint sin\n // chocar con \"Cannot redefine plugin\".\n plugins: { skapxd: pluginReference },\n rules: {\n ...baseRules,\n ...typeDrivenRules,\n // La regla obligatoria del sistema de errores es await-requires-result\n // (todo await resuelve en Result). async-functions-return-result queda\n // apagada por defecto: exigir la firma por decreto choca con los bordes\n // del framework y bloquea la adopción incremental; la presión sobre los\n // awaits produce el mismo estado final. Ver \"¿Por qué está apagada por\n // defecto?\" en el README.\n \"skapxd/await-requires-result\": \"error\",\n },\n },\n base: {\n languageOptions: baseLanguageOptions,\n name: \"skapxd/shared/base\",\n plugins: { skapxd: pluginReference },\n rules: baseRules,\n },\n frontend: {\n languageOptions: typedLanguageOptions,\n name: \"skapxd/shared/frontend\",\n plugins: { skapxd: pluginReference },\n rules: {\n ...baseRules,\n ...typeDrivenRules,\n // En el front no se obliga a retornar Result, pero todo await debe\n // resolver en uno: o la función llamada ya retorna Promise<Result>\n // (camino preferido: errores modelados en el dominio) o se envuelve\n // en trySafe en el sitio.\n \"skapxd/await-requires-result\": \"error\",\n \"skapxd/jsx-return-name-pascal-case\": \"error\",\n // Anti prop-drilling: ninguna prop viaja más de un nivel. Quien la\n // crea puede pasarla a UN hijo; quien la recibe no la reenvía —\n // estado y acciones a un store global o custom hook.\n \"skapxd/no-functions-inside-components\": \"error\",\n \"skapxd/no-tunnel-props\": \"error\",\n // Listeners en efectos: un AbortController por efecto, cleanup con\n // un solo abort() en vez de removeEventListener por listener.\n \"skapxd/prefer-abort-signal\": \"error\",\n \"skapxd/no-jsx-ternary-null\": \"error\",\n \"skapxd/max-hook-size\": [\n \"error\",\n {\n maxLines: 120,\n maxUseState: 1,\n },\n ],\n },\n },\n package: {\n languageOptions: baseLanguageOptions,\n name: \"skapxd/shared/package\",\n plugins: { skapxd: pluginReference },\n rules: {\n \"skapxd/one-root-function-per-file\": \"error\",\n },\n },\n };\n}\n","// Config endurecida: ignora TODOS los comentarios `eslint-disable` (y demás\n// directivas inline) en los archivos que cubre. Así ni una persona ni un agente\n// pueden saltarse una regla con `// eslint-disable-next-line`.\nexport const strictConfig = {\n linterOptions: {\n noInlineConfig: true,\n },\n name: \"skapxd/strict\",\n};\n"],"mappings":";AAAA,OAAO,cAAc;AAEd,SAAS,6BAA6B;AAC3C,SAAO;AAAA;AAAA;AAAA,IAGL,QAAQ,SAAS;AAAA,IACjB,eAAe;AAAA,MACb,gBAAgB;AAAA,IAClB;AAAA,EACF;AACF;;;ACXO,IAAM,YAAY;AAAA,EACvB,4CAA4C;AAAA,EAC5C,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,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;;;ACnBA,OAAOA,eAAc;AAId,SAAS,4BAA4B;AAC1C,SAAO;AAAA,IACL,QAAQA,UAAS;AAAA,EACnB;AACF;;;ACYO,IAAM,kBAAkB;AAAA;AAAA;AAAA,EAG7B,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM1B,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/B,+BAA+B;AAAA;AAAA;AAAA,EAG/B,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhC,+BAA+B;AAAA,IAC7B;AAAA,IACA;AAAA,MACE,mBAAmB;AAAA,MACnB,aAAa;AAAA,MACb,cAAc;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,qCAAqC,CAAC,SAAS,MAAM;AACvD;;;ACpDO,SAAS,oBAAoB,iBAA0B;AAC5D,QAAM,sBAAsB,0BAA0B;AACtD,QAAM,uBAAuB,2BAA2B;AAExD,SAAO;AAAA,IACL,SAAS;AAAA,MACP,iBAAiB;AAAA,MACjB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,MAKN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOH,gCAAgC;AAAA,MAClC;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IACA,UAAU;AAAA,MACR,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,QAKH,gCAAgC;AAAA,QAChC,sCAAsC;AAAA;AAAA;AAAA;AAAA,QAItC,yCAAyC;AAAA,QACzC,0BAA0B;AAAA;AAAA;AAAA,QAG1B,8BAA8B;AAAA,QAC9B,8BAA8B;AAAA,QAC9B,wBAAwB;AAAA,UACtB;AAAA,UACA;AAAA,YACE,UAAU;AAAA,YACV,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,QACL,qCAAqC;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AACF;;;ACzEO,IAAM,eAAe;AAAA,EAC1B,eAAe;AAAA,IACb,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAM;AACR;","names":["tseslint"]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
baseRules,
|
|
3
3
|
createBaseLanguageOptions,
|
|
4
4
|
createTypedLanguageOptions
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-4FQ7SFU4.mjs";
|
|
6
6
|
|
|
7
7
|
// src/astro/configs.ts
|
|
8
8
|
function createAstroConfigs(pluginReference) {
|
|
@@ -41,4 +41,4 @@ function createAstroConfigs(pluginReference) {
|
|
|
41
41
|
export {
|
|
42
42
|
createAstroConfigs
|
|
43
43
|
};
|
|
44
|
-
//# sourceMappingURL=chunk-
|
|
44
|
+
//# sourceMappingURL=chunk-7OIMY5TI.mjs.map
|
|
@@ -2,10 +2,7 @@ import {
|
|
|
2
2
|
baseRules,
|
|
3
3
|
createTypedLanguageOptions,
|
|
4
4
|
typeDrivenRules
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
|
|
7
|
-
// src/nest/configs.ts
|
|
8
|
-
import tseslint from "typescript-eslint";
|
|
5
|
+
} from "./chunk-4FQ7SFU4.mjs";
|
|
9
6
|
|
|
10
7
|
// src/constants/nest-entrypoint-file-patterns.ts
|
|
11
8
|
var nestEntrypointFilePatterns = [
|
|
@@ -46,10 +43,9 @@ function createNestConfigs(pluginReference) {
|
|
|
46
43
|
files: ["src/**/*.ts"],
|
|
47
44
|
languageOptions: typedLanguageOptions,
|
|
48
45
|
name: "skapxd/nest/base",
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
},
|
|
46
|
+
// Solo el plugin skapxd: las reglas de typescript-eslint entran
|
|
47
|
+
// re-registradas bajo nuestro namespace (typeDrivenRules).
|
|
48
|
+
plugins: { skapxd: pluginReference },
|
|
53
49
|
rules: {
|
|
54
50
|
...baseRules,
|
|
55
51
|
...typeDrivenRules,
|
|
@@ -117,16 +113,13 @@ function createNestConfigs(pluginReference) {
|
|
|
117
113
|
{
|
|
118
114
|
files: ["**/*.spec.ts", "**/*.e2e-spec.ts"],
|
|
119
115
|
name: "skapxd/nest/tests",
|
|
120
|
-
plugins: {
|
|
121
|
-
"@typescript-eslint": tseslint.plugin,
|
|
122
|
-
skapxd: pluginReference
|
|
123
|
-
},
|
|
116
|
+
plugins: { skapxd: pluginReference },
|
|
124
117
|
rules: {
|
|
125
118
|
// El `!` sobre un fixture cuya existencia el propio test garantiza
|
|
126
119
|
// no es mentirle al compilador: es el arrange. no-floating-promises
|
|
127
120
|
// sí queda activa — un await olvidado en un spec es un falso verde.
|
|
128
|
-
"@typescript-eslint/no-non-null-assertion": "off",
|
|
129
121
|
"skapxd/await-requires-result": "off",
|
|
122
|
+
"skapxd/no-non-null-assertion": "off",
|
|
130
123
|
"skapxd/no-try-catch": "off",
|
|
131
124
|
"skapxd/result-error-requires-handling": "off"
|
|
132
125
|
}
|
|
@@ -137,4 +130,4 @@ function createNestConfigs(pluginReference) {
|
|
|
137
130
|
export {
|
|
138
131
|
createNestConfigs
|
|
139
132
|
};
|
|
140
|
-
//# sourceMappingURL=chunk-
|
|
133
|
+
//# sourceMappingURL=chunk-LSLLVT64.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":["// @ts-nocheck\n// 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","// @ts-nocheck\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 typeDrivenRules,\n} from \"#/shared/configs\";\n\nexport function createNestConfigs(pluginReference: unknown) {\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 ];\n}\n"],"mappings":";;;;;;;AAKO,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;;;ACTO,SAAS,kBAAkB,iBAA0B;AAC1D,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":[]}
|