#!/usr/bin/env node /** * Which project each tool writes to, and the guard that keeps the checks away from the * playground. * * demo the project served at ?project=… in the browser. It is the user's playground; * only tools/seed-demo.mjs may overwrite it, and only when asked. * fixture rewritten by every e2e run. tools/e2e.mjs mutates it heavily. * demoCheck a throwaway copy of the demo scene for tools/smoke-demo.mjs. * jumpRun the example game (tools/seed-jumprun.mjs, checked by tools/smoke-jumprun.mjs). * * All ids exist on the server (created via POST ?r=projects); PUT does not create projects. */ export const PROJECTS = { demo: '649188c15414', fixture: '3caa9b6a0c92', demoCheck: 'aaf5e962ef9c', jumpRun: '3d271f3bb58b', }; export const DEFAULT_BASE_URL = 'https://nockal.com/game-maker/'; /** * Reads `[projectId] [baseUrl]` from argv, falling back to `defaultId`. Unless `allowDemo` is * set, targeting the demo project aborts: a destructive run must never hit the playground. */ export function cliArgs(script, defaultId, { allowDemo = false } = {}) { const projectId = process.argv[2] ?? defaultId; const baseUrl = process.argv[3] ?? DEFAULT_BASE_URL; if (!projectId) { console.error(`usage: node tools/${script} [baseUrl]`); process.exit(2); } if (!allowDemo && projectId === PROJECTS.demo) { console.error(`refusing to run ${script} against the demo project (${PROJECTS.demo}) – it is the playground.`); process.exit(2); } return { projectId, baseUrl }; } /** Overwrites a project, keeping the name it already has on the server. */ export async function writeProject(projectId, baseUrl, project) { const url = `${baseUrl}api/index.php?r=projects/${projectId}`; const current = await fetch(url); if (!current.ok) { console.error(`GET failed: ${current.status} – create the project first (POST ?r=projects)`); process.exit(1); } const doc = await current.json(); const body = { revision: doc.revision, project: { ...project, id: projectId, name: doc.name ?? project.name } }; const res = await fetch(url, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }); const result = await res.json(); if (!res.ok) { console.error('PUT failed', res.status, result); process.exit(1); } console.log(`seeded ${projectId} (${body.project.name}) → revision ${result.revision}`); }