// Local component fixture, using the installed Cocos 2.4 engine and a real Asset Bundle. // No game login, network API or real payment is called. Run: node tools/coin-madness/preview.cjs const http = require('http'); const fs = require('fs'); const path = require('path'); const ts = require('typescript'); const root = path.resolve(__dirname, '../..'); const creator = process.env.COCOS_CREATOR_PATH || 'C:/ProgramData/cocos/editors/Creator/2.4.15'; const engine = path.join(creator, 'resources/engine/bin/cocos2d-js-for-preview.js'); const uuid = JSON.parse(fs.readFileSync(path.join(root, 'assets/coin_madness/CoinMadness.prefab.meta'))).uuid; const scriptUuid = JSON.parse(fs.readFileSync(path.join(root, 'assets/coin_madness/CoinMadnessPanel.ts.meta'))).uuid; const hex=scriptUuid.replaceAll('-',''), alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; const scriptId=hex.slice(0,5)+hex.slice(5).match(/.{3}/g).map(s=>alphabet[parseInt(s,16)>>6]+alphabet[parseInt(s,16)&63]).join(''); const html = `
`; function compile(file){return ts.transpileModule(fs.readFileSync(path.join(root,file),'utf8'),{compilerOptions:{target:ts.ScriptTarget.ES5,module:ts.ModuleKind.CommonJS}}).outputText;} const server = http.createServer((req,res)=>{ const url = req.url.split('?')[0].replace(/^\/assets\//, '/'); if(url==='/favicon.ico'){res.statusCode=204;return res.end();} if(url==='/'){res.setHeader('Content-Type','text/html; charset=utf-8');return res.end(html);} if(url==='/engine.js'){res.setHeader('Content-Type','text/javascript');return fs.createReadStream(engine).pipe(res);} if(url==='/host.js'){ const source=fs.readFileSync(path.join(root,'assets/Script/CoinMadnessHost.ts'),'utf8'); const output=ts.transpileModule(source,{compilerOptions:{target:ts.ScriptTarget.ES5,module:ts.ModuleKind.CommonJS,experimentalDecorators:true}}).outputText; const helper=compile('assets/Script/CoinMadnessProgress.ts'); res.setHeader('Content-Type','text/javascript');return res.end('(function(){var helper=(function(){var exports={};'+helper+';return exports;})();var exports={};function require(name){if(name.includes("CoinMadnessProgress"))return helper;if(name.includes("MiniGameSdk"))return {MiniGameSdk:{API:{showToast:console.log}}};return {default:{get:()=>({enqueue:(k,p,run)=>run(()=>{})})}};}cc._RF.push({},"CoinMadnessHost","CoinMadnessHost");'+output+';cc._RF.pop();})();'); } if(/^\/native\/[a-f0-9]{2}\/[a-f0-9-]+\.png$/.test(url)){ const target=path.join(root,'library/imports',url.slice('/native/'.length)); if(fs.existsSync(target)){res.setHeader('Content-Type','image/png');return fs.createReadStream(target).pipe(res);} } if(/^\/imports\/[a-f0-9]{2}\/[a-f0-9-]+\.json$/.test(url)){ const target=path.join(root,'library',url.slice(1)); if(fs.existsSync(target)){res.setHeader('Content-Type','application/json');return fs.createReadStream(target).pipe(res);} } if(url.startsWith('/internal/')){ const base=path.join(creator,'resources/cocos2d-x/simulator/win32/assets/internal'); const target=path.resolve(base,url.slice('/internal/'.length)); if(!target.startsWith(base+path.sep)||!fs.existsSync(target)){res.statusCode=404;return res.end();} res.setHeader('Content-Type',target.endsWith('.json')?'application/json':target.endsWith('.js')?'text/javascript':'application/octet-stream'); return fs.createReadStream(target).pipe(res); } if(url==='/coin_madness/config.json'){res.setHeader('Content-Type','application/json');return res.end(JSON.stringify({name:'coin_madness',debug:true,importBase:'import',nativeBase:'native',deps:[],uuids:[uuid],paths:{[uuid]:['CoinMadness','cc.Prefab']},scenes:{},packs:{},versions:{import:[],native:[]}}));} if(url==='/coin_madness/index.js'){ const source=fs.readFileSync(path.join(root,'assets/coin_madness/CoinMadnessPanel.ts'),'utf8'); const output=ts.transpileModule(source,{compilerOptions:{target:ts.ScriptTarget.ES5,module:ts.ModuleKind.CommonJS,experimentalDecorators:true}}).outputText; const mock=compile('assets/coin_madness/CoinMadnessMockApi.ts'); res.setHeader('Content-Type','text/javascript');return res.end('(function(){var mock=(function(){var exports={};'+mock+';return exports;})();function require(){return mock;}var exports={};cc._RF.push({},'+JSON.stringify(scriptId)+',"CoinMadnessPanel");'+output+';cc._RF.pop();})();'); } if(url==='/coin_madness/import/'+uuid.slice(0,2)+'/'+uuid+'.json'){ res.setHeader('Content-Type','application/json');return res.end(fs.readFileSync(path.join(root,'assets/coin_madness/CoinMadness.prefab'))); } res.statusCode=404;res.end('Not found'); }); server.listen(Number(process.env.PORT)||8765,'127.0.0.1',()=>console.log('Coin Madness fixture: http://127.0.0.1:'+server.address().port));