@skapxd/eslint-opinionated 2.0.0 → 3.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.
- package/README.md +64 -2386
- package/dist/astro/index.mjs +2 -2
- package/dist/{chunk-TFVTEI2T.mjs → chunk-2PDLILVN.mjs} +15 -1
- package/dist/chunk-2PDLILVN.mjs.map +1 -0
- package/dist/{chunk-3LQ4KQP5.mjs → chunk-4S3RPDX7.mjs} +2 -2
- package/dist/{chunk-S2MDPOWE.mjs → chunk-EZWYBV2K.mjs} +1414 -617
- package/dist/chunk-EZWYBV2K.mjs.map +1 -0
- package/dist/{chunk-33N6EMC2.mjs → chunk-PDE4244X.mjs} +2 -2
- package/dist/chunk-PDE4244X.mjs.map +1 -0
- package/dist/{chunk-HB755SJQ.mjs → chunk-VD2ANSAF.mjs} +1 -1
- package/dist/chunk-VD2ANSAF.mjs.map +1 -0
- package/dist/{chunk-FTSYXBE4.mjs → chunk-WMGL4DXL.mjs} +3 -3
- package/dist/cli.js +30 -8
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +31 -9
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +26 -7
- package/dist/index.d.ts +26 -7
- package/dist/index.js +1427 -622
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -13
- package/dist/index.mjs.map +1 -1
- package/dist/nest/index.d.mts +7 -0
- package/dist/nest/index.d.ts +7 -0
- package/dist/nest/index.js +14 -0
- package/dist/nest/index.js.map +1 -1
- package/dist/nest/index.mjs +2 -2
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs +3 -3
- package/dist/shared/index.d.mts +21 -0
- package/dist/shared/index.d.ts +21 -0
- package/dist/shared/index.js +1426 -615
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/index.mjs +3 -3
- package/package.json +6 -2
- package/dist/chunk-33N6EMC2.mjs.map +0 -1
- package/dist/chunk-HB755SJQ.mjs.map +0 -1
- package/dist/chunk-S2MDPOWE.mjs.map +0 -1
- package/dist/chunk-TFVTEI2T.mjs.map +0 -1
- /package/dist/{chunk-3LQ4KQP5.mjs.map → chunk-4S3RPDX7.mjs.map} +0 -0
- /package/dist/{chunk-FTSYXBE4.mjs.map → chunk-WMGL4DXL.mjs.map} +0 -0
package/dist/astro/index.mjs
CHANGED
|
@@ -56,6 +56,17 @@ var typeDrivenRules = {
|
|
|
56
56
|
// (Era no-floating-promises; el mensaje upstream recomendaba .then/.catch,
|
|
57
57
|
// que no-promise-chain prohíbe — el nuestro corrige el consejo.)
|
|
58
58
|
"skapxd/no-floating-promises": "error",
|
|
59
|
+
// Familia indivisible: cierra el `any` invisible que no-explicit-any no ve
|
|
60
|
+
// (JSON.parse, response.json, libs sin tipos). La salida legal es unknown
|
|
61
|
+
// en la frontera y narrowing con evidencia antes de tocarlo.
|
|
62
|
+
"skapxd/no-unsafe-assignment": "error",
|
|
63
|
+
"skapxd/no-unsafe-member-access": "error",
|
|
64
|
+
"skapxd/no-unsafe-call": "error",
|
|
65
|
+
"skapxd/no-unsafe-return": "error",
|
|
66
|
+
"skapxd/no-unsafe-argument": "error",
|
|
67
|
+
// Un `as T` que estrecha sin evidencia es la misma fuga con otro traje:
|
|
68
|
+
// el type-checker razona sobre una forma que nadie comprobó en runtime.
|
|
69
|
+
"skapxd/no-unverified-cast": "error",
|
|
59
70
|
// La generalización type-aware de no-runtime-state-guard: si el tipo dice
|
|
60
71
|
// que un estado es imposible, el guard defensivo sobra — y si el guard
|
|
61
72
|
// hace falta, lo que está mal es el tipo. Requiere el tsconfig de
|
|
@@ -83,6 +94,9 @@ var typeDrivenRules = {
|
|
|
83
94
|
"ts-nocheck": true
|
|
84
95
|
}
|
|
85
96
|
],
|
|
97
|
+
// Si una frontera unknown/any acumula muchos typeof/in/Array.isArray, eso
|
|
98
|
+
// ya es un schema artesanal: la evidencia debe vivir en schema declarado.
|
|
99
|
+
"skapxd/prefer-schema-validation": "error",
|
|
86
100
|
// `type` en vez de `interface`: las uniones discriminadas son types, y la
|
|
87
101
|
// homogeneidad evita el "¿esto se puede extender por declaration merging?"
|
|
88
102
|
// (Era consistent-type-definitions, cuyo default upstream es `interface` —
|
|
@@ -190,4 +204,4 @@ export {
|
|
|
190
204
|
createSharedConfigs,
|
|
191
205
|
strictConfig
|
|
192
206
|
};
|
|
193
|
-
//# sourceMappingURL=chunk-
|
|
207
|
+
//# sourceMappingURL=chunk-2PDLILVN.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 // 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","// 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 // Familia indivisible: cierra el `any` invisible que no-explicit-any no ve\n // (JSON.parse, response.json, libs sin tipos). La salida legal es unknown\n // en la frontera y narrowing con evidencia antes de tocarlo.\n \"skapxd/no-unsafe-assignment\": \"error\",\n \"skapxd/no-unsafe-member-access\": \"error\",\n \"skapxd/no-unsafe-call\": \"error\",\n \"skapxd/no-unsafe-return\": \"error\",\n \"skapxd/no-unsafe-argument\": \"error\",\n // Un `as T` que estrecha sin evidencia es la misma fuga con otro traje:\n // el type-checker razona sobre una forma que nadie comprobó en runtime.\n \"skapxd/no-unverified-cast\": \"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.) El literal `true` en bucles queda\n // permitido: `while (true)` con returns internos es un bucle infinito\n // DECLARADO (axioma A5), no un guard mentiroso.\n \"skapxd/no-impossible-branch\": [\n \"error\",\n { allowConstantLoopConditions: \"only-allowed-literals\" },\n ],\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 // Si una frontera unknown/any acumula muchos typeof/in/Array.isArray, eso\n // ya es un schema artesanal: la evidencia debe vivir en schema declarado.\n \"skapxd/prefer-schema-validation\": \"error\",\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 // Para librerias npm en TypeScript (tsup o equivalente): las bases\n // completas + el set type-driven + el contrato de empaquetado. Este\n // mismo repo se lintea con este preset (dogfood).\n package: {\n languageOptions: typedLanguageOptions,\n name: \"skapxd/shared/package\",\n plugins: { skapxd: pluginReference },\n rules: {\n ...baseRules,\n ...typeDrivenRules,\n \"skapxd/await-requires-result\": \"error\",\n // El contrato de tipos duales en exports: import → .d.mts,\n // require → .d.ts. Sin esto, FalseCJS (attw lo confirma).\n \"skapxd/package-requires-typed-exports\": \"error\",\n // Inerte hasta declarar modulos sospechosos: el inventario de\n // paquetes cuyos @types mienten, encerrados tras su adaptador.\n \"skapxd/untrusted-module-requires-adapter\": \"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":"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","names":["tseslint"]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
baseRules,
|
|
3
3
|
createBaseLanguageOptions,
|
|
4
4
|
createTypedLanguageOptions
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-2PDLILVN.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-4S3RPDX7.mjs.map
|