**The app is called WarpEngine Client.** "Store" named the thing it opens rather than the
thing you run, and the store is a catalog on a site, not a window on your machine. The
window title, the bundle, the packages and the menu entry follow; the repository already
did. The store being driven is named in the side menu, so the bar stopped repeating it as
a badge — the element stays in the page, hidden, because the window check reads it.
**Every title is listed, including the ones this machine cannot install.** They arrive
from the engine with `installable: false` and a reason, and they are drawn dimmed, with an
*unsupported platform* or *no build for this machine* badge, the engine's own sentence
underneath, and nothing to press: a disabled Install would invite a click that can never
work. They get a category of their own — *Not for this machine* — and they are kept out of
the native/hosted categories and counts, because a title with no build has no mode to be
counted under. An engine older than desktop 1.2.0 is unaffected: a missing `installable`
field reads as installable, which is what those engines mean.
**A build can be pointed at another site's registry:**
make dist STORES_API=https://games.example.org/api/stores
BuildConfiguration reads the packaged package.json, where electron-builder's
extraMetadata writes that address, so a client for somebody else's catalog needs no source
change and nothing set on the user's machine. Precedence is runtime environment, then
build, then ours — three audiences, most specific first.
Also: the scrollbars are the window's own, because the platform's light track down the
side menu of a dark window looked like a mistake.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
122 lines
4.7 KiB
Makefile
122 lines
4.7 KiB
Makefile
# WarpEngine Client — the front door to the npm scripts.
|
|
#
|
|
# Everything here is a thin wrapper: the app is an Electron project, so npm still
|
|
# does the work. The Makefile exists so the useful sequences have names, and so
|
|
# `make release` is one command rather than a build followed by remembered tea
|
|
# invocations.
|
|
#
|
|
# make list the targets
|
|
# make setup install the dependencies
|
|
# make check typecheck, lint and both test suites
|
|
# make dist package for this machine
|
|
# make release package and publish to Gitea
|
|
#
|
|
# Publishing assumes `tea` is installed and logged in — the devarea repo has
|
|
# `make tea` for that.
|
|
|
|
SHELL := /bin/sh
|
|
SCRIPTS := scripts
|
|
NODE_MIN := 22
|
|
|
|
# The version is package.json's, so the release tag never drifts from the app.
|
|
VERSION := $(shell python3 -c 'import json; print(json.load(open("package.json"))["version"])')
|
|
TAG ?= v$(VERSION)
|
|
|
|
# Which site's store registry a packaged build reads. Empty means the default in
|
|
# package.json (ours); set it to build a client for somebody else's catalog:
|
|
#
|
|
# make dist STORES_API=https://games.example.org/api/stores
|
|
#
|
|
# It is baked into the package's own package.json, so the built app carries it. A runtime
|
|
# STORES_API still overrides it, which is for trying something out rather than shipping.
|
|
STORES_API ?=
|
|
BUILDER_ARGS := $(if $(STORES_API),-- --config.extraMetadata.warpEngine.registryUrl=$(STORES_API),)
|
|
|
|
.DEFAULT_GOAL := help
|
|
|
|
.PHONY: help setup node-check build typecheck lint lint-fix check start smoke uitest test \
|
|
dist dist-mac dist-win dist-linux release publish clean distclean version
|
|
|
|
help: ## List available targets
|
|
@echo "WarpEngine Client $(VERSION) — usage: make <target>"
|
|
@echo
|
|
@grep -E '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | \
|
|
awk 'BEGIN {FS = ":.*?## "}; {printf " %-12s %s\n", $$1, $$2}'
|
|
@echo
|
|
@echo " Variables: TAG=$(TAG) TEA_LOGIN=ttg REPO=<owner/name> NOTES=RELEASE_NOTES.md"
|
|
|
|
node-check: ## Check the Node version Electron's installer needs
|
|
@node -e 'const [maj] = process.versions.node.split("."); \
|
|
if (Number(maj) < $(NODE_MIN)) { \
|
|
console.error("Node $(NODE_MIN)+ is needed to install Electron (found " + process.versions.node + \
|
|
"): its installer is ESM-only. The packaged app carries its own runtime."); \
|
|
process.exit(1); \
|
|
} else { console.log("node " + process.versions.node + " ok"); }'
|
|
|
|
setup: node-check ## Install the dependencies
|
|
npm install
|
|
|
|
build: ## Compile TypeScript and bundle the preload and the renderer
|
|
npm run build
|
|
|
|
typecheck: ## Type-check everything, emitting nothing
|
|
npm run typecheck
|
|
|
|
lint: ## Lint with the strict rule set
|
|
npm run lint
|
|
|
|
lint-fix: ## Lint and fix what can be fixed automatically
|
|
npm run lint:fix
|
|
|
|
# The order is deliberate: a type error explains a lint error, and both explain a
|
|
# failing test, so the cheapest check that can fail runs first.
|
|
check: typecheck lint test ## Type-check, lint, and run both test suites
|
|
|
|
start: ## Run the app against whatever store is installed
|
|
npm start
|
|
|
|
smoke: ## Drive the store bridge with no window at all
|
|
npm run smoke
|
|
|
|
uitest: ## Load the window once and report what rendered
|
|
npm run uitest
|
|
|
|
test: smoke uitest ## Both checks
|
|
|
|
dist: node-check ## Package for this machine
|
|
npm run dist $(BUILDER_ARGS)
|
|
|
|
dist-mac: node-check ## Package for macOS (ad-hoc signed, see the README)
|
|
npm run dist:mac $(BUILDER_ARGS)
|
|
|
|
dist-win: node-check ## Package for Windows
|
|
npm run dist:win $(BUILDER_ARGS)
|
|
|
|
dist-linux: node-check ## Package for Linux
|
|
npm run dist:linux $(BUILDER_ARGS)
|
|
|
|
publish: ## Upload the packages already in dist/ to the Gitea release
|
|
@TAG=$(TAG) $(SCRIPTS)/release.sh
|
|
|
|
# clean first: dist/ keeps earlier builds, and a release should be made of exactly
|
|
# what this version produced.
|
|
release: clean dist publish ## Package for this machine and publish it
|
|
|
|
clean: ## Remove the compiled output and the built packages
|
|
rm -rf build dist
|
|
|
|
distclean: clean ## Remove the packages and the dependencies
|
|
rm -rf node_modules
|
|
|
|
version: ## Show the versions involved
|
|
@echo "app $(VERSION) (tag $(TAG))"
|
|
@printf "node "; node --version 2>/dev/null || echo "missing"
|
|
@printf "npm "; npm --version 2>/dev/null || echo "missing"
|
|
@printf "electron "; node -p "require('./package.json').devDependencies.electron" 2>/dev/null || echo "missing"
|
|
@printf "typescript "; npx tsc --version 2>/dev/null || echo "missing"
|
|
@printf "eslint "; npx eslint --version 2>/dev/null || echo "missing"
|
|
@printf "tea "; tea --version 2>/dev/null | head -1 || echo "missing — devarea: make tea"
|
|
@printf "python3 "; python3 --version 2>/dev/null || echo "missing"
|
|
@printf "registry "; python3 -c 'import json; print(json.load(open("package.json"))["warpEngine"]["registryUrl"])'
|
|
@if [ -n "$(STORES_API)" ]; then printf " build override: %s\n" "$(STORES_API)"; fi
|