Files
integration/packages/integration/vite.html-config.ts
Emmanuel Pelletier d9859f1564 first commit:
- we have a static astro website under /website. It has the
implementation docs of the homepage/gaufre templates, and it handles the
few API endpoints (the gaufre js, backgrounds, logos)
- we have a vite app under /packages/integration. It has the react
components generating the homepage and the gaufre button, and their css.
Its used to generate an npm package
2024-05-02 00:35:38 +02:00

66 lines
2.0 KiB
TypeScript

import { resolve, basename, join, dirname } from "path"
import { defineConfig } from "vite"
import { renderToStaticMarkup } from "react-dom/server"
import { importSingleTs } from "import-single-ts"
import * as prettier from "prettier"
import { reactConfig } from "./vite.config"
import { ReactNode } from "react"
/*
* this config file takes care of building the HTML files
*
* it is meant to be run just after the react build, as it doesn't empty the dist/ folder
* it works by checking src/html.tsx and generate static HTML files from each exported component
*
* see vite.config.ts for the react files
*/
export default defineConfig({
...reactConfig,
plugins: [...reactConfig.plugins, htmlFromComponents()],
build: {
...reactConfig.build,
emptyOutDir: false,
lib: {
entry: resolve(__dirname, "src/html.tsx"),
name: "lasuite-empty-html-bundle",
fileName: "lasuite-empty-html-bundle",
formats: ["es"],
},
},
})
function htmlFromComponents() {
const reactHtmlComponentRegex = /\.?html\.tsx$/
return {
name: "transform-file",
async transform(_, id) {
if (reactHtmlComponentRegex.test(id)) {
const component = await importSingleTs(id)
component.templates.forEach(async (template: { name: string; render: ReactNode }) => {
const html = await prettier.format(renderToStaticMarkup(template.render), {
parser: "html",
printWidth: 100,
tabWidth: 4,
bracketSameLine: false,
htmlWhitespaceSensitivity: "ignore",
})
this.emitFile({
type: "asset",
fileName: `html/${template.name}.html`,
source: html,
})
})
return {
code: "",
map: null,
}
}
},
// in the end, don't generate the js bundle, it's empty, we only want the html files
generateBundle(_, bundle) {
delete bundle["lasuite-empty-html-bundle.js"]
},
}
}