@skapxd/eslint-opinionated 0.12.0 → 0.13.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 +70 -0
- package/dist/{chunk-MSOA2V5B.mjs → chunk-UXF7WZ5B.mjs} +67 -5
- package/dist/chunk-UXF7WZ5B.mjs.map +1 -0
- package/dist/index.js +67 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/shared/index.js +66 -4
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-MSOA2V5B.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -316,6 +316,35 @@ la excepción original), y ningún error queda sin manejar (el `.exhaustive()`
|
|
|
316
316
|
de ts-pattern no compila si falta una variante). Legibilidad y manejo de
|
|
317
317
|
errores dejan de depender de la disciplina del autor — humano o agente.
|
|
318
318
|
|
|
319
|
+
### El suelo del sistema: el trace global
|
|
320
|
+
|
|
321
|
+
Toda cadena de errores necesita exactamente **un punto de aterrizaje** — el
|
|
322
|
+
módulo donde la inducción termina. Si el volcadero de errores reportara sus
|
|
323
|
+
propios fallos al volcadero, tendrías recursión infinita; la solución (la
|
|
324
|
+
misma que usa el SDK de Sentry) es que el fallback del suelo sea síncrono e
|
|
325
|
+
infalible — console o un buffer local — nunca el propio suelo:
|
|
326
|
+
|
|
327
|
+
```ts
|
|
328
|
+
// trace-global.ts — el ÚNICO punto donde la cadena aterriza
|
|
329
|
+
export async function reportDomainError(error: DomainError): Promise<void> {
|
|
330
|
+
const sent = await trySafe(() => sendToTelemetry(error));
|
|
331
|
+
|
|
332
|
+
if (!sent.ok) {
|
|
333
|
+
// El pararrayos: console recibe AMBOS errores completos. No hay
|
|
334
|
+
// recursión: console es síncrono, no retorna Result y no falla.
|
|
335
|
+
console.error("telemetry_failed", { cause: sent.error, dropped: error });
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
Fíjate que este módulo **pasa todas las reglas sin exenciones**: el `await`
|
|
341
|
+
resuelve en Result, y `console.error` recibiendo el error completo es una
|
|
342
|
+
entrega válida para `result-error-requires-handling`. Reglas prácticas para
|
|
343
|
+
el suelo: una sola función pública, sin reintentos hacia sí mismo (si quieres
|
|
344
|
+
resiliencia: buffer local + `navigator.sendBeacon` al cerrar), y si tu setup
|
|
345
|
+
tiene `no-console`, la exención por archivo para *este único módulo* es
|
|
346
|
+
legítima y auditable — es la definición misma del suelo.
|
|
347
|
+
|
|
319
348
|
## Estructura del paquete
|
|
320
349
|
|
|
321
350
|
```text
|
|
@@ -743,6 +772,47 @@ igual. Esto es deliberado: si darle seguimiento a un error es crítico o no,
|
|
|
743
772
|
no puede depender de la interpretación de quien escribe; el camino por
|
|
744
773
|
defecto nunca es ignorarlo.
|
|
745
774
|
|
|
775
|
+
**El alias tampoco es escape.** Asignar no es consumir: la regla sigue los
|
|
776
|
+
alias (y los encadenados, y el destructuring) hasta verificar que alguno se
|
|
777
|
+
consume de verdad:
|
|
778
|
+
|
|
779
|
+
```ts
|
|
780
|
+
if (!result.ok) {
|
|
781
|
+
const e = result.error; // ❌ transferencia sin destino: se reporta
|
|
782
|
+
return;
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
if (!result.ok) {
|
|
786
|
+
const cause = result.error;
|
|
787
|
+
return Result.err({ cause, message: "..." }); // ✅ el alias se consumió
|
|
788
|
+
}
|
|
789
|
+
```
|
|
790
|
+
|
|
791
|
+
**Proyectar no es manejar** (desde v0.13.0). Leer `result.error.message` para
|
|
792
|
+
la UI está bien — pero si eso es lo ÚNICO que sale del guard, el `cause` murió
|
|
793
|
+
en la última milla: diste feedback de que ocurrió un error sin que el *porqué*
|
|
794
|
+
llegara a ninguna parte. El error debe fluir **completo** (el objeto entero,
|
|
795
|
+
con su cadena de causas adentro):
|
|
796
|
+
|
|
797
|
+
```ts
|
|
798
|
+
if (!result.ok) {
|
|
799
|
+
setFeedback(result.error.message); // ❌ solo la proyección: el cause se pierde
|
|
800
|
+
return;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
if (!result.ok) {
|
|
804
|
+
reportDomainError(result.error); // ✅ el objeto entero → al trace
|
|
805
|
+
setFeedback(result.error.message); // y la proyección para la UI, ahora sí
|
|
806
|
+
return;
|
|
807
|
+
}
|
|
808
|
+
```
|
|
809
|
+
|
|
810
|
+
Lo mismo vía alias (`const e = result.error; setFeedback(e.message)` no
|
|
811
|
+
basta) y vía result (`console.log(result.ok)` no es manejo). Las formas que
|
|
812
|
+
mantienen la información completa: `result.error` entero como argumento /
|
|
813
|
+
retorno / propiedad, el result completo (`return result`), o la
|
|
814
|
+
transformación con `cause`.
|
|
815
|
+
|
|
746
816
|
Type-aware como su hermana: solo aplica a Results reales de `@skapxd/result`,
|
|
747
817
|
con las mismas cinco formas de guard.
|
|
748
818
|
|
|
@@ -1169,15 +1169,75 @@ function getResultErrorRequiresHandlingOptions(options = {}) {
|
|
|
1169
1169
|
};
|
|
1170
1170
|
}
|
|
1171
1171
|
|
|
1172
|
+
// src/utils/get-declared-alias-targets.ts
|
|
1173
|
+
function getDeclaredAliasTargets(id, represents) {
|
|
1174
|
+
if (id.type === "Identifier") {
|
|
1175
|
+
return [{ name: id.name, represents }];
|
|
1176
|
+
}
|
|
1177
|
+
if (id.type !== "ObjectPattern" || represents !== "result") {
|
|
1178
|
+
return [];
|
|
1179
|
+
}
|
|
1180
|
+
return id.properties.flatMap((property) => {
|
|
1181
|
+
if (property.type === "RestElement" && property.argument.type === "Identifier") {
|
|
1182
|
+
return [{ name: property.argument.name, represents: "result" }];
|
|
1183
|
+
}
|
|
1184
|
+
if (property.type === "Property" && isPropertyKeyNamed(property, "error") && property.value.type === "Identifier") {
|
|
1185
|
+
return [{ name: property.value.name, represents: "error" }];
|
|
1186
|
+
}
|
|
1187
|
+
return [];
|
|
1188
|
+
});
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
// src/utils/is-inside-node.ts
|
|
1192
|
+
function isInsideNode(node, ancestor) {
|
|
1193
|
+
let current = node;
|
|
1194
|
+
while (current) {
|
|
1195
|
+
if (current === ancestor) {
|
|
1196
|
+
return true;
|
|
1197
|
+
}
|
|
1198
|
+
current = current.parent;
|
|
1199
|
+
}
|
|
1200
|
+
return false;
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1172
1203
|
// src/utils/is-consumed-result-reference.ts
|
|
1173
|
-
function isConsumedResultReference(identifier) {
|
|
1204
|
+
function isConsumedResultReference(identifier, searchRoot, represents = "result", visited = /* @__PURE__ */ new Set()) {
|
|
1174
1205
|
const member = identifier.parent?.type === "MemberExpression" && identifier.parent.object === identifier ? identifier.parent : null;
|
|
1206
|
+
if (member && represents === "error") {
|
|
1207
|
+
return false;
|
|
1208
|
+
}
|
|
1209
|
+
if (member && !isMemberPropertyNamed(member, "error")) {
|
|
1210
|
+
return false;
|
|
1211
|
+
}
|
|
1175
1212
|
const reference = member ?? identifier;
|
|
1213
|
+
const referenceRepresents = member ? "error" : represents;
|
|
1176
1214
|
const parent = reference.parent;
|
|
1215
|
+
if (parent?.type === "MemberExpression" && parent.object === reference) {
|
|
1216
|
+
return false;
|
|
1217
|
+
}
|
|
1177
1218
|
if (parent?.type === "UnaryExpression" && parent.operator === "void") {
|
|
1178
1219
|
return false;
|
|
1179
1220
|
}
|
|
1180
|
-
|
|
1221
|
+
if (parent?.type === "ExpressionStatement") {
|
|
1222
|
+
return false;
|
|
1223
|
+
}
|
|
1224
|
+
if (parent?.type !== "VariableDeclarator" || parent.init !== reference) {
|
|
1225
|
+
return true;
|
|
1226
|
+
}
|
|
1227
|
+
const targets = getDeclaredAliasTargets(parent.id, referenceRepresents).filter(
|
|
1228
|
+
(target) => !visited.has(target.name)
|
|
1229
|
+
);
|
|
1230
|
+
return targets.some((target) => {
|
|
1231
|
+
visited.add(target.name);
|
|
1232
|
+
return collectIdentifiersNamed(searchRoot, target.name).filter((aliasReference) => !isInsideNode(aliasReference, parent.id)).some(
|
|
1233
|
+
(aliasReference) => isConsumedResultReference(
|
|
1234
|
+
aliasReference,
|
|
1235
|
+
searchRoot,
|
|
1236
|
+
target.represents,
|
|
1237
|
+
visited
|
|
1238
|
+
)
|
|
1239
|
+
);
|
|
1240
|
+
});
|
|
1181
1241
|
}
|
|
1182
1242
|
|
|
1183
1243
|
// src/rules/result-error-requires-handling.ts
|
|
@@ -1188,7 +1248,7 @@ var resultErrorRequiresHandling = {
|
|
|
1188
1248
|
description: "Prohibe descartar en silencio un Result fallido: el error se transforma o se entrega, nunca se ignora."
|
|
1189
1249
|
},
|
|
1190
1250
|
messages: {
|
|
1191
|
-
unhandledResultError: "El guard detecta que `{{name}}` fallo, pero `{{name}}.error`
|
|
1251
|
+
unhandledResultError: "El guard detecta que `{{name}}` fallo, pero `{{name}}.error` no fluye COMPLETO a ninguna parte. Transformalo (`Result.err({ cause: {{name}}.error, ... })`), entrega el objeto entero a alguien (`reportDomainError({{name}}.error)`) o propaga el result completo. Una proyeccion (`{{name}}.error.message`) no basta: el `cause` se pierde justo en la ultima milla. La UI puede leer el mensaje, pero ADEMAS el error entero debe salir hacia el trace."
|
|
1192
1252
|
},
|
|
1193
1253
|
schema: [
|
|
1194
1254
|
{
|
|
@@ -1220,7 +1280,9 @@ var resultErrorRequiresHandling = {
|
|
|
1220
1280
|
node.consequent,
|
|
1221
1281
|
resultGuard.name
|
|
1222
1282
|
);
|
|
1223
|
-
if (references.some(
|
|
1283
|
+
if (references.some(
|
|
1284
|
+
(reference) => isConsumedResultReference(reference, node.consequent)
|
|
1285
|
+
)) {
|
|
1224
1286
|
return;
|
|
1225
1287
|
}
|
|
1226
1288
|
context.report({
|
|
@@ -2134,4 +2196,4 @@ var rules = {
|
|
|
2134
2196
|
export {
|
|
2135
2197
|
rules
|
|
2136
2198
|
};
|
|
2137
|
-
//# sourceMappingURL=chunk-
|
|
2199
|
+
//# sourceMappingURL=chunk-UXF7WZ5B.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/get-file-name.ts","../src/utils/get-source-extension.ts","../src/utils/get-directory-name.ts","../src/utils/is-http-route-method.ts","../src/utils/to-kebab-case.ts","../src/utils/get-suggested-helper-file-name.ts","../src/utils/get-path-parts.ts","../src/utils/is-in-source-root.ts","../src/utils/is-inside-app-directory.ts","../src/constants/next-project-root-file-stems.ts","../src/utils/is-next-convention-file.ts","../src/utils/get-suggested-helper-path.ts","../src/utils/get-move-suggestion.ts","../src/utils/get-function-node-name.ts","../src/utils/get-variable-declarator-name.ts","../src/utils/is-function-node.ts","../src/utils/get-root-function-entries.ts","../src/utils/get-suggested-helper-file-names.ts","../src/utils/get-tree-child-lines.ts","../src/utils/get-structure-suggestion.ts","../src/rules/one-root-function-per-file.ts","../src/utils/is-ast-node.ts","../src/utils/get-node-children.ts","../src/utils/contains-jsx.ts","../src/utils/contains-own-jsx.ts","../src/utils/function-returns-jsx.ts","../src/utils/is-pascal-case-name.ts","../src/utils/to-pascal-case.ts","../src/rules/jsx-return-name-pascal-case.ts","../src/utils/is-member-property-named.ts","../src/utils/is-callee-named.ts","../src/utils/contains-call-named.ts","../src/utils/get-async-result-rule-options.ts","../src/utils/get-property-name.ts","../src/utils/get-parent-function-name.ts","../src/utils/get-function-expression-name.ts","../src/utils/get-parent-function-report-node.ts","../src/utils/get-type-context.ts","../src/utils/is-anonymous-generated-function-name.ts","../src/utils/get-type-reference-parameters.ts","../src/utils/is-type-reference-named.ts","../src/utils/is-promise-of-result-type.ts","../src/utils/get-package-name.ts","../src/utils/is-skapxd-result-source-file.ts","../src/utils/resolve-alias-symbol.ts","../src/utils/is-symbol-from-skapxd-result.ts","../src/utils/is-skapxd-named-type.ts","../src/utils/is-skapxd-result-type.ts","../src/utils/is-skapxd-result-or-promise-result-type.ts","../src/utils/matches-any-glob.ts","../src/utils/matches-any-pattern.ts","../src/rules/async-functions-return-result.ts","../src/utils/get-containing-function.ts","../src/utils/get-function-name.ts","../src/utils/get-returned-object-expression.ts","../src/utils/unwrap-expression.ts","../src/utils/get-boolean-literal-value.ts","../src/utils/is-property-key-named.ts","../src/utils/has-boolean-ok-property.ts","../src/utils/is-exported-function.ts","../src/rules/no-ad-hoc-ok-result.ts","../src/utils/get-await-requires-result-options.ts","../src/utils/get-await-scope-name.ts","../src/utils/get-enclosing-try-safe-call.ts","../src/utils/contains-await-expression.ts","../src/utils/get-call-expression-example.ts","../src/utils/get-awaited-operation-example.ts","../src/utils/get-try-safe-await-suggestion.ts","../src/utils/is-skapxd-result-or-promise-result-expression.ts","../src/utils/is-try-safe-call.ts","../src/rules/await-requires-result.ts","../src/utils/get-error-member-object.ts","../src/utils/get-ok-member-object.ts","../src/utils/is-failed-ok-comparison.ts","../src/utils/get-failed-result-binary-guard-name.ts","../src/utils/get-result-check-argument.ts","../src/utils/get-failed-result-guard.ts","../src/utils/is-result-err-call.ts","../src/utils/get-own-result-err-calls.ts","../src/utils/get-function-return-type.ts","../src/utils/function-returns-skapxd-result-type.ts","../src/utils/is-inside-skapxd-result-returning-function.ts","../src/utils/is-skapxd-result-err-call.ts","../src/utils/is-skapxd-result-expression.ts","../src/utils/is-result-error-member.ts","../src/utils/result-err-preserves-cause.ts","../src/rules/result-error-requires-cause.ts","../src/utils/collect-identifiers-named.ts","../src/utils/get-result-error-requires-handling-options.ts","../src/utils/get-declared-alias-targets.ts","../src/utils/is-inside-node.ts","../src/utils/is-consumed-result-reference.ts","../src/rules/result-error-requires-handling.ts","../src/utils/count-own-use-state-calls-in-node.ts","../src/utils/count-own-use-state-calls.ts","../src/utils/get-function-line-count.ts","../src/utils/get-max-hook-size-options.ts","../src/utils/is-hook-name.ts","../src/rules/max-hook-size.ts","../src/utils/count-parent-segments.ts","../src/rules/no-deep-relative-imports.ts","../src/constants/default-export-allowed-file-patterns.ts","../src/utils/get-no-default-export-options.ts","../src/rules/no-default-export.ts","../src/utils/contains-emoji.ts","../src/utils/get-no-emoji-options.ts","../src/rules/no-emoji.ts","../src/utils/get-no-tunnel-props-options.ts","../src/utils/get-object-pattern-prop-names.ts","../src/utils/is-pascal-case-jsx-element.ts","../src/utils/is-forwarded-prop-reference.ts","../src/rules/no-tunnel-props.ts","../src/utils/get-no-functions-inside-components-options.ts","../src/utils/is-array-map-callback.ts","../src/utils/is-expression-arrow-function.ts","../src/utils/is-jsx-attribute-callback.ts","../src/rules/no-functions-inside-components.ts","../src/rules/no-try-catch.ts","../src/utils/get-prefer-abort-signal-options.ts","../src/utils/get-variable-initializer.ts","../src/utils/object-expression-has-signal.ts","../src/utils/has-abort-signal-option.ts","../src/utils/is-inside-effect-callback.ts","../src/rules/prefer-abort-signal.ts","../src/rules/prefer-ts-pattern.ts","../src/rules/no-jsx-ternary-null.ts","../src/utils/get-no-nested-if-options.ts","../src/utils/is-nested-if-statement.ts","../src/rules/no-nested-if.ts","../src/utils/is-promise-type.ts","../src/rules/no-promise-chain.ts","../src/shared/rules.ts"],"sourcesContent":["// @ts-nocheck\nexport function getFileName(filename) {\n return filename.split(/[\\\\/]/).at(-1) ?? filename;\n}\n","// @ts-nocheck\nexport function getSourceExtension(fileName) {\n return fileName.endsWith(\".tsx\") ? \".tsx\" : \".ts\";\n}\n","// @ts-nocheck\nexport function getDirectoryName(filename) {\n return filename.split(/[\\\\/]/).slice(0, -1).join(\"/\");\n}\n","// @ts-nocheck\nexport function isHttpRouteMethod(functionName) {\n return [\"DELETE\", \"GET\", \"HEAD\", \"OPTIONS\", \"PATCH\", \"POST\", \"PUT\"].includes(\n functionName,\n );\n}\n","// @ts-nocheck\nexport function toKebabCase(value) {\n return value\n .replace(/OEmbed/g, \"Oembed\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1-$2\")\n .replace(/[^a-zA-Z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .toLocaleLowerCase();\n}\n","// @ts-nocheck\nimport { isHttpRouteMethod } from \"./is-http-route-method\";\nimport { toKebabCase } from \"./to-kebab-case\";\n\nexport function getSuggestedHelperFileName({ extension, fileStem, functionName }) {\n const helperFunctionName =\n fileStem === \"route\" && isHttpRouteMethod(functionName)\n ? `handle${functionName}`\n : functionName;\n\n return `${toKebabCase(helperFunctionName)}${extension}`;\n}\n","// @ts-nocheck\nexport function getPathParts(filename) {\n return filename.split(/[\\\\/]/).filter(Boolean);\n}\n","// @ts-nocheck\nimport { getPathParts } from \"./get-path-parts\";\n\nexport function isInSourceRoot(filename) {\n const pathParts = getPathParts(filename);\n return pathParts.at(-2) === \"src\";\n}\n","// @ts-nocheck\nimport { getPathParts } from \"./get-path-parts\";\n\nexport function isInsideAppDirectory(filename) {\n return getPathParts(filename).includes(\"app\");\n}\n","// @ts-nocheck\nexport const nextProjectRootFileStems = [\n \"instrumentation\",\n \"instrumentation-client\",\n \"mdx-components\",\n \"proxy\",\n];\n","// @ts-nocheck\nimport { isInSourceRoot } from \"./is-in-source-root\";\nimport { isInsideAppDirectory } from \"./is-inside-app-directory\";\nimport { nextAppMetadataFileStems } from \"#/constants/next-app-metadata-file-stems\";\nimport { nextAppRouteSegmentFileStems } from \"#/constants/next-app-route-segment-file-stems\";\nimport { nextProjectRootFileStems } from \"#/constants/next-project-root-file-stems\";\n\nexport function isNextConventionFile({ fileStem, filename }) {\n if (\n [\n ...nextAppRouteSegmentFileStems,\n ...nextAppMetadataFileStems,\n ].includes(fileStem)\n ) {\n return isInsideAppDirectory(filename);\n }\n\n if (nextProjectRootFileStems.includes(fileStem)) {\n return isInSourceRoot(filename);\n }\n\n return false;\n}\n","// @ts-nocheck\nimport { getDirectoryName } from \"./get-directory-name\";\nimport { getSuggestedHelperFileName } from \"./get-suggested-helper-file-name\";\nimport { isNextConventionFile } from \"./is-next-convention-file\";\nimport { toKebabCase } from \"./to-kebab-case\";\n\nexport function getSuggestedHelperPath({ extension, fileStem, filename, functionName }) {\n const helperFileName = getSuggestedHelperFileName({\n extension,\n fileStem,\n functionName,\n });\n\n if (isNextConventionFile({ fileStem, filename })) {\n return `${getDirectoryName(filename)}/${helperFileName}`;\n }\n\n return `${getDirectoryName(filename)}/${toKebabCase(fileStem)}/${helperFileName}`;\n}\n","// @ts-nocheck\nimport { getFileName } from \"./get-file-name\";\nimport { getSourceExtension } from \"./get-source-extension\";\nimport { getSuggestedHelperPath } from \"./get-suggested-helper-path\";\nimport { isHttpRouteMethod } from \"./is-http-route-method\";\nimport { isNextConventionFile } from \"./is-next-convention-file\";\n\nexport function getMoveSuggestion({ filename, functionName }) {\n const fileName = getFileName(filename);\n const extension = getSourceExtension(fileName);\n const fileStem = fileName.slice(0, -extension.length);\n const suggestedPath = getSuggestedHelperPath({\n extension,\n fileStem,\n filename,\n functionName,\n });\n\n if (fileStem === \"route\" && isHttpRouteMethod(functionName)) {\n return `Mueve la implementacion de \\`${functionName}\\` a \\`${suggestedPath}\\` si solo se usa aqui y deja \\`${functionName}\\` en route.ts delegando a ese helper. No conviertas route.ts en route/index.ts porque Next no lo reconoce.`;\n }\n\n if (isNextConventionFile({ fileStem, filename })) {\n return `Mueve \\`${functionName}\\` a \\`${suggestedPath}\\` si solo se usa aqui y deja \\`${fileName}\\` como entrypoint de Next. No conviertas \\`${fileName}\\` en \\`${fileStem}/index${extension}\\` porque Next exige el nombre exacto del archivo.`;\n }\n\n return `Mueve \\`${functionName}\\` a \\`${suggestedPath}\\` si solo se usa aqui.`;\n}\n","// @ts-nocheck\nexport function getFunctionNodeName(node) {\n return node.id?.name ?? \"helper\";\n}\n","// @ts-nocheck\nimport { getFunctionNodeName } from \"./get-function-node-name\";\n\nexport function getVariableDeclaratorName(variableDeclarator) {\n return variableDeclarator.id.type === \"Identifier\"\n ? variableDeclarator.id.name\n : getFunctionNodeName(variableDeclarator.init);\n}\n","// @ts-nocheck\nexport function isFunctionNode(node) {\n return (\n node?.type === \"FunctionDeclaration\" ||\n node?.type === \"FunctionExpression\" ||\n node?.type === \"ArrowFunctionExpression\"\n );\n}\n","// @ts-nocheck\nimport { getFunctionNodeName } from \"./get-function-node-name\";\nimport { getVariableDeclaratorName } from \"./get-variable-declarator-name\";\nimport { isFunctionNode } from \"./is-function-node\";\n\nexport function getRootFunctionEntries(statement) {\n const declaration =\n statement.type === \"ExportNamedDeclaration\" ||\n statement.type === \"ExportDefaultDeclaration\"\n ? statement.declaration\n : statement;\n\n if (!declaration) {\n return [];\n }\n\n if (isFunctionNode(declaration)) {\n return [\n {\n name: getFunctionNodeName(declaration),\n node: declaration,\n },\n ];\n }\n\n if (declaration.type !== \"VariableDeclaration\") {\n return [];\n }\n\n return declaration.declarations\n .filter((variableDeclarator) => isFunctionNode(variableDeclarator.init))\n .map((variableDeclarator) => ({\n name: getVariableDeclaratorName(variableDeclarator),\n node: variableDeclarator.init,\n }));\n}\n","// @ts-nocheck\nimport { getSuggestedHelperFileName } from \"./get-suggested-helper-file-name\";\n\nexport function getSuggestedHelperFileNames({ extension, fileStem, functionNames }) {\n return [\n ...new Set(\n functionNames.map((functionName) =>\n getSuggestedHelperFileName({\n extension,\n fileStem,\n functionName,\n }),\n ),\n ),\n ];\n}\n","// @ts-nocheck\nexport function getTreeChildLines({ indent = \"\", names }) {\n return names.map((name, index) => {\n const branch = index === names.length - 1 ? \"└──\" : \"├──\";\n\n return `${indent}${branch} ${name}`;\n });\n}\n","// @ts-nocheck\nimport { getDirectoryName } from \"./get-directory-name\";\nimport { getFileName } from \"./get-file-name\";\nimport { getSourceExtension } from \"./get-source-extension\";\nimport { getSuggestedHelperFileNames } from \"./get-suggested-helper-file-names\";\nimport { getTreeChildLines } from \"./get-tree-child-lines\";\nimport { isNextConventionFile } from \"./is-next-convention-file\";\nimport { toKebabCase } from \"./to-kebab-case\";\n\nexport function getStructureSuggestion({ filename, functionNames }) {\n const fileName = getFileName(filename);\n const extension = getSourceExtension(fileName);\n const fileStem = fileName.slice(0, -extension.length);\n const directoryName = getDirectoryName(filename);\n const helperFileNames = getSuggestedHelperFileNames({\n extension,\n fileStem,\n functionNames,\n });\n\n if (isNextConventionFile({ fileStem, filename })) {\n return [\n `${directoryName}/`,\n ...getTreeChildLines({\n names: [fileName, ...helperFileNames],\n }),\n ].join(\"\\n\");\n }\n\n return [\n `${directoryName}/${toKebabCase(fileStem)}/`,\n ...getTreeChildLines({\n names: [`index${extension}`, ...helperFileNames],\n }),\n ].join(\"\\n\");\n}\n","// @ts-nocheck\nimport { getMoveSuggestion } from \"#/utils/get-move-suggestion\";\nimport { getRootFunctionEntries } from \"#/utils/get-root-function-entries\";\nimport { getStructureSuggestion } from \"#/utils/get-structure-suggestion\";\n\nexport const oneRootFunctionPerFile = {\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Limita cada archivo a una sola funcion declarada en la raiz.\",\n },\n messages: {\n tooManyRootFunctions:\n \"Este archivo tiene {{count}} funciones en la raiz. Deja solo una funcion top-level por archivo. {{moveSuggestion}}\\n\\nEstructura sugerida:\\n{{structureSuggestion}}\\n\\nSi se reutiliza, muevela a un modulo compartido con nombre de dominio.\",\n },\n schema: [],\n },\n create(context) {\n return {\n Program(node) {\n const rootFunctions = node.body.flatMap((statement) =>\n getRootFunctionEntries(statement),\n );\n\n if (rootFunctions.length <= 1) {\n return;\n }\n\n const firstHelper = rootFunctions[1];\n const helperFunctionNames = rootFunctions\n .slice(1)\n .map((rootFunction) => rootFunction.name);\n\n context.report({\n data: {\n count: String(rootFunctions.length),\n moveSuggestion: getMoveSuggestion({\n filename: context.filename ?? context.getFilename(),\n functionName: firstHelper.name,\n }),\n structureSuggestion: getStructureSuggestion({\n filename: context.filename ?? context.getFilename(),\n functionNames: helperFunctionNames,\n }),\n },\n messageId: \"tooManyRootFunctions\",\n node: firstHelper.node,\n });\n },\n };\n },\n };\n","// @ts-nocheck\nexport function isAstNode(value) {\n return Boolean(value && typeof value === \"object\" && \"type\" in value);\n}\n","// @ts-nocheck\nimport { isAstNode } from \"./is-ast-node\";\n\nexport function getNodeChildren(node) {\n return Object.entries(node).flatMap(([key, value]) => {\n if ([\"parent\", \"loc\", \"range\", \"tokens\", \"comments\"].includes(key)) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value.filter(isAstNode);\n }\n\n return isAstNode(value) ? [value] : [];\n });\n}\n","// @ts-nocheck\nimport { getNodeChildren } from \"./get-node-children\";\nimport { isAstNode } from \"./is-ast-node\";\n\nexport function containsJsx(node) {\n if (!isAstNode(node)) {\n return false;\n }\n\n if (node.type === \"JSXElement\" || node.type === \"JSXFragment\") {\n return true;\n }\n\n return getNodeChildren(node).some((child) => containsJsx(child));\n}\n","// @ts-nocheck\nimport { getNodeChildren } from \"./get-node-children\";\nimport { isAstNode } from \"./is-ast-node\";\nimport { isFunctionNode } from \"./is-function-node\";\n\nexport function containsOwnJsx(node) {\n if (!isAstNode(node)) {\n return false;\n }\n\n if (node.type === \"JSXElement\" || node.type === \"JSXFragment\") {\n return true;\n }\n\n if (isFunctionNode(node)) {\n return false;\n }\n\n return getNodeChildren(node).some((child) => containsOwnJsx(child));\n}\n","// @ts-nocheck\nimport { containsJsx } from \"./contains-jsx\";\nimport { containsOwnJsx } from \"./contains-own-jsx\";\n\nexport function functionReturnsJsx(functionNode) {\n if (functionNode.body?.type !== \"BlockStatement\") {\n return containsJsx(functionNode.body);\n }\n\n return containsOwnJsx(functionNode.body);\n}\n","// @ts-nocheck\nexport function isPascalCaseName(value) {\n return /^[A-Z][A-Za-z0-9]*$/.test(value);\n}\n","// @ts-nocheck\nexport function toPascalCase(value) {\n return value.replace(/^[a-z]/, (letter) => letter.toLocaleUpperCase());\n}\n","// @ts-nocheck\nimport { functionReturnsJsx } from \"#/utils/function-returns-jsx\";\nimport { isFunctionNode } from \"#/utils/is-function-node\";\nimport { isPascalCaseName } from \"#/utils/is-pascal-case-name\";\nimport { toPascalCase } from \"#/utils/to-pascal-case\";\n\nexport const jsxReturnNamePascalCase = {\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Exige nombres PascalCase para funciones que devuelven JSX.\",\n },\n messages: {\n invalidName:\n \"La funcion `{{name}}` devuelve JSX. Nombrala como componente, por ejemplo `{{suggestedName}}`, y usala con sintaxis JSX si aplica.\",\n },\n schema: [],\n },\n create(context) {\n function reportIfJsxReturningFunction(node, name, reportNode = node) {\n if (!name || isPascalCaseName(name) || !functionReturnsJsx(node)) {\n return;\n }\n\n context.report({\n data: {\n name,\n suggestedName: toPascalCase(name),\n },\n messageId: \"invalidName\",\n node: reportNode,\n });\n }\n\n return {\n FunctionDeclaration(node) {\n reportIfJsxReturningFunction(node, node.id?.name, node.id ?? node);\n },\n VariableDeclarator(node) {\n if (!isFunctionNode(node.init) || node.id.type !== \"Identifier\") {\n return;\n }\n\n reportIfJsxReturningFunction(node.init, node.id.name, node.id);\n },\n };\n },\n };\n","// @ts-nocheck\nexport function isMemberPropertyNamed(node, propertyName) {\n if (node.computed) {\n return node.property.type === \"Literal\" && node.property.value === propertyName;\n }\n\n return node.property.type === \"Identifier\" && node.property.name === propertyName;\n}\n","// @ts-nocheck\nimport { isMemberPropertyNamed } from \"./is-member-property-named\";\n\nexport function isCalleeNamed(node, names) {\n if (node?.type === \"Identifier\") {\n return names.includes(node.name);\n }\n\n if (node?.type === \"MemberExpression\") {\n return names.some((name) => isMemberPropertyNamed(node, name));\n }\n\n return false;\n}\n","// @ts-nocheck\nimport { getNodeChildren } from \"./get-node-children\";\nimport { isAstNode } from \"./is-ast-node\";\nimport { isCalleeNamed } from \"./is-callee-named\";\n\nexport function containsCallNamed(node, names) {\n if (!isAstNode(node)) {\n return false;\n }\n\n if (node.type === \"CallExpression\" && isCalleeNamed(node.callee, names)) {\n return true;\n }\n\n return getNodeChildren(node).some((child) => containsCallNamed(child, names));\n}\n","// @ts-nocheck\nexport function getAsyncResultRuleOptions(options = {}) {\n return {\n allowFilePatterns: options.allowFilePatterns ?? [],\n allowNamePatterns: options.allowNamePatterns ?? [],\n checkMissingReturnType: options.checkMissingReturnType ?? true,\n checkMissingReturnTypeWhenCallNames:\n options.checkMissingReturnTypeWhenCallNames ?? [],\n promiseTypeNames: options.promiseTypeNames ?? [\"Promise\"],\n requireCallNames: options.requireCallNames ?? [],\n resultTypeNames: options.resultTypeNames ?? [\"Result\"],\n };\n}\n","// @ts-nocheck\nexport function getPropertyName(node) {\n if (!node) {\n return \"anonymous\";\n }\n\n if (node.type === \"Identifier\") {\n return node.name;\n }\n\n if (node.type === \"Literal\") {\n return String(node.value);\n }\n\n return \"anonymous\";\n}\n","// @ts-nocheck\nimport { getFunctionNodeName } from \"./get-function-node-name\";\nimport { getPropertyName } from \"./get-property-name\";\nimport { getVariableDeclaratorName } from \"./get-variable-declarator-name\";\n\nexport function getParentFunctionName(node) {\n const parent = node.parent;\n\n if (parent?.type === \"VariableDeclarator\") {\n return getVariableDeclaratorName(parent);\n }\n\n if (\n parent?.type === \"Property\" ||\n parent?.type === \"MethodDefinition\" ||\n parent?.type === \"PropertyDefinition\"\n ) {\n return getPropertyName(parent.key);\n }\n\n return getFunctionNodeName(node);\n}\n","// @ts-nocheck\nimport { getParentFunctionName } from \"./get-parent-function-name\";\n\nexport function getFunctionExpressionName(node) {\n return node.id?.name ?? getParentFunctionName(node);\n}\n","// @ts-nocheck\nexport function getParentFunctionReportNode(node) {\n const parent = node.parent;\n\n if (parent?.type === \"VariableDeclarator\" && parent.id.type === \"Identifier\") {\n return parent.id;\n }\n\n if (\n parent?.type === \"Property\" ||\n parent?.type === \"MethodDefinition\" ||\n parent?.type === \"PropertyDefinition\"\n ) {\n return parent.key;\n }\n\n return node.id ?? node;\n}\n","// @ts-nocheck\nexport function getTypeContext(context) {\n const sourceCode = context.sourceCode ?? context.getSourceCode();\n const parserServices = sourceCode.parserServices;\n\n if (!parserServices?.program) {\n return null;\n }\n\n return {\n checker: parserServices.program.getTypeChecker(),\n services: parserServices,\n };\n}\n","// @ts-nocheck\nexport function isAnonymousGeneratedFunctionName(name) {\n return name === \"anonymous\" || name === \"helper\";\n}\n","// @ts-nocheck\nexport function getTypeReferenceParameters(node) {\n return node.typeArguments?.params ?? node.typeParameters?.params ?? [];\n}\n","// @ts-nocheck\nexport function isTypeReferenceNamed(node, names) {\n const typeName = node.typeName;\n\n return typeName.type === \"Identifier\" && names.includes(typeName.name);\n}\n","// @ts-nocheck\nimport { getTypeReferenceParameters } from \"./get-type-reference-parameters\";\nimport { isTypeReferenceNamed } from \"./is-type-reference-named\";\n\nexport function isPromiseOfResultType(node, options) {\n if (node.type !== \"TSTypeReference\") {\n return false;\n }\n\n if (!isTypeReferenceNamed(node, options.promiseTypeNames)) {\n return false;\n }\n\n const promiseValueType = getTypeReferenceParameters(node)[0];\n\n return Boolean(\n promiseValueType &&\n promiseValueType.type === \"TSTypeReference\" &&\n isTypeReferenceNamed(promiseValueType, options.resultTypeNames),\n );\n}\n","// @ts-nocheck\nimport { trySafe } from \"@skapxd/result\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nconst packageNameByDir = new Map();\n\n// Resuelve el `name` del package.json más cercano hacia arriba desde un archivo.\n// Robusto ante cualquier layout (node_modules, pnpm, workspace link, monorepo):\n// se basa en la identidad real del paquete, no en la forma de la ruta.\nexport function getPackageName(fileName) {\n const visited = [];\n let dir = path.dirname(fileName);\n\n while (true) {\n if (packageNameByDir.has(dir)) {\n const cached = packageNameByDir.get(dir);\n for (const visitedDir of visited) packageNameByDir.set(visitedDir, cached);\n return cached;\n }\n\n visited.push(dir);\n\n const packageJsonPath = path.join(dir, \"package.json\");\n\n if (fs.existsSync(packageJsonPath)) {\n const parsed = trySafe(() =>\n JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\")),\n );\n const name = parsed.ok ? (parsed.value.name ?? null) : null;\n for (const visitedDir of visited) packageNameByDir.set(visitedDir, name);\n return name;\n }\n\n const parent = path.dirname(dir);\n\n if (parent === dir) {\n for (const visitedDir of visited) packageNameByDir.set(visitedDir, null);\n return null;\n }\n\n dir = parent;\n }\n}\n","// @ts-nocheck\nimport { getPackageName } from \"./get-package-name\";\n\nexport function isSkapxdResultSourceFile(fileName) {\n return getPackageName(fileName) === \"@skapxd/result\";\n}\n","// @ts-nocheck\nimport ts from \"typescript\";\n\nexport function resolveAliasSymbol(symbol, typeContext) {\n return symbol.flags & ts.SymbolFlags.Alias\n ? typeContext.checker.getAliasedSymbol(symbol)\n : symbol;\n}\n","// @ts-nocheck\nimport { isSkapxdResultSourceFile } from \"./is-skapxd-result-source-file\";\nimport { resolveAliasSymbol } from \"./resolve-alias-symbol\";\n\nexport function isSymbolFromSkapxdResult(symbol, typeContext) {\n const resolvedSymbol = resolveAliasSymbol(symbol, typeContext);\n\n return (resolvedSymbol.getDeclarations() ?? []).some((declaration) =>\n isSkapxdResultSourceFile(declaration.getSourceFile().fileName),\n );\n}\n","// @ts-nocheck\nimport { isSymbolFromSkapxdResult } from \"./is-symbol-from-skapxd-result\";\n\nexport function isSkapxdNamedType(type, names, typeContext) {\n return [\n type.aliasSymbol,\n type.symbol,\n ].some((symbol) =>\n Boolean(\n symbol &&\n names.includes(symbol.getName()) &&\n isSymbolFromSkapxdResult(symbol, typeContext),\n ),\n );\n}\n","// @ts-nocheck\nimport { isSkapxdNamedType } from \"./is-skapxd-named-type\";\n\nexport function isSkapxdResultType(type, typeContext) {\n if (isSkapxdNamedType(type, [\"Result\", \"SafeResult\"], typeContext)) {\n return true;\n }\n\n if (!type.isUnion()) {\n return false;\n }\n\n const hasOk = type.types.some((part) =>\n isSkapxdNamedType(part, [\"Ok\"], typeContext),\n );\n const hasErr = type.types.some((part) =>\n isSkapxdNamedType(part, [\"Err\"], typeContext),\n );\n\n return hasOk && hasErr;\n}\n","// @ts-nocheck\nimport { isSkapxdResultType } from \"./is-skapxd-result-type\";\n\nexport function isSkapxdResultOrPromiseResultType(type, typeContext) {\n if (isSkapxdResultType(type, typeContext)) {\n return true;\n }\n\n const promisedType = typeContext.checker.getPromisedTypeOfPromise(type);\n\n return Boolean(promisedType && isSkapxdResultType(promisedType, typeContext));\n}\n","// @ts-nocheck\nimport picomatch from \"picomatch\";\n\n// Matching de rutas con globs delegado a picomatch (el motor que usan\n// fast-glob, chokidar y vitest). Dos ergonomías propias:\n// - separadores de Windows normalizados, mismo glob en cualquier sistema;\n// - un patrón sin prefijo (`src/index.ts`, `*.config.*`) matchea en\n// cualquier carpeta — se le antepone `**/`.\nexport function matchesAnyGlob(filePath, globs) {\n const normalized = filePath.replaceAll(\"\\\\\", \"/\");\n\n return globs.some((glob) => {\n const anchored =\n glob.startsWith(\"/\") || glob.startsWith(\"**\") ? glob : `**/${glob}`;\n\n return picomatch(anchored)(normalized);\n });\n}\n","// @ts-nocheck\nexport function matchesAnyPattern(value, patterns) {\n return patterns.some((pattern) => new RegExp(pattern).test(value));\n}\n","// @ts-nocheck\nimport { containsCallNamed } from \"#/utils/contains-call-named\";\nimport { getAsyncResultRuleOptions } from \"#/utils/get-async-result-rule-options\";\nimport { getFunctionExpressionName } from \"#/utils/get-function-expression-name\";\nimport { getParentFunctionName } from \"#/utils/get-parent-function-name\";\nimport { getParentFunctionReportNode } from \"#/utils/get-parent-function-report-node\";\nimport { getTypeContext } from \"#/utils/get-type-context\";\nimport { isAnonymousGeneratedFunctionName } from \"#/utils/is-anonymous-generated-function-name\";\nimport { isPromiseOfResultType } from \"#/utils/is-promise-of-result-type\";\nimport { isSkapxdResultOrPromiseResultType } from \"#/utils/is-skapxd-result-or-promise-result-type\";\nimport { matchesAnyGlob } from \"#/utils/matches-any-glob\";\nimport { matchesAnyPattern } from \"#/utils/matches-any-pattern\";\n\nexport const asyncFunctionsReturnResult = {\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Exige Promise<Result<...>> en funciones async de dominio.\",\n },\n messages: {\n missingReturnType:\n \"La funcion async `{{name}}` debe declarar Promise<Result<...>> como tipo de retorno: trySafe en la frontera, errores de dominio con `cause`, y el consumidor decide con `match()` de ts-pattern.\",\n invalidReturnType:\n \"La funcion async `{{name}}` debe retornar Promise<Result<...>> para modelar errores de forma explicita: trySafe en la frontera, errores de dominio con `cause`, y el consumidor decide con `match()` de ts-pattern.\",\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowFilePatterns: {\n items: { type: \"string\" },\n type: \"array\",\n },\n allowNamePatterns: {\n items: { type: \"string\" },\n type: \"array\",\n },\n checkMissingReturnType: { type: \"boolean\" },\n checkMissingReturnTypeWhenCallNames: {\n items: { type: \"string\" },\n type: \"array\",\n },\n requireCallNames: {\n items: { type: \"string\" },\n type: \"array\",\n },\n promiseTypeNames: {\n items: { type: \"string\" },\n type: \"array\",\n },\n resultTypeNames: {\n items: { type: \"string\" },\n type: \"array\",\n },\n },\n type: \"object\",\n },\n ],\n },\n create(context) {\n const options = getAsyncResultRuleOptions(context.options[0]);\n const filename = context.filename ?? context.getFilename();\n const typeContext = getTypeContext(context);\n\n // Verifica que el tipo de retorno sea un Result de @skapxd/result.\n // Con información de tipos (projectService) resuelve el símbolo hasta\n // el paquete; sin ella, cae a una comprobación por nombre.\n function isSkapxdResultReturnType(annotation) {\n if (typeContext) {\n const type = typeContext.services.getTypeFromTypeNode(annotation);\n\n return isSkapxdResultOrPromiseResultType(type, typeContext);\n }\n\n return isPromiseOfResultType(annotation, options);\n }\n\n function reportIfInvalidAsyncReturn(node, name, reportNode = node) {\n if (!node.async || matchesAnyGlob(filename, options.allowFilePatterns)) {\n return;\n }\n\n const functionName = name ?? \"anonymous\";\n\n if (isAnonymousGeneratedFunctionName(functionName)) {\n return;\n }\n\n if (matchesAnyPattern(functionName, options.allowNamePatterns)) {\n return;\n }\n\n if (\n options.requireCallNames.length &&\n !containsCallNamed(node.body, options.requireCallNames)\n ) {\n return;\n }\n\n const returnType = node.returnType?.typeAnnotation;\n const missingReturnTypeIsReportable =\n options.checkMissingReturnType ||\n containsCallNamed(node.body, options.checkMissingReturnTypeWhenCallNames);\n\n if (!returnType && missingReturnTypeIsReportable) {\n context.report({\n data: { name: functionName },\n messageId: \"missingReturnType\",\n node: reportNode,\n });\n\n return;\n }\n\n if (!returnType) {\n return;\n }\n\n if (isSkapxdResultReturnType(returnType)) {\n return;\n }\n\n context.report({\n data: { name: functionName },\n messageId: \"invalidReturnType\",\n node: reportNode,\n });\n }\n\n return {\n ArrowFunctionExpression(node) {\n reportIfInvalidAsyncReturn(\n node,\n getParentFunctionName(node),\n getParentFunctionReportNode(node),\n );\n },\n FunctionDeclaration(node) {\n reportIfInvalidAsyncReturn(node, node.id?.name, node.id ?? node);\n },\n FunctionExpression(node) {\n reportIfInvalidAsyncReturn(\n node,\n getFunctionExpressionName(node),\n getParentFunctionReportNode(node),\n );\n },\n };\n },\n };\n","// @ts-nocheck\nimport { isFunctionNode } from \"./is-function-node\";\n\nexport function getContainingFunction(node) {\n let currentNode = node.parent;\n\n while (currentNode) {\n if (isFunctionNode(currentNode)) {\n return currentNode;\n }\n\n currentNode = currentNode.parent;\n }\n\n return null;\n}\n","// @ts-nocheck\nimport { getFunctionNodeName } from \"./get-function-node-name\";\nimport { getParentFunctionName } from \"./get-parent-function-name\";\n\nexport function getFunctionName(node) {\n if (node.type === \"FunctionDeclaration\") {\n return getFunctionNodeName(node);\n }\n\n return getParentFunctionName(node);\n}\n","// @ts-nocheck\nexport function getReturnedObjectExpression(node) {\n if (!node) {\n return null;\n }\n\n if (node.type === \"ObjectExpression\") {\n return node;\n }\n\n if (\n node.type === \"TSAsExpression\" ||\n node.type === \"TSSatisfiesExpression\" ||\n node.type === \"TSNonNullExpression\" ||\n node.type === \"ChainExpression\"\n ) {\n return getReturnedObjectExpression(node.expression);\n }\n\n return null;\n}\n","// @ts-nocheck\nexport function unwrapExpression(node) {\n if (\n node.type === \"ChainExpression\" ||\n node.type === \"TSAsExpression\" ||\n node.type === \"TSSatisfiesExpression\" ||\n node.type === \"TSNonNullExpression\"\n ) {\n return unwrapExpression(node.expression);\n }\n\n return node;\n}\n","// @ts-nocheck\nimport { unwrapExpression } from \"./unwrap-expression\";\n\nexport function getBooleanLiteralValue(node) {\n const unwrappedNode = unwrapExpression(node);\n\n return unwrappedNode.type === \"Literal\" && typeof unwrappedNode.value === \"boolean\"\n ? unwrappedNode.value\n : null;\n}\n","// @ts-nocheck\nexport function isPropertyKeyNamed(property, propertyName) {\n if (property.key.type === \"Identifier\") {\n return property.key.name === propertyName;\n }\n\n return property.key.type === \"Literal\" && property.key.value === propertyName;\n}\n","// @ts-nocheck\nimport { getBooleanLiteralValue } from \"./get-boolean-literal-value\";\nimport { isPropertyKeyNamed } from \"./is-property-key-named\";\n\n// Detecta `{ ok: true }` / `{ ok: false }` (contrato ad hoc tipo Result),\n// no `{ ok: res.ok }` (un valor cualquiera, p. ej. un Response de fetch).\nexport function hasBooleanOkProperty(node) {\n return node.properties.some(\n (property) =>\n property.type === \"Property\" &&\n isPropertyKeyNamed(property, \"ok\") &&\n getBooleanLiteralValue(property.value) !== null,\n );\n}\n","// @ts-nocheck\nexport function isExportedFunction(node) {\n const parent = node.parent;\n\n if (\n node.type === \"FunctionDeclaration\" &&\n (parent?.type === \"ExportNamedDeclaration\" ||\n parent?.type === \"ExportDefaultDeclaration\")\n ) {\n return true;\n }\n\n if (\n (node.type === \"ArrowFunctionExpression\" ||\n node.type === \"FunctionExpression\") &&\n parent?.type === \"VariableDeclarator\" &&\n parent.parent?.parent?.type === \"ExportNamedDeclaration\"\n ) {\n return true;\n }\n\n return false;\n}\n","// @ts-nocheck\nimport { getContainingFunction } from \"#/utils/get-containing-function\";\nimport { getFunctionName } from \"#/utils/get-function-name\";\nimport { getReturnedObjectExpression } from \"#/utils/get-returned-object-expression\";\nimport { hasBooleanOkProperty } from \"#/utils/has-boolean-ok-property\";\nimport { isExportedFunction } from \"#/utils/is-exported-function\";\n\nexport const noAdHocOkResult = {\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Prohibe retornar contratos ad hoc con ok en funciones async exportadas.\",\n },\n messages: {\n adHocOkResult:\n \"No retornes objetos ad hoc con `ok` desde la funcion async `{{name}}`. Usa Result.ok(...) / Result.err(...) de @skapxd/result con un error discriminado `{ type: ... }`: un unico contrato Result permite consumir cada variante con `match()` de ts-pattern y `.exhaustive()`.\",\n },\n schema: [],\n },\n create(context) {\n return {\n ReturnStatement(node) {\n const returnedObject = getReturnedObjectExpression(node.argument);\n\n if (!returnedObject || !hasBooleanOkProperty(returnedObject)) {\n return;\n }\n\n const containingFunction = getContainingFunction(node);\n\n if (\n !containingFunction?.async ||\n !isExportedFunction(containingFunction)\n ) {\n return;\n }\n\n context.report({\n data: {\n name: getFunctionName(containingFunction),\n },\n messageId: \"adHocOkResult\",\n node,\n });\n },\n };\n },\n };\n","// @ts-nocheck\nexport function getAwaitRequiresResultOptions(options = {}) {\n return {\n allowFilePatterns: options.allowFilePatterns ?? [],\n trySafeCallNames: options.trySafeCallNames ?? [\"trySafe\"],\n };\n}\n","// @ts-nocheck\nimport { getContainingFunction } from \"./get-containing-function\";\nimport { getFunctionName } from \"./get-function-name\";\n\nexport function getAwaitScopeName(node) {\n const containingFunction = getContainingFunction(node);\n\n return containingFunction ? getFunctionName(containingFunction) : \"top-level\";\n}\n","// @ts-nocheck\nimport { isCalleeNamed } from \"./is-callee-named\";\nimport { isFunctionNode } from \"./is-function-node\";\n\n// Si el nodo está dentro de un callback pasado a `trySafe(...)`, devuelve esa\n// CallExpression (para poder verificar su símbolo); si no, null.\nexport function getEnclosingTrySafeCall(node, trySafeCallNames) {\n let currentNode = node.parent;\n\n while (currentNode) {\n if (!isFunctionNode(currentNode)) {\n currentNode = currentNode.parent;\n continue;\n }\n\n const parent = currentNode.parent;\n const isTrySafeArgument =\n parent?.type === \"CallExpression\" &&\n parent.arguments.includes(currentNode) &&\n isCalleeNamed(parent.callee, trySafeCallNames);\n\n return isTrySafeArgument ? parent : null;\n }\n\n return null;\n}\n","// @ts-nocheck\nimport { getNodeChildren } from \"./get-node-children\";\nimport { isAstNode } from \"./is-ast-node\";\nimport { isFunctionNode } from \"./is-function-node\";\n\nexport function containsAwaitExpression(node) {\n if (!isAstNode(node)) {\n return false;\n }\n\n if (node.type === \"AwaitExpression\") {\n return true;\n }\n\n if (isFunctionNode(node)) {\n return false;\n }\n\n return getNodeChildren(node).some((child) => containsAwaitExpression(child));\n}\n","// @ts-nocheck\nimport { unwrapExpression } from \"./unwrap-expression\";\n\nexport function getCallExpressionExample(node, sourceCode) {\n const calleeText = sourceCode.getText(node.callee);\n\n if (node.arguments.length === 0) {\n return `${calleeText}()`;\n }\n\n if (node.arguments.length === 1 && unwrapExpression(node.arguments[0]).type === \"ObjectExpression\") {\n return `${calleeText}({...})`;\n }\n\n return `${calleeText}(...)`;\n}\n","// @ts-nocheck\nimport { getCallExpressionExample } from \"./get-call-expression-example\";\nimport { unwrapExpression } from \"./unwrap-expression\";\n\nexport function getAwaitedOperationExample(node, sourceCode) {\n const unwrappedNode = unwrapExpression(node);\n\n if (unwrappedNode.type === \"CallExpression\") {\n return getCallExpressionExample(unwrappedNode, sourceCode);\n }\n\n const expressionText = sourceCode.getText(unwrappedNode).replace(/\\s+/g, \" \");\n\n return expressionText.length > 80\n ? `${expressionText.slice(0, 77)}...`\n : expressionText;\n}\n","// @ts-nocheck\nimport { containsAwaitExpression } from \"./contains-await-expression\";\nimport { getAwaitedOperationExample } from \"./get-awaited-operation-example\";\n\nexport function getTrySafeAwaitSuggestion(node, sourceCode) {\n const callbackKeyword = containsAwaitExpression(node) ? \"async \" : \"\";\n\n return `await trySafe(${callbackKeyword}() => ${getAwaitedOperationExample(\n node,\n sourceCode,\n )})`;\n}\n","// @ts-nocheck\nimport { isSkapxdResultOrPromiseResultType } from \"./is-skapxd-result-or-promise-result-type\";\n\nexport function isSkapxdResultOrPromiseResultExpression(node, typeContext) {\n return isSkapxdResultOrPromiseResultType(\n typeContext.services.getTypeAtLocation(node),\n typeContext,\n );\n}\n","// @ts-nocheck\nimport { isCalleeNamed } from \"./is-callee-named\";\n\nexport function isTrySafeCall(node, trySafeCallNames) {\n return (\n node?.type === \"CallExpression\" &&\n isCalleeNamed(node.callee, trySafeCallNames)\n );\n}\n","// @ts-nocheck\nimport { getAwaitRequiresResultOptions } from \"#/utils/get-await-requires-result-options\";\nimport { getAwaitScopeName } from \"#/utils/get-await-scope-name\";\nimport { getEnclosingTrySafeCall } from \"#/utils/get-enclosing-try-safe-call\";\nimport { getTrySafeAwaitSuggestion } from \"#/utils/get-try-safe-await-suggestion\";\nimport { getTypeContext } from \"#/utils/get-type-context\";\nimport { isSkapxdResultOrPromiseResultExpression } from \"#/utils/is-skapxd-result-or-promise-result-expression\";\nimport { isSymbolFromSkapxdResult } from \"#/utils/is-symbol-from-skapxd-result\";\nimport { isTrySafeCall } from \"#/utils/is-try-safe-call\";\nimport { matchesAnyGlob } from \"#/utils/matches-any-glob\";\n\nexport const awaitRequiresResult = {\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Exige que todo await resuelva en un Result: una funcion que retorne Promise<Result<...>> o trySafe en el sitio.\",\n },\n messages: {\n awaitWithoutResult:\n \"El await dentro de `{{name}}` no resuelve en un Result. Mejor opcion: extrae la operacion a una funcion que retorne Promise<Result<...>> y modela ahi los errores de dominio con `{ type, message, cause }` (el trySafe vive dentro de esa funcion). Alternativa: envuelvela aqui mismo: `{{suggestion}}`. En ambos casos, consume el Result con `match()` de ts-pattern.\",\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowFilePatterns: {\n items: { type: \"string\" },\n type: \"array\",\n },\n trySafeCallNames: {\n items: { type: \"string\" },\n type: \"array\",\n },\n },\n type: \"object\",\n },\n ],\n },\n create(context) {\n const options = getAwaitRequiresResultOptions(context.options[0]);\n const filename = context.filename ?? context.getFilename();\n const sourceCode = context.sourceCode ?? context.getSourceCode();\n const typeContext = getTypeContext(context);\n\n // Una llamada protege el await solo si es trySafe de @skapxd/result.\n // Con info de tipos se verifica por símbolo; sin ella, el nombre basta.\n function isSkapxdTrySafe(callNode) {\n if (!callNode) {\n return false;\n }\n\n if (!typeContext) {\n return true;\n }\n\n const symbol = typeContext.services.getSymbolAtLocation(callNode.callee);\n\n return Boolean(symbol && isSymbolFromSkapxdResult(symbol, typeContext));\n }\n\n return {\n AwaitExpression(node) {\n if (matchesAnyGlob(filename, options.allowFilePatterns)) {\n return;\n }\n\n // Si lo awaiteado ya es Result/Promise<Result> de @skapxd/result,\n // los errores ya están modelados y trySafe sería redundante.\n if (\n typeContext &&\n isSkapxdResultOrPromiseResultExpression(node.argument, typeContext)\n ) {\n return;\n }\n\n const directCall = isTrySafeCall(node.argument, options.trySafeCallNames)\n ? node.argument\n : null;\n const enclosingCall = getEnclosingTrySafeCall(\n node,\n options.trySafeCallNames,\n );\n\n if (isSkapxdTrySafe(directCall) || isSkapxdTrySafe(enclosingCall)) {\n return;\n }\n\n context.report({\n data: {\n name: getAwaitScopeName(node),\n suggestion: getTrySafeAwaitSuggestion(node.argument, sourceCode),\n },\n messageId: \"awaitWithoutResult\",\n node,\n });\n },\n };\n },\n };\n","// @ts-nocheck\nimport { isMemberPropertyNamed } from \"./is-member-property-named\";\nimport { unwrapExpression } from \"./unwrap-expression\";\n\n// `result.error` usado como condición: la presencia del error es el guard.\nexport function getErrorMemberObject(node) {\n const unwrappedNode = unwrapExpression(node);\n\n if (\n unwrappedNode.type !== \"MemberExpression\" ||\n unwrappedNode.object.type !== \"Identifier\" ||\n !isMemberPropertyNamed(unwrappedNode, \"error\")\n ) {\n return null;\n }\n\n return {\n name: unwrappedNode.object.name,\n node: unwrappedNode.object,\n };\n}\n","// @ts-nocheck\nimport { isMemberPropertyNamed } from \"./is-member-property-named\";\nimport { unwrapExpression } from \"./unwrap-expression\";\n\nexport function getOkMemberObject(node) {\n const unwrappedNode = unwrapExpression(node);\n\n if (\n unwrappedNode.type !== \"MemberExpression\" ||\n unwrappedNode.object.type !== \"Identifier\" ||\n !isMemberPropertyNamed(unwrappedNode, \"ok\")\n ) {\n return null;\n }\n\n return {\n name: unwrappedNode.object.name,\n node: unwrappedNode.object,\n };\n}\n","// @ts-nocheck\nexport function isFailedOkComparison(operator, comparedValue) {\n return (\n (operator === \"===\" && comparedValue === false) ||\n (operator === \"!==\" && comparedValue === true)\n );\n}\n","// @ts-nocheck\nimport { getBooleanLiteralValue } from \"./get-boolean-literal-value\";\nimport { getOkMemberObject } from \"./get-ok-member-object\";\nimport { isFailedOkComparison } from \"./is-failed-ok-comparison\";\n\nexport function getFailedResultBinaryGuardName(node) {\n const leftResult = getOkMemberObject(node.left);\n const rightResult = getOkMemberObject(node.right);\n const leftBoolean = getBooleanLiteralValue(node.left);\n const rightBoolean = getBooleanLiteralValue(node.right);\n\n if (leftResult && rightBoolean !== null) {\n return isFailedOkComparison(node.operator, rightBoolean) ? leftResult : null;\n }\n\n if (rightResult && leftBoolean !== null) {\n return isFailedOkComparison(node.operator, leftBoolean) ? rightResult : null;\n }\n\n return null;\n}\n","// @ts-nocheck\nimport { isMemberPropertyNamed } from \"./is-member-property-named\";\nimport { unwrapExpression } from \"./unwrap-expression\";\n\n// Extrae el Result de una guarda con type-guard, p. ej. `Result.isErr(result)`\n// o `Result.isOk(result)`. Devuelve `{ name, node }` del argumento, o null.\nexport function getResultCheckArgument(node, methodName) {\n const unwrappedNode = unwrapExpression(node);\n\n if (\n unwrappedNode.type !== \"CallExpression\" ||\n unwrappedNode.callee.type !== \"MemberExpression\" ||\n !isMemberPropertyNamed(unwrappedNode.callee, methodName)\n ) {\n return null;\n }\n\n const argument = unwrappedNode.arguments[0];\n\n if (argument?.type !== \"Identifier\") {\n return null;\n }\n\n return { name: argument.name, node: argument };\n}\n","// @ts-nocheck\nimport { getErrorMemberObject } from \"./get-error-member-object\";\nimport { getFailedResultBinaryGuardName } from \"./get-failed-result-binary-guard-name\";\nimport { getOkMemberObject } from \"./get-ok-member-object\";\nimport { getResultCheckArgument } from \"./get-result-check-argument\";\nimport { unwrapExpression } from \"./unwrap-expression\";\n\nexport function getFailedResultGuard(node) {\n const unwrappedNode = unwrapExpression(node);\n\n // `result.error` como condición (truthiness del error)\n if (unwrappedNode.type === \"MemberExpression\") {\n return getErrorMemberObject(unwrappedNode);\n }\n\n // `!result.ok` o `!Result.isOk(result)`\n if (unwrappedNode.type === \"UnaryExpression\" && unwrappedNode.operator === \"!\") {\n return (\n getOkMemberObject(unwrappedNode.argument) ??\n getResultCheckArgument(unwrappedNode.argument, \"isOk\")\n );\n }\n\n // `Result.isErr(result)`\n if (unwrappedNode.type === \"CallExpression\") {\n return getResultCheckArgument(unwrappedNode, \"isErr\");\n }\n\n // `result.ok === false` / `result.ok !== true`\n if (\n unwrappedNode.type === \"BinaryExpression\" &&\n [\"===\", \"!==\"].includes(unwrappedNode.operator)\n ) {\n return getFailedResultBinaryGuardName(unwrappedNode);\n }\n\n return null;\n}\n","// @ts-nocheck\nimport { isMemberPropertyNamed } from \"./is-member-property-named\";\n\nexport function isResultErrCall(node) {\n // No se exige que el objeto se llame literalmente `Result`: un alias\n // (`import { Result as R }`) también vale. La identidad real (que provenga de\n // @skapxd/result) la verifica `isSkapxdResultErrCall` con el símbolo.\n return (\n node.callee.type === \"MemberExpression\" &&\n node.callee.object.type === \"Identifier\" &&\n isMemberPropertyNamed(node.callee, \"err\")\n );\n}\n","// @ts-nocheck\nimport { getNodeChildren } from \"./get-node-children\";\nimport { isAstNode } from \"./is-ast-node\";\nimport { isFunctionNode } from \"./is-function-node\";\nimport { isResultErrCall } from \"./is-result-err-call\";\n\nexport function getOwnResultErrCalls(node, isRoot = true) {\n if (!isAstNode(node)) {\n return [];\n }\n\n if (isFunctionNode(node) || (!isRoot && node.type === \"IfStatement\")) {\n return [];\n }\n\n const ownCalls =\n node.type === \"CallExpression\" && isResultErrCall(node) ? [node] : [];\n\n return [\n ...ownCalls,\n ...getNodeChildren(node).flatMap((child) => getOwnResultErrCalls(child, false)),\n ];\n}\n","// @ts-nocheck\nexport function getFunctionReturnType(node, typeContext) {\n if (node.returnType?.typeAnnotation) {\n return typeContext.services.getTypeFromTypeNode(node.returnType.typeAnnotation);\n }\n\n const functionType = typeContext.services.getTypeAtLocation(node);\n const signature = functionType.getCallSignatures()[0];\n\n return signature?.getReturnType() ?? null;\n}\n","// @ts-nocheck\nimport { getFunctionReturnType } from \"./get-function-return-type\";\nimport { isSkapxdResultOrPromiseResultType } from \"./is-skapxd-result-or-promise-result-type\";\n\nexport function functionReturnsSkapxdResultType(node, typeContext) {\n const returnType = getFunctionReturnType(node, typeContext);\n\n return Boolean(returnType && isSkapxdResultOrPromiseResultType(returnType, typeContext));\n}\n","// @ts-nocheck\nimport { functionReturnsSkapxdResultType } from \"./function-returns-skapxd-result-type\";\nimport { getContainingFunction } from \"./get-containing-function\";\n\nexport function isInsideSkapxdResultReturningFunction(node, typeContext) {\n const containingFunction = getContainingFunction(node);\n\n return Boolean(\n containingFunction &&\n functionReturnsSkapxdResultType(containingFunction, typeContext),\n );\n}\n","// @ts-nocheck\nimport { isResultErrCall } from \"./is-result-err-call\";\nimport { isSymbolFromSkapxdResult } from \"./is-symbol-from-skapxd-result\";\n\nexport function isSkapxdResultErrCall(node, typeContext) {\n if (!isResultErrCall(node)) {\n return false;\n }\n\n const symbol = typeContext.services.getSymbolAtLocation(node.callee.object);\n\n return Boolean(symbol && isSymbolFromSkapxdResult(symbol, typeContext));\n}\n","// @ts-nocheck\nimport { isSkapxdResultType } from \"./is-skapxd-result-type\";\n\nexport function isSkapxdResultExpression(node, typeContext) {\n return isSkapxdResultType(typeContext.services.getTypeAtLocation(node), typeContext);\n}\n","// @ts-nocheck\nimport { isMemberPropertyNamed } from \"./is-member-property-named\";\nimport { unwrapExpression } from \"./unwrap-expression\";\n\nexport function isResultErrorMember(node, resultName) {\n const unwrappedNode = unwrapExpression(node);\n\n return (\n unwrappedNode.type === \"MemberExpression\" &&\n unwrappedNode.object.type === \"Identifier\" &&\n unwrappedNode.object.name === resultName &&\n isMemberPropertyNamed(unwrappedNode, \"error\")\n );\n}\n","// @ts-nocheck\nimport { isPropertyKeyNamed } from \"./is-property-key-named\";\nimport { isResultErrorMember } from \"./is-result-error-member\";\nimport { unwrapExpression } from \"./unwrap-expression\";\n\nexport function resultErrPreservesCause(node, resultName) {\n const unwrappedNode = unwrapExpression(node);\n\n if (isResultErrorMember(unwrappedNode, resultName)) {\n return true;\n }\n\n if (unwrappedNode.type !== \"ObjectExpression\") {\n return false;\n }\n\n return unwrappedNode.properties.some((property) => {\n if (property.type !== \"Property\" || !isPropertyKeyNamed(property, \"cause\")) {\n return false;\n }\n\n return isResultErrorMember(property.value, resultName);\n });\n}\n","// @ts-nocheck\nimport { getFailedResultGuard } from \"#/utils/get-failed-result-guard\";\nimport { getOwnResultErrCalls } from \"#/utils/get-own-result-err-calls\";\nimport { getTypeContext } from \"#/utils/get-type-context\";\nimport { isInsideSkapxdResultReturningFunction } from \"#/utils/is-inside-skapxd-result-returning-function\";\nimport { isSkapxdResultErrCall } from \"#/utils/is-skapxd-result-err-call\";\nimport { isSkapxdResultExpression } from \"#/utils/is-skapxd-result-expression\";\nimport { resultErrPreservesCause } from \"#/utils/result-err-preserves-cause\";\n\nexport const resultErrorRequiresCause = {\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Exige preservar result.error como cause cuando una funcion que retorna Result transforma un Result fallido en Result.err.\",\n },\n messages: {\n missingCause:\n \"El error de `{{name}}` ya existe como `{{name}}.error`. Preservalo en Result.err con `cause: {{name}}.error`: la cadena de causas conecta el error de dominio con la excepcion original que capturo `trySafe`; sin ella el debugging pierde el contexto.\",\n },\n schema: [],\n },\n create(context) {\n const typeContext = getTypeContext(context);\n\n return {\n IfStatement(node) {\n const resultGuard = getFailedResultGuard(node.test);\n\n if (\n !typeContext ||\n !resultGuard ||\n !isSkapxdResultExpression(resultGuard.node, typeContext) ||\n !isInsideSkapxdResultReturningFunction(node, typeContext)\n ) {\n return;\n }\n\n for (const resultErrCall of getOwnResultErrCalls(node.consequent)) {\n if (!isSkapxdResultErrCall(resultErrCall, typeContext)) {\n continue;\n }\n\n // `Result.err()` sin argumentos descarta el error por completo:\n // es el peor caso, no una exención.\n if (\n resultErrCall.arguments.length > 0 &&\n resultErrPreservesCause(resultErrCall.arguments[0], resultGuard.name)\n ) {\n continue;\n }\n\n context.report({\n data: {\n name: resultGuard.name,\n },\n messageId: \"missingCause\",\n node: resultErrCall,\n });\n }\n },\n };\n },\n };\n","// @ts-nocheck\nimport { getNodeChildren } from \"./get-node-children\";\n\nexport function collectIdentifiersNamed(node, name, results = []) {\n if (node?.type === \"Identifier\" && node.name === name) {\n results.push(node);\n }\n\n for (const child of getNodeChildren(node)) {\n collectIdentifiersNamed(child, name, results);\n }\n\n return results;\n}\n","// @ts-nocheck\nexport function getResultErrorRequiresHandlingOptions(options = {}) {\n return {\n allowFilePatterns: options.allowFilePatterns ?? [],\n };\n}\n","// @ts-nocheck\nimport { isPropertyKeyNamed } from \"./is-property-key-named\";\n\n// Bindings que declara el lado izquierdo de un `const x = ...` y QUÉ\n// representa cada uno. Si lo asignado es el error, un destructuring lo\n// proyecta (pierde el cause) y no produce targets. Si es el result:\n// `{ error }` sigue como error, `...rest` sigue como result (aún lo carga),\n// y los demás bindings (`ok`, `value`) son proyecciones que no se siguen.\nexport function getDeclaredAliasTargets(id, represents) {\n if (id.type === \"Identifier\") {\n return [{ name: id.name, represents }];\n }\n\n if (id.type !== \"ObjectPattern\" || represents !== \"result\") {\n return [];\n }\n\n return id.properties.flatMap((property) => {\n if (property.type === \"RestElement\" && property.argument.type === \"Identifier\") {\n return [{ name: property.argument.name, represents: \"result\" }];\n }\n\n if (\n property.type === \"Property\" &&\n isPropertyKeyNamed(property, \"error\") &&\n property.value.type === \"Identifier\"\n ) {\n return [{ name: property.value.name, represents: \"error\" }];\n }\n\n return [];\n });\n}\n","// @ts-nocheck\nexport function isInsideNode(node, ancestor) {\n let current = node;\n\n while (current) {\n if (current === ancestor) {\n return true;\n }\n\n current = current.parent;\n }\n\n return false;\n}\n","// @ts-nocheck\nimport { collectIdentifiersNamed } from \"./collect-identifiers-named\";\nimport { getDeclaredAliasTargets } from \"./get-declared-alias-targets\";\nimport { isInsideNode } from \"./is-inside-node\";\nimport { isMemberPropertyNamed } from \"./is-member-property-named\";\n\n// ¿La referencia consume el error de verdad? El contrato:\n// - El ERROR debe fluir COMPLETO: `result.error` (o su alias) como argumento,\n// retorno o propiedad. Una proyección (`result.error.message`, `e.type`)\n// pierde el `cause` y NO cuenta — la UI puede leer el mensaje, pero el\n// objeto entero tiene que salir hacia alguna parte.\n// - El result completo (`return result`, `fn(result)`) también vale: el\n// error viaja adentro.\n// - Descartes no cuentan: `void x`, expresión suelta, alias nunca consumido\n// (se siguen recursivamente, destructuring incluido).\nexport function isConsumedResultReference(\n identifier,\n searchRoot,\n represents = \"result\",\n visited = new Set(),\n) {\n const member =\n identifier.parent?.type === \"MemberExpression\" &&\n identifier.parent.object === identifier\n ? identifier.parent\n : null;\n\n // Cualquier acceso sobre el error es proyección; sobre el result, solo\n // `.error` mantiene la información completa (`.ok`/`.value` la pierden).\n if (member && represents === \"error\") {\n return false;\n }\n\n if (member && !isMemberPropertyNamed(member, \"error\")) {\n return false;\n }\n\n const reference = member ?? identifier;\n const referenceRepresents = member ? \"error\" : represents;\n const parent = reference.parent;\n\n // `result.error.message`: proyección encadenada sobre el error.\n if (parent?.type === \"MemberExpression\" && parent.object === reference) {\n return false;\n }\n\n if (parent?.type === \"UnaryExpression\" && parent.operator === \"void\") {\n return false;\n }\n\n if (parent?.type === \"ExpressionStatement\") {\n return false;\n }\n\n if (parent?.type !== \"VariableDeclarator\" || parent.init !== reference) {\n return true;\n }\n\n const targets = getDeclaredAliasTargets(parent.id, referenceRepresents).filter(\n (target) => !visited.has(target.name),\n );\n\n return targets.some((target) => {\n visited.add(target.name);\n\n return collectIdentifiersNamed(searchRoot, target.name)\n .filter((aliasReference) => !isInsideNode(aliasReference, parent.id))\n .some((aliasReference) =>\n isConsumedResultReference(\n aliasReference,\n searchRoot,\n target.represents,\n visited,\n ),\n );\n });\n}\n","// @ts-nocheck\nimport { collectIdentifiersNamed } from \"#/utils/collect-identifiers-named\";\nimport { getFailedResultGuard } from \"#/utils/get-failed-result-guard\";\nimport { getResultErrorRequiresHandlingOptions } from \"#/utils/get-result-error-requires-handling-options\";\nimport { getTypeContext } from \"#/utils/get-type-context\";\nimport { isConsumedResultReference } from \"#/utils/is-consumed-result-reference\";\nimport { isSkapxdResultExpression } from \"#/utils/is-skapxd-result-expression\";\nimport { matchesAnyGlob } from \"#/utils/matches-any-glob\";\n\nexport const resultErrorRequiresHandling = {\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Prohibe descartar en silencio un Result fallido: el error se transforma o se entrega, nunca se ignora.\",\n },\n messages: {\n unhandledResultError:\n \"El guard detecta que `{{name}}` fallo, pero `{{name}}.error` no fluye COMPLETO a ninguna parte. Transformalo (`Result.err({ cause: {{name}}.error, ... })`), entrega el objeto entero a alguien (`reportDomainError({{name}}.error)`) o propaga el result completo. Una proyeccion (`{{name}}.error.message`) no basta: el `cause` se pierde justo en la ultima milla. La UI puede leer el mensaje, pero ADEMAS el error entero debe salir hacia el trace.\",\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowFilePatterns: {\n items: { type: \"string\" },\n type: \"array\",\n },\n },\n type: \"object\",\n },\n ],\n },\n create(context) {\n const options = getResultErrorRequiresHandlingOptions(context.options[0]);\n const filename = context.filename ?? context.getFilename();\n const typeContext = getTypeContext(context);\n\n if (matchesAnyGlob(filename, options.allowFilePatterns)) {\n return {};\n }\n\n return {\n IfStatement(node) {\n const resultGuard = getFailedResultGuard(node.test);\n\n if (\n !typeContext ||\n !resultGuard ||\n !isSkapxdResultExpression(resultGuard.node, typeContext)\n ) {\n return;\n }\n\n const references = collectIdentifiersNamed(\n node.consequent,\n resultGuard.name,\n );\n\n if (\n references.some((reference) =>\n isConsumedResultReference(reference, node.consequent),\n )\n ) {\n return;\n }\n\n context.report({\n data: { name: resultGuard.name },\n messageId: \"unhandledResultError\",\n node: node.test,\n });\n },\n };\n },\n};\n","// @ts-nocheck\nimport { getNodeChildren } from \"./get-node-children\";\nimport { isAstNode } from \"./is-ast-node\";\nimport { isCalleeNamed } from \"./is-callee-named\";\nimport { isFunctionNode } from \"./is-function-node\";\n\nexport function countOwnUseStateCallsInNode(node) {\n if (!isAstNode(node)) {\n return 0;\n }\n\n if (isFunctionNode(node)) {\n return 0;\n }\n\n const ownCount =\n node.type === \"CallExpression\" && isCalleeNamed(node.callee, [\"useState\"])\n ? 1\n : 0;\n\n return ownCount + getNodeChildren(node).reduce(\n (total, child) => total + countOwnUseStateCallsInNode(child),\n 0,\n );\n}\n","// @ts-nocheck\nimport { countOwnUseStateCallsInNode } from \"./count-own-use-state-calls-in-node\";\nimport { isAstNode } from \"./is-ast-node\";\n\nexport function countOwnUseStateCalls(node) {\n const body = node.body;\n\n return isAstNode(body) ? countOwnUseStateCallsInNode(body) : 0;\n}\n","// @ts-nocheck\nexport function getFunctionLineCount(node) {\n return node.loc ? node.loc.end.line - node.loc.start.line + 1 : 0;\n}\n","// @ts-nocheck\nexport function getMaxHookSizeOptions(options = {}) {\n return {\n maxLines: options.maxLines ?? 120,\n maxUseState: options.maxUseState ?? 1,\n };\n}\n","// @ts-nocheck\nexport function isHookName(name) {\n return /^use[A-Z0-9]/.test(name ?? \"\");\n}\n","// @ts-nocheck\nimport { countOwnUseStateCalls } from \"#/utils/count-own-use-state-calls\";\nimport { getFunctionExpressionName } from \"#/utils/get-function-expression-name\";\nimport { getFunctionLineCount } from \"#/utils/get-function-line-count\";\nimport { getMaxHookSizeOptions } from \"#/utils/get-max-hook-size-options\";\nimport { getParentFunctionName } from \"#/utils/get-parent-function-name\";\nimport { getParentFunctionReportNode } from \"#/utils/get-parent-function-report-node\";\nimport { isHookName } from \"#/utils/is-hook-name\";\n\nexport const maxHookSize = {\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Limita el tamaño y cantidad de estados propios en hooks React.\",\n },\n messages: {\n tooLargeHook:\n \"El hook `{{name}}` es demasiado grande: tiene {{lines}} lineas. Maximo permitido: {{maxLines}} lineas. Extrae efectos, handlers o flujos a hooks/archivos semanticos.\",\n tooManyUseState:\n \"El hook `{{name}}` declara {{useStateCount}} useState. Maximo permitido: {{maxUseState}}. Usa useReducer con acciones semanticas cuando varios campos cambian juntos, o extrae estado a hooks especializados.\",\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n maxLines: { type: \"number\" },\n maxUseState: { type: \"number\" },\n },\n type: \"object\",\n },\n ],\n },\n create(context) {\n const options = getMaxHookSizeOptions(context.options[0]);\n\n function reportIfOversizedHook(node, name, reportNode = node) {\n if (!isHookName(name)) {\n return;\n }\n\n const lines = getFunctionLineCount(node);\n const useStateCount = countOwnUseStateCalls(node);\n\n if (lines > options.maxLines) {\n context.report({\n data: {\n lines: String(lines),\n maxLines: String(options.maxLines),\n name,\n },\n messageId: \"tooLargeHook\",\n node: reportNode,\n });\n }\n\n if (useStateCount > options.maxUseState) {\n context.report({\n data: {\n maxUseState: String(options.maxUseState),\n name,\n useStateCount: String(useStateCount),\n },\n messageId: \"tooManyUseState\",\n node: reportNode,\n });\n }\n }\n\n return {\n ArrowFunctionExpression(node) {\n reportIfOversizedHook(\n node,\n getParentFunctionName(node),\n getParentFunctionReportNode(node),\n );\n },\n FunctionDeclaration(node) {\n reportIfOversizedHook(node, node.id?.name, node.id ?? node);\n },\n FunctionExpression(node) {\n reportIfOversizedHook(\n node,\n getFunctionExpressionName(node),\n getParentFunctionReportNode(node),\n );\n },\n };\n },\n };\n","export function countParentSegments(source: string): number {\n let count = 0;\n\n for (const part of source.split(\"/\")) {\n if (part === \"..\") {\n count += 1;\n continue;\n }\n\n if (part === \".\") {\n continue;\n }\n\n break;\n }\n\n return count;\n}\n","// @ts-nocheck\nimport { countParentSegments } from \"#/utils/count-parent-segments\";\n\nexport const noDeepRelativeImports = {\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Limita la profundidad de los imports relativos (`../`). Empuja hacia estructuras planas o alias de ruta.\",\n },\n messages: {\n deepRelativeImport:\n \"El import `{{source}}` sube {{depth}} niveles con `../`. Maximo permitido: {{maxDepth}}. Usa un alias de ruta (ej. `@/...`) o acerca el modulo a quien lo usa.\",\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n maxDepth: { type: \"number\" },\n },\n type: \"object\",\n },\n ],\n },\n create(context) {\n const maxDepth = context.options[0]?.maxDepth ?? 0;\n\n function reportIfTooDeep(source) {\n if (!source || typeof source.value !== \"string\") {\n return;\n }\n\n const depth = countParentSegments(source.value);\n\n if (depth <= maxDepth) {\n return;\n }\n\n context.report({\n data: {\n depth: String(depth),\n maxDepth: String(maxDepth),\n source: source.value,\n },\n messageId: \"deepRelativeImport\",\n node: source,\n });\n }\n\n return {\n ExportAllDeclaration(node) {\n reportIfTooDeep(node.source);\n },\n ExportNamedDeclaration(node) {\n reportIfTooDeep(node.source);\n },\n ImportDeclaration(node) {\n reportIfTooDeep(node.source);\n },\n ImportExpression(node) {\n reportIfTooDeep(node.source);\n },\n };\n },\n};\n","// @ts-nocheck\n// Archivos donde el ecosistema EXIGE `export default` y la regla\n// no-default-export no debe reportar nunca: configs de tooling\n// (next.config, tailwind.config, vitest.config, eslint.config, ...) y\n// stories de Storybook (el meta es un default export por contrato CSF).\n// Son GLOBS, no regex: `*` = un segmento, `**` = cualquier profundidad.\nexport const defaultExportAllowedFilePatterns = [\n \"*.config.*\",\n \"*.stories.*\",\n];\n","// @ts-nocheck\nimport { defaultExportAllowedFilePatterns } from \"#/constants/default-export-allowed-file-patterns\";\n\n// allowFilePatterns es ADITIVO: los patrones del consumidor se suman a los\n// integrados. Así, cuando aparezca un framework o tool que la regla aún no\n// contempla, basta con agregar su patrón sin perder los conocidos.\nexport function getNoDefaultExportOptions(options = {}) {\n return {\n allowFilePatterns: [\n ...defaultExportAllowedFilePatterns,\n ...(options.allowFilePatterns ?? []),\n ],\n };\n}\n","// @ts-nocheck\nimport { getNoDefaultExportOptions } from \"#/utils/get-no-default-export-options\";\nimport { matchesAnyGlob } from \"#/utils/matches-any-glob\";\n\nexport const noDefaultExport = {\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Prohibe export default; un export nombrado hace del nombre el contrato del modulo.\",\n },\n messages: {\n noDefaultExport:\n \"No uses `export default`: un export nombrado hace el simbolo renombrable con el IDE, grepeable y estable en autoimports. Si este archivo es un entrypoint donde un framework o tool exige el default, agrega su glob en `allowFilePatterns` de skapxd/no-default-export (p. ej. \\\"+page.ts\\\").\",\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowFilePatterns: {\n items: { type: \"string\" },\n type: \"array\",\n },\n },\n type: \"object\",\n },\n ],\n },\n create(context) {\n const options = getNoDefaultExportOptions(context.options[0]);\n const filename = context.filename ?? context.getFilename();\n\n if (matchesAnyGlob(filename, options.allowFilePatterns)) {\n return {};\n }\n\n return {\n ExportDefaultDeclaration(node) {\n context.report({ messageId: \"noDefaultExport\", node });\n },\n // Cubre la forma indirecta: `export { algo as default }`.\n ExportNamedDeclaration(node) {\n for (const specifier of node.specifiers ?? []) {\n const exportedName =\n specifier.exported?.name ?? specifier.exported?.value;\n\n if (exportedName === \"default\") {\n context.report({ messageId: \"noDefaultExport\", node: specifier });\n }\n }\n },\n };\n },\n};\n","// @ts-nocheck\n// Detección por propiedad Unicode: Extended_Pictographic cubre los emojis y\n// pictogramas (🚀, ✅, 😄) sin tocar símbolos de texto normales (→, ✓, ©).\nconst emojiPattern = /\\p{Extended_Pictographic}/u;\n\nexport function containsEmoji(value) {\n return emojiPattern.test(value);\n}\n","// @ts-nocheck\nexport function getNoEmojiOptions(options = {}) {\n return {\n allowFilePatterns: options.allowFilePatterns ?? [],\n };\n}\n","// @ts-nocheck\nimport { containsEmoji } from \"#/utils/contains-emoji\";\nimport { getNoEmojiOptions } from \"#/utils/get-no-emoji-options\";\nimport { matchesAnyGlob } from \"#/utils/matches-any-glob\";\n\nexport const noEmoji = {\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Prohibe emojis en strings y JSX; cada sistema los renderiza distinto (o no los renderiza).\",\n },\n messages: {\n noEmoji:\n \"No uses emojis en el codigo: se renderizan con la fuente del sistema del usuario, distinta en cada plataforma (y ausente en algunos Linux, donde sale un cuadro vacio). Reemplazalo por un icono SVG con el mismo significado (p. ej. lucide-react) o un asset SVG propio.\",\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowFilePatterns: {\n items: { type: \"string\" },\n type: \"array\",\n },\n },\n type: \"object\",\n },\n ],\n },\n create(context) {\n const options = getNoEmojiOptions(context.options[0]);\n const filename = context.filename ?? context.getFilename();\n\n if (matchesAnyGlob(filename, options.allowFilePatterns)) {\n return {};\n }\n\n function reportIfEmoji(node, value) {\n if (typeof value === \"string\" && containsEmoji(value)) {\n context.report({ messageId: \"noEmoji\", node });\n }\n }\n\n return {\n JSXText(node) {\n reportIfEmoji(node, node.value);\n },\n Literal(node) {\n reportIfEmoji(node, node.value);\n },\n TemplateElement(node) {\n reportIfEmoji(node, node.value.raw);\n },\n };\n },\n};\n","// @ts-nocheck\nexport function getNoTunnelPropsOptions(options = {}) {\n return {\n allowFilePatterns: options.allowFilePatterns ?? [],\n // Regex de nombres de prop que sí pueden reenviarse (p. ej.\n // [\"^className$\", \"^style$\"] en wrappers de un design system).\n allowPropPatterns: options.allowPropPatterns ?? [],\n };\n}\n","// @ts-nocheck\n// Extrae los nombres de props destructuradas del primer parámetro de un\n// componente: `({ game, variant, ...rest })` → { propNames, restName }.\n// Solo cuenta los shorthand (`{ game }`); un rename (`{ game: g }`) se omite.\nexport function getObjectPatternPropNames(pattern) {\n const result = { propNames: [], restName: null };\n\n if (pattern?.type !== \"ObjectPattern\") {\n return result;\n }\n\n for (const property of pattern.properties) {\n if (property.type === \"RestElement\" && property.argument.type === \"Identifier\") {\n result.restName = property.argument.name;\n continue;\n }\n\n if (\n property.type === \"Property\" &&\n property.key.type === \"Identifier\" &&\n property.value.type === \"Identifier\" &&\n property.key.name === property.value.name\n ) {\n result.propNames.push(property.key.name);\n }\n }\n\n return result;\n}\n","// @ts-nocheck\nimport { isPascalCaseName } from \"./is-pascal-case-name\";\n\n// `<Child ... />` es un componente propio; `<button ... />` es la frontera\n// con el DOM. Solo el primero cuenta para las reglas de prop drilling.\nexport function isPascalCaseJsxElement(openingElement) {\n return (\n openingElement?.type === \"JSXOpeningElement\" &&\n openingElement.name?.type === \"JSXIdentifier\" &&\n isPascalCaseName(openingElement.name.name)\n );\n}\n","// @ts-nocheck\nimport { isPascalCaseJsxElement } from \"./is-pascal-case-jsx-element\";\n\n// La referencia es el valor directo de una prop hacia un componente\n// PascalCase (`game={game}`, `handler={onSelect}`): un reenvío, sin importar\n// el nombre del atributo. Reenviar a un elemento nativo (`value={value}` en\n// un <input>) es uso real, no reenvío.\nexport function isForwardedPropReference(identifier) {\n const container = identifier.parent;\n\n if (container?.type !== \"JSXExpressionContainer\") {\n return false;\n }\n\n const attribute = container.parent;\n\n if (attribute?.type !== \"JSXAttribute\") {\n return false;\n }\n\n return isPascalCaseJsxElement(attribute.parent);\n}\n","// @ts-nocheck\nimport { collectIdentifiersNamed } from \"#/utils/collect-identifiers-named\";\nimport { getFunctionName } from \"#/utils/get-function-name\";\nimport { getNoTunnelPropsOptions } from \"#/utils/get-no-tunnel-props-options\";\nimport { getObjectPatternPropNames } from \"#/utils/get-object-pattern-prop-names\";\nimport { isForwardedPropReference } from \"#/utils/is-forwarded-prop-reference\";\nimport { isPascalCaseJsxElement } from \"#/utils/is-pascal-case-jsx-element\";\nimport { isPascalCaseName } from \"#/utils/is-pascal-case-name\";\nimport { matchesAnyGlob } from \"#/utils/matches-any-glob\";\nimport { matchesAnyPattern } from \"#/utils/matches-any-pattern\";\n\nexport const noTunnelProps = {\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Ninguna prop viaja mas de un nivel: quien la recibe no puede reenviarla a otro componente.\",\n },\n messages: {\n forwardedProp:\n \"La prop `{{prop}}` que `{{component}}` recibe se reenvia a otro componente: ya va por su segundo salto (abuelo -> padre -> hijo). Quien CREA un valor puede pasarlo UN nivel; quien lo recibe no lo reenvia. Mueve el estado/accion a un store global (p. ej. zustand) o a un custom hook y consumelo donde se usa, o deja que el padre componga el JSX (`children`).\",\n spreadTunnel:\n \"`{{component}}` reenvia TODAS sus props con `{...{{name}}}` a otro componente: es un tunel puro. Mueve el estado a un store global (p. ej. zustand) o a un custom hook, o deja que el padre componga el JSX (`children`).\",\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowFilePatterns: {\n items: { type: \"string\" },\n type: \"array\",\n },\n allowPropPatterns: {\n items: { type: \"string\" },\n type: \"array\",\n },\n },\n type: \"object\",\n },\n ],\n },\n create(context) {\n const options = getNoTunnelPropsOptions(context.options[0]);\n const filename = context.filename ?? context.getFilename();\n\n if (matchesAnyGlob(filename, options.allowFilePatterns)) {\n return {};\n }\n\n function reportSpreadTunnel(node, componentName, restName) {\n const spreads = collectIdentifiersNamed(node.body, restName).filter(\n (identifier) =>\n identifier.parent?.type === \"JSXSpreadAttribute\" &&\n isPascalCaseJsxElement(identifier.parent.parent),\n );\n\n if (spreads.length > 0) {\n context.report({\n data: { component: componentName, name: restName },\n messageId: \"spreadTunnel\",\n node: spreads[0].parent,\n });\n }\n }\n\n function reportForwardedProps(node, componentName, propNames) {\n for (const propName of propNames) {\n if (matchesAnyPattern(propName, options.allowPropPatterns)) {\n continue;\n }\n\n for (const usage of collectIdentifiersNamed(node.body, propName)) {\n if (isForwardedPropReference(usage)) {\n context.report({\n data: { component: componentName, prop: propName },\n messageId: \"forwardedProp\",\n node: usage.parent.parent,\n });\n }\n }\n }\n }\n\n function reportIfTunnelComponent(node) {\n const componentName = getFunctionName(node);\n\n if (!isPascalCaseName(componentName)) {\n return;\n }\n\n const { propNames, restName } = getObjectPatternPropNames(node.params[0]);\n\n if (restName) {\n reportSpreadTunnel(node, componentName, restName);\n }\n\n reportForwardedProps(node, componentName, propNames);\n }\n\n return {\n ArrowFunctionExpression: reportIfTunnelComponent,\n FunctionDeclaration: reportIfTunnelComponent,\n FunctionExpression: reportIfTunnelComponent,\n };\n },\n};\n","// @ts-nocheck\n// Los callbacks inline de JSX y de .map son React idiomático: permitidos por\n// defecto. El modo ultraestricto se activa pasando `false` explícito.\nexport function getNoFunctionsInsideComponentsOptions(options = {}) {\n return {\n allowArrayMapCallbacks: options.allowArrayMapCallbacks ?? true,\n allowJsxCallbacks: options.allowJsxCallbacks ?? true,\n };\n}\n","// @ts-nocheck\n// `items.map((item) => <Item ... />)`: la función es el primer argumento de\n// una llamada `.map(...)`.\nexport function isArrayMapCallback(node) {\n const parent = node.parent;\n\n if (parent?.type !== \"CallExpression\" || parent.arguments[0] !== node) {\n return false;\n }\n\n const callee = parent.callee;\n\n return (\n callee?.type === \"MemberExpression\" &&\n !callee.computed &&\n callee.property?.type === \"Identifier\" &&\n callee.property.name === \"map\"\n );\n}\n","// @ts-nocheck\n// Una flecha \"de expresión\": sin cuerpo de bloque. Solo puede contener una\n// expresión (JSX, una llamada), así que es declarativa por construcción. Un\n// cuerpo con llaves (`=> { return ... }`) ya da pie a ifs, variables y lógica\n// — eso debe vivir fuera del componente. Las function expressions siempre\n// tienen bloque, así que nunca califican.\nexport function isExpressionArrowFunction(node) {\n return (\n node.type === \"ArrowFunctionExpression\" &&\n node.body.type !== \"BlockStatement\"\n );\n}\n","// @ts-nocheck\n// `<button onClick={() => ...} />`: la función es el valor directo de una\n// prop JSX (ArrowFunction → JSXExpressionContainer → JSXAttribute).\nexport function isJsxAttributeCallback(node) {\n return (\n node.parent?.type === \"JSXExpressionContainer\" &&\n node.parent.parent?.type === \"JSXAttribute\"\n );\n}\n","// @ts-nocheck\nimport { getContainingFunction } from \"#/utils/get-containing-function\";\nimport { getFunctionName } from \"#/utils/get-function-name\";\nimport { getNoFunctionsInsideComponentsOptions } from \"#/utils/get-no-functions-inside-components-options\";\nimport { isArrayMapCallback } from \"#/utils/is-array-map-callback\";\nimport { isExpressionArrowFunction } from \"#/utils/is-expression-arrow-function\";\nimport { isFunctionNode } from \"#/utils/is-function-node\";\nimport { isJsxAttributeCallback } from \"#/utils/is-jsx-attribute-callback\";\nimport { isPascalCaseName } from \"#/utils/is-pascal-case-name\";\n\nexport const noFunctionsInsideComponents = {\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Prohibe definir funciones dentro de componentes React; se recrean en cada render.\",\n },\n messages: {\n functionInsideComponent:\n \"No definas funciones dentro del componente `{{component}}`: se recrean en cada render. Muevela a un hook (`useX`) o a un helper fuera del componente. Los callbacks inline de JSX y .map solo se permiten como flecha de expresion (sin cuerpo `{ }`): un bloque ya da pie a ifs y logica que pertenece fuera.\",\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowArrayMapCallbacks: { type: \"boolean\" },\n allowJsxCallbacks: { type: \"boolean\" },\n },\n type: \"object\",\n },\n ],\n },\n create(context) {\n const options = getNoFunctionsInsideComponentsOptions(context.options[0]);\n\n function isComponentFunction(node) {\n return isFunctionNode(node) && isPascalCaseName(getFunctionName(node));\n }\n\n function isAllowedInlineCallback(node) {\n if (!isExpressionArrowFunction(node)) {\n return false;\n }\n\n if (options.allowJsxCallbacks && isJsxAttributeCallback(node)) {\n return true;\n }\n\n return options.allowArrayMapCallbacks && isArrayMapCallback(node);\n }\n\n function reportIfInsideComponent(node) {\n const enclosingFunction = getContainingFunction(node);\n\n if (!enclosingFunction || !isComponentFunction(enclosingFunction)) {\n return;\n }\n\n if (isAllowedInlineCallback(node)) {\n return;\n }\n\n context.report({\n data: {\n component: getFunctionName(enclosingFunction),\n },\n messageId: \"functionInsideComponent\",\n node,\n });\n }\n\n return {\n ArrowFunctionExpression: reportIfInsideComponent,\n FunctionDeclaration: reportIfInsideComponent,\n FunctionExpression: reportIfInsideComponent,\n };\n },\n};\n","// @ts-nocheck\nexport const noTryCatch = {\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Prohibe try/catch; usa trySafe de @skapxd/result para modelar el error como Result.\",\n },\n messages: {\n noTryCatch:\n \"Usa `trySafe` de @skapxd/result en lugar de try/catch: el error queda modelado como Result en vez de saltar como excepcion. Luego mapealo a un error de dominio `{ type, message, cause }` y consumelo con `match()` de ts-pattern.\",\n },\n schema: [],\n },\n create(context) {\n return {\n TryStatement(node) {\n context.report({\n messageId: \"noTryCatch\",\n node,\n });\n },\n };\n },\n};\n","// @ts-nocheck\nexport function getPreferAbortSignalOptions(options = {}) {\n return {\n allowFilePatterns: options.allowFilePatterns ?? [],\n effectNames: options.effectNames ?? [\"useEffect\", \"useLayoutEffect\"],\n };\n}\n","// @ts-nocheck\n// Resuelve un Identifier hasta el inicializador de su declaración subiendo\n// por la cadena de scopes (`const opts = {...}` → el ObjectExpression).\n// Devuelve null si la variable no se declara aquí (parámetro, import).\nexport function getVariableInitializer(identifier, scope) {\n let current = scope;\n\n while (current) {\n const variable = current.variables.find(\n (candidate) => candidate.name === identifier.name,\n );\n\n if (variable) {\n const definition = variable.defs[0];\n\n return definition?.node?.type === \"VariableDeclarator\"\n ? definition.node.init\n : null;\n }\n\n current = current.upper;\n }\n\n return null;\n}\n","// @ts-nocheck\nimport { isPropertyKeyNamed } from \"./is-property-key-named\";\n\n// ¿El objeto literal de options trae `signal`? Un spread dentro del objeto\n// recibe el beneficio de la duda (puede aportar el signal).\nexport function objectExpressionHasSignal(objectExpression) {\n return objectExpression.properties.some(\n (property) =>\n property.type === \"SpreadElement\" ||\n isPropertyKeyNamed(property, \"signal\"),\n );\n}\n","// @ts-nocheck\nimport { getVariableInitializer } from \"./get-variable-initializer\";\nimport { objectExpressionHasSignal } from \"./object-expression-has-signal\";\n\n// addEventListener(type, listener, options): ¿las options traen `signal`?\n// Resolución en capas: objeto literal → inspección directa; identifier →\n// se sigue hasta su inicializador en el scope; sin inicializador → el type\n// checker pregunta si el TIPO declara `signal` (si ni el tipo la tiene, es\n// imposible que llegue); sin tipos → beneficio de la duda.\nexport function hasAbortSignalOption(callExpression, sourceCode, typeContext) {\n const options = callExpression.arguments[2];\n\n if (!options) {\n return false;\n }\n\n // `addEventListener(\"x\", fn, true)`: el boolean de capture nunca trae signal.\n if (options.type === \"Literal\") {\n return false;\n }\n\n if (options.type === \"ObjectExpression\") {\n return objectExpressionHasSignal(options);\n }\n\n const initializer =\n options.type === \"Identifier\"\n ? getVariableInitializer(options, sourceCode.getScope(options))\n : null;\n\n if (initializer?.type === \"ObjectExpression\") {\n return objectExpressionHasSignal(initializer);\n }\n\n if (typeContext) {\n const type = typeContext.services.getTypeAtLocation(options);\n\n return Boolean(typeContext.checker.getPropertyOfType(type, \"signal\"));\n }\n\n return true;\n}\n","// @ts-nocheck\nimport { isCalleeNamed } from \"./is-callee-named\";\nimport { isFunctionNode } from \"./is-function-node\";\n\n// ¿El nodo vive dentro del callback de un useEffect/useLayoutEffect?\n// Cubre también las funciones anidadas (handlers y el cleanup retornado).\nexport function isInsideEffectCallback(node, effectNames) {\n let current = node.parent;\n\n while (current) {\n const call = isFunctionNode(current) ? current.parent : null;\n\n if (\n call?.type === \"CallExpression\" &&\n call.arguments[0] === current &&\n isCalleeNamed(call.callee, effectNames)\n ) {\n return true;\n }\n\n current = current.parent;\n }\n\n return false;\n}\n","// @ts-nocheck\nimport { getPreferAbortSignalOptions } from \"#/utils/get-prefer-abort-signal-options\";\nimport { getTypeContext } from \"#/utils/get-type-context\";\nimport { hasAbortSignalOption } from \"#/utils/has-abort-signal-option\";\nimport { isInsideEffectCallback } from \"#/utils/is-inside-effect-callback\";\nimport { isMemberPropertyNamed } from \"#/utils/is-member-property-named\";\nimport { matchesAnyGlob } from \"#/utils/matches-any-glob\";\n\nexport const preferAbortSignal = {\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"En efectos de React, los listeners se limpian con AbortController, no con removeEventListener.\",\n },\n messages: {\n addWithoutSignal:\n \"Este addEventListener vive en un efecto sin `signal`. Crea `const controller = new AbortController()`, pasa `{ signal: controller.signal }` como tercer argumento y limpia con `return () => controller.abort()`: un solo abort cubre todos los listeners del efecto.\",\n removeInsteadOfAbort:\n \"No quites listeners a mano en el cleanup: registra con `{ signal: controller.signal }` y reemplaza este removeEventListener por `return () => controller.abort()`. Evita el bug clasico de pasar una referencia distinta al remover.\",\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowFilePatterns: {\n items: { type: \"string\" },\n type: \"array\",\n },\n effectNames: {\n items: { type: \"string\" },\n type: \"array\",\n },\n },\n type: \"object\",\n },\n ],\n },\n create(context) {\n const options = getPreferAbortSignalOptions(context.options[0]);\n const filename = context.filename ?? context.getFilename();\n const sourceCode = context.sourceCode ?? context.getSourceCode();\n const typeContext = getTypeContext(context);\n\n if (matchesAnyGlob(filename, options.allowFilePatterns)) {\n return {};\n }\n\n return {\n CallExpression(node) {\n if (node.callee?.type !== \"MemberExpression\") {\n return;\n }\n\n const isAdd = isMemberPropertyNamed(node.callee, \"addEventListener\");\n const isRemove = isMemberPropertyNamed(node.callee, \"removeEventListener\");\n\n if (!isAdd && !isRemove) {\n return;\n }\n\n if (!isInsideEffectCallback(node, options.effectNames)) {\n return;\n }\n\n if (isRemove) {\n context.report({ messageId: \"removeInsteadOfAbort\", node });\n return;\n }\n\n if (!hasAbortSignalOption(node, sourceCode, typeContext)) {\n context.report({ messageId: \"addWithoutSignal\", node });\n }\n },\n };\n },\n};\n","// @ts-nocheck\nexport const preferTsPattern = {\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Prefiere match() de ts-pattern sobre switch/case y ternarios anidados.\",\n },\n messages: {\n noSwitch:\n \"Usa `match()` de ts-pattern en lugar de switch/case para un control de flujo exhaustivo y tipado. Es la pieza que cierra el sistema de errores: un Result con errores `{ type: ... }` se consume con una rama `.with()` por variante y `.exhaustive()` garantiza que ninguna quede sin manejar.\",\n noNestedTernary:\n \"Usa `match()` de ts-pattern en lugar de ternarios anidados; mejora la legibilidad y `.exhaustive()` obliga a cubrir todos los casos.\",\n },\n schema: [],\n },\n create(context) {\n return {\n ConditionalExpression(node) {\n if (node.parent?.type === \"ConditionalExpression\") {\n context.report({\n messageId: \"noNestedTernary\",\n node,\n });\n }\n },\n SwitchStatement(node) {\n context.report({\n messageId: \"noSwitch\",\n node,\n });\n },\n };\n },\n};\n","// @ts-nocheck\nexport const noJsxTernaryNull = {\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Prefiere `condicion && <Elemento />` sobre un ternario con `null` al renderizar JSX.\",\n },\n messages: {\n preferLogicalAnd:\n \"Usa `condicion && elemento` en lugar de un ternario con `null` para renderizar JSX condicional.\",\n },\n schema: [],\n },\n create(context) {\n function isNullLiteral(node) {\n return node?.type === \"Literal\" && node.value === null;\n }\n\n return {\n ConditionalExpression(node) {\n const container = node.parent;\n\n if (container?.type !== \"JSXExpressionContainer\") {\n return;\n }\n\n const host = container.parent;\n\n if (host?.type !== \"JSXElement\" && host?.type !== \"JSXFragment\") {\n return;\n }\n\n if (!isNullLiteral(node.alternate) && !isNullLiteral(node.consequent)) {\n return;\n }\n\n context.report({\n messageId: \"preferLogicalAnd\",\n node,\n });\n },\n };\n },\n};\n","// @ts-nocheck\nexport function getNoNestedIfOptions(options = {}) {\n return {\n allowFilePatterns: options.allowFilePatterns ?? [],\n };\n}\n","// @ts-nocheck\nimport { isFunctionNode } from \"./is-function-node\";\n\n// ¿Este if vive dentro de otro if de la MISMA función? El eslabón directo de\n// un `else if` no cuenta (es cadena, no anidación) — si la cadena entera está\n// dentro de otro if, el reporte cae sobre su cabeza, una sola vez. Una\n// función definida dentro de un if es una unidad cognitiva aparte.\nexport function isNestedIfStatement(node) {\n if (node.parent?.type === \"IfStatement\" && node.parent.alternate === node) {\n return false;\n }\n\n let current = node.parent;\n\n while (current && !isFunctionNode(current)) {\n if (current.type === \"IfStatement\") {\n return true;\n }\n\n current = current.parent;\n }\n\n return false;\n}\n","// @ts-nocheck\nimport { getNoNestedIfOptions } from \"#/utils/get-no-nested-if-options\";\nimport { isNestedIfStatement } from \"#/utils/is-nested-if-statement\";\nimport { matchesAnyGlob } from \"#/utils/matches-any-glob\";\n\nexport const noNestedIf = {\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Prohibe if anidados; usa retorno anticipado (guard clauses) o match() de ts-pattern.\",\n },\n messages: {\n noNestedIf:\n \"No anides un if dentro de otro: cada nivel suma carga cognitiva y crea puntos ciegos para las demas reglas. Aplana con retorno anticipado (`if (!x) return ...;` y sigue el camino feliz) o decide con `match()` de ts-pattern si son variantes de un mismo valor.\",\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowFilePatterns: {\n items: { type: \"string\" },\n type: \"array\",\n },\n },\n type: \"object\",\n },\n ],\n },\n create(context) {\n const options = getNoNestedIfOptions(context.options[0]);\n const filename = context.filename ?? context.getFilename();\n\n if (matchesAnyGlob(filename, options.allowFilePatterns)) {\n return {};\n }\n\n return {\n IfStatement(node) {\n if (isNestedIfStatement(node)) {\n context.report({ messageId: \"noNestedIf\", node });\n }\n },\n };\n },\n};\n","// @ts-nocheck\nexport function isPromiseType(type, typeContext) {\n return typeContext.checker.getPromisedTypeOfPromise(type) !== undefined;\n}\n","// @ts-nocheck\nimport { getTypeContext } from \"#/utils/get-type-context\";\nimport { isMemberPropertyNamed } from \"#/utils/is-member-property-named\";\nimport { isPromiseType } from \"#/utils/is-promise-type\";\n\nconst defaultMethods = [\"catch\", \"finally\", \"then\"];\n\nexport const noPromiseChain = {\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Prohibe encadenar .then/.catch/.finally en promesas; usa await (envuelto en trySafe).\",\n },\n messages: {\n noPromiseChain:\n \"No encadenes `.{{method}}()` en una promesa. La unica forma de tratar funciones asincronas es `await`: o la funcion llamada ya retorna Promise<Result<...>> o envuelve la llamada en `trySafe` de @skapxd/result.\",\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n methods: {\n items: { type: \"string\" },\n type: \"array\",\n },\n },\n type: \"object\",\n },\n ],\n },\n create(context) {\n const methods = context.options[0]?.methods ?? defaultMethods;\n const typeContext = getTypeContext(context);\n\n return {\n CallExpression(node) {\n const callee = node.callee;\n\n if (callee.type !== \"MemberExpression\") {\n return;\n }\n\n const method = methods.find((name) => isMemberPropertyNamed(callee, name));\n\n if (!method) {\n return;\n }\n\n // type-aware: solo si el receptor es una promesa. Sin info de tipos\n // (projectService apagado) cae a verificación por nombre.\n if (\n typeContext &&\n !isPromiseType(\n typeContext.services.getTypeAtLocation(callee.object),\n typeContext,\n )\n ) {\n return;\n }\n\n context.report({\n data: { method },\n messageId: \"noPromiseChain\",\n node: callee.property,\n });\n },\n };\n },\n};\n","import { oneRootFunctionPerFile } from \"#/rules/one-root-function-per-file\";\nimport { jsxReturnNamePascalCase } from \"#/rules/jsx-return-name-pascal-case\";\nimport { asyncFunctionsReturnResult } from \"#/rules/async-functions-return-result\";\nimport { noAdHocOkResult } from \"#/rules/no-ad-hoc-ok-result\";\nimport { awaitRequiresResult } from \"#/rules/await-requires-result\";\nimport { resultErrorRequiresCause } from \"#/rules/result-error-requires-cause\";\nimport { resultErrorRequiresHandling } from \"#/rules/result-error-requires-handling\";\nimport type { Rule } from \"eslint\";\nimport { maxHookSize } from \"#/rules/max-hook-size\";\nimport { noDeepRelativeImports } from \"#/rules/no-deep-relative-imports\";\nimport { noDefaultExport } from \"#/rules/no-default-export\";\nimport { noEmoji } from \"#/rules/no-emoji\";\nimport { noTunnelProps } from \"#/rules/no-tunnel-props\";\nimport { noFunctionsInsideComponents } from \"#/rules/no-functions-inside-components\";\nimport { noTryCatch } from \"#/rules/no-try-catch\";\nimport { preferAbortSignal } from \"#/rules/prefer-abort-signal\";\nimport { preferTsPattern } from \"#/rules/prefer-ts-pattern\";\nimport { noJsxTernaryNull } from \"#/rules/no-jsx-ternary-null\";\nimport { noNestedIf } from \"#/rules/no-nested-if\";\nimport { noPromiseChain } from \"#/rules/no-promise-chain\";\n\nexport const rules: Record<string, Rule.RuleModule> = {\n \"one-root-function-per-file\": oneRootFunctionPerFile,\n \"jsx-return-name-pascal-case\": jsxReturnNamePascalCase,\n \"async-functions-return-result\": asyncFunctionsReturnResult,\n \"no-ad-hoc-ok-result\": noAdHocOkResult,\n \"await-requires-result\": awaitRequiresResult,\n // Alias deprecado del nombre anterior; se elimina en una versión futura.\n \"await-requires-try-safe\": {\n ...awaitRequiresResult,\n meta: {\n ...awaitRequiresResult.meta,\n deprecated: true,\n replacedBy: [\"skapxd/await-requires-result\"],\n },\n },\n \"result-error-requires-cause\": resultErrorRequiresCause,\n \"result-error-requires-handling\": resultErrorRequiresHandling,\n \"max-hook-size\": maxHookSize,\n \"no-deep-relative-imports\": noDeepRelativeImports,\n \"no-default-export\": noDefaultExport,\n \"no-emoji\": noEmoji,\n \"no-tunnel-props\": noTunnelProps,\n \"no-functions-inside-components\": noFunctionsInsideComponents,\n \"no-try-catch\": noTryCatch,\n \"prefer-abort-signal\": preferAbortSignal,\n \"prefer-ts-pattern\": preferTsPattern,\n \"no-jsx-ternary-null\": noJsxTernaryNull,\n \"no-nested-if\": noNestedIf,\n \"no-promise-chain\": noPromiseChain,\n} as unknown as Record<string, Rule.RuleModule>;\n"],"mappings":"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","names":[]}
|