diff --git a/.pkgs/configs/eslint.js b/.pkgs/configs/eslint.js index 3f6ac1f95..8928aa085 100644 --- a/.pkgs/configs/eslint.js +++ b/.pkgs/configs/eslint.js @@ -54,13 +54,13 @@ export const typescript = tseslint.config({ "no-mixed-operators": "warn", "no-undef": "off", "prefer-object-has-own": "error", - // "no-restricted-syntax": [ - // "error", - // { - // message: "no optional", - // selector: "TSPropertySignature[optional=true]", - // }, - // ], + "no-restricted-syntax": [ + "error", + { + message: "no typescript named import", + selector: "ImportDeclaration[source.value='typescript'] ImportSpecifier", + }, + ], "@typescript-eslint/ban-ts-comment": [ "error", { diff --git a/.pkgs/configs/eslint.ts b/.pkgs/configs/eslint.ts index a587ee9e5..62257190a 100644 --- a/.pkgs/configs/eslint.ts +++ b/.pkgs/configs/eslint.ts @@ -64,13 +64,13 @@ export const typescript: ConfigArray = tseslint.config( "no-undef": "off", "prefer-object-has-own": "error", - // "no-restricted-syntax": [ - // "error", - // { - // message: "no optional", - // selector: "TSPropertySignature[optional=true]", - // }, - // ], + "no-restricted-syntax": [ + "error", + { + message: "no typescript named import", + selector: "ImportDeclaration[source.value='typescript'] ImportSpecifier", + }, + ], "@typescript-eslint/ban-ts-comment": [ "error", diff --git a/packages/plugins/eslint-plugin-react-debug/src/rules/jsx.spec.ts b/packages/plugins/eslint-plugin-react-debug/src/rules/jsx.spec.ts index 2966d705b..6caf332e7 100644 --- a/packages/plugins/eslint-plugin-react-debug/src/rules/jsx.spec.ts +++ b/packages/plugins/eslint-plugin-react-debug/src/rules/jsx.spec.ts @@ -1,9 +1,9 @@ +import { JsxConfig } from "@eslint-react/kit"; import { RuleTester } from "@typescript-eslint/rule-tester"; + import tsx from "dedent"; -import { JsxEmit } from "typescript"; import { defaultLanguageOptionsWithTypes, getProjectForJsxEmit } from "../../../../../test"; - import { stringify } from "../utils"; import rule, { RULE_NAME } from "./jsx"; @@ -12,7 +12,7 @@ const ruleTester = new RuleTester({ ...defaultLanguageOptionsWithTypes, parserOptions: { ...defaultLanguageOptionsWithTypes.parserOptions, - project: getProjectForJsxEmit(JsxEmit.ReactJSX), + project: getProjectForJsxEmit(JsxConfig.JsxEmit.ReactJSX), projectService: false, }, }, diff --git a/packages/plugins/eslint-plugin-react-debug/src/rules/jsx.ts b/packages/plugins/eslint-plugin-react-debug/src/rules/jsx.ts index 622df00f0..a75098e4f 100644 --- a/packages/plugins/eslint-plugin-react-debug/src/rules/jsx.ts +++ b/packages/plugins/eslint-plugin-react-debug/src/rules/jsx.ts @@ -5,9 +5,10 @@ import { flow } from "@eslint-react/eff"; import { JsxConfig, Reporter as RPT, type RuleContext, type RuleFeature } from "@eslint-react/kit"; import { AST_NODE_TYPES as T, type TSESTree } from "@typescript-eslint/types"; import { match, P } from "ts-pattern"; -import { JsxEmit } from "typescript"; import { createRule, stringify } from "../utils"; +const { JsxEmit } = JsxConfig; + export const RULE_NAME = "jsx"; export const RULE_FEATURES = [ diff --git a/packages/plugins/eslint-plugin-react-x/src/rules/jsx-uses-react.spec.ts b/packages/plugins/eslint-plugin-react-x/src/rules/jsx-uses-react.spec.ts index ea1c8786a..bd7864294 100644 --- a/packages/plugins/eslint-plugin-react-x/src/rules/jsx-uses-react.spec.ts +++ b/packages/plugins/eslint-plugin-react-x/src/rules/jsx-uses-react.spec.ts @@ -1,7 +1,7 @@ +import { JsxConfig } from "@eslint-react/kit"; import { RuleTester } from "@typescript-eslint/rule-tester"; -import tsx from "dedent"; -import { JsxEmit } from "typescript"; +import tsx from "dedent"; import { defaultLanguageOptionsWithTypes, getProjectForJsxEmit } from "../../../../../test"; import rule, { RULE_NAME } from "./jsx-uses-react"; @@ -10,7 +10,7 @@ const ruleTester = new RuleTester({ ...defaultLanguageOptionsWithTypes, parserOptions: { ...defaultLanguageOptionsWithTypes.parserOptions, - project: getProjectForJsxEmit(JsxEmit.React), + project: getProjectForJsxEmit(JsxConfig.JsxEmit.React), projectService: false, }, }, diff --git a/packages/plugins/eslint-plugin-react-x/src/rules/jsx-uses-react.ts b/packages/plugins/eslint-plugin-react-x/src/rules/jsx-uses-react.ts index d143d8e7c..c5861a122 100644 --- a/packages/plugins/eslint-plugin-react-x/src/rules/jsx-uses-react.ts +++ b/packages/plugins/eslint-plugin-react-x/src/rules/jsx-uses-react.ts @@ -3,9 +3,10 @@ import type { RuleListener } from "@typescript-eslint/utils/ts-eslint"; import type { CamelCase } from "string-ts"; import { JsxConfig, type RuleContext, type RuleFeature } from "@eslint-react/kit"; -import { JsxEmit } from "typescript"; import { createRule } from "../utils"; +const { JsxEmit } = JsxConfig; + export const RULE_NAME = "jsx-uses-react"; export const RULE_FEATURES = [] as const satisfies RuleFeature[]; diff --git a/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/README.md b/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/README.md index aafe2110f..b693c6d3f 100644 --- a/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/README.md +++ b/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/README.md @@ -6,9 +6,13 @@ # JsxConfig -## Type Aliases +## Interfaces -- [JsxConfig](type-aliases/JsxConfig.md) +- [JsxConfig](interfaces/JsxConfig.md) + +## Variables + +- [JsxEmit](variables/JsxEmit.md) ## Functions diff --git a/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/functions/getFromAnnotation.md b/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/functions/getFromAnnotation.md index 3e1b59ad7..2049a118d 100644 --- a/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/functions/getFromAnnotation.md +++ b/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/functions/getFromAnnotation.md @@ -6,7 +6,7 @@ # Function: getFromAnnotation() -> **getFromAnnotation**(`context`): [`JsxConfig`](../type-aliases/JsxConfig.md) +> **getFromAnnotation**(`context`): [`JsxConfig`](../interfaces/JsxConfig.md) Get JsxConfig from annotation @@ -20,6 +20,6 @@ The RuleContext ## Returns -[`JsxConfig`](../type-aliases/JsxConfig.md) +[`JsxConfig`](../interfaces/JsxConfig.md) JsxConfig diff --git a/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/functions/getFromContext.md b/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/functions/getFromContext.md index d31f22a22..842bf0b8e 100644 --- a/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/functions/getFromContext.md +++ b/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/functions/getFromContext.md @@ -26,7 +26,7 @@ JsxConfig ### jsx -> **jsx**: `JsxEmit` +> **jsx**: `4` \| `JsxEmit` ### jsxFactory diff --git a/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/functions/make.md b/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/functions/make.md index baa90ddfa..b2930db70 100644 --- a/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/functions/make.md +++ b/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/functions/make.md @@ -6,12 +6,12 @@ # Function: make() -> **make**(): [`JsxConfig`](../type-aliases/JsxConfig.md) +> **make**(): [`JsxConfig`](../interfaces/JsxConfig.md) Create a JsxConfig object ## Returns -[`JsxConfig`](../type-aliases/JsxConfig.md) +[`JsxConfig`](../interfaces/JsxConfig.md) JsxConfig diff --git a/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/interfaces/JsxConfig.md b/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/interfaces/JsxConfig.md new file mode 100644 index 000000000..504e15d6e --- /dev/null +++ b/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/interfaces/JsxConfig.md @@ -0,0 +1,31 @@ +[**@eslint-react/kit**](../../../../README.md) + +*** + +[@eslint-react/kit](../../../../README.md) / [JsxConfig](../README.md) / JsxConfig + +# Interface: JsxConfig + +## Properties + +### jsx? + +> `optional` **jsx**: `number` + +*** + +### jsxFactory? + +> `optional` **jsxFactory**: `string` + +*** + +### jsxFragmentFactory? + +> `optional` **jsxFragmentFactory**: `string` + +*** + +### jsxImportSource? + +> `optional` **jsxImportSource**: `string` diff --git a/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/type-aliases/JsxConfig.md b/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/type-aliases/JsxConfig.md deleted file mode 100644 index 55241b748..000000000 --- a/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/type-aliases/JsxConfig.md +++ /dev/null @@ -1,9 +0,0 @@ -[**@eslint-react/kit**](../../../../README.md) - -*** - -[@eslint-react/kit](../../../../README.md) / [JsxConfig](../README.md) / JsxConfig - -# Type Alias: JsxConfig - -> **JsxConfig** = [`Pick`](https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys)\<`CompilerOptions`, `"reactNamespace"` \| `"jsx"` \| `"jsxFactory"` \| `"jsxFragmentFactory"` \| `"jsxImportSource"`\> diff --git a/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/variables/JsxEmit.md b/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/variables/JsxEmit.md new file mode 100644 index 000000000..8c6eb995b --- /dev/null +++ b/packages/utilities/kit/docs/@eslint-react/namespaces/JsxConfig/variables/JsxEmit.md @@ -0,0 +1,35 @@ +[**@eslint-react/kit**](../../../../README.md) + +*** + +[@eslint-react/kit](../../../../README.md) / [JsxConfig](../README.md) / JsxEmit + +# Variable: JsxEmit + +> `const` **JsxEmit**: `object` + +## Type declaration + +### None + +> `readonly` **None**: `0` = `0` + +### Preserve + +> `readonly` **Preserve**: `1` = `1` + +### React + +> `readonly` **React**: `2` = `2` + +### ReactJSX + +> `readonly` **ReactJSX**: `4` = `4` + +### ReactJSXDev + +> `readonly` **ReactJSXDev**: `5` = `5` + +### ReactNative + +> `readonly` **ReactNative**: `3` = `3` diff --git a/packages/utilities/kit/src/JsxConfig/JsxConfig.ts b/packages/utilities/kit/src/JsxConfig/JsxConfig.ts index ee442abae..9566b3a29 100644 --- a/packages/utilities/kit/src/JsxConfig/JsxConfig.ts +++ b/packages/utilities/kit/src/JsxConfig/JsxConfig.ts @@ -1,21 +1,27 @@ +/* eslint-disable perfectionist/sort-objects */ import type { RuleContext } from "../types"; import { getOrElseUpdate } from "@eslint-react/eff"; -import { type CompilerOptions, JsxEmit } from "typescript"; import * as RE from "../RegExp"; -export type JsxConfig = Pick< - CompilerOptions, - // Specifies the object invoked for `createElement` and `__spread` when targeting `'react'` JSX emit. - | "reactNamespace" +export const JsxEmit = { + None: 0, + Preserve: 1, + React: 2, + ReactNative: 3, + ReactJSX: 4, + ReactJSXDev: 5, +} as const; + +export interface JsxConfig { // Specifies what JSX code is generated. - | "jsx" + jsx?: number; // Specifies the JSX factory function to use when targeting React JSX emit, e.g. `React.createElement` or `h`. - | "jsxFactory" + jsxFactory?: string; // Specifies the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. - | "jsxFragmentFactory" + jsxFragmentFactory?: string; // Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`. - | "jsxImportSource" ->; + jsxImportSource?: string; +} /** * Create a JsxConfig object diff --git a/test/rule-tester.ts b/test/rule-tester.ts index 702016718..ba935cb97 100644 --- a/test/rule-tester.ts +++ b/test/rule-tester.ts @@ -1,7 +1,7 @@ import { RuleTester, type RuleTesterConfig } from "@typescript-eslint/rule-tester"; import * as vitest from "vitest"; import { getFixturesRootDir } from "./helpers"; -import { JsxEmit } from "typescript"; +import ts from "typescript"; RuleTester.it = vitest.it; RuleTester.itOnly = vitest.it.only; @@ -39,17 +39,17 @@ export const ruleTesterWithTypes = new RuleTester({ languageOptions: defaultLanguageOptionsWithTypes, }); -export function getProjectForJsxEmit(jsxEmit: JsxEmit) { +export function getProjectForJsxEmit(jsxEmit: ts.JsxEmit) { switch (jsxEmit) { - case JsxEmit.None: - case JsxEmit.ReactJSX: - case JsxEmit.ReactJSXDev: + case ts.JsxEmit.None: + case ts.JsxEmit.ReactJSX: + case ts.JsxEmit.ReactJSXDev: return "tsconfig.json"; - case JsxEmit.React: + case ts.JsxEmit.React: return "tsconfig.jsx-react.json"; - case JsxEmit.ReactNative: + case ts.JsxEmit.ReactNative: return "tsconfig.jsx-react-native.json"; - case JsxEmit.Preserve: + case ts.JsxEmit.Preserve: return "tsconfig.jsx-preserve.json"; } }