@ospm/eslint-plugin-react-signals-hooks
Version:
ESLint plugin for React Signals hooks - enforces best practices, performance optimizations, and integration patterns for @preact/signals-react usage in React projects
814 lines • 161 kB
TypeScript
import '@total-typescript/ts-reset';
import type { Linter, ESLint } from 'eslint';
type FlatConfig = ESLint.FlatConfig;
type LegacyConfig = Linter.Config;
declare module 'eslint' {
namespace ESLint {
interface FlatConfig {
}
}
namespace Linter {
interface Config {
}
}
}
declare const rules: {
readonly 'exhaustive-deps': import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingDependencies" | "missingDependency" | "unnecessaryDependencies" | "unnecessaryDependency" | "duplicateDependencies" | "duplicateDependency" | "unknownDependencies" | "asyncEffect" | "missingEffectCallback" | "staleAssignmentDependency" | "staleAssignmentLiteral" | "staleAssignmentExpression" | "staleAssignmentUnstable" | "spreadElementInDependencyArray" | "useEffectEventInDependencyArray" | "addAllDependencies" | "addSingleDependency" | "removeDependencyArray" | "addDependencies" | "removeDependency" | "removeSingleDependency" | "removeAllDuplicates" | "removeAllUnnecessaryDependencies" | "removeThisDuplicate" | "dependencyWithoutSignal" | "notArrayLiteral" | "moveInsideEffect", [{
additionalHooks?: string | undefined;
unsafeAutofix?: boolean;
experimental_autoDependenciesHooks?: Array<string>;
requireExplicitEffectDeps?: boolean;
enableAutoFixForMemoAndCallback?: boolean;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
missingDependencies?: "error" | "warn" | "off";
missingDependency?: "error" | "warn" | "off";
unnecessaryDependencies?: "error" | "warn" | "off";
unnecessaryDependency?: "error" | "warn" | "off";
duplicateDependencies?: "error" | "warn" | "off";
duplicateDependency?: "error" | "warn" | "off";
unknownDependencies?: "error" | "warn" | "off";
asyncEffect?: "error" | "warn" | "off";
missingEffectCallback?: "error" | "warn" | "off";
staleAssignmentDependency?: "error" | "warn" | "off";
staleAssignmentLiteral?: "error" | "warn" | "off";
staleAssignmentExpression?: "error" | "warn" | "off";
staleAssignmentUnstable?: "error" | "warn" | "off";
spreadElementInDependencyArray?: "error" | "warn" | "off";
useEffectEventInDependencyArray?: "error" | "warn" | "off";
addAllDependencies?: "error" | "warn" | "off";
addSingleDependency?: "error" | "warn" | "off";
removeDependencyArray?: "error" | "warn" | "off";
addDependencies?: "error" | "warn" | "off";
removeDependency?: "error" | "warn" | "off";
removeSingleDependency?: "error" | "warn" | "off";
removeAllDuplicates?: "error" | "warn" | "off";
removeAllUnnecessaryDependencies?: "error" | "warn" | "off";
removeThisDuplicate?: "error" | "warn" | "off";
dependencyWithoutSignal?: "error" | "warn" | "off";
notArrayLiteral?: "error" | "warn" | "off";
moveInsideEffect?: "error" | "warn" | "off";
};
suffix?: string;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'no-mutation-in-render': import("@typescript-eslint/utils/ts-eslint").RuleModule<"signalValueAssignment" | "signalValueUpdate" | "signalPropertyAssignment" | "suggestUseEffect" | "suggestEventHandler" | "signalArrayIndexAssignment" | "signalNestedPropertyAssignment", [{
signalNames?: Array<string>;
allowedPatterns?: Array<string>;
severity?: {
signalValueAssignment?: "error" | "warn" | "off";
signalValueUpdate?: "error" | "warn" | "off";
signalPropertyAssignment?: "error" | "warn" | "off";
suggestUseEffect?: "error" | "warn" | "off";
suggestEventHandler?: "error" | "warn" | "off";
signalArrayIndexAssignment?: "error" | "warn" | "off";
signalNestedPropertyAssignment?: "error" | "warn" | "off";
};
unsafeAutofix?: boolean;
suffix?: string;
performance?: import("./utils/types.js").PerformanceBudget;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'no-signal-assignment-in-effect': import("@typescript-eslint/utils/ts-eslint").RuleModule<"avoidSignalAssignmentInEffect" | "suggestUseSignalsEffect" | "suggestUseSignalsLayoutEffect" | "avoidSignalAssignmentInLayoutEffect", [{
signalNames?: Array<string>;
allowedPatterns?: Array<string>;
severity?: {
avoidSignalAssignmentInEffect?: "error" | "warn" | "off";
suggestUseSignalsEffect?: "error" | "warn" | "off";
suggestUseSignalsLayoutEffect?: "error" | "warn" | "off";
avoidSignalAssignmentInLayoutEffect?: "error" | "warn" | "off";
};
performance?: import("./utils/types.js").PerformanceBudget;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'no-non-signal-with-signal-suffix': import("@typescript-eslint/utils/ts-eslint").RuleModule<"variableWithSignalSuffixNotSignal" | "parameterWithSignalSuffixNotSignal" | "propertyWithSignalSuffixNotSignal" | "suggestRenameWithoutSuffix" | "suggestConvertToSignal", [{
ignorePattern?: string;
signalNames?: Array<string>;
suffix?: string;
validateProperties?: boolean;
validateExported?: boolean;
severity?: {
variableWithSignalSuffixNotSignal?: "error" | "warn" | "off";
parameterWithSignalSuffixNotSignal?: "error" | "warn" | "off";
propertyWithSignalSuffixNotSignal?: "error" | "warn" | "off";
suggestRenameWithoutSuffix?: "error" | "warn" | "off";
suggestConvertToSignal?: "error" | "warn" | "off";
};
performance?: import("./utils/types.js").PerformanceBudget;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'no-signal-creation-in-component': import("@typescript-eslint/utils/ts-eslint").RuleModule<"avoidSignalInComponent" | "suggestMoveToModuleLevel" | "suggestMoveToCustomHook" | "moveToModuleLevel" | "createCustomHook", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
avoidSignalInComponent?: "error" | "warn" | "off";
suggestMoveToModuleLevel?: "error" | "warn" | "off";
suggestMoveToCustomHook?: "error" | "warn" | "off";
moveToModuleLevel?: "error" | "warn" | "off";
createCustomHook?: "error" | "warn" | "off";
};
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'require-use-signals': import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingUseSignalsInComponent" | "missingUseSignalsInCustomHook" | "wrongUseSignalsArg", [{
ignoreComponents?: Array<string>;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
missingUseSignalsInComponent?: "error" | "warn" | "off";
missingUseSignalsInCustomHook?: "error" | "warn" | "off";
wrongUseSignalsArg?: "error" | "warn" | "off";
};
suffix?: string;
wrapConciseArrows?: boolean;
extraCreatorModules?: Array<string>;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'restrict-signal-locations': import("@typescript-eslint/utils/ts-eslint").RuleModule<"signalInComponent" | "computedInComponent" | "exportedSignal", [{
allowedDirs?: Array<string>;
allowComputedInComponents?: boolean;
customHookPattern?: string;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
signalInComponent?: "error" | "warn" | "off";
computedInComponent?: "error" | "warn" | "off";
exportedSignal?: "error" | "warn" | "off";
};
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'forbid-signal-destructuring': import("@typescript-eslint/utils/ts-eslint").RuleModule<"destructureSignal", [{
suffix?: string;
modules?: Array<string>;
creatorNames?: Array<string>;
enableSuffixHeuristic?: boolean;
severity?: {
destructureSignal?: "error" | "warn" | "off";
};
performance?: import("./utils/types.js").PerformanceBudget;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'forbid-signal-re-assignment': import("@typescript-eslint/utils/ts-eslint").RuleModule<"reassignSignal", [{
suffix?: string;
severity?: {
reassignSignal?: "error" | "warn" | "off";
};
performance?: import("./utils/types.js").PerformanceBudget;
modules?: Array<string>;
allowBareNames?: boolean;
creatorNames?: Array<string>;
enableSuffixHeuristic?: boolean;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'forbid-signal-update-in-computed': import("@typescript-eslint/utils/ts-eslint").RuleModule<"noSignalWriteInComputed" | "noBatchedWritesInComputed", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
noSignalWriteInComputed?: "error" | "warn" | "off";
noBatchedWritesInComputed?: "error" | "warn" | "off";
};
suffix?: string;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-batch-updates': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useBatch" | "suggestUseBatch" | "addBatchImport" | "wrapWithBatch" | "useBatchSuggestion" | "removeUnnecessaryBatch" | "nonUpdateSignalInBatch" | "updatesSeparatedByCode", [{
minUpdates?: number;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
useBatch?: "error" | "warn" | "off";
suggestUseBatch?: "error" | "warn" | "off";
addBatchImport?: "error" | "warn" | "off";
wrapWithBatch?: "error" | "warn" | "off";
useBatchSuggestion?: "error" | "warn" | "off";
removeUnnecessaryBatch?: "error" | "warn" | "off";
nonUpdateSignalInBatch?: "error" | "warn" | "off";
updatesSeparatedByCode?: "error" | "warn" | "off";
};
extraSignalModules?: Array<string>;
detection?: {
allowSingleReads?: number;
allowNonTrivialBetween?: number;
ignoreUpdateCalls?: boolean;
};
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-computed': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferComputedWithSignal" | "preferComputedWithSignals" | "suggestComputed" | "addComputedImport" | "suggestAddComputedImport", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
preferComputedWithSignal?: "error" | "warn" | "off";
preferComputedWithSignals?: "error" | "warn" | "off";
suggestComputed?: "error" | "warn" | "off";
addComputedImport?: "error" | "warn" | "off";
suggestAddComputedImport?: "error" | "warn" | "off";
};
suffix?: string;
extraCreatorModules?: Array<string>;
rename?: boolean;
accessors?: {
jsx?: "auto" | "value" | "none";
inComponent?: "value" | "peek";
outsideComponent?: "peek" | "value";
};
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-for-over-map': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferForOverMap" | "suggestForComponent" | "addForImport", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
preferForOverMap?: "error" | "warn" | "off";
suggestForComponent?: "error" | "warn" | "off";
addForImport?: "error" | "warn" | "off";
};
suffix?: string;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-signal-effect': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferSignalEffect" | "suggestEffect" | "addEffectImport" | "mixedDeps", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
preferSignalEffect?: "error" | "warn" | "off";
suggestEffect?: "error" | "warn" | "off";
addEffectImport?: "error" | "warn" | "off";
mixedDeps?: "error" | "warn" | "off";
};
suffix?: string;
reportMixedDeps?: boolean;
extraCreatorModules?: Array<string>;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-signal-in-jsx': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferDirectSignalUsage", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
preferDirectSignalUsage?: "error" | "warn" | "off";
};
suffix?: string;
extraCreatorModules?: Array<string>;
extraCreatorNames?: Array<string>;
extraCreatorNamespaces?: Array<string>;
suggestOnly?: boolean;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-signal-methods': import("@typescript-eslint/utils/ts-eslint").RuleModule<"usePeekInEffect" | "preferPeekInNonReactiveContext", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
usePeekInEffect?: "error" | "warn" | "off";
preferPeekInNonReactiveContext?: "error" | "warn" | "off";
};
suffix?: string;
extraCreatorModules?: Array<string>;
reactiveEffectCallees?: Array<string>;
effectsSuggestionOnly?: boolean;
typeAware?: boolean;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-signal-reads': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useValueInNonJSX", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
useValueInNonJSX?: "error" | "warn" | "off";
};
suffix?: string;
consumers?: Array<string>;
typeAware?: boolean;
extraCreatorModules?: Array<string>;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-use-signal-over-use-state': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferUseSignal" | "addUseSignalImport" | "convertToUseSignal", [{
ignoreComplexInitializers?: boolean;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
preferUseSignal?: "error" | "warn" | "off";
addUseSignalImport?: "error" | "warn" | "off";
convertToUseSignal?: "error" | "warn" | "off";
};
suffix?: string;
extraCreatorModules?: Array<string>;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-use-signal-ref-over-use-ref': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferUseSignalRef" | "addUseSignalRefImport" | "convertToUseSignalRef", [{
onlyWhenReadInRender?: boolean;
renameRef?: boolean;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
preferUseSignalRef?: "error" | "warn" | "off";
addUseSignalRefImport?: "error" | "warn" | "off";
convertToUseSignalRef?: "error" | "warn" | "off";
};
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-use-computed-in-react-component': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferUseComputedInComponent" | "suggestUseComputed" | "addUseComputedImport", [{
performance?: import("./utils/types.js").PerformanceBudget;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-use-signal-effect-in-react-component': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferUseSignalEffectInComponent" | "suggestUseSignalEffect" | "addUseSignalEffectImport", [{
performance?: import("./utils/types.js").PerformanceBudget;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-show-over-ternary': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferShowOverTernary" | "suggestShowComponent" | "addShowImport", [{
minComplexity?: number;
signalNames?: Array<string>;
suffix?: string;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
preferShowOverTernary?: "error" | "warn" | "off";
suggestShowComponent?: "error" | "warn" | "off";
addShowImport?: "error" | "warn" | "off";
};
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'signal-variable-name': import("@typescript-eslint/utils/ts-eslint").RuleModule<"invalidSignalName" | "invalidComputedName", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
invalidSignalName?: "error" | "warn" | "off";
invalidComputedName?: "error" | "warn" | "off";
};
suffix?: string;
renameOnly?: boolean;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'warn-on-unnecessary-untracked': import("@typescript-eslint/utils/ts-eslint").RuleModule<"unnecessaryUntracked" | "unnecessaryPeek" | "suggestRemoveUntracked" | "suggestRemovePeek", [{
allowInEffects?: boolean;
allowInEventHandlers?: boolean;
allowForSignalWrites?: boolean;
suffix?: string;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
unnecessaryUntracked?: "error" | "warn" | "off";
unnecessaryPeek?: "error" | "warn" | "off";
suggestRemoveUntracked?: "error" | "warn" | "off";
suggestRemovePeek?: "error" | "warn" | "off";
};
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
};
declare const plugin: {
meta: {
name: string;
};
rules: {
readonly 'exhaustive-deps': import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingDependencies" | "missingDependency" | "unnecessaryDependencies" | "unnecessaryDependency" | "duplicateDependencies" | "duplicateDependency" | "unknownDependencies" | "asyncEffect" | "missingEffectCallback" | "staleAssignmentDependency" | "staleAssignmentLiteral" | "staleAssignmentExpression" | "staleAssignmentUnstable" | "spreadElementInDependencyArray" | "useEffectEventInDependencyArray" | "addAllDependencies" | "addSingleDependency" | "removeDependencyArray" | "addDependencies" | "removeDependency" | "removeSingleDependency" | "removeAllDuplicates" | "removeAllUnnecessaryDependencies" | "removeThisDuplicate" | "dependencyWithoutSignal" | "notArrayLiteral" | "moveInsideEffect", [{
additionalHooks?: string | undefined;
unsafeAutofix?: boolean;
experimental_autoDependenciesHooks?: Array<string>;
requireExplicitEffectDeps?: boolean;
enableAutoFixForMemoAndCallback?: boolean;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
missingDependencies?: "error" | "warn" | "off";
missingDependency?: "error" | "warn" | "off";
unnecessaryDependencies?: "error" | "warn" | "off";
unnecessaryDependency?: "error" | "warn" | "off";
duplicateDependencies?: "error" | "warn" | "off";
duplicateDependency?: "error" | "warn" | "off";
unknownDependencies?: "error" | "warn" | "off";
asyncEffect?: "error" | "warn" | "off";
missingEffectCallback?: "error" | "warn" | "off";
staleAssignmentDependency?: "error" | "warn" | "off";
staleAssignmentLiteral?: "error" | "warn" | "off";
staleAssignmentExpression?: "error" | "warn" | "off";
staleAssignmentUnstable?: "error" | "warn" | "off";
spreadElementInDependencyArray?: "error" | "warn" | "off";
useEffectEventInDependencyArray?: "error" | "warn" | "off";
addAllDependencies?: "error" | "warn" | "off";
addSingleDependency?: "error" | "warn" | "off";
removeDependencyArray?: "error" | "warn" | "off";
addDependencies?: "error" | "warn" | "off";
removeDependency?: "error" | "warn" | "off";
removeSingleDependency?: "error" | "warn" | "off";
removeAllDuplicates?: "error" | "warn" | "off";
removeAllUnnecessaryDependencies?: "error" | "warn" | "off";
removeThisDuplicate?: "error" | "warn" | "off";
dependencyWithoutSignal?: "error" | "warn" | "off";
notArrayLiteral?: "error" | "warn" | "off";
moveInsideEffect?: "error" | "warn" | "off";
};
suffix?: string;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'no-mutation-in-render': import("@typescript-eslint/utils/ts-eslint").RuleModule<"signalValueAssignment" | "signalValueUpdate" | "signalPropertyAssignment" | "suggestUseEffect" | "suggestEventHandler" | "signalArrayIndexAssignment" | "signalNestedPropertyAssignment", [{
signalNames?: Array<string>;
allowedPatterns?: Array<string>;
severity?: {
signalValueAssignment?: "error" | "warn" | "off";
signalValueUpdate?: "error" | "warn" | "off";
signalPropertyAssignment?: "error" | "warn" | "off";
suggestUseEffect?: "error" | "warn" | "off";
suggestEventHandler?: "error" | "warn" | "off";
signalArrayIndexAssignment?: "error" | "warn" | "off";
signalNestedPropertyAssignment?: "error" | "warn" | "off";
};
unsafeAutofix?: boolean;
suffix?: string;
performance?: import("./utils/types.js").PerformanceBudget;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'no-signal-assignment-in-effect': import("@typescript-eslint/utils/ts-eslint").RuleModule<"avoidSignalAssignmentInEffect" | "suggestUseSignalsEffect" | "suggestUseSignalsLayoutEffect" | "avoidSignalAssignmentInLayoutEffect", [{
signalNames?: Array<string>;
allowedPatterns?: Array<string>;
severity?: {
avoidSignalAssignmentInEffect?: "error" | "warn" | "off";
suggestUseSignalsEffect?: "error" | "warn" | "off";
suggestUseSignalsLayoutEffect?: "error" | "warn" | "off";
avoidSignalAssignmentInLayoutEffect?: "error" | "warn" | "off";
};
performance?: import("./utils/types.js").PerformanceBudget;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'no-non-signal-with-signal-suffix': import("@typescript-eslint/utils/ts-eslint").RuleModule<"variableWithSignalSuffixNotSignal" | "parameterWithSignalSuffixNotSignal" | "propertyWithSignalSuffixNotSignal" | "suggestRenameWithoutSuffix" | "suggestConvertToSignal", [{
ignorePattern?: string;
signalNames?: Array<string>;
suffix?: string;
validateProperties?: boolean;
validateExported?: boolean;
severity?: {
variableWithSignalSuffixNotSignal?: "error" | "warn" | "off";
parameterWithSignalSuffixNotSignal?: "error" | "warn" | "off";
propertyWithSignalSuffixNotSignal?: "error" | "warn" | "off";
suggestRenameWithoutSuffix?: "error" | "warn" | "off";
suggestConvertToSignal?: "error" | "warn" | "off";
};
performance?: import("./utils/types.js").PerformanceBudget;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'no-signal-creation-in-component': import("@typescript-eslint/utils/ts-eslint").RuleModule<"avoidSignalInComponent" | "suggestMoveToModuleLevel" | "suggestMoveToCustomHook" | "moveToModuleLevel" | "createCustomHook", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
avoidSignalInComponent?: "error" | "warn" | "off";
suggestMoveToModuleLevel?: "error" | "warn" | "off";
suggestMoveToCustomHook?: "error" | "warn" | "off";
moveToModuleLevel?: "error" | "warn" | "off";
createCustomHook?: "error" | "warn" | "off";
};
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'require-use-signals': import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingUseSignalsInComponent" | "missingUseSignalsInCustomHook" | "wrongUseSignalsArg", [{
ignoreComponents?: Array<string>;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
missingUseSignalsInComponent?: "error" | "warn" | "off";
missingUseSignalsInCustomHook?: "error" | "warn" | "off";
wrongUseSignalsArg?: "error" | "warn" | "off";
};
suffix?: string;
wrapConciseArrows?: boolean;
extraCreatorModules?: Array<string>;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'restrict-signal-locations': import("@typescript-eslint/utils/ts-eslint").RuleModule<"signalInComponent" | "computedInComponent" | "exportedSignal", [{
allowedDirs?: Array<string>;
allowComputedInComponents?: boolean;
customHookPattern?: string;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
signalInComponent?: "error" | "warn" | "off";
computedInComponent?: "error" | "warn" | "off";
exportedSignal?: "error" | "warn" | "off";
};
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'forbid-signal-destructuring': import("@typescript-eslint/utils/ts-eslint").RuleModule<"destructureSignal", [{
suffix?: string;
modules?: Array<string>;
creatorNames?: Array<string>;
enableSuffixHeuristic?: boolean;
severity?: {
destructureSignal?: "error" | "warn" | "off";
};
performance?: import("./utils/types.js").PerformanceBudget;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'forbid-signal-re-assignment': import("@typescript-eslint/utils/ts-eslint").RuleModule<"reassignSignal", [{
suffix?: string;
severity?: {
reassignSignal?: "error" | "warn" | "off";
};
performance?: import("./utils/types.js").PerformanceBudget;
modules?: Array<string>;
allowBareNames?: boolean;
creatorNames?: Array<string>;
enableSuffixHeuristic?: boolean;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'forbid-signal-update-in-computed': import("@typescript-eslint/utils/ts-eslint").RuleModule<"noSignalWriteInComputed" | "noBatchedWritesInComputed", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
noSignalWriteInComputed?: "error" | "warn" | "off";
noBatchedWritesInComputed?: "error" | "warn" | "off";
};
suffix?: string;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-batch-updates': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useBatch" | "suggestUseBatch" | "addBatchImport" | "wrapWithBatch" | "useBatchSuggestion" | "removeUnnecessaryBatch" | "nonUpdateSignalInBatch" | "updatesSeparatedByCode", [{
minUpdates?: number;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
useBatch?: "error" | "warn" | "off";
suggestUseBatch?: "error" | "warn" | "off";
addBatchImport?: "error" | "warn" | "off";
wrapWithBatch?: "error" | "warn" | "off";
useBatchSuggestion?: "error" | "warn" | "off";
removeUnnecessaryBatch?: "error" | "warn" | "off";
nonUpdateSignalInBatch?: "error" | "warn" | "off";
updatesSeparatedByCode?: "error" | "warn" | "off";
};
extraSignalModules?: Array<string>;
detection?: {
allowSingleReads?: number;
allowNonTrivialBetween?: number;
ignoreUpdateCalls?: boolean;
};
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-computed': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferComputedWithSignal" | "preferComputedWithSignals" | "suggestComputed" | "addComputedImport" | "suggestAddComputedImport", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
preferComputedWithSignal?: "error" | "warn" | "off";
preferComputedWithSignals?: "error" | "warn" | "off";
suggestComputed?: "error" | "warn" | "off";
addComputedImport?: "error" | "warn" | "off";
suggestAddComputedImport?: "error" | "warn" | "off";
};
suffix?: string;
extraCreatorModules?: Array<string>;
rename?: boolean;
accessors?: {
jsx?: "auto" | "value" | "none";
inComponent?: "value" | "peek";
outsideComponent?: "peek" | "value";
};
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-for-over-map': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferForOverMap" | "suggestForComponent" | "addForImport", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
preferForOverMap?: "error" | "warn" | "off";
suggestForComponent?: "error" | "warn" | "off";
addForImport?: "error" | "warn" | "off";
};
suffix?: string;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-signal-effect': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferSignalEffect" | "suggestEffect" | "addEffectImport" | "mixedDeps", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
preferSignalEffect?: "error" | "warn" | "off";
suggestEffect?: "error" | "warn" | "off";
addEffectImport?: "error" | "warn" | "off";
mixedDeps?: "error" | "warn" | "off";
};
suffix?: string;
reportMixedDeps?: boolean;
extraCreatorModules?: Array<string>;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-signal-in-jsx': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferDirectSignalUsage", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
preferDirectSignalUsage?: "error" | "warn" | "off";
};
suffix?: string;
extraCreatorModules?: Array<string>;
extraCreatorNames?: Array<string>;
extraCreatorNamespaces?: Array<string>;
suggestOnly?: boolean;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-signal-methods': import("@typescript-eslint/utils/ts-eslint").RuleModule<"usePeekInEffect" | "preferPeekInNonReactiveContext", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
usePeekInEffect?: "error" | "warn" | "off";
preferPeekInNonReactiveContext?: "error" | "warn" | "off";
};
suffix?: string;
extraCreatorModules?: Array<string>;
reactiveEffectCallees?: Array<string>;
effectsSuggestionOnly?: boolean;
typeAware?: boolean;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-signal-reads': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useValueInNonJSX", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
useValueInNonJSX?: "error" | "warn" | "off";
};
suffix?: string;
consumers?: Array<string>;
typeAware?: boolean;
extraCreatorModules?: Array<string>;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-use-signal-over-use-state': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferUseSignal" | "addUseSignalImport" | "convertToUseSignal", [{
ignoreComplexInitializers?: boolean;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
preferUseSignal?: "error" | "warn" | "off";
addUseSignalImport?: "error" | "warn" | "off";
convertToUseSignal?: "error" | "warn" | "off";
};
suffix?: string;
extraCreatorModules?: Array<string>;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-use-signal-ref-over-use-ref': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferUseSignalRef" | "addUseSignalRefImport" | "convertToUseSignalRef", [{
onlyWhenReadInRender?: boolean;
renameRef?: boolean;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
preferUseSignalRef?: "error" | "warn" | "off";
addUseSignalRefImport?: "error" | "warn" | "off";
convertToUseSignalRef?: "error" | "warn" | "off";
};
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-use-computed-in-react-component': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferUseComputedInComponent" | "suggestUseComputed" | "addUseComputedImport", [{
performance?: import("./utils/types.js").PerformanceBudget;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-use-signal-effect-in-react-component': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferUseSignalEffectInComponent" | "suggestUseSignalEffect" | "addUseSignalEffectImport", [{
performance?: import("./utils/types.js").PerformanceBudget;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'prefer-show-over-ternary': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferShowOverTernary" | "suggestShowComponent" | "addShowImport", [{
minComplexity?: number;
signalNames?: Array<string>;
suffix?: string;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
preferShowOverTernary?: "error" | "warn" | "off";
suggestShowComponent?: "error" | "warn" | "off";
addShowImport?: "error" | "warn" | "off";
};
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'signal-variable-name': import("@typescript-eslint/utils/ts-eslint").RuleModule<"invalidSignalName" | "invalidComputedName", [{
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
invalidSignalName?: "error" | "warn" | "off";
invalidComputedName?: "error" | "warn" | "off";
};
suffix?: string;
renameOnly?: boolean;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'warn-on-unnecessary-untracked': import("@typescript-eslint/utils/ts-eslint").RuleModule<"unnecessaryUntracked" | "unnecessaryPeek" | "suggestRemoveUntracked" | "suggestRemovePeek", [{
allowInEffects?: boolean;
allowInEventHandlers?: boolean;
allowForSignalWrites?: boolean;
suffix?: string;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
unnecessaryUntracked?: "error" | "warn" | "off";
unnecessaryPeek?: "error" | "warn" | "off";
suggestRemoveUntracked?: "error" | "warn" | "off";
suggestRemovePeek?: "error" | "warn" | "off";
};
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
};
configs: {
'recommended-legacy': {
plugins: string[];
rules: {
'react-hooks/exhaustive-deps': "off";
'exhaustive-deps': "error";
'no-mutation-in-render': "error";
'no-signal-assignment-in-effect': "error";
'no-non-signal-with-signal-suffix': "error";
'no-signal-creation-in-component': "error";
'require-use-signals': "error";
'restrict-signal-locations': "error";
'forbid-signal-destructuring': "error";
'forbid-signal-re-assignment': "error";
'forbid-signal-update-in-computed': "error";
'prefer-batch-updates': "error";
'prefer-computed': "error";
'prefer-for-over-map': "error";
'prefer-signal-effect': "error";
'prefer-signal-in-jsx': "error";
'prefer-signal-methods': "error";
'prefer-signal-reads': "error";
'prefer-use-signal-over-use-state': "error";
'prefer-use-signal-ref-over-use-ref': "error";
'prefer-use-computed-in-react-component': "error";
'prefer-use-signal-effect-in-react-component': "error";
'prefer-show-over-ternary': "error";
'signal-variable-name': "error";
'warn-on-unnecessary-untracked': "error";
};
};
recommended: {
name: string;
plugins: {
readonly 'react-signals-hooks': /*elided*/ any;
};
rules: {
'react-hooks/exhaustive-deps': "off";
'exhaustive-deps': "error";
'no-mutation-in-render': "error";
'no-signal-assignment-in-effect': "error";
'no-non-signal-with-signal-suffix': "error";
'no-signal-creation-in-component': "error";
'require-use-signals': "error";
'restrict-signal-locations': "error";
'forbid-signal-destructuring': "error";
'forbid-signal-re-assignment': "error";
'forbid-signal-update-in-computed': "error";
'prefer-batch-updates': "error";
'prefer-computed': "error";
'prefer-for-over-map': "error";
'prefer-signal-effect': "error";
'prefer-signal-in-jsx': "error";
'prefer-signal-methods': "error";
'prefer-signal-reads': "error";
'prefer-use-signal-over-use-state': "error";
'prefer-use-signal-ref-over-use-ref': "error";
'prefer-use-computed-in-react-component': "error";
'prefer-use-signal-effect-in-react-component': "error";
'prefer-show-over-ternary': "error";
'signal-variable-name': "error";
'warn-on-unnecessary-untracked': "error";
};
};
'recommended-latest': {
name: string;
plugins: {
readonly 'react-signals-hooks': /*elided*/ any;
};
rules: {
'react-hooks/exhaustive-deps': "off";
'exhaustive-deps': "error";
'no-mutation-in-render': "error";
'no-signal-assignment-in-effect': "error";
'no-non-signal-with-signal-suffix': "error";
'no-signal-creation-in-component': "error";
'require-use-signals': "error";
'restrict-signal-locations': "error";
'forbid-signal-destructuring': "error";
'forbid-signal-re-assignment': "error";
'forbid-signal-update-in-computed': "error";
'prefer-batch-updates': "error";
'prefer-computed': "error";
'prefer-for-over-map': "error";
'prefer-signal-effect': "error";
'prefer-signal-in-jsx': "error";
'prefer-signal-methods': "error";
'prefer-signal-reads': "error";
'prefer-use-signal-over-use-state': "error";
'prefer-use-signal-ref-over-use-ref': "error";
'prefer-use-computed-in-react-component': "error";
'prefer-use-signal-effect-in-react-component': "error";
'prefer-show-over-ternary': "error";
'signal-variable-name': "error";
'warn-on-unnecessary-untracked': "error";
};
};
};
};
declare const configs: {
'recommended-legacy': {
plugins: string[];
rules: {
'react-hooks/exhaustive-deps': "off";
'exhaustive-deps': "error";
'no-mutation-in-render': "error";
'no-signal-assignment-in-effect': "error";
'no-non-signal-with-signal-suffix': "error";
'no-signal-creation-in-component': "error";
'require-use-signals': "error";
'restrict-signal-locations': "error";
'forbid-signal-destructuring': "error";
'forbid-signal-re-assignment': "error";
'forbid-signal-update-in-computed': "error";
'prefer-batch-updates': "error";
'prefer-computed': "error";
'prefer-for-over-map': "error";
'prefer-signal-effect': "error";
'prefer-signal-in-jsx': "error";
'prefer-signal-methods': "error";
'prefer-signal-reads': "error";
'prefer-use-signal-over-use-state': "error";
'prefer-use-signal-ref-over-use-ref': "error";
'prefer-use-computed-in-react-component': "error";
'prefer-use-signal-effect-in-react-component': "error";
'prefer-show-over-ternary': "error";
'signal-variable-name': "error";
'warn-on-unnecessary-untracked': "error";
};
};
recommended: {
name: string;
plugins: {
readonly 'react-signals-hooks': {
meta: {
name: string;
};
rules: {
readonly 'exhaustive-deps': import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingDependencies" | "missingDependency" | "unnecessaryDependencies" | "unnecessaryDependency" | "duplicateDependencies" | "duplicateDependency" | "unknownDependencies" | "asyncEffect" | "missingEffectCallback" | "staleAssignmentDependency" | "staleAssignmentLiteral" | "staleAssignmentExpression" | "staleAssignmentUnstable" | "spreadElementInDependencyArray" | "useEffectEventInDependencyArray" | "addAllDependencies" | "addSingleDependency" | "removeDependencyArray" | "addDependencies" | "removeDependency" | "removeSingleDependency" | "removeAllDuplicates" | "removeAllUnnecessaryDependencies" | "removeThisDuplicate" | "dependencyWithoutSignal" | "notArrayLiteral" | "moveInsideEffect", [{
additionalHooks?: string | undefined;
unsafeAutofix?: boolean;
experimental_autoDependenciesHooks?: Array<string>;
requireExplicitEffectDeps?: boolean;
enableAutoFixForMemoAndCallback?: boolean;
performance?: import("./utils/types.js").PerformanceBudget;
severity?: {
missingDependencies?: "error" | "warn" | "off";
missingDependency?: "error" | "warn" | "off";
unnecessaryDependencies?: "error" | "warn" | "off";
unnecessaryDependency?: "error" | "warn" | "off";
duplicateDependencies?: "error" | "warn" | "off";
duplicateDependency?: "error" | "warn" | "off";
unknownDependencies?: "error" | "warn" | "off";
asyncEffect?: "error" | "warn" | "off";
missingEffectCallback?: "error" | "warn" | "off";
staleAssignmentDependency?: "error" | "warn" | "off";
staleAssignmentLiteral?: "error" | "warn" | "off";
staleAssignmentExpression?: "error" | "warn" | "off";
staleAssignmentUnstable?: "error" | "warn" | "off";
spreadElementInDependencyArray?: "error" | "warn" | "off";
useEffectEventInDependencyArray?: "error" | "warn" | "off";
addAllDependencies?: "error" | "warn" | "off";
addSingleDependency?: "error" | "warn" | "off";
removeDependencyArray?: "error" | "warn" | "off";
addDependencies?: "error" | "warn" | "off";
removeDependency?: "error" | "warn" | "off";
removeSingleDependency?: "error" | "warn" | "off";
removeAllDuplicates?: "error" | "warn" | "off";
removeAllUnnecessaryDependencies?: "error" | "warn" | "off";
removeThisDuplicate?: "error" | "warn" | "off";
dependencyWithoutSignal?: "error" | "warn" | "off";
notArrayLiteral?: "error" | "warn" | "off";
moveInsideEffect?: "error" | "warn" | "off";
};
suffix?: string;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'no-mutation-in-render': import("@typescript-eslint/utils/ts-eslint").RuleModule<"signalValueAssignment" | "signalValueUpdate" | "signalPropertyAssignment" | "suggestUseEffect" | "suggestEventHandler" | "signalArrayIndexAssignment" | "signalNestedPropertyAssignment", [{
signalNames?: Array<string>;
allowedPatterns?: Array<string>;
severity?: {
signalValueAssignment?: "error" | "warn" | "off";
signalValueUpdate?: "error" | "warn" | "off";
signalPropertyAssignment?: "error" | "warn" | "off";
suggestUseEffect?: "error" | "warn" | "off";
suggestEventHandler?: "error" | "warn" | "off";
signalArrayIndexAssignment?: "error" | "warn" | "off";
signalNestedPropertyAssignment?: "error" | "warn" | "off";
};
unsafeAutofix?: boolean;
suffix?: string;
performance?: import("./utils/types.js").PerformanceBudget;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'no-signal-assignment-in-effect': import("@typescript-eslint/utils/ts-eslint").RuleModule<"avoidSignalAssignmentInEffect" | "suggestUseSignalsEffect" | "suggestUseSignalsLayoutEffect" | "avoidSignalAssignmentInLayoutEffect", [{
signalNames?: Array<string>;
allowedPatterns?: Array<string>;
severity?: {
avoidSignalAssignmentInEffect?: "error" | "warn" | "off";
suggestUseSignalsEffect?: "error" | "warn" | "off";
suggestUseSignalsLayoutEffect?: "error" | "warn" | "off";
avoidSignalAssignmentInLayoutEffect?: "error" | "warn" | "off";
};
performance?: import("./utils/types.js").PerformanceBudget;
}?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
readonly 'no-non-signal-with-signal-suffix': import("@typescript-eslint/utils/ts-eslint").RuleModule<"variableWithSignalSuffixNotSignal" | "parameterWithSignalSuffixNotSignal" | "propertyWithSignalSuffixNotSignal" | "suggestRenameWithoutSuffix" |