const fs = require('fs'), vm = require('vm'), assert = require('assert').strict; const ts = require('C:/ProgramData/cocos/editors/Creator/3.8.7/resources/app.asar.unpacked/node_modules/typescript'); const data = new Map(); let current = { username: 'player001' }, fail = false; const store = { get length(){ return data.size; }, key: i => [...data.keys()][i], getItem: k => data.get(k) ?? null, setItem: (k, v) => { if(fail) throw Error('storage unavailable'); data.set(k,v); } }; function load(){const exports={};vm.runInNewContext(ts.transpileModule(fs.readFileSync('assets/games/profile/ProfileData.ts','utf8'), // Exercise legacy array-only spread lowering used by mini-game builds. {compilerOptions:{module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES5,downlevelIteration:false}}).outputText, {exports,require: p => p==='cc'?{sys:{localStorage:store}}:{authService:()=>({requireSession:()=>{if(!current)throw Error('login required');return current}})}});return exports;} const profile=load(); assert.equal(profile.playerName('player001'),'player001'); assert.equal(profile.playerName('星河旅人'),'星河旅人'); data.set('prism.profile.player001','旧昵称'); assert.equal(load().playerName('player001'),'player001'); assert.equal(profile.savePlayerName,undefined); current={username:'player002'}; data.set('prism.auth.save.player001',JSON.stringify({baseData:{maxScore:900}})); data.set('prism.auth.save.player002',JSON.stringify({baseData:{maxScore:1200}})); data.set('prism.auth.save.corrupt','invalid'); data.set('prism.auth.save.negative',JSON.stringify({baseData:{maxScore:-1}})); let rank=profile.localRanking();assert.equal(rank.list.length,62);assert.equal(rank.my.rank,60);assert.equal(rank.my.score,1200); current={username:'player001'};rank=profile.localRanking();assert.equal(rank.my.nickname,'player001');assert.equal(rank.my.rank,61); current=null;assert.throws(()=>profile.localRanking()); const ui=fs.readFileSync('assets/games/profile/ProfileUI.ts','utf8'); assert.ok(!/EditBox|ProfileDialog|Button.EventType.CLICK|savePlayerName/.test(ui)); console.log('PASS: registration names, legacy nickname ignored, preserved opponents, score sorting and display-only profile');