| 6dd74de | | | 1 | import { resolve } from 'path'; |
| 6dd74de | | | 2 | import { fileURLToPath } from 'url'; |
| 6dd74de | | | 3 | import type { BuildOptions } from 'esbuild'; |
| 6dd74de | | | 4 | import { readFileSync } from 'fs'; |
| 6dd74de | | | 5 | import jsonSchemaPlugin from './jsonSchemaPlugin.js'; |
| 6dd74de | | | 6 | import type { PackageOptions } from '../.build/common.js'; |
| 6dd74de | | | 7 | import { jisonPlugin } from './jisonPlugin.js'; |
| 6dd74de | | | 8 | |
| 6dd74de | | | 9 | const __dirname = fileURLToPath(new URL('.', import.meta.url)); |
| 6dd74de | | | 10 | |
| 6dd74de | | | 11 | export interface MermaidBuildOptions extends BuildOptions { |
| 6dd74de | | | 12 | minify: boolean; |
| 6dd74de | | | 13 | core: boolean; |
| 6dd74de | | | 14 | metafile: boolean; |
| 6dd74de | | | 15 | format: 'esm' | 'iife'; |
| 6dd74de | | | 16 | options: PackageOptions; |
| 6dd74de | | | 17 | includeLargeFeatures: boolean; |
| 6dd74de | | | 18 | } |
| 6dd74de | | | 19 | |
| 6dd74de | | | 20 | export const defaultOptions: Omit<MermaidBuildOptions, 'entryName' | 'options'> = { |
| 6dd74de | | | 21 | minify: false, |
| 6dd74de | | | 22 | metafile: false, |
| 6dd74de | | | 23 | core: false, |
| 6dd74de | | | 24 | format: 'esm', |
| 6dd74de | | | 25 | includeLargeFeatures: true, |
| 6dd74de | | | 26 | } as const; |
| 6dd74de | | | 27 | |
| 6dd74de | | | 28 | const buildOptions = (override: BuildOptions): BuildOptions => { |
| 6dd74de | | | 29 | return { |
| 6dd74de | | | 30 | bundle: true, |
| 6dd74de | | | 31 | minify: true, |
| 6dd74de | | | 32 | keepNames: true, |
| 6dd74de | | | 33 | platform: 'browser', |
| 6dd74de | | | 34 | tsconfig: 'tsconfig.json', |
| 6dd74de | | | 35 | resolveExtensions: ['.ts', '.js', '.json', '.jison', '.yaml'], |
| 6dd74de | | | 36 | external: ['require', 'fs', 'path'], |
| 6dd74de | | | 37 | outdir: 'dist', |
| 6dd74de | | | 38 | plugins: [jisonPlugin, jsonSchemaPlugin], |
| 6dd74de | | | 39 | sourcemap: 'external', |
| 6dd74de | | | 40 | ...override, |
| 6dd74de | | | 41 | }; |
| 6dd74de | | | 42 | }; |
| 6dd74de | | | 43 | |
| 6dd74de | | | 44 | const getFileName = ( |
| 6dd74de | | | 45 | fileName: string, |
| 6dd74de | | | 46 | { core, format, minify, includeLargeFeatures }: MermaidBuildOptions |
| 6dd74de | | | 47 | ) => { |
| 6dd74de | | | 48 | if (core) { |
| 6dd74de | | | 49 | fileName += '.core'; |
| 6dd74de | | | 50 | } else if (format === 'esm') { |
| 6dd74de | | | 51 | fileName += '.esm'; |
| 6dd74de | | | 52 | } |
| 6dd74de | | | 53 | if (!includeLargeFeatures) { |
| 6dd74de | | | 54 | fileName += '.tiny'; |
| 6dd74de | | | 55 | } |
| 6dd74de | | | 56 | if (minify) { |
| 6dd74de | | | 57 | fileName += '.min'; |
| 6dd74de | | | 58 | } |
| 6dd74de | | | 59 | return fileName; |
| 6dd74de | | | 60 | }; |
| 6dd74de | | | 61 | |
| 6dd74de | | | 62 | export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => { |
| 6dd74de | | | 63 | const { |
| 6dd74de | | | 64 | core, |
| 6dd74de | | | 65 | format, |
| 6dd74de | | | 66 | options: { name, file, packageName }, |
| 6dd74de | | | 67 | globalName = 'mermaid', |
| 6dd74de | | | 68 | includeLargeFeatures, |
| 6dd74de | | | 69 | ...rest |
| 6dd74de | | | 70 | } = options; |
| 6dd74de | | | 71 | |
| 6dd74de | | | 72 | const external: string[] = ['require', 'fs', 'path']; |
| 6dd74de | | | 73 | const outFileName = getFileName(name, options); |
| 6dd74de | | | 74 | const { dependencies, version } = JSON.parse( |
| 6dd74de | | | 75 | readFileSync(resolve(__dirname, `../packages/${packageName}/package.json`), 'utf-8') |
| 6dd74de | | | 76 | ); |
| 6dd74de | | | 77 | const output: BuildOptions = buildOptions({ |
| 6dd74de | | | 78 | ...rest, |
| 6dd74de | | | 79 | absWorkingDir: resolve(__dirname, `../packages/${packageName}`), |
| 6dd74de | | | 80 | entryPoints: { |
| 6dd74de | | | 81 | [outFileName]: `src/${file}`, |
| 6dd74de | | | 82 | }, |
| 6dd74de | | | 83 | globalName, |
| 6dd74de | | | 84 | logLevel: 'info', |
| 6dd74de | | | 85 | chunkNames: `chunks/${outFileName}/[name]-[hash]`, |
| 6dd74de | | | 86 | define: { |
| 6dd74de | | | 87 | // This needs to be stringified for esbuild |
| 6dd74de | | | 88 | 'injected.includeLargeFeatures': `${includeLargeFeatures}`, |
| 6dd74de | | | 89 | 'injected.version': `'${version}'`, |
| 6dd74de | | | 90 | 'import.meta.vitest': 'undefined', |
| 6dd74de | | | 91 | }, |
| 6dd74de | | | 92 | }); |
| 6dd74de | | | 93 | |
| 6dd74de | | | 94 | if (core) { |
| 6dd74de | | | 95 | // Core build is used to generate file without bundled dependencies. |
| 6dd74de | | | 96 | // This is used by downstream projects to bundle dependencies themselves. |
| 6dd74de | | | 97 | // Ignore dependencies and any dependencies of dependencies |
| 6dd74de | | | 98 | external.push(...Object.keys(dependencies)); |
| 6dd74de | | | 99 | output.external = external; |
| 6dd74de | | | 100 | } |
| 6dd74de | | | 101 | |
| 6dd74de | | | 102 | if (format === 'iife') { |
| 6dd74de | | | 103 | output.format = 'iife'; |
| 6dd74de | | | 104 | output.splitting = false; |
| 6dd74de | | | 105 | const originalGlobalName = output.globalName ?? 'mermaid'; |
| 6dd74de | | | 106 | output.globalName = `__esbuild_esm_mermaid_nm[${JSON.stringify(originalGlobalName)}]`; |
| 6dd74de | | | 107 | // Workaround for removing the .default access in esbuild IIFE. |
| 6dd74de | | | 108 | // https://github.com/mermaid-js/mermaid/pull/4109#discussion_r1292317396 |
| 6dd74de | | | 109 | output.footer = { |
| 6dd74de | | | 110 | js: `globalThis[${JSON.stringify(originalGlobalName)}] = globalThis.${output.globalName}.default;`, |
| 6dd74de | | | 111 | }; |
| 6dd74de | | | 112 | output.outExtension = { '.js': '.js' }; |
| 6dd74de | | | 113 | } else { |
| 6dd74de | | | 114 | output.format = 'esm'; |
| 6dd74de | | | 115 | output.splitting = true; |
| 6dd74de | | | 116 | output.outExtension = { '.js': '.mjs' }; |
| 6dd74de | | | 117 | } |
| 6dd74de | | | 118 | |
| 6dd74de | | | 119 | return output; |
| 6dd74de | | | 120 | }; |