diff --git a/README.md b/README.md
index bde015a9..b7b06255 100644
--- a/README.md
+++ b/README.md
@@ -82,14 +82,24 @@ export default [...common, ...modules, ...node, ...prettier];
Extending rules
-```js
-import { common, modules, node, stylistic, typescript } from "@hazmi35/eslint-config";
+Extending rules using the extend function is recommended.
-export default [...common, ...modules, ...node, ...stylistic, ...typescript, {
- rules: {
- "@typescript-eslint/no-unnecessary-condition": "off"
+```js
+import { common, extend, modules, node, stylistic, typescript } from "./index.js";
+
+export default [...common, ...modules, ...node, ...stylistic, ...extend(typescript, [
+ {
+ rule: "@typescript-eslint/no-unnecessary-condition",
+ option: [
+ "warn",
+ {
+ allowConstantLoopConditions: false
+ }
+ ]
+ // or
+ option: "off"
}
-}];
+])];
```
diff --git a/index.js b/index.js
index fcd90bd3..ed3c9b88 100644
--- a/index.js
+++ b/index.js
@@ -6,3 +6,20 @@ export { default as node } from "./conf/node.js";
export { default as prettier } from "./conf/prettier.js";
export { default as stylistic } from "./conf/stylistic.js";
export { default as typescript } from "./conf/typescript.js";
+
+/**
+ * @param {import("eslint").Linter.FlatConfig[]} config
+ * @param {{ rule: string, option: ["off" | "warn" | "error", object] }[]} rulesAndOptions
+ * @returns {import("eslint").Linter.FlatConfig[]}
+ * @example extend(config, [{ rule: "no-console", option: ["warn", { allow: ["warn", "error"] }] }])
+ */
+export function extend(config, rulesAndOptions) {
+ return config.map(c => {
+ if (c.rules) {
+ for (const { rule, option } of rulesAndOptions) {
+ c.rules[rule] = option;
+ }
+ }
+ return c;
+ });
+}