From 6466b6fb097c441bb4a93c2610232334251254e0 Mon Sep 17 00:00:00 2001 From: Ulrich Buchgraber Date: Tue, 21 Apr 2020 17:10:44 +0200 Subject: [PATCH] chore(experimental-utils): Allow rules to specify a readonly `Options` tuple * Change `createRule`'s `TOptions` to a readonly generic constraint ... * ... and make it mutable exactly where it's necessary: within `applyDefault()` (after cloning it) --- .../experimental-utils/src/eslint-utils/RuleCreator.ts | 2 +- .../experimental-utils/src/eslint-utils/applyDefault.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/experimental-utils/src/eslint-utils/RuleCreator.ts b/packages/experimental-utils/src/eslint-utils/RuleCreator.ts index f9278dc8154..4dede52bd7c 100644 --- a/packages/experimental-utils/src/eslint-utils/RuleCreator.ts +++ b/packages/experimental-utils/src/eslint-utils/RuleCreator.ts @@ -17,7 +17,7 @@ function RuleCreator(urlCreator: (ruleName: string) => string) { // This function will get much easier to call when this is merged https://github.com/Microsoft/TypeScript/pull/26349 // TODO - when the above PR lands; add type checking for the context.report `data` property return function createRule< - TOptions extends unknown[], + TOptions extends readonly unknown[], TMessageIds extends string, TRuleListener extends RuleListener = RuleListener >({ diff --git a/packages/experimental-utils/src/eslint-utils/applyDefault.ts b/packages/experimental-utils/src/eslint-utils/applyDefault.ts index 142c8d1a746..9b4f6513ecc 100644 --- a/packages/experimental-utils/src/eslint-utils/applyDefault.ts +++ b/packages/experimental-utils/src/eslint-utils/applyDefault.ts @@ -7,12 +7,14 @@ import { deepMerge, isObjectNotArray } from './deepMerge'; * @param userOptions the user opts * @returns the options with defaults */ -function applyDefault( +function applyDefault( defaultOptions: TDefault, userOptions: TUser | null, ): TDefault { // clone defaults - const options: TDefault = JSON.parse(JSON.stringify(defaultOptions)); + const options: AsMutable = JSON.parse( + JSON.stringify(defaultOptions), + ); if (userOptions === null || userOptions === undefined) { return options; @@ -33,4 +35,6 @@ function applyDefault( return options; } +type AsMutable = { -readonly [TKey in keyof T]: T[TKey] }; + export { applyDefault };