#!/usr/bin/env bash # Compila o Word Tracer (jogo de palavras estilo "roda de letras" + palavras cruzadas, de Paul Hoskinson, MIT; TypeScript + Vite + # Capacitor so no Android) a partir do commit 272cf91 de github.com/plhosk/wordtracer, com o "npm ci" do package-lock.json do autor # e "vite build --base ./", Node 24.21.0 de artifacts/tools (sem o "tsc" do script "build" do autor: so checa tipos). # # Mudancas (word-tracer/word-tracer-fredygames.patch): CSP no index.html que bloqueia qualquer requisicao fora da pasta e o link do # GitHub na tela de configuracoes vira texto. O jogo nao tem imagem alem do favicon, nem som, nem fonte; os dados (niveis e # dicionario, em src/data/*.json) vao no build. Definicoes do WordNet 3.0 exigem o aviso de licenca da Princeton em toda copia: # word-tracer/wordnet-3.0-LICENSE.txt (o arquivo LICENSE do WordNet-3.0.tar.gz oficial) entra no licenses.txt e no LICENSE.txt do jogo. # # src/FredGames.Bundler/Builds/build-word-tracer.sh # # Saida: artifacts/build/word-tracer-272cf91/{word-tracer-272cf91-dist.tar.gz,licenses.txt}; o tar.gz tem que sair igual em dois builds. set -euo pipefail COMMIT=272cf919353b253bb4e66ae6c8a451882e547418 SHA256=b8c4c1102871764f882900390bb86ae941366f5efdd1ae25ba92889c5b6ae158 NODE=24.21.0 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/word-tracer-${COMMIT:0:7}" cache="$root/artifacts/build/cache" nodebin="$root/artifacts/tools/node-v$NODE/bin" [ -x "$nodebin/node" ] && [ "$("$nodebin/node" -v)" = "v$NODE" ] || { echo "Precisa do Node $NODE em $nodebin." >&2; exit 1; } export PATH="$nodebin:$PATH" mkdir -p "$cache" if [ ! -f "$cache/wordtracer-${COMMIT:0:7}.tar.gz" ]; then curl -fsSL --retry 4 "https://github.com/plhosk/wordtracer/archive/$COMMIT.tar.gz" -o "$cache/wordtracer-${COMMIT:0:7}.tar.gz.partial" \ && mv "$cache/wordtracer-${COMMIT:0:7}.tar.gz.partial" "$cache/wordtracer-${COMMIT:0:7}.tar.gz" fi echo "$SHA256 $cache/wordtracer-${COMMIT:0:7}.tar.gz" | shasum -a 256 -c - rm -rf "$out" mkdir -p "$out/tree" tar -xzf "$cache/wordtracer-${COMMIT:0:7}.tar.gz" -C "$out/tree" --strip-components 1 patch -s -p1 -d "$out/tree" < "$here/word-tracer/word-tracer-fredygames.patch" cd "$out/tree" export npm_config_cache="$cache/npm-word-tracer" npm_config_update_notifier=false npm ci --ignore-scripts --no-audit --no-fund --loglevel=error npx vite build --base ./ > "$out/build.log" 2>&1 || { tail -30 "$out/build.log"; exit 1; } [ -s dist/index.html ] if grep -rqE 'https?://(fonts|cdn|www\.google|api)' dist/index.html dist/assets/*.js 2>/dev/null; then echo "build com URL externa suspeita" >&2; exit 1; fi { echo "== Word Tracer (LICENSE do repositorio, MIT)" cat LICENSE echo echo "== THIRD_PARTY_NOTICES.md do repositorio" cat THIRD_PARTY_NOTICES.md echo echo "== WordNet 3.0 (LICENSE do WordNet-3.0.tar.gz da Princeton University)" cat "$here/word-tracer/wordnet-3.0-LICENSE.txt" echo for pkg in @capacitor/core @capacitor/preferences; 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 dist "$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 > "word-tracer-${COMMIT:0:7}-dist.tar.gz" && rm files.txt ) du -sh "$out/dist" cd "$out" && rm -rf tree ls -l "$out/word-tracer-${COMMIT:0:7}-dist.tar.gz" shasum -a 256 "$out/word-tracer-${COMMIT:0:7}-dist.tar.gz" "$out/licenses.txt"