Brought to you by Allons-y Studio

Compose your ESLint config

opx lint runs each plugin as its own scoped ESLint pass, so it needs no root config. Your editor and a plain eslint . do want a single eslint.config.js. Every opx lint package exports its flat config as a plain array, so you compose them by spreading. opx init writes this file for you and never overwrites an existing one.

// eslint.config.js
import js from "@allons-y/opx-lint-js/eslint.config.js";
import json from "@allons-y/opx-lint-json/eslint.config.js";
import md from "@allons-y/opx-lint-md/eslint.config.js";

export default [...js, ...json, ...md];

Add third-party plugins & your own rules

Each block in opx's configs is scoped with files, so they don't collide. Flat config is evaluated top to bottom and the last matching block wins, so put opx first and your overrides last:

import js from "@allons-y/opx-lint-js/eslint.config.js";
import react from "eslint-plugin-react";

export default [
	...js,
	{
		files: ["**/*.{jsx,tsx}"],
		plugins: { react },
		rules: react.configs.recommended.rules,
	},
	{
		files: ["**/*.test.ts"],
		rules: { "@stylistic/quotes": "off" },
	},
];

Use as little as you like

Spread only @allons-y/opx-lint-js and bring your own JSON and Markdown configs, or drop opx's lint packages from eslint.config.js entirely and keep using opx release. The plugins, the exported configs, and your own rules are independent.