createObjectProperty,
ForCodegenNode,
ElementCodegenNode,
- SlotOutletCodegenNode
+ SlotOutletCodegenNode,
+ SlotOutletNode
} from '../ast'
import { createCompilerError, ErrorCodes } from '../errors'
import {
: isTemplate &&
node.children.length === 1 &&
isSlotOutlet(node.children[0])
- ? node.children[0]
+ ? (node.children[0] as SlotOutletNode) // api-extractor somehow fails to infer this
: null
const keyProperty = keyProp
? createObjectProperty(
])
}
-export const isVSlot = (p: ElementNode['props'][0]): p is DirectiveNode =>
- p.type === NodeTypes.DIRECTIVE && p.name === 'slot'
+export function isVSlot(p: ElementNode['props'][0]): p is DirectiveNode {
+ return p.type === NodeTypes.DIRECTIVE && p.name === 'slot'
+}
-export const isTemplateNode = (
+export function isTemplateNode(
node: RootNode | TemplateChildNode
-): node is TemplateNode =>
- node.type === NodeTypes.ELEMENT && node.tagType === ElementTypes.TEMPLATE
+): node is TemplateNode {
+ return (
+ node.type === NodeTypes.ELEMENT && node.tagType === ElementTypes.TEMPLATE
+ )
+}
-export const isSlotOutlet = (
+export function isSlotOutlet(
node: RootNode | TemplateChildNode
-): node is SlotOutletNode =>
- node.type === NodeTypes.ELEMENT && node.tagType === ElementTypes.SLOT
+): node is SlotOutletNode {
+ return node.type === NodeTypes.ELEMENT && node.tagType === ElementTypes.SLOT
+}
export function injectProp(
node: ElementCodegenNode | ComponentCodegenNode | SlotOutletCodegenNode,
import { ComponentInternalInstance, currentInstance } from './component'
-import {
- VNode,
- NormalizedChildren,
- normalizeVNode,
- VNodeChild,
- VNodeChildren
-} from './vnode'
+import { VNode, NormalizedChildren, normalizeVNode, VNodeChild } from './vnode'
import { isArray, isFunction } from '@vue/shared'
import { ShapeFlags } from './shapeFlags'
import { warn } from './warning'
-export type Slot = (...args: any[]) => VNodeChildren
+export type Slot = (...args: any[]) => VNode[]
export type InternalSlots = {
[name: string]: Slot
export { getCurrentInstance } from './component'
// For custom renderers
-export { createRenderer } from './createRenderer'
+export { createRenderer, RootRenderFunction } from './createRenderer'
export { warn } from './warning'
export {
handleError,
return () => {
if (!slots.default) {
- return
+ return null
}
const children = slots.default()
export const Text = Symbol(__DEV__ ? 'Text' : undefined)
export const Comment = Symbol(__DEV__ ? 'Comment' : undefined)
-const Suspense = (__FEATURE_SUSPENSE__
- ? SuspenseImpl
- : null) as typeof SuspenseImpl
+// Export as {} to avoid circular type dependency between `suspense.ts` and
+// `createRenderer.ts` in exported types.
+// A circular type dependency causes tsc to generate d.ts with dynmaic import()
+// calls using realtive paths, which works for separate d.ts files, but will
+// fail after d.ts rollup with API Extractor.
+const Suspense = (__FEATURE_SUSPENSE__ ? SuspenseImpl : null) as {}
export { Suspense }
export type VNodeTypes =
"sideEffects": false,
"buildOptions": {
"name": "VueDOMRuntime",
- "formats": ["esm", "cjs", "global", "esm-browser"]
+ "formats": ["esm", "cjs", "global", "esm-browser"],
+ "dts": ["jsx.d.ts"]
},
"repository": {
"type": "git",
-import { createRenderer, warn } from '@vue/runtime-core'
+import {
+ createRenderer,
+ warn,
+ App,
+ RootRenderFunction
+} from '@vue/runtime-core'
import { nodeOps } from './nodeOps'
import { patchProp } from './patchProp'
// Importing from the compiler, will be tree-shaken in prod
import { isHTMLTag, isSVGTag } from '@vue/compiler-dom'
import { isFunction, isString } from '@vue/shared'
-const { render, createApp: baseCreateApp } = createRenderer<Node, Element>({
+const { render: baseRender, createApp: baseCreateApp } = createRenderer({
patchProp,
...nodeOps
})
-const createApp = () => {
+// use explicit type casts here to avoid import() calls in rolled-up d.ts
+export const render = baseRender as RootRenderFunction<Node, Element>
+
+export const createApp = (): App<Element> => {
const app = baseCreateApp()
if (__DEV__) {
return app
}
-export { render, createApp }
-
// DOM-only runtime helpers
export {
vModelText,
const formats = args.formats || args.f
const devOnly = args.devOnly || args.d
const prodOnly = !devOnly && (args.prodOnly || args.p)
+const buildTypes = args.t || args.types
const buildAllMatching = args.all || args.a
const lean = args.lean || args.l
const commit = execa.sync('git', ['rev-parse', 'HEAD']).stdout.slice(0, 7)
`NODE_ENV:${env}`,
`TARGET:${target}`,
formats ? `FORMATS:${formats}` : ``,
- args.types ? `TYPES:true` : ``,
+ buildTypes ? `TYPES:true` : ``,
prodOnly ? `PROD_ONLY:true` : ``,
lean ? `LEAN:true` : ``
]
{ stdio: 'inherit' }
)
- if (args.types && pkg.types) {
+ if (buildTypes && pkg.types) {
console.log()
console.log(
chalk.bold(chalk.yellow(`Rolling up type definitions for ${target}...`))
})
if (result.succeeded) {
+ // concat additional d.ts to rolled-up dts (mostly for JSX)
+ if (pkg.buildOptions.dts) {
+ const dtsPath = path.resolve(pkgDir, pkg.types)
+ const existing = await fs.readFile(dtsPath, 'utf-8')
+ const toAdd = await Promise.all(
+ pkg.buildOptions.dts.map(file => {
+ return fs.readFile(path.resolve(pkgDir, file), 'utf-8')
+ })
+ )
+ await fs.writeFile(dtsPath, existing + '\n' + toAdd.join('\n'))
+ }
console.log(
chalk.bold(chalk.green(`API Extractor completed successfully.`))
)