import { getPropertyName, isTestLike, unwrapExpression } from "../utils.js"; const escapeHatches = new Set(["die", "dieMessage", "orDie", "orDieWith"]); const message = "Do not collapse Effect failures with die/orDie escape hatches. Keep typed errors in the Effect error channel; at true runtime edges use a narrow boundary suppression. Skill: wrdn-effect-typed-errors."; const isEffectEscapeHatch = (node) => { const expression = unwrapExpression(node); if (expression?.type !== "MemberExpression") return false; const property = getPropertyName(expression.property); return escapeHatches.has(property);}; export default { meta: { type: "problem", docs: { description: "Disallow Effect die/orDie escape hatches outside test code.", }, }, create(context) { if (isTestLike(context.filename)) return {}; return { MemberExpression(node) { if (isEffectEscapeHatch(node)) { context.report({ node, message }); } }, }; },};
import { getPropertyName, isTestLike, unwrapExpression } from "../utils.js";
const escapeHatches = new Set(["die", "dieMessage", "orDie", "orDieWith"]);
const message =
"Do not collapse Effect failures with die/orDie escape hatches. Keep typed errors in the Effect error channel; at true runtime edges use a narrow boundary suppression. Skill: wrdn-effect-typed-errors.";
const isEffectEscapeHatch = (node) => {
const expression = unwrapExpression(node);
if (expression?.type !== "MemberExpression") return false;
const property = getPropertyName(expression.property);
return escapeHatches.has(property);
};
export default {
meta: {
type: "problem",
docs: {
description: "Disallow Effect die/orDie escape hatches outside test code.",
},
},
create(context) {
if (isTestLike(context.filename)) return {};
return {
MemberExpression(node) {
if (isEffectEscapeHatch(node)) {
context.report({ node, message });
}
},
};
},
};