@skapxd/eslint-opinionated 0.1.0 → 0.2.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 CHANGED
@@ -257,7 +257,7 @@ completo**, también dispara las reglas estructurales (p. ej.
257
257
  src/
258
258
  ├── shared/
259
259
  │ ├── rules.ts
260
- │ ├── configs.ts
260
+ │ ├── configs/
261
261
  │ └── index.ts
262
262
  ├── next/
263
263
  │ ├── configs.ts
@@ -309,25 +309,17 @@ import skapxd from "@skapxd/eslint-opinionated";
309
309
 
310
310
  export default [
311
311
  {
312
- files: ["src/app/**/*.{ts,tsx}", "src/components/**/*.{ts,tsx}"],
312
+ files: ["src/**/*.{ts,tsx}"],
313
313
  ...skapxd.configs.shared.frontend,
314
314
  },
315
- // Capa de servicios: todo await debe ir envuelto en trySafe.
316
- skapxd.configs.shared.frontendServices,
317
315
  ];
318
316
  ```
319
317
 
320
- Por defecto `frontendServices` aplica a `**/services/**` y `**/api/**`. Si tus
321
- servicios viven en otra carpeta, sobreescribe `files`:
322
-
323
- ```js
324
- export default [
325
- {
326
- ...skapxd.configs.shared.frontendServices,
327
- files: ["src/data/**/*.{ts,tsx}"],
328
- },
329
- ];
330
- ```
318
+ El contrato del front: ninguna función está obligada a retornar `Result`, pero
319
+ toda llamada asíncrona debe ir envuelta en `trySafe` salvo que lo llamado ya
320
+ retorne `Result`/`Promise<Result<...>>` (exención type-aware de
321
+ `skapxd/await-requires-try-safe`). Aplica el preset a TODO el código del front
322
+ (componentes, hooks, servicios), no solo a los componentes.
331
323
 
332
324
  ### Next.js
333
325
 
@@ -379,6 +371,10 @@ export default [
379
371
  ];
380
372
  ```
381
373
 
374
+ > Para los archivos `.astro` el preset no impone parser: necesitas tener
375
+ > `eslint-plugin-astro` configurado (su preset recomendado ya lo aporta).
376
+ > Los `.ts/.tsx` sí traen el parser de `typescript-eslint` incluido.
377
+
382
378
  También puedes importar solo el factory de Astro:
383
379
 
384
380
  ```js
@@ -433,7 +429,7 @@ bloque con `linterOptions: { noInlineConfig: false }` para esos globs.
433
429
  | `skapxd/one-root-function-per-file` | Un archivo, una función top-level semántica. |
434
430
  | `skapxd/async-functions-return-result` | Funciones async de dominio deben retornar `Promise<Result<...>>`. |
435
431
  | `skapxd/result-error-requires-cause` | Un `Result.err` derivado debe preservar `cause: result.error`. |
436
- | `skapxd/await-requires-try-safe` | Los `await` deben estar protegidos por `trySafe`. La activa el preset `shared.frontendServices` en la capa de servicios. |
432
+ | `skapxd/await-requires-try-safe` | Los `await` deben estar protegidos por `trySafe`, salvo que lo awaiteado ya retorne `Result`. La activa el preset `shared.frontend`. |
437
433
  | `skapxd/no-ad-hoc-ok-result` | Evita contratos `{ ok: ... }` hechos a mano en async exports. |
438
434
  | `skapxd/max-hook-size` | Marca hooks grandes o con demasiados `useState`. |
439
435
  | `skapxd/jsx-return-name-pascal-case` | Funciones que retornan JSX deben nombrarse como componentes. |
@@ -513,10 +509,11 @@ el archivo.
513
509
 
514
510
  ### `skapxd/await-requires-try-safe`
515
511
 
516
- > Es la regla más agresiva del paquete (marca *todos* los `await` sin proteger),
517
- > así que solo la activa el preset `shared.frontendServices`, acotada a la capa
518
- > de servicios (`**/services/**`, `**/api/**`). Para activarla en otros globs,
519
- > añádela mismo:
512
+ > La activa el preset `shared.frontend` en todo el front: componentes, hooks,
513
+ > handlers y servicios. El contrato queda así: ninguna función está obligada
514
+ > a retornar `Result`, pero toda llamada asíncrona debe ir en `trySafe` — salvo
515
+ > que lo llamado ya retorne `Result` (ver exención más abajo). Para activarla
516
+ > en otros globs, añádela tú mismo:
520
517
  >
521
518
  > ```js
522
519
  > rules: {
@@ -1,4 +1,24 @@
1
+ import * as typescript_eslint from 'typescript-eslint';
2
+
1
3
  declare function createAstroConfigs(pluginReference: unknown): ({
4
+ files: string[];
5
+ languageOptions: {
6
+ parser: typescript_eslint.CompatibleParser;
7
+ };
8
+ name: string;
9
+ plugins: {
10
+ skapxd: unknown;
11
+ };
12
+ rules: {
13
+ "skapxd/no-ad-hoc-ok-result": string;
14
+ "skapxd/no-deep-relative-imports": string;
15
+ "skapxd/no-promise-chain": string;
16
+ "skapxd/no-try-catch": string;
17
+ "skapxd/one-root-function-per-file": string;
18
+ "skapxd/prefer-ts-pattern": string;
19
+ "skapxd/result-error-requires-cause": string;
20
+ };
21
+ } | {
2
22
  files: string[];
3
23
  name: string;
4
24
  plugins: {
@@ -17,6 +37,7 @@ declare function createAstroConfigs(pluginReference: unknown): ({
17
37
  } | {
18
38
  files: string[];
19
39
  languageOptions: {
40
+ parser: typescript_eslint.CompatibleParser;
20
41
  parserOptions: {
21
42
  projectService: boolean;
22
43
  };
@@ -1,4 +1,24 @@
1
+ import * as typescript_eslint from 'typescript-eslint';
2
+
1
3
  declare function createAstroConfigs(pluginReference: unknown): ({
4
+ files: string[];
5
+ languageOptions: {
6
+ parser: typescript_eslint.CompatibleParser;
7
+ };
8
+ name: string;
9
+ plugins: {
10
+ skapxd: unknown;
11
+ };
12
+ rules: {
13
+ "skapxd/no-ad-hoc-ok-result": string;
14
+ "skapxd/no-deep-relative-imports": string;
15
+ "skapxd/no-promise-chain": string;
16
+ "skapxd/no-try-catch": string;
17
+ "skapxd/one-root-function-per-file": string;
18
+ "skapxd/prefer-ts-pattern": string;
19
+ "skapxd/result-error-requires-cause": string;
20
+ };
21
+ } | {
2
22
  files: string[];
3
23
  name: string;
4
24
  plugins: {
@@ -17,6 +37,7 @@ declare function createAstroConfigs(pluginReference: unknown): ({
17
37
  } | {
18
38
  files: string[];
19
39
  languageOptions: {
40
+ parser: typescript_eslint.CompatibleParser;
20
41
  parserOptions: {
21
42
  projectService: boolean;
22
43
  };
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/astro/index.ts
@@ -35,9 +45,21 @@ var baseRules = {
35
45
  "skapxd/result-error-requires-cause": "error"
36
46
  };
37
47
 
48
+ // src/shared/configs/create-base-language-options.ts
49
+ var import_typescript_eslint = __toESM(require("typescript-eslint"));
50
+ function createBaseLanguageOptions() {
51
+ return {
52
+ parser: import_typescript_eslint.default.parser
53
+ };
54
+ }
55
+
38
56
  // src/shared/configs/create-typed-language-options.ts
57
+ var import_typescript_eslint2 = __toESM(require("typescript-eslint"));
39
58
  function createTypedLanguageOptions() {
40
59
  return {
60
+ // Sin el parser explícito, un consumidor que use solo estos presets
61
+ // obtiene "Parsing error" en cada archivo TS (espree no parsea TS).
62
+ parser: import_typescript_eslint2.default.parser,
41
63
  parserOptions: {
42
64
  projectService: true
43
65
  }
@@ -46,14 +68,24 @@ function createTypedLanguageOptions() {
46
68
 
47
69
  // src/astro/configs.ts
48
70
  function createAstroConfigs(pluginReference) {
71
+ const baseLanguageOptions = createBaseLanguageOptions();
49
72
  const typedLanguageOptions = createTypedLanguageOptions();
50
73
  return [
51
74
  {
52
- files: ["src/**/*.{ts,tsx,astro}"],
75
+ files: ["src/**/*.{ts,tsx}"],
76
+ languageOptions: baseLanguageOptions,
53
77
  name: "skapxd/astro/base",
54
78
  plugins: { skapxd: pluginReference },
55
79
  rules: baseRules
56
80
  },
81
+ // Los .astro no llevan parser propio: lo aporta eslint-plugin-astro,
82
+ // que el consumidor debe tener configurado.
83
+ {
84
+ files: ["src/**/*.astro"],
85
+ name: "skapxd/astro/astro-files",
86
+ plugins: { skapxd: pluginReference },
87
+ rules: baseRules
88
+ },
57
89
  {
58
90
  files: ["src/**/*.{ts,tsx}"],
59
91
  languageOptions: typedLanguageOptions,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/astro/index.ts","../../src/shared/configs/base-rules.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\": \"warn\",\n \"skapxd/no-deep-relative-imports\": \"warn\",\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","export function createTypedLanguageOptions() {\n return {\n parserOptions: {\n projectService: true,\n },\n };\n}\n","import { baseRules, createTypedLanguageOptions } from \"#/shared/configs\";\n\nexport function createAstroConfigs(pluginReference: unknown) {\n const typedLanguageOptions = createTypedLanguageOptions();\n\n return [\n {\n files: [\"src/**/*.{ts,tsx,astro}\"],\n name: \"skapxd/astro/base\",\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/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,2BAA2B;AAAA,EAC3B,uBAAuB;AAAA,EACvB,qCAAqC;AAAA,EACrC,4BAA4B;AAAA,EAC5B,sCAAsC;AACxC;;;ACRO,SAAS,6BAA6B;AAC3C,SAAO;AAAA,IACL,eAAe;AAAA,MACb,gBAAgB;AAAA,IAClB;AAAA,EACF;AACF;;;ACJO,SAAS,mBAAmB,iBAA0B;AAC3D,QAAM,uBAAuB,2BAA2B;AAExD,SAAO;AAAA,IACL;AAAA,MACE,OAAO,CAAC,yBAAyB;AAAA,MACjC,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,sCAAsC;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
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\": \"warn\",\n \"skapxd/no-deep-relative-imports\": \"warn\",\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/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,2BAA2B;AAAA,EAC3B,uBAAuB;AAAA,EACvB,qCAAqC;AAAA,EACrC,4BAA4B;AAAA,EAC5B,sCAAsC;AACxC;;;ACRA,+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,sCAAsC;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACF;","names":["tseslint","import_typescript_eslint","tseslint"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createAstroConfigs
3
- } from "../chunk-3FB4H7N6.mjs";
4
- import "../chunk-CQKEQ32W.mjs";
3
+ } from "../chunk-4LJJTF3P.mjs";
4
+ import "../chunk-DYCSUKTL.mjs";
5
5
  export {
6
6
  createAstroConfigs
7
7
  };
@@ -1,18 +1,29 @@
1
1
  import {
2
2
  baseRules,
3
+ createBaseLanguageOptions,
3
4
  createTypedLanguageOptions
4
- } from "./chunk-CQKEQ32W.mjs";
5
+ } from "./chunk-DYCSUKTL.mjs";
5
6
 
6
7
  // src/astro/configs.ts
7
8
  function createAstroConfigs(pluginReference) {
9
+ const baseLanguageOptions = createBaseLanguageOptions();
8
10
  const typedLanguageOptions = createTypedLanguageOptions();
9
11
  return [
10
12
  {
11
- files: ["src/**/*.{ts,tsx,astro}"],
13
+ files: ["src/**/*.{ts,tsx}"],
14
+ languageOptions: baseLanguageOptions,
12
15
  name: "skapxd/astro/base",
13
16
  plugins: { skapxd: pluginReference },
14
17
  rules: baseRules
15
18
  },
19
+ // Los .astro no llevan parser propio: lo aporta eslint-plugin-astro,
20
+ // que el consumidor debe tener configurado.
21
+ {
22
+ files: ["src/**/*.astro"],
23
+ name: "skapxd/astro/astro-files",
24
+ plugins: { skapxd: pluginReference },
25
+ rules: baseRules
26
+ },
16
27
  {
17
28
  files: ["src/**/*.{ts,tsx}"],
18
29
  languageOptions: typedLanguageOptions,
@@ -28,4 +39,4 @@ function createAstroConfigs(pluginReference) {
28
39
  export {
29
40
  createAstroConfigs
30
41
  };
31
- //# sourceMappingURL=chunk-3FB4H7N6.mjs.map
42
+ //# sourceMappingURL=chunk-4LJJTF3P.mjs.map
@@ -0,0 +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/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,sCAAsC;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -1,6 +1,10 @@
1
1
  // src/shared/configs/create-typed-language-options.ts
2
+ import tseslint from "typescript-eslint";
2
3
  function createTypedLanguageOptions() {
3
4
  return {
5
+ // Sin el parser explícito, un consumidor que use solo estos presets
6
+ // obtiene "Parsing error" en cada archivo TS (espree no parsea TS).
7
+ parser: tseslint.parser,
4
8
  parserOptions: {
5
9
  projectService: true
6
10
  }
@@ -18,8 +22,17 @@ var baseRules = {
18
22
  "skapxd/result-error-requires-cause": "error"
19
23
  };
20
24
 
25
+ // src/shared/configs/create-base-language-options.ts
26
+ import tseslint2 from "typescript-eslint";
27
+ function createBaseLanguageOptions() {
28
+ return {
29
+ parser: tseslint2.parser
30
+ };
31
+ }
32
+
21
33
  // src/shared/configs/create-shared-configs.ts
22
34
  function createSharedConfigs(pluginReference) {
35
+ const baseLanguageOptions = createBaseLanguageOptions();
23
36
  const typedLanguageOptions = createTypedLanguageOptions();
24
37
  return {
25
38
  backend: {
@@ -38,6 +51,7 @@ function createSharedConfigs(pluginReference) {
38
51
  }
39
52
  },
40
53
  base: {
54
+ languageOptions: baseLanguageOptions,
41
55
  name: "skapxd/shared/base",
42
56
  plugins: { skapxd: pluginReference },
43
57
  rules: baseRules
@@ -48,6 +62,10 @@ function createSharedConfigs(pluginReference) {
48
62
  plugins: { skapxd: pluginReference },
49
63
  rules: {
50
64
  ...baseRules,
65
+ // En el front no se obliga a retornar Result, pero toda llamada
66
+ // asíncrona debe ir en trySafe — salvo que lo awaiteado ya retorne
67
+ // Result/Promise<Result> (exención type-aware de la regla).
68
+ "skapxd/await-requires-try-safe": "error",
51
69
  "skapxd/jsx-return-name-pascal-case": "error",
52
70
  "skapxd/no-functions-inside-components": "error",
53
71
  "skapxd/no-jsx-ternary-null": "error",
@@ -60,19 +78,8 @@ function createSharedConfigs(pluginReference) {
60
78
  ]
61
79
  }
62
80
  },
63
- // Capa de servicios del front (peticiones, clientes de API): todo await
64
- // debe ir envuelto en trySafe de @skapxd/result. El consumidor puede
65
- // sobreescribir `files` si sus servicios viven en otra carpeta.
66
- frontendServices: {
67
- files: ["**/services/**/*.{ts,tsx}", "**/api/**/*.{ts,tsx}"],
68
- languageOptions: typedLanguageOptions,
69
- name: "skapxd/shared/frontend-services",
70
- plugins: { skapxd: pluginReference },
71
- rules: {
72
- "skapxd/await-requires-try-safe": "error"
73
- }
74
- },
75
81
  package: {
82
+ languageOptions: baseLanguageOptions,
76
83
  name: "skapxd/shared/package",
77
84
  plugins: { skapxd: pluginReference },
78
85
  rules: {
@@ -92,8 +99,9 @@ var strictConfig = {
92
99
 
93
100
  export {
94
101
  baseRules,
102
+ createBaseLanguageOptions,
95
103
  createTypedLanguageOptions,
96
104
  createSharedConfigs,
97
105
  strictConfig
98
106
  };
99
- //# sourceMappingURL=chunk-CQKEQ32W.mjs.map
107
+ //# sourceMappingURL=chunk-DYCSUKTL.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/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/no-ad-hoc-ok-result\": \"warn\",\n \"skapxd/no-deep-relative-imports\": \"warn\",\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 { baseRules } from \"./base-rules\";\nimport { createBaseLanguageOptions } from \"./create-base-language-options\";\nimport { createTypedLanguageOptions } from \"./create-typed-language-options\";\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 plugins: { skapxd: pluginReference },\n rules: {\n ...baseRules,\n \"skapxd/async-functions-return-result\": [\n \"error\",\n {\n checkMissingReturnType: true,\n resultTypeNames: [\"Result\", \"ResultValue\", \"SafeResult\"],\n },\n ],\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 // En el front no se obliga a retornar Result, pero toda llamada\n // asíncrona debe ir en trySafe — salvo que lo awaiteado ya retorne\n // Result/Promise<Result> (exención type-aware de la regla).\n \"skapxd/await-requires-try-safe\": \"error\",\n \"skapxd/jsx-return-name-pascal-case\": \"error\",\n \"skapxd/no-functions-inside-components\": \"error\",\n \"skapxd/no-jsx-ternary-null\": \"error\",\n \"skapxd/max-hook-size\": [\n \"warn\",\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,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,2BAA2B;AAAA,EAC3B,uBAAuB;AAAA,EACvB,qCAAqC;AAAA,EACrC,4BAA4B;AAAA,EAC5B,sCAAsC;AACxC;;;ACRA,OAAOA,eAAc;AAId,SAAS,4BAA4B;AAC1C,SAAO;AAAA,IACL,QAAQA,UAAS;AAAA,EACnB;AACF;;;ACJO,SAAS,oBAAoB,iBAA0B;AAC5D,QAAM,sBAAsB,0BAA0B;AACtD,QAAM,uBAAuB,2BAA2B;AAExD,SAAO;AAAA,IACL,SAAS;AAAA,MACP,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,QACL,GAAG;AAAA,QACH,wCAAwC;AAAA,UACtC;AAAA,UACA;AAAA,YACE,wBAAwB;AAAA,YACxB,iBAAiB,CAAC,UAAU,eAAe,YAAY;AAAA,UACzD;AAAA,QACF;AAAA,MACF;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;AAAA;AAAA;AAAA,QAIH,kCAAkC;AAAA,QAClC,sCAAsC;AAAA,QACtC,yCAAyC;AAAA,QACzC,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;;;AC1DO,IAAM,eAAe;AAAA,EAC1B,eAAe;AAAA,IACb,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAM;AACR;","names":["tseslint"]}
@@ -1,13 +1,16 @@
1
1
  import {
2
2
  baseRules,
3
+ createBaseLanguageOptions,
3
4
  createTypedLanguageOptions
4
- } from "./chunk-CQKEQ32W.mjs";
5
+ } from "./chunk-DYCSUKTL.mjs";
5
6
 
6
7
  // src/next/configs.ts
7
8
  function createNextConfigs(pluginReference) {
9
+ const baseLanguageOptions = createBaseLanguageOptions();
8
10
  const typedLanguageOptions = createTypedLanguageOptions();
9
11
  return [
10
12
  {
13
+ languageOptions: baseLanguageOptions,
11
14
  name: "skapxd/next/base",
12
15
  plugins: { skapxd: pluginReference },
13
16
  rules: baseRules
@@ -38,6 +41,7 @@ function createNextConfigs(pluginReference) {
38
41
  },
39
42
  {
40
43
  files: ["**/*.tsx"],
44
+ languageOptions: baseLanguageOptions,
41
45
  name: "skapxd/next/react",
42
46
  plugins: { skapxd: pluginReference },
43
47
  rules: {
@@ -59,4 +63,4 @@ function createNextConfigs(pluginReference) {
59
63
  export {
60
64
  createNextConfigs
61
65
  };
62
- //# sourceMappingURL=chunk-BAHAXSWA.mjs.map
66
+ //# sourceMappingURL=chunk-UI2RB5G6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/next/configs.ts"],"sourcesContent":["import {\n baseRules,\n createBaseLanguageOptions,\n createTypedLanguageOptions,\n} from \"#/shared/configs\";\n\nexport function createNextConfigs(pluginReference: unknown) {\n const baseLanguageOptions = createBaseLanguageOptions();\n const typedLanguageOptions = createTypedLanguageOptions();\n\n return [\n {\n languageOptions: baseLanguageOptions,\n name: \"skapxd/next/base\",\n plugins: { skapxd: pluginReference },\n rules: baseRules,\n },\n {\n files: [\"src/app/api/**/*.{ts,tsx}\", \"src/server/**/*.{ts,tsx}\"],\n languageOptions: typedLanguageOptions,\n name: \"skapxd/next/server\",\n plugins: { skapxd: pluginReference },\n rules: {\n ...baseRules,\n \"skapxd/async-functions-return-result\": [\n \"error\",\n {\n allowFilePatterns: [\n \"/(route|page|layout|template|loading|error|not-found)\\\\.tsx?$\",\n ],\n allowNamePatterns: [\n \"^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)$\",\n \"^handle(Get|Post|Put|Patch|Delete|Head|Options)$\",\n \"^start$\",\n ],\n checkMissingReturnType: true,\n resultTypeNames: [\"Result\", \"ResultValue\", \"SafeResult\"],\n },\n ],\n },\n },\n {\n files: [\"**/*.tsx\"],\n languageOptions: baseLanguageOptions,\n name: \"skapxd/next/react\",\n plugins: { skapxd: pluginReference },\n rules: {\n \"skapxd/jsx-return-name-pascal-case\": \"error\",\n \"skapxd/no-functions-inside-components\": \"error\",\n \"skapxd/no-jsx-ternary-null\": \"error\",\n \"skapxd/max-hook-size\": [\n \"warn\",\n {\n maxLines: 120,\n maxUseState: 1,\n },\n ],\n },\n },\n ];\n}\n"],"mappings":";;;;;;;AAMO,SAAS,kBAAkB,iBAA0B;AAC1D,QAAM,sBAAsB,0BAA0B;AACtD,QAAM,uBAAuB,2BAA2B;AAExD,SAAO;AAAA,IACL;AAAA,MACE,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO,CAAC,6BAA6B,0BAA0B;AAAA,MAC/D,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,QACL,GAAG;AAAA,QACH,wCAAwC;AAAA,UACtC;AAAA,UACA;AAAA,YACE,mBAAmB;AAAA,cACjB;AAAA,YACF;AAAA,YACA,mBAAmB;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA,wBAAwB;AAAA,YACxB,iBAAiB,CAAC,UAAU,eAAe,YAAY;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO,CAAC,UAAU;AAAA,MAClB,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,gBAAgB;AAAA,MACnC,OAAO;AAAA,QACL,sCAAsC;AAAA,QACtC,yCAAyC;AAAA,QACzC,8BAA8B;AAAA,QAC9B,wBAAwB;AAAA,UACtB;AAAA,UACA;AAAA,YACE,UAAU;AAAA,YACV,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/dist/cli.js CHANGED
@@ -25,6 +25,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
25
 
26
26
  // src/cli.ts
27
27
  var import_node_child_process2 = require("child_process");
28
+ var import_node_path2 = __toESM(require("path"));
28
29
  var import_node_process2 = __toESM(require("process"));
29
30
  var import_result = require("@skapxd/result");
30
31
 
@@ -3139,9 +3140,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
3139
3140
  * @param {string} [path]
3140
3141
  * @return {(string|null|Command)}
3141
3142
  */
3142
- executableDir(path2) {
3143
- if (path2 === void 0) return this._executableDir;
3144
- this._executableDir = path2;
3143
+ executableDir(path3) {
3144
+ if (path3 === void 0) return this._executableDir;
3145
+ this._executableDir = path3;
3145
3146
  return this;
3146
3147
  }
3147
3148
  /**
@@ -3400,21 +3401,24 @@ var program = new Command();
3400
3401
  var import_eslint = require("eslint");
3401
3402
  var lintableFile = /\.(c|m)?[jt]sx?$/;
3402
3403
  async function lintChanged(base) {
3403
- function git(command) {
3404
+ function git(command, options = {}) {
3404
3405
  const result = (0, import_result.trySafe)(
3405
- () => (0, import_node_child_process2.execSync)(command, { encoding: "utf8", stdio: ["pipe", "pipe", "ignore"] })
3406
+ () => (0, import_node_child_process2.execSync)(command, {
3407
+ encoding: "utf8",
3408
+ stdio: ["pipe", "pipe", "ignore"],
3409
+ ...options
3410
+ })
3406
3411
  );
3407
3412
  return result.ok ? result.value : "";
3408
3413
  }
3409
3414
  function getChangedFiles() {
3415
+ const root = git("git rev-parse --show-toplevel").trim() || import_node_process2.default.cwd();
3410
3416
  const range = base ? `${base}...HEAD` : "HEAD";
3411
3417
  const changed = git(`git diff --name-only --diff-filter=ACMR ${range}`);
3412
- const untracked = base ? "" : git("git ls-files --others --exclude-standard");
3418
+ const untracked = base ? "" : git("git ls-files --others --exclude-standard", { cwd: root });
3413
3419
  const lines = `${changed}
3414
3420
  ${untracked}`.split("\n").map((line) => line.trim());
3415
- return [...new Set(lines)].filter(
3416
- (file) => file && lintableFile.test(file)
3417
- );
3421
+ return [...new Set(lines)].filter((file) => file && lintableFile.test(file)).map((file) => import_node_path2.default.join(root, file));
3418
3422
  }
3419
3423
  const files = getChangedFiles();
3420
3424
  if (files.length === 0) {
@@ -3423,12 +3427,13 @@ ${untracked}`.split("\n").map((line) => line.trim());
3423
3427
  }
3424
3428
  console.log(`skapxd-lint-changed: linteando ${files.length} archivo(s):`);
3425
3429
  for (const file of files) {
3426
- console.log(` \u2022 ${file}`);
3430
+ console.log(` \u2022 ${import_node_path2.default.relative(import_node_process2.default.cwd(), file)}`);
3427
3431
  }
3428
3432
  const eslint = new import_eslint.ESLint({ warnIgnored: false });
3429
3433
  const lint = await (0, import_result.trySafe)(() => eslint.lintFiles(files));
3430
3434
  if (!lint.ok) {
3431
3435
  console.error("skapxd-lint-changed: ESLint fall\xF3 al ejecutarse.");
3436
+ console.error(lint.error);
3432
3437
  import_node_process2.default.exitCode = 1;
3433
3438
  return;
3434
3439
  }