-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvite.config.ts
More file actions
134 lines (124 loc) · 4.31 KB
/
Copy pathvite.config.ts
File metadata and controls
134 lines (124 loc) · 4.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import { defineConfig } from 'vite';
import preact from '@preact/preset-vite';
import { crx } from '@crxjs/vite-plugin';
import tailwindcss from '@tailwindcss/vite';
import manifest from './src/manifest';
import { resolve } from 'path';
import { copyFileSync, mkdirSync, existsSync, readdirSync } from 'fs';
/**
* Vite plugin to copy the ONNX Runtime WASM file and the NSFW model
* into dist/assets/models/ after build. Loaded at runtime via chrome.runtime.getURL.
* Only copies the basic WASM backend (12 MB) — no WebGPU/WebGL variants.
*/
function copyOnnxAssets() {
return {
name: 'copy-onnx-assets',
closeBundle() {
const outDir = resolve(__dirname, 'dist/assets/models');
if (!existsSync(outDir)) {
mkdirSync(outDir, { recursive: true });
}
// Copy only the basic WASM backend
const wasmSrc = resolve(
__dirname,
'node_modules/onnxruntime-web/dist/ort-wasm-simd-threaded.wasm',
);
if (existsSync(wasmSrc)) {
copyFileSync(wasmSrc, resolve(outDir, 'ort-wasm-simd-threaded.wasm'));
}
// Also copy the .mjs proxy needed by ORT to instantiate the WASM
const mjsSrc = resolve(
__dirname,
'node_modules/onnxruntime-web/dist/ort-wasm-simd-threaded.mjs',
);
if (existsSync(mjsSrc)) {
copyFileSync(mjsSrc, resolve(outDir, 'ort-wasm-simd-threaded.mjs'));
}
// Copy the NSFW ONNX model (ViT-Tiny) if it exists
const modelSrc = resolve(__dirname, 'src/assets/models/nsfw.onnx');
if (existsSync(modelSrc)) {
copyFileSync(modelSrc, resolve(outDir, 'nsfw.onnx'));
}
// Also check for the quantized variant
const quantModelSrc = resolve(__dirname, 'src/assets/models/nsfw-q8.onnx');
if (existsSync(quantModelSrc)) {
copyFileSync(quantModelSrc, resolve(outDir, 'nsfw.onnx'));
}
// ---- ML text classifier model (Transformers.js) ----
const mlModelsDir = resolve(__dirname, 'dist/assets/ml-models');
if (!existsSync(mlModelsDir)) {
mkdirSync(mlModelsDir, { recursive: true });
}
// Copy ML model files (recursive)
const mlModelSrc = resolve(__dirname, 'src/assets/ml-models');
if (existsSync(mlModelSrc)) {
copyDirRecursive(mlModelSrc, mlModelsDir);
}
// Copy Transformers.js WASM files
const wasmOutDir = resolve(mlModelsDir, 'wasm');
if (!existsSync(wasmOutDir)) {
mkdirSync(wasmOutDir, { recursive: true });
}
const transformersOrtDir = resolve(
__dirname,
'node_modules/@huggingface/transformers/dist',
);
// Only copy the WASM backends we actually use (SIMD + threaded)
const neededWasm = new Set([
'ort-wasm-simd-threaded.wasm',
'ort-wasm-simd.wasm',
]);
if (existsSync(transformersOrtDir)) {
for (const f of readdirSync(transformersOrtDir)) {
if (f.endsWith('.wasm') && neededWasm.has(f)) {
copyFileSync(resolve(transformersOrtDir, f), resolve(wasmOutDir, f));
}
}
}
},
};
}
/** Recursively copy a directory. */
function copyDirRecursive(src: string, dest: string): void {
if (!existsSync(dest)) mkdirSync(dest, { recursive: true });
for (const entry of readdirSync(src, { withFileTypes: true })) {
const srcPath = resolve(src, entry.name);
const destPath = resolve(dest, entry.name);
if (entry.isDirectory()) {
copyDirRecursive(srcPath, destPath);
} else {
copyFileSync(srcPath, destPath);
}
}
}
export default defineConfig({
plugins: [
preact(),
tailwindcss(),
crx({ manifest }),
copyOnnxAssets(),
],
resolve: {
alias: {
'@': resolve(__dirname, 'src'),
'react': 'preact/compat',
'react-dom': 'preact/compat',
'react-dom/client': 'preact/compat',
'react/jsx-runtime': 'preact/jsx-runtime',
// Use WASM-only ORT entry (no WebGPU/WebGL) — 52 KB vs 396 KB
'onnxruntime-web': 'onnxruntime-web/wasm',
},
conditions: ['onnxruntime-web-use-extern-wasm'],
},
build: {
outDir: 'dist',
sourcemap: false,
chunkSizeWarningLimit: 2000,
rollupOptions: {
input: {
offscreen: resolve(__dirname, 'src/ml-inference/offscreen.html'),
'filter-worker': resolve(__dirname, 'src/content/filter-worker.ts'),
},
},
},
});