mod plugins;
pub use plugins::*;
use indexmap::IndexSet;
use merge_it::*;
#[cfg(feature = "schemars")]
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::{BTreeMap, BTreeSet};
type JsonValueBTreeMap = BTreeMap<String, Value>;
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Merge)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[serde(rename_all = "camelCase")]
#[serde(default)]
pub struct OxlintConfig {
#[serde(skip_serializing_if = "IndexSet::is_empty")]
pub extends: IndexSet<String>,
#[serde(default, skip_serializing_if = "BTreeSet::is_empty")]
pub plugins: BTreeSet<Plugin>,
#[serde(skip_serializing_if = "Option::is_none")]
pub settings: Option<PluginsSettings>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub globals: BTreeMap<String, GlobalValue>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub env: BTreeMap<String, bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub categories: Option<Categories>,
#[serde(default, skip_serializing_if = "BTreeSet::is_empty")]
pub ignore_patterns: BTreeSet<String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub rules: BTreeMap<String, RuleSetting>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub overrides: Vec<Override>,
#[serde(flatten, default, skip_serializing_if = "BTreeMap::is_empty")]
pub extras: JsonValueBTreeMap,
}
impl Default for OxlintConfig {
fn default() -> Self {
Self {
extends: Default::default(),
env: Default::default(),
globals: Default::default(),
categories: Default::default(),
ignore_patterns: Default::default(),
overrides: Default::default(),
plugins: BTreeSet::from_iter([
Plugin::Known(Plugins::Oxc),
Plugin::Known(Plugins::Typescript),
Plugin::Known(Plugins::Unicorn),
]),
rules: Default::default(),
settings: Default::default(),
extras: Default::default(),
}
}
}
#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[serde(rename_all = "lowercase")]
pub enum GlobalValue {
Readonly,
Writeable,
Off,
}
#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[serde(rename_all = "lowercase")]
pub enum RuleEnforcement {
#[serde(alias = "allow")]
Off,
Warn,
#[serde(alias = "deny")]
Error,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[serde(untagged)]
pub enum RuleSetting {
Simple(RuleEnforcement),
Custom([(RuleEnforcement, JsonValueBTreeMap); 1]),
}
#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, Default)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[serde(default)]
#[serde(deny_unknown_fields)]
pub struct Categories {
#[serde(skip_serializing_if = "Option::is_none")]
pub correctness: Option<RuleEnforcement>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nursery: Option<RuleEnforcement>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pedantic: Option<RuleEnforcement>,
#[serde(skip_serializing_if = "Option::is_none")]
pub perf: Option<RuleEnforcement>,
#[serde(skip_serializing_if = "Option::is_none")]
pub restriction: Option<RuleEnforcement>,
#[serde(skip_serializing_if = "Option::is_none")]
pub style: Option<RuleEnforcement>,
#[serde(skip_serializing_if = "Option::is_none")]
pub suspicious: Option<RuleEnforcement>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Default)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[serde(default)]
#[serde(deny_unknown_fields)]
pub struct Override {
pub files: BTreeSet<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub plugins: Option<BTreeSet<Plugin>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub globals: Option<BTreeMap<String, GlobalValue>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub env: Option<BTreeMap<String, bool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rules: Option<BTreeMap<String, RuleSetting>>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Merge, Default)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[serde(default)]
#[serde(deny_unknown_fields)]
#[serde(rename_all = "camelCase")]
pub struct PluginsSettings {
#[serde(skip_serializing_if = "Option::is_none")]
pub jsdoc: Option<JsDocPluginSettings>,
#[serde(rename = "jsx-a11y")]
#[serde(skip_serializing_if = "Option::is_none")]
pub jsx_ally: Option<JsxA11yPluginSettings>,
#[serde(skip_serializing_if = "Option::is_none")]
pub next: Option<NextPluginSettings>,
#[serde(skip_serializing_if = "Option::is_none")]
pub react: Option<ReactPluginSettings>,
}