# Optional Oxlint plugin Source: https://smartassertions.dev/oxlint-plugin-rules/ Index of every page: https://smartassertions.dev/llms.txt The `@kensio/smartass` package also exports an optional [Oxlint](https://oxc.rs/docs/guide/usage/linter.html) plugin that discourages less specific assertion usage. For example: ```typescript assertIdentical(foo.length, 2); // suggested improvement: assertArrayLength(foo, 2); ``` The plugin reports the same suggestions as the [optional ESLint config](https://smartassertions.dev/eslint-config-rules/): both are generated from a single table of selectors, so the two linters report identically and you only need whichever one you already run. ## Setup The `@kensio/smartass/oxlint` export is an [Oxlint JS plugin](https://oxc.rs/docs/guide/usage/linter/js-plugins.html). Register it under `jsPlugins` in your `.oxlintrc.json` and turn the rule on: ```json { "jsPlugins": [{ "name": "smartass", "specifier": "@kensio/smartass/oxlint" }], "rules": { "smartass/prefer-specific-assertions": "warn" } } ``` The `name` you give the plugin is the prefix the rule is configured under, so a different name means a different rule name — `"name": "sa"` would make the rule `sa/prefer-specific-assertions`. ## The rule `smartass/prefer-specific-assertions` is the plugin's only rule. It takes no options, so `"warn"` or `"error"` is the whole of its configuration. It reports a suggestion wherever a broad assertion is doing a job one of the specific assertions describes better, and never rewrites your code: every report is a message, with no fixer. Only calls to smartass assertion functions are matched — every selector is anchored to an `assert*` call by name, so an `expect()` or a helper of your own with a similar shape is left alone. Some examples of the replacements the rule will suggest: - `assertIdentical(value, true)` → `assertTrue(value)` - `assertIdentical(value, false)` → `assertFalse(value)` - `assertIdentical(value, undefined)` → `assertUndefined(value)` - `assertTrue(value != null)` → `assertNonNullable(value)` - `assertIdentical(typeof value, "string")` → `assertTypeString(value)` - `assertIdentical(value instanceof MyClass, true)` → `assertInstanceOf(value, MyClass)` - `assertIdentical("key" in object, true)` → `assertObjectHasProperty(object, "key")` - `assertIdentical(value.length, expected)` → `assertArrayLength()` etc. - `assertIdentical(value.size, expected)` → `assertSetSize()` etc. - `assertTrue(array.length > 0)` → `assertArrayNotEmpty(array)` - `assertTrue(value.includes(expected))` → `assertStringIncludes()` etc. - `assertTrue(value.startsWith(prefix))` → `assertStringStartsWith(value, prefix)` - `assertTrue(value.endsWith(suffix))` → `assertStringEndsWith(value, suffix)` - `assertTrue(stats.isDirectory())` → `assertDirectoryExists()` etc. ## Requirements JS plugins are loaded from a `jsPlugins` entry, which needs an Oxlint version that supports them. The plugin is exercised against Oxlint's own `RuleTester`, from `oxlint/plugins-dev`, on Oxlint 1.77 and later. `@kensio/smartass/oxlint` does not depend on Oxlint itself: the plugin types are declared structurally, so adding the plugin adds no Oxlint version constraint to your install.