collab/mermaid/.esbuild/util.tsblame
View source
6dd74de1import { resolve } from 'path';
6dd74de2import { fileURLToPath } from 'url';
6dd74de3import type { BuildOptions } from 'esbuild';
6dd74de4import { readFileSync } from 'fs';
6dd74de5import jsonSchemaPlugin from './jsonSchemaPlugin.js';
6dd74de6import type { PackageOptions } from '../.build/common.js';
6dd74de7import { jisonPlugin } from './jisonPlugin.js';
6dd74de8
6dd74de9const __dirname = fileURLToPath(new URL('.', import.meta.url));
6dd74de10
6dd74de11export interface MermaidBuildOptions extends BuildOptions {
6dd74de12 minify: boolean;
6dd74de13 core: boolean;
6dd74de14 metafile: boolean;
6dd74de15 format: 'esm' | 'iife';
6dd74de16 options: PackageOptions;
6dd74de17 includeLargeFeatures: boolean;
6dd74de18}
6dd74de19
6dd74de20export const defaultOptions: Omit<MermaidBuildOptions, 'entryName' | 'options'> = {
6dd74de21 minify: false,
6dd74de22 metafile: false,
6dd74de23 core: false,
6dd74de24 format: 'esm',
6dd74de25 includeLargeFeatures: true,
6dd74de26} as const;
6dd74de27
6dd74de28const buildOptions = (override: BuildOptions): BuildOptions => {
6dd74de29 return {
6dd74de30 bundle: true,
6dd74de31 minify: true,
6dd74de32 keepNames: true,
6dd74de33 platform: 'browser',
6dd74de34 tsconfig: 'tsconfig.json',
6dd74de35 resolveExtensions: ['.ts', '.js', '.json', '.jison', '.yaml'],
6dd74de36 external: ['require', 'fs', 'path'],
6dd74de37 outdir: 'dist',
6dd74de38 plugins: [jisonPlugin, jsonSchemaPlugin],
6dd74de39 sourcemap: 'external',
6dd74de40 ...override,
6dd74de41 };
6dd74de42};
6dd74de43
6dd74de44const getFileName = (
6dd74de45 fileName: string,
6dd74de46 { core, format, minify, includeLargeFeatures }: MermaidBuildOptions
6dd74de47) => {
6dd74de48 if (core) {
6dd74de49 fileName += '.core';
6dd74de50 } else if (format === 'esm') {
6dd74de51 fileName += '.esm';
6dd74de52 }
6dd74de53 if (!includeLargeFeatures) {
6dd74de54 fileName += '.tiny';
6dd74de55 }
6dd74de56 if (minify) {
6dd74de57 fileName += '.min';
6dd74de58 }
6dd74de59 return fileName;
6dd74de60};
6dd74de61
6dd74de62export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => {
6dd74de63 const {
6dd74de64 core,
6dd74de65 format,
6dd74de66 options: { name, file, packageName },
6dd74de67 globalName = 'mermaid',
6dd74de68 includeLargeFeatures,
6dd74de69 ...rest
6dd74de70 } = options;
6dd74de71
6dd74de72 const external: string[] = ['require', 'fs', 'path'];
6dd74de73 const outFileName = getFileName(name, options);
6dd74de74 const { dependencies, version } = JSON.parse(
6dd74de75 readFileSync(resolve(__dirname, `../packages/${packageName}/package.json`), 'utf-8')
6dd74de76 );
6dd74de77 const output: BuildOptions = buildOptions({
6dd74de78 ...rest,
6dd74de79 absWorkingDir: resolve(__dirname, `../packages/${packageName}`),
6dd74de80 entryPoints: {
6dd74de81 [outFileName]: `src/${file}`,
6dd74de82 },
6dd74de83 globalName,
6dd74de84 logLevel: 'info',
6dd74de85 chunkNames: `chunks/${outFileName}/[name]-[hash]`,
6dd74de86 define: {
6dd74de87 // This needs to be stringified for esbuild
6dd74de88 'injected.includeLargeFeatures': `${includeLargeFeatures}`,
6dd74de89 'injected.version': `'${version}'`,
6dd74de90 'import.meta.vitest': 'undefined',
6dd74de91 },
6dd74de92 });
6dd74de93
6dd74de94 if (core) {
6dd74de95 // Core build is used to generate file without bundled dependencies.
6dd74de96 // This is used by downstream projects to bundle dependencies themselves.
6dd74de97 // Ignore dependencies and any dependencies of dependencies
6dd74de98 external.push(...Object.keys(dependencies));
6dd74de99 output.external = external;
6dd74de100 }
6dd74de101
6dd74de102 if (format === 'iife') {
6dd74de103 output.format = 'iife';
6dd74de104 output.splitting = false;
6dd74de105 const originalGlobalName = output.globalName ?? 'mermaid';
6dd74de106 output.globalName = `__esbuild_esm_mermaid_nm[${JSON.stringify(originalGlobalName)}]`;
6dd74de107 // Workaround for removing the .default access in esbuild IIFE.
6dd74de108 // https://github.com/mermaid-js/mermaid/pull/4109#discussion_r1292317396
6dd74de109 output.footer = {
6dd74de110 js: `globalThis[${JSON.stringify(originalGlobalName)}] = globalThis.${output.globalName}.default;`,
6dd74de111 };
6dd74de112 output.outExtension = { '.js': '.js' };
6dd74de113 } else {
6dd74de114 output.format = 'esm';
6dd74de115 output.splitting = true;
6dd74de116 output.outExtension = { '.js': '.mjs' };
6dd74de117 }
6dd74de118
6dd74de119 return output;
6dd74de120};