| 6dd74de | | | 1 | import { build } from 'esbuild'; |
| 6dd74de | | | 2 | import { cp, mkdir, readFile, rename, writeFile } from 'node:fs/promises'; |
| 6dd74de | | | 3 | import { packageOptions } from '../.build/common.js'; |
| 6dd74de | | | 4 | import { generateLangium } from '../.build/generateLangium.js'; |
| 6dd74de | | | 5 | import type { MermaidBuildOptions } from './util.js'; |
| 6dd74de | | | 6 | import { defaultOptions, getBuildConfig } from './util.js'; |
| 6dd74de | | | 7 | |
| 6dd74de | | | 8 | const shouldVisualize = process.argv.includes('--visualize'); |
| 6dd74de | | | 9 | |
| 6dd74de | | | 10 | const buildPackage = async (entryName: keyof typeof packageOptions) => { |
| 6dd74de | | | 11 | const commonOptions: MermaidBuildOptions = { |
| 6dd74de | | | 12 | ...defaultOptions, |
| 6dd74de | | | 13 | options: packageOptions[entryName], |
| 6dd74de | | | 14 | } as const; |
| 6dd74de | | | 15 | const buildConfigs: MermaidBuildOptions[] = [ |
| 6dd74de | | | 16 | // package.mjs |
| 6dd74de | | | 17 | { ...commonOptions }, |
| 6dd74de | | | 18 | // package.min.mjs |
| 6dd74de | | | 19 | { |
| 6dd74de | | | 20 | ...commonOptions, |
| 6dd74de | | | 21 | minify: true, |
| 6dd74de | | | 22 | metafile: shouldVisualize, |
| 6dd74de | | | 23 | }, |
| 6dd74de | | | 24 | // package.core.mjs |
| 6dd74de | | | 25 | { ...commonOptions, core: true }, |
| 6dd74de | | | 26 | ]; |
| 6dd74de | | | 27 | |
| 6dd74de | | | 28 | if (entryName === 'mermaid') { |
| 6dd74de | | | 29 | const iifeOptions: MermaidBuildOptions = { ...commonOptions, format: 'iife' }; |
| 6dd74de | | | 30 | buildConfigs.push( |
| 6dd74de | | | 31 | // mermaid.js |
| 6dd74de | | | 32 | { ...iifeOptions }, |
| 6dd74de | | | 33 | // mermaid.min.js |
| 6dd74de | | | 34 | { ...iifeOptions, minify: true, metafile: shouldVisualize }, |
| 6dd74de | | | 35 | // mermaid.tiny.min.js |
| 6dd74de | | | 36 | { |
| 6dd74de | | | 37 | ...iifeOptions, |
| 6dd74de | | | 38 | minify: true, |
| 6dd74de | | | 39 | includeLargeFeatures: false, |
| 6dd74de | | | 40 | metafile: shouldVisualize, |
| 6dd74de | | | 41 | sourcemap: false, |
| 6dd74de | | | 42 | } |
| 6dd74de | | | 43 | ); |
| 6dd74de | | | 44 | } |
| 6dd74de | | | 45 | if (entryName === 'mermaid-zenuml') { |
| 6dd74de | | | 46 | const iifeOptions: MermaidBuildOptions = { |
| 6dd74de | | | 47 | ...commonOptions, |
| 6dd74de | | | 48 | format: 'iife', |
| 6dd74de | | | 49 | globalName: 'mermaid-zenuml', |
| 6dd74de | | | 50 | }; |
| 6dd74de | | | 51 | buildConfigs.push( |
| 6dd74de | | | 52 | // mermaid-zenuml.js |
| 6dd74de | | | 53 | { ...iifeOptions }, |
| 6dd74de | | | 54 | // mermaid-zenuml.min.js |
| 6dd74de | | | 55 | { ...iifeOptions, minify: true, metafile: shouldVisualize } |
| 6dd74de | | | 56 | ); |
| 6dd74de | | | 57 | } |
| 6dd74de | | | 58 | |
| 6dd74de | | | 59 | const results = await Promise.all(buildConfigs.map((option) => build(getBuildConfig(option)))); |
| 6dd74de | | | 60 | |
| 6dd74de | | | 61 | if (shouldVisualize) { |
| 6dd74de | | | 62 | for (const { metafile } of results) { |
| 6dd74de | | | 63 | if (!metafile?.outputs) { |
| 6dd74de | | | 64 | continue; |
| 6dd74de | | | 65 | } |
| 6dd74de | | | 66 | const fileName = Object.keys(metafile.outputs) |
| 6dd74de | | | 67 | .find((file) => !file.includes('chunks') && file.endsWith('js'))! |
| 6dd74de | | | 68 | .replace('dist/', ''); |
| 6dd74de | | | 69 | // Upload metafile into https://esbuild.github.io/analyze/ |
| 6dd74de | | | 70 | await writeFile(`stats/${fileName}.meta.json`, JSON.stringify(metafile)); |
| 6dd74de | | | 71 | } |
| 6dd74de | | | 72 | } |
| 6dd74de | | | 73 | }; |
| 6dd74de | | | 74 | |
| 6dd74de | | | 75 | const handler = (e) => { |
| 6dd74de | | | 76 | // eslint-disable-next-line no-console |
| 6dd74de | | | 77 | console.error(e); |
| 6dd74de | | | 78 | process.exit(1); |
| 6dd74de | | | 79 | }; |
| 6dd74de | | | 80 | |
| 6dd74de | | | 81 | const buildTinyMermaid = async () => { |
| 6dd74de | | | 82 | await mkdir('./packages/tiny/dist', { recursive: true }); |
| 6dd74de | | | 83 | await rename( |
| 6dd74de | | | 84 | './packages/mermaid/dist/mermaid.tiny.min.js', |
| 6dd74de | | | 85 | './packages/tiny/dist/mermaid.tiny.js' |
| 6dd74de | | | 86 | ); |
| 6dd74de | | | 87 | // Copy version from mermaid's package.json to tiny's package.json |
| 6dd74de | | | 88 | const mermaidPkg = JSON.parse(await readFile('./packages/mermaid/package.json', 'utf8')); |
| 6dd74de | | | 89 | const tinyPkg = JSON.parse(await readFile('./packages/tiny/package.json', 'utf8')); |
| 6dd74de | | | 90 | tinyPkg.version = mermaidPkg.version; |
| 6dd74de | | | 91 | |
| 6dd74de | | | 92 | await writeFile('./packages/tiny/package.json', JSON.stringify(tinyPkg, null, 2) + '\n'); |
| 6dd74de | | | 93 | await cp('./packages/mermaid/CHANGELOG.md', './packages/tiny/CHANGELOG.md'); |
| 6dd74de | | | 94 | }; |
| 6dd74de | | | 95 | |
| 6dd74de | | | 96 | const main = async () => { |
| 6dd74de | | | 97 | await generateLangium(); |
| 6dd74de | | | 98 | await mkdir('stats', { recursive: true }); |
| 6dd74de | | | 99 | const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[]; |
| 6dd74de | | | 100 | // it should build `parser` before `mermaid` because it's a dependency |
| 6dd74de | | | 101 | for (const pkg of packageNames) { |
| 6dd74de | | | 102 | await buildPackage(pkg).catch(handler); |
| 6dd74de | | | 103 | } |
| 6dd74de | | | 104 | await buildTinyMermaid(); |
| 6dd74de | | | 105 | }; |
| 6dd74de | | | 106 | |
| 6dd74de | | | 107 | void main(); |