-
Notifications
You must be signed in to change notification settings - Fork 1
/
vite.config.ts
68 lines (55 loc) · 1.8 KB
/
vite.config.ts
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
import { defineConfig } from 'vite';
import fs from 'fs';
import react from '@vitejs/plugin-react-swc';
type Manifest = {
size: 'comfortable' | 'large' | 'default';
name: string;
publicDir?: string;
};
function webflowExtension(manifest: Manifest) {
const domain = 'webflow-ext.com';
const templatePromise = fetch(
`https://${domain}/template/v2?name=${manifest.name}`
)
.then((res) => res.text())
.catch(() => console.log('Failed retrieving template'));
const headRegex = /<head[^>]*>([\s\S]*?)<\/head>/i;
const bodyRegex = /<body[^>]*>([\s\S]*?)<\/body>/i;
return {
name: 'webflow-extension',
/**
* Intercept manifest requests.
*/
configureServer(server) {
server.middlewares.use(async (req, res, next) => {
if (req.url === '/__webflow') {
const manifestJSON = JSON.stringify(manifest);
res.writeHead(200, {
'Content-Length': Buffer.byteLength(manifestJSON),
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': '*',
});
return res.end(manifestJSON);
}
next();
});
},
/**
* Transform entry index.html.
*/
async transformIndexHtml(html, { path }) {
if (path !== '/index.html') return html;
const template = await templatePromise;
if (!template) return html;
const headMatch = html.match(headRegex)?.[1] || '';
const bodyMatch = html.match(bodyRegex)?.[1] || '';
const extensionHtml = template.replace('{{ui}}', headMatch + bodyMatch);
return extensionHtml;
},
};
}
const webflowManifest = JSON.parse(fs.readFileSync('webflow.json', 'utf8'));
export default defineConfig({
plugins: [react(), webflowExtension(webflowManifest)],
});