import { autoprefixer, postcss, postcssImport, postcssNesting,} from "../deps/postcss.ts";import { merge } from "../core/utils.ts";import { Page } from "../core/filesystem.ts";
import type { Helper, Site } from "../core.ts";import type { SourceMapOptions } from "../deps/postcss.ts";
export interface Options { extensions: string[];
sourceMap: boolean | SourceMapOptions;
includes: string | string[] | false;
plugins: unknown[];
keepDefaultPlugins: boolean;}
export const defaults: Options = { extensions: [".css"], sourceMap: false, includes: [], plugins: [ postcssNesting(), autoprefixer(), ], keepDefaultPlugins: false,};
export default function (userOptions?: Partial<Options>) { return (site: Site) => { const options = merge( { ...defaults, includes: site.options.includes }, userOptions, );
if (options.keepDefaultPlugins && userOptions?.plugins?.length) { options.plugins = defaults.plugins.concat(userOptions.plugins); }
const plugins = [...options.plugins];
if (options.includes) { plugins.unshift(postcssImport({ path: Array.isArray(options.includes) ? options.includes.map((path) => site.src(path)) : site.src(options.includes), })); }
const runner = postcss(plugins);
site.loadAssets(options.extensions); site.process(options.extensions, postCss); site.filter("postcss", filter as Helper, true);
async function postCss(file: Page) { const from = site.src(file.src.path + file.src.ext); const to = site.dest(file.dest.path + file.dest.ext); const map = options.sourceMap;
const result = await runner.process(file.content!, { from, to, map });
file.content = result.css;
if (result.map) { const mapFile = new Page(); mapFile.dest = { path: file.dest.path, ext: ".css.map", }; mapFile.content = result.map.toString(); site.pages.push(mapFile); } }
async function filter(code: string) { const result = await runner.process(code, { from: undefined }); return result.css; } };}