76 lines
3.9 KiB
JavaScript
76 lines
3.9 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import fs from 'node:fs';
|
|
import os from 'node:os';
|
|
import path from 'node:path';
|
|
import crypto from 'node:crypto';
|
|
import { execFileSync } from 'node:child_process';
|
|
import { fileURLToPath } from 'node:url';
|
|
import { parse, stringify } from 'smol-toml';
|
|
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
import { build } from '../../platform/build.mjs';
|
|
|
|
const repository = fileURLToPath(new URL('../../', import.meta.url));
|
|
const sha = file => crypto.createHash('sha256').update(fs.readFileSync(file)).digest('hex');
|
|
const git = (root, args) => execFileSync('git', args, { cwd: root, stdio: 'pipe' });
|
|
|
|
export function fixture(t) {
|
|
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'mcpack-test-'));
|
|
t.after(() => fs.rmSync(root, { recursive: true, force: true }));
|
|
for (const file of ['pack', 'server', 'platform', 'scripts', '.gitignore', 'package.json', 'package-lock.json', 'toolchain.lock.env']) {
|
|
fs.cpSync(path.join(repository, file), path.join(root, file), { recursive: true, filter: file => path.basename(file) !== '.env' && path.basename(file) !== 'compose.override.yaml' });
|
|
}
|
|
fs.mkdirSync(path.join(root, '.tools/packwiz'), { recursive: true });
|
|
fs.mkdirSync(path.join(root, 'dist'));
|
|
fs.writeFileSync(path.join(root, 'dist/.gitkeep'), '');
|
|
fs.copyFileSync(path.join(repository, '.tools/docker-compose'), path.join(root, '.tools/docker-compose'));
|
|
const mock = path.join(root, '.tools/packwiz/packwiz');
|
|
fs.writeFileSync(mock, `#!/usr/bin/env node
|
|
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
import os from 'node:os';
|
|
import { execFileSync } from 'node:child_process';
|
|
import { parse } from ${JSON.stringify(import.meta.resolve('smol-toml'))};
|
|
const state = JSON.parse(fs.readFileSync(${JSON.stringify(path.join(root, '.tools/state.json'))}, 'utf8'));
|
|
const args = process.argv.slice(2);
|
|
if (args.includes('refresh')) {
|
|
if (state.stale) fs.appendFileSync('index.toml', '\\n# mock refresh changed index\\n');
|
|
process.exit(0);
|
|
}
|
|
if (state.exportFailure) { console.error('Simulated export failure'); process.exit(7); }
|
|
const pack = parse(fs.readFileSync('pack.toml', 'utf8'));
|
|
const index = parse(fs.readFileSync(pack.index.file, 'utf8'));
|
|
const archive = fs.mkdtempSync(path.join(os.tmpdir(), 'mcpack-mock-'));
|
|
try {
|
|
fs.mkdirSync(path.join(archive, 'overrides'));
|
|
const metadata = [];
|
|
for (const entry of index.files) {
|
|
if (entry.metafile) {
|
|
const mod = parse(fs.readFileSync(entry.file, 'utf8'));
|
|
metadata.push({path:path.posix.join(path.posix.dirname(entry.file),mod.filename),hashes:{sha512:mod.download.hash,sha1:'1'.repeat(40)},env:{client:mod.side==='server'?'unsupported':'required',server:mod.side==='client'?'unsupported':'required'},downloads:[mod.download.url]});
|
|
} else {
|
|
const destination = path.join(archive, 'overrides', entry.file);
|
|
fs.mkdirSync(path.dirname(destination), {recursive:true});
|
|
fs.copyFileSync(entry.file, destination);
|
|
}
|
|
}
|
|
fs.writeFileSync(path.join(archive,'modrinth.index.json'),JSON.stringify({formatVersion:1,game:'minecraft',name:pack.name,versionId:pack.version,dependencies:pack.versions,files:metadata}));
|
|
execFileSync('bsdtar',['--format','zip','-cf',args[args.indexOf('--output')+1],'-C',archive,'modrinth.index.json','overrides']);
|
|
} finally { fs.rmSync(archive,{recursive:true,force:true}); }
|
|
`);
|
|
fs.chmodSync(mock, 0o755);
|
|
fs.writeFileSync(path.join(root, '.tools/state.json'), '{}');
|
|
let lock = fs.readFileSync(path.join(root, 'toolchain.lock.env'), 'utf8');
|
|
lock = lock.replace(/^PACKWIZ_BINARY_SHA256=.*$/m, `PACKWIZ_BINARY_SHA256=${sha(mock)}`);
|
|
fs.writeFileSync(path.join(root, 'toolchain.lock.env'), lock);
|
|
git(root, ['init', '-q']);
|
|
commit(root);
|
|
return root;
|
|
}
|
|
|
|
export function commit(root) {
|
|
git(root, ['add', '-A']);
|
|
git(root, ['-c', 'user.name=Test', '-c', 'user.email=test@localhost', 'commit', '--allow-empty', '-qm', 'Fixture']);
|
|
}
|
|
|