58 lines
1.4 KiB
Bash
58 lines
1.4 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# Bundle a Vite React project into a single HTML file
|
||
|
|
# Usage: bash scripts/bundle-artifact.sh
|
||
|
|
# Run from project root (where package.json is)
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
echo "📦 Bundling to single HTML file..."
|
||
|
|
|
||
|
|
# Check if we're in a project directory
|
||
|
|
if [ ! -f "package.json" ]; then
|
||
|
|
echo "❌ Error: No package.json found. Run this from your project root."
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check if index.html exists
|
||
|
|
if [ ! -f "index.html" ]; then
|
||
|
|
echo "❌ Error: No index.html found in project root."
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Install bundling dependencies if needed
|
||
|
|
if ! npm ls parcel > /dev/null 2>&1; then
|
||
|
|
echo "📦 Installing bundling dependencies..."
|
||
|
|
npm install -D parcel @parcel/config-default parcel-resolver-tspaths html-inline
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Create .parcelrc if it doesn't exist
|
||
|
|
if [ ! -f ".parcelrc" ]; then
|
||
|
|
echo "⚙️ Creating Parcel config..."
|
||
|
|
cat > .parcelrc << 'EOF'
|
||
|
|
{
|
||
|
|
"extends": "@parcel/config-default",
|
||
|
|
"resolvers": ["parcel-resolver-tspaths", "..."]
|
||
|
|
}
|
||
|
|
EOF
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Build with Parcel
|
||
|
|
echo "🔨 Building with Parcel..."
|
||
|
|
npx parcel build index.html --no-source-maps --dist-dir dist-parcel
|
||
|
|
|
||
|
|
# Inline all assets
|
||
|
|
echo "📄 Inlining assets into single HTML..."
|
||
|
|
npx html-inline -i dist-parcel/index.html -o bundle.html -b dist-parcel
|
||
|
|
|
||
|
|
# Clean up
|
||
|
|
rm -rf dist-parcel .parcel-cache
|
||
|
|
|
||
|
|
# Get file size
|
||
|
|
SIZE=$(ls -lh bundle.html | awk '{print $5}')
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "✅ Bundle created: bundle.html ($SIZE)"
|
||
|
|
echo ""
|
||
|
|
echo "You can now share this file or use it as a Claude artifact."
|
||
|
|
echo ""
|