From 4ef67884962b6aac61cc895aaa3ba16aa892ecf4 Mon Sep 17 00:00:00 2001 From: ulrichb Date: Tue, 21 Apr 2020 18:30:43 +0200 Subject: [PATCH] feat(experimental-utils): allow rule options to be a readonly tuple (#1924) --- .../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 };