Move public assets to stable paths

This commit is contained in:
2026-10-04 16:13:47 +05:00
parent 53d7b263c4
commit 5289c17adf
12 changed files with 118 additions and 31 deletions

View File

@@ -2,11 +2,11 @@ import { spawn } from "node:child_process";
import { existsSync } from "node:fs";
import { mkdir, copyFile } from "node:fs/promises";
const windows = process.platform === "win32";
const command = windows ? "gradlew.bat" : "./gradlew";
const command = windows ? "gradlew.bat" : "sh";
const targets = process.argv.slice(2);
if (!targets.length) targets.push(":plugin:build", ":fabric:build");
await new Promise((resolve, reject) => {
const child = spawn(command, targets, {
const child = spawn(command, windows ? targets : ["./gradlew", ...targets], {
cwd: "minecraft",
stdio: "inherit",
shell: windows,
@@ -16,9 +16,15 @@ await new Promise((resolve, reject) => {
code === 0 ? resolve() : reject(new Error(`Gradle exited ${code}`)),
);
});
await mkdir("public/downloads", { recursive: true });
for (const name of ["plugin", "fabric"]) {
const directory = `public/tools/${name === "fabric" ? "mod" : "plugin"}`;
const file = `minegeo-${name}-1.21.11.jar`,
path = `minecraft/${name}/build/libs/${file}`;
if (existsSync(path)) await copyFile(path, `public/downloads/${file}`);
if (existsSync(path)) {
await mkdir(directory, { recursive: true });
await copyFile(path, `${directory}/${file}`);
console.log(
`Updated ${directory}/${file}. Include this JAR in your next commit.`,
);
}
}

View File

@@ -1,21 +1,73 @@
import {createClient} from '@supabase/supabase-js';
import {createHash,randomBytes} from 'node:crypto';
import {mkdir,readFile,writeFile} from 'node:fs/promises';
import {existsSync} from 'node:fs';
process.loadEnvFile('.env.local');
const client=createClient(process.env.NEXT_PUBLIC_SUPABASE_URL!,process.env.SUPABASE_SECRET_KEY!,{auth:{persistSession:false}});
function check<T>(r:{data:T,error:{message:string}|null}):NonNullable<T>{if(r.error)throw new Error(r.error.message);return r.data!;}
await mkdir('.data',{recursive:true});
if(!existsSync('.data/test-account.json')){
const password=randomBytes(32).toString('hex'),token='mg_'+randomBytes(32).toString('hex'),email='minegeo-fixture-'+randomBytes(4).toString('hex')+'@example.com';
const {user}=check(await client.auth.admin.createUser({email,password,email_confirm:true}));if(!user)throw new Error('No fixture account returned');
check(await client.from('profiles').insert({id:user.id,display_name:'MineGeo test world',role:'moderator'}));
check(await client.from('contributor_tokens').insert({owner_id:user.id,token_hash:createHash('sha256').update(token).digest('hex'),label:'Local integration fixture'}));
await writeFile('.data/test-account.json',JSON.stringify({id:user.id,email,password,token}));
import { createClient } from "@supabase/supabase-js";
import { createHash, randomBytes } from "node:crypto";
import { mkdir, readFile, writeFile } from "node:fs/promises";
import { existsSync } from "node:fs";
process.loadEnvFile(".env.local");
const client = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.SUPABASE_SECRET_KEY!,
{ auth: { persistSession: false } },
);
function check<T>(r: {
data: T;
error: { message: string } | null;
}): NonNullable<T> {
if (r.error) throw new Error(r.error.message);
return r.data!;
}
const manifest=JSON.parse(await readFile('.cache/paper-proof/plugins/MineGeo/export/manifest.json','utf8'));
manifest.name='The First Expedition';manifest.serverName='MineGeo Test World';manifest.description='A real Paper 1.21.11 renderer test world: terrain, water and a builder’s outpost. Exported with no connected capture player. This small map is for trying MineGeo.';
await mkdir('.data/proof-upload',{recursive:true});
await writeFile('.data/proof-upload/manifest.json',JSON.stringify(manifest));
await writeFile('.data/proof-upload/terrain.json.gz',await readFile('.cache/paper-proof/plugins/MineGeo/export/terrain.json.gz'));
console.log('Fixture contributor and real Paper upload are ready. Credentials remain in ignored local files.');
await mkdir(".data", { recursive: true });
if (!existsSync(".data/test-account.json")) {
const password = randomBytes(32).toString("hex"),
token = "mg_" + randomBytes(32).toString("hex"),
email =
"minegeo-fixture-" + randomBytes(4).toString("hex") + "@example.com";
const created = await client.auth.admin.createUser({
email,
password,
email_confirm: true,
});
if (created.error) throw new Error(created.error.message);
const user = created.data.user;
if (!user) throw new Error("No fixture account returned");
check(
await client
.from("profiles")
.insert({
id: user.id,
display_name: "MineGeo test world",
role: "moderator",
}),
);
check(
await client
.from("contributor_tokens")
.insert({
owner_id: user.id,
token_hash: createHash("sha256").update(token).digest("hex"),
label: "Local integration fixture",
}),
);
await writeFile(
".data/test-account.json",
JSON.stringify({ id: user.id, email, password, token }),
);
}
const manifest = JSON.parse(
await readFile(
".cache/paper-proof/plugins/MineGeo/export/manifest.json",
"utf8",
),
);
manifest.name = "The First Expedition";
manifest.serverName = "MineGeo Test World";
manifest.description =
"A real Paper 1.21.11 renderer test world: terrain, water and a builder’s outpost. Exported with no connected capture player. This small map is for trying MineGeo.";
await mkdir(".data/proof-upload", { recursive: true });
await writeFile(".data/proof-upload/manifest.json", JSON.stringify(manifest));
await writeFile(
".data/proof-upload/terrain.json.gz",
await readFile(".cache/paper-proof/plugins/MineGeo/export/terrain.json.gz"),
);
console.log(
"Fixture contributor and real Paper upload are ready. Credentials remain in ignored local files.",
);

View File

@@ -5,7 +5,8 @@ import { prepareAssets } from "./assets.mjs";
if (!existsSync(".env.local")) await copyFile(".env.example", ".env.local");
await mkdir(".data", { recursive: true });
await mkdir("public/generated", { recursive: true });
await mkdir("public/downloads", { recursive: true });
await mkdir("public/tools/mod", { recursive: true });
await mkdir("public/tools/plugin", { recursive: true });
await new Promise((resolve, reject) => {
const p = spawn(
process.execPath,