@build-script/heft-esbuild-plugin
Version:
lowlevel esbuild plugin for [heft]
91 lines (78 loc) • 2.29 kB
text/typescript
import { resolve } from 'node:path';
import { normalizePath } from '@idlebox/common';
import type { BuildOptions } from 'esbuild';
export interface FilterdBuildOptions extends BuildOptions {
outfile: never;
outdir: string;
write: false;
metafile: true;
}
function required(options: BuildOptions, key: keyof BuildOptions) {
if (typeof options[key] === 'undefined') throw new Error(`${key} is required`);
}
function denied(options: BuildOptions, key: keyof BuildOptions) {
if (typeof options[key] !== 'undefined') throw new Error(`${key} is denied`);
}
export function filterOptions(rootDir: string, options: BuildOptions): FilterdBuildOptions {
required(options, 'outdir');
required(options, 'entryPoints');
denied(options, 'outfile');
denied(options, 'absWorkingDir');
options = Object.assign({}, defaultOptions, options);
options.loader = Object.assign({}, defaultOptions.loader, options.loader);
if (options.platform === 'browser') {
options.mainFields = ['browser', 'module', 'main'];
options.conditions = ['browser', 'import', 'default'];
} else if (options.platform === 'node') {
}
const outputDir = normalizePath(resolve(rootDir, `./${options.outdir}`));
if (!outputDir.startsWith(rootDir)) {
throw new Error(`output dirctory is out of root: ${outputDir}`);
}
if (outputDir === rootDir) {
throw new Error(`output dirctory is root: ${options.outdir}`);
}
options.outdir = outputDir;
options.absWorkingDir = rootDir;
options.write = false;
options.metafile = true;
return options as any;
}
const defaultOptions: BuildOptions = {
bundle: true,
splitting: false,
platform: 'browser',
assetNames: 'assets/[name][ext]',
resolveExtensions: ['.ts', '.tsx', '.js'],
external: ['electron'],
loader: {
'.xml': 'text',
'.txt': 'text',
'.md': 'text',
'.png': 'dataurl',
'.ico': 'dataurl',
'.gif': 'file',
'.jpg': 'file',
'.jpeg': 'file',
'.webp': 'file',
'.svg': 'text',
'.woff2': 'file',
'.woff': 'file',
'.ttf': 'file',
'.eot': 'file',
'.otf': 'file',
'.sfnt': 'file',
},
sourcemap: 'linked',
sourcesContent: false,
keepNames: true,
charset: 'utf8',
target: 'esnext',
// plugins: [
// // SkipElectronPlugin(),
// ScssCombinePlugin(session, {
// // TODO
// sourceRoot: './src',
// }),
// ],
};