@visulima/packem
Version:
A fast and modern bundler for Node.js and TypeScript.
214 lines (213 loc) • 7.8 kB
TypeScript
import type { Options } from "cssnano";
import type { CustomAtRules, TransformOptions } from "lightningcss";
import type { AcceptedPlugin, PluginCreator } from "postcss";
import type { Config as PostCSSConfig } from "postcss-load-config";
import type { LESSLoaderOptions } from "./loaders/less/types.d.ts";
import type { ImportOptions } from "./loaders/postcss/import/types.d.ts";
import type { ModulesOptions } from "./loaders/postcss/index.d.ts";
import type { UrlOptions } from "./loaders/postcss/index.d.ts";
import type { SassLoaderOptions } from "./loaders/sass/types.d.ts";
import type { StylusLoaderOptions } from "./loaders/stylus/types.d.ts";
import type { Loader, SourceMapOptions } from "./loaders/types.d.ts";
import type { Minifier } from "./minifiers/types.d.ts";
export type AutoModules = RegExp | boolean | ((id: string) => boolean);
/** CSS data for extraction */
export interface ExtractedData {
/** CSS */
css: string;
/** Sourcemap */
map?: string;
/** Output name for CSS */
name: string;
}
/** Options for CSS injection */
export interface InjectOptions {
/**
* Set attributes of injected `<style>` tag(s)
* - ex.: `{"id":"global"}`
*/
attributes?: Record<string, string>;
/**
* Container for `<style>` tag(s) injection
* @default "head"
*/
container?: string;
/**
* Insert `<style>` tag(s) to the beginning of the container
* @default false
*/
prepend?: boolean;
/**
* Inject CSS into single `<style>` tag only
* @default false
*/
singleTag?: boolean;
/**
* Makes injector treeshakeable,
* as it is only called when either classes are referenced directly,
* or `inject` function is called from the default export.
*
* Incompatible with `namedExports` option.
*/
treeshakeable?: boolean;
}
export interface InternalStyleOptions extends StyleOptions {
/** @see {@link StyleOptions.mode} */
emit: boolean;
extensions: NonNullable<StyleOptions["extensions"]>;
/** @see {@link StyleOptions.mode} */
extract: boolean | string;
/** @see {@link StyleOptions.mode} */
inject: InjectOptions | boolean | ((varname: string, id: string, output: string[]) => string);
}
export type LightningCSSOptions = Omit<TransformOptions<CustomAtRules>, "code" | "cssModules" | "filename" | "minify" | "targets"> & {
modules?: TransformOptions<CustomAtRules>["cssModules"] & {
/**
* Files to include for [CSS Modules](https://github.com/css-modules/css-modules)
* for files named `[name].module.[ext]`
* (e.g. `foo.module.css`, `bar.module.stylus`),
* or pass your own function or regular expression
* @default false
*/
include?: AutoModules;
};
};
/** Options for PostCSS config loader */
export interface PostCSSConfigLoaderOptions {
/**
* Context object passed to PostCSS config file
* @default {}
*/
ctx?: Record<string, unknown>;
/** Path to PostCSS config file directory */
path?: string;
}
export interface PostCSSOptions {
/**
* Enable/disable or pass options for PostCSS config loader.
*/
config?: PostCSSConfigLoaderOptions | false;
/**
* Enable/disable or pass options for CSS `@import` resolver.
*/
import?: Partial<ImportOptions> | false;
/**
* Enable/disable or pass options for
* [CSS Modules](https://github.com/css-modules/css-modules)
* @default false
*/
modules?: ModulesOptions | boolean;
/**
* Set PostCSS parser, e.g. `sugarss`.
* Overrides the one loaded from PostCSS config file, if any.
*/
parser?: PostCSSConfig["parser"] | string;
/**
* A list of plugins for PostCSS,
* which are used before plugins loaded from PostCSS config file, if any.
*/
plugins?: (AcceptedPlugin | string | [PluginCreator<unknown> | string, Record<string, unknown>] | [PluginCreator<unknown> | string] | null | undefined)[] | Record<string, unknown>;
/**
* Set PostCSS stringifier.
* Overrides the one loaded from PostCSS config file, if any.
*/
stringifier?: PostCSSConfig["stringifier"] | string;
/**
* Set PostCSS syntax.
* Overrides the one loaded from PostCSS config file, if any.
*/
syntax?: PostCSSConfig["syntax"] | string;
/** `to` option for PostCSS, required for some plugins. */
to?: PostCSSConfig["to"];
/**
* Enable/disable or pass options for CSS URL resolver.
*/
url?: Partial<UrlOptions> | false;
}
/** `rollup-plugin-styles`'s full option list */
export interface StyleOptions {
/**
* Aliases for URL and import paths
* - ex.: `{"foo":"bar"}`
* @default {}
*/
alias?: Record<string, string>;
/**
* Automatically enable
* [CSS Modules](https://github.com/css-modules/css-modules)
* for files named `[name].module.[ext]`
* (e.g. `foo.module.css`, `bar.module.stylus`),
* or pass your own function or regular expression
* @default false
*/
autoModules?: AutoModules;
/**
* Options for cssnano minifier
* @default {}
*/
cssnano?: Options;
/**
* Generate TypeScript declarations files for input style files
*/
dts?: boolean;
/** Files to exclude from processing */
exclude?: ReadonlyArray<RegExp | string> | RegExp | string | undefined;
/**
* Plugin will process files ending with these extensions
* @default [".css", ".pcss", ".postcss", ".sss"]
*/
extensions?: string[];
/** Files to include for processing */
include?: ReadonlyArray<RegExp | string> | RegExp | string | undefined;
/** Options for Less loader */
less?: LESSLoaderOptions;
/** Options for LightningCSS */
lightningcss?: LightningCSSOptions;
/** Array of custom loaders */
loaders?: Loader[];
/** Enable the css minifier */
minifier?: Minifier;
/**
* Select mode for this plugin:
* - `"inject"` *(default)* - Embeds CSS inside JS and injects it into `<head>` at runtime.
* You can also pass options for CSS injection.
* Alternatively, you can pass your own CSS injector.
* - `"extract"` - Extract CSS to the same location where JS file is generated but with `.css` extension.
* You can also set extraction path manually,
* relative to output dir/output file's basedir,
* but not outside of it.
* - `"emit"` - Emit pure processed CSS and pass it along the build pipeline.
* Useful if you want to preprocess CSS before using it with CSS consuming plugins.
* @default "inject"
*/
mode?: "emit" | "extract" | "inject" | ["extract", string] | ["inject", InjectOptions | ((varname: string, id: string) => string)];
/**
* Use named exports alongside default export.
* You can pass a function to control how exported name is generated.
* @default false
*/
namedExports?: boolean | ((name: string) => string);
/**
* Function which is invoked on CSS file extraction.
* Return `boolean` to control if file should be extracted or not.
*/
onExtract?: (data: ExtractedData) => boolean;
/**
* Function which is invoked on CSS file import,
* before any transformations are applied
*/
onImport?: (code: string, id: string) => void;
/**
* Options for PostCSS
*/
postcss?: PostCSSOptions;
/** Options for Sass loader */
sass?: SassLoaderOptions;
/**
* Enable/disable or configure sourcemaps
* @default false
*/
sourceMap?: boolean | "inline" | [boolean | "inline", SourceMapOptions] | [boolean | "inline"];
/** Options for Stylus loader */
stylus?: StylusLoaderOptions;
}