Getting started
Overview
34 focused lint rules for TypeScript and Effect.
Choose your policy
@totto2727/oxlint supplies an Oxlint JavaScript plugin for generic TypeScript conventions and Effect-oriented application policies. Use the TypeScript preset for 8 custom generic rules, the Effect preset for 22 custom Effect rules, or the combined package preset for both. Both groups also share the native Ultracite 7.12.3 core baseline, with the explicit conflict adjustments described on the preset pages. Getting started walks through installation and configuration.
Rule reference
There are 34 documented custom rules: 30 preset rules and four opt-in compatibility policies. Native Ultracite core rules are additional baseline policy, not part of this count. force-ts-extension overlaps the split extension rules; no-js-extension-imports additionally handles mjs/cjs but conflicts with js mode and overlaps js/jsx checks. no-effect-import-as and no-effect-subpath-import impose the opposite import convention to the official Effect barrel rule. They remain available but are not enabled by presets.
TypeScript
- consistent-import-extension: Normalize code-module import extensions for your runtime.
- require-import-extension: Require explicit extensions without guessing module resolution.
- no-eslint-disable-comments: Use Oxlint suppression directives instead of ESLint directives.
- no-jsx-script-tag: Avoid native script elements in JSX.
- no-let: Prefer immutable const bindings and explicit shadowing.
- no-redundant-alias: Avoid aliases that only rename an existing value or type.
- no-string-style: Use JSX object styles instead of string styles.
- require-disable-reason: Make every Oxlint suppression explain its exception.
Effect
- no-unused-internal: Keep internal exports used and out of public API signatures.
- no-bigint-literals: Use BigInt construction instead of bigint literal syntax.
- no-import-from-barrel-package: Import specific modules rather than value exports from barrels.
- no-opaque-instance-fields: Keep Schema.Opaque classes free of instance members.
- force-array-empty: Use Effect Array predicates for empty and non-empty checks.
- force-iterable-empty: Use Iterable.isEmpty rather than size-based emptiness checks.
- force-predicate: Replace direct null, undefined and typeof comparisons with predicates.
- force-string-empty: Use String.isEmpty and String.isNonEmpty for empty strings.
- no-effect-runtime-run: Keep runtime execution at explicitly documented workflow boundaries.
- no-error-cause-option: Preserve raw errors using an explicit error field.
- no-error-property-access: Pass raw error values through without inspecting their properties.
- no-fetch: Use Effect HttpClient instead of calling global fetch.
- no-instanceof-error: Avoid normalizing caught values using instanceof Error.
- no-js-date: Use Effect DateTime and Duration instead of native Date operations.
- no-node-imports: Prefer Effect Platform services over direct Node built-ins.
- no-option-tag-comparison: Use Option.isSome and Option.isNone instead of comparing _tag.
- no-raw-hono-create-middleware: Keep Hono middleware creation behind an Effect-aware wrapper.
- no-sync-decode: Keep Schema decoding in Effect or Exit rather than Sync or Promise.
- no-type-predicate: Prefer schema-derived validation to hand-written type predicates.
- prefer-is-nullish: Treat null and undefined uniformly unless the distinction is intentional.
- prefer-non-unknown-decode: Use typed Schema decoders when the input type is already known.
- require-top-level-decoder: Construct and cache schema decoders at module scope.