bili
Version:
A zero configuration library bundler.
308 lines (306 loc) • 8.34 kB
TypeScript
import { ModuleFormat as RollupFormat, InputOptions, OutputOptions, Plugin as RollupPlugin } from 'rollup';
import { Banner } from './utils/get-banner';
declare type Diff<T extends keyof any, U extends keyof any> = ({
[P in T]: P;
} & {
[P in U]: never;
} & {
[x: string]: never;
})[T];
declare type Overwrite<T, U> = Pick<T, Diff<keyof T, keyof U>> & U;
export declare type Format = RollupFormat | 'cjs-min' | 'es-min' | 'esm-min' | 'umd-min' | 'iife-min' | 'amd-min' | 'system-min';
export declare type Env = {
[k: string]: string | number | boolean;
};
export declare type External = string | RegExp | ((id: string, parentId?: string) => boolean);
export declare type Externals = Array<External>;
export declare type ConfigEntryObject = {
[entryName: string]: string;
};
export declare type ExtendConfig = (config: NormalizedConfig, { format, input }: {
format: Format;
input: string[] | ConfigEntryObject;
}) => NormalizedConfig;
export interface RunContext {
unresolved: Set<string>;
}
export interface Task {
title: string;
getConfig(context: RunContext, task: Task): Promise<RollupConfig>;
}
export interface RollupInputConfig extends InputOptions {
plugins: Array<RollupPlugin>;
}
export interface RollupOutputConfig extends OutputOptions {
dir: string;
}
export interface RollupConfig {
inputConfig: RollupInputConfig;
outputConfig: RollupOutputConfig;
}
export declare type ExtendRollupConfig = (config: RollupConfig) => RollupConfig;
export interface FileNameContext {
format: RollupFormat;
minify: boolean;
}
export declare type GetFileName = (context: FileNameContext, defaultFileName: string) => string;
export interface BabelPresetOptions {
/**
* Transform `async/await` to `Promise`.
* @default `true`
*/
asyncToPromises?: boolean;
/**
* Custom JSX pragma. If you want to use Preact, set it to `h`.
*/
jsx?: string;
/**
* Replace `Object.assign` with your own method.
* @example `myAssign`
*/
objectAssign?: string;
/**
* Disable .babelrc
* By default Bili reads it
*/
babelrc?: boolean;
/**
* Disable babel.config.js
*/
configFile?: boolean;
/**
* Disable babel-preset-env but still use other babel plugins
* In addtional we use rollup-plugin-buble after rollup-plugin-babel
*/
minimal?: boolean;
}
export declare type OutputTarget = 'node' | 'browser';
export interface ConfigOutput {
/**
* Output format(s). You can append `min` to the format to generate minified bundle.
*
* @default `cjs`
* @cli `--format <format>`
*/
format?: Format | Format[];
/**
* Output directory
* @default `dist`
* @cli `-d, --out-dir <dir>`
*/
dir?: string;
/**
* Output file name
*
* Default value:
* - `[name][min][ext]` in `cjs` and `esm` format.
* - `[name][min].[format].js` in other formats.
*
* Placeholders:
* - `[name]`: The base name of input file. (without extension)
* - `[format]`: The output format. (without `-min` suffix)
* - `[min]`: It will replaced by `.min` when the format ends with `-min`, otherwise it's an empty string.
*
* The value can also be a function which returns the fileName template,
* The placeholders are also available in the return value.
*
* @cli `--file-name <fileName>`
*/
fileName?: string | GetFileName;
/**
* Module name for umd bundle
*/
moduleName?: string;
/**
* Whether to minify output files regardless of format, using this option won't add `.min` suffix to the output file name.
*/
minify?: boolean;
/**
* Extract CSS into a single file.
* @default `true`
*/
extractCSS?: boolean;
/**
* Generate source maps
* @default `true` for minified bundle, `false` otherwise
*/
sourceMap?: boolean;
/**
* Exclude source code in source maps
*/
sourceMapExcludeSources?: boolean;
/**
* Output target
* @default `node`
* @cli `--target <target>`
*/
target?: OutputTarget;
}
export interface Config {
/**
* Input files
* @default `src/index.js`
* @cli `bili [...input]`
*/
input?: string | ConfigEntryObject | Array<ConfigEntryObject | string>;
output?: ConfigOutput;
/**
* Define env variables that are only available in your library code. i.e. if you have some code like this in your library.
*
* ```js
* if (process.env.NODE_ENV === 'development') {
* console.log('debug')
* }
* ```
*
* And you can run following command to replace the env variable:
* ```bash
* bili --env.NODE_ENV production
* ```
*
* By default we don't add any env variables.
*
* @cli `--env.<name> value`
*/
env?: Env;
/**
* Use Rollup plugins
*
* ```js
* // bili.config.js
* module.exports = {
* plugins: {
* svelte: {
* // Any options for rollup-plugin-svelte
* }
* }
* }
* ```
*
* You can also use CLI flags to add plugins, e.g.
* ```bash
* bili --plugin.svelte
* # with option
* bili --plugin.svelte.foo bar
* # Same as using `svelte: { foo: 'bar' }` in config file
* ```
*
* @cli `--plugin.<name> [option]`
*/
plugins?: {
[name: string]: any;
};
/**
* Defines how to resolve a plugin by name
* This will override the default behavior
* e.g.
* ```js
* {
* resolvePlugins: {
* replace: require('./my-fork-of-rollup-plugin-replace')
* }
* }
* ```
*/
resolvePlugins?: {
[name: string]: any;
};
/**
* Include node modules in the bundle. Note that this is always `true` for UMD bundle.
* @cli `--bundle-node-modules`
*/
bundleNodeModules?: boolean | string[];
/**
* When inlining node modules
* You can use this option to exclude specific modules
*/
externals?: Externals;
/**
* Specifies `moduleId: variableName` pairs necessary for external imports in umd/iife bundles. For example, in a case like this...
*
* ```js
* import $ from 'jquery'
* ```
*
* ...you can map the `jquery` module ID to the global `$` variable:
*
* ```js
* // bili.config.js
* export default {
* globals: {
* jquery: '$'
* }
* }
* ```
*
* @cli `--global.<moduleId> <variableName`
*/
globals?: {
[k: string]: string;
};
/**
* Insert a copyright message to the top of output bundle.
*/
banner?: Banner;
/**
* Configure the default babel preset
*/
babel?: BabelPresetOptions;
/**
* Extending Bili config
*/
extendConfig?: ExtendConfig;
/**
* Extending generated rollup config
*/
extendRollupConfig?: ExtendRollupConfig;
}
interface ConfigOutputOverwrite {
/**
* Output directory, always a string
*/
dir: string;
}
export interface NormalizedConfig {
input?: string | ConfigEntryObject | Array<ConfigEntryObject | string>;
output: Overwrite<ConfigOutput, ConfigOutputOverwrite>;
env?: Env;
bundleNodeModules?: boolean | string[];
plugins: {
[name: string]: any;
};
resolvePlugins?: {
[name: string]: any;
};
externals: Externals;
globals?: {
[k: string]: string;
};
banner?: Banner;
babel: BabelPresetOptions;
extendConfig?: ExtendConfig;
extendRollupConfig?: ExtendRollupConfig;
}
export interface Options {
/**
* Log level
*/
logLevel?: 'verbose' | 'quiet';
/**
* Always show stack trace
*/
stackTrace?: boolean;
/**
* Use a custom config file rather than auto-loading bili.config.js
*/
configFile?: string | boolean;
/**
* The root directory to resolve files from
* Useful for mono-repo
* e.g. You can install Bili in root directory and leaf packages can use their own Bili config file:
* - `bili --root-dir packages/foo`
* - `bili --root-dir packages/bar`
*/
rootDir?: string;
}
export {};