mirror of https://github.com/vuejs/core.git
feat(types/jsx): support jsxImportSource, avoid global JSX conflict (#7958)
- No longer implicitly register global JSX types by default - This avoid conflict when using Vue in the same project with React - Global registration must now be done by explicitly importing / referencing `vue/jsx`, or listing it in `compilerOptions.types`. - Add `vue/jsx-runtime` to support `jsxImportSource` usage - Can enable globally by setting `compilerOptions.jsxImportSource` to `'vue'` - Can also opt-in per-file with `/** @jsxImportSource vue */`
This commit is contained in:
parent
9dd98f00f2
commit
d0b7ef3b61
|
@ -1,6 +1,9 @@
|
||||||
// This directory contains a number of d.ts assertions
|
// This directory contains a number of d.ts assertions
|
||||||
// use \@ts-expect-error where errors are expected.
|
// use \@ts-expect-error where errors are expected.
|
||||||
|
|
||||||
|
// register global JSX
|
||||||
|
import 'vue/jsx'
|
||||||
|
|
||||||
export function describe(_name: string, _fn: () => void): void
|
export function describe(_name: string, _fn: () => void): void
|
||||||
export function test(_name: string, _fn: () => any): void
|
export function test(_name: string, _fn: () => any): void
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
// Kanitkorn Sujautra <https://github.com/lukyth>
|
// Kanitkorn Sujautra <https://github.com/lukyth>
|
||||||
// Sebastian Silbermann <https://github.com/eps1lon>
|
// Sebastian Silbermann <https://github.com/eps1lon>
|
||||||
|
|
||||||
import { VNode } from '@vue/runtime-core'
|
|
||||||
import * as CSS from 'csstype'
|
import * as CSS from 'csstype'
|
||||||
|
|
||||||
export interface CSSProperties
|
export interface CSSProperties
|
||||||
|
@ -1021,7 +1020,7 @@ export interface SVGAttributes extends AriaAttributes, EventHandlers<Events> {
|
||||||
zoomAndPan?: string
|
zoomAndPan?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IntrinsicElementAttributes {
|
export interface IntrinsicElementAttributes {
|
||||||
a: AnchorHTMLAttributes
|
a: AnchorHTMLAttributes
|
||||||
abbr: HTMLAttributes
|
abbr: HTMLAttributes
|
||||||
address: HTMLAttributes
|
address: HTMLAttributes
|
||||||
|
@ -1320,43 +1319,3 @@ type EventHandlers<E> = {
|
||||||
? E[K]
|
? E[K]
|
||||||
: (payload: E[K]) => void
|
: (payload: E[K]) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
// use namespace import to avoid collision with generated types which use
|
|
||||||
// named imports.
|
|
||||||
import * as RuntimeCore from '@vue/runtime-core'
|
|
||||||
|
|
||||||
type ReservedProps = {
|
|
||||||
key?: string | number | symbol
|
|
||||||
ref?: RuntimeCore.VNodeRef
|
|
||||||
ref_for?: boolean
|
|
||||||
ref_key?: string
|
|
||||||
}
|
|
||||||
|
|
||||||
type ElementAttrs<T> = T & ReservedProps
|
|
||||||
|
|
||||||
type NativeElements = {
|
|
||||||
[K in keyof IntrinsicElementAttributes]: ElementAttrs<
|
|
||||||
IntrinsicElementAttributes[K]
|
|
||||||
>
|
|
||||||
}
|
|
||||||
|
|
||||||
declare global {
|
|
||||||
namespace JSX {
|
|
||||||
interface Element extends VNode {}
|
|
||||||
interface ElementClass {
|
|
||||||
$props: {}
|
|
||||||
}
|
|
||||||
interface ElementAttributesProperty {
|
|
||||||
$props: {}
|
|
||||||
}
|
|
||||||
interface IntrinsicElements extends NativeElements {
|
|
||||||
// allow arbitrary elements
|
|
||||||
// @ts-ignore suppress ts:2374 = Duplicate string index signature.
|
|
||||||
[name: string]: any
|
|
||||||
}
|
|
||||||
interface IntrinsicAttributes extends ReservedProps {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// suppress ts:2669
|
|
||||||
export {}
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
import { VNode, VNodeRef } from '@vue/runtime-dom'
|
||||||
|
import { IntrinsicElementAttributes } from './dom'
|
||||||
|
|
||||||
|
export type ReservedProps = {
|
||||||
|
key?: string | number | symbol
|
||||||
|
ref?: VNodeRef
|
||||||
|
ref_for?: boolean
|
||||||
|
ref_key?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export type NativeElements = {
|
||||||
|
[K in keyof IntrinsicElementAttributes]: IntrinsicElementAttributes[K] &
|
||||||
|
ReservedProps
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JSX namespace for usage with @jsxImportsSource directive
|
||||||
|
* when ts compilerOptions.jsx is 'react-jsx' or 'react-jsxdev'
|
||||||
|
* https://www.typescriptlang.org/tsconfig#jsxImportSource
|
||||||
|
*/
|
||||||
|
export { h as jsx, h as jsxDEV, Fragment } from '@vue/runtime-dom'
|
||||||
|
|
||||||
|
export namespace JSX {
|
||||||
|
export interface Element extends VNode {}
|
||||||
|
export interface ElementClass {
|
||||||
|
$props: {}
|
||||||
|
}
|
||||||
|
export interface ElementAttributesProperty {
|
||||||
|
$props: {}
|
||||||
|
}
|
||||||
|
export interface IntrinsicElements extends NativeElements {
|
||||||
|
// allow arbitrary elements
|
||||||
|
// @ts-ignore suppress ts:2374 = Duplicate string index signature.
|
||||||
|
[name: string]: any
|
||||||
|
}
|
||||||
|
export interface IntrinsicAttributes extends ReservedProps {}
|
||||||
|
export interface ElementChildrenAttribute {
|
||||||
|
$slots: {}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
const Vue = require('vue')
|
||||||
|
exports.jsx = Vue.h
|
||||||
|
exports.jsxDEV = Vue.h
|
||||||
|
exports.Fragment = Vue.Fragment
|
|
@ -0,0 +1 @@
|
||||||
|
export { h as jsx, h as jsxDEV, Fragment } from 'vue'
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"main": "index.js",
|
||||||
|
"module": "index.mjs",
|
||||||
|
"types": "index.d.ts"
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
// global JSX namespace registration
|
||||||
|
import { JSX as JSXInternal } from './jsx-runtime'
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
namespace JSX {
|
||||||
|
interface Element extends JSXInternal.Element {}
|
||||||
|
interface ElementClass extends JSXInternal.ElementClass {}
|
||||||
|
interface ElementAttributesProperty
|
||||||
|
extends JSXInternal.ElementAttributesProperty {}
|
||||||
|
interface IntrinsicElements extends JSXInternal.IntrinsicElements {}
|
||||||
|
interface IntrinsicAttributes extends JSXInternal.IntrinsicAttributes {}
|
||||||
|
interface ElementChildrenAttribute
|
||||||
|
extends JSXInternal.ElementChildrenAttribute {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export {}
|
|
@ -13,6 +13,8 @@
|
||||||
"dist",
|
"dist",
|
||||||
"compiler-sfc",
|
"compiler-sfc",
|
||||||
"server-renderer",
|
"server-renderer",
|
||||||
|
"jsx-runtime",
|
||||||
|
"jsx.d.ts",
|
||||||
"macros.d.ts",
|
"macros.d.ts",
|
||||||
"macros-global.d.ts",
|
"macros-global.d.ts",
|
||||||
"ref-macros.d.ts"
|
"ref-macros.d.ts"
|
||||||
|
@ -36,6 +38,14 @@
|
||||||
"import": "./compiler-sfc/index.mjs",
|
"import": "./compiler-sfc/index.mjs",
|
||||||
"require": "./compiler-sfc/index.js"
|
"require": "./compiler-sfc/index.js"
|
||||||
},
|
},
|
||||||
|
"./jsx-runtime": {
|
||||||
|
"types": "./jsx-runtime/index.d.ts",
|
||||||
|
"import": "./jsx-runtime/index.mjs",
|
||||||
|
"require": "./jsx-runtime/index.js"
|
||||||
|
},
|
||||||
|
"./jsx": {
|
||||||
|
"types": "./jsx.d.ts"
|
||||||
|
},
|
||||||
"./dist/*": "./dist/*",
|
"./dist/*": "./dist/*",
|
||||||
"./package.json": "./package.json",
|
"./package.json": "./package.json",
|
||||||
"./macros": "./macros.d.ts",
|
"./macros": "./macros.d.ts",
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
"packages/*/src",
|
"packages/*/src",
|
||||||
"packages/runtime-dom/types/jsx.d.ts",
|
"packages/runtime-dom/types/jsx.d.ts",
|
||||||
"packages/*/__tests__",
|
"packages/*/__tests__",
|
||||||
"packages/dts-test"
|
"packages/dts-test",
|
||||||
|
"packages/vue/jsx-runtime"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue