collab/mermaid/.vite/build.tsblame
View source
6dd74de1import type { InlineConfig } from 'vite';
6dd74de2import { build, type PluginOption } from 'vite';
6dd74de3import { resolve } from 'path';
6dd74de4import { fileURLToPath } from 'url';
6dd74de5import jisonPlugin from './jisonPlugin.js';
6dd74de6import jsonSchemaPlugin from './jsonSchemaPlugin.js';
6dd74de7import typescript from '@rollup/plugin-typescript';
6dd74de8import { visualizer } from 'rollup-plugin-visualizer';
6dd74de9import type { TemplateType } from 'rollup-plugin-visualizer/dist/plugin/template-types.js';
6dd74de10import istanbul from 'vite-plugin-istanbul';
6dd74de11import { packageOptions } from '../.build/common.js';
6dd74de12import { generateLangium } from '../.build/generateLangium.js';
6dd74de13
6dd74de14const visualize = process.argv.includes('--visualize');
6dd74de15const watch = process.argv.includes('--watch');
6dd74de16const mermaidOnly = process.argv.includes('--mermaid');
6dd74de17const coverage = process.env.VITE_COVERAGE === 'true';
6dd74de18const __dirname = fileURLToPath(new URL('.', import.meta.url));
6dd74de19const sourcemap = false;
6dd74de20
6dd74de21type OutputOptions = Exclude<
6dd74de22 Exclude<InlineConfig['build'], undefined>['rollupOptions'],
6dd74de23 undefined
6dd74de24>['output'];
6dd74de25
6dd74de26const visualizerOptions = (packageName: string, core = false): PluginOption[] => {
6dd74de27 if (packageName !== 'mermaid' || !visualize) {
6dd74de28 return [];
6dd74de29 }
6dd74de30 return ['network', 'treemap', 'sunburst'].map(
6dd74de31 (chartType) =>
6dd74de32 visualizer({
6dd74de33 filename: `./stats/${chartType}${core ? '.core' : ''}.html`,
6dd74de34 template: chartType as TemplateType,
6dd74de35 gzipSize: true,
6dd74de36 brotliSize: true,
6dd74de37 }) as PluginOption
6dd74de38 );
6dd74de39};
6dd74de40
6dd74de41interface BuildOptions {
6dd74de42 minify: boolean | 'esbuild';
6dd74de43 core?: boolean;
6dd74de44 watch?: boolean;
6dd74de45 entryName: keyof typeof packageOptions;
6dd74de46}
6dd74de47
6dd74de48export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions): InlineConfig => {
6dd74de49 const external: (string | RegExp)[] = ['require', 'fs', 'path'];
6dd74de50 // eslint-disable-next-line no-console
6dd74de51 console.log(entryName, packageOptions[entryName]);
6dd74de52 const { name, file, packageName } = packageOptions[entryName];
6dd74de53 const output: OutputOptions = [
6dd74de54 {
6dd74de55 name,
6dd74de56 format: 'esm',
6dd74de57 sourcemap,
6dd74de58 entryFileNames: `${name}.esm${minify ? '.min' : ''}.mjs`,
6dd74de59 },
6dd74de60 ];
6dd74de61
6dd74de62 const config: InlineConfig = {
6dd74de63 configFile: false,
6dd74de64 build: {
6dd74de65 emptyOutDir: false,
6dd74de66 outDir: resolve(__dirname, `../packages/${packageName}/dist`),
6dd74de67 lib: {
6dd74de68 entry: resolve(__dirname, `../packages/${packageName}/src/${file}`),
6dd74de69 name,
6dd74de70 // the proper extensions will be added
6dd74de71 fileName: name,
6dd74de72 },
6dd74de73 minify,
6dd74de74 rollupOptions: {
6dd74de75 external,
6dd74de76 output,
6dd74de77 },
6dd74de78 },
6dd74de79 define: {
6dd74de80 'import.meta.vitest': 'undefined',
6dd74de81 'injected.includeLargeFeatures': 'true',
6dd74de82 'injected.version': `'0.0.0'`,
6dd74de83 },
6dd74de84 resolve: {
6dd74de85 extensions: [],
6dd74de86 },
6dd74de87 plugins: [
6dd74de88 jisonPlugin(),
6dd74de89 jsonSchemaPlugin(), // handles `.schema.yaml` files
6dd74de90 typescript({ compilerOptions: { declaration: false } }),
6dd74de91 istanbul({
6dd74de92 exclude: ['node_modules', 'test/', '__mocks__', 'generated'],
6dd74de93 extension: ['.js', '.ts'],
6dd74de94 requireEnv: true,
6dd74de95 forceBuildInstrument: coverage,
6dd74de96 }),
6dd74de97 ...visualizerOptions(packageName, core),
6dd74de98 ],
6dd74de99 };
6dd74de100
6dd74de101 if (watch && config.build) {
6dd74de102 config.build.watch = {
6dd74de103 include: ['packages/mermaid-example-diagram/src/**', 'packages/mermaid/src/**'],
6dd74de104 };
6dd74de105 }
6dd74de106
6dd74de107 return config;
6dd74de108};
6dd74de109
6dd74de110const buildPackage = async (entryName: keyof typeof packageOptions) => {
6dd74de111 await build(getBuildConfig({ minify: false, entryName }));
6dd74de112};
6dd74de113
6dd74de114const main = async () => {
6dd74de115 const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[];
6dd74de116 for (const pkg of packageNames.filter(
6dd74de117 (pkg) => !mermaidOnly || pkg === 'mermaid' || pkg === 'parser'
6dd74de118 )) {
6dd74de119 await buildPackage(pkg);
6dd74de120 }
6dd74de121};
6dd74de122
6dd74de123await generateLangium();
6dd74de124
6dd74de125if (watch) {
6dd74de126 await build(getBuildConfig({ minify: false, watch, core: false, entryName: 'parser' }));
6dd74de127 void build(getBuildConfig({ minify: false, watch, core: false, entryName: 'mermaid' }));
6dd74de128 if (!mermaidOnly) {
6dd74de129 void build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' }));
6dd74de130 void build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-zenuml' }));
6dd74de131 }
6dd74de132} else if (visualize) {
6dd74de133 await build(getBuildConfig({ minify: false, watch, core: false, entryName: 'parser' }));
6dd74de134 await build(getBuildConfig({ minify: false, core: true, entryName: 'mermaid' }));
6dd74de135 await build(getBuildConfig({ minify: false, core: false, entryName: 'mermaid' }));
6dd74de136} else {
6dd74de137 void main();
6dd74de138}