mirror of https://github.com/vuejs/core.git
build: improve dts rollup output
This commit is contained in:
parent
2774ba5f0f
commit
dbe7109c8f
|
@ -77,6 +77,7 @@
|
||||||
"esbuild": "^0.17.4",
|
"esbuild": "^0.17.4",
|
||||||
"eslint": "^8.33.0",
|
"eslint": "^8.33.0",
|
||||||
"eslint-plugin-jest": "^27.2.1",
|
"eslint-plugin-jest": "^27.2.1",
|
||||||
|
"estree-walker": "^2.0.2",
|
||||||
"execa": "^4.0.2",
|
"execa": "^4.0.2",
|
||||||
"jsdom": "^21.1.0",
|
"jsdom": "^21.1.0",
|
||||||
"lint-staged": "^10.2.10",
|
"lint-staged": "^10.2.10",
|
||||||
|
|
|
@ -26,6 +26,7 @@ importers:
|
||||||
esbuild: ^0.17.4
|
esbuild: ^0.17.4
|
||||||
eslint: ^8.33.0
|
eslint: ^8.33.0
|
||||||
eslint-plugin-jest: ^27.2.1
|
eslint-plugin-jest: ^27.2.1
|
||||||
|
estree-walker: ^2.0.2
|
||||||
execa: ^4.0.2
|
execa: ^4.0.2
|
||||||
jsdom: ^21.1.0
|
jsdom: ^21.1.0
|
||||||
lint-staged: ^10.2.10
|
lint-staged: ^10.2.10
|
||||||
|
@ -75,6 +76,7 @@ importers:
|
||||||
esbuild: 0.17.5
|
esbuild: 0.17.5
|
||||||
eslint: 8.33.0
|
eslint: 8.33.0
|
||||||
eslint-plugin-jest: 27.2.1_4vsywjlpuriuw3tl5oq6zy5a64
|
eslint-plugin-jest: 27.2.1_4vsywjlpuriuw3tl5oq6zy5a64
|
||||||
|
estree-walker: 2.0.2
|
||||||
execa: 4.1.0
|
execa: 4.1.0
|
||||||
jsdom: 21.1.0
|
jsdom: 21.1.0
|
||||||
lint-staged: 10.5.4
|
lint-staged: 10.5.4
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
// @ts-check
|
// @ts-check
|
||||||
|
import { parse } from '@babel/parser'
|
||||||
import { existsSync, readdirSync, readFileSync } from 'fs'
|
import { existsSync, readdirSync, readFileSync } from 'fs'
|
||||||
|
import MagicString from 'magic-string'
|
||||||
import dts from 'rollup-plugin-dts'
|
import dts from 'rollup-plugin-dts'
|
||||||
|
import { walk } from 'estree-walker'
|
||||||
|
|
||||||
if (!existsSync('temp/packages')) {
|
if (!existsSync('temp/packages')) {
|
||||||
console.warn(
|
console.warn(
|
||||||
|
@ -31,14 +34,132 @@ export default readdirSync('temp/packages').map(pkg => {
|
||||||
})
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Patch the dts generated by rollup-plugin-dts
|
||||||
|
* 1. remove exports marked as @internal
|
||||||
|
* 2. Convert all types to inline exports
|
||||||
|
* and remove them from the big export {} declaration
|
||||||
|
* otherwise it gets weird in vitepress `defineComponent` call with
|
||||||
|
* "the inferred type cannot be named without a reference"
|
||||||
|
* 3. Append custom agumentations (jsx, macros)
|
||||||
* @returns {import('rollup').Plugin}
|
* @returns {import('rollup').Plugin}
|
||||||
*/
|
*/
|
||||||
function patchTypes(pkg) {
|
function patchTypes(pkg) {
|
||||||
return {
|
return {
|
||||||
name: 'patch-types',
|
name: 'patch-types',
|
||||||
renderChunk(code) {
|
renderChunk(code) {
|
||||||
// 1. TODO remove entries marked with @private
|
const s = new MagicString(code)
|
||||||
// 2. append pkg specific types
|
const ast = parse(code, {
|
||||||
|
plugins: ['typescript'],
|
||||||
|
sourceType: 'module'
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {import('@babel/types').Node} node
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
function removeInternal(node) {
|
||||||
|
if (
|
||||||
|
node.leadingComments &&
|
||||||
|
node.leadingComments.some(c => {
|
||||||
|
return c.type === 'CommentBlock' && /@internal\b/.test(c.value)
|
||||||
|
})
|
||||||
|
) {
|
||||||
|
/** @type {any} */
|
||||||
|
const n = node
|
||||||
|
let id
|
||||||
|
if (n.id && n.id.type === 'Identifier') {
|
||||||
|
id = n.id.name
|
||||||
|
} else if (n.key && n.key.type === 'Identifier') {
|
||||||
|
id = n.key.name
|
||||||
|
}
|
||||||
|
if (id) {
|
||||||
|
s.overwrite(
|
||||||
|
// @ts-ignore
|
||||||
|
node.leadingComments[0].start,
|
||||||
|
node.end,
|
||||||
|
`/* removed internal: ${id} */`
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
// @ts-ignore
|
||||||
|
s.remove(node.leadingComments[0].start, node.end)
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const shouldRemoveExport = new Set()
|
||||||
|
// pass 1: remove internals + add exports
|
||||||
|
for (const node of ast.program.body) {
|
||||||
|
if (
|
||||||
|
(node.type === 'TSTypeAliasDeclaration' ||
|
||||||
|
node.type === 'TSInterfaceDeclaration') &&
|
||||||
|
!node.id.name.startsWith(`_`)
|
||||||
|
) {
|
||||||
|
shouldRemoveExport.add(node.id.name)
|
||||||
|
if (!removeInternal(node)) {
|
||||||
|
// @ts-ignore
|
||||||
|
s.prependLeft(node.start, `export `)
|
||||||
|
// traverse further for internal properties
|
||||||
|
if (node.type === 'TSInterfaceDeclaration') {
|
||||||
|
node.body.body.forEach(removeInternal)
|
||||||
|
} else if (node.type === 'TSTypeAliasDeclaration') {
|
||||||
|
// @ts-ignore
|
||||||
|
walk(node.typeAnnotation, {
|
||||||
|
enter(node) {
|
||||||
|
// @ts-ignore
|
||||||
|
if (removeInternal(node)) this.skip()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (removeInternal(node)) {
|
||||||
|
if (node.type === 'VariableDeclaration') {
|
||||||
|
// declare const x
|
||||||
|
for (const decl of node.declarations) {
|
||||||
|
// @ts-ignore
|
||||||
|
shouldRemoveExport.add(decl.id.name)
|
||||||
|
}
|
||||||
|
} else if (
|
||||||
|
node.type === 'TSDeclareFunction' ||
|
||||||
|
node.type === 'TSEnumDeclaration'
|
||||||
|
) {
|
||||||
|
// declare function
|
||||||
|
// @ts-ignore
|
||||||
|
shouldRemoveExport.add(node.id.name)
|
||||||
|
} else {
|
||||||
|
throw new Error(
|
||||||
|
`unhandled export type marked as @internal: ${node.type}`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// pass 2: remove exports
|
||||||
|
for (const node of ast.program.body) {
|
||||||
|
if (node.type === 'ExportNamedDeclaration' && !node.source) {
|
||||||
|
for (let i = 0; i < node.specifiers.length; i++) {
|
||||||
|
const spec = node.specifiers[i]
|
||||||
|
if (
|
||||||
|
spec.type === 'ExportSpecifier' &&
|
||||||
|
shouldRemoveExport.has(spec.local.name)
|
||||||
|
) {
|
||||||
|
const next = node.specifiers[i + 1]
|
||||||
|
if (next) {
|
||||||
|
// @ts-ignore
|
||||||
|
s.remove(spec.start, next.start)
|
||||||
|
} else {
|
||||||
|
// last one
|
||||||
|
const prev = node.specifiers[i - 1]
|
||||||
|
// @ts-ignore
|
||||||
|
s.remove(prev ? prev.end : spec.start, spec.end)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
code = s.toString()
|
||||||
|
|
||||||
|
// append pkg specific types
|
||||||
const additionalTypeDir = `packages/${pkg}/types`
|
const additionalTypeDir = `packages/${pkg}/types`
|
||||||
if (existsSync(additionalTypeDir)) {
|
if (existsSync(additionalTypeDir)) {
|
||||||
code +=
|
code +=
|
||||||
|
|
|
@ -192,15 +192,15 @@ export async function constEnum() {
|
||||||
spec.exportKind !== 'type' &&
|
spec.exportKind !== 'type' &&
|
||||||
knowEnums.has(spec.local.name)
|
knowEnums.has(spec.local.name)
|
||||||
) {
|
) {
|
||||||
if (i === 0) {
|
|
||||||
// first
|
|
||||||
const next = node.specifiers[i + 1]
|
const next = node.specifiers[i + 1]
|
||||||
|
if (next) {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
s.remove(spec.start, next ? next.start : spec.end)
|
s.remove(spec.start, next.start)
|
||||||
} else {
|
} else {
|
||||||
// locate the end of prev
|
// last one
|
||||||
|
const prev = node.specifiers[i - 1]
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
s.remove(node.specifiers[i - 1].end, spec.end)
|
s.remove(prev ? prev.end : spec.start, spec.end)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue