diff --git a/.vite/build.ts b/.vite/build.ts new file mode 100644 index 000000000..327be2dcb --- /dev/null +++ b/.vite/build.ts @@ -0,0 +1,81 @@ +import { build, InlineConfig } from 'vite'; +import { resolve } from 'path'; +import { fileURLToPath } from 'url'; +import jisonPlugin from './jisonPlugin.js'; +import pkg from '../package.json' assert { type: 'json' }; +import { OutputOptions } from 'vite/node_modules/rollup'; +const { dependencies } = pkg; +const watch = process.argv.includes('--watch'); +const __dirname = fileURLToPath(new URL('.', import.meta.url)); + +interface BuildOptions { + minify: boolean | 'esbuild'; + core?: boolean; + watch?: boolean; +} + +export const getBuildConfig = ({ minify, core, watch }: BuildOptions): InlineConfig => { + const external = ['require', 'fs', 'path']; + let output: OutputOptions | OutputOptions[] = [ + { + name: 'mermaid', + format: 'esm', + sourcemap: true, + entryFileNames: `[name].esm${minify ? '.min' : ''}.mjs`, + }, + { + name: 'mermaid', + format: 'umd', + sourcemap: true, + entryFileNames: `[name]${minify ? '.min' : ''}.js`, + }, + ]; + + if (core) { + external.push(...Object.keys(dependencies)); + output = { + name: 'mermaid', + format: 'esm', + sourcemap: true, + entryFileNames: `[name].core.mjs`, + }; + } + + const config: InlineConfig = { + configFile: false, + build: { + emptyOutDir: false, + lib: { + entry: resolve(__dirname, '../src/mermaid.ts'), + name: 'mermaid', + // the proper extensions will be added + fileName: 'mermaid', + }, + minify, + rollupOptions: { + external, + output, + }, + }, + resolve: { + extensions: ['.jison', '.js', '.ts', '.json'], + }, + plugins: [jisonPlugin()], + }; + + if (watch && config.build) { + config.build.watch = { + include: 'src/**', + }; + } + + return config; +}; + +if (watch) { + build(getBuildConfig({ minify: false, watch })); +} else { + build(getBuildConfig({ minify: false })); + build(getBuildConfig({ minify: 'esbuild' })); + build(getBuildConfig({ minify: true, core: true })); +} diff --git a/.vite/jisonPlugin.js b/.vite/jisonPlugin.js new file mode 100644 index 000000000..febc9885b --- /dev/null +++ b/.vite/jisonPlugin.js @@ -0,0 +1,17 @@ +import { transformJison } from './jisonTransformer.js'; +const fileRegex = /\.(jison)$/; + +export default function jison() { + return { + name: 'jison', + + transform(src, id) { + if (fileRegex.test(id)) { + return { + code: transformJison(src), + map: null, // provide source map if available + }; + } + }, + }; +} diff --git a/.vite/jisonTransformer.js b/.vite/jisonTransformer.js new file mode 100644 index 000000000..f54bed0c3 --- /dev/null +++ b/.vite/jisonTransformer.js @@ -0,0 +1,15 @@ +import jison from 'jison'; + +export const transformJison = (src) => { + const parser = new jison.Generator(src, { + moduleType: 'js', + 'token-stack': true, + }); + const source = parser.generate({ moduleMain: '() => {}' }); + const exporter = ` + parser.parser = parser; + export { parser }; + export default parser; + `; + return `${source} ${exporter}`; +}; diff --git a/.vite/server.mjs b/.vite/server.mjs deleted file mode 100644 index e8f529420..000000000 --- a/.vite/server.mjs +++ /dev/null @@ -1,33 +0,0 @@ -import express from 'express'; -import { createServer as createViteServer } from 'vite'; - -async function createServer() { - const app = express(); - - // Create Vite server in middleware mode - // const vite = await createViteServer({ - // configFile: './vite.config.cts', - // server: { middlewareMode: true }, - // appType: 'custom', // don't include Vite's default HTML handling middlewares - // }); - - app.use(express.static('dist')); - app.use(express.static('demos')); - app.use(express.static('cypress/platform')); - // Use vite's connect instance as middleware - // app.use(vite.middlewares); - - app.use('*', async (req, res) => { - // Since `appType` is `'custom'`, should serve response here. - // Note: if `appType` is `'spa'` or `'mpa'`, Vite includes middlewares to handle - // HTML requests and 404s so user middlewares should be added - // before Vite's middlewares to take effect instead - res.end('Hello world!'); - }); - - app.listen(9000, () => { - console.log(`Listening on http://localhost:9000`); - }); -} - -createServer(); diff --git a/.vite/server.ts b/.vite/server.ts new file mode 100644 index 000000000..685a94ce6 --- /dev/null +++ b/.vite/server.ts @@ -0,0 +1,26 @@ +import express from 'express'; +import { build, createServer as createViteServer } from 'vite'; +// import { getBuildConfig } from './build'; + +async function createServer() { + const app = express(); + + // Create Vite server in middleware mode + const vite = await createViteServer({ + configFile: './vite.config.ts', + server: { middlewareMode: true }, + appType: 'custom', // don't include Vite's default HTML handling middlewares + }); + + app.use(express.static('dist')); + app.use(express.static('demos')); + app.use(express.static('cypress/platform')); + app.use(vite.middlewares); + + app.listen(9000, () => { + console.log(`Listening on http://localhost:9000`); + }); +} + +// build(getBuildConfig({ minify: false, watch: true })); +createServer(); diff --git a/cypress/platform/bundle-test.js b/cypress/platform/bundle-test.js index 373f8741a..074dd8c63 100644 --- a/cypress/platform/bundle-test.js +++ b/cypress/platform/bundle-test.js @@ -1,4 +1,4 @@ -import mermaid from '../../dist/mermaid.core'; +import mermaid from '../../src/mermaid'; let code = `flowchart LR Power_Supply --> Transmitter_A diff --git a/cypress/platform/webpackUsage.html b/cypress/platform/webpackUsage.html index ec6edb4ea..23df19f49 100644 --- a/cypress/platform/webpackUsage.html +++ b/cypress/platform/webpackUsage.html @@ -12,6 +12,8 @@
- +