PORT=8080
SERVER_ENABLED=true
echo "π Starting optimization pipeline..."
echo "π Creating _headers file..."
cat > _headers << 'EOF'
/*
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
EOF
echo "βοΈ Creating minified copies of SQLite files..."
mkdir -p tmp_minified
TERSER="./node_modules/.bin/terser"
if [ ! -f "$TERSER" ]; then
echo "π¦ Installing terser locally..."
npm install terser
fi
SQLITE_FILES=(
"static/sqlite.org/sqlite3.js"
"static/sqlite.org/sqlite3-worker1.js"
"static/sqlite.org/sqlite3-opfs-async-proxy.js"
)
declare -A original_sizes
declare -A minified_sizes
for file in "${SQLITE_FILES[@]}"; do
filename=$(basename "$file")
original_sizes[$filename]=$(stat -c%s "$file" 2>/dev/null || stat -f%z "$file" 2>/dev/null)
$TERSER "$file" -o "tmp_minified/$filename" --compress --mangle 2>/dev/null
minified_sizes[$filename]=$(stat -c%s "tmp_minified/$filename" 2>/dev/null || stat -f%z "tmp_minified/$filename" 2>/dev/null)
cp "$file" "$file.bak"
cp "tmp_minified/$filename" "$file"
done
echo "π SQLite files size reduction:"
for file in "${SQLITE_FILES[@]}"; do
filename=$(basename "$file")
saved=$((original_sizes[$filename] - minified_sizes[$filename]))
percent=$(echo "scale=1; $saved * 100 / ${original_sizes[$filename]}" | bc 2>/dev/null || echo "0")
printf " %-30s %'8d β %'8d bytes (%.1f%% smaller)\n" \
"$filename" "${original_sizes[$filename]}" "${minified_sizes[$filename]}" "$percent"
done
echo "π¦ Building with Trunk..."
trunk build --release
echo "β»οΈ Restoring original SQLite files..."
for file in "${SQLITE_FILES[@]}"; do
mv "$file.bak" "$file"
done
rm -rf tmp_minified
echo "π Copying headers to dist..."
cp _headers dist/_headers
rm _headers
echo "π¦ Setting up local node_modules..."
if [ ! -d "node_modules" ]; then
npm install terser clean-css-cli html-minifier compression
fi
TERSER="./node_modules/.bin/terser"
CLEANCSS="./node_modules/.bin/cleancss"
HTML_MINIFIER="./node_modules/.bin/html-minifier"
echo "π₯ Minifying JavaScript files with Terser..."
find dist -name "*.js" -type f ! -path "*/sqlite.org/*" | while read file; do
if [ -f "$file" ]; then
original_size=$(stat -c%s "$file" 2>/dev/null || stat -f%z "$file" 2>/dev/null)
$TERSER "$file" -o "$file" --compress --mangle 2>/dev/null
new_size=$(stat -c%s "$file" 2>/dev/null || stat -f%z "$file" 2>/dev/null)
saved=$((original_size - new_size))
percent=$(echo "scale=1; $saved * 100 / $original_size" | bc 2>/dev/null || echo "0")
printf " β
%-40s %'8d β %'8d bytes (%.1f%% smaller)\n" "$(basename $file)" "$original_size" "$new_size" "$percent"
fi
done
echo "π¨ Minifying CSS files..."
find dist -name "*.css" -type f | while read file; do
if [ -f "$file" ]; then
original_size=$(stat -c%s "$file" 2>/dev/null || stat -f%z "$file" 2>/dev/null)
$CLEANCSS -o "$file" "$file" 2>/dev/null
new_size=$(stat -c%s "$file" 2>/dev/null || stat -f%z "$file" 2>/dev/null)
printf " β
%-40s %'8d β %'8d bytes\n" "$(basename $file)" "$original_size" "$new_size"
fi
done
echo "π Minifying HTML..."
if [ -f "dist/index.html" ]; then
original_size=$(stat -c%s "dist/index.html" 2>/dev/null || stat -f%z "dist/index.html" 2>/dev/null)
$HTML_MINIFIER --collapse-whitespace --remove-comments --minify-js true --minify-css true -o dist/index.html.tmp dist/index.html
mv dist/index.html.tmp dist/index.html
new_size=$(stat -c%s "dist/index.html" 2>/dev/null || stat -f%z "dist/index.html" 2>/dev/null)
printf " β
%-40s %'8d β %'8d bytes\n" "index.html" "$original_size" "$new_size"
fi
echo "π Compressing WASM files..."
if command -v brotli &> /dev/null; then
find dist -name "*.wasm" -type f -exec brotli -q 11 -f -k {} \;
echo " β
Brotli compression complete"
fi
if command -v gzip &> /dev/null; then
find dist -name "*.wasm" -type f -exec gzip -9 -f -k {} \;
echo " β
Gzip compression complete"
fi
echo "π Creating Express server with compression and headers..."
cat > dist/server.js << 'EOF'
const express = require('express');
const compression = require('compression');
const path = require('path');
const app = express();
const PORT = process.env.PORT || 8080;
// Enable compression (gzip/brotli)
app.use(compression());
// COOP/COEP headers
app.use((req, res, next) => {
res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');
res.setHeader('Cache-Control', 'public, max-age=31536000, immutable');
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
next();
});
// Serve static files
app.use(express.static(path.join(__dirname)));
// SPA fallback (if needed)
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, 'index.html'));
});
app.listen(PORT, () => {
console.log(`π Server running at http://localhost:${PORT}`);
console.log(`π COOP/COEP headers enabled`);
console.log(`π¦ Compression: gzip/brotli enabled`);
});
EOF
cat > dist/package.json << 'EOF'
{
"name": "sqlite-wasm-server",
"version": "1.0.0",
"private": true,
"dependencies": {
"express": "^4.18.2",
"compression": "^1.7.4"
},
"scripts": {
"start": "node server.js"
}
}
EOF
echo "π§Ή Cleaning Trunk variables..."
sed -i 's/{{__trunk_address__}}//g; s/{{__trunk_ws_base__}}//g' dist/index.html
echo "π¦ Installing server dependencies..."
cd dist && npm install
cd ..
echo ""
echo "π OPTIMIZATION SUMMARY"
echo "================================================================================"
echo " Main files:"
ls -lh dist/sqlite-wasm.js 2>/dev/null | awk '{printf " sqlite-wasm.js: %s\n", $5}'
ls -lh dist/sqlite-wasm_bg.wasm 2>/dev/null | awk '{printf " sqlite-wasm_bg.wasm: %s\n", $5}'
ls -lh dist/sqlite-wasm_bg.wasm.gz 2>/dev/null | awk '{printf " sqlite-wasm_bg.wasm.gz: %s\n", $5}'
ls -lh dist/sqlite-wasm_bg.wasm.br 2>/dev/null | awk '{printf " sqlite-wasm_bg.wasm.br: %s\n", $5}'
echo ""
echo " Frontend JS:"
ls -lh dist/static/sqlite-wasm/js/*.js 2>/dev/null | awk '{printf " %s: %s\n", $9, $5}'
echo ""
echo " SQLite files (now minified in blobs):"
for file in "${SQLITE_FILES[@]}"; do
filename=$(basename "$file")
printf " minified %s: %'8d bytes (was %'8d, saved %'d)\n" \
"$filename" "${minified_sizes[$filename]}" "${original_sizes[$filename]}" \
$((original_sizes[$filename] - minified_sizes[$filename]))
done
echo "================================================================================"
echo ""
echo "β
Build complete! Ready to deploy to Cloudflare."
echo ""
if [ "$SERVER_ENABLED" = true ]; then
echo "π Starting Express server with compression and headers..."
echo " Press Ctrl+C to stop"
echo ""
cd dist && node server.js
else
echo "π Server not started (SERVER_ENABLED=$SERVER_ENABLED)"
echo " To start manually: cd dist && node server.js"
fi