Skip to content

Commit 1a25f2b

Browse files
committed
feat: Copy public directory to outputs
1 parent e3e9c0d commit 1a25f2b

File tree

9 files changed

+41
-0
lines changed

9 files changed

+41
-0
lines changed

demo/exvite.config.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,13 @@ export default defineConfig({
44
storeIds: {
55
chrome: '123',
66
},
7+
manifest: {
8+
icons: {
9+
'16': 'icon/16.png',
10+
'32': 'icon/32.png',
11+
'48': 'icon/48.png',
12+
'96': 'icon/96.png',
13+
'128': 'icon/128.png',
14+
},
15+
},
716
});

demo/public/icon/128.png

12.4 KB
Loading

demo/public/icon/16.png

698 Bytes
Loading

demo/public/icon/32.png

1.59 KB
Loading

demo/public/icon/48.png

2.87 KB
Loading

demo/public/icon/96.png

7.89 KB
Loading

src/types/external.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { UnimportOptions } from 'unimport';
55
export interface InlineConfig {
66
root?: string;
77
srcDir?: string;
8+
publicDir?: string;
89
entrypointsDir?: string;
910
configFile?: string | false;
1011
storeIds?: {

src/types/internal.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { UnimportOptions } from 'unimport';
1212
export interface InternalConfig {
1313
root: string;
1414
srcDir: string;
15+
publicDir: string;
1516
exviteDir: string;
1617
typesDir: string;
1718
entrypointsDir: string;

src/utils/buildEntrypoints.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import { groupEntrypoints } from './groupEntrypoints';
44
import * as plugins from '../vite-plugins';
55
import { removeEmptyDirs } from './removeEmptyDirs';
66
import { getEntrypointBundlePath } from './entrypoints';
7+
import glob from 'fast-glob';
8+
import fs from 'fs-extra';
9+
import { dirname, resolve } from 'path';
710

811
export async function buildEntrypoints(
912
entrypoints: Entrypoint[],
@@ -18,6 +21,8 @@ export async function buildEntrypoints(
1821
: await buildSingleEntrypoint(group, config);
1922
outputs.push(output);
2023
}
24+
const publicOutput = await copyPublicDirectory(config);
25+
outputs.push(publicOutput);
2126

2227
// Remove any empty directories from moving outputs around
2328
await removeEmptyDirs(config.outDir);
@@ -105,3 +110,28 @@ function getBuildOutput(
105110
if (Array.isArray(result)) return result.flatMap(({ output }) => output);
106111
return result.output;
107112
}
113+
114+
async function copyPublicDirectory(
115+
config: InternalConfig,
116+
): Promise<BuildOutput> {
117+
if (!(await fs.exists(config.publicDir))) return [];
118+
119+
const files = await glob('**/*', { cwd: config.publicDir });
120+
121+
const outputs: BuildOutput = [];
122+
for (const file of files) {
123+
const srcPath = resolve(config.publicDir, file);
124+
const outPath = resolve(config.outDir, file);
125+
126+
await fs.ensureDir(dirname(outPath));
127+
await fs.copyFile(srcPath, outPath);
128+
outputs.push({
129+
type: 'asset',
130+
fileName: file,
131+
name: file,
132+
needsCodeReference: false,
133+
source: await fs.readFile(srcPath),
134+
});
135+
}
136+
return outputs;
137+
}

0 commit comments

Comments
 (0)