@fenge/eslint-config 0.1.3 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @fenge/eslint-config
2
2
 
3
+ ## 0.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 974ac53: feat(eslint-config): update function type signature. `pick` and `omit` properties disallow duplicated rule names
8
+
9
+ ## 0.2.0
10
+
11
+ ### Minor Changes
12
+
13
+ - a2d5f7c: chore: require eslint >= 8.57.1
14
+
15
+ ### Patch Changes
16
+
17
+ - 1c3fa77: chore: update deps
18
+
3
19
  ## 0.1.3
4
20
 
5
21
  ### Patch Changes
@@ -1,4 +1,5 @@
1
1
  export declare function gitignore(): readonly [{
2
+ readonly name: "fenge/gitignore";
2
3
  readonly ignores: string[];
3
4
  }];
4
5
  //# sourceMappingURL=gitignore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/config/gitignore.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS;;GAqBxB"}
1
+ {"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/config/gitignore.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS;;;GAoBxB"}
@@ -10,10 +10,9 @@ export function gitignore() {
10
10
  // https://eslint.org/docs/latest/use/configure/configuration-files#specifying-files-and-ignores
11
11
  return [
12
12
  {
13
- // TODO waiting for eslint 9
14
- // name: 'fenge/ignore',
13
+ name: "fenge/gitignore",
15
14
  ignores: stdout.split("\n").filter(Boolean),
16
15
  },
17
16
  ];
18
17
  }
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aWdub3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9naXRpZ25vcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFFOUMsTUFBTSxVQUFVLFNBQVM7SUFDdkIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUM1QixnRUFBZ0UsRUFDaEUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQ3JCLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sQ0FBQyxJQUFJLENBQ1YsK0ZBQStGLEVBQy9GLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELGdHQUFnRztJQUNoRyxPQUFPO1FBQ0w7WUFDRSw0QkFBNEI7WUFDNUIsd0JBQXdCO1lBQ3hCLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7U0FDNUM7S0FDTyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2l0aWdub3JlKCkge1xuICBsZXQgc3Rkb3V0ID0gXCJcIjtcbiAgdHJ5IHtcbiAgICBzdGRvdXQgPSBjaGlsZFByb2Nlc3MuZXhlY1N5bmMoXG4gICAgICBcImdpdCBscy1maWxlcyAtLW90aGVycyAtLWlnbm9yZWQgLS1leGNsdWRlLXN0YW5kYXJkIC0tZGlyZWN0b3J5XCIsXG4gICAgICB7IGVuY29kaW5nOiBcInV0ZjhcIiB9LFxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIldhcm46IFJ1bm5pbmcgYGdpdCBscy1maWxlc2AgZmFpbC4gV2UgcmVjb21tZW5kIHRvIHJ1biBgZ2l0IGluaXRgIHRvIHNldHVwIHRoZSBwcm9qZWN0IGZpcnN0LlwiLFxuICAgICAgZSxcbiAgICApO1xuICB9XG4gIC8vIGh0dHBzOi8vZXNsaW50Lm9yZy9kb2NzL2xhdGVzdC91c2UvY29uZmlndXJlL2NvbmZpZ3VyYXRpb24tZmlsZXMjc3BlY2lmeWluZy1maWxlcy1hbmQtaWdub3Jlc1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIC8vIFRPRE8gd2FpdGluZyBmb3IgZXNsaW50IDlcbiAgICAgIC8vIG5hbWU6ICdmZW5nZS9pZ25vcmUnLFxuICAgICAgaWdub3Jlczogc3Rkb3V0LnNwbGl0KFwiXFxuXCIpLmZpbHRlcihCb29sZWFuKSxcbiAgICB9LFxuICBdIGFzIGNvbnN0O1xufVxuIl19
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aWdub3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9naXRpZ25vcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFFOUMsTUFBTSxVQUFVLFNBQVM7SUFDdkIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUM1QixnRUFBZ0UsRUFDaEUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQ3JCLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sQ0FBQyxJQUFJLENBQ1YsK0ZBQStGLEVBQy9GLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELGdHQUFnRztJQUNoRyxPQUFPO1FBQ0w7WUFDRSxJQUFJLEVBQUUsaUJBQWlCO1lBQ3ZCLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7U0FDNUM7S0FDTyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2l0aWdub3JlKCkge1xuICBsZXQgc3Rkb3V0ID0gXCJcIjtcbiAgdHJ5IHtcbiAgICBzdGRvdXQgPSBjaGlsZFByb2Nlc3MuZXhlY1N5bmMoXG4gICAgICBcImdpdCBscy1maWxlcyAtLW90aGVycyAtLWlnbm9yZWQgLS1leGNsdWRlLXN0YW5kYXJkIC0tZGlyZWN0b3J5XCIsXG4gICAgICB7IGVuY29kaW5nOiBcInV0ZjhcIiB9LFxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIldhcm46IFJ1bm5pbmcgYGdpdCBscy1maWxlc2AgZmFpbC4gV2UgcmVjb21tZW5kIHRvIHJ1biBgZ2l0IGluaXRgIHRvIHNldHVwIHRoZSBwcm9qZWN0IGZpcnN0LlwiLFxuICAgICAgZSxcbiAgICApO1xuICB9XG4gIC8vIGh0dHBzOi8vZXNsaW50Lm9yZy9kb2NzL2xhdGVzdC91c2UvY29uZmlndXJlL2NvbmZpZ3VyYXRpb24tZmlsZXMjc3BlY2lmeWluZy1maWxlcy1hbmQtaWdub3Jlc1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiZmVuZ2UvZ2l0aWdub3JlXCIsXG4gICAgICBpZ25vcmVzOiBzdGRvdXQuc3BsaXQoXCJcXG5cIikuZmlsdGVyKEJvb2xlYW4pLFxuICAgIH0sXG4gIF0gYXMgY29uc3Q7XG59XG4iXX0=
@@ -1,24 +1,29 @@
1
1
  import { javascript } from "./config/javascript.js";
2
2
  import { packagejson } from "./config/packagejson.js";
3
3
  import { typescript } from "./config/typescript.js";
4
+ type NoDuplicate<A extends unknown[]> = {
5
+ [I in keyof A]: true extends {
6
+ [J in keyof A]: J extends I ? false : A[J] extends A[I] ? true : false;
7
+ }[number] ? never : A[I];
8
+ };
4
9
  type JsRuleKey = keyof ReturnType<typeof javascript>[0]["rules"];
5
10
  type TsRuleKey = keyof ReturnType<typeof typescript>[0]["rules"];
6
11
  type PkgRuleKey = keyof ReturnType<typeof packagejson>[0]["rules"];
7
- interface Options<T extends string> {
8
- pick?: T[];
9
- omit?: T[];
12
+ interface Options<T extends string[]> {
13
+ pick?: NoDuplicate<T>;
14
+ omit?: NoDuplicate<T>;
10
15
  extend?: Record<string, "error" | "warn" | "off" | ["error" | "warn", ...unknown[]]>;
11
- override?: Partial<Record<T, "error" | "warn" | "off" | ["error" | "warn", ...unknown[]]>>;
16
+ override?: Partial<Record<T[number], "error" | "warn" | "off" | ["error" | "warn", ...unknown[]]>>;
12
17
  }
13
18
  export declare class Builder {
14
19
  private readonly configs;
15
20
  toConfig(): object[];
16
21
  private setup;
17
- enableTypescript(options?: Options<TsRuleKey> & {
22
+ enableTypescript<T extends TsRuleKey[]>(options?: Options<T> & {
18
23
  project?: string;
19
24
  }): this;
20
- enableJavascript(options?: Options<JsRuleKey>): this;
21
- enablePackagejson(options?: Options<PkgRuleKey>): this;
25
+ enableJavascript<T extends JsRuleKey[]>(options?: Options<T>): this;
26
+ enablePackagejson<T extends PkgRuleKey[]>(options?: Options<T>): this;
22
27
  }
23
28
  declare const _default: object[];
24
29
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"eslint.config.d.ts","sourceRoot":"","sources":["../src/eslint.config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,KAAK,SAAS,GAAG,MAAM,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACjE,KAAK,SAAS,GAAG,MAAM,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACjE,KAAK,UAAU,GAAG,MAAM,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AAEnE,UAAU,OAAO,CAAC,CAAC,SAAS,MAAM;IAChC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACX,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CACb,MAAM,EACN,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,CAAC,OAAO,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAC5D,CAAC;IACF,QAAQ,CAAC,EAAE,OAAO,CAChB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,CAAC,OAAO,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CACvE,CAAC;CACH;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAEnE,QAAQ;IAIR,OAAO,CAAC,KAAK;IAqDb,gBAAgB,CAAC,OAAO,GAAE,OAAO,CAAC,SAAS,CAAC,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO;IAIxE,gBAAgB,CAAC,OAAO,GAAE,OAAO,CAAC,SAAS,CAAM;IAIjD,iBAAiB,CAAC,OAAO,GAAE,OAAO,CAAC,UAAU,CAAM;CAGpD;;AAED,wBAIc"}
1
+ {"version":3,"file":"eslint.config.d.ts","sourceRoot":"","sources":["../src/eslint.config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,KAAK,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI;KACrC,CAAC,IAAI,MAAM,CAAC,GAAG,IAAI,SAAS;SAC1B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK;KACvE,CAAC,MAAM,CAAC,GACL,KAAK,GACL,CAAC,CAAC,CAAC,CAAC;CACT,CAAC;AAEF,KAAK,SAAS,GAAG,MAAM,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACjE,KAAK,SAAS,GAAG,MAAM,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACjE,KAAK,UAAU,GAAG,MAAM,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AAEnE,UAAU,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE;IAClC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CACb,MAAM,EACN,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,CAAC,OAAO,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAC5D,CAAC;IACF,QAAQ,CAAC,EAAE,OAAO,CAChB,MAAM,CACJ,CAAC,CAAC,MAAM,CAAC,EACT,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,CAAC,OAAO,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAC5D,CACF,CAAC;CACH;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAEnE,QAAQ;IAIR,OAAO,CAAC,KAAK;IAqDb,gBAAgB,CAAC,CAAC,SAAS,SAAS,EAAE,EACpC,OAAO,GAAE,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO;IAKjD,gBAAgB,CAAC,CAAC,SAAS,SAAS,EAAE,EAAE,OAAO,GAAE,OAAO,CAAC,CAAC,CAAM;IAIhE,iBAAiB,CAAC,CAAC,SAAS,UAAU,EAAE,EAAE,OAAO,GAAE,OAAO,CAAC,CAAC,CAAM;CAGnE;;AAED,wBAIc"}
@@ -65,4 +65,4 @@ export default new Builder()
65
65
  .enableJavascript()
66
66
  .enableTypescript()
67
67
  .toConfig();
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNsaW50LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lc2xpbnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFrQnBELE1BQU0sT0FBTyxPQUFPO0lBQ0QsT0FBTyxHQUFhLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFbkUsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRU8sS0FBSyxDQUNYLENBQUMsVUFBVSxFQUFFLEdBQUcsWUFBWSxDQUczQixFQUNELEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLFFBQVEsR0FBRyxFQUFFLEVBQW1CO1FBRTNELE1BQU0sTUFBTSxHQUFHLENBQUMsT0FBZSxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7aUJBQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLENBQUM7aUJBQU0sSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFD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QUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2l0aWdub3JlIH0gZnJvbSBcIi4vY29uZmlnL2dpdGlnbm9yZS5qc1wiO1xuaW1wb3J0IHsgaWdub3JlIH0gZnJvbSBcIi4vY29uZmlnL2lnbm9yZS5qc1wiO1xuaW1wb3J0IHsgamF2YXNjcmlwdCB9IGZyb20gXCIuL2NvbmZpZy9qYXZhc2NyaXB0LmpzXCI7XG5pbXBvcnQgeyBwYWNrYWdlanNvbiB9IGZyb20gXCIuL2NvbmZpZy9wYWNrYWdlanNvbi5qc1wiO1xuaW1wb3J0IHsgdHlwZXNjcmlwdCB9IGZyb20gXCIuL2NvbmZpZy90eXBlc2NyaXB0LmpzXCI7XG5cbnR5cGUgSnNSdWxlS2V5ID0ga2V5b2YgUmV0dXJuVHlwZTx0eXBlb2YgamF2YXNjcmlwdD5bMF1bXCJydWxlc1wiXTtcbnR5cGUgVHNSdWxlS2V5ID0ga2V5b2YgUmV0dXJuVHlwZTx0eXBlb2YgdHlwZXNjcmlwdD5bMF1bXCJydWxlc1wiXTtcbnR5cGUgUGtnUnVsZUtleSA9IGtleW9mIFJldHVyblR5cGU8dHlwZW9mIHBhY2thZ2Vqc29uPlswXVtcInJ1bGVzXCJdO1xuXG5pbnRlcmZhY2UgT3B0aW9uczxUIGV4dGVuZHMgc3RyaW5nPiB7XG4gIHBpY2s/OiBUW107XG4gIG9taXQ/OiBUW107XG4gIGV4dGVuZD86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgXCJlcnJvclwiIHwgXCJ3YXJuXCIgfCBcIm9mZlwiIHwgW1wiZXJyb3JcIiB8IFwid2FyblwiLCAuLi51bmtub3duW11dXG4gID47XG4gIG92ZXJyaWRlPzogUGFydGlhbDxcbiAgICBSZWNvcmQ8VCwgXCJlcnJvclwiIHwgXCJ3YXJuXCIgfCBcIm9mZlwiIHwgW1wiZXJyb3JcIiB8IFwid2FyblwiLCAuLi51bmtub3duW11dPlxuICA+O1xufVxuXG5leHBvcnQgY2xhc3MgQnVpbGRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnczogb2JqZWN0W10gPSBbLi4uZ2l0aWdub3JlKCksIC4uLmlnbm9yZSgpXTtcblxuICB0b0NvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWdzO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cChcbiAgICBbbWFpbkNvbmZpZywgLi4ub3RoZXJDb25maWdzXTogcmVhZG9ubHkgW1xuICAgICAgeyBwbHVnaW5zOiBvYmplY3Q7IHJ1bGVzOiBvYmplY3QgfSxcbiAgICAgIC4uLm9iamVjdFtdLFxuICAgIF0sXG4gICAgeyBwaWNrLCBvbWl0LCBleHRlbmQgPSB7fSwgb3ZlcnJpZGUgPSB7fSB9OiBPcHRpb25zPHN0cmluZz4sXG4gICkge1xuICAgIGNvbnN0IHNlbGVjdCA9IChydWxlS2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghcGljayAmJiAhb21pdCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAocGljayAmJiAhb21pdCkge1xuICAgICAgICByZXR1cm4gcGljay5pbmNsdWRlcyhydWxlS2V5KTtcbiAgICAgIH0gZWxzZSBpZiAoIXBpY2sgJiYgb21pdCkge1xuICAgICAgICByZXR1cm4gIW9taXQuaW5jbHVkZXMocnVsZUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IHNwZWNpZnkgYm90aCBwaWNrIGFuZCBvbWl0XCIpO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgcnVsZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhtYWluQ29uZmlnLnJ1bGVzKS5maWx0ZXIoKFtydWxlS2V5XSkgPT4gc2VsZWN0KHJ1bGVLZXkpKSxcbiAgICApO1xuICAgIC8vIGNoZWNrIGBvdmVycmlkZWAgZmllbGRcbiAgICBPYmplY3Qua2V5cyhvdmVycmlkZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoIShrZXkgaW4gcnVsZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIG92ZXJyaWRpbmcgcnVsZSBrZXkgJHtrZXl9IGlzIG5vdCBleGlzdGluZy5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBjaGVjayBgZXh0ZW5kYCBmaWVsZFxuICAgIE9iamVjdC5rZXlzKGV4dGVuZCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5IGluIHJ1bGVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGV4dGVuZGluZyBydWxlIGtleSAke2tleX0gaXMgYWxyZWFkeSBleGlzdGluZy5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChrZXkuaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbk5hbWUgPSBrZXkuc3BsaXQoXCIvXCIpWzBdO1xuICAgICAgICBpZiAoIXBsdWdpbk5hbWUpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZXh0ZW5kaW5nIHJ1bGUga2V5ICcke2tleX0nIGlzIGludmFsaWRgKTtcbiAgICAgICAgaWYgKCEocGx1Z2luTmFtZSBpbiBtYWluQ29uZmlnLnBsdWdpbnMpKSB7XG4gICAgICAgICAgY29uc3Qgc3VwcG9ydGVkUGx1Z2lucyA9IE9iamVjdC5rZXlzKG1haW5Db25maWcucGx1Z2lucylcbiAgICAgICAgICAgIC5tYXAoKGspID0+IGAnJHtrfSdgKVxuICAgICAgICAgICAgLmpvaW4oXCIsXCIpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUaGUgcGx1Z2luIG5hbWUgJyR7cGx1Z2luTmFtZX0nIG9mIGV4dGVuZGluZyBydWxlIGtleSAnJHtrZXl9JyBpcyBub3Qgc3VwcG9ydGVkLiBPbmx5ICR7c3VwcG9ydGVkUGx1Z2luc30gcGx1Z2lucyBhcmUgc3VwcG9ydGVkLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY29uZmlncy5wdXNoKFxuICAgICAgeyAuLi5tYWluQ29uZmlnLCBydWxlczogeyAuLi5ydWxlcywgLi4ub3ZlcnJpZGUsIC4uLmV4dGVuZCB9IH0sXG4gICAgICAuLi5vdGhlckNvbmZpZ3MsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGVuYWJsZVR5cGVzY3JpcHQob3B0aW9uczogT3B0aW9uczxUc1J1bGVLZXk+ICYgeyBwcm9qZWN0Pzogc3RyaW5nIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLnNldHVwKHR5cGVzY3JpcHQob3B0aW9ucy5wcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cblxuICBlbmFibGVKYXZhc2NyaXB0KG9wdGlvbnM6IE9wdGlvbnM8SnNSdWxlS2V5PiA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dXAoamF2YXNjcmlwdCgpLCBvcHRpb25zKTtcbiAgfVxuXG4gIGVuYWJsZVBhY2thZ2Vqc29uKG9wdGlvbnM6IE9wdGlvbnM8UGtnUnVsZUtleT4gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLnNldHVwKHBhY2thZ2Vqc29uKCksIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBCdWlsZGVyKClcbiAgLmVuYWJsZVBhY2thZ2Vqc29uKClcbiAgLmVuYWJsZUphdmFzY3JpcHQoKVxuICAuZW5hYmxlVHlwZXNjcmlwdCgpXG4gIC50b0NvbmZpZygpO1xuIl19
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNsaW50LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lc2xpbnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUE2QnBELE1BQU0sT0FBTyxPQUFPO0lBQ0QsT0FBTyxHQUFhLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFbkUsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRU8sS0FBSyxDQUNYLENBQUMsVUFBVSxFQUFFLEdBQUcsWUFBWSxDQUczQixFQUNELEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLFFBQVEsR0FBRyxFQUFFLEVBQXFCO1FBRTdELE1BQU0sTUFBTSxHQUFHLENBQUMsT0FBZSxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7aUJBQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLENBQUM7aUJBQU0sSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFD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LENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnaXRpZ25vcmUgfSBmcm9tIFwiLi9jb25maWcvZ2l0aWdub3JlLmpzXCI7XG5pbXBvcnQgeyBpZ25vcmUgfSBmcm9tIFwiLi9jb25maWcvaWdub3JlLmpzXCI7XG5pbXBvcnQgeyBqYXZhc2NyaXB0IH0gZnJvbSBcIi4vY29uZmlnL2phdmFzY3JpcHQuanNcIjtcbmltcG9ydCB7IHBhY2thZ2Vqc29uIH0gZnJvbSBcIi4vY29uZmlnL3BhY2thZ2Vqc29uLmpzXCI7XG5pbXBvcnQgeyB0eXBlc2NyaXB0IH0gZnJvbSBcIi4vY29uZmlnL3R5cGVzY3JpcHQuanNcIjtcblxudHlwZSBOb0R1cGxpY2F0ZTxBIGV4dGVuZHMgdW5rbm93bltdPiA9IHtcbiAgW0kgaW4ga2V5b2YgQV06IHRydWUgZXh0ZW5kcyB7XG4gICAgW0ogaW4ga2V5b2YgQV06IEogZXh0ZW5kcyBJID8gZmFsc2UgOiBBW0pdIGV4dGVuZHMgQVtJXSA/IHRydWUgOiBmYWxzZTtcbiAgfVtudW1iZXJdXG4gICAgPyBuZXZlclxuICAgIDogQVtJXTtcbn07XG5cbnR5cGUgSnNSdWxlS2V5ID0ga2V5b2YgUmV0dXJuVHlwZTx0eXBlb2YgamF2YXNjcmlwdD5bMF1bXCJydWxlc1wiXTtcbnR5cGUgVHNSdWxlS2V5ID0ga2V5b2YgUmV0dXJuVHlwZTx0eXBlb2YgdHlwZXNjcmlwdD5bMF1bXCJydWxlc1wiXTtcbnR5cGUgUGtnUnVsZUtleSA9IGtleW9mIFJldHVyblR5cGU8dHlwZW9mIHBhY2thZ2Vqc29uPlswXVtcInJ1bGVzXCJdO1xuXG5pbnRlcmZhY2UgT3B0aW9uczxUIGV4dGVuZHMgc3RyaW5nW10+IHtcbiAgcGljaz86IE5vRHVwbGljYXRlPFQ+O1xuICBvbWl0PzogTm9EdXBsaWNhdGU8VD47XG4gIGV4dGVuZD86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgXCJlcnJvclwiIHwgXCJ3YXJuXCIgfCBcIm9mZlwiIHwgW1wiZXJyb3JcIiB8IFwid2FyblwiLCAuLi51bmtub3duW11dXG4gID47XG4gIG92ZXJyaWRlPzogUGFydGlhbDxcbiAgICBSZWNvcmQ8XG4gICAgICBUW251bWJlcl0sXG4gICAgICBcImVycm9yXCIgfCBcIndhcm5cIiB8IFwib2ZmXCIgfCBbXCJlcnJvclwiIHwgXCJ3YXJuXCIsIC4uLnVua25vd25bXV1cbiAgICA+XG4gID47XG59XG5cbmV4cG9ydCBjbGFzcyBCdWlsZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdzOiBvYmplY3RbXSA9IFsuLi5naXRpZ25vcmUoKSwgLi4uaWdub3JlKCldO1xuXG4gIHRvQ29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ3M7XG4gIH1cblxuICBwcml2YXRlIHNldHVwKFxuICAgIFttYWluQ29uZmlnLCAuLi5vdGhlckNvbmZpZ3NdOiByZWFkb25seSBbXG4gICAgICB7IHBsdWdpbnM6IG9iamVjdDsgcnVsZXM6IG9iamVjdCB9LFxuICAgICAgLi4ub2JqZWN0W10sXG4gICAgXSxcbiAgICB7IHBpY2ssIG9taXQsIGV4dGVuZCA9IHt9LCBvdmVycmlkZSA9IHt9IH06IE9wdGlvbnM8c3RyaW5nW10+LFxuICApIHtcbiAgICBjb25zdCBzZWxlY3QgPSAocnVsZUtleTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIXBpY2sgJiYgIW9taXQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHBpY2sgJiYgIW9taXQpIHtcbiAgICAgICAgcmV0dXJuIHBpY2suaW5jbHVkZXMocnVsZUtleSk7XG4gICAgICB9IGVsc2UgaWYgKCFwaWNrICYmIG9taXQpIHtcbiAgICAgICAgcmV0dXJuICFvbWl0LmluY2x1ZGVzKHJ1bGVLZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggcGljayBhbmQgb21pdFwiKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJ1bGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMobWFpbkNvbmZpZy5ydWxlcykuZmlsdGVyKChbcnVsZUtleV0pID0+IHNlbGVjdChydWxlS2V5KSksXG4gICAgKTtcbiAgICAvLyBjaGVjayBgb3ZlcnJpZGVgIGZpZWxkXG4gICAgT2JqZWN0LmtleXMob3ZlcnJpZGUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKCEoa2V5IGluIHJ1bGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBvdmVycmlkaW5nIHJ1bGUga2V5ICR7a2V5fSBpcyBub3QgZXhpc3RpbmcuYCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gY2hlY2sgYGV4dGVuZGAgZmllbGRcbiAgICBPYmplY3Qua2V5cyhleHRlbmQpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGtleSBpbiBydWxlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBleHRlbmRpbmcgcnVsZSBrZXkgJHtrZXl9IGlzIGFscmVhZHkgZXhpc3RpbmcuYCk7XG4gICAgICB9XG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKFwiL1wiKSkge1xuICAgICAgICBjb25zdCBwbHVnaW5OYW1lID0ga2V5LnNwbGl0KFwiL1wiKVswXTtcbiAgICAgICAgaWYgKCFwbHVnaW5OYW1lKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGV4dGVuZGluZyBydWxlIGtleSAnJHtrZXl9JyBpcyBpbnZhbGlkYCk7XG4gICAgICAgIGlmICghKHBsdWdpbk5hbWUgaW4gbWFpbkNvbmZpZy5wbHVnaW5zKSkge1xuICAgICAgICAgIGNvbnN0IHN1cHBvcnRlZFBsdWdpbnMgPSBPYmplY3Qua2V5cyhtYWluQ29uZmlnLnBsdWdpbnMpXG4gICAgICAgICAgICAubWFwKChrKSA9PiBgJyR7a30nYClcbiAgICAgICAgICAgIC5qb2luKFwiLFwiKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGhlIHBsdWdpbiBuYW1lICcke3BsdWdpbk5hbWV9JyBvZiBleHRlbmRpbmcgcnVsZSBrZXkgJyR7a2V5fScgaXMgbm90IHN1cHBvcnRlZC4gT25seSAke3N1cHBvcnRlZFBsdWdpbnN9IHBsdWdpbnMgYXJlIHN1cHBvcnRlZC5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNvbmZpZ3MucHVzaChcbiAgICAgIHsgLi4ubWFpbkNvbmZpZywgcnVsZXM6IHsgLi4ucnVsZXMsIC4uLm92ZXJyaWRlLCAuLi5leHRlbmQgfSB9LFxuICAgICAgLi4ub3RoZXJDb25maWdzLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBlbmFibGVUeXBlc2NyaXB0PFQgZXh0ZW5kcyBUc1J1bGVLZXlbXT4oXG4gICAgb3B0aW9uczogT3B0aW9uczxUPiAmIHsgcHJvamVjdD86IHN0cmluZyB9ID0ge30sXG4gICkge1xuICAgIHJldHVybiB0aGlzLnNldHVwKHR5cGVzY3JpcHQob3B0aW9ucy5wcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cblxuICBlbmFibGVKYXZhc2NyaXB0PFQgZXh0ZW5kcyBKc1J1bGVLZXlbXT4ob3B0aW9uczogT3B0aW9uczxUPiA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dXAoamF2YXNjcmlwdCgpLCBvcHRpb25zKTtcbiAgfVxuXG4gIGVuYWJsZVBhY2thZ2Vqc29uPFQgZXh0ZW5kcyBQa2dSdWxlS2V5W10+KG9wdGlvbnM6IE9wdGlvbnM8VD4gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLnNldHVwKHBhY2thZ2Vqc29uKCksIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBCdWlsZGVyKClcbiAgLmVuYWJsZVBhY2thZ2Vqc29uKClcbiAgLmVuYWJsZUphdmFzY3JpcHQoKVxuICAuZW5hYmxlVHlwZXNjcmlwdCgpXG4gIC50b0NvbmZpZygpO1xuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fenge/eslint-config",
3
- "version": "0.1.3",
3
+ "version": "0.2.1",
4
4
  "description": "A super strict eslint config for linting js/ts/package.json.",
5
5
  "keywords": [
6
6
  "opinionated",
@@ -36,7 +36,7 @@
36
36
  "eslint-plugin-react-hooks": "5.0.0",
37
37
  "eslint-plugin-simple-import-sort": "12.1.1",
38
38
  "eslint-plugin-sonarjs": "1.0.4",
39
- "eslint-plugin-unicorn": "56.0.0",
39
+ "eslint-plugin-unicorn": "56.0.1",
40
40
  "globals": "15.12.0",
41
41
  "@fenge/eslint-plugin": "0.1.1",
42
42
  "@fenge/eslint-plugin-ts": "0.1.0",
@@ -48,10 +48,13 @@
48
48
  "@swc-node/register": "1.10.0",
49
49
  "@types/eslint-config-prettier": "6.11.3",
50
50
  "@types/node": "22.7.5",
51
- "eslint": "8.57.0",
51
+ "eslint": "8.57.1",
52
52
  "eslint-config-prettier": "9.1.0",
53
53
  "prettier": "3.3.3"
54
54
  },
55
+ "peerDependencies": {
56
+ "eslint": ">=8.57.1"
57
+ },
55
58
  "scripts": {
56
59
  "build": "tsc -p tsconfig.build.json",
57
60
  "test": "node --test --import @swc-node/register/esm-register \"**/*.spec.ts\""
@@ -16,8 +16,7 @@ export function gitignore() {
16
16
  // https://eslint.org/docs/latest/use/configure/configuration-files#specifying-files-and-ignores
17
17
  return [
18
18
  {
19
- // TODO waiting for eslint 9
20
- // name: 'fenge/ignore',
19
+ name: "fenge/gitignore",
21
20
  ignores: stdout.split("\n").filter(Boolean),
22
21
  },
23
22
  ] as const;
@@ -21,6 +21,7 @@ await describe("eslint.config", async () => {
21
21
  });
22
22
 
23
23
  await it("should not contain deprecated rules", async () => {
24
+ // https://eslint.org/blog/2023/10/deprecating-formatting-rules/#the-deprecated-rules
24
25
  const deprecatedRules = [
25
26
  "array-bracket-newline",
26
27
  "array-bracket-spacing",
@@ -4,19 +4,30 @@ import { javascript } from "./config/javascript.js";
4
4
  import { packagejson } from "./config/packagejson.js";
5
5
  import { typescript } from "./config/typescript.js";
6
6
 
7
+ type NoDuplicate<A extends unknown[]> = {
8
+ [I in keyof A]: true extends {
9
+ [J in keyof A]: J extends I ? false : A[J] extends A[I] ? true : false;
10
+ }[number]
11
+ ? never
12
+ : A[I];
13
+ };
14
+
7
15
  type JsRuleKey = keyof ReturnType<typeof javascript>[0]["rules"];
8
16
  type TsRuleKey = keyof ReturnType<typeof typescript>[0]["rules"];
9
17
  type PkgRuleKey = keyof ReturnType<typeof packagejson>[0]["rules"];
10
18
 
11
- interface Options<T extends string> {
12
- pick?: T[];
13
- omit?: T[];
19
+ interface Options<T extends string[]> {
20
+ pick?: NoDuplicate<T>;
21
+ omit?: NoDuplicate<T>;
14
22
  extend?: Record<
15
23
  string,
16
24
  "error" | "warn" | "off" | ["error" | "warn", ...unknown[]]
17
25
  >;
18
26
  override?: Partial<
19
- Record<T, "error" | "warn" | "off" | ["error" | "warn", ...unknown[]]>
27
+ Record<
28
+ T[number],
29
+ "error" | "warn" | "off" | ["error" | "warn", ...unknown[]]
30
+ >
20
31
  >;
21
32
  }
22
33
 
@@ -32,7 +43,7 @@ export class Builder {
32
43
  { plugins: object; rules: object },
33
44
  ...object[],
34
45
  ],
35
- { pick, omit, extend = {}, override = {} }: Options<string>,
46
+ { pick, omit, extend = {}, override = {} }: Options<string[]>,
36
47
  ) {
37
48
  const select = (ruleKey: string) => {
38
49
  if (!pick && !omit) {
@@ -80,15 +91,17 @@ export class Builder {
80
91
  return this;
81
92
  }
82
93
 
83
- enableTypescript(options: Options<TsRuleKey> & { project?: string } = {}) {
94
+ enableTypescript<T extends TsRuleKey[]>(
95
+ options: Options<T> & { project?: string } = {},
96
+ ) {
84
97
  return this.setup(typescript(options.project), options);
85
98
  }
86
99
 
87
- enableJavascript(options: Options<JsRuleKey> = {}) {
100
+ enableJavascript<T extends JsRuleKey[]>(options: Options<T> = {}) {
88
101
  return this.setup(javascript(), options);
89
102
  }
90
103
 
91
- enablePackagejson(options: Options<PkgRuleKey> = {}) {
104
+ enablePackagejson<T extends PkgRuleKey[]>(options: Options<T> = {}) {
92
105
  return this.setup(packagejson(), options);
93
106
  }
94
107
  }