import { assert, describe } from "@effect/vitest"; import { createOxlintRuleHarness } from "../test/utils.ts"; const rule = createOxlintRuleHarness("t3code/no-inline-schema-compile"); describe("t3code/no-inline-schema-compile", () => { rule.valid( "allows schema compilers hoisted to module scope", ` import { Schema } from "effect"; const User = Schema.Struct({ name: Schema.String }); const decodeUser = Schema.decodeUnknownEffect(User); export const parseUser = (input: unknown) => decodeUser(input); `, ); rule.valid( "allows factory helpers that return a precompiled decoder", ` import { Schema } from "effect"; export const makeParser = (schema: Schema.Codec) => { const decode = Schema.decodeUnknownEffect(schema); return (input: unknown) => decode(input); }; `, ); rule.valid( "allows schema construction helpers that use encode transformations", ` import { Schema } from "effect"; export const makePrettyJson = (schema: S) => Schema.fromJsonString(schema).pipe( Schema.encode({ decode: Schema.String, encode: Schema.String, }), ); `, ); rule.valid( "allows dynamic schema parameters that cannot be hoisted to module scope", ` import { Schema } from "effect"; export const parseWith = (schema: Schema.Codec, input: unknown) => Schema.decodeUnknownEffect(schema)(input); `, ); rule.invalid( "reports schema compilers inside function bodies", ` import { Schema } from "effect"; const User = Schema.Struct({ name: Schema.String }); export const parseUser = (input: unknown) => Schema.decodeUnknownEffect(User)(input); `, (output) => { assert.match(output, /Hoist Schema\.decodeUnknownEffect/); }, ); rule.invalid( "reports inline schema literals as high confidence findings", ` import { Schema } from "effect"; export const parseUser = (input: unknown) => Schema.decodeUnknownEffect(Schema.Struct({ name: Schema.String }))(input); `, (output) => { assert.match(output, /inline schema literal and the compiled function/); }, ); });