#!/usr/bin/env bash # Compila o Atom Clicker (jogo incremental de atomos, de Ayfri, GPL-3.0; SvelteKit 3 + Svelte 5 + Tailwind 4) a partir do commit 11bf767 de # github.com/Ayfri/Atom-Clicker, como site estatico de pagina unica (SPA, roteador por hash), sem servidor: "bun install --frozen-lockfile" # com o bun.lock do autor (bun 1.4.3, conferido pelo sha256), "vite build" com o Node 24.21.0 e o @sveltejs/adapter-static 4.0.1 no lugar do # adapter-cloudflare. # # O jogo original depende de um servidor (Supabase: contas, placar, nuvem, "Quarks", Collider, estatisticas, telemetria) e de servicos de # terceiros (Google Analytics, Cloudflare Insights, Google One Tap, formulario Tally, Discord, Ko-fi/Buy me a coffee). Nesta versao so # ficam os saves locais (localStorage): # - atom-clicker/deletions.txt: rotas /api, callback, benchmark, hooks do servidor, lib/server, service worker, supabase/, testes, modais e # abas de login/placar/Quarks/Collider/perfil/feedback/legal, DevTools, SEO, Analytics, manifest, sitemap e imagens de compartilhamento; # - atom-clicker-fredygames.patch: supabaseAuth, remoteMessage, errorReporting e PerfMonitor viram versoes inertes (sem rede, sempre "sem # login"; o resto do jogo continua usando a mesma interface), NavBar sem Placar/Quarks/Collider, Configuracoes sem Conta/Feedback/Legal # (entra a aba "Save" local, com o reset), Creditos e rodape sem links, app.html com CSP que bloqueia tudo fora da pasta, caminhos # relativos (Changelog, particulas), adapter-static + roteador por hash e sem service worker. # O fonte completo (tarball do commit, patch, lista de remocoes, este script) vai junto: GPL. # # src/FredGames.Bundler/Builds/build-atom-clicker.sh # # Saida: artifacts/build/atom-clicker-11bf767/{atom-clicker-11bf767-dist.tar.gz,licenses.txt}; o tar.gz tem que sair igual em dois builds. set -euo pipefail COMMIT=11bf7675c9da68aae03ec3fdba522160076de8f7 SHA256=32351776cb3601af3bc8041b1fceb324af38cec90de9c7d7d83626a0b3863d20 NODE=24.21.0 BUN=1.4.3 BUN_SHA256=80afd4c069b46a6fa8f3ec520bebc750a7843e4a8d5b9583d29ad436c00a3403 ADAPTER=4.0.1 ADAPTER_SHA256=c15058b0434434f20fa77dd8da06a4ea8b440ec445be453b177775f1a2170295 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/atom-clicker-${COMMIT:0:7}" cache="$root/artifacts/build/cache" nodebin="$root/artifacts/tools/node-v$NODE/bin" bundir="$root/artifacts/tools/bun-$BUN" [ -x "$nodebin/node" ] && [ "$("$nodebin/node" -v)" = "v$NODE" ] || { echo "Precisa do Node $NODE em $nodebin." >&2; exit 1; } export PATH="$nodebin:$bundir/bun-darwin-aarch64:$PATH" mkdir -p "$cache" fetch() { if [ ! -f "$cache/$2" ]; then curl -fsSL --retry 4 "$1" -o "$cache/$2.partial" && mv "$cache/$2.partial" "$cache/$2" fi echo "$3 $cache/$2" | shasum -a 256 -c - } fetch "https://github.com/Ayfri/Atom-Clicker/archive/$COMMIT.tar.gz" "Atom-Clicker-${COMMIT:0:7}.tar.gz" "$SHA256" fetch "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-$ADAPTER.tgz" "adapter-static-$ADAPTER.tgz" "$ADAPTER_SHA256" fetch "https://github.com/oven-sh/bun/releases/download/bun-v$BUN/bun-darwin-aarch64.zip" "bun-$BUN-darwin-aarch64.zip" "$BUN_SHA256" if [ ! -x "$bundir/bun-darwin-aarch64/bun" ]; then mkdir -p "$bundir" && unzip -q -o "$cache/bun-$BUN-darwin-aarch64.zip" -d "$bundir" fi [ "$(bun --version)" = "$BUN" ] || { echo "bun $BUN esperado" >&2; exit 1; } rm -rf "$out" mkdir -p "$out/tree" tar -xzf "$cache/Atom-Clicker-${COMMIT:0:7}.tar.gz" -C "$out/tree" --strip-components 1 cd "$out/tree" while IFS= read -r path; do [ -n "$path" ] && rm -rf "./$path"; done < "$here/atom-clicker/deletions.txt" find src -name '*.test.ts' -delete patch -s -p1 < "$here/atom-clicker/atom-clicker-fredygames.patch" export BUN_INSTALL_CACHE_DIR="$cache/bun-atom-clicker" bun install --frozen-lockfile --ignore-scripts > "$out/install.log" 2>&1 || { tail -20 "$out/install.log"; exit 1; } mkdir -p node_modules/@sveltejs/adapter-static tar -xzf "$cache/adapter-static-$ADAPTER.tgz" -C node_modules/@sveltejs/adapter-static --strip-components 1 NO_COLOR=1 node_modules/.bin/vite build > "$out/vite.log" 2>&1 || { tail -30 "$out/vite.log"; exit 1; } [ -s build/index.html ] && [ -d build/_app ] # O index.html de entrada (fallback do adapter-static) traz caminhos absolutos; a pagina roda numa subpasta. python3 -I - <<'PY' p = 'build/index.html' s = open(p).read() n = s.count('"/_app/') + s.count('"/currencies/') s = s.replace('"/_app/', '"./_app/').replace('"/currencies/', '"./currencies/') assert n > 10 and '"/_app' not in s and 'href="/' not in s and 'src="/' not in s open(p, 'w').write(s) PY if grep -rqE "supabase\.co|googletagmanager|cloudflareinsights|accounts\.google|tally\.so|buymeacoffee|discord\.ayfri|ko-fi" build; then echo "o build ainda cita um servico de terceiros" >&2; grep -rlE "supabase\.co|googletagmanager|cloudflareinsights|accounts\.google|tally\.so|buymeacoffee|discord\.ayfri|ko-fi" build >&2; exit 1 fi { echo "== Atom Clicker (LICENSE do repositorio, GNU GPL v3)" cat LICENSE echo for pkg in svelte @sveltejs/kit @lucide/svelte; do echo "== $pkg $(node -p "require('./node_modules/$pkg/package.json').version") (entra no bundle; package.json: $(node -p "require('./node_modules/$pkg/package.json').license"))" for f in node_modules/$pkg/LICEN[CS]E*; do [ -f "$f" ] && cat "$f"; done echo done } > "$out/licenses.txt" cp -R build "$out/dist" find "$out/dist" -exec touch -t 202611020000 {} + ( cd "$out" && find dist -type f | LC_ALL=C sort > files.txt \ && COPYFILE_DISABLE=1 tar --format=ustar --uid 0 --gid 0 --uname root --gname root -n -cf - -T files.txt \ | gzip -n -9 > "atom-clicker-${COMMIT:0:7}-dist.tar.gz" && rm files.txt ) du -sh "$out/dist" cd "$out" && rm -rf tree ls -l "$out/atom-clicker-${COMMIT:0:7}-dist.tar.gz" shasum -a 256 "$out/atom-clicker-${COMMIT:0:7}-dist.tar.gz" "$out/licenses.txt"