From 518bbef8c5669e9859d17d88af6351f50c12ba26 Mon Sep 17 00:00:00 2001 From: "guo.xu" Date: Fri, 19 Mar 2021 20:38:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20rollup-chain=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- packages/cli-types/src/types.ts | 16 ++++-- packages/plugin-cmd-roll-lib/package.json | 2 +- .../src/bundler/bundler.ts | 10 ++-- .../src/bundler/rollTypes.ts | 2 +- .../plugin-cmd-roll-lib/src/bundler/types.ts | 1 + .../plugin-cmd-roll-lib/src/config/index.ts | 4 ++ packages/plugin-cmd-roll-lib/src/index.ts | 6 +-- packages/plugin-cmd-roll-lib/src/modify.ts | 14 +++-- .../src/resolveConfig/index.ts | 53 ++++++++++++------- packages/plugin-cmd-roll-lib/src/types.ts | 4 +- packages/plugin-lib-legacy/package.json | 1 - .../src/plugin/bundler/index.ts | 10 ++-- .../src/plugin/config/changelog.ts | 7 ++- xus.config.ts | 34 +++++++++++- 15 files changed, 116 insertions(+), 50 deletions(-) diff --git a/package.json b/package.json index 1f17f42..4263f24 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "scripts": { "test": "jest", "build": "npx xus lib-build", - "copy:preset": "xus copy --src packages/preset-built-in/src/plugin/template --dest packages/preset-built-in/dist/plugin/template", + "copy:preset": "xus copy --src packages/preset-built-in/src/plugin/template --dest packages/preset-built-in/dist/template", "copy:create": "xus copy --src packages/create-lib/src/template --dest packages/create-lib/dist/template" }, "devDependencies": { diff --git a/packages/cli-types/src/types.ts b/packages/cli-types/src/types.ts index 29eec13..7ae2b72 100644 --- a/packages/cli-types/src/types.ts +++ b/packages/cli-types/src/types.ts @@ -59,11 +59,15 @@ export interface IPluginAPI extends IPluginAPIBase { skipPlugin: IPluginManager['skipPlugin'] // rollup - modifyRollupConfig: IFastHookRegister<(rc: IRollupChain) => IRollupChain> - getRollupConfig: () => Promise + modifyRollupConfig: IFastHookRegister< + (rc: IRollupChain, arg?: any) => IRollupChain + > + getRollupConfig: (arg?: any) => Promise // webpack - modifyWebpackConfig: IFastHookRegister<(wc: webpackChain) => webpackChain> - getWebpackConfig: () => Promise + modifyWebpackConfig: IFastHookRegister< + (wc: webpackChain, arg?: any) => webpackChain + > + getWebpackConfig: (arg?: any) => Promise } // IConfig @@ -78,6 +82,7 @@ export interface IConfig extends IProjectConfig { libName: string target: 'esnext' | TransformOptions['target'] formats: ('esm' | 'cjs' | 'iife' | 'umd')[] + disableFormatPostfix: boolean rollTypes: boolean sourcemap: boolean minify: false | 'esbuild' | 'terser' @@ -120,6 +125,7 @@ export interface IConfig extends IProjectConfig { alias: Record replace: Record excludeExternal: string[] + external: string[] // lerna mode lerna: @@ -131,7 +137,7 @@ export interface IConfig extends IProjectConfig { } // insider - rollupChain: (rc: IRollupChain) => IRollupChain + rollupChain: (rc: IRollupChain, pkgDir: string) => IRollupChain afterBuild: ICmd[] } diff --git a/packages/plugin-cmd-roll-lib/package.json b/packages/plugin-cmd-roll-lib/package.json index ace5048..58df012 100644 --- a/packages/plugin-cmd-roll-lib/package.json +++ b/packages/plugin-cmd-roll-lib/package.json @@ -2,7 +2,7 @@ "name": "@xus/plugin-cmd-roll-lib", "version": "0.2.1", "description": "a bundle for js ts react", - "main": "dist/index.cjs.js", + "main": "dist/index.js", "typings": "dist/index.d.ts", "keywords": [ "cli", diff --git a/packages/plugin-cmd-roll-lib/src/bundler/bundler.ts b/packages/plugin-cmd-roll-lib/src/bundler/bundler.ts index 02ee79a..5f667aa 100644 --- a/packages/plugin-cmd-roll-lib/src/bundler/bundler.ts +++ b/packages/plugin-cmd-roll-lib/src/bundler/bundler.ts @@ -27,7 +27,8 @@ async function doBuild(ops: IRollupBuildOps) { inputConfig, outputConfigs, alwaysEmptyDistDir, - skipEmptyDistDir = false + skipEmptyDistDir = false, + disableConsoleInfo = false } = ops if (isWatch) { logger.debug(`do watch: `) @@ -63,9 +64,10 @@ async function doBuild(ops: IRollupBuildOps) { logger.debug(`start ${isWrite ? 'write' : 'generate'}`) for (const output of outputConfigs) { logger.debug(output) - logger.info( - chalk.green(`[${isWrite ? 'Write' : 'Generate'}] ${output.format}`) - ) + !disableConsoleInfo && + logger.info( + chalk.green(`[${isWrite ? 'Write' : 'Generate'}] ${output.format}`) + ) await bundler[isWrite ? 'write' : 'generate'](output) } await bundler.close() diff --git a/packages/plugin-cmd-roll-lib/src/bundler/rollTypes.ts b/packages/plugin-cmd-roll-lib/src/bundler/rollTypes.ts index e0feb21..864166b 100644 --- a/packages/plugin-cmd-roll-lib/src/bundler/rollTypes.ts +++ b/packages/plugin-cmd-roll-lib/src/bundler/rollTypes.ts @@ -20,7 +20,7 @@ export async function rollTypes( } ) if (!res) return - const ops = generateTypeOps(pkgRoot, buildOps, api) + const ops = generateTypeOps(pkgRoot, buildOps) if (ops) { api.logger.debug(`[rollup types] with `, ops) await rollupBundler(ops) diff --git a/packages/plugin-cmd-roll-lib/src/bundler/types.ts b/packages/plugin-cmd-roll-lib/src/bundler/types.ts index 997ad38..1c644ee 100644 --- a/packages/plugin-cmd-roll-lib/src/bundler/types.ts +++ b/packages/plugin-cmd-roll-lib/src/bundler/types.ts @@ -8,6 +8,7 @@ export interface IRollupBuildOps { pkgRoot: string alwaysEmptyDistDir: boolean skipEmptyDistDir?: boolean + disableConsoleInfo?: boolean } export type IRollupBuildFn = (ops: IRollupBuildOps) => Promise diff --git a/packages/plugin-cmd-roll-lib/src/config/index.ts b/packages/plugin-cmd-roll-lib/src/config/index.ts index 15189fd..c1d7c57 100644 --- a/packages/plugin-cmd-roll-lib/src/config/index.ts +++ b/packages/plugin-cmd-roll-lib/src/config/index.ts @@ -7,6 +7,7 @@ export const libBuildSchema = createSchema((joi) => minify: [joi.string(), joi.boolean()], target: [joi.string(), joi.array().items(joi.string())], formats: joi.array().items(joi.string()), + disableFormatPostfix: joi.boolean(), rollTypes: joi.boolean(), sourcemap: joi.boolean(), alwaysEmptyDistDir: joi.boolean(), @@ -27,6 +28,7 @@ export const libBuildSchema = createSchema((joi) => alias: joi.object(), replace: joi.object(), excludeExternal: joi.array().items(joi.string()), + external: joi.array().items(joi.string()), // lerna mode lerna: [ @@ -48,6 +50,7 @@ export const defaultLibBuildConfig: () => IRollLibConfig = () => { libName: 'index', target: 'esnext', formats: [], + disableFormatPostfix: false, rollTypes: true, sourcemap: false, minify: false, @@ -69,6 +72,7 @@ export const defaultLibBuildConfig: () => IRollLibConfig = () => { alias: {}, replace: {}, excludeExternal: [], + external: [], // lerna mode lerna: { diff --git a/packages/plugin-cmd-roll-lib/src/index.ts b/packages/plugin-cmd-roll-lib/src/index.ts index 9b3ce60..c8f4c40 100644 --- a/packages/plugin-cmd-roll-lib/src/index.ts +++ b/packages/plugin-cmd-roll-lib/src/index.ts @@ -38,10 +38,10 @@ export default createPlugin({ // default config should run before user modify api.logger.debug(`modify rollup config `) api.modifyRollupConfig({ - fn(rc) { + fn(rc, pkgDir) { modifyConfig(rc, resolvedConfig, api) if (resolvedConfig?.rollupChain) { - resolvedConfig.rollupChain(rc) + resolvedConfig.rollupChain(rc, pkgDir) } return rc }, @@ -60,7 +60,7 @@ export default createPlugin({ await rollupBundler(buildOps) if (resolvedConfig.rollTypes) { api.logger.debug(`rollup types `) - rollTypes(pkg, buildOps, api) + await rollTypes(pkg, buildOps, api) } process.chdir(saveCwd) } diff --git a/packages/plugin-cmd-roll-lib/src/modify.ts b/packages/plugin-cmd-roll-lib/src/modify.ts index db6e6eb..3cf86b7 100644 --- a/packages/plugin-cmd-roll-lib/src/modify.ts +++ b/packages/plugin-cmd-roll-lib/src/modify.ts @@ -105,7 +105,10 @@ export function modifyConfig( // external const excludeExternal = resolvedConfig.excludeExternal - getPkgDeps(api.cwd, excludeExternal).forEach((dep) => rc.external.set(dep)) + const external = resolvedConfig.external + getPkgDeps(api.cwd, external, excludeExternal).forEach((dep) => + rc.external.set(dep) + ) // onwarn rc.onwarn((warning, onwarn) => { @@ -119,7 +122,11 @@ function onRollupWarning(warning: RollupWarning, onwarn: WarningHandler) { onwarn(warning) } -function getPkgDeps(root: string, exclude: string[]): string[] { +function getPkgDeps( + root: string, + include: string[], + exclude: string[] +): string[] { let pkg = null try { pkg = require(join(root, 'package.json')) @@ -130,7 +137,8 @@ function getPkgDeps(root: string, exclude: string[]): string[] { if (pkg) { deps = [ ...Object.keys(pkg?.dependencies || {}), - ...Object.keys(pkg?.peerDependencies || {}) + ...Object.keys(pkg?.peerDependencies || {}), + ...include ].filter((dep) => !exclude.includes(dep)) } return deps diff --git a/packages/plugin-cmd-roll-lib/src/resolveConfig/index.ts b/packages/plugin-cmd-roll-lib/src/resolveConfig/index.ts index 5ce085c..d5a32db 100644 --- a/packages/plugin-cmd-roll-lib/src/resolveConfig/index.ts +++ b/packages/plugin-cmd-roll-lib/src/resolveConfig/index.ts @@ -1,7 +1,7 @@ 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 { isLernaPkg, orderBy, getFileMeta, Logger } from '@xus/cli-shared' import { relative, join, isAbsolute, extname, basename } from 'path' import { TypesDir } from '../bundler' import dts from 'rollup-plugin-dts' @@ -52,8 +52,8 @@ export function resolveConfig( pkgs = api.getLernaPkgs().map((p) => relative(lernaRoot, p)) } pkgs = orderBy(pkgs, pkgsOrder) - .map((p) => join(lernaRoot, p)) .filter((pkg) => !excludePkgs.includes(pkg)) + .map((p) => join(lernaRoot, p)) } } else { // simple pack @@ -90,16 +90,25 @@ export function resolveConfig( return resolvedConfig } +const buildLogger = new Logger(`xus:generate:build`) export async function generateBuildOps( pkgRoot: string, resolvedConfig: IResolvedConfig, api: IPluginAPI ): Promise { - const rollupConfig = await api.getRollupConfig() + const rollupConfig = await api.getRollupConfig(basename(pkgRoot)) const isProd = api.mode === 'production' - const { libName, outDir, formats, alwaysEmptyDistDir } = resolvedConfig + const { + libName, + outDir, + formats, + alwaysEmptyDistDir, + disableFormatPostfix + } = resolvedConfig if (rollupConfig) { - api.logger.debug(`[generate buildOps] in ${pkgRoot}`) + buildLogger.debug(`[generate buildOps] in ${pkgRoot}`) + buildLogger.debug(`rollup config input `, rollupConfig.input) + buildLogger.debug(`resolved config input `, resolvedConfig.entry) const { output, ...inputOps } = rollupConfig // TODO: support from rollup-chain inputOps.preserveEntrySignatures = 'strict' @@ -114,8 +123,9 @@ export async function generateBuildOps( if (!entry) { throw new Error(`[generate buildOps] lib-build should have a entry`) } else { - resolvedConfig.entry = entry + inputOps.input = entry } + buildLogger.debug(`auto find entry `, entry) } const entry = (inputOps.input = inputOps.input || resolvedConfig.entry) const isSingleEntry = typeof entry === 'string' @@ -126,9 +136,8 @@ export async function generateBuildOps( !isAbsolute(entry[key]) && (entry[key] = join(pkgRoot, entry[key])) }) } - api.logger.debug(`[generate buildOps] final inputConfig: `) - api.logger.debug(inputOps) - + buildLogger.debug(`[generate buildOps] final inputConfig: `) + buildLogger.debug(inputOps) // output generate const outputOps = formats.map((format) => { const outputConfig = { @@ -137,9 +146,9 @@ export async function generateBuildOps( format, exports: format === 'cjs' ? 'named' : 'auto', namespaceToStringTag: true, - entryFileNames: isProd - ? `${isSingleEntry ? libName : '[name]'}.${format}.prod.js` - : `${isSingleEntry ? libName : '[name]'}.${format}.js`, + entryFileNames: `${isSingleEntry ? libName : '[name]'}${ + disableFormatPostfix ? '' : '.' + format + }${isProd ? '.prod' : ''}.js`, chunkFileNames: `[name].js`, sourcemap: !!resolvedConfig?.sourcemap, ...output @@ -148,8 +157,8 @@ export async function generateBuildOps( return outputConfig }) - api.logger.debug(`[generate buildOps] final outputConfig: `) - api.logger.debug(outputOps) + buildLogger.debug(`[generate buildOps] final outputConfig: `) + buildLogger.debug(outputOps) return { inputConfig: inputOps, @@ -160,16 +169,19 @@ export async function generateBuildOps( alwaysEmptyDistDir } as IRollupBuildOps } else { - throw new Error(`roll-lib need a rollup config`) + throw new Error(`lib-build need a rollup config`) } } +const typeLogger = new Logger(`xus:generate:types`) const tsRE = /\.tsx?$/ export function generateTypeOps( pkgRoot: string, - buildOps: IRollupBuildOps, - api: IPluginAPI + buildOps: IRollupBuildOps ): IRollupBuildOps | null { + typeLogger.debug(`rollup types in `, pkgRoot) + typeLogger.debug(`with `, buildOps.inputConfig.input) + typeLogger.debug(`cwd `, process.cwd()) const entry = buildOps.inputConfig.input let inputs: Record = {} if (entry) { @@ -198,8 +210,8 @@ export function generateTypeOps( delete inputs[key] } }) - api.logger.debug(`[generate types options] types entry: `) - api.logger.debug(inputs) + typeLogger.debug(`[generate types options] types entry: `) + typeLogger.debug(inputs) return { inputConfig: { input: inputs, @@ -216,7 +228,8 @@ export function generateTypeOps( isWrite: true, pkgRoot, alwaysEmptyDistDir: false, - skipEmptyDistDir: true + skipEmptyDistDir: true, + disableConsoleInfo: true } } return null diff --git a/packages/plugin-cmd-roll-lib/src/types.ts b/packages/plugin-cmd-roll-lib/src/types.ts index 24b4c7f..2afa9f7 100644 --- a/packages/plugin-cmd-roll-lib/src/types.ts +++ b/packages/plugin-cmd-roll-lib/src/types.ts @@ -13,6 +13,7 @@ export interface IRollLibConfig { libName: string target: 'esnext' | TransformOptions['target'] formats: ('esm' | 'cjs' | 'iife' | 'umd')[] + disableFormatPostfix: boolean rollTypes: boolean sourcemap: boolean minify: false | 'esbuild' | 'terser' @@ -35,6 +36,7 @@ export interface IRollLibConfig { alias: Record replace: Record excludeExternal: string[] + external: string[] // lerna mode lerna: @@ -47,7 +49,7 @@ export interface IRollLibConfig { } // insider - rollupChain?: (rc: IRollupChain) => IRollupChain + rollupChain?: (rc: IRollupChain, pkgDir: string) => IRollupChain afterBuild: ICmd[] } diff --git a/packages/plugin-lib-legacy/package.json b/packages/plugin-lib-legacy/package.json index c062b0b..4adddfb 100644 --- a/packages/plugin-lib-legacy/package.json +++ b/packages/plugin-lib-legacy/package.json @@ -31,7 +31,6 @@ "@xus/cli-shared": "^0.2.1", "@xus/cli-types": "^0.2.1", "@xus/core": "^0.2.1", - "core-js": "^3.9.1", "rollup": "^2.40.0" }, "devDependencies": { diff --git a/packages/preset-built-in/src/plugin/bundler/index.ts b/packages/preset-built-in/src/plugin/bundler/index.ts index 06329e9..5bc59a3 100644 --- a/packages/preset-built-in/src/plugin/bundler/index.ts +++ b/packages/preset-built-in/src/plugin/bundler/index.ts @@ -17,12 +17,13 @@ export default createPlugin({ api.registerMethod({ methodName: BundlerMethods.getRollupConfig, throwOnExist: false, - fn: async () => { + fn: async (arg?: any) => { const rc = new rollupChain() await api.applyHook({ name: BundlerMethods.modifyRollupConfig, type: HookTypes.serial, - initialValue: rc + initialValue: rc, + args: arg }) return rc.toConfig() } @@ -35,12 +36,13 @@ export default createPlugin({ api.registerMethod({ methodName: BundlerMethods.getWebpackConfig, throwOnExist: false, - fn: async () => { + fn: async (arg?: any) => { const wr = new webpackChain() await api.applyHook({ name: BundlerMethods.modifyWebpackConfig, type: HookTypes.serial, - initialValue: wr + initialValue: wr, + args: arg }) return wr.toConfig() } diff --git a/packages/preset-built-in/src/plugin/config/changelog.ts b/packages/preset-built-in/src/plugin/config/changelog.ts index f040f70..02542af 100644 --- a/packages/preset-built-in/src/plugin/config/changelog.ts +++ b/packages/preset-built-in/src/plugin/config/changelog.ts @@ -1,5 +1,4 @@ import { createSchema } from '@xus/cli-shared' -import { join } from 'path' export type IChangelogConfig = { filename: string @@ -20,8 +19,8 @@ export const changelogSchema = createSchema((joi) => { export function defaultChangelogConfig(): IChangelogConfig { return { filename: 'CHANGELOG.md', - mainTemplate: join(__dirname, '../template/changelog-main.hbs'), - headerPartial: join(__dirname, '../template/changelog-header.hbs'), - commitPartial: join(__dirname, '../template/changelog-commit.hbs') + mainTemplate: './template/changelog-main.hbs?url', + headerPartial: './template/changelog-header.hbs?url', + commitPartial: './template/changelog-commit.hbs?url' } } diff --git a/xus.config.ts b/xus.config.ts index 00d27d3..97935e0 100644 --- a/xus.config.ts +++ b/xus.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from './packages/cli/dist' +import { defineConfig } from '@xus/cli' export default defineConfig({ libBuild: { @@ -8,6 +8,16 @@ export default defineConfig({ alwaysEmptyDistDir: true, rollTypes: true, sourcemap: false, + disableFormatPostfix: true, + rollupChain(rc, pkgDir) { + if (pkgDir === 'cli') { + rc.input({ + index: './src/index.ts', + xus: './src/xus.ts' + }) + } + return rc + }, lerna: { pkgsOrder: [ 'cli-shared', @@ -18,7 +28,27 @@ export default defineConfig({ 'cli' ], excludePkgs: ['playground', 'plugin-lib-vue'] - } + }, + afterBuild: [ + { + bin: 'yarn', + args: ['copy:preset'], + message: { + start: 'copy preset template start', + failed: 'copy preset template failed', + succeed: 'copy preset template succeed' + } + }, + { + bin: 'yarn', + args: ['copy:create'], + message: { + start: 'copy create-lib template start', + failed: 'copy create-lib template failed', + succeed: 'copy create-lib template succeed' + } + } + ] }, release: { branch: 'main'