From 8e7d1bd47662ce98034a781f6a2d50070cce97a4 Mon Sep 17 00:00:00 2001 From: "guo.xu" Date: Fri, 19 Mar 2021 15:21:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0type=E6=89=93?= =?UTF-8?q?=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/plugin-cmd-roll-lib/package.json | 1 + .../src/bundler/bundler.ts | 13 ++- .../plugin-cmd-roll-lib/src/bundler/index.ts | 1 + .../src/bundler/rollTypes.ts | 29 ++++++ .../plugin-cmd-roll-lib/src/bundler/types.ts | 1 + packages/plugin-cmd-roll-lib/src/index.ts | 18 +--- .../src/resolveConfig/index.ts | 92 +++++++++++++------ 7 files changed, 112 insertions(+), 43 deletions(-) create mode 100644 packages/plugin-cmd-roll-lib/src/bundler/rollTypes.ts diff --git a/packages/plugin-cmd-roll-lib/package.json b/packages/plugin-cmd-roll-lib/package.json index 270c4d2..9a5dafb 100644 --- a/packages/plugin-cmd-roll-lib/package.json +++ b/packages/plugin-cmd-roll-lib/package.json @@ -43,6 +43,7 @@ "mime": "^2.5.2", "postcss": "^8.2.8", "rollup": "^2.40.0", + "rollup-plugin-dts": "^3.0.1", "semver": "^7.3.4", "terser": "^5.6.0", "url": "^0.11.0" diff --git a/packages/plugin-cmd-roll-lib/src/bundler/bundler.ts b/packages/plugin-cmd-roll-lib/src/bundler/bundler.ts index 83da6c6..02ee79a 100644 --- a/packages/plugin-cmd-roll-lib/src/bundler/bundler.ts +++ b/packages/plugin-cmd-roll-lib/src/bundler/bundler.ts @@ -26,7 +26,8 @@ async function doBuild(ops: IRollupBuildOps) { isWrite = true, inputConfig, outputConfigs, - alwaysEmptyDistDir + alwaysEmptyDistDir, + skipEmptyDistDir = false } = ops if (isWatch) { logger.debug(`do watch: `) @@ -56,7 +57,8 @@ async function doBuild(ops: IRollupBuildOps) { await ensureDir( path.join(pkgRoot, outputConfigs[0].dir!), - alwaysEmptyDistDir + alwaysEmptyDistDir, + skipEmptyDistDir ) logger.debug(`start ${isWrite ? 'write' : 'generate'}`) for (const output of outputConfigs) { @@ -70,7 +72,12 @@ async function doBuild(ops: IRollupBuildOps) { } } -async function ensureDir(dir: string, alwaysEmptyDistDir = false) { +async function ensureDir( + dir: string, + alwaysEmptyDistDir = false, + skipEmptyDistDir = false +) { + if (skipEmptyDistDir) return if (fs.existsSync(dir) && fs.statSync(dir).isDirectory()) { const files = fs.readdirSync(dir) if (files.length > 0) { diff --git a/packages/plugin-cmd-roll-lib/src/bundler/index.ts b/packages/plugin-cmd-roll-lib/src/bundler/index.ts index 8727ebe..b9ad4fc 100644 --- a/packages/plugin-cmd-roll-lib/src/bundler/index.ts +++ b/packages/plugin-cmd-roll-lib/src/bundler/index.ts @@ -1,2 +1,3 @@ export { rollupBundler } from './bundler' +export { rollTypes, TypesDir } from './rollTypes' export * from './types' diff --git a/packages/plugin-cmd-roll-lib/src/bundler/rollTypes.ts b/packages/plugin-cmd-roll-lib/src/bundler/rollTypes.ts new file mode 100644 index 0000000..e0feb21 --- /dev/null +++ b/packages/plugin-cmd-roll-lib/src/bundler/rollTypes.ts @@ -0,0 +1,29 @@ +import type { IPluginAPI } from '@xus/cli-types' +import type { IRollupBuildOps } from '.' +import { runCmd, removeDirOrFile } from '@xus/cli-shared' +import { generateTypeOps } from '../resolveConfig' +import { rollupBundler } from '.' + +export const TypesDir = 'xus_type' +export async function rollTypes( + pkgRoot: string, + buildOps: IRollupBuildOps, + api: IPluginAPI +) { + const res = await runCmd( + 'npx', + ['tsc', '--emitDeclarationOnly', '--outDir', TypesDir], + { + start: 'generate types start', + succeed: 'generate types succeed', + failed: 'generate types failed' + } + ) + if (!res) return + const ops = generateTypeOps(pkgRoot, buildOps, api) + if (ops) { + api.logger.debug(`[rollup types] with `, ops) + await rollupBundler(ops) + await removeDirOrFile([api.getPathBasedOnCtx(TypesDir)]) + } +} diff --git a/packages/plugin-cmd-roll-lib/src/bundler/types.ts b/packages/plugin-cmd-roll-lib/src/bundler/types.ts index 31c00e2..997ad38 100644 --- a/packages/plugin-cmd-roll-lib/src/bundler/types.ts +++ b/packages/plugin-cmd-roll-lib/src/bundler/types.ts @@ -7,6 +7,7 @@ export interface IRollupBuildOps { isWrite: boolean pkgRoot: string alwaysEmptyDistDir: boolean + skipEmptyDistDir?: boolean } export type IRollupBuildFn = (ops: IRollupBuildOps) => Promise diff --git a/packages/plugin-cmd-roll-lib/src/index.ts b/packages/plugin-cmd-roll-lib/src/index.ts index b2f7236..9b3ce60 100644 --- a/packages/plugin-cmd-roll-lib/src/index.ts +++ b/packages/plugin-cmd-roll-lib/src/index.ts @@ -1,7 +1,7 @@ import { createPlugin } from '@xus/cli-types' import { chalk, runCmd } from '@xus/cli-shared' import { basename } from 'path' -import { rollupBundler } from './bundler' +import { rollupBundler, rollTypes } from './bundler' import { resolveConfig, generateBuildOps } from './resolveConfig' import { modifyConfig } from './modify' // config @@ -58,18 +58,10 @@ export default createPlugin({ // to rollup api.logger.info(chalk.yellow(`running for ${basename(pkg)}`)) await rollupBundler(buildOps) - // if (resolvedConfig.rollTypes) { - // api.logger.debug(`roll types `) - // await runCmd( - // 'npx', - // ['tsc', '--emitDeclarationOnly', '--outDir', 'xus_type'], - // { - // start: 'generate types start', - // succeed: 'generate types succeed', - // failed: 'generate types failed' - // } - // ) - // } + if (resolvedConfig.rollTypes) { + api.logger.debug(`rollup types `) + rollTypes(pkg, buildOps, api) + } process.chdir(saveCwd) } diff --git a/packages/plugin-cmd-roll-lib/src/resolveConfig/index.ts b/packages/plugin-cmd-roll-lib/src/resolveConfig/index.ts index 6040e76..5ce085c 100644 --- a/packages/plugin-cmd-roll-lib/src/resolveConfig/index.ts +++ b/packages/plugin-cmd-roll-lib/src/resolveConfig/index.ts @@ -2,7 +2,9 @@ import { IArgs, IPluginAPI } from '@xus/cli-types' import { IRollupBuildOps } from '../bundler' import { IRollLibConfig, IResolvedConfig } from '../types' import { isLernaPkg, orderBy, getFileMeta } from '@xus/cli-shared' -import { relative, join, isAbsolute, extname } from 'path' +import { relative, join, isAbsolute, extname, basename } from 'path' +import { TypesDir } from '../bundler' +import dts from 'rollup-plugin-dts' export function resolveConfig( args: IArgs, @@ -103,17 +105,11 @@ export async function generateBuildOps( inputOps.preserveEntrySignatures = 'strict' // input to absolute if (!inputOps.input && !resolvedConfig.entry) { - const fileMeta = - getFileMeta({ - base: api.cwd, - filenameWithoutExt: 'index', - type: 'lib' - }) || - getFileMeta({ - base: api.getPathBasedOnCtx('src'), - filenameWithoutExt: 'index', - type: 'lib' - }) + const fileMeta = getFileMeta({ + base: api.getPathBasedOnCtx('src'), + filenameWithoutExt: 'index', + type: 'lib' + }) const entry = fileMeta?.path if (!entry) { throw new Error(`[generate buildOps] lib-build should have a entry`) @@ -168,18 +164,60 @@ export async function generateBuildOps( } } -// const tsRE = /\.tsx?$/ -// export function generateTypeOps( -// pkgRoot: string, -// buildOps: IRollupBuildOps, -// api: IPluginAPI -// ) { -// const entry = buildOps.inputConfig.input -// const input = `` -// if (entry) { -// if (typeof entry === 'string' && tsRE.test(entry)) { -// const ext = extname(entry) -// // input = `${entry.slice(0, -ext.length)}.d.ts`.replace() -// } -// } -// } +const tsRE = /\.tsx?$/ +export function generateTypeOps( + pkgRoot: string, + buildOps: IRollupBuildOps, + api: IPluginAPI +): IRollupBuildOps | null { + const entry = buildOps.inputConfig.input + let inputs: Record = {} + if (entry) { + if (typeof entry === 'string' && tsRE.test(entry)) { + const ext = extname(entry) + const bn = basename(entry) + inputs[bn.slice(0, -ext.length)] = entry + } + if (!Array.isArray(entry) && typeof entry !== 'string') { + inputs = { + ...inputs, + ...entry + } + } + const tempRoot = join(pkgRoot, TypesDir) + Object.keys(inputs).forEach((key) => { + const i = inputs[key] + let r = relative(pkgRoot, i) + if (tsRE.test(r)) { + if (r.startsWith('src')) { + r = relative('src', r) + } + const ext = extname(r) + inputs[key] = join(tempRoot, `${r.slice(0, -ext.length)}.d.ts`) + } else { + delete inputs[key] + } + }) + api.logger.debug(`[generate types options] types entry: `) + api.logger.debug(inputs) + return { + inputConfig: { + input: inputs, + plugins: [dts()] + }, + outputConfigs: [ + { + dir: buildOps.outputConfigs?.[0]?.dir || 'dist', + format: 'es', + entryFileNames: `[name].d.ts` + } + ], + isWatch: buildOps.isWatch, + isWrite: true, + pkgRoot, + alwaysEmptyDistDir: false, + skipEmptyDistDir: true + } + } + return null +}