/** * Which project each tool writes to, and the guard that keeps every tool away from the * playground. * * playground the user's own project. No tool writes it – it is maintained in the editor. * fixture rewritten by every e2e run (tools/seed-e2e.mjs + tools/e2e.mjs). * jumpRun the example game (tools/seed-jumprun.mjs, played by tools/smoke-jumprun.mjs). * * All ids exist on the server (created via POST ?r=projects); PUT does not create projects. */ export const PROJECTS = { playground: '649188c15414', fixture: '3caa9b6a0c92', jumpRun: '3d271f3bb58b', }; export const DEFAULT_BASE_URL = 'https://nockal.com/game-maker/'; /** * Reads `[projectId] [baseUrl]` from argv, falling back to `defaultId`. Targeting the playground * aborts: no tool may overwrite or mutate it. */ export function cliArgs(script, defaultId) { const projectId = process.argv[2] ?? defaultId; const baseUrl = process.argv[3] ?? DEFAULT_BASE_URL; if (projectId === PROJECTS.playground) { console.error(`refusing to run ${script} against the playground project (${PROJECTS.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}`); }