UNPKG

@build-script/heft-esbuild-plugin

Version:

lowlevel esbuild plugin for [heft]

91 lines (78 loc) 2.29 kB
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', // }), // ], };