Repository: eslint/eslint
File: lib/types/rules/ecmascript-6.d.ts (TypeScript)

Code before:

/*
 * MIT License
 * Copyright (c) Microsoft Corporation.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE
 */

import { Linter } from "../index";

interface NoRestrictedImportPathCommonOptions {
    name: string;
    message?: string;
}

type EitherImportNamesOrAllowImportName =
  | { importNames?: string[]; allowImportNames?: never }
  | { allowImportNames?: string[]; importNames?: never }

type ValidNoRestrictedImportPathOptions = NoRestrictedImportPathCommonOptions & EitherImportNamesOrAllowImportName;

interface NoRestrictedImportPatternCommonOptions {
    message?: string;
    caseSensitive?: boolean;
}

// Base type for group or regex constraint, ensuring mutual exclusivity
type EitherGroupOrRegEx =
  | { group: string[]; regex?: never }
  | { regex: string; group?: never };

// Base type for import name specifiers, ensuring mutual exclusivity
type EitherNameSpecifiers = 
    | { importNames: string[]; allowImportNames?: never; importNamePattern?: never; allowImportNamePattern?: never }
    | { importNamePattern: string; allowImportNames?: never; importNames?: never; allowImportNamePattern?: never }
    | { allowImportNames: string[]; importNames?: never; importNamePattern?: never; allowImportNamePattern?: never }

Review comment (suggestion):
Sorry, I think I missed this before - I think it'd be good to `export` all the types in this file. That way they're easier for consumers to `import` ad hoc.

```suggestion
export interface NoRestrictedImportPathCommonOptions {
```

https://github.com/typescript-eslint/typescript-eslint/issues/7670 has points on more.

Code after:

/*
 * MIT License
 * Copyright (c) Microsoft Corporation.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE
 */

import { Linter } from "../index";

export interface NoRestrictedImportPathCommonOptions {
    name: string;
    message?: string;
}

export type EitherImportNamesOrAllowImportName =
  | { importNames?: string[]; allowImportNames?: never }
  | { allowImportNames?: string[]; importNames?: never }

export type ValidNoRestrictedImportPathOptions = NoRestrictedImportPathCommonOptions & EitherImportNamesOrAllowImportName;

export interface NoRestrictedImportPatternCommonOptions {
    message?: string;
    caseSensitive?: boolean;
}

// Base type for group or regex constraint, ensuring mutual exclusivity
export type EitherGroupOrRegEx =
  | { group: string[]; regex?: never }
  | { regex: string; group?: never };

// Base type for import name specifiers, ensuring mutual exclusivity
export type EitherNameSpecifiers = 
    | { importNames: string[]; allowImportNames?: never; importNamePattern?: never; allowImportNamePattern?: never }
    | { importNamePattern: string; allowImportNames?: never; importNames?: never; allowImportNamePattern?: never }
    | { allowImportNames: string[]; importNames?: never; importNamePattern?: never; allowImportNamePattern?: never }