@skapxd/eslint-opinionated 0.11.0 → 0.12.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 +41 -0
- package/dist/astro/index.d.mts +3 -0
- package/dist/astro/index.d.ts +3 -0
- package/dist/astro/index.js +4 -2
- package/dist/astro/index.js.map +1 -1
- package/dist/astro/index.mjs +2 -2
- package/dist/{chunk-Z2MYYOIS.mjs → chunk-DJXM5PMG.mjs} +2 -2
- package/dist/{chunk-3NM7FEIN.mjs → chunk-JA2ZO3KQ.mjs} +4 -3
- package/dist/{chunk-3NM7FEIN.mjs.map → chunk-JA2ZO3KQ.mjs.map} +1 -1
- package/dist/{chunk-EXMF54EM.mjs → chunk-MSOA2V5B.mjs} +84 -12
- package/dist/chunk-MSOA2V5B.mjs.map +1 -0
- package/dist/{chunk-J472YWOD.mjs → chunk-QADXO5IL.mjs} +3 -2
- package/dist/chunk-QADXO5IL.mjs.map +1 -0
- package/dist/index.js +88 -14
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -5
- package/dist/index.mjs.map +1 -1
- package/dist/next/index.d.mts +2 -0
- package/dist/next/index.d.ts +2 -0
- package/dist/next/index.js +2 -1
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs +2 -2
- package/dist/shared/index.d.mts +3 -0
- package/dist/shared/index.d.ts +3 -0
- package/dist/shared/index.js +85 -12
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/index.mjs +2 -2
- package/package.json +1 -1
- package/dist/chunk-EXMF54EM.mjs.map +0 -1
- package/dist/chunk-J472YWOD.mjs.map +0 -1
- /package/dist/{chunk-Z2MYYOIS.mjs.map → chunk-DJXM5PMG.mjs.map} +0 -0
package/README.md
CHANGED
|
@@ -552,6 +552,7 @@ de cada regla):
|
|
|
552
552
|
| `no-promise-chain` | `methods` |
|
|
553
553
|
| `no-tunnel-props` | `allowFilePatterns` (globs), `allowPropPatterns` (regex) |
|
|
554
554
|
| `prefer-abort-signal` | `allowFilePatterns` (globs), `effectNames` (default `["useEffect", "useLayoutEffect"]`) |
|
|
555
|
+
| `result-error-requires-handling` | `allowFilePatterns` (globs) |
|
|
555
556
|
|
|
556
557
|
Los `allowFilePatterns` de todas las reglas son **globs** (`*` un segmento,
|
|
557
558
|
`**` cualquier profundidad, `{a,b}` alternativas; un patrón sin prefijo
|
|
@@ -565,6 +566,7 @@ matchea en cualquier carpeta). Las 7 reglas restantes no tienen opciones: su
|
|
|
565
566
|
| `skapxd/one-root-function-per-file` | Un archivo, una función top-level semántica. |
|
|
566
567
|
| `skapxd/async-functions-return-result` | Funciones async de dominio deben retornar `Promise<Result<...>>`. **Apagada por defecto; opt-in** (ver motivos en su sección). |
|
|
567
568
|
| `skapxd/result-error-requires-cause` | Un `Result.err` derivado debe preservar `cause: result.error`. |
|
|
569
|
+
| `skapxd/result-error-requires-handling` | Prohíbe descartar en silencio un Result fallido: el error se transforma o se entrega, nunca se ignora. |
|
|
568
570
|
| `skapxd/await-requires-result` | Todo `await` debe resolver en un `Result`: o la función llamada retorna `Promise<Result<...>>` (preferido) o se envuelve en `trySafe`. **Obligatoria en todos los presets tipados.** |
|
|
569
571
|
| `skapxd/no-ad-hoc-ok-result` | Evita contratos `{ ok: ... }` hechos a mano en async exports. |
|
|
570
572
|
| `skapxd/max-hook-size` | Marca hooks grandes o con demasiados `useState`. |
|
|
@@ -705,6 +707,45 @@ aliases, re-exports y tipos inferidos, sin depender solo del nombre importado en
|
|
|
705
707
|
el archivo. Su punto ciego histórico —el `Result.err` escondido en un `if`
|
|
706
708
|
anidado— lo elimina `skapxd/no-nested-if` de raíz.
|
|
707
709
|
|
|
710
|
+
### `skapxd/result-error-requires-handling`
|
|
711
|
+
|
|
712
|
+
La hermana de la anterior cierra la última puerta de evasión: el **descarte
|
|
713
|
+
silencioso**. Detectar el fallo y botarlo sin tocarlo es legal para
|
|
714
|
+
`result-error-requires-cause` (no hay transformación que vigilar), pero deja
|
|
715
|
+
morir información valiosa sin que nadie lo decidiera conscientemente:
|
|
716
|
+
|
|
717
|
+
```ts
|
|
718
|
+
const result = await copyTextToClipboard(text);
|
|
719
|
+
if (!result.ok) return; // ❌ el error muere aquí, en silencio
|
|
720
|
+
```
|
|
721
|
+
|
|
722
|
+
El contrato: dentro de un guard de Result fallido, `result.error` (o el
|
|
723
|
+
result completo) debe **fluir a alguna parte**. Dos salidas:
|
|
724
|
+
|
|
725
|
+
```ts
|
|
726
|
+
// 1. Transformarlo (y result-error-requires-cause vigila el cause)
|
|
727
|
+
if (!result.ok) {
|
|
728
|
+
return Result.err({ cause: result.error, message: "...", type: "COPY_FAILED" });
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
// 2. Entregárselo a alguien: telemetría, estado de error, log de dominio
|
|
732
|
+
if (!result.ok) {
|
|
733
|
+
trackClipboardFailure(result.error);
|
|
734
|
+
return;
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
// (propagar el result completo también vale: `if (!result.ok) return result;`)
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
**No hay tercera salida.** `void result.error` no cuenta como manejo, y
|
|
741
|
+
manejar sin tocar el error (`setFailed(true)`) tampoco — el detalle se perdió
|
|
742
|
+
igual. Esto es deliberado: si darle seguimiento a un error es crítico o no,
|
|
743
|
+
no puede depender de la interpretación de quien escribe; el camino por
|
|
744
|
+
defecto nunca es ignorarlo.
|
|
745
|
+
|
|
746
|
+
Type-aware como su hermana: solo aplica a Results reales de `@skapxd/result`,
|
|
747
|
+
con las mismas cinco formas de guard.
|
|
748
|
+
|
|
708
749
|
### `skapxd/await-requires-result`
|
|
709
750
|
|
|
710
751
|
> **Es la regla obligatoria del sistema de errores**: la activan todos los
|
package/dist/astro/index.d.mts
CHANGED
|
@@ -20,6 +20,7 @@ declare function createAstroConfigs(pluginReference: unknown): ({
|
|
|
20
20
|
"skapxd/one-root-function-per-file": string;
|
|
21
21
|
"skapxd/prefer-ts-pattern": string;
|
|
22
22
|
"skapxd/result-error-requires-cause": string;
|
|
23
|
+
"skapxd/result-error-requires-handling": string;
|
|
23
24
|
};
|
|
24
25
|
} | {
|
|
25
26
|
files: string[];
|
|
@@ -38,6 +39,7 @@ declare function createAstroConfigs(pluginReference: unknown): ({
|
|
|
38
39
|
"skapxd/one-root-function-per-file": string;
|
|
39
40
|
"skapxd/prefer-ts-pattern": string;
|
|
40
41
|
"skapxd/result-error-requires-cause": string;
|
|
42
|
+
"skapxd/result-error-requires-handling": string;
|
|
41
43
|
};
|
|
42
44
|
languageOptions?: undefined;
|
|
43
45
|
} | {
|
|
@@ -55,6 +57,7 @@ declare function createAstroConfigs(pluginReference: unknown): ({
|
|
|
55
57
|
rules: {
|
|
56
58
|
"skapxd/await-requires-result": string;
|
|
57
59
|
"skapxd/result-error-requires-cause": string;
|
|
60
|
+
"skapxd/result-error-requires-handling": string;
|
|
58
61
|
};
|
|
59
62
|
})[];
|
|
60
63
|
|
package/dist/astro/index.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ declare function createAstroConfigs(pluginReference: unknown): ({
|
|
|
20
20
|
"skapxd/one-root-function-per-file": string;
|
|
21
21
|
"skapxd/prefer-ts-pattern": string;
|
|
22
22
|
"skapxd/result-error-requires-cause": string;
|
|
23
|
+
"skapxd/result-error-requires-handling": string;
|
|
23
24
|
};
|
|
24
25
|
} | {
|
|
25
26
|
files: string[];
|
|
@@ -38,6 +39,7 @@ declare function createAstroConfigs(pluginReference: unknown): ({
|
|
|
38
39
|
"skapxd/one-root-function-per-file": string;
|
|
39
40
|
"skapxd/prefer-ts-pattern": string;
|
|
40
41
|
"skapxd/result-error-requires-cause": string;
|
|
42
|
+
"skapxd/result-error-requires-handling": string;
|
|
41
43
|
};
|
|
42
44
|
languageOptions?: undefined;
|
|
43
45
|
} | {
|
|
@@ -55,6 +57,7 @@ declare function createAstroConfigs(pluginReference: unknown): ({
|
|
|
55
57
|
rules: {
|
|
56
58
|
"skapxd/await-requires-result": string;
|
|
57
59
|
"skapxd/result-error-requires-cause": string;
|
|
60
|
+
"skapxd/result-error-requires-handling": string;
|
|
58
61
|
};
|
|
59
62
|
})[];
|
|
60
63
|
|
package/dist/astro/index.js
CHANGED
|
@@ -45,7 +45,8 @@ var baseRules = {
|
|
|
45
45
|
"skapxd/no-try-catch": "error",
|
|
46
46
|
"skapxd/one-root-function-per-file": "error",
|
|
47
47
|
"skapxd/prefer-ts-pattern": "error",
|
|
48
|
-
"skapxd/result-error-requires-cause": "error"
|
|
48
|
+
"skapxd/result-error-requires-cause": "error",
|
|
49
|
+
"skapxd/result-error-requires-handling": "error"
|
|
49
50
|
};
|
|
50
51
|
|
|
51
52
|
// src/shared/configs/create-base-language-options.ts
|
|
@@ -96,7 +97,8 @@ function createAstroConfigs(pluginReference) {
|
|
|
96
97
|
plugins: { skapxd: pluginReference },
|
|
97
98
|
rules: {
|
|
98
99
|
"skapxd/await-requires-result": "error",
|
|
99
|
-
"skapxd/result-error-requires-cause": "error"
|
|
100
|
+
"skapxd/result-error-requires-cause": "error",
|
|
101
|
+
"skapxd/result-error-requires-handling": "error"
|
|
100
102
|
}
|
|
101
103
|
}
|
|
102
104
|
];
|
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-typed-language-options.ts","../../src/astro/configs.ts"],"sourcesContent":["export { createAstroConfigs } from \"./configs\";\n","export const baseRules = {\n \"skapxd/no-ad-hoc-ok-result\": \"error\",\n \"skapxd/no-deep-relative-imports\": \"error\",\n \"skapxd/no-default-export\": \"error\",\n \"skapxd/no-emoji\": \"error\",\n \"skapxd/no-nested-if\": \"error\",\n \"skapxd/no-promise-chain\": \"error\",\n \"skapxd/no-try-catch\": \"error\",\n \"skapxd/one-root-function-per-file\": \"error\",\n \"skapxd/prefer-ts-pattern\": \"error\",\n \"skapxd/result-error-requires-cause\": \"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 },\n },\n ];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,YAAY;AAAA,EACvB,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,2BAA2B;AAAA,EAC3B,uBAAuB;AAAA,EACvB,qCAAqC;AAAA,EACrC,4BAA4B;AAAA,EAC5B,sCAAsC;
|
|
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/no-ad-hoc-ok-result\": \"error\",\n \"skapxd/no-deep-relative-imports\": \"error\",\n \"skapxd/no-default-export\": \"error\",\n \"skapxd/no-emoji\": \"error\",\n \"skapxd/no-nested-if\": \"error\",\n \"skapxd/no-promise-chain\": \"error\",\n \"skapxd/no-try-catch\": \"error\",\n \"skapxd/one-root-function-per-file\": \"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,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,2BAA2B;AAAA,EAC3B,uBAAuB;AAAA,EACvB,qCAAqC;AAAA,EACrC,4BAA4B;AAAA,EAC5B,sCAAsC;AAAA,EACtC,yCAAyC;AAC3C;;;ACZA,+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
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
baseRules,
|
|
7
7
|
createBaseLanguageOptions,
|
|
8
8
|
createTypedLanguageOptions
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-QADXO5IL.mjs";
|
|
10
10
|
|
|
11
11
|
// src/next/configs.ts
|
|
12
12
|
var nextDefaultExportFileGlob = `{${[
|
|
@@ -71,4 +71,4 @@ function createNextConfigs(pluginReference) {
|
|
|
71
71
|
export {
|
|
72
72
|
createNextConfigs
|
|
73
73
|
};
|
|
74
|
-
//# sourceMappingURL=chunk-
|
|
74
|
+
//# sourceMappingURL=chunk-DJXM5PMG.mjs.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
baseRules,
|
|
3
3
|
createBaseLanguageOptions,
|
|
4
4
|
createTypedLanguageOptions
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-QADXO5IL.mjs";
|
|
6
6
|
|
|
7
7
|
// src/astro/configs.ts
|
|
8
8
|
function createAstroConfigs(pluginReference) {
|
|
@@ -31,7 +31,8 @@ function createAstroConfigs(pluginReference) {
|
|
|
31
31
|
plugins: { skapxd: pluginReference },
|
|
32
32
|
rules: {
|
|
33
33
|
"skapxd/await-requires-result": "error",
|
|
34
|
-
"skapxd/result-error-requires-cause": "error"
|
|
34
|
+
"skapxd/result-error-requires-cause": "error",
|
|
35
|
+
"skapxd/result-error-requires-handling": "error"
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
];
|
|
@@ -40,4 +41,4 @@ function createAstroConfigs(pluginReference) {
|
|
|
40
41
|
export {
|
|
41
42
|
createAstroConfigs
|
|
42
43
|
};
|
|
43
|
-
//# sourceMappingURL=chunk-
|
|
44
|
+
//# sourceMappingURL=chunk-JA2ZO3KQ.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/astro/configs.ts"],"sourcesContent":["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 },\n },\n ];\n}\n"],"mappings":";;;;;;;AAMO,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,
|
|
1
|
+
{"version":3,"sources":["../src/astro/configs.ts"],"sourcesContent":["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":";;;;;;;AAMO,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":[]}
|
|
@@ -1151,6 +1151,88 @@ var resultErrorRequiresCause = {
|
|
|
1151
1151
|
}
|
|
1152
1152
|
};
|
|
1153
1153
|
|
|
1154
|
+
// src/utils/collect-identifiers-named.ts
|
|
1155
|
+
function collectIdentifiersNamed(node, name, results = []) {
|
|
1156
|
+
if (node?.type === "Identifier" && node.name === name) {
|
|
1157
|
+
results.push(node);
|
|
1158
|
+
}
|
|
1159
|
+
for (const child of getNodeChildren(node)) {
|
|
1160
|
+
collectIdentifiersNamed(child, name, results);
|
|
1161
|
+
}
|
|
1162
|
+
return results;
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
// src/utils/get-result-error-requires-handling-options.ts
|
|
1166
|
+
function getResultErrorRequiresHandlingOptions(options = {}) {
|
|
1167
|
+
return {
|
|
1168
|
+
allowFilePatterns: options.allowFilePatterns ?? []
|
|
1169
|
+
};
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
// src/utils/is-consumed-result-reference.ts
|
|
1173
|
+
function isConsumedResultReference(identifier) {
|
|
1174
|
+
const member = identifier.parent?.type === "MemberExpression" && identifier.parent.object === identifier ? identifier.parent : null;
|
|
1175
|
+
const reference = member ?? identifier;
|
|
1176
|
+
const parent = reference.parent;
|
|
1177
|
+
if (parent?.type === "UnaryExpression" && parent.operator === "void") {
|
|
1178
|
+
return false;
|
|
1179
|
+
}
|
|
1180
|
+
return parent?.type !== "ExpressionStatement";
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
// src/rules/result-error-requires-handling.ts
|
|
1184
|
+
var resultErrorRequiresHandling = {
|
|
1185
|
+
meta: {
|
|
1186
|
+
type: "problem",
|
|
1187
|
+
docs: {
|
|
1188
|
+
description: "Prohibe descartar en silencio un Result fallido: el error se transforma o se entrega, nunca se ignora."
|
|
1189
|
+
},
|
|
1190
|
+
messages: {
|
|
1191
|
+
unhandledResultError: "El guard detecta que `{{name}}` fallo, pero `{{name}}.error` muere aqui sin seguimiento. Transformalo (`Result.err({ cause: {{name}}.error, ... })`), entregaselo a alguien (telemetria, estado de error, log de dominio) o propaga el result completo. Si darle seguimiento es critico o no, no es una interpretacion: todo error fluye a alguna parte."
|
|
1192
|
+
},
|
|
1193
|
+
schema: [
|
|
1194
|
+
{
|
|
1195
|
+
additionalProperties: false,
|
|
1196
|
+
properties: {
|
|
1197
|
+
allowFilePatterns: {
|
|
1198
|
+
items: { type: "string" },
|
|
1199
|
+
type: "array"
|
|
1200
|
+
}
|
|
1201
|
+
},
|
|
1202
|
+
type: "object"
|
|
1203
|
+
}
|
|
1204
|
+
]
|
|
1205
|
+
},
|
|
1206
|
+
create(context) {
|
|
1207
|
+
const options = getResultErrorRequiresHandlingOptions(context.options[0]);
|
|
1208
|
+
const filename = context.filename ?? context.getFilename();
|
|
1209
|
+
const typeContext = getTypeContext(context);
|
|
1210
|
+
if (matchesAnyGlob(filename, options.allowFilePatterns)) {
|
|
1211
|
+
return {};
|
|
1212
|
+
}
|
|
1213
|
+
return {
|
|
1214
|
+
IfStatement(node) {
|
|
1215
|
+
const resultGuard = getFailedResultGuard(node.test);
|
|
1216
|
+
if (!typeContext || !resultGuard || !isSkapxdResultExpression(resultGuard.node, typeContext)) {
|
|
1217
|
+
return;
|
|
1218
|
+
}
|
|
1219
|
+
const references = collectIdentifiersNamed(
|
|
1220
|
+
node.consequent,
|
|
1221
|
+
resultGuard.name
|
|
1222
|
+
);
|
|
1223
|
+
if (references.some(isConsumedResultReference)) {
|
|
1224
|
+
return;
|
|
1225
|
+
}
|
|
1226
|
+
context.report({
|
|
1227
|
+
data: { name: resultGuard.name },
|
|
1228
|
+
messageId: "unhandledResultError",
|
|
1229
|
+
node: node.test
|
|
1230
|
+
});
|
|
1231
|
+
}
|
|
1232
|
+
};
|
|
1233
|
+
}
|
|
1234
|
+
};
|
|
1235
|
+
|
|
1154
1236
|
// src/utils/count-own-use-state-calls-in-node.ts
|
|
1155
1237
|
function countOwnUseStateCallsInNode(node) {
|
|
1156
1238
|
if (!isAstNode(node)) {
|
|
@@ -1461,17 +1543,6 @@ var noEmoji = {
|
|
|
1461
1543
|
}
|
|
1462
1544
|
};
|
|
1463
1545
|
|
|
1464
|
-
// src/utils/collect-identifiers-named.ts
|
|
1465
|
-
function collectIdentifiersNamed(node, name, results = []) {
|
|
1466
|
-
if (node?.type === "Identifier" && node.name === name) {
|
|
1467
|
-
results.push(node);
|
|
1468
|
-
}
|
|
1469
|
-
for (const child of getNodeChildren(node)) {
|
|
1470
|
-
collectIdentifiersNamed(child, name, results);
|
|
1471
|
-
}
|
|
1472
|
-
return results;
|
|
1473
|
-
}
|
|
1474
|
-
|
|
1475
1546
|
// src/utils/get-no-tunnel-props-options.ts
|
|
1476
1547
|
function getNoTunnelPropsOptions(options = {}) {
|
|
1477
1548
|
return {
|
|
@@ -2045,6 +2116,7 @@ var rules = {
|
|
|
2045
2116
|
}
|
|
2046
2117
|
},
|
|
2047
2118
|
"result-error-requires-cause": resultErrorRequiresCause,
|
|
2119
|
+
"result-error-requires-handling": resultErrorRequiresHandling,
|
|
2048
2120
|
"max-hook-size": maxHookSize,
|
|
2049
2121
|
"no-deep-relative-imports": noDeepRelativeImports,
|
|
2050
2122
|
"no-default-export": noDefaultExport,
|
|
@@ -2062,4 +2134,4 @@ var rules = {
|
|
|
2062
2134
|
export {
|
|
2063
2135
|
rules
|
|
2064
2136
|
};
|
|
2065
|
-
//# sourceMappingURL=chunk-
|
|
2137
|
+
//# sourceMappingURL=chunk-MSOA2V5B.mjs.map
|