#!/usr/bin/env bash # Usage: scripts/typecheck-js.sh # Type-checks the JavaScript track with TypeScript, using js/jsconfig.json and the types in js/src/types.d.ts. # Two runs, both must be clean: # 1. the untouched stubs in js/src (a student's starting point must not show errors in the editor); # 2. a temp copy of the repo whose js/src holds the solutions. # Nothing is installed in the repo: TypeScript comes from `npx -y -p typescript tsc`, which needs the network the # first time (npm caches it afterwards). Set TS_PACKAGE to pin a version, e.g. TS_PACKAGE=typescript@5.9. # Exit: 0 clean, 1 type errors, 2 TypeScript could not be run (no npx, no network). set -uo pipefail repo="$(cd "$(dirname "$0")/.." && pwd)" pkg="${TS_PACKAGE:-typescript}" if ! command -v npx >/dev/null 2>&1; then echo "typecheck-js: npx not found (it comes with Node.js); cannot run TypeScript" >&2; exit 2 fi if ! version="$(npx -y -p "$pkg" tsc --version 2>&1)"; then echo "typecheck-js: could not run 'npx -y -p $pkg tsc' (no network, or npm cannot reach its registry)." >&2 echo "$version" | tail -5 >&2 echo "typecheck-js: nothing was checked." >&2 exit 2 fi version="$(grep -o 'Version .*' <<<"$version")" tmp="$(mktemp -d)" trap 'rm -rf "$tmp"' EXIT tar -C "$repo" --exclude=.git --exclude=node_modules --exclude=bin --exclude=obj \ --exclude=.scala-build --exclude=.bsp --exclude=.superpowers -cf - js | tar -C "$tmp" -xf - mkdir -p "$tmp/stubs" "$tmp/solved" cp -r "$tmp/js" "$tmp/stubs/js" mv "$tmp/js" "$tmp/solved/js" rm -rf "$tmp/solved/js/src" cp -r "$tmp/solved/js/solutions" "$tmp/solved/js/src" status=0 for which in stubs solved; do label="$([ "$which" = stubs ] && echo "js/src (stubs)" || echo "js/solutions as src")" if out="$(cd "$tmp/$which" && npx -y -p "$pkg" tsc -p js/jsconfig.json 2>&1)"; then echo "$label: ok ($version)" else echo "$label: FAIL" grep -v '^npm notice' <<<"$out" status=1 fi done exit $status