From 947d1304d07f5c79c3085ad9494202018c293271 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 22 Aug 2024 04:51:46 -0300 Subject: [PATCH] feat: add support for including static files from `public/` folder --- src/index.ts | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index b7d93bb..0cd6fca 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ -import type { Plugin } from "vite"; +import type { Plugin, ResolvedConfig } from "vite"; import { gzipSync } from "zlib"; -import { writeFileSync, existsSync, mkdirSync } from "fs"; +import { writeFileSync, existsSync, mkdirSync, readdirSync, readFileSync } from "fs"; import ejs from "ejs"; import type { NormalizedOutputOptions, OutputAsset, OutputChunk } from "rollup"; import mime from "mime-types"; @@ -16,18 +16,22 @@ interface Asset { /** * @param logging Whether or not to enable console output during build. Defaults to false + * @param includePublic Whether or not to include static files from Vite's `public/` folder. Defaults to true * @param enforce Enforce plugin invocation tier similar to webpack loaders. */ export interface PluginConfig { logging?: boolean; + includePublic?: boolean; enforce?: Plugin["enforce"]; } export function espViteBuild( configParams: PluginConfig = { logging: false, + includePublic: true, } ): Plugin { + let config: ResolvedConfig; let assets: Asset[] = []; function addAsset( @@ -101,6 +105,9 @@ export function espViteBuild( name: "vite-plugin-preact-esp32", enforce: configParams.enforce, apply: "build", + configResolved(_config) { + config = _config + }, writeBundle(options, bundle) { for (const [filename, data] of Object.entries(bundle)) { console.log("Processing", filename); @@ -108,6 +115,23 @@ export function espViteBuild( addAsset(filename, data, options); } } + if (configParams.includePublic) { + const publicDirFiles = readdirSync(config.publicDir); + for (const filename of publicDirFiles) { + console.log("Processing", filename); + const filePath = path.join(config.publicDir, filename); + const data = { + type: "asset", + source: new Uint8Array( + readFileSync(filePath) + ), + fileName: filename, + name: filename, + needsCodeReference: false, + } satisfies OutputAsset; + addAsset(filename, data, options); + } + } console.log("Creating ESP Output"); createESPOutputFile(options); },